add lineup manager

This commit is contained in:
Naruse
2026-04-26 22:31:18 +08:00
parent 3f387da322
commit 9c67e36ca3
5 changed files with 107 additions and 14 deletions

View File

@@ -0,0 +1,31 @@
using SqlSugar;
namespace MikuSB.Database.Lineup;
[SugarTable("lineup_data")]
public class LineupData : BaseDatabaseDataHelper
{
[SugarColumn(IsJson = true)] public Dictionary<int, LineupDataInfo> 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;
}
}

View File

@@ -14,6 +14,7 @@ public class PlayerGameData : BaseDatabaseDataHelper
public long RegisterTime { get; set; } = Extensions.GetUnixSec(); public long RegisterTime { get; set; } = Extensions.GetUnixSec();
public long LastActiveTime { get; set; } public long LastActiveTime { get; set; }
public Sex Gender { get; set; } = Sex.Female; public Sex Gender { get; set; } = Sex.Female;
public uint Vigor { get; set; } = 240;
[SugarColumn(IsJson = true)] public List<PlayerAttr> Attrs { get; set; } = []; [SugarColumn(IsJson = true)] public List<PlayerAttr> Attrs { get; set; } = [];
[SugarColumn(IsJson = true)] public List<ulong> ShowItems { get; set; } = []; [SugarColumn(IsJson = true)] public List<ulong> ShowItems { get; set; } = [];

View File

@@ -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<LineupData>(player.Uid);
public async ValueTask<LineupDataInfo?> 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;
}
}

View File

@@ -6,7 +6,7 @@ using MikuSB.Enums.Item;
using MikuSB.GameServer.Game.Character; using MikuSB.GameServer.Game.Character;
using MikuSB.GameServer.Game.Inventory; using MikuSB.GameServer.Game.Inventory;
using MikuSB.GameServer.Server; using MikuSB.GameServer.Server;
using MikuSB.Proto; using MikuSB.GameServer.Game.Lineup;
using MikuSB.TcpSharp; using MikuSB.TcpSharp;
using MikuSB.Util.Extensions; using MikuSB.Util.Extensions;
@@ -29,6 +29,7 @@ public class PlayerInstance(PlayerGameData data)
public PlayerGameData Data { get; set; } = data; public PlayerGameData Data { get; set; } = data;
public CharacterManager CharacterManager { get; set; } = null!; public CharacterManager CharacterManager { get; set; } = null!;
public InventoryManager InventoryManager { get; set; } = null!; public InventoryManager InventoryManager { get; set; } = null!;
public LineupManager LineupManager { get; set; } = null!;
#endregion #endregion
@@ -65,6 +66,14 @@ public class PlayerInstance(PlayerGameData data)
await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level); 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 bootstrapAttrs = BuildLobbyBootstrapAttrs();
var existingAttrs = Data.Attrs var existingAttrs = Data.Attrs
.ToDictionary(x => (x.Gid, x.Sid)); .ToDictionary(x => (x.Gid, x.Sid));
@@ -103,6 +112,7 @@ public class PlayerInstance(PlayerGameData data)
Uid = Data.Uid; Uid = Data.Uid;
Data.LastActiveTime = Extensions.GetUnixSec(); Data.LastActiveTime = Extensions.GetUnixSec();
InventoryManager = new InventoryManager(this); InventoryManager = new InventoryManager(this);
LineupManager = new LineupManager(this);
CharacterManager = new CharacterManager(this); CharacterManager = new CharacterManager(this);
await Task.CompletedTask; await Task.CompletedTask;
@@ -162,18 +172,8 @@ public class PlayerInstance(PlayerGameData data)
Name = Data.Name, Name = Data.Name,
Level = Data.Level, Level = Data.Level,
Sex = Data.Gender, Sex = Data.Gender,
Vigor = 240, Vigor = Data.Vigor,
Solutions = Solutions = { LineupManager.LineupData.LineupInfo.Values.Select(x => x.ToProto()) },
{
new Lineup // TODO Lineup Manager
{
Index = 1,
Name = "Default",
Member1 = 1,
Member2 = 2,
Member3 = 3
}
},
}; };
foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto()); foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto());

View File

@@ -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")] [CallGSApi("Lineup_Update")]
public class Lineup_Update : ICallGSHandler public class Lineup_Update : ICallGSHandler
{ {
public async Task Handle(Connection connection, string param, ushort seqNo) public async Task Handle(Connection connection, string param, ushort seqNo)
{ {
var req = JsonSerializer.Deserialize<LineupUpdateParam>(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", "{}"); 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; }
}