From 9c67e36ca3126e5b5e022f45ed5242ed3183a46d Mon Sep 17 00:00:00 2001 From: Naruse <71993948+DevilProMT@users.noreply.github.com> Date: Sun, 26 Apr 2026 22:31:18 +0800 Subject: [PATCH] add lineup manager --- Common/Database/Lineup/LineupData.cs | 31 +++++++++++++++++ Common/Database/Player/PlayerGameData.cs | 1 + GameServer/Game/Lineup/LineupManager.cs | 29 ++++++++++++++++ GameServer/Game/Player/PlayerInstance.cs | 26 +++++++------- .../CallGS/Handlers/Lineup/Lineup_Update.cs | 34 ++++++++++++++++++- 5 files changed, 107 insertions(+), 14 deletions(-) create mode 100644 Common/Database/Lineup/LineupData.cs create mode 100644 GameServer/Game/Lineup/LineupManager.cs diff --git a/Common/Database/Lineup/LineupData.cs b/Common/Database/Lineup/LineupData.cs new file mode 100644 index 0000000..334e24f --- /dev/null +++ b/Common/Database/Lineup/LineupData.cs @@ -0,0 +1,31 @@ +using SqlSugar; + +namespace MikuSB.Database.Lineup; + +[SugarTable("lineup_data")] +public class LineupData : BaseDatabaseDataHelper +{ + [SugarColumn(IsJson = true)] public Dictionary LineupInfo { get; set; } = []; +} + +public class LineupDataInfo +{ + public uint Index { get; set; } + public string Name { get; set; } = ""; + public uint Member1 { get; set; } + public uint Member2 { get; set; } + public uint Member3 { get; set; } + + public Proto.Lineup ToProto() + { + var proto = new Proto.Lineup + { + Index = Index, + Name = Name, + Member1 = Member1, + Member2 = Member2, + Member3 = Member3, + }; + return proto; + } +} \ No newline at end of file diff --git a/Common/Database/Player/PlayerGameData.cs b/Common/Database/Player/PlayerGameData.cs index 2566f9d..86bb7fc 100644 --- a/Common/Database/Player/PlayerGameData.cs +++ b/Common/Database/Player/PlayerGameData.cs @@ -14,6 +14,7 @@ public class PlayerGameData : BaseDatabaseDataHelper public long RegisterTime { get; set; } = Extensions.GetUnixSec(); public long LastActiveTime { get; set; } public Sex Gender { get; set; } = Sex.Female; + public uint Vigor { get; set; } = 240; [SugarColumn(IsJson = true)] public List Attrs { get; set; } = []; [SugarColumn(IsJson = true)] public List ShowItems { get; set; } = []; diff --git a/GameServer/Game/Lineup/LineupManager.cs b/GameServer/Game/Lineup/LineupManager.cs new file mode 100644 index 0000000..92c081f --- /dev/null +++ b/GameServer/Game/Lineup/LineupManager.cs @@ -0,0 +1,29 @@ +using MikuSB.Database; +using MikuSB.GameServer.Game.Player; +using MikuSB.Database.Lineup; + +namespace MikuSB.GameServer.Game.Lineup; + +public class LineupManager(PlayerInstance player) : BasePlayerManager(player) +{ + public LineupData LineupData { get; } = DatabaseHelper.GetInstanceOrCreateNew(player.Uid); + + public async ValueTask UpdateLineup(int lineupId, uint member1, uint member2, uint member3) + { + if (!LineupData.LineupInfo.TryGetValue(lineupId, out var formation)) + { + formation = new LineupDataInfo + { + Index = (uint)lineupId, + Name = lineupId.ToString() + }; + + LineupData.LineupInfo[lineupId] = formation; + } + + formation.Member1 = member1; + formation.Member2 = member2; + formation.Member3 = member3; + return formation; + } +} \ No newline at end of file diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index e7cd9d4..62c89cd 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -6,7 +6,7 @@ using MikuSB.Enums.Item; using MikuSB.GameServer.Game.Character; using MikuSB.GameServer.Game.Inventory; using MikuSB.GameServer.Server; -using MikuSB.Proto; +using MikuSB.GameServer.Game.Lineup; using MikuSB.TcpSharp; using MikuSB.Util.Extensions; @@ -29,6 +29,7 @@ public class PlayerInstance(PlayerGameData data) public PlayerGameData Data { get; set; } = data; public CharacterManager CharacterManager { get; set; } = null!; public InventoryManager InventoryManager { get; set; } = null!; + public LineupManager LineupManager { get; set; } = null!; #endregion @@ -65,6 +66,14 @@ public class PlayerInstance(PlayerGameData data) await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level); } + var selected = CharacterManager.CharacterData.Characters + .OrderBy(_ => Guid.NewGuid()) + .Take(3) + .Select(x => x.Guid) + .ToList(); + + await LineupManager.UpdateLineup(1, selected[0], selected[1], selected[2]); + var bootstrapAttrs = BuildLobbyBootstrapAttrs(); var existingAttrs = Data.Attrs .ToDictionary(x => (x.Gid, x.Sid)); @@ -103,6 +112,7 @@ public class PlayerInstance(PlayerGameData data) Uid = Data.Uid; Data.LastActiveTime = Extensions.GetUnixSec(); InventoryManager = new InventoryManager(this); + LineupManager = new LineupManager(this); CharacterManager = new CharacterManager(this); await Task.CompletedTask; @@ -162,18 +172,8 @@ public class PlayerInstance(PlayerGameData data) Name = Data.Name, Level = Data.Level, Sex = Data.Gender, - Vigor = 240, - Solutions = - { - new Lineup // TODO Lineup Manager - { - Index = 1, - Name = "Default", - Member1 = 1, - Member2 = 2, - Member3 = 3 - } - }, + Vigor = Data.Vigor, + Solutions = { LineupManager.LineupData.LineupInfo.Values.Select(x => x.ToProto()) }, }; foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto()); diff --git a/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs b/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs index beff313..f2f44d7 100644 --- a/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs +++ b/GameServer/Server/CallGS/Handlers/Lineup/Lineup_Update.cs @@ -1,10 +1,42 @@ -namespace MikuSB.GameServer.Server.CallGS.Handlers.Lineup; +using MikuSB.Proto; +using System.Text.Json; +using System.Text.Json.Serialization; + +namespace MikuSB.GameServer.Server.CallGS.Handlers.Lineup; [CallGSApi("Lineup_Update")] public class Lineup_Update : ICallGSHandler { public async Task Handle(Connection connection, string param, ushort seqNo) { + var req = JsonSerializer.Deserialize(param); + if (req == null) + { + await CallGSRouter.SendScript(connection, "UpdateLineup", "{}"); + return; + } + + var formation = await connection.Player!.LineupManager.UpdateLineup(req.Index,req.Member1,req.Member2,req.Member3); + if (formation == null) + { + await CallGSRouter.SendScript(connection, "UpdateLineup", "{}"); + return; + } + + var rsp = new NtfSyncLineup + { + Lineup = formation.ToProto() + }; + await connection.SendPacket(CmdIds.NtfSyncLineup, rsp); await CallGSRouter.SendScript(connection, "UpdateLineup", "{}"); } } + +internal sealed class LineupUpdateParam +{ + [JsonPropertyName("name")] public string Name { get; set; } = ""; + [JsonPropertyName("index")] public int Index { get; set; } + [JsonPropertyName("member1")] public uint Member1 { get; set; } + [JsonPropertyName("member2")] public uint Member2 { get; set; } + [JsonPropertyName("member3")] public uint Member3 { get; set; } +} \ No newline at end of file