aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-04-24 00:16:13 +0200
committerShauren <shauren.trinity@gmail.com>2022-04-24 00:16:13 +0200
commit41a04a0c496c8c0c521eeaa76e34fbeb531cc1d9 (patch)
tree481a8faf79ea916afa5c08dc6c4d8cb80addda68
parentfddd6cdf3fb342b98d4878d23874f60498d7545a (diff)
Core/Scripts: Begin unifying triggering gameevents (not the game_event db stuff)
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp56
-rw-r--r--src/server/game/Entities/GameObject/GameObject.h2
-rw-r--r--src/server/game/Entities/Object/Object.cpp14
-rw-r--r--src/server/game/Entities/Object/Object.h1
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp4
-rw-r--r--src/server/game/Events/GameEventSender.cpp52
-rw-r--r--src/server/game/Events/GameEventSender.h30
-rw-r--r--src/server/game/Movement/MovementGenerators/FlightPathMovementGenerator.cpp3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp11
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