224 lines
10 KiB
C#
224 lines
10 KiB
C#
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
|
|
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
|
|
|
|
using Framework.Constants;
|
|
using Framework.Dynamic;
|
|
using Game.BattleGrounds;
|
|
using Game.Entities;
|
|
using Game.Networking.Packets;
|
|
using System;
|
|
|
|
namespace Game.Arenas
|
|
{
|
|
class DalaranSewersArena : Arena
|
|
{
|
|
public DalaranSewersArena(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate)
|
|
{
|
|
_events = new EventMap();
|
|
}
|
|
|
|
public override void StartingEventCloseDoors()
|
|
{
|
|
for (int i = DalaranSewersObjectTypes.Door1; i <= DalaranSewersObjectTypes.Door2; ++i)
|
|
SpawnBGObject(i, BattlegroundConst.RespawnImmediately);
|
|
}
|
|
|
|
public override void StartingEventOpenDoors()
|
|
{
|
|
for (int i = DalaranSewersObjectTypes.Door1; i <= DalaranSewersObjectTypes.Door2; ++i)
|
|
DoorOpen(i);
|
|
|
|
for (int i = DalaranSewersObjectTypes.Buff1; i <= DalaranSewersObjectTypes.Buff2; ++i)
|
|
SpawnBGObject(i, 60);
|
|
|
|
_events.ScheduleEvent(DalaranSewersEvents.WaterfallWarning, DalaranSewersData.WaterfallTimerMin, DalaranSewersData.WaterfallTimerMax);
|
|
_events.ScheduleEvent(DalaranSewersEvents.PipeKnockback, DalaranSewersData.PipeKnockbackFirstDelay);
|
|
|
|
SpawnBGObject(DalaranSewersObjectTypes.Water2, BattlegroundConst.RespawnImmediately);
|
|
|
|
DoorOpen(DalaranSewersObjectTypes.Water1); // Turn off collision
|
|
DoorOpen(DalaranSewersObjectTypes.Water2);
|
|
|
|
// Remove effects of Demonic Circle Summon
|
|
foreach (var pair in GetPlayers())
|
|
{
|
|
Player player = _GetPlayer(pair, "BattlegroundDS::StartingEventOpenDoors");
|
|
if (player != null)
|
|
player.RemoveAurasDueToSpell(DalaranSewersSpells.DemonicCircle);
|
|
}
|
|
}
|
|
|
|
public override void HandleAreaTrigger(Player player, uint trigger, bool entered)
|
|
{
|
|
if (GetStatus() != BattlegroundStatus.InProgress)
|
|
return;
|
|
|
|
switch (trigger)
|
|
{
|
|
case 5347:
|
|
case 5348:
|
|
// Remove effects of Demonic Circle Summon
|
|
player.RemoveAurasDueToSpell(DalaranSewersSpells.DemonicCircle);
|
|
|
|
// 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.
|
|
_events.ScheduleEvent(DalaranSewersEvents.PipeKnockback, DalaranSewersData.PipeKnockbackDelay);
|
|
break;
|
|
default:
|
|
base.HandleAreaTrigger(player, trigger, entered);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public override bool SetupBattleground()
|
|
{
|
|
bool result = true;
|
|
result &= AddObject(DalaranSewersObjectTypes.Door1, DalaranSewersGameObjects.Door1, 1350.95f, 817.2f, 20.8096f, 3.15f, 0, 0, 0.99627f, 0.0862864f, BattlegroundConst.RespawnImmediately);
|
|
result &= AddObject(DalaranSewersObjectTypes.Door2, DalaranSewersGameObjects.Door2, 1232.65f, 764.913f, 20.0729f, 6.3f, 0, 0, 0.0310211f, -0.999519f, BattlegroundConst.RespawnImmediately);
|
|
if (!result)
|
|
{
|
|
Log.outError(LogFilter.Sql, "DalaranSewersArena: Failed to spawn door object!");
|
|
return false;
|
|
}
|
|
|
|
// buffs
|
|
result &= AddObject(DalaranSewersObjectTypes.Buff1, DalaranSewersGameObjects.Buff1, 1291.7f, 813.424f, 7.11472f, 4.64562f, 0, 0, 0.730314f, -0.683111f, 120);
|
|
result &= AddObject(DalaranSewersObjectTypes.Buff2, DalaranSewersGameObjects.Buff2, 1291.7f, 768.911f, 7.11472f, 1.55194f, 0, 0, 0.700409f, 0.713742f, 120);
|
|
if (!result)
|
|
{
|
|
Log.outError(LogFilter.Sql, "DalaranSewersArena: Failed to spawn buff object!");
|
|
return false;
|
|
}
|
|
|
|
result &= AddObject(DalaranSewersObjectTypes.Water1, DalaranSewersGameObjects.Water1, 1291.56f, 790.837f, 7.1f, 3.14238f, 0, 0, 0.694215f, -0.719768f, 120);
|
|
result &= AddObject(DalaranSewersObjectTypes.Water2, DalaranSewersGameObjects.Water2, 1291.56f, 790.837f, 7.1f, 3.14238f, 0, 0, 0.694215f, -0.719768f, 120);
|
|
result &= AddCreature(DalaranSewersData.NpcWaterSpout, DalaranSewersCreatureTypes.WaterfallKnockback, 1292.587f, 790.2205f, 7.19796f, 3.054326f, TeamId.Neutral, BattlegroundConst.RespawnImmediately) != null;
|
|
result &= AddCreature(DalaranSewersData.NpcWaterSpout, DalaranSewersCreatureTypes.PipeKnockback1, 1369.977f, 817.2882f, 16.08718f, 3.106686f, TeamId.Neutral, BattlegroundConst.RespawnImmediately) != null;
|
|
result &= AddCreature(DalaranSewersData.NpcWaterSpout, DalaranSewersCreatureTypes.PipeKnockback2, 1212.833f, 765.3871f, 16.09484f, 0.0f, TeamId.Neutral, BattlegroundConst.RespawnImmediately) != null;
|
|
if (!result)
|
|
{
|
|
Log.outError(LogFilter.Sql, "DalaranSewersArena: Failed to spawn collision object!");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override void PostUpdateImpl(uint diff)
|
|
{
|
|
if (GetStatus() != BattlegroundStatus.InProgress)
|
|
return;
|
|
|
|
_events.ExecuteEvents(eventId =>
|
|
{
|
|
switch (eventId)
|
|
{
|
|
case DalaranSewersEvents.WaterfallWarning:
|
|
// Add the water
|
|
DoorClose(DalaranSewersObjectTypes.Water2);
|
|
_events.ScheduleEvent(DalaranSewersEvents.WaterfallOn, DalaranSewersData.WaterWarningDuration);
|
|
break;
|
|
case DalaranSewersEvents.WaterfallOn:
|
|
// Active collision and start knockback timer
|
|
DoorClose(DalaranSewersObjectTypes.Water1);
|
|
_events.ScheduleEvent(DalaranSewersEvents.WaterfallOff, DalaranSewersData.WaterfallDuration);
|
|
_events.ScheduleEvent(DalaranSewersEvents.WaterfallKnockback, DalaranSewersData.WaterfallKnockbackTimer);
|
|
break;
|
|
case DalaranSewersEvents.WaterfallOff:
|
|
// Remove collision and water
|
|
DoorOpen(DalaranSewersObjectTypes.Water1);
|
|
DoorOpen(DalaranSewersObjectTypes.Water2);
|
|
_events.CancelEvent(DalaranSewersEvents.WaterfallKnockback);
|
|
_events.ScheduleEvent(DalaranSewersEvents.WaterfallWarning, DalaranSewersData.WaterfallTimerMin, DalaranSewersData.WaterfallTimerMax);
|
|
break;
|
|
case DalaranSewersEvents.WaterfallKnockback:
|
|
{
|
|
// Repeat knockback while the waterfall still active
|
|
Creature waterSpout = GetBGCreature(DalaranSewersCreatureTypes.WaterfallKnockback);
|
|
if (waterSpout != null)
|
|
waterSpout.CastSpell(waterSpout, DalaranSewersSpells.WaterSpout, true);
|
|
_events.ScheduleEvent(eventId, DalaranSewersData.WaterfallKnockbackTimer);
|
|
}
|
|
break;
|
|
case DalaranSewersEvents.PipeKnockback:
|
|
{
|
|
for (int i = DalaranSewersCreatureTypes.PipeKnockback1; i <= DalaranSewersCreatureTypes.PipeKnockback2; ++i)
|
|
{
|
|
Creature waterSpout = GetBGCreature(i);
|
|
if (waterSpout != null)
|
|
waterSpout.CastSpell(waterSpout, DalaranSewersSpells.Flush, true);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
}
|
|
|
|
EventMap _events = new();
|
|
}
|
|
|
|
struct DalaranSewersEvents
|
|
{
|
|
public const int WaterfallWarning = 1; // Water starting to fall, but no LoS Blocking nor movement blocking
|
|
public const uint WaterfallOn = 2; // LoS and Movement blocking active
|
|
public const uint WaterfallOff = 3;
|
|
public const uint WaterfallKnockback = 4;
|
|
|
|
public const uint PipeKnockback = 5;
|
|
}
|
|
|
|
struct DalaranSewersObjectTypes
|
|
{
|
|
public const int Door1 = 0;
|
|
public const int Door2 = 1;
|
|
public const int Water1 = 2; // Collision
|
|
public const int Water2 = 3;
|
|
public const int Buff1 = 4;
|
|
public const int Buff2 = 5;
|
|
public const int Max = 6;
|
|
}
|
|
|
|
struct DalaranSewersGameObjects
|
|
{
|
|
public const uint Door1 = 192642;
|
|
public const uint Door2 = 192643;
|
|
public const uint Water1 = 194395; // Collision
|
|
public const uint Water2 = 191877;
|
|
public const uint Buff1 = 184663;
|
|
public const uint Buff2 = 184664;
|
|
}
|
|
|
|
struct DalaranSewersCreatureTypes
|
|
{
|
|
public const int WaterfallKnockback = 0;
|
|
public const int PipeKnockback1 = 1;
|
|
public const int PipeKnockback2 = 2;
|
|
public const int Max = 3;
|
|
}
|
|
|
|
struct DalaranSewersData
|
|
{
|
|
// These values are NOT blizzlike... need the correct data!
|
|
public static TimeSpan WaterfallTimerMin = TimeSpan.FromSeconds(30);
|
|
public static TimeSpan WaterfallTimerMax = TimeSpan.FromSeconds(60);
|
|
public static TimeSpan WaterWarningDuration = TimeSpan.FromSeconds(5);
|
|
public static TimeSpan WaterfallDuration = TimeSpan.FromSeconds(30);
|
|
public static TimeSpan WaterfallKnockbackTimer = TimeSpan.FromSeconds(1.5);
|
|
|
|
public static TimeSpan PipeKnockbackFirstDelay = TimeSpan.FromSeconds(5);
|
|
public static TimeSpan PipeKnockbackDelay = TimeSpan.FromSeconds(3);
|
|
public const uint PipeKnockbackTotalCount = 2;
|
|
|
|
public const uint NpcWaterSpout = 28567;
|
|
}
|
|
|
|
struct DalaranSewersSpells
|
|
{
|
|
public const uint Flush = 57405; // Visual And Target Selector For The Starting Knockback From The Pipe
|
|
public const uint FlushKnockback = 61698; // Knockback Effect For Previous Spell (Triggered, Not Needed To Be Cast)
|
|
public const uint WaterSpout = 58873; // Knockback Effect Of The Central Waterfall
|
|
|
|
public const uint DemonicCircle = 48018; // Demonic Circle Summon
|
|
}
|
|
}
|