aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Battlegrounds/Battleground.h2
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundIC.cpp6
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundIC.h2
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundSA.cpp10
-rwxr-xr-xsrc/server/game/Battlegrounds/Zones/BattlegroundSA.h2
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.cpp212
-rwxr-xr-xsrc/server/game/Entities/GameObject/GameObject.h13
-rwxr-xr-xsrc/server/game/Miscellaneous/SharedDefines.h338
-rwxr-xr-xsrc/server/game/Scripting/ScriptMgr.cpp8
-rwxr-xr-xsrc/server/game/Scripting/ScriptMgr.h8
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp30
-rwxr-xr-xsrc/server/game/Spells/Spell.h6
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp103
-rwxr-xr-xsrc/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp4
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp2
15 files changed, 387 insertions, 359 deletions
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index ed9305ae0d2..23c7ebcf0d1 100755
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -331,7 +331,7 @@ class Battleground
{
}
- virtual void DestroyGate(Player* /*pl*/, GameObject* /*go*/, uint32 /*destroyedEvent*/) {}
+ virtual void DestroyGate(Player* /*pl*/, GameObject* /*go*/) {}
/* achievement req. */
virtual bool IsAllNodesConrolledByTeam(uint32 /*team*/) const { return false; }
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index d5fd8cca112..aa2c0c982b0 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -817,7 +817,7 @@ void BattlegroundIC::HandleCapturedNodes(ICNodePoint* nodePoint, bool recapture)
}
}
-void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedEvent*/)
+void BattlegroundIC::DestroyGate(Player* player, GameObject* go)
{
GateStatus[GetGateIDFromEntry(go->GetEntry())] = BG_IC_GATE_DESTROYED;
uint32 uws_open = GetWorldStateFromGateEntry(go->GetEntry(), true);
@@ -827,7 +827,7 @@ void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedE
UpdateWorldState(uws_close, 0);
UpdateWorldState(uws_open, 1);
}
- DoorOpen((pl->GetTeamId() == TEAM_ALLIANCE ? BG_IC_GO_HORDE_KEEP_PORTCULLIS : BG_IC_GO_DOODAD_PORTCULLISACTIVE02));
+ DoorOpen((player->GetTeamId() == TEAM_ALLIANCE ? BG_IC_GO_HORDE_KEEP_PORTCULLIS : BG_IC_GO_DOODAD_PORTCULLISACTIVE02));
uint32 lang_entry = 0;
@@ -850,7 +850,7 @@ void BattlegroundIC::DestroyGate(Player* pl, GameObject* go, uint32 /*destroyedE
break;
}
- SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (pl->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP));
+ SendMessage2ToAll(lang_entry, CHAT_MSG_BG_SYSTEM_NEUTRAL, NULL, (player->GetTeamId() == TEAM_ALLIANCE ? LANG_BG_IC_HORDE_KEEP : LANG_BG_IC_ALLIANCE_KEEP));
}
void BattlegroundIC::EventPlayerDamagedGO(Player* /*plr*/, GameObject* /*go*/, uint32 /*eventType*/)
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index af7e72de7d4..6ffdff2da55 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
@@ -879,7 +879,7 @@ class BattlegroundIC : public Battleground
void EventPlayerClickedOnFlag(Player *source, GameObject* /*target_obj*/);
void EventPlayerDamagedGO(Player* /*plr*/, GameObject* go, uint32 eventType);
- void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
+ void DestroyGate(Player* player, GameObject* go);
virtual WorldSafeLocsEntry const* GetClosestGraveYard(Player* player);
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 05cf6fb4240..81c170618b2 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -598,15 +598,15 @@ void BattlegroundSA::DemolisherStartState(bool start)
}
}
-void BattlegroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent)
+void BattlegroundSA::DestroyGate(Player* player, GameObject* go)
{
- uint32 i = GetGateIDFromDestroyEventID(destroyedEvent);
+ uint32 i = GetGateIDFromDestroyEventID(go->GetGOInfo()->building.destroyedEvent);
if (!GateStatus[i])
return;
if (GameObject* g = GetBGObject(i))
{
- if (g->GetGOValue()->building.health == 0)
+ if (g->GetGOValue()->Building.Health == 0)
{
GateStatus[i] = BG_SA_GATE_DESTROYED;
uint32 uws = GetWorldStateFromGateID(i);
@@ -635,9 +635,9 @@ void BattlegroundSA::DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroye
if (i < 5)
DelObject(i+9);
- UpdatePlayerScore(pl, SCORE_DESTROYED_WALL, 1);
+ UpdatePlayerScore(player, SCORE_DESTROYED_WALL, 1);
if (rewardHonor)
- UpdatePlayerScore(pl, SCORE_BONUS_HONOR, (GetBonusHonorFromKill(1)));
+ UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(1));
}
}
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index 33a4bd9ad3f..3623af57792 100755
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
@@ -516,7 +516,7 @@ class BattlegroundSA : public Battleground
* -Update worldstate
* -Delete gameobject in front of door (lighting object, with different colours for each door)
*/
- void DestroyGate(Player* pl, GameObject* /*go*/, uint32 destroyedEvent);
+ void DestroyGate(Player* player, GameObject* go);
/// Update timer worldstate
void SendTime();
/**
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 539a04ef2c6..2f827f08585 100755
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -205,6 +205,9 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
SetEntry(goinfo->entry);
+ // set name for logs usage, doesn't affect anything ingame
+ SetName(goinfo->name);
+
SetUInt32Value(GAMEOBJECT_DISPLAYID, goinfo->displayId);
// GAMEOBJECT_BYTES_1, index at 0, 1, 2 and 3
@@ -214,10 +217,11 @@ bool GameObject::Create(uint32 guidlow, uint32 name_id, Map *map, uint32 phaseMa
SetGoArtKit(0); // unknown what this is
SetByteValue(GAMEOBJECT_BYTES_1, 2, artKit);
- switch(goinfo->type)
+ switch (goinfo->type)
{
case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING:
- m_goValue->building.health = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
+ m_goValue->Building.Health = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
+ m_goValue->Building.MaxHealth = goinfo->building.intactNumHits + goinfo->building.damagedNumHits;
SetGoAnimProgress(255);
break;
case GAMEOBJECT_TYPE_TRANSPORT:
@@ -1676,88 +1680,6 @@ bool GameObject::IsInRange(float x, float y, float z, float radius) const
&& dz < info->maxZ + radius && dz > info->minZ - radius;
}
-void GameObject::TakenDamage(uint32 damage, Unit *who)
-{
- if (!m_goValue->building.health)
- return;
-
- Player* pwho = NULL;
- if (who)
- {
- if (who->GetTypeId() == TYPEID_PLAYER)
- pwho = who->ToPlayer();
- else if (who->IsVehicle() && who->GetCharmerOrOwner())
- pwho = who->GetCharmerOrOwner()->ToPlayer();
- }
-
- if (m_goValue->building.health > damage)
- m_goValue->building.health -= damage;
- else
- m_goValue->building.health = 0;
-
- if (HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED)) // from damaged to destroyed
- {
- if (!m_goValue->building.health)
- {
- RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
- SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
-
- uint32 modelId = m_goInfo->building.destroyedDisplayId;
- if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
- if (modelData->DestroyedDisplayId)
- modelId = modelData->DestroyedDisplayId;
- SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
-
- EventInform(m_goInfo->building.destroyedEvent);
- if (pwho)
- if (Battleground* bg = pwho->GetBattleground())
- {
- bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.destroyedEvent);
- bg->DestroyGate(pwho, this, m_goInfo->building.destroyedEvent);
- }
- sScriptMgr->OnGameObjectDestroyed(this, pwho, m_goInfo->building.destroyedEvent);
- }
- }
- else // from intact to damaged
- {
- if (m_goValue->building.health + damage >= m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits)
- if (pwho)
- if (Battleground* bg = pwho->GetBattleground())
- bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damageEvent);
-
- if (m_goValue->building.health <= m_goInfo->building.damagedNumHits)
- {
- if (!m_goInfo->building.destroyedDisplayId)
- m_goValue->building.health = m_goInfo->building.damagedNumHits;
- else if (!m_goValue->building.health)
- m_goValue->building.health = 1;
-
- SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
-
- uint32 modelId = m_goInfo->building.damagedDisplayId;
- if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
- if (modelData->DamagedDisplayId)
- modelId = modelData->DamagedDisplayId;
- SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
-
- EventInform(m_goInfo->building.damagedEvent);
- sScriptMgr->OnGameObjectDamaged(this, pwho, m_goInfo->building.damagedEvent);
- if (pwho)
- if (Battleground* bg = pwho->GetBattleground())
- bg->EventPlayerDamagedGO(pwho, this, m_goInfo->building.damagedEvent);
- }
- }
- SetGoAnimProgress(m_goValue->building.health*255/(m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits));
-}
-
-void GameObject::Rebuild()
-{
- RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
- SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
- m_goValue->building.health = m_goInfo->building.intactNumHits + m_goInfo->building.damagedNumHits;
- EventInform(m_goInfo->building.rebuildingEvent);
-}
-
void GameObject::EventInform(uint32 eventId)
{
if (eventId && m_zoneScript)
@@ -1807,3 +1729,125 @@ void GameObject::UpdateRotationFields(float rotation2 /*=0.0f*/, float rotation3
SetFloatValue(GAMEOBJECT_PARENTROTATION+2, rotation2);
SetFloatValue(GAMEOBJECT_PARENTROTATION+3, rotation3);
}
+
+void GameObject::ModifyHealth(int32 change, Unit* attackerOrHealer /*= NULL*/, uint32 spellId /*= 0*/)
+{
+ if (!GetGOValue()->Building.MaxHealth || !change)
+ return;
+
+ if (int32(GetGOValue()->Building.Health) + change <= 0)
+ GetGOValue()->Building.Health = 0;
+ else if (int32(GetGOValue()->Building.Health) + change >= int32(GetGOValue()->Building.MaxHealth))
+ GetGOValue()->Building.Health = GetGOValue()->Building.MaxHealth;
+ else
+ GetGOValue()->Building.Health += change;
+
+ SetGoAnimProgress(GetGOValue()->Building.Health * 255 / GetGOValue()->Building.MaxHealth);
+
+ Player* player = attackerOrHealer->GetCharmerOrOwnerPlayerOrPlayerItself();
+
+ // dealing damage, send packet
+ // TODO: is there any packet for healing?
+ if (change < 0 && player)
+ {
+ WorldPacket data(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 8 + 8 + 8 + 4 + 4);
+ data.appendPackGUID(GetGUID());
+ data.appendPackGUID(attackerOrHealer->GetGUID());
+ data.appendPackGUID(player->GetGUID());
+ data << uint32(-change);
+ data << uint32(spellId);
+ player->GetSession()->SendPacket(&data);
+ }
+
+ if (!GetGOValue()->Building.Health)
+ SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED, player, false);
+ else if (GetGOValue()->Building.Health <= GetGOInfo()->building.damagedNumHits)
+ SetDestructibleState(GO_DESTRUCTIBLE_DAMAGED, player, false);
+}
+
+void GameObject::SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker /*= NULL*/, bool setHealth /*= false*/)
+{
+ // the user calling this must know he is already operating on destructible gameobject
+ ASSERT(GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING);
+
+ switch (state)
+ {
+ case GO_DESTRUCTIBLE_INTACT:
+ RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
+ SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
+ if (setHealth)
+ {
+ m_goValue->Building.Health = m_goValue->Building.MaxHealth;
+ SetGoAnimProgress(255);
+ }
+ break;
+ case GO_DESTRUCTIBLE_DAMAGED:
+ {
+ EventInform(m_goInfo->building.damagedEvent);
+ sScriptMgr->OnGameObjectDamaged(this, eventInvoker);
+ if (eventInvoker)
+ if (Battleground* bg = eventInvoker->GetBattleground())
+ bg->EventPlayerDamagedGO(eventInvoker, this, m_goInfo->building.damagedEvent);
+
+ RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
+ SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
+
+ uint32 modelId = m_goInfo->building.damagedDisplayId;
+ if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
+ if (modelData->DamagedDisplayId)
+ modelId = modelData->DamagedDisplayId;
+ SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
+
+ if (setHealth)
+ {
+ m_goValue->Building.Health = m_goInfo->building.damagedNumHits;
+ uint32 maxHealth = m_goValue->Building.MaxHealth;
+ // in this case current health is 0 anyway so just prevent crashing here
+ if (!maxHealth)
+ maxHealth = 1;
+ SetGoAnimProgress(m_goValue->Building.Health * 255 / maxHealth);
+ }
+ break;
+ }
+ case GO_DESTRUCTIBLE_DESTROYED:
+ {
+ sScriptMgr->OnGameObjectDestroyed(this, eventInvoker);
+ EventInform(m_goInfo->building.destroyedEvent);
+ if (eventInvoker)
+ {
+ if (Battleground* bg = eventInvoker->GetBattleground())
+ {
+ bg->EventPlayerDamagedGO(eventInvoker, this, m_goInfo->building.destroyedEvent);
+ bg->DestroyGate(eventInvoker, this);
+ }
+ }
+
+ RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
+ SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
+
+ uint32 modelId = m_goInfo->building.destroyedDisplayId;
+ if (DestructibleModelDataEntry const* modelData = sDestructibleModelDataStore.LookupEntry(m_goInfo->building.destructibleData))
+ if (modelData->DestroyedDisplayId)
+ modelId = modelData->DestroyedDisplayId;
+ SetUInt32Value(GAMEOBJECT_DISPLAYID, modelId);
+
+ if (setHealth)
+ {
+ m_goValue->Building.Health = 0;
+ SetGoAnimProgress(0);
+ }
+ break;
+ }
+ case GO_DESTRUCTIBLE_REBUILDING:
+ RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED | GO_FLAG_DESTROYED);
+ SetUInt32Value(GAMEOBJECT_DISPLAYID, m_goInfo->displayId);
+ EventInform(m_goInfo->building.rebuildingEvent);
+ // restores to full health
+ if (setHealth)
+ {
+ m_goValue->Building.Health = m_goValue->Building.MaxHealth;
+ SetGoAnimProgress(255);
+ }
+ break;
+ }
+}
diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h
index 95be55e595e..8910de9ef8e 100755
--- a/src/server/game/Entities/GameObject/GameObject.h
+++ b/src/server/game/Entities/GameObject/GameObject.h
@@ -541,12 +541,13 @@ union GameObjectValue
struct
{
OPvPCapturePoint *OPvPObj;
- }capturePoint;
+ } CapturePoint;
//33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
{
- uint32 health;
- }building;
+ uint32 Health;
+ uint32 MaxHealth;
+ } Building;
};
// GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some platform
@@ -767,8 +768,10 @@ class GameObject : public WorldObject, public GridObject<GameObject>
void CastSpell(Unit* target, uint32 spell);
void SendCustomAnim(uint32 anim);
bool IsInRange(float x, float y, float z, float radius) const;
- void TakenDamage(uint32 damage, Unit* who = NULL);
- void Rebuild();
+
+ void ModifyHealth(int32 change, Unit* attackerOrHealer = NULL, uint32 spellId = 0);
+ // sets GameObject type 33 destruction flags and optionally default health for that state
+ void SetDestructibleState(GameObjectDestructibleState state, Player* eventInvoker = NULL, bool setHealth = false);
void EventInform(uint32 eventId);
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 54b336345a2..d0ac891b9d9 100755
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -656,171 +656,171 @@ enum Team
enum SpellEffects
{
- SPELL_EFFECT_INSTAKILL = 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_SUMMON_CHANGE_ITEM = 34,
- SPELL_EFFECT_APPLY_AREA_AURA_PARTY = 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_JUMP = 41,
- SPELL_EFFECT_JUMP_DEST = 42,
- SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER= 43,
- SPELL_EFFECT_SKILL_STEP = 44,
- SPELL_EFFECT_ADD_HONOR = 45,
- SPELL_EFFECT_SPAWN = 46,
- SPELL_EFFECT_TRADE_SKILL = 47,
- SPELL_EFFECT_STEALTH = 48,
- SPELL_EFFECT_DETECT = 49,
- 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_CREATE_RANDOM_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_APPLY_AREA_AURA_RAID = 65,
- SPELL_EFFECT_CREATE_MANA_GEM = 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_UNTRAIN_TALENTS = 73,
- SPELL_EFFECT_APPLY_GLYPH = 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_WMO_DAMAGE = 87,
- SPELL_EFFECT_WMO_REPAIR = 88,
- SPELL_EFFECT_WMO_CHANGE = 89,
- SPELL_EFFECT_KILL_CREDIT = 90,
- SPELL_EFFECT_THREAT_ALL = 91,
- SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
- SPELL_EFFECT_FORCE_DESELECT = 93,
- SPELL_EFFECT_SELF_RESURRECT = 94,
- SPELL_EFFECT_SKINNING = 95,
- SPELL_EFFECT_CHARGE = 96,
- SPELL_EFFECT_CAST_BUTTON = 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_112 = 112,
- SPELL_EFFECT_RESURRECT_NEW = 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_AREA_AURA_PET = 119,
- SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
- SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
- SPELL_EFFECT_122 = 122,
- SPELL_EFFECT_SEND_TAXI = 123,
- SPELL_EFFECT_PULL_TOWARDS = 124,
- SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
- SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
- SPELL_EFFECT_PROSPECTING = 127,
- SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
- SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
- SPELL_EFFECT_REDIRECT_THREAT = 130,
- SPELL_EFFECT_131 = 131,
- SPELL_EFFECT_PLAY_MUSIC = 132,
- SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
- SPELL_EFFECT_KILL_CREDIT2 = 134,
- SPELL_EFFECT_CALL_PET = 135,
- SPELL_EFFECT_HEAL_PCT = 136,
- SPELL_EFFECT_ENERGIZE_PCT = 137,
- SPELL_EFFECT_LEAP_BACK = 138,
- SPELL_EFFECT_CLEAR_QUEST = 139,
- SPELL_EFFECT_FORCE_CAST = 140,
- SPELL_EFFECT_FORCE_CAST_WITH_VALUE = 141,
- SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
- SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
- SPELL_EFFECT_KNOCK_BACK_DEST = 144,
- SPELL_EFFECT_PULL_TOWARDS_DEST = 145,
- SPELL_EFFECT_ACTIVATE_RUNE = 146,
- SPELL_EFFECT_QUEST_FAIL = 147,
- SPELL_EFFECT_148 = 148,
- SPELL_EFFECT_CHARGE_DEST = 149,
- SPELL_EFFECT_QUEST_START = 150,
- SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
- SPELL_EFFECT_152 = 152,
- SPELL_EFFECT_CREATE_TAMED_PET = 153,
- SPELL_EFFECT_DISCOVER_TAXI = 154,
- SPELL_EFFECT_TITAN_GRIP = 155,
- SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
- SPELL_EFFECT_CREATE_ITEM_2 = 157,
- SPELL_EFFECT_MILLING = 158,
- SPELL_EFFECT_ALLOW_RENAME_PET = 159,
- SPELL_EFFECT_160 = 160,
- SPELL_EFFECT_TALENT_SPEC_COUNT = 161,
- SPELL_EFFECT_TALENT_SPEC_SELECT = 162,
- SPELL_EFFECT_163 = 163,
- SPELL_EFFECT_REMOVE_AURA = 164,
- TOTAL_SPELL_EFFECTS = 165
+ SPELL_EFFECT_INSTAKILL = 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_SUMMON_CHANGE_ITEM = 34,
+ SPELL_EFFECT_APPLY_AREA_AURA_PARTY = 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_JUMP = 41,
+ SPELL_EFFECT_JUMP_DEST = 42,
+ SPELL_EFFECT_TELEPORT_UNITS_FACE_CASTER = 43,
+ SPELL_EFFECT_SKILL_STEP = 44,
+ SPELL_EFFECT_ADD_HONOR = 45,
+ SPELL_EFFECT_SPAWN = 46,
+ SPELL_EFFECT_TRADE_SKILL = 47,
+ SPELL_EFFECT_STEALTH = 48,
+ SPELL_EFFECT_DETECT = 49,
+ 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_CREATE_RANDOM_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_APPLY_AREA_AURA_RAID = 65,
+ SPELL_EFFECT_CREATE_MANA_GEM = 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_UNTRAIN_TALENTS = 73,
+ SPELL_EFFECT_APPLY_GLYPH = 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_GAMEOBJECT_DAMAGE = 87,
+ SPELL_EFFECT_GAMEOBJECT_REPAIR = 88,
+ SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE = 89,
+ SPELL_EFFECT_KILL_CREDIT = 90,
+ SPELL_EFFECT_THREAT_ALL = 91,
+ SPELL_EFFECT_ENCHANT_HELD_ITEM = 92,
+ SPELL_EFFECT_FORCE_DESELECT = 93,
+ SPELL_EFFECT_SELF_RESURRECT = 94,
+ SPELL_EFFECT_SKINNING = 95,
+ SPELL_EFFECT_CHARGE = 96,
+ SPELL_EFFECT_CAST_BUTTON = 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_112 = 112,
+ SPELL_EFFECT_RESURRECT_NEW = 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_AREA_AURA_PET = 119,
+ SPELL_EFFECT_TELEPORT_GRAVEYARD = 120,
+ SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121,
+ SPELL_EFFECT_122 = 122,
+ SPELL_EFFECT_SEND_TAXI = 123,
+ SPELL_EFFECT_PULL_TOWARDS = 124,
+ SPELL_EFFECT_MODIFY_THREAT_PERCENT = 125,
+ SPELL_EFFECT_STEAL_BENEFICIAL_BUFF = 126,
+ SPELL_EFFECT_PROSPECTING = 127,
+ SPELL_EFFECT_APPLY_AREA_AURA_FRIEND = 128,
+ SPELL_EFFECT_APPLY_AREA_AURA_ENEMY = 129,
+ SPELL_EFFECT_REDIRECT_THREAT = 130,
+ SPELL_EFFECT_131 = 131,
+ SPELL_EFFECT_PLAY_MUSIC = 132,
+ SPELL_EFFECT_UNLEARN_SPECIALIZATION = 133,
+ SPELL_EFFECT_KILL_CREDIT2 = 134,
+ SPELL_EFFECT_CALL_PET = 135,
+ SPELL_EFFECT_HEAL_PCT = 136,
+ SPELL_EFFECT_ENERGIZE_PCT = 137,
+ SPELL_EFFECT_LEAP_BACK = 138,
+ SPELL_EFFECT_CLEAR_QUEST = 139,
+ SPELL_EFFECT_FORCE_CAST = 140,
+ SPELL_EFFECT_FORCE_CAST_WITH_VALUE = 141,
+ SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE = 142,
+ SPELL_EFFECT_APPLY_AREA_AURA_OWNER = 143,
+ SPELL_EFFECT_KNOCK_BACK_DEST = 144,
+ SPELL_EFFECT_PULL_TOWARDS_DEST = 145,
+ SPELL_EFFECT_ACTIVATE_RUNE = 146,
+ SPELL_EFFECT_QUEST_FAIL = 147,
+ SPELL_EFFECT_148 = 148,
+ SPELL_EFFECT_CHARGE_DEST = 149,
+ SPELL_EFFECT_QUEST_START = 150,
+ SPELL_EFFECT_TRIGGER_SPELL_2 = 151,
+ SPELL_EFFECT_152 = 152,
+ SPELL_EFFECT_CREATE_TAMED_PET = 153,
+ SPELL_EFFECT_DISCOVER_TAXI = 154,
+ SPELL_EFFECT_TITAN_GRIP = 155,
+ SPELL_EFFECT_ENCHANT_ITEM_PRISMATIC = 156,
+ SPELL_EFFECT_CREATE_ITEM_2 = 157,
+ SPELL_EFFECT_MILLING = 158,
+ SPELL_EFFECT_ALLOW_RENAME_PET = 159,
+ SPELL_EFFECT_160 = 160,
+ SPELL_EFFECT_TALENT_SPEC_COUNT = 161,
+ SPELL_EFFECT_TALENT_SPEC_SELECT = 162,
+ SPELL_EFFECT_163 = 163,
+ SPELL_EFFECT_REMOVE_AURA = 164,
+ TOTAL_SPELL_EFFECTS = 165
};
enum SpellCastResult
@@ -1492,6 +1492,14 @@ enum GameObjectDynamicLowFlags
GO_DYNFLAG_LO_SPARKLE = 0x08, // makes GO sparkle
};
+enum GameObjectDestructibleState
+{
+ GO_DESTRUCTIBLE_INTACT = 0,
+ GO_DESTRUCTIBLE_DAMAGED = 1,
+ GO_DESTRUCTIBLE_DESTROYED = 2,
+ GO_DESTRUCTIBLE_REBUILDING = 3,
+};
+
enum TextEmotes
{
TEXT_EMOTE_AGREE = 1,
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 16c35efdcf4..a728478d811 100755
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -823,20 +823,20 @@ uint32 ScriptMgr::GetDialogStatus(Player* player, GameObject* go)
return tmpscript->GetDialogStatus(player, go);
}
-void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player, uint32 eventId)
+void ScriptMgr::OnGameObjectDestroyed(GameObject* go, Player* player)
{
ASSERT(go);
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnDestroyed(go, player, eventId);
+ tmpscript->OnDestroyed(go, player);
}
-void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player, uint32 eventId)
+void ScriptMgr::OnGameObjectDamaged(GameObject* go, Player* player)
{
ASSERT(go);
GET_SCRIPT(GameObjectScript, go->GetScriptId(), tmpscript);
- tmpscript->OnDamaged(go, player, eventId);
+ tmpscript->OnDamaged(go, player);
}
void ScriptMgr::OnGameObjectUpdate(GameObject* go, uint32 diff)
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index fb47282e9db..c2b62c67a7c 100755
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -465,9 +465,9 @@ class GameObjectScript : public ScriptObject, public UpdatableScript<GameObject>
virtual uint32 GetDialogStatus(Player* /*player*/, GameObject* /*go*/) { return 100; }
// Called when the gameobject is destroyed (destructible buildings only).
- virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/, uint32 /*eventId*/) { }
+ virtual void OnDestroyed(GameObject* /*go*/, Player* /*player*/) { }
// Called when the gameobject is damaged (destructible buildings only).
- virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/, uint32 /*eventId*/) { }
+ virtual void OnDamaged(GameObject* /*go*/, Player* /*player*/) { }
};
class AreaTriggerScript : public ScriptObject
@@ -865,8 +865,8 @@ class ScriptMgr
bool OnQuestAccept(Player* player, GameObject* go, Quest const* quest);
bool OnQuestReward(Player* player, GameObject* go, Quest const* quest, uint32 opt);
uint32 GetDialogStatus(Player* player, GameObject* go);
- void OnGameObjectDestroyed(GameObject* go, Player* player, uint32 eventId);
- void OnGameObjectDamaged(GameObject* go, Player* player, uint32 eventId);
+ void OnGameObjectDestroyed(GameObject* go, Player* player);
+ void OnGameObjectDamaged(GameObject* go, Player* player);
void OnGameObjectUpdate(GameObject* go, uint32 diff);
public: /* AreaTriggerScript */
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 97dfc8bd188..28849f09386 100755
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -1012,20 +1012,34 @@ void Spell::AddUnitTarget(uint64 unitGUID, uint32 effIndex)
AddUnitTarget(unit, effIndex);
}
-void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
+void Spell::AddGOTarget(GameObject* go, uint32 effIndex)
{
if (m_spellInfo->Effect[effIndex] == 0)
return;
- uint64 targetGUID = pVictim->GetGUID();
+ switch (m_spellInfo->Effect[effIndex])
+ {
+ case SPELL_EFFECT_GAMEOBJECT_DAMAGE:
+ case SPELL_EFFECT_GAMEOBJECT_REPAIR:
+ case SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE:
+ if (go->GetGoType() != GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
+ return;
+ break;
+ default:
+ break;
+ }
+
+ uint64 targetGUID = go->GetGUID();
// Lookup target in already in list
for (std::list<GOTargetInfo>::iterator ihit = m_UniqueGOTargetInfo.begin(); ihit != m_UniqueGOTargetInfo.end(); ++ihit)
+ {
if (targetGUID == ihit->targetGUID) // Found in list
{
ihit->effectMask |= 1 << effIndex; // Add only effect mask
return;
}
+ }
// This is new target calculate data for him
@@ -1038,10 +1052,11 @@ void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
if (m_spellInfo->speed > 0.0f)
{
// calculate spell incoming interval
- float dist = m_caster->GetDistance(pVictim->GetPositionX(), pVictim->GetPositionY(), pVictim->GetPositionZ());
- if (dist < 5.0f) dist = 5.0f;
- target.timeDelay = (uint64) floor(dist / m_spellInfo->speed * 1000.0f);
- if (m_delayMoment == 0 || m_delayMoment>target.timeDelay)
+ float dist = m_caster->GetDistance(go->GetPositionX(), go->GetPositionY(), go->GetPositionZ());
+ if (dist < 5.0f)
+ dist = 5.0f;
+ target.timeDelay = uint64(floor(dist / m_spellInfo->speed * 1000.0f));
+ if (m_delayMoment == 0 || m_delayMoment > target.timeDelay)
m_delayMoment = target.timeDelay;
}
else
@@ -1053,8 +1068,7 @@ void Spell::AddGOTarget(GameObject* pVictim, uint32 effIndex)
void Spell::AddGOTarget(uint64 goGUID, uint32 effIndex)
{
- GameObject* go = m_caster->GetMap()->GetGameObject(goGUID);
- if (go)
+ if (GameObject* go = m_caster->GetMap()->GetGameObject(goGUID))
AddGOTarget(go, effIndex);
}
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index ca95c7cef4c..10ca4ff2e1a 100755
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -369,9 +369,9 @@ class Spell
void EffectQuestFail(SpellEffIndex effIndex);
void EffectQuestStart(SpellEffIndex effIndex);
void EffectRedirectThreat(SpellEffIndex effIndex);
- void EffectWMODamage(SpellEffIndex effIndex);
- void EffectWMORepair(SpellEffIndex effIndex);
- void EffectWMOChange(SpellEffIndex effIndex);
+ void EffectGameObjectDamage(SpellEffIndex effIndex);
+ void EffectGameObjectRepair(SpellEffIndex effIndex);
+ void EffectGameObjectSetDestructionState(SpellEffIndex effIndex);
void EffectActivateRune(SpellEffIndex effIndex);
void EffectCreateTamedPet(SpellEffIndex effIndex);
void EffectDiscoverTaxi(SpellEffIndex effIndex);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index ec274b41ba8..1049a1aef33 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -151,9 +151,9 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]=
&Spell::EffectStuck, // 84 SPELL_EFFECT_STUCK
&Spell::EffectSummonPlayer, // 85 SPELL_EFFECT_SUMMON_PLAYER
&Spell::EffectActivateObject, // 86 SPELL_EFFECT_ACTIVATE_OBJECT
- &Spell::EffectWMODamage, // 87 SPELL_EFFECT_WMO_DAMAGE
- &Spell::EffectWMORepair, // 88 SPELL_EFFECT_WMO_REPAIR
- &Spell::EffectWMOChange, // 89 SPELL_EFFECT_WMO_CHANGE // 0 intact // 1 damaged // 2 destroyed // 3 rebuilding
+ &Spell::EffectGameObjectDamage, // 87 SPELL_EFFECT_GAMEOBJECT_DAMAGE
+ &Spell::EffectGameObjectRepair, // 88 SPELL_EFFECT_GAMEOBJECT_REPAIR
+ &Spell::EffectGameObjectSetDestructionState, // 89 SPELL_EFFECT_GAMEOBJECT_SET_DESTRUCTION_STATE
&Spell::EffectKillCreditPersonal, // 90 SPELL_EFFECT_KILL_CREDIT Kill credit but only for single person
&Spell::EffectUnused, // 91 SPELL_EFFECT_THREAT_ALL one spell: zzOLDBrainwash
&Spell::EffectEnchantHeldItem, // 92 SPELL_EFFECT_ENCHANT_HELD_ITEM
@@ -2133,23 +2133,18 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex)
*/
sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell ScriptStart %u for spellid %u in EffectSendEvent ", m_spellInfo->EffectMiscValue[effIndex], m_spellInfo->Id);
- Object *pTarget;
+ Object* target = NULL;
if (focusObject)
- pTarget = focusObject;
+ target = focusObject;
else if (unitTarget)
- pTarget = unitTarget;
+ target = unitTarget;
else if (gameObjTarget)
- pTarget = gameObjTarget;
- else
- pTarget = NULL;
+ target = gameObjTarget;
- if (unitTarget)
- {
- if (ZoneScript* zoneScript = unitTarget->GetZoneScript())
- zoneScript->ProcessEvent(unitTarget, m_spellInfo->EffectMiscValue[effIndex]);
- }
+ if (ZoneScript* zoneScript = m_caster->GetZoneScript())
+ zoneScript->ProcessEvent(unitTarget, m_spellInfo->EffectMiscValue[effIndex]);
- m_caster->GetMap()->ScriptsStart(sEventScripts, m_spellInfo->EffectMiscValue[effIndex], m_caster, pTarget);
+ m_caster->GetMap()->ScriptsStart(sEventScripts, m_spellInfo->EffectMiscValue[effIndex], m_caster, target);
}
void Spell::EffectPowerBurn(SpellEffIndex effIndex)
@@ -6760,73 +6755,37 @@ void Spell::EffectRedirectThreat(SpellEffIndex /*effIndex*/)
m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID());
}
-void Spell::EffectWMODamage(SpellEffIndex /*effIndex*/)
+void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/)
{
- if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
- {
- Unit* caster = m_originalCaster;
- if (!caster)
- return;
+ if (!gameObjTarget)
+ return;
- // Do not allow damage if hp is 0
- if (gameObjTarget->GetGOValue()->building.health == 0)
- return;
+ Unit* caster = m_originalCaster;
+ if (!caster)
+ return;
- FactionTemplateEntry const *casterft, *goft;
- casterft = caster->getFactionTemplateEntry();
- goft = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION));
- // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons)
- if ((casterft && goft && !casterft->IsFriendlyTo(*goft)) || !goft)
- {
- gameObjTarget->TakenDamage(uint32(damage), caster);
- WorldPacket data(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, 8+8+8+4+4);
- data.append(gameObjTarget->GetPackGUID());
- data.append(caster->GetPackGUID());
- if (Unit* who = caster->GetCharmerOrOwner())
- data.append(who->GetPackGUID());
- else
- data << uint8(0);
- data << uint32(damage);
- data << uint32(m_spellInfo->Id);
- gameObjTarget->SendMessageToSet(&data, false);
- }
- }
+ FactionTemplateEntry const* casterFaction = caster->getFactionTemplateEntry();
+ FactionTemplateEntry const* targetFaction = sFactionTemplateStore.LookupEntry(gameObjTarget->GetUInt32Value(GAMEOBJECT_FACTION));
+ // Do not allow to damage GO's of friendly factions (ie: Wintergrasp Walls/Ulduar Storm Beacons)
+ if ((casterFaction && targetFaction && !casterFaction->IsFriendlyTo(*targetFaction)) || !targetFaction)
+ gameObjTarget->ModifyHealth(-damage, caster, GetSpellInfo()->Id);
}
-void Spell::EffectWMORepair(SpellEffIndex /*effIndex*/)
+void Spell::EffectGameObjectRepair(SpellEffIndex /*effIndex*/)
{
- if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
- gameObjTarget->Rebuild();
+ if (!gameObjTarget)
+ return;
+
+ gameObjTarget->ModifyHealth(damage, m_caster);
}
-void Spell::EffectWMOChange(SpellEffIndex effIndex)
+void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex)
{
- if (gameObjTarget && gameObjTarget->GetGoType() == GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING)
- {
- Unit* caster = m_originalCaster;
- if (!caster)
- return;
+ if (!gameObjTarget || !m_originalCaster)
+ return;
- int ChangeType = m_spellInfo->EffectMiscValue[effIndex];
- switch (ChangeType)
- {
- case 0: // intact
- if (gameObjTarget->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED))
- gameObjTarget->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
- if (gameObjTarget->HasFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED))
- gameObjTarget->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
- break;
- case 1: // damaged
- gameObjTarget->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DAMAGED);
- break;
- case 2: // destroyed
- gameObjTarget->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_DESTROYED);
- break;
- case 3: // rebuild
- gameObjTarget->Rebuild();
- break;
- }
- }
+ Player* player = m_originalCaster->GetCharmerOrOwnerPlayerOrPlayerItself();
+ gameObjTarget->SetDestructibleState(GameObjectDestructibleState(m_spellInfo->EffectMiscValue[effIndex]), player, true);
}
void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const *properties)
diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
index ffe940acb27..bdccc540bb6 100755
--- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
+++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp
@@ -204,7 +204,7 @@ class npc_announcer_toc10 : public CreatureScript
return true;
if (GameObject* floor = GameObject::GetGameObject(*player, instanceScript->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
- floor->TakenDamage(1000000);
+ floor->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
creature->CastSpell(creature, 69016, false);
@@ -319,7 +319,7 @@ class boss_lich_king_toc : public CreatureScript
break;
case 5080:
if (GameObject* pGoFloor = m_pInstance->instance->GetGameObject(m_pInstance->GetData64(GO_ARGENT_COLISEUM_FLOOR)))
- pGoFloor->TakenDamage(1000000);
+ pGoFloor->SetDestructibleState(GO_DESTRUCTIBLE_DESTROYED);
me->CastSpell(me, 69016, false);
if (m_pInstance)
{
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index 41c7a3898de..5d8584e3cd1 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -983,7 +983,7 @@ class spell_gen_seaforium_blast : public SpellScriptLoader
void Register()
{
- OnEffect += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_WMO_DAMAGE);
+ OnEffect += SpellEffectFn(spell_gen_seaforium_blast_SpellScript::AchievementCredit, EFFECT_1, SPELL_EFFECT_GAMEOBJECT_DAMAGE);
}
};