diff --git a/Common/Data/Config/Scene/GroupInfo.cs b/Common/Data/Config/Scene/GroupInfo.cs index 9419462f..9a41460c 100644 --- a/Common/Data/Config/Scene/GroupInfo.cs +++ b/Common/Data/Config/Scene/GroupInfo.cs @@ -26,6 +26,7 @@ public class GroupInfo public bool LoadOnInitial { get; set; } public string GroupName { get; set; } = ""; public SavedValueLoadCondition SavedValueCondition { get; set; } = new(); + public AtmosphereCondition AtmosphereCondition { get; set; } = new(); public LoadCondition LoadCondition { get; set; } = new(); public LoadCondition UnloadCondition { get; set; } = new(); public LoadCondition ForceUnloadCondition { get; set; } = new(); @@ -46,6 +47,7 @@ public class GroupInfo [JsonIgnore] public Dictionary> PropTriggerCustomString { get; set; } = []; [JsonIgnore] public List ControlFloorSavedValue { get; set; } = []; [JsonIgnore] public List RelatedBattleId { get; set; } = []; + [JsonIgnore] public List RelatedMissionId { get; set; } = []; public void Load() { @@ -84,9 +86,28 @@ public class GroupInfo } } } + + if (LoadSide != GroupLoadSideEnum.Client) return; + foreach (var info in AtmosphereCondition.Conditions) + { + if (info.TryGetValue("SubMissionID", out var value) && value is long v) + { + // try cast to int + var missionId = (int)v; + RelatedMissionId.Add(missionId); + } + } } } +public class AtmosphereCondition +{ + public List> Conditions { get; set; } = []; + + [JsonConverter(typeof(StringEnumConverter))] + public OperationEnum Operation { get; set; } = OperationEnum.And; +} + public class LoadCondition { public List Conditions { get; set; } = []; diff --git a/GameServer/Game/Mission/MissionManager.cs b/GameServer/Game/Mission/MissionManager.cs index fe217aeb..53519418 100644 --- a/GameServer/Game/Mission/MissionManager.cs +++ b/GameServer/Game/Mission/MissionManager.cs @@ -641,10 +641,16 @@ public class MissionManager(PlayerInstance player) : BasePlayerManager(player) public void OnLoadScene(SceneInfo info) { + var targetSubIds = + Player.SceneInstance?.FloorInfo?.Groups.Values.SelectMany(x => x.RelatedMissionId).ToList() ?? []; + + HashSet mainIds = []; foreach (var mainMission in GameData.MainMissionData.Values) { - foreach (var subMission in mainMission.MissionInfo?.SubMissionList ?? []) - if (subMission.LevelFloorID == info.FloorId) + foreach (var subMission in mainMission.MissionInfo.SubMissionList) + { + if (targetSubIds.Contains(subMission.ID)) + { info.SceneMissionInfo.SubMissionStatusList.Add(new Proto.Mission { Id = (uint)subMission.ID, @@ -652,15 +658,17 @@ public class MissionManager(PlayerInstance player) : BasePlayerManager(player) Progress = (uint)GetMissionProgress(subMission.ID) }); - foreach (var subMission in mainMission.MissionInfo?.SubMissionList ?? []) - if (subMission.LevelFloorID == info.FloorId) - { - if (GetMainMissionStatus(mainMission.MainMissionID) == MissionPhaseEnum.Finish) - info.SceneMissionInfo.FinishedMainMissionIdList.Add((uint)mainMission.MainMissionID); - else if (GetMainMissionStatus(mainMission.MainMissionID) == MissionPhaseEnum.Accept) - info.SceneMissionInfo.UnfinishedMainMissionIdList.Add((uint)mainMission.MainMissionID); - break; // only one + mainIds.Add(mainMission.MainMissionID); } + } + } + + foreach (var mainId in mainIds) + { + if (GetMainMissionStatus(mainId) == MissionPhaseEnum.Finish) + info.SceneMissionInfo.FinishedMainMissionIdList.Add((uint)mainId); + else if (GetMainMissionStatus(mainId) == MissionPhaseEnum.Accept) + info.SceneMissionInfo.UnfinishedMainMissionIdList.Add((uint)mainId); } } diff --git a/GameServer/Game/Scene/SceneEntityLoader.cs b/GameServer/Game/Scene/SceneEntityLoader.cs index a1b22beb..5af4d089 100644 --- a/GameServer/Game/Scene/SceneEntityLoader.cs +++ b/GameServer/Game/Scene/SceneEntityLoader.cs @@ -175,6 +175,8 @@ public class SceneEntityLoader(SceneInstance scene) x.FinishType == MissionFinishTypeEnum.StageWin && info.RelatedBattleId.Contains(x.ParamInt1))) return null; // mission not activated + // TODO atmosphere conditions + // load Scene.Groups.Add(info.Id); // add group to loaded groups