diff --git a/Common/Data/Config/Scene/FloorInfo.cs b/Common/Data/Config/Scene/FloorInfo.cs index 4aa06f2a..68ecc098 100644 --- a/Common/Data/Config/Scene/FloorInfo.cs +++ b/Common/Data/Config/Scene/FloorInfo.cs @@ -2,6 +2,7 @@ using EggLink.DanhengServer.Enums.Scene; using EggLink.DanhengServer.Util; using Newtonsoft.Json; +using Newtonsoft.Json.Converters; namespace EggLink.DanhengServer.Data.Config.Scene; @@ -13,6 +14,7 @@ public class FloorInfo public string NavmapConfigPath { get; set; } = ""; public List GroupInstanceList { get; set; } = []; public List DimensionList { get; set; } = []; + [JsonProperty(ItemConverterType = typeof(StringEnumConverter))] public List LevelFeatureModules { get; set; } = []; [JsonConverter(typeof(ConcurrentBagConverter))] public ConcurrentBag MapSections = []; diff --git a/Common/Enums/Scene/LevelFeatureTypeEnum.cs b/Common/Enums/Scene/LevelFeatureTypeEnum.cs new file mode 100644 index 00000000..7b610410 --- /dev/null +++ b/Common/Enums/Scene/LevelFeatureTypeEnum.cs @@ -0,0 +1,9 @@ +namespace EggLink.DanhengServer.Enums.Scene; + +public enum LevelFeatureTypeEnum +{ + Unknown = 0, + RotatableRegion = 1, + HeartDial = 2, + EraFlipper = 3 +} \ No newline at end of file diff --git a/GameServer/Game/RogueTourn/RogueTournInstance.cs b/GameServer/Game/RogueTourn/RogueTournInstance.cs index 4efef4c8..742da4ce 100644 --- a/GameServer/Game/RogueTourn/RogueTournInstance.cs +++ b/GameServer/Game/RogueTourn/RogueTournInstance.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Enums.Rogue; +using EggLink.DanhengServer.Enums.Scene; using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.GameServer.Game.Battle; using EggLink.DanhengServer.GameServer.Game.Player; @@ -10,6 +11,7 @@ using EggLink.DanhengServer.GameServer.Game.Rogue.Event; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Formula; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Scene; using EggLink.DanhengServer.GameServer.Game.RogueTourn.Titan; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueTourn; @@ -122,6 +124,12 @@ public class RogueTournInstance : BaseRogueInstance await Player.EnterMissionScene(entrance, group, anchor, false); + // check if era flipper + if (Player.SceneInstance!.FloorInfo!.LevelFeatureModules.Contains(LevelFeatureTypeEnum.EraFlipper)) + { + await Player.SendPacket(new PacketEraFlipperDataChangeScNotify(Player.SceneInstance!.FloorId)); + } + // sync await Player.SendPacket(new PacketRogueTournLevelInfoUpdateScNotify(this, [CurLevel])); diff --git a/GameServer/Server/Packet/Recv/EraFlipperData/HandlerChangeEraFlipperDataCsReq.cs b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs similarity index 91% rename from GameServer/Server/Packet/Recv/EraFlipperData/HandlerChangeEraFlipperDataCsReq.cs rename to GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs index 4d0cd86d..5e941f21 100644 --- a/GameServer/Server/Packet/Recv/EraFlipperData/HandlerChangeEraFlipperDataCsReq.cs +++ b/GameServer/Server/Packet/Recv/EraFlipper/HandlerChangeEraFlipperDataCsReq.cs @@ -1,19 +1,18 @@ -using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipperData; -using EggLink.DanhengServer.Proto; -using EggLink.DanhengServer.Kcp; -using NetTaste; - -namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipperData; - -[Opcode(CmdIds.ChangeEraFlipperDataCsReq)] -public class HandlerChangeEraFlipperDataCsReq : Handler -{ - public override async Task OnHandle(Connection connection, byte[] header, byte[] data) - { - var req = ChangeEraFlipperDataCsReq.Parser.ParseFrom(data); - - int floorId = connection.Player!.SceneInstance!.FloorId; - await connection.SendPacket(new PacketChangeEraFlipperDataScRsp(req)); - await connection.SendPacket(new PacketEraFlipperDataChangeScNotify(req, floorId)); - } -} +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipper; + +[Opcode(CmdIds.ChangeEraFlipperDataCsReq)] +public class HandlerChangeEraFlipperDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = ChangeEraFlipperDataCsReq.Parser.ParseFrom(data); + + int floorId = connection.Player!.SceneInstance!.FloorId; + await connection.SendPacket(new PacketChangeEraFlipperDataScRsp(req)); + await connection.SendPacket(new PacketEraFlipperDataChangeScNotify(req, floorId)); + } +} diff --git a/GameServer/Server/Packet/Recv/EraFlipperData/HandlerGetEraFlipperDataCsReq.cs b/GameServer/Server/Packet/Recv/EraFlipper/HandlerGetEraFlipperDataCsReq.cs similarity index 68% rename from GameServer/Server/Packet/Recv/EraFlipperData/HandlerGetEraFlipperDataCsReq.cs rename to GameServer/Server/Packet/Recv/EraFlipper/HandlerGetEraFlipperDataCsReq.cs index c88d6729..f343c037 100644 --- a/GameServer/Server/Packet/Recv/EraFlipperData/HandlerGetEraFlipperDataCsReq.cs +++ b/GameServer/Server/Packet/Recv/EraFlipper/HandlerGetEraFlipperDataCsReq.cs @@ -1,21 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipperData; -using EggLink.DanhengServer.Proto; -using EggLink.DanhengServer.Kcp; - -namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipperData; - -[Opcode(CmdIds.GetEraFlipperDataCsReq)] -public class HandlerGetEraFlipperDataCsReq : Handler -{ - public override async Task OnHandle(Connection connection, byte[] header, byte[] data) - { - var req = GetEraFlipperDataCsReq.Parser.ParseFrom(data); - - await connection.SendPacket(new PacketGetEraFlipperDataScRsp(connection.Player!)); - } -} +using EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.EraFlipper; + +[Opcode(CmdIds.GetEraFlipperDataCsReq)] +public class HandlerGetEraFlipperDataCsReq : Handler +{ + public override async Task OnHandle(Connection connection, byte[] header, byte[] data) + { + var req = GetEraFlipperDataCsReq.Parser.ParseFrom(data); + + await connection.SendPacket(new PacketGetEraFlipperDataScRsp(connection.Player!)); + } +} diff --git a/GameServer/Server/Packet/Send/EraFlipperData/PacketChangeEraFlipperDataScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs similarity index 68% rename from GameServer/Server/Packet/Send/EraFlipperData/PacketChangeEraFlipperDataScRsp.cs rename to GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs index 359d917d..44da6787 100644 --- a/GameServer/Server/Packet/Send/EraFlipperData/PacketChangeEraFlipperDataScRsp.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketChangeEraFlipperDataScRsp.cs @@ -1,21 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using EggLink.DanhengServer.Kcp; -using EggLink.DanhengServer.Proto; - -namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipperData; -public class PacketChangeEraFlipperDataScRsp : BasePacket -{ - public PacketChangeEraFlipperDataScRsp(ChangeEraFlipperDataCsReq req) : base(CmdIds.ChangeEraFlipperDataScRsp) - { - var proto = new ChangeEraFlipperDataScRsp - { - Data = req.Data - }; - - SetData(proto); - } -} +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +public class PacketChangeEraFlipperDataScRsp : BasePacket +{ + public PacketChangeEraFlipperDataScRsp(ChangeEraFlipperDataCsReq req) : base(CmdIds.ChangeEraFlipperDataScRsp) + { + var proto = new ChangeEraFlipperDataScRsp + { + Data = req.Data + }; + + SetData(proto); + } +} diff --git a/GameServer/Server/Packet/Send/EraFlipperData/PacketEraFlipperDataChangeScNotify.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs similarity index 66% rename from GameServer/Server/Packet/Send/EraFlipperData/PacketEraFlipperDataChangeScNotify.cs rename to GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs index 5f0e5f6f..dc6fc135 100644 --- a/GameServer/Server/Packet/Send/EraFlipperData/PacketEraFlipperDataChangeScNotify.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketEraFlipperDataChangeScNotify.cs @@ -1,17 +1,27 @@ -using EggLink.DanhengServer.Kcp; -using EggLink.DanhengServer.Proto; - -namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipperData; -public class PacketEraFlipperDataChangeScNotify : BasePacket -{ - public PacketEraFlipperDataChangeScNotify(ChangeEraFlipperDataCsReq req, int floorId) : base(CmdIds.EraFlipperDataChangeScNotify) - { - var proto = new EraFlipperDataChangeScNotify - { - Data = req.Data, - FloorId = (uint)floorId - }; - - SetData(proto); - } -} +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +public class PacketEraFlipperDataChangeScNotify : BasePacket +{ + public PacketEraFlipperDataChangeScNotify(ChangeEraFlipperDataCsReq req, int floorId) : base(CmdIds.EraFlipperDataChangeScNotify) + { + var proto = new EraFlipperDataChangeScNotify + { + Data = req.Data, + FloorId = (uint)floorId + }; + + SetData(proto); + } + + public PacketEraFlipperDataChangeScNotify(int floorId) : base(CmdIds.EraFlipperDataChangeScNotify) + { + var proto = new EraFlipperDataChangeScNotify + { + FloorId = (uint)floorId + }; + + SetData(proto); + } +} diff --git a/GameServer/Server/Packet/Send/EraFlipperData/PacketGetEraFlipperDataScRsp.cs b/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs similarity index 74% rename from GameServer/Server/Packet/Send/EraFlipperData/PacketGetEraFlipperDataScRsp.cs rename to GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs index 6184b683..cdc80fc8 100644 --- a/GameServer/Server/Packet/Send/EraFlipperData/PacketGetEraFlipperDataScRsp.cs +++ b/GameServer/Server/Packet/Send/EraFlipper/PacketGetEraFlipperDataScRsp.cs @@ -1,19 +1,14 @@ -using EggLink.DanhengServer.GameServer.Game.Player; -using EggLink.DanhengServer.Kcp; -using EggLink.DanhengServer.Proto; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipperData; -public class PacketGetEraFlipperDataScRsp : BasePacket -{ - public PacketGetEraFlipperDataScRsp(PlayerInstance player) : base(CmdIds.GetEraFlipperDataScRsp) - { - var proto = new GetEraFlipperDataScRsp(); - - SetData(proto); - } -} +using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.EraFlipper; +public class PacketGetEraFlipperDataScRsp : BasePacket +{ + public PacketGetEraFlipperDataScRsp(PlayerInstance player) : base(CmdIds.GetEraFlipperDataScRsp) + { + var proto = new GetEraFlipperDataScRsp(); + + SetData(proto); + } +} diff --git a/Program/Generator/TournRoomGenerator.cs b/Program/Generator/TournRoomGenerator.cs new file mode 100644 index 00000000..120eeb1d --- /dev/null +++ b/Program/Generator/TournRoomGenerator.cs @@ -0,0 +1,123 @@ +using System.Text; +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Data.Custom; +using EggLink.DanhengServer.Enums.TournRogue; +using EggLink.DanhengServer.Util; +using Newtonsoft.Json; +using Swashbuckle.AspNetCore.SwaggerGen; + +namespace EggLink.DanhengServer.Program.Generator; + +public static class TournRoomGenerator +{ + public static List AllowedFloorIdList { get; set; } = [80601001, 80602001, 80603001, 80604001]; + public static List SavedRoomInstanceList { get; set; } = []; + public static void GenerateFile(string path) + { + // get floor info + foreach (var floorId in AllowedFloorIdList) + { + var areaGroupId = 0; + var baseModuleId = 0; + var roomType = RogueTournRoomTypeEnum.Unknown; + var isCommon = false; + Dictionary> contentGroupId = []; + + var info = GameData.FloorInfoData.Values.First(x => x.FloorID == floorId); + foreach (var groupInfo in info.GroupInstanceList.Where(x => !x.IsDelete && x.Name.Contains("RogueModule_Tournament") && !x.Name.Contains("Tpl_"))) + { + if (groupInfo.Name.Contains("_Area")) + { + if (areaGroupId > 0 && baseModuleId > 0 && contentGroupId.Count > 0) + { + foreach (var group in contentGroupId) + { + FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, areaGroupId, baseModuleId, group.Value, group.Key); + } + } + contentGroupId.Clear(); + + areaGroupId = groupInfo.ID; + continue; + } + + if (groupInfo.Name.Contains("_Base")) + { + if (areaGroupId > 0 && baseModuleId > 0 && contentGroupId.Count > 0) + { + foreach (var group in contentGroupId) + { + FlushRoom(GameData.MapEntranceData.First(x => x.Value.FloorID == floorId).Key, areaGroupId, baseModuleId, group.Value, group.Key); + } + } + contentGroupId.Clear(); + + baseModuleId = groupInfo.ID; + isCommon = false; + if (groupInfo.Name.Contains("_Common")) + isCommon = true; + else if (groupInfo.Name.Contains("_Boss")) + roomType = RogueTournRoomTypeEnum.Boss; + else if (groupInfo.Name.Contains("_Elite")) + roomType = RogueTournRoomTypeEnum.Elite; + else if (groupInfo.Name.Contains("_Shop")) + roomType = RogueTournRoomTypeEnum.Shop; + else if (groupInfo.Name.Contains("_Rest")) + roomType = RogueTournRoomTypeEnum.Respite; + else if (groupInfo.Name.Contains("_Adventure")) + roomType = RogueTournRoomTypeEnum.Adventure; + else if (groupInfo.Name.Contains("_Secret")) + roomType = RogueTournRoomTypeEnum.Hidden; + + continue; + } + + if (areaGroupId == 0 || baseModuleId == 0) continue; + + if (isCommon) + { + // contain Battle Event Coin + if (groupInfo.Name.Contains("Monster")) + { + contentGroupId.TryAdd(RogueTournRoomTypeEnum.Battle, []); + contentGroupId[RogueTournRoomTypeEnum.Battle].Add(groupInfo.ID); + } + else if (groupInfo.Name.Contains("Event")) + { + contentGroupId.TryAdd(RogueTournRoomTypeEnum.Event, []); + contentGroupId[RogueTournRoomTypeEnum.Event].Add(groupInfo.ID); + } + else if (groupInfo.Name.Contains("Coin")) + { + contentGroupId.TryAdd(RogueTournRoomTypeEnum.Coin, []); + contentGroupId[RogueTournRoomTypeEnum.Coin].Add(groupInfo.ID); + } + } + else + { + contentGroupId.TryAdd(roomType, []); + contentGroupId[roomType].Add(groupInfo.ID); + } + } + } + + // save + File.AppendAllText(path, JsonConvert.SerializeObject(SavedRoomInstanceList, Formatting.Indented), Encoding.UTF8); + + // log + Logger.GetByClassName().Info($"Generated in {path} Successfully!"); + } + + public static void FlushRoom(int entranceId, int areaGroupId, int baseGroupId, List contentGroupIds, RogueTournRoomTypeEnum type) + { + SavedRoomInstanceList.Add(new RogueTournRoomConfig + { + AnchorGroup = baseGroupId, + AnchorId = 1, + DefaultLoadBasicGroup = { areaGroupId, baseGroupId}, + DefaultLoadGroup = contentGroupIds, + EntranceId = entranceId, + RoomType = type, + }); + } +} \ No newline at end of file diff --git a/Program/Program/EntryPoint.cs b/Program/Program/EntryPoint.cs index 74b59763..f78163a9 100644 --- a/Program/Program/EntryPoint.cs +++ b/Program/Program/EntryPoint.cs @@ -11,6 +11,7 @@ using EggLink.DanhengServer.GameServer.Server; using EggLink.DanhengServer.GameServer.Server.Packet; using EggLink.DanhengServer.Internationalization; using EggLink.DanhengServer.Kcp; +using EggLink.DanhengServer.Program.Generator; using EggLink.DanhengServer.Program.Handbook; using EggLink.DanhengServer.Util; using EggLink.DanhengServer.WebServer; @@ -170,6 +171,13 @@ public class EntryPoint return; } + // check option + if (true || args.Contains("-generate-tourn")) + { + TournRoomGenerator.GenerateFile("RogueTournRoom.json"); + return; + } + // Register the command handlers try {