18#ifndef TRINITYCORE_CREATURE_H
19#define TRINITYCORE_CREATURE_H
52#define CREATURE_Z_ATTACK_RANGE 3
54#define MAX_VENDOR_ITEMS 150
72 explicit Creature(
bool isWorldObject =
false);
81 void SetDisplayFromModel(
uint32 modelIdx);
90 bool LoadCreaturesAddon();
91 void LoadCreaturesSparringHealth(
bool force =
false);
93 void UpdateLevelDependantStats();
94 void SelectWildBattlePetLevel();
95 void LoadEquipment(
int8 id = 1,
bool force =
false);
96 void SetSpawnHealth();
101 void GetRespawnPosition(
float &x,
float &y,
float &z,
float* ori =
nullptr,
float* dist =
nullptr)
const;
106 m_corpseDelay = delay;
107 if (ignoreCorpseDecayRatio)
108 m_ignoreCorpseDecayRatio =
true;
116 void InitializeMovementCapabilities();
117 void UpdateMovementCapabilities();
158 Unit* SelectVictim();
163 void InitializeReactState();
178 bool isCanInteractWithBattleMaster(
Player* player,
bool msg)
const;
179 bool CanResetTalents(
Player* player)
const;
180 bool CanCreatureAttack(
Unit const* victim,
bool force =
true)
const;
181 void LoadTemplateImmunities(
int32 creatureImmunitiesId);
183 bool IsElite()
const;
184 bool isWorldBoss()
const;
190 bool HasScalableLevels()
const;
191 void ApplyLevelScaling();
197 float GetBaseDamageForLevel(
uint8 level)
const;
200 float GetBaseArmorForLevel(
uint8 level)
const;
211 bool AIM_Initialize(
CreatureAI* ai =
nullptr);
212 void Motion_Initialize();
219 void SetCanMelee(
bool canMelee,
bool fleeFromMelee =
false);
227 bool UpdateEntry(
uint32 entry,
CreatureData const* data =
nullptr,
bool updateLevel =
true);
255 std::string
const& GetAIName()
const;
256 std::string GetScriptName()
const;
257 uint32 GetScriptId()
const;
258 bool HasStringId(std::string_view
id)
const;
259 void SetScriptStringId(std::string
id);
260 std::array<std::string_view, 3>
const&
GetStringIds()
const {
return m_stringIds; }
270 virtual void SaveToDB(
uint32 mapid, std::vector<Difficulty>
const& spawnDifficulties);
279 void StartPickPocketRefillTimer();
281 bool CanGeneratePickPocketLoot()
const;
286 void SetDontClearTapListOnEvade(
bool dontClear);
287 bool isTappedBy(
Player const* player)
const;
289 bool IsFullyLooted()
const;
290 bool IsSkinnedBy(
Player const* player)
const;
292 void SetTappedBy(
Unit const* unit,
bool withGroup =
true);
293 void AllLootRemovedFromCorpse();
304 bool CanStartAttack(
Unit const* u,
bool force)
const;
305 float GetAttackDistance(
Unit const* player)
const;
306 float GetAggroRange(
Unit const* target)
const;
310 Unit* SelectNearestTarget(
float dist = 0,
bool playerOnly =
false)
const;
311 Unit* SelectNearestTargetInAttackDistance(
float dist = 0)
const;
312 Unit* SelectNearestHostileUnitInAggroRange(
bool useLOS =
false,
bool ignoreCivilians =
false)
const;
314 void DoFleeToGetAssistance();
316 void CallAssistance();
320 bool CanAssistTo(
Unit const* u,
Unit const* enemy,
bool checkfaction =
true)
const;
321 bool _IsTargetAcceptable(
Unit const* target)
const;
327 void RemoveCorpse(
bool setSpawnTime =
true,
bool destroyForNearbyPlayers =
true);
332 time_t GetRespawnTimeEx()
const;
333 void SetRespawnTime(
uint32 respawn);
334 void Respawn(
bool force =
false);
335 void SaveRespawnTime(
uint32 forceDelay = 0);
347 m_combatPulseDelay = delay;
348 if (m_combatPulseTime == 0 || m_combatPulseTime > delay)
349 m_combatPulseTime = delay;
352 void SendZoneUnderAttackMessage(
Player* attacker);
359 virtual uint8 GetPetAutoSpellSize()
const;
360 virtual uint32 GetPetAutoSpellOnPos(
uint8 pos)
const;
361 float GetPetChaseDistance()
const;
366 void SetCannotReachTarget(
bool cannotReach);
371 void SetHomePosition(
float x,
float y,
float z,
float o) { m_homePosition.Relocate(x, y, z, o); }
373 void GetHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_homePosition.GetPosition(x, y, z, ori); }
378 void GetTransportHomePosition(
float& x,
float& y,
float& z,
float& ori)
const { m_transportHomePosition.GetPosition(x, y, z, ori); }
388 bool IsReturningHome()
const;
390 void SearchFormation();
393 bool IsFormationLeader()
const;
394 void SignalFormationMovement();
395 bool IsFormationLeaderMoveAllowed()
const;
399 void LowerPlayerDamageReq(
uint64 unDamage);
418 void DoNotReacquireSpellFocusTarget();
421 void ReleaseSpellFocus(
Spell const* focusSpell =
nullptr,
bool withDelay =
true);
430 void SetTextRepeatId(
uint8 textGroup,
uint8 id);
431 void ClearTextRepeatGroup(
uint8 textGroup);
432 bool IsEscorted()
const;
434 bool CanGiveExperience()
const;
445 void OverrideSparringHealthPct(std::vector<float>
const& healthPct);
448 bool ShouldFakeDamageFrom(
Unit* attacker);
463 uint32 GetGossipMenuId()
const;
464 void SetGossipMenuId(
uint32 gossipMenuId);
466 uint32 GetTrainerId()
const;
469 void SummonGraveyardTeleporter();
471 void InitializeInteractSpellId();
499 void RegenerateHealth();
500 void Regenerate(
Powers power);
534 void ForcedDespawn(
uint32 timeMSToDespawn = 0,
Seconds forceRespawnTimer = 0s);
535 bool CheckNoGrayAggroConfig(
uint32 playerLevel,
uint32 creatureLevel)
const;
547 void ReacquireSpellFocusTarget();
553 float Orientation = 0.0f;
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
@ CREATURE_FLAG_EXTRA_TRIGGER
@ CREATURE_FLAG_EXTRA_CIVILIAN
@ CREATURE_FLAG_EXTRA_GUARD
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
@ CREATURE_STATIC_FLAG_AQUATIC
@ CREATURE_STATIC_FLAG_NO_XP
@ CREATURE_STATIC_FLAG_NO_MELEE_FLEE
@ CREATURE_STATIC_FLAG_UNKILLABLE
@ CREATURE_STATIC_FLAG_SESSILE
@ CREATURE_STATIC_FLAG_NO_LOOT
@ CREATURE_STATIC_FLAG_FLOATING
@ CREATURE_STATIC_FLAG_AMPHIBIOUS
@ CREATURE_STATIC_FLAG_4_PREVENT_SWIM
@ CREATURE_STATIC_FLAG_4_NO_MELEE_APPROACH
@ CREATURE_STATIC_FLAG_4_IGNORE_LOS_WHEN_CASTING_ON_ME
@ CREATURE_STATIC_FLAG_4_TREAT_AS_RAID_UNIT_FOR_HELPFUL_SPELLS
@ CREATURE_STATIC_FLAG_6_ALWAYS_STAND_ON_TOP_OF_TARGET
@ CREATURE_STATIC_FLAG_5_NO_HEALTH_REGEN
@ CREATURE_STATIC_FLAG_5_NO_LEAVECOMBAT_STATE_RESTORE
@ CREATURE_STATIC_FLAG_3_CANNOT_PENETRATE_WATER
@ CREATURE_STATIC_FLAG_3_CANNOT_SWIM
@ CREATURE_STATIC_FLAG_3_NO_THREAT_FEEDBACK
@ CREATURE_STATIC_FLAG_2_IGNORE_FEIGN_DEATH
@ CREATURE_STATIC_FLAG_2_IGNORE_SANCTUARY
const uint32 MAX_CREATURE_SPELLS
std::vector< uint8 > CreatureTextRepeatIds
std::list< VendorItemCount > VendorItemCounts
std::unordered_map< uint8, CreatureTextRepeatIds > CreatureTextRepeatGroup
static constexpr uint8 WILD_BATTLE_PET_DEFAULT_LEVEL
static constexpr size_t CREATURE_TAPPERS_SOFT_CAP
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
std::list< ObjectGuid > GuidList
std::unordered_set< ObjectGuid > GuidUnorderedSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
static void SaveToDB(QuestPool const &pool, CharacterDatabaseTransaction trans)
AssistDelayEvent(ObjectGuid victim, Unit &owner)
void AddAssistant(ObjectGuid guid)
bool IsSwimPrevented() const
bool IsTreatedAsRaidUnit() const
bool HasClassification(CreatureClassifications classification) const
time_t _pickpocketLootRestore
Timers.
void SetCombatPulseDelay(uint32 delay)
VendorItemCounts m_vendorItemCounts
time_t const & GetRespawnTime() const
void SetHomePosition(float x, float y, float z, float o)
bool IsTapListNotClearedOnEvade() const
void SetNoSearchAssistance(bool val)
void RemoveLootMode(uint16 lootMode)
void SetUnkillable(bool unkillable)
void SetIgnoreSanctuarySpellEffect(bool ignoreSanctuary)
CreatureDifficulty const * m_creatureDifficulty
bool HasLootMode(uint16 lootMode) const
int8 GetOriginalEquipmentId() const
void SetHomePosition(Position const &pos)
void DoImmediateBoundaryCheck()
CreatureTextRepeatGroup m_textRepeat
CreatureStaticFlagsHolder _staticFlags
bool IsDungeonBoss() const
SpellSchoolMask m_meleeDamageSchoolMask
Optional< uint32 > m_lootId
int8 m_originalEquipmentId
bool GetRespawnCompatibilityMode() const
bool IsIgnoringChaseRange() const
void SetDisableReputationGain(bool disable)
ObjectGuid::LowType m_spawnId
For new or temporary creatures is 0 for saved it is lowguid.
std::unique_ptr< Loot > m_loot
CreatureDifficulty const * GetCreatureDifficulty() const
Position m_transportHomePosition
CreatureClassifications GetCreatureClassification() const
Optional< uint32 > _defaultMountDisplayIdOverride
uint16 GetLootMode() const
bool IsIgnoringFeignDeath() const
void SetImmuneToPC(bool apply) override
bool IsReputationGainDisabled() const
float GetSparringHealthPct() const
bool CanIgnoreLineOfSightWhenCastingOnMe() const
Optional< std::string > m_scriptStringId
bool m_respawnCompatibilityMode
bool IsSwimDisabled() const
std::unordered_map< ObjectGuid, std::unique_ptr< Loot > > m_personalLoot
CreatureTemplate const * m_creatureInfo
bool IsSpawnedOnTransport() const
bool CanFly() const override
void GetHomePosition(float &x, float &y, float &z, float &ori) const
Position const & GetHomePosition() const
void SetLastDamagedTime(time_t val)
bool IsEvadingAttacks() const
bool HasReactState(ReactStates state) const
bool m_triggerJustAppeared
void SetCanGiveExperience(bool xpEnabled)
void GetTransportHomePosition(float &x, float &y, float &z, float &ori) const
uint32 GetOriginalEntry() const
bool IsThreatFeedbackDisabled() const
MovementGeneratorType m_defaultMovementType
void SetReactState(ReactStates st)
GuidUnorderedSet const & GetTapList() const
void ResetPlayerDamageReq()
int32 _creatureImmunitiesId
std::pair< uint32, uint32 > _currentWaypointNodeInfo
void SetCannotPenetrateWater(bool cannotPenetrateWater)
bool hasLootRecipient() const
void SetRespawnCompatibilityMode(bool mode=true)
void SetCurrentEquipmentId(uint8 id)
void SetRespawnDelay(uint32 delay)
bool HasFlag(CreatureStaticFlags7 flag) const
uint32 m_cannotReachTimer
time_t m_corpseRemoveTime
uint32 m_combatPulseDelay
void UpdateCurrentWaypointInfo(uint32 nodeId, uint32 pathId)
void SetRestoreStateOnEvade(bool restoreOnEvade)
void SetRegenerateHealth(bool value)
bool HasFlag(CreatureStaticFlags3 flag) const
CreatureData const * m_creatureData
SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType=BASE_ATTACK) const override
bool HasFlag(CreatureStaticFlags2 flag) const
uint32 m_boundaryCheckTime
uint32 GetWaypointPathId() const
CreatureData const * GetCreatureData() const
std::pair< uint32, uint32 > GetCurrentWaypointInfo() const
void SetFloating(bool floating)
ObjectGuid::LowType GetSpawnId() const
bool CanNotReachTarget() const
bool m_AlreadyCallAssistance
CreatureTemplate const * GetCreatureTemplate() const
uint32 GetRespawnDelay() const
Position const & GetTransportHomePosition() const
void SetSessile(bool sessile)
bool CanRegenerateHealth() const
bool DisableReputationGain
CreatureGroup * m_formation
void SetInteractSpellId(int32 interactSpellId)
bool HasSearchedAssistance() const
void SetTransportHomePosition(Position const &pos)
bool IsStateRestoredOnEvade() const
bool HasFlag(CreatureStaticFlags4 flag) const
bool HasFlag(CreatureStaticFlags6 flag) const
std::array< std::string_view, 3 > m_stringIds
void SetCanHaveLoot(bool canHaveLoot)
void SetNoThreatFeedback(bool noThreatFeedback)
void SetImmuneToNPC(bool apply) override
std::array< std::string_view, 3 > const & GetStringIds() const
CreatureGroup * GetFormation()
bool m_AlreadySearchedAssistance
uint32 GetCorpseDelay() const
GuidUnorderedSet m_tapList
bool m_dontClearTapListOnEvade
bool CannotPenetrateWater() const
void OverrideSparringHealthPct(float healthPct)
bool CanEnterWater() const override
void SetImmuneToAll(bool apply) override
bool IsIgnoringSanctuarySpellEffect() const
bool HasFlag(CreatureStaticFlags8 flag) const
void AddLootMode(uint16 lootMode)
ReactStates GetReactState() const
void SetTransportHomePosition(float x, float y, float z, float o)
void SetWanderDistance(float dist)
time_t GetLastDamagedTime() const
MovementGeneratorType GetDefaultMovementType() const override
Optional< uint32 > _trainerId
bool HasFlag(CreatureStaticFlags flag) const
uint8 GetCurrentEquipmentId() const
void SetFormation(CreatureGroup *formation)
void SetCorpseDelay(uint32 delay, bool ignoreCorpseDecayRatio=false)
uint32 GetCombatPulseDelay() const
void SetMeleeDamageSchool(SpellSchools school)
float GetWanderDistance() const
bool IsAmphibious() const
void ResetPickPocketRefillTimer()
void SetNoCallAssistance(bool val)
void SetTreatAsRaidUnit(bool treatAsRaidUnit)
bool IsAffectedByDiminishingReturns() const override
bool IsRacialLeader() const
bool m_ignoreCorpseDecayRatio
bool HasFlag(CreatureStaticFlags5 flag) const
void SetIgnoreChaseRange(bool ignoreChaseRange)
bool IsInEvadeMode() const
void SetLootMode(uint16 lootMode)
void SetDefaultMovementType(MovementGeneratorType mgt)
void LoadPath(uint32 pathid)
void SetTapList(GuidUnorderedSet tapList)
void SetOriginalEntry(uint32 entry)
void SetIgnoreFeignDeath(bool ignoreFeignDeath)
Seconds const m_respawnTimer
ForcedDespawnDelayEvent(Creature &owner, Seconds respawnTimer)
virtual bool hasQuest(uint32) const
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
virtual Loot * GetLootForPlayer(Player const *player) const
virtual void SetObjectScale(float scale)
virtual bool hasInvolvedQuest(uint32) const
void SetImmuneToAll(bool apply, bool keepCombat)
void SetImmuneToPC(bool apply, bool keepCombat)
virtual bool IsMovementPreventedByCasting() const
virtual int32 GetCreatePowerValue(Powers power) const
void AddToWorld() override
virtual float GetArmorMultiplierForTarget(WorldObject const *) const
virtual void SetCanDualWield(bool value)
void SetControlled(bool apply, UnitState state)
UF::UpdateField< UF::UnitData, 0, TYPEID_UNIT > m_unitData
virtual bool UpdateAllStats()=0
virtual void AtEngage(Unit *)
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void AtDisengage()
std::string GetDebugInfo() const override
void SetImmuneToNPC(bool apply, bool keepCombat)
bool SetDisableGravity(bool disable, bool updateAnimTier=true)
virtual void SetInteractionAllowedWhileHostile(bool interactionAllowed)
virtual bool HasSpell(uint32) const
virtual bool IsAffectedByDiminishingReturns() const
bool IsImmuneToNPC() const
virtual void SetInteractionAllowedInCombat(bool interactionAllowed)
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, SpellEffectInfo const &spellEffectInfo, WorldObject const *caster, bool requireImmunityPurgesEffectAttribute=false) const
bool IsImmuneToAll() const
virtual void UpdateNearbyPlayersInteractions()
virtual void UpdateArmor()=0
virtual float GetDamageMultiplierForTarget(WorldObject const *) const
bool HasUnitMovementFlag(uint32 f) const
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
uint8 GetLevelForTarget(WorldObject const *) const override
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage) const =0
virtual void SetTarget(ObjectGuid const &)=0
virtual uint32 GetPowerIndex(Powers power) const =0
virtual float GetHealthMultiplierForTarget(WorldObject const *) const
bool HasUnitState(const uint32 f) const
virtual void Update(uint32 time) override
virtual bool CanSwim() const
virtual float GetNativeObjectScale() const
void RemoveFromWorld() override
virtual void UpdateMaxHealth()=0
virtual bool HasSpellFocus(Spell const *=nullptr) const
virtual void setDeathState(DeathState s)
virtual bool IsEngaged() const
bool IsImmuneToPC() const
virtual void SetDisplayId(uint32 displayId, bool setNative=false)
virtual void ExitVehicle(Position const *exitPosition=nullptr)
constexpr uint32 GetMapId() const
virtual bool IsInvisibleDueToDespawn(WorldObject const *seer) const
std::string GetNameForLocaleIdx(LocaleConstant) const override
virtual bool CanAlwaysSee(WorldObject const *) const
Player session in the World.
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
UpdateField< int32, 96, 114 > InteractSpellID
VendorItemCount(uint32 _item, uint32 _count)