2 * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 #ifndef MANGOSSERVER_CREATURE_H
20 #define MANGOSSERVER_CREATURE_H
24 #include "UpdateMask.h"
25 #include "ItemPrototype.h"
27 #include "Database/DatabaseEnv.h"
41 GOSSIP_OPTION_NONE
= 0, //UNIT_NPC_FLAG_NONE = 0,
42 GOSSIP_OPTION_GOSSIP
= 1, //UNIT_NPC_FLAG_GOSSIP = 1,
43 GOSSIP_OPTION_QUESTGIVER
= 2, //UNIT_NPC_FLAG_QUESTGIVER = 2,
44 GOSSIP_OPTION_VENDOR
= 3, //UNIT_NPC_FLAG_VENDOR = 4,
45 GOSSIP_OPTION_TAXIVENDOR
= 4, //UNIT_NPC_FLAG_TAXIVENDOR = 8,
46 GOSSIP_OPTION_TRAINER
= 5, //UNIT_NPC_FLAG_TRAINER = 16,
47 GOSSIP_OPTION_SPIRITHEALER
= 6, //UNIT_NPC_FLAG_SPIRITHEALER = 32,
48 GOSSIP_OPTION_SPIRITGUIDE
= 7, //UNIT_NPC_FLAG_SPIRITGUIDE = 64,
49 GOSSIP_OPTION_INNKEEPER
= 8, //UNIT_NPC_FLAG_INNKEEPER = 128,
50 GOSSIP_OPTION_BANKER
= 9, //UNIT_NPC_FLAG_BANKER = 256,
51 GOSSIP_OPTION_PETITIONER
= 10, //UNIT_NPC_FLAG_PETITIONER = 512,
52 GOSSIP_OPTION_TABARDDESIGNER
= 11, //UNIT_NPC_FLAG_TABARDDESIGNER = 1024,
53 GOSSIP_OPTION_BATTLEFIELD
= 12, //UNIT_NPC_FLAG_BATTLEFIELDPERSON = 2048,
54 GOSSIP_OPTION_AUCTIONEER
= 13, //UNIT_NPC_FLAG_AUCTIONEER = 4096,
55 GOSSIP_OPTION_STABLEPET
= 14, //UNIT_NPC_FLAG_STABLE = 8192,
56 GOSSIP_OPTION_ARMORER
= 15, //UNIT_NPC_FLAG_ARMORER = 16384,
57 GOSSIP_OPTION_UNLEARNTALENTS
= 16, //UNIT_NPC_FLAG_TRAINER (bonus option for GOSSIP_OPTION_TRAINER)
58 GOSSIP_OPTION_UNLEARNPETSKILLS
= 17 //UNIT_NPC_FLAG_TRAINER (bonus option for GOSSIP_OPTION_TRAINER)
63 GOSSIP_GUARD_BANK
= 32,
64 GOSSIP_GUARD_RIDE
= 33,
65 GOSSIP_GUARD_GUILD
= 34,
66 GOSSIP_GUARD_INN
= 35,
67 GOSSIP_GUARD_MAIL
= 36,
68 GOSSIP_GUARD_AUCTION
= 37,
69 GOSSIP_GUARD_WEAPON
= 38,
70 GOSSIP_GUARD_STABLE
= 39,
71 GOSSIP_GUARD_BATTLE
= 40,
72 GOSSIP_GUARD_SPELLTRAINER
= 41,
73 GOSSIP_GUARD_SKILLTRAINER
= 42
76 enum Gossip_Guard_Spell
78 GOSSIP_GUARD_SPELL_WARRIOR
= 64,
79 GOSSIP_GUARD_SPELL_PALADIN
= 65,
80 GOSSIP_GUARD_SPELL_HUNTER
= 66,
81 GOSSIP_GUARD_SPELL_ROGUE
= 67,
82 GOSSIP_GUARD_SPELL_PRIEST
= 68,
83 GOSSIP_GUARD_SPELL_UNKNOWN1
= 69,
84 GOSSIP_GUARD_SPELL_SHAMAN
= 70,
85 GOSSIP_GUARD_SPELL_MAGE
= 71,
86 GOSSIP_GUARD_SPELL_WARLOCK
= 72,
87 GOSSIP_GUARD_SPELL_UNKNOWN2
= 73,
88 GOSSIP_GUARD_SPELL_DRUID
= 74
91 enum Gossip_Guard_Skill
93 GOSSIP_GUARD_SKILL_ALCHEMY
= 80,
94 GOSSIP_GUARD_SKILL_BLACKSMITH
= 81,
95 GOSSIP_GUARD_SKILL_COOKING
= 82,
96 GOSSIP_GUARD_SKILL_ENCHANT
= 83,
97 GOSSIP_GUARD_SKILL_FIRSTAID
= 84,
98 GOSSIP_GUARD_SKILL_FISHING
= 85,
99 GOSSIP_GUARD_SKILL_HERBALISM
= 86,
100 GOSSIP_GUARD_SKILL_LEATHER
= 87,
101 GOSSIP_GUARD_SKILL_MINING
= 88,
102 GOSSIP_GUARD_SKILL_SKINNING
= 89,
103 GOSSIP_GUARD_SKILL_TAILORING
= 90,
104 GOSSIP_GUARD_SKILL_ENGINERING
= 91
107 enum GossipOptionIcon
109 GOSSIP_ICON_CHAT
= 0, //white chat bubble
110 GOSSIP_ICON_VENDOR
= 1, //brown bag
111 GOSSIP_ICON_TAXI
= 2, //flight
112 GOSSIP_ICON_TRAINER
= 3, //book
113 GOSSIP_ICON_INTERACT_1
= 4, //interaction wheel
114 GOSSIP_ICON_INTERACT_2
= 5, //interaction wheel
115 GOSSIP_ICON_MONEY_BAG
= 6, //brown bag with yellow dot
116 GOSSIP_ICON_TALK
= 7, //white chat bubble with black dots
117 GOSSIP_ICON_TABARD
= 8, //tabard
118 GOSSIP_ICON_BATTLE
= 9, //two swords
119 GOSSIP_ICON_DOT
= 10 //yellow dot
131 std::string OptionText
;
135 enum CreatureFlagsExtra
137 CREATURE_FLAG_EXTRA_INSTANCE_BIND
= 0x00000001, // creature kill bind instance with killer and killer's group
138 CREATURE_FLAG_EXTRA_CIVILIAN
= 0x00000002, // not aggro (ignore faction/reputation hostility)
139 CREATURE_FLAG_EXTRA_NO_PARRY
= 0x00000004, // creature can't parry
140 CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
= 0x00000008, // creature can't counter-attack at parry
141 CREATURE_FLAG_EXTRA_NO_BLOCK
= 0x00000010, // creature can't block
142 CREATURE_FLAG_EXTRA_NO_CRUSH
= 0x00000020, // creature can't do crush attacks
143 CREATURE_FLAG_EXTRA_NO_XP_AT_KILL
= 0x00000040, // creature kill not provide XP
144 CREATURE_FLAG_EXTRA_INVISIBLE
= 0x00000080, // creature is always invisible for player (mostly trigger creatures)
145 CREATURE_FLAG_EXTRA_NOT_TAUNTABLE
= 0x00000100, // creature is immune to taunt auras and effect attack me
148 // GCC have alternative #pragma pack(N) syntax and old gcc version not support pack(push,N), also any gcc version not support it at some platform
149 #if defined( __GNUC__ )
155 // from `creature_template` table
184 float dmg_multiplier
;
185 uint32 baseattacktime
;
186 uint32 rangeattacktime
;
187 uint32 unit_class
; // enum Classes. Note only 4 classes are known for creatures.
188 uint32 unit_flags
; // enum UnitFlags mask values
190 uint32 family
; // enum CreatureFamily values (optional)
192 uint32 trainer_spell
;
193 uint32 trainer_class
;
197 uint32 rangedattackpower
;
198 uint32 type
; // enum CreatureType values
199 uint32 type_flags
; // enum CreatureTypeFlags mask values
201 uint32 pickpocketLootId
;
209 uint32 spells
[CREATURE_MAX_SPELLS
];
210 uint32 PetSpellDataId
;
221 uint32 MechanicImmuneMask
;
226 SkillType
GetRequiredLootSkill() const
228 if(type_flags
& CREATURE_TYPEFLAGS_HERBLOOT
)
229 return SKILL_HERBALISM
;
230 else if(type_flags
& CREATURE_TYPEFLAGS_MININGLOOT
)
232 else if(type_flags
& CREATURE_TYPEFLAGS_ENGINEERLOOT
)
233 return SKILL_ENGINERING
;
235 return SKILL_SKINNING
; // normal case
238 bool isTameable() const
240 return type
== CREATURE_TYPE_BEAST
&& family
!= 0 && (type_flags
& CREATURE_TYPEFLAGS_TAMEABLE
);
244 struct CreatureLocale
246 std::vector
<std::string
> Name
;
247 std::vector
<std::string
> SubName
;
250 struct NpcOptionLocale
252 std::vector
<std::string
> OptionText
;
253 std::vector
<std::string
> BoxText
;
256 struct PointOfInterestLocale
258 std::vector
<std::string
> IconName
;
264 uint32 equipentry
[3];
267 // from `creature` table
270 uint32 id
; // entry in creature_template
279 uint32 spawntimesecs
;
281 uint32 currentwaypoint
;
289 struct CreatureDataAddonAura
295 // from `creature_addon` table
296 struct CreatureDataAddon
304 CreatureDataAddonAura
const* auras
; // loaded as char* "spell1 eff1 spell2 eff2 ... "
307 struct CreatureModelInfo
310 float bounding_radius
;
313 uint32 modelid_other_gender
;
316 enum InhabitTypeValues
321 INHABIT_ANYWHERE
= INHABIT_GROUND
| INHABIT_WATER
| INHABIT_AIR
324 // Enums used by StringTextData::Type (CreatureEventAI)
329 CHAT_TYPE_TEXT_EMOTE
= 2,
330 CHAT_TYPE_BOSS_EMOTE
= 3,
331 CHAT_TYPE_WHISPER
= 4,
332 CHAT_TYPE_BOSS_WHISPER
= 5,
333 CHAT_TYPE_ZONE_YELL
= 6
336 //Selection method used by SelectTarget (CreatureEventAI)
339 ATTACKING_TARGET_RANDOM
= 0, //Just selects a random target
340 ATTACKING_TARGET_TOPAGGRO
, //Selects targes from top aggro to bottom
341 ATTACKING_TARGET_BOTTOMAGGRO
, //Selects targets from bottom aggro to top
343 ATTACKING_TARGET_RANDOM_PLAYER, //Just selects a random target (player only)
344 ATTACKING_TARGET_TOPAGGRO_PLAYER, //Selects targes from top aggro to bottom (player only)
345 ATTACKING_TARGET_BOTTOMAGGRO_PLAYER, //Selects targets from bottom aggro to top (player only)
349 // GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
350 #if defined( __GNUC__ )
359 VendorItem(uint32 _item
, uint32 _maxcount
, uint32 _incrtime
, uint32 _ExtendedCost
)
360 : item(_item
), maxcount(_maxcount
), incrtime(_incrtime
), ExtendedCost(_ExtendedCost
) {}
363 uint32 maxcount
; // 0 for infinity item amount
364 uint32 incrtime
; // time for restore items amount if maxcount != 0
367 typedef std::vector
<VendorItem
*> VendorItemList
;
369 struct VendorItemData
371 VendorItemList m_items
;
373 VendorItem
* GetItem(uint32 slot
) const
375 if(slot
>=m_items
.size()) return NULL
;
376 return m_items
[slot
];
378 bool Empty() const { return m_items
.empty(); }
379 uint8
GetItemCount() const { return m_items
.size(); }
380 void AddItem( uint32 item
, uint32 maxcount
, uint32 ptime
, uint32 ExtendedCost
)
382 m_items
.push_back(new VendorItem(item
, maxcount
, ptime
, ExtendedCost
));
384 bool RemoveItem( uint32 item_id
);
385 VendorItem
const* FindItem(uint32 item_id
) const;
386 size_t FindItemSlot(uint32 item_id
) const;
390 for (VendorItemList::const_iterator itr
= m_items
.begin(); itr
!= m_items
.end(); ++itr
)
396 struct VendorItemCount
398 explicit VendorItemCount(uint32 _item
, uint32 _count
)
399 : itemId(_item
), count(_count
), lastIncrementTime(time(NULL
)) {}
403 time_t lastIncrementTime
;
406 typedef std::list
<VendorItemCount
> VendorItemCounts
;
410 TrainerSpell() : spell(0), spellCost(0), reqSkill(0), reqSkillValue(0), reqLevel(0), learnedSpell(0) {}
412 TrainerSpell(uint32 _spell
, uint32 _spellCost
, uint32 _reqSkill
, uint32 _reqSkillValue
, uint32 _reqLevel
, uint32 _learnedspell
)
413 : spell(_spell
), spellCost(_spellCost
), reqSkill(_reqSkill
), reqSkillValue(_reqSkillValue
), reqLevel(_reqLevel
), learnedSpell(_learnedspell
)
419 uint32 reqSkillValue
;
424 bool IsCastable() const { return learnedSpell
!= spell
; }
427 typedef UNORDERED_MAP
<uint32
/*spellid*/, TrainerSpell
> TrainerSpellMap
;
429 struct TrainerSpellData
431 TrainerSpellData() : trainerType(0) {}
433 TrainerSpellMap spellList
;
434 uint32 trainerType
; // trainer type based at trainer spells, can be different from creature_template value.
435 // req. for correct show non-prof. trainers like weaponmaster, allowed values 0 and 2.
436 TrainerSpell
const* Find(uint32 spell_id
) const;
437 void Clear() { spellList
.clear(); }
440 typedef std::list
<GossipOption
> GossipOptionList
;
442 typedef std::map
<uint32
,time_t> CreatureSpellCooldowns
;
444 // max different by z coordinate for creature aggro reaction
445 #define CREATURE_Z_ATTACK_RANGE 3
447 #define MAX_VENDOR_ITEMS 255 // Limitation in item count field size in SMSG_LIST_INVENTORY
449 class MANGOS_DLL_SPEC Creature
: public Unit
459 void RemoveFromWorld();
461 bool Create (uint32 guidlow
, Map
*map
, uint32 phaseMask
, uint32 Entry
, uint32 team
, const CreatureData
*data
= NULL
);
462 bool LoadCreaturesAddon(bool reload
= false);
463 void SelectLevel(const CreatureInfo
*cinfo
);
464 void LoadEquipment(uint32 equip_entry
, bool force
=false);
466 uint32
GetDBTableGUIDLow() const { return m_DBTableGuid
; }
467 char const* GetSubName() const { return GetCreatureInfo()->SubName
; }
469 void Update( uint32 time
); // overwrited Unit::Update
470 void GetRespawnCoord(float &x
, float &y
, float &z
, float* ori
= NULL
, float* dist
=NULL
) const;
471 uint32
GetEquipmentId() const { return m_equipmentId
; }
473 bool isPet() const { return m_isPet
; }
474 bool isVehicle() const { return m_isVehicle
; }
475 void SetCorpseDelay(uint32 delay
) { m_corpseDelay
= delay
; }
476 bool isTotem() const { return m_isTotem
; }
477 bool isRacialLeader() const { return GetCreatureInfo()->RacialLeader
; }
478 bool isCivilian() const { return GetCreatureInfo()->flags_extra
& CREATURE_FLAG_EXTRA_CIVILIAN
; }
479 bool canWalk() const { return GetCreatureInfo()->InhabitType
& INHABIT_GROUND
; }
480 bool canSwim() const { return GetCreatureInfo()->InhabitType
& INHABIT_WATER
; }
481 bool canFly() const { return GetCreatureInfo()->InhabitType
& INHABIT_AIR
; }
482 ///// TODO RENAME THIS!!!!!
483 bool isCanTrainingOf(Player
* player
, bool msg
) const;
484 bool isCanInteractWithBattleMaster(Player
* player
, bool msg
) const;
485 bool isCanTrainingAndResetTalentsOf(Player
* pPlayer
) const;
486 bool IsOutOfThreatArea(Unit
* pVictim
) const;
487 bool IsImmunedToSpell(SpellEntry
const* spellInfo
);
488 // redefine Unit::IsImmunedToSpell
489 bool IsImmunedToSpellEffect(SpellEntry
const* spellInfo
, uint32 index
) const;
490 // redefine Unit::IsImmunedToSpellEffect
496 uint32 rank
= GetCreatureInfo()->rank
;
497 return rank
!= CREATURE_ELITE_NORMAL
&& rank
!= CREATURE_ELITE_RARE
;
500 bool isWorldBoss() const
505 return GetCreatureInfo()->rank
== CREATURE_ELITE_WORLDBOSS
;
508 uint32
getLevelForTarget(Unit
const* target
) const; // overwrite Unit::getLevelForTarget for boss level support
510 bool IsInEvadeMode() const;
512 bool AIM_Initialize();
514 void AI_SendMoveToPacket(float x
, float y
, float z
, uint32 time
, uint32 MovementFlags
, uint8 type
);
515 CreatureAI
* AI() { return i_AI
; }
517 uint32
GetShieldBlockValue() const //dunno mob block value
519 return (getLevel()/2 + uint32(GetStat(STAT_STRENGTH
)/20));
522 SpellSchoolMask
GetMeleeDamageSchoolMask() const { return m_meleeDamageSchoolMask
; }
523 void SetMeleeDamageSchool(SpellSchools school
) { m_meleeDamageSchoolMask
= SpellSchoolMask(1 << school
); }
525 void _AddCreatureSpellCooldown(uint32 spell_id
, time_t end_time
);
526 void _AddCreatureCategoryCooldown(uint32 category
, time_t apply_time
);
527 void AddCreatureSpellCooldown(uint32 spellid
);
528 bool HasSpellCooldown(uint32 spell_id
) const;
529 bool HasCategoryCooldown(uint32 spell_id
) const;
531 bool HasSpell(uint32 spellID
) const;
533 bool UpdateEntry(uint32 entry
, uint32 team
=ALLIANCE
, const CreatureData
* data
=NULL
);
534 bool UpdateStats(Stats stat
);
535 bool UpdateAllStats();
536 void UpdateResistances(uint32 school
);
538 void UpdateMaxHealth();
539 void UpdateMaxPower(Powers power
);
540 void UpdateAttackPowerAndDamage(bool ranged
= false);
541 void UpdateDamagePhysical(WeaponAttackType attType
);
542 uint32
GetCurrentEquipmentId() { return m_equipmentId
; }
543 float GetSpellDamageMod(int32 Rank
);
545 VendorItemData
const* GetVendorItems() const;
546 uint32
GetVendorItemCurrentCount(VendorItem
const* vItem
);
547 uint32
UpdateVendorItemCurrentCount(VendorItem
const* vItem
, uint32 used_count
);
549 TrainerSpellData
const* GetTrainerSpells() const;
551 CreatureInfo
const *GetCreatureInfo() const { return m_creatureInfo
; }
552 CreatureDataAddon
const* GetCreatureAddon() const;
554 std::string
GetAIName() const;
555 std::string
GetScriptName() const;
556 uint32
GetScriptId() const;
558 void prepareGossipMenu( Player
*pPlayer
, uint32 gossipid
= 0 );
559 void sendPreparedGossip( Player
* player
);
560 void OnGossipSelect(Player
* player
, uint32 option
);
561 void OnPoiSelect(Player
* player
, GossipOption
const *gossip
);
563 uint32
GetGossipTextId(uint32 action
, uint32 zoneid
);
564 uint32
GetNpcTextId();
565 void LoadGossipOptions();
566 GossipOption
const* GetGossipOption( uint32 id
) const;
567 void addGossipOption(GossipOption
const& gso
) { m_goptions
.push_back(gso
); }
569 void Say(int32 textId
, uint32 language
, uint64 TargetGuid
) { MonsterSay(textId
,language
,TargetGuid
); }
570 void Yell(int32 textId
, uint32 language
, uint64 TargetGuid
) { MonsterYell(textId
,language
,TargetGuid
); }
571 void TextEmote(int32 textId
, uint64 TargetGuid
, bool IsBossEmote
= false) { MonsterTextEmote(textId
,TargetGuid
,IsBossEmote
); }
572 void Whisper(int32 textId
, uint64 receiver
, bool IsBossWhisper
= false) { MonsterWhisper(textId
,receiver
,IsBossWhisper
); }
573 void YellToZone(int32 textId
, uint32 language
, uint64 TargetGuid
) { MonsterYellToZone(textId
,language
,TargetGuid
); }
575 // overwrite WorldObject function for proper name localization
576 const char* GetNameForLocaleIdx(int32 locale_idx
) const;
578 void setDeathState(DeathState s
); // overwrite virtual Unit::setDeathState
581 bool LoadFromDB(uint32 guid
, Map
*map
);
584 virtual void SaveToDB(uint32 mapid
, uint8 spawnMask
, uint32 phaseMask
);
585 virtual void DeleteFromDB(); // overwrited in Pet
588 bool lootForPickPocketed
;
590 Player
*GetLootRecipient() const;
591 bool hasLootRecipient() const { return m_lootRecipient
!=0; }
593 void SetLootRecipient (Unit
* unit
);
594 void AllLootRemovedFromCorpse();
596 SpellEntry
const *reachWithSpellAttack(Unit
*pVictim
);
597 SpellEntry
const *reachWithSpellCure(Unit
*pVictim
);
599 uint32 m_spells
[CREATURE_MAX_SPELLS
];
600 CreatureSpellCooldowns m_CreatureSpellCooldowns
;
601 CreatureSpellCooldowns m_CreatureCategoryCooldowns
;
602 uint32 m_GlobalCooldown
;
604 float GetAttackDistance(Unit
const* pl
) const;
606 void DoFleeToGetAssistance();
607 void CallAssistance();
608 void SetNoCallAssistance(bool val
) { m_AlreadyCallAssistance
= val
; }
609 void SetNoSearchAssistance(bool val
) { m_AlreadySearchedAssistance
= val
; }
610 bool HasSearchedAssistance() { return m_AlreadySearchedAssistance
; }
611 bool CanAssistTo(const Unit
* u
, const Unit
* enemy
, bool checkfaction
= true) const;
613 MovementGeneratorType
GetDefaultMovementType() const { return m_defaultMovementType
; }
614 void SetDefaultMovementType(MovementGeneratorType mgt
) { m_defaultMovementType
= mgt
; }
616 // for use only in LoadHelper, Map::Add Map::CreatureCellRelocation
617 Cell
const& GetCurrentCell() const { return m_currentCell
; }
618 void SetCurrentCell(Cell
const& cell
) { m_currentCell
= cell
; }
620 bool IsVisibleInGridForPlayer(Player
* pl
) const;
623 bool isDeadByDefault() const { return m_isDeadByDefault
; };
625 time_t const& GetRespawnTime() const { return m_respawnTime
; }
626 time_t GetRespawnTimeEx() const;
627 void SetRespawnTime(uint32 respawn
) { m_respawnTime
= respawn
? time(NULL
) + respawn
: 0; }
629 void SaveRespawnTime();
631 uint32
GetRespawnDelay() const { return m_respawnDelay
; }
632 void SetRespawnDelay(uint32 delay
) { m_respawnDelay
= delay
; }
634 float GetRespawnRadius() const { return m_respawnradius
; }
635 void SetRespawnRadius(float dist
) { m_respawnradius
= dist
; }
637 uint32 m_groupLootTimer
; // (msecs)timer used for group loot
638 uint64 lootingGroupLeaderGUID
; // used to find group which is looting corpse
640 void SendZoneUnderAttackMessage(Player
* attacker
);
642 bool hasQuest(uint32 quest_id
) const;
643 bool hasInvolvedQuest(uint32 quest_id
) const;
645 GridReference
<Creature
> &GetGridRef() { return m_gridRef
; }
646 bool isRegeneratingHealth() { return m_regenHealth
; }
647 virtual uint8
GetPetAutoSpellSize() const { return CREATURE_MAX_SPELLS
; }
648 virtual uint32
GetPetAutoSpellOnPos(uint8 pos
) const
650 if (pos
>= CREATURE_MAX_SPELLS
|| m_charmInfo
->GetCharmSpell(pos
)->active
!= ACT_ENABLED
)
653 return m_charmInfo
->GetCharmSpell(pos
)->spellId
;
656 void SetCombatStartPosition(float x
, float y
, float z
) { CombatStartX
= x
; CombatStartY
= y
; CombatStartZ
= z
; }
657 void GetCombatStartPosition(float &x
, float &y
, float &z
) { x
= CombatStartX
; y
= CombatStartY
; z
= CombatStartZ
; }
659 uint32
GetGlobalCooldown() const { return m_GlobalCooldown
; }
661 void SetDeadByDefault (bool death_state
) { m_isDeadByDefault
= death_state
; }
663 bool isActiveObject() const { return m_isActiveObject
; }
664 void SetActiveObjectState(bool on
);
667 bool CreateFromProto(uint32 guidlow
,uint32 Entry
,uint32 team
, const CreatureData
*data
= NULL
);
668 bool InitEntry(uint32 entry
, uint32 team
=ALLIANCE
, const CreatureData
* data
=NULL
);
671 VendorItemCounts m_vendorItemCounts
;
673 void _RealtimeSetCreatureInfo();
675 static float _GetHealthMod(int32 Rank
);
676 static float _GetDamageMod(int32 Rank
);
679 uint64 m_lootRecipient
;
682 uint32 m_deathTimer
; // (msecs)timer for death or corpse disappearance
683 time_t m_respawnTime
; // (secs) time of next respawn
684 uint32 m_respawnDelay
; // (secs) delay between corpse disappearance and respawning
685 uint32 m_corpseDelay
; // (secs) delay between death and corpse disappearance
686 float m_respawnradius
;
688 bool m_gossipOptionLoaded
;
689 GossipOptionList m_goptions
;
691 bool m_isPet
; // set only in Pet::Pet
692 bool m_isVehicle
; // set only in Vehicle::Vehicle
693 bool m_isTotem
; // set only in Totem::Totem
694 void RegenerateMana();
695 void RegenerateHealth();
696 MovementGeneratorType m_defaultMovementType
;
697 Cell m_currentCell
; // store current cell where creature listed
698 uint32 m_DBTableGuid
; ///< For new or temporary creatures is 0 for saved it is lowguid
699 uint32 m_equipmentId
;
701 bool m_AlreadyCallAssistance
;
702 bool m_AlreadySearchedAssistance
;
705 bool m_isDeadByDefault
;
707 SpellSchoolMask m_meleeDamageSchoolMask
;
708 uint32 m_originalEntry
;
714 GridReference
<Creature
> m_gridRef
;
715 CreatureInfo
const* m_creatureInfo
; // in heroic mode can different from ObjMgr::GetCreatureTemplate(GetEntry())
716 bool m_isActiveObject
;
719 class AssistDelayEvent
: public BasicEvent
722 AssistDelayEvent(const uint64
& victim
, Unit
& owner
) : BasicEvent(), m_victim(victim
), m_owner(owner
) { }
724 bool Execute(uint64 e_time
, uint32 p_time
);
725 void AddAssistant(const uint64
& guid
) { m_assistants
.push_back(guid
); }
730 std::list
<uint64
> m_assistants
;