server-master/srcs/_plugins/Plugin.Act4/Commands/Act4DungeonCommandsModule.cs
2026-02-10 18:21:30 +01:00

106 lines
No EOL
3.9 KiB
C#

using System;
using System.Linq;
using System.Threading.Tasks;
using PhoenixLib.Events;
using PhoenixLib.Logging;
using Qmmands;
using WingsAPI.Scripting.ScriptManager;
using WingsEmu.Commands.Entities;
using WingsEmu.Game.Act4;
using WingsEmu.Game.Act4.Event;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Maps.Event;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
namespace Plugin.Act4.Commands;
public partial class Act4CommandsModule
{
[Group("dungeon", "dungeons", "raid", "raids")]
[Description("Module related to Act4 Dungeons management commands.")]
public class Act4DungeonCommandsModule : SaltyModuleBase
{
private readonly IAct4DungeonManager _act4DungeonManager;
private readonly IAsyncEventPipeline _asyncEventPipeline;
private readonly IDungeonScriptManager _dungeonScriptManager;
public Act4DungeonCommandsModule(IAsyncEventPipeline asyncEventPipeline, IDungeonScriptManager dungeonScriptManager, IAct4DungeonManager act4DungeonManager)
{
_asyncEventPipeline = asyncEventPipeline;
_dungeonScriptManager = dungeonScriptManager;
_act4DungeonManager = act4DungeonManager;
}
[Command("reload")]
public async Task ReloadDungeons()
{
try
{
_dungeonScriptManager.Load();
Context.Player.SendSuccessChatMessage("Dungeons reloaded, check your console output!");
}
catch (Exception e)
{
Log.Error("[ACT4_DUNGEON_SYSTEM] Reload failed: ", e);
Context.Player.SendErrorChatMessage("Dungeons reload failed!");
}
}
[Command("start")]
public async Task StartDungeon(DungeonType dungeonType, FactionType factionType = FactionType.Neutral)
{
await _asyncEventPipeline.ProcessEventAsync(
new Act4DungeonSystemStartEvent(factionType == FactionType.Neutral ? Context.Player.PlayerEntity.Faction : factionType, dungeonType));
}
[Command("stop")]
public async Task StopDungeon()
{
await _asyncEventPipeline.ProcessEventAsync(new Act4DungeonSystemStopEvent());
}
[Command("open")]
public async Task<SaltyCommandResult> OpenPortal()
{
IClientSession session = Context.Player;
if (!session.PlayerEntity.IsInFamily())
{
return new SaltyCommandResult(false, "Not in family.");
}
DungeonInstance dungeon = _act4DungeonManager.GetDungeon(session.PlayerEntity.Family.Id);
if (dungeon == null)
{
return new SaltyCommandResult(false, "The dungeon doesn't exist for this family.");
}
if (!dungeon.DungeonSubInstances.TryGetValue(session.CurrentMapInstance.Id, out DungeonSubInstance instance))
{
return new SaltyCommandResult(false, "You have to be inside the dungeon.");
}
PortalGenerator portalGenerator = instance.PortalGenerators.FirstOrDefault();
if (portalGenerator == null || instance.LastPortalGeneration == null)
{
return new SaltyCommandResult(false, "Portal doesn't exist or it's already opened.");
}
instance.PortalGenerators.Remove(portalGenerator);
await _asyncEventPipeline.ProcessEventAsync(new SpawnPortalEvent(instance.MapInstance, portalGenerator.Portal));
await _asyncEventPipeline.ProcessEventAsync(new Act4DungeonBroadcastPacketEvent
{
DungeonInstance = dungeon
});
await _asyncEventPipeline.ProcessEventAsync(new Act4DungeonBroadcastBossOpenEvent
{
DungeonInstance = dungeon
});
return new SaltyCommandResult(true);
}
}
}