Compare commits

...

6 Commits

Author SHA1 Message Date
Naruse
5aa5ef92d0 Update version.txt 2026-05-13 19:59:33 +08:00
Naruse
c34ad5eb1e unlock more furniture 2026-05-13 19:58:53 +08:00
Naruse
8a597e24b6 add system change furniture 2026-05-13 19:42:10 +08:00
Naruse
9763f1f8d9 auto create account if not exist 2026-05-13 19:08:02 +08:00
Kei-Luna
933ba097f9 Modified to send all inventory data via RspLogin upon login. 2026-05-13 19:31:01 +09:00
Kei-Luna
c10d380e11 Added a process to save data to the database when the giveall command is executed. 2026-05-13 19:29:49 +09:00
7 changed files with 83 additions and 17 deletions

View File

@@ -0,0 +1,18 @@
namespace MikuSB.Data.Excel;
[ResourceEntity("house/FurniturePos.json")]
public class HouseFurniturePosExcel : ExcelResource
{
public uint AreaId { get; set; }
public uint GroupId { get; set; }
public override uint GetId()
{
return (AreaId << 48) | (GroupId << 32);
}
public override void Loaded()
{
GameData.HouseFurniturePosData.TryAdd(GetId(), this);
}
}

View File

@@ -31,6 +31,7 @@ public static class GameData
public static Dictionary<uint, WeaponPartsExcel> WeaponPartsData { get; private set; } = [];
public static Dictionary<uint, GuideExcel> GuideData { get; private set; } = [];
public static Dictionary<uint, DormGiftExcel> DormGiftData { get; private set; } = [];
public static Dictionary<uint, HouseFurniturePosExcel> HouseFurniturePosData { get; private set; } = [];
}
public static class GameResourceTemplateId

View File

@@ -1,4 +1,5 @@
using MikuSB.Data;
using MikuSB.Database;
using MikuSB.Database.Inventory;
using MikuSB.Enums.Item;
using MikuSB.Enums.Player;
@@ -42,6 +43,7 @@ public class CommandGiveAll : ICommands
weapons.Add(weapon);
}
if (weapons.Count > 0) await player.SendPacket(new PacketNtfCallScript(weapons));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.Weapon"), weapons.Count.ToString()));
}
@@ -77,6 +79,7 @@ public class CommandGiveAll : ICommands
supportCards.Add(supportCard);
}
if (supportCards.Count > 0) await player.SendPacket(new PacketNtfCallScript(supportCards));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.SupportCard"), supportCards.Count.ToString()));
}
@@ -111,6 +114,7 @@ public class CommandGiveAll : ICommands
weaponSkins.Add(weaponSkin);
}
if (weaponSkins.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponSkins));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.WeaponSkin"), weaponSkins.Count.ToString()));
}
@@ -147,6 +151,7 @@ public class CommandGiveAll : ICommands
profileItems.Add(profile);
}
if (profileItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(profileItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.Profile"), profileItems.Count.ToString()));
}
@@ -183,6 +188,7 @@ public class CommandGiveAll : ICommands
skinPartItems.Add(skinPart);
}
if (skinPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinPartItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.SkinPart"), skinPartItems.Count.ToString()));
}
@@ -219,6 +225,7 @@ public class CommandGiveAll : ICommands
callItems.Add(callItem);
}
if (callItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(callItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.CallItem"), callItems.Count.ToString()));
}
@@ -255,6 +262,7 @@ public class CommandGiveAll : ICommands
weaponPartItems.Add(weaponPart);
}
if (weaponPartItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(weaponPartItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.WeaponPart"), weaponPartItems.Count.ToString()));
}
@@ -291,6 +299,7 @@ public class CommandGiveAll : ICommands
skinItems.Add(skin);
}
if (skinItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(skinItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.Skin"), skinItems.Count.ToString()));
}
@@ -327,6 +336,7 @@ public class CommandGiveAll : ICommands
furnitureItems.Add(furniture);
}
if (furnitureItems.Count > 0) await player.SendPacket(new PacketNtfCallScript(furnitureItems));
DatabaseHelper.SaveDatabaseType(player.InventoryManager.InventoryData);
await arg.SendMsg(I18NManager.Translate("Game.Command.GiveAll.GiveAllItems",
I18NManager.Translate("Word.Furniture"), furnitureItems.Count.ToString()));
}

View File

@@ -214,6 +214,10 @@ public class PlayerInstance(PlayerGameData data)
};
foreach (var chara in CharacterManager.CharacterData.Characters) proto.Items.Add(chara.ToProto());
foreach (var item in InventoryManager.InventoryData.Items.Values) proto.Items.Add(item.ToProto());
foreach (var skin in InventoryManager.InventoryData.Skins.Values) proto.Items.Add(skin.ToProto());
foreach (var weapon in InventoryManager.InventoryData.Weapons.Values) proto.Items.Add(weapon.ToProto());
foreach (var card in InventoryManager.InventoryData.SupportCards.Values) proto.Items.Add(card.ToProto());
foreach (var x in Data.Attrs)
{
uint gid = x.Gid;
@@ -323,20 +327,49 @@ 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;
var groupFurnitureByArea = new Dictionary<uint, uint>();
foreach (var pos in GameData.HouseFurniturePosData.Values)
{
var areaId = pos.AreaId;
var groupId = pos.GroupId;
uint selectedIndex = 1;
var shift = (groupId - 1) * 3;
if (!groupFurnitureByArea.TryGetValue(areaId, out var packed)) packed = 0;
packed |= (selectedIndex << (int)shift);
groupFurnitureByArea[areaId] = packed;
}
for (uint girlId = 0; girlId <= 50; girlId++)
{
// FurnitureStart..FurnitureEnd = 10..19
var baseSid = girlId * 50;
for (uint offset = 10; offset <= 19; offset++)
{
uint sid = (girlId * 50) + offset;
yield return (101, sid, furnitureUnlockedValue);
}
yield return (101, baseSid + offset, furnitureUnlockedValue);
if (groupFurnitureByArea.TryGetValue(girlId, out var groupValue))
yield return (101, baseSid + 20, groupValue);
}
// Massage room furniture
// 10010..10019
for (uint sid = 10010; sid <= 10019; sid++)
yield return (101, sid, furnitureUnlockedValue);
// Massage room group state
yield return (101, 10020, 1);
// Hot spring furniture
// 15001..15010
for (uint sid = 15001; sid <= 15010; sid++)
yield return (101, sid, furnitureUnlockedValue);
// Beach furniture
// 17101..17110
for (uint sid = 17101; sid <= 17110; sid++)
yield return (101, sid, furnitureUnlockedValue);
for (uint sid = 30000; sid < 31000; sid++)
yield return (101, sid, furnitureUnlockedValue);
}
private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildLobbyBootstrapAttrs()

View File

@@ -87,7 +87,6 @@ public class HandlerReqLogin : Handler
await connection.Player.OnHeartBeat();
await connection.SendPacket(new PacketNtfUpdateFriend(connection.Player!));
ApplySavedGirlSkinTypes(connection.Player!);
await connection.SendPacket(new PacketNtfCallScript(connection.Player!.InventoryManager.InventoryData));
await SendGirlSkinTypeOnLogin(connection);
}

View File

@@ -270,12 +270,17 @@ public class RouteController : ControllerBase
var finalEmail = email ?? form_email ?? await GetJsonBodyValue("email");
if (!string.IsNullOrWhiteSpace(finalEmail))
{
var accountByEmail = AccountData.GetAccountByEmail(finalEmail);
if (accountByEmail == null)
return BuildLoginFailedResponse("Account not found.");
var username = finalEmail.Split('@')[0];
var accountData = AccountData.GetAccountByUserName(username);
if (accountData == null)
{
if (!ConfigManager.Config.ServerOption.AutoCreateUser) return BuildLoginFailedResponse("Account not found.");
AccountData.CreateAccount(username, 0, "123456");
accountData = AccountData.GetAccountByUserName(username)!;
}
var finalUidValue = accountByEmail.Uid.ToString();
var finalTokenValue = accountByEmail.GenerateComboToken();
var finalUidValue = accountData.Uid.ToString();
var finalTokenValue = accountData.GenerateComboToken();
object emailLoginRsp = new
{
@@ -286,14 +291,14 @@ public class RouteController : ControllerBase
isFirstLogin = false,
isNeedKoreaSciAuth = false,
ksOpenId = $"ks_{finalUidValue}",
nickname = accountByEmail.Username,
nickname = accountData.Username,
passportId = finalUidValue,
playerFillAgeUrl = "",
status = 0,
thirdPartyUid = "",
token = finalTokenValue,
type = "guest",
uid = accountByEmail.Uid
uid = accountData.Uid
},
msg = "操作成功"
};

View File

@@ -1 +1 @@
v=2.7
v=2.9