diff options
author | Meji <alvaro.megias@outlook.com> | 2023-07-20 17:11:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-20 17:11:56 +0200 |
commit | 3aa264d0c74d0425fd335d69e1890bef6dfa1838 (patch) | |
tree | 481c78fded52a6558c8a1c6d83c76c4a59447530 | |
parent | 53f9abec14613c0823b1ee5363b3f873cc23ece9 (diff) |
Core/Scripts: Fix EventScript assert for GameObject::SetDestructibleState (#29131)
Closes #29167
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObjectData.h | 76 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 10 |
3 files changed, 78 insertions, 14 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 6a13177d4b5..dc210de3aac 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -3226,7 +3226,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb break; case GO_DESTRUCTIBLE_DAMAGED: { - if (GetGOInfo()->destructibleBuilding.DamagedEvent) + if (GetGOInfo()->destructibleBuilding.DamagedEvent && attackerOrHealer) GameEvents::Trigger(GetGOInfo()->destructibleBuilding.DamagedEvent, attackerOrHealer, this); AI()->Damaged(attackerOrHealer, m_goInfo->destructibleBuilding.DamagedEvent); @@ -3252,7 +3252,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb } case GO_DESTRUCTIBLE_DESTROYED: { - if (GetGOInfo()->destructibleBuilding.DestroyedEvent) + if (GetGOInfo()->destructibleBuilding.DestroyedEvent && attackerOrHealer) GameEvents::Trigger(GetGOInfo()->destructibleBuilding.DestroyedEvent, attackerOrHealer, this); AI()->Destroyed(attackerOrHealer, m_goInfo->destructibleBuilding.DestroyedEvent); @@ -3279,7 +3279,7 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb } case GO_DESTRUCTIBLE_REBUILDING: { - if (GetGOInfo()->destructibleBuilding.RebuildingEvent) + if (GetGOInfo()->destructibleBuilding.RebuildingEvent && attackerOrHealer) GameEvents::Trigger(GetGOInfo()->destructibleBuilding.RebuildingEvent, attackerOrHealer, this); RemoveFlag(GO_FLAG_DAMAGED | GO_FLAG_DESTROYED); diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index a63e85bb9f4..88a76ef7d7d 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -24,6 +24,7 @@ #include "SpawnData.h" #include "WorldPacket.h" #include <array> +#include <set> #include <string> // from `gameobject_template` @@ -1094,17 +1095,78 @@ struct GameObjectTemplate } } - uint32 GetEventScriptId() const + std::set<uint32> GetEventScriptSet() const { + std::set<uint32> eventSet; switch (type) { - case GAMEOBJECT_TYPE_GOOBER: return goober.eventID; - case GAMEOBJECT_TYPE_CHEST: return chest.triggeredEvent; - case GAMEOBJECT_TYPE_CHAIR: return chair.triggeredEvent; - case GAMEOBJECT_TYPE_CAMERA: return camera.eventID; - case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.triggeredEvent; - default: return 0; + case GAMEOBJECT_TYPE_CHEST: + eventSet.insert(chest.triggeredEvent); + break; + case GAMEOBJECT_TYPE_CHAIR: + eventSet.insert(chair.triggeredEvent); + break; + case GAMEOBJECT_TYPE_GOOBER: + eventSet.insert(goober.eventID); + break; + case GAMEOBJECT_TYPE_TRANSPORT: + eventSet.insert(transport.Reached1stfloor); + eventSet.insert(transport.Reached2ndfloor); + eventSet.insert(transport.Reached3rdfloor); + eventSet.insert(transport.Reached4thfloor); + eventSet.insert(transport.Reached5thfloor); + eventSet.insert(transport.Reached6thfloor); + eventSet.insert(transport.Reached7thfloor); + eventSet.insert(transport.Reached8thfloor); + eventSet.insert(transport.Reached9thfloor); + eventSet.insert(transport.Reached10thfloor); + break; + case GAMEOBJECT_TYPE_CAMERA: + eventSet.insert(camera.eventID); + break; + case GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT: + eventSet.insert(moTransport.startEventID); + eventSet.insert(moTransport.stopEventID); + break; + case GAMEOBJECT_TYPE_FLAGDROP: + eventSet.insert(flagDrop.eventID); + break; + case GAMEOBJECT_TYPE_CONTROL_ZONE: + eventSet.insert(controlZone.CaptureEventHorde); + eventSet.insert(controlZone.CaptureEventAlliance); + eventSet.insert(controlZone.ContestedEventHorde); + eventSet.insert(controlZone.ContestedEventAlliance); + eventSet.insert(controlZone.ProgressEventHorde); + eventSet.insert(controlZone.ProgressEventAlliance); + eventSet.insert(controlZone.NeutralEventHorde); + eventSet.insert(controlZone.NeutralEventAlliance); + break; + case GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING: + eventSet.insert(destructibleBuilding.IntactEvent); + eventSet.insert(destructibleBuilding.DamagedEvent); + eventSet.insert(destructibleBuilding.DestroyedEvent); + eventSet.insert(destructibleBuilding.RebuildingEvent); + eventSet.insert(destructibleBuilding.DamageEvent); + break; + case GAMEOBJECT_TYPE_CAPTURE_POINT: + eventSet.insert(capturePoint.ContestedEventHorde); + eventSet.insert(capturePoint.CaptureEventHorde); + eventSet.insert(capturePoint.DefendedEventHorde); + eventSet.insert(capturePoint.ContestedEventAlliance); + eventSet.insert(capturePoint.CaptureEventAlliance); + eventSet.insert(capturePoint.DefendedEventAlliance); + break; + case GAMEOBJECT_TYPE_GATHERING_NODE: + eventSet.insert(gatheringNode.triggeredEvent); + break; + default: + break; } + + // Erase invalid value added from unused GameEvents data fields + eventSet.erase(0); + + return eventSet; } uint32 GetTrivialSkillHigh() const diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index c8e548d1a39..1239fccfaa1 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -5838,8 +5838,10 @@ void ObjectMgr::LoadEventSet() // Load all possible event ids from gameobjects for (auto const& gameObjectTemplatePair : _gameObjectTemplateStore) - if (uint32 eventId = gameObjectTemplatePair.second.GetEventScriptId()) - _eventStore.insert(eventId); + { + EventContainer eventSet = gameObjectTemplatePair.second.GetEventScriptSet(); + _eventStore.insert(eventSet.begin(), eventSet.end()); + } // Load all possible event ids from spells for (SpellNameEntry const* spellNameEntry : sSpellNameStore) @@ -5877,7 +5879,7 @@ void ObjectMgr::LoadEventScripts() for (ScriptMapMap::const_iterator itr = sEventScripts.begin(); itr != sEventScripts.end(); ++itr) { if (!IsValidEvent(itr->first)) - TC_LOG_ERROR("sql.sql", "Table `event_scripts` has script (Id: {}) not referring to any gameobject_template (type 3 data6 field, type 7 data3 field, type 10 data2 field, type 13 data2 field, type 50 data7 field), any taxi path node or any spell effect {}", + TC_LOG_ERROR("sql.sql", "Table `event_scripts` has script (Id: {}) not referring to any gameobject_template (data field referencing GameEvent), any taxi path node or any spell effect {}", itr->first, SPELL_EFFECT_SEND_EVENT); } @@ -5901,7 +5903,7 @@ void ObjectMgr::LoadEventScripts() if (!IsValidEvent(eventId)) { - TC_LOG_ERROR("sql.sql", "Event (ID: {}) not referring to any gameobject_template (type 3 data6 field, type 7 data3 field, type 10 data2 field, type 13 data2 field, type 50 data7 field), any taxi path node or any spell effect {}", + TC_LOG_ERROR("sql.sql", "Event (ID: {}) not referring to any gameobject_template (data field referencing GameEvent), any taxi path node or any spell effect {}", eventId, SPELL_EFFECT_SEND_EVENT); continue; } |