server-master/srcs/WingsAPI.Game/SnackFood/FoodSnackComponent.cs
2026-02-10 18:21:30 +01:00

177 lines
No EOL
6 KiB
C#

using System;
using WingsEmu.Game.Items;
namespace WingsEmu.Game.SnackFood;
public class FoodSnackComponent : IFoodSnackComponent
{
private readonly SnackFoodConfiguration _configuration;
public FoodSnackComponent(SnackFoodConfiguration configuration) => _configuration = configuration;
public FoodProgress GetFoodProgress { get; private set; } = new();
public SnackProgress GetSnackProgress { get; private set; } = new();
public AdditionalSnackProgress GetAdditionalSnackProgress { get; private set; } = new();
public AdditionalFoodProgress GetAdditionalFoodProgress { get; private set; } = new();
public bool AddSnack(IGameItem gameItem)
{
SnackProgress progress = GetSnackProgress ??= new SnackProgress();
if (progress.SnackHpBuffer >= _configuration.SnackSoftCap || progress.SnackMpBuffer >= _configuration.SnackSoftCap || progress.SnackSpBuffer >= _configuration.SnackSoftCap)
{
return true;
}
progress.SnackHpBuffer += gameItem.Hp;
progress.SnackHpBufferSize = progress.SnackHpBuffer;
progress.SnackMpBuffer += gameItem.Mp;
progress.SnackMpBufferSize = progress.SnackMpBuffer;
progress.SnackSpBuffer += gameItem.Data[4];
progress.SnackSpBufferSize = progress.SnackSpBuffer;
if (progress.SnackHpBuffer >= _configuration.SnackHardCap)
{
progress.SnackHpBuffer = _configuration.SnackHardCap;
progress.SnackHpBufferSize = _configuration.SnackHardCap;
}
if (progress.SnackMpBuffer >= _configuration.SnackHardCap)
{
progress.SnackMpBuffer = _configuration.SnackHardCap;
progress.SnackMpBufferSize = _configuration.SnackHardCap;
}
if (progress.SnackSpBuffer >= _configuration.SnackHardCap)
{
progress.SnackSpBuffer = _configuration.SnackHardCap;
progress.SnackSpBufferSize = _configuration.SnackHardCap;
}
return false;
}
public void AddAdditionalSnack(int max, int amount, bool isHp, int cap = 100)
{
AdditionalSnackProgress additionalProgress = GetAdditionalSnackProgress ??= new AdditionalSnackProgress();
if (isHp)
{
int hpCap = (int)Math.Round(max * cap / 100.0);
if (additionalProgress.HpCap != 0 && additionalProgress.HpCap > cap)
{
return;
}
additionalProgress.SnackAdditionalHpBuffer += amount;
additionalProgress.SnackAdditionalHpBufferSize = additionalProgress.SnackAdditionalHpBuffer;
additionalProgress.HpCap = (int)Math.Round(hpCap * 100.0 / max);
return;
}
int mpCap = (int)Math.Round(max * cap / 100.0);
if (additionalProgress.MpCap != 0 && additionalProgress.MpCap > cap)
{
return;
}
additionalProgress.SnackAdditionalMpBuffer += amount;
additionalProgress.SnackAdditionalMpBufferSize = additionalProgress.SnackAdditionalMpBuffer;
additionalProgress.MpCap = (int)Math.Round(mpCap * 100.0 / max);
}
public bool AddFood(IGameItem gameItem)
{
FoodProgress progress = GetFoodProgress ??= new FoodProgress();
if (progress.FoodHpBuffer >= _configuration.FoodSoftCap || progress.FoodMpBuffer >= _configuration.FoodSoftCap || progress.FoodSpBuffer >= _configuration.FoodSoftCap)
{
return true;
}
progress.FoodHpBuffer += gameItem.Hp;
progress.FoodHpBufferSize = progress.FoodHpBuffer;
progress.FoodMpBuffer += gameItem.Mp;
progress.FoodMpBufferSize = progress.FoodMpBuffer;
progress.FoodSpBuffer += gameItem.Data[4];
progress.FoodSpBufferSize = progress.FoodSpBuffer;
if (progress.FoodHpBuffer >= _configuration.FoodHardCap)
{
progress.FoodHpBuffer = _configuration.FoodHardCap;
progress.FoodHpBufferSize = _configuration.FoodHardCap;
}
if (progress.FoodMpBuffer >= _configuration.FoodHardCap)
{
progress.FoodMpBuffer = _configuration.FoodHardCap;
progress.FoodMpBufferSize = _configuration.FoodHardCap;
}
if (progress.FoodSpBuffer >= _configuration.FoodHardCap)
{
progress.FoodSpBuffer = _configuration.FoodHardCap;
progress.FoodSpBufferSize = _configuration.FoodHardCap;
}
int mateProgress = gameItem.Data[5];
if (mateProgress != 0)
{
progress.IncreaseTick += mateProgress;
progress.FoodMateMaxHpBuffer = 100;
progress.FoodMateMaxHpBufferSize = 100;
}
return false;
}
public void AddAdditionalFood(int max, int amount, bool isHp, int cap = 100)
{
AdditionalFoodProgress additionalProgress = GetAdditionalFoodProgress ??= new AdditionalFoodProgress();
if (isHp)
{
int hpCap = (int)Math.Round(max * cap / 100.0);
if (additionalProgress.HpCap != 0 && additionalProgress.HpCap > cap)
{
return;
}
additionalProgress.FoodAdditionalHpBuffer += amount;
additionalProgress.FoodAdditionalHpBufferSize = additionalProgress.FoodAdditionalHpBuffer;
additionalProgress.HpCap = (int)Math.Round(hpCap * 100.0 / max);
return;
}
int mpCap = (int)Math.Round(max * cap / 100.0);
if (additionalProgress.MpCap != 0 && additionalProgress.MpCap > cap)
{
return;
}
additionalProgress.FoodAdditionalMpBuffer += amount;
additionalProgress.FoodAdditionalMpBufferSize = additionalProgress.FoodAdditionalMpBuffer;
additionalProgress.MpCap = (int)Math.Round(mpCap * 100.0 / max);
}
public void ClearFoodBuffer()
{
GetFoodProgress = null;
GetAdditionalFoodProgress = null;
}
public void ClearSnackBuffer()
{
GetSnackProgress = null;
GetAdditionalSnackProgress = null;
}
}