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 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
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ public class CommandGiveAll : ICommands
|
|||||||
if (await arg.GetOption('l') is not int level) return;
|
if (await arg.GetOption('l') is not int level) return;
|
||||||
|
|
||||||
var detail = arg.GetInt(0);
|
var detail = arg.GetInt(0);
|
||||||
level = Math.Clamp(level, 1, 80);
|
level = Math.Clamp(level, 1, 90);
|
||||||
var player = arg.Target!.Player!;
|
var player = arg.Target!.Player!;
|
||||||
List<GameWeaponInfo> weapons = [];
|
List<GameWeaponInfo> weapons = [];
|
||||||
if (detail == -1)
|
if (detail == -1)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
|||||||
TemplateId = templateId,
|
TemplateId = templateId,
|
||||||
UniqueId = InventoryData.NextUniqueUid++,
|
UniqueId = InventoryData.NextUniqueUid++,
|
||||||
Level = weaponLevel,
|
Level = weaponLevel,
|
||||||
Break = weaponData.InitBreak,
|
Break = GetWeaponBreak(weaponLevel),
|
||||||
ItemType = ItemTypeEnum.TYPE_WEAPON,
|
ItemType = ItemTypeEnum.TYPE_WEAPON,
|
||||||
ItemCount = 1
|
ItemCount = 1
|
||||||
};
|
};
|
||||||
@@ -35,6 +35,17 @@ public class InventoryManager(PlayerInstance player) : BasePlayerManager(player)
|
|||||||
return weaponInfo;
|
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)
|
public GameWeaponInfo? GetWeaponItem(uint uniqueId)
|
||||||
{
|
{
|
||||||
return InventoryData.Weapons.GetValueOrDefault(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);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
v=1.1
|
v=1.2
|
||||||
Reference in New Issue
Block a user