[7801] Apply damage mods from scripts or target state not in DealDamage but in new...
[getmangos.git] / src / game / Unit.h
blob9ea6ca3e677891a1c3f6addddf84e6e5de4c2b2f
1 /*
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 __UNIT_H
20 #define __UNIT_H
22 #include "Common.h"
23 #include "Object.h"
24 #include "Opcodes.h"
25 #include "SpellAuraDefines.h"
26 #include "UpdateFields.h"
27 #include "SharedDefines.h"
28 #include "ThreatManager.h"
29 #include "HostilRefManager.h"
30 #include "FollowerReference.h"
31 #include "FollowerRefManager.h"
32 #include "Utilities/EventProcessor.h"
33 #include "MotionMaster.h"
34 #include "DBCStructure.h"
35 #include <list>
37 enum SpellInterruptFlags
39 SPELL_INTERRUPT_FLAG_MOVEMENT = 0x01,
40 SPELL_INTERRUPT_FLAG_DAMAGE = 0x02,
41 SPELL_INTERRUPT_FLAG_INTERRUPT = 0x04,
42 SPELL_INTERRUPT_FLAG_AUTOATTACK = 0x08,
43 SPELL_INTERRUPT_FLAG_ABORT_ON_DMG = 0x10, // _complete_ interrupt on direct damage
44 //SPELL_INTERRUPT_UNK = 0x20 // unk, 564 of 727 spells having this spell start with "Glyph"
47 enum SpellChannelInterruptFlags
49 CHANNEL_FLAG_DAMAGE = 0x0002,
50 CHANNEL_FLAG_MOVEMENT = 0x0008,
51 CHANNEL_FLAG_TURNING = 0x0010,
52 CHANNEL_FLAG_DAMAGE2 = 0x0080,
53 CHANNEL_FLAG_DELAY = 0x4000
56 enum SpellAuraInterruptFlags
58 AURA_INTERRUPT_FLAG_UNK0 = 0x00000001, // 0 removed when getting hit by a negative spell?
59 AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, // 1 removed by any damage
60 AURA_INTERRUPT_FLAG_UNK2 = 0x00000004, // 2
61 AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
62 AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
63 AURA_INTERRUPT_FLAG_ENTER_COMBAT = 0x00000020, // 5 removed by entering combat
64 AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by unmounting
65 AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
66 AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
67 AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
68 AURA_INTERRUPT_FLAG_UNK10 = 0x00000400, // 10
69 AURA_INTERRUPT_FLAG_UNK11 = 0x00000800, // 11
70 AURA_INTERRUPT_FLAG_UNK12 = 0x00001000, // 12 removed by attack?
71 AURA_INTERRUPT_FLAG_UNK13 = 0x00002000, // 13
72 AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14
73 AURA_INTERRUPT_FLAG_UNK15 = 0x00008000, // 15 removed by casting a spell?
74 AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16
75 AURA_INTERRUPT_FLAG_MOUNTING = 0x00020000, // 17 removed by mounting
76 AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up
77 AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported
78 AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION = 0x00100000, // 20 removed by auras that make you invulnerable, or make other to loose selection on you
79 AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21
80 AURA_INTERRUPT_FLAG_UNK22 = 0x00400000, // 22
81 AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat
82 AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000 // 24 removed by any direct damage
85 enum SpellModOp
87 SPELLMOD_DAMAGE = 0,
88 SPELLMOD_DURATION = 1,
89 SPELLMOD_THREAT = 2,
90 SPELLMOD_EFFECT1 = 3,
91 SPELLMOD_CHARGES = 4,
92 SPELLMOD_RANGE = 5,
93 SPELLMOD_RADIUS = 6,
94 SPELLMOD_CRITICAL_CHANCE = 7,
95 SPELLMOD_ALL_EFFECTS = 8,
96 SPELLMOD_NOT_LOSE_CASTING_TIME = 9,
97 SPELLMOD_CASTING_TIME = 10,
98 SPELLMOD_COOLDOWN = 11,
99 SPELLMOD_EFFECT2 = 12,
100 // spellmod 13 unused
101 SPELLMOD_COST = 14,
102 SPELLMOD_CRIT_DAMAGE_BONUS = 15,
103 SPELLMOD_RESIST_MISS_CHANCE = 16,
104 SPELLMOD_JUMP_TARGETS = 17,
105 SPELLMOD_CHANCE_OF_SUCCESS = 18,
106 SPELLMOD_ACTIVATION_TIME = 19,
107 SPELLMOD_EFFECT_PAST_FIRST = 20,
108 SPELLMOD_CASTING_TIME_OLD = 21,
109 SPELLMOD_DOT = 22,
110 SPELLMOD_EFFECT3 = 23,
111 SPELLMOD_SPELL_BONUS_DAMAGE = 24,
112 // spellmod 25, 26 unused
113 SPELLMOD_MULTIPLE_VALUE = 27,
114 SPELLMOD_RESIST_DISPEL_CHANCE = 28
117 #define MAX_SPELLMOD 32
119 enum SpellFacingFlags
121 SPELL_FACING_FLAG_INFRONT = 0x0001
124 #define BASE_MINDAMAGE 1.0f
125 #define BASE_MAXDAMAGE 2.0f
126 #define BASE_ATTACK_TIME 2000
128 // byte value (UNIT_FIELD_BYTES_1,0)
129 enum UnitStandStateType
131 UNIT_STAND_STATE_STAND = 0,
132 UNIT_STAND_STATE_SIT = 1,
133 UNIT_STAND_STATE_SIT_CHAIR = 2,
134 UNIT_STAND_STATE_SLEEP = 3,
135 UNIT_STAND_STATE_SIT_LOW_CHAIR = 4,
136 UNIT_STAND_STATE_SIT_MEDIUM_CHAIR = 5,
137 UNIT_STAND_STATE_SIT_HIGH_CHAIR = 6,
138 UNIT_STAND_STATE_DEAD = 7,
139 UNIT_STAND_STATE_KNEEL = 8
142 // byte flag value (UNIT_FIELD_BYTES_1,2)
143 enum UnitStandFlags
145 UNIT_STAND_FLAGS_CREEP = 0x02,
146 UNIT_STAND_FLAGS_ALL = 0xFF
149 // byte flags value (UNIT_FIELD_BYTES_1,3)
150 enum UnitBytes1_Flags
152 UNIT_BYTE1_FLAG_ALWAYS_STAND = 0x01,
153 UNIT_BYTE1_FLAG_UNTRACKABLE = 0x04,
154 UNIT_BYTE1_FLAG_ALL = 0xFF
157 // high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
158 enum ShapeshiftForm
160 FORM_NONE = 0x00,
161 FORM_CAT = 0x01,
162 FORM_TREE = 0x02,
163 FORM_TRAVEL = 0x03,
164 FORM_AQUA = 0x04,
165 FORM_BEAR = 0x05,
166 FORM_AMBIENT = 0x06,
167 FORM_GHOUL = 0x07,
168 FORM_DIREBEAR = 0x08,
169 FORM_CREATUREBEAR = 0x0E,
170 FORM_CREATURECAT = 0x0F,
171 FORM_GHOSTWOLF = 0x10,
172 FORM_BATTLESTANCE = 0x11,
173 FORM_DEFENSIVESTANCE = 0x12,
174 FORM_BERSERKERSTANCE = 0x13,
175 FORM_TEST = 0x14,
176 FORM_ZOMBIE = 0x15,
177 FORM_METAMORPHOSIS = 0x16,
178 FORM_FLIGHT_EPIC = 0x1B,
179 FORM_SHADOW = 0x1C,
180 FORM_FLIGHT = 0x1D,
181 FORM_STEALTH = 0x1E,
182 FORM_MOONKIN = 0x1F,
183 FORM_SPIRITOFREDEMPTION = 0x20
186 // low byte ( 0 from 0..3 ) of UNIT_FIELD_BYTES_2
187 enum SheathState
189 SHEATH_STATE_UNARMED = 0, // non prepared weapon
190 SHEATH_STATE_MELEE = 1, // prepared melee weapon
191 SHEATH_STATE_RANGED = 2 // prepared ranged weapon
194 // byte (1 from 0..3) of UNIT_FIELD_BYTES_2
195 enum UnitBytes2_Flags
197 UNIT_BYTE2_FLAG_PVP = 0x01,
198 UNIT_BYTE2_FLAG_UNK1 = 0x02,
199 UNIT_BYTE2_FLAG_FFA_PVP = 0x04,
200 UNIT_BYTE2_FLAG_SANCTUARY = 0x08,
201 UNIT_BYTE2_FLAG_UNK4 = 0x10,
202 UNIT_BYTE2_FLAG_UNK5 = 0x20,
203 UNIT_BYTE2_FLAG_UNK6 = 0x40,
204 UNIT_BYTE2_FLAG_UNK7 = 0x80
207 // byte (2 from 0..3) of UNIT_FIELD_BYTES_2
208 enum UnitRename
210 UNIT_RENAME_NOT_ALLOWED = 0x02,
211 UNIT_RENAME_ALLOWED = 0x03
214 #define CREATURE_MAX_SPELLS 4
216 enum Swing
218 NOSWING = 0,
219 SINGLEHANDEDSWING = 1,
220 TWOHANDEDSWING = 2
223 enum VictimState
225 VICTIMSTATE_UNKNOWN1 = 0,
226 VICTIMSTATE_NORMAL = 1,
227 VICTIMSTATE_DODGE = 2,
228 VICTIMSTATE_PARRY = 3,
229 VICTIMSTATE_INTERRUPT = 4,
230 VICTIMSTATE_BLOCKS = 5,
231 VICTIMSTATE_EVADES = 6,
232 VICTIMSTATE_IS_IMMUNE = 7,
233 VICTIMSTATE_DEFLECTS = 8
236 enum HitInfo
238 HITINFO_NORMALSWING = 0x00000000,
239 HITINFO_UNK1 = 0x00000001, // req correct packet structure
240 HITINFO_NORMALSWING2 = 0x00000002,
241 HITINFO_LEFTSWING = 0x00000004,
242 HITINFO_UNK2 = 0x00000008,
243 HITINFO_MISS = 0x00000010,
244 HITINFO_ABSORB = 0x00000020, // absorbed damage
245 HITINFO_ABSORB2 = 0x00000040, // absorbed damage
246 HITINFO_RESIST = 0x00000080, // resisted atleast some damage
247 HITINFO_RESIST2 = 0x00000100, // resisted atleast some damage
248 HITINFO_CRITICALHIT = 0x00000200, // critical hit
249 // 0x00000400
250 // 0x00000800
251 // 0x00001000
252 HITINFO_BLOCK = 0x00002000, // blocked damage
253 // 0x00004000
254 // 0x00008000
255 HITINFO_GLANCING = 0x00010000,
256 HITINFO_CRUSHING = 0x00020000,
257 HITINFO_NOACTION = 0x00040000, // guessed
258 // 0x00080000
259 // 0x00100000
260 HITINFO_SWINGNOHITSOUND = 0x00200000, // guessed
261 // 0x00400000
262 HITINFO_UNK3 = 0x00800000
265 //i would like to remove this: (it is defined in item.h
266 enum InventorySlot
268 NULL_BAG = 0,
269 NULL_SLOT = 255
272 struct FactionTemplateEntry;
273 struct Modifier;
274 struct SpellEntry;
275 struct SpellEntryExt;
277 class Aura;
278 class Creature;
279 class Spell;
280 class DynamicObject;
281 class GameObject;
282 class Item;
283 class Pet;
284 class Path;
285 class PetAura;
287 struct SpellImmune
289 uint32 type;
290 uint32 spellId;
293 typedef std::list<SpellImmune> SpellImmuneList;
295 enum UnitModifierType
297 BASE_VALUE = 0,
298 BASE_PCT = 1,
299 TOTAL_VALUE = 2,
300 TOTAL_PCT = 3,
301 MODIFIER_TYPE_END = 4
304 enum WeaponDamageRange
306 MINDAMAGE,
307 MAXDAMAGE
310 enum DamageTypeToSchool
312 RESISTANCE,
313 DAMAGE_DEALT,
314 DAMAGE_TAKEN
317 enum AuraRemoveMode
319 AURA_REMOVE_BY_DEFAULT,
320 AURA_REMOVE_BY_STACK, // at replace by semillar aura
321 AURA_REMOVE_BY_CANCEL,
322 AURA_REMOVE_BY_DISPEL,
323 AURA_REMOVE_BY_DEATH
326 enum UnitMods
328 UNIT_MOD_STAT_STRENGTH, // UNIT_MOD_STAT_STRENGTH..UNIT_MOD_STAT_SPIRIT must be in existed order, it's accessed by index values of Stats enum.
329 UNIT_MOD_STAT_AGILITY,
330 UNIT_MOD_STAT_STAMINA,
331 UNIT_MOD_STAT_INTELLECT,
332 UNIT_MOD_STAT_SPIRIT,
333 UNIT_MOD_HEALTH,
334 UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_RUNIC_POWER must be in existed order, it's accessed by index values of Powers enum.
335 UNIT_MOD_RAGE,
336 UNIT_MOD_FOCUS,
337 UNIT_MOD_ENERGY,
338 UNIT_MOD_HAPPINESS,
339 UNIT_MOD_RUNE,
340 UNIT_MOD_RUNIC_POWER,
341 UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
342 UNIT_MOD_RESISTANCE_HOLY,
343 UNIT_MOD_RESISTANCE_FIRE,
344 UNIT_MOD_RESISTANCE_NATURE,
345 UNIT_MOD_RESISTANCE_FROST,
346 UNIT_MOD_RESISTANCE_SHADOW,
347 UNIT_MOD_RESISTANCE_ARCANE,
348 UNIT_MOD_ATTACK_POWER,
349 UNIT_MOD_ATTACK_POWER_RANGED,
350 UNIT_MOD_DAMAGE_MAINHAND,
351 UNIT_MOD_DAMAGE_OFFHAND,
352 UNIT_MOD_DAMAGE_RANGED,
353 UNIT_MOD_END,
354 // synonyms
355 UNIT_MOD_STAT_START = UNIT_MOD_STAT_STRENGTH,
356 UNIT_MOD_STAT_END = UNIT_MOD_STAT_SPIRIT + 1,
357 UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
358 UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
359 UNIT_MOD_POWER_START = UNIT_MOD_MANA,
360 UNIT_MOD_POWER_END = UNIT_MOD_RUNIC_POWER + 1
363 enum BaseModGroup
365 CRIT_PERCENTAGE,
366 RANGED_CRIT_PERCENTAGE,
367 OFFHAND_CRIT_PERCENTAGE,
368 SHIELD_BLOCK_VALUE,
369 BASEMOD_END
372 enum BaseModType
374 FLAT_MOD,
375 PCT_MOD
378 #define MOD_END (PCT_MOD+1)
380 enum DeathState
382 ALIVE = 0,
383 JUST_DIED = 1,
384 CORPSE = 2,
385 DEAD = 3,
386 JUST_ALIVED = 4,
387 DEAD_FALLING= 5
390 enum UnitState
392 UNIT_STAT_DIED = 0x0001,
393 UNIT_STAT_MELEE_ATTACKING = 0x0002, // player is melee attacking someone
394 //UNIT_STAT_MELEE_ATTACK_BY = 0x0004, // player is melee attack by someone
395 UNIT_STAT_STUNNED = 0x0008,
396 UNIT_STAT_ROAMING = 0x0010,
397 UNIT_STAT_CHASE = 0x0020,
398 UNIT_STAT_SEARCHING = 0x0040,
399 UNIT_STAT_FLEEING = 0x0080,
400 UNIT_STAT_MOVING = (UNIT_STAT_ROAMING | UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING),
401 UNIT_STAT_IN_FLIGHT = 0x0100, // player is in flight mode
402 UNIT_STAT_FOLLOW = 0x0200,
403 UNIT_STAT_ROOT = 0x0400,
404 UNIT_STAT_CONFUSED = 0x0800,
405 UNIT_STAT_DISTRACTED = 0x1000,
406 UNIT_STAT_ISOLATED = 0x2000, // area auras do not affect other players
407 UNIT_STAT_ATTACK_PLAYER = 0x4000,
408 UNIT_STAT_ALL_STATE = 0xffff //(UNIT_STAT_STOPPED | UNIT_STAT_MOVING | UNIT_STAT_IN_COMBAT | UNIT_STAT_IN_FLIGHT)
411 enum UnitMoveType
413 MOVE_WALK = 0,
414 MOVE_RUN = 1,
415 MOVE_RUN_BACK = 2,
416 MOVE_SWIM = 3,
417 MOVE_SWIM_BACK = 4,
418 MOVE_TURN_RATE = 5,
419 MOVE_FLIGHT = 6,
420 MOVE_FLIGHT_BACK = 7,
421 MOVE_PITCH_RATE = 8
424 #define MAX_MOVE_TYPE 9
426 extern float baseMoveSpeed[MAX_MOVE_TYPE];
428 enum WeaponAttackType
430 BASE_ATTACK = 0,
431 OFF_ATTACK = 1,
432 RANGED_ATTACK = 2
435 #define MAX_ATTACK 3
437 enum CombatRating
439 CR_WEAPON_SKILL = 0,
440 CR_DEFENSE_SKILL = 1,
441 CR_DODGE = 2,
442 CR_PARRY = 3,
443 CR_BLOCK = 4,
444 CR_HIT_MELEE = 5,
445 CR_HIT_RANGED = 6,
446 CR_HIT_SPELL = 7,
447 CR_CRIT_MELEE = 8,
448 CR_CRIT_RANGED = 9,
449 CR_CRIT_SPELL = 10,
450 CR_HIT_TAKEN_MELEE = 11,
451 CR_HIT_TAKEN_RANGED = 12,
452 CR_HIT_TAKEN_SPELL = 13,
453 CR_CRIT_TAKEN_MELEE = 14,
454 CR_CRIT_TAKEN_RANGED = 15,
455 CR_CRIT_TAKEN_SPELL = 16,
456 CR_HASTE_MELEE = 17,
457 CR_HASTE_RANGED = 18,
458 CR_HASTE_SPELL = 19,
459 CR_WEAPON_SKILL_MAINHAND = 20,
460 CR_WEAPON_SKILL_OFFHAND = 21,
461 CR_WEAPON_SKILL_RANGED = 22,
462 CR_EXPERTISE = 23,
463 CR_ARMOR_PENETRATION = 24
466 #define MAX_COMBAT_RATING 25
468 enum DamageEffectType
470 DIRECT_DAMAGE = 0, // used for normal weapon damage (not for class abilities or spells)
471 SPELL_DIRECT_DAMAGE = 1, // spell/class abilities damage
472 DOT = 2,
473 HEAL = 3,
474 NODAMAGE = 4, // used also in case when damage applied to health but not applied to spell channelInterruptFlags/etc
475 SELF_DAMAGE = 5
478 enum UnitVisibility
480 VISIBILITY_OFF = 0, // absolute, not detectable, GM-like, can see all other
481 VISIBILITY_ON = 1,
482 VISIBILITY_GROUP_STEALTH = 2, // detect chance, seen and can see group members
483 VISIBILITY_GROUP_INVISIBILITY = 3, // invisibility, can see and can be seen only another invisible unit or invisible detection unit, set only if not stealthed, and in checks not used (mask used instead)
484 VISIBILITY_GROUP_NO_DETECT = 4, // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break
485 VISIBILITY_RESPAWN = 5 // special totally not detectable visibility for force delete object at respawn command
488 // Value masks for UNIT_FIELD_FLAGS
489 enum UnitFlags
491 UNIT_FLAG_UNK_0 = 0x00000001,
492 UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable
493 UNIT_FLAG_DISABLE_MOVE = 0x00000004,
494 UNIT_FLAG_PVP_ATTACKABLE = 0x00000008, // allow apply pvp rules to attackable state in addition to faction dependent state
495 UNIT_FLAG_RENAME = 0x00000010,
496 UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
497 UNIT_FLAG_UNK_6 = 0x00000040,
498 UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
499 UNIT_FLAG_UNK_8 = 0x00000100, // 2.0.8
500 UNIT_FLAG_UNK_9 = 0x00000200, // 3.0.3 - makes you unable to attack everything
501 UNIT_FLAG_LOOTING = 0x00000400, // loot animation
502 UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
503 UNIT_FLAG_PVP = 0x00001000, // changed in 3.0.3
504 UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
505 UNIT_FLAG_UNK_14 = 0x00004000, // 2.0.8
506 UNIT_FLAG_UNK_15 = 0x00008000,
507 UNIT_FLAG_UNK_16 = 0x00010000,
508 UNIT_FLAG_PACIFIED = 0x00020000, // 3.0.3 ok
509 UNIT_FLAG_STUNNED = 0x00040000, // 3.0.3 ok
510 UNIT_FLAG_IN_COMBAT = 0x00080000,
511 UNIT_FLAG_TAXI_FLIGHT = 0x00100000, // disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag
512 UNIT_FLAG_DISARMED = 0x00200000, // 3.0.3, disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
513 UNIT_FLAG_CONFUSED = 0x00400000,
514 UNIT_FLAG_FLEEING = 0x00800000,
515 UNIT_FLAG_UNK_24 = 0x01000000, // used in spell Eyes of the Beast for pet...
516 UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
517 UNIT_FLAG_SKINNABLE = 0x04000000,
518 UNIT_FLAG_MOUNT = 0x08000000,
519 UNIT_FLAG_UNK_28 = 0x10000000,
520 UNIT_FLAG_UNK_29 = 0x20000000, // used in Feing Death spell
521 UNIT_FLAG_SHEATHE = 0x40000000,
522 UNIT_FLAG_UNK_31 = 0x80000000
525 // Value masks for UNIT_FIELD_FLAGS_2
526 enum UnitFlags2
528 UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
529 UNIT_FLAG2_UNK1 = 0x00000002, // Hide unit model (show only player equip)
530 UNIT_FLAG2_COMPREHEND_LANG = 0x00000008,
531 UNIT_FLAG2_FORCE_MOVE = 0x00000040,
532 UNIT_FLAG2_REGENERATE_POWER = 0x00000800
535 /// Non Player Character flags
536 enum NPCFlags
538 UNIT_NPC_FLAG_NONE = 0x00000000,
539 UNIT_NPC_FLAG_GOSSIP = 0x00000001, // 100%
540 UNIT_NPC_FLAG_QUESTGIVER = 0x00000002, // guessed, probably ok
541 UNIT_NPC_FLAG_UNK1 = 0x00000004,
542 UNIT_NPC_FLAG_UNK2 = 0x00000008,
543 UNIT_NPC_FLAG_TRAINER = 0x00000010, // 100%
544 UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020, // 100%
545 UNIT_NPC_FLAG_TRAINER_PROFESSION = 0x00000040, // 100%
546 UNIT_NPC_FLAG_VENDOR = 0x00000080, // 100%
547 UNIT_NPC_FLAG_VENDOR_AMMO = 0x00000100, // 100%, general goods vendor
548 UNIT_NPC_FLAG_VENDOR_FOOD = 0x00000200, // 100%
549 UNIT_NPC_FLAG_VENDOR_POISON = 0x00000400, // guessed
550 UNIT_NPC_FLAG_VENDOR_REAGENT = 0x00000800, // 100%
551 UNIT_NPC_FLAG_REPAIR = 0x00001000, // 100%
552 UNIT_NPC_FLAG_FLIGHTMASTER = 0x00002000, // 100%
553 UNIT_NPC_FLAG_SPIRITHEALER = 0x00004000, // guessed
554 UNIT_NPC_FLAG_SPIRITGUIDE = 0x00008000, // guessed
555 UNIT_NPC_FLAG_INNKEEPER = 0x00010000, // 100%
556 UNIT_NPC_FLAG_BANKER = 0x00020000, // 100%
557 UNIT_NPC_FLAG_PETITIONER = 0x00040000, // 100% 0xC0000 = guild petitions, 0x40000 = arena team petitions
558 UNIT_NPC_FLAG_TABARDDESIGNER = 0x00080000, // 100%
559 UNIT_NPC_FLAG_BATTLEMASTER = 0x00100000, // 100%
560 UNIT_NPC_FLAG_AUCTIONEER = 0x00200000, // 100%
561 UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // 100%
562 UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // cause client to send 997 opcode
563 UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // cause client to send 1015 opcode (spell click)
564 UNIT_NPC_FLAG_GUARD = 0x10000000, // custom flag for guards
567 enum MovementFlags
569 MOVEMENTFLAG_NONE = 0x00000000,
570 MOVEMENTFLAG_FORWARD = 0x00000001,
571 MOVEMENTFLAG_BACKWARD = 0x00000002,
572 MOVEMENTFLAG_STRAFE_LEFT = 0x00000004,
573 MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008,
574 MOVEMENTFLAG_LEFT = 0x00000010,
575 MOVEMENTFLAG_RIGHT = 0x00000020,
576 MOVEMENTFLAG_PITCH_UP = 0x00000040,
577 MOVEMENTFLAG_PITCH_DOWN = 0x00000080,
578 MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking
579 MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
580 MOVEMENTFLAG_LEVITATING = 0x00000400,
581 MOVEMENTFLAG_FLY_UNK1 = 0x00000800,
582 MOVEMENTFLAG_JUMPING = 0x00001000,
583 MOVEMENTFLAG_UNK4 = 0x00002000,
584 MOVEMENTFLAG_FALLING = 0x00004000,
585 // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000
586 MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also
587 MOVEMENTFLAG_FLY_UP = 0x00400000,
588 MOVEMENTFLAG_CAN_FLY = 0x00800000,
589 MOVEMENTFLAG_FLYING = 0x01000000,
590 MOVEMENTFLAG_FLYING2 = 0x02000000, // Actual flying mode
591 MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths
592 MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths
593 MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water
594 MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive)
595 MOVEMENTFLAG_UNK3 = 0x40000000
598 enum DiminishingLevels
600 DIMINISHING_LEVEL_1 = 0,
601 DIMINISHING_LEVEL_2 = 1,
602 DIMINISHING_LEVEL_3 = 2,
603 DIMINISHING_LEVEL_IMMUNE = 3
606 struct DiminishingReturn
608 DiminishingReturn(DiminishingGroup group, uint32 t, uint32 count)
609 : DRGroup(group), stack(0), hitTime(t), hitCount(count)
612 DiminishingGroup DRGroup:16;
613 uint16 stack:16;
614 uint32 hitTime;
615 uint32 hitCount;
618 enum MeleeHitOutcome
620 MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,
621 MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL
624 struct CleanDamage
626 CleanDamage(uint32 _damage, WeaponAttackType _attackType, MeleeHitOutcome _hitOutCome) :
627 damage(_damage), attackType(_attackType), hitOutCome(_hitOutCome) {}
629 uint32 damage;
630 WeaponAttackType attackType;
631 MeleeHitOutcome hitOutCome;
634 // Struct for use in Unit::CalculateMeleeDamage
635 // Need create structure like in SMSG_ATTACKERSTATEUPDATE opcode
636 struct CalcDamageInfo
638 Unit *attacker; // Attacker
639 Unit *target; // Target for damage
640 uint32 damageSchoolMask;
641 uint32 damage;
642 uint32 absorb;
643 uint32 resist;
644 uint32 blocked_amount;
645 uint32 HitInfo;
646 uint32 TargetState;
647 // Helper
648 WeaponAttackType attackType; //
649 uint32 procAttacker;
650 uint32 procVictim;
651 uint32 procEx;
652 uint32 cleanDamage; // Used only fo rage calcultion
653 MeleeHitOutcome hitOutCome; // TODO: remove this field (need use TargetState)
656 // Spell damage info structure based on structure sending in SMSG_SPELLNONMELEEDAMAGELOG opcode
657 struct SpellNonMeleeDamage{
658 SpellNonMeleeDamage(Unit *_attacker, Unit *_target, uint32 _SpellID, uint32 _schoolMask)
659 : target(_target), attacker(_attacker), SpellID(_SpellID), damage(0), overkill(0), schoolMask(_schoolMask),
660 absorb(0), resist(0), physicalLog(false), unused(false), blocked(0), HitInfo(0), cleanDamage(0)
663 Unit *target;
664 Unit *attacker;
665 uint32 SpellID;
666 uint32 damage;
667 uint32 overkill;
668 uint32 schoolMask;
669 uint32 absorb;
670 uint32 resist;
671 bool physicalLog;
672 bool unused;
673 uint32 blocked;
674 uint32 HitInfo;
675 // Used for help
676 uint32 cleanDamage;
679 uint32 createProcExtendMask(SpellNonMeleeDamage *damageInfo, SpellMissInfo missCondition);
681 struct UnitActionBarEntry
683 UnitActionBarEntry() : Raw(0) {}
685 union
687 struct
689 uint16 SpellOrAction;
690 uint16 Type;
692 struct
694 uint32 Raw;
699 #define MAX_DECLINED_NAME_CASES 5
701 struct DeclinedName
703 std::string name[MAX_DECLINED_NAME_CASES];
706 enum CurrentSpellTypes
708 CURRENT_MELEE_SPELL = 0,
709 CURRENT_FIRST_NON_MELEE_SPELL = 1, // just counter
710 CURRENT_GENERIC_SPELL = 1,
711 CURRENT_AUTOREPEAT_SPELL = 2,
712 CURRENT_CHANNELED_SPELL = 3,
713 CURRENT_MAX_SPELL = 4 // just counter
716 enum ActiveStates
718 ACT_PASSIVE = 0x0100, // 0x0100 - passive
719 ACT_DISABLED = 0x8100, // 0x8000 - castable
720 ACT_ENABLED = 0xC100, // 0x4000 | 0x8000 - auto cast + castable
721 ACT_COMMAND = 0x0700, // 0x0100 | 0x0200 | 0x0400
722 ACT_REACTION = 0x0600, // 0x0200 | 0x0400
723 ACT_DECIDE = 0x0001 // what is it?
726 enum ReactStates
728 REACT_PASSIVE = 0,
729 REACT_DEFENSIVE = 1,
730 REACT_AGGRESSIVE = 2
733 enum CommandStates
735 COMMAND_STAY = 0,
736 COMMAND_FOLLOW = 1,
737 COMMAND_ATTACK = 2,
738 COMMAND_ABANDON = 3
741 struct CharmSpellEntry
743 uint16 spellId;
744 uint16 active;
747 struct CharmInfo
749 public:
750 explicit CharmInfo(Unit* unit);
751 uint32 GetPetNumber() const { return m_petnumber; }
752 void SetPetNumber(uint32 petnumber, bool statwindow);
754 void SetCommandState(CommandStates st) { m_CommandState = st; }
755 CommandStates GetCommandState() { return m_CommandState; }
756 bool HasCommandState(CommandStates state) { return (m_CommandState == state); }
757 void SetReactState(ReactStates st) { m_reactState = st; }
758 ReactStates GetReactState() { return m_reactState; }
759 bool HasReactState(ReactStates state) { return (m_reactState == state); }
761 void InitPossessCreateSpells();
762 void InitCharmCreateSpells();
763 void InitPetActionBar();
764 void InitEmptyActionBar();
765 //return true if successful
766 bool AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate = ACT_DECIDE);
767 void ToggleCreatureAutocast(uint32 spellid, bool apply);
769 UnitActionBarEntry* GetActionBarEntry(uint8 index) { return &(PetActionBar[index]); }
770 CharmSpellEntry* GetCharmSpell(uint8 index) { return &(m_charmspells[index]); }
771 private:
772 Unit* m_unit;
773 UnitActionBarEntry PetActionBar[10];
774 CharmSpellEntry m_charmspells[4];
775 CommandStates m_CommandState;
776 ReactStates m_reactState;
777 uint32 m_petnumber;
780 // for clearing special attacks
781 #define REACTIVE_TIMER_START 4000
783 enum ReactiveType
785 REACTIVE_DEFENSE = 0,
786 REACTIVE_HUNTER_PARRY = 1,
787 REACTIVE_OVERPOWER = 2
790 #define MAX_REACTIVE 3
791 #define MAX_TOTEM 4
793 // delay time next attack to prevent client attack animation problems
794 #define ATTACK_DISPLAY_DELAY 200
796 struct SpellProcEventEntry; // used only privately
798 class MANGOS_DLL_SPEC Unit : public WorldObject
800 public:
801 typedef std::set<Unit*> AttackerSet;
802 typedef std::pair<uint32, uint8> spellEffectPair;
803 typedef std::multimap< spellEffectPair, Aura*> AuraMap;
804 typedef std::list<Aura *> AuraList;
805 typedef std::list<DiminishingReturn> Diminishing;
806 typedef std::set<uint32> ComboPointHolderSet;
807 typedef std::map<uint8, uint32> VisibleAuraMap;
809 virtual ~Unit ( );
811 void AddToWorld();
812 void RemoveFromWorld();
814 void CleanupsBeforeDelete(); // used in ~Creature/~Player (or before mass creature delete to remove cross-references to already deleted units)
816 DiminishingLevels GetDiminishing(DiminishingGroup group);
817 void IncrDiminishing(DiminishingGroup group);
818 void ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster, DiminishingLevels Level);
819 void ApplyDiminishingAura(DiminishingGroup group, bool apply);
820 void ClearDiminishings() { m_Diminishing.clear(); }
822 virtual void Update( uint32 time );
824 void setAttackTimer(WeaponAttackType type, uint32 time) { m_attackTimer[type] = time; }
825 void resetAttackTimer(WeaponAttackType type = BASE_ATTACK);
826 uint32 getAttackTimer(WeaponAttackType type) const { return m_attackTimer[type]; }
827 bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] == 0; }
828 bool haveOffhandWeapon() const;
829 bool canReachWithAttack(Unit *pVictim) const;
830 uint32 m_extraAttacks;
832 void _addAttacker(Unit *pAttacker) // must be called only from Unit::Attack(Unit*)
834 AttackerSet::const_iterator itr = m_attackers.find(pAttacker);
835 if(itr == m_attackers.end())
836 m_attackers.insert(pAttacker);
838 void _removeAttacker(Unit *pAttacker) // must be called only from Unit::AttackStop()
840 m_attackers.erase(pAttacker);
842 Unit * getAttackerForHelper() // If someone wants to help, who to give them
844 if (getVictim() != NULL)
845 return getVictim();
847 if (!m_attackers.empty())
848 return *(m_attackers.begin());
850 return NULL;
852 bool Attack(Unit *victim, bool meleeAttack);
853 void CastStop(uint32 except_spellid = 0);
854 bool AttackStop(bool targetSwitch = false);
855 void RemoveAllAttackers();
856 AttackerSet const& getAttackers() const { return m_attackers; }
857 bool isAttackingPlayer() const;
858 Unit* getVictim() const { return m_attacking; }
859 void CombatStop(bool includingCast = false);
860 void CombatStopWithPets(bool includingCast = false);
861 Unit* SelectNearbyTarget() const;
862 bool hasNegativeAuraWithInterruptFlag(uint32 flag);
864 void addUnitState(uint32 f) { m_state |= f; }
865 bool hasUnitState(const uint32 f) const { return (m_state & f); }
866 void clearUnitState(uint32 f) { m_state &= ~f; }
867 bool CanFreeMove() const
869 return !hasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING | UNIT_STAT_IN_FLIGHT |
870 UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED ) && GetOwnerGUID()==0;
873 uint32 getLevel() const { return GetUInt32Value(UNIT_FIELD_LEVEL); }
874 virtual uint32 getLevelForTarget(Unit const* /*target*/) const { return getLevel(); }
875 void SetLevel(uint32 lvl);
876 uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, 0); }
877 uint32 getRaceMask() const { return 1 << (getRace()-1); }
878 uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
879 uint32 getClassMask() const { return 1 << (getClass()-1); }
880 uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); }
882 float GetStat(Stats stat) const { return float(GetUInt32Value(UNIT_FIELD_STAT0+stat)); }
883 void SetStat(Stats stat, int32 val) { SetStatInt32Value(UNIT_FIELD_STAT0+stat, val); }
884 uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL) ; }
885 void SetArmor(int32 val) { SetResistance(SPELL_SCHOOL_NORMAL, val); }
887 uint32 GetResistance(SpellSchools school) const { return GetUInt32Value(UNIT_FIELD_RESISTANCES+school); }
888 void SetResistance(SpellSchools school, int32 val) { SetStatInt32Value(UNIT_FIELD_RESISTANCES+school,val); }
890 uint32 GetHealth() const { return GetUInt32Value(UNIT_FIELD_HEALTH); }
891 uint32 GetMaxHealth() const { return GetUInt32Value(UNIT_FIELD_MAXHEALTH); }
892 void SetHealth( uint32 val);
893 void SetMaxHealth(uint32 val);
894 int32 ModifyHealth(int32 val);
896 Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); }
897 void setPowerType(Powers power);
898 uint32 GetPower( Powers power) const { return GetUInt32Value(UNIT_FIELD_POWER1 +power); }
899 uint32 GetMaxPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_MAXPOWER1+power); }
900 void SetPower( Powers power, uint32 val);
901 void SetMaxPower(Powers power, uint32 val);
902 int32 ModifyPower(Powers power, int32 val);
903 void ApplyPowerMod(Powers power, uint32 val, bool apply);
904 void ApplyMaxPowerMod(Powers power, uint32 val, bool apply);
906 uint32 GetAttackTime(WeaponAttackType att) const { return (uint32)(GetFloatValue(UNIT_FIELD_BASEATTACKTIME+att)/m_modAttackSpeedPct[att]); }
907 void SetAttackTime(WeaponAttackType att, uint32 val) { SetFloatValue(UNIT_FIELD_BASEATTACKTIME+att,val*m_modAttackSpeedPct[att]); }
908 void ApplyAttackTimePercentMod(WeaponAttackType att,float val, bool apply);
909 void ApplyCastTimePercentMod(float val, bool apply);
911 // faction template id
912 uint32 getFaction() const { return GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE); }
913 void setFaction(uint32 faction) { SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, faction ); }
914 FactionTemplateEntry const* getFactionTemplateEntry() const;
915 bool IsHostileTo(Unit const* unit) const;
916 bool IsHostileToPlayers() const;
917 bool IsFriendlyTo(Unit const* unit) const;
918 bool IsNeutralToAll() const;
919 bool IsContestedGuard() const
921 if(FactionTemplateEntry const* entry = getFactionTemplateEntry())
922 return entry->IsContestedGuardFaction();
924 return false;
926 bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
927 void SetPvP(bool state)
929 if(state)
930 SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
931 else
932 RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
934 uint32 GetCreatureType() const;
935 uint32 GetCreatureTypeMask() const
937 uint32 creatureType = GetCreatureType();
938 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
941 uint8 getStandState() const { return GetByteValue(UNIT_FIELD_BYTES_1, 0); }
942 bool IsSitState() const;
943 bool IsStandState() const;
944 void SetStandState(uint8 state);
946 void SetStandFlags(uint8 flags) { SetByteFlag(UNIT_FIELD_BYTES_1, 2,flags); }
947 void RemoveStandFlags(uint8 flags) { RemoveByteFlag(UNIT_FIELD_BYTES_1, 2,flags); }
949 bool IsMounted() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT ); }
950 uint32 GetMountID() const { return GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID); }
951 void Mount(uint32 mount);
952 void Unmount();
954 uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
955 void DealDamageMods(Unit *pVictim, uint32 &damage, uint32* absorb);
956 uint32 DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss);
957 int32 DealHeal(Unit *pVictim, uint32 addhealth, SpellEntry const *spellProto, bool critical = false);
959 void ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType = BASE_ATTACK, SpellEntry const *procSpell = NULL);
960 void ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage );
962 void HandleEmoteCommand(uint32 anim_id);
963 void AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType = BASE_ATTACK, bool extra = false );
965 float MeleeMissChanceCalc(const Unit *pVictim, WeaponAttackType attType) const;
967 void CalculateMeleeDamage(Unit *pVictim, uint32 damage, CalcDamageInfo *damageInfo, WeaponAttackType attackType = BASE_ATTACK);
968 void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss);
970 void CalculateSpellDamage(SpellNonMeleeDamage *damageInfo, int32 damage, SpellEntry const *spellInfo, WeaponAttackType attackType = BASE_ATTACK);
971 void DealSpellDamage(SpellNonMeleeDamage *damageInfo, bool durabilityLoss);
973 float MeleeSpellMissChance(Unit *pVictim, WeaponAttackType attType, int32 skillDiff, SpellEntry const *spell);
974 SpellMissInfo MeleeSpellHitResult(Unit *pVictim, SpellEntry const *spell);
975 SpellMissInfo MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell);
976 SpellMissInfo SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool canReflect = false);
978 float GetUnitDodgeChance() const;
979 float GetUnitParryChance() const;
980 float GetUnitBlockChance() const;
981 float GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVictim) const;
983 virtual uint32 GetShieldBlockValue() const =0;
984 uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
985 uint32 GetDefenseSkillValue(Unit const* target = NULL) const;
986 uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const;
987 float GetWeaponProcChance() const;
988 float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
990 MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const;
991 MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const;
993 bool isVendor() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR ); }
994 bool isTrainer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER ); }
995 bool isQuestGiver() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER ); }
996 bool isGossip() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP ); }
997 bool isTaxi() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER ); }
998 bool isGuildMaster() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PETITIONER ); }
999 bool isBattleMaster() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BATTLEMASTER ); }
1000 bool isBanker() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER ); }
1001 bool isInnkeeper() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_INNKEEPER ); }
1002 bool isSpiritHealer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER ); }
1003 bool isSpiritGuide() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITGUIDE ); }
1004 bool isTabardDesigner()const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TABARDDESIGNER ); }
1005 bool isAuctioner() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_AUCTIONEER ); }
1006 bool isArmorer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_REPAIR ); }
1007 bool isServiceProvider() const
1009 return HasFlag( UNIT_NPC_FLAGS,
1010 UNIT_NPC_FLAG_VENDOR | UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_FLIGHTMASTER |
1011 UNIT_NPC_FLAG_PETITIONER | UNIT_NPC_FLAG_BATTLEMASTER | UNIT_NPC_FLAG_BANKER |
1012 UNIT_NPC_FLAG_INNKEEPER | UNIT_NPC_FLAG_GUARD | UNIT_NPC_FLAG_SPIRITHEALER |
1013 UNIT_NPC_FLAG_SPIRITGUIDE | UNIT_NPC_FLAG_TABARDDESIGNER | UNIT_NPC_FLAG_AUCTIONEER );
1015 bool isSpiritService() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE ); }
1017 //Need fix or use this
1018 bool isGuard() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GUARD); }
1020 bool isInFlight() const { return hasUnitState(UNIT_STAT_IN_FLIGHT); }
1022 bool isInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); }
1023 void SetInCombatState(bool PvP, Unit* enemy = NULL);
1024 void SetInCombatWith(Unit* enemy);
1025 void ClearInCombat();
1026 uint32 GetCombatTimer() const { return m_CombatTimer; }
1028 bool HasAuraType(AuraType auraType) const;
1029 bool HasAura(uint32 spellId, uint32 effIndex) const
1031 return m_Auras.find(spellEffectPair(spellId, effIndex)) != m_Auras.end();
1033 bool HasAura(uint32 spellId) const;
1035 bool virtual HasSpell(uint32 /*spellID*/) const { return false; }
1037 bool HasStealthAura() const { return HasAuraType(SPELL_AURA_MOD_STEALTH); }
1038 bool HasInvisibilityAura() const { return HasAuraType(SPELL_AURA_MOD_INVISIBILITY); }
1039 bool isFeared() const { return HasAuraType(SPELL_AURA_MOD_FEAR); }
1040 bool isInRoots() const { return HasAuraType(SPELL_AURA_MOD_ROOT); }
1041 bool IsPolymorphed() const;
1043 bool isFrozen() const;
1045 void RemoveSpellbyDamageTaken(AuraType auraType, uint32 damage);
1047 bool isTargetableForAttack() const;
1048 virtual bool IsInWater() const;
1049 virtual bool IsUnderWater() const;
1050 bool isInAccessablePlaceFor(Creature const* c) const;
1052 void SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, bool critical = false);
1053 void SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage,Powers powertype);
1054 uint32 SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage);
1055 void CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1056 void CastSpell(Unit* Victim,SpellEntry const *spellInfo, bool triggered, Item *castItem= NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1057 void CastCustomSpell(Unit* Victim, uint32 spellId, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem= NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1058 void CastCustomSpell(Unit* Victim,SpellEntry const *spellInfo, int32 const* bp0, int32 const* bp1, int32 const* bp2, bool triggered, Item *castItem= NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1059 void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1060 void CastSpell(float x, float y, float z, SpellEntry const *spellInfo, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
1062 bool IsDamageToThreatSpell(SpellEntry const * spellInfo) const;
1064 void DeMorph();
1066 void SendAttackStateUpdate(CalcDamageInfo *damageInfo);
1067 void SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
1068 void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log);
1069 void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SpellSchoolMask damageSchoolMask,uint32 AbsorbedDamage, uint32 Resist,bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
1070 void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo);
1072 void NearTeleportTo(float x, float y, float z, float orientation, bool casting = false);
1074 void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
1075 void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags);
1076 void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 transitTime = 0, Player* player = NULL);
1077 void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
1079 virtual void MoveOutOfRange(Player &) { };
1081 bool isAlive() const { return (m_deathState == ALIVE); };
1082 bool isDead() const { return ( m_deathState == DEAD || m_deathState == CORPSE ); };
1083 DeathState getDeathState() { return m_deathState; };
1084 virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet
1086 uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); }
1087 void SetOwnerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner); }
1088 uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); }
1089 void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); }
1090 uint64 GetPetGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); }
1091 uint64 GetCharmerGUID() const { return GetUInt64Value(UNIT_FIELD_CHARMEDBY); }
1092 void SetCharmerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_CHARMEDBY, owner); }
1093 uint64 GetCharmGUID() const { return GetUInt64Value(UNIT_FIELD_CHARM); }
1095 uint64 GetCharmerOrOwnerGUID() const { return GetCharmerGUID() ? GetCharmerGUID() : GetOwnerGUID(); }
1096 uint64 GetCharmerOrOwnerOrOwnGUID() const
1098 if(uint64 guid = GetCharmerOrOwnerGUID())
1099 return guid;
1100 return GetGUID();
1102 bool isCharmedOwnedByPlayerOrPlayer() const { return IS_PLAYER_GUID(GetCharmerOrOwnerOrOwnGUID()); }
1104 Player* GetSpellModOwner();
1106 Unit* GetOwner() const;
1107 Pet* GetPet() const;
1108 Unit* GetCharmer() const;
1109 Unit* GetCharm() const;
1110 Unit* GetCharmerOrOwner() const { return GetCharmerGUID() ? GetCharmer() : GetOwner(); }
1111 Unit* GetCharmerOrOwnerOrSelf()
1113 if(Unit* u = GetCharmerOrOwner())
1114 return u;
1116 return this;
1118 Player* GetCharmerOrOwnerPlayerOrPlayerItself();
1119 float GetCombatDistance( const Unit* target ) const;
1121 void SetPet(Pet* pet);
1122 void SetCharm(Unit* pet);
1124 bool isCharmed() const { return GetCharmerGUID() != 0; }
1126 CharmInfo* GetCharmInfo() { return m_charmInfo; }
1127 CharmInfo* InitCharmInfo(Unit* charm);
1129 Pet* CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id = 0);
1131 bool AddAura(Aura *aur);
1133 void RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
1134 void RemoveAura(uint32 spellId, uint32 effindex, Aura* except = NULL);
1135 void RemoveSingleSpellAurasFromStack(uint32 spellId);
1136 void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex);
1137 void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
1138 void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
1139 void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
1140 void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
1141 void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
1142 void RemoveAurasDueToSpellByCancel(uint32 spellId);
1143 void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
1144 void RemoveNotOwnSingleTargetAuras();
1146 void RemoveSpellsCausingAura(AuraType auraType);
1147 void RemoveRankAurasDueToSpell(uint32 spellId);
1148 bool RemoveNoStackAurasDueToAura(Aura *Aur);
1149 void RemoveAurasWithInterruptFlags(uint32 flags);
1150 void RemoveAurasWithDispelType( DispelType type );
1152 void RemoveAllAuras();
1153 void RemoveArenaAuras(bool onleave = false);
1154 void RemoveAllAurasOnDeath();
1155 void DelayAura(uint32 spellId, uint32 effindex, int32 delaytime);
1157 float GetResistanceBuffMods(SpellSchools school, bool positive) const { return GetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school ); }
1158 void SetResistanceBuffMods(SpellSchools school, bool positive, float val) { SetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school,val); }
1159 void ApplyResistanceBuffModsMod(SpellSchools school, bool positive, float val, bool apply) { ApplyModSignedFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school, val, apply); }
1160 void ApplyResistanceBuffModsPercentMod(SpellSchools school, bool positive, float val, bool apply) { ApplyPercentModFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school, val, apply); }
1161 void InitStatBuffMods()
1163 for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(UNIT_FIELD_POSSTAT0+i, 0);
1164 for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(UNIT_FIELD_NEGSTAT0+i, 0);
1166 void ApplyStatBuffMod(Stats stat, float val, bool apply) { ApplyModSignedFloatValue((val > 0 ? UNIT_FIELD_POSSTAT0+stat : UNIT_FIELD_NEGSTAT0+stat), val, apply); }
1167 void ApplyStatPercentBuffMod(Stats stat, float val, bool apply)
1169 ApplyPercentModFloatValue(UNIT_FIELD_POSSTAT0+stat, val, apply);
1170 ApplyPercentModFloatValue(UNIT_FIELD_NEGSTAT0+stat, val, apply);
1172 void SetCreateStat(Stats stat, float val) { m_createStats[stat] = val; }
1173 void SetCreateHealth(uint32 val) { SetUInt32Value(UNIT_FIELD_BASE_HEALTH, val); }
1174 uint32 GetCreateHealth() const { return GetUInt32Value(UNIT_FIELD_BASE_HEALTH); }
1175 void SetCreateMana(uint32 val) { SetUInt32Value(UNIT_FIELD_BASE_MANA, val); }
1176 uint32 GetCreateMana() const { return GetUInt32Value(UNIT_FIELD_BASE_MANA); }
1177 uint32 GetCreatePowers(Powers power) const;
1178 float GetPosStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_POSSTAT0+stat); }
1179 float GetNegStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_NEGSTAT0+stat); }
1180 float GetCreateStat(Stats stat) const { return m_createStats[stat]; }
1182 void SetCurrentCastedSpell(Spell * pSpell);
1183 virtual void ProhibitSpellScholl(SpellSchoolMask /*idSchoolMask*/, uint32 /*unTimeMs*/ ) { }
1184 void InterruptSpell(uint32 spellType, bool withDelayed = true);
1186 // set withDelayed to true to account delayed spells as casted
1187 // delayed+channeled spells are always accounted as casted
1188 // we can skip channeled or delayed checks using flags
1189 bool IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled = false, bool skipAutorepeat = false) const;
1191 // set withDelayed to true to interrupt delayed spells too
1192 // delayed+channeled spells are always interrupted
1193 void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid = 0);
1195 Spell* FindCurrentSpellBySpellId(uint32 spell_id) const;
1197 Spell* m_currentSpells[CURRENT_MAX_SPELL];
1199 uint32 m_addDmgOnce;
1200 uint64 m_TotemSlot[MAX_TOTEM];
1201 uint64 m_ObjectSlot[4];
1202 uint32 m_detectInvisibilityMask;
1203 uint32 m_invisibilityMask;
1205 uint32 m_ShapeShiftFormSpellId;
1206 ShapeshiftForm m_form;
1207 bool IsInFeralForm() const { return m_form == FORM_CAT || m_form == FORM_BEAR || m_form == FORM_DIREBEAR; }
1209 float m_modMeleeHitChance;
1210 float m_modRangedHitChance;
1211 float m_modSpellHitChance;
1212 int32 m_baseSpellCritChance;
1214 float m_threatModifier[MAX_SPELL_SCHOOL];
1215 float m_modAttackSpeedPct[3];
1217 // Event handler
1218 EventProcessor m_Events;
1220 // stat system
1221 bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply);
1222 void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value) { m_auraModifiersGroup[unitMod][modifierType] = value; }
1223 float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const;
1224 float GetTotalStatValue(Stats stat) const;
1225 float GetTotalAuraModValue(UnitMods unitMod) const;
1226 SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const;
1227 Stats GetStatByAuraGroup(UnitMods unitMod) const;
1228 Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const;
1229 bool CanModifyStats() const { return m_canModifyStats; }
1230 void SetCanModifyStats(bool modifyStats) { m_canModifyStats = modifyStats; }
1231 virtual bool UpdateStats(Stats stat) = 0;
1232 virtual bool UpdateAllStats() = 0;
1233 virtual void UpdateResistances(uint32 school) = 0;
1234 virtual void UpdateArmor() = 0;
1235 virtual void UpdateMaxHealth() = 0;
1236 virtual void UpdateMaxPower(Powers power) = 0;
1237 virtual void UpdateAttackPowerAndDamage(bool ranged = false) = 0;
1238 virtual void UpdateDamagePhysical(WeaponAttackType attType) = 0;
1239 float GetTotalAttackPowerValue(WeaponAttackType attType) const;
1240 float GetWeaponDamageRange(WeaponAttackType attType ,WeaponDamageRange type) const;
1241 void SetBaseWeaponDamage(WeaponAttackType attType ,WeaponDamageRange damageRange, float value) { m_weaponDamage[attType][damageRange] = value; }
1243 bool isInFront(Unit const* target,float distance, float arc = M_PI) const;
1244 void SetInFront(Unit const* target);
1245 bool isInBack(Unit const* target, float distance, float arc = M_PI) const;
1247 // Visibility system
1248 UnitVisibility GetVisibility() const { return m_Visibility; }
1249 void SetVisibility(UnitVisibility x);
1251 // common function for visibility checks for player/creatures with detection code
1252 bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
1253 bool canDetectInvisibilityOf(Unit const* u) const;
1254 void SetPhaseMask(uint32 newPhaseMask, bool update);// overwrite WorldObject::SetPhaseMask
1256 // virtual functions for all world objects types
1257 bool isVisibleForInState(Player const* u, bool inVisibleList) const;
1258 // function for low level grid visibility checks in player/creature cases
1259 virtual bool IsVisibleInGridForPlayer(Player* pl) const = 0;
1261 AuraList & GetSingleCastAuras() { return m_scAuras; }
1262 AuraList const& GetSingleCastAuras() const { return m_scAuras; }
1263 SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY];
1265 // Threat related methods
1266 bool CanHaveThreatList() const;
1267 void AddThreat(Unit* pVictim, float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellEntry const *threatSpell = NULL);
1268 float ApplyTotalThreatModifier(float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL);
1269 void DeleteThreatList();
1270 bool SelectHostilTarget();
1271 void TauntApply(Unit* pVictim);
1272 void TauntFadeOut(Unit *taunter);
1273 ThreatManager& getThreatManager() { return m_ThreatManager; }
1274 void addHatedBy(HostilReference* pHostilReference) { m_HostilRefManager.insertFirst(pHostilReference); };
1275 void removeHatedBy(HostilReference* /*pHostilReference*/ ) { /* nothing to do yet */ }
1276 HostilRefManager& getHostilRefManager() { return m_HostilRefManager; }
1278 uint32 GetVisibleAura(uint8 slot)
1280 VisibleAuraMap::const_iterator itr = m_visibleAuras.find(slot);
1281 if(itr != m_visibleAuras.end())
1282 return itr->second;
1283 return 0;
1285 void SetVisibleAura(uint8 slot, uint32 spellid)
1287 if(spellid == 0)
1288 m_visibleAuras.erase(slot);
1289 else
1290 m_visibleAuras[slot] = spellid;
1292 VisibleAuraMap const *GetVisibleAuras() { return &m_visibleAuras; }
1293 uint8 GetVisibleAurasCount() { return m_visibleAuras.size(); }
1295 Aura* GetAura(uint32 spellId, uint32 effindex);
1296 Aura* GetAura(AuraType type, uint32 family, uint64 familyFlag, uint32 familyFlag2 = 0, uint64 casterGUID = 0);
1298 AuraMap & GetAuras() { return m_Auras; }
1299 AuraMap const& GetAuras() const { return m_Auras; }
1300 AuraList const& GetAurasByType(AuraType type) const { return m_modAuras[type]; }
1301 void ApplyAuraProcTriggerDamage(Aura* aura, bool apply);
1303 int32 GetTotalAuraModifier(AuraType auratype) const;
1304 float GetTotalAuraMultiplier(AuraType auratype) const;
1305 int32 GetMaxPositiveAuraModifier(AuraType auratype) const;
1306 int32 GetMaxNegativeAuraModifier(AuraType auratype) const;
1308 int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1309 float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1310 int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1311 int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1313 int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1314 float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const;
1315 int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1316 int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1318 Aura* GetDummyAura(uint32 spell_id) const;
1320 uint32 GetDisplayId() { return GetUInt32Value(UNIT_FIELD_DISPLAYID); }
1321 void SetDisplayId(uint32 modelId);
1322 uint32 GetNativeDisplayId() { return GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID); }
1323 void SetNativeDisplayId(uint32 modelId) { SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, modelId); }
1324 void setTransForm(uint32 spellid) { m_transform = spellid;}
1325 uint32 getTransForm() const { return m_transform;}
1327 DynamicObject* GetDynObject(uint32 spellId, uint32 effIndex);
1328 DynamicObject* GetDynObject(uint32 spellId);
1329 void AddDynObject(DynamicObject* dynObj);
1330 void RemoveDynObject(uint32 spellid);
1331 void RemoveDynObjectWithGUID(uint64 guid) { m_dynObjGUIDs.remove(guid); }
1332 void RemoveAllDynObjects();
1334 GameObject* GetGameObject(uint32 spellId) const;
1335 void AddGameObject(GameObject* gameObj);
1336 void RemoveGameObject(GameObject* gameObj, bool del);
1337 void RemoveGameObject(uint32 spellid, bool del);
1338 void RemoveAllGameObjects();
1340 uint32 CalculateDamage(WeaponAttackType attType, bool normalized);
1341 float GetAPMultiplier(WeaponAttackType attType, bool normalized);
1342 void ModifyAuraState(AuraState flag, bool apply);
1343 bool HasAuraState(AuraState flag) const { return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)); }
1344 void UnsummonAllTotems();
1345 Unit* SelectMagnetTarget(Unit *victim, SpellEntry const *spellInfo = NULL);
1346 int32 SpellBaseDamageBonus(SpellSchoolMask schoolMask);
1347 int32 SpellBaseHealingBonus(SpellSchoolMask schoolMask);
1348 int32 SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
1349 int32 SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
1350 uint32 SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 damage, DamageEffectType damagetype, uint32 stack = 1);
1351 uint32 SpellHealingBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack = 1);
1352 bool isSpellBlocked(Unit *pVictim, SpellEntry const *spellProto, WeaponAttackType attackType = BASE_ATTACK);
1353 bool isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType = BASE_ATTACK);
1354 uint32 SpellCriticalDamageBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
1355 uint32 SpellCriticalHealingBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
1357 void SetLastManaUse(uint32 spellCastTime) { m_lastManaUse = spellCastTime; }
1358 bool IsUnderLastManaUseEffect() const;
1360 void SetContestedPvP(Player *attackedPlayer = NULL);
1362 void MeleeDamageBonus(Unit *pVictim, uint32 *damage, WeaponAttackType attType, SpellEntry const *spellProto = NULL);
1363 uint32 GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectType damagetype, uint32 CastingTime );
1365 void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply);
1366 void ApplySpellDispelImmunity(const SpellEntry * spellProto, DispelType type, bool apply);
1367 virtual bool IsImmunedToSpell(SpellEntry const* spellInfo);
1368 // redefined in Creature
1369 bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask);
1370 virtual bool IsImmunedToSpellEffect(SpellEntry const* spellInfo, uint32 index) const;
1371 // redefined in Creature
1373 uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage);
1374 void CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist);
1376 void UpdateSpeed(UnitMoveType mtype, bool forced);
1377 float GetSpeed( UnitMoveType mtype ) const;
1378 float GetSpeedRate( UnitMoveType mtype ) const { return m_speed_rate[mtype]; }
1379 void SetSpeed(UnitMoveType mtype, float rate, bool forced = false);
1381 void SetHover(bool on);
1382 bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); }
1384 void _RemoveAllAuraMods();
1385 void _ApplyAllAuraMods();
1387 int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 basePoints, Unit const* target);
1388 int32 CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target);
1389 float CalculateLevelPenalty(SpellEntry const* spellProto) const;
1391 void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }
1392 void removeFollower(FollowerReference* /*pRef*/ ) { /* nothing to do yet */ }
1393 static Unit* GetUnit(WorldObject& object, uint64 guid);
1395 MotionMaster* GetMotionMaster() { return &i_motionMaster; }
1397 bool IsStopped() const { return !(hasUnitState(UNIT_STAT_MOVING)); }
1398 void StopMoving();
1400 void AddUnitMovementFlag(uint32 f) { m_unit_movement_flags |= f; }
1401 void RemoveUnitMovementFlag(uint32 f)
1403 uint32 oldval = m_unit_movement_flags;
1404 m_unit_movement_flags = oldval & ~f;
1406 uint32 HasUnitMovementFlag(uint32 f) const { return m_unit_movement_flags & f; }
1407 uint32 GetUnitMovementFlags() const { return m_unit_movement_flags; }
1408 void SetUnitMovementFlags(uint32 f) { m_unit_movement_flags = f; }
1410 void SetFeared(bool apply, uint64 casterGUID = 0, uint32 spellID = 0);
1411 void SetConfused(bool apply, uint64 casterGUID = 0, uint32 spellID = 0);
1413 void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); }
1414 void RemoveComboPointHolder(uint32 lowguid) { m_ComboPointHolders.erase(lowguid); }
1415 void ClearComboPointHolders();
1417 ///----------Pet responses methods-----------------
1418 void SendPetCastFail(uint32 spellid, SpellCastResult msg);
1419 void SendPetActionFeedback (uint8 msg);
1420 void SendPetTalk (uint32 pettalk);
1421 void SendPetSpellCooldown (uint32 spellid, time_t cooltime);
1422 void SendPetClearCooldown (uint32 spellid);
1423 void SendPetAIReaction(uint64 guid);
1424 ///----------End of Pet responses methods----------
1426 void propagateSpeedChange() { GetMotionMaster()->propagateSpeedChange(); }
1428 // reactive attacks
1429 void ClearAllReactives();
1430 void StartReactiveTimer( ReactiveType reactive ) { m_reactiveTimer[reactive] = REACTIVE_TIMER_START;}
1431 void UpdateReactives(uint32 p_time);
1433 // group updates
1434 void UpdateAuraForGroup(uint8 slot);
1436 // pet auras
1437 typedef std::set<PetAura const*> PetAuraSet;
1438 PetAuraSet m_petAuras;
1439 void AddPetAura(PetAura const* petSpell);
1440 void RemovePetAura(PetAura const* petSpell);
1442 protected:
1443 explicit Unit ();
1445 void _UpdateSpells(uint32 time);
1447 void _UpdateAutoRepeatSpell();
1448 bool m_AutoRepeatFirstCast;
1450 uint32 m_attackTimer[MAX_ATTACK];
1452 float m_createStats[MAX_STATS];
1454 AttackerSet m_attackers;
1455 Unit* m_attacking;
1457 DeathState m_deathState;
1459 AuraMap m_Auras;
1461 std::list<Aura *> m_scAuras; // casted singlecast auras
1463 typedef std::list<uint64> DynObjectGUIDs;
1464 DynObjectGUIDs m_dynObjGUIDs;
1466 typedef std::list<GameObject*> GameObjectList;
1467 GameObjectList m_gameObj;
1468 bool m_isSorted;
1469 uint32 m_transform;
1470 uint32 m_removedAuras;
1472 AuraList m_modAuras[TOTAL_AURAS];
1473 float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END];
1474 float m_weaponDamage[MAX_ATTACK][2];
1475 bool m_canModifyStats;
1476 //std::list< spellEffectPair > AuraSpells[TOTAL_AURAS]; // TODO: use this if ok for mem
1477 VisibleAuraMap m_visibleAuras;
1479 float m_speed_rate[MAX_MOVE_TYPE];
1481 CharmInfo *m_charmInfo;
1483 virtual SpellSchoolMask GetMeleeDamageSchoolMask() const;
1485 MotionMaster i_motionMaster;
1486 uint32 m_unit_movement_flags;
1488 uint32 m_reactiveTimer[MAX_REACTIVE];
1489 uint32 m_regenTimer;
1491 private:
1492 void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
1493 void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
1495 bool IsTriggeredAtSpellProcEvent(Unit *pVictim, Aura* aura, SpellEntry const* procSpell, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const*& spellProcEvent );
1496 bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
1497 bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
1498 bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown);
1499 bool HandleOverrideClassScriptAuraProc(Unit *pVictim, uint32 damage, Aura* triggredByAura, SpellEntry const *procSpell, uint32 cooldown);
1500 bool HandleMeandingAuraProc(Aura* triggeredByAura);
1502 uint32 m_state; // Even derived shouldn't modify
1503 uint32 m_CombatTimer;
1504 uint32 m_lastManaUse; // msecs
1506 UnitVisibility m_Visibility;
1508 Diminishing m_Diminishing;
1509 // Manage all Units threatening us
1510 ThreatManager m_ThreatManager;
1511 // Manage all Units that are threatened by us
1512 HostilRefManager m_HostilRefManager;
1514 FollowerRefManager m_FollowingRefManager;
1516 ComboPointHolderSet m_ComboPointHolders;
1518 #endif