diff --git a/NewHorizons/Builder/Props/RaftBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs similarity index 85% rename from NewHorizons/Builder/Props/RaftBuilder.cs rename to NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs index 59f734bf..5747c71b 100644 --- a/NewHorizons/Builder/Props/RaftBuilder.cs +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftBuilder.cs @@ -5,7 +5,7 @@ using NewHorizons.Utility; using NewHorizons.Utility.OWML; using UnityEngine; -namespace NewHorizons.Builder.Props +namespace NewHorizons.Builder.Props.EchoesOfTheEye { public static class RaftBuilder { @@ -91,6 +91,21 @@ namespace NewHorizons.Builder.Props raftObject.SetActive(true); + if (planetGO != null && !string.IsNullOrEmpty(info.dockPath)) + { + var dockTransform = planetGO.transform.Find(info.dockPath); + if (dockTransform != null && dockTransform.TryGetComponent(out RaftDock raftDock)) + { + raftController.SkipSuspendOnStart(); + raftDock._startRaft = raftController; + raftDock._raft = raftController; + } + else + { + NHLogger.LogError($"Cannot find raft dock object at path: {planetGO.name}/{info.dockPath}"); + } + } + return raftObject; } } diff --git a/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs new file mode 100644 index 00000000..834e82ad --- /dev/null +++ b/NewHorizons/Builder/Props/EchoesOfTheEye/RaftDockBuilder.cs @@ -0,0 +1,51 @@ +using NewHorizons.Components.Props; +using NewHorizons.External.Modules.Props; +using NewHorizons.External.Modules.Props.EchoesOfTheEye; +using NewHorizons.Handlers; +using NewHorizons.Utility; +using NewHorizons.Utility.OWML; +using OWML.Common; +using UnityEngine; + +namespace NewHorizons.Builder.Props.EchoesOfTheEye +{ + public static class RaftDockBuilder + { + private static GameObject _prefab; + + internal static void InitPrefab() + { + if (_prefab == null) + { + _prefab = SearchUtilities.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Structures_Zone1/RaftHouse_ArrivalPatio_Zone1/Interactables_RaftHouse_ArrivalPatio_Zone1/Prefab_IP_RaftDock").InstantiateInactive().Rename("Prefab_RaftDock").DontDestroyOnLoad(); + if (_prefab == null) + { + NHLogger.LogWarning($"Tried to make a raft dock but couldn't. Do you have the DLC installed?"); + return; + } + else + { + _prefab.AddComponent()._destroyOnDLCNotOwned = true; + var raftDock = _prefab.GetComponent(); + raftDock._startRaft = null; + raftDock._floodSensor = null; + Object.DestroyImmediate(_prefab.FindChild("FloodSensor")); + Object.DestroyImmediate(_prefab.FindChild("FloodSensor_RaftHouseArrivalPatio_NoDelay")); + } + } + } + + public static GameObject Make(GameObject planetGO, Sector sector, RaftDockInfo info, IModBehaviour mod) + { + InitPrefab(); + + if (_prefab == null || sector == null) return null; + + var dockObject = DetailBuilder.Make(planetGO, sector, mod, _prefab, new DetailInfo(info)); + + //var raftDock = dockObject.GetComponent(); + + return dockObject; + } + } +} diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 579d5e21..fb8d21c7 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -114,6 +114,7 @@ namespace NewHorizons.Builder.Props MakeGeneralProps(go, config.Props.grappleTotems, (totem) => GrappleTotemBuilder.Make(go, sector, totem, mod)); MakeGeneralProps(go, config.Props.dreamCampfires, (campfire) => DreamCampfireBuilder.Make(go, sector, campfire, mod), (campfire) => campfire.id); MakeGeneralProps(go, config.Props.dreamArrivalPoints, (point) => DreamArrivalPointBuilder.Make(go, sector, point, mod), (point) => point.id); + MakeGeneralProps(go, config.Props.raftDocks, (dock) => RaftDockBuilder.Make(go, sector, dock, mod)); MakeGeneralProps(go, config.Props.rafts, (raft) => RaftBuilder.Make(go, sector, raft, planetBody)); } MakeGeneralProps(go, config.Props.tornados, (tornado) => TornadoBuilder.Make(go, sector, tornado, config.Atmosphere?.clouds != null)); diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index 4a162bd8..1f7806ef 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -58,6 +58,11 @@ namespace NewHorizons.External.Modules /// public RaftInfo[] rafts; + /// + /// Add raft docks to this planet (requires Echoes of the Eye DLC) + /// + public RaftDockInfo[] raftDocks; + /// /// Scatter props around this planet's surface /// diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftDockInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftDockInfo.cs new file mode 100644 index 00000000..37730991 --- /dev/null +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftDockInfo.cs @@ -0,0 +1,10 @@ +using Newtonsoft.Json; +using System.ComponentModel; + +namespace NewHorizons.External.Modules.Props.EchoesOfTheEye +{ + [JsonObject] + public class RaftDockInfo : GeneralPropInfo + { + } +} diff --git a/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftInfo.cs b/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftInfo.cs index d248679e..61c3a1dd 100644 --- a/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftInfo.cs +++ b/NewHorizons/External/Modules/Props/EchoesOfTheEye/RaftInfo.cs @@ -10,6 +10,11 @@ namespace NewHorizons.External.Modules.Props.EchoesOfTheEye /// Acceleration of the raft. Default acceleration is 5. /// [DefaultValue(5f)] public float acceleration = 5f; + + /// + /// Path to the dock this raft will start attached to. + /// + public string dockPath; } } diff --git a/NewHorizons/Main.cs b/NewHorizons/Main.cs index f81400a9..855372a2 100644 --- a/NewHorizons/Main.cs +++ b/NewHorizons/Main.cs @@ -382,6 +382,7 @@ namespace NewHorizons ProjectionBuilder.InitPrefabs(); CloakBuilder.InitPrefab(); RaftBuilder.InitPrefab(); + RaftDockBuilder.InitPrefab(); DreamCampfireBuilder.InitPrefab(); DreamArrivalPointBuilder.InitPrefab(); }