server-master/srcs/WingsAPI.Game/Mates/MateEntity.Stats.cs
2026-02-10 18:21:30 +01:00

108 lines
No EOL
3.9 KiB
C#

using WingsEmu.Game._enum;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Extensions.Mates;
using WingsEmu.Game.Items;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Battle;
namespace WingsEmu.Game.Mates;
public partial class MateEntity
{
private int _criticalChance;
private int _criticalDamage;
private int _damageMax;
private int _damageMin;
private short _hitRate;
private short _magicDefense;
private int _maxHp;
private int _maxMp;
private short _meleeDefense;
private short _meleeDodge;
private short _rangedDefense;
private short _rangedDodge;
private byte _speed;
public void RefreshStatistics()
{
_maxHp = _algorithm.GetBasicHp((short)MonsterRaceType, Level, MeleeHpFactor, CleanHp, false);
_maxMp = _algorithm.GetBasicMp((short)MonsterRaceType, Level, MagicMpFactor, CleanMp, false);
_hitRate = (short)_algorithm.GetHitrate((short)MonsterRaceType, AttackType, WeaponLevel, BaseLevel, RangeDodgeFactor, CleanHitRate, false, Level, MateType);
_damageMin = _algorithm.GetAttack(true, (short)MonsterRaceType, AttackType, WeaponLevel, WinfoValue, BaseLevel, this.GetModifier(), CleanDamageMin, false, Level, MateType);
_damageMax = _algorithm.GetAttack(false, (short)MonsterRaceType, AttackType, WeaponLevel, WinfoValue, BaseLevel, this.GetModifier(), CleanDamageMax, false, Level, MateType);
_criticalChance = MateType == MateType.Partner ? 0 : BaseCriticalChance;
_criticalDamage = MateType == MateType.Partner ? 0 : BaseCriticalRate;
_meleeDefense = (short)_algorithm.GetDefense((short)MonsterRaceType, AttackType.Melee, ArmorLevel, BaseLevel, MeleeHpFactor, CleanMeleeDefence, false, Level, MateType);
_rangedDefense = (short)_algorithm.GetDefense((short)MonsterRaceType, AttackType.Ranged, ArmorLevel, BaseLevel, RangeDodgeFactor, CleanRangeDefence, false, Level, MateType);
_magicDefense = (short)_algorithm.GetDefense((short)MonsterRaceType, AttackType.Magical, ArmorLevel, BaseLevel, MagicMpFactor, CleanMagicDefence, false, Level, MateType);
_meleeDodge = (short)_algorithm.GetDodge((short)MonsterRaceType, ArmorLevel, BaseLevel, RangeDodgeFactor, CleanDodge, false, Level, MateType);
_rangedDodge = (short)_algorithm.GetDodge((short)MonsterRaceType, ArmorLevel, BaseLevel, RangeDodgeFactor, CleanDodge, false, Level, MateType);
StatisticsComponent.RefreshMateStatistics(this);
}
private short GetMoreStats(StatisticType type, short baseStats) => (short)(this.FindMoreStats(type) + baseStats);
private int GetMateDamage(int baseDamage, bool isMin)
{
GameItemInstance weapon = Weapon;
if (weapon == null)
{
return baseDamage;
}
int toAdd;
if (isMin)
{
toAdd = weapon.DamageMinimum + weapon.GameItem.DamageMinimum;
}
else
{
toAdd = weapon.DamageMaximum + weapon.GameItem.DamageMaximum;
}
return toAdd + baseDamage;
}
private int GetMateCritical(int baseCritical, bool isChance)
{
if (MateType == MateType.Pet)
{
return baseCritical;
}
GameItemInstance weapon = Weapon;
if (weapon == null)
{
return baseCritical;
}
int toAdd;
if (isChance)
{
toAdd = weapon.GameItem.CriticalLuckRate;
}
else
{
toAdd = weapon.GameItem.CriticalRate;
}
return toAdd + baseCritical;
}
private int GetMateHitRate(short hitRate)
{
int stats = AttackType switch
{
AttackType.Melee => this.FindMoreStats(StatisticType.HITRATE_MELEE),
AttackType.Ranged => this.FindMoreStats(StatisticType.HITRATE_RANGED),
AttackType.Magical => this.FindMoreStats(StatisticType.HITRATE_MAGIC),
_ => 0
};
return stats + hitRate;
}
}