diff --git a/Common/Data/Config/Scene/FloorInfo.cs b/Common/Data/Config/Scene/FloorInfo.cs index fe513323..75a0dc39 100644 --- a/Common/Data/Config/Scene/FloorInfo.cs +++ b/Common/Data/Config/Scene/FloorInfo.cs @@ -114,12 +114,16 @@ public class FloorDimensionInfo public void OnLoad(FloorInfo floor) { foreach (var data in SavedValues) + { + if (floor.FloorSavedValue.Any(x => x.Name == data.Name)) continue; + floor.FloorSavedValue.Add(new FloorSavedValueInfo { ID = data.ID, Name = data.Name, DefaultValue = data.MaxValue }); + } foreach (var index in GroupIndexList) GroupIDList.Add(floor.GroupInstanceList[index].ID); } diff --git a/Common/Data/Config/Scene/GroupInfo.cs b/Common/Data/Config/Scene/GroupInfo.cs index 1d5fa9cf..90996ca2 100644 --- a/Common/Data/Config/Scene/GroupInfo.cs +++ b/Common/Data/Config/Scene/GroupInfo.cs @@ -1,4 +1,5 @@ -using EggLink.DanhengServer.Database.Quests; +using EggLink.DanhengServer.Data.Config.Task; +using EggLink.DanhengServer.Database.Quests; using EggLink.DanhengServer.Enums; using EggLink.DanhengServer.Enums.Mission; using EggLink.DanhengServer.Enums.Scene; @@ -37,14 +38,51 @@ public class GroupInfo public List PropList { get; set; } = []; public List NPCList { get; set; } = []; public Dictionary GroupPropertyMap { get; set; } = []; + public ValueSourceInfo? ValueSource { get; set; } [JsonIgnore] public LevelGraphConfigInfo? LevelGraphConfig { get; set; } [JsonIgnore] public Dictionary> PropTriggerCustomString { get; set; } = []; + [JsonIgnore] public List ControlFloorSavedValue { get; set; } = []; + [JsonIgnore] public List RelatedBattleId { get; set; } = []; public void Load() { foreach (var prop in PropList) prop.Load(this); + + foreach (var source in ValueSource?.Values ?? []) + { + if (source["Key"]?.ToString() == "FSV") + { + var value = source["Value"]; + if (value != null) + ControlFloorSavedValue.Add(value.ToString()); + } + } + + foreach (var info in LevelGraphConfig?.OnInitSequece ?? []) + { + foreach (var configInfo in info.TaskList) + { + if (configInfo is TriggerBattle battle) + { + if (battle.EventID.GetValue() > 0) + RelatedBattleId.Add(battle.EventID.GetValue()); + } + } + } + + foreach (var info in LevelGraphConfig?.OnStartSequece ?? []) + { + foreach (var configInfo in info.TaskList) + { + if (configInfo is TriggerBattle battle) + { + if (battle.EventID.GetValue() > 0) + RelatedBattleId.Add(battle.EventID.GetValue()); + } + } + } } } diff --git a/Common/Data/Config/Scene/PropInfo.cs b/Common/Data/Config/Scene/PropInfo.cs index 693d722e..2058dcae 100644 --- a/Common/Data/Config/Scene/PropInfo.cs +++ b/Common/Data/Config/Scene/PropInfo.cs @@ -19,7 +19,7 @@ public class PropInfo : PositionInfo public bool IsClientOnly { get; set; } public bool LoadOnInitial { get; set; } - public PropValueSource? ValueSource { get; set; } + public ValueSourceInfo? ValueSource { get; set; } public string? InitLevelGraph { get; set; } [JsonConverter(typeof(StringEnumConverter))] @@ -87,7 +87,7 @@ public class PropInfo : PositionInfo } } -public class PropValueSource +public class ValueSourceInfo { public List Values { get; set; } = []; } \ No newline at end of file diff --git a/Common/Data/Config/Task/TriggerBattle.cs b/Common/Data/Config/Task/TriggerBattle.cs new file mode 100644 index 00000000..7935b910 --- /dev/null +++ b/Common/Data/Config/Task/TriggerBattle.cs @@ -0,0 +1,6 @@ +namespace EggLink.DanhengServer.Data.Config.Task; + +public class TriggerBattle : TaskConfigInfo +{ + public DynamicFloat EventID { get; set; } = new(); +} \ No newline at end of file diff --git a/Common/Data/ResourceManager.cs b/Common/Data/ResourceManager.cs index 5a62f18a..8db1bbaf 100644 --- a/Common/Data/ResourceManager.cs +++ b/Common/Data/ResourceManager.cs @@ -246,7 +246,6 @@ public class ResourceManager group.Id = groupInfo.ID; // Use a sorted collection or maintain order manually info.Groups[groupInfo.ID] = group; - group.Load(); // Load graph var graphPath = ConfigManager.Config.Path.ResourcePath + "/" + group.LevelGraph; @@ -260,6 +259,8 @@ public class ResourceManager var graphInfo = LevelGraphConfigInfo.LoadFromJsonObject(graphObj); group.LevelGraphConfig = graphInfo; } + + group.Load(); } } catch (Exception ex) diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 264b0f7a..df1c1b9e 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -162,8 +162,13 @@ public class PlayerInstance(PlayerData data) { Uid = Data.Uid; ActivityManager = new ActivityManager(this); - AvatarManager = new AvatarManager(this); - AvatarManager.AvatarData.DatabaseVersion = GameConstants.AvatarDbVersion; + AvatarManager = new AvatarManager(this) + { + AvatarData = + { + DatabaseVersion = GameConstants.AvatarDbVersion + } + }; LineupManager = new LineupManager(this); InventoryManager = new InventoryManager(this); diff --git a/GameServer/Game/Scene/Component/RainbowSceneComponent.cs b/GameServer/Game/Scene/Component/RainbowSceneComponent.cs index d7233d52..dcbf9c02 100644 --- a/GameServer/Game/Scene/Component/RainbowSceneComponent.cs +++ b/GameServer/Game/Scene/Component/RainbowSceneComponent.cs @@ -130,20 +130,7 @@ public class RainbowSceneComponent(SceneInstance scene) : BaseSceneComponent(sce if (string.IsNullOrEmpty(savedValueName)) return; // update floor saved data - if (SceneInst.Player.SceneData!.FloorSavedData.TryGetValue(SceneInst.FloorId, out var savedData)) - { - savedData[savedValueName] = savedValue; - } - else - { - SceneInst.Player.SceneData!.FloorSavedData[SceneInst.FloorId] = new Dictionary - { - { savedValueName, savedValue } - }; - } - - // send packet to client - await SceneInst.Player.SendPacket(new PacketUpdateFloorSavedValueNotify(savedValueName, savedValue, SceneInst.Player)); + await SceneInst.UpdateFloorSavedValue(savedValueName, savedValue); } private async ValueTask CallCurrentTargetPuzzlePropertyAction(Dictionary param) diff --git a/GameServer/Game/Scene/SceneEntityLoader.cs b/GameServer/Game/Scene/SceneEntityLoader.cs index 27c0d399..9d815c89 100644 --- a/GameServer/Game/Scene/SceneEntityLoader.cs +++ b/GameServer/Game/Scene/SceneEntityLoader.cs @@ -130,26 +130,25 @@ public class SceneEntityLoader(SceneInstance scene) Scene.Player.MissionManager!.GetMainMissionStatus(info.OwnerMainMissionID) == MissionPhaseEnum.Accept)) return null; // check if main mission is accepted - if (Scene.FloorId == 20332001 && info.Id == 109) // certain group id - if (Scene.Player.SceneData?.FloorSavedData.GetValueOrDefault(20332001, []) - .GetValueOrDefault("ShowFeather", 0) != 1) - return null; // a temp solution for Sunday - if ((!info.LoadCondition.IsTrue(missionData) || info.UnloadCondition.IsTrue(missionData, false) || // condition: Load Condition, Unload Condition, Force Unload Condition info.ForceUnloadCondition.IsTrue(missionData, false)) && !forceLoad) return null; // check if group should be loaded forcefully - // if (!info.SavedValueCondition.IsTrue( - // Scene.Player.SceneData!.FloorSavedData.GetValueOrDefault(Scene.FloorId, [])) && - // !forceLoad) // condition: Saved Value Condition - // return null; + if (!info.SavedValueCondition.IsTrue( + Scene.Player.SceneData!.FloorSavedData.GetValueOrDefault(Scene.FloorId, [])) && + !forceLoad) // condition: Saved Value Condition + return null; if (Scene.Entities.Values.ToList().FindIndex(x => x.GroupId == info.Id) != -1) // check if group is already loaded return null; + if (!Scene.Player.MissionManager!.GetRunningSubMissionList().Any(x => + x.FinishType == MissionFinishTypeEnum.StageWin && info.RelatedBattleId.Contains(x.ParamInt1))) + return null; // mission not activated + // load Scene.Groups.Add(info.Id); // add group to loaded groups diff --git a/GameServer/Game/Scene/SceneInstance.cs b/GameServer/Game/Scene/SceneInstance.cs index 8d5c4bd4..824299d2 100644 --- a/GameServer/Game/Scene/SceneInstance.cs +++ b/GameServer/Game/Scene/SceneInstance.cs @@ -295,7 +295,9 @@ public class SceneInstance Player.SceneData.GroupPropertyData[FloorId] = groupData; } - var property = FloorInfo?.Groups.GetValueOrDefault(groupId)?.GroupPropertyMap.Values + var group = FloorInfo?.Groups.GetValueOrDefault(groupId); + if (group == null) return new GroupPropertyRefreshData(groupId, name, 0, value); + var property = group.GroupPropertyMap.Values .FirstOrDefault(x => x.Name == name); if (property == null) return new GroupPropertyRefreshData(groupId, name, 0, value); @@ -314,9 +316,33 @@ public class SceneInstance if (callEvent && GroupPropertyUpdated != null) await GroupPropertyUpdated(res); + if (name == "SGP_PuzzleState" && group.ControlFloorSavedValue.Count > 0) + { + // set fsv + foreach (var key in group.ControlFloorSavedValue) + { + await UpdateFloorSavedValue(key, value); + } + } + return res; } + public async ValueTask UpdateFloorSavedValue(string name, int value) + { + if (!Player.SceneData!.FloorSavedData.TryGetValue(FloorId, out var floorSavedData)) + { + floorSavedData = []; + Player.SceneData.FloorSavedData[FloorId] = floorSavedData; + } + + if (FloorInfo?.FloorSavedValue.All(x => x.Name != name) == true) return; // not exist + + floorSavedData[name] = value; + + await Player.SendPacket(new PacketUpdateFloorSavedValueNotify(name, value, Player)); + } + public int GetGroupProperty(int groupId, string name) { if (!Player.SceneData!.GroupPropertyData.TryGetValue(FloorId, out var groupData))