mirror of
https://github.com/MikuLeaks/KianaBH3.git
synced 2026-02-04 06:25:05 +01:00
feat: add equip weapon & stigmata
This commit is contained in:
@@ -17,9 +17,7 @@ public class AvatarInfo
|
|||||||
public int Exp { get; set; }
|
public int Exp { get; set; }
|
||||||
public int Fragment { get; set; }
|
public int Fragment { get; set; }
|
||||||
public int WeaponUniqueId { get; set; }
|
public int WeaponUniqueId { get; set; }
|
||||||
public int StigmataUniqueId1 { get; set; }
|
public Dictionary<int, int> Stigmata { get; set; } = [];
|
||||||
public int StigmataUniqueId2 { get; set; }
|
|
||||||
public int StigmataUniqueId3 { get; set; }
|
|
||||||
public List<AvatarSkill> SkillList { get; set; } = [];
|
public List<AvatarSkill> SkillList { get; set; } = [];
|
||||||
public int TouchGoodFeel { get; set; }
|
public int TouchGoodFeel { get; set; }
|
||||||
public int TodayHasAddGoodFeel { get; set; }
|
public int TodayHasAddGoodFeel { get; set; }
|
||||||
@@ -40,9 +38,9 @@ public class AvatarInfo
|
|||||||
Exp = (uint)Exp,
|
Exp = (uint)Exp,
|
||||||
Fragment = (uint)Fragment,
|
Fragment = (uint)Fragment,
|
||||||
WeaponUniqueId = (uint)WeaponUniqueId,
|
WeaponUniqueId = (uint)WeaponUniqueId,
|
||||||
StigmataUniqueId1 = (uint)StigmataUniqueId1,
|
StigmataUniqueId1 = (uint)(Stigmata.TryGetValue(1, out var id1) ? id1 : 0),
|
||||||
StigmataUniqueId2 = (uint)StigmataUniqueId2,
|
StigmataUniqueId2 = (uint)(Stigmata.TryGetValue(2, out var id2) ? id2 : 0),
|
||||||
StigmataUniqueId3 = (uint)StigmataUniqueId3,
|
StigmataUniqueId3 = (uint)(Stigmata.TryGetValue(3, out var id3) ? id3 : 0),
|
||||||
TouchGoodfeel = (uint)TouchGoodFeel,
|
TouchGoodfeel = (uint)TouchGoodFeel,
|
||||||
TodayHasAddGoodfeel = (uint)TodayHasAddGoodFeel,
|
TodayHasAddGoodfeel = (uint)TodayHasAddGoodFeel,
|
||||||
StageGoodfeel = (uint)StageGoodFeel,
|
StageGoodfeel = (uint)StageGoodFeel,
|
||||||
|
|||||||
@@ -4,9 +4,7 @@ using KianaBH.Database.Inventory;
|
|||||||
using KianaBH.Enums.Item;
|
using KianaBH.Enums.Item;
|
||||||
using KianaBH.GameServer.Game.Player;
|
using KianaBH.GameServer.Game.Player;
|
||||||
using KianaBH.GameServer.Server.Packet.Send.Item;
|
using KianaBH.GameServer.Server.Packet.Send.Item;
|
||||||
using KianaBH.Proto;
|
|
||||||
using KianaBH.Util;
|
using KianaBH.Util;
|
||||||
using static KianaBH.Proto.MasterPupilRetcode.Types;
|
|
||||||
|
|
||||||
namespace KianaBH.GameServer.Game.Inventory;
|
namespace KianaBH.GameServer.Game.Inventory;
|
||||||
|
|
||||||
@@ -87,4 +85,119 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
|||||||
|
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async ValueTask EquipAvatar(int avatarId, int uniqueId)
|
||||||
|
{
|
||||||
|
var itemData = Data.WeaponItems.Find(x => x.UniqueId == uniqueId);
|
||||||
|
var avatarData = Player.AvatarManager!.GetAvatar(avatarId);
|
||||||
|
if (itemData == null || avatarData == null) return;
|
||||||
|
var oldItem = Data.WeaponItems.Find(x => x.UniqueId == avatarData.WeaponUniqueId);
|
||||||
|
if (itemData.EquipAvatar > 0) // already be dressed
|
||||||
|
{
|
||||||
|
var equipAvatarId = itemData.EquipAvatar;
|
||||||
|
var equipAvatar = Player.AvatarManager.GetAvatar(equipAvatarId);
|
||||||
|
if (equipAvatar != null && oldItem != null)
|
||||||
|
{
|
||||||
|
// switch
|
||||||
|
equipAvatar.WeaponUniqueId = oldItem.UniqueId;
|
||||||
|
oldItem.EquipAvatar = equipAvatar.AvatarId;
|
||||||
|
}
|
||||||
|
else if (equipAvatar != null && oldItem == null)
|
||||||
|
{
|
||||||
|
equipAvatar.WeaponUniqueId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (oldItem != null)
|
||||||
|
{
|
||||||
|
oldItem.EquipAvatar = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
itemData.EquipAvatar = avatarData.AvatarId;
|
||||||
|
avatarData.WeaponUniqueId = itemData.UniqueId;
|
||||||
|
await Player.SyncValk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async ValueTask ExchangeAvatar(int avatarId1, int avatarId2)
|
||||||
|
{
|
||||||
|
var avatarData1 = Player.AvatarManager!.GetAvatar(avatarId1);
|
||||||
|
var avatarData2 = Player.AvatarManager!.GetAvatar(avatarId2);
|
||||||
|
if (avatarData1 == null || avatarData2 == null) return;
|
||||||
|
|
||||||
|
var item1 = Data.WeaponItems.Find(x => x.UniqueId == avatarData1.WeaponUniqueId);
|
||||||
|
var item2 = Data.WeaponItems.Find(x => x.UniqueId == avatarData2.WeaponUniqueId);
|
||||||
|
if (item1 == null || item2 == null) return;
|
||||||
|
|
||||||
|
var tempWeaponId = avatarData1.WeaponUniqueId;
|
||||||
|
|
||||||
|
avatarData1.WeaponUniqueId = avatarData2.WeaponUniqueId;
|
||||||
|
avatarData2.WeaponUniqueId = tempWeaponId;
|
||||||
|
|
||||||
|
item1.EquipAvatar = avatarData2.AvatarId;
|
||||||
|
item2.EquipAvatar = avatarData1.AvatarId;
|
||||||
|
|
||||||
|
await Player.SyncValk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async ValueTask EquipStigmata(int avatarId, int uniqueId, int slot)
|
||||||
|
{
|
||||||
|
var itemData = Data.StigmataItems.Find(x => x.UniqueId == uniqueId);
|
||||||
|
var avatarData = Player.AvatarManager!.GetAvatar(avatarId);
|
||||||
|
if (itemData == null || avatarData == null) return;
|
||||||
|
avatarData.Stigmata.TryGetValue(slot, out var id);
|
||||||
|
var oldItem = Data.StigmataItems.Find(x => x.UniqueId == id);
|
||||||
|
|
||||||
|
if (itemData.EquipAvatar > 0) // already be dressed
|
||||||
|
{
|
||||||
|
var equipAvatarId = itemData.EquipAvatar;
|
||||||
|
var equipAvatar = Player.AvatarManager!.GetAvatar(equipAvatarId);
|
||||||
|
if (equipAvatar != null && oldItem != null)
|
||||||
|
{
|
||||||
|
// switch
|
||||||
|
equipAvatar.Stigmata[slot] = oldItem.UniqueId;
|
||||||
|
oldItem.EquipAvatar = equipAvatar.AvatarId;
|
||||||
|
}
|
||||||
|
else if (equipAvatar != null && oldItem == null)
|
||||||
|
{
|
||||||
|
equipAvatar.Stigmata[slot] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (oldItem != null)
|
||||||
|
{
|
||||||
|
oldItem.EquipAvatar = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
itemData.EquipAvatar = avatarData.AvatarId;
|
||||||
|
avatarData.Stigmata[slot] = itemData.UniqueId;
|
||||||
|
await Player.SyncValk();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async ValueTask ExchangeStigmata(int avatarId1, int avatarId2, int slot)
|
||||||
|
{
|
||||||
|
var avatarData1 = Player.AvatarManager!.GetAvatar(avatarId1);
|
||||||
|
var avatarData2 = Player.AvatarManager!.GetAvatar(avatarId2);
|
||||||
|
if (avatarData1 == null || avatarData2 == null) return;
|
||||||
|
|
||||||
|
var has1 = avatarData1.Stigmata.TryGetValue(slot, out var id1);
|
||||||
|
var has2 = avatarData2.Stigmata.TryGetValue(slot, out var id2);
|
||||||
|
|
||||||
|
var item1 = Data.StigmataItems.Find(x => x.UniqueId == id1);
|
||||||
|
var item2 = Data.StigmataItems.Find(x => x.UniqueId == id2);
|
||||||
|
if (item1 == null || item2 == null) return;
|
||||||
|
|
||||||
|
var tempStigmataId = avatarData1.Stigmata[slot];
|
||||||
|
|
||||||
|
avatarData1.Stigmata[slot] = avatarData2.Stigmata[slot];
|
||||||
|
avatarData2.Stigmata[slot] = tempStigmataId;
|
||||||
|
|
||||||
|
item1.EquipAvatar = avatarData2.AvatarId;
|
||||||
|
item2.EquipAvatar = avatarData1.AvatarId;
|
||||||
|
|
||||||
|
await Player.SyncValk();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,20 @@ public class HandlerDressEquipmentReq : Handler
|
|||||||
{
|
{
|
||||||
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
|
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
|
||||||
{
|
{
|
||||||
await connection.SendPacket(new PacketDressEquipmentRsp());
|
var req = DressEquipmentReq.Parser.ParseFrom(data);
|
||||||
|
var player = connection.Player!;
|
||||||
|
|
||||||
|
switch (req.Slot)
|
||||||
|
{
|
||||||
|
case EquipmentSlot.Weapon1:
|
||||||
|
await player.InventoryManager!.EquipAvatar((int)req.AvatarId, (int)req.UniqueId);
|
||||||
|
break;
|
||||||
|
case EquipmentSlot.Stigmata1:
|
||||||
|
case EquipmentSlot.Stigmata2:
|
||||||
|
case EquipmentSlot.Stigmata3:
|
||||||
|
await player.InventoryManager!.EquipStigmata((int)req.AvatarId, (int)req.UniqueId, ((int)req.Slot - 1));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
await connection.SendPacket(new PacketDressEquipmentRsp(req.Slot,req.UniqueId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using KianaBH.GameServer.Server.Packet.Send.Avatar;
|
||||||
|
using KianaBH.Proto;
|
||||||
|
|
||||||
|
namespace KianaBH.GameServer.Server.Packet.Recv.Avatar;
|
||||||
|
|
||||||
|
[Opcode(CmdIds.ExchangeAvatarStigmataReq)]
|
||||||
|
public class HandlerExchangeAvatarStigmataReq : Handler
|
||||||
|
{
|
||||||
|
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
|
||||||
|
{
|
||||||
|
var req = ExchangeAvatarStigmataReq.Parser.ParseFrom(data);
|
||||||
|
var player = connection.Player!;
|
||||||
|
|
||||||
|
await player.InventoryManager!.ExchangeStigmata((int)req.AvatarId1, (int)req.AvatarId2, ((int)req.Slot-1));
|
||||||
|
|
||||||
|
await connection.SendPacket(new PacketExchangeAvatarStigmataRsp(req.AvatarId1,req.AvatarId2,req.Slot));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using KianaBH.GameServer.Server.Packet.Send.Avatar;
|
||||||
|
using KianaBH.Proto;
|
||||||
|
|
||||||
|
namespace KianaBH.GameServer.Server.Packet.Recv.Avatar;
|
||||||
|
|
||||||
|
[Opcode(CmdIds.ExchangeAvatarWeaponReq)]
|
||||||
|
public class HandlerExchangeAvatarWeaponReq : Handler
|
||||||
|
{
|
||||||
|
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
|
||||||
|
{
|
||||||
|
var req = ExchangeAvatarWeaponReq.Parser.ParseFrom(data);
|
||||||
|
var player = connection.Player!;
|
||||||
|
|
||||||
|
await player.InventoryManager!.ExchangeAvatar((int)req.AvatarId1, (int)req.AvatarId2);
|
||||||
|
|
||||||
|
await connection.SendPacket(CmdIds.ExchangeAvatarWeaponRsp);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using KianaBH.GameServer.Game.Player;
|
||||||
using KianaBH.KcpSharp;
|
using KianaBH.KcpSharp;
|
||||||
using KianaBH.Proto;
|
using KianaBH.Proto;
|
||||||
|
|
||||||
@@ -5,12 +6,12 @@ namespace KianaBH.GameServer.Server.Packet.Send.Avatar;
|
|||||||
|
|
||||||
public class PacketDressEquipmentRsp : BasePacket
|
public class PacketDressEquipmentRsp : BasePacket
|
||||||
{
|
{
|
||||||
public PacketDressEquipmentRsp() : base(CmdIds.DressEquipmentRsp)
|
public PacketDressEquipmentRsp(EquipmentSlot slot, uint uniqueId) : base(CmdIds.DressEquipmentRsp)
|
||||||
{
|
{
|
||||||
// TODO: Implement
|
|
||||||
var proto = new DressEquipmentRsp
|
var proto = new DressEquipmentRsp
|
||||||
{
|
{
|
||||||
|
UniqueId = uniqueId,
|
||||||
|
Slot = slot
|
||||||
};
|
};
|
||||||
|
|
||||||
SetData(proto);
|
SetData(proto);
|
||||||
|
|||||||
@@ -0,0 +1,20 @@
|
|||||||
|
using KianaBH.GameServer.Game.Player;
|
||||||
|
using KianaBH.KcpSharp;
|
||||||
|
using KianaBH.Proto;
|
||||||
|
|
||||||
|
namespace KianaBH.GameServer.Server.Packet.Send.Avatar;
|
||||||
|
|
||||||
|
public class PacketExchangeAvatarStigmataRsp : BasePacket
|
||||||
|
{
|
||||||
|
public PacketExchangeAvatarStigmataRsp(uint avatarId1, uint avatarId2, EquipmentSlot slot) : base(CmdIds.ExchangeAvatarStigmataRsp)
|
||||||
|
{
|
||||||
|
var proto = new ExchangeAvatarStigmataRsp
|
||||||
|
{
|
||||||
|
AvatarId1 = avatarId1,
|
||||||
|
AvatarId2 = avatarId2,
|
||||||
|
Slot = slot
|
||||||
|
};
|
||||||
|
|
||||||
|
SetData(proto);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user