56#include <G3D/g3dmath.h>
64 char const*
const ChaseStates[] = {
"Run",
"CanWalk",
"AlwaysWalk" };
65 char const*
const RandomStates[] = {
"Walk",
"CanRun",
"AlwaysRun" };
67 std::ostringstream str;
84 return vendorItem.item == item_id && vendorItem.Type == type;
87 bool found = newEnd !=
m_items.end();
95 if (vendorItem.item == item_id && vendorItem.ExtendedCost == extendedCost && vendorItem.Type == type)
122 return &(*selectedItr);
128 if (model.CreatureDisplayID)
137 if (displayId == model.CreatureDisplayID)
147 if (modelInfo && modelInfo->is_trigger)
157 if (modelInfo && !modelInfo->is_trigger)
182 queryTemp.
Allow =
true;
204 stats.Display.TotalProbability += model.Probability;
205 return { model.CreatureDisplayID, model.DisplayScale, model.Probability };
208 stats.HpMulti = creatureDifficulty->HealthModifier;
209 stats.EnergyMulti = creatureDifficulty->ManaModifier;
211 stats.CreatureMovementInfoID = movementId;
212 stats.RequiredExpansion = RequiredExpansion;
213 stats.HealthScalingExpansion = creatureDifficulty->HealthScalingExpansion;
214 stats.VignetteID = VignetteID;
215 stats.Class = unit_class;
216 stats.CreatureDifficultyID = creatureDifficulty->CreatureDifficultyID;
217 stats.WidgetSetID = WidgetSetID;
218 stats.WidgetSetUnitConditionID = WidgetSetUnitConditionID;
220 stats.Title = SubName;
221 stats.TitleAlt = TitleAlt;
222 stats.CursorName = IconName;
224 if (std::vector<uint32>
const* items =
sObjectMgr->GetCreatureQuestItemList(
Entry, difficulty))
225 stats.QuestItems.assign(items->begin(), items->end());
227 if (std::vector<int32>
const* currencies =
sObjectMgr->GetCreatureQuestCurrencyList(
Entry))
228 stats.QuestCurrencies.assign(currencies->begin(), currencies->end());
240 queryTemp.ShrinkToFit();
241 return queryTemp.Move();
258 DefaultCreatureDifficulty()
263 HealthScalingExpansion = 0;
264 HealthModifier = 1.f;
267 DamageModifier = 1.f;
268 CreatureDifficultyID = 0;
272 PickPocketLootID = 0;
278 static const DefaultCreatureDifficulty defDifficulty;
279 return &defDifficulty;
303 return sObjectMgr->GetCreatureBaseStats(level, unitClass);
313 m_corpseRemoveTime(0), m_respawnTime(0), m_respawnDelay(300), m_corpseDelay(60), m_ignoreCorpseDecayRatio(false), m_wanderDistance(0.0f),
316 m_AlreadyCallAssistance(false), m_AlreadySearchedAssistance(false), m_cannotReachTarget(false), m_cannotReachTimer(0),
318 m_creatureInfo(nullptr), m_creatureData(nullptr), m_creatureDifficulty(nullptr), m_stringIds(), _waypointPathId(0), _currentWaypointNodeInfo(0, 0),
319 m_formation(nullptr), m_triggerJustAppeared(true), m_respawnCompatibilityMode(false), _aggroGracePeriodExpired(false), _lastDamagedTime(0),
320 _regenerateHealth(true), _creatureImmunitiesId(0), _gossipMenuId(0), _sparringHealthPct(0)
437 ai->CorpseRemoved(respawnDelay);
439 if (destroyForNearbyPlayers)
463 transport->CalculatePassengerPosition(x, y, z, &o);
501 TC_LOG_ERROR(
"sql.sql",
"Creature::InitEntry creature entry {} does not exist.", entry);
518 TC_LOG_ERROR(
"sql.sql",
"Creature (Entry: {}) has no model defined in table `creature_template`, can't load. ", entry);
526 TC_LOG_ERROR(
"sql.sql",
"Creature (Entry: {}) has invalid model {} defined in table `creature_template_model`, can't load.", entry, model.
CreatureDisplayID);
604 uint32 unitFlags, unitFlags2, unitFlags3;
622 unitFlags &= ~UNIT_FLAG_IN_COMBAT;
646 if (previousHealth > 0)
683 owner->VehicleSpellInitialize();
723 if (!staticFlagsOverride)
791 if (!linkedRespawnTime)
796 if (targetGuid == dbtableHighGuid)
801 time_t baseRespawnTime = std::max(linkedRespawnTime, now);
806 if (baseRespawnTime <= std::numeric_limits<time_t>::max() - offset)
898 TC_LOG_DEBUG(
"entities.unit.chase",
"RegenerateHealth() enabled because Creature cannot reach the target. Detail: {}",
GetDebugInfo());
901 TC_LOG_DEBUG(
"entities.unit.chase",
"RegenerateHealth() disabled even if the Creature cannot reach the target. Detail: {}",
GetDebugInfo());
953 if (curValue >= maxValue)
956 float addvalue = 0.0f;
979 addvalue =
uint32((27.0f / 5.0f + 17.0f) * ManaIncreaseRate);
982 addvalue = maxValue / 3;
1006 if (curValue >= maxValue)
1016 addvalue = 0.015f * ((float)
GetMaxHealth()) * HealthIncreaseRate;
1019 addvalue = maxValue/3;
1116 TC_LOG_ERROR(
"sql.sql",
"Creature::Create(): creature template (guidlow: {}, entry: {}) does not exist.", guidlow, entry);
1130 TC_LOG_ERROR(
"entities.unit",
"Creature::Create(): given coordinates for creature (guidlow {}, entry {}) are not valid (X: {}, Y: {}, Z: {}, O: {})", guidlow, entry, pos.
GetPositionX(), pos.
GetPositionY(), pos.
GetPositionZ(), pos.
GetOrientation());
1217 if (!creature->Create(lowGuid, map, entry, pos,
nullptr, vehId))
1229 if (!creature->
LoadFromDB(spawnId, map, addToMap, allowDuplicate))
1240 Unit* target =
nullptr;
1252 if (owner->IsInCombat())
1256 for (ControlList::const_iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
1258 if ((*itr)->IsInCombat())
1284 if (!iAuras.empty())
1286 for (Unit::AuraEffectList::const_iterator itr = iAuras.begin(); itr != iAuras.end(); ++itr)
1288 if ((*itr)->GetBase()->IsPermanent())
1392 for (
auto const* itr = group->GetFirstMember(); itr !=
nullptr; itr = itr->next())
1393 if (
GetMap()->IsRaid() || group->SameSubGroup(player, itr->GetSource()))
1394 m_tapList.insert(itr->GetSource()->GetGUID());
1430 if (!loot->isLooted())
1451 TC_LOG_ERROR(
"entities.unit",
"Creature::SaveToDB failed, cannot get creature data!");
1457 if (transport->GetMapIdForSpawning() >= 0)
1458 mapId = transport->GetMapIdForSpawning();
1486 if (spawnNpcFlags != cinfo->
npcflag)
1487 npcflag = spawnNpcFlags;
1542 trans->Append(stmt);
1550 stmt->
setString(index++, [&data]() -> std::string
1555 std::ostringstream os;
1557 os <<
int32(*itr++);
1560 os <<
',' <<
int32(*itr);
1577 if (npcflag.has_value())
1582 if (unitFlags.has_value())
1587 if (unitFlags2.has_value())
1592 if (unitFlags3.has_value())
1596 trans->Append(stmt);
1641 float weaponBaseMinDamage = basedamage;
1642 float weaponBaseMaxDamage = basedamage * 1.5f;
1667 if (areaTable->WildBattlePetLevelMin > 0)
1668 wildBattlePetLevel =
urand(areaTable->WildBattlePetLevelMin, areaTable->WildBattlePetLevelMax);
1676 switch (classification)
1705 switch (classification)
1728 switch (classification)
1769 if (
GetHealth() - damage <= sparringHealth)
1811 TC_LOG_ERROR(
"sql.sql",
"Creature::CreateFromProto(): creature template (guidlow: {}, entry: {}) does not exist.", guidlow, entry);
1849 if (!allowDuplicate)
1854 std::vector <Creature*> despawnList;
1856 if (creatureBounds.first != creatureBounds.second)
1858 for (
auto itr = creatureBounds.first; itr != creatureBounds.second; ++itr)
1860 if (itr->second->IsAlive())
1862 TC_LOG_DEBUG(
"maps",
"Would have spawned {} but {} already exists", spawnId, creatureBounds.first->second->GetGUID().ToString());
1867 despawnList.push_back(itr->second);
1868 TC_LOG_DEBUG(
"maps",
"Despawned dead instance of spawn {} ({})", spawnId, itr->second->GetGUID().ToString());
1872 for (
Creature* despawnCreature : despawnList)
1874 despawnCreature->AddObjectToRemoveList();
1882 TC_LOG_ERROR(
"sql.sql",
"Creature (SpawnID {}) not found in table `creature`, can't load. ", spawnId);
1925 TC_LOG_ERROR(
"entities.unit",
"Creature (SpawnID {}) trying to load despite a respawn timer in progress:\n{}", spawnId,
GetDebugInfo());
1952 if (addToMap && !
GetMap()->AddToMap(
this))
2011 [spawnId, charTrans](
Map* map) ->
void
2014 std::vector<Creature*> toUnload;
2015 for (auto const& pair : Trinity::Containers::MapEqualRange(map->GetCreatureBySpawnIdStore(), spawnId))
2016 toUnload.push_back(pair.second);
2017 for (Creature* creature : toUnload)
2018 map->AddObjectToRemoveList(creature);
2019 map->RemoveRespawnTime(SPAWN_TYPE_CREATURE, spawnId, charTrans);
2033 trans->Append(stmt);
2038 trans->Append(stmt);
2042 trans->Append(stmt);
2046 trans->Append(stmt);
2050 trans->Append(stmt);
2055 trans->Append(stmt);
2060 trans->Append(stmt);
2065 trans->Append(stmt);
2070 trans->Append(stmt);
2142 if (notAbove == 0 && notBelow == 0)
2145 if (playerLevel <= notBelow || (playerLevel >= notAbove && notAbove > 0))
2157 float maxRadius = 45.0f * aggroRate;
2158 float minRadius = 5.0f * aggroRate;
2163 int32 levelDifference = creatureLevel - playerLevel;
2170 float aggroRadius = baseAggroDistance + float(levelDifference);
2182 if (creatureLevel > expansionMaxLevel)
2183 aggroRadius = baseAggroDistance + float(expansionMaxLevel - playerLevel);
2186 if (aggroRadius > maxRadius)
2187 aggroRadius = maxRadius;
2188 else if (aggroRadius < minRadius)
2189 aggroRadius = minRadius;
2191 return (aggroRadius * aggroRate);
2278 uint32 unitFlags, unitFlags2, unitFlags3;
2363 TC_LOG_DEBUG(
"entities.unit",
"Respawning creature {} ({})",
2370 if (timeMSToDespawn)
2384 bool overrideRespawnTime =
false;
2387 if (forceRespawnTimer > Seconds::zero())
2391 overrideRespawnTime =
true;
2405 if (forceRespawnTimer > Seconds::zero())
2423 summon->UnSummon(timeToDespawn.count());
2432 static uint32 constexpr placeholderSpellId = std::numeric_limits<uint32>::max();
2436 for (std::size_t i = 0; i < immunities->
School.size(); ++i)
2437 if (immunities->
School[i])
2440 for (std::size_t i = 0; i < immunities->
DispelType.size(); ++i)
2444 for (std::size_t i = 0; i < immunities->
Mechanic.size(); ++i)
2460 applyCreatureImmunities(immunities,
false);
2466 applyCreatureImmunities(immunities,
true);
2473 bool requireImmunityPurgesEffectAttribute )
const
2503 Unit* target =
nullptr;
2515 TC_LOG_ERROR(
"entities.unit",
"Creature {} SelectNearestTargetInAttackDistance called with dist > MAX_VISIBILITY_DISTANCE. Distance set to ATTACK_DISTANCE.",
GetGUID().
ToString());
2519 Unit* target =
nullptr;
2535 TC_LOG_DEBUG(
"network",
"WORLD: Sent SMSG_AI_REACTION, type {}.", reactionType);
2548 std::list<Creature*> assistList;
2553 if (!assistList.empty())
2556 while (!assistList.empty())
2560 assistList.pop_front();
2703 if (!ai->CanAIAttack(victim))
2716 if (
GetMap()->IsDungeon())
2761 Mount(mountDisplayId);
2774 if (creatureAddon->
emote != 0)
2786 if (creatureAddon->
PathId != 0)
2789 if (!creatureAddon->
auras.empty())
2791 for (std::vector<uint32>::const_iterator itr = creatureAddon->
auras.begin(); itr != creatureAddon->
auras.end(); ++itr)
2794 if (!AdditionalSpellInfo)
2814 if (force || std::find(templateValues->begin(), templateValues->end(),
_sparringHealthPct) != templateValues->end())
2828 if (enemyTeam !=
HORDE)
2847 if (!currentMovement)
2850 bool canChangeMovement = [&]
2852 if (wasFleeingFromMelee)
2858 if (!canChangeMovement)
2952 return *movementOverride;
2979 bool isFullySkinned = [&]() ->
bool
2984 bool hasSkinningLoot =
false;
2989 if (!loot->isLooted())
2992 hasSkinningLoot =
true;
2996 return hasSkinningLoot;
3027 auto sender = [&](
Player const* receiver)
3029 receiver->PlayerTalkClass->SendQuestGiverStatus(receiver->GetQuestDialogStatus(
this),
GetGUID());
3053 int32 delta = mindelta == maxdelta ? mindelta :
irand(mindelta, maxdelta);
3064 return std::max(baseHealth * creatureDifficulty->
HealthModifier, 1.0f);
3116 if (
Unit const* unitTarget = target->
ToUnit())
3121 return RoundToInterval<uint8>(level, 1u, 255u);
3132 int32 targetLevel = unitTarget->m_unitData->EffectiveLevel;
3134 targetLevel = unitTarget->GetLevel();
3136 int32 targetLevelDelta = 0;
3141 scalingLevelMin = scalingLevelMax;
3143 int32 maxCreatureScalingLevel = playerTarget->m_activePlayerData->MaxCreatureScalingLevel;
3144 targetLevelDelta = std::min(maxCreatureScalingLevel > 0 ? maxCreatureScalingLevel - targetLevel : 0, *playerTarget->m_activePlayerData->ScalingPlayerLevelDelta);
3147 int32 levelWithDelta = targetLevel + targetLevelDelta;
3148 int32 level =
RoundToInterval(levelWithDelta, scalingLevelMin, scalingLevelMax) + scalingLevelDelta;
3186 return std::ranges::any_of(
m_stringIds, [
id](std::string
const* stringId) {
return stringId && *stringId == id; });
3210 if (data->spawnTrackingQuestObjectiveId && data->spawnTrackingData)
3232 if (itr->itemId == vItem->
item)
3246 if ((vCount->
count + diff * pProto->GetBuyCount()) >= vItem->
maxcount)
3252 vCount->
count += diff * pProto->GetBuyCount();
3256 return vCount->
count;
3266 if (itr->itemId == vItem->
item)
3284 if ((vCount->
count + diff * pProto->GetBuyCount()) < vItem->
maxcount)
3285 vCount->
count += diff * pProto->GetBuyCount();
3290 vCount->
count = vCount->
count > used_count ? vCount->
count-used_count : 0;
3292 return vCount->
count;
3346 if (cl->Name.size() > locale && !cl->Name[locale].empty())
3347 return cl->Name[locale];
3372 return m_charmInfo->GetCharmSpell(pos)->GetAction();
3387 if (spellInfo->GetRecoveryTime() == 0 && spellInfo->RangeEntry && spellInfo->RangeEntry->ID != 1 && spellInfo->RangeEntry->ID != 2 && spellInfo->GetMaxRange() > range)
3388 range = spellInfo->GetMaxRange();
3403 TC_LOG_DEBUG(
"entities.unit.chase",
"Creature::SetCannotReachTarget() called with true. Details: {}",
GetDebugInfo());
3409 mountCreatureDisplayId.reset();
3419 if (target &&
IsPet())
3432 if (levelDiff < -25)
3436 float aggroRadius = 20;
3439 aggroRadius -= (float)levelDiff;
3453 if (aggroRadius < 10)
3456 return (aggroRadius);
3468 Unit* target =
nullptr;
3566 if (!turnDisabled && noTurnDuringCast && target)
3569 if (noTurnDuringCast)
3579 TC_LOG_WARN(
"entities.unit",
"Creature '{}' (entry {}) has spell focus (spell id {}, delay {}ms) despite being dead.",
3618 TC_LOG_ERROR(
"entities.unit",
"Creature::ReacquireSpellFocusTarget() being called with HasSpellFocus() returning false. {}",
GetDebugInfo());
3664 if (std::find(repeats.begin(), repeats.end(),
id) == repeats.end())
3665 repeats.push_back(
id);
3674 CreatureTextRepeatGroup::const_iterator groupItr =
m_textRepeat.find(textGroup);
3676 ids = groupItr->second;
3683 CreatureTextRepeatGroup::iterator groupItr =
m_textRepeat.find(textGroup);
3685 groupItr->second.clear();
3696 return ai->IsEngaged();
3727 for (
auto seat = vehicle->Seats.begin(); seat != vehicle->Seats.end(); ++seat)
3735 ai->JustEngagedWith(target);
3737 formation->MemberEngagingTarget(
this, target);
3765 for (
auto const& [_, combatReference] :
GetCombatManager().GetPvECombatRefs())
3767 if (combatReference->IsSuppressedFor(
this))
3775 partiesToForceIntoCombat.
insert(group);
3778 for (
Group const* partyToForceIntoCombat : partiesToForceIntoCombat)
3780 for (
GroupReference const* ref = partyToForceIntoCombat->GetFirstMember(); ref !=
nullptr; ref = ref->
next())
3782 Player* player = ref->GetSource();
3794 return ai->IsEscorted();
3800 std::stringstream sstr;
3861 auto itr = clickBounds.begin();
3863 if (itr != clickBounds.end() && ++itr == clickBounds.end())
3904 m_unitData->WriteUpdate(*data, mask,
true,
this, target);
3912 if (requestedObjectMask.IsAnySet())
3917 if (unitMask.IsAnySet())
3921 std::size_t sizePos = buffer.
wpos();
3927 m_objectData->WriteUpdate(buffer, requestedObjectMask,
true,
this, target);
3930 m_unitData->WriteUpdate(buffer, unitMask,
true,
this, target);
@ SPELL_SPIRIT_HEAL_CHANNEL_AOE
constexpr uint8 MAX_SPELL_CHARM
const uint32 CREATURE_REGEN_INTERVAL
@ CREATURE_FLAG_EXTRA_DUNGEON_BOSS
@ CREATURE_FLAG_EXTRA_IGNORE_PATHFINDING
@ CREATURE_FLAG_EXTRA_CANNOT_ENTER_COMBAT
@ CREATURE_FLAG_EXTRA_NO_XP
@ CREATURE_FLAG_EXTRA_IMMUNITY_KNOCKBACK
@ CREATURE_FLAG_EXTRA_IGNORE_FEIGN_DEATH
@ CREATURE_FLAG_EXTRA_NO_TAUNT
@ CREATURE_FLAG_EXTRA_GHOST_VISIBILITY
@ CREATURE_FLAG_EXTRA_USE_OFFHAND_ATTACK
@ CREATURE_FLAG_EXTRA_WORLDEVENT
@ CREATURE_STATIC_FLAG_IGNORE_COMBAT
@ CREATURE_STATIC_FLAG_CAN_SWIM
@ CREATURE_STATIC_FLAG_NO_XP
@ CREATURE_STATIC_FLAG_NO_MELEE_FLEE
CreatureChaseMovementType
const uint8 MAX_KILL_CREDIT
@ CREATURE_STATIC_FLAG_4_NO_BIRTH_ANIM
@ CREATURE_STATIC_FLAG_4_NO_MELEE_APPROACH
@ CREATURE_STATIC_FLAG_5_INTERACT_WHILE_HOSTILE
CreatureRandomMovementType
const uint32 CREATURE_NOPATH_EVADE_TIME
@ CREATURE_STATIC_FLAG_3_ALLOW_INTERACTION_WHILE_IN_COMBAT
@ CREATURE_STATIC_FLAG_2_FORCE_PARTY_MEMBERS_INTO_COMBAT
@ CREATURE_STATIC_FLAG_2_ALLOW_MOUNTED_COMBAT
const uint32 MAX_CREATURE_SPELLS
const uint32 PET_FOCUS_REGEN_INTERVAL
@ NPC_ALLIANCE_GRAVEYARD_TELEPORT
@ NPC_HORDE_GRAVEYARD_TELEPORT
std::vector< uint8 > CreatureTextRepeatIds
#define CREATURE_Z_ATTACK_RANGE
static constexpr uint8 WILD_BATTLE_PET_DEFAULT_LEVEL
static constexpr size_t CREATURE_TAPPERS_SOFT_CAP
DB2Storage< DifficultyEntry > sDifficultyStore("Difficulty.db2", &DifficultyLoadInfo::Instance)
DB2Storage< ChrRacesEntry > sChrRacesStore("ChrRaces.db2", &ChrRacesLoadInfo::Instance)
DB2Storage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", &CreatureDisplayInfoLoadInfo::Instance)
DB2Storage< FactionTemplateEntry > sFactionTemplateStore("FactionTemplate.db2", &FactionTemplateLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
@ FACTION_TEMPLATE_FLAG_PVP
SQLTransaction< WorldDatabaseConnection > WorldDatabaseTransaction
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
std::chrono::seconds Seconds
Seconds shorthand typedef.
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define ASSERT_NOTNULL(pointer)
#define MAX_FALL_DISTANCE
#define SIZE_OF_GRID_CELL
#define TC_LOG_DEBUG(filterType__, message__,...)
#define TC_LOG_ERROR(filterType__, message__,...)
#define TC_LOG_WARN(filterType__, message__,...)
#define MAX_VISIBILITY_DISTANCE
#define DEFAULT_PLAYER_COMBAT_REACH
@ TEMPSUMMON_TIMED_DESPAWN
#define DEFAULT_PLAYER_DISPLAY_SCALE
std::optional< T > Optional
Optional helper class to wrap optional values within.
int32 irand(int32 min, int32 max)
uint32 urand(uint32 min, uint32 max)
void SendGossipMenuFor(Player *player, uint32 npcTextID, ObjectGuid const &guid)
void ClearGossipMenuFor(Player *player)
@ SERVERSIDE_VISIBILITY_GHOST
constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
@ SPELL_ATTR5_AI_DOESNT_FACE_TARGET
@ SPELL_SCHOOL_MASK_NORMAL
@ CREATURE_TYPE_NON_COMBAT_PET
@ CREATURE_TYPE_MECHANICAL
@ SPELL_EFFECT_KNOCK_BACK_DEST
@ SPELL_EFFECT_KNOCK_BACK
float const GROUND_HEIGHT_TOLERANCE
@ FACTION_ALLIANCE_GENERIC
@ CREATURE_TYPE_FLAG_VISIBLE_TO_GHOSTS
@ CREATURE_TYPE_FLAG_BOSS_MOB
@ CREATURE_TYPE_FLAG_ALLOW_INTERACTION_WHILE_IN_COMBAT
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Creature can be targeted by spells that require target to be in caster's party/raid.
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
@ SPAWNGROUP_FLAG_COMPATIBILITY_MODE
@ LINKED_RESPAWN_CREATURE_TO_GO
@ LINKED_RESPAWN_CREATURE_TO_CREATURE
@ LINKED_RESPAWN_GO_TO_CREATURE
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_PREVENTS_FLEEING
@ SPELL_AURA_CONTROL_VEHICLE
@ SPELL_AURA_MOD_INVISIBILITY
@ SPELL_AURA_MOD_HEALTH_REGEN_PERCENT
@ SPELL_AURA_MOD_DETECTED_RANGE
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
@ SPELL_AURA_MOD_DETECT_RANGE
@ UNIT_FLAG2_REGENERATE_POWER
constexpr NPCFlags UNIT_NPC_FLAG_VENDOR_MASK
NPCFlags
Non Player Character flags.
@ UNIT_NPC_FLAG_SPELLCLICK
@ UNIT_NPC_FLAG_PETITIONER
#define MAX_EQUIPMENT_ITEMS
@ UNIT_FLAG_NON_ATTACKABLE
@ UNIT_FLAG_PLAYER_CONTROLLED
@ UNIT_MOD_RESISTANCE_SHADOW
@ UNIT_MOD_RESISTANCE_FROST
@ UNIT_MOD_RESISTANCE_HOLY
@ UNIT_MOD_RESISTANCE_ARCANE
@ UNIT_MOD_RESISTANCE_FIRE
@ UNIT_MOD_RESISTANCE_NATURE
@ UNIT_MOD_ATTACK_POWER_RANGED
@ UNIT_STATE_ATTACK_PLAYER
@ UNIT_STATE_IGNORE_PATHFINDING
@ UNIT_STATE_ALL_ERASABLE
T RoundToInterval(T &num, T floor, T ceil)
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
@ WORLD_DEL_SPAWNGROUP_MEMBER
@ WORLD_DEL_GAME_EVENT_MODEL_EQUIP
@ WORLD_DEL_CREATURE_ADDON
@ WORLD_DEL_LINKED_RESPAWN
@ WORLD_DEL_GAME_EVENT_CREATURE
@ WORLD_DEL_LINKED_RESPAWN_MASTER
bool Execute(uint64 e_time, uint32 p_time) override
void AddAssistant(ObjectGuid guid)
void put(std::size_t pos, T value)
Unit * GetAnyTarget() const
virtual void EnterEvadeMode(EvadeReason why=EvadeReason::Other)
virtual void JustAppeared()
virtual bool CheckInRoom()
Creature * GetLeader() const
void FormationReset(bool dismiss)
bool HasAliveMembers() const
void LeaderStartedMoving()
bool IsLeader(Creature const *creature) const
bool CanLeaderStartMoving() const
bool HasFlag(CreatureStaticFlags flag) const
EnumFlag< CreatureStaticFlags8 > GetFlags8() const
void ApplyFlag(CreatureStaticFlags flag, bool apply)
EnumFlag< CreatureStaticFlags2 > GetFlags2() const
EnumFlag< CreatureStaticFlags > GetFlags() const
EnumFlag< CreatureStaticFlags7 > GetFlags7() const
EnumFlag< CreatureStaticFlags5 > GetFlags5() const
EnumFlag< CreatureStaticFlags6 > GetFlags6() const
EnumFlag< CreatureStaticFlags4 > GetFlags4() const
EnumFlag< CreatureStaticFlags3 > GetFlags3() const
bool IsSwimPrevented() const
bool HasClassification(CreatureClassifications classification) const
bool LoadCreaturesAddon()
void ClearUpdateMask(bool remove) override
time_t _pickpocketLootRestore
Timers.
bool HasSpell(uint32 spellID) const override
uint32 CalculateDamageForSparring(Unit *attacker, uint32 damage)
VendorItemCounts m_vendorItemCounts
void SetHomePosition(float x, float y, float z, float o)
void SetNoSearchAssistance(bool val)
void ReleaseSpellFocus(Spell const *focusSpell=nullptr, bool withDelay=true)
CreatureDifficulty const * m_creatureDifficulty
void BuildValuesCreate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const override
void SetCanMelee(bool canMelee, bool fleeFromMelee=false)
void Respawn(bool force=false)
std::array< std::string const *, 3 > m_stringIds
void SetInteractionAllowedInCombat(bool interactionAllowed) override
bool CanSwim() const override
CreatureTextRepeatGroup m_textRepeat
void GetRespawnPosition(float &x, float &y, float &z, float *ori=nullptr, float *dist=nullptr) const
VendorItemData const * GetVendorItems() const
void StartDefaultCombatMovement(Unit *victim, Optional< float > range={}, Optional< float > angle={})
bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, CreatureData const *data=nullptr, uint32 vehId=0)
CreatureStaticFlagsHolder _staticFlags
bool IsDungeonBoss() const
bool LoadFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap, bool allowDuplicate)
float GetHealthMultiplierForTarget(WorldObject const *target) const override
bool IsReturningHome() const
Optional< uint32 > m_lootId
void UpdateLevelDependantStats()
int8 m_originalEquipmentId
void setDeathState(DeathState s) override
static Creature * CreateCreatureFromDB(ObjectGuid::LowType spawnId, Map *map, b