2021-11-27 00:53:57 +01:00
|
|
|
#pragma once
|
2018-08-29 21:40:59 +02:00
|
|
|
|
|
|
|
#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:
|
2020-03-01 01:00:57 +11:00
|
|
|
BNpc();
|
2021-11-27 00:53:57 +01:00
|
|
|
|
|
|
|
BNpc( uint32_t id, std::shared_ptr< Common::BNPCInstanceObject > pInfo, TerritoryPtr pZone );
|
|
|
|
BNpc( uint32_t id, std::shared_ptr< Common::BNPCInstanceObject > pInfo, TerritoryPtr pZone, uint32_t hp, Common::BNpcType type );
|
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-04-20 00:11:00 +02:00
|
|
|
bool moveTo( const Entity::Chara& targetChara );
|
|
|
|
|
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;
|
2021-11-27 00:53:57 +01:00
|
|
|
uint32_t getBoundInstanceId() const;
|
2019-04-17 00:10:32 +02:00
|
|
|
|
2019-04-17 12:37:24 +02:00
|
|
|
bool hasFlag( uint32_t flag ) const;
|
|
|
|
void setFlag( uint32_t flags );
|
|
|
|
|
2019-04-24 23:25:07 +10:00
|
|
|
void calculateStats() override;
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
uint32_t getRank() const;
|
|
|
|
|
|
|
|
Common::BNpcType getBNpcType() const;
|
|
|
|
|
2021-12-22 00:40:11 +01:00
|
|
|
uint32_t getLayoutId() const;
|
|
|
|
|
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;
|
2021-11-27 00:53:57 +01:00
|
|
|
uint32_t m_rank;
|
|
|
|
uint32_t m_boundInstanceId;
|
2021-12-22 00:40:11 +01:00
|
|
|
uint32_t m_layoutId;
|
2018-08-29 21:40:59 +02:00
|
|
|
|
2019-04-17 12:37:24 +02:00
|
|
|
uint32_t m_flags;
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
Common::BNpcType m_bnpcType;
|
|
|
|
|
2019-01-31 22:49:04 +11:00
|
|
|
float m_naviTargetReachedDistance;
|
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
std::shared_ptr< Common::BNPCInstanceObject > m_pInfo;
|
|
|
|
|
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
|
|
|
|
2021-11-27 00:53:57 +01:00
|
|
|
}
|