From e4397f10ee5c67e60800c50c21f4fa6a505c9a1b Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Mon, 11 May 2026 17:11:47 +0800 Subject: [PATCH] add tutorial guide --- Common/Data/Config/StringToUIntConverter.cs | 24 +++++++++++++++++++ Common/Data/Excel/GuideExcel.cs | 21 ++++++++++++++++ Common/Data/GameData.cs | 1 + GameServer/Game/Character/CharacterManager.cs | 4 ++-- GameServer/Game/Player/PlayerInstance.cs | 5 ++++ 5 files changed, 53 insertions(+), 2 deletions(-) create mode 100644 Common/Data/Config/StringToUIntConverter.cs create mode 100644 Common/Data/Excel/GuideExcel.cs diff --git a/Common/Data/Config/StringToUIntConverter.cs b/Common/Data/Config/StringToUIntConverter.cs new file mode 100644 index 0000000..89054bc --- /dev/null +++ b/Common/Data/Config/StringToUIntConverter.cs @@ -0,0 +1,24 @@ +using Newtonsoft.Json; + +namespace MikuSB.Data.Config; + +public class StringToUIntConverter : JsonConverter +{ + public override uint ReadJson(JsonReader reader, Type objectType, uint existingValue, bool hasExistingValue, JsonSerializer serializer) + { + if (reader.Value == null) + return 0; + + var value = reader.Value.ToString(); + + if (string.IsNullOrWhiteSpace(value)) + return 0; + + return uint.TryParse(value, out var result) ? result : 0; + } + + public override void WriteJson(JsonWriter writer, uint value, JsonSerializer serializer) + { + writer.WriteValue(value); + } +} \ No newline at end of file diff --git a/Common/Data/Excel/GuideExcel.cs b/Common/Data/Excel/GuideExcel.cs new file mode 100644 index 0000000..a691711 --- /dev/null +++ b/Common/Data/Excel/GuideExcel.cs @@ -0,0 +1,21 @@ +using MikuSB.Data.Config; +using Newtonsoft.Json; + +namespace MikuSB.Data.Excel; + +[ResourceEntity("guide/guide.json")] +public class GuideExcel : ExcelResource +{ + public uint ID { get; set; } + [JsonConverter(typeof(StringToUIntConverter))] public uint Group { get; set; } + + public override uint GetId() + { + return (ID << 48) | (Group << 32); + } + + public override void Loaded() + { + GameData.GuideData.TryAdd(GetId(), this); + } +} diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index 96e05cb..5cd26e8 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -29,6 +29,7 @@ public static class GameData public static Dictionary CardSkinPartsData { get; private set; } = []; public static Dictionary CallItemData { get; private set; } = []; public static Dictionary WeaponPartsData { get; private set; } = []; + public static Dictionary GuideData { get; private set; } = []; } public static class GameResourceTemplateId diff --git a/GameServer/Game/Character/CharacterManager.cs b/GameServer/Game/Character/CharacterManager.cs index 98444fd..ded781a 100644 --- a/GameServer/Game/Character/CharacterManager.cs +++ b/GameServer/Game/Character/CharacterManager.cs @@ -27,11 +27,11 @@ public class CharacterManager(PlayerInstance player) : BasePlayerManager(player) Timestamp = Extensions.GetUnixSec() }; - var weaponInfo = await Player.InventoryManager!.AddWeaponItem((ItemTypeEnum)CharacterExcel.DefaultWeaponGPDL[0], CharacterExcel.DefaultWeaponGPDL[1], CharacterExcel.DefaultWeaponGPDL[2], CharacterExcel.DefaultWeaponGPDL[3],sendPacket:false); + var weaponInfo = await Player.InventoryManager!.AddWeaponItem((ItemTypeEnum)CharacterExcel.DefaultWeaponGPDL[0], CharacterExcel.DefaultWeaponGPDL[1], CharacterExcel.DefaultWeaponGPDL[2], CharacterExcel.DefaultWeaponGPDL[3],sendPacket: true); if (weaponInfo != null) character.WeaponUniqueId = weaponInfo.UniqueId; var skinInfo = Player.InventoryManager!.GetSkinItemGDPL(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level) - ?? await Player.InventoryManager!.AddSkinItem(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level, false); + ?? await Player.InventoryManager!.AddSkinItem(ItemTypeEnum.TYPE_CARD_SKIN, detail, particular, level, true); if (skinInfo != null) character.SkinId = skinInfo.UniqueId; if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([character])); diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index d73230c..b887bb2 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -370,6 +370,11 @@ public class PlayerInstance(PlayerGameData data) yield return (22, levelId, 1_700_000_000); } + foreach (var guide in GameData.GuideData.Values) + { + yield return (4, guide.ID, 999); + } + // Main Scene 0 mean default scene yield return (132, 1, 0); }