aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormegamage <none@none>2008-12-21 14:01:26 -0600
committermegamage <none@none>2008-12-21 14:01:26 -0600
commit1759a7cf5cc7ca5bdcd6c28041ab46a2b143e5d3 (patch)
treecf2e4dcbfe631f8961a5299899b71c78f2e886d0
parent77cd31a92bb01cbb264335428226b651ddf1aa06 (diff)
*Fix abolish poison. (Set caster be taget when range = 0 and target type = single target)
--HG-- branch : trunk
-rw-r--r--src/game/Pet.cpp1
-rw-r--r--src/game/Spell.cpp2
-rw-r--r--src/game/SpellMgr.cpp222
-rw-r--r--src/game/Unit.cpp25
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)