diff --git a/Source/Game/Entities/GameObject/GameObject.cs b/Source/Game/Entities/GameObject/GameObject.cs index d8c9c61e8..6d5baa14f 100644 --- a/Source/Game/Entities/GameObject/GameObject.cs +++ b/Source/Game/Entities/GameObject/GameObject.cs @@ -2809,7 +2809,7 @@ namespace Game.Entities break; case GameObjectDestructibleState.Damaged: { - if (GetGoInfo().DestructibleBuilding.DamagedEvent != 0) + if (GetGoInfo().DestructibleBuilding.DamagedEvent != 0 && attackerOrHealer != null) GameEvents.Trigger(GetGoInfo().DestructibleBuilding.DamagedEvent, attackerOrHealer, this); GetAI().Damaged(attackerOrHealer, m_goInfo.DestructibleBuilding.DamagedEvent); @@ -2836,7 +2836,7 @@ namespace Game.Entities } case GameObjectDestructibleState.Destroyed: { - if (GetGoInfo().DestructibleBuilding.DestroyedEvent != 0) + if (GetGoInfo().DestructibleBuilding.DestroyedEvent != 0 && attackerOrHealer != null) GameEvents.Trigger(GetGoInfo().DestructibleBuilding.DestroyedEvent, attackerOrHealer, this); GetAI().Destroyed(attackerOrHealer, m_goInfo.DestructibleBuilding.DestroyedEvent); @@ -2868,7 +2868,7 @@ namespace Game.Entities } case GameObjectDestructibleState.Rebuilding: { - if (GetGoInfo().DestructibleBuilding.RebuildingEvent != 0) + if (GetGoInfo().DestructibleBuilding.RebuildingEvent != 0 && attackerOrHealer != null) GameEvents.Trigger(GetGoInfo().DestructibleBuilding.RebuildingEvent, attackerOrHealer, this); RemoveFlag(GameObjectFlags.Damaged | GameObjectFlags.Destroyed); diff --git a/Source/Game/Entities/GameObject/GameObjectData.cs b/Source/Game/Entities/GameObject/GameObjectData.cs index 7edec4904..11eba7cc6 100644 --- a/Source/Game/Entities/GameObject/GameObjectData.cs +++ b/Source/Game/Entities/GameObject/GameObjectData.cs @@ -5,6 +5,7 @@ using Framework.Collections; using Framework.Constants; using Game.Maps; using Game.Networking.Packets; +using System.Collections.Generic; using System.Numerics; using System.Runtime.InteropServices; @@ -531,23 +532,78 @@ namespace Game.Entities } } - public uint GetEventScriptId() + public List GetEventScriptSet() { + List eventSet = new(); switch (type) { - case GameObjectTypes.Goober: - return Goober.eventID; case GameObjectTypes.Chest: - return Chest.triggeredEvent; + eventSet.Add(Chest.triggeredEvent); + break; case GameObjectTypes.Chair: - return Chest.triggeredEvent; + eventSet.Add(Chair.triggeredEvent); + break; + case GameObjectTypes.Goober: + eventSet.Add(Goober.eventID); + break; + case GameObjectTypes.Transport: + eventSet.Add(Transport.Reached1stfloor); + eventSet.Add(Transport.Reached2ndfloor); + eventSet.Add(Transport.Reached3rdfloor); + eventSet.Add(Transport.Reached4thfloor); + eventSet.Add(Transport.Reached5thfloor); + eventSet.Add(Transport.Reached6thfloor); + eventSet.Add(Transport.Reached7thfloor); + eventSet.Add(Transport.Reached8thfloor); + eventSet.Add(Transport.Reached9thfloor); + eventSet.Add(Transport.Reached10thfloor); + break; case GameObjectTypes.Camera: - return Camera.eventID; + eventSet.Add(Camera.eventID); + break; + case GameObjectTypes.MapObjTransport: + eventSet.Add(MoTransport.startEventID); + eventSet.Add(MoTransport.stopEventID); + break; + case GameObjectTypes.FlagDrop: + eventSet.Add(FlagDrop.eventID); + break; + case GameObjectTypes.ControlZone: + eventSet.Add(ControlZone.CaptureEventHorde); + eventSet.Add(ControlZone.CaptureEventAlliance); + eventSet.Add(ControlZone.ContestedEventHorde); + eventSet.Add(ControlZone.ContestedEventAlliance); + eventSet.Add(ControlZone.ProgressEventHorde); + eventSet.Add(ControlZone.ProgressEventAlliance); + eventSet.Add(ControlZone.NeutralEventHorde); + eventSet.Add(ControlZone.NeutralEventAlliance); + break; + case GameObjectTypes.DestructibleBuilding: + eventSet.Add(DestructibleBuilding.IntactEvent); + eventSet.Add(DestructibleBuilding.DamagedEvent); + eventSet.Add(DestructibleBuilding.DestroyedEvent); + eventSet.Add(DestructibleBuilding.RebuildingEvent); + eventSet.Add(DestructibleBuilding.DamageEvent); + break; + case GameObjectTypes.CapturePoint: + eventSet.Add(CapturePoint.ContestedEventHorde); + eventSet.Add(CapturePoint.CaptureEventHorde); + eventSet.Add(CapturePoint.DefendedEventHorde); + eventSet.Add(CapturePoint.ContestedEventAlliance); + eventSet.Add(CapturePoint.CaptureEventAlliance); + eventSet.Add(CapturePoint.DefendedEventAlliance); + break; case GameObjectTypes.GatheringNode: - return GatheringNode.triggeredEvent; + eventSet.Add(GatheringNode.triggeredEvent); + break; default: - return 0; + break; } + + // Erase invalid value added from unused GameEvents data fields + eventSet.Remove(0); + + return eventSet; } public uint GetTrivialSkillHigh() => type switch diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 8ef32db73..1aaea2551 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -1462,11 +1462,7 @@ namespace Game // Load all possible event ids from gameobjects foreach (var go in _gameObjectTemplateStorage) - { - uint eventId = go.Value.GetEventScriptId(); - if (eventId != 0) - _eventStorage.Add(eventId); - } + _eventStorage.AddRange(go.Value.GetEventScriptSet()); // Load all possible event ids from spells foreach (SpellNameRecord spellNameEntry in CliDB.SpellNameStorage.Values) @@ -1511,7 +1507,7 @@ namespace Game foreach (var script in sEventScripts) { if (!IsValidEvent(script.Key)) - Log.outError(LogFilter.Sql, $"Table `event_scripts` has script (Id: {script.Key}) 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 {SpellEffectName.SendEvent}"); + Log.outError(LogFilter.Sql, $"Table `event_scripts` has script (Id: {script.Key}) not referring to any gameobject_template (data field referencing GameEvent), any taxi path node or any spell effect {SpellEffectName.SendEvent}"); } uint oldMSTime = Time.GetMSTime(); @@ -1532,7 +1528,7 @@ namespace Game if (!IsValidEvent(eventId)) { - Log.outError(LogFilter.Sql, $"Event (ID: {eventId}) 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 {SpellEffectName.SendEvent}"); + Log.outError(LogFilter.Sql, $"Event (ID: {eventId}) not referring to any gameobject_template (data field referencing GameEvent), any taxi path node or any spell effect {SpellEffectName.SendEvent}"); continue; } _eventScriptStorage[eventId] = GetScriptId(scriptName);