diff --git a/Common/Configuration/ConfigContainer.cs b/Common/Configuration/ConfigContainer.cs index 21dba3ff..3c12005e 100644 --- a/Common/Configuration/ConfigContainer.cs +++ b/Common/Configuration/ConfigContainer.cs @@ -46,6 +46,7 @@ namespace EggLink.DanhengServer.Configuration public string ConfigPath { get; set; } = "Config"; public string DatabasePath { get; set; } = "Config/Database"; public string LogPath { get; set; } = "Logs"; + public string PluginPath { get; set; } = "Plugins"; } public class DatabaseConfig diff --git a/Common/Data/Excel/StageConfigExcel.cs b/Common/Data/Excel/StageConfigExcel.cs index 093f8ef0..81cb99a3 100644 --- a/Common/Data/Excel/StageConfigExcel.cs +++ b/Common/Data/Excel/StageConfigExcel.cs @@ -9,6 +9,7 @@ namespace EggLink.DanhengServer.Data.Excel public int StageID { get; set; } = 0; public HashName StageName { get; set; } = new HashName(); public List MonsterList { get; set; } = []; + public List TrialAvatarList { get; set; } = []; public override int GetId() diff --git a/Common/Data/ResourceEntity.cs b/Common/Data/ResourceEntity.cs index f560f3e5..185b6e90 100644 --- a/Common/Data/ResourceEntity.cs +++ b/Common/Data/ResourceEntity.cs @@ -4,7 +4,7 @@ namespace EggLink.DanhengServer.Data { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] - internal class ResourceEntity : Attribute + public class ResourceEntity : Attribute { public List FileName { get; private set; } diff --git a/Common/Database/DatabaseHelper.cs b/Common/Database/DatabaseHelper.cs index a13020f5..c9c3e990 100644 --- a/Common/Database/DatabaseHelper.cs +++ b/Common/Database/DatabaseHelper.cs @@ -278,7 +278,8 @@ namespace EggLink.DanhengServer.Database try { var prev = DateTime.Now; - foreach (var uid in ToSaveUidList) + var list = ToSaveUidList.ToList(); // copy the list to avoid the exception + foreach (var uid in list) { var value = UidInstanceMap[uid]; var baseType = typeof(BaseDatabaseDataHelper); diff --git a/GameServer/Command/Cmd/CommandAvatar.cs b/GameServer/Command/Cmd/CommandAvatar.cs index 46225736..3338c135 100644 --- a/GameServer/Command/Cmd/CommandAvatar.cs +++ b/GameServer/Command/Cmd/CommandAvatar.cs @@ -176,7 +176,7 @@ namespace EggLink.DanhengServer.Command.Cmd var level = arg.GetInt(1); if (level < 1 || level > 80) { - arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.InvalidLevel", I18nManager.Translate("Word.Level"))); + arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.InvalidLevel", I18nManager.Translate("Word.Avatar"))); return; } @@ -187,7 +187,7 @@ namespace EggLink.DanhengServer.Command.Cmd avatar.Level = Math.Min(level, 80); avatar.Promotion = GameData.GetMinPromotionForLevel(avatar.Level); }); - arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.AllAvatarsLevelSet", I18nManager.Translate("Word.Level"), level.ToString())); + arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.AllAvatarsLevelSet", I18nManager.Translate("Word.Avatar"), level.ToString())); // sync arg.Target.SendPacket(new PacketPlayerSyncScNotify(arg.Target.Player!.AvatarManager.AvatarData.Avatars)); @@ -206,7 +206,7 @@ namespace EggLink.DanhengServer.Command.Cmd // sync arg.Target.SendPacket(new PacketPlayerSyncScNotify(avatar)); - arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.AvatarLevelSet", avatar.Excel?.Name ?? id.ToString(), I18nManager.Translate("Word.Level"), level.ToString())); + arg.SendMsg(I18nManager.Translate("Game.Command.Avatar.AvatarLevelSet", avatar.Excel?.Name ?? id.ToString(), I18nManager.Translate("Word.Avatar"), level.ToString())); } } } diff --git a/GameServer/Game/Battle/BattleInstance.cs b/GameServer/Game/Battle/BattleInstance.cs index 8924ffb4..85217483 100644 --- a/GameServer/Game/Battle/BattleInstance.cs +++ b/GameServer/Game/Battle/BattleInstance.cs @@ -84,6 +84,101 @@ namespace EggLink.DanhengServer.Game.Battle BattleTargets[key].BGNPEBHGELB.Add(battleTarget); } + public Dictionary GetBattleAvatars() + { + var excel = GameData.StageConfigData[StageId]; + if (excel.TrialAvatarList.Count > 0) + { + var list = new List(); + list.AddRange(excel.TrialAvatarList); + + if (Player.Data.CurrentGender == Gender.Man) + { + foreach (var avatar in excel.TrialAvatarList) + { + if (avatar.ToString().EndsWith("8002")) + { + list.Remove(avatar); + } + if (avatar.ToString().EndsWith("8004")) + { + list.Remove(avatar); + } + if (avatar.ToString().EndsWith("8006")) + { + list.Remove(avatar); + } + } + } else + { + foreach (var avatar in excel.TrialAvatarList) + { + if (avatar.ToString().EndsWith("8001")) + { + list.Remove(avatar); + } + if (avatar.ToString().EndsWith("8003")) + { + list.Remove(avatar); + } + if (avatar.ToString().EndsWith("8005")) + { + list.Remove(avatar); + } + } + } + + Dictionary dict = []; + foreach (var avatar in list) + { + GameData.SpecialAvatarData.TryGetValue(avatar * 10 + Player.Data.WorldLevel, out var specialAvatar); + if (specialAvatar != null) + { + dict.Add(specialAvatar.ToAvatarData(Player.Uid), AvatarType.AvatarTrialType); + } + } + + return dict; + } + else + { + Dictionary dict = []; + foreach (var avatar in Lineup.BaseAvatars!) + { + AvatarInfo? avatarInstance = null; + AvatarType avatarType = AvatarType.AvatarFormalType; + + if (avatar.AssistUid != 0) + { + var player = DatabaseHelper.Instance!.GetInstance(avatar.AssistUid); + if (player != null) + { + avatarInstance = player.Avatars!.Find(item => item.GetAvatarId() == avatar.BaseAvatarId); + avatarType = AvatarType.AvatarAssistType; + } + } + else if (avatar.SpecialAvatarId != 0) + { + GameData.SpecialAvatarData.TryGetValue(avatar.SpecialAvatarId, out var specialAvatar); + if (specialAvatar != null) + { + avatarInstance = specialAvatar.ToAvatarData(Player.Uid); + avatarType = AvatarType.AvatarTrialType; + } + } + else + { + avatarInstance = Player.AvatarManager!.GetAvatar(avatar.BaseAvatarId); + } + if (avatarInstance == null) continue; + + dict.Add(avatarInstance, avatarType); + } + + return dict; + } + } + public SceneBattleInfo ToProto() { var proto = new SceneBattleInfo() @@ -108,33 +203,9 @@ namespace EggLink.DanhengServer.Game.Battle proto.MonsterWaveList.AddRange(protoWave); } - foreach (var avatar in Lineup.BaseAvatars!) + foreach (var avatar in GetBattleAvatars()) { - AvatarInfo? avatarInstance = null; - var avatarType = AvatarType.AvatarFormalType; - if (avatar.AssistUid != 0) - { - var player = DatabaseHelper.Instance!.GetInstance(avatar.AssistUid); - if (player != null) - { - avatarInstance = player.Avatars!.Find(item => item.GetAvatarId() == avatar.BaseAvatarId); - avatarType = AvatarType.AvatarAssistType; - } - } else if (avatar.SpecialAvatarId != 0) - { - GameData.SpecialAvatarData.TryGetValue(avatar.SpecialAvatarId, out var specialAvatar); - if (specialAvatar != null) - { - avatarInstance = specialAvatar.ToAvatarData(Player.Uid); - avatarType = AvatarType.AvatarTrialType; - } - } else - { - avatarInstance = Player.AvatarManager!.GetAvatar(avatar.BaseAvatarId); - } - if (avatarInstance == null) continue; - - proto.BattleAvatarList.Add(avatarInstance.ToBattleProto(Player.LineupManager!.GetCurLineup()!, Player.InventoryManager!.Data, avatarType)); + proto.BattleAvatarList.Add(avatar.Key.ToBattleProto(Player.LineupManager!.GetCurLineup()!, Player.InventoryManager!.Data, avatar.Value)); } foreach (var monster in EntityMonsters) diff --git a/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs b/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs index 2c37f394..d7ae93a0 100644 --- a/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs +++ b/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs @@ -13,7 +13,15 @@ namespace EggLink.DanhengServer.Game.Mission.FinishAction.Handler { public override void OnHandle(List Params, List ParamString, PlayerInstance Player) { - // TODO + _ = int.TryParse(ParamString[1], out var floor); + Player.SceneData!.FloorSavedData.TryGetValue(floor, out var value); + if (value == null) + { + value = []; + Player.SceneData.FloorSavedData[floor] = value; + } + + value[ParamString[2]] = Params[3]; // ParamString[2] is the key } } } diff --git a/GameServer/Game/Mission/MissionManager.cs b/GameServer/Game/Mission/MissionManager.cs index 7bc5de45..0104e02c 100644 --- a/GameServer/Game/Mission/MissionManager.cs +++ b/GameServer/Game/Mission/MissionManager.cs @@ -6,6 +6,8 @@ using EggLink.DanhengServer.Enums; using EggLink.DanhengServer.Game.Mission.FinishAction; using EggLink.DanhengServer.Game.Mission.FinishType; using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Plugin.Event; +using EggLink.DanhengServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.Server.Packet.Send.Mission; using EggLink.DanhengServer.Server.Packet.Send.Player; using EggLink.DanhengServer.Server.Packet.Send.Scene; @@ -129,6 +131,29 @@ namespace EggLink.DanhengServer.Game.Mission return AcceptMainMission(missionId, sendPacket); } + public void RemoveMainMission(int missionId) + { + if (!ConfigManager.Config.ServerOption.EnableMission) return; + Data.SetMainMissionStatus(missionId, MissionPhaseEnum.None); + + GameData.MainMissionData.TryGetValue(missionId, out var mission); + if (mission == null) return; + + Proto.MissionSync sync = new(); + + foreach (var subMission in mission.SubMissionIds) + { + Data.SetSubMissionStatus(subMission, MissionPhaseEnum.None); + sync.MissionList.Add(new Proto.Mission() + { + Id = (uint)subMission, + Status = Proto.MissionStatus.MissionNone, + }); + } + + Player.SendPacket(new PacketPlayerSyncScNotify(sync)); + } + public void AcceptSubMission(int missionId) { if (!ConfigManager.Config.ServerOption.EnableMission) return; @@ -156,10 +181,15 @@ namespace EggLink.DanhengServer.Game.Mission Player.SceneInstance!.SyncGroupInfo(); if (mission.SubMissionInfo != null) { - FinishTypeHandlers.TryGetValue(mission.SubMissionInfo.FinishType, out var handler); - handler?.Init(Player, mission.SubMissionInfo, null); - if (doFinishTypeAction) - handler?.HandleFinishType(Player, mission.SubMissionInfo, null); + try + { + FinishTypeHandlers.TryGetValue(mission.SubMissionInfo.FinishType, out var handler); + handler?.Init(Player, mission.SubMissionInfo, null); + if (doFinishTypeAction) + handler?.HandleFinishType(Player, mission.SubMissionInfo, null); + } catch + { + } } if (SkipSubMissionList.Contains(missionId)) @@ -234,7 +264,11 @@ namespace EggLink.DanhengServer.Game.Mission if (missionId == 1021301) { Player.LineupManager!.SetExtraLineup(Proto.ExtraLineupType.LineupHeliobus, [1021213]); + Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); + Player.SceneInstance!.SyncLineup(); } + + PluginEvent.InvokeOnPlayerFinishMainMission(Player, missionId); } public void FinishSubMission(int missionId) @@ -337,10 +371,7 @@ namespace EggLink.DanhengServer.Game.Mission FinishSubMission(100040119); } - if (missionId == 102130113) - { - Player.LineupManager!.SetExtraLineup(Proto.ExtraLineupType.LineupHeliobus, [1021213, 1021205]); - } + PluginEvent.InvokeOnPlayerFinishSubMission(Player, missionId); } public void HandleFinishAction(Data.Config.MissionInfo info, int subMissionId) diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 36309069..a2b7025c 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -32,6 +32,8 @@ using EggLink.DanhengServer.Server.Packet.Send.Avatar; using System.Numerics; using EggLink.DanhengServer.Game.Challenge; using EggLink.DanhengServer.Game.Drop; +using static EggLink.DanhengServer.Plugin.Event.PluginEvent; +using EggLink.DanhengServer.Plugin.Event; namespace EggLink.DanhengServer.Game.Player { @@ -189,6 +191,7 @@ namespace EggLink.DanhengServer.Game.Player SendPacket(new PacketStaminaInfoScNotify(this)); + InvokeOnPlayerLogin(this); } public void OnLogoutAsync() @@ -198,6 +201,8 @@ namespace EggLink.DanhengServer.Game.Player EnterScene(OldEntryId, 0, false); MoveTo(LastPos!, LastRot!); } + + InvokeOnPlayerLogout(this); } public void SendPacket(BasePacket packet) @@ -303,6 +308,8 @@ namespace EggLink.DanhengServer.Game.Player { OnStaminaRecover(); + InvokeOnPlayerHeartBeat(this); + DatabaseHelper.ToSaveUidList.SafeAdd(Uid); } @@ -404,6 +411,9 @@ namespace EggLink.DanhengServer.Game.Player // plane event InventoryManager!.HandlePlaneEvent(prop.PropInfo.EventID); + // handle plugin event + InvokeOnPlayerInteract(this, prop); + return prop; } } diff --git a/GameServer/Game/Scene/SceneEntityLoader.cs b/GameServer/Game/Scene/SceneEntityLoader.cs index 8651ba0f..1af03a5e 100644 --- a/GameServer/Game/Scene/SceneEntityLoader.cs +++ b/GameServer/Game/Scene/SceneEntityLoader.cs @@ -253,17 +253,13 @@ namespace EggLink.DanhengServer.Game.Scene // load from database var propData = Scene.Player.GetScenePropData(Scene.FloorId, group.Id, info.ID); - if (propData != null) + if (propData != null && Scene.Excel.PlaneType != PlaneTypeEnum.Raid) // raid is not saved { prop.State = propData.State; } else { prop.State = info.State; - //if (excel.PropStateList.Contains(PropStateEnum.Closed) && info.State == PropStateEnum.Locked) - //{ - // prop.SetState(PropStateEnum.Closed); - //} } return prop; } diff --git a/GameServer/GameServer.csproj b/GameServer/GameServer.csproj index f81bb81d..4dc7898e 100644 --- a/GameServer/GameServer.csproj +++ b/GameServer/GameServer.csproj @@ -8,6 +8,7 @@ EggLink.DanhengServer EggLink.DanhengServer.Program.EntryPoint true + DanhengServer diff --git a/GameServer/Plugin/Constructor/IPlugin.cs b/GameServer/Plugin/Constructor/IPlugin.cs new file mode 100644 index 00000000..76c927ef --- /dev/null +++ b/GameServer/Plugin/Constructor/IPlugin.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Plugin.Constructor +{ + public interface IPlugin + { + public void OnLoad(); + public void OnUnload(); + } +} diff --git a/GameServer/Plugin/Event/PluginEvent.cs b/GameServer/Plugin/Event/PluginEvent.cs new file mode 100644 index 00000000..fc100c61 --- /dev/null +++ b/GameServer/Plugin/Event/PluginEvent.cs @@ -0,0 +1,70 @@ +using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Game.Scene.Entity; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Plugin.Event +{ + public static class PluginEvent + { + #region Player + + public delegate void OnPlayerHeartBeatHandler(PlayerInstance player); + public delegate void OnPlayerLoginHandler(PlayerInstance player); + public delegate void OnPlayerLogoutHandler(PlayerInstance player); + public delegate void OnPlayerFinishSubMissionHandler(PlayerInstance player, int missionId); + public delegate void OnPlayerFinishMainMissionHandler(PlayerInstance player, int missionId); + public delegate void OnPlayerInteractHandler(PlayerInstance player, EntityProp prop); + + #endregion + + #region Common + + + #endregion + + #region Event + + public static event OnPlayerHeartBeatHandler? OnPlayerHeartBeat; + public static event OnPlayerLoginHandler? OnPlayerLogin; + public static event OnPlayerLogoutHandler? OnPlayerLogout; + public static event OnPlayerFinishSubMissionHandler? OnPlayerFinishSubMission; + public static event OnPlayerFinishMainMissionHandler? OnPlayerFinishMainMission; + public static event OnPlayerInteractHandler? OnPlayerInteract; + + #endregion + + public static void InvokeOnPlayerHeartBeat(PlayerInstance player) + { + OnPlayerHeartBeat?.Invoke(player); + } + + public static void InvokeOnPlayerLogin(PlayerInstance player) + { + OnPlayerLogin?.Invoke(player); + } + + public static void InvokeOnPlayerLogout(PlayerInstance player) + { + OnPlayerLogout?.Invoke(player); + } + + public static void InvokeOnPlayerFinishSubMission(PlayerInstance player, int missionId) + { + OnPlayerFinishSubMission?.Invoke(player, missionId); + } + + public static void InvokeOnPlayerFinishMainMission(PlayerInstance player, int missionId) + { + OnPlayerFinishMainMission?.Invoke(player, missionId); + } + + public static void InvokeOnPlayerInteract(PlayerInstance player, EntityProp prop) + { + OnPlayerInteract?.Invoke(player, prop); + } + } +} diff --git a/GameServer/Plugin/PluginManager.cs b/GameServer/Plugin/PluginManager.cs new file mode 100644 index 00000000..66ba4c90 --- /dev/null +++ b/GameServer/Plugin/PluginManager.cs @@ -0,0 +1,108 @@ +using EggLink.DanhengServer.Plugin.Constructor; +using EggLink.DanhengServer.Util; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Plugin +{ + public class PluginManager + { + private readonly static Logger logger = new("PluginManager"); + public readonly static List Plugins = []; + + public readonly static Dictionary> PluginAssemblies = []; + + public static void LoadPlugins() + { + // get all the plugins in the plugin directory + if (!Directory.Exists(ConfigManager.Config.Path.PluginPath)) + { + Directory.CreateDirectory(ConfigManager.Config.Path.PluginPath); + } + + var plugins = Directory.GetFiles(ConfigManager.Config.Path.PluginPath, "*.dll"); + foreach (var plugin in plugins) + { + var fileInfo = new FileInfo(plugin); + LoadPlugin(fileInfo.FullName); + } + + logger.Info($"Loaded {Plugins.Count} plugins"); + } + + public static void LoadPlugin(string plugin) + { + try + { + var assembly = Assembly.LoadFile(plugin); + var types = assembly.GetTypes(); + + bool isPlugin = false; + foreach (var type in types) + { + if (type.GetInterface("IPlugin") != null) + { + if (Activator.CreateInstance(type) is IPlugin pluginInstance) + { + pluginInstance.OnLoad(); + Plugins.Add(pluginInstance); + + if (!PluginAssemblies.TryGetValue(pluginInstance, out List? value)) + { + value = new List(); + PluginAssemblies[pluginInstance] = value; + } + + value.AddRange(types); + + isPlugin = true; + break; + } + else + { + logger.Error($"Failed to load plugin {plugin}: Plugin instance is null"); + } + } + } + + if (!isPlugin) + { + logger.Error($"Failed to load plugin {plugin}: Plugin does not implement IPlugin"); + } + } + catch (Exception e) + { + logger.Error($"Failed to load plugin {plugin}: {e.Message}"); + } + } + + public static void UnloadPlugins() + { + foreach (var plugin in Plugins) + { + plugin.OnUnload(); + } + + logger.Info("Unloaded all plugins"); + Plugins.Clear(); + } + + public static List GetPluginAssemblies() + { + var assemblies = new List(); + foreach (var plugin in Plugins) + { + if (PluginAssemblies.TryGetValue(plugin, out List? value)) + { + assemblies.AddRange(value); + } + } + + return assemblies; + } + } +} diff --git a/GameServer/Program/EntryPoint.cs b/GameServer/Program/EntryPoint.cs index a1b987ff..fb682918 100644 --- a/GameServer/Program/EntryPoint.cs +++ b/GameServer/Program/EntryPoint.cs @@ -10,6 +10,7 @@ using Newtonsoft.Json; using EggLink.DanhengServer.Command; using EggLink.DanhengServer.Handbook; using EggLink.DanhengServer.Internationalization; +using EggLink.DanhengServer.Plugin; namespace EggLink.DanhengServer.Program { @@ -75,6 +76,18 @@ namespace EggLink.DanhengServer.Program return; } + // Load the plugins + logger.Info("Loading plugins..."); + try + { + PluginManager.LoadPlugins(); + } catch (Exception e) + { + logger.Error("Failed to load plugins", e); + Console.ReadLine(); + return; + } + // Load the game data logger.Info("Loading game data..."); try @@ -147,6 +160,7 @@ namespace EggLink.DanhengServer.Program private static void PerformCleanup() { + PluginManager.UnloadPlugins(); Listener.Connections.Values.ToList().ForEach(x => x.Stop()); DatabaseHelper.SaveThread?.Interrupt(); diff --git a/GameServer/Server/Packet/Send/Scene/HandlerDeactivateFarmElementCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerDeactivateFarmElementCsReq.cs similarity index 83% rename from GameServer/Server/Packet/Send/Scene/HandlerDeactivateFarmElementCsReq.cs rename to GameServer/Server/Packet/Recv/Scene/HandlerDeactivateFarmElementCsReq.cs index 3dfa7f23..20205504 100644 --- a/GameServer/Server/Packet/Send/Scene/HandlerDeactivateFarmElementCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerDeactivateFarmElementCsReq.cs @@ -1,11 +1,12 @@ using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Server.Packet.Send.Scene; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -namespace EggLink.DanhengServer.Server.Packet.Send.Scene +namespace EggLink.DanhengServer.Server.Packet.Recv.Scene { [Opcode(CmdIds.DeactivateFarmElementCsReq)] public class HandlerDeactivateFarmElementCsReq : Handler diff --git a/GameServer/Server/Packet/Recv/Scene/HandlerStartRaidCsReq.cs b/GameServer/Server/Packet/Recv/Scene/HandlerStartRaidCsReq.cs index f7de59b5..a4cc5fb6 100644 --- a/GameServer/Server/Packet/Recv/Scene/HandlerStartRaidCsReq.cs +++ b/GameServer/Server/Packet/Recv/Scene/HandlerStartRaidCsReq.cs @@ -63,9 +63,11 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Scene raidConfig.MainMissionIDList.ForEach(missionId => { - player.MissionManager!.ReAcceptMainMission(missionId); + player.MissionManager!.RemoveMainMission(missionId); }); + player.MissionManager!.AcceptMainMission(raidConfig.MainMissionIDList[0]); + connection.SendPacket(CmdIds.StartRaidScRsp); } } diff --git a/WebServer/Handler/QueryGatewayHandler.cs b/WebServer/Handler/QueryGatewayHandler.cs index c9fd385a..5686e3be 100644 --- a/WebServer/Handler/QueryGatewayHandler.cs +++ b/WebServer/Handler/QueryGatewayHandler.cs @@ -26,23 +26,23 @@ namespace EggLink.DanhengServer.Server.Http.Handler B5 = true, }; - if (urlData.AssetBundleUrl != null) + if (urlData.AssetBundleUrl != null && urlData.AssetBundleUrl.Length > 0) { gateServer.AssetBundleUrl = urlData.AssetBundleUrl; } - if (urlData.ExResourceUrl != null) + if (urlData.ExResourceUrl != null && urlData.ExResourceUrl.Length > 0) { gateServer.ExResourceUrl = urlData.ExResourceUrl; } - if (urlData.LuaUrl != null) + if (urlData.LuaUrl != null && urlData.LuaUrl.Length > 0) { gateServer.LuaUrl = urlData.LuaUrl; gateServer.MdkResVersion = urlData.LuaUrl.Split('/')[^1].Split('_')[1]; } - if (urlData.IfixUrl != null) + if (urlData.IfixUrl != null && urlData.IfixUrl.Length > 0) { gateServer.IfixUrl = urlData.IfixUrl; gateServer.IfixVersion = urlData.IfixUrl.Split('/')[^1].Split('_')[1];