Core/Scripts: Fix EventScript assert for GameObject::SetDestructibleState (#29131)

Closes #29167
This commit is contained in:
Meji
2023-07-20 17:11:56 +02:00
committed by GitHub
parent 53f9abec14
commit 3aa264d0c7
3 changed files with 78 additions and 14 deletions
@@ -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);
@@ -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
+6 -4
View File
@@ -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;
}