Core/Battlegrounds: Move some areatrigger handling to scripts (#29700)

This commit is contained in:
Jeremy
2024-02-23 18:09:57 +01:00
committed by GitHub
parent 89438607ae
commit 9c5b8927f8
21 changed files with 77 additions and 186 deletions
@@ -0,0 +1,6 @@
DELETE FROM `areatrigger_scripts` WHERE `entry` IN (6632, 6633, 5347, 5348);
INSERT INTO `areatrigger_scripts` (`entry`, `ScriptName`) VALUES
(6632, 'at_av_exploit'),
(6633, 'at_av_exploit'),
(5347, 'at_ds_pipe_knockback'),
(5348, 'at_ds_pipe_knockback');
@@ -139,32 +139,6 @@ void BattlegroundAB::StartingEventOpenDoors()
TriggerGameEvent(AB_EVENT_START_BATTLE);
}
void BattlegroundAB::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
switch (trigger)
{
case 6635: // Horde Start
case 6634: // Alliance Start
if (GetStatus() == STATUS_WAIT_JOIN && !entered)
TeleportPlayerToExploitLocation(player);
break;
case 3948: // Arathi Basin Alliance Exit.
case 3949: // Arathi Basin Horde Exit.
case 3866: // Stables
case 3869: // Gold Mine
case 3867: // Farm
case 3868: // Lumber Mill
case 3870: // Black Smith
case 4020: // Unk1
case 4021: // Unk2
case 4674: // Unk3
//break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
void BattlegroundAB::_CalculateTeamNodes(uint8& alliance, uint8& horde)
{
alliance = 0;
@@ -222,7 +222,6 @@ class BattlegroundAB : public Battleground
~BattlegroundAB();
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
void Reset() override;
void EndBattleground(Team winner) override;
@@ -450,32 +450,6 @@ void BattlegroundAV::RemovePlayer(Player* player, ObjectGuid /*guid*/, uint32 /*
player->RemoveAurasDueToSpell(AV_BUFF_ARMOR);
}
void BattlegroundAV::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
switch (trigger)
{
case 6633: // Horde Start
case 6632: // Alliance Start
if (GetStatus() == STATUS_WAIT_JOIN && entered)
TeleportPlayerToExploitLocation(player);
break;
case 95:
case 2608:
case 2606:
case 3326:
case 3327:
case 3328:
case 3329:
case 3330:
case 3331:
//Source->Unmount();
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
void BattlegroundAV::EventPlayerDestroyedPoint(GameObject* gameobject)
{
if (!gameobject)
@@ -558,7 +558,6 @@ class BattlegroundAV : public Battleground
void StartingEventOpenDoors() override;
void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override;
void HandleAreaTrigger(Player* player, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
/*general stuff*/
@@ -64,22 +64,6 @@ void BattlegroundBE::StartingEventOpenDoors()
SpawnBGObject(i, 60);
}
void BattlegroundBE::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
switch (trigger)
{
case 4538: // buff trigger?
case 4539: // buff trigger?
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundBE::SetupBattleground()
{
// gates
@@ -58,7 +58,6 @@ class BattlegroundBE : public Arena
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
private:
@@ -120,29 +120,6 @@ void BattlegroundDS::StartingEventOpenDoors()
player->RemoveAurasDueToSpell(SPELL_WARL_DEMONIC_CIRCLE);
}
void BattlegroundDS::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
switch (trigger)
{
case 5347:
case 5348:
// Remove effects of Demonic Circle Summon
player->RemoveAurasDueToSpell(SPELL_WARL_DEMONIC_CIRCLE);
// Someone has get back into the pipes and the knockback has already been performed,
// so we reset the knockback count for kicking the player again into the arena.
if (_pipeKnockBackCount >= BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT)
_pipeKnockBackCount = 0;
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundDS::SetupBattleground()
{
// gates
@@ -165,3 +142,18 @@ bool BattlegroundDS::SetupBattleground()
return true;
}
void BattlegroundDS::SetData(uint32 dataId, uint32 value)
{
Arena::SetData(dataId, value);
if (dataId == BG_DS_DATA_PIPE_KNOCKBACK_COUNT)
_pipeKnockBackCount = value;
}
uint32 BattlegroundDS::GetData(uint32 dataId) const
{
if (dataId == BG_DS_DATA_PIPE_KNOCKBACK_COUNT)
return _pipeKnockBackCount;
return Arena::GetData(dataId);
}
@@ -78,6 +78,7 @@ inline constexpr Seconds BG_DS_WATERFALL_TIMER_MAX = 60s;
inline constexpr Seconds BG_DS_WATERFALL_WARNING_DURATION = 5s;
inline constexpr Seconds BG_DS_WATERFALL_DURATION = 30s;
inline constexpr Milliseconds BG_DS_WATERFALL_KNOCKBACK_TIMER = 1500ms;
inline constexpr uint32 BG_DS_DATA_PIPE_KNOCKBACK_COUNT = 1;
enum BattlegroundDSEvents
{
@@ -98,9 +99,10 @@ class BattlegroundDS : public Arena
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
void SetData(uint32 dataId, uint32 value) override;
uint32 GetData(uint32 dataId) const override;
private:
void PostUpdateImpl(uint32 diff) override;
@@ -354,34 +354,6 @@ void BattlegroundEY::OnFlagStateChange(GameObject* /*flagInBase*/, FlagState /*o
UpdateWorldState(NETHERSTORM_FLAG, AsUnderlyingType(newValue));
}
void BattlegroundEY::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (!player->IsAlive()) //hack code, must be removed later
return;
switch (trigger)
{
case 4530: // Horde Start
case 4531: // Alliance Start
if (GetStatus() == STATUS_WAIT_JOIN && !entered)
TeleportPlayerToExploitLocation(player);
break;
case 4512:
case 4515:
case 4517:
case 4519:
case 4568:
case 4569:
case 4570:
case 4571:
case 5866:
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundEY::SetupBattleground()
{
UpdateWorldState(EY_MAX_RESOURCES, BG_EY_MAX_TEAM_SCORE);
@@ -264,7 +264,6 @@ class BattlegroundEY : public Battleground
/* inherited from BattlegroundClass */
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
void HandleKillPlayer(Player* player, Player* killer) override;
WorldSafeLocsEntry const* GetExploitTeleportLocation(Team team) override;
bool SetupBattleground() override;
@@ -61,22 +61,6 @@ void BattlegroundNA::StartingEventOpenDoors()
SpawnBGObject(i, 60);
}
void BattlegroundNA::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
switch (trigger)
{
case 4536: // buff trigger?
case 4537: // buff trigger?
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundNA::SetupBattleground()
{
// gates
@@ -57,7 +57,6 @@ class BattlegroundNA : public Arena
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
private:
@@ -61,22 +61,6 @@ void BattlegroundRL::StartingEventOpenDoors()
SpawnBGObject(i, 60);
}
void BattlegroundRL::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
switch (trigger)
{
case 4696: // buff trigger?
case 4697: // buff trigger?
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundRL::SetupBattleground()
{
// gates
@@ -53,7 +53,6 @@ class BattlegroundRL : public Arena
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
private:
@@ -80,25 +80,6 @@ void BattlegroundRV::StartingEventOpenDoors()
TogglePillarCollision();
}
void BattlegroundRV::HandleAreaTrigger(Player* player, uint32 trigger, bool entered)
{
if (GetStatus() != STATUS_IN_PROGRESS)
return;
switch (trigger)
{
case 5224:
case 5226:
// fire was removed in 3.2.0
case 5473:
case 5474:
break;
default:
Battleground::HandleAreaTrigger(player, trigger, entered);
break;
}
}
bool BattlegroundRV::SetupBattleground()
{
// elevators
@@ -95,7 +95,6 @@ class BattlegroundRV : public Arena
/* inherited from BattlegroundClass */
void StartingEventOpenDoors() override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
bool SetupBattleground() override;
private:
@@ -327,13 +327,6 @@ void BattlegroundSA::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
void BattlegroundSA::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) { }
void BattlegroundSA::HandleAreaTrigger(Player* /*source*/, uint32 /*trigger*/, bool /*entered*/)
{
// this is wrong way to implement these things. On official it done by gameobject spell cast.
if (GetStatus() != STATUS_IN_PROGRESS)
return;
}
void BattlegroundSA::TeleportPlayers() const
{
for (auto const& [playerGuid, bp] : GetPlayers())
@@ -267,7 +267,6 @@ class BattlegroundSA : public Battleground
/// Called when a player leave battleground
void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
void OnGameObjectCreate(GameObject* gameobject) override;
void DoAction(uint32 actionId, WorldObject* source, WorldObject* target) override;
@@ -177,9 +177,25 @@ private:
TaskScheduler _scheduler;
};
class at_av_exploit : public AreaTriggerScript
{
public:
at_av_exploit() : AreaTriggerScript("at_av_exploit") { }
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
{
if (Battleground* battleground = player->GetBattleground())
if (battleground->GetStatus() == STATUS_WAIT_JOIN)
battleground->TeleportPlayerToExploitLocation(player);
return true;
}
};
void AddSC_alterac_valley()
{
RegisterCreatureAI(npc_av_marshal_or_warmaster);
RegisterGameObjectAI(go_av_capturable_object);
RegisterGameObjectAI(go_av_contested_object);
new at_av_exploit();
}
@@ -24,6 +24,7 @@ SDCategory: Dalaran
Script Data End */
#include "ScriptMgr.h"
#include "BattlegroundDS.h"
#include "Containers.h"
#include "DatabaseEnv.h"
#include "Mail.h"
@@ -253,8 +254,44 @@ private:
EventMap events;
};
class at_ds_pipe_knockback : public AreaTriggerScript
{
public:
at_ds_pipe_knockback() : AreaTriggerScript("at_ds_pipe_knockback") { }
void Trigger(Player* player) const
{
if (Battleground* battleground = player->GetBattleground())
{
if (battleground->GetStatus() != STATUS_IN_PROGRESS)
return;
// Remove effects of Demonic Circle Summon
player->RemoveAurasDueToSpell(SPELL_WARL_DEMONIC_CIRCLE);
// Someone has get back into the pipes and the knockback has already been performed,
// so we reset the knockback count for kicking the player again into the arena.
if (battleground->GetData(BG_DS_DATA_PIPE_KNOCKBACK_COUNT) >= BG_DS_PIPE_KNOCKBACK_TOTAL_COUNT)
battleground->SetData(BG_DS_DATA_PIPE_KNOCKBACK_COUNT, 0);
}
}
bool OnTrigger(Player* player, AreaTriggerEntry const* /*trigger*/) override
{
Trigger(player);
return true;
}
bool OnExit(Player* player, AreaTriggerEntry const* /*trigger*/) override
{
Trigger(player);
return true;
}
};
void AddSC_dalaran()
{
RegisterCreatureAI(npc_mageguard_dalaran);
RegisterCreatureAI(npc_minigob_manabonk);
new at_ds_pipe_knockback();
}