mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 10:43:59 +00:00
Compare commits
1 Commits
233419eba3
...
v2.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6740b8ecf7 |
21
Common/Data/Excel/DormGiftExcel.cs
Normal file
21
Common/Data/Excel/DormGiftExcel.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
namespace MikuSB.Data.Excel;
|
||||||
|
|
||||||
|
[ResourceEntity("item/templates/dorm_gift.json")]
|
||||||
|
public class DormGiftExcel : 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.DormGiftData.Add(GetId(), this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -30,6 +30,7 @@ public static class GameData
|
|||||||
public static Dictionary<uint, CallItemExcel> CallItemData { get; private set; } = [];
|
public static Dictionary<uint, CallItemExcel> CallItemData { get; private set; } = [];
|
||||||
public static Dictionary<uint, WeaponPartsExcel> WeaponPartsData { get; private set; } = [];
|
public static Dictionary<uint, WeaponPartsExcel> WeaponPartsData { get; private set; } = [];
|
||||||
public static Dictionary<uint, GuideExcel> GuideData { get; private set; } = [];
|
public static Dictionary<uint, GuideExcel> GuideData { get; private set; } = [];
|
||||||
|
public static Dictionary<uint, DormGiftExcel> DormGiftData { get; private set; } = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GameResourceTemplateId
|
public static class GameResourceTemplateId
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class ServerTextCHS
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class WordTextCHS
|
public class WordTextCHS
|
||||||
{
|
{
|
||||||
|
public string Furniture => "家具";
|
||||||
public string Skin => "皮肤";
|
public string Skin => "皮肤";
|
||||||
public string WeaponPart => "武器部件";
|
public string WeaponPart => "武器部件";
|
||||||
public string CallItem => "召唤道具";
|
public string CallItem => "召唤道具";
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class ServerTextCHT
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class WordTextCHT
|
public class WordTextCHT
|
||||||
{
|
{
|
||||||
|
public string Furniture => "傢俱";
|
||||||
public string Skin => "皮膚";
|
public string Skin => "皮膚";
|
||||||
public string WeaponPart => "武器部件";
|
public string WeaponPart => "武器部件";
|
||||||
public string CallItem => "召喚道具";
|
public string CallItem => "召喚道具";
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ public class ServerTextEN
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class WordTextEN
|
public class WordTextEN
|
||||||
{
|
{
|
||||||
|
public string Furniture => "Furniture";
|
||||||
public string Skin => "Skin";
|
public string Skin => "Skin";
|
||||||
public string WeaponPart => "Weapon Part";
|
public string WeaponPart => "Weapon Part";
|
||||||
public string CallItem => "Call Item";
|
public string CallItem => "Call Item";
|
||||||
|
|||||||
@@ -294,4 +294,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.Skin"), skinItems.Count.ToString()));
|
I18NManager.Translate("Word.Skin"), skinItems.Count.ToString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[CommandMethod("furniture")]
|
||||||
|
public async ValueTask GiveAllHouseFurniture(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> furnitureItems = [];
|
||||||
|
if (detail == -1)
|
||||||
|
{
|
||||||
|
// add all
|
||||||
|
foreach (var config in GameData.DormGiftData.Values)
|
||||||
|
{
|
||||||
|
var furniture = await player.InventoryManager!
|
||||||
|
.AddHouseFurnitureItem((ItemTypeEnum)config.Genre, config.Detail, config.Particular, config.Level, false);
|
||||||
|
if (furniture != null) furnitureItems.Add(furniture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var furniture = await player.InventoryManager!.AddHouseFurnitureItem((ItemTypeEnum)genre, (uint)detail, (uint)particular, (uint)level, false);
|
||||||
|
if (furniture == null)
|
||||||
|
{
|
||||||
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.NotFound", I18NManager.Translate("Word.Furniture")));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
furnitureItems.Add(furniture);
|
||||||
|
}
|
||||||
|
if (furnitureItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(furnitureItems));
|
||||||
|
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
|
||||||
|
I18NManager.Translate("Word.Furniture"), furnitureItems.Count.ToString()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -333,4 +333,25 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
|||||||
|
|
||||||
return weaponPartInfo;
|
return weaponPartInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async ValueTask<BaseGameItemInfo?> AddHouseFurnitureItem(ItemTypeEnum genre, uint detail, uint particular, uint level = 1, bool sendPacket = true)
|
||||||
|
{
|
||||||
|
if (genre != ItemTypeEnum.TYPE_HOUSE) return null;
|
||||||
|
var houseFurnitureData = GameData.DormGiftData.Values.FirstOrDefault(x => x.Genre == (int)genre && x.Detail == detail && x.Particular == particular && x.Level == level);
|
||||||
|
if (houseFurnitureData == null) return null;
|
||||||
|
var templateId = GameResourceTemplateId.FromGdpl((uint)genre, detail, particular, level);
|
||||||
|
if (InventoryData.Items.Values.Any(x => x.TemplateId == templateId)) return null;
|
||||||
|
var furnitureInfo = new BaseGameItemInfo
|
||||||
|
{
|
||||||
|
TemplateId = templateId,
|
||||||
|
UniqueId = InventoryData.NextUniqueUid++,
|
||||||
|
ItemType = genre,
|
||||||
|
ItemCount = 1
|
||||||
|
};
|
||||||
|
InventoryData.Items[furnitureInfo.UniqueId] = furnitureInfo;
|
||||||
|
|
||||||
|
if (sendPacket) await Player.SendPacket(new PacketNtfCallScript([furnitureInfo]));
|
||||||
|
|
||||||
|
return furnitureInfo;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -288,9 +288,10 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
return (gid << 16) | sid;
|
return (gid << 16) | sid;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void BuildPlayerAttr()
|
public void BuildPlayerAttr(bool additional = false)
|
||||||
{
|
{
|
||||||
var bootstrapAttrs = BuildLobbyBootstrapAttrs();
|
var bootstrapAttrs = BuildLobbyBootstrapAttrs().ToList();
|
||||||
|
if (additional) bootstrapAttrs.AddRange(BuildGirlFurnitureAttrs());
|
||||||
var existingAttrs = Data.Attrs
|
var existingAttrs = Data.Attrs
|
||||||
.ToDictionary(x => (x.Gid, x.Sid));
|
.ToDictionary(x => (x.Gid, x.Sid));
|
||||||
var seenAttrs = new HashSet<(uint Gid, uint Sid)>();
|
var seenAttrs = new HashSet<(uint Gid, uint Sid)>();
|
||||||
@@ -320,6 +321,24 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildGirlFurnitureAttrs()
|
||||||
|
{
|
||||||
|
// Unlock some furniture slots for every girl
|
||||||
|
// Each furniture attr int stores 10 slots using 3 bits per slot
|
||||||
|
// Value below means slot 0..9 = 1
|
||||||
|
const uint furnitureUnlockedValue = 153391689;
|
||||||
|
|
||||||
|
for (uint girlId = 0; girlId <= 50; girlId++)
|
||||||
|
{
|
||||||
|
// FurnitureStart..FurnitureEnd = 10..19
|
||||||
|
for (uint offset = 10; offset <= 19; offset++)
|
||||||
|
{
|
||||||
|
uint sid = (girlId * 50) + offset;
|
||||||
|
yield return (101, sid, furnitureUnlockedValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildLobbyBootstrapAttrs()
|
private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildLobbyBootstrapAttrs()
|
||||||
{
|
{
|
||||||
// GuideLogic uses group 4. Value 999 is safely above every configured step count,
|
// GuideLogic uses group 4. Value 999 is safely above every configured step count,
|
||||||
@@ -375,7 +394,7 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
yield return (4, guide.ID, 999);
|
yield return (4, guide.ID, 999);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint favor = 1; favor <= 50; favor++)
|
for (uint favor = 0; favor <= 50; favor++)
|
||||||
yield return (101, favor * 50, 500);
|
yield return (101, favor * 50, 500);
|
||||||
|
|
||||||
// Main Scene 0 mean default scene
|
// Main Scene 0 mean default scene
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ public class HandlerReqLogin : Handler
|
|||||||
await connection.Player.OnEnterGame();
|
await connection.Player.OnEnterGame();
|
||||||
connection.Player.Connection = connection;
|
connection.Player.Connection = connection;
|
||||||
await connection.SendPacket(new PacketRspLogin(connection.Player!));
|
await connection.SendPacket(new PacketRspLogin(connection.Player!));
|
||||||
|
await connection.SendPacket(new PacketNtfCallScript(connection.Player!));
|
||||||
await SendDebugLoginState(connection);
|
await SendDebugLoginState(connection);
|
||||||
|
|
||||||
await connection.Player.OnHeartBeat();
|
await connection.Player.OnHeartBeat();
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public class PacketNtfCallScript : BasePacket
|
|||||||
|
|
||||||
public PacketNtfCallScript(PlayerInstance Player) : base(CmdIds.NtfScript)
|
public PacketNtfCallScript(PlayerInstance Player) : base(CmdIds.NtfScript)
|
||||||
{
|
{
|
||||||
Player.BuildPlayerAttr();
|
Player.BuildPlayerAttr(true);
|
||||||
var proto = new NtfCallScript
|
var proto = new NtfCallScript
|
||||||
{
|
{
|
||||||
Api = "",
|
Api = "",
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v=2.2
|
v=2.3
|
||||||
Reference in New Issue
Block a user