mirror of
https://github.com/rafi1212122/PemukulPaku
synced 2025-12-13 19:24:35 +01:00
equipment switching & level up with avatar level up fix
This commit is contained in:
@@ -74,7 +74,7 @@ namespace Common.Database
|
|||||||
|
|
||||||
public PlayerLevelData.LevelData AddExp(uint exp)
|
public PlayerLevelData.LevelData AddExp(uint exp)
|
||||||
{
|
{
|
||||||
PlayerLevelData.LevelData levelData = AvatarLevelData.GetInstance().CalculateLevel((int)(exp + Exp));
|
PlayerLevelData.LevelData levelData = AvatarLevelData.GetInstance().CalculateLevel((int)Level, (int)(exp + Exp));
|
||||||
Level = (uint)levelData.Level;
|
Level = (uint)levelData.Level;
|
||||||
Exp = (uint)levelData.Exp;
|
Exp = (uint)levelData.Exp;
|
||||||
|
|
||||||
|
|||||||
@@ -84,6 +84,86 @@ namespace Common.Database
|
|||||||
return stigmata;
|
return stigmata;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Resources.Proto.Material[] AddWeaponExpByConsumeItem(uint uniqueId, List<EquipmentItem> consumeItemList)
|
||||||
|
{
|
||||||
|
int expAdd = consumeItemList.Select(item =>
|
||||||
|
{
|
||||||
|
MaterialDataExcel? materialData = MaterialData.GetInstance().FromId(item.IdOrUniqueId);
|
||||||
|
if (materialData == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int MaterialIndex = MaterialList.ToList().FindIndex(mat => mat.Id == item.IdOrUniqueId);
|
||||||
|
MaterialList[MaterialIndex].Num -= item.Num;
|
||||||
|
|
||||||
|
return materialData.GearExpProvideBase * (int)item.Num;
|
||||||
|
}).Sum();
|
||||||
|
AddWeaponExp(uniqueId, expAdd);
|
||||||
|
|
||||||
|
return MaterialList.Where(material => consumeItemList.Select(item => item.IdOrUniqueId).ToArray().Contains(material.Id)).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddWeaponExp(uint uniqueId, int exp)
|
||||||
|
{
|
||||||
|
int weaponIndex = WeaponList.ToList().FindIndex(weapon => weapon.UniqueId == uniqueId);
|
||||||
|
if (weaponIndex == -1) return;
|
||||||
|
WeaponDataExcel? weaponData = WeaponData.GetInstance().FromId((int)WeaponList[weaponIndex].Id);
|
||||||
|
if (weaponData is null) return;
|
||||||
|
|
||||||
|
PlayerLevelData.LevelData levelData = EquipmentLevelData.GetInstance().CalculateLevel((int)WeaponList[weaponIndex].Level, (int)WeaponList[weaponIndex].Exp + exp, weaponData.ExpType);
|
||||||
|
|
||||||
|
if(levelData.Level > weaponData.MaxLv)
|
||||||
|
{
|
||||||
|
levelData.Level = weaponData.MaxLv;
|
||||||
|
EquipmentLevelDataExcel? LevelData = EquipmentLevelData.GetInstance().FromLevel(levelData.Level);
|
||||||
|
if (LevelData is null) return;
|
||||||
|
|
||||||
|
levelData.Exp = LevelData.Type1[weaponData.ExpType];
|
||||||
|
}
|
||||||
|
|
||||||
|
WeaponList[weaponIndex].Level = (uint)levelData.Level;
|
||||||
|
WeaponList[weaponIndex].Exp = (uint)levelData.Exp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Resources.Proto.Material[] AddStigmataExpByConsumeItem(uint uniqueId, List<EquipmentItem> consumeItemList)
|
||||||
|
{
|
||||||
|
int expAdd = consumeItemList.Select(item =>
|
||||||
|
{
|
||||||
|
MaterialDataExcel? materialData = MaterialData.GetInstance().FromId(item.IdOrUniqueId);
|
||||||
|
if (materialData == null)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int MaterialIndex = MaterialList.ToList().FindIndex(mat => mat.Id == item.IdOrUniqueId);
|
||||||
|
MaterialList[MaterialIndex].Num -= item.Num;
|
||||||
|
|
||||||
|
return materialData.GearExpProvideBase * (int)item.Num;
|
||||||
|
}).Sum();
|
||||||
|
AddStigmataExp(uniqueId, expAdd);
|
||||||
|
|
||||||
|
return MaterialList.Where(material => consumeItemList.Select(item => item.IdOrUniqueId).ToArray().Contains(material.Id)).ToArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddStigmataExp(uint uniqueId, int exp)
|
||||||
|
{
|
||||||
|
int stigmataIndex = StigmataList.ToList().FindIndex(stigmata => stigmata.UniqueId == uniqueId);
|
||||||
|
if (stigmataIndex == -1) return;
|
||||||
|
StigmataDataExcel? stigmataData = StigmataData.GetInstance().FromId((int)StigmataList[stigmataIndex].Id);
|
||||||
|
if (stigmataData is null) return;
|
||||||
|
|
||||||
|
PlayerLevelData.LevelData levelData = EquipmentLevelData.GetInstance().CalculateLevel((int)StigmataList[stigmataIndex].Level, (int)StigmataList[stigmataIndex].Exp + exp, stigmataData.ExpType);
|
||||||
|
|
||||||
|
if (levelData.Level > stigmataData.MaxLv)
|
||||||
|
{
|
||||||
|
levelData.Level = stigmataData.MaxLv;
|
||||||
|
EquipmentLevelDataExcel? LevelData = EquipmentLevelData.GetInstance().FromLevel(levelData.Level);
|
||||||
|
if (LevelData is null) return;
|
||||||
|
|
||||||
|
levelData.Exp = LevelData.Type1[stigmataData.ExpType];
|
||||||
|
}
|
||||||
|
|
||||||
|
StigmataList[stigmataIndex].Level = (uint)levelData.Level;
|
||||||
|
StigmataList[stigmataIndex].Exp = (uint)levelData.Exp;
|
||||||
|
}
|
||||||
|
|
||||||
public Resources.Proto.Material AddMaterial(int materialId, int num = 1)
|
public Resources.Proto.Material AddMaterial(int materialId, int num = 1)
|
||||||
{
|
{
|
||||||
int MaterialIndex = Array.FindIndex(MaterialList, material => material.Id == materialId);
|
int MaterialIndex = Array.FindIndex(MaterialList, material => material.Id == materialId);
|
||||||
|
|||||||
@@ -6,12 +6,11 @@ namespace Common.Utils.ExcelReader
|
|||||||
{
|
{
|
||||||
public override string FileName { get { return "AvatarLevelData.json"; } }
|
public override string FileName { get { return "AvatarLevelData.json"; } }
|
||||||
|
|
||||||
public PlayerLevelData.LevelData CalculateLevel(int exp)
|
public PlayerLevelData.LevelData CalculateLevel(int level, int exp)
|
||||||
{
|
{
|
||||||
int level = 1;
|
|
||||||
int expRemain = exp;
|
int expRemain = exp;
|
||||||
|
|
||||||
foreach (AvatarLevelDataExcel levelData in All)
|
foreach (AvatarLevelDataExcel levelData in All.Where(levelData => levelData.Level >= level))
|
||||||
{
|
{
|
||||||
if (expRemain < 1)
|
if (expRemain < 1)
|
||||||
{
|
{
|
||||||
|
|||||||
65
Common/Utils/ExcelReader/EquipmentLevelData.cs
Normal file
65
Common/Utils/ExcelReader/EquipmentLevelData.cs
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Common.Utils.ExcelReader
|
||||||
|
{
|
||||||
|
public class EquipmentLevelData : BaseExcelReader<EquipmentLevelData, EquipmentLevelDataExcel>
|
||||||
|
{
|
||||||
|
public override string FileName { get { return "EquipmentLevelData.json"; } }
|
||||||
|
|
||||||
|
public EquipmentLevelDataExcel? FromLevel(int level)
|
||||||
|
{
|
||||||
|
return All.Where(levelData => levelData.Level == level).FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PlayerLevelData.LevelData CalculateLevel(int level, int exp, int expType)
|
||||||
|
{
|
||||||
|
int expRemain = exp;
|
||||||
|
|
||||||
|
foreach (EquipmentLevelDataExcel levelData in All.Where(levelData => levelData.Level >= level))
|
||||||
|
{
|
||||||
|
if (expRemain < 1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (expRemain >= levelData.Type1[expType])
|
||||||
|
{
|
||||||
|
if (level == All.OrderByDescending(level => level.Level).First().Level)
|
||||||
|
{
|
||||||
|
expRemain = All.OrderByDescending(level => level.Level).First().Type1[expType];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
level++;
|
||||||
|
expRemain -= levelData.Type1[expType];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PlayerLevelData.LevelData(level, expRemain);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable.
|
||||||
|
public partial class EquipmentLevelDataExcel
|
||||||
|
{
|
||||||
|
[JsonProperty("Type1")]
|
||||||
|
public int[] Type1 { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("weaponUpgradeCost")]
|
||||||
|
public int WeaponUpgradeCost { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("weaponEvoCost")]
|
||||||
|
public int WeaponEvoCost { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("stigmataUpgradeCost")]
|
||||||
|
public int StigmataUpgradeCost { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("stigmataEvoCost")]
|
||||||
|
public int StigmataEvoCost { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("DataImpl")]
|
||||||
|
public object DataImpl { get; set; }
|
||||||
|
|
||||||
|
[JsonProperty("level")]
|
||||||
|
public int Level { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,7 +10,7 @@ namespace Common.Utils.ExcelReader
|
|||||||
return All.Where(levelData => levelData.Level == level).FirstOrDefault();
|
return All.Where(levelData => levelData.Level == level).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
public readonly struct LevelData
|
public struct LevelData
|
||||||
{
|
{
|
||||||
public LevelData(int level, int exp)
|
public LevelData(int level, int exp)
|
||||||
{
|
{
|
||||||
@@ -18,8 +18,8 @@ namespace Common.Utils.ExcelReader
|
|||||||
Exp = exp;
|
Exp = exp;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int Level { get; init; }
|
public int Level { get; set; }
|
||||||
public int Exp { get; init; }
|
public int Exp { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public LevelData CalculateLevel(int exp)
|
public LevelData CalculateLevel(int exp)
|
||||||
|
|||||||
45
GameServer/Handlers/DressEquipmentReqHandler.cs
Normal file
45
GameServer/Handlers/DressEquipmentReqHandler.cs
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
using Common.Database;
|
||||||
|
using Common.Resources.Proto;
|
||||||
|
|
||||||
|
namespace PemukulPaku.GameServer.Handlers
|
||||||
|
{
|
||||||
|
[PacketCmdId(CmdId.DressEquipmentReq)]
|
||||||
|
internal class DressEquipmentReqHandler : IPacketHandler
|
||||||
|
{
|
||||||
|
public void Handle(Session session, Packet packet)
|
||||||
|
{
|
||||||
|
DressEquipmentReq Data = packet.GetDecodedBody<DressEquipmentReq>();
|
||||||
|
DressEquipmentRsp Rsp = new() { retcode = DressEquipmentRsp.Retcode.Succ };
|
||||||
|
|
||||||
|
AvatarScheme? avatar = session.Player.AvatarList.FirstOrDefault(avatar => avatar.AvatarId == Data.AvatarId);
|
||||||
|
if (avatar == null)
|
||||||
|
{
|
||||||
|
Rsp.retcode = DressEquipmentRsp.Retcode.AvatarNotExist;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (Data.Slot)
|
||||||
|
{
|
||||||
|
case EquipmentSlot.EquipmentSlotWeapon1:
|
||||||
|
avatar.WeaponUniqueId = Data.UniqueId;
|
||||||
|
break;
|
||||||
|
case EquipmentSlot.EquipmentSlotStigmata1:
|
||||||
|
avatar.StigmataUniqueId1 = Data.UniqueId;
|
||||||
|
break;
|
||||||
|
case EquipmentSlot.EquipmentSlotStigmata2:
|
||||||
|
avatar.StigmataUniqueId2 = Data.UniqueId;
|
||||||
|
break;
|
||||||
|
case EquipmentSlot.EquipmentSlotStigmata3:
|
||||||
|
avatar.StigmataUniqueId3 = Data.UniqueId;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Rsp.retcode = DressEquipmentRsp.Retcode.EquipmentSlotError;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
session.ProcessPacket(Packet.FromProto(new GetAvatarDataReq() { AvatarIdLists = new uint[] { avatar.AvatarId } }, CmdId.GetAvatarDataReq));
|
||||||
|
}
|
||||||
|
|
||||||
|
session.Send(Packet.FromProto(Rsp, CmdId.DressEquipmentRsp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
35
GameServer/Handlers/EquipmentPowerUpReqHandler.cs
Normal file
35
GameServer/Handlers/EquipmentPowerUpReqHandler.cs
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
using Common.Resources.Proto;
|
||||||
|
|
||||||
|
namespace PemukulPaku.GameServer.Handlers
|
||||||
|
{
|
||||||
|
[PacketCmdId(CmdId.EquipmentPowerUpReq)]
|
||||||
|
internal class EquipmentPowerUpReqHandler : IPacketHandler
|
||||||
|
{
|
||||||
|
public void Handle(Session session, Packet packet)
|
||||||
|
{
|
||||||
|
EquipmentPowerUpReq Data = packet.GetDecodedBody<EquipmentPowerUpReq>();
|
||||||
|
EquipmentPowerUpRsp Rsp = new() { retcode = EquipmentPowerUpRsp.Retcode.Succ, MainItem = Data.MainItem, BoostRate = 100 };
|
||||||
|
|
||||||
|
GetEquipmentDataRsp EquipmentDataRsp = new() { retcode = GetEquipmentDataRsp.Retcode.Succ, VitalityValue = 5900 };
|
||||||
|
switch (Data.MainItem.Type)
|
||||||
|
{
|
||||||
|
case EquipmentType.EquipmentWeapon:
|
||||||
|
Material[] WeaponUpConsumeItems = session.Player.Equipment.AddWeaponExpByConsumeItem(Data.MainItem.IdOrUniqueId, Data.ConsumeItemList.ItemLists);
|
||||||
|
|
||||||
|
EquipmentDataRsp.MaterialLists.AddRange(WeaponUpConsumeItems);
|
||||||
|
EquipmentDataRsp.WeaponLists.Add(session.Player.Equipment.WeaponList.FirstOrDefault(weapon => weapon.UniqueId == Data.MainItem.IdOrUniqueId));
|
||||||
|
break;
|
||||||
|
case EquipmentType.EquipmentStigmata:
|
||||||
|
Material[] StigmataUpConsumeItems = session.Player.Equipment.AddStigmataExpByConsumeItem(Data.MainItem.IdOrUniqueId, Data.ConsumeItemList.ItemLists);
|
||||||
|
|
||||||
|
EquipmentDataRsp.MaterialLists.AddRange(StigmataUpConsumeItems);
|
||||||
|
EquipmentDataRsp.StigmataLists.Add(session.Player.Equipment.StigmataList.FirstOrDefault(stigmata => stigmata.UniqueId == Data.MainItem.IdOrUniqueId));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Rsp.retcode = EquipmentPowerUpRsp.Retcode.MainItemNotExist;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
session.Send(Packet.FromProto(EquipmentDataRsp, CmdId.GetEquipmentDataRsp), Packet.FromProto(Rsp, CmdId.EquipmentPowerUpRsp));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,4 @@
|
|||||||
using Common.Database;
|
using Common.Resources.Proto;
|
||||||
using Common.Resources.Proto;
|
|
||||||
|
|
||||||
namespace PemukulPaku.GameServer.Handlers
|
namespace PemukulPaku.GameServer.Handlers
|
||||||
{
|
{
|
||||||
@@ -9,7 +8,6 @@ namespace PemukulPaku.GameServer.Handlers
|
|||||||
public void Handle(Session session, Packet packet)
|
public void Handle(Session session, Packet packet)
|
||||||
{
|
{
|
||||||
GetAvatarDataReq Packet = packet.GetDecodedBody<GetAvatarDataReq>();
|
GetAvatarDataReq Packet = packet.GetDecodedBody<GetAvatarDataReq>();
|
||||||
LoginScheme LastLogin = Login.GetUserLastLogin(session.Player.User.Uid);
|
|
||||||
|
|
||||||
GetAvatarDataRsp Rsp = new()
|
GetAvatarDataRsp Rsp = new()
|
||||||
{
|
{
|
||||||
@@ -18,9 +16,9 @@ namespace PemukulPaku.GameServer.Handlers
|
|||||||
|
|
||||||
if (Packet.AvatarIdLists.Contains((uint)0))
|
if (Packet.AvatarIdLists.Contains((uint)0))
|
||||||
{
|
{
|
||||||
IEnumerable<Common.Resources.Proto.Avatar> Avatars = session.Player.AvatarList.Select(avatar =>
|
IEnumerable<Avatar> Avatars = session.Player.AvatarList.Select(avatar =>
|
||||||
{
|
{
|
||||||
Common.Resources.Proto.Avatar a = new()
|
Avatar a = new()
|
||||||
{
|
{
|
||||||
AvatarId = avatar.AvatarId,
|
AvatarId = avatar.AvatarId,
|
||||||
AvatarArtifact = avatar.AvatarArtifact,
|
AvatarArtifact = avatar.AvatarArtifact,
|
||||||
@@ -50,9 +48,9 @@ namespace PemukulPaku.GameServer.Handlers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
IEnumerable<Common.Resources.Proto.Avatar> Avatars = session.Player.AvatarList.Where(avatar => Packet.AvatarIdLists.Contains(avatar.AvatarId)).Select(avatar =>
|
IEnumerable<Avatar> Avatars = session.Player.AvatarList.Where(avatar => Packet.AvatarIdLists.Contains(avatar.AvatarId)).Select(avatar =>
|
||||||
{
|
{
|
||||||
Common.Resources.Proto.Avatar a = new()
|
Avatar a = new()
|
||||||
{
|
{
|
||||||
AvatarId = avatar.AvatarId,
|
AvatarId = avatar.AvatarId,
|
||||||
AvatarArtifact = avatar.AvatarArtifact,
|
AvatarArtifact = avatar.AvatarArtifact,
|
||||||
|
|||||||
Reference in New Issue
Block a user