2018-08-29 21:40:59 +02:00
|
|
|
#ifndef _CHARA_H_
|
|
|
|
#define _CHARA_H_
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-03-06 22:22:19 +01:00
|
|
|
#include <Common.h>
|
2018-02-20 22:46:44 +01:00
|
|
|
#include <boost/enable_shared_from_this.hpp>
|
|
|
|
|
|
|
|
#include "Forwards.h"
|
|
|
|
#include "Actor.h"
|
|
|
|
#include <set>
|
|
|
|
#include <map>
|
|
|
|
#include <queue>
|
|
|
|
|
|
|
|
namespace Core {
|
|
|
|
namespace Entity {
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\class Chara
|
|
|
|
\brief Base class for all animate actors
|
|
|
|
|
|
|
|
*/
|
2018-08-29 21:40:59 +02:00
|
|
|
class Chara :
|
|
|
|
public Actor
|
2018-02-20 22:46:44 +01:00
|
|
|
{
|
|
|
|
public:
|
2018-08-29 21:40:59 +02:00
|
|
|
struct ActorStats
|
|
|
|
{
|
|
|
|
uint32_t max_mp = 0;
|
|
|
|
uint32_t max_hp = 0;
|
|
|
|
|
|
|
|
uint32_t str = 0;
|
|
|
|
uint32_t dex = 0;
|
|
|
|
uint32_t vit = 0;
|
|
|
|
uint32_t inte = 0;
|
|
|
|
uint32_t mnd = 0;
|
|
|
|
uint32_t pie = 0;
|
|
|
|
|
|
|
|
uint32_t tenacity = 0;
|
|
|
|
uint32_t attack = 0;
|
|
|
|
uint32_t defense = 0;
|
|
|
|
uint32_t accuracy = 0;
|
|
|
|
uint32_t spellSpeed = 0;
|
|
|
|
uint32_t magicDefense = 0;
|
|
|
|
uint32_t critHitRate = 0;
|
|
|
|
uint32_t resistSlash = 0;
|
|
|
|
uint32_t resistPierce = 0;
|
|
|
|
uint32_t resistBlunt = 0;
|
|
|
|
uint32_t attackPotMagic = 0;
|
|
|
|
uint32_t healingPotMagic = 0;
|
|
|
|
uint32_t determination = 0;
|
|
|
|
uint32_t skillSpeed = 0;
|
|
|
|
|
|
|
|
uint32_t resistSlow = 0;
|
|
|
|
uint32_t resistSilence = 0;
|
|
|
|
uint32_t resistBlind = 0;
|
|
|
|
uint32_t resistPoison = 0;
|
|
|
|
uint32_t resistStun = 0;
|
|
|
|
uint32_t resistSleep = 0;
|
|
|
|
uint32_t resistBind = 0;
|
|
|
|
uint32_t resistHeavy = 0;
|
|
|
|
|
|
|
|
uint32_t resistFire = 0;
|
|
|
|
uint32_t resistIce = 0;
|
|
|
|
uint32_t resistWind = 0;
|
|
|
|
uint32_t resistEarth = 0;
|
|
|
|
uint32_t resistLightning = 0;
|
|
|
|
uint32_t resistWater = 0;
|
|
|
|
|
|
|
|
} m_baseStats;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
|
|
|
protected:
|
2018-08-29 21:40:59 +02:00
|
|
|
char m_name[34];
|
|
|
|
/*! Last tick time for the actor ( in ms ) */
|
|
|
|
uint64_t m_lastTickTime;
|
|
|
|
/*! Last time the actor performed an autoAttack ( in ms ) */
|
|
|
|
uint64_t m_lastAttack;
|
|
|
|
/*! Last time the actor was updated ( in ms ) */
|
|
|
|
uint64_t m_lastUpdate;
|
|
|
|
/*! 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];
|
2018-09-10 23:57:14 +02:00
|
|
|
/*! Additional model info */
|
|
|
|
uint32_t m_modelEquip[10];
|
2018-08-29 21:40:59 +02:00
|
|
|
/*! 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 */
|
|
|
|
Action::ActionPtr m_pCurrentAction;
|
|
|
|
/*! Invincibility type */
|
|
|
|
Common::InvincibilityType m_invincibilityType;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
|
|
|
uint8_t m_pose;
|
2018-08-29 21:40:59 +02: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
|
|
|
|
|
|
|
public:
|
2018-08-29 21:40:59 +02:00
|
|
|
Chara( Common::ObjKind type );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
virtual ~Chara() override;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-09-10 23:57:14 +02:00
|
|
|
virtual void calculateStats() {};
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
/// Status effect functions
|
|
|
|
void addStatusEffect( StatusEffect::StatusEffectPtr pEffect );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void removeStatusEffect( uint8_t effectSlotId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void removeSingleStatusEffectById( uint32_t id );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void updateStatusEffects();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
bool hasStatusEffect( uint32_t id );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
int8_t getStatusEffectFreeSlot();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void statusEffectFreeSlot( uint8_t slotId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-09-13 22:14:31 +02:00
|
|
|
uint8_t getPose() const;
|
|
|
|
|
|
|
|
void setPose( uint8_t pose );
|
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
std::map< uint8_t, Core::StatusEffect::StatusEffectPtr > getStatusEffectMap() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void sendStatusEffectUpdate();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-09-13 22:14:31 +02:00
|
|
|
/*! return a const pointer to the look array */
|
|
|
|
const uint8_t* getLookArray() const;
|
|
|
|
|
|
|
|
const uint32_t* getModelArray() const;
|
2018-09-10 23:57:14 +02:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
// add a status effect by id
|
|
|
|
void addStatusEffectById( uint32_t id, int32_t duration, Entity::Chara& source, uint16_t param = 0 );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02: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-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02: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-08-29 21:40:59 +02:00
|
|
|
std::string getName() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
bool face( const Common::FFXIVARR_POSITION3& p );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
Common::Stance getStance() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void setStance( Common::Stance stance );
|
2018-02-22 15:31:10 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
ActorStats getStats() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint32_t getHp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint32_t getMp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint16_t getTp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint16_t getGp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
Common::InvincibilityType getInvincibilityType() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
Common::ClassJob getClass() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint8_t getClassAsInt() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void setClass( Common::ClassJob classJob );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void setTargetId( uint64_t targetId );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
uint64_t getTargetId() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
bool isAlive() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
virtual uint32_t getMaxHp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
virtual uint32_t getMaxMp() const;
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void resetHp();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void resetMp();
|
2018-02-20 22:46:44 +01:00
|
|
|
|
2018-08-29 21:40:59 +02:00
|
|
|
void setHp( uint32_t hp );
|
|
|
|
|
|
|
|
void setMp( uint32_t mp );
|
|
|
|
|
|
|
|
void setGp( uint32_t gp );
|
|
|
|
|
|
|
|
void setInvincibilityType( Common::InvincibilityType type );
|
|
|
|
|
|
|
|
void die();
|
|
|
|
|
|
|
|
Common::ActorStatus getStatus() const;
|
|
|
|
|
|
|
|
void setStatus( Common::ActorStatus status );
|
|
|
|
|
|
|
|
void
|
|
|
|
handleScriptSkill( uint32_t type, uint16_t actionId, uint64_t param1, uint64_t param2, Entity::Chara& target );
|
|
|
|
|
|
|
|
virtual void autoAttack( CharaPtr pTarget );
|
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void onDeath() {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void onDamageTaken( Chara& pSource ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void onActionHostile( Chara& source ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void onActionFriendly( Chara& pSource ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void onTick() {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
virtual void changeTarget( uint64_t targetId );
|
|
|
|
|
|
|
|
virtual uint8_t getLevel() const;
|
|
|
|
|
|
|
|
virtual void sendStatusUpdate( bool toSelf = true );
|
|
|
|
|
|
|
|
virtual void takeDamage( uint32_t damage );
|
|
|
|
|
|
|
|
virtual void heal( uint32_t amount );
|
|
|
|
|
|
|
|
virtual bool checkAction();
|
|
|
|
|
2018-09-09 23:56:22 +02:00
|
|
|
virtual void update( int64_t currTime ) {};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
Action::ActionPtr getCurrentAction() const;
|
|
|
|
|
|
|
|
void setCurrentAction( Action::ActionPtr pAction );
|
2018-02-20 22:46:44 +01:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|