Compare commits

...

3 Commits

Author SHA1 Message Date
Naruse
9b8fa5d7c8 add profile item 2026-04-29 11:02:11 +08:00
Naruse
1969c1ec89 use enum for item slots 2026-04-29 09:46:21 +08:00
Naruse
e32319aa50 fix black screen after clicking love icon 2026-04-29 09:22:35 +08:00
20 changed files with 352 additions and 46 deletions

View File

@@ -0,0 +1,22 @@
namespace MikuSB.Data.Excel;
[ResourceEntity("profile.json")]
public class ProfileExcel : ExcelResource
{
public uint Genre { get; set; }
public uint Detail { get; set; }
public uint Particular { get; set; }
public uint Level { get; set; }
public string I18n { get; set; } = "";
public string LuaType { get; set; } = "";
public override uint GetId()
{
return (uint)I18n.GetHashCode();
}
public override void Loaded()
{
GameData.ProfileData.Add(GetId(), this);
}
}

View File

@@ -22,7 +22,7 @@ public static class GameData
public static List<SupportCardExcel> SupportCardData { get; private set; } = []; public static List<SupportCardExcel> SupportCardData { get; private set; } = [];
public static Dictionary<uint, WeaponSkinExcel> WeaponSkinData { get; private set; } = []; public static Dictionary<uint, WeaponSkinExcel> WeaponSkinData { get; private set; } = [];
public static Dictionary<uint, DailyLevelExcel> DailyLevelData { get; private set; } = []; public static Dictionary<uint, DailyLevelExcel> DailyLevelData { get; private set; } = [];
public static Dictionary<uint, ProfileExcel> ProfileData { get; private set; } = [];
} }
public static class GameResourceTemplateId public static class GameResourceTemplateId

View File

@@ -29,8 +29,7 @@ public class CharacterInfo
[SugarColumn(IsJson = true)] public List<uint> UnlockedSkin { get; set; } = []; [SugarColumn(IsJson = true)] public List<uint> UnlockedSkin { get; set; } = [];
[SugarColumn(IsJson = true)] public List<uint> Spines { get; set; } = []; [SugarColumn(IsJson = true)] public List<uint> Spines { get; set; } = [];
[SugarColumn(IsJson = true)] public List<uint> Affixs { get; set; } = []; [SugarColumn(IsJson = true)] public List<uint> Affixs { get; set; } = [];
// Key = EqSlot (= support card Detail), Value = support card UniqueId [SugarColumn(IsJson = true)] public Dictionary<uint, uint> SupportSlots { get; set; } = []; // Key = EqSlot (= support card Detail), Value = support card UniqueId
[SugarColumn(IsJson = true)] public Dictionary<uint, uint> SupportSlots { get; set; } = [];
public long Timestamp { get; set; } public long Timestamp { get; set; }
public uint Count { get; set; } = 1; public uint Count { get; set; } = 1;
@@ -56,9 +55,9 @@ public class CharacterInfo
proto.Enhance.Spines.AddRange(Spines.Select(x => (ulong)x)); proto.Enhance.Spines.AddRange(Spines.Select(x => (ulong)x));
proto.Enhance.Affixs.AddRange(Affixs); proto.Enhance.Affixs.AddRange(Affixs);
proto.Slots[4] = WeaponUniqueId; proto.Slots[(uint)ItemCardSlotTypeEnum.SLOT_WEAPON] = WeaponUniqueId;
proto.Slots[5] = SkinId; proto.Slots[(uint)ItemCardSlotTypeEnum.SLOT_SKIN] = SkinId;
proto.Slots[6] = WeaponSkinId; proto.Slots[(uint)ItemCardSlotTypeEnum.SLOT_WEAPON_SKIN] = WeaponSkinId;
foreach (var (slot, uid) in SupportSlots) foreach (var (slot, uid) in SupportSlots)
proto.Slots[slot] = uid; proto.Slots[slot] = uid;

View File

@@ -93,7 +93,7 @@ public class GameSkinInfo : BaseGameItemInfo
Count = ItemCount, Count = ItemCount,
Flag = (uint)Flag, Flag = (uint)Flag,
}; };
proto.Slots[11] = Math.Min(SkinType, 1); proto.Slots[(uint)ItemSkinSlotTypeEnum.SLOT_CARD_SKIL_TYPE] = Math.Min(SkinType, 1);
return proto; return proto;
} }
} }
@@ -116,7 +116,7 @@ public class GameSupportCardInfo : BaseGameItemInfo
Exp = Exp Exp = Exp
} }
}; };
proto.Slots[1] = AffixId; proto.Slots[(uint)ItemSupportCardSlotTypeEnum.SLOT_AFFIXINDEX] = AffixId;
return proto; return proto;
} }
} }

View File

@@ -1,13 +0,0 @@
namespace MikuSB.Enums.Item;
public enum ItemFlagEnum
{
FLAG_USE = 1,// 使用中
FLAG_LOCK = 2,// 锁定中
FLAG_READED = 4,// 道具已查看
FLAG_LEAVE = 8,// 角色大招后离场
FLAG_WEAPON_DEFAULT = 16,// 武器显示原始样式
FLAG_WEAPON_AUDIO = 32,// 武器消音器音效
FLAG_ROLE_LIKE = 64,// 心选角色
}

View File

@@ -26,3 +26,55 @@ public enum ItemTypeEnum
TYPE_AR = 24, //AR道具 TYPE_AR = 24, //AR道具
TYPE_CALL = 25, //电话陪伴道具 TYPE_CALL = 25, //电话陪伴道具
} }
public enum ItemCardSlotTypeEnum
{
SLOT_SUPPORTERCARD1 = 1, // 后勤卡
SLOT_SUPPORTERCARD2 = 2, // 后勤卡
SLOT_SUPPORTERCARD3 = 3, // 后勤卡
SLOT_WEAPON = 4, // 武器
SLOT_SKIN = 5, // 时装
SLOT_WEAPON_SKIN = 6, // 武器时装
SLOT_SUPPORTERINDEX = 7, // 当前使用的后勤组
SLOT_SUPPORTERCARD4 = 8, // 后勤卡
SLOT_SUPPORTERCARD5 = 9, // 后勤卡
SLOT_SUPPORTERCARD6 = 10, // 后勤卡
SLOT_SUPPORTERCARD7 = 11, // 后勤卡
SLOT_SUPPORTERCARD8 = 12, // 后勤卡
SLOT_SUPPORTERCARD9 = 13, // 后勤卡
}
public enum ItemSkinPartSlotTypeEnum
{
SLOT_SkinPartSlot1 = 1,
SLOT_SkinPartSlot2 = 2,
SLOT_SkinPartSlot3 = 3,
SLOT_SkinPartSlot4 = 4,
SLOT_SkinPartSlot5 = 5,
SLOT_SkinPartSlot6 = 6,
SLOT_SkinPartSlot7 = 7,
SLOT_SkinPartSlot8 = 8,
SLOT_SkinPartSlot9 = 9,
SLOT_SkinPartSlot10 = 10,
}
public enum ItemSkinSlotTypeEnum
{
SLOT_CARD_SKIL_TYPE = 11
}
public enum ItemSupportCardSlotTypeEnum
{
SLOT_AFFIXINDEX = 1 // 可洗练的初始词缀索引
}
public enum ItemFlagEnum
{
FLAG_USE = 1, // 使用中
FLAG_LOCK = 2, // 锁定中
FLAG_READED = 4, // 道具已查看
FLAG_LEAVE = 8, // 角色大招后离场
FLAG_WEAPON_DEFAULT = 16, // 武器显示原始样式
FLAG_WEAPON_AUDIO = 32, // 武器消音器音效
FLAG_ROLE_LIKE = 64, // 心选角色
}

View File

@@ -0,0 +1,24 @@
namespace MikuSB.Enums.Player;
public enum ProfileShowItemTypeEnum
{
SHOWITEM_CARD1 = 1, //第1个展示卡
SHOWITEM_CARD2 = 2, //第2个展示卡
SHOWITEM_CARD3 = 3, //第3个展示卡
SHOWITEM_GIRL = 4, //看板娘
SHOWITEM_FACE = 5, //头像
SHOWITEM_FRAME = 6, //头像框
SHOWITEM_CARD4 = 7, //第4个展示卡
SHOWITEM_CARD5 = 8, //第5个展示卡
SHOWITEM_SKIN1 = 9, //第1个展示皮肤
SHOWITEM_SKIN2 = 10, //第2个展示皮肤
SHOWITEM_SKIN3 = 11, //第3个展示皮肤
SHOWITEM_SKIN4 = 12, //第4个展示皮肤
SHOWITEM_SKIN5 = 13, //第5个展示皮肤
SHOWITEM_BADGE1 = 14, //第一个展示勋章
SHOWITEM_BADGE2 = 15, //第二个展示勋章
SHOWITEM_BADGE3 = 16, //第三个展示勋章
SHOWITEM_COVER = 17, //展示封面
SHOWITEM_NAMECARD = 18, //展示名片
SHOWITEM_BUBBLE = 19, //聊天气泡
}

View File

@@ -35,6 +35,7 @@ public class ServerTextCHS
/// </summary> /// </summary>
public class WordTextCHS public class WordTextCHS
{ {
public string Profile => "个人资料";
public string WeaponSkin => "武器皮肤"; public string WeaponSkin => "武器皮肤";
public string SupportCard => "支援卡"; public string SupportCard => "支援卡";
public string Weapon => "武器"; public string Weapon => "武器";
@@ -240,7 +241,8 @@ public class GiveAllTextCHS
"注意:-1 表示全部"; "注意:-1 表示全部";
public string Usage => "用法:/giveall weapon <detail/-1> -p<特定> -l<等級>\n" + public string Usage => "用法:/giveall weapon <detail/-1> -p<特定> -l<等級>\n" +
"用法:/giveall weaponskin <detail/-1> -p<特定>\n" + "用法:/giveall weaponskin <detail/-1> -p<特定>\n" +
"用法:/giveall card <detail/-1> -p<特定> -l<等級>"; "用法:/giveall card <detail/-1> -p<特定> -l<等級>" +
"用法:/giveall profile <detail/-1> -g<类型> -p<特定> -l<等级>";
public string NotFound => "未找到 {0}"; public string NotFound => "未找到 {0}";
public string GiveAllItems => "已向玩家添加 {0} 个 {1}"; public string GiveAllItems => "已向玩家添加 {0} 个 {1}";
} }

View File

@@ -35,6 +35,7 @@ public class ServerTextCHT
/// </summary> /// </summary>
public class WordTextCHT public class WordTextCHT
{ {
public string Profile => "個人資料";
public string WeaponSkin => "武器外觀"; public string WeaponSkin => "武器外觀";
public string SupportCard => "支援卡"; public string SupportCard => "支援卡";
public string Weapon => "武器"; public string Weapon => "武器";
@@ -240,7 +241,8 @@ public class GiveAllTextCHT
"注意:-1 表示全部"; "注意:-1 表示全部";
public string Usage => "用法:/giveall weapon <detail/-1> -p<特定> -l<等級>\n" + public string Usage => "用法:/giveall weapon <detail/-1> -p<特定> -l<等級>\n" +
"用法:/giveall weaponskin <detail/-1> -p<特定>\n" + "用法:/giveall weaponskin <detail/-1> -p<特定>\n" +
"用法:/giveall card <detail/-1> -p<特定> -l<等級>"; "用法:/giveall card <detail/-1> -p<特定> -l<等級>" +
"用法:/giveall profile <detail/-1> -g<類型> -p<特定> -l<等級>";
public string NotFound => "未找到 {0}"; public string NotFound => "未找到 {0}";
public string GiveAllItems => "已向玩家添加 {0} 個 {1}"; public string GiveAllItems => "已向玩家添加 {0} 個 {1}";
} }

View File

@@ -35,6 +35,7 @@ public class ServerTextEN
/// </summary> /// </summary>
public class WordTextEN public class WordTextEN
{ {
public string Profile => "Profile";
public string WeaponSkin => "Weapon Skin"; public string WeaponSkin => "Weapon Skin";
public string Valk => "Valkyrie"; public string Valk => "Valkyrie";
public string Material => "Material"; public string Material => "Material";
@@ -206,7 +207,8 @@ public class GiveAllTextEN
"Note: -1 means all"; "Note: -1 means all";
public string Usage => "Usage: /giveall weapon <detail/-1> -p<particular> -l<level>\n" + public string Usage => "Usage: /giveall weapon <detail/-1> -p<particular> -l<level>\n" +
"Usage: /giveall weaponskin <detail/-1> -p<particular>\n" + "Usage: /giveall weaponskin <detail/-1> -p<particular>\n" +
"Usage: /giveall card <detail/-1> -p<particular> -l<level>"; "Usage: /giveall card <detail/-1> -p<particular> -l<level>" +
"Usage: /giveall profile <detail/-1> -g<genre> -p<particular> -l<level>";
public string NotFound => "{0} not found!"; public string NotFound => "{0} not found!";
public string GiveAllItems => "Added {0} {1} to player!"; public string GiveAllItems => "Added {0} {1} to player!";
} }

View File

@@ -96,7 +96,7 @@ public class CommandGiveAll : ICommands
foreach (var config in GameData.WeaponSkinData.Values) foreach (var config in GameData.WeaponSkinData.Values)
{ {
var weaponSkin = await player.InventoryManager! var weaponSkin = await player.InventoryManager!
.AddWeaponSkinItem((ItemTypeEnum)config.Genre, config.Detail, config.Particular, 1, false); .AddWeaponSkinItem((ItemTypeEnum)config.Genre, config.Detail, config.Particular, config.Level, false);
if (weaponSkin != null) weaponSkins.Add(weaponSkin); if (weaponSkin != null) weaponSkins.Add(weaponSkin);
} }
} }
@@ -114,4 +114,40 @@ public class CommandGiveAll : ICommands
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems", await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.WeaponSkin"), weaponSkins.Count.ToString())); I18NManager.Translate("Word.WeaponSkin"), weaponSkins.Count.ToString()));
} }
[CommandMethod("profile")]
public async ValueTask GiveAllProfile(CommandArg arg)
{
if (!await arg.CheckOnlineTarget()) return;
if (await arg.GetOption('p') is not int particular) return;
if (await arg.GetOption('l') is not int level) return;
if (await arg.GetOption('g') is not int genre) return;
var detail = arg.GetInt(0);
var player = arg.Target!.Player!;
List<BaseGameItemInfo> profileItems = [];
if (detail == -1)
{
// add all
foreach (var config in GameData.ProfileData.Values)
{
var profile = await player.InventoryManager!
.AddProfileItem((ItemTypeEnum)config.Genre, config.Detail, config.Particular, config.Level, false);
if (profile != null) profileItems.Add(profile);
}
}
else
{
var profile = await player.InventoryManager!.AddProfileItem((ItemTypeEnum)genre, (uint)detail, (uint)particular, (uint)level, false);
if (profile == null)
{
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.NotFound", I18NManager.Translate("Word.Profile")));
return;
}
profileItems.Add(profile);
}
if (profileItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(profileItems));
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.Profile"), profileItems.Count.ToString()));
}
} }

View File

@@ -25,7 +25,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
UniqueId = InventoryData.NextUniqueUid++, UniqueId = InventoryData.NextUniqueUid++,
Level = weaponLevel, Level = weaponLevel,
Break = GetWeaponBreak(weaponLevel), Break = GetWeaponBreak(weaponLevel),
ItemType = ItemTypeEnum.TYPE_WEAPON, ItemType = genre,
ItemCount = 1 ItemCount = 1
}; };
InventoryData.Weapons[weaponInfo.UniqueId] = weaponInfo; InventoryData.Weapons[weaponInfo.UniqueId] = weaponInfo;
@@ -67,13 +67,13 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
if (genre != ItemTypeEnum.TYPE_CARD_SKIN) return null; if (genre != ItemTypeEnum.TYPE_CARD_SKIN) return null;
var skinData = GameData.CardSkinData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level); var skinData = GameData.CardSkinData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
if (skinData == null) return null; if (skinData == null) return null;
var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level); var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level);
if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null;
var skinInfo = new GameSkinInfo var skinInfo = new GameSkinInfo
{ {
TemplateId = templateId, TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++, UniqueId = InventoryData.NextUniqueUid++,
ItemType = ItemTypeEnum.TYPE_CARD_SKIN, ItemType = genre,
ItemCount = 1 ItemCount = 1
}; };
InventoryData.Skins[skinInfo.UniqueId] = skinInfo; InventoryData.Skins[skinInfo.UniqueId] = skinInfo;
@@ -111,7 +111,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
{ {
TemplateId = templateId, TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++, UniqueId = InventoryData.NextUniqueUid++,
ItemType = ItemTypeEnum.TYPE_AR, ItemType = genre,
ItemCount = 1 ItemCount = 1
}; };
InventoryData.Items[arInfo.UniqueId] = arInfo; InventoryData.Items[arInfo.UniqueId] = arInfo;
@@ -171,7 +171,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
{ {
TemplateId = templateId, TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++, UniqueId = InventoryData.NextUniqueUid++,
ItemType = ItemTypeEnum.TYPE_MANIFESTATION, ItemType = genre,
ItemCount = 1 ItemCount = 1
}; };
InventoryData.Items[manifestInfo.UniqueId] = manifestInfo; InventoryData.Items[manifestInfo.UniqueId] = manifestInfo;
@@ -240,7 +240,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
{ {
TemplateId = templateId, TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++, UniqueId = InventoryData.NextUniqueUid++,
ItemType = ItemTypeEnum.TYPE_WEAPON_SKIN, ItemType = genre,
ItemCount = 1 ItemCount = 1
}; };
InventoryData.Items[skinInfo.UniqueId] = skinInfo; InventoryData.Items[skinInfo.UniqueId] = skinInfo;
@@ -249,4 +249,25 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
return skinInfo; return skinInfo;
} }
public async ValueTask<BaseGameItemInfo?> AddProfileItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true)
{
if (genre < ItemTypeEnum.TYPE_PROFILE || genre > ItemTypeEnum.TYPE_ANALYST) return null;
var profileData = GameData.ProfileData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
if (profileData == null) return null;
var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level);
if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null;
var profileInfo = new BaseGameItemInfo
{
TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++,
ItemType = genre,
ItemCount = 1
};
InventoryData.Items[profileInfo.UniqueId] = profileInfo;
if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([profileInfo]));
return profileInfo;
}
} }

View File

@@ -11,7 +11,7 @@ public class Daily_SetSelectSuit : ICallGSHandler
var req = JsonSerializer.Deserialize<GirlWeaponSkinParam>(param); var req = JsonSerializer.Deserialize<GirlWeaponSkinParam>(param);
if (req == null) if (req == null)
{ {
await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{}"); await CallGSRouter.SendScript(connection, "Daily_SetSelectSuit", "{}");
return; return;
} }
var rsp = $"{{\"SuitId\":{req.Suit}}}"; var rsp = $"{{\"SuitId\":{req.Suit}}}";

View File

@@ -12,11 +12,19 @@ public class EnterGirlRoom : ICallGSHandler
var req = JsonSerializer.Deserialize<EnterGirlRoomParam>(param); var req = JsonSerializer.Deserialize<EnterGirlRoomParam>(param);
var response = new JsonObject var response = new JsonObject
{ {
["nCardId"] = req?.CardId ?? 1, ["nCardId"] = 0,
["nSkinId"] = req?.SkinId ?? 0, ["nSkinId"] = 0,
["bOpen"] = true ["bOpen"] = false
}; };
if (req == null)
{
await CallGSRouter.SendScript(connection, "EnterGirlRoom", response.ToJsonString());
return;
}
response["nCardId"] = req.CardId;
response["nSkinId"] = req.SkinId;
response["bOpen"] = true;
await CallGSRouter.SendScript(connection, "EnterGirlRoom", response.ToJsonString()); await CallGSRouter.SendScript(connection, "EnterGirlRoom", response.ToJsonString());
} }
} }
@@ -26,6 +34,6 @@ internal sealed class EnterGirlRoomParam
[JsonPropertyName("nSkinId")] [JsonPropertyName("nSkinId")]
public int SkinId { get; set; } public int SkinId { get; set; }
[JsonPropertyName("nCardID")] [JsonPropertyName("nCardId")]
public uint CardId { get; set; } public uint CardId { get; set; }
} }

View File

@@ -13,7 +13,7 @@ public class GirlWeaponSkin_Change : ICallGSHandler
var req = JsonSerializer.Deserialize<GirlWeaponSkinParam>(param); var req = JsonSerializer.Deserialize<GirlWeaponSkinParam>(param);
if (req == null) if (req == null)
{ {
await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{}"); await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{\"err\":\"error.BadParam\"}");
return; return;
} }
@@ -33,7 +33,7 @@ public class GirlWeaponSkin_Change : ICallGSHandler
Items = { cardData.ToProto() } Items = { cardData.ToProto() }
}; };
await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{}", sync); await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "null", sync);
} }
} }

View File

@@ -1,4 +1,4 @@
using MikuSB.Database; using MikuSB.Enums.Player;
using MikuSB.Proto; using MikuSB.Proto;
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
@@ -8,8 +8,6 @@ namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("PlayerSetting_ChangeShowCard")] [CallGSApi("PlayerSetting_ChangeShowCard")]
public class PlayerSetting_ChangeShowCard : ICallGSHandler public class PlayerSetting_ChangeShowCard : ICallGSHandler
{ {
private const int ShowItemGirlIndex = 4;
public async Task Handle(Connection connection, string param, ushort seqNo) public async Task Handle(Connection connection, string param, ushort seqNo)
{ {
var player = connection.Player!; var player = connection.Player!;
@@ -23,13 +21,9 @@ public class PlayerSetting_ChangeShowCard : ICallGSHandler
await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}"); await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}");
return; return;
} }
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_GIRL, card.Guid);
player.SetShowItem(ShowItemGirlIndex, card.Guid);
DatabaseHelper.SaveDatabaseType(player.Data);
var sync = new NtfSyncPlayer(); var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems); sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}", sync); await CallGSRouter.SendScript(connection, "PlayerSetting_ChangeShowCard", "{}", sync);
} }
} }

View File

@@ -0,0 +1,49 @@
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("PlayerSetting_SetProfileFace")]
public class PlayerSetting_SetProfileFace : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var player = connection.Player!;
var req = JsonSerializer.Deserialize<SetProfileFaceParam>(param);
if (req == null)
return;
if (req.HeadItemId > 0)
{
var item = player.InventoryManager.GetNormalItem(req.HeadItemId);
if (item == null)
{
await CallGSRouter.SendScript(connection, "PlayerSetting_SetProfileFace", "{\"err\":\"error.BadParam\"}");
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_FACE, item.UniqueId);
}
if (req.FrameItemId > 0)
{
var item = player.InventoryManager.GetNormalItem(req.FrameItemId);
if (item == null)
{
await CallGSRouter.SendScript(connection, "PlayerSetting_SetProfileFace", "{\"err\":\"error.BadParam\"}");
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_FRAME, item.UniqueId);
}
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetProfileFace", "null", sync);
}
}
internal sealed class SetProfileFaceParam
{
[JsonPropertyName("nHeadItemID")] public uint HeadItemId { get; set; }
[JsonPropertyName("nFrameItemID")] public uint FrameItemId { get; set; }
}

View File

@@ -0,0 +1,36 @@
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("PlayerSetting_SetShowBubble")]
public class PlayerSetting_SetShowBubble : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var player = connection.Player!;
var req = JsonSerializer.Deserialize<SetShowBubbleParam>(param);
if (req == null)
return;
var item = player.InventoryManager.GetNormalItem(req.Id);
if (item == null)
{
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowBubble", "{\"err\":\"error.BadParam\"}");
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_BUBBLE, item.UniqueId);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowBubble", "null", sync);
}
}
internal sealed class SetShowBubbleParam
{
[JsonPropertyName("nID")]
public uint Id { get; set; }
}

View File

@@ -0,0 +1,36 @@
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("PlayerSetting_SetShowCover")]
public class PlayerSetting_SetShowCover : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var player = connection.Player!;
var req = JsonSerializer.Deserialize<SetShowCoverParam>(param);
if (req == null)
return;
var item = player.InventoryManager.GetNormalItem(req.Id);
if (item == null)
{
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowCover", "{\"err\":\"error.BadParam\"}");
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_COVER, item.UniqueId);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowCover", "null", sync);
}
}
internal sealed class SetShowCoverParam
{
[JsonPropertyName("nID")]
public uint Id { get; set; }
}

View File

@@ -0,0 +1,36 @@
using MikuSB.Enums.Player;
using MikuSB.Proto;
using System.Text.Json;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.Misc;
[CallGSApi("PlayerSetting_SetShowNameCard")]
public class PlayerSetting_SetShowNameCard : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
var player = connection.Player!;
var req = JsonSerializer.Deserialize<SetShowNameCardParam>(param);
if (req == null)
return;
var item = player.InventoryManager.GetNormalItem(req.Id);
if (item == null)
{
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowNameCard", "{\"err\":\"error.BadParam\"}");
return;
}
player.SetShowItem((int)ProfileShowItemTypeEnum.SHOWITEM_NAMECARD, item.UniqueId);
var sync = new NtfSyncPlayer();
sync.ShowItems.AddRange(player.Data.ShowItems);
await CallGSRouter.SendScript(connection, "PlayerSetting_SetShowNameCard", "null", sync);
}
}
internal sealed class SetShowNameCardParam
{
[JsonPropertyName("nID")]
public uint Id { get; set; }
}