2018-08-29 21:40:59 +02:00
|
|
|
#ifndef _BNPC_H_
|
|
|
|
#define _BNPC_H_
|
|
|
|
|
|
|
|
#include <Common.h>
|
|
|
|
|
|
|
|
#include "Forwards.h"
|
|
|
|
#include "Chara.h"
|
2018-08-29 22:03:10 +02:00
|
|
|
#include "Npc.h"
|
2018-08-29 21:40:59 +02:00
|
|
|
#include <set>
|
|
|
|
#include <map>
|
|
|
|
#include <queue>
|
|
|
|
|
2018-11-29 16:55:48 +01:00
|
|
|
namespace Sapphire::Entity
|
2018-10-28 21:53:21 +01:00
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-03-14 14:08:21 +01:00
|
|
|
struct HateListEntry
|
2019-01-17 23:54:47 +01:00
|
|
|
{
|
|
|
|
uint32_t m_hateAmount;
|
2019-01-19 01:15:17 +01:00
|
|
|
CharaPtr m_pChara;
|
2019-03-11 22:48:33 +01:00
|
|
|
};
|
2019-01-17 23:54:47 +01:00
|
|
|
|
|
|
|
enum class BNpcState
|
|
|
|
{
|
|
|
|
Idle,
|
|
|
|
Combat,
|
|
|
|
Retreat,
|
2019-01-26 00:06:24 +01:00
|
|
|
Roaming,
|
2019-01-17 23:54:47 +01:00
|
|
|
JustDied,
|
|
|
|
Dead,
|
|
|
|
};
|
|
|
|
|
2019-04-17 12:37:24 +02:00
|
|
|
enum BNpcFlag
|
|
|
|
{
|
|
|
|
None = 0,
|
|
|
|
Immobile = 1,
|
|
|
|
TurningDisabled = 2,
|
|
|
|
Invincible = 4,
|
|
|
|
InvincibleRefill = 8,
|
|
|
|
NoDeaggro = 16,
|
|
|
|
Untargetable = 32,
|
|
|
|
};
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
/*!
|
|
|
|
\class BNpc
|
|
|
|
\brief Base class for all BNpcs
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
*/
|
|
|
|
class BNpc : public Npc
|
|
|
|
{
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
public:
|
2018-12-29 00:53:52 +01:00
|
|
|
BNpc( FrameworkPtr pFw );
|
2019-01-13 00:51:31 +01:00
|
|
|
BNpc( uint32_t id, BNpcTemplatePtr pTemplate, float posX, float posY, float posZ, float rot,
|
2019-01-17 23:54:47 +01:00
|
|
|
uint8_t level, uint32_t maxHp, ZonePtr pZone,FrameworkPtr pFw );
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
virtual ~BNpc() override;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
void spawn( PlayerPtr pTarget ) override;
|
2019-01-19 17:50:33 +11:00
|
|
|
void despawn( PlayerPtr pTarget ) override;
|
2018-09-09 23:56:22 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint16_t getModelChara() const;
|
|
|
|
uint8_t getLevel() const override;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint32_t getBNpcBaseId() const;
|
|
|
|
uint32_t getBNpcNameId() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint8_t getEnemyType() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint64_t getWeaponMain() const;
|
|
|
|
uint64_t getWeaponSub() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
uint8_t getAggressionMode() const;
|
2018-09-13 22:14:31 +02:00
|
|
|
|
2019-04-19 23:01:27 +10:00
|
|
|
|
2019-01-31 22:49:04 +11:00
|
|
|
float getNaviTargetReachedDistance() const;
|
|
|
|
|
2019-01-17 23:54:47 +01:00
|
|
|
// return true if it reached the position
|
|
|
|
bool moveTo( const Common::FFXIVARR_POSITION3& pos );
|
|
|
|
|
2019-01-23 17:07:40 +01:00
|
|
|
// processes movement
|
|
|
|
void step();
|
|
|
|
|
2019-01-17 23:54:47 +01:00
|
|
|
void sendPositionUpdate();
|
|
|
|
|
|
|
|
BNpcState getState() const;
|
|
|
|
void setState( BNpcState state );
|
|
|
|
|
|
|
|
void hateListClear();
|
2019-01-19 01:15:17 +01:00
|
|
|
CharaPtr hateListGetHighest();
|
|
|
|
void hateListAdd( CharaPtr pChara, int32_t hateAmount );
|
|
|
|
void hateListUpdate( CharaPtr pChara, int32_t hateAmount );
|
|
|
|
void hateListRemove( CharaPtr pChara );
|
|
|
|
bool hateListHasActor( CharaPtr pChara );
|
|
|
|
|
|
|
|
void aggro( CharaPtr pChara );
|
|
|
|
void deaggro( CharaPtr pChara );
|
2019-01-17 23:54:47 +01:00
|
|
|
|
2019-04-04 23:29:52 +02:00
|
|
|
void update( uint64_t tickCount ) override;
|
2019-01-28 19:16:44 +11:00
|
|
|
void onTick() override;
|
2019-01-17 23:54:47 +01:00
|
|
|
|
2019-01-20 13:36:34 +01:00
|
|
|
void onActionHostile( CharaPtr pSource ) override;
|
|
|
|
|
|
|
|
void onDeath() override;
|
|
|
|
|
2019-04-17 22:36:23 +02:00
|
|
|
void autoAttack( CharaPtr pTarget ) override;
|
|
|
|
|
2019-01-23 22:37:55 +01:00
|
|
|
uint32_t getTimeOfDeath() const;
|
2019-01-26 14:59:04 +11:00
|
|
|
void setTimeOfDeath( uint32_t timeOfDeath );
|
2019-01-23 22:37:55 +01:00
|
|
|
|
2019-01-28 19:16:44 +11:00
|
|
|
void regainHp();
|
2019-01-27 01:12:31 +01:00
|
|
|
|
2019-01-31 17:53:20 +11:00
|
|
|
void checkAggro();
|
2019-01-27 01:12:31 +01:00
|
|
|
|
2019-03-28 23:57:58 +01:00
|
|
|
void setOwner( CharaPtr m_pChara );
|
|
|
|
|
2019-04-17 00:10:32 +02:00
|
|
|
void setLevelId( uint32_t levelId );
|
|
|
|
uint32_t getLevelId() const;
|
|
|
|
|
2019-04-17 12:37:24 +02:00
|
|
|
bool hasFlag( uint32_t flag ) const;
|
|
|
|
void setFlag( uint32_t flags );
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
private:
|
|
|
|
uint32_t m_bNpcBaseId;
|
|
|
|
uint32_t m_bNpcNameId;
|
|
|
|
uint64_t m_weaponMain;
|
|
|
|
uint64_t m_weaponSub;
|
|
|
|
uint8_t m_aggressionMode;
|
|
|
|
uint8_t m_enemyType;
|
|
|
|
uint8_t m_onlineStatus;
|
|
|
|
uint8_t m_pose;
|
|
|
|
uint16_t m_modelChara;
|
|
|
|
uint32_t m_displayFlags;
|
|
|
|
uint8_t m_level;
|
2019-04-17 00:10:32 +02:00
|
|
|
uint32_t m_levelId;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-04-17 12:37:24 +02:00
|
|
|
uint32_t m_flags;
|
|
|
|
|
2019-01-31 22:49:04 +11:00
|
|
|
float m_scale;
|
|
|
|
float m_naviTargetReachedDistance;
|
|
|
|
|
2019-01-23 22:37:55 +01:00
|
|
|
uint32_t m_timeOfDeath;
|
2019-01-26 00:06:24 +01:00
|
|
|
uint32_t m_lastRoamTargetReached;
|
2019-01-23 22:37:55 +01:00
|
|
|
|
2019-01-17 23:54:47 +01:00
|
|
|
Common::FFXIVARR_POSITION3 m_spawnPos;
|
2019-01-26 00:06:24 +01:00
|
|
|
Common::FFXIVARR_POSITION3 m_roamPos;
|
2019-01-17 23:54:47 +01:00
|
|
|
|
|
|
|
BNpcState m_state;
|
|
|
|
std::set< std::shared_ptr< HateListEntry > > m_hateList;
|
|
|
|
|
2019-01-23 17:07:40 +01:00
|
|
|
uint64_t m_naviLastUpdate;
|
|
|
|
std::vector< Common::FFXIVARR_POSITION3 > m_naviLastPath;
|
|
|
|
uint8_t m_naviPathStep;
|
|
|
|
Common::FFXIVARR_POSITION3 m_naviTarget;
|
|
|
|
|
2019-03-28 23:57:58 +01:00
|
|
|
CharaPtr m_pOwner;
|
|
|
|
|
2018-10-28 21:53:21 +01:00
|
|
|
};
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
}
|
|
|
|
#endif
|