Compare commits

..

4 Commits
v2.8 ... v2.9

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
5 changed files with 69 additions and 16 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, 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 Dictionary<uint, DormGiftExcel> DormGiftData { get; private set; } = [];
public static Dictionary<uint, HouseFurniturePosExcel> HouseFurniturePosData { get; private set; } = [];
} }
public static class GameResourceTemplateId public static class GameResourceTemplateId

View File

@@ -327,20 +327,49 @@ public class PlayerInstance(PlayerGameData data)
private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildGirlFurnitureAttrs() 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; 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++) for (uint girlId = 0; girlId <= 50; girlId++)
{ {
// FurnitureStart..FurnitureEnd = 10..19 var baseSid = girlId * 50;
for (uint offset = 10; offset <= 19; offset++) for (uint offset = 10; offset <= 19; offset++)
{ yield return (101, baseSid + offset, furnitureUnlockedValue);
uint sid = (girlId * 50) + offset;
yield return (101, sid, 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() private static IEnumerable<(uint Gid, uint Sid, uint Value)> BuildLobbyBootstrapAttrs()

View File

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

View File

@@ -1 +1 @@
v=2.8 v=2.9