From f873da6975ad332597e702c1aaf8bee47b1a1e74 Mon Sep 17 00:00:00 2001 From: letheriver2007 Date: Wed, 2 Oct 2024 13:50:33 +0800 Subject: [PATCH] Fix Pet System --- Command/Command/Cmd/CommandGiveall.cs | 30 +++++++++++++++++++ Common/Data/Excel/PetExcel.cs | 17 +++++++++++ Common/Data/GameData.cs | 1 + Common/Database/Player/PlayerData.cs | 2 ++ .../Message/LanguageCHS.cs | 1 + .../Message/LanguageCHT.cs | 1 + .../Message/LanguageEN.cs | 1 + GameServer/Game/Inventory/InventoryManager.cs | 3 ++ .../Packet/Recv/Pet/HandlerGetPetDataCsReq.cs | 15 ++++++++++ .../Packet/Recv/Pet/HandlerRecallPetCsReq.cs | 18 +++++++++++ .../Packet/Recv/Pet/HandlerSummonPetCsReq.cs | 23 ++++++++++++++ .../Send/Pet/PacketCurPetChangedScNotify.cs | 18 +++++++++++ .../Packet/Send/Pet/PacketGetPetDataScRsp.cs | 26 ++++++++++++++++ .../Packet/Send/Pet/PacketRecallPetScRsp.cs | 19 ++++++++++++ .../Packet/Send/Pet/PacketSummonPetScRsp.cs | 19 ++++++++++++ .../PlayerSync/PacketPlayerSyncScNotify.cs | 1 + 16 files changed, 195 insertions(+) create mode 100644 Common/Data/Excel/PetExcel.cs create mode 100644 GameServer/Server/Packet/Recv/Pet/HandlerGetPetDataCsReq.cs create mode 100644 GameServer/Server/Packet/Recv/Pet/HandlerRecallPetCsReq.cs create mode 100644 GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs create mode 100644 GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs create mode 100644 GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs create mode 100644 GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs create mode 100644 GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs diff --git a/Command/Command/Cmd/CommandGiveall.cs b/Command/Command/Cmd/CommandGiveall.cs index 0bf8b65d..82128258 100644 --- a/Command/Command/Cmd/CommandGiveall.cs +++ b/Command/Command/Cmd/CommandGiveall.cs @@ -138,6 +138,36 @@ public class CommandGiveall : ICommand I18NManager.Translate("Word.Material"), amount.ToString())); } + [CommandMethod("0 pet")] + public async ValueTask GiveAllPet(CommandArg arg) + { + var player = arg.Target?.Player; + if (player == null) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Notice.PlayerNotFound")); + return; + } + arg.CharacterArgs.TryGetValue("x", out var amountStr); + amountStr ??= "1"; + if (!int.TryParse(amountStr, out var amount)) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Notice.InvalidArguments")); + return; + } + var petList = GameData.ItemConfigData.Values; + var items = new List(); + foreach (var pet in petList) + if (pet.ItemMainType == ItemMainTypeEnum.Pet) + items.Add(new ItemData + { + ItemId = pet.ID, + Count = amount + }); + await player.InventoryManager!.AddItems(items, true); + await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems", + I18NManager.Translate("Word.Pet"), "1")); + } + [CommandMethod("0 relic")] public async ValueTask GiveAllRelic(CommandArg arg) { diff --git a/Common/Data/Excel/PetExcel.cs b/Common/Data/Excel/PetExcel.cs new file mode 100644 index 00000000..5b92b5cb --- /dev/null +++ b/Common/Data/Excel/PetExcel.cs @@ -0,0 +1,17 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("PetConfig.json")] +public class PetExcel : ExcelResource +{ + public int PetID { get; set; } + public int PetItemID { get; set; } + public int SummonUnitID { get; set; } + public override int GetId() + { + return PetID; + } + public override void Loaded() + { + GameData.PetData.Add(PetID, this); + } +} \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 9656ceee..f6ed7e10 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -131,6 +131,7 @@ public static class GameData public static Dictionary RelicConfigData { get; private set; } = []; public static Dictionary RelicExpItemData { get; private set; } = []; public static Dictionary RelicExpTypeData { get; private set; } = []; + public static Dictionary PetData { get; private set; } = []; #endregion diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs index 67986c15..92ad5c3b 100644 --- a/Common/Database/Player/PlayerData.cs +++ b/Common/Database/Player/PlayerData.cs @@ -27,6 +27,8 @@ public class PlayerData : BaseDatabaseDataHelper public int Mcoin { get; set; } = 0; // Crystals public int TalentPoints { get; set; } = 0; // Rogue talent points + public int Pet { get; set; } = 0; + public int Stamina { get; set; } = 240; public double StaminaReserve { get; set; } = 0; public long NextStaminaRecover { get; set; } = 0; diff --git a/Common/Internationalization/Message/LanguageCHS.cs b/Common/Internationalization/Message/LanguageCHS.cs index 6466c2a4..624bb782 100644 --- a/Common/Internationalization/Message/LanguageCHS.cs +++ b/Common/Internationalization/Message/LanguageCHS.cs @@ -38,6 +38,7 @@ public class WordTextCHS public string Rank => "星魂"; public string Avatar => "角色"; public string Material => "材料"; + public string Pet => "宠物"; public string Relic => "遗器"; public string Equipment => "光锥"; public string Talent => "行迹"; diff --git a/Common/Internationalization/Message/LanguageCHT.cs b/Common/Internationalization/Message/LanguageCHT.cs index cb44eae7..0fab0c69 100644 --- a/Common/Internationalization/Message/LanguageCHT.cs +++ b/Common/Internationalization/Message/LanguageCHT.cs @@ -38,6 +38,7 @@ public class WordTextCHT public string Rank => "星魂"; public string Avatar => "角色"; public string Material => "材料"; + public string Pet => "寵物"; public string Relic => "遺器"; public string Equipment => "光錐"; public string Talent => "行跡"; diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index 1f69e133..ae69c785 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -38,6 +38,7 @@ public class WordTextEN public string Rank => "Rank"; public string Avatar => "Avatar"; public string Material => "Material"; + public string Pet => "Pet"; public string Relic => "Relic"; public string Equipment => "Light Cone"; public string Talent => "Talent"; diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index fb9811a3..e6e866c0 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -203,6 +203,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) switch (GameData.ItemConfigData[itemId].ItemMainType) { case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Pet: case ItemMainTypeEnum.Virtual: case ItemMainTypeEnum.Usable: case ItemMainTypeEnum.Mission: @@ -263,6 +264,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) switch (itemConfig.ItemMainType) { case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Pet: case ItemMainTypeEnum.Mission: case ItemMainTypeEnum.Usable: var item = Data.MaterialItems.Find(x => x.ItemId == itemId); @@ -341,6 +343,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) switch (mainType) { case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Pet: return Data.MaterialItems.Find(x => x.ItemId == itemId); case ItemMainTypeEnum.Equipment: return uniqueId > 0 diff --git a/GameServer/Server/Packet/Recv/Pet/HandlerGetPetDataCsReq.cs b/GameServer/Server/Packet/Recv/Pet/HandlerGetPetDataCsReq.cs new file mode 100644 index 00000000..1d9efc23 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Pet/HandlerGetPetDataCsReq.cs @@ -0,0 +1,15 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; +using EggLink.DanhengServer.Kcp; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Pet; + +[Opcode(CmdIds.GetPetDataCsReq)] +public class HandlerGetPetDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var player = connection.Player!; + + await connection.SendPacket(new PacketGetPetDataScRsp(player)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Pet/HandlerRecallPetCsReq.cs b/GameServer/Server/Packet/Recv/Pet/HandlerRecallPetCsReq.cs new file mode 100644 index 00000000..06418309 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Pet/HandlerRecallPetCsReq.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Pet; + +[Opcode(CmdIds.RecallPetCsReq)] +public class HandlerRecallPetCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = RecallPetCsReq.Parser.ParseFrom(data); + + connection.Player!.Data.Pet = 0; + + await connection.SendPacket(new PacketRecallPetScRsp(req.SummonedPetId)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs b/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs new file mode 100644 index 00000000..1025bffe --- /dev/null +++ b/GameServer/Server/Packet/Recv/Pet/HandlerSummonPetCsReq.cs @@ -0,0 +1,23 @@ +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Pet; + +[Opcode(CmdIds.SummonPetCsReq)] +public class HandlerSummonPetCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = SummonPetCsReq.Parser.ParseFrom(data); + + int curPetId = connection.Player!.Data.Pet; + if (curPetId != req.SummonedPetId && curPetId != 0) { + await connection.SendPacket(new PacketCurPetChangedScNotify(req.SummonedPetId)); + } + + connection.Player!.Data.Pet = (int)req.SummonedPetId; + + await connection.SendPacket(new PacketSummonPetScRsp(curPetId, req.SummonedPetId)); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs b/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs new file mode 100644 index 00000000..dc118f09 --- /dev/null +++ b/GameServer/Server/Packet/Send/Pet/PacketCurPetChangedScNotify.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; + +public class PacketCurPetChangedScNotify : BasePacket +{ + public PacketCurPetChangedScNotify(uint newPetId) : base(CmdIds.CurPetChangedScNotify) + { + + var proto = new CurPetChangedScNotify + { + CurPetId = newPetId, + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs new file mode 100644 index 00000000..ae8663fd --- /dev/null +++ b/GameServer/Server/Packet/Send/Pet/PacketGetPetDataScRsp.cs @@ -0,0 +1,26 @@ +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; + +public class PacketGetPetDataScRsp : BasePacket +{ + public PacketGetPetDataScRsp(PlayerInstance player) : base(CmdIds.GetPetDataScRsp) + { + + var proto = new GetPetDataScRsp + { + CurPetId = (uint)player.Data.Pet, + }; + + foreach (var pet in GameData.PetData.Values) + { + + proto.PetIdList.Add((uint)pet.PetID); + } + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs new file mode 100644 index 00000000..82b9aea2 --- /dev/null +++ b/GameServer/Server/Packet/Send/Pet/PacketRecallPetScRsp.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; + +public class PacketRecallPetScRsp : BasePacket +{ + public PacketRecallPetScRsp(uint newPetId) : base(CmdIds.RecallPetScRsp) + { + + var proto = new RecallPetScRsp + { + CurPetId = newPetId, + NewPetId = 0 + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs b/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs new file mode 100644 index 00000000..921d00b4 --- /dev/null +++ b/GameServer/Server/Packet/Send/Pet/PacketSummonPetScRsp.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Pet; + +public class PacketSummonPetScRsp : BasePacket +{ + public PacketSummonPetScRsp(int curPetId, uint newPetId) : base(CmdIds.SummonPetScRsp) + { + + var proto = new SummonPetScRsp + { + CurPetId = (uint)curPetId, + NewPetId = newPetId + }; + + SetData(proto); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs b/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs index 048ed7d6..ce08b4c8 100644 --- a/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs +++ b/GameServer/Server/Packet/Send/PlayerSync/PacketPlayerSyncScNotify.cs @@ -160,6 +160,7 @@ public class PacketPlayerSyncScNotify : BasePacket break; case ItemMainTypeEnum.Mission: case ItemMainTypeEnum.Material: + case ItemMainTypeEnum.Pet: case ItemMainTypeEnum.Usable: notify.MaterialList.Add(item.ToMaterialProto()); break;