diff --git a/Common/Data/Excel/RogueTournMiracleExcel.cs b/Common/Data/Excel/RogueTournMiracleExcel.cs new file mode 100644 index 00000000..926e980d --- /dev/null +++ b/Common/Data/Excel/RogueTournMiracleExcel.cs @@ -0,0 +1,30 @@ +using EggLink.DanhengServer.Enums.TournRogue; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace EggLink.DanhengServer.Data.Excel; + +[ResourceEntity("RogueTournMiracle.json")] +public class RogueTournMiracleExcel : ExcelResource +{ + public int MiracleID { get; set; } + public int MiracleDisplayID { get; set; } + public int HandbookMiracleID { get; set; } + public int MiracleEffectDisplayID { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public RogueTournModeEnum TournMode { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public RogueTournMiracleCategoryEnum MiracleCategory { get; set; } + + public override int GetId() + { + return MiracleID; + } + + public override void Loaded() + { + GameData.RogueTournMiracleData.TryAdd(MiracleID, this); + } +} \ No newline at end of file diff --git a/Common/Data/GameData.cs b/Common/Data/GameData.cs index c3c78428..257fd240 100644 --- a/Common/Data/GameData.cs +++ b/Common/Data/GameData.cs @@ -325,6 +325,7 @@ public static class GameData public static Dictionary RogueTournWorkbenchData { get; private set; } = []; public static Dictionary RogueTournWorkbenchFuncData { get; private set; } = []; public static Dictionary RogueTournFormulaData { get; private set; } = []; + public static Dictionary RogueTournMiracleData { get; private set; } = []; public static Dictionary RogueTournTitanTalentData { get; private set; } = []; public static Dictionary diff --git a/Common/Enums/Rogue/RogueEventActionTypeEnum.cs b/Common/Enums/Rogue/RogueEventActionTypeEnum.cs index 684e45b8..08a572da 100644 --- a/Common/Enums/Rogue/RogueEventActionTypeEnum.cs +++ b/Common/Enums/Rogue/RogueEventActionTypeEnum.cs @@ -25,5 +25,8 @@ public enum RogueEventActionTypeEnum ActionGetBuffInFormula, ActionEnhanceAllBuff, ActionGetBuffInFormulaUntilExpandAll, - ActionAddFormulaAndExpand + ActionAddFormulaAndExpand, + ActionDropMiracle, + ActionDropBuff, + ActionAddDialogueEvent } \ No newline at end of file diff --git a/Common/Enums/Rogue/RogueEventConditionTypeEnum.cs b/Common/Enums/Rogue/RogueEventConditionTypeEnum.cs index ee23c684..8589a86f 100644 --- a/Common/Enums/Rogue/RogueEventConditionTypeEnum.cs +++ b/Common/Enums/Rogue/RogueEventConditionTypeEnum.cs @@ -5,5 +5,7 @@ public enum RogueEventConditionTypeEnum CondNone = 0, CondCheckMoney, CondHasAvatar, - CondLineupHasAvatar + CondLineupHasAvatar, + CondHasMiracle, + CondHasBuff } \ No newline at end of file diff --git a/Common/Enums/TournRogue/RogueTournMiracleCategoryEnum.cs b/Common/Enums/TournRogue/RogueTournMiracleCategoryEnum.cs new file mode 100644 index 00000000..03a7f5e7 --- /dev/null +++ b/Common/Enums/TournRogue/RogueTournMiracleCategoryEnum.cs @@ -0,0 +1,11 @@ +namespace EggLink.DanhengServer.Enums.TournRogue; + +public enum RogueTournMiracleCategoryEnum +{ + None = 0, + Common, + Rare, + Legendary, + Negative, + Hex +} \ No newline at end of file diff --git a/Common/Util/RandomList.cs b/Common/Util/RandomList.cs index 85eb559f..38e05762 100644 --- a/Common/Util/RandomList.cs +++ b/Common/Util/RandomList.cs @@ -6,7 +6,7 @@ /// public class RandomList { - private readonly List _List = []; + private readonly List _list = []; public RandomList() { @@ -14,21 +14,21 @@ public class RandomList public RandomList(IEnumerable collection) { - _List.AddRange(collection); + _list.AddRange(collection); } public void Add(T item, int weight) { - for (var i = 0; i < weight; i++) _List.Add(item); + for (var i = 0; i < weight; i++) _list.Add(item); } public void Remove(T item) { - var temp = _List.Clone().ToList(); - _List.Clear(); + var temp = _list.Clone().ToList(); + _list.Clear(); foreach (var i in temp) if (i?.Equals(item) == false) - _List.Add(i); + _list.Add(i); } public void AddRange(IEnumerable collection, IEnumerable weights) @@ -39,17 +39,17 @@ public class RandomList public T? GetRandom() { - if (_List.Count == 0) return default; - return _List[Random.Shared.Next(_List.Count)]; + if (_list.Count == 0) return default; + return _list[Random.Shared.Next(_list.Count)]; } public void Clear() { - _List.Clear(); + _list.Clear(); } public int GetCount() { - return _List.Count; + return _list.Count; } } \ No newline at end of file diff --git a/GameServer/Game/Rogue/BaseRogueInstance.cs b/GameServer/Game/Rogue/BaseRogueInstance.cs index f2eab853..6dc9f459 100644 --- a/GameServer/Game/Rogue/BaseRogueInstance.cs +++ b/GameServer/Game/Rogue/BaseRogueInstance.cs @@ -143,6 +143,23 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum await UpdateMenu(); } + public virtual async ValueTask RemoveBuffList(List buffIds) + { + List resultList = []; + foreach (var buff in buffIds) + { + var res = await RemoveBuff(buff, displayType: RogueCommonActionResultDisplayType.Multi, updateMenu: false, + notify: false); + + if (res != null) resultList.Add(res); + } + + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, resultList, + RogueCommonActionResultDisplayType.Multi)); + + await UpdateMenu(); + } + public virtual async ValueTask EnhanceBuff(int buffId, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Dialogue) { @@ -392,19 +409,41 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum new PacketHandleRogueCommonPendingActionScRsp(action.QueuePosition, location, selectMiracle: true)); } - public virtual async ValueTask AddMiracle(int miracleId) + public virtual async ValueTask AddMiracle(int miracleId, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select) { if (RogueMiracles.ContainsKey(miracleId)) return; GameData.RogueMiracleData.TryGetValue(miracleId, out var excel); - if (excel == null) return; + GameData.RogueTournMiracleData.TryGetValue(miracleId, out var excelT); + if (excel == null && excelT == null) return; var miracle = new RogueMiracleInstance(this, miracleId); RogueMiracles.Add(miracleId, miracle); - await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, miracle.ToGetResult(), + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, miracle.ToGetResult(source), RogueCommonActionResultDisplayType.Single)); } + public virtual async ValueTask AddMiracleList(List miracleIds, RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select) + { + List res = []; + + foreach (var miracleId in miracleIds) + { + if (RogueMiracles.ContainsKey(miracleId)) return; + + GameData.RogueMiracleData.TryGetValue(miracleId, out var excel); + GameData.RogueTournMiracleData.TryGetValue(miracleId, out var excelT); + if (excel == null && excelT == null) return; + + var miracle = new RogueMiracleInstance(this, miracleId); + RogueMiracles.Add(miracleId, miracle); + + res.Add(miracle.ToGetResult(source)); + } + await Player.SendPacket(new PacketSyncRogueCommonActionResultScNotify(RogueSubMode, res, + RogueCommonActionResultDisplayType.Multi)); + } + #endregion #region Actions @@ -483,26 +522,48 @@ public abstract class BaseRogueInstance(PlayerInstance player, RogueSubModeEnum { RogueDialogueEventConfig? dialogue = null; + RandomList randomList = new(); switch (RogueSubMode) { case RogueSubModeEnum.CosmosRogue: case RogueSubModeEnum.CosmosRogueEndless: - dialogue = GameData.CosmosRogueDialogueEventConfig.Values.ToList().RandomElement(); + foreach (var e in GameData.CosmosRogueDialogueEventConfig.Values.ToList()) + { + randomList.Add(e, e.Weight); + } + break; case RogueSubModeEnum.TournRogue: - dialogue = GameData.TournRogueDialogueEventConfig.Values.ToList().RandomElement(); + foreach (var e in GameData.TournRogueDialogueEventConfig.Values.ToList()) + { + randomList.Add(e, e.Weight); + } + break; case RogueSubModeEnum.ChessRogue: - dialogue = GameData.SwarmRogueDialogueEventConfig.Values.ToList().RandomElement(); + foreach (var e in GameData.SwarmRogueDialogueEventConfig.Values.ToList()) + { + randomList.Add(e, e.Weight); + } break; + case RogueSubModeEnum.ChessRogueNous: - dialogue = GameData.NousRogueDialogueEventConfig.Values.ToList().RandomElement(); + foreach (var e in GameData.NousRogueDialogueEventConfig.Values.ToList()) + { + randomList.Add(e, e.Weight); + } + break; case RogueSubModeEnum.MagicRogue: - dialogue = GameData.MagicRogueDialogueEventConfig.Values.ToList().RandomElement(); + foreach (var e in GameData.MagicRogueDialogueEventConfig.Values.ToList()) + { + randomList.Add(e, e.Weight); + } + break; } + if (randomList.GetCount() > 0) dialogue = randomList.GetRandom(); if (dialogue == null) throw new Exception("No dialogue event config found for rogue mode " + RogueSubMode); var instance = new RogueEventInstance(dialogue, npc, CurEventUniqueId++); diff --git a/GameServer/Game/Rogue/Event/RogueEventActionExecutor.cs b/GameServer/Game/Rogue/Event/RogueEventActionExecutor.cs index 3821e96c..fc44d014 100644 --- a/GameServer/Game/Rogue/Event/RogueEventActionExecutor.cs +++ b/GameServer/Game/Rogue/Event/RogueEventActionExecutor.cs @@ -6,6 +6,10 @@ using EggLink.DanhengServer.GameServer.Game.RogueTourn; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; using Newtonsoft.Json.Linq; using SqlSugar; +using System.Linq; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Util; namespace EggLink.DanhengServer.GameServer.Game.Rogue.Event; @@ -94,7 +98,15 @@ public static class RogueEventActionExecutor case RogueEventActionTypeEnum.ActionAddFormulaAndExpand: await ActionAddFormulaAndExpand(rogue, eventInst, actionData); break; - case RogueEventActionTypeEnum.ActionNone: + case RogueEventActionTypeEnum.ActionDropMiracle: + await ActionDropMiracle(rogue, eventInst, actionData); + break; + case RogueEventActionTypeEnum.ActionDropBuff: + await ActionDropBuff(rogue, eventInst, actionData); + break; + case RogueEventActionTypeEnum.ActionAddDialogueEvent: + await ActionAddDialogueEvent(rogue, eventInst, actionData); + break; default: break; } @@ -171,18 +183,24 @@ public static class RogueEventActionExecutor { var hpChangeByCurHp = Convert.ToInt32(actionData.Param.GetValueOrDefault("HpChangeByCurHp", 0)); var hpChange = Convert.ToInt32(actionData.Param.GetValueOrDefault("HpChange", 0)); + var spChange = Convert.ToInt32(actionData.Param.GetValueOrDefault("SpChange", 0)); + var mpChange = Convert.ToInt32(actionData.Param.GetValueOrDefault("MpChange", 0)); foreach (var formalAvatar in rogue.Player.AvatarManager!.AvatarData.FormalAvatars) { if (hpChange != 0) formalAvatar.ExtraLineupHp = hpChange; - if (hpChangeByCurHp != 0) - { - formalAvatar.ExtraLineupHp = (int)Math.Ceiling(formalAvatar.ExtraLineupHp * (-hpChangeByCurHp / 10000d)); - } + if (hpChangeByCurHp != 0) formalAvatar.ExtraLineupHp = (int)Math.Ceiling(formalAvatar.ExtraLineupHp * ((10000 + hpChangeByCurHp) / 10000d)); + + if (spChange != 0) + formalAvatar.ExtraLineupSp = Math.Max(Math.Min(formalAvatar.ExtraLineupSp + spChange, 0), 10000); } + var curLineup = rogue.Player.LineupManager!.GetCurLineup()!; + if (mpChange != 0) + curLineup.Mp = Math.Max(Math.Min(0, curLineup.Mp + mpChange), rogue.Player.LineupManager!.GetMaxMp()); + // sync await rogue.Player.SendPacket(new PacketSyncLineupNotify(rogue.Player.LineupManager!.GetCurLineup()!)); } @@ -190,7 +208,21 @@ public static class RogueEventActionExecutor private static async ValueTask ActionRemoveBuff(BaseRogueInstance rogue, RogueEventInstance eventInst, RogueDialogueEventActionData actionData) { - // TODO select buff to remove + var count = Convert.ToInt32(actionData.Param.GetValueOrDefault("Count", 1)); + var groupId = Convert.ToInt32(actionData.Param.GetValueOrDefault("GroupId", 0)); + if (count <= 0) return; + + var group = GameData.RogueBuffGroupData.GetValueOrDefault(groupId)?.BuffList.Select(x => x.MazeBuffID).ToList(); + if (group == null && groupId != 0) return; + + var ownedBuffs = groupId == 0 || group == null + ? rogue.RogueBuffs.ToList() + : rogue.RogueBuffs.Where(x => group.Contains(x.BuffId)).ToList(); + + if (ownedBuffs.Count == 0) return; + var selectedBuffs = ownedBuffs.OrderBy(_ => Guid.NewGuid()).Take(Math.Min(count, ownedBuffs.Count)).ToList(); // avoid ownedBuffs.Count < count + + await rogue.RemoveBuffList(selectedBuffs.Select(x => x.BuffId).ToList()); } private static async ValueTask ActionInvalidateOption(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -213,7 +245,7 @@ public static class RogueEventActionExecutor var miracleId = Convert.ToInt32(actionData.Param.GetValueOrDefault("MiracleId", 0)); if (miracleId == 0) return; - await rogue.AddMiracle(miracleId); + await rogue.AddMiracle(miracleId, RogueCommonActionResultSourceType.Dialogue); } private static async ValueTask ActionGetBuffInGroup(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -237,7 +269,7 @@ public static class RogueEventActionExecutor { var stageId = Convert.ToInt32(actionData.Param.GetValueOrDefault("StageId", 0)); var winActions = (JArray?)actionData.Param.GetValueOrDefault("WinActions"); // TODO - if (!GameData.PlaneEventData.ContainsKey(stageId)) return; + if (!GameData.PlaneEventData.ContainsKey(stageId * 10 + rogue.Player.Data.WorldLevel)) return; var optionInst = eventInst.Options.Find(x => x.OptionId == eventInst.SelectedOptionId); if (optionInst == null) return; @@ -358,7 +390,7 @@ public static class RogueEventActionExecutor var notOwned = group.Where(x => !owned.Contains(x.MazeBuffID)).ToList(); if (notOwned.Count == 0) return; - await rogue.AddBuffList(notOwned.Take(Math.Min(count, notOwned.Count)).ToList()); + await rogue.AddBuffList(notOwned.OrderBy(_ => Guid.NewGuid()).Take(Math.Min(count, notOwned.Count)).ToList()); } private static async ValueTask ActionGetBuff(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -375,14 +407,32 @@ public static class RogueEventActionExecutor var notOwned = group.Where(x => !owned.Contains(x.MazeBuffID)).ToList(); if (notOwned.Count == 0) return; - await rogue.AddBuffList(notOwned.Take(Math.Min(count, notOwned.Count)).ToList()); + await rogue.AddBuffList(notOwned.OrderBy(_ => Guid.NewGuid()).Take(Math.Min(count, notOwned.Count)).ToList()); } private static async ValueTask ActionGetMiracleByCategory(BaseRogueInstance rogue, RogueEventInstance eventInst, RogueDialogueEventActionData actionData) { - // TODO - await ValueTask.CompletedTask; + var categories = (JArray?)actionData.Param.GetValueOrDefault("Categories"); + var count = Convert.ToInt32(actionData.Param.GetValueOrDefault("Count", 1)); + if (categories == null || categories.Count == 0 || count == 0) return; + List categoryEnums = []; + foreach (var cat in categories) + { + if (Enum.TryParse(cat.ToString(), out RogueTournMiracleCategoryEnum categoryEnum)) + categoryEnums.Add(categoryEnum); + } + + if (categoryEnums.Count == 0) return; + var possibleMiracles = GameData.RogueTournMiracleData.Values + .Where(x => categoryEnums.Contains(x.MiracleCategory) && !rogue.RogueMiracles.ContainsKey(x.MiracleID) && + x.TournMode == RogueTournModeEnum.Tourn2) + .ToList(); + + if (possibleMiracles.Count == 0) return; + var selectedMiracles = possibleMiracles.OrderBy(_ => Guid.NewGuid()).Take(Math.Min(count, possibleMiracles.Count)).ToList(); // avoid possibleMiracles.Count < count + + await rogue.AddMiracleList(selectedMiracles.Select(x => x.MiracleID).ToList(), RogueCommonActionResultSourceType.Dialogue); } private static async ValueTask ActionDropFormula(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -416,10 +466,34 @@ public static class RogueEventActionExecutor var count = Convert.ToInt32(actionData.Param.GetValueOrDefault("Count", 1)); if (count <= 0) return; - if (rogue is RogueTournInstance inst) + if (rogue is not RogueTournInstance inst) return; + + Dictionary typeNumDict = []; + foreach (var excel in inst.RogueFormulas) { - // TODO + typeNumDict.TryAdd(excel.MainBuffTypeID, 0); + typeNumDict.TryAdd(excel.SubBuffTypeID, 0); + + typeNumDict[excel.MainBuffTypeID] = Math.Max(typeNumDict[excel.MainBuffTypeID], excel.MainBuffNum); + typeNumDict[excel.SubBuffTypeID] = Math.Max(typeNumDict[excel.SubBuffTypeID], excel.SubBuffNum); } + + List availableTypes = []; + foreach (var (typeId, num) in typeNumDict) + { + var ownedNum = inst.RogueBuffs.Count(x => x.BuffExcel.RogueBuffType == typeId); + if (ownedNum < num) + availableTypes.Add(typeId); + } + + if (availableTypes.Count == 0) return; + + var owned = rogue.RogueBuffs.Select(x => x.BuffId).ToList(); + var notOwned = GameData.RogueBuffData.Values.Where(x => x is RogueTournBuffExcel) + .Where(x => !owned.Contains(x.MazeBuffID) && availableTypes.Contains(x.RogueBuffType) && x.MazeBuffLevel == 1).ToList(); + if (notOwned.Count == 0) return; + + await rogue.AddBuffList(notOwned.OrderBy(_ => Guid.NewGuid()).Take(Math.Min(count, notOwned.Count)).ToList()); // avoid notOwned.Count < count } private static async ValueTask ActionEnhanceAllBuff(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -433,6 +507,41 @@ public static class RogueEventActionExecutor private static async ValueTask ActionGetBuffInFormulaUntilExpandAll(BaseRogueInstance rogue, RogueEventInstance eventInst, RogueDialogueEventActionData actionData) { + if (rogue is not RogueTournInstance inst) return; + + Dictionary typeNumDict = []; + foreach (var excel in inst.RogueFormulas) + { + typeNumDict.TryAdd(excel.MainBuffTypeID, 0); + typeNumDict.TryAdd(excel.SubBuffTypeID, 0); + + typeNumDict[excel.MainBuffTypeID] = Math.Max(typeNumDict[excel.MainBuffTypeID], excel.MainBuffNum); + typeNumDict[excel.SubBuffTypeID] = Math.Max(typeNumDict[excel.SubBuffTypeID], excel.SubBuffNum); + } + + List availableTypes = []; + foreach (var (typeId, num) in typeNumDict) + { + var ownedNum = inst.RogueBuffs.Count(x => x.BuffExcel.RogueBuffType == typeId); + if (ownedNum < num) + availableTypes.Add(typeId); + } + + if (availableTypes.Count == 0) return; + + var owned = rogue.RogueBuffs.Select(x => x.BuffId).ToList(); + var notOwned = GameData.RogueBuffData.Values.Where(x => x is RogueTournBuffExcel) + .Where(x => !owned.Contains(x.MazeBuffID) && availableTypes.Contains(x.RogueBuffType) && x.MazeBuffLevel == 1).ToList(); + if (notOwned.Count == 0) return; + + while (inst.ExpandedFormulaIdList.Count < inst.RogueFormulas.Count) + { + var add = notOwned.RandomElement(); + await inst.AddBuff(add.MazeBuffID); + + notOwned.Remove(add); + if (notOwned.Count == 0) break; + } } private static async ValueTask ActionAddFormulaAndExpand(BaseRogueInstance rogue, RogueEventInstance eventInst, @@ -454,4 +563,27 @@ public static class RogueEventActionExecutor // TODO expand it } + + private static async ValueTask ActionDropMiracle(BaseRogueInstance rogue, RogueEventInstance eventInst, + RogueDialogueEventActionData actionData) + { + await ValueTask.CompletedTask; + } + + private static async ValueTask ActionDropBuff(BaseRogueInstance rogue, RogueEventInstance eventInst, + RogueDialogueEventActionData actionData) + { + // TODO select buff to remove + await ValueTask.CompletedTask; + } + + private static async ValueTask ActionAddDialogueEvent(BaseRogueInstance rogue, RogueEventInstance eventInst, + RogueDialogueEventActionData actionData) + { + var eventId = Convert.ToInt32(actionData.Param.GetValueOrDefault("EventId", 0)); + if (eventId == 0) return; + + eventInst.EffectEventId.Add(eventId); + await ValueTask.CompletedTask; + } } \ No newline at end of file diff --git a/GameServer/Game/Rogue/Event/RogueEventManager.cs b/GameServer/Game/Rogue/Event/RogueEventManager.cs index bece0e00..86e91f55 100644 --- a/GameServer/Game/Rogue/Event/RogueEventManager.cs +++ b/GameServer/Game/Rogue/Event/RogueEventManager.cs @@ -1,7 +1,9 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Enums.Rogue; +using EggLink.DanhengServer.Enums.TournRogue; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Server.Packet.Send.RogueCommon; +using Newtonsoft.Json.Linq; namespace EggLink.DanhengServer.GameServer.Game.Rogue.Event; @@ -51,6 +53,34 @@ public class RogueEventManager(PlayerInstance player, BaseRogueInstance rogueIns x.BaseAvatarId != Convert.ToInt32(condition.Param["AvatarId"])) == true) optionInst.IsValid = false; break; + case RogueEventConditionTypeEnum.CondHasMiracle: + var categories = (JArray?)condition.Param["Categories"]; + + if (categories == null || categories.Count == 0) break; + List categoryEnums = []; + + foreach (var cat in categories) + { + if (Enum.TryParse(cat.ToString(), out RogueTournMiracleCategoryEnum categoryEnum)) + categoryEnums.Add(categoryEnum); + } + + if (Rogue.RogueMiracles.Keys.All(x => + !categoryEnums.Contains( + GameData.RogueTournMiracleData.GetValueOrDefault(x)?.MiracleCategory ?? + RogueTournMiracleCategoryEnum.None))) + optionInst.IsValid = false; + + break; + case RogueEventConditionTypeEnum.CondHasBuff: + var groupId = Convert.ToInt32(condition.Param["GroupId"]); + var group = GameData.RogueBuffGroupData.GetValueOrDefault(groupId); + if (group == null) break; + + var buffInGroup = group.BuffList.Select(x => x.MazeBuffID).ToHashSet(); + if (Rogue.RogueBuffs.All(x => !buffInGroup.Contains(x.BuffId))) optionInst.IsValid = false; + + break; } } @@ -118,5 +148,7 @@ public class RogueEventManager(PlayerInstance player, BaseRogueInstance rogueIns await Player.SendPacket(new PacketSyncRogueCommonDialogueOptionFinishScNotify(eventInstance)); option.IsSelected = true; await Player.SendPacket(new PacketSelectRogueCommonDialogueOptionScRsp(eventInstance)); + + eventInstance.EffectEventId.Clear(); } } \ No newline at end of file diff --git a/GameServer/Game/Rogue/Miracle/RogueMiracleInstance.cs b/GameServer/Game/Rogue/Miracle/RogueMiracleInstance.cs index e1b34b8c..bbedb48e 100644 --- a/GameServer/Game/Rogue/Miracle/RogueMiracleInstance.cs +++ b/GameServer/Game/Rogue/Miracle/RogueMiracleInstance.cs @@ -144,11 +144,11 @@ public class RogueMiracleInstance }; } - public RogueCommonActionResult ToGetResult() + public RogueCommonActionResult ToGetResult(RogueCommonActionResultSourceType source = RogueCommonActionResultSourceType.Select) { return new RogueCommonActionResult { - Source = RogueCommonActionResultSourceType.Select, + Source = source, RogueAction = new RogueCommonActionResultData { GetMiracleList = new RogueCommonMiracle