Compare commits

...

1 Commits

Author SHA1 Message Date
Kei-Luna
bdb4ee3d51 Implement saving settings 2026-05-09 20:03:28 +09:00
11 changed files with 110 additions and 10 deletions

View File

@@ -1,4 +1,4 @@
using Google.Protobuf;
using Google.Protobuf;
using MikuSB.Data;
using MikuSB.Database;
using MikuSB.Database.Account;
@@ -230,6 +230,11 @@ public class PlayerInstance(PlayerGameData data)
proto.Attrs[ToShiftedAttrKey(gid, sid)] = val;
}
foreach (var x in Data.StrAttrs)
{
proto.StrAttrs[ToShiftedAttrKey(x.Gid, x.Sid)] = x.Val;
}
proto.ShowItems.AddRange(Data.ShowItems);
return proto;
@@ -251,6 +256,22 @@ public class PlayerInstance(PlayerGameData data)
Data.ShowItems[index - 1] = itemId;
}
public void SetStrAttr(uint gid, uint sid, string value)
{
var attr = Data.StrAttrs.FirstOrDefault(x => x.Gid == gid && x.Sid == sid);
if (attr == null)
{
attr = new PlayerStrAttr
{
Gid = gid,
Sid = sid
};
Data.StrAttrs.Add(attr);
}
attr.Val = value;
}
public uint ToPackedAttrKey(uint gid, uint sid)
{
if (gid == 0)

View File

@@ -1,3 +1,4 @@
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
@@ -22,6 +23,7 @@ public class PlayerSetting_ChangeShowCard : ICallGSHandler
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_GIRL, card.Guid);
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}", sync);

View File

@@ -1,4 +1,5 @@
using MikuSB.Enums.Player;
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -35,7 +36,7 @@ public class PlayerSetting_SetProfileFace : ICallGSHandler
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_FRAME, item.UniqueId);
}
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetProfileFace", "null", sync);

View File

@@ -1,4 +1,5 @@
using MikuSB.Enums.Player;
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -30,6 +31,8 @@ public class PlayerSetting_SetShowBadge : ICallGSHandler
player.SetShowItem((int)slots[i], uniqueId);
}
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowBadge", "null", sync);

View File

@@ -1,4 +1,5 @@
using MikuSB.Enums.Player;
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -23,6 +24,8 @@ public class PlayerSetting_SetShowBubble : ICallGSHandler
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_BUBBLE, item.UniqueId);
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowBubble", "null", sync);

View File

@@ -1,4 +1,5 @@
using MikuSB.Enums.Player;
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -23,6 +24,8 @@ public class PlayerSetting_SetShowCover : ICallGSHandler
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_COVER, item.UniqueId);
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowCover", "null", sync);

View File

@@ -1,4 +1,5 @@
using MikuSB.Enums.Player;
using MikuSB.Database;
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
@@ -23,6 +24,8 @@ public class PlayerSetting_SetShowNameCard : ICallGSHandler
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_NAMECARD, item.UniqueId);
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowNameCard", "null", sync);

View File

@@ -0,0 +1,39 @@
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("SettingChange")]
public class SettingChange : ICallGSHandler
{
private const uint PlayerSettingGid = 44;
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var changes = JsonSerializer.Deserialize<List<SettingChangeParam>>(param) ?? [];
var player = connection.Player!;
var sync = new NtfSyncPlayer();
foreach (var change in changes)
{
var value = player.Data.StrAttrs
.FirstOrDefault(x => x.Gid == PlayerSettingGid && x.Sid == change.Id)?
.Val;
if (value == null)
continue;
sync.CustomStr[player.ToShiftedAttrKey(PlayerSettingGid, change.Id)] = value;
}
if (sync.CustomStr.Count > 0)
await connection.SendPacket(CmdIds.NtfSyncAttr, sync);
}
}
internal sealed class SettingChangeParam
{
[JsonPropertyName("id")]
public uint Id { get; set; }
}

View File

@@ -1,4 +1,5 @@
using MikuSB.Database.Player;
using MikuSB.Database;
using MikuSB.Database.Player;
using MikuSB.Proto;
namespace MikuSB.GameServer.Server.Packet.Recv.Login;
@@ -12,7 +13,11 @@ public class HandlerNtfSetAttr : Handler
var player = connection.Player!;
var attr = player.Data.Attrs
.FirstOrDefault(x => x.Gid == req.Gid && x.Sid == req.Sid);
if (attr != null) attr.Val = req.Val;
if (attr != null)
{
attr.Val = req.Val;
}
else
{
player.Data.Attrs.Add(new PlayerAttr
@@ -22,6 +27,7 @@ public class HandlerNtfSetAttr : Handler
Val = req.Val
});
}
DatabaseHelper.SaveDatabaseType(player.Data);
await player.OnHeartBeat();
}
}

View File

@@ -0,0 +1,19 @@
using MikuSB.Database;
using MikuSB.Proto;
namespace MikuSB.GameServer.Server.Packet.Recv.Login;
[Opcode(CmdIds.NtfSetStrAttr)]
public class HandlerNtfSetStrAttr : Handler
{
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
{
var req = NtfSetStrAttr.Parser.ParseFrom(data);
var player = connection.Player!;
player.SetStrAttr(req.Gid, req.Sid, req.Val);
DatabaseHelper.SaveDatabaseType(player.Data);
await player.OnHeartBeat();
}
}

View File

@@ -1 +1 @@
v=2.0
v=2.1