2021-11-27 00:53:57 +01:00
|
|
|
#pragma once
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Common.h>
|
2023-03-06 23:06:59 +01:00
|
|
|
#include "Action/ActionLut.h"
|
2018-02-20 22:46:44 +01:00
|
|
|
|
|
|
|
#include "Forwards.h"
|
2021-11-27 00:53:57 +01:00
|
|
|
#include "GameObject.h"
|
2018-02-20 22:46:44 +01:00
|
|
|
#include <set>
|
|
|
|
#include <map>
|
|
|
|
#include <queue>
|
2019-03-26 00:04:27 +01:00
|
|
|
#include <array>
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
namespace Sapphire::Entity
|
2018-10-28 21:53:21 +01:00
|
|
|
{
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
/*!
|
|
|
|
\class Chara
|
|
|
|
\brief Base class for all animate actors
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
*/
|
2021-11-27 00:53:57 +01:00
|
|
|
class Chara : public GameObject
|
2018-08-29 21:40:59 +02:00
|
|
|
{
|
2021-11-27 00:53:57 +01:00
|
|
|
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:
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
using ActorStatsArray = std::array< uint32_t, STAT_ARRAY_SIZE >;
|
2023-03-06 23:06:59 +01:00
|
|
|
using ActorModifiersMap = std::unordered_map< Common::ParamModifier, std::vector< int32_t > >;
|
2021-11-27 00:53:57 +01:00
|
|
|
|
2023-02-10 16:53:00 -03:00
|
|
|
ActorStatsArray m_baseStats{ 0 };
|
|
|
|
ActorStatsArray m_bonusStats{ 0 };
|
2019-03-21 18:06:48 +01:00
|
|
|
|
2023-03-06 23:06:59 +01:00
|
|
|
ActorModifiersMap m_modifiers{ 0 };
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
protected:
|
|
|
|
char m_name[34];
|
|
|
|
/*! Last tick time for the actor ( in ms ) */
|
2019-01-28 19:16:44 +11:00
|
|
|
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 ) */
|
2019-01-28 19:16:44 +11:00
|
|
|
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 */
|
2019-06-02 00:34:22 +10:00
|
|
|
World::Action::ActionPtr m_pCurrentAction;
|
2019-04-15 23:41:43 +02:00
|
|
|
/*! id of the director this chara is assigned to */
|
|
|
|
uint32_t m_directorId;
|
2019-03-24 16:32:20 +11:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* @brief the id of the last combo action used (IgnoresCombo)
|
|
|
|
*/
|
2019-03-23 20:59:41 +11:00
|
|
|
uint32_t m_lastComboActionId;
|
2019-03-24 16:32:20 +11:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* @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-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint8_t m_pose;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
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;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
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 */
|
2019-04-21 23:52:41 +10:00
|
|
|
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-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual ~Chara() override;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void calculateStats() {};
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2019-01-31 23:44:53 +11:00
|
|
|
int64_t getLastUpdateTime() const;
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
/// Status effect functions
|
|
|
|
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2023-02-21 06:10:46 +01:00
|
|
|
std::map< uint8_t, StatusEffect::StatusEffectPtr >::iterator removeStatusEffect( uint8_t effectSlotId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void removeSingleStatusEffectById( uint32_t id );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void updateStatusEffects();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
bool hasStatusEffect( uint32_t id );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
int8_t getStatusEffectFreeSlot();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void statusEffectFreeSlot( uint8_t slotId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint8_t getPose() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setPose( uint8_t pose );
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
std::map< uint8_t, Sapphire::StatusEffect::StatusEffectPtr > getStatusEffectMap() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void sendStatusEffectUpdate();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
/*! return a const pointer to the look array */
|
|
|
|
const uint8_t* getLookArray() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
const uint32_t* getModelArray() const;
|
2018-09-10 23:57:14 +02:00
|
|
|
|
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 );
|
|
|
|
// 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 );
|
2023-03-06 23:06:59 +01:00
|
|
|
void addStatusEffectByIdIfNotExist( uint32_t id, int32_t duration, Entity::Chara& source, std::vector< World::Action::StatusModifier >& modifiers, uint16_t param = 0 );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
// remove a status effect by id
|
|
|
|
void removeSingleStatusEffectFromId( uint32_t id );
|
|
|
|
/// End Status Effect Functions
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
std::string getName() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
bool face( const Common::FFXIVARR_POSITION3& p );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
Common::Stance getStance() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setStance( Common::Stance stance );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
const ActorStatsArray& getStats() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2019-04-25 21:57:41 +10:00
|
|
|
uint32_t getStatValue( Common::BaseParam baseParam ) const;
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
float getStatValueFloat( Common::BaseParam baseParam ) const;
|
|
|
|
|
|
|
|
uint32_t getBonusStat( Common::BaseParam baseParam ) const;
|
|
|
|
|
|
|
|
void setStatValue( Common::BaseParam baseParam, uint32_t value );
|
|
|
|
|
2023-03-06 23:06:59 +01:00
|
|
|
float getModifier( Common::ParamModifier paramModifier ) const;
|
|
|
|
|
|
|
|
void addModifier( Common::ParamModifier paramModifier, int32_t value );
|
|
|
|
|
|
|
|
void delModifier( Common::ParamModifier paramModifier, int32_t value );
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint32_t getHp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2019-04-17 00:10:32 +02:00
|
|
|
uint32_t getHpPercent() const;
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint32_t getMp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint16_t getTp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint16_t getGp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
Common::InvincibilityType getInvincibilityType() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
Common::ClassJob getClass() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setClass( Common::ClassJob classJob );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2019-07-27 00:37:40 +10:00
|
|
|
Common::Role getRole() const;
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setTargetId( uint64_t targetId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint64_t getTargetId() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
bool isAlive() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual uint32_t getMaxHp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual uint32_t getMaxMp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void resetHp();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void resetMp();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setHp( uint32_t hp );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setMp( uint32_t mp );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setGp( uint32_t gp );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-04-04 21:56:59 +11:00
|
|
|
void setTp( uint32_t tp );
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setInvincibilityType( Common::InvincibilityType type );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void die();
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
Common::ActorStatus getStatus() const;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void setStatus( Common::ActorStatus status );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void autoAttack( CharaPtr pTarget );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void onDeath() {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void onDamageTaken( Chara& pSource ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-01-20 13:36:34 +01:00
|
|
|
virtual void onActionHostile( CharaPtr pSource ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void onActionFriendly( Chara& pSource ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2020-01-19 21:20:01 +09:00
|
|
|
virtual void onTick();
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void changeTarget( uint64_t targetId );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual uint8_t getLevel() const;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2023-02-25 15:31:57 +01:00
|
|
|
virtual void sendHudParam();
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void takeDamage( uint32_t damage );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual void heal( uint32_t amount );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
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();
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-04-04 23:29:52 +02:00
|
|
|
virtual void update( uint64_t tickCount );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-06-02 00:34:22 +10:00
|
|
|
World::Action::ActionPtr getCurrentAction() const;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-06-02 00:34:22 +10:00
|
|
|
void setCurrentAction( World::Action::ActionPtr pAction );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2019-03-23 20:59:41 +11:00
|
|
|
uint32_t getLastComboActionId() const;
|
|
|
|
void setLastComboActionId( uint32_t actionId );
|
|
|
|
|
2019-04-15 23:41:43 +02:00
|
|
|
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 );
|
|
|
|
|
2019-04-21 23:52:41 +10:00
|
|
|
float getRadius() const;
|
2019-04-19 23:01:27 +10:00
|
|
|
|
2019-04-24 23:25:07 +10:00
|
|
|
Common::BaseParam getPrimaryStat() const;
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
};
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|