diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Battlegrounds/Battleground.h | 2 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Zones/BattlegroundIC.h | 2 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp | 10 | ||||
-rwxr-xr-x | src/server/game/Battlegrounds/Zones/BattlegroundSA.h | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.cpp | 212 | ||||
-rwxr-xr-x | src/server/game/Entities/GameObject/GameObject.h | 13 | ||||
-rwxr-xr-x | src/server/game/Miscellaneous/SharedDefines.h | 338 | ||||
-rwxr-xr-x | src/server/game/Scripting/ScriptMgr.cpp | 8 | ||||
-rwxr-xr-x | src/server/game/Scripting/ScriptMgr.h | 8 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 30 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.h | 6 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 103 | ||||
-rwxr-xr-x | src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/trial_of_the_crusader.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 2 |
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); } }; |