[6922] Whitespace and newline fixes
[getmangos.git] / src / game / Unit.h
blobc0c1753b4f00132445a9177bad65f8a9af4cbcad
1 /*
2 * Copyright (C) 2005-2008 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 "Database/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_TURNING = 0x10 // not turning - maybe _complete_ interrupt on direct damage?
46 enum SpellChannelInterruptFlags
48 CHANNEL_FLAG_DAMAGE = 0x0002,
49 CHANNEL_FLAG_MOVEMENT = 0x0008,
50 CHANNEL_FLAG_TURNING = 0x0010,
51 CHANNEL_FLAG_DAMAGE2 = 0x0080,
52 CHANNEL_FLAG_DELAY = 0x4000
55 enum SpellAuraInterruptFlags
57 AURA_INTERRUPT_FLAG_UNK0 = 0x00000001, // 0 removed when getting hit by a negative spell?
58 AURA_INTERRUPT_FLAG_DAMAGE = 0x00000002, // 1 removed by any damage
59 AURA_INTERRUPT_FLAG_UNK2 = 0x00000004, // 2
60 AURA_INTERRUPT_FLAG_MOVE = 0x00000008, // 3 removed by any movement
61 AURA_INTERRUPT_FLAG_TURNING = 0x00000010, // 4 removed by any turning
62 AURA_INTERRUPT_FLAG_ENTER_COMBAT = 0x00000020, // 5 removed by entering combat
63 AURA_INTERRUPT_FLAG_NOT_MOUNTED = 0x00000040, // 6 removed by unmounting
64 AURA_INTERRUPT_FLAG_NOT_ABOVEWATER = 0x00000080, // 7 removed by entering water
65 AURA_INTERRUPT_FLAG_NOT_UNDERWATER = 0x00000100, // 8 removed by leaving water
66 AURA_INTERRUPT_FLAG_NOT_SHEATHED = 0x00000200, // 9 removed by unsheathing
67 AURA_INTERRUPT_FLAG_UNK10 = 0x00000400, // 10
68 AURA_INTERRUPT_FLAG_UNK11 = 0x00000800, // 11
69 AURA_INTERRUPT_FLAG_UNK12 = 0x00001000, // 12 removed by attack?
70 AURA_INTERRUPT_FLAG_UNK13 = 0x00002000, // 13
71 AURA_INTERRUPT_FLAG_UNK14 = 0x00004000, // 14
72 AURA_INTERRUPT_FLAG_UNK15 = 0x00008000, // 15 removed by casting a spell?
73 AURA_INTERRUPT_FLAG_UNK16 = 0x00010000, // 16
74 AURA_INTERRUPT_FLAG_MOUNTING = 0x00020000, // 17 removed by mounting
75 AURA_INTERRUPT_FLAG_NOT_SEATED = 0x00040000, // 18 removed by standing up
76 AURA_INTERRUPT_FLAG_CHANGE_MAP = 0x00080000, // 19 leaving map/getting teleported
77 AURA_INTERRUPT_FLAG_UNK20 = 0x00100000, // 20
78 AURA_INTERRUPT_FLAG_UNK21 = 0x00200000, // 21
79 AURA_INTERRUPT_FLAG_UNK22 = 0x00400000, // 22
80 AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT = 0x00800000, // 23 removed by entering pvp combat
81 AURA_INTERRUPT_FLAG_DIRECT_DAMAGE = 0x01000000 // 24 removed by any direct damage
84 enum SpellModOp
86 SPELLMOD_DAMAGE = 0,
87 SPELLMOD_DURATION = 1,
88 SPELLMOD_THREAT = 2,
89 SPELLMOD_EFFECT1 = 3,
90 SPELLMOD_CHARGES = 4,
91 SPELLMOD_RANGE = 5,
92 SPELLMOD_RADIUS = 6,
93 SPELLMOD_CRITICAL_CHANCE = 7,
94 SPELLMOD_ALL_EFFECTS = 8,
95 SPELLMOD_NOT_LOSE_CASTING_TIME = 9,
96 SPELLMOD_CASTING_TIME = 10,
97 SPELLMOD_COOLDOWN = 11,
98 SPELLMOD_EFFECT2 = 12,
99 // spellmod 13 unused
100 SPELLMOD_COST = 14,
101 SPELLMOD_CRIT_DAMAGE_BONUS = 15,
102 SPELLMOD_RESIST_MISS_CHANCE = 16,
103 SPELLMOD_JUMP_TARGETS = 17,
104 SPELLMOD_CHANCE_OF_SUCCESS = 18,
105 SPELLMOD_ACTIVATION_TIME = 19,
106 SPELLMOD_EFFECT_PAST_FIRST = 20,
107 SPELLMOD_CASTING_TIME_OLD = 21,
108 SPELLMOD_DOT = 22,
109 SPELLMOD_EFFECT3 = 23,
110 SPELLMOD_SPELL_BONUS_DAMAGE = 24,
111 // spellmod 25, 26 unused
112 SPELLMOD_MULTIPLE_VALUE = 27,
113 SPELLMOD_RESIST_DISPEL_CHANCE = 28
116 #define MAX_SPELLMOD 32
118 enum SpellFacingFlags
120 SPELL_FACING_FLAG_INFRONT = 0x0001
123 #define BASE_MINDAMAGE 1.0f
124 #define BASE_MAXDAMAGE 2.0f
125 #define BASE_ATTACK_TIME 2000
127 // high byte (3 from 0..3) of UNIT_FIELD_BYTES_2
128 enum ShapeshiftForm
130 FORM_NONE = 0x00,
131 FORM_CAT = 0x01,
132 FORM_TREE = 0x02,
133 FORM_TRAVEL = 0x03,
134 FORM_AQUA = 0x04,
135 FORM_BEAR = 0x05,
136 FORM_AMBIENT = 0x06,
137 FORM_GHOUL = 0x07,
138 FORM_DIREBEAR = 0x08,
139 FORM_CREATUREBEAR = 0x0E,
140 FORM_CREATURECAT = 0x0F,
141 FORM_GHOSTWOLF = 0x10,
142 FORM_BATTLESTANCE = 0x11,
143 FORM_DEFENSIVESTANCE = 0x12,
144 FORM_BERSERKERSTANCE = 0x13,
145 FORM_TEST = 0x14,
146 FORM_ZOMBIE = 0x15,
147 FORM_FLIGHT_EPIC = 0x1B,
148 FORM_SHADOW = 0x1C,
149 FORM_FLIGHT = 0x1D,
150 FORM_STEALTH = 0x1E,
151 FORM_MOONKIN = 0x1F,
152 FORM_SPIRITOFREDEMPTION = 0x20
155 // low byte ( 0 from 0..3 ) of UNIT_FIELD_BYTES_2
156 enum SheathState
158 SHEATH_STATE_UNARMED = 0, // non prepared weapon
159 SHEATH_STATE_MELEE = 1, // prepared melee weapon
160 SHEATH_STATE_RANGED = 2 // prepared ranged weapon
163 // byte (1 from 0..3) of UNIT_FIELD_BYTES_2
164 enum UnitBytes2_Flags
166 UNIT_BYTE2_FLAG_UNK0 = 0x01,
167 UNIT_BYTE2_FLAG_UNK1 = 0x02,
168 UNIT_BYTE2_FLAG_UNK2 = 0x04,
169 UNIT_BYTE2_FLAG_UNK3 = 0x08,
170 UNIT_BYTE2_FLAG_AURAS = 0x10, // show possitive auras as positive, and allow its dispel
171 UNIT_BYTE2_FLAG_UNK5 = 0x20,
172 UNIT_BYTE2_FLAG_UNK6 = 0x40,
173 UNIT_BYTE2_FLAG_UNK7 = 0x80
176 // byte (2 from 0..3) of UNIT_FIELD_BYTES_2
177 enum UnitRename
179 UNIT_RENAME_NOT_ALLOWED = 0x02,
180 UNIT_RENAME_ALLOWED = 0x03
183 #define CREATURE_MAX_SPELLS 4
185 enum Swing
187 NOSWING = 0,
188 SINGLEHANDEDSWING = 1,
189 TWOHANDEDSWING = 2
192 enum VictimState
194 VICTIMSTATE_UNKNOWN1 = 0,
195 VICTIMSTATE_NORMAL = 1,
196 VICTIMSTATE_DODGE = 2,
197 VICTIMSTATE_PARRY = 3,
198 VICTIMSTATE_INTERRUPT = 4,
199 VICTIMSTATE_BLOCKS = 5,
200 VICTIMSTATE_EVADES = 6,
201 VICTIMSTATE_IS_IMMUNE = 7,
202 VICTIMSTATE_DEFLECTS = 8
205 enum HitInfo
207 HITINFO_NORMALSWING = 0x00000000,
208 HITINFO_UNK1 = 0x00000001, // req correct packet structure
209 HITINFO_NORMALSWING2 = 0x00000002,
210 HITINFO_LEFTSWING = 0x00000004,
211 HITINFO_MISS = 0x00000010,
212 HITINFO_ABSORB = 0x00000020, // plays absorb sound
213 HITINFO_RESIST = 0x00000040, // resisted atleast some damage
214 HITINFO_CRITICALHIT = 0x00000080,
215 HITINFO_UNK2 = 0x00000100, // wotlk?
216 HITINFO_UNK3 = 0x00002000, // wotlk?
217 HITINFO_GLANCING = 0x00004000,
218 HITINFO_CRUSHING = 0x00008000,
219 HITINFO_NOACTION = 0x00010000,
220 HITINFO_SWINGNOHITSOUND = 0x00080000
223 //i would like to remove this: (it is defined in item.h
224 enum InventorySlot
226 NULL_BAG = 0,
227 NULL_SLOT = 255
230 struct FactionTemplateEntry;
231 struct Modifier;
232 struct SpellEntry;
233 struct SpellEntryExt;
235 class Aura;
236 class Creature;
237 class Spell;
238 class DynamicObject;
239 class GameObject;
240 class Item;
241 class Pet;
242 class Path;
243 class PetAura;
245 struct SpellImmune
247 uint32 type;
248 uint32 spellId;
251 typedef std::list<SpellImmune> SpellImmuneList;
253 enum UnitModifierType
255 BASE_VALUE = 0,
256 BASE_PCT = 1,
257 TOTAL_VALUE = 2,
258 TOTAL_PCT = 3,
259 MODIFIER_TYPE_END = 4
262 enum WeaponDamageRange
264 MINDAMAGE,
265 MAXDAMAGE
268 enum DamageTypeToSchool
270 RESISTANCE,
271 DAMAGE_DEALT,
272 DAMAGE_TAKEN
275 enum AuraRemoveMode
277 AURA_REMOVE_BY_DEFAULT,
278 AURA_REMOVE_BY_STACK, // at replace by semillar aura
279 AURA_REMOVE_BY_CANCEL,
280 AURA_REMOVE_BY_DISPEL,
281 AURA_REMOVE_BY_DEATH
284 enum UnitMods
286 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.
287 UNIT_MOD_STAT_AGILITY,
288 UNIT_MOD_STAT_STAMINA,
289 UNIT_MOD_STAT_INTELLECT,
290 UNIT_MOD_STAT_SPIRIT,
291 UNIT_MOD_HEALTH,
292 UNIT_MOD_MANA, // UNIT_MOD_MANA..UNIT_MOD_HAPPINESS must be in existed order, it's accessed by index values of Powers enum.
293 UNIT_MOD_RAGE,
294 UNIT_MOD_FOCUS,
295 UNIT_MOD_ENERGY,
296 UNIT_MOD_HAPPINESS,
297 UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
298 UNIT_MOD_RESISTANCE_HOLY,
299 UNIT_MOD_RESISTANCE_FIRE,
300 UNIT_MOD_RESISTANCE_NATURE,
301 UNIT_MOD_RESISTANCE_FROST,
302 UNIT_MOD_RESISTANCE_SHADOW,
303 UNIT_MOD_RESISTANCE_ARCANE,
304 UNIT_MOD_ATTACK_POWER,
305 UNIT_MOD_ATTACK_POWER_RANGED,
306 UNIT_MOD_DAMAGE_MAINHAND,
307 UNIT_MOD_DAMAGE_OFFHAND,
308 UNIT_MOD_DAMAGE_RANGED,
309 UNIT_MOD_END,
310 // synonyms
311 UNIT_MOD_STAT_START = UNIT_MOD_STAT_STRENGTH,
312 UNIT_MOD_STAT_END = UNIT_MOD_STAT_SPIRIT + 1,
313 UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
314 UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
315 UNIT_MOD_POWER_START = UNIT_MOD_MANA,
316 UNIT_MOD_POWER_END = UNIT_MOD_HAPPINESS + 1
319 enum BaseModGroup
321 CRIT_PERCENTAGE,
322 RANGED_CRIT_PERCENTAGE,
323 OFFHAND_CRIT_PERCENTAGE,
324 SHIELD_BLOCK_VALUE,
325 BASEMOD_END
328 enum BaseModType
330 FLAT_MOD,
331 PCT_MOD
334 #define MOD_END (PCT_MOD+1)
336 enum DeathState
338 ALIVE = 0,
339 JUST_DIED = 1,
340 CORPSE = 2,
341 DEAD = 3,
342 JUST_ALIVED = 4,
343 DEAD_FALLING= 5
346 enum UnitState
348 UNIT_STAT_DIED = 0x0001,
349 UNIT_STAT_MELEE_ATTACKING = 0x0002, // player is melee attacking someone
350 //UNIT_STAT_MELEE_ATTACK_BY = 0x0004, // player is melee attack by someone
351 UNIT_STAT_STUNNED = 0x0008,
352 UNIT_STAT_ROAMING = 0x0010,
353 UNIT_STAT_CHASE = 0x0020,
354 UNIT_STAT_SEARCHING = 0x0040,
355 UNIT_STAT_FLEEING = 0x0080,
356 UNIT_STAT_MOVING = (UNIT_STAT_ROAMING | UNIT_STAT_CHASE | UNIT_STAT_SEARCHING | UNIT_STAT_FLEEING),
357 UNIT_STAT_IN_FLIGHT = 0x0100, // player is in flight mode
358 UNIT_STAT_FOLLOW = 0x0200,
359 UNIT_STAT_ROOT = 0x0400,
360 UNIT_STAT_CONFUSED = 0x0800,
361 UNIT_STAT_DISTRACTED = 0x1000,
362 UNIT_STAT_ISOLATED = 0x2000, // area auras do not affect other players
363 UNIT_STAT_ATTACK_PLAYER = 0x4000,
364 UNIT_STAT_ALL_STATE = 0xffff //(UNIT_STAT_STOPPED | UNIT_STAT_MOVING | UNIT_STAT_IN_COMBAT | UNIT_STAT_IN_FLIGHT)
367 enum UnitMoveType
369 MOVE_WALK = 0,
370 MOVE_RUN = 1,
371 MOVE_RUN_BACK = 2,
372 MOVE_SWIM = 3,
373 MOVE_SWIM_BACK = 4,
374 MOVE_TURN_RATE = 5,
375 MOVE_FLIGHT = 6,
376 MOVE_FLIGHT_BACK = 7,
379 #define MAX_MOVE_TYPE 8
381 extern float baseMoveSpeed[MAX_MOVE_TYPE];
383 enum WeaponAttackType
385 BASE_ATTACK = 0,
386 OFF_ATTACK = 1,
387 RANGED_ATTACK = 2
390 #define MAX_ATTACK 3
392 enum CombatRating
394 CR_WEAPON_SKILL = 0,
395 CR_DEFENSE_SKILL = 1,
396 CR_DODGE = 2,
397 CR_PARRY = 3,
398 CR_BLOCK = 4,
399 CR_HIT_MELEE = 5,
400 CR_HIT_RANGED = 6,
401 CR_HIT_SPELL = 7,
402 CR_CRIT_MELEE = 8,
403 CR_CRIT_RANGED = 9,
404 CR_CRIT_SPELL = 10,
405 CR_HIT_TAKEN_MELEE = 11,
406 CR_HIT_TAKEN_RANGED = 12,
407 CR_HIT_TAKEN_SPELL = 13,
408 CR_CRIT_TAKEN_MELEE = 14,
409 CR_CRIT_TAKEN_RANGED = 15,
410 CR_CRIT_TAKEN_SPELL = 16,
411 CR_HASTE_MELEE = 17,
412 CR_HASTE_RANGED = 18,
413 CR_HASTE_SPELL = 19,
414 CR_WEAPON_SKILL_MAINHAND = 20,
415 CR_WEAPON_SKILL_OFFHAND = 21,
416 CR_WEAPON_SKILL_RANGED = 22,
417 CR_EXPERTISE = 23
420 #define MAX_COMBAT_RATING 24
422 enum DamageEffectType
424 DIRECT_DAMAGE = 0, // used for normal weapon damage (not for class abilities or spells)
425 SPELL_DIRECT_DAMAGE = 1, // spell/class abilities damage
426 DOT = 2,
427 HEAL = 3,
428 NODAMAGE = 4, // used also in case when damage applied to health but not applied to spell channelInterruptFlags/etc
429 SELF_DAMAGE = 5
432 enum UnitVisibility
434 VISIBILITY_OFF = 0, // absolute, not detectable, GM-like, can see all other
435 VISIBILITY_ON = 1,
436 VISIBILITY_GROUP_STEALTH = 2, // detect chance, seen and can see group members
437 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)
438 VISIBILITY_GROUP_NO_DETECT = 4, // state just at stealth apply for update Grid state. Don't remove, otherwise stealth spells will break
439 VISIBILITY_RESPAWN = 5 // special totally not detectable visibility for force delete object at respawn command
442 // Value masks for UNIT_FIELD_FLAGS
443 enum UnitFlags
445 UNIT_FLAG_UNKNOWN7 = 0x00000001,
446 UNIT_FLAG_NON_ATTACKABLE = 0x00000002, // not attackable
447 UNIT_FLAG_DISABLE_MOVE = 0x00000004,
448 UNIT_FLAG_PVP_ATTACKABLE = 0x00000008, // allow apply pvp rules to attackable state in addition to faction dependent state
449 UNIT_FLAG_RENAME = 0x00000010,
450 UNIT_FLAG_PREPARATION = 0x00000020, // don't take reagents for spells with SPELL_ATTR_EX5_NO_REAGENT_WHILE_PREP
451 UNIT_FLAG_UNKNOWN9 = 0x00000040,
452 UNIT_FLAG_NOT_ATTACKABLE_1 = 0x00000080, // ?? (UNIT_FLAG_PVP_ATTACKABLE | UNIT_FLAG_NOT_ATTACKABLE_1) is NON_PVP_ATTACKABLE
453 UNIT_FLAG_UNKNOWN2 = 0x00000100, // 2.0.8
454 UNIT_FLAG_UNKNOWN11 = 0x00000200,
455 UNIT_FLAG_LOOTING = 0x00000400, // loot animation
456 UNIT_FLAG_PET_IN_COMBAT = 0x00000800, // in combat?, 2.0.8
457 UNIT_FLAG_PVP = 0x00001000,
458 UNIT_FLAG_SILENCED = 0x00002000, // silenced, 2.1.1
459 UNIT_FLAG_UNKNOWN4 = 0x00004000, // 2.0.8
460 UNIT_FLAG_UNKNOWN13 = 0x00008000,
461 UNIT_FLAG_UNKNOWN14 = 0x00010000,
462 UNIT_FLAG_PACIFIED = 0x00020000,
463 UNIT_FLAG_DISABLE_ROTATE = 0x00040000, // stunned, 2.1.1
464 UNIT_FLAG_IN_COMBAT = 0x00080000,
465 UNIT_FLAG_TAXI_FLIGHT = 0x00100000, // disable casting at client side spell not allowed by taxi flight (mounted?), probably used with 0x4 flag
466 UNIT_FLAG_DISARMED = 0x00200000, // disable melee spells casting..., "Required melee weapon" added to melee spells tooltip.
467 UNIT_FLAG_CONFUSED = 0x00400000,
468 UNIT_FLAG_FLEEING = 0x00800000,
469 UNIT_FLAG_UNKNOWN5 = 0x01000000, // used in spell Eyes of the Beast for pet...
470 UNIT_FLAG_NOT_SELECTABLE = 0x02000000,
471 UNIT_FLAG_SKINNABLE = 0x04000000,
472 UNIT_FLAG_MOUNT = 0x08000000,
473 UNIT_FLAG_UNKNOWN17 = 0x10000000,
474 UNIT_FLAG_UNKNOWN6 = 0x20000000, // used in Feing Death spell
475 UNIT_FLAG_SHEATHE = 0x40000000
478 // Value masks for UNIT_FIELD_FLAGS_2
479 enum UnitFlags2
481 UNIT_FLAG2_FEIGN_DEATH = 0x00000001,
482 UNIT_FLAG2_COMPREHEND_LANG= 0x00000008,
483 UNIT_FLAG2_FORCE_MOVE = 0x00000040
486 /// Non Player Character flags
487 enum NPCFlags
489 UNIT_NPC_FLAG_NONE = 0x00000000,
490 UNIT_NPC_FLAG_GOSSIP = 0x00000001, // 100%
491 UNIT_NPC_FLAG_QUESTGIVER = 0x00000002, // guessed, probably ok
492 UNIT_NPC_FLAG_UNK1 = 0x00000004,
493 UNIT_NPC_FLAG_UNK2 = 0x00000008,
494 UNIT_NPC_FLAG_TRAINER = 0x00000010, // 100%
495 UNIT_NPC_FLAG_TRAINER_CLASS = 0x00000020, // 100%
496 UNIT_NPC_FLAG_TRAINER_PROFESSION = 0x00000040, // 100%
497 UNIT_NPC_FLAG_VENDOR = 0x00000080, // 100%
498 UNIT_NPC_FLAG_VENDOR_AMMO = 0x00000100, // 100%, general goods vendor
499 UNIT_NPC_FLAG_VENDOR_FOOD = 0x00000200, // 100%
500 UNIT_NPC_FLAG_VENDOR_POISON = 0x00000400, // guessed
501 UNIT_NPC_FLAG_VENDOR_REAGENT = 0x00000800, // 100%
502 UNIT_NPC_FLAG_REPAIR = 0x00001000, // 100%
503 UNIT_NPC_FLAG_FLIGHTMASTER = 0x00002000, // 100%
504 UNIT_NPC_FLAG_SPIRITHEALER = 0x00004000, // guessed
505 UNIT_NPC_FLAG_SPIRITGUIDE = 0x00008000, // guessed
506 UNIT_NPC_FLAG_INNKEEPER = 0x00010000, // 100%
507 UNIT_NPC_FLAG_BANKER = 0x00020000, // 100%
508 UNIT_NPC_FLAG_PETITIONER = 0x00040000, // 100% 0xC0000 = guild petitions, 0x40000 = arena team petitions
509 UNIT_NPC_FLAG_TABARDDESIGNER = 0x00080000, // 100%
510 UNIT_NPC_FLAG_BATTLEMASTER = 0x00100000, // 100%
511 UNIT_NPC_FLAG_AUCTIONEER = 0x00200000, // 100%
512 UNIT_NPC_FLAG_STABLEMASTER = 0x00400000, // 100%
513 UNIT_NPC_FLAG_GUILD_BANKER = 0x00800000, // cause client to send 997 opcode
514 UNIT_NPC_FLAG_SPELLCLICK = 0x01000000, // cause client to send 1015 opcode (spell click)
515 UNIT_NPC_FLAG_GUARD = 0x10000000, // custom flag for guards
518 enum MovementFlags
520 MOVEMENTFLAG_NONE = 0x00000000,
521 MOVEMENTFLAG_FORWARD = 0x00000001,
522 MOVEMENTFLAG_BACKWARD = 0x00000002,
523 MOVEMENTFLAG_STRAFE_LEFT = 0x00000004,
524 MOVEMENTFLAG_STRAFE_RIGHT = 0x00000008,
525 MOVEMENTFLAG_LEFT = 0x00000010,
526 MOVEMENTFLAG_RIGHT = 0x00000020,
527 MOVEMENTFLAG_PITCH_UP = 0x00000040,
528 MOVEMENTFLAG_PITCH_DOWN = 0x00000080,
529 MOVEMENTFLAG_WALK_MODE = 0x00000100, // Walking
530 MOVEMENTFLAG_ONTRANSPORT = 0x00000200, // Used for flying on some creatures
531 MOVEMENTFLAG_LEVITATING = 0x00000400,
532 MOVEMENTFLAG_FLY_UNK1 = 0x00000800,
533 MOVEMENTFLAG_JUMPING = 0x00001000,
534 MOVEMENTFLAG_UNK4 = 0x00002000,
535 MOVEMENTFLAG_FALLING = 0x00004000,
536 // 0x8000, 0x10000, 0x20000, 0x40000, 0x80000, 0x100000
537 MOVEMENTFLAG_SWIMMING = 0x00200000, // appears with fly flag also
538 MOVEMENTFLAG_FLY_UP = 0x00400000,
539 MOVEMENTFLAG_CAN_FLY = 0x00800000,
540 MOVEMENTFLAG_FLYING = 0x01000000,
541 MOVEMENTFLAG_FLYING2 = 0x02000000, // Actual flying mode
542 MOVEMENTFLAG_SPLINE = 0x04000000, // used for flight paths
543 MOVEMENTFLAG_SPLINE2 = 0x08000000, // used for flight paths
544 MOVEMENTFLAG_WATERWALKING = 0x10000000, // prevent unit from falling through water
545 MOVEMENTFLAG_SAFE_FALL = 0x20000000, // active rogue safe fall spell (passive)
546 MOVEMENTFLAG_UNK3 = 0x40000000
549 enum DiminishingLevels
551 DIMINISHING_LEVEL_1 = 0,
552 DIMINISHING_LEVEL_2 = 1,
553 DIMINISHING_LEVEL_3 = 2,
554 DIMINISHING_LEVEL_IMMUNE = 3
557 struct DiminishingReturn
559 DiminishingReturn(DiminishingGroup group, uint32 t, uint32 count) : DRGroup(group), hitTime(t), hitCount(count), stack(0) {}
561 DiminishingGroup DRGroup:16;
562 uint16 stack:16;
563 uint32 hitTime;
564 uint32 hitCount;
567 enum MeleeHitOutcome
569 MELEE_HIT_EVADE, MELEE_HIT_MISS, MELEE_HIT_DODGE, MELEE_HIT_BLOCK, MELEE_HIT_PARRY,
570 MELEE_HIT_GLANCING, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_NORMAL, MELEE_HIT_BLOCK_CRIT
572 struct CleanDamage
574 CleanDamage(uint32 _damage, WeaponAttackType _attackType, MeleeHitOutcome _hitOutCome) :
575 damage(_damage), attackType(_attackType), hitOutCome(_hitOutCome) {}
577 uint32 damage;
578 WeaponAttackType attackType;
579 MeleeHitOutcome hitOutCome;
582 struct UnitActionBarEntry
584 uint32 Type;
585 uint32 SpellOrAction;
588 #define MAX_DECLINED_NAME_CASES 5
590 struct DeclinedName
592 std::string name[MAX_DECLINED_NAME_CASES];
595 enum CurrentSpellTypes
597 CURRENT_MELEE_SPELL = 0,
598 CURRENT_FIRST_NON_MELEE_SPELL = 1, // just counter
599 CURRENT_GENERIC_SPELL = 1,
600 CURRENT_AUTOREPEAT_SPELL = 2,
601 CURRENT_CHANNELED_SPELL = 3,
602 CURRENT_MAX_SPELL = 4 // just counter
605 enum ActiveStates
607 ACT_ENABLED = 0xC100,
608 ACT_DISABLED = 0x8100,
609 ACT_COMMAND = 0x0700,
610 ACT_REACTION = 0x0600,
611 ACT_CAST = 0x0100,
612 ACT_PASSIVE = 0x0000,
613 ACT_DECIDE = 0x0001
616 enum ReactStates
618 REACT_PASSIVE = 0,
619 REACT_DEFENSIVE = 1,
620 REACT_AGGRESSIVE = 2
623 enum CommandStates
625 COMMAND_STAY = 0,
626 COMMAND_FOLLOW = 1,
627 COMMAND_ATTACK = 2,
628 COMMAND_ABANDON = 3
631 struct CharmSpellEntry
633 uint16 spellId;
634 uint16 active;
637 struct CharmInfo
639 public:
640 explicit CharmInfo(Unit* unit);
641 uint32 GetPetNumber() const { return m_petnumber; }
642 void SetPetNumber(uint32 petnumber, bool statwindow);
644 void SetCommandState(CommandStates st) { m_CommandState = st; }
645 CommandStates GetCommandState() { return m_CommandState; }
646 bool HasCommandState(CommandStates state) { return (m_CommandState == state); }
647 void SetReactState(ReactStates st) { m_reactState = st; }
648 ReactStates GetReactState() { return m_reactState; }
649 bool HasReactState(ReactStates state) { return (m_reactState == state); }
651 void InitPossessCreateSpells();
652 void InitCharmCreateSpells();
653 void InitPetActionBar();
654 void InitEmptyActionBar();
655 //return true if successful
656 bool AddSpellToAB(uint32 oldid, uint32 newid, ActiveStates newstate = ACT_DECIDE);
657 void ToggleCreatureAutocast(uint32 spellid, bool apply);
659 UnitActionBarEntry* GetActionBarEntry(uint8 index) { return &(PetActionBar[index]); }
660 CharmSpellEntry* GetCharmSpell(uint8 index) { return &(m_charmspells[index]); }
661 private:
662 Unit* m_unit;
663 UnitActionBarEntry PetActionBar[10];
664 CharmSpellEntry m_charmspells[4];
665 CommandStates m_CommandState;
666 ReactStates m_reactState;
667 uint32 m_petnumber;
670 // for clearing special attacks
671 #define REACTIVE_TIMER_START 4000
673 enum ReactiveType
675 REACTIVE_DEFENSE = 1,
676 REACTIVE_HUNTER_PARRY = 2,
677 REACTIVE_CRIT = 3,
678 REACTIVE_HUNTER_CRIT = 4,
679 REACTIVE_OVERPOWER = 5
682 #define MAX_REACTIVE 6
683 #define MAX_TOTEM 4
685 // delay time next attack to prevent client attack animation problems
686 #define ATTACK_DISPLAY_DELAY 200
688 class MANGOS_DLL_SPEC Unit : public WorldObject
690 public:
691 typedef std::set<Unit*> AttackerSet;
692 typedef std::pair<uint32, uint8> spellEffectPair;
693 typedef std::multimap< spellEffectPair, Aura*> AuraMap;
694 typedef std::list<Aura *> AuraList;
695 typedef std::list<DiminishingReturn> Diminishing;
696 typedef std::set<AuraType> AuraTypeSet;
697 typedef std::set<uint32> ComboPointHolderSet;
699 virtual ~Unit ( );
701 void AddToWorld();
702 void RemoveFromWorld();
704 void CleanupsBeforeDelete(); // used in ~Creature/~Player (or before mass creature delete to remove cross-references to already deleted units)
706 DiminishingLevels GetDiminishing(DiminishingGroup group);
707 void IncrDiminishing(DiminishingGroup group);
708 void ApplyDiminishingToDuration(DiminishingGroup group, int32 &duration,Unit* caster, DiminishingLevels Level);
709 void ApplyDiminishingAura(DiminishingGroup group, bool apply);
710 void ClearDiminishings() { m_Diminishing.clear(); }
712 virtual void Update( uint32 time );
714 void setAttackTimer(WeaponAttackType type, uint32 time) { m_attackTimer[type] = time; }
715 void resetAttackTimer(WeaponAttackType type = BASE_ATTACK);
716 uint32 getAttackTimer(WeaponAttackType type) const { return m_attackTimer[type]; }
717 bool isAttackReady(WeaponAttackType type = BASE_ATTACK) const { return m_attackTimer[type] == 0; }
718 bool haveOffhandWeapon() const;
719 bool canReachWithAttack(Unit *pVictim) const;
720 uint32 m_extraAttacks;
722 void _addAttacker(Unit *pAttacker) // must be called only from Unit::Attack(Unit*)
724 AttackerSet::iterator itr = m_attackers.find(pAttacker);
725 if(itr == m_attackers.end())
726 m_attackers.insert(pAttacker);
728 void _removeAttacker(Unit *pAttacker) // must be called only from Unit::AttackStop()
730 AttackerSet::iterator itr = m_attackers.find(pAttacker);
731 if(itr != m_attackers.end())
732 m_attackers.erase(itr);
734 Unit * getAttackerForHelper() // If someone wants to help, who to give them
736 if (getVictim() != NULL)
737 return getVictim();
739 if (!m_attackers.empty())
740 return *(m_attackers.begin());
742 return NULL;
744 bool Attack(Unit *victim, bool meleeAttack);
745 void CastStop(uint32 except_spellid = 0);
746 bool AttackStop();
747 void RemoveAllAttackers();
748 AttackerSet const& getAttackers() const { return m_attackers; }
749 bool isAttackingPlayer() const;
750 Unit* getVictim() const { return m_attacking; }
751 void CombatStop(bool cast = false);
752 void CombatStopWithPets(bool cast = false);
753 Unit* SelectNearbyTarget() const;
755 void addUnitState(uint32 f) { m_state |= f; }
756 bool hasUnitState(const uint32 f) const { return (m_state & f); }
757 void clearUnitState(uint32 f) { m_state &= ~f; }
758 bool CanFreeMove() const
760 return !hasUnitState(UNIT_STAT_CONFUSED | UNIT_STAT_FLEEING | UNIT_STAT_IN_FLIGHT |
761 UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED ) && GetOwnerGUID()==0;
764 uint32 getLevel() const { return GetUInt32Value(UNIT_FIELD_LEVEL); }
765 virtual uint32 getLevelForTarget(Unit const* /*target*/) const { return getLevel(); }
766 void SetLevel(uint32 lvl);
767 uint8 getRace() const { return GetByteValue(UNIT_FIELD_BYTES_0, 0); }
768 uint32 getRaceMask() const { return 1 << (getRace()-1); }
769 uint8 getClass() const { return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
770 uint32 getClassMask() const { return 1 << (getClass()-1); }
771 uint8 getGender() const { return GetByteValue(UNIT_FIELD_BYTES_0, 2); }
773 float GetStat(Stats stat) const { return float(GetUInt32Value(UNIT_FIELD_STAT0+stat)); }
774 void SetStat(Stats stat, int32 val) { SetStatInt32Value(UNIT_FIELD_STAT0+stat, val); }
775 uint32 GetArmor() const { return GetResistance(SPELL_SCHOOL_NORMAL) ; }
776 void SetArmor(int32 val) { SetResistance(SPELL_SCHOOL_NORMAL, val); }
778 uint32 GetResistance(SpellSchools school) const { return GetUInt32Value(UNIT_FIELD_RESISTANCES+school); }
779 void SetResistance(SpellSchools school, int32 val) { SetStatInt32Value(UNIT_FIELD_RESISTANCES+school,val); }
781 uint32 GetHealth() const { return GetUInt32Value(UNIT_FIELD_HEALTH); }
782 uint32 GetMaxHealth() const { return GetUInt32Value(UNIT_FIELD_MAXHEALTH); }
783 void SetHealth( uint32 val);
784 void SetMaxHealth(uint32 val);
785 int32 ModifyHealth(int32 val);
787 Powers getPowerType() const { return Powers(GetByteValue(UNIT_FIELD_BYTES_0, 3)); }
788 void setPowerType(Powers power);
789 uint32 GetPower( Powers power) const { return GetUInt32Value(UNIT_FIELD_POWER1 +power); }
790 uint32 GetMaxPower(Powers power) const { return GetUInt32Value(UNIT_FIELD_MAXPOWER1+power); }
791 void SetPower( Powers power, uint32 val);
792 void SetMaxPower(Powers power, uint32 val);
793 int32 ModifyPower(Powers power, int32 val);
794 void ApplyPowerMod(Powers power, uint32 val, bool apply);
795 void ApplyMaxPowerMod(Powers power, uint32 val, bool apply);
797 uint32 GetAttackTime(WeaponAttackType att) const { return (uint32)(GetFloatValue(UNIT_FIELD_BASEATTACKTIME+att)/m_modAttackSpeedPct[att]); }
798 void SetAttackTime(WeaponAttackType att, uint32 val) { SetFloatValue(UNIT_FIELD_BASEATTACKTIME+att,val*m_modAttackSpeedPct[att]); }
799 void ApplyAttackTimePercentMod(WeaponAttackType att,float val, bool apply);
800 void ApplyCastTimePercentMod(float val, bool apply);
802 // faction template id
803 uint32 getFaction() const { return GetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE); }
804 void setFaction(uint32 faction) { SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, faction ); }
805 FactionTemplateEntry const* getFactionTemplateEntry() const;
806 bool IsHostileTo(Unit const* unit) const;
807 bool IsHostileToPlayers() const;
808 bool IsFriendlyTo(Unit const* unit) const;
809 bool IsNeutralToAll() const;
810 bool IsContestedGuard() const
812 if(FactionTemplateEntry const* entry = getFactionTemplateEntry())
813 return entry->IsContestedGuardFaction();
815 return false;
817 bool IsPvP() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
818 void SetPvP(bool state) { if(state) SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); else RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP); }
819 uint32 GetCreatureType() const;
820 uint32 GetCreatureTypeMask() const
822 uint32 creatureType = GetCreatureType();
823 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
826 uint8 getStandState() const { return GetByteValue(UNIT_FIELD_BYTES_1, 0); }
827 bool IsSitState() const;
828 bool IsStandState() const;
829 void SetStandState(uint8 state);
831 bool IsMounted() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_MOUNT ); }
832 uint32 GetMountID() const { return GetUInt32Value(UNIT_FIELD_MOUNTDISPLAYID); }
833 void Mount(uint32 mount);
834 void Unmount();
836 uint16 GetMaxSkillValueForLevel(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
837 uint32 DealDamage(Unit *pVictim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellEntry const *spellProto, bool durabilityLoss);
838 void DealFlatDamage(Unit *pVictim, SpellEntry const *spellInfo, uint32 *damage, CleanDamage *cleanDamage, bool *crit = false, bool isTriggeredSpell = false);
839 void DoAttackDamage(Unit *pVictim, uint32 *damage, CleanDamage *cleanDamage, uint32 *blocked_amount, SpellSchoolMask damageSchoolMask, uint32 *hitInfo, VictimState *victimState, uint32 *absorbDamage, uint32 *resistDamage, WeaponAttackType attType, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
841 void CastMeleeProcDamageAndSpell(Unit* pVictim, uint32 damage, SpellSchoolMask damageSchoolMask, WeaponAttackType attType, MeleeHitOutcome outcome, SpellEntry const *spellCasted = NULL, bool isTriggeredSpell = false);
842 void ProcDamageAndSpell(Unit *pVictim, uint32 procAttacker, uint32 procVictim, uint32 damage = 0, SpellSchoolMask damageSchoolMask = SPELL_SCHOOL_MASK_NONE, SpellEntry const *procSpell = NULL, bool isTriggeredSpell = false, WeaponAttackType attType = BASE_ATTACK);
843 void HandleEmoteCommand(uint32 anim_id);
844 void AttackerStateUpdate (Unit *pVictim, WeaponAttackType attType = BASE_ATTACK, bool extra = false );
846 float MeleeMissChanceCalc(const Unit *pVictim, WeaponAttackType attType) const;
847 SpellMissInfo MagicSpellHitResult(Unit *pVictim, SpellEntry const *spell);
848 SpellMissInfo SpellHitResult(Unit *pVictim, SpellEntry const *spell, bool canReflect = false);
850 float GetUnitDodgeChance() const;
851 float GetUnitParryChance() const;
852 float GetUnitBlockChance() const;
853 float GetUnitCriticalChance(WeaponAttackType attackType, const Unit *pVictim) const;
855 virtual uint32 GetShieldBlockValue() const =0;
856 uint32 GetUnitMeleeSkill(Unit const* target = NULL) const { return (target ? getLevelForTarget(target) : getLevel()) * 5; }
857 uint32 GetDefenseSkillValue(Unit const* target = NULL) const;
858 uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const* target = NULL) const;
859 float GetWeaponProcChance() const;
860 float GetPPMProcChance(uint32 WeaponSpeed, float PPM) const;
861 MeleeHitOutcome RollPhysicalOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, SpellEntry const *spellInfo);
862 MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType) const;
863 MeleeHitOutcome RollMeleeOutcomeAgainst (const Unit *pVictim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance, bool SpellCasted ) const;
865 bool isVendor() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_VENDOR ); }
866 bool isTrainer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TRAINER ); }
867 bool isQuestGiver() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER ); }
868 bool isGossip() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP ); }
869 bool isTaxi() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER ); }
870 bool isGuildMaster() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_PETITIONER ); }
871 bool isBattleMaster() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BATTLEMASTER ); }
872 bool isBanker() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_BANKER ); }
873 bool isInnkeeper() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_INNKEEPER ); }
874 bool isSpiritHealer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER ); }
875 bool isSpiritGuide() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITGUIDE ); }
876 bool isTabardDesigner()const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_TABARDDESIGNER ); }
877 bool isAuctioner() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_AUCTIONEER ); }
878 bool isArmorer() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_REPAIR ); }
879 bool isServiceProvider() const
881 return HasFlag( UNIT_NPC_FLAGS,
882 UNIT_NPC_FLAG_VENDOR | UNIT_NPC_FLAG_TRAINER | UNIT_NPC_FLAG_FLIGHTMASTER |
883 UNIT_NPC_FLAG_PETITIONER | UNIT_NPC_FLAG_BATTLEMASTER | UNIT_NPC_FLAG_BANKER |
884 UNIT_NPC_FLAG_INNKEEPER | UNIT_NPC_FLAG_GUARD | UNIT_NPC_FLAG_SPIRITHEALER |
885 UNIT_NPC_FLAG_SPIRITGUIDE | UNIT_NPC_FLAG_TABARDDESIGNER | UNIT_NPC_FLAG_AUCTIONEER );
887 bool isSpiritService() const { return HasFlag( UNIT_NPC_FLAGS, UNIT_NPC_FLAG_SPIRITHEALER | UNIT_NPC_FLAG_SPIRITGUIDE ); }
889 //Need fix or use this
890 bool isGuard() const { return HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GUARD); }
892 bool isInFlight() const { return hasUnitState(UNIT_STAT_IN_FLIGHT); }
894 bool isInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); }
895 void SetInCombatState(bool PvP);
896 void SetInCombatWith(Unit* enemy);
897 void ClearInCombat();
898 uint32 GetCombatTimer() const { return m_CombatTimer; }
900 bool HasAuraType(AuraType auraType) const;
901 bool HasAura(uint32 spellId, uint32 effIndex) const
902 { return m_Auras.find(spellEffectPair(spellId, effIndex)) != m_Auras.end(); }
904 bool virtual HasSpell(uint32 /*spellID*/) const { return false; }
906 bool HasStealthAura() const { return HasAuraType(SPELL_AURA_MOD_STEALTH); }
907 bool HasInvisibilityAura() const { return HasAuraType(SPELL_AURA_MOD_INVISIBILITY); }
908 bool isFeared() const { return HasAuraType(SPELL_AURA_MOD_FEAR); }
909 bool isInRoots() const { return HasAuraType(SPELL_AURA_MOD_ROOT); }
910 bool IsPolymorphed() const;
912 bool isFrozen() const;
914 void RemoveSpellbyDamageTaken(AuraType auraType, uint32 damage);
916 bool isTargetableForAttack() const;
917 virtual bool IsInWater() const;
918 virtual bool IsUnderWater() const;
919 bool isInAccessablePlaceFor(Creature const* c) const;
921 void SendHealSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage, bool critical = false);
922 void SendEnergizeSpellLog(Unit *pVictim, uint32 SpellID, uint32 Damage,Powers powertype);
923 uint32 SpellNonMeleeDamageLog(Unit *pVictim, uint32 spellID, uint32 damage, bool isTriggeredSpell = false, bool useSpellDamage = true);
924 void CastSpell(Unit* Victim, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
925 void CastSpell(Unit* Victim,SpellEntry const *spellInfo, bool triggered, Item *castItem= NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
926 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);
927 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);
928 void CastSpell(float x, float y, float z, uint32 spellId, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
929 void CastSpell(float x, float y, float z, SpellEntry const *spellInfo, bool triggered, Item *castItem = NULL, Aura* triggeredByAura = NULL, uint64 originalCaster = 0);
931 bool IsDamageToThreatSpell(SpellEntry const * spellInfo) const;
933 void DeMorph();
935 void SendAttackStateUpdate(uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount);
936 void SendSpellNonMeleeDamageLog(Unit *target,uint32 SpellID,uint32 Damage, SpellSchoolMask damageSchoolMask,uint32 AbsorbedDamage, uint32 Resist,bool PhysicalDamage, uint32 Blocked, bool CriticalHit = false);
937 void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo);
939 void SendMonsterMove(float NewPosX, float NewPosY, float NewPosZ, uint8 type, uint32 MovementFlags, uint32 Time, Player* player = NULL);
940 void SendMonsterMoveByPath(Path const& path, uint32 start, uint32 end, uint32 MovementFlags);
941 void SendMonsterMoveWithSpeed(float x, float y, float z, uint32 MovementFlags, uint32 transitTime = 0, Player* player = NULL);
942 void SendMonsterMoveWithSpeedToCurrentDestination(Player* player = NULL);
944 virtual void MoveOutOfRange(Player &) { };
946 bool isAlive() const { return (m_deathState == ALIVE); };
947 bool isDead() const { return ( m_deathState == DEAD || m_deathState == CORPSE ); };
948 DeathState getDeathState() { return m_deathState; };
949 virtual void setDeathState(DeathState s); // overwrited in Creature/Player/Pet
951 uint64 GetOwnerGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMONEDBY); }
952 void SetOwnerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner); }
953 uint64 GetCreatorGUID() const { return GetUInt64Value(UNIT_FIELD_CREATEDBY); }
954 void SetCreatorGUID(uint64 creator) { SetUInt64Value(UNIT_FIELD_CREATEDBY, creator); }
955 uint64 GetPetGUID() const { return GetUInt64Value(UNIT_FIELD_SUMMON); }
956 uint64 GetCharmerGUID() const { return GetUInt64Value(UNIT_FIELD_CHARMEDBY); }
957 void SetCharmerGUID(uint64 owner) { SetUInt64Value(UNIT_FIELD_CHARMEDBY, owner); }
958 uint64 GetCharmGUID() const { return GetUInt64Value(UNIT_FIELD_CHARM); }
960 uint64 GetCharmerOrOwnerGUID() const { return GetCharmerGUID() ? GetCharmerGUID() : GetOwnerGUID(); }
961 uint64 GetCharmerOrOwnerOrOwnGUID() const
963 if(uint64 guid = GetCharmerOrOwnerGUID())
964 return guid;
965 return GetGUID();
967 bool isCharmedOwnedByPlayerOrPlayer() const { return IS_PLAYER_GUID(GetCharmerOrOwnerOrOwnGUID()); }
969 Player* GetSpellModOwner();
971 Unit* GetOwner() const;
972 Pet* GetPet() const;
973 Unit* GetCharmer() const;
974 Unit* GetCharm() const;
975 Unit* GetCharmerOrOwner() const { return GetCharmerGUID() ? GetCharmer() : GetOwner(); }
976 Unit* GetCharmerOrOwnerOrSelf()
978 if(Unit* u = GetCharmerOrOwner())
979 return u;
981 return this;
983 Player* GetCharmerOrOwnerPlayerOrPlayerItself();
985 void SetPet(Pet* pet);
986 void SetCharm(Unit* pet);
988 bool isCharmed() const { return GetCharmerGUID() != 0; }
990 CharmInfo* GetCharmInfo() { return m_charmInfo; }
991 CharmInfo* InitCharmInfo(Unit* charm);
993 Pet* CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id = 0);
995 bool AddAura(Aura *aur);
997 void RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode = AURA_REMOVE_BY_DEFAULT);
998 void RemoveAura(uint32 spellId, uint32 effindex, Aura* except = NULL);
999 void RemoveSingleAuraFromStack(uint32 spellId, uint32 effindex);
1000 void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
1001 void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
1002 void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
1003 void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
1004 void RemoveAurasDueToSpellByCancel(uint32 spellId);
1005 void RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo);
1006 void RemoveNotOwnSingleTargetAuras();
1008 void RemoveSpellsCausingAura(AuraType auraType);
1009 void RemoveRankAurasDueToSpell(uint32 spellId);
1010 bool RemoveNoStackAurasDueToAura(Aura *Aur);
1011 void RemoveAurasWithInterruptFlags(uint32 flags);
1012 void RemoveAurasWithDispelType( DispelType type );
1014 void RemoveAllAuras();
1015 void RemoveArenaAuras(bool onleave = false);
1016 void RemoveAllAurasOnDeath();
1017 void DelayAura(uint32 spellId, uint32 effindex, int32 delaytime);
1019 float GetResistanceBuffMods(SpellSchools school, bool positive) const { return GetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school ); }
1020 void SetResistanceBuffMods(SpellSchools school, bool positive, float val) { SetFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school,val); }
1021 void ApplyResistanceBuffModsMod(SpellSchools school, bool positive, float val, bool apply) { ApplyModSignedFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school, val, apply); }
1022 void ApplyResistanceBuffModsPercentMod(SpellSchools school, bool positive, float val, bool apply) { ApplyPercentModFloatValue(positive ? UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE+school : UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE+school, val, apply); }
1023 void InitStatBuffMods()
1025 for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(UNIT_FIELD_POSSTAT0+i, 0);
1026 for(int i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(UNIT_FIELD_NEGSTAT0+i, 0);
1028 void ApplyStatBuffMod(Stats stat, float val, bool apply) { ApplyModSignedFloatValue((val > 0 ? UNIT_FIELD_POSSTAT0+stat : UNIT_FIELD_NEGSTAT0+stat), val, apply); }
1029 void ApplyStatPercentBuffMod(Stats stat, float val, bool apply)
1031 ApplyPercentModFloatValue(UNIT_FIELD_POSSTAT0+stat, val, apply);
1032 ApplyPercentModFloatValue(UNIT_FIELD_NEGSTAT0+stat, val, apply);
1034 void SetCreateStat(Stats stat, float val) { m_createStats[stat] = val; }
1035 void SetCreateHealth(uint32 val) { SetUInt32Value(UNIT_FIELD_BASE_HEALTH, val); }
1036 uint32 GetCreateHealth() const { return GetUInt32Value(UNIT_FIELD_BASE_HEALTH); }
1037 void SetCreateMana(uint32 val) { SetUInt32Value(UNIT_FIELD_BASE_MANA, val); }
1038 uint32 GetCreateMana() const { return GetUInt32Value(UNIT_FIELD_BASE_MANA); }
1039 uint32 GetCreatePowers(Powers power) const;
1040 float GetPosStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_POSSTAT0+stat); }
1041 float GetNegStat(Stats stat) const { return GetFloatValue(UNIT_FIELD_NEGSTAT0+stat); }
1042 float GetCreateStat(Stats stat) const { return m_createStats[stat]; }
1044 void SetCurrentCastedSpell(Spell * pSpell);
1045 virtual void ProhibitSpellScholl(SpellSchoolMask /*idSchoolMask*/, uint32 /*unTimeMs*/ ) { }
1046 void InterruptSpell(uint32 spellType, bool withDelayed = true);
1048 // set withDelayed to true to account delayed spells as casted
1049 // delayed+channeled spells are always accounted as casted
1050 // we can skip channeled or delayed checks using flags
1051 bool IsNonMeleeSpellCasted(bool withDelayed, bool skipChanneled = false, bool skipAutorepeat = false) const;
1053 // set withDelayed to true to interrupt delayed spells too
1054 // delayed+channeled spells are always interrupted
1055 void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid = 0);
1057 Spell* FindCurrentSpellBySpellId(uint32 spell_id) const;
1059 Spell* m_currentSpells[CURRENT_MAX_SPELL];
1061 uint32 m_addDmgOnce;
1062 uint64 m_TotemSlot[MAX_TOTEM];
1063 uint64 m_ObjectSlot[4];
1064 uint32 m_detectInvisibilityMask;
1065 uint32 m_invisibilityMask;
1066 uint32 m_ShapeShiftFormSpellId;
1067 ShapeshiftForm m_form;
1068 float m_modMeleeHitChance;
1069 float m_modRangedHitChance;
1070 float m_modSpellHitChance;
1071 int32 m_baseSpellCritChance;
1073 float m_threatModifier[MAX_SPELL_SCHOOL];
1074 float m_modAttackSpeedPct[3];
1076 // Event handler
1077 EventProcessor m_Events;
1079 // stat system
1080 bool HandleStatModifier(UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply);
1081 void SetModifierValue(UnitMods unitMod, UnitModifierType modifierType, float value) { m_auraModifiersGroup[unitMod][modifierType] = value; }
1082 float GetModifierValue(UnitMods unitMod, UnitModifierType modifierType) const;
1083 float GetTotalStatValue(Stats stat) const;
1084 float GetTotalAuraModValue(UnitMods unitMod) const;
1085 SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const;
1086 Stats GetStatByAuraGroup(UnitMods unitMod) const;
1087 Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const;
1088 bool CanModifyStats() const { return m_canModifyStats; }
1089 void SetCanModifyStats(bool modifyStats) { m_canModifyStats = modifyStats; }
1090 virtual bool UpdateStats(Stats stat) = 0;
1091 virtual bool UpdateAllStats() = 0;
1092 virtual void UpdateResistances(uint32 school) = 0;
1093 virtual void UpdateArmor() = 0;
1094 virtual void UpdateMaxHealth() = 0;
1095 virtual void UpdateMaxPower(Powers power) = 0;
1096 virtual void UpdateAttackPowerAndDamage(bool ranged = false) = 0;
1097 virtual void UpdateDamagePhysical(WeaponAttackType attType) = 0;
1098 float GetTotalAttackPowerValue(WeaponAttackType attType) const;
1099 float GetWeaponDamageRange(WeaponAttackType attType ,WeaponDamageRange type) const;
1100 void SetBaseWeaponDamage(WeaponAttackType attType ,WeaponDamageRange damageRange, float value) { m_weaponDamage[attType][damageRange] = value; }
1102 bool isInFront(Unit const* target,float distance, float arc = M_PI) const;
1103 void SetInFront(Unit const* target);
1104 bool isInBack(Unit const* target, float distance, float arc = M_PI) const;
1106 // Visibility system
1107 UnitVisibility GetVisibility() const { return m_Visibility; }
1108 void SetVisibility(UnitVisibility x);
1110 // common function for visibility checks for player/creatures with detection code
1111 bool isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList = false, bool is3dDistance = true) const;
1112 bool canDetectInvisibilityOf(Unit const* u) const;
1114 // virtual functions for all world objects types
1115 bool isVisibleForInState(Player const* u, bool inVisibleList) const;
1116 // function for low level grid visibility checks in player/creature cases
1117 virtual bool IsVisibleInGridForPlayer(Player* pl) const = 0;
1119 bool waterbreath;
1120 AuraList & GetSingleCastAuras() { return m_scAuras; }
1121 AuraList const& GetSingleCastAuras() const { return m_scAuras; }
1122 SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY];
1124 // Threat related methods
1125 bool CanHaveThreatList() const;
1126 void AddThreat(Unit* pVictim, float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL, SpellEntry const *threatSpell = NULL);
1127 float ApplyTotalThreatModifier(float threat, SpellSchoolMask schoolMask = SPELL_SCHOOL_MASK_NORMAL);
1128 void DeleteThreatList();
1129 bool SelectHostilTarget();
1130 void TauntApply(Unit* pVictim);
1131 void TauntFadeOut(Unit *taunter);
1132 ThreatManager& getThreatManager() { return m_ThreatManager; }
1133 void addHatedBy(HostilReference* pHostilReference) { m_HostilRefManager.insertFirst(pHostilReference); };
1134 void removeHatedBy(HostilReference* /*pHostilReference*/ ) { /* nothing to do yet */ }
1135 HostilRefManager& getHostilRefManager() { return m_HostilRefManager; }
1137 Aura* GetAura(uint32 spellId, uint32 effindex);
1138 AuraMap & GetAuras() { return m_Auras; }
1139 AuraMap const& GetAuras() const { return m_Auras; }
1140 AuraList const& GetAurasByType(AuraType type) const { return m_modAuras[type]; }
1141 void ApplyAuraProcTriggerDamage(Aura* aura, bool apply);
1143 int32 GetTotalAuraModifier(AuraType auratype) const;
1144 float GetTotalAuraMultiplier(AuraType auratype) const;
1145 int32 GetMaxPositiveAuraModifier(AuraType auratype) const;
1146 int32 GetMaxNegativeAuraModifier(AuraType auratype) const;
1148 int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1149 float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1150 int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1151 int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const;
1153 int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1154 float GetTotalAuraMultiplierByMiscValue(AuraType auratype, int32 misc_value) const;
1155 int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1156 int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const;
1158 Aura* GetDummyAura(uint32 spell_id) const;
1160 uint32 GetDisplayId() { return GetUInt32Value(UNIT_FIELD_DISPLAYID); }
1161 void SetDisplayId(uint32 modelId);
1162 uint32 GetNativeDisplayId() { return GetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID); }
1163 void SetNativeDisplayId(uint32 modelId) { SetUInt32Value(UNIT_FIELD_NATIVEDISPLAYID, modelId); }
1164 void setTransForm(uint32 spellid) { m_transform = spellid;}
1165 uint32 getTransForm() const { return m_transform;}
1166 void AddDynObject(DynamicObject* dynObj);
1167 void RemoveDynObject(uint32 spellid);
1168 void RemoveDynObjectWithGUID(uint64 guid) { m_dynObjGUIDs.remove(guid); }
1169 void RemoveAllDynObjects();
1170 void AddGameObject(GameObject* gameObj);
1171 void RemoveGameObject(GameObject* gameObj, bool del);
1172 void RemoveGameObject(uint32 spellid, bool del);
1173 void RemoveAllGameObjects();
1174 DynamicObject *GetDynObject(uint32 spellId, uint32 effIndex);
1175 DynamicObject *GetDynObject(uint32 spellId);
1176 uint32 CalculateDamage(WeaponAttackType attType, bool normalized);
1177 float GetAPMultiplier(WeaponAttackType attType, bool normalized);
1178 void ModifyAuraState(AuraState flag, bool apply);
1179 bool HasAuraState(AuraState flag) const { return HasFlag(UNIT_FIELD_AURASTATE, 1<<(flag-1)); }
1180 void UnsummonAllTotems();
1181 int32 SpellBaseDamageBonus(SpellSchoolMask schoolMask);
1182 int32 SpellBaseHealingBonus(SpellSchoolMask schoolMask);
1183 int32 SpellBaseDamageBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
1184 int32 SpellBaseHealingBonusForVictim(SpellSchoolMask schoolMask, Unit *pVictim);
1185 uint32 SpellDamageBonus(Unit *pVictim, SpellEntry const *spellProto, uint32 damage, DamageEffectType damagetype);
1186 uint32 SpellHealingBonus(SpellEntry const *spellProto, uint32 healamount, DamageEffectType damagetype, Unit *pVictim);
1187 bool isSpellCrit(Unit *pVictim, SpellEntry const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType);
1188 uint32 SpellCriticalBonus(SpellEntry const *spellProto, uint32 damage, Unit *pVictim);
1190 void SetLastManaUse(uint32 spellCastTime) { m_lastManaUse = spellCastTime; }
1191 bool IsUnderLastManaUseEffect() const;
1193 void SetContestedPvP(Player *attackedPlayer = NULL);
1195 void MeleeDamageBonus(Unit *pVictim, uint32 *damage, WeaponAttackType attType, SpellEntry const *spellProto = NULL);
1196 uint32 GetCastingTimeForBonus( SpellEntry const *spellProto, DamageEffectType damagetype, uint32 CastingTime );
1198 void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply);
1199 void ApplySpellDispelImmunity(const SpellEntry * spellProto, DispelType type, bool apply);
1200 virtual bool IsImmunedToSpell(SpellEntry const* spellInfo, bool useCharges = false);
1201 // redefined in Creature
1202 bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask, bool useCharges = false);
1203 virtual bool IsImmunedToSpellEffect(uint32 effect, uint32 mechanic) const;
1204 // redefined in Creature
1206 uint32 CalcArmorReducedDamage(Unit* pVictim, const uint32 damage);
1207 void CalcAbsorbResist(Unit *pVictim, SpellSchoolMask schoolMask, DamageEffectType damagetype, const uint32 damage, uint32 *absorb, uint32 *resist);
1209 void UpdateSpeed(UnitMoveType mtype, bool forced);
1210 float GetSpeed( UnitMoveType mtype ) const;
1211 float GetSpeedRate( UnitMoveType mtype ) const { return m_speed_rate[mtype]; }
1212 void SetSpeed(UnitMoveType mtype, float rate, bool forced = false);
1214 void SetHover(bool on);
1215 bool isHover() const { return HasAuraType(SPELL_AURA_HOVER); }
1217 void _RemoveAllAuraMods();
1218 void _ApplyAllAuraMods();
1220 int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 basePoints, Unit const* target);
1221 int32 CalculateSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target);
1222 float CalculateLevelPenalty(SpellEntry const* spellProto) const;
1224 void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }
1225 void removeFollower(FollowerReference* /*pRef*/ ) { /* nothing to do yet */ }
1226 static Unit* GetUnit(WorldObject& object, uint64 guid);
1228 MotionMaster* GetMotionMaster() { return &i_motionMaster; }
1230 bool IsStopped() const { return !(hasUnitState(UNIT_STAT_MOVING)); }
1231 void StopMoving();
1233 void AddUnitMovementFlag(uint32 f) { m_unit_movement_flags |= f; }
1234 void RemoveUnitMovementFlag(uint32 f)
1236 uint32 oldval = m_unit_movement_flags;
1237 m_unit_movement_flags = oldval & ~f;
1239 uint32 HasUnitMovementFlag(uint32 f) const { return m_unit_movement_flags & f; }
1240 uint32 GetUnitMovementFlags() const { return m_unit_movement_flags; }
1241 void SetUnitMovementFlags(uint32 f) { m_unit_movement_flags = f; }
1243 void SetFeared(bool apply, uint64 casterGUID = 0, uint32 spellID = 0);
1244 void SetConfused(bool apply, uint64 casterGUID = 0, uint32 spellID = 0);
1246 void AddComboPointHolder(uint32 lowguid) { m_ComboPointHolders.insert(lowguid); }
1247 void RemoveComboPointHolder(uint32 lowguid) { m_ComboPointHolders.erase(lowguid); }
1248 void ClearComboPointHolders();
1250 ///----------Pet responses methods-----------------
1251 void SendPetCastFail(uint32 spellid, uint8 msg);
1252 void SendPetActionFeedback (uint8 msg);
1253 void SendPetTalk (uint32 pettalk);
1254 void SendPetSpellCooldown (uint32 spellid, time_t cooltime);
1255 void SendPetClearCooldown (uint32 spellid);
1256 void SendPetAIReaction(uint64 guid);
1257 ///----------End of Pet responses methods----------
1259 void propagateSpeedChange() { GetMotionMaster()->propagateSpeedChange(); }
1261 // reactive attacks
1262 void ClearAllReactives();
1263 void StartReactiveTimer( ReactiveType reactive ) { m_reactiveTimer[reactive] = REACTIVE_TIMER_START;}
1264 void UpdateReactives(uint32 p_time);
1266 // group updates
1267 void UpdateAuraForGroup(uint8 slot);
1269 // pet auras
1270 typedef std::set<PetAura const*> PetAuraSet;
1271 PetAuraSet m_petAuras;
1272 void AddPetAura(PetAura const* petSpell);
1273 void RemovePetAura(PetAura const* petSpell);
1275 protected:
1276 explicit Unit ();
1278 void _UpdateSpells(uint32 time);
1280 void _UpdateAutoRepeatSpell();
1281 bool m_AutoRepeatFirstCast;
1283 uint32 m_attackTimer[MAX_ATTACK];
1285 float m_createStats[MAX_STATS];
1287 AttackerSet m_attackers;
1288 Unit* m_attacking;
1290 DeathState m_deathState;
1292 AuraMap m_Auras;
1294 std::list<Aura *> m_scAuras; // casted singlecast auras
1296 typedef std::list<uint64> DynObjectGUIDs;
1297 DynObjectGUIDs m_dynObjGUIDs;
1299 std::list<GameObject*> m_gameObj;
1300 bool m_isSorted;
1301 uint32 m_transform;
1302 uint32 m_removedAuras;
1304 AuraList m_modAuras[TOTAL_AURAS];
1305 float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END];
1306 float m_weaponDamage[MAX_ATTACK][2];
1307 bool m_canModifyStats;
1308 //std::list< spellEffectPair > AuraSpells[TOTAL_AURAS]; // TODO: use this if ok for mem
1310 float m_speed_rate[MAX_MOVE_TYPE];
1312 CharmInfo *m_charmInfo;
1314 virtual SpellSchoolMask GetMeleeDamageSchoolMask() const;
1316 MotionMaster i_motionMaster;
1317 uint32 m_unit_movement_flags;
1319 uint32 m_reactiveTimer[MAX_REACTIVE];
1321 private:
1322 void SendAttackStop(Unit* victim); // only from AttackStop(Unit*)
1323 void SendAttackStart(Unit* pVictim); // only from Unit::AttackStart(Unit*)
1325 void ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag, AuraTypeSet const& procAuraTypes, WeaponAttackType attType, SpellEntry const * procSpell, uint32 damage, SpellSchoolMask damageSchoolMask );
1326 bool IsTriggeredAtSpellProcEvent( SpellEntry const* spellProto, SpellEntry const* procSpell, uint32 procFlag, WeaponAttackType attType, bool isVictim, uint32& cooldown );
1327 bool HandleDummyAuraProc( Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, uint32 cooldown);
1328 bool HandleProcTriggerSpell(Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, WeaponAttackType attType, uint32 cooldown);
1329 bool HandleHasteAuraProc( Unit *pVictim, uint32 damage, Aura* triggeredByAura, SpellEntry const* procSpell, uint32 procFlag, uint32 cooldown);
1330 bool HandleOverrideClassScriptAuraProc(Unit *pVictim, Aura* triggeredByAura, SpellEntry const *procSpell, uint32 cooldown);
1331 bool HandleMeandingAuraProc(Aura* triggeredByAura);
1333 uint32 m_state; // Even derived shouldn't modify
1334 uint32 m_CombatTimer;
1335 uint32 m_lastManaUse; // msecs
1337 UnitVisibility m_Visibility;
1339 Diminishing m_Diminishing;
1340 // Manage all Units threatening us
1341 ThreatManager m_ThreatManager;
1342 // Manage all Units that are threatened by us
1343 HostilRefManager m_HostilRefManager;
1345 FollowerRefManager m_FollowingRefManager;
1347 ComboPointHolderSet m_ComboPointHolders;
1349 #endif