server-master/srcs/Plugin.RainbowBattle/Managers/IRainbowFactory.cs
2026-02-10 18:21:30 +01:00

92 lines
No EOL
3.6 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using WingsAPI.Packets.Enums.Rainbow;
using WingsEmu.Game._enum;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Entities.Event;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.RainbowBattle;
namespace Plugin.RainbowBattle.Managers
{
public interface IRainbowFactory
{
Task<RainbowBattleParty> CreateRainbowBattle(List<IClientSession> redTeam, List<IClientSession> blueTeam);
}
public class RainbowFactory : IRainbowFactory
{
private readonly IMapManager _mapManager;
private readonly INpcEntityFactory _npcEntityFactory;
private readonly RainbowBattleConfiguration _rainbowBattleConfiguration;
public RainbowFactory(IMapManager mapManager, INpcEntityFactory npcEntityFactory, RainbowBattleConfiguration rainbowBattleConfiguration)
{
_mapManager = mapManager;
_npcEntityFactory = npcEntityFactory;
_rainbowBattleConfiguration = rainbowBattleConfiguration;
}
public async Task<RainbowBattleParty> CreateRainbowBattle(List<IClientSession> redTeam, List<IClientSession> blueTeam)
{
IMapInstance mapInstance = _mapManager.GenerateMapInstanceByMapId(_rainbowBattleConfiguration.MapId, MapInstanceType.RainbowBattle);
if (mapInstance == null)
{
return null;
}
foreach (FlagPosition position in _rainbowBattleConfiguration.MainFlags)
{
INpcEntity mainFlag = _npcEntityFactory.CreateNpc((short)MonsterVnum.BIG_FLAG, mapInstance, null, new NpcAdditionalData
{
RainbowFlag = new RainBowFlag
{
FlagType = RainbowBattleFlagType.Big,
FlagTeamType = RainbowBattleFlagTeamType.None
}
});
await mainFlag.EmitEventAsync(new MapJoinNpcEntityEvent(mainFlag, position.X, position.Y));
}
foreach (FlagPosition position in _rainbowBattleConfiguration.MediumFlags)
{
INpcEntity mediumFlag = _npcEntityFactory.CreateNpc((short)MonsterVnum.MEDIUM_FLAG, mapInstance, null, new NpcAdditionalData
{
RainbowFlag = new RainBowFlag
{
FlagType = RainbowBattleFlagType.Medium,
FlagTeamType = RainbowBattleFlagTeamType.None
}
});
await mediumFlag.EmitEventAsync(new MapJoinNpcEntityEvent(mediumFlag, position.X, position.Y));
}
foreach (FlagPosition position in _rainbowBattleConfiguration.SmallFlags)
{
INpcEntity smallFlag = _npcEntityFactory.CreateNpc((short)MonsterVnum.SMALL_FLAG, mapInstance, null, new NpcAdditionalData
{
RainbowFlag = new RainBowFlag
{
FlagType = RainbowBattleFlagType.Small,
FlagTeamType = RainbowBattleFlagTeamType.None
}
});
await smallFlag.EmitEventAsync(new MapJoinNpcEntityEvent(smallFlag, position.X, position.Y));
}
mapInstance.Initialize(DateTime.UtcNow.AddSeconds(-1));
var rainbowParty = new RainbowBattleParty(redTeam, blueTeam)
{
MapInstance = mapInstance
};
return rainbowParty;
}
}
}