diff --git a/Command/Command/Cmd/CommandLineup.cs b/Command/Command/Cmd/CommandLineup.cs index 81a07686..bdb5a107 100644 --- a/Command/Command/Cmd/CommandLineup.cs +++ b/Command/Command/Cmd/CommandLineup.cs @@ -38,7 +38,6 @@ namespace EggLink.DanhengServer.Command.Cmd { avatar.CurrentHp = 10000; } - player.SceneInstance!.SyncLineup(); player.SendPacket(new PacketSyncLineupNotify(player.LineupManager.GetCurLineup()!)); arg.SendMsg(I18nManager.Translate("Game.Command.Lineup.HealedAllAvatars")); } diff --git a/Command/Command/Cmd/CommandScene.cs b/Command/Command/Cmd/CommandScene.cs index bf653871..2b840411 100644 --- a/Command/Command/Cmd/CommandScene.cs +++ b/Command/Command/Cmd/CommandScene.cs @@ -153,6 +153,11 @@ namespace EggLink.DanhengServer.Command.Cmd player.SceneData.ScenePropData[floorId] = []; } + if (player.SceneData?.FloorSavedData.TryGetValue(floorId, out var _) == true) + { + player.SceneData.FloorSavedData[floorId] = []; + } + arg.SendMsg(I18nManager.Translate("Game.Command.Scene.SceneReset", floorId.ToString())); } } diff --git a/Common/Data/Config/FetchAdvPropData.cs b/Common/Data/Config/FetchAdvPropData.cs new file mode 100644 index 00000000..25e23a0f --- /dev/null +++ b/Common/Data/Config/FetchAdvPropData.cs @@ -0,0 +1,15 @@ +using EggLink.DanhengServer.Data.Config.Task; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config +{ + public class FetchAdvPropData + { + public DynamicFloat GroupID { get; set; } = new(); + public DynamicFloat ID { get; set; } = new(); + } +} diff --git a/Common/Data/Config/GroupInfo.cs b/Common/Data/Config/GroupInfo.cs index dc73e5e2..1dbefdee 100644 --- a/Common/Data/Config/GroupInfo.cs +++ b/Common/Data/Config/GroupInfo.cs @@ -15,6 +15,7 @@ namespace EggLink.DanhengServer.Data.Config public GroupLoadSideEnum LoadSide { get; set; } [JsonConverter(typeof(StringEnumConverter))] public GroupCategoryEnum Category { get; set; } + public string LevelGraph { get; set; } = ""; public bool LoadOnInitial { get; set; } public string GroupName { get; set; } = ""; public LoadCondition LoadCondition { get; set; } = new(); @@ -28,6 +29,9 @@ namespace EggLink.DanhengServer.Data.Config public List PropList { get; set; } = []; public List NPCList { get; set; } = []; + [JsonIgnore] + public LevelGraphConfigInfo? LevelGraphConfig { get; set; } + public void Load() { foreach (var prop in PropList) diff --git a/Common/Data/Config/LevelGraphConfigInfo.cs b/Common/Data/Config/LevelGraphConfigInfo.cs new file mode 100644 index 00000000..5ddefdc2 --- /dev/null +++ b/Common/Data/Config/LevelGraphConfigInfo.cs @@ -0,0 +1,29 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config +{ + public class LevelGraphConfigInfo + { + public List OnInitSequece { get; set; } = []; + public List OnStartSequece { get; set; } = []; + + public static LevelGraphConfigInfo LoadFromJsonObject(JObject obj) + { + LevelGraphConfigInfo info = new(); + if (obj.ContainsKey(nameof(OnInitSequece))) + { + info.OnInitSequece = obj[nameof(OnInitSequece)]?.Select(x => LevelInitSequeceConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + if (obj.ContainsKey(nameof(OnStartSequece))) + { + info.OnStartSequece = obj[nameof(OnStartSequece)]?.Select(x => LevelStartSequeceConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + return info; + } + } +} diff --git a/Common/Data/Config/LevelInitSequeceConfigInfo.cs b/Common/Data/Config/LevelInitSequeceConfigInfo.cs new file mode 100644 index 00000000..79bf1db7 --- /dev/null +++ b/Common/Data/Config/LevelInitSequeceConfigInfo.cs @@ -0,0 +1,25 @@ +using EggLink.DanhengServer.Data.Config.Task; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config +{ + public class LevelInitSequeceConfigInfo + { + public List TaskList { get; set; } = []; + + public static LevelInitSequeceConfigInfo LoadFromJsonObject(JObject obj) + { + LevelInitSequeceConfigInfo info = new(); + if (obj.ContainsKey(nameof(TaskList))) + { + info.TaskList = obj[nameof(TaskList)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + return info; + } + } +} diff --git a/Common/Data/Config/LevelStartSequeceConfigInfo.cs b/Common/Data/Config/LevelStartSequeceConfigInfo.cs new file mode 100644 index 00000000..5725d4d5 --- /dev/null +++ b/Common/Data/Config/LevelStartSequeceConfigInfo.cs @@ -0,0 +1,37 @@ +using EggLink.DanhengServer.Data.Config.Task; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config +{ + public class LevelStartSequeceConfigInfo + { + public List TaskList { get; set; } = []; + public bool IsLoop { get; set; } = false; + public int Order { get; set; } + + public static LevelStartSequeceConfigInfo LoadFromJsonObject(JObject obj) + { + LevelStartSequeceConfigInfo info = new(); + if (obj.ContainsKey(nameof(TaskList))) + { + info.TaskList = obj[nameof(TaskList)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + + if (obj.ContainsKey(nameof(IsLoop))) + { + info.IsLoop = obj[nameof(IsLoop)]?.Value() ?? false; + } + + if (obj.ContainsKey(nameof(Order))) + { + info.Order = obj[nameof(Order)]?.Value() ?? 0; + } + return info; + } + } +} diff --git a/Common/Data/Config/MissionActInfo.cs b/Common/Data/Config/MissionActInfo.cs deleted file mode 100644 index 5a5c27dc..00000000 --- a/Common/Data/Config/MissionActInfo.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace EggLink.DanhengServer.Data.Config -{ - public class MissionActInfo - { - public List OnInitSequece { get; set; } = []; - public List OnStartSequece { get; set; } = []; - } - - public class MissionActTaskInfo - { - public List TaskList { get; set; } = []; - public string Type { get; set; } = ""; - public int MessageSectionID { get; set; } - } -} diff --git a/Common/Data/Config/MissionInfo.cs b/Common/Data/Config/MissionInfo.cs index c20f94bb..d58278f7 100644 --- a/Common/Data/Config/MissionInfo.cs +++ b/Common/Data/Config/MissionInfo.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Data.Config.Task; +using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Enums; using EggLink.DanhengServer.Enums.Scene; using EggLink.DanhengServer.Util; @@ -39,93 +40,8 @@ namespace EggLink.DanhengServer.Data.Config public int Progress { get; set; } public List? GroupIDList { get; set; } = []; public int SubRewardID { get; set; } - - [JsonIgnore] - public SubMissionTask Task { get; set; } = new(); - [JsonIgnore] - public SubMissionTask PropTask { get; set; } = new(); - [JsonIgnore] - public SubMissionTask StageWinTask { get; set; } = new(); - - [JsonIgnore] - public int MapEntranceID { get; set; } - - [JsonIgnore] - public int AnchorGroupID { get; set; } - [JsonIgnore] - public int AnchorID { get; set; } - - [JsonIgnore] - public List StageList { get; set; } = []; - - [JsonIgnore] - public PropStateEnum SourceState { get; set; } = PropStateEnum.Closed; - - public void Loaded(int type) // 1 for EnterFloor, 2 for PropState - { - if (type == 1) - { - try - { - if (Task.OnStartSequece.Count > 0) - { - MapEntranceID = Task.OnStartSequece[0].TaskList[0].EntranceID; - AnchorGroupID = Task.OnStartSequece[0].TaskList[0].GroupID; - AnchorID = Task.OnStartSequece[0].TaskList[0].AnchorID; - } - else if (Task.OnInitSequece.Count > 0) - { - MapEntranceID = Task.OnInitSequece[0].TaskList[0].EntranceID; - AnchorGroupID = Task.OnInitSequece[0].TaskList[0].GroupID; - AnchorID = Task.OnInitSequece[0].TaskList[0].AnchorID; - } - } - catch - { - } - } else if (type == 2) - { - foreach (var task in PropTask.OnStartSequece) - { - foreach (var prop in task.TaskList) - { - if (prop.ButtonCallBack != null) - { - SourceState = prop.ButtonCallBack[0].State; - } - } - } - - foreach (var task in PropTask.OnInitSequece) - { - foreach (var prop in task.TaskList) - { - if (prop.ButtonCallBack != null) - { - SourceState = prop.ButtonCallBack[0].State; - } - } - } - } else if (type == 3) - { - foreach (var task in StageWinTask.OnStartSequece) - { - foreach (var stageWinTask in task.TaskList) - { - if (stageWinTask.Type == "RPG.GameCore.TriggerBattle") - { - if (stageWinTask.EventID.GetValue() > 0) - { - StageList.Add(stageWinTask.EventID.GetValue()); - } - } - } - } - } - } } - public class CustomValueInfo { public int Index { get; set; } @@ -139,48 +55,4 @@ namespace EggLink.DanhengServer.Data.Config public List FinishActionPara { get; set; } = []; public List FinishActionParaString { get; set; } = []; } - - public class SubMissionTask - { - public List> OnInitSequece { get; set; } = []; - public List> OnStartSequece { get; set; } = []; - } - - public class SubMissionTaskInfo - { - public List TaskList { get; set; } = []; - } - - public class EnterFloorTaskInfo - { - public int EntranceID { get; set; } - public int GroupID { get; set; } - public int AnchorID { get; set; } - } - - public class PropStateTaskInfo - { - - [JsonConverter(typeof(StringEnumConverter))] - public PropStateEnum State { get; set; } = PropStateEnum.Closed; - - public List? ButtonCallBack { get; set; } - } - - public class StageWinTaskInfo - { - public string Type { get; set; } = ""; - public StageWinTaskEventInfo EventID { get; set; } = new(); - } - - public class StageWinTaskEventInfo - { - public bool IsDynamic { get; set; } - public FixedValueInfo FixedValue { get; set; } = new(); - - public int GetValue() - { - return IsDynamic ? 0 : FixedValue.Value; - } - } } diff --git a/Common/Data/Config/PropInfo.cs b/Common/Data/Config/PropInfo.cs index ee7cd413..1c8bdd25 100644 --- a/Common/Data/Config/PropInfo.cs +++ b/Common/Data/Config/PropInfo.cs @@ -26,6 +26,9 @@ namespace EggLink.DanhengServer.Data.Config [JsonIgnore()] public Dictionary> UnlockDoorID { get; set; } = []; + [JsonIgnore()] + public Dictionary> UnlockControllerID { get; set; } = []; + public void Load(GroupInfo info) { if (ValueSource != null) @@ -55,6 +58,20 @@ namespace EggLink.DanhengServer.Data.Config catch { } + } + else if (key.ToString().Contains("Controller")) + { + try + { + if (UnlockControllerID.ContainsKey(int.Parse(value.ToString().Split(",")[0])) == false) + { + UnlockControllerID.Add(int.Parse(value.ToString().Split(",")[0]), []); + } + UnlockControllerID[int.Parse(value.ToString().Split(",")[0])].Add(int.Parse(value.ToString().Split(",")[1])); + } + catch + { + } } } } diff --git a/Common/Data/Config/Task/ByCompareFloorSavedValue.cs b/Common/Data/Config/Task/ByCompareFloorSavedValue.cs new file mode 100644 index 00000000..9d4c9c5a --- /dev/null +++ b/Common/Data/Config/Task/ByCompareFloorSavedValue.cs @@ -0,0 +1,20 @@ +using EggLink.DanhengServer.Enums.Task; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class ByCompareFloorSavedValue : PredicateConfigInfo + { + public string Name { get; set; } = ""; + + [JsonConverter(typeof(StringEnumConverter))] + public CompareTypeEnum CompareType { get; set; } = CompareTypeEnum.Equal; + public short CompareValue { get; set; } = 0; + } +} diff --git a/Common/Data/Config/Task/ByCompareSubMissionState.cs b/Common/Data/Config/Task/ByCompareSubMissionState.cs new file mode 100644 index 00000000..4cd7881f --- /dev/null +++ b/Common/Data/Config/Task/ByCompareSubMissionState.cs @@ -0,0 +1,16 @@ +using EggLink.DanhengServer.Enums.Task; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class ByCompareSubMissionState : PredicateConfigInfo + { + public int SubMissionID { get; set; } + public SubMissionStateEnum SubMissionState { get; set; } + public bool AllStoryLine { get; set; } + } +} diff --git a/Common/Data/Config/Task/CreateProp.cs b/Common/Data/Config/Task/CreateProp.cs new file mode 100644 index 00000000..f3b8b9dc --- /dev/null +++ b/Common/Data/Config/Task/CreateProp.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class CreateProp : TaskConfigInfo + { + public DynamicFloat GroupID { get; set; } = new(); + public DynamicFloat GroupPropID { get; set; } = new(); + public List CreateList { get; set; } = []; + } +} diff --git a/Common/Data/Config/Task/DestroyProp.cs b/Common/Data/Config/Task/DestroyProp.cs new file mode 100644 index 00000000..cf804c78 --- /dev/null +++ b/Common/Data/Config/Task/DestroyProp.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class DestroyProp : TaskConfigInfo + { + public DynamicFloat ID { get; set; } = new(); + public DynamicFloat GroupID { get; set; } = new(); + public List DestroyList { get; set; } = []; + } + + public class GroupEntityInfo + { + public DynamicFloat GroupID { get; set; } = new(); + public DynamicFloat GroupInstanceID { get; set; } = new(); + } + + public class DynamicFloat + { + public bool IsDynamic { get; set; } + public FixedValueInfo FixedValue { get; set; } = new(); + + public int GetValue() + { + return IsDynamic ? 0 : FixedValue.Value; + } + } +} diff --git a/Common/Data/Config/Task/EnterMap.cs b/Common/Data/Config/Task/EnterMap.cs new file mode 100644 index 00000000..486f8b49 --- /dev/null +++ b/Common/Data/Config/Task/EnterMap.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class EnterMap : TaskConfigInfo + { + public int EntranceID { get; set; } + public int GroupID { get; set; } + public int AnchorID { get; set; } + } +} diff --git a/Common/Data/Config/Task/EnterMapByCondition.cs b/Common/Data/Config/Task/EnterMapByCondition.cs new file mode 100644 index 00000000..455f4384 --- /dev/null +++ b/Common/Data/Config/Task/EnterMapByCondition.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class EnterMapByCondition : TaskConfigInfo + { + public DynamicFloat EntranceID { get; set; } = new(); + } +} diff --git a/Common/Data/Config/Task/PlayMessage.cs b/Common/Data/Config/Task/PlayMessage.cs new file mode 100644 index 00000000..3bedbdb7 --- /dev/null +++ b/Common/Data/Config/Task/PlayMessage.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class PlayMessage : TaskConfigInfo + { + public int MessageSectionID { get; set; } + } +} diff --git a/Common/Data/Config/Task/PredicateConfigInfo.cs b/Common/Data/Config/Task/PredicateConfigInfo.cs new file mode 100644 index 00000000..1863196c --- /dev/null +++ b/Common/Data/Config/Task/PredicateConfigInfo.cs @@ -0,0 +1,33 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class PredicateConfigInfo : TaskConfigInfo + { + public bool Inverse { get; set; } = false; + + public static new PredicateConfigInfo LoadFromJsonObject(JObject obj) + { + PredicateConfigInfo info = new(); + info.Type = obj[nameof(Type)]!.ToObject()!; + + var typeStr = info.Type.Replace("RPG.GameCore.", ""); + var className = "EggLink.DanhengServer.Data.Config.Task." + typeStr; + var typeClass = System.Type.GetType(className); + if (typeClass != null) + { + info = (PredicateConfigInfo)obj.ToObject(typeClass)!; + } + else + { + info = Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())!; + } + return info; + } + } +} diff --git a/Common/Data/Config/Task/PredicateTaskList.cs b/Common/Data/Config/Task/PredicateTaskList.cs new file mode 100644 index 00000000..ac74e572 --- /dev/null +++ b/Common/Data/Config/Task/PredicateTaskList.cs @@ -0,0 +1,37 @@ +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class PredicateTaskList : TaskConfigInfo + { + public PredicateConfigInfo Predicate { get; set; } = new(); + public List SuccessTaskList { get; set; } = []; + public List FailedTaskList { get; set; } = []; + + public static new TaskConfigInfo LoadFromJsonObject(JObject obj) + { + PredicateTaskList info = new(); + info.Type = obj[nameof(Type)]!.ToObject()!; + if (obj.ContainsKey(nameof(Predicate))) + { + info.Predicate = (PredicateConfigInfo.LoadFromJsonObject((obj[nameof(Predicate)] as JObject)!)!); + } + + if (obj.ContainsKey(nameof(SuccessTaskList))) + { + info.SuccessTaskList = obj[nameof(SuccessTaskList)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + + if (obj.ContainsKey(nameof(FailedTaskList))) + { + info.FailedTaskList = obj[nameof(FailedTaskList)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + return info; + } + } +} diff --git a/Common/Data/Config/Task/PropSetupUITrigger.cs b/Common/Data/Config/Task/PropSetupUITrigger.cs new file mode 100644 index 00000000..9dca009f --- /dev/null +++ b/Common/Data/Config/Task/PropSetupUITrigger.cs @@ -0,0 +1,68 @@ +using Newtonsoft.Json.Linq; +using System; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class PropSetupUITrigger : TaskConfigInfo + { + public string ColliderRelativePath { get; set; } = string.Empty; + public bool DestroyAfterTriggered { get; set; } + public bool DisableAfterTriggered { get; set; } + public bool DisableWhenTriggered { get; set; } + public string ButtonIcon { get; set; } = string.Empty; + //DialogueIconType IconType; + //TextID ButtonText; + //DynamicString ButtonTextCustom; + public List ButtonCallback { get; set; } = []; + public bool ForceInteractInDanger { get; set; } + public bool ConsiderAngleLimit { get; set; } + public float InteractAngleRange { get; set; } + //EntityType[] OverrideTargetTypes; + public bool TriggerByFakeAvatar { get; set; } + public bool SkipFakeAvatar { get; set; } + public PredicateConfigInfo OnEnterFilter { get; set; } = new(); + public TargetEvaluator TargetType { get; set; } = new(); + + public static new TaskConfigInfo LoadFromJsonObject(JObject obj) + { + PropSetupUITrigger info = new(); + info.Type = obj[nameof(Type)]!.ToObject()!; + + if (obj.ContainsKey(nameof(OnEnterFilter))) + { + info.OnEnterFilter = (PredicateConfigInfo.LoadFromJsonObject((obj[nameof(OnEnterFilter)] as JObject)!) as PredicateConfigInfo)!; + } + + if (obj.ContainsKey(nameof(ButtonCallback))) + { + info.ButtonCallback = obj[nameof(ButtonCallback)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)).ToList() ?? []; + } + + if (obj.ContainsKey(nameof(TargetType))) + { + var targetType = obj[nameof(TargetType)] as JObject; + var classType = System.Type.GetType($"EggLink.DanhengServer.Data.Config.Task.{targetType?["Type"]?.ToString().Replace("RPG.GameCore.","")}"); + classType ??= System.Type.GetType($"EggLink.DanhengServer.Data.Config.Task.TargetEvaluator"); + info.TargetType = (targetType!.ToObject(classType!) as TargetEvaluator)!; + } + + if (info.ButtonCallback.Count > 0 && info.ButtonCallback[0].Type == "RPG.GameCore.PropStateExecute") + { + info.Type = obj[nameof(Type)]!.ToObject()!; + } + + info.ColliderRelativePath = obj[nameof(ColliderRelativePath)]?.ToString() ?? string.Empty; + info.DestroyAfterTriggered = obj[nameof(DestroyAfterTriggered)]?.ToObject() ?? false; + info.DisableAfterTriggered = obj[nameof(DisableAfterTriggered)]?.ToObject() ?? false; + info.DisableWhenTriggered = obj[nameof(DisableWhenTriggered)]?.ToObject() ?? false; + info.ButtonIcon = obj[nameof(ButtonIcon)]?.ToString() ?? string.Empty; + info.ForceInteractInDanger = obj[nameof(ForceInteractInDanger)]?.ToObject() ?? false; + info.ConsiderAngleLimit = obj[nameof(ConsiderAngleLimit)]?.ToObject() ?? false; + info.InteractAngleRange = obj[nameof(InteractAngleRange)]?.ToObject() ?? 0; + info.TriggerByFakeAvatar = obj[nameof(TriggerByFakeAvatar)]?.ToObject() ?? false; + info.SkipFakeAvatar = obj[nameof(SkipFakeAvatar)]?.ToObject() ?? false; + + return info; + } + } +} diff --git a/Common/Data/Config/Task/PropStateExecute.cs b/Common/Data/Config/Task/PropStateExecute.cs new file mode 100644 index 00000000..859afeb8 --- /dev/null +++ b/Common/Data/Config/Task/PropStateExecute.cs @@ -0,0 +1,46 @@ +using EggLink.DanhengServer.Enums.Scene; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using Newtonsoft.Json.Linq; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class PropStateExecute : TaskConfigInfo + { + public TargetEvaluator TargetType { get; set; } = new(); + [JsonConverter(typeof(StringEnumConverter))] + public PropStateEnum PropState { get; set; } = PropStateEnum.Closed; + public List Execute { get; set; } = []; + + public static new TaskConfigInfo LoadFromJsonObject(JObject obj) + { + var info = new PropStateExecute(); + + info.Type = obj[nameof(Type)]!.ToObject()!; + if (obj.ContainsKey(nameof(TargetType))) + { + var targetType = obj[nameof(TargetType)] as JObject; + var classType = System.Type.GetType($"EggLink.DanhengServer.Data.Config.Task.{targetType?["Type"]?.ToString().Replace("RPG.GameCore.", "")}"); + classType ??= System.Type.GetType($"EggLink.DanhengServer.Data.Config.Task.TargetEvaluator"); + info.TargetType = (targetType!.ToObject(classType!) as TargetEvaluator)!; + } + + if (obj.ContainsKey(nameof(PropState))) + { + info.PropState = obj[nameof(PropState)]?.ToObject() ?? PropStateEnum.Closed; + } + + foreach (var item in obj[nameof(Execute)]?.Select(x => TaskConfigInfo.LoadFromJsonObject((x as JObject)!)) ?? []) + { + info.Execute.Add(item); + } + + return info; + } + } +} diff --git a/Common/Data/Config/Task/TargetEvaluator.cs b/Common/Data/Config/Task/TargetEvaluator.cs new file mode 100644 index 00000000..6488c278 --- /dev/null +++ b/Common/Data/Config/Task/TargetEvaluator.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class TargetEvaluator + { + public string Type { get; set; } = ""; + } +} diff --git a/Common/Data/Config/Task/TargetFetchAdvPropEx.cs b/Common/Data/Config/Task/TargetFetchAdvPropEx.cs new file mode 100644 index 00000000..48b8c60f --- /dev/null +++ b/Common/Data/Config/Task/TargetFetchAdvPropEx.cs @@ -0,0 +1,25 @@ +using EggLink.DanhengServer.Enums.Task; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class TargetFetchAdvPropEx : TargetEvaluator + { + [JsonConverter(typeof(StringEnumConverter))] + public TargetFetchAdvPropFetchTypeEnum FetchType { get; set; } + //public DynamicString SinglePropKey; + public FetchAdvPropData SinglePropID { get; set; } = new(); + //public DynamicString SingleUniqueName; + //public DynamicString[] MultiPropKey; + //public FetchAdvPropData[] MultiPropID; + //public DynamicString[] MultiUniqueName; + public DynamicFloat PropGroup { get; set; } = new(); + public DynamicFloat PropIDInOwnerGroup { get; set; } = new(); + } +} diff --git a/Common/Data/Config/Task/TaskConfigInfo.cs b/Common/Data/Config/Task/TaskConfigInfo.cs new file mode 100644 index 00000000..83ca4b8c --- /dev/null +++ b/Common/Data/Config/Task/TaskConfigInfo.cs @@ -0,0 +1,52 @@ +using Newtonsoft.Json.Linq; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class TaskConfigInfo + { + public string Type { get; set; } = ""; + public bool TaskEnabled { get; set; } = false; + + public static TaskConfigInfo LoadFromJsonObject(JObject json) + { + string type = json[nameof(Type)]?.Value() ?? ""; + if (string.IsNullOrEmpty(type)) + { + return new TaskConfigInfo(); + } + + var typeStr = type.Replace("RPG.GameCore.", ""); + var className = "EggLink.DanhengServer.Data.Config.Task." + typeStr; + var typeClass = System.Type.GetType(className); + if (typeStr == "PredicateTaskList") + { + var res = PredicateTaskList.LoadFromJsonObject(json); + res.Type = type; + return res; + } + + if (typeStr == "PropSetupUITrigger") + { + var res = PropSetupUITrigger.LoadFromJsonObject(json); + res.Type = type; + return res; + } + + if (typeStr == "PropStateExecute") + { + var res = PropStateExecute.LoadFromJsonObject(json); + res.Type = type; + return res; + } + + if (typeClass != null) + { + var res = (TaskConfigInfo)json.ToObject(typeClass)!; + res.Type = type; + return res; + } + + return Newtonsoft.Json.JsonConvert.DeserializeObject(json.ToString())!; + } + } +} diff --git a/Common/Data/Config/Task/TriggerEntityEvent.cs b/Common/Data/Config/Task/TriggerEntityEvent.cs new file mode 100644 index 00000000..bcdfda8e --- /dev/null +++ b/Common/Data/Config/Task/TriggerEntityEvent.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class TriggerEntityEvent : TaskConfigInfo + { + public DynamicFloat InstanceID { get; set; } = new(); + } +} diff --git a/Common/Data/Config/Task/TriggerPerformance.cs b/Common/Data/Config/Task/TriggerPerformance.cs new file mode 100644 index 00000000..e75e7528 --- /dev/null +++ b/Common/Data/Config/Task/TriggerPerformance.cs @@ -0,0 +1,18 @@ +using EggLink.DanhengServer.Enums.Task; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Data.Config.Task +{ + public class TriggerPerformance : TaskConfigInfo + { + [JsonConverter(typeof(StringEnumConverter))] + public ELevelPerformanceTypeEnum PerformanceType { get; set; } + public int PerformanceID { get; set; } + } +} diff --git a/Common/Data/Excel/PerformanceEExcel.cs b/Common/Data/Excel/PerformanceEExcel.cs index f6bd619e..20ee742b 100644 --- a/Common/Data/Excel/PerformanceEExcel.cs +++ b/Common/Data/Excel/PerformanceEExcel.cs @@ -15,7 +15,7 @@ namespace EggLink.DanhengServer.Data.Excel public string PerformancePath { get; set; } = ""; [JsonIgnore] - public MissionActInfo? ActInfo { get; set; } + public LevelGraphConfigInfo? ActInfo { get; set; } public override int GetId() { diff --git a/Common/Data/Excel/SubMissionExcel.cs b/Common/Data/Excel/SubMissionExcel.cs index 49b8abf5..4b912d5a 100644 --- a/Common/Data/Excel/SubMissionExcel.cs +++ b/Common/Data/Excel/SubMissionExcel.cs @@ -17,6 +17,9 @@ namespace EggLink.DanhengServer.Data.Excel [JsonIgnore()] public SubMissionInfo? SubMissionInfo { get; set; } + [JsonIgnore()] + public LevelGraphConfigInfo? SubMissionTaskInfo { get; set; } + public override int GetId() { return SubMissionID; diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 3f57a3d7..c5356c75 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -25,6 +25,7 @@ namespace EggLink.DanhengServer.Data LoadMazeSkill(); LoadDialogueInfo(); LoadPerformanceInfo(); + LoadSubMissionInfo(); LoadRogueChestMapInfo(); GameData.ActivityConfig = LoadCustomFile("Activity", "ActivityConfig") ?? new(); GameData.BannersConfig = LoadCustomFile("Banner", "Banners") ?? new(); @@ -168,6 +169,22 @@ namespace EggLink.DanhengServer.Data group.Id = groupInfo.ID; info.Groups.TryAdd(groupInfo.ID, group); group.Load(); + + // load graph + var graphPath = ConfigManager.Config.Path.ResourcePath + "/" + group.LevelGraph; + var graphFile = new FileInfo(graphPath); + if (graphFile.Exists) + { + using var graphReader = graphFile.OpenRead(); + using StreamReader graphReader2 = new(graphReader); + var graphText = graphReader2.ReadToEnd().Replace("$type", "Type"); + var graphObj = JObject.Parse(graphText); + if (graphObj != null) + { + LevelGraphConfigInfo graphInfo = LevelGraphConfigInfo.LoadFromJsonObject(graphObj); + group.LevelGraphConfig = graphInfo; + } + } } } catch (Exception ex) { @@ -216,42 +233,6 @@ namespace EggLink.DanhengServer.Data if (File.Exists(missionJsonPath)) { var missionJson = File.ReadAllText(missionJsonPath).Replace("$type", "Type"); - try - { - if (subMission.FinishType == Enums.MissionFinishTypeEnum.EnterFloor) - { - var mission = JsonConvert.DeserializeObject>(missionJson); - - if (mission != null) - { - subMission.Task = mission; - subMission.Loaded(1); - } - } else if (subMission.FinishType == Enums.MissionFinishTypeEnum.PropState) - { - var mission = JsonConvert.DeserializeObject>(missionJson); - if (mission != null) - { - subMission.PropTask = mission; - subMission.Loaded(2); - } - } else if (subMission.FinishType == Enums.MissionFinishTypeEnum.StageWin) - { - var mission = JsonConvert.DeserializeObject>(missionJson); - if (mission != null) - { - subMission.StageWinTask = mission; - subMission.Loaded(3); - } - } - else - { - subMission.Loaded(0); - } - } catch (Exception ex) - { - Logger.Error(I18nManager.Translate("Server.ServerInfo.FailedToReadItem", missionJsonPath, I18nManager.Translate("Word.Error")), ex); - } } } count++; @@ -405,10 +386,11 @@ namespace EggLink.DanhengServer.Data using var reader = file.OpenRead(); using StreamReader reader2 = new(reader); var text = reader2.ReadToEnd().Replace("$type", "Type"); - var act = JsonConvert.DeserializeObject(text); - if (act != null) + var obj = JObject.Parse(text); + if (obj != null) { - performance.ActInfo = act; + LevelGraphConfigInfo info = LevelGraphConfigInfo.LoadFromJsonObject(obj); + performance.ActInfo = info; count++; } } @@ -428,6 +410,48 @@ namespace EggLink.DanhengServer.Data Logger.Info(I18nManager.Translate("Server.ServerInfo.LoadedItems", count.ToString(), I18nManager.Translate("Word.PerformanceInfo"))); } + public static void LoadSubMissionInfo() + { + Logger.Info(I18nManager.Translate("Server.ServerInfo.LoadingItem", I18nManager.Translate("Word.SubMissionInfo"))); + var count = 0; + foreach (var subMission in GameData.SubMissionData.Values) + { + if (subMission.SubMissionInfo == null || subMission.SubMissionInfo.MissionJsonPath == "") + { + continue; + } + + var path = ConfigManager.Config.Path.ResourcePath + "/" + subMission.SubMissionInfo.MissionJsonPath; + var file = new FileInfo(path); + if (!file.Exists) continue; + try + { + using var reader = file.OpenRead(); + using StreamReader reader2 = new(reader); + var text = reader2.ReadToEnd().Replace("$type", "Type"); + var obj = JObject.Parse(text); + if (obj != null) + { + LevelGraphConfigInfo info = LevelGraphConfigInfo.LoadFromJsonObject(obj); + subMission.SubMissionTaskInfo = info; + count++; + } + } + catch (Exception ex) + { + Logger.Error(I18nManager.Translate("Server.ServerInfo.FailedToReadItem", file.Name, I18nManager.Translate("Word.Error")), ex); + } + + } + + if (count < GameData.SubMissionData.Count) + { + //Logger.Warn("Performance infos are missing, please check your resources folder: " + ConfigManager.Config.Path.ResourcePath + "/Config/Level/Mission/*/Act. Performances may not work!"); + } + + Logger.Info(I18nManager.Translate("Server.ServerInfo.LoadedItems", count.ToString(), I18nManager.Translate("Word.SubMissionInfo"))); + } + public static void LoadRogueChestMapInfo() { Logger.Info(I18nManager.Translate("Server.ServerInfo.LoadingItem", I18nManager.Translate("Word.RogueChestMapInfo"))); diff --git a/Common/Database/Lineup/LineupData.cs b/Common/Database/Lineup/LineupData.cs index 26ba409d..208d1332 100644 --- a/Common/Database/Lineup/LineupData.cs +++ b/Common/Database/Lineup/LineupData.cs @@ -108,7 +108,7 @@ namespace EggLink.DanhengServer.Database.Lineup Name = Name, MaxMp = 5, Mp = (uint)Mp, - ExtraLineupType = (ExtraLineupType)LineupType, + ExtraLineupType = (ExtraLineupType)(LineupType == (int)ExtraLineupType.LineupHeliobus ? (int)ExtraLineupType.LineupNone : LineupType), Index = (uint)(LineupData?.Lineups?.Values.ToList().IndexOf(this) ?? 0), }; diff --git a/Common/Database/Mission/MissionData.cs b/Common/Database/Mission/MissionData.cs index 5da2725b..27c24126 100644 --- a/Common/Database/Mission/MissionData.cs +++ b/Common/Database/Mission/MissionData.cs @@ -22,6 +22,9 @@ namespace EggLink.DanhengServer.Database.Mission [SugarColumn(IsJson = true)] public List RunningMainMissionIds { get; set; } = []; + [SugarColumn(IsJson = true)] + public Dictionary SubMissionProgressDict { get; set; } = []; + public int TrackingMainMissionId { get; set; } public MissionPhaseEnum GetMainMissionStatus(int missionId) diff --git a/Common/Enums/Mission/MissionPhaseEnum.cs b/Common/Enums/Mission/MissionPhaseEnum.cs index 2adea4b9..7eb67606 100644 --- a/Common/Enums/Mission/MissionPhaseEnum.cs +++ b/Common/Enums/Mission/MissionPhaseEnum.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Enums.Task; +using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.Enums { @@ -23,5 +24,17 @@ namespace EggLink.DanhengServer.Enums _ => MissionStatus.MissionNone, }; } + + public static SubMissionStateEnum ToStateEnum(this MissionPhaseEnum status) + { + return status switch + { + MissionPhaseEnum.None => SubMissionStateEnum.Unknow, + MissionPhaseEnum.Accept => SubMissionStateEnum.Started, + MissionPhaseEnum.Finish => SubMissionStateEnum.Finish, + MissionPhaseEnum.Cancel => SubMissionStateEnum.TakenAndNotStarted, + _ => SubMissionStateEnum.Unknow, + }; + } } } diff --git a/Common/Enums/Task/CompareTypeEnum.cs b/Common/Enums/Task/CompareTypeEnum.cs new file mode 100644 index 00000000..80f2bda2 --- /dev/null +++ b/Common/Enums/Task/CompareTypeEnum.cs @@ -0,0 +1,13 @@ +namespace EggLink.DanhengServer.Enums.Task +{ + public enum CompareTypeEnum + { + Unknow = 0, + Greater = 1, + GreaterEqual = 2, + NotEqual = 3, + Equal = 4, + LessEqual = 5, + Less = 6, + } +} diff --git a/Common/Enums/Task/ELevelPerformanceTypeEnum.cs b/Common/Enums/Task/ELevelPerformanceTypeEnum.cs new file mode 100644 index 00000000..eb416588 --- /dev/null +++ b/Common/Enums/Task/ELevelPerformanceTypeEnum.cs @@ -0,0 +1,12 @@ +namespace EggLink.DanhengServer.Enums.Task +{ + public enum ELevelPerformanceTypeEnum + { + Unknown = 0, + A = 1, + C = 2, + D = 3, + E = 4, + PlayVideo = 10, + } +} diff --git a/Common/Enums/Task/SubMissionStateEnum.cs b/Common/Enums/Task/SubMissionStateEnum.cs new file mode 100644 index 00000000..743779e3 --- /dev/null +++ b/Common/Enums/Task/SubMissionStateEnum.cs @@ -0,0 +1,10 @@ +namespace EggLink.DanhengServer.Enums.Task +{ + public enum SubMissionStateEnum + { + Unknow = 0, + Started = 1, + Finish = 2, + TakenAndNotStarted = 3 + } +} diff --git a/Common/Enums/Task/TargetFetchAdvPropFetchTypeEnum.cs b/Common/Enums/Task/TargetFetchAdvPropFetchTypeEnum.cs new file mode 100644 index 00000000..3142199d --- /dev/null +++ b/Common/Enums/Task/TargetFetchAdvPropFetchTypeEnum.cs @@ -0,0 +1,15 @@ +namespace EggLink.DanhengServer.Enums.Task +{ + public enum TargetFetchAdvPropFetchTypeEnum + { + Owner = 0, + SinglePropByPropKey = 1, + SinglePropByPropID = 2, + SinglePropByUniqueName = 3, + MultiPropByPropKey = 4, + MultiPropByPropID = 5, + MultiPropByUniqueName = 6, + MultiPropByGroup = 7, + SinglePropByOwnerGroupAndID = 8, + } +} diff --git a/Common/Internationalization/Message/LanguageCHS.cs b/Common/Internationalization/Message/LanguageCHS.cs index ce1175ac..0d56b613 100644 --- a/Common/Internationalization/Message/LanguageCHS.cs +++ b/Common/Internationalization/Message/LanguageCHS.cs @@ -74,6 +74,8 @@ namespace EggLink.DanhengServer.Internationalization.Message public string FloorGroupMissingResult { get; } = "传送、怪物战斗与世界生成"; public string Mission { get; } = "任务"; public string MissionInfo { get; } = "任务文件"; + public string SubMission { get; } = "子任务"; + public string SubMissionInfo { get; } = "子任务文件"; public string MazeSkill { get; } = "角色秘技"; public string MazeSkillInfo { get; } = "角色秘技文件"; public string Dialogue { get; } = "模拟宇宙事件"; diff --git a/GameServer/Game/Inventory/InventoryManager.cs b/GameServer/Game/Inventory/InventoryManager.cs index 86f80ea1..212792a1 100644 --- a/GameServer/Game/Inventory/InventoryManager.cs +++ b/GameServer/Game/Inventory/InventoryManager.cs @@ -151,6 +151,9 @@ namespace EggLink.DanhengServer.Game.Inventory AddItem(itemId + 200000, 1, false); } break; + case ItemMainTypeEnum.Mission: + itemData = PutItem(itemId, count); + break; default: itemData = PutItem(itemId, Math.Min(count, itemConfig.PileLimit)); break; @@ -167,6 +170,8 @@ namespace EggLink.DanhengServer.Game.Inventory { Player.SendPacket(new PacketScenePlaneEventScNotify(clone)); } + + Player.MissionManager?.HandleFinishType(Enums.MissionFinishTypeEnum.GetItem, itemData); } return returnRaw ? itemData : clone ?? itemData; @@ -314,11 +319,18 @@ namespace EggLink.DanhengServer.Game.Inventory itemData = relic; break; } + if (itemData != null && sync) { Player.SendPacket(new PacketPlayerSyncScNotify(itemData)); } - DatabaseHelper.Instance?.UpdateInstance(Data); + + Player.MissionManager?.HandleFinishType(Enums.MissionFinishTypeEnum.UseItem, new ItemData() + { + ItemId = itemId, + Count = count, + }); + return itemData; } diff --git a/GameServer/Game/Lineup/LineupManager.cs b/GameServer/Game/Lineup/LineupManager.cs index fc2e6b4a..b1cc08f2 100644 --- a/GameServer/Game/Lineup/LineupManager.cs +++ b/GameServer/Game/Lineup/LineupManager.cs @@ -297,7 +297,7 @@ namespace EggLink.DanhengServer.Game.Lineup } } - public void RemoveAvatar(int lineupIndex, int avatarId) + public void RemoveAvatar(int lineupIndex, int avatarId, bool sendPacket = true) { if (lineupIndex < 0) { @@ -308,19 +308,31 @@ namespace EggLink.DanhengServer.Game.Lineup { return; } - lineup.BaseAvatars?.RemoveAll(avatar => avatar.BaseAvatarId == avatarId); + GameData.SpecialAvatarData.TryGetValue(avatarId * 10 + Player.Data.WorldLevel, out var specialAvatar); + if (specialAvatar != null) + { + lineup.BaseAvatars?.RemoveAll(avatar => avatar.BaseAvatarId == specialAvatar.AvatarID); + } + else + { + lineup.BaseAvatars?.RemoveAll(avatar => avatar.BaseAvatarId == avatarId); + } LineupData.Lineups[lineupIndex] = lineup; DatabaseHelper.Instance?.UpdateInstance(LineupData); - if (lineupIndex == LineupData.GetCurLineupIndex()) + + if (sendPacket) { - Player.SceneInstance?.SyncLineup(); + if (lineupIndex == LineupData.GetCurLineupIndex()) + { + Player.SceneInstance?.SyncLineup(); + } + Player.SendPacket(new PacketSyncLineupNotify(lineup)); } - Player.SendPacket(new PacketSyncLineupNotify(lineup)); } - public void RemoveAvatarFromCurTeam(int avatarId) + public void RemoveAvatarFromCurTeam(int avatarId, bool sendPacket = true) { - RemoveAvatar(LineupData.GetCurLineupIndex(), avatarId); + RemoveAvatar(LineupData.GetCurLineupIndex(), avatarId, sendPacket); } public void RemoveSpecialAvatarFromCurTeam(int specialAvatarId) diff --git a/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs b/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs index 1e289998..b7de1b5b 100644 --- a/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs +++ b/GameServer/Game/Mission/FinishAction/Handler/MissionHandlerSetFloorSavedValue.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Enums; using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using System; using System.Collections.Generic; using System.Linq; @@ -13,6 +14,7 @@ namespace EggLink.DanhengServer.Game.Mission.FinishAction.Handler { public override void OnHandle(List Params, List ParamString, PlayerInstance Player) { + _ = int.TryParse(ParamString[0], out var plane); _ = int.TryParse(ParamString[1], out var floor); Player.SceneData!.FloorSavedData.TryGetValue(floor, out var value); if (value == null) @@ -22,6 +24,9 @@ namespace EggLink.DanhengServer.Game.Mission.FinishAction.Handler } value[ParamString[2]] = int.Parse(ParamString[3]); // ParamString[2] is the key + Player.SendPacket(new PacketUpdateFloorSavedValueNotify(ParamString[2], int.Parse(ParamString[3]))); + + Player.TaskManager?.SceneTaskTrigger.TriggerFloor(plane, floor); } } } diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerDelTrialAvatar.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerDelTrialAvatar.cs index 47fe528c..83ce87fa 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerDelTrialAvatar.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerDelTrialAvatar.cs @@ -14,11 +14,12 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - if (player.LineupManager!.GetCurLineup() == null) return; - var actualSpecialAvatarId = info.ParamInt1 * 10 + player.Data.WorldLevel; - var item = player.LineupManager!.GetCurLineup()!.BaseAvatars!.Find(item => item.SpecialAvatarId == actualSpecialAvatarId); - if (item == null) return; // avatar not found - player.LineupManager!.RemoveSpecialAvatarFromCurTeam(actualSpecialAvatarId); + // MOVE TO TASK HANDLER + //if (player.LineupManager!.GetCurLineup() == null) return; + //var actualSpecialAvatarId = info.ParamInt1 * 10 + player.Data.WorldLevel; + //var item = player.LineupManager!.GetCurLineup()!.BaseAvatars!.Find(item => item.SpecialAvatarId == actualSpecialAvatarId); + //if (item == null) return; // avatar not found + //player.LineupManager!.RemoveSpecialAvatarFromCurTeam(actualSpecialAvatarId); } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerEnterFloor.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerEnterFloor.cs index ab5ee24a..d092aedc 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerEnterFloor.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerEnterFloor.cs @@ -14,7 +14,8 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - player.EnterMissionScene(info.MapEntranceID, info.AnchorGroupID, info.AnchorID, true); + // MOVE TO TASK HANDLER + //player.EnterMissionScene(info.MapEntranceID, info.AnchorGroupID, info.AnchorID, true); } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetItem.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetItem.cs new file mode 100644 index 00000000..737e5657 --- /dev/null +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetItem.cs @@ -0,0 +1,31 @@ +using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Database.Inventory; +using EggLink.DanhengServer.Game.Mission.FinishType; +using EggLink.DanhengServer.Game.Player; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Game.Mission.FinishType.Handler +{ + [MissionFinishType(Enums.MissionFinishTypeEnum.GetItem)] + internal class MissionHandlerGetItem : MissionFinishTypeHandler + { + public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) + { + } + + public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) + { + if (arg != null && arg is ItemData item) + { + if (item.ItemId == info.ParamInt1) + { + player.MissionManager!.FinishSubMission(info.ID); + } + } + } + } +} diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetTrialAvatar.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetTrialAvatar.cs index 7b5ae033..a3cf0a57 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetTrialAvatar.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerGetTrialAvatar.cs @@ -11,11 +11,12 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - if (player.LineupManager!.GetCurLineup() == null) return; - var actualSpecialAvatarId = info.ParamInt1 * 10 + player.Data.WorldLevel; - var item = player.LineupManager!.GetCurLineup()!.BaseAvatars!.Find(item => item.SpecialAvatarId == actualSpecialAvatarId); - if (item != null) return; // existing avatar - player.LineupManager!.AddSpecialAvatarToCurTeam(actualSpecialAvatarId); + // MOVE TO TASK HANDLER + //if (player.LineupManager!.GetCurLineup() == null) return; + //var actualSpecialAvatarId = info.ParamInt1 * 10 + player.Data.WorldLevel; + //var item = player.LineupManager!.GetCurLineup()!.BaseAvatars!.Find(item => item.SpecialAvatarId == actualSpecialAvatarId); + //if (item != null) return; // existing avatar + //player.LineupManager!.AddSpecialAvatarToCurTeam(actualSpecialAvatarId); } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessagePerformSectionFinish.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessagePerformSectionFinish.cs index 7b212b52..014cffc8 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessagePerformSectionFinish.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessagePerformSectionFinish.cs @@ -14,7 +14,8 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - player.MessageManager!.AddMessageSection(info.ParamInt1); + // MOVE TO TASK HANDLER + //player.MessageManager!.AddMessageSection(info.ParamInt1); } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessageSectionFinish.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessageSectionFinish.cs index 66128b86..62ffd277 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessageSectionFinish.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerMessageSectionFinish.cs @@ -14,7 +14,8 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - player.MessageManager!.AddMessageSection(info.ParamInt1); + // MOVE TO TASK HANDLER + //player.MessageManager!.AddMessageSection(info.ParamInt1); } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerPropState.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerPropState.cs index 22ab77cb..6b8e010d 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerPropState.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerPropState.cs @@ -12,37 +12,38 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler { public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) { - var prop = player.SceneInstance?.GetEntitiesInGroup(info.ParamInt1); - if (prop == null) return; - - foreach (var p in prop) - { - if (p.PropInfo.ID == info.ParamInt2) - { - //if (player.SceneInstance?.Excel.WorldID != 101) - //{ - // if (p.PropInfo.State == PropStateEnum.Locked && info.SourceState == PropStateEnum.Closed) - // { - // GameData.MazePropData.TryGetValue(p.PropInfo.PropID, out var propData); - // if (propData != null && propData.PropStateList.Contains(PropStateEnum.Closed)) - // { - // p.SetState(PropStateEnum.Closed); - // } - // else - // { - // } - // } - //} else - //{ - // p.SetState(info.SourceState); - //} - GameData.MazePropData.TryGetValue(p.PropInfo.PropID, out var data); - if (data?.PropStateList.Contains(info.SourceState) == true) - { - p.SetState(info.SourceState); - } - } - } + // MOVE TO TASK HANDLER + //var prop = player.SceneInstance?.GetEntitiesInGroup(info.ParamInt1); + //if (prop == null) return; + + //foreach (var p in prop) + //{ + // if (p.PropInfo.ID == info.ParamInt2) + // { + // //if (player.SceneInstance?.Excel.WorldID != 101) + // //{ + // // if (p.PropInfo.State == PropStateEnum.Locked && info.SourceState == PropStateEnum.Closed) + // // { + // // GameData.MazePropData.TryGetValue(p.PropInfo.PropID, out var propData); + // // if (propData != null && propData.PropStateList.Contains(PropStateEnum.Closed)) + // // { + // // p.SetState(PropStateEnum.Closed); + // // } + // // else + // // { + // // } + // // } + // //} else + // //{ + // // p.SetState(info.SourceState); + // //} + // GameData.MazePropData.TryGetValue(p.PropInfo.PropID, out var data); + // if (data?.PropStateList.Contains(info.SourceState) == true) + // { + // p.SetState(info.SourceState); + // } + // } + //} } public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerSubMissionFinishCnt.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerSubMissionFinishCnt.cs index 7d9bf3bd..dea5f3d8 100644 --- a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerSubMissionFinishCnt.cs +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerSubMissionFinishCnt.cs @@ -29,22 +29,9 @@ namespace EggLink.DanhengServer.Game.Mission.FinishType.Handler player.MissionManager!.FinishSubMission(info.ID); } else // update progress { - if (finishCount > 0) + if (player.MissionManager!.GetMissionProgress(info.ID) != finishCount) { - var sync = new Proto.MissionSync() - { - MissionList = - { - new Proto.Mission() - { - Id = (uint)info.ID, - Status = Proto.MissionStatus.MissionDoing, - Progress = (uint)finishCount - } - } - }; - - player.SendPacket(new PacketPlayerSyncScNotify(sync)); + player.MissionManager!.SetMissionProgress(info.ID, finishCount); } } } diff --git a/GameServer/Game/Mission/FinishType/Handler/MissionHandlerUseItem.cs b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerUseItem.cs new file mode 100644 index 00000000..91e08169 --- /dev/null +++ b/GameServer/Game/Mission/FinishType/Handler/MissionHandlerUseItem.cs @@ -0,0 +1,37 @@ +using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Database.Inventory; +using EggLink.DanhengServer.Enums; +using EggLink.DanhengServer.Game.Mission.FinishType; +using EggLink.DanhengServer.Game.Player; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Game.Mission.FinishType.Handler +{ + [MissionFinishType(MissionFinishTypeEnum.UseItem)] + public class MissionHandlerUseItem : MissionFinishTypeHandler + { + public override void Init(PlayerInstance player, SubMissionInfo info, object? arg) + { + } + + public override void HandleFinishType(PlayerInstance player, SubMissionInfo info, object? arg) + { + if (arg is ItemData item) + { + if (info.ParamInt1 == item.ItemId) + { + player.MissionManager?.AddMissionProgress(info.ID, 1); + } + } + + if (player.MissionManager?.GetMissionProgress(info.ID) >= info.Progress) + { + player.MissionManager?.FinishSubMission(info.ID); + } + } + } +} diff --git a/GameServer/Game/Mission/MissionManager.cs b/GameServer/Game/Mission/MissionManager.cs index 06ba06dc..9cef302d 100644 --- a/GameServer/Game/Mission/MissionManager.cs +++ b/GameServer/Game/Mission/MissionManager.cs @@ -3,6 +3,7 @@ using EggLink.DanhengServer.Database; using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.Database.Mission; using EggLink.DanhengServer.Enums; +using EggLink.DanhengServer.Enums.Item; using EggLink.DanhengServer.Game.Mission.FinishAction; using EggLink.DanhengServer.Game.Mission.FinishType; using EggLink.DanhengServer.Game.Player; @@ -24,7 +25,7 @@ namespace EggLink.DanhengServer.Game.Mission public Dictionary ActionHandlers = []; public Dictionary FinishTypeHandlers = []; - public readonly List SkipSubMissionList = [101030104, 101050116]; // bug + public readonly List SkipSubMissionList = []; // bug public MissionManager(PlayerInstance player) : base(player) { @@ -144,6 +145,7 @@ namespace EggLink.DanhengServer.Game.Mission foreach (var subMission in mission.SubMissionIds) { Data.SetSubMissionStatus(subMission, MissionPhaseEnum.None); + SetMissionProgress(subMission, 0); sync.MissionList.Add(new Proto.Mission() { Id = (uint)subMission, @@ -194,7 +196,7 @@ namespace EggLink.DanhengServer.Game.Mission if (SkipSubMissionList.Contains(missionId)) { - FinishSubMission(missionId); + //FinishSubMission(missionId); } if (mission.SubMissionInfo?.LevelFloorID == Player.SceneInstance?.FloorId) @@ -208,9 +210,8 @@ namespace EggLink.DanhengServer.Game.Mission } } - // performance - - Player.PerformanceTrigger!.TriggerPerformance(missionId); + // TODO: Mission Task + Player.TaskManager?.MissionTaskTrigger?.TriggerMissionTask(missionId); return sync; } @@ -240,12 +241,6 @@ namespace EggLink.DanhengServer.Game.Mission } } - if (missionId == 1021301) - { - Player.LineupManager!.SetExtraLineup(Proto.ExtraLineupType.LineupHeliobus, [1021213]); - Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); - } - var mainSync = AcceptMainMissionByCondition(false); sync.MissionList.AddRange(mainSync.MissionList); @@ -270,6 +265,8 @@ namespace EggLink.DanhengServer.Game.Mission if (mainMission == null) return; Data.SetSubMissionStatus(missionId, MissionPhaseEnum.Finish); // set finish + SetMissionProgress(missionId, subMission.SubMissionInfo?.Progress ?? 1); + var sync = new Proto.MissionSync(); sync.MissionList.Add(new Proto.Mission() { @@ -347,11 +344,6 @@ namespace EggLink.DanhengServer.Game.Mission Player.LineupManager!.SetExtraLineup(Proto.ExtraLineupType.LineupHeliobus, list); } - if (missionId == 100040117 || missionId == 100040118) - { - FinishSubMission(100040119); - } - // handle reward HandleSubMissionReward(missionId); //Player.StoryLineManager!.CheckIfEnterStoryLine(); @@ -385,7 +377,8 @@ namespace EggLink.DanhengServer.Game.Mission var ItemList = new Proto.ItemList(); reward?.GetItems().ForEach(i => { - var res = Player.InventoryManager!.AddItem(i.Item1, i.Item2, false); + GameData.ItemConfigData.TryGetValue(i.Item1, out var item); + var res = Player.InventoryManager!.AddItem(i.Item1, i.Item2, item?.ItemMainType == ItemMainTypeEnum.AvatarCard); if (res != null) { ItemList.ItemList_.Add(res.ToProto()); @@ -397,7 +390,8 @@ namespace EggLink.DanhengServer.Game.Mission GameData.RewardDataData.TryGetValue(i, out var reward); reward?.GetItems().ForEach(j => { - var res = Player.InventoryManager!.AddItem(j.Item1, j.Item2, false); + GameData.ItemConfigData.TryGetValue(j.Item1, out var item); + var res = Player.InventoryManager!.AddItem(j.Item1, j.Item2, item?.ItemMainType == ItemMainTypeEnum.AvatarCard); if (res != null) { ItemList.ItemList_.Add(res.ToProto()); @@ -492,6 +486,53 @@ namespace EggLink.DanhengServer.Game.Mission } } + public void AddMissionProgress(int missionId, int progress) + { + if (!ConfigManager.Config.ServerOption.EnableMission) return; + + Data.SubMissionProgressDict.TryGetValue(missionId, out var currentProgress); + Data.SubMissionProgressDict[missionId] = currentProgress + progress; + GameData.SubMissionData.TryGetValue(missionId, out var subMission); + if (subMission == null) return; + + if ((currentProgress + progress) >= (subMission.SubMissionInfo?.Progress ?? 1)) + { + return; + } + + var sync = new Proto.MissionSync(); + sync.MissionList.Add(new Proto.Mission() + { + Id = (uint)missionId, + Progress = (uint)(currentProgress + progress), + }); + + Player.SendPacket(new PacketPlayerSyncScNotify(sync)); + } + + public void SetMissionProgress(int missionId, int progress) + { + if (!ConfigManager.Config.ServerOption.EnableMission) return; + + Data.SubMissionProgressDict[missionId] = progress; + GameData.SubMissionData.TryGetValue(missionId, out var subMission); + if (subMission == null) return; + + if (progress >= (subMission.SubMissionInfo?.Progress ?? 1)) + { + return; + } + + var sync = new Proto.MissionSync(); + sync.MissionList.Add(new Proto.Mission() + { + Id = (uint)missionId, + Progress = (uint)progress, + }); + + Player.SendPacket(new PacketPlayerSyncScNotify(sync)); + } + #endregion #region Mission Status @@ -545,6 +586,15 @@ namespace EggLink.DanhengServer.Game.Mission return list; } + public int GetMissionProgress(int missionId) + { + GameData.SubMissionData.TryGetValue(missionId, out var subMission); + if (!ConfigManager.Config.ServerOption.EnableMission) return subMission?.SubMissionInfo?.Progress ?? 0; + + Data.SubMissionProgressDict.TryGetValue(missionId, out var progress); + return progress; + } + #endregion #region Handlers @@ -606,6 +656,7 @@ namespace EggLink.DanhengServer.Game.Mission { Id = (uint)subMission.ID, Status = GetSubMissionStatus(subMission.ID).ToProto(), + Progress = (uint)GetMissionProgress(subMission.ID), }); } } @@ -621,10 +672,6 @@ namespace EggLink.DanhengServer.Game.Mission { info.SceneMissionInfo.AcceptMainMissionIdList.Add((uint)mainMission.MainMissionID); } - info.SceneMissionInfo.COLDABMKNDH.Add(new Proto.GBGPCCLIIEA() - { - MainMissionId = (uint)mainMission.MainMissionID, - }); break; // only one } } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 6766cd65..ada7898b 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -36,6 +36,7 @@ using EggLink.DanhengServer.Game.Task; using EggLink.DanhengServer.GameServer.Game.Mail; using EggLink.DanhengServer.GameServer.Game.Raid; using EggLink.DanhengServer.GameServer.Game.Mission; +using EggLink.DanhengServer.GameServer.Game.Task; namespace EggLink.DanhengServer.Game.Player { @@ -63,7 +64,7 @@ namespace EggLink.DanhengServer.Game.Player public ShopService? ShopService { get; private set; } public ChallengeManager? ChallengeManager { get; private set; } - public PerformanceTrigger? PerformanceTrigger { get; private set; } + public TaskManager? TaskManager { get; private set; } #endregion @@ -131,7 +132,7 @@ namespace EggLink.DanhengServer.Game.Player ShopService = new(this); ChessRogueManager = new(this); ChallengeManager = new(this); - PerformanceTrigger = new(this); + TaskManager = new(this); RaidManager = new(this); StoryLineManager = new(this); diff --git a/GameServer/Game/Raid/RaidManager.cs b/GameServer/Game/Raid/RaidManager.cs index 75420073..248a4b08 100644 --- a/GameServer/Game/Raid/RaidManager.cs +++ b/GameServer/Game/Raid/RaidManager.cs @@ -195,28 +195,9 @@ namespace EggLink.DanhengServer.GameServer.Game.Raid GameData.RaidConfigData.TryGetValue(RaidData.CurRaidId * 100 + record.WorldLevel, out var config); if (config == null) return; - if (Player.LineupManager!.GetCurLineup()!.IsExtraLineup()) - { - Player.LineupManager!.SetExtraLineup(ExtraLineupType.LineupNone, []); - Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); - } - - if (config.FinishEntranceID > 0) - { - Player.EnterScene(config.FinishEntranceID, 0, true); - } - else - { - Player.EnterScene(record.OldEntryId, 0, true); - Player.MoveTo(record.OldPos, record.OldRot); - } record.Status = RaidStatus.Finish; Player.SendPacket(new PacketRaidInfoNotify(record)); - - // reset raid info - RaidData.CurRaidId = 0; - RaidData.CurRaidWorldLevel = 0; } public void LeaveRaid(bool save) @@ -239,21 +220,36 @@ namespace EggLink.DanhengServer.GameServer.Game.Raid Player.SendPacket(new PacketSyncLineupNotify(Player.LineupManager!.GetCurLineup()!)); } - Player.EnterScene(record.OldEntryId, 0, true); - Player.MoveTo(record.OldPos, record.OldRot); + if (record.Status == RaidStatus.Finish) + { + if (config.FinishEntranceID > 0) + { + Player.EnterScene(config.FinishEntranceID, 0, true); + } + else + { + Player.EnterScene(record.OldEntryId, 0, true); + Player.MoveTo(record.OldPos, record.OldRot); + } + } + else + { + Player.EnterScene(record.OldEntryId, 0, true); + Player.MoveTo(record.OldPos, record.OldRot); - // reset raid info - record.Status = RaidStatus.Doing; + // reset raid info + record.Status = RaidStatus.Doing; - Player.SendPacket(new PacketRaidInfoNotify(record)); + Player.SendPacket(new PacketRaidInfoNotify(record)); + + if (!save) + { + ClearRaid(record.RaidId, record.WorldLevel); + } + } RaidData.CurRaidId = 0; RaidData.CurRaidWorldLevel = 0; - - if (!save) - { - ClearRaid(record.RaidId, record.WorldLevel); - } } public void ClearRaid(int raidId, int worldLevel) diff --git a/GameServer/Game/Scene/Entity/EntityProp.cs b/GameServer/Game/Scene/Entity/EntityProp.cs index 10c9288d..0a4bb691 100644 --- a/GameServer/Game/Scene/Entity/EntityProp.cs +++ b/GameServer/Game/Scene/Entity/EntityProp.cs @@ -31,6 +31,7 @@ namespace EggLink.DanhengServer.Game.Scene.Entity public void SetState(PropStateEnum state) { + if (state == State) return; SetState(state, Scene.IsLoaded); } diff --git a/GameServer/Game/Scene/SceneEntityLoader.cs b/GameServer/Game/Scene/SceneEntityLoader.cs index c57f1bb9..c7d906f0 100644 --- a/GameServer/Game/Scene/SceneEntityLoader.cs +++ b/GameServer/Game/Scene/SceneEntityLoader.cs @@ -320,6 +320,12 @@ namespace EggLink.DanhengServer.Game.Scene prop.SetState(PropStateEnum.Open); Scene.AddEntity(prop, sendPacket); } + + if (group.GroupName.Contains("Machine")) + { + prop.SetState(PropStateEnum.Open); + Scene.AddEntity(prop, sendPacket); + } } else { diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index 86d4372a..ebb2ea54 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -14,6 +14,7 @@ using EggLink.DanhengServer.Server.Packet; using EggLink.DanhengServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Util; +using System.Numerics; namespace EggLink.DanhengServer.Game.Scene { @@ -77,6 +78,8 @@ namespace EggLink.DanhengServer.Game.Scene } EntityLoader.LoadEntity(); + + Player.TaskManager?.SceneTaskTrigger.TriggerFloor(PlaneId, FloorId); } #endregion diff --git a/GameServer/Game/Task/LevelTask.cs b/GameServer/Game/Task/LevelTask.cs new file mode 100644 index 00000000..ae16e68e --- /dev/null +++ b/GameServer/Game/Task/LevelTask.cs @@ -0,0 +1,424 @@ +using EggLink.DanhengServer.Data.Config.Task; +using EggLink.DanhengServer.Data.Config; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Numerics; +using System.Text; +using System.Threading.Tasks; +using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Game.Scene.Entity; +using EggLink.DanhengServer.Enums; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Enums.Task; +using EggLink.DanhengServer.Enums.Scene; +using EggLink.DanhengServer.Proto; + +namespace EggLink.DanhengServer.GameServer.Game.Task +{ + public class LevelTask(PlayerInstance player) + { + public PlayerInstance Player { get; } = player; + + #region Manage + + public void TriggerInitAct(LevelInitSequeceConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + foreach (var task in act.TaskList) + { + TriggerTask(task, subMission, group); + } + } + + public void TriggerStartAct(LevelStartSequeceConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + foreach (var task in act.TaskList) + { + TriggerTask(task, subMission, group); + } + } + + private void TriggerTask(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + try + { + var methodName = act.Type.Replace("RPG.GameCore.", ""); + + var method = GetType().GetMethod(methodName); + if (method != null) + { + _ = method.Invoke(this, [act, subMission, group]); + } + } + catch + { + } + } + + #endregion + + #region Task + + public void PlayMessage(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is PlayMessage message) + { + Player.MessageManager!.AddMessageSection(message.MessageSectionID); + } + } + + public void DestroyProp(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is DestroyProp destroyProp) + { + foreach (var entity in Player.SceneInstance!.Entities.Values) + { + if (entity is EntityProp prop && prop.GroupID == destroyProp.GroupID.GetValue() && prop.InstId == destroyProp.ID.GetValue()) + { + Player.SceneInstance.RemoveEntity(entity); + } + } + } + } + + public void EnterMap(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is EnterMap enterMap) + { + Player.EnterMissionScene(enterMap.EntranceID, enterMap.GroupID, enterMap.AnchorID, true); + } + } + + public void EnterMapByCondition(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is EnterMapByCondition enterMapByCondition) + { + Player.EnterMissionScene(enterMapByCondition.EntranceID.GetValue(), 0, 0, true); + } + } + + public void TriggerPerformance(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is TriggerPerformance triggerPerformance) + { + if (triggerPerformance.PerformanceType != ELevelPerformanceTypeEnum.E) return; + Player.TaskManager?.PerformanceTrigger.TriggerPerformance(triggerPerformance.PerformanceID, subMission); + } + } + + public void PredicateTaskList(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is PredicateTaskList predicateTaskList) + { + // handle predicateCondition + var methodName = predicateTaskList.Predicate.Type.Replace("RPG.GameCore.", ""); + + var method = GetType().GetMethod(methodName); + if (method != null) + { + var resp = method.Invoke(this, [predicateTaskList.Predicate, subMission, group]); + if (resp is bool result && result) + { + foreach (var task in predicateTaskList.SuccessTaskList) + { + TriggerTask(task, subMission, group); + } + } + else + { + foreach (var task in predicateTaskList.FailedTaskList) + { + TriggerTask(task, subMission, group); + } + } + } + } + } + + public void ChangePropState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.PropState) + { + foreach (var entity in Player.SceneInstance!.Entities.Values) + { + if (entity is EntityProp prop && prop.GroupID == subMission.SubMissionInfo.ParamInt1 && prop.InstId == subMission.SubMissionInfo.ParamInt2) + { + try + { + if (prop.Excel.PropStateList.Contains(PropStateEnum.Closed)) + { + prop.SetState(PropStateEnum.Closed); + } + else + { + prop.SetState(prop.Excel.PropStateList[prop.Excel.PropStateList.IndexOf(prop.State) + 1]); + + // Elevator + foreach (var id in prop.PropInfo.UnlockControllerID) + { + foreach (var entity2 in Player.SceneInstance!.Entities.Values) + { + if (entity2 is EntityProp prop2 && prop2.GroupID == id.Key && id.Value.Contains(prop2.InstId)) + { + prop2.SetState(PropStateEnum.Closed); + } + } + } + } + } + catch + { + } + } + } + } + } + + public void CreateTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar) + { + Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1); + } + + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList) + { + subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x)); + } + } + + public void ReplaceTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar) + { + Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false)); + Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1); + } + + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList) + { + Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false)); + subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x)); + } + } + + public void ReplaceVirtualTeam(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (!(Player.LineupManager!.GetCurLineup()?.IsExtraLineup() == true)) + { + return; + } + + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar) + { + Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false)); + Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1); + } + + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList) + { + Player.LineupManager!.GetCurLineup()?.BaseAvatars?.ForEach(x => Player.LineupManager!.RemoveAvatarFromCurTeam(x.BaseAvatarId, false)); + subMission.SubMissionInfo.ParamIntList?.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x)); + } + } + + public void CreateHeroTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatar) + { + Player.LineupManager!.AddAvatarToCurTeam(subMission.SubMissionInfo.ParamInt1); + } + + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.GetTrialAvatarList) + { + List list = [.. subMission.SubMissionInfo.ParamIntList]; + + if (list.Count > 0) + { + if (Player.Data.CurrentGender == Gender.Man) + { + foreach (var avatar in subMission.SubMissionInfo?.ParamIntList ?? []) + { + if (avatar > 10000) // else is Base Avatar + { + if (avatar.ToString().EndsWith("8002") || + avatar.ToString().EndsWith("8004") || + avatar.ToString().EndsWith("8006")) + { + list.Remove(avatar); + } + } + } + } + else + { + foreach (var avatar in subMission.SubMissionInfo?.ParamIntList ?? []) + { + if (avatar > 10000) // else is Base Avatar + { + if (avatar.ToString().EndsWith("8001") || + avatar.ToString().EndsWith("8003") || + avatar.ToString().EndsWith("8005")) + { + list.Remove(avatar); + } + } + } + } + } + + list.ForEach(x => Player.LineupManager!.AddAvatarToCurTeam(x)); + } + } + + public void DestroyTrialPlayer(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (subMission.SubMissionInfo?.FinishType == MissionFinishTypeEnum.DelTrialAvatar) + { + Player.LineupManager!.RemoveAvatarFromCurTeam(subMission.SubMissionInfo.ParamInt1); + } + } + + public void ChangeGroupState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (group != null) + { + foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? []) + { + if (entity is EntityProp prop && prop.GroupID == group.Id) + { + if (prop.Excel.PropStateList.Contains(PropStateEnum.Open)) + { + prop.SetState(PropStateEnum.Open); + } + } + } + } + } + + public void TriggerEntityServerEvent(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (group != null) + { + foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? []) + { + if (entity is EntityProp prop && prop.GroupID == group.Id) + { + if (prop.Excel.PropStateList.Contains(PropStateEnum.Open) && (prop.State == PropStateEnum.Closed || prop.State == PropStateEnum.Locked)) + { + prop.SetState(PropStateEnum.Open); + } + } + } + } + } + + public void TriggerEntityEvent(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is TriggerEntityEvent triggerEntityEvent) + { + if (group != null) + { + foreach (var entity in Player.SceneInstance?.Entities.Values.ToList() ?? []) + { + if (entity is EntityProp prop && prop.GroupID == group.Id && prop.InstId == triggerEntityEvent.InstanceID.GetValue()) + { + if (prop.Excel.PropStateList.Contains(PropStateEnum.Closed)) + { + prop.SetState(PropStateEnum.Closed); + } + } + } + } + } + } + + public void PropSetupUITrigger(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is PropSetupUITrigger propSetupUITrigger) + { + foreach (var task in propSetupUITrigger.ButtonCallback) + { + TriggerTask(task, subMission, group); + } + } + } + + public void PropStateExecute(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is PropStateExecute propStateExecute) + { + // handle targetType + var methodName = propStateExecute.TargetType.Type.Replace("RPG.GameCore.", ""); + + var method = GetType().GetMethod(methodName); + if (method != null) + { + var resp = method.Invoke(this, [propStateExecute.TargetType, subMission, group]); + if (resp is EntityProp result && result != null) + { + result.SetState(propStateExecute.PropState); + } + } + } + } + + #endregion + + #region Task Condition + + public bool ByCompareSubMissionState(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is ByCompareSubMissionState compare) + { + var mission = Player.MissionManager!.GetSubMissionStatus(compare.SubMissionID); + return mission.ToStateEnum() == compare.SubMissionState; + } + + return false; + } + + public bool ByCompareFloorSavedValue(TaskConfigInfo act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is ByCompareFloorSavedValue compare) + { + var value = Player.SceneData!.FloorSavedData.GetValueOrDefault(Player.Data.FloorId, []); + return compare.CompareType switch + { + CompareTypeEnum.Equal => value.GetValueOrDefault(compare.Name, 0) == compare.CompareValue, + CompareTypeEnum.Greater => value.GetValueOrDefault(compare.Name, 0) > compare.CompareValue, + CompareTypeEnum.Less => value.GetValueOrDefault(compare.Name, 0) < compare.CompareValue, + CompareTypeEnum.GreaterEqual => value.GetValueOrDefault(compare.Name, 0) >= compare.CompareValue, + CompareTypeEnum.LessEqual => value.GetValueOrDefault(compare.Name, 0) <= compare.CompareValue, + CompareTypeEnum.NotEqual => value.GetValueOrDefault(compare.Name, 0) != compare.CompareValue, + _ => false, + }; + } + + return false; + } + + #endregion + + #region Prop Target + + public EntityProp? TargetFetchAdvPropEx(TargetEvaluator act, SubMissionExcel subMission, GroupInfo? group = null) + { + if (act is TargetFetchAdvPropEx fetch) + { + if (fetch.FetchType != TargetFetchAdvPropFetchTypeEnum.SinglePropByPropID) return null; + foreach (var entity in Player.SceneInstance!.Entities.Values) + { + if (entity is EntityProp prop && prop.GroupID == fetch.SinglePropID.GroupID.GetValue() && prop.InstId == fetch.SinglePropID.ID.GetValue()) + { + return prop; + } + } + } + + return null; + } + + #endregion + } +} diff --git a/GameServer/Game/Task/MissionTaskTrigger.cs b/GameServer/Game/Task/MissionTaskTrigger.cs new file mode 100644 index 00000000..51013054 --- /dev/null +++ b/GameServer/Game/Task/MissionTaskTrigger.cs @@ -0,0 +1,39 @@ +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Data.Excel; +using EggLink.DanhengServer.Game.Player; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Game.Task +{ + public class MissionTaskTrigger(PlayerInstance player) + { + public PlayerInstance Player { get; } = player; + + public void TriggerMissionTask(int missionId) + { + GameData.SubMissionData.TryGetValue(missionId, out var subMission); + if (subMission != null) + { + TriggerMissionTask(subMission.SubMissionTaskInfo ?? new(), subMission); + } + } + + public void TriggerMissionTask(LevelGraphConfigInfo subMissionTaskInfo, SubMissionExcel subMission) + { + foreach (var task in subMissionTaskInfo.OnInitSequece) + { + Player.TaskManager?.LevelTask.TriggerInitAct(task, subMission); + } + + foreach (var task in subMissionTaskInfo.OnStartSequece) + { + Player.TaskManager?.LevelTask.TriggerStartAct(task, subMission); + } + } + } +} diff --git a/GameServer/Game/Task/PerformanceTrigger.cs b/GameServer/Game/Task/PerformanceTrigger.cs index dabec2ae..a0012e16 100644 --- a/GameServer/Game/Task/PerformanceTrigger.cs +++ b/GameServer/Game/Task/PerformanceTrigger.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Data; using EggLink.DanhengServer.Data.Config; +using EggLink.DanhengServer.Data.Config.Task; using EggLink.DanhengServer.Data.Excel; using EggLink.DanhengServer.Game.Player; using System; @@ -10,67 +11,31 @@ using System.Threading.Tasks; namespace EggLink.DanhengServer.Game.Task { - public class PerformanceTrigger(PlayerInstance player) : BasePlayerManager(player) + public class PerformanceTrigger(PlayerInstance player) { - public void TriggerPerformance(int performanceId) + public PlayerInstance Player { get; } = player; + + public void TriggerPerformance(int performanceId, SubMissionExcel subMission) { GameData.PerformanceEData.TryGetValue(performanceId, out var excel); if (excel != null) { - TriggerPerformance(excel); + TriggerPerformance(excel, subMission); } } - public void TriggerPerformance(PerformanceEExcel excel) + public void TriggerPerformance(PerformanceEExcel excel, SubMissionExcel subMission) { if (excel.ActInfo == null) return; foreach (var act in excel.ActInfo.OnInitSequece) { - TriggerAct(act); + Player.TaskManager?.LevelTask.TriggerInitAct(act, subMission); } foreach (var act in excel.ActInfo.OnStartSequece) { - TriggerAct(act); + Player.TaskManager?.LevelTask.TriggerStartAct(act, subMission); } } - - private void TriggerAct(MissionActTaskInfo act) - { - foreach (var task in act.TaskList) - { - TriggerTask(task); - } - - foreach (var task in act.TaskList) - { - TriggerTask(task); - } - } - - private void TriggerTask(MissionActTaskInfo act) - { - try - { - var methodName = act.Type.Replace("RPG.GameCore.", ""); - - var method = GetType().GetMethod(methodName); - if (method != null) - { - _ = method.Invoke(this, [act]); - } - } catch - { - } - } - - #region Task - - public void PlayMessage(MissionActTaskInfo act) - { - Player.MessageManager!.AddMessageSection(act.MessageSectionID); - } - - #endregion } } diff --git a/GameServer/Game/Task/SceneTaskTrigger.cs b/GameServer/Game/Task/SceneTaskTrigger.cs new file mode 100644 index 00000000..e6f19f5f --- /dev/null +++ b/GameServer/Game/Task/SceneTaskTrigger.cs @@ -0,0 +1,54 @@ +using EggLink.DanhengServer.Data; +using EggLink.DanhengServer.Game.Player; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Game.Task +{ + public class SceneTaskTrigger(PlayerInstance player) + { + public PlayerInstance Player { get; } = player; + + public void TriggerFloor(int planeId, int floorId) + { + GameData.GetFloorInfo(planeId, floorId, out var floor); + if (floor == null) return; + + foreach (var group in floor.Groups.Values) + { + if (group.LevelGraphConfig == null) continue; + foreach (var task in group.LevelGraphConfig.OnInitSequece) + { + Player.TaskManager?.LevelTask.TriggerInitAct(task, new(), group); + } + + foreach (var task in group.LevelGraphConfig.OnStartSequece) + { + Player.TaskManager?.LevelTask.TriggerStartAct(task, new(), group); + } + } + } + + public void TriggerGroup(int planeId, int floorId, int groupId) + { + GameData.GetFloorInfo(planeId, floorId, out var floor); + if (floor == null) return; + if (floor.Groups.TryGetValue(groupId, out var group)) + { + if (group.LevelGraphConfig == null) return; + foreach (var task in group.LevelGraphConfig.OnInitSequece) + { + Player.TaskManager?.LevelTask.TriggerInitAct(task, new(), group); + } + + foreach (var task in group.LevelGraphConfig.OnStartSequece) + { + Player.TaskManager?.LevelTask.TriggerStartAct(task, new(), group); + } + } + } + } +} diff --git a/GameServer/Game/Task/TaskManager.cs b/GameServer/Game/Task/TaskManager.cs new file mode 100644 index 00000000..9f99c8d3 --- /dev/null +++ b/GameServer/Game/Task/TaskManager.cs @@ -0,0 +1,19 @@ +using EggLink.DanhengServer.Game; +using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Game.Task; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Game.Task +{ + public class TaskManager(PlayerInstance player) : BasePlayerManager(player) + { + public PerformanceTrigger PerformanceTrigger { get; } = new(player); + public LevelTask LevelTask { get; } = new(player); + public MissionTaskTrigger MissionTaskTrigger { get; } = new(player); + public SceneTaskTrigger SceneTaskTrigger { get; } = new(player); + } +} diff --git a/GameServer/Server/Packet/Recv/Shop/HandlerDoGachaInRollShopCsReq.cs b/GameServer/Server/Packet/Recv/Shop/HandlerDoGachaInRollShopCsReq.cs index 87360970..955a7cb8 100644 --- a/GameServer/Server/Packet/Recv/Shop/HandlerDoGachaInRollShopCsReq.cs +++ b/GameServer/Server/Packet/Recv/Shop/HandlerDoGachaInRollShopCsReq.cs @@ -4,6 +4,7 @@ using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Server.Packet.Send.Challenge; using EggLink.DanhengServer.Server.Packet.Send.Gacha; using EggLink.DanhengServer.Server.Packet.Send.Shop; +using EggLink.DanhengServer.Util; using System; using System.Collections.Generic; using System.Linq; @@ -46,7 +47,7 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Shop } }); }); - var RewardId = RewardIds.Keys.ToList()[new Random().Next(0, RewardIds.Count)]; + var RewardId = RewardIds.Keys.ToList().RandomElement(); var type = RewardIds[RewardId]; if (type < maxtype) maxtype = type; var rewardExcel = GameData.RewardDataData[(int)RewardId]; @@ -56,8 +57,11 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Shop ItemId = rewardItems[0].Item1, Count = rewardItems[0].Item2 }; - - itemList.ItemList_.Add(itemData.ToProto()); + var rsp = connection.Player!.InventoryManager!.AddItem(itemData.ItemId, itemData.Count); + if (rsp != null) + { + itemList.ItemList_.Add(rsp.ToProto()); + } connection.Player!.InventoryManager!.RemoveItem(122000, 1); } connection.SendPacket(new PacketDoGachaInRollShopScRsp(req.RollShopId, itemList, maxtype)); diff --git a/GameServer/Server/Packet/Send/Mission/PacketGetMissionDataScRsp.cs b/GameServer/Server/Packet/Send/Mission/PacketGetMissionDataScRsp.cs index eb51955c..16ba518d 100644 --- a/GameServer/Server/Packet/Send/Mission/PacketGetMissionDataScRsp.cs +++ b/GameServer/Server/Packet/Send/Mission/PacketGetMissionDataScRsp.cs @@ -33,7 +33,8 @@ namespace EggLink.DanhengServer.Server.Packet.Send.Mission proto.MissionList.Add(new Proto.Mission() { Id = (uint)mission, - Status = MissionStatus.MissionDoing + Status = MissionStatus.MissionDoing, + Progress = (uint)player.MissionManager!.GetMissionProgress(mission) }); } } diff --git a/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs b/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs index c31176bf..96309325 100644 --- a/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs +++ b/GameServer/Server/Packet/Send/Mission/PacketStoryLineInfoScNotify.cs @@ -24,6 +24,11 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Mission RunningStoryLineIdList = { storyLineIdList }, }; + if (!proto.RunningStoryLineIdList.Contains(proto.CurStoryLineId)) + { + proto.RunningStoryLineIdList.Add(proto.CurStoryLineId); + } + GameData.StroyLineTrialAvatarDataData.TryGetValue(player.StoryLineManager!.StoryLineData.CurStoryLineId, out var storyExcel); if (storyExcel != null) { diff --git a/GameServer/Server/Packet/Send/Scene/PacketUpdateFloorSavedValueNotify.cs b/GameServer/Server/Packet/Send/Scene/PacketUpdateFloorSavedValueNotify.cs new file mode 100644 index 00000000..cdb5ff4a --- /dev/null +++ b/GameServer/Server/Packet/Send/Scene/PacketUpdateFloorSavedValueNotify.cs @@ -0,0 +1,21 @@ +using EggLink.DanhengServer.Proto; +using EggLink.DanhengServer.Server.Packet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene +{ + public class PacketUpdateFloorSavedValueNotify : BasePacket + { + public PacketUpdateFloorSavedValueNotify(string name, int savedValue) : base(CmdIds.UpdateFloorSavedValueNotify) + { + var proto = new UpdateFloorSavedValueNotify(); + proto.SavedValue.Add(name, savedValue); + + SetData(proto); + } + } +}