aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2023-07-20 17:11:56 +0200
committerGitHub <noreply@github.com>2023-07-20 17:11:56 +0200
commit3aa264d0c74d0425fd335d69e1890bef6dfa1838 (patch)
tree481c78fded52a6558c8a1c6d83c76c4a59447530 /src
parent53f9abec14613c0823b1ee5363b3f873cc23ece9 (diff)
Core/Scripts: Fix EventScript assert for GameObject::SetDestructibleState (#29131)
Closes #29167
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp6
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h76
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp10
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;
}