add interactable scene but cant switch yet

This commit is contained in:
Naruse
2026-04-26 16:21:34 +08:00
parent f3d958a3ab
commit c9fad34a61
7 changed files with 126 additions and 3 deletions

View File

@@ -0,0 +1,21 @@
namespace MikuSB.Data.Excel;
[ResourceEntity("ar_item.json")]
public class ArItemExcel : 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 override uint GetId()
{
return (Genre << 24) | (Detail << 16) | (Particular << 8) | Level;
}
public override void Loaded()
{
GameData.ArItemData.Add(GetId(), this);
}
}

View File

@@ -0,0 +1,24 @@
using Newtonsoft.Json;
namespace MikuSB.Data.Excel;
[ResourceEntity("manifestation.json")]
public class ManifestationExcel : 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; } = "";
[JsonProperty("profile")]public List<int> Profile { get; set; } = [];
public override uint GetId()
{
return (Genre << 24) | (Detail << 16) | (Particular << 8) | Level;
}
public override void Loaded()
{
GameData.ManifestationData.Add(GetId(), this);
}
}

View File

@@ -12,6 +12,8 @@ public static class GameData
public static Dictionary<int, BreakLevelLimitExcel> BreakLevelLimitData { get; private set; } = []; public static Dictionary<int, BreakLevelLimitExcel> BreakLevelLimitData { get; private set; } = [];
public static Dictionary<int, RecycleExcel> RecycleData { get; private set; } = []; public static Dictionary<int, RecycleExcel> RecycleData { get; private set; } = [];
public static Dictionary<uint, ChapterLevelExcel> ChapterLevelData { get; private set; } = []; public static Dictionary<uint, ChapterLevelExcel> ChapterLevelData { get; private set; } = [];
public static Dictionary<uint, ArItemExcel> ArItemData { get; private set; } = [];
public static Dictionary<uint, ManifestationExcel> ManifestationData { get; private set; } = [];
} }
public static class GameResourceTemplateId public static class GameResourceTemplateId

View File

@@ -19,7 +19,7 @@ public class InventoryData : BaseDatabaseDataHelper
public Dictionary<uint, GameSkinInfo> Skins { get; set; } = []; // Key: UniqueId public Dictionary<uint, GameSkinInfo> Skins { get; set; } = []; // Key: UniqueId
} }
public abstract class BaseGameItemInfo public class BaseGameItemInfo
{ {
public uint UniqueId { get; set; } public uint UniqueId { get; set; }
public ulong TemplateId { get; set; } public ulong TemplateId { get; set; }

View File

@@ -13,7 +13,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
public async ValueTask<GameWeaponInfo?> AddWeaponItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1) public async ValueTask<GameWeaponInfo?> AddWeaponItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1)
{ {
if (genre != ItemTypeEnum.TYPE_WEAPON) return null; if (genre != ItemTypeEnum.TYPE_WEAPON) return null;
var weaponData = GameData.WeaponData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular); var weaponData = GameData.WeaponData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
if (weaponData == null) return null; if (weaponData == null) return null;
var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level); var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level);
@@ -50,7 +50,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
public async ValueTask<GameSkinInfo?> AddSkinItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1) public async ValueTask<GameSkinInfo?> AddSkinItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1)
{ {
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); 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);
@@ -82,4 +82,58 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level); var templateId = GameResourceTemplateId.FromGdpl((uint)genre,detail,particular,level);
return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId); return InventoryData.Skins.Values.FirstOrDefault(x => x.TemplateId == templateId);
} }
public async ValueTask<BaseGameItemInfo?> AddArItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1)
{
if (genre != ItemTypeEnum.TYPE_AR) return null;
var arData = GameData.ArItemData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
if (arData == null) return null;
var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level);
if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null;
var arInfo = new BaseGameItemInfo
{
TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++,
Flag = ItemFlagEnum.FLAG_READED,
ItemCount = 1
};
InventoryData.Items[arInfo.UniqueId] = arInfo;
return arInfo;
}
public async ValueTask<BaseGameItemInfo?> AddManifestationItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1)
{
if (genre != ItemTypeEnum.TYPE_MANIFESTATION) return null;
var manifestData = GameData.ManifestationData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
if (manifestData == null) return null;
var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level);
if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null;
var manifestInfo = new BaseGameItemInfo
{
TemplateId = templateId,
UniqueId = InventoryData.NextUniqueUid++,
Flag = ItemFlagEnum.FLAG_READED,
ItemCount = 1
};
InventoryData.Items[manifestInfo.UniqueId] = manifestInfo;
return manifestInfo;
}
public BaseGameItemInfo? GetNormalItem(uint uniqueId)
{
return InventoryData.Items.GetValueOrDefault(uniqueId);
}
public BaseGameItemInfo? GetNormalItemByTemplateId(ulong templateId)
{
return InventoryData.Items.Values.FirstOrDefault(x => x.TemplateId == templateId);
}
public BaseGameItemInfo? GetNormalItemGDPL(ItemTypeEnum genre, uint detail, uint particular, uint level)
{
var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level);
return InventoryData.Items.Values.FirstOrDefault(x => x.TemplateId == templateId);
}
} }

View File

@@ -52,6 +52,14 @@ public class PlayerInstance(PlayerGameData data)
{ {
await InventoryManager.AddWeaponItem((ItemTypeEnum)weapon.Genre, weapon.Detail, weapon.Particular, weapon.Level); await InventoryManager.AddWeaponItem((ItemTypeEnum)weapon.Genre, weapon.Detail, weapon.Particular, weapon.Level);
} }
foreach (var ar in GameData.ArItemData.Values)
{
await InventoryManager.AddArItem((ItemTypeEnum)ar.Genre, ar.Detail, ar.Particular, ar.Level);
}
foreach (var manifest in GameData.ManifestationData.Values)
{
await InventoryManager.AddManifestationItem((ItemTypeEnum)manifest.Genre, manifest.Detail, manifest.Particular, manifest.Level);
}
foreach (var card in GameData.CardData.Values) foreach (var card in GameData.CardData.Values)
{ {
await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level); await CharacterManager.AddCharacter((ItemTypeEnum)card.Genre, card.Detail, card.Particular, card.Level);
@@ -168,6 +176,7 @@ public class PlayerInstance(PlayerGameData data)
}, },
}; };
foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto());
foreach (var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.ToProto()); foreach (var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.ToProto());
foreach (var skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto()); foreach (var skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto());
foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto()); foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto());

View File

@@ -0,0 +1,13 @@
namespace MikuSB.GameServer.Server.CallGS.Handlers.Scene;
// Response:{sErr:true or false}
[CallGSApi("ChangeMainScene")]
public class ChangeMainScene : ICallGSHandler
{
public async Task Handle(Connection connection, string param, ushort seqNo)
{
string rsp = $"{{\"sErr\":false}}";
// TODO change scene with ExtraSync
await CallGSRouter.SendScript(connection, "ChangeMainScene", rsp);
}
}