1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-08 19:57:46 +00:00
sapphire/src/world/Actor/Chara.h

257 lines
6.2 KiB
C
Raw Normal View History

#pragma once
2018-03-06 22:22:19 +01:00
#include <Common.h>
#include "Forwards.h"
#include "GameObject.h"
#include <set>
#include <map>
#include <queue>
2019-03-26 00:04:27 +01:00
#include <array>
namespace Sapphire::Entity
2018-10-28 21:53:21 +01:00
{
2018-10-28 21:53:21 +01:00
/*!
\class Chara
\brief Base class for all animate actors
2018-10-28 21:53:21 +01:00
*/
class Chara : public GameObject
{
private:
// array size for baseparam + bonuses arrays, 80 to have some spare room.
constexpr static uint32_t STAT_ARRAY_SIZE = 80;
2018-10-28 21:53:21 +01:00
public:
using ActorStatsArray = std::array< uint32_t, STAT_ARRAY_SIZE >;
2023-02-10 16:53:00 -03:00
ActorStatsArray m_baseStats{ 0 };
ActorStatsArray m_bonusStats{ 0 };
2018-10-28 21:53:21 +01:00
protected:
char m_name[34];
/*! Last tick time for the actor ( in ms ) */
int64_t m_lastTickTime;
2018-10-28 21:53:21 +01:00
/*! Last time the actor performed an autoAttack ( in ms ) */
uint64_t m_lastAttack;
/*! Last time the actor was updated ( in ms ) */
int64_t m_lastUpdate;
2018-10-28 21:53:21 +01:00
/*! Current stance of the actor */
Common::Stance m_currentStance;
/*! Current staus of the actor */
Common::ActorStatus m_status;
/*! Max HP of the actor ( based on job / class ) */
uint32_t m_maxHp;
/*! Max MP of the actor ( based on job / class ) */
uint32_t m_maxMp;
/*! Current HP of the actor */
uint32_t m_hp;
/*! Current MP of the actor */
uint32_t m_mp;
/*! Current TP of the actor */
uint16_t m_tp;
/*! Current GP of the actor */
uint16_t m_gp;
/*! Additional look info of the actor */
uint8_t m_customize[26];
/*! Additional model info */
uint32_t m_modelEquip[10];
/*! Current class of the actor */
Common::ClassJob m_class;
/*! Id of the currently selected target actor */
uint64_t m_targetId;
/*! Ptr to a queued action */
World::Action::ActionPtr m_pCurrentAction;
/*! id of the director this chara is assigned to */
uint32_t m_directorId;
/*!
* @brief the id of the last combo action used (IgnoresCombo)
*/
uint32_t m_lastComboActionId;
/*!
* @brief when the last combo action was used in ms
*/
uint64_t m_lastComboActionTime;
2018-10-28 21:53:21 +01:00
/*! Invincibility type */
Common::InvincibilityType m_invincibilityType;
2018-10-28 21:53:21 +01:00
uint8_t m_pose;
2018-10-28 21:53:21 +01:00
/*! Status effects */
const uint8_t MAX_STATUS_EFFECTS = 30;
std::queue< uint8_t > m_statusEffectFreeSlotQueue;
std::vector< std::pair< uint8_t, uint32_t > > m_statusEffectList;
std::map< uint8_t, StatusEffect::StatusEffectPtr > m_statusEffectMap;
2019-04-19 00:39:42 +02:00
/*! Detour Crowd AgentId */
uint32_t m_agentId;
2019-04-19 23:01:27 +10:00
/*! Detour Crowd actor scale */
float m_radius;
2019-04-19 23:01:27 +10:00
2018-10-28 21:53:21 +01:00
public:
2020-03-01 01:00:57 +11:00
Chara( Common::ObjKind type );
2018-10-28 21:53:21 +01:00
virtual ~Chara() override;
2018-10-28 21:53:21 +01:00
virtual void calculateStats() {};
int64_t getLastUpdateTime() const;
2018-10-28 21:53:21 +01:00
/// Status effect functions
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
std::map< uint8_t, StatusEffect::StatusEffectPtr >::iterator removeStatusEffect( uint8_t effectSlotId );
2018-10-28 21:53:21 +01:00
void removeSingleStatusEffectById( uint32_t id );
2018-10-28 21:53:21 +01:00
void updateStatusEffects();
2018-10-28 21:53:21 +01:00
bool hasStatusEffect( uint32_t id );
2018-10-28 21:53:21 +01:00
int8_t getStatusEffectFreeSlot();
2018-10-28 21:53:21 +01:00
void statusEffectFreeSlot( uint8_t slotId );
2018-10-28 21:53:21 +01:00
uint8_t getPose() const;
2018-10-28 21:53:21 +01:00
void setPose( uint8_t pose );
std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr > getStatusEffectMap() const;
2018-10-28 21:53:21 +01:00
void sendStatusEffectUpdate();
2018-10-28 21:53:21 +01:00
/*! return a const pointer to the look array */
const uint8_t* getLookArray() const;
2018-10-28 21:53:21 +01:00
const uint32_t* getModelArray() const;
2018-10-28 21:53:21 +01:00
// add a status effect by id
void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 );
2018-10-28 21:53:21 +01:00
// add a status effect by id if it doesn't exist
void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 );
2018-10-28 21:53:21 +01:00
// remove a status effect by id
void removeSingleStatusEffectFromId( uint32_t id );
/// End Status Effect Functions
2018-10-28 21:53:21 +01:00
std::string getName() const;
2018-10-28 21:53:21 +01:00
bool face( const Common::FFXIVARR_POSITION3& p );
2018-10-28 21:53:21 +01:00
Common::Stance getStance() const;
2018-10-28 21:53:21 +01:00
void setStance( Common::Stance stance );
const ActorStatsArray& getStats() const;
uint32_t getStatValue( Common::BaseParam baseParam ) const;
float getStatValueFloat( Common::BaseParam baseParam ) const;
uint32_t getBonusStat( Common::BaseParam baseParam ) const;
void setStatValue( Common::BaseParam baseParam, uint32_t value );
2018-10-28 21:53:21 +01:00
uint32_t getHp() const;
uint32_t getHpPercent() const;
2018-10-28 21:53:21 +01:00
uint32_t getMp() const;
2018-10-28 21:53:21 +01:00
uint16_t getTp() const;
2018-10-28 21:53:21 +01:00
uint16_t getGp() const;
2018-10-28 21:53:21 +01:00
Common::InvincibilityType getInvincibilityType() const;
2018-10-28 21:53:21 +01:00
Common::ClassJob getClass() const;
2018-10-28 21:53:21 +01:00
void setClass( Common::ClassJob classJob );
Common::Role getRole() const;
2018-10-28 21:53:21 +01:00
void setTargetId( uint64_t targetId );
2018-10-28 21:53:21 +01:00
uint64_t getTargetId() const;
2018-10-28 21:53:21 +01:00
bool isAlive() const;
2018-10-28 21:53:21 +01:00
virtual uint32_t getMaxHp() const;
2018-10-28 21:53:21 +01:00
virtual uint32_t getMaxMp() const;
2018-10-28 21:53:21 +01:00
void resetHp();
2018-10-28 21:53:21 +01:00
void resetMp();
2018-10-28 21:53:21 +01:00
void setHp( uint32_t hp );
2018-10-28 21:53:21 +01:00
void setMp( uint32_t mp );
2018-10-28 21:53:21 +01:00
void setGp( uint32_t gp );
void setTp( uint32_t tp );
2018-10-28 21:53:21 +01:00
void setInvincibilityType( Common::InvincibilityType type );
2018-10-28 21:53:21 +01:00
void die();
2018-10-28 21:53:21 +01:00
Common::ActorStatus getStatus() const;
2018-10-28 21:53:21 +01:00
void setStatus( Common::ActorStatus status );
2018-10-28 21:53:21 +01:00
virtual void autoAttack( CharaPtr pTarget );
2018-10-28 21:53:21 +01:00
virtual void onDeath() {};
2018-10-28 21:53:21 +01:00
virtual void onDamageTaken( Chara& pSource ) {};
virtual void onActionHostile( CharaPtr pSource ) {};
2018-10-28 21:53:21 +01:00
virtual void onActionFriendly( Chara& pSource ) {};
virtual void onTick();
2018-10-28 21:53:21 +01:00
virtual void changeTarget( uint64_t targetId );
2018-10-28 21:53:21 +01:00
virtual uint8_t getLevel() const;
2023-02-25 15:31:57 +01:00
virtual void sendHudParam();
2018-10-28 21:53:21 +01:00
virtual void takeDamage( uint32_t damage );
2018-10-28 21:53:21 +01:00
virtual void heal( uint32_t amount );
2020-01-05 17:09:27 +09:00
virtual void restoreMP( uint32_t amount );
2018-10-28 21:53:21 +01:00
virtual bool checkAction();
virtual void update( uint64_t tickCount );
World::Action::ActionPtr getCurrentAction() const;
void setCurrentAction( World::Action::ActionPtr pAction );
uint32_t getLastComboActionId() const;
void setLastComboActionId( uint32_t actionId );
uint32_t getDirectorId() const;
void setDirectorId( uint32_t directorId );
2019-04-19 00:39:42 +02:00
uint32_t getAgentId() const;
void setAgentId( uint32_t agentId );
float getRadius() const;
2019-04-19 23:01:27 +10:00
Common::BaseParam getPrimaryStat() const;
2018-10-28 21:53:21 +01:00
};
}