154 lines
No EOL
4.8 KiB
C#
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);
|
|
}
|
|
} |