diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Pet.cpp | 1 | ||||
-rw-r--r-- | src/game/Spell.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 222 | ||||
-rw-r--r-- | src/game/Unit.cpp | 25 |
4 files changed, 130 insertions, 120 deletions
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp index 504b78a5aa6..836ee6d8459 100644 --- a/src/game/Pet.cpp +++ b/src/game/Pet.cpp @@ -484,7 +484,6 @@ void Pet::SavePetToDB(PetSaveMode mode) case PET_SAVE_AS_DELETED: { RemoveAllAuras(); - uint32 owner = GUID_LOPART(GetOwnerGUID()); DeleteFromDB(m_charmInfo->GetPetNumber()); break; } diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index b216bc10389..e05673ab63e 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -384,7 +384,7 @@ Spell::Spell( Unit* Caster, SpellEntry const *info, bool triggered, uint64 origi if(!IsPositiveTarget(m_spellInfo->EffectImplicitTargetA[j],m_spellInfo->EffectImplicitTargetB[j])) m_canReflect = true; else - m_canReflect = (m_spellInfo->AttributesEx & (1<<7)) ? true : false; + m_canReflect = (m_spellInfo->AttributesEx & SPELL_ATTR_EX_NEGATIVE) ? true : false; if(m_canReflect) continue; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 7a67018fc3c..14549a2214d 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -29,6 +29,115 @@ SpellMgr::SpellMgr() { + for(int i = 0; i < TOTAL_SPELL_EFFECTS; ++i) + { + switch(i) + { + case SPELL_EFFECT_SUMMON: + case SPELL_EFFECT_SUMMON_WILD: + case SPELL_EFFECT_SUMMON_GUARDIAN: + case SPELL_EFFECT_TRANS_DOOR: //summon object + case SPELL_EFFECT_SUMMON_PET: + case SPELL_EFFECT_SUMMON_POSSESSED: + case SPELL_EFFECT_SUMMON_TOTEM: + case SPELL_EFFECT_SUMMON_OBJECT_WILD: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: + case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: + case SPELL_EFFECT_SUMMON_CRITTER: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: + case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: + case SPELL_EFFECT_SUMMON_DEAD_PET: + case SPELL_EFFECT_SUMMON_DEMON: + case SPELL_EFFECT_ADD_FARSIGHT: + case SPELL_EFFECT_TRIGGER_SPELL_2: //ritual of summon + case SPELL_EFFECT_TRIGGER_MISSILE: + case SPELL_EFFECT_PERSISTENT_AREA_AURA: + EffectTargetType[i] = SPELL_REQUIRE_DEST; + break; + case SPELL_EFFECT_PARRY: // 0 + case SPELL_EFFECT_BLOCK: // 0 + case SPELL_EFFECT_SKILL: // always with dummy 3 as A + case SPELL_EFFECT_LEARN_SPELL: // 0 + case SPELL_EFFECT_TRADE_SKILL: // 0 or 1 + case SPELL_EFFECT_PROFICIENCY: // 0 + EffectTargetType[i] = SPELL_REQUIRE_NONE; + break; + default: + EffectTargetType[i] = SPELL_REQUIRE_UNIT; + break; + } + } + + for(int i = 0; i < TOTAL_SPELL_TARGETS; ++i) + { + switch(i) + { + case TARGET_UNIT_CASTER: + case TARGET_UNIT_CASTER_FISHING: + case TARGET_UNIT_MASTER: + case TARGET_UNIT_PET: + SpellTargetType[i] = TARGET_TYPE_UNIT_CASTER; + break; + case TARGET_UNIT_MINIPET: + case TARGET_UNIT_TARGET_ALLY: + case TARGET_UNIT_TARGET_RAID: + case TARGET_UNIT_TARGET_ANY: + case TARGET_UNIT_SINGLE_UNKNOWN: + case TARGET_UNIT_TARGET_ENEMY: + SpellTargetType[i] = TARGET_TYPE_UNIT_TARGET; + break; + case TARGET_UNIT_CHANNEL: + case TARGET_DEST_CHANNEL: + SpellTargetType[i] = TARGET_TYPE_CHANNEL; + break; + case TARGET_UNIT_AREA_ENEMY_GROUND: + case TARGET_UNIT_AREA_ENEMY: + case TARGET_UNIT_AREA_ALLY_GROUND: + case TARGET_UNIT_AREA_ALLY: + case TARGET_UNIT_AREA_ENTRY_GROUND: + case TARGET_UNIT_AREA_ENTRY: + case TARGET_UNIT_AREA_ENEMY_CHANNEL: + SpellTargetType[i] = TARGET_TYPE_AREA_DEST; + break; + case TARGET_DEST_TARGET_ENEMY: + case TARGET_DEST_TARGET_ENEMY_UNKNOWN: + case TARGET_DEST_TARGET_FRONT: + case TARGET_DEST_TARGET_BACK: + case TARGET_DEST_TARGET_RIGHT: + case TARGET_DEST_TARGET_LEFT: + case TARGET_DEST_TARGET_RANDOM: + case TARGET_DEST_TARGET_RADIUS: + SpellTargetType[i] = TARGET_TYPE_DEST_TARGET; + break; + case TARGET_DEST_CASTER_GROUND: + case TARGET_DEST_CASTER: + case TARGET_DEST_CASTER_FRONT_LEFT: + case TARGET_DEST_CASTER_BACK_LEFT: + case TARGET_DEST_CASTER_BACK_RIGHT: + case TARGET_DEST_CASTER_FRONT_RIGHT: + case TARGET_DEST_CASTER_FRONT: + case TARGET_MINION: + case TARGET_DEST_CASTER_FRONT_LEAP: + case TARGET_DEST_CASTER_FRONT_UNKNOWN: + case TARGET_DEST_CASTER_BACK: + case TARGET_DEST_CASTER_RIGHT: + case TARGET_DEST_CASTER_LEFT: + case TARGET_DEST_CASTER_RANDOM: + case TARGET_DEST_CASTER_RADIUS: + SpellTargetType[i] = TARGET_TYPE_DEST_CASTER; + break; + case TARGET_DEST_DEST_RANDOM: + case TARGET_DEST_DEST: + SpellTargetType[i] = TARGET_TYPE_DEST_DEST; + break; + default: + SpellTargetType[i] = TARGET_TYPE_DEFAULT; + } + } } SpellMgr::~SpellMgr() @@ -503,7 +612,7 @@ bool IsPositiveEffect(uint32 spellId, uint32 effIndex) return false; // AttributesEx check - if(spellproto->AttributesEx & (1<<7)) + if(spellproto->AttributesEx & SPELL_ATTR_EX_NEGATIVE) return false; // ok, positive @@ -1926,117 +2035,6 @@ void SpellMgr::LoadSpellCustomAttr() break; } } - - for(int i = 0; i < TOTAL_SPELL_EFFECTS; ++i) - { - switch(i) - { - case SPELL_EFFECT_SUMMON: - case SPELL_EFFECT_SUMMON_WILD: - case SPELL_EFFECT_SUMMON_GUARDIAN: - case SPELL_EFFECT_TRANS_DOOR: //summon object - case SPELL_EFFECT_SUMMON_PET: - case SPELL_EFFECT_SUMMON_POSSESSED: - case SPELL_EFFECT_SUMMON_TOTEM: - case SPELL_EFFECT_SUMMON_OBJECT_WILD: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT1: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT2: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT3: - case SPELL_EFFECT_SUMMON_TOTEM_SLOT4: - case SPELL_EFFECT_SUMMON_CRITTER: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT1: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT2: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT3: - case SPELL_EFFECT_SUMMON_OBJECT_SLOT4: - case SPELL_EFFECT_SUMMON_DEAD_PET: - case SPELL_EFFECT_SUMMON_DEMON: - case SPELL_EFFECT_ADD_FARSIGHT: - case SPELL_EFFECT_TRIGGER_SPELL_2: //ritual of summon - case SPELL_EFFECT_TRIGGER_MISSILE: - case SPELL_EFFECT_PERSISTENT_AREA_AURA: - EffectTargetType[i] = SPELL_REQUIRE_DEST; - break; - case SPELL_EFFECT_PARRY: // 0 - case SPELL_EFFECT_BLOCK: // 0 - case SPELL_EFFECT_SKILL: // always with dummy 3 as A - case SPELL_EFFECT_LEARN_SPELL: // 0 - case SPELL_EFFECT_TRADE_SKILL: // 0 or 1 - case SPELL_EFFECT_PROFICIENCY: // 0 - EffectTargetType[i] = SPELL_REQUIRE_NONE; - break; - default: - EffectTargetType[i] = SPELL_REQUIRE_UNIT; - break; - } - } - - for(int i = 0; i < TOTAL_SPELL_TARGETS; ++i) - { - switch(i) - { - case TARGET_UNIT_CASTER: - case TARGET_UNIT_CASTER_FISHING: - case TARGET_UNIT_MASTER: - case TARGET_UNIT_PET: - SpellTargetType[i] = TARGET_TYPE_UNIT_CASTER; - break; - case TARGET_UNIT_MINIPET: - case TARGET_UNIT_TARGET_ALLY: - case TARGET_UNIT_TARGET_RAID: - case TARGET_UNIT_TARGET_ANY: - case TARGET_UNIT_SINGLE_UNKNOWN: - case TARGET_UNIT_TARGET_ENEMY: - SpellTargetType[i] = TARGET_TYPE_UNIT_TARGET; - break; - case TARGET_UNIT_CHANNEL: - case TARGET_DEST_CHANNEL: - SpellTargetType[i] = TARGET_TYPE_CHANNEL; - break; - case TARGET_UNIT_AREA_ENEMY_GROUND: - case TARGET_UNIT_AREA_ENEMY: - case TARGET_UNIT_AREA_ALLY_GROUND: - case TARGET_UNIT_AREA_ALLY: - case TARGET_UNIT_AREA_ENTRY_GROUND: - case TARGET_UNIT_AREA_ENTRY: - case TARGET_UNIT_AREA_ENEMY_CHANNEL: - SpellTargetType[i] = TARGET_TYPE_AREA_DEST; - break; - case TARGET_DEST_TARGET_ENEMY: - case TARGET_DEST_TARGET_ENEMY_UNKNOWN: - case TARGET_DEST_TARGET_FRONT: - case TARGET_DEST_TARGET_BACK: - case TARGET_DEST_TARGET_RIGHT: - case TARGET_DEST_TARGET_LEFT: - case TARGET_DEST_TARGET_RANDOM: - case TARGET_DEST_TARGET_RADIUS: - SpellTargetType[i] = TARGET_TYPE_DEST_TARGET; - break; - case TARGET_DEST_CASTER_GROUND: - case TARGET_DEST_CASTER: - case TARGET_DEST_CASTER_FRONT_LEFT: - case TARGET_DEST_CASTER_BACK_LEFT: - case TARGET_DEST_CASTER_BACK_RIGHT: - case TARGET_DEST_CASTER_FRONT_RIGHT: - case TARGET_DEST_CASTER_FRONT: - case TARGET_MINION: - case TARGET_DEST_CASTER_FRONT_LEAP: - case TARGET_DEST_CASTER_FRONT_UNKNOWN: - case TARGET_DEST_CASTER_BACK: - case TARGET_DEST_CASTER_RIGHT: - case TARGET_DEST_CASTER_LEFT: - case TARGET_DEST_CASTER_RANDOM: - case TARGET_DEST_CASTER_RADIUS: - SpellTargetType[i] = TARGET_TYPE_DEST_CASTER; - break; - case TARGET_DEST_DEST_RANDOM: - case TARGET_DEST_DEST: - SpellTargetType[i] = TARGET_TYPE_DEST_DEST; - break; - default: - SpellTargetType[i] = TARGET_TYPE_DEFAULT; - - } - } } void SpellMgr::LoadSpellLinked() diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index a4a08bb40f1..48cda18893d 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -894,15 +894,28 @@ void Unit::CastSpell(Unit* Victim,SpellEntry const *spellInfo, bool triggered, I SpellCastTargets targets; uint32 targetMask = spellInfo->Targets; - targets.setUnitTarget(Victim); - /*if(targetMask & (TARGET_FLAG_UNIT|TARGET_FLAG_UNK2)) + //if(targetMask & (TARGET_FLAG_UNIT|TARGET_FLAG_UNK2)) + for(int i = 0; i < 3; ++i) { - if(!Victim) + if(spellmgr.SpellTargetType[spellInfo->EffectImplicitTargetA[i]] == TARGET_TYPE_UNIT_TARGET) { - sLog.outError("CastSpell: spell id %i by caster: %s %u) does not have unit target", spellInfo->Id,(GetTypeId()==TYPEID_PLAYER ? "player (GUID:" : "creature (Entry:"),(GetTypeId()==TYPEID_PLAYER ? GetGUIDLow() : GetEntry())); - return; + SpellRangeEntry const* srange = sSpellRangeStore.LookupEntry(spellInfo->rangeIndex); + if(srange && GetSpellMaxRange(srange) == 0.0f) + { + Victim = this; + break; + } + else if(!Victim) + { + sLog.outError("CastSpell: spell id %i by caster: %s %u) does not have unit target", spellInfo->Id,(GetTypeId()==TYPEID_PLAYER ? "player (GUID:" : "creature (Entry:"),(GetTypeId()==TYPEID_PLAYER ? GetGUIDLow() : GetEntry())); + return; + } + else + break; } - }*/ + } + targets.setUnitTarget(Victim); + if(targetMask & (TARGET_FLAG_SOURCE_LOCATION|TARGET_FLAG_DEST_LOCATION)) { if(!Victim) |