diff options
| author | Shauren <shauren.trinity@gmail.com> | 2012-10-20 00:02:32 +0200 | 
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2012-10-20 00:02:32 +0200 | 
| commit | c40e9e259599273b4317fe7a980c8f487e6f76e2 (patch) | |
| tree | 78acbe3efe81a391c23ffdeba5cd9f6a6f56f320 | |
| parent | 77a8d6f127b0fd082c2b7072bd512822a6732362 (diff) | |
Core/Spells: Fixed visuals of area spells that use a dynamic object
| -rwxr-xr-x | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 16 | ||||
| -rwxr-xr-x | src/server/game/Entities/DynamicObject/DynamicObject.h | 2 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 | ||||
| -rwxr-xr-x | src/server/game/Spells/Spell.h | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 10 | 
5 files changed, 16 insertions, 20 deletions
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 065333dc9e2..a8f8d54c6d6 100755 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -79,29 +79,23 @@ void DynamicObject::RemoveFromWorld()      }  } -bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type) +bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type)  {      SetMap(caster->GetMap());      Relocate(pos);      if (!IsPositionValid())      { -        sLog->outError(LOG_FILTER_GENERAL, "DynamicObject (spell %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spellId, GetPositionX(), GetPositionY()); +        sLog->outError(LOG_FILTER_GENERAL, "DynamicObject (spell %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spell, GetPositionX(), GetPositionY());          return false;      }      WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetPhaseMask()); -    SetEntry(spellId); +    SetEntry(spell->Id);      SetObjectScale(1);      SetUInt64Value(DYNAMICOBJECT_CASTER, caster->GetGUID()); - -    // The lower word of DYNAMICOBJECT_BYTES must be 0x0001. This value means that the visual radius will be overriden -    // by client for most of the "ground patch" visual effect spells and a few "skyfall" ones like Hurricane. -    // If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but -    // precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells -    // I saw sniffed... -    SetByteValue(DYNAMICOBJECT_BYTES, 0, type); -    SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId); +    SetUInt32Value(DYNAMICOBJECT_BYTES, spell->SpellVisual[0] | (type << 28)); +    SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id);      SetFloatValue(DYNAMICOBJECT_RADIUS, radius);      SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h index 68da99ac668..b988693315f 100755 --- a/src/server/game/Entities/DynamicObject/DynamicObject.h +++ b/src/server/game/Entities/DynamicObject/DynamicObject.h @@ -41,7 +41,7 @@ class DynamicObject : public WorldObject, public GridObject<DynamicObject>          void AddToWorld();          void RemoveFromWorld(); -        bool CreateDynamicObject(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, DynamicObjectType type); +        bool CreateDynamicObject(uint32 guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type);          void Update(uint32 p_time);          void Remove();          void SetDuration(int32 newDuration); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 57f3a7d3711..d3e24394974 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4162,12 +4162,12 @@ void Spell::ExecuteLogEffectInterruptCast(uint8 effIndex, Unit* victim, uint32 s      *m_effectExecuteData[effIndex] << uint32(spellId);  } -void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, uint32 /*itemslot*/, uint32 damage) +void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 slot)  {      InitEffectExecuteData(effIndex);      m_effectExecuteData[effIndex]->append(victim->GetPackGUID()); -    *m_effectExecuteData[effIndex] << uint32(m_spellInfo->Id); -    *m_effectExecuteData[effIndex] << uint32(damage); +    *m_effectExecuteData[effIndex] << int32(itemId); +    *m_effectExecuteData[effIndex] << int32(slot);  }  void Spell::ExecuteLogEffectOpenLock(uint8 effIndex, Object* obj) diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 5b9c0436ef1..a69795bf5e1 100755 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -423,7 +423,7 @@ class Spell          void ExecuteLogEffectTakeTargetPower(uint8 effIndex, Unit* target, uint32 powerType, uint32 powerTaken, float gainMultiplier);          void ExecuteLogEffectExtraAttacks(uint8 effIndex, Unit* victim, uint32 attCount);          void ExecuteLogEffectInterruptCast(uint8 effIndex, Unit* victim, uint32 spellId); -        void ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, uint32 itemslot, uint32 damage); +        void ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 slot);          void ExecuteLogEffectOpenLock(uint8 effIndex, Object* obj);          void ExecuteLogEffectCreateItem(uint8 effIndex, uint32 entry);          void ExecuteLogEffectDestroyItem(uint8 effIndex, uint32 entry); diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 0b62000fb3f..2b2bd53232d 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1683,7 +1683,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)          if (!caster->IsInWorld())              return;          DynamicObject* dynObj = new DynamicObject(false); -        if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL)) +        if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_AREA_SPELL))          {              delete dynObj;              return; @@ -2507,7 +2507,7 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex)          return;      DynamicObject* dynObj = new DynamicObject(true); -    if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS)) +    if (!dynObj->CreateDynamicObject(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo, *destTarget, radius, DYNAMIC_OBJECT_FARSIGHT_FOCUS))      {          delete dynObj;          return; @@ -5142,6 +5142,7 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex)      if (slot < 0)      {          unitTarget->ToPlayer()->DurabilityPointsLossAll(damage, (slot < -1)); +        ExecuteLogEffectDurabilityDamage(effIndex, unitTarget, -1, -1); // -1 -1 pair triggers SPELL_DURABILITY_DAMAGE_ALL event          return;      } @@ -5150,9 +5151,10 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex)          return;      if (Item* item = unitTarget->ToPlayer()->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) +    {          unitTarget->ToPlayer()->DurabilityPointsLoss(item, damage); - -    ExecuteLogEffectDurabilityDamage(effIndex, unitTarget, slot, damage); +        ExecuteLogEffectDurabilityDamage(effIndex, unitTarget, item->GetEntry(), slot); +    }  }  void Spell::EffectDurabilityDamagePCT(SpellEffIndex effIndex)  | 
