25#define PET_XP_FACTOR 0.05f
137 Field* fields = result->Fetch();
147 bool isTemporarySummon = spellInfo && spellInfo->
GetDuration() > 0;
148 if (current && isTemporarySummon)
169 if (!
Create(guid, map, petEntry, petId))
178 SF_LOG_ERROR(
"entities.pet",
"Pet (guidlow %d, entry %d) not loaded. Suggested coordinates isn't valid (X: %f Y: %f)",
201 SetName(fields[8].GetString());
253 bool const isActivePet = fields[17].
GetBool();
256 if (!isActivePet || fields[7].GetUInt8())
312 uint32 timediff =
uint32(time(NULL) - fields[13].GetUInt32());
316 if (!isTemporarySummon)
318 m_charmInfo->LoadPetActionBar(fields[12].GetString());
348 Field* fields2 = result->Fetch();
417 std::string name =
m_name;
454 std::ostringstream ss;
455 ss <<
"INSERT INTO character_pet (id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, active, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType, PetSpecId) "
459 << ownerLowGUID <<
','
464 <<
uint32(dbMode) <<
", '"
465 << name.c_str() <<
"', "
467 <<
uint32(saveAsActive ? 1 : 0) <<
','
483 trans->Append(ss.str().c_str());
572 bool petOnOwnerTransport =
false;
573 bool petInVisibilityRange =
false;
577 petOnOwnerTransport = ownerTransport &&
GetTransport() == ownerTransport;
580 petOnOwnerTransport))
583 petOnOwnerTransport = ownerTransport &&
GetTransport() == ownerTransport;
663 if (curValue >= maxValue)
666 float addvalue = 0.0f;
688 for (AuraEffectList::const_iterator i = ModPowerRegenPCTAuras.begin(); i != ModPowerRegenPCTAuras.end(); ++i)
689 if (
Powers((*i)->GetMiscValue()) == power)
690 AddPct(addvalue, (*i)->GetAmount());
717 if (petlevel >= maxlevel)
722 uint32 newXP = curXP + xp;
725 while (newXP >= nextLvlXP && petlevel < maxlevel)
766 SF_LOG_ERROR(
"entities.pet",
"Pet (guidlow %d, entry %d) not created base at creature. Suggested coordinates isn't valid (X: %f Y: %f)",
774 SF_LOG_ERROR(
"entities.pet",
"CreateBaseAtCreature() failed, creatureInfo is missing!");
803 SF_LOG_DEBUG(
"entities.pet",
"Pet::CreateBaseForTamed");
897 if (pInfo->
armor > 0)
925 int32 val = (fire > shadow) ? fire : shadow;
1099 return diet & FoodMask;
1108 else if (
getLevel() <= itemlevel + 10)
1111 else if (
getLevel() <= itemlevel + 14)
1129 time_t curTime = time(NULL);
1141 size_t bitpos = data.
bitwpos();
1149 Field* fields = result->Fetch();
1152 time_t db_time = time_t(fields[1].GetUInt32());
1156 SF_LOG_ERROR(
"entities.pet",
"Pet %u have unknown spell %u in `pet_spell_cooldown`, skipping.",
m_charmInfo->GetPetNumber(), spell_id);
1161 if (db_time <= curTime)
1164 data <<
uint32(spell_id);
1170 SF_LOG_DEBUG(
"entities.pet",
"Pet (Number: %u) spell %u cooldown loaded (%u secs).",
m_charmInfo->GetPetNumber(), spell_id,
uint32(db_time - curTime));
1171 }
while (result->NextRow());
1173 data.
PutBits(bitpos, count, 21);
1192 trans->Append(stmt);
1194 time_t curTime = time(NULL);
1199 if (itr->second <= curTime)
1207 trans->Append(stmt);
1224 Field* fields = result->Fetch();
1227 }
while (result->NextRow());
1243 switch (itr->second.state)
1249 trans->Append(stmt);
1257 trans->Append(stmt);
1262 stmt->
setUInt8(2, itr->second.active);
1263 trans->Append(stmt);
1270 stmt->
setUInt8(2, itr->second.active);
1271 trans->Append(stmt);
1293 int32 baseDamage[3];
1294 Field* fields = result->Fetch();
1306 baseDamage[0] = fields[8].
GetInt32();
1307 baseDamage[1] = fields[9].
GetInt32();
1308 baseDamage[2] = fields[10].
GetInt32();
1316 SF_LOG_ERROR(
"entities.pet",
"Unknown aura (spellid %u), ignore.", spellid);
1321 if (remaintime != -1 && !spellInfo->
IsPositive())
1332 if (remaincharges <= 0 || remaincharges > spellInfo->
ProcCharges)
1338 if (
Aura* aura =
Aura::TryCreate(spellInfo, effMask,
this, NULL, &baseDamage[0], NULL, caster_guid))
1340 if (!aura->CanBeSaved())
1345 aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
1346 aura->ApplyForTargets();
1347 SF_LOG_INFO(
"entities.pet",
"Added aura spellid %u, effectmask %u", spellInfo->
Id, effMask);
1349 }
while (result->NextRow());
1357 trans->Append(stmt);
1362 if (!itr->second->CanBeSaved() ||
IsPetAura(itr->second))
1365 Aura* aura = itr->second;
1370 uint8 recalculateMask = 0;
1377 effMask |= (1 << i);
1379 recalculateMask |= (1 << i);
1389 uint64 casterGUID = (itr->second->GetCasterGUID() ==
GetGUID()) ? 0 : itr->second->GetCasterGUID();
1396 stmt->
setUInt32(index++, itr->second->GetId());
1398 stmt->
setUInt8(index++, recalculateMask);
1399 stmt->
setUInt8(index++, itr->second->GetStackAmount());
1400 stmt->
setInt32(index++, damage[0]);
1401 stmt->
setInt32(index++, damage[1]);
1402 stmt->
setInt32(index++, damage[2]);
1403 stmt->
setInt32(index++, baseDamage[0]);
1404 stmt->
setInt32(index++, baseDamage[1]);
1405 stmt->
setInt32(index++, baseDamage[2]);
1406 stmt->
setInt32(index++, itr->second->GetMaxDuration());
1407 stmt->
setInt32(index++, itr->second->GetDuration());
1408 stmt->
setUInt8(index++, itr->second->GetCharges());
1410 trans->Append(stmt);
1422 SF_LOG_ERROR(
"entities.pet",
"Pet::addSpell: Non-existed in SpellStore spell #%u request, deleting for all pets in `pet_spell`.", spellId);
1431 SF_LOG_ERROR(
"entities.pet",
"Pet::addSpell: Non-existed in SpellStore spell #%u request.", spellId);
1436 PetSpellMap::iterator itr =
m_spells.find(spellId);
1461 newspell.
state = state;
1462 newspell.
type = type;
1472 newspell.
active = active;
1476 for (PetSpellMap::const_iterator itr2 =
m_spells.begin(); itr2 !=
m_spells.end(); ++itr2)
1483 if (!oldRankSpellInfo)
1491 newspell.
active = itr2->second.active;
1537 data <<
uint32(spell_id);
1551 for (PetLevelupSpellSet::const_reverse_iterator itr = levelupSpells->rbegin(); itr != levelupSpells->rend(); ++itr)
1554 if (itr->first > level)
1593 data <<
uint32(spell_id);
1603 PetSpellMap::iterator itr =
m_spells.find(spell_id);
1638 if (clear_ab && !learn_prev &&
m_charmInfo->RemoveSpellFromActionBar(spell_id))
1645 owner->ToPlayer()->PetSpellInitialize();
1656 if (ab->GetAction() && ab->IsActionBarForSpell())
1782 bool need_comma =
false;
1783 std::ostringstream ss;
1784 ss <<
"DELETE FROM pet_spell WHERE guid IN (";
1788 Field* fields = resultPets->Fetch();
1798 }
while (resultPets->NextRow());
1800 ss <<
") AND spell IN (";
1802 bool need_execute =
false;
1805 Field* fields = result->Fetch();
1817 need_execute =
true;
1818 }
while (result->NextRow());
1845 uint8 points = (level >= 20) ? ((level - 16) / 4) : 0;
1859 PetSpellMap::iterator itr =
m_spells.find(spellid);
1944 PetSpellMap::const_iterator itr =
m_spells.find(spell);
1965 for (PetFamilySpellsSet::const_iterator petSet = petStore->second.begin(); petSet != petStore->second.end(); ++petSet)
1979 for (PetAuraSet::const_iterator itr = owner->
m_petAuras.begin(); itr != owner->
m_petAuras.end();)
1997 if (auraId == 35696)
2014 for (PetAuraSet::const_iterator itr = owner->
m_petAuras.begin(); itr != owner->
m_petAuras.end(); ++itr)
2056 time_t curTime = time(NULL);
2068 size_t bitpos = data.
bitwpos();
2074 for (PetSpellMap::const_iterator itr =
m_spells.begin(); itr !=
m_spells.end(); ++itr)
2079 uint32 unSpellId = itr->first;
2096 data <<
uint32(unSpellId);
2097 data <<
uint32(unTimeMs);
2103 data.
PutBits(bitpos, count, 21);
2114 owner->GetSession()->SendPacket(&data);
2131 if (player->GetGroup())
2149 if (!specializationInfo || specializationInfo->
classId != 0)
2152 if (specializationInfo->
PetTabPage != talenttab)
2158 specId = specializationInfo->
Id;
2167 for (std::vector<uint32>::const_iterator iter = spells->begin(); iter != spells->end(); ++iter)
2182 for (std::vector<uint32>::const_iterator iter = spells->begin(); iter != spells->end(); ++iter)
2226 owner->GetSession()->SendPacket(&data);
@ CHAR_UPD_CHAR_PET_ACTIVE_BY_ID
@ CHAR_SEL_CHAR_ACTIVE_PET
@ CHAR_DEL_CHAR_PET_BY_SLOT
@ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT
@ CHAR_DEL_INVALID_PET_SPELL
@ CHAR_SEL_CHAR_PET_BY_SLOT
@ CHAR_INS_PET_SPELL_COOLDOWN
@ CHAR_UPD_CHAR_PET_SLOT_BY_ID
@ CHAR_UDP_CHAR_PET_SLOT_BY_SLOT_EXCLUDE_ID
@ CHAR_SEL_CHAR_PET_BY_ENTRY
@ CHAR_DEL_CHAR_PET_BY_ID
@ CHAR_UPD_CHAR_PET_ACTIVE_BY_OWNER
@ CHAR_SEL_PET_DECLINED_NAME
@ CHAR_DEL_PET_SPELL_BY_SPELL
@ CHAR_DEL_PET_SPELL_COOLDOWNS
@ CHAR_SEL_PET_SPELL_COOLDOWN
@ CHAR_SEL_PET_SPELL_LIST
@ CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2
@ CHAR_DEL_CHAR_PET_DECLINEDNAME
#define CREATURE_REGEN_INTERVAL
uint32 GetTalentSpellCost(uint32 spellId)
std::vector< uint32 > const * GetSpecializationSpells(uint32 specializationId)
DBCStorage< CreatureFamilyEntry > sCreatureFamilyStore(CreatureFamilyfmt)
DBCStorage< ChrSpecializationEntry > sChrSpecializationStore(ChrSpecializationfmt)
PetFamilySpellsStore sPetFamilySpellsStore
#define MAX_CREATURE_SPELL_DATA_SLOT
#define MAX_SPELL_EFFECTS
@ GROUP_UPDATE_FLAG_PET_MODEL_ID
#define SF_LOG_DEBUG(filterType__,...)
#define SF_LOG_ERROR(filterType__,...)
#define SF_LOG_INFO(filterType__,...)
uint32 GUID_LOPART(uint64 x)
bool IS_PLAYER_GUID(uint64 guid)
#define PET_FOCUS_REGEN_INTERVAL
@ PET_SAVE_LAST_STABLE_SLOT
@ AT_LOGIN_RESET_PET_TALENTS
Skyfire::AutoPtr< PreparedResultSet, Skyfire::Mutex > PreparedQueryResult
@ SPELL_PREVENTION_TYPE_SILENCE
@ CREATURE_TYPE_ELEMENTAL
#define CURRENT_CONTENT_EXP
@ SPELL_SCHOOL_MASK_SHADOW
@ SPELL_SCHOOL_MASK_NATURE
@ SPELL_SCHOOL_MASK_FROST
@ SPELL_AURA_MOD_POWER_REGEN
@ SPELL_AURA_MOD_PET_TALENT_POINTS
@ SPELL_AURA_MOD_POWER_REGEN_PERCENT
std::multimap< uint32, uint32 > PetLevelupSpellSet
Skyfire::AutoPtr< Transaction, Skyfire::Mutex > SQLTransaction
@ UNIT_MASK_CONTROLABLE_GUARDIAN
#define MAX_UNIT_ACTION_BAR_INDEX
@ UNIT_MOD_RESISTANCE_START
#define MAX_DECLINED_NAME_CASES
@ UNIT_FLAG_PVP_ATTACKABLE
@ UNIT_FLAG2_REGENERATE_POWER
@ UNIT_FIELD_MOD_CASTING_SPEED
@ UNIT_FIELD_PET_EXPERIENCE
@ UNIT_FIELD_SHAPESHIFT_FORM
@ UNIT_FIELD_MOD_SPELL_HASTE
@ UNIT_FIELD_PET_NAME_TIMESTAMP
@ UNIT_FIELD_PET_NEXT_LEVEL_EXPERIENCE
@ UNIT_FIELD_CREATED_BY_SPELL
@ OBJECT_FIELD_DYNAMIC_FLAGS
@ PLAYER_FIELD_MOD_DAMAGE_DONE_POS
T CalculatePct(T base, U pct)
bool CanBeRecalculated() const
int32 GetBaseAmount() const
static Aura * TryCreate(SpellInfo const *spellproto, uint32 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=NULL, Item *castItem=NULL, uint64 casterGUID=0)
AuraEffect * GetEffect(uint8 effIndex) const
bool WriteBit(uint32 bit)
size_t bitwpos() const
Returns position of last written bit.
void PutBits(size_t pos, T value, uint32 bitCount)
void WriteBits(T value, size_t bits)
void WriteByteSeq(uint8 b)
uint32 m_DBTableGuid
For new or temporary creatures is 0 for saved it is lowguid.
void SetDisplayId(uint32 modelId) OVERRIDE
void SetReactState(ReactStates st)
CreatureSpellCooldowns m_CreatureSpellCooldowns
void Update(uint32 time) OVERRIDE
CreatureSpellCooldowns m_CreatureCategoryCooldowns
time_t m_corpseRemoveTime
Timers.
CreatureTemplate const * GetCreatureTemplate() const
void SetObjectScale(float scale) OVERRIDE
bool AIM_Initialize(CreatureAI *ai=NULL)
ReactStates GetReactState() const
void SetMeleeDamageSchool(SpellSchools school)
void setDeathState(DeathState s) OVERRIDE
void _AddCreatureSpellCooldown(uint32 spell_id, time_t end_time)
void Regenerate(Powers power)
std::string const & GetNameForLocaleIdx(LocaleConstant locale_idx) const OVERRIDE
bool InitEntry(uint32 entry, uint32 team=ALLIANCE, const CreatureData *data=NULL)
uint32 GetCreatureSpellCooldownDelay(uint32 spellId) const
std::string GetString() const
bool UpdateAllStats() OVERRIDE
Guardian(SummonPropertiesEntry const *properties, Unit *owner, bool isWorldObject)
void SetBonusDamage(int32 damage)
bool InitStatsForLevel(uint8 level)
float GetFollowAngle() const OVERRIDE
uint32 GetUInt32Value(uint16 index) const
uint32 GetGUIDLow() const
void _Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
void SetFlag(uint16 index, uint32 newFlag)
void RemoveFlag(uint16 index, uint32 oldFlag)
void SetFloatValue(uint16 index, float value)
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
void SetUInt32Value(uint16 index, uint32 value)
void SetByteFlag(uint16 index, uint8 offset, uint8 newFlag)
uint32 GetAura(uint32 petEntry) const
bool IsRemovedOnChangePet() const
void _SaveAuras(SQLTransaction &trans)
void GivePetLevel(uint8 level)
void _SaveSpellCooldowns(SQLTransaction &trans)
Player * GetOwner() const
uint32 m_transportExitGraceTimer
bool IsPetAura(Aura const *aura)
bool unlearnSpell(uint32 spell_id, bool learn_prev, bool clear_ab=true)
void UnlearnSpecializationSpells()
DeclinedName * m_declinedname
void _LoadAuras(uint32 timediff)
void ToggleAutocast(SpellInfo const *spellInfo, bool apply)
virtual void ProhibitSpellSchool(SpellSchoolMask idSchoolMask, uint32 unTimeMs)
void setDeathState(DeathState s)
void _LoadSpellCooldowns()
void StartTransportExitGrace(uint32 duration)
void InitTalentForLevel()
void CastPetAuras(bool current)
void setPetType(PetType type)
void SavePetToDB(PetSaveMode mode)
void SetDisplayId(uint32 modelId)
PetType getPetType() const
void SynchronizeLevelWithOwner()
void learnSpellHighRank(uint32 spellid)
bool IsPermanentPetFor(Player *owner) const
bool HaveInDiet(ItemTemplate const *item) const
bool addSpell(uint32 spellId, ActiveStates active=ACT_DECIDE, PetSpellState state=PETSPELL_NEW, PetSpellType type=PETSPELL_NORMAL)
AutoSpellList m_autospells
uint16 GetPetSpecByTalentTab(uint16 talenttab)
bool CreateBaseAtTamed(CreatureTemplate const *cinfo, Map *map)
bool Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
bool LoadPetFromDB(Player *owner, uint32 petentry=0, uint32 petnumber=0, bool current=false)
bool removeSpell(uint32 spell_id, bool learn_prev, bool clear_ab=true)
void SetSpec(uint16 spec)
bool CreateBaseAtCreature(Creature *creature)
bool isTemporarySummoned() const
void CastPetAura(PetAura const *aura)
bool isControlled() const
bool HasTransportExitGrace() const
void _SaveSpells(SQLTransaction &trans)
bool HasSpell(uint32 spell) const
void SetFreeTalentPoints(uint8 points)
void Remove(PetSaveMode mode, bool returnreagent=false)
uint8 GetMaxTalentPointsForLevel(uint8 level)
void InitPetCreateSpells()
void LearnSpecializationSpells()
uint64 m_auraRaidUpdateMask
uint32 GetCurrentFoodBenefitLevel(uint32 itemlevel) const
static void resetTalentsForAllPetsOf(Player *owner, Pet *online_pet=NULL)
Pet(Player *owner, PetType type=PetType::MAX_PET_TYPE)
void GivePetXP(uint32 xp)
bool learnSpell(uint32 spell_id)
void InitLevelupSpellsForLevel()
void RemoveAtLoginFlag(AtLoginFlags flags, bool persist=false)
void SetGroupUpdateFlag(uint32 flag)
uint32 GetTemporaryUnsummonedPetNumber() const
bool CanTameExoticPets() const
void SetTemporaryUnsummonedPetNumber(uint32 petnumber)
bool IsPetNeedBeTemporaryUnsummoned() const
void PetSpellInitialize()
WorldSession * GetSession() const
void RemovePet(Pet *pet, PetSaveMode mode, bool returnreagent=false)
bool HasAtLoginFlag(AtLoginFlags f) const
void SetLastPetNumber(uint32 petnumber)
void setUInt64(const uint8 index, const uint64 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt8(const uint8 index, const uint8 value)
void setInt32(const uint8 index, const int32 value)
bool IsAutocastable() const
bool IsCooldownStartedOnEvent() const
bool IsHighRankOf(SpellInfo const *spellInfo) const
SpellSchoolMask GetSchoolMask() const
int32 GetDuration() const
bool IsDifferentRankOf(SpellInfo const *spellInfo) const
void SetMinion(Minion *minion, bool apply)
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
void SetCreateStat(Stats stat, float val)
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=NULL, Unit const *Caster=NULL) const
void setFaction(uint32 faction)
void RemovePetAura(PetAura const *petSpell)
uint32 getFaction() const
void AddToWorld() override
bool SetPhased(uint32 id, bool update, bool apply) OVERRIDE
void CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void SetCreateHealth(uint32 val)
void SetPower(Powers power, int32 val)
void RemoveAurasDueToSpell(uint32 spellId, uint64 casterGUID=0, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
void SetBaseWeaponDamage(WeaponAttackType attType, WeaponDamageRange damageRange, float value)
void SetCreatorGUID(uint64 creator)
uint64 GetPetGUID() const
uint32 GetMaxHealth() const
Aura * AddAura(uint32 spellId, Unit *target)
void SetClass(uint8 newClass)
int32 GetMaxPower(Powers power) const
void SetHealth(uint32 val)
CharmInfo * GetCharmInfo()
int32 ModifyPower(Powers power, int32 val)
bool HasAura(uint32 spellId, uint64 casterGUID=0, uint64 itemCasterGUID=0, uint32 reqEffMask=0) const
void SetCreateMana(uint32 val)
virtual void SetSheath(SheathState sheathed)
uint32 GetDisplayId() const
uint32 GetNativeDisplayId() const
void SetGender(uint8 gender)
void SetNativeDisplayId(uint32 modelId)
int32 GetPower(Powers power) const
DeathState getDeathState() const
void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value)
void CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=NULL, AuraEffect const *triggeredByAura=NULL, uint64 originalCaster=0)
void SetCanModifyStats(bool modifyStats)
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
CharmInfo * InitCharmInfo()
void RemoveFromWorld() override
float GetStat(Stats stat) const
uint64 GetOwnerGUID() const
Powers getPowerType() const
std::list< AuraEffect * > AuraEffectList
void SetAttackTime(WeaponAttackType att, uint32 val)
void setPowerType(Powers power)
void SetFieldPowerType(uint32 powerType)
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const
float GetTotalAttackPowerValue(WeaponAttackType attType) const
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true) const
std::set< uint32 > const & GetPhases() const
void SetName(std::string const &newname)
std::string const & GetName() const
virtual void SetMap(Map *map)
Transport * GetTransport() const
void GetClosePoint(float &x, float &y, float &z, float size, float distance2d=0, float angle=0) const
float GetVisibilityRange() const
float GetObjectSize() const
void SendPacket(WorldPacket const *packet, bool forced=false)
Send a packet to the client.
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
@ CONFIG_MAX_PLAYER_LEVEL
bool BoardOwnerHunterPet(Player *owner, Transport *transport)
bool AttachHunterPetToOwnerTransport(Player *owner, Pet *pet, Transport *transport)
bool ShouldRemovePetForOwnerRange(bool petExists, bool petPossessed, bool petOnOwnerTransport, bool isWithinVisibilityRange, bool transportExitGraceActive)
bool ShouldReattachPetDuringOwnerTransportUpdate(bool ownerHasTransport, bool petIsHunterPet, bool petIsControlled, bool petIsAlive, bool ownerMatches, bool petOnOwnerTransport)
void SetIsCommandFollow(bool val)
uint32 GetPetNumber() const
void SetIsAtStay(bool val)
void SetIsFollowing(bool val)
void SetIsReturning(bool val)
void SetIsCommandAttack(bool val)
uint32 BaseHealth[MAX_CREATURE_BASE_HP]
int32 resistance[MAX_SPELL_SCHOOL]
bool IsTameable(bool canTameExotic) const
float GetPositionZ() const
float GetOrientation() const
bool IsPositionValid() const
float GetPositionX() const
float GetPositionY() const
void Relocate(float x, float y)