aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/GameObject
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/server/game/Entities/GameObject
parent53f9abec14613c0823b1ee5363b3f873cc23ece9 (diff)
Core/Scripts: Fix EventScript assert for GameObject::SetDestructibleState (#29131)
Closes #29167
Diffstat (limited to 'src/server/game/Entities/GameObject')
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp6
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h76
2 files changed, 72 insertions, 10 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