mirror of
https://github.com/MikuLeaks/MikuSB.git
synced 2026-06-04 05:23:59 +00:00
Compare commits
3 Commits
8d6e0d7638
...
5af23a8113
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5af23a8113 | ||
|
|
ee79486748 | ||
|
|
0cf0e3beb4 |
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 List<SupportCardExcel> SupportCardData { 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
|
||||
|
||||
@@ -18,7 +18,7 @@ public class CommandGiveAll : ICommands
|
||||
if (await arg.GetOption('l') is not int level) return;
|
||||
|
||||
var detail = arg.GetInt(0);
|
||||
level = Math.Clamp(level, 1, 80);
|
||||
level = Math.Clamp(level, 1, 90);
|
||||
var player = arg.Target!.Player!;
|
||||
List<GameWeaponInfo> weapons = [];
|
||||
if (detail == -1)
|
||||
|
||||
@@ -24,7 +24,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
||||
TemplateId = templateId,
|
||||
UniqueId = InventoryData.NextUniqueUid++,
|
||||
Level = weaponLevel,
|
||||
Break = weaponData.InitBreak,
|
||||
Break = GetWeaponBreak(weaponLevel),
|
||||
ItemType = ItemTypeEnum.TYPE_WEAPON,
|
||||
ItemCount = 1
|
||||
};
|
||||
@@ -35,6 +35,17 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
||||
return weaponInfo;
|
||||
}
|
||||
|
||||
private static uint GetWeaponBreak(uint level)
|
||||
{
|
||||
if (level <= 20) return 1;
|
||||
if (level <= 40) return 2;
|
||||
if (level <= 60) return 3;
|
||||
if (level <= 70) return 4;
|
||||
if (level <= 80) return 5;
|
||||
if (level <= 90) return 6;
|
||||
return 7;
|
||||
}
|
||||
|
||||
public GameWeaponInfo? GetWeaponItem(uint uniqueId)
|
||||
{
|
||||
return InventoryData.Weapons.GetValueOrDefault(uniqueId);
|
||||
|
||||
@@ -79,34 +79,6 @@ public class PlayerInstance(PlayerGameData data)
|
||||
|
||||
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();
|
||||
|
||||
@@ -226,6 +198,7 @@ public class PlayerInstance(PlayerGameData data)
|
||||
|
||||
public Proto.Player ToPlayerProto()
|
||||
{
|
||||
BuildPlayerAttr();
|
||||
var displayName = PlayerGameData.NormalizeDisplayName(Data.Name);
|
||||
var proto = new Proto.Player
|
||||
{
|
||||
@@ -293,6 +266,38 @@ public class PlayerInstance(PlayerGameData data)
|
||||
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()
|
||||
{
|
||||
// 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);
|
||||
}
|
||||
|
||||
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
|
||||
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.Inventory;
|
||||
using MikuSB.GameServer.Game.Inventory;
|
||||
using MikuSB.GameServer.Game.Player;
|
||||
using MikuSB.Proto;
|
||||
using MikuSB.TcpSharp;
|
||||
|
||||
@@ -84,4 +84,33 @@ public class PacketNtfCallScript : BasePacket
|
||||
proto.ExtraSync = extraSync;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
v=1.1
|
||||
v=1.2
|
||||
Reference in New Issue
Block a user