diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index c124bbb..4fb622a 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -42,4 +42,8 @@ public static class GameData public static Dictionary TutorialData { get; private set; } = []; public static Dictionary CityEventPhotoData { get; private set; } = []; public static Dictionary RandomPlotData { get; private set; } = []; + public static Dictionary UltraEndlessSiteData { get; private set; } = []; + public static Dictionary> UltraEndlessFloorData { get; private set; } = []; + public static Dictionary ExBossMonsterData { get; private set; } = []; + } \ No newline at end of file diff --git a/Common/Database/Player/PlayerData.cs b/Common/Database/Player/PlayerData.cs index 27eacef..5c4c8ac 100644 --- a/Common/Database/Player/PlayerData.cs +++ b/Common/Database/Player/PlayerData.cs @@ -1,4 +1,4 @@ -using System.Drawing; +using KianaBH.Data; using KianaBH.Proto; using KianaBH.Util; using KianaBH.Util.Extensions; @@ -23,6 +23,8 @@ public class PlayerData : BaseDatabaseDataHelper public int BirthDay { get; set; } = 0; [SugarColumn(IsJson = true)] public WarshipAvatarData WarshipAvatar { get; set; } = new(); [SugarColumn(IsNullable = true)] public long LastActiveTime { get; set; } + [SugarColumn(IsJson = true)] public UltraEndless Abyss { get; set; } = new(); + public List ExBossMonster { get; set; } = new List { 51016, 4021, 36112 }; public long RegisterTime { get; set; } = Extensions.GetUnixSec(); public static PlayerData? GetPlayerByUid(long uid) @@ -64,10 +66,61 @@ public class PlayerData : BaseDatabaseDataHelper TotalLoginDays = 1 }; } + + public uint GetCupNum() + { + uint GroupLevel = (uint)Abyss.GroupLevel; + if (GroupLevel > 6) return (GroupLevel - 6) * 367 + 900; + else if (GroupLevel > 1) return (GroupLevel - 2) * 200 + 100; + else return 0; + } + + public List ToUltraEndlessSiteProto() + { + int currentSiteId = Abyss.SiteId; + + var currentSiteData = GameData.UltraEndlessSiteData.Values + .FirstOrDefault(x => x.SiteID == currentSiteId); + + if (currentSiteData == null) return []; + + if (currentSiteData.SiteNodeName.StartsWith("Area") && + int.TryParse(currentSiteData.SiteNodeName.Substring(4), out int areaNumber) && + areaNumber > 1) currentSiteId -= (areaNumber - 1); + + var siteIds = Enumerable.Range(0, 4).Select(i => currentSiteId + i).ToHashSet(); + + var siteDatas = GameData.UltraEndlessSiteData.Values + .Where(site => siteIds.Contains(site.SiteID)); + + return siteDatas.Select(site => new UltraEndlessSite + { + SiteId = (uint)site.SiteID, + FloorList = + { + GameData.UltraEndlessFloorData.Values + .SelectMany(floorList => floorList) + .Where(floor => floor.StageID == site.StageID) + .Select(floor => new UltraEndlessFloor + { + Floor = (uint)floor.FloorID, + MaxScore = site.SiteNodeName == "Area3" ? 0 : (uint)floor.MaxScore + }) + } + }).ToList(); + } } public class WarshipAvatarData { public int FirstAvatarId { get; set; } = 101; public int SecondAvatarId { get; set; } = 0; +} + +public class UltraEndless +{ + public int SiteId { get; set; } = 6691; + public int GroupLevel { get; set; } = 8; + public int DynamicHard { get; set; } = 100; + } \ No newline at end of file diff --git a/Common/Internationalization/Message/LanguageEN.cs b/Common/Internationalization/Message/LanguageEN.cs index 9cb9033..6fc6df9 100644 --- a/Common/Internationalization/Message/LanguageEN.cs +++ b/Common/Internationalization/Message/LanguageEN.cs @@ -44,6 +44,9 @@ public class WordTextEN public string Activity => "Activity"; public string Elf => "Elf"; public string Dress => "Outfit"; + public string Bracket => "Bracket"; + public string Disturbance => "Disturbance"; + public string Site => "Site"; // server info public string Config => "Config File"; @@ -80,7 +83,9 @@ public class CommandTextEN public HelpTextEN Help { get; } = new(); public ValkTextEN Valk { get; } = new(); public GiveAllTextEN GiveAll { get; } = new(); - public ElfTextEN Elf { get; } = new(); + public ElfTextEN Elf { get; } = new(); + public AbyssTextEN Abyss { get; } = new(); + public EndlessTextEN Endless { get; } = new(); } #endregion @@ -236,6 +241,37 @@ public class ElfTextEN public string ElfSetStar => "Set Elf {0}'s Resonance to {1}!"; } +/// +/// path: Game.Command.Abyss +/// +public class AbyssTextEN +{ + public string Desc => "Set abyss disturbance,bracket,site \n"; + + public string Usage => + "Usage: /abyss bracket [1-9]\n\n" + + "Usage: /abyss temp [value]\n\n" + + "Usage: /abyss site [siteId]\n"; + + public string Success => "Success set {0}"; + public string AreaNotFound => "SiteId Not Found"; +} + +/// +/// path: Game.Command.Endless +/// +public class EndlessTextEN +{ + public string Desc => "Set Memorial Arena boss \n"; + + public string Usage => + "Usage: /endless [bossid1] [bossid2] [bossid3]\n\n" + + "/endless 1001 1002 1003"; + + public string Success => "Success set Memorial Arena Boss"; + public string NotFound => "BossId Not Found"; +} + #endregion #endregion \ No newline at end of file diff --git a/GameServer/Command/Commands/CommandEndless.cs b/GameServer/Command/Commands/CommandEndless.cs new file mode 100644 index 0000000..7681ecf --- /dev/null +++ b/GameServer/Command/Commands/CommandEndless.cs @@ -0,0 +1,33 @@ +using KianaBH.Data; +using KianaBH.Enums.Player; +using KianaBH.Internationalization; + +namespace KianaBH.GameServer.Command.Commands; + +[CommandInfo("endless", "Game.Command.Endless.Desc", "Game.Command.Endless.Usage", ["en"], [PermEnum.Admin, PermEnum.Support])] +public class CommandEndless : ICommands +{ + [CommandDefault] + public async ValueTask SetBoss(CommandArg arg) + { + if (!await arg.CheckOnlineTarget()) return; + + var bossIds = new[] { arg.GetInt(0), arg.GetInt(1), arg.GetInt(2) }.ToHashSet(); + + var data = GameData.ExBossMonsterData.Values + .Where(x => bossIds.Contains(x.BossId)) + .Select(x => x.BossId) + .ToList(); + + if (data.Count == 0) + { + await arg.SendMsg(I18NManager.Translate("Game.Command.Endless.NotFound")); + return; + } + + arg.Target!.Player!.Data.ExBossMonster.Clear(); + arg.Target!.Player!.Data.ExBossMonster.AddRange(data); + + await arg.SendMsg(I18NManager.Translate("Game.Command.Endless.Success")); + } +} \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessEnterSiteReq.cs b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessEnterSiteReq.cs similarity index 59% rename from GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessEnterSiteReq.cs rename to GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessEnterSiteReq.cs index 6fc74cd..4f5a18f 100644 --- a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessEnterSiteReq.cs +++ b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessEnterSiteReq.cs @@ -1,13 +1,14 @@ -using KianaBH.GameServer.Server.Packet.Send.Test; +using KianaBH.GameServer.Server.Packet.Send.Endless; using KianaBH.Proto; -namespace KianaBH.GameServer.Server.Packet.Recv.Test; +namespace KianaBH.GameServer.Server.Packet.Recv.Endless; [Opcode(CmdIds.UltraEndlessEnterSiteReq)] public class HandlerUltraEndlessEnterSiteReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(new PacketUltraEndlessEnterSiteRsp()); + var req = UltraEndlessEnterSiteReq.Parser.ParseFrom(data); + await connection.SendPacket(new PacketUltraEndlessEnterSiteRsp(req.SiteId)); } } diff --git a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetMainDataReq.cs b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetMainDataReq.cs similarity index 67% rename from GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetMainDataReq.cs rename to GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetMainDataReq.cs index 5fb6672..a077aee 100644 --- a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetMainDataReq.cs +++ b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetMainDataReq.cs @@ -1,13 +1,13 @@ -using KianaBH.GameServer.Server.Packet.Send.Test; +using KianaBH.GameServer.Server.Packet.Send.Endless; using KianaBH.Proto; -namespace KianaBH.GameServer.Server.Packet.Recv.Test; +namespace KianaBH.GameServer.Server.Packet.Recv.Endless; [Opcode(CmdIds.UltraEndlessGetMainDataReq)] public class HandlerUltraEndlessGetMainDataReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(new PacketUltraEndlessGetMainDataRsp()); + await connection.SendPacket(new PacketUltraEndlessGetMainDataRsp(connection.Player!)); } } diff --git a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetTopRankReq.cs b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetTopRankReq.cs similarity index 56% rename from GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetTopRankReq.cs rename to GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetTopRankReq.cs index 7d875d3..48f9e29 100644 --- a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessGetTopRankReq.cs +++ b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessGetTopRankReq.cs @@ -1,13 +1,14 @@ -using KianaBH.GameServer.Server.Packet.Send.Test; +using KianaBH.GameServer.Server.Packet.Send.Endless; using KianaBH.Proto; -namespace KianaBH.GameServer.Server.Packet.Recv.Test; +namespace KianaBH.GameServer.Server.Packet.Recv.Endless; [Opcode(CmdIds.UltraEndlessGetTopRankReq)] public class HandlerUltraEndlessGetTopRankReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(new PacketUltraEndlessGetTopRankRsp()); + var req = UltraEndlessGetTopRankReq.Parser.ParseFrom(data); + await connection.SendPacket(new PacketUltraEndlessGetTopRankRsp(connection.Player!,req.ScheduleId)); } } diff --git a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessReportSiteFloorReq.cs b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessReportSiteFloorReq.cs similarity index 57% rename from GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessReportSiteFloorReq.cs rename to GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessReportSiteFloorReq.cs index ef59964..8145d9f 100644 --- a/GameServer/Server/Packet/Recv/Test/HandlerUltraEndlessReportSiteFloorReq.cs +++ b/GameServer/Server/Packet/Recv/Endless/HandlerUltraEndlessReportSiteFloorReq.cs @@ -1,13 +1,14 @@ -using KianaBH.GameServer.Server.Packet.Send.Test; +using KianaBH.GameServer.Server.Packet.Send.Endless; using KianaBH.Proto; -namespace KianaBH.GameServer.Server.Packet.Recv.Test; +namespace KianaBH.GameServer.Server.Packet.Recv.Endless; [Opcode(CmdIds.UltraEndlessReportSiteFloorReq)] public class HandlerUltraEndlessReportSiteFloorReq : Handler { public override async Task OnHandle(Connection connection, byte[] header, byte[] data) { - await connection.SendPacket(new PacketUltraEndlessReportSiteFloorRsp()); + var req = UltraEndlessReportSiteFloorReq.Parser.ParseFrom(data); + await connection.SendPacket(new PacketUltraEndlessReportSiteFloorRsp(req.SiteId,req.Floor)); } } diff --git a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessEnterSiteRsp.cs b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessEnterSiteRsp.cs similarity index 54% rename from GameServer/Server/Packet/Send/Test/PacketUltraEndlessEnterSiteRsp.cs rename to GameServer/Server/Packet/Send/Endless/PacketUltraEndlessEnterSiteRsp.cs index 11dac02..81f61ca 100644 --- a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessEnterSiteRsp.cs +++ b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessEnterSiteRsp.cs @@ -1,15 +1,15 @@ using KianaBH.KcpSharp; using KianaBH.Proto; -namespace KianaBH.GameServer.Server.Packet.Send.Test; +namespace KianaBH.GameServer.Server.Packet.Send.Endless; public class PacketUltraEndlessEnterSiteRsp : BasePacket { - public PacketUltraEndlessEnterSiteRsp() : base(CmdIds.UltraEndlessEnterSiteRsp) + public PacketUltraEndlessEnterSiteRsp(uint siteId) : base(CmdIds.UltraEndlessEnterSiteRsp) { var proto = new UltraEndlessEnterSiteRsp { - + SiteId = siteId }; SetData(proto); diff --git a/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetMainDataRsp.cs b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetMainDataRsp.cs new file mode 100644 index 0000000..9e4ee98 --- /dev/null +++ b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetMainDataRsp.cs @@ -0,0 +1,66 @@ +using KianaBH.Data; +using KianaBH.GameServer.Game.Player; +using KianaBH.KcpSharp; +using KianaBH.Proto; +using KianaBH.Util.Extensions; + +namespace KianaBH.GameServer.Server.Packet.Send.Endless; + +public class PacketUltraEndlessGetMainDataRsp : BasePacket +{ + public PacketUltraEndlessGetMainDataRsp(PlayerInstance player) : base(CmdIds.UltraEndlessGetMainDataRsp) + { + uint cupNum = player.Data.GetCupNum(); + var proto = new UltraEndlessGetMainDataRsp + { + ScheduleId = 1028, + GroupLevel = (uint)player.Data.Abyss.GroupLevel, + TopGroupLevel = 9, + CupNum = cupNum, + MainData = new UltraEndlessMainData + { + ScheduleId = 1028, + BeginTime = (uint)Extensions.GetUnixSec(), + EndTime = (uint)Extensions.GetUnixSec() + 3600 * 24 * 7, + CloseTime = (uint)Extensions.GetUnixSec() + 3600 * 24 * 7 + 1200, + CurSeasonId = 1, + SiteList = { player.Data.ToUltraEndlessSiteProto() } + }, + DynamicHardLevel = (uint)player.Data.Abyss.DynamicHard, + EndlessPlayerList = + { + new UltraEndlessPlayer + { + Uid = (uint)player.Data.Uid, + GroupLevel = (uint)player.Data.Abyss.GroupLevel, + CupNum = cupNum, + MaxStageScore = 18000 + } + }, + BriefDataList = + { + new PlayerFriendBriefData + { + Uid = (uint)player.Data.Uid, + Nickname = player.Data.Name, + Level = (uint)player.Data.Level, + } + }, + LastSettleInfo = new UltraEndlessSettleInfo + { + CupNum = 280, + CupNumAfterScheduleSettle = 280, + CupNumAfterSeasonSettle = 380, + CupNumBefore = 380, + CupNumBeforeSeasonSettle = 380, + GroupLevel = 3, + GroupMemberNum = 20, + MmrScore = 974, + Rank = 20, + ScheduleId = 3426 + }, + }; + + SetData(proto); + } +} diff --git a/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetTopRankRsp.cs b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetTopRankRsp.cs new file mode 100644 index 0000000..b815017 --- /dev/null +++ b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessGetTopRankRsp.cs @@ -0,0 +1,37 @@ +using KianaBH.GameServer.Game.Player; +using KianaBH.KcpSharp; +using KianaBH.Proto; + +namespace KianaBH.GameServer.Server.Packet.Send.Endless; + +public class PacketUltraEndlessGetTopRankRsp : BasePacket +{ + public PacketUltraEndlessGetTopRankRsp(PlayerInstance player, uint scheduleId) : base(CmdIds.UltraEndlessGetTopRankRsp) + { + var proto = new UltraEndlessGetTopRankRsp + { + ScheduleId = scheduleId, + RankData = new RankShowData + { + IsFeatureClosed = true, + MyRank = 1, + MyRankType = 1, + MyScore = 18000, + RankList = + { + new UserRankData + { + Uid = (uint)player.Data.Uid, + NickName = player.Data.Name, + Rank = 1, + Score = 18000, + CustomHeadId = (uint)player.Data.HeadIcon, + FrameId = (uint)player.Data.HeadFrame, + } + } + }, + }; + + SetData(proto); + } +} diff --git a/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessReportSiteFloorRsp.cs b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessReportSiteFloorRsp.cs new file mode 100644 index 0000000..0af3518 --- /dev/null +++ b/GameServer/Server/Packet/Send/Endless/PacketUltraEndlessReportSiteFloorRsp.cs @@ -0,0 +1,18 @@ +using KianaBH.KcpSharp; +using KianaBH.Proto; + +namespace KianaBH.GameServer.Server.Packet.Send.Endless; + +public class PacketUltraEndlessReportSiteFloorRsp : BasePacket +{ + public PacketUltraEndlessReportSiteFloorRsp(uint siteId, uint floor) : base(CmdIds.UltraEndlessReportSiteFloorRsp) + { + var proto = new UltraEndlessReportSiteFloorRsp + { + SiteId = siteId, + Floor = floor, + }; + + SetData(proto); + } +} diff --git a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetMainDataRsp.cs b/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetMainDataRsp.cs deleted file mode 100644 index be4195b..0000000 --- a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetMainDataRsp.cs +++ /dev/null @@ -1,17 +0,0 @@ -using KianaBH.KcpSharp; -using KianaBH.Proto; - -namespace KianaBH.GameServer.Server.Packet.Send.Test; - -public class PacketUltraEndlessGetMainDataRsp : BasePacket -{ - public PacketUltraEndlessGetMainDataRsp() : base(CmdIds.UltraEndlessGetMainDataRsp) - { - var proto = new UltraEndlessGetMainDataRsp - { - - }; - - SetData(proto); - } -} diff --git a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetTopRankRsp.cs b/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetTopRankRsp.cs deleted file mode 100644 index c8ff92e..0000000 --- a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessGetTopRankRsp.cs +++ /dev/null @@ -1,17 +0,0 @@ -using KianaBH.KcpSharp; -using KianaBH.Proto; - -namespace KianaBH.GameServer.Server.Packet.Send.Test; - -public class PacketUltraEndlessGetTopRankRsp : BasePacket -{ - public PacketUltraEndlessGetTopRankRsp() : base(CmdIds.UltraEndlessGetTopRankRsp) - { - var proto = new UltraEndlessGetTopRankRsp - { - - }; - - SetData(proto); - } -} diff --git a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessReportSiteFloorRsp.cs b/GameServer/Server/Packet/Send/Test/PacketUltraEndlessReportSiteFloorRsp.cs deleted file mode 100644 index ed40324..0000000 --- a/GameServer/Server/Packet/Send/Test/PacketUltraEndlessReportSiteFloorRsp.cs +++ /dev/null @@ -1,17 +0,0 @@ -using KianaBH.KcpSharp; -using KianaBH.Proto; - -namespace KianaBH.GameServer.Server.Packet.Send.Test; - -public class PacketUltraEndlessReportSiteFloorRsp : BasePacket -{ - public PacketUltraEndlessReportSiteFloorRsp() : base(CmdIds.UltraEndlessReportSiteFloorRsp) - { - var proto = new UltraEndlessReportSiteFloorRsp - { - - }; - - SetData(proto); - } -} diff --git a/Proto/BH3.proto b/Proto/BH3.proto index 1713af6..79bc62c 100644 --- a/Proto/BH3.proto +++ b/Proto/BH3.proto @@ -561,7 +561,7 @@ message PlayerDetailData { uint32 frame_id = 16; PlayerAdventureData adventure = 17; repeated AvatarDetailData backup_avatar_list = 18; - Medal on_medal = 19; + uint32 on_medal = 19; bool is_allow_visit = 30; uint32 visit_avatar = 31; uint32 be_liked_num = 32; @@ -596,7 +596,7 @@ message PlayerFriendBriefData { string armada_name = 13; uint32 bond = 14; uint32 on_medal_id = 15; - Medal on_medal = 16; + uint32 on_medal = 16; uint32 frame_id = 17; uint32 mp_level = 18; uint32 custom_head_id = 19; @@ -17223,7 +17223,7 @@ message ChatworldPlayerInfo { repeated ChatworldBuff buff_list = 18; uint32 runtime_tag = 20; uint32 custom_head_id = 22; - Medal on_medal = 23; + uint32 on_medal = 23; ChatworldBattle battle_info = 32; } @@ -28646,7 +28646,7 @@ message GetMainDataRsp { uint32 register_time = 40; WarshipThemeData warship_theme = 41; repeated WaitDelMaterialData wait_del_material_list = 42; - Medal on_medal = 43; + uint32 on_medal = 43; repeated uint32 type_list = 44; }