/*
* Ascent MMORPG Server
* Copyright (C) 2005-2007 Ascent Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
#ifndef __SPELL_H
#define __SPELL_H
#include "SpellFailure.h"
class WorldSession;
class Unit;
class DynamicObj;
class Player;
class Item;
class Group;
class Aura;
/* Spell Ranges:(for 1.10.2)
Range ID|Range|Description
1 0-0 Self Only
2 0-5 Combat Range
3 0-20 Short Range
4 0-30 Medium Range
5 0-40 Long Range
6 0-100 Vision Range
7 0-10 Very Short Range
8 10-20 Short Range
9 10-30 Medium Range
10 10-40 Long Range
11 0-15 Shorter Range
12 0-5 Interact Range
13 0-50000 Anywhere
14 0-60 Extra Long Range
34 0-25 Medium-Short Range
35 0-35 Medium-Long Range
36 0-45 Longer Range
37 0-50 Extended Range
38 10-25 Extra Medium Range
54 5-30 Geoff Monster Shoot
74 8-30 Ranged Weapon
94 8-40 Sting
95 8-25 Charge
96 0-2 Trap
114 8-35 Hunter Range Hunter
134 0-80 Tower 80 Tower
135 0-100 Tower 100 Tower
*/
/*FLAT PCT
0 x x
1 x x
2 x x
3 x
4 x
5 x x
6 x x
7 x = x//both add % to crit
8 x x
9 x
10 x x
11 x x
12 x
13
14 x x
15 x
16 x
17 x
18 x x
19 x
20 x
21
22 x x
23 x(enslave dem)
24
25
26 x(obsolete)
27 x
*/
//wooohooo, there are 19 spells that actually require to add a proccounter for these
//first spell catched is "presence of mind"
//an ugly solution would be to add a proc flag to remove aura on event it should expire (like attack or cast) but that is only if count=1
enum SPELL_MODIFIER_TYPE
{
SMT_DAMAGE_DONE =0,// increases the damage done by spell by x% dmg (flat as x dmg)
SMT_DURATION =1,// spell duration increase // GOOD
//hmm shaman spirit weapon clearly states that this should be parry chance
SMT_TREAT_REDUCED =2,// reduces threat generated by this spell by x% // GOOD but need more work
SMT_ATTACK_POWER_AND_DMG_BONUS=3,// attacker power bonus for ability +x% // Seal of crusader also takes this as dmg bonus + power bonus
SMT_BLOCK =4,// block additional attack // GOOD and need work //Not used in 2.1.1 ?
SMT_RANGE =5,// spell range bonus // GOOD
SMT_RADIUS =6,// spell radius bonus // GOOD
SMT_CRITICAL =7,// critical chance bonus // GOOD //only 1 example in 2.1.1
SMT_DUMMY =8,// dummy effect // needs work is not only pets Hp but effect of spells to
SMT_NONINTERRUPT =9,// x% chance not to be interrupted by received damage (no flat)
SMT_CAST_TIME =10,// cast time decrease // GOOD
SMT_COOLDOWN_DECREASE=11,// cooldown decrease <-probably fully handled by client // GOOD
SMT_EFFECT = 12,//used by shaman elemental weapons and another spell
// SMT_SPEED =12,// movement speed, while given spell is active(flat is %) // TODO CHECK! ok this is not speed and is used with 23 misc to sometimes so is odd
// 13 dont exist spells with it
SMT_COST =14,// mana/energy/rage cost reduction // GOOD
SMT_CRITICAL_DAMAGE =15,// increases critical strike damage bonus (no flat)
SMT_RESIST =16,// enemy resist chance decrease (flat as %) // GOOD need work
SMT_ADDITIONAL_TARGET=17,// Your Healing Wave will now jump to additional nearby targets. Each jump reduces the effectiveness of the heal by 80% // GOOD
SMT_TRIGGER =18,// adds/increases chance to trigger some spell for example increase chance to apply poisons or entaglin // GOOD need work
SMT_TIME =19,// delay for nova, redirection time bonus for totem,maybe smth else // GOOD need work
SMT_JUMP_REDUCE =20,// Increases the amount healed by Chain Heal to targets beyond the first by x%. (no flat)
//SMT_CAST_TIME2 =21,// this one looks like cast time...
SMT_DAMAGE_DONE_PERIODIC=22,// damage done by ability by x% // GOOD but i think is not % so TODO CHECK!
SMT_UNKNOWN23=23,//increase the target's spell damage and healing by an amount equal to $s1% of their total Spirit." , this one is used with the 12 effect needs some decode
SMT_PENALTY =24,// This is a modifer for the amount of +spell damage applied to the spell group, ill be implementing it soon (fishbait) (it should really have a better name ;) ) // GOOD
// 25 dont exist spells with it
// 26 is obsolete stuff
SMT_EFFECT_BONUS =27,// mana lost cost per point of damage taken for mana shield,Health or Mana gained from Drain Life and Drain Mana increased by x%.
SMT_RESIST_DISPEL =28,// TODO NEEDS WORK :D
};
inline void SM_FFValue(int32 *m, float *v,uint32 group)
{
if(m == 0) return;
for(uint32 x=0;x flag =680 (dec))
PROC_ON_PHYSICAL_ATTACK = 0x100,
PROC_ON_MELEE_ATTACK_VICTIM = 0x200,
PROC_ON_ANY_ACTION = 0x400,
PROC_UNK_DEFILLED = 0x800,
PROC_ON_CRIT_ATTACK = 0x1000,
PROC_ON_RANGED_ATTACK_VICTIM = 0x2000,
PROC_ANYTIME = 0x4000,
PROC_UNK2_DEFILLED = 0x8000,
PROC_ON_CAST_SPECIFIC_SPELL = 0x10000,
PROC_ON_SPELL_HIT_VICTIM = 0x20000,
PROC_ON_SPELL_CRIT_HIT_VICTIM = 0x40000,
PROC_ON_UNK2_DAMAGE_VICTIM = 0x80000,
PROC_ON_ANY_DAMAGE_VICTIM = 0x100000,
PROC_ON_TRAP_TRIGGERED = 0x200000,
PROC_ON_AUTO_SHOT_HIT = 0x400000,
PROC_UNUSED2 = 0x800000,
PROC_ON_RESIST_VICTIM = 0x1000000,//added it as custom, maybe already exists in another form ?
PROC_ON_DODGE_VICTIM = 0x2000000,//added it as custom, maybe already exists in another form ?
PROC_ON_DIE = 0x4000000,//added it as custom, maybe already exists in another form ?
PROC_REMOVEONUSE = 0x8000000,//remove prochcharge only when it is used
PROC_MISC = 0x10000000,//our custom flag to decide if proc dmg or shield
PROC_ON_BLOCK_VICTIM = 0x20000000,//added it as custom, maybe already exists in another form ?
PROC_ON_SPELL_CRIT_HIT = 0x40000000,//added it as custom, maybe already exists in another form ?
PROC_TAGRGET_SELF = 0x80000000,//our custom flag to decide if proc target is self or victim
};
enum CastInterruptFlags
{
CAST_INTERRUPT_NULL = 0x0,
CAST_INTERRUPT_ON_SILENCE = 0x1,
CAST_INTERRUPT_ON_SLEEP = 0x2, // could be wrong
CAST_INTERRUPT_ON_STUNNED = 0x4, // could be wrong
CAST_INTERRUPT_ON_MOVEMENT = 0x8,
CAST_INTERRUPT_ON_DAMAGE_TAKEN = 0x10
};
enum AuraInterruptFlags
{
AURA_INTERRUPT_NULL = 0x0,
AURA_INTERRUPT_ON_HOSTILE_SPELL_INFLICTED = 0x1,
AURA_INTERRUPT_ON_ANY_DAMAGE_TAKEN = 0x2,
AURA_INTERRUPT_ON_UNK1 = 0x4,
AURA_INTERRUPT_ON_MOVEMENT = 0x8, // could be AURA_INTERRUPT_ON_MOVEMENT
AURA_INTERRUPT_ON_UNK2 = 0x10,
AURA_INTERRUPT_ON_UNK3 = 0x20,
AURA_INTERRUPT_ON_UNUSED1 = 0x40,
AURA_INTERRUPT_ON_SLOWED = 0x80,
AURA_INTERRUPT_ON_LEAVE_WATER = 0x100, // could be AURA_INTERRUPT_ON_LEAVE_CURRENT_SURFACE
AURA_INTERRUPT_ON_UNUSED2 = 0x200,
AURA_INTERRUPT_ON_UNK4 = 0x400,
AURA_INTERRUPT_ON_UNK5 = 0x800,
AURA_INTERRUPT_ON_START_ATTACK = 0x1000,
AURA_INTERRUPT_ON_UNK6 = 0x2000,
AURA_INTERRUPT_ON_UNUSED3 = 0x4000,
AURA_INTERRUPT_ON_CAST_SPELL = 0x8000,
AURA_INTERRUPT_ON_UNK7 = 0x10000,
AURA_INTERRUPT_ON_MOUNT = 0x20000,
AURA_INTERRUPT_ON_STAND_UP = 0x40000,
AURA_INTERRUPT_ON_LEAVE_AREA = 0x80000,
AURA_INTERRUPT_ON_INVINCIBLE = 0x100000,
AURA_INTERRUPT_ON_STEALTH = 0x200000,
AURA_INTERRUPT_ON_UNK8 = 0x400000,
};
enum ChannelInterruptFlags
{
CHANNEL_INTERRUPT_NULL = 0x0,
CHANNEL_INTERRUPT_ON_1 = 0x1,
CHANNEL_INTERRUPT_ON_2 = 0x2,
CHANNEL_INTERRUPT_ON_3 = 0x4,
CHANNEL_INTERRUPT_ON_4 = 0x8,
CHANNEL_INTERRUPT_ON_5 = 0x10,
CHANNEL_INTERRUPT_ON_6 = 0x20,
CHANNEL_INTERRUPT_ON_7 = 0x40,
CHANNEL_INTERRUPT_ON_8 = 0x80,
CHANNEL_INTERRUPT_ON_9 = 0x100,
CHANNEL_INTERRUPT_ON_10 = 0x200,
CHANNEL_INTERRUPT_ON_11 = 0x400,
CHANNEL_INTERRUPT_ON_12 = 0x800,
CHANNEL_INTERRUPT_ON_13 = 0x1000,
CHANNEL_INTERRUPT_ON_14 = 0x2000,
CHANNEL_INTERRUPT_ON_15 = 0x4000,
CHANNEL_INTERRUPT_ON_16 = 0x8000,
CHANNEL_INTERRUPT_ON_17 = 0x10000,
CHANNEL_INTERRUPT_ON_18 = 0x20000
};
enum Attributes
{
ATTRIBUTES_NULL = 0x0,
ATTRIBUTES_UNK2 = 0x1,
ATTRIBUTES_UNK3 = 0x2, // related to ranged??
ATTRIBUTE_ON_NEXT_ATTACK = 0x4,
ATTRIBUTES_UNK5 = 0x8,
ATTRIBUTES_UNK6 = 0x10,
ATTRIBUTES_UNK7 = 0x20, // Reagents??
ATTRIBUTES_PASSIVE = 0x40,
ATTRIBUTES_NO_VISUAL_AURA = 0x80,
ATTRIBUTES_UNK10 = 0x100,//seems to be afflicts pet
ATTRIBUTES_UNK11 = 0x200, // only appears in shaman imbue weapon spells
ATTRIBUTES_UNK12 = 0x400,
ATTRIBUTES_UNK13 = 0x800,
ATTRIBUTES_UNUSED1 = 0x1000,
ATTRIBUTES_UNUSED2 = 0x2000,
ATTRIBUTES_UNUSED3 = 0x4000,
ATTRIBUTES_ONLY_OUTDOORS = 0x8000,
ATTRIBUTES_UNK = 0x10000,
ATTRIBUTES_REQ_STEALTH = 0x20000,
ATTRIBUTES_MUSTBEBEHIND = 0x40000,//may be wrong
ATTRIBUTES_UNK21 = 0x80000,
ATTRIBUTES_MUSTFACECASTER = 0x100000,//may be wrong
ATTRIBUTES_UNK23 = 0x200000,
ATTRIBUTES_UNK24 = 0x400000,
ATTRIBUTES_UNK25 = 0x800000,
ATTRIBUTES_UNK26 = 0x1000000,
ATTRIBUTES_UNK27 = 0x2000000,
ATTRIBUTES_UNK28 = 0x4000000,
ATTRIBUTES_UNK29 = 0x8000000,
ATTRIBUTES_REQ_OOC = 0x10000000, // ATTRIBUTES_REQ_OUT_OF_COMBAT
ATTRIBUTES_UNK31 = 0x20000000,
ATTRIBUTES_UNK32 = 0x40000000,
ATTRIBUTES_UNUSED9 = 0x80000000,
};
enum AttributesEx
{
ATTRIBUTESEX_NULL = 0x0,
ATTRIBUTESEX_UNK2 = 0x1,
ATTRIBUTEEX_DRAIN_WHOLE_MANA = 0x2,
ATTRIBUTESEX_UNK4 = 0x4,
ATTRIBUTESEX_UNK5 = 0x8,
ATTRIBUTESEX_UNK6 = 0x10,
ATTRIBUTESEX_REMAIN_STEALTHED = 0x20,
ATTRIBUTESEX_UNK8 = 0x40,
ATTRIBUTESEX_UNK9 = 0x80,
ATTRIBUTESEX_UNK10 = 0x100,
ATTRIBUTESEX_UNK11 = 0x200,
ATTRIBUTESEX_UNK12 = 0x400,
ATTRIBUTESEX_UNK13 = 0x800,
ATTRIBUTESEX_UNK14 = 0x1000, // related to pickpocket
ATTRIBUTESEX_UNK15 = 0x2000, // related to remote control
ATTRIBUTESEX_UNK16 = 0x4000,
ATTRIBUTESEX_UNK17 = 0x8000,
ATTRIBUTESEX_UNK18 = 0x10000,
ATTRIBUTESEX_REMAIN_OOC = 0x20000,
ATTRIBUTESEX_UNK20 = 0x40000,
ATTRIBUTESEX_UNK21 = 0x80000,
ATTRIBUTESEX_UNK22 = 0x100000, // related to "Finishing move" and "Instantly overpowers"
ATTRIBUTESEX_UNK23 = 0x200000,
ATTRIBUTESEX_UNK24 = 0x400000, // only related to "Finishing move"
ATTRIBUTESEX_UNK25 = 0x800000, // related to spells like "ClearAllBuffs"
ATTRIBUTESEX_UNK26 = 0x1000000, // FISHING SPELLS
ATTRIBUTESEX_UNK27 = 0x2000000, // related to "Detect" spell
ATTRIBUTESEX_UNK28 = 0x4000000,
ATTRIBUTESEX_UNK29 = 0x8000000,
ATTRIBUTESEX_UNK30 = 0x10000000,
ATTRIBUTESEX_UNK31 = 0x20000000,
ATTRIBUTESEX_UNK32 = 0x40000000, // Overpower
};
enum Flags3
{
FLAGS3_NULL = 0x0,
FLAGS3_UNK2 = 0x1,
FLAGS3_UNK3 = 0x2, // Can be used while stealthed
FLAGS3_UNK4 = 0x4, // request pet maybe
FLAGS3_UNK5 = 0x8, // something todo with temp enchanted items
FLAGS3_PARTY_EFFECTING_AURA = 0x10, // Party affecting aura's
FLAGS3_ACTIVATE_AUTO_SHOT = 0x20, // spell that enable's auto shoot
FLAGS3_UNK8 = 0x40, //Polymorph spells
FLAGS3_UNK9 = 0x80,
FLAGS3_UNUSED1 = 0x100,
FLAGS3_UNK11 = 0x200, // used by 2 spells, 30421 | Nether Portal - Perseverence and 30466 | Nether Portal - Perseverence
FLAGS3_TAME_X = 0x400, // tame [creature]
FLAGS3_FUNNEL = 0x800, // only funnel spells
FLAGS3_UNK14 = 0x1000, // swipe / Cleave spells
FLAGS3_MODIFY_ITEM_STAT = 0x2000, // modify's item stat's temporary and permeability, enchantment or not
FLAGS3_SPELL_PLAYER_EVENT = 0x4000, // Player event's like logging in, finishing quests, triggering cinematic, being adored, Heartbroken etc
FLAGS3_UNUSED3 = 0x8000,
FLAGS3_CONTROL_UNIT = 0x10000, // PvP Controller, RC, Creature taming, Taming Lesson
FLAGS3_REQ_RANGED_WEAPON = 0x20000, // this is shit and has nothing to do with auto shot
FLAGS3_REVIVE_PET = 0x40000, // actually 1 spell, revive pet
FLAGS3_UNK21 = 0x80000, // this is a group of spells that are triggered by something. (I have no clue on how to name this one)
FLAGS3_REQ_BEHIND_TARGET = 0x100000,
FLAGS3_UNK23 = 0x200000,
FLAGS3_UNK24 = 0x400000,
FLAGS3_UNK25 = 0x800000,
FLAGS3_UNK26 = 0x1000000,
FLAGS3_UNK27 = 0x2000000,
FLAGS3_UNK28 = 0x4000000,
FLAGS3_UNK29 = 0x8000000, // fishing spells and enchanting weapons
FLAGS3_UNK30 = 0x10000000, // some secondairy spell triggers, especialy for lightning shield alike spells
FLAGS3_UNK31 = 0x20000000,
FLAGS3_UNK32 = 0x40000000,
};
enum Flags4
{
FLAGS4_PLAYER_RANGED_SPELLS = 0x8000,
CAN_PERSIST_AND_CASTED_WHILE_DEAD = 0x100000,
FLAGS4_PLAYER_RANGED_WAND = 0x400000,
};
enum SpellCastFlags
{
CAST_FLAG_UNKNOWN1 = 0x2,
CAST_FLAG_UNKNOWN2 = 0x10, // no idea yet, i saw it in blizzard spell
CAST_FLAG_AMMO = 0x20 // load ammo display id (uint32) and ammo inventory type (uint32)
};
enum School
{
SCHOOL_NORMAL = 0,
SCHOOL_HOLY = 1,
SCHOOL_FIRE = 2,
SCHOOL_NATURE = 3,
SCHOOL_FROST = 4,
SCHOOL_SHADOW = 5,
SCHOOL_ARCANE = 6
};
enum ReplenishType
{
REPLENISH_UNDEFINED = 0,
REPLENISH_HEALTH = 20,
REPLENISH_MANA = 21,
REPLENISH_RAGE = 22 //don't know if rage is 22 or what, but will do for now
};
enum SpellTargetType
{
TARGET_TYPE_NULL = 0x0,
TARGET_TYPE_BEAST = 0x1,
TARGET_TYPE_DRAGONKIN = 0x2,
TARGET_TYPE_DEMON = 0x4,
TARGET_TYPE_ELEMENTAL = 0x8,
TARGET_TYPE_GIANT = 0x10,
TARGET_TYPE_UNDEAD = 0x20,
TARGET_TYPE_HUMANOID = 0x40,
TARGET_TYPE_CRITTER = 0x80,
TARGET_TYPE_MECHANICAL = 0x100,
};
/****************SpellExtraFlags*****************/
/* SpellExtraFlags defines */
/* */
/* Used for infront check and other checks */
/* when they are not in spell.dbc */
/* */
/************************************************/
#define SPELL_EXTRA_INFRONT 1
#define SPELL_EXTRA_BEHIND 2
#define SPELL_EXTRA_UNDEF0 4 // not used yet
#define SPELL_EXTRA_UNDEF1 8 // not used yet
/***************Ranged spellid*******************/
/* Note: These spell id's are checked for 2.0.6 */
/************************************************/
#define SPELL_RANGED_GENERAL 3018
#define SPELL_RANGED_THROW 2764
#define SPELL_RANGED_WAND 5019
struct TeleportCoords
{
uint32 id;
uint32 mapId;
float x;
float y;
float z;
};
struct TotemSpells
{
uint32 spellId;
uint32 spellToCast[3];
};
enum LOCKTYPES{
LOCKTYPE_PICKLOCK =1,
LOCKTYPE_HERBALISM =2,
LOCKTYPE_MINING =3,
LOCKTYPE_DISARM_TRAP =4,
LOCKTYPE_OPEN =5,
LOCKTYPE_TREASURE =6,
LOCKTYPE_CALCIFIED_ELVEN_GEMS =7,
LOCKTYPE_CLOSE =8,
LOCKTYPE_ARM_TRAP =9,
LOCKTYPE_QUICK_OPEN =10,
LOCKTYPE_QUICK_CLOSE =11,
LOCKTYPE_OPEN_TINKERING =12,
LOCKTYPE_OPEN_KNEELING =13,
LOCKTYPE_OPEN_ATTACKING =14,
LOCKTYPE_GAHZRIDIAN =15,
LOCKTYPE_BLASTING =16,
LOCKTYPE_SLOW_OPEN =17,
LOCKTYPE_SLOW_CLOSE =18
};
enum SpellEffects
{
SPELL_EFFECT_NULL = 0,
SPELL_EFFECT_INSTANT_KILL, // 1
SPELL_EFFECT_SCHOOL_DAMAGE, // 2
SPELL_EFFECT_DUMMY, // 3
SPELL_EFFECT_PORTAL_TELEPORT, // 4
SPELL_EFFECT_TELEPORT_UNITS, // 5
SPELL_EFFECT_APPLY_AURA, // 6
SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, // 7
SPELL_EFFECT_POWER_DRAIN, // 8
SPELL_EFFECT_HEALTH_LEECH, // 9
SPELL_EFFECT_HEAL, // 10
SPELL_EFFECT_BIND, // 11
SPELL_EFFECT_PORTAL, // 12
SPELL_EFFECT_RITUAL_BASE, // 13
SPELL_EFFECT_RITUAL_SPECIALIZE, // 14
SPELL_EFFECT_RITUAL_ACTIVATE_PORTAL, // 15
SPELL_EFFECT_QUEST_COMPLETE, // 16
SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, // 17
SPELL_EFFECT_RESURRECT, // 18
SPELL_EFFECT_ADD_EXTRA_ATTACKS, // 19
SPELL_EFFECT_DODGE, // 20
SPELL_EFFECT_EVADE, // 21
SPELL_EFFECT_PARRY, // 22
SPELL_EFFECT_BLOCK, // 23
SPELL_EFFECT_CREATE_ITEM, // 24
SPELL_EFFECT_WEAPON, // 25
SPELL_EFFECT_DEFENSE, // 26
SPELL_EFFECT_PERSISTENT_AREA_AURA, // 27
SPELL_EFFECT_SUMMON, // 28
SPELL_EFFECT_LEAP, // 29
SPELL_EFFECT_ENERGIZE, // 30
SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, // 31
SPELL_EFFECT_TRIGGER_MISSILE, // 32
SPELL_EFFECT_OPEN_LOCK, // 33
SPELL_EFFECT_TRANSFORM_ITEM, // 34
SPELL_EFFECT_APPLY_AREA_AURA, // 35
SPELL_EFFECT_LEARN_SPELL, // 36
SPELL_EFFECT_SPELL_DEFENSE, // 37
SPELL_EFFECT_DISPEL, // 38
SPELL_EFFECT_LANGUAGE, // 39
SPELL_EFFECT_DUAL_WIELD, // 40
SPELL_EFFECT_SUMMON_WILD, // 41
SPELL_EFFECT_SUMMON_GUARDIAN, // 42
SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER,// 43
SPELL_EFFECT_SKILL_STEP, // 44
SPELL_EFFECT_UNDEFINED_45, // 45
SPELL_EFFECT_SPAWN, // 46
SPELL_EFFECT_TRADE_SKILL, // 47
SPELL_EFFECT_STEALTH, // 48
SPELL_EFFECT_DETECT, // 49
SPELL_EFFECT_SUMMON_OBJECT, // 50
//SPELL_EFFECT_TRANS_DOOR, // 50
SPELL_EFFECT_FORCE_CRITICAL_HIT, // 51
SPELL_EFFECT_GUARANTEE_HIT, // 52
SPELL_EFFECT_ENCHANT_ITEM, // 53
SPELL_EFFECT_ENCHANT_ITEM_TEMPORARY, // 54
SPELL_EFFECT_TAMECREATURE, // 55
SPELL_EFFECT_SUMMON_PET, // 56
SPELL_EFFECT_LEARN_PET_SPELL, // 57
SPELL_EFFECT_WEAPON_DAMAGE, // 58
SPELL_EFFECT_OPEN_LOCK_ITEM, // 59
SPELL_EFFECT_PROFICIENCY, // 60
SPELL_EFFECT_SEND_EVENT, // 61
SPELL_EFFECT_POWER_BURN, // 62
SPELL_EFFECT_THREAT, // 63
SPELL_EFFECT_TRIGGER_SPELL, // 64
SPELL_EFFECT_HEALTH_FUNNEL, // 65
SPELL_EFFECT_POWER_FUNNEL, // 66
SPELL_EFFECT_HEAL_MAX_HEALTH, // 67
SPELL_EFFECT_INTERRUPT_CAST, // 68
SPELL_EFFECT_DISTRACT, // 69
SPELL_EFFECT_PULL, // 70
SPELL_EFFECT_PICKPOCKET, // 71
SPELL_EFFECT_ADD_FARSIGHT, // 72
SPELL_EFFECT_SUMMON_POSSESSED, // 73
SPELL_EFFECT_SUMMON_TOTEM, // 74
SPELL_EFFECT_HEAL_MECHANICAL, // 75
SPELL_EFFECT_SUMMON_OBJECT_WILD, // 76
SPELL_EFFECT_SCRIPT_EFFECT, // 77
SPELL_EFFECT_ATTACK, // 78
SPELL_EFFECT_SANCTUARY, // 79
SPELL_EFFECT_ADD_COMBO_POINTS, // 80
SPELL_EFFECT_CREATE_HOUSE, // 81
SPELL_EFFECT_BIND_SIGHT, // 82
SPELL_EFFECT_DUEL, // 83
SPELL_EFFECT_STUCK, // 84
SPELL_EFFECT_SUMMON_PLAYER, // 85
SPELL_EFFECT_ACTIVATE_OBJECT, // 86
SPELL_EFFECT_SUMMON_TOTEM_SLOT1, // 87
SPELL_EFFECT_SUMMON_TOTEM_SLOT2, // 88
SPELL_EFFECT_SUMMON_TOTEM_SLOT3, // 89
SPELL_EFFECT_SUMMON_TOTEM_SLOT4, // 90
SPELL_EFFECT_THREAT_ALL, // 91
SPELL_EFFECT_ENCHANT_HELD_ITEM, // 92
SPELL_EFFECT_SUMMON_PHANTASM, // 93
SPELL_EFFECT_SELF_RESURRECT, // 94
SPELL_EFFECT_SKINNING, // 95
SPELL_EFFECT_CHARGE, // 96
SPELL_EFFECT_SUMMON_CRITTER, // 97
SPELL_EFFECT_KNOCK_BACK, // 98
SPELL_EFFECT_DISENCHANT, // 99
SPELL_EFFECT_INEBRIATE, // 100
SPELL_EFFECT_FEED_PET, // 101
SPELL_EFFECT_DISMISS_PET, // 102
SPELL_EFFECT_REPUTATION, // 103
SPELL_EFFECT_SUMMON_OBJECT_SLOT1, // 104
SPELL_EFFECT_SUMMON_OBJECT_SLOT2, // 105
SPELL_EFFECT_SUMMON_OBJECT_SLOT3, // 106
SPELL_EFFECT_SUMMON_OBJECT_SLOT4, // 107
SPELL_EFFECT_DISPEL_MECHANIC, // 108
SPELL_EFFECT_SUMMON_DEAD_PET, // 109
SPELL_EFFECT_DESTROY_ALL_TOTEMS, // 110
SPELL_EFFECT_DURABILITY_DAMAGE, // 111
SPELL_EFFECT_SUMMON_DEMON, // 112
SPELL_EFFECT_RESURRECT_FLAT, // 113
SPELL_EFFECT_ATTACK_ME, // 114
SPELL_EFFECT_DURABILITY_DAMAGE_PCT, // 115
SPELL_EFFECT_SKIN_PLAYER_CORPSE, // 116
SPELL_EFFECT_SPIRIT_HEAL, // 117
SPELL_EFFECT_SKILL, // 118
SPELL_EFFECT_APPLY_PET_AURA, // 119
SPELL_EFFECT_TELEPORT_GRAVEYARD, // 120
SPELL_EFFECT_DUMMYMELEE, // 121
SPELL_EFFECT_UNKNOWN1, // 122
SPELL_EFFECT_UNKNOWN2, // 123
SPELL_EFFECT_UNKNOWN3, // 124
SPELL_EFFECT_UNKNOWN4, // 125
SPELL_EFFECT_UNKNOWN5, // 126
SPELL_EFFECT_PROSPECTING, // 127
SPELL_EFFECT_UNKNOWN7, // 128
SPELL_EFFECT_UNKNOWN8, // 129
SPELL_EFFECT_UNKNOWN9, // 129
SPELL_EFFECT_UNKNOWN10, // 130
SPELL_EFFECT_UNKNOWN11, // 131
SPELL_EFFECT_UNKNOWN12, // 132
SPELL_EFFECT_FORGET_SPECIALIZATION, // 133
SPELL_EFFECT_UNKNOWN14, // 134
SPELL_EFFECT_UNKNOWN15, // 135
SPELL_EFFECT_UNKNOWN16, // 136
SPELL_EFFECT_UNKNOWN17, // 137
SPELL_EFFECT_UNKNOWN18, // 138
SPELL_EFFECT_UNKNOWN19, // 139
SPELL_EFFECT_UNKNOWN20, // 140
SPELL_EFFECT_UNKNOWN21, // 141
SPELL_EFFECT_UNKNOWN22, // 142
SPELL_EFFECT_UNKNOWN23, // 143
TOTAL_SPELL_EFFECTS, // 144
};
enum SPELL_ENTRY
{
SPELL_ENTRY_Id,
SPELL_ENTRY_School,
SPELL_ENTRY_Category,
SPELL_ENTRY_field4,
SPELL_ENTRY_DispelType,
SPELL_ENTRY_MechanicsType,
SPELL_ENTRY_Attributes,
SPELL_ENTRY_AttributesEx,
SPELL_ENTRY_Flags3,
SPELL_ENTRY_field10,
SPELL_ENTRY_field11,
SPELL_ENTRY_unk201_1,
SPELL_ENTRY_UNK12,
SPELL_ENTRY_UNK13,
SPELL_ENTRY_Targets,
SPELL_ENTRY_TargetCreatureType,
SPELL_ENTRY_RequiresSpellFocus,
SPELL_ENTRY_CasterAuraState,
SPELL_ENTRY_TargetAuraState,
SPELL_ENTRY_unk201_2,
SPELL_ENTRY_unk201_3,
SPELL_ENTRY_CastingTimeIndex,
SPELL_ENTRY_RecoveryTime,
SPELL_ENTRY_CategoryRecoveryTime,
SPELL_ENTRY_InterruptFlags,
SPELL_ENTRY_AuraInterruptFlags,
SPELL_ENTRY_ChannelInterruptFlags,
SPELL_ENTRY_procFlags,
SPELL_ENTRY_procChance,
SPELL_ENTRY_procCharges,
SPELL_ENTRY_maxLevel,
SPELL_ENTRY_baseLevel,
SPELL_ENTRY_spellLevel,
SPELL_ENTRY_DurationIndex,
SPELL_ENTRY_powerType,
SPELL_ENTRY_manaCost,
SPELL_ENTRY_manaCostPerlevel,
SPELL_ENTRY_manaPerSecond,
SPELL_ENTRY_manaPerSecondPerLevel,
SPELL_ENTRY_rangeIndex,
SPELL_ENTRY_speed,
SPELL_ENTRY_modalNextSpell,
SPELL_ENTRY_maxstack,
SPELL_ENTRY_Totem_1,
SPELL_ENTRY_Totem_2,
SPELL_ENTRY_Reagent_1,
SPELL_ENTRY_Reagent_2,
SPELL_ENTRY_Reagent_3,
SPELL_ENTRY_Reagent_4,
SPELL_ENTRY_Reagent_5,
SPELL_ENTRY_Reagent_6,
SPELL_ENTRY_Reagent_7,
SPELL_ENTRY_Reagent_8,
SPELL_ENTRY_ReagentCount_1,
SPELL_ENTRY_ReagentCount_2,
SPELL_ENTRY_ReagentCount_3,
SPELL_ENTRY_ReagentCount_4,
SPELL_ENTRY_ReagentCount_5,
SPELL_ENTRY_ReagentCount_6,
SPELL_ENTRY_ReagentCount_7,
SPELL_ENTRY_ReagentCount_8,
SPELL_ENTRY_EquippedItemClass,
SPELL_ENTRY_EquippedItemSubClass,
SPELL_ENTRY_RequiredItemFlags,
SPELL_ENTRY_Effect_1,
SPELL_ENTRY_Effect_2,
SPELL_ENTRY_Effect_3,
SPELL_ENTRY_EffectDieSides_1,
SPELL_ENTRY_EffectDieSides_2,
SPELL_ENTRY_EffectDieSides_3,
SPELL_ENTRY_EffectBaseDice_1,
SPELL_ENTRY_EffectBaseDice_2,
SPELL_ENTRY_EffectBaseDice_3,
SPELL_ENTRY_EffectDicePerLevel_1,
SPELL_ENTRY_EffectDicePerLevel_2,
SPELL_ENTRY_EffectDicePerLevel_3,
SPELL_ENTRY_EffectRealPointsPerLevel_1,
SPELL_ENTRY_EffectRealPointsPerLevel_2,
SPELL_ENTRY_EffectRealPointsPerLevel_3,
SPELL_ENTRY_EffectBasePoints_1,
SPELL_ENTRY_EffectBasePoints_2,
SPELL_ENTRY_EffectBasePoints_3,
SPELL_ENTRY_EffectMechanic_1,
SPELL_ENTRY_EffectMechanic_2,
SPELL_ENTRY_EffectMechanic_3,
SPELL_ENTRY_EffectImplicitTargetA_1,
SPELL_ENTRY_EffectImplicitTargetA_2,
SPELL_ENTRY_EffectImplicitTargetA_3,
SPELL_ENTRY_EffectImplicitTargetB_1,
SPELL_ENTRY_EffectImplicitTargetB_2,
SPELL_ENTRY_EffectImplicitTargetB_3,
SPELL_ENTRY_EffectRadiusIndex_1,
SPELL_ENTRY_EffectRadiusIndex_2,
SPELL_ENTRY_EffectRadiusIndex_3,
SPELL_ENTRY_EffectApplyAuraName_1,
SPELL_ENTRY_EffectApplyAuraName_2,
SPELL_ENTRY_EffectApplyAuraName_3,
SPELL_ENTRY_EffectAmplitude_1,
SPELL_ENTRY_EffectAmplitude_2,
SPELL_ENTRY_EffectAmplitude_3,
SPELL_ENTRY_Effectunknown_1,
SPELL_ENTRY_Effectunknown_2,
SPELL_ENTRY_Effectunknown_3,
SPELL_ENTRY_EffectChainTarget_1,
SPELL_ENTRY_EffectChainTarget_2,
SPELL_ENTRY_EffectChainTarget_3,
SPELL_ENTRY_EffectSpellGroupRelation_1,
SPELL_ENTRY_EffectSpellGroupRelation_2,
SPELL_ENTRY_EffectSpellGroupRelation_3,
SPELL_ENTRY_EffectMiscValue_1,
SPELL_ENTRY_EffectMiscValue_2,
SPELL_ENTRY_EffectMiscValue_3,
SPELL_ENTRY_EffectTriggerSpell_1,
SPELL_ENTRY_EffectTriggerSpell_2,
SPELL_ENTRY_EffectTriggerSpell_3,
SPELL_ENTRY_EffectPointsPerComboPoint_1,
SPELL_ENTRY_EffectPointsPerComboPoint_2,
SPELL_ENTRY_EffectPointsPerComboPoint_3,
SPELL_ENTRY_SpellVisual,
SPELL_ENTRY_field114,
SPELL_ENTRY_dummy,
SPELL_ENTRY_CoSpell,
SPELL_ENTRY_spellPriority,
SPELL_ENTRY_Name,
SPELL_ENTRY_NameAlt1,
SPELL_ENTRY_NameAlt2,
SPELL_ENTRY_NameAlt3,
SPELL_ENTRY_NameAlt4,
SPELL_ENTRY_NameAlt5,
SPELL_ENTRY_NameAlt6,
SPELL_ENTRY_NameAlt7,
SPELL_ENTRY_NameFlags,
SPELL_ENTRY_Rank,
SPELL_ENTRY_RankAlt1,
SPELL_ENTRY_RankAlt2,
SPELL_ENTRY_RankAlt3,
SPELL_ENTRY_RankAlt4,
SPELL_ENTRY_RankAlt5,
SPELL_ENTRY_RankAlt6,
SPELL_ENTRY_RankAlt7,
SPELL_ENTRY_RankFlags,
SPELL_ENTRY_Description,
SPELL_ENTRY_DescriptionAlt1,
SPELL_ENTRY_DescriptionAlt2,
SPELL_ENTRY_DescriptionAlt3,
SPELL_ENTRY_DescriptionAlt4,
SPELL_ENTRY_DescriptionAlt5,
SPELL_ENTRY_DescriptionAlt6,
SPELL_ENTRY_DescriptionAlt7,
SPELL_ENTRY_DescriptionFlags,
SPELL_ENTRY_BuffDescription,
SPELL_ENTRY_BuffDescriptionAlt1,
SPELL_ENTRY_BuffDescriptionAlt2,
SPELL_ENTRY_BuffDescriptionAlt3,
SPELL_ENTRY_BuffDescriptionAlt4,
SPELL_ENTRY_BuffDescriptionAlt5,
SPELL_ENTRY_BuffDescriptionAlt6,
SPELL_ENTRY_BuffDescriptionAlt7,
SPELL_ENTRY_buffdescflags,
SPELL_ENTRY_ManaCostPercentage,
SPELL_ENTRY_unkflags,
SPELL_ENTRY_StartRecoveryTime,
SPELL_ENTRY_StartRecoveryCategory,
SPELL_ENTRY_SpellFamilyName,
SPELL_ENTRY_SpellGroupType,
SPELL_ENTRY_unkne,
SPELL_ENTRY_MaxTargets,
SPELL_ENTRY_Spell_Dmg_Type,
SPELL_ENTRY_FG,
SPELL_ENTRY_FH,
SPELL_ENTRY_dmg_multiplier_1,
SPELL_ENTRY_dmg_multiplier_2,
SPELL_ENTRY_dmg_multiplier_3,
SPELL_ENTRY_FL,
SPELL_ENTRY_FM,
SPELL_ENTRY_FN,
SPELL_ENTRY_unk201_4,
SPELL_ENTRY_unk201_5,
SPELL_ENTRY_unk201_6
};
// lets make this bitwise for more fun
enum SpellTypes
{
SPELL_TYPE_NONE = 0x00000,
SPELL_TYPE_SEAL = 0x00001,
SPELL_TYPE_ASPECT = 0x00002,
SPELL_TYPE_BLESSING = 0x00004,
SPELL_TYPE_CURSE = 0x00008,
SPELL_TYPE_STING = 0x00010,
SPELL_TYPE_ARMOR = 0x00020,
SPELL_TYPE_AURA = 0x00040,
//hmm these could be named simply incompatible spells. One active at a time
SPELL_TYPE_MARK_GIFT = 0x00080,
SPELL_TYPE_TRACK = 0x00100,
SPELL_TYPE_HUNTER_TRAP = 0x00200,
SPELL_TYPE_MAGE_INTEL = 0x00400,
SPELL_TYPE_MAGE_MAGI = 0x00800,
SPELL_TYPE_MAGE_WARDS = 0x01000,
SPELL_TYPE_PRIEST_SH_PPROT = 0x02000,
SPELL_TYPE_SHIELD = 0x04000,
SPELL_TYPE_FORTITUDE = 0x08000,
SPELL_TYPE_SPIRIT = 0x10000,
SPELL_TYPE_MAGE_AMPL_DUMP = 0x20000,
SPELL_TYPE_WARLOCK_IMMOLATE = 0x40000, //maybe there is a better way to trigger the aura state for immolate spell
SPELL_TYPE_FINISHING_MOVE = 0x80000,
};
inline bool CanAgroHash(uint32 spellhashname)
{
if (spellhashname == 4287212498UL) //hunter's mark
return false;
else
return true;
}
/************************************************************************/
/* IsDamagingSpell, this function seems slow, its only used rarely */
/************************************************************************/
inline bool IsDamagingSpell(SpellEntry *sp)
{
switch (sp->Effect[0])
{
case SPELL_EFFECT_SCHOOL_DAMAGE:
case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE:
case SPELL_EFFECT_HEALTH_LEECH:
case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:
case SPELL_EFFECT_ADD_EXTRA_ATTACKS:
case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:
case SPELL_EFFECT_POWER_BURN:
case SPELL_EFFECT_ATTACK:
return true;
}
switch (sp->Effect[1])
{
case SPELL_EFFECT_SCHOOL_DAMAGE:
case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE:
case SPELL_EFFECT_HEALTH_LEECH:
case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:
case SPELL_EFFECT_ADD_EXTRA_ATTACKS:
case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:
case SPELL_EFFECT_POWER_BURN:
case SPELL_EFFECT_ATTACK:
return true;
}
switch (sp->Effect[2])
{
case SPELL_EFFECT_SCHOOL_DAMAGE:
case SPELL_EFFECT_ENVIRONMENTAL_DAMAGE:
case SPELL_EFFECT_HEALTH_LEECH:
case SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL:
case SPELL_EFFECT_ADD_EXTRA_ATTACKS:
case SPELL_EFFECT_WEAPON_PERCENT_DAMAGE:
case SPELL_EFFECT_POWER_BURN:
case SPELL_EFFECT_ATTACK:
return true;
}
if( sp->Effect[0]==SPELL_EFFECT_APPLY_AURA ||
sp->Effect[0]==SPELL_EFFECT_APPLY_AREA_AURA)
{
switch (sp->EffectApplyAuraName[0])
{
case 3://SPELL_AURA_PERIODIC_DAMAGE:
case 43://SPELL_AURA_PROC_TRIGGER_DAMAGE:
case 89://SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
case 162://SPELL_AURA_POWER_BURN:
return true;
}
}
if( sp->Effect[1]==SPELL_EFFECT_APPLY_AURA ||
sp->Effect[1]==SPELL_EFFECT_APPLY_AREA_AURA)
{
switch (sp->EffectApplyAuraName[1])
{
case 3://SPELL_AURA_PERIODIC_DAMAGE:
case 43://SPELL_AURA_PROC_TRIGGER_DAMAGE:
case 89://SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
case 162://SPELL_AURA_POWER_BURN:
return true;
}
}
if( sp->Effect[2]==SPELL_EFFECT_APPLY_AURA ||
sp->Effect[2]==SPELL_EFFECT_APPLY_AREA_AURA)
{
switch (sp->EffectApplyAuraName[2])
{
case 3://SPELL_AURA_PERIODIC_DAMAGE:
case 43://SPELL_AURA_PROC_TRIGGER_DAMAGE:
case 89://SPELL_AURA_PERIODIC_DAMAGE_PERCENT:
case 162://SPELL_AURA_POWER_BURN:
return true;
}
}
return false;
}
inline bool IsInrange(LocationVector & location)
{
}
inline bool IsInrange(float x1,float y1, float z1, Object * o,float square_r)
{
float r = o->GetDistanceSq(x1, y1, z1);
return ( r<=square_r);
}
inline bool IsInrange(float x1,float y1, float z1,float x2,float y2, float z2,float square_r)
{
float t;
float r;
t=x1-x2;
r=t*t;
t=y1-y2;
r+=t*t;
t=z1-z2;
r+=t*t;
return ( r<=square_r);
}
inline bool IsInrange(Object * o1,Object * o2,float square_r)
{
return IsInrange(o1->GetPositionX(),o1->GetPositionY(),o1->GetPositionZ(),
o2->GetPositionX(),o2->GetPositionY(),o2->GetPositionZ(),square_r);
}
inline bool TargetTypeCheck(Object *obj,uint32 ReqCreatureTypeMask)
{
if(!ReqCreatureTypeMask)
return true;
if(obj->GetTypeId()== TYPEID_UNIT)
{
CreatureInfo *inf = ((Creature*)(obj))->GetCreatureName();
if(!inf || !(1<<(inf->Type-1) & ReqCreatureTypeMask))
return false;
}
else if(obj->GetTypeId() == TYPEID_PLAYER && !(UNIT_TYPE_HUMANOID_BIT & ReqCreatureTypeMask))
return false;
else return false;//omg, how in the hack did we cast it on a GO ? But who cares ?
return true;
}
class SpellCastTargets
{
public:
void read ( WorldPacket & data,uint64 caster );
void write ( WorldPacket & data);
SpellCastTargets() : m_targetMask(0), m_unitTarget(0), m_itemTarget(0), m_srcX(0), m_srcY(0), m_srcZ(0),
m_destX(0), m_destY(0), m_destZ(0) {}
SpellCastTargets(uint16 TargetMask, uint64 unitTarget, uint64 itemTarget, float srcX, float srcY,
float srcZ, float destX, float destY, float destZ) : m_targetMask(TargetMask), m_unitTarget(unitTarget),
m_itemTarget(itemTarget), m_srcX(srcX), m_srcY(srcY), m_srcZ(srcZ), m_destX(destX), m_destY(destY), m_destZ(destZ) {}
SpellCastTargets(uint64 unitTarget) : m_targetMask(0x2), m_unitTarget(unitTarget), m_itemTarget(0),
m_srcX(0), m_srcY(0), m_srcZ(0), m_destX(0), m_destY(0), m_destZ(0) {}
SpellCastTargets(WorldPacket & data, uint64 caster) : m_targetMask(0), m_unitTarget(0), m_itemTarget(0), m_srcX(0), m_srcY(0), m_srcZ(0),
m_destX(0), m_destY(0), m_destZ(0)
{
read(data, caster);
}
SpellCastTargets& operator=(const SpellCastTargets &target)
{
m_unitTarget = target.m_unitTarget;
m_itemTarget = target.m_itemTarget;
m_srcX = target.m_srcX;
m_srcY = target.m_srcY;
m_srcZ = target.m_srcZ;
m_destX = target.m_destX;
m_destY = target.m_destY;
m_destZ = target.m_destZ;
m_strTarget = target.m_strTarget;
m_targetMask = target.m_targetMask;
return *this;
}
uint16 m_targetMask;
uint64 m_unitTarget;
uint64 m_itemTarget;
float m_srcX, m_srcY, m_srcZ;
float m_destX, m_destY, m_destZ;
std::string m_strTarget;
};
enum SpellState
{
SPELL_STATE_NULL = 0,
SPELL_STATE_PREPARING = 1,
SPELL_STATE_CASTING = 2,
SPELL_STATE_FINISHED = 3,
SPELL_STATE_IDLE = 4
};
enum ShapeshiftForm
{
FORM_CAT = 1,
FORM_TREE = 2,
FORM_TRAVEL = 3,
FORM_AQUA = 4,
FORM_BEAR = 5,
FORM_AMBIENT = 6,
FORM_GHOUL = 7,
FORM_DIREBEAR = 8,
FORM_CREATUREBEAR = 14,
FORM_GHOSTWOLF = 16,
FORM_BATTLESTANCE = 17,
FORM_DEFENSIVESTANCE = 18,
FORM_BERSERKERSTANCE = 19,
FORM_SWIFT = 27,
FORM_SHADOW = 28,
FORM_FLIGHT = 29,
FORM_STEALTH = 30,
FORM_MOONKIN = 31,
FORM_SPIRITOFREDEMPTION = 32,
};
enum DISPEL_TYPE
{
DISPEL_ZGTRINKETS = -1,
DISPEL_NULL,
DISPEL_MAGIC,
DISPEL_CURSE,
DISPEL_DISEASE,
DISPEL_POISON,
DISPEL_STEALTH,
DISPEL_INVISIBILTY,
DISPEL_ALL,
DISPEL_SPECIAL_NPCONLY,
DISPEL_FRENZY,
};
enum DISPEL_MECHANIC_TYPE
{
DISPEL_MECHANIC_CHARM = 1,
DISPEL_MECHANIC_FEAR = 5,
DISPEL_MECHANIC_ROOT = 7,
DISPEL_MECHANIC_SLEEP = 10,
DISPEL_MECHANIC_SNARE = 11,
DISPEL_MECHANIC_STUN = 12,
DISPEL_MECHANIC_KNOCKOUT = 14,
DISPEL_MECHANIC_BLEED = 15,
DISPEL_MECHANIC_POLYMORPH = 17,
DISPEL_MECHANIC_BANISH = 18,
DISPEL_MECHANIC_MOUNTED = 21,
};
enum MECHANICS
{
MECHANIC_CHARMED = 1,
MECHANIC_DISORIENTED,
MECHANIC_DISARMED,
MECHANIC_DISTRACED,
MECHANIC_FLEEING,
MECHANIC_CLUMSY,
MECHANIC_ROOTED,
MECHANIC_PACIFIED,
MECHANIC_SILENCED,
MECHANIC_ASLEEP,
MECHANIC_ENSNARED,
MECHANIC_STUNNED,
MECHANIC_FROZEN,
MECHANIC_INCAPACIPATED,
MECHNAIC_BLEEDING,
MECHANIC_HEALING,
MECHANIC_POLYMORPHED,
MECHANIC_BANISHED,
MECHANIC_SHIELDED,
MECHANIC_SHACKLED,
MECHANIC_MOUNTED,
MECHANIC_SEDUCED,
MECHANIC_TURNED,
MECHANIC_HORRIFIED,
MECHANIC_INVULNARABLE,
MECHANIC_INTERRUPTED,
MECHANIC_DAZED
};
typedef enum {
EFF_TARGET_NONE = 0,
EFF_TARGET_SELF = 1,
EFF_TARGET_PET = 5,
EFF_TARGET_SINGLE_ENEMY = 6,
EFF_TARGET_ALL_ENEMY_IN_AREA = 15,
EFF_TARGET_ALL_ENEMY_IN_AREA_INSTANT = 16,
EFF_TARGET_ALL_PARTY_AROUND_CASTER = 20,
EFF_TARGET_SINGLE_FRIEND = 21,
EFF_TARGET_ALL_ENEMIES_AROUND_CASTER = 22,
EFF_TARGET_GAMEOBJECT = 23,
EFF_TARGET_IN_FRONT_OF_CASTER = 24,
EFF_TARGET_DUEL = 25,//Dont know the real name!!!
EFF_TARGET_GAMEOBJECT_ITEM = 26,
EFF_TARGET_ALL_ENEMY_IN_AREA_CHANNELED = 28,
EFF_TARGET_MINION = 32,
EFF_TARGET_SINGLE_PARTY = 35,
EFF_TARGET_ALL_PARTY = 37,
EFF_TARGET_SELF_FISHING = 39,
EFF_TARGET_TOTEM_EARTH = 41,
EFF_TARGET_TOTEM_WATER = 42,
EFF_TARGET_TOTEM_AIR = 43,
EFF_TARGET_TOTEM_FIRE = 44,
EFF_TARGET_CHAIN = 45,
EFF_TARGET_DYNAMIC_OBJECT = 47,//not sure exactly where is used
EFF_TARGET_CURRENT_SELECTION = 53,
EFF_TARGET_PARTY_MEMBER = 57,
EFF_TARGET_AREAEFFECT_PARTY_AND_CLASS = 61,
} SpellEffectTarget;
typedef std::vector TargetsList;
typedef void(Spell::*pSpellEffect)(uint32 i);
#define POWER_TYPE_HEALTH 0xFFFFFFFE
#define POWER_TYPE_MANA 0
#define POWER_TYPE_RAGE 1
#define POWER_TYPE_FOCUS 2
#define POWER_TYPE_ENERGY 3
// we have power type 15 and 31 :S
#define GO_FISHING_BOBBER 35591
#define SPELL_SPELL_CHANNEL_UPDATE_INTERVAL 1000
class DummySpellHandler;
// Spell instance
class SERVER_DECL Spell
{
public:
friend class DummySpellHandler;
Spell( Object* Caster, SpellEntry *info, bool triggered, Aura* aur);
~Spell();
// Fills the targets at the area of effect
void FillAllTargetsInArea(TargetsList *tmpMap,float srcx,float srcy,float srcz, float range);
// Fills the targets at the area of effect. We suppose we already inited this spell and know the details
void FillAllTargetsInArea(float srcx,float srcy,float srcz,uint32 ind);
//get single Enemy as target
uint64 GetSinglePossibleEnemy(float prange=0);
//get single Enemy as target
uint64 GetSinglePossibleFriend(float prange=0);
//generate possible target list for a spell. Use as last resort since it is not acurate
void GenerateTargets(SpellCastTargets *store_buff);
// Fills the target map of the spell packet
void FillTargetMap(uint32);
// See if we hit the target or can it resist (evade/immune/resist on spellgo)
bool DidHit(uint64 target);
// Prepares the spell thats going to cast to targets
void prepare(SpellCastTargets * targets);
// Cancels the current spell
void cancel();
// Update spell state based on time difference
void update(uint32 difftime);
// Casts the spell
void cast(bool);
// Finishes the casted spell
void finish();
// Handle the Effects of the Spell
void HandleEffects(uint64 guid,uint32 i);
// Take Power from the caster based on spell power usage
bool TakePower();
// Has power?
bool HasPower();
// Trigger Spell function that triggers triggered spells
void TriggerSpell();
// Checks the caster is ready for cast
uint8 CanCast(bool);
// Checks the caster has needed items on it
inline int8 CheckItems();
// Removes Reagents if cast is successful
void RemoveItems();
// Calculates the i'th effect value
int32 CalculateEffect(uint32);
// Handles Teleport function
void HandleTeleport(uint32 id, Unit* Target);
// Determines how much skill caster going to gain
void DetermineSkillUp();
// Increases cast time of the spell
void AddTime(uint32 type);
void AddCooldown();
void AddStartCooldown();
bool reflect(Unit *refunit);
inline uint32 getState() { return m_spellState; }
inline void SetUnitTarget(Unit *punit){unitTarget=punit;}
// Send Packet functions
void SendCastResult(int16 result);
void SendSpellStart();
void SendSpellGo();
void SendLogExecute(uint32 damage, uint64 & targetGuid);
void SendInterrupted(uint8 result);
void SendChannelUpdate(uint32 time);
void SendChannelStart(uint32 duration);
void SendResurrectRequest(Player* target);
void SendHealSpellOnPlayer(Object* caster, Object* target, uint32 dmg,bool critical);
void SendHealManaSpellOnPlayer(Object * caster, Object * target, uint32 dmg, uint32 powertype);
void HandleAddAura(uint64 guid);
void writeSpellGoTargets( WorldPacket * data );
void writeSpellMissedTargets( WorldPacket * data );
SpellEntry * m_spellInfo;
uint32 pSpellId;
SpellEntry *ProcedOnSpell; //some spells need to know the origins of the proc too
SpellCastTargets m_targets;
void CreateItem(uint32 itemId);
// Effect Handlers
void SpellEffectNULL(uint32 i);
void SpellEffectInstantKill(uint32 i);
void SpellEffectSchoolDMG(uint32 i);
void SpellEffectDummy(uint32 i);
void SpellEffectTeleportUnits(uint32 i);
void SpellEffectApplyAura(uint32 i);
void SpellEffectPowerDrain(uint32 i);
void SpellEffectHealthLeech(uint32 i);
void SpellEffectHeal(uint32 i);
void SpellEffectQuestComplete(uint32 i);
void SpellEffectWeapondamageNoschool(uint32 i);
void SpellEffectResurrect(uint32 i);
void SpellEffectAddExtraAttacks(uint32 i);
void SpellEffectDodge(uint32 i);
void SpellEffectBlock(uint32 i);
void SpellEffectParry(uint32 i);
void SpellEffectCreateItem(uint32 i);
void SpellEffectPersistentAA(uint32 i);
void SpellEffectSummon(uint32 i);
void SpellEffectLeap(uint32 i);
void SpellEffectEnergize(uint32 i);
void SpellEffectWeaponDmgPerc(uint32 i);
void SpellEffectTriggerMissile(uint32 i);
void SpellEffectOpenLock(uint32 i);
void SpellEffectApplyAA(uint32 i);
void SpellEffectLearnSpell(uint32 i);
void SpellEffectSpellDefense(uint32 i);
void SpellEffectDispel(uint32 i);
void SpellEffectSummonWild(uint32 i);
void SpellEffectSummonGuardian(uint32 i);
void SpellEffectSkillStep(uint32 i);
void SpellEffectSummonObject(uint32 i);
void SpellEffectEnchantItem(uint32 i);
void SpellEffectEnchantItemTemporary(uint32 i);
void SpellEffectTameCreature(uint32 i);
void SpellEffectSummonPet(uint32 i);
void SpellEffectWeapondamage(uint32 i);
void SpellEffectPowerBurn(uint32 i);
void SpellEffectThreat(uint32 i);
void SpellEffectTriggerSpell(uint32 i);
void SpellEffectHealthFunnel(uint32 i);
void SpellEffectPowerFunnel(uint32 i);
void SpellEffectHealMaxHealth(uint32 i);
void SpellEffectInterruptCast(uint32 i);
void SpellEffectDistract(uint32 i);
void SpellEffectPickpocket(uint32 i);
void SpellEffectAddFarsight(uint32 i);
void SpellEffectSummonPossessed(uint32 i);
void SpellEffectCreateSummonTotem(uint32 i);
void SpellEffectHealMechanical(uint32 i);
void SpellEffectSummonObjectWild(uint32 i);
void SpellEffectScriptEffect(uint32 i);
void SpellEffectSanctuary(uint32 i);
void SpellEffectAddComboPoints(uint32 i);
void SpellEffectDuel(uint32 i);
void SpellEffectStuck(uint32 i);
void SpellEffectSummonPlayer(uint32 i);
void SpellEffectActivateObject(uint32 i);
void SpellEffectSummonTotem(uint32 i);
void SpellEffectProficiency(uint32 i);
void SpellEffectSendEvent(uint32 i);
void SpellEffectSkinning(uint32 i);
void SpellEffectCharge(uint32 i);
void SpellEffectSummonCritter(uint32 i);
void SpellEffectKnockBack(uint32 i);
void SpellEffectInebriate(uint32 i);
void SpellEffectFeedPet(uint32 i);
void SpellEffectDismissPet(uint32 i);
void SpellEffectReputation(uint32 i);
void SpellEffectSummonObjectSlot(uint32 i);
void SpellEffectDispelMechanic(uint32 i);
void SpellEffectSummonDeadPet(uint32 i);
void SpellEffectDestroyAllTotems(uint32 i);
void SpellEffectSummonDemon(uint32 i);
void SpellEffectAttackMe(uint32 i);
void SpellEffectSkill(uint32 i);
void SpellEffectApplyPetAura(uint32 i);
void SpellEffectDummyMelee(uint32 i);
void SpellEffectSpellSteal(uint32 i);
void SpellEffectProspecting(uint32 i);
void SpellEffectOpenLockItem(uint32 i);
void SpellEffectSelfResurrect(uint32 i);
void SpellEffectDisenchant(uint32 i);
void SpellEffectWeapon(uint32 i);
void SpellEffectDefense(uint32 i);
void SpellEffectDualWield(uint32 i);
void SpellEffectSkinPlayerCorpse(uint32 i);
void SpellEffectResurrectNew(uint32 i);
void SpellEffectTranformItem(uint32);
void SpellEffectEnvironmentalDamage(uint32);
void SpellEffectLearnPetSpell(uint32 i);
void SpellEffectEnchantHeldItem(uint32 i);
void SpellEffectAddHonor(uint32 i);
void SpellEffectSpawn(uint32 i);
void SpellEffectApplyAura128(uint32 i);
void Heal(int32 amount);
GameObject * g_caster;
Unit * u_caster;
Item * i_caster;
Player * p_caster;
Object * m_caster;
Item * item_to_delete;
// get the diet flags for pet food
inline uint32 GetPetFoodFlags(const char* m_string)
{
if (strstr(m_string, "Meat") || strstr(m_string, "meat"))
return 1;
if (strstr(m_string, "Fish") || strstr(m_string, "fish"))
return 2;
if (strstr(m_string, "Cheese") || strstr(m_string, "cheese"))
return 4;
if (strstr(m_string, "Bread") || strstr(m_string, "bread"))
return 8;
if (strstr(m_string, "Fungus") || strstr(m_string, "fungus"))
return 16;
if (strstr(m_string, "Fruit") || strstr(m_string, "fruit"))
return 32;
return 0;
}
// 15007 = resurecting sickness
inline uint32 GetType()//0 melee,1 magic ,2 ranged
{
//this is dirty fix, we must use weapon class to define dmg type
if(m_spellInfo->Id == SPELL_RANGED_WAND) //wands are magic type. why do we need them as ranged ;P
return SPELL_TYPE_RANGED;
if(m_spellInfo->Spell_Dmg_Type ==1)//1=Magic, 2=Melee, 3=Ranged
return 1;
if(m_spellInfo->Spell_Dmg_Type ==2)
return 0;
if(m_spellInfo->Spell_Dmg_Type ==3)
return 2;
else return 1; //magic is better than ranged for sure ;P
}
std::vector UniqueTargets;
std::vector MissedTargets;
inline Item* GetItemTarget() { return itemTarget; }
inline Unit* GetUnitTarget() { return unitTarget; }
inline Player* GetPlayerTarget() { return playerTarget; }
inline GameObject* GetGameObjectTarget() { return gameObjTarget; }
uint32 chaindamage;
// -------------------------------------------
bool IsAspect();
bool IsSeal();
inline uint32 GetDuration()
{
if(bDurSet)return Dur;
bDurSet=true;
if(m_spellInfo->DurationIndex!=427)//resurrection sickness, has wierd duration
{
SpellDuration *sd=sSpellDuration.LookupEntry(m_spellInfo->DurationIndex);
if(m_spellInfo->DurationIndex)
Dur =::GetDuration(sd);
else
Dur = (uint32)-1;
if(p_caster)
{
uint32 cp=p_caster->m_comboPoints;
if(cp)
{
uint32 bonus=(cp*(sd->Duration3-sd->Duration1))/5;
if(bonus)
{
Dur+=bonus;
m_requiresCP=true;
}
}
}
if(m_spellInfo->SpellGroupType && u_caster)
{
SM_FIValue(u_caster->SM_FDur,(int32*)&Dur,m_spellInfo->SpellGroupType);
SM_PIValue(u_caster->SM_PDur,(int32*)&Dur,m_spellInfo->SpellGroupType);
}
}
else
{
if(u_caster->getLevel()<11) Dur=0;
else if(u_caster ->getLevel()<=20)
Dur =(u_caster->getLevel()-10)*60*1000;
else Dur =10*60*1000;
}
return Dur;
}
inline float GetRadius(uint32 i)
{
if(bRadSet[i])return Rad[i];
bRadSet[i]=true;
Rad[i]=::GetRadius(sSpellRadius.LookupEntry(m_spellInfo->EffectRadiusIndex[i]));
if(m_spellInfo->SpellGroupType && u_caster)
{
SM_FFValue(u_caster->SM_FRadius,&Rad[i],m_spellInfo->SpellGroupType);
SM_PFValue(u_caster->SM_PRadius,&Rad[i],m_spellInfo->SpellGroupType);
}
return Rad[i];
}
inline uint32 GetBaseThreat(uint32 dmg)
{
//there should be a formula to determine what spell cause threat and which don't
/* switch(m_spellInfo->NameHash)
{
//hunter's mark
case 4287212498:
{
return 0;
}break;
}*/
return dmg;
}
bool IsStealthSpell();
bool IsInvisibilitySpell();
int32 damage;
Aura* m_triggeredByAura;
bool m_triggeredSpell;
bool m_AreaAura;
//uint32 TriggerSpellId; // used to set next spell to use
//uint64 TriggerSpellTarget; // used to set next spell target
bool m_requiresCP;
float m_castPositionX;
float m_castPositionY;
float m_castPositionZ;
int32 damageToHit;
uint32 castedItemId;
bool judgement;
void SendCastSuccess(Object * target);
void SendCastSuccess(const uint64& guid);
bool duelSpell;
protected:
bool m_usesMana;
bool failed;//for 5sr
uint32 m_spellState;
int32 m_castTime;
int32 m_timer;
bool m_delayed;
// Current Targets to be used in effect handler
Unit* unitTarget;
Item* itemTarget;
GameObject* gameObjTarget;
Player* playerTarget;
Corpse* corpseTarget;
uint32 add_damage;
int8 cancastresult;
uint32 Dur;
bool bDurSet;
float Rad[3];
bool bRadSet[3];
//void _DamageRangeUpdate();
private:
TargetsList m_targetUnits[3];
void SafeAddTarget(TargetsList* tgt,uint64 guid);
void SafeAddMissedTarget(uint64 guid);
friend class DynamicObject;
void DetermineSkillUp(uint32 skillid,uint32 targetlevel);
void DetermineSkillUp(uint32 skillid);
};
void ApplyDiminishingReturnTimer(uint32 * Duration, Unit * Target, SpellEntry * spell);
void UnapplyDiminishingReturnTimer(Unit * Target, SpellEntry * spell);
uint32 GetDiminishingGroup(uint32 NameHash);
#endif