feat: tourn room generator

This commit is contained in:
Somebody
2025-04-19 18:57:33 +08:00
parent b137ea1813
commit e834db9e02
10 changed files with 241 additions and 97 deletions

View File

@@ -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<FloorGroupInfo> GroupInstanceList { get; set; } = [];
public List<FloorDimensionInfo> DimensionList { get; set; } = [];
[JsonProperty(ItemConverterType = typeof(StringEnumConverter))] public List<LevelFeatureTypeEnum> LevelFeatureModules { get; set; } = [];
[JsonConverter(typeof(ConcurrentBagConverter<int>))]
public ConcurrentBag<int> MapSections = [];

View File

@@ -0,0 +1,9 @@
namespace EggLink.DanhengServer.Enums.Scene;
public enum LevelFeatureTypeEnum
{
Unknown = 0,
RotatableRegion = 1,
HeartDial = 2,
EraFlipper = 3
}

View File

@@ -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]));

View File

@@ -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));
}
}

View File

@@ -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!));
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<int> AllowedFloorIdList { get; set; } = [80601001, 80602001, 80603001, 80604001];
public static List<RogueTournRoomConfig> 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<RogueTournRoomTypeEnum, List<int>> 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<int> contentGroupIds, RogueTournRoomTypeEnum type)
{
SavedRoomInstanceList.Add(new RogueTournRoomConfig
{
AnchorGroup = baseGroupId,
AnchorId = 1,
DefaultLoadBasicGroup = { areaGroupId, baseGroupId},
DefaultLoadGroup = contentGroupIds,
EntranceId = entranceId,
RoomType = type,
});
}
}

View File

@@ -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
{