I rewrote House_Request based on the code provided by undownding.

This commit is contained in:
Kei-Luna
2026-05-05 07:35:34 +09:00
parent 677e4027b9
commit 2d1079a80d
9 changed files with 763 additions and 72 deletions

View File

@@ -1,6 +1,5 @@
using System.Text.Json;
using MikuSB.Proto;
using System.Text.Json.Nodes;
using System.Text.Json.Serialization;
namespace MikuSB.GameServer.Server.CallGS.Handlers.House;
@@ -9,14 +8,26 @@ public class ChangeNpcSuit : IHouseFuncHandler
{
public async Task Handle(Connection connection, string param)
{
var req = JsonSerializer.Deserialize<NpcSuitParam>(param);
var root = HouseJson.ParseObject(param);
if (root == null) return;
var npcId = HouseJson.NumField(root, "NpcId");
var suitId = HouseJson.NumField(root, "SuitId");
var sync = new NtfSyncPlayer();
await HouseAttr.SetAsync(connection, (uint)(npcId * 50 + 7), (uint)Math.Max(0, suitId), sync, sendImmediate: true);
var rsp = new JsonObject
{
["FuncName"] = "ChangeNpcSuitSuccess",
["NpcId"] = req?.NpcId ?? 0,
["SuitId"] = req?.SuitId ?? 0
["NpcId"] = npcId,
["SuitId"] = suitId,
["npcSuit"] = new JsonObject
{
["NpcId"] = npcId,
["SuitId"] = suitId
},
["FuncName"] = "ChangeNpcSuitSuccess"
};
await CallGSRouter.SendScript(connection, "House_Request", rsp.ToJsonString());
await CallGSRouter.SendScript(connection, "House_Request", HouseRequestScript.Success(rsp), sync);
}
}
@@ -25,14 +36,45 @@ public class ChangeNpcSuitByAreaId : IHouseFuncHandler
{
public async Task Handle(Connection connection, string param)
{
var req = JsonSerializer.Deserialize<NpcSuitParam>(param);
var rsp = new JsonObject
var root = HouseJson.ParseObject(param);
if (root == null) return;
var npcId = HouseJson.NumField(root, "NpcId");
var areaId = HouseJson.NumField(root, "AreaId");
var suitId = HouseJson.NumField(root, "SuitId");
var sync = new NtfSyncPlayer();
if (npcId > 0 && areaId > 0)
{
["FuncName"] = "ChangeNpcSuitByAreaIdRsp",
["NpcId"] = req?.NpcId ?? 0,
["SuitId"] = req?.SuitId ?? 0
};
await CallGSRouter.SendScript(connection, "House_Request", rsp.ToJsonString());
uint[] slotSids = Enumerable.Range(24, 6).Select(i => (uint)(npcId * 50 + i)).ToArray();
uint? chosenSid = null;
foreach (var sid in slotSids)
{
if ((HouseAttr.Read(connection.Player!, sid) & 0xffffu) == (uint)areaId)
{
chosenSid = sid;
break;
}
}
if (chosenSid == null)
{
foreach (var sid in slotSids)
{
if (HouseAttr.Read(connection.Player!, sid) == 0)
{
chosenSid = sid;
break;
}
}
}
chosenSid ??= slotSids[0];
var packed = (((uint)suitId & 0xffffu) << 16) | ((uint)areaId & 0xffffu);
await HouseAttr.SetAsync(connection, chosenSid.Value, packed, sync, sendImmediate: true);
}
await CallGSRouter.SendScript(connection, "House_Request", HouseRequestScript.Synthesize(root), sync);
}
}
@@ -41,19 +83,15 @@ public class ChangeGirlBeachSuitId : IHouseFuncHandler
{
public async Task Handle(Connection connection, string param)
{
var req = JsonSerializer.Deserialize<NpcSuitParam>(param);
var rsp = new JsonObject
{
["FuncName"] = "ChangeGirlBeachSuitIdSuccess",
["NpcId"] = req?.NpcId ?? 0,
["SuitId"] = req?.SuitId ?? 0
};
await CallGSRouter.SendScript(connection, "House_Request", rsp.ToJsonString());
var root = HouseJson.ParseObject(param);
if (root == null) return;
var npcId = HouseJson.NumField(root, "NpcId");
var suitId = HouseJson.NumField(root, "SuitId");
var sync = new NtfSyncPlayer();
if (npcId > 0)
await HouseAttr.SetAsync(connection, (uint)(npcId * 50 + 8), (uint)Math.Max(0, suitId), sync, sendImmediate: true);
await CallGSRouter.SendScript(connection, "House_Request", HouseRequestScript.Synthesize(root), sync);
}
}
internal sealed class NpcSuitParam
{
[JsonPropertyName("NpcId")] public int NpcId { get; set; }
[JsonPropertyName("SuitId")] public int SuitId { get; set; }
}