fix: shop list

This commit is contained in:
StopWuyu
2025-08-18 20:40:48 +08:00
parent eabd9ba669
commit 6d43181e2a
7 changed files with 132 additions and 68 deletions

View File

@@ -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<int> UseParam { get; set; } = [];
public bool IsAutoUse { get; set; }
public override int GetId()
{
return UseDataID;
}
public override void Loaded()
{
GameData.ItemUseDataData.TryAdd(UseDataID, this);
}
}

View File

@@ -197,6 +197,7 @@ public static class GameData
public static Dictionary<int, MappingInfoExcel> MappingInfoData { get; private set; } = [];
public static Dictionary<int, ItemConfigExcel> ItemConfigData { get; private set; } = [];
public static Dictionary<int, ItemUseBuffDataExcel> ItemUseBuffDataData { get; private set; } = [];
public static Dictionary<int, ItemUseDataExcel> ItemUseDataData { get; private set; } = [];
public static Dictionary<int, EquipmentConfigExcel> EquipmentConfigData { get; private set; } = [];
public static Dictionary<int, EquipmentExpTypeExcel> EquipmentExpTypeData { get; private set; } = [];
public static Dictionary<int, EquipmentExpItemConfigExcel> EquipmentExpItemConfigData { get; private set; } = [];

View File

@@ -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<ItemData> 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

View File

@@ -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);
}
}

View File

@@ -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<ItemData>();
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);

View File

@@ -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

View File

@@ -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);