mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 16:03:59 +00:00
unlock more stage for operation
This commit is contained in:
14
Common/Data/Excel/DailyLevelExcel.cs
Normal file
14
Common/Data/Excel/DailyLevelExcel.cs
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
namespace MikuSB.Data.Excel;
|
||||||
|
|
||||||
|
[ResourceEntity("daily_level.json")]
|
||||||
|
public class DailyLevelExcel : ExcelResource
|
||||||
|
{
|
||||||
|
public uint ID { get; set; }
|
||||||
|
|
||||||
|
public override uint GetId() => ID;
|
||||||
|
|
||||||
|
public override void Loaded()
|
||||||
|
{
|
||||||
|
GameData.DailyLevelData.Add(ID, this);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,6 +20,8 @@ public static class GameData
|
|||||||
public static Dictionary<uint, NodeConditionExcel> NodeConditionData { get; private set; } = [];
|
public static Dictionary<uint, NodeConditionExcel> NodeConditionData { get; private set; } = [];
|
||||||
public static List<SupportCardExcel> SupportCardData { get; private set; } = [];
|
public static List<SupportCardExcel> SupportCardData { get; private set; } = [];
|
||||||
public static Dictionary<uint, WeaponSkinExcel> WeaponSkinData { get; private set; } = [];
|
public static Dictionary<uint, WeaponSkinExcel> WeaponSkinData { get; private set; } = [];
|
||||||
|
public static Dictionary<uint, DailyLevelExcel> DailyLevelData { get; private set; } = [];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class GameResourceTemplateId
|
public static class GameResourceTemplateId
|
||||||
|
|||||||
@@ -79,34 +79,6 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
|
|
||||||
await LineupManager.UpdateLineup(1, selected[0], selected[1], selected[2],false);
|
await LineupManager.UpdateLineup(1, selected[0], selected[1], selected[2],false);
|
||||||
|
|
||||||
var bootstrapAttrs = BuildLobbyBootstrapAttrs();
|
|
||||||
var existingAttrs = Data.Attrs
|
|
||||||
.ToDictionary(x => (x.Gid, x.Sid));
|
|
||||||
var seenAttrs = new HashSet<(uint Gid, uint Sid)>();
|
|
||||||
|
|
||||||
foreach (var (gid, sid, value) in bootstrapAttrs)
|
|
||||||
{
|
|
||||||
if (!seenAttrs.Add((gid, sid)))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (existingAttrs.TryGetValue((gid, sid), out var attr))
|
|
||||||
{
|
|
||||||
if (attr.Val < value)
|
|
||||||
attr.Val = value;
|
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var newAttr = new PlayerAttr
|
|
||||||
{
|
|
||||||
Gid = gid,
|
|
||||||
Sid = sid,
|
|
||||||
Val = value
|
|
||||||
};
|
|
||||||
|
|
||||||
Data.Attrs.Add(newAttr);
|
|
||||||
existingAttrs[(gid, sid)] = newAttr;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
t.Wait();
|
t.Wait();
|
||||||
|
|
||||||
@@ -226,6 +198,7 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
|
|
||||||
public Proto.Player ToPlayerProto()
|
public Proto.Player ToPlayerProto()
|
||||||
{
|
{
|
||||||
|
BuildPlayerAttr();
|
||||||
var displayName = PlayerGameData.NormalizeDisplayName(Data.Name);
|
var displayName = PlayerGameData.NormalizeDisplayName(Data.Name);
|
||||||
var proto = new Proto.Player
|
var proto = new Proto.Player
|
||||||
{
|
{
|
||||||
@@ -293,6 +266,38 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
return (gid << 16) | sid;
|
return (gid << 16) | sid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void BuildPlayerAttr()
|
||||||
|
{
|
||||||
|
var bootstrapAttrs = BuildLobbyBootstrapAttrs();
|
||||||
|
var existingAttrs = Data.Attrs
|
||||||
|
.ToDictionary(x => (x.Gid, x.Sid));
|
||||||
|
var seenAttrs = new HashSet<(uint Gid, uint Sid)>();
|
||||||
|
|
||||||
|
foreach (var (gid, sid, value) in bootstrapAttrs)
|
||||||
|
{
|
||||||
|
if (!seenAttrs.Add((gid, sid)))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (existingAttrs.TryGetValue((gid, sid), out var attr))
|
||||||
|
{
|
||||||
|
if (attr.Val < value)
|
||||||
|
attr.Val = value;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var newAttr = new PlayerAttr
|
||||||
|
{
|
||||||
|
Gid = gid,
|
||||||
|
Sid = sid,
|
||||||
|
Val = value
|
||||||
|
};
|
||||||
|
|
||||||
|
Data.Attrs.Add(newAttr);
|
||||||
|
existingAttrs[(gid, sid)] = newAttr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
@@ -337,6 +342,12 @@ public class PlayerInstance(PlayerGameData data)
|
|||||||
yield return (22, levelId, 1_700_000_000);
|
yield return (22, levelId, 1_700_000_000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var levelId in GameData.DailyLevelData.Keys)
|
||||||
|
{
|
||||||
|
yield return (21, levelId, 7);
|
||||||
|
yield return (22, levelId, 1_700_000_000);
|
||||||
|
}
|
||||||
|
|
||||||
// Main Scene 0 mean default scene
|
// Main Scene 0 mean default scene
|
||||||
yield return (132, 1, 0);
|
yield return (132, 1, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace MikuSB.GameServer.Server.CallGS.Handlers.Daily;
|
||||||
|
|
||||||
|
[CallGSApi("Daily_SetSelectSuit")]
|
||||||
|
public class Daily_SetSelectSuit : ICallGSHandler
|
||||||
|
{
|
||||||
|
|
||||||
|
public async Task Handle(Connection connection, string param, ushort seqNo)
|
||||||
|
{
|
||||||
|
var req = JsonSerializer.Deserialize<GirlWeaponSkinParam>(param);
|
||||||
|
if (req == null)
|
||||||
|
{
|
||||||
|
await CallGSRouter.SendScript(connection, "GirlWeaponSkin_Change", "{}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var rsp = $"{{\"SuitId\":{req.Suit}}}";
|
||||||
|
await CallGSRouter.SendScript(connection, "Daily_SetSelectSuit", rsp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal sealed class GirlWeaponSkinParam
|
||||||
|
{
|
||||||
|
public uint Type { get; set; }
|
||||||
|
public uint Suit { get; set; }
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using MikuSB.Database.Character;
|
using MikuSB.Database.Character;
|
||||||
using MikuSB.Database.Inventory;
|
using MikuSB.Database.Inventory;
|
||||||
using MikuSB.GameServer.Game.Inventory;
|
using MikuSB.GameServer.Game.Player;
|
||||||
using MikuSB.Proto;
|
using MikuSB.Proto;
|
||||||
using MikuSB.TcpSharp;
|
using MikuSB.TcpSharp;
|
||||||
|
|
||||||
@@ -84,4 +84,33 @@ public class PacketNtfCallScript : BasePacket
|
|||||||
proto.ExtraSync = extraSync;
|
proto.ExtraSync = extraSync;
|
||||||
SetData(proto);
|
SetData(proto);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PacketNtfCallScript(PlayerInstance Player) : base(CmdIds.NtfScript)
|
||||||
|
{
|
||||||
|
Player.BuildPlayerAttr();
|
||||||
|
var proto = new NtfCallScript
|
||||||
|
{
|
||||||
|
Api = "",
|
||||||
|
Arg = "{}"
|
||||||
|
};
|
||||||
|
var sync = new NtfSyncPlayer();
|
||||||
|
foreach (var x in Player.Data.Attrs)
|
||||||
|
{
|
||||||
|
uint gid = x.Gid;
|
||||||
|
uint sid = x.Sid;
|
||||||
|
uint val = x.Val;
|
||||||
|
|
||||||
|
if (gid == 0)
|
||||||
|
{
|
||||||
|
sync.Custom[sid] = val;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sync.Custom[Player.ToPackedAttrKey(gid, sid)] = val;
|
||||||
|
sync.Custom[Player.ToShiftedAttrKey(gid, sid)] = val;
|
||||||
|
}
|
||||||
|
proto.ExtraSync = sync;
|
||||||
|
|
||||||
|
SetData(proto);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user