From 6d43181e2a096a0bbf723c726bcf76819c8c63af Mon Sep 17 00:00:00 2001 From: StopWuyu Date: Mon, 18 Aug 2025 20:40:48 +0800 Subject: [PATCH] fix: shop list --- Common/Data/Excel/ItemUseDataExcel.cs | 20 +++ Common/Data/GameData.cs | 1 + GameServer/Game/Inventory/InventoryManager.cs | 137 ++++++++++-------- .../Handler/MissionHandlerWorldLevel.cs | 19 +++ GameServer/Game/Shop/ShopService.cs | 16 +- .../Player/PacketQueryProductInfoScRsp.cs | 3 +- .../Send/Shop/PacketGetShopListScRsp.cs | 4 +- 7 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 Common/Data/Excel/ItemUseDataExcel.cs create mode 100644 GameServer/Game/Mission/FinishType/Handler/MissionHandlerWorldLevel.cs diff --git a/Common/Data/Excel/ItemUseDataExcel.cs b/Common/Data/Excel/ItemUseDataExcel.cs new file mode 100644 index 00000000..0281f5a7 --- /dev/null +++ b/Common/Data/Excel/ItemUseDataExcel.cs @@ -0,0 +1,20 @@ +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("ItemUseData.json")] +public class ItemUseDataExcel : ExcelResource +{ + public int UseDataID { get; set; } + public int UseMultipleMax { get; set; } + public List UseParam { get; set; } = []; + public bool IsAutoUse { get; set; } + + public override int GetId() + { + return UseDataID; + } + + public override void Loaded() + { + GameData.ItemUseDataData.TryAdd(UseDataID, this); + } +} \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 973f2ec5..6ea5b36d 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -197,6 +197,7 @@ public static class GameData public static Dictionary MappingInfoData { get; private set; } = []; public static Dictionary ItemConfigData { get; private set; } = []; public static Dictionary ItemUseBuffDataData { get; private set; } = []; + public static Dictionary ItemUseDataData { get; private set; } = []; public static Dictionary EquipmentConfigData { get; private set; } = []; public static Dictionary EquipmentExpTypeData { get; private set; } = []; public static Dictionary EquipmentExpItemConfigData { get; private set; } = []; diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index 776b1684..45f545b8 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -97,6 +97,8 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) case ItemSubTypeEnum.Food: case ItemSubTypeEnum.Book: case ItemSubTypeEnum.FindChest: + case ItemSubTypeEnum.Gift: + case ItemSubTypeEnum.ForceOpitonalGift: itemData = await PutItem(itemId, count); break; } @@ -362,6 +364,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) { case ItemMainTypeEnum.Material: case ItemMainTypeEnum.Pet: + case ItemMainTypeEnum.Usable: return Data.MaterialItems.Find(x => x.ItemId == itemId); case ItemMainTypeEnum.Equipment: return uniqueId > 0 @@ -695,89 +698,99 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player) GameData.ItemConfigData.TryGetValue(itemId, out var itemConfig); if (itemConfig == null) return (Retcode.RetItemNotExist, null); var dataId = itemConfig.ID; - GameData.ItemUseBuffDataData.TryGetValue(dataId, out var useConfig); - if (useConfig == null) return (Retcode.RetItemUseConfigNotExist, null); - for (var i = 0; i < count; i++) // do count times + List resItemDatas = []; + if (GameData.ItemUseBuffDataData.TryGetValue(dataId, out var useConfig)) { - if (useConfig.PreviewSkillPoint != 0) await Player.LineupManager!.GainMp((int)useConfig.PreviewSkillPoint); - - if (baseAvatarId > 0) + for (var i = 0; i < count; i++) // do count times { - // single use - var avatar = Player.AvatarManager!.GetFormalAvatar(baseAvatarId); - if (avatar == null) return (Retcode.RetAvatarNotExist, null); + if (useConfig.PreviewSkillPoint != 0) await Player.LineupManager!.GainMp((int)useConfig.PreviewSkillPoint); - var extraLineup = Player.LineupManager!.GetCurLineup()?.IsExtraLineup() == true; - - if (useConfig.PreviewHPRecoveryPercent != 0) + if (baseAvatarId > 0) { - avatar.SetCurHp( - Math.Min(Math.Max(avatar.CurrentHp + (int)(useConfig.PreviewHPRecoveryPercent * 10000), 0), - 10000), extraLineup); + // single use + var avatar = Player.AvatarManager!.GetFormalAvatar(baseAvatarId); + if (avatar == null) return (Retcode.RetAvatarNotExist, null); - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + var extraLineup = Player.LineupManager!.GetCurLineup()?.IsExtraLineup() == true; + + if (useConfig.PreviewHPRecoveryPercent != 0) + { + avatar.SetCurHp( + Math.Min(Math.Max(avatar.CurrentHp + (int)(useConfig.PreviewHPRecoveryPercent * 10000), 0), + 10000), extraLineup); + + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } + + if (useConfig.PreviewHPRecoveryValue != 0) + { + avatar.SetCurHp( + Math.Min(Math.Max(avatar.CurrentHp + (int)useConfig.PreviewHPRecoveryValue, 0), 10000), + extraLineup); + + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } + + if (useConfig.PreviewPowerPercent != 0) + { + avatar.SetCurSp( + Math.Min(Math.Max(avatar.CurrentHp + (int)(useConfig.PreviewPowerPercent * 10000), 0), 10000), + extraLineup); + + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } } - - if (useConfig.PreviewHPRecoveryValue != 0) + else { - avatar.SetCurHp( - Math.Min(Math.Max(avatar.CurrentHp + (int)useConfig.PreviewHPRecoveryValue, 0), 10000), - extraLineup); + // team use + if (useConfig.PreviewHPRecoveryPercent != 0) + { + Player.LineupManager!.GetCurLineup()!.Heal((int)(useConfig.PreviewHPRecoveryPercent * 10000), true); - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); - } + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } - if (useConfig.PreviewPowerPercent != 0) - { - avatar.SetCurSp( - Math.Min(Math.Max(avatar.CurrentHp + (int)(useConfig.PreviewPowerPercent * 10000), 0), 10000), - extraLineup); + if (useConfig.PreviewHPRecoveryValue != 0) + { + Player.LineupManager!.GetCurLineup()!.Heal((int)useConfig.PreviewHPRecoveryValue, true); - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } + + if (useConfig.PreviewPowerPercent != 0) + { + Player.LineupManager!.GetCurLineup()!.AddPercentSp((int)(useConfig.PreviewPowerPercent * 10000)); + + await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); + } } } - else - { - // team use - if (useConfig.PreviewHPRecoveryPercent != 0) - { - Player.LineupManager!.GetCurLineup()!.Heal((int)(useConfig.PreviewHPRecoveryPercent * 10000), true); - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); - } + //maze buff + if (useConfig.MazeBuffID > 0) + foreach (var info in Player.SceneInstance?.AvatarInfo.Values.ToList() ?? []) + if (baseAvatarId == 0 || info.AvatarInfo.BaseAvatarId == baseAvatarId) + await info.AddBuff(new SceneBuff(useConfig.MazeBuffID, 1, info.AvatarInfo.AvatarId)); - if (useConfig.PreviewHPRecoveryValue != 0) - { - Player.LineupManager!.GetCurLineup()!.Heal((int)useConfig.PreviewHPRecoveryValue, true); - - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); - } - - if (useConfig.PreviewPowerPercent != 0) - { - Player.LineupManager!.GetCurLineup()!.AddPercentSp((int)(useConfig.PreviewPowerPercent * 10000)); - - await Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager.GetCurLineup()!)); - } - } + if (useConfig.MazeBuffID2 > 0) + foreach (var info in Player.SceneInstance?.AvatarInfo.Values.ToList() ?? []) + if (baseAvatarId == 0 || info.AvatarInfo.BaseAvatarId == baseAvatarId) + await info.AddBuff(new SceneBuff(useConfig.MazeBuffID2, 1, info.AvatarInfo.AvatarId)); } - //maze buff - if (useConfig.MazeBuffID > 0) - foreach (var info in Player.SceneInstance?.AvatarInfo.Values.ToList() ?? []) - if (baseAvatarId == 0 || info.AvatarInfo.BaseAvatarId == baseAvatarId) - await info.AddBuff(new SceneBuff(useConfig.MazeBuffID, 1, info.AvatarInfo.AvatarId)); - - if (useConfig.MazeBuffID2 > 0) - foreach (var info in Player.SceneInstance?.AvatarInfo.Values.ToList() ?? []) - if (baseAvatarId == 0 || info.AvatarInfo.BaseAvatarId == baseAvatarId) - await info.AddBuff(new SceneBuff(useConfig.MazeBuffID2, 1, info.AvatarInfo.AvatarId)); + if (GameData.ItemUseDataData.TryGetValue(dataId, out var useData)) + { + foreach (var rewardId in useData.UseParam) + { + resItemDatas.AddRange(await HandleReward(rewardId, true)); + } + } // remove item await RemoveItem(itemId, count); - return (Retcode.RetSucc, null); + return (Retcode.RetSucc, resItemDatas); } #region Equip diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerWorldLevel.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerWorldLevel.cs new file mode 100644 index 00000000..937b386a --- /dev/null +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerWorldLevel.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Enums.Mission; +using EggLink.DanhengServer.GameServer.Game.Player; + +namespace EggLink.DanhengServer.GameServer.Game.Mission.FinishType.Handler; +[MissionFinishType(MissionFinishTypeEnum.WorldLevel)] +public class MissionHandlerWorldLevel : MissionFinishTypeHandler +{ + public override async ValueTask HandleMissionFinishType(PlayerInstance player, SubMissionInfo info, object? arg) + { + await player.MissionManager!.FinishSubMission(info.ID); + } + + public override async ValueTask HandleQuestFinishType(PlayerInstance player, QuestDataExcel quest, FinishWayExcel excel, object? arg) + { + await player.QuestManager!.UpdateQuestProgress(quest.QuestID, player.Data.WorldLevel); + } +} \ No newline at end of file diff --git a/GameServer/Game/Shop/ShopService.cs b/GameServer/Game/Shop/ShopService.cs index 437fb1ce..2ea792da 100644 --- a/GameServer/Game/Shop/ShopService.cs +++ b/GameServer/Game/Shop/ShopService.cs @@ -3,6 +3,7 @@ using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Enums.Item; using EggLink.DanhengServer.Enums.Mission; using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Game.Shop; @@ -19,7 +20,7 @@ public class ShopService(PlayerInstance player) : BasePlayerManager(player) foreach (var cost in goods.CostList) await Player.InventoryManager!.RemoveItem(cost.Key, cost.Value * count); var items = new List(); - if (itemConfig.ItemMainType == ItemMainTypeEnum.Equipment || itemConfig.ItemMainType == ItemMainTypeEnum.Relic) + if (itemConfig.ItemMainType is ItemMainTypeEnum.Equipment or ItemMainTypeEnum.Relic) { for (var i = 0; i < count; i++) { @@ -30,7 +31,18 @@ public class ShopService(PlayerInstance player) : BasePlayerManager(player) else { var item = await Player.InventoryManager!.AddItem(itemConfig.ID, count, false); - if (item != null) items.Add(item); + if (item != null) + { + if (GameData.ItemUseDataData.TryGetValue(item.ItemId, out var useData) && useData.IsAutoUse) + { + var res = await Player.InventoryManager!.UseItem(item.ItemId); + if (res.returnItems != null) items.AddRange(res.returnItems); + } + else + { + items.Add(item); + } + } } await Player.MissionManager!.HandleFinishType(MissionFinishTypeEnum.BuyShopGoods, goods); diff --git a/GameServer/Server/Packet/Send/Player/PacketQueryProductInfoScRsp.cs b/GameServer/Server/Packet/Send/Player/PacketQueryProductInfoScRsp.cs index 50cf729c..cf071b2d 100644 --- a/GameServer/Server/Packet/Send/Player/PacketQueryProductInfoScRsp.cs +++ b/GameServer/Server/Packet/Send/Player/PacketQueryProductInfoScRsp.cs @@ -13,9 +13,8 @@ public class PacketQueryProductInfoScRsp : BasePacket //PEKJLBINDGG = (ulong)Extensions.GetUnixSec() + 8640000, // 100 day ProductList = { - GameData.RechargeConfigData.Values.Where(x => x.GiftType != 1).Select(x => new Product + GameData.RechargeConfigData.Values.Where(x => x.ProductID.Contains("chn") && !x.ProductID.Contains("cloud")).Select(x => new Product { - EndTime = uint.MaxValue, GiftType = (ProductGiftType)x.GiftType, PriceTier = x.TierID, ProductId = x.ProductID diff --git a/GameServer/Server/Packet/Send/Shop/PacketGetShopListScRsp.cs b/GameServer/Server/Packet/Send/Shop/PacketGetShopListScRsp.cs index a398272b..05f60ca8 100644 --- a/GameServer/Server/Packet/Send/Shop/PacketGetShopListScRsp.cs +++ b/GameServer/Server/Packet/Send/Shop/PacketGetShopListScRsp.cs @@ -14,13 +14,13 @@ public class PacketGetShopListScRsp : BasePacket }; foreach (var item in GameData.ShopConfigData.Values) - if (item.ShopType == shopType) + if (item.ShopType == shopType && item.Goods.Count > 0) proto.ShopList.Add(new Proto.Shop { ShopId = (uint)item.ShopID, CityLevel = 1, EndTime = uint.MaxValue, - GoodsList = { item.Goods.Select(g => g.ToProto()) } + GoodsList = { item.Goods.Where(x => x.ItemID != 0).Select(g => g.ToProto()) } }); SetData(proto);