2024-01-04 13:48:39 +00:00
|
|
|
|
using NahidaImpact.Common.Constants;
|
|
|
|
|
using NahidaImpact.Common.Data.Excel;
|
|
|
|
|
using NahidaImpact.Protocol;
|
|
|
|
|
|
|
|
|
|
namespace NahidaImpact.Gameserver.Game.Avatar;
|
|
|
|
|
internal class GameAvatar
|
|
|
|
|
{
|
|
|
|
|
public ulong Guid { get; set; }
|
|
|
|
|
|
|
|
|
|
public uint AvatarId { get; set; }
|
|
|
|
|
public uint SkillDepotId { get; set; }
|
|
|
|
|
public uint WearingFlycloakId { get; set; }
|
|
|
|
|
public uint BornTime { get; set; }
|
2024-01-04 21:17:25 +00:00
|
|
|
|
public ulong WeaponGuid { get; set; }
|
2024-01-04 13:48:39 +00:00
|
|
|
|
|
|
|
|
|
public uint WeaponId { get; set; } // TODO: Weapon class!
|
|
|
|
|
|
|
|
|
|
// Properties
|
|
|
|
|
public List<PropValue> Properties;
|
|
|
|
|
public List<FightPropPair> FightProperties;
|
|
|
|
|
|
|
|
|
|
public GameAvatar()
|
|
|
|
|
{
|
|
|
|
|
Properties = [];
|
|
|
|
|
FightProperties = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void InitDefaultProps(AvatarExcel avatarExcel)
|
|
|
|
|
{
|
|
|
|
|
Properties.Clear();
|
|
|
|
|
FightProperties.Clear();
|
|
|
|
|
|
|
|
|
|
SetProp(PlayerProp.PROP_LEVEL, 1);
|
|
|
|
|
SetProp(PlayerProp.PROP_EXP, 0);
|
|
|
|
|
SetProp(PlayerProp.PROP_BREAK_LEVEL, 0);
|
|
|
|
|
|
|
|
|
|
float baseHp = (float)avatarExcel.HpBase;
|
|
|
|
|
float baseAttack = (float)avatarExcel.AttackBase;
|
|
|
|
|
float baseDefense = (float)avatarExcel.DefenseBase;
|
|
|
|
|
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_BASE_HP, baseHp);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_HP, baseHp);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_HP, baseHp);
|
|
|
|
|
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_BASE_ATTACK, baseAttack);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_ATTACK, baseAttack);
|
|
|
|
|
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_BASE_DEFENSE, baseDefense);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_DEFENSE, baseDefense);
|
|
|
|
|
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CHARGE_EFFICIENCY, (float)avatarExcel.ChargeEfficiency);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CRITICAL_HURT, (float)avatarExcel.CriticalHurt);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CRITICAL, (float)avatarExcel.Critical);
|
|
|
|
|
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_FIRE_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_ELEC_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_WATER_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_GRASS_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_WIND_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_ICE_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_CUR_ROCK_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_FIRE_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_ELEC_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_WATER_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_GRASS_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_WIND_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_ICE_ENERGY, 100);
|
|
|
|
|
SetFightProp(FightProp.FIGHT_PROP_MAX_ROCK_ENERGY, 100);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetProp(uint propType, uint value)
|
|
|
|
|
{
|
|
|
|
|
PropValue? prop = Properties.Find(p => p.Type == propType);
|
|
|
|
|
if (prop != null)
|
|
|
|
|
{
|
|
|
|
|
prop.Ival = value;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Properties.Add(new PropValue { Type = propType, Ival = value });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetProp(uint propType, float value)
|
|
|
|
|
{
|
|
|
|
|
PropValue? prop = Properties.Find(p => p.Type == propType);
|
|
|
|
|
if (prop != null)
|
|
|
|
|
{
|
|
|
|
|
prop.Fval = value;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Properties.Add(new PropValue { Type = propType, Fval = value });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetFightProp(uint propType, float value)
|
|
|
|
|
{
|
|
|
|
|
FightPropPair? fightPropPair = FightProperties.Find(pair => pair.PropType == propType);
|
|
|
|
|
if (fightPropPair != null)
|
|
|
|
|
{
|
|
|
|
|
fightPropPair.PropValue = value;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FightProperties.Add(new FightPropPair { PropType = propType, PropValue = value });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public AvatarInfo AsAvatarInfo()
|
|
|
|
|
{
|
|
|
|
|
AvatarInfo info = new()
|
|
|
|
|
{
|
|
|
|
|
Guid = Guid,
|
|
|
|
|
AvatarId = AvatarId,
|
|
|
|
|
SkillDepotId = SkillDepotId,
|
|
|
|
|
LifeState = 1,
|
|
|
|
|
AvatarType = 1,
|
|
|
|
|
WearingFlycloakId = WearingFlycloakId,
|
|
|
|
|
BornTime = BornTime,
|
|
|
|
|
FetterInfo = new() { ExpLevel = 1 },
|
|
|
|
|
EquipGuidList = { WeaponGuid } // no weapon classes for now
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
foreach (PropValue prop in Properties)
|
|
|
|
|
{
|
|
|
|
|
info.PropMap.Add(prop.Type, prop);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (FightPropPair pair in FightProperties)
|
|
|
|
|
{
|
|
|
|
|
info.FightPropMap.Add(pair.PropType, pair.PropValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return info;
|
|
|
|
|
}
|
|
|
|
|
}
|