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

154 lines
No EOL
4.8 KiB
C#

using System;
using System.Collections.Concurrent;
using WingsAPI.Packets.Enums.Act4;
using WingsEmu.Game.Act4;
using WingsEmu.Game.Act4.Configuration;
using WingsEmu.Game.Entities;
using WingsEmu.Game.Managers;
using WingsEmu.Packets.Enums;
namespace Plugin.Act4;
public class Act4Manager : IAct4Manager
{
private readonly Act4Configuration _act4Configuration;
private readonly IAct4DungeonManager _act4DungeonManager;
private readonly ConcurrentQueue<(FactionType factionType, int amount)> _pointsToAdd = new();
private int _angelPoints;
private int _demonPoints;
private IMonsterEntity _mukraju;
private DateTime _mukrajuDeleteTime;
private FactionType _mukrajuFaction = FactionType.Neutral;
public Act4Manager(Act4Configuration act4Configuration, IAct4DungeonManager act4DungeonManager)
{
_act4Configuration = act4Configuration;
_act4DungeonManager = act4DungeonManager;
}
public void AddFactionPoints(FactionType factionType, int amount)
{
if (FactionPointsLocked)
{
return;
}
_pointsToAdd.Enqueue((factionType, amount));
}
public void ResetFactionPoints(FactionType factionType)
{
if (factionType == FactionType.Angel)
{
_angelPoints = default;
}
else
{
_demonPoints = default;
}
}
public bool FactionPointsLocked => _mukraju != null || _act4DungeonManager.DungeonsActive;
public void RegisterMukraju(DateTime current, IMonsterEntity mukraju, FactionType factionType)
{
_mukrajuDeleteTime = current + _act4Configuration.MukrajuEndSpan;
_mukraju = mukraju;
_mukrajuFaction = factionType;
}
public (DateTime deleteTime, IMonsterEntity mukraju, FactionType mukrajuFactionType) GetMukraju() => (_mukrajuDeleteTime, _mukraju, _mukrajuFaction);
public IMonsterEntity UnregisterMukraju()
{
IMonsterEntity monsterEntity = _mukraju;
_mukraju = null;
_mukrajuFaction = FactionType.Neutral;
return monsterEntity;
}
public FactionType MukrajuFaction() => _mukrajuFaction;
public FactionType GetTriumphantFaction()
{
if (_pointsToAdd.IsEmpty)
{
return FactionType.Neutral;
}
while (_pointsToAdd.TryDequeue(out (FactionType factionType, int amount) pointsToAdd))
{
if (pointsToAdd.factionType == FactionType.Angel)
{
_angelPoints += pointsToAdd.amount;
if (_act4Configuration.MaximumFactionPoints > _angelPoints)
{
continue;
}
_pointsToAdd.Clear();
_angelPoints = default;
return FactionType.Angel;
}
_demonPoints += pointsToAdd.amount;
if (_act4Configuration.MaximumFactionPoints > _demonPoints)
{
continue;
}
_pointsToAdd.Clear();
_demonPoints = default;
return FactionType.Demon;
}
return FactionType.Neutral;
}
public Act4Status GetStatus()
{
float maxPoints = _act4Configuration.MaximumFactionPoints;
DateTime todayResetDate = DateTime.Today + _act4Configuration.ResetDate;
DateTime currentDate = DateTime.UtcNow;
TimeSpan timeSpan;
if (todayResetDate <= currentDate)
{
timeSpan = todayResetDate.AddDays(1) - currentDate;
}
else
{
timeSpan = todayResetDate - currentDate;
}
FactionType relevantFaction = FactionType.Neutral;
Act4FactionStateType factionStateType = Act4FactionStateType.Nothing;
TimeSpan currentTimeBeforeX = TimeSpan.Zero;
TimeSpan timeBeforeX = TimeSpan.Zero;
(DateTime deleteTime, IMonsterEntity mukraju, FactionType mukrajuFactionType) = GetMukraju();
if (mukraju != null)
{
relevantFaction = mukrajuFactionType;
factionStateType = Act4FactionStateType.Mukraju;
currentTimeBeforeX = deleteTime - currentDate;
timeBeforeX = _act4Configuration.MukrajuEndSpan;
}
DungeonType dungeonType = DungeonType.Morcos;
if (_act4DungeonManager.DungeonsActive)
{
relevantFaction = _act4DungeonManager.AllowedFaction;
factionStateType = Act4FactionStateType.RaidDungeon;
currentTimeBeforeX = _act4DungeonManager.DungeonEnd - currentDate;
timeBeforeX = _act4DungeonManager.DungeonEndSpan;
dungeonType = _act4DungeonManager.DungeonType;
}
return new Act4Status(Convert.ToByte(_angelPoints / maxPoints * 100), Convert.ToByte(_demonPoints / maxPoints * 100), timeSpan,
relevantFaction, factionStateType, currentTimeBeforeX, timeBeforeX, dungeonType);
}
}