diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-04-24 00:16:13 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-04-24 00:16:13 +0200 |
commit | 41a04a0c496c8c0c521eeaa76e34fbeb531cc1d9 (patch) | |
tree | 481a8faf79ea916afa5c08dc6c4d8cb80addda68 | |
parent | fddd6cdf3fb342b98d4878d23874f60498d7545a (diff) |
Core/Scripts: Begin unifying triggering gameevents (not the game_event db stuff)
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 56 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 14 | ||||
-rw-r--r-- | src/server/game/Entities/Object/Object.h | 1 | ||||
-rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Events/GameEventSender.cpp | 52 | ||||
-rw-r--r-- | src/server/game/Events/GameEventSender.h | 30 | ||||
-rw-r--r-- | src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 11 |
9 files changed, 123 insertions, 50 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 3996591d41d..f87dce96843 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -25,6 +25,7 @@ #include "CreatureAISelector.h" #include "DatabaseEnv.h" #include "DB2Stores.h" +#include "GameEventSender.h" #include "GameObjectAI.h" #include "GameObjectModel.h" #include "GameObjectPackets.h" @@ -812,8 +813,9 @@ void GameObject::Update(uint32 diff) { if (Battleground* bg = map->GetBG()) { - EventInform(GetGOInfo()->capturePoint.CaptureEventHorde); - bg->SendBroadcastText(GetGOInfo()->capturePoint.CaptureBroadcastHorde, CHAT_MSG_BG_SYSTEM_HORDE); + if (goInfo->capturePoint.CaptureEventHorde) + GameEvents::Trigger(goInfo->capturePoint.CaptureEventHorde, this, this); + bg->SendBroadcastText(goInfo->capturePoint.CaptureBroadcastHorde, CHAT_MSG_BG_SYSTEM_HORDE); } } } @@ -824,8 +826,9 @@ void GameObject::Update(uint32 diff) { if (Battleground* bg = map->GetBG()) { - EventInform(GetGOInfo()->capturePoint.CaptureEventAlliance); - bg->SendBroadcastText(GetGOInfo()->capturePoint.CaptureBroadcastAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE); + if (goInfo->capturePoint.CaptureEventAlliance) + GameEvents::Trigger(goInfo->capturePoint.CaptureEventAlliance, this, this); + bg->SendBroadcastText(goInfo->capturePoint.CaptureBroadcastAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE); } } } @@ -1976,8 +1979,7 @@ void GameObject::Use(Unit* user) if (info->goober.eventID) { TC_LOG_DEBUG("maps.script", "Goober ScriptStart id %u for GO entry %u (GUID " UI64FMTD ").", info->goober.eventID, GetEntry(), GetSpawnId()); - GetMap()->ScriptsStart(sEventScripts, info->goober.eventID, player, this); - EventInform(info->goober.eventID, user); + GameEvents::Trigger(info->goober.eventID, player, this); } // possible quest objective for active quests @@ -2034,10 +2036,7 @@ void GameObject::Use(Unit* user) player->SendCinematicStart(info->camera.camera); if (info->camera.eventID) - { - GetMap()->ScriptsStart(sEventScripts, info->camera.eventID, player, this); - EventInform(info->camera.eventID, user); - } + GameEvents::Trigger(info->camera.eventID, player, this); return; } @@ -2525,22 +2524,6 @@ bool GameObject::IsInRange(float x, float y, float z, float radius) const && dz < info->GeoBoxMax.Z + radius && dz > info->GeoBoxMin.Z - radius; } -void GameObject::EventInform(uint32 eventId, WorldObject* invoker /*= nullptr*/) -{ - if (!eventId) - return; - - if (AI()) - AI()->EventInform(eventId); - - if (GetZoneScript()) - GetZoneScript()->ProcessEvent(this, eventId, invoker); - - if (BattlegroundMap* bgMap = GetMap()->ToBattlegroundMap()) - if (bgMap->GetBG()) - bgMap->GetBG()->ProcessEvent(this, eventId, invoker); -} - uint32 GameObject::GetScriptId() const { if (GameObjectData const* gameObjectData = GetGameObjectData()) @@ -2680,7 +2663,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb break; case GO_DESTRUCTIBLE_DAMAGED: { - EventInform(m_goInfo->destructibleBuilding.DamagedEvent, attackerOrHealer); + if (GetGOInfo()->destructibleBuilding.DamagedEvent) + GameEvents::Trigger(GetGOInfo()->destructibleBuilding.DamagedEvent, attackerOrHealer, this); AI()->Damaged(attackerOrHealer, m_goInfo->destructibleBuilding.DamagedEvent); RemoveFlag(GO_FLAG_DESTROYED); @@ -2705,7 +2689,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb } case GO_DESTRUCTIBLE_DESTROYED: { - EventInform(m_goInfo->destructibleBuilding.DestroyedEvent, attackerOrHealer); + if (GetGOInfo()->destructibleBuilding.DestroyedEvent) + GameEvents::Trigger(GetGOInfo()->destructibleBuilding.DestroyedEvent, attackerOrHealer, this); AI()->Destroyed(attackerOrHealer, m_goInfo->destructibleBuilding.DestroyedEvent); if (Player* player = attackerOrHealer ? attackerOrHealer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr) @@ -2731,7 +2716,8 @@ void GameObject::SetDestructibleState(GameObjectDestructibleState state, WorldOb } case GO_DESTRUCTIBLE_REBUILDING: { - EventInform(m_goInfo->destructibleBuilding.RebuildingEvent, attackerOrHealer); + if (GetGOInfo()->destructibleBuilding.RebuildingEvent) + GameEvents::Trigger(GetGOInfo()->destructibleBuilding.RebuildingEvent, attackerOrHealer, this); RemoveFlag(GO_FLAG_DAMAGED | GO_FLAG_DESTROYED); uint32 modelId = m_goInfo->displayId; @@ -3164,7 +3150,8 @@ void GameObject::AssaultCapturePoint(Player* player) m_goValue.CapturePoint.State = WorldPackets::Battleground::BattlegroundCapturePointState::HordeCaptured; battleground->SendBroadcastText(GetGOInfo()->capturePoint.DefendedBroadcastHorde, CHAT_MSG_BG_SYSTEM_HORDE, player); UpdateCapturePoint(); - EventInform(GetGOInfo()->capturePoint.DefendedEventHorde, player); + if (GetGOInfo()->capturePoint.DefendedEventHorde) + GameEvents::Trigger(GetGOInfo()->capturePoint.DefendedEventHorde, player, this); return; } @@ -3176,7 +3163,8 @@ void GameObject::AssaultCapturePoint(Player* player) m_goValue.CapturePoint.State = WorldPackets::Battleground::BattlegroundCapturePointState::ContestedHorde; battleground->SendBroadcastText(GetGOInfo()->capturePoint.AssaultBroadcastHorde, CHAT_MSG_BG_SYSTEM_HORDE, player); UpdateCapturePoint(); - EventInform(GetGOInfo()->capturePoint.AssaultBroadcastHorde, player); + if (GetGOInfo()->capturePoint.ContestedEventHorde) + GameEvents::Trigger(GetGOInfo()->capturePoint.ContestedEventHorde, player, this); m_goValue.CapturePoint.AssaultTimer = GetGOInfo()->capturePoint.CaptureTime; break; default: @@ -3191,7 +3179,8 @@ void GameObject::AssaultCapturePoint(Player* player) m_goValue.CapturePoint.State = WorldPackets::Battleground::BattlegroundCapturePointState::AllianceCaptured; battleground->SendBroadcastText(GetGOInfo()->capturePoint.DefendedBroadcastAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, player); UpdateCapturePoint(); - EventInform(GetGOInfo()->capturePoint.DefendedEventAlliance, player); + if (GetGOInfo()->capturePoint.DefendedEventAlliance) + GameEvents::Trigger(GetGOInfo()->capturePoint.DefendedEventAlliance, player, this); return; } @@ -3203,7 +3192,8 @@ void GameObject::AssaultCapturePoint(Player* player) m_goValue.CapturePoint.State = WorldPackets::Battleground::BattlegroundCapturePointState::ContestedAlliance; battleground->SendBroadcastText(GetGOInfo()->capturePoint.AssaultBroadcastAlliance, CHAT_MSG_BG_SYSTEM_ALLIANCE, player); UpdateCapturePoint(); - EventInform(GetGOInfo()->capturePoint.ContestedEventAlliance, player); + if (GetGOInfo()->capturePoint.ContestedEventAlliance) + GameEvents::Trigger(GetGOInfo()->capturePoint.ContestedEventAlliance, player, this); m_goValue.CapturePoint.AssaultTimer = GetGOInfo()->capturePoint.CaptureTime; break; default: diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index b032b0018bb..77c5385ccaa 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -295,8 +295,6 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> return GO_DESTRUCTIBLE_INTACT; } - void EventInform(uint32 eventId, WorldObject* invoker = nullptr); - // There's many places not ready for dynamic spawns. This allows them to live on for now. void SetRespawnCompatibilityMode(bool mode = true) { m_respawnCompatibilityMode = mode; } bool GetRespawnCompatibilityMode() {return m_respawnCompatibilityMode; } diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index aede0b4276f..59b82508f79 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -1921,20 +1921,26 @@ void Map::SummonCreatureGroup(uint8 group, std::list<TempSummon*>* list /*= null list->push_back(summon); } -void WorldObject::SetZoneScript() +ZoneScript* WorldObject::FindZoneScript() const { if (Map* map = FindMap()) { if (InstanceMap* instanceMap = map->ToInstanceMap()) - m_zoneScript = reinterpret_cast<ZoneScript*>(instanceMap->GetInstanceScript()); + return reinterpret_cast<ZoneScript*>(instanceMap->GetInstanceScript()); else if (!map->IsBattlegroundOrArena()) { if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(GetZoneId())) - m_zoneScript = bf; + return bf; else - m_zoneScript = sOutdoorPvPMgr->GetZoneScript(GetZoneId()); + return sOutdoorPvPMgr->GetZoneScript(GetZoneId()); } } + return nullptr; +} + +void WorldObject::SetZoneScript() +{ + m_zoneScript = FindZoneScript(); } Scenario* WorldObject::GetScenario() const diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index cd1e47ca26a..8317e80f0b3 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -557,6 +557,7 @@ class TC_GAME_API WorldObject : public Object, public WorldLocation //used to check all object's GetMap() calls when object is not in world! void SetZoneScript(); + ZoneScript* FindZoneScript() const; ZoneScript* GetZoneScript() const { return m_zoneScript; } Scenario* GetScenario() const; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 7046723c4bd..b61722ab83d 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -19,6 +19,7 @@ #include "Cell.h" #include "CellImpl.h" #include "Common.h" +#include "GameEventSender.h" #include "GameObjectAI.h" #include "Log.h" #include "MapManager.h" @@ -759,8 +760,7 @@ void Transport::DoEventIfAny(KeyFrame const& node, bool departure) if (uint32 eventid = departure ? node.Node->DepartureEventID : node.Node->ArrivalEventID) { TC_LOG_DEBUG("maps.script", "Taxi %s event %u of node %u of %s path", departure ? "departure" : "arrival", eventid, node.Node->NodeIndex, GetName().c_str()); - GetMap()->ScriptsStart(sEventScripts, eventid, this, this); - EventInform(eventid); + GameEvents::Trigger(eventid, this, this); } } diff --git a/src/server/game/Events/GameEventSender.cpp b/src/server/game/Events/GameEventSender.cpp new file mode 100644 index 00000000000..a454ce547a2 --- /dev/null +++ b/src/server/game/Events/GameEventSender.cpp @@ -0,0 +1,52 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "GameEventSender.h" +#include "Battleground.h" +#include "GameObject.h" +#include "GameObjectAI.h" +#include "InstanceScript.h" +#include "Map.h" +#include "ObjectMgr.h" +#include "Util.h" + +void GameEvents::Trigger(uint32 gameEventId, WorldObject* source, WorldObject* target) +{ + ASSERT(source || target, "At least one of [source] or [target] must be provided"); + + WorldObject* refForMapAndZoneScript = Coalesce<WorldObject>(source, target); + + ZoneScript* zoneScript = refForMapAndZoneScript->GetZoneScript(); + if (!zoneScript && refForMapAndZoneScript->IsPlayer()) + zoneScript = refForMapAndZoneScript->FindZoneScript(); + + if (zoneScript) + zoneScript->ProcessEvent(target, gameEventId, source); + + Map* map = refForMapAndZoneScript->GetMap(); + if (target) + { + if (GameObject* goTarget = target->ToGameObject()) + if (GameObjectAI* goAI = goTarget->AI()) + goAI->EventInform(gameEventId); + + if (BattlegroundMap* bgMap = map->ToBattlegroundMap()) + bgMap->GetBG()->ProcessEvent(target, gameEventId, source); + } + + map->ScriptsStart(sEventScripts, gameEventId, source, target); +} diff --git a/src/server/game/Events/GameEventSender.h b/src/server/game/Events/GameEventSender.h new file mode 100644 index 00000000000..b2e599ddb51 --- /dev/null +++ b/src/server/game/Events/GameEventSender.h @@ -0,0 +1,30 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef GameEventSender_h__ +#define GameEventSender_h__ + +#include "Define.h" + +class WorldObject; + +namespace GameEvents +{ +TC_GAME_API void Trigger(uint32 gameEventId, WorldObject* source, WorldObject* target); +} + +#endif // GameEventSender_h__ diff --git a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp index 89d990cb3b8..a58b6b7f824 100644 --- a/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp @@ -17,6 +17,7 @@ #include "FlightPathMovementGenerator.h" #include "DB2Stores.h" +#include "GameEventSender.h" #include "Log.h" #include "MapManager.h" #include "MovementDefines.h" @@ -266,7 +267,7 @@ void FlightPathMovementGenerator::DoEventIfAny(Player* owner, TaxiPathNodeEntry if (uint32 eventid = departure ? node->DepartureEventID : node->ArrivalEventID) { TC_LOG_DEBUG("maps.script", "FlightPathMovementGenerator::DoEventIfAny: taxi %s event %u of node %u of path %u for player %s", departure ? "departure" : "arrival", eventid, node->NodeIndex, node->PathID, owner->GetName().c_str()); - owner->GetMap()->ScriptsStart(sEventScripts, eventid, owner, owner); + GameEvents::Trigger(eventid, owner, owner); } } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 41dbd3f3caa..496801f9265 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -35,6 +35,7 @@ #include "DB2Stores.h" #include "DuelPackets.h" #include "DynamicObject.h" +#include "GameEventSender.h" #include "GameObject.h" #include "GameObjectAI.h" #include "GameTime.h" @@ -54,7 +55,6 @@ #include "MotionMaster.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" -#include "Opcodes.h" #include "OutdoorPvPMgr.h" #include "PathGenerator.h" #include "Pet.h" @@ -1072,12 +1072,7 @@ void Spell::EffectSendEvent() TC_LOG_DEBUG("spells", "Spell ScriptStart %u for spellid %u in EffectSendEvent ", effectInfo->MiscValue, m_spellInfo->Id); - if (ZoneScript* zoneScript = m_caster->GetZoneScript()) - zoneScript->ProcessEvent(target, effectInfo->MiscValue, m_caster); - else if (InstanceScript* instanceScript = m_caster->GetInstanceScript()) // needed in case Player is the caster - instanceScript->ProcessEvent(target, effectInfo->MiscValue, m_caster); - - m_caster->GetMap()->ScriptsStart(sEventScripts, effectInfo->MiscValue, m_caster, target); + GameEvents::Trigger(effectInfo->MiscValue, m_caster, target); } void Spell::EffectPowerBurn() @@ -1549,7 +1544,7 @@ void Spell::SendLoot(ObjectGuid guid, LootType loottype) if (gameObjTarget->GetGOInfo()->chest.triggeredEvent) { TC_LOG_DEBUG("spells", "Chest ScriptStart id %u for GO " UI64FMTD, gameObjTarget->GetGOInfo()->chest.triggeredEvent, gameObjTarget->GetSpawnId()); - player->GetMap()->ScriptsStart(sEventScripts, gameObjTarget->GetGOInfo()->chest.triggeredEvent, player, gameObjTarget); + GameEvents::Trigger(gameObjTarget->GetGOInfo()->chest.triggeredEvent, player, gameObjTarget); } // triggering linked GO |