From 03709bf7dd47c8776f6a19eff8cb5722e73e5abe Mon Sep 17 00:00:00 2001 From: Nick Date: Sun, 19 Jun 2022 14:31:13 -0400 Subject: [PATCH] Allow creating achievement reveals from props --- NewHorizons/Builder/ShipLog/RevealBuilder.cs | 85 +++++++++++++++----- NewHorizons/External/Modules/PropModule.cs | 5 ++ 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/NewHorizons/Builder/ShipLog/RevealBuilder.cs b/NewHorizons/Builder/ShipLog/RevealBuilder.cs index 97a397c1..43133771 100644 --- a/NewHorizons/Builder/ShipLog/RevealBuilder.cs +++ b/NewHorizons/Builder/ShipLog/RevealBuilder.cs @@ -1,4 +1,5 @@ -using NewHorizons.External.Modules; +using NewHorizons.Components.Achievement; +using NewHorizons.External.Modules; using OWML.Common; using UnityEngine; using Logger = NewHorizons.Utility.Logger; @@ -46,35 +47,77 @@ namespace NewHorizons.Builder.ShipLog private static void MakeTrigger(GameObject go, Sector sector, PropModule.RevealInfo info, IModBehaviour mod) { - SphereShape newShape = MakeShape(go, info, Shape.CollisionMode.Volume); - OWTriggerVolume newVolume = go.AddComponent(); - newVolume._shape = newShape; - ShipLogFactListTriggerVolume volume = go.AddComponent(); - volume._factIDs = info.reveals; + var shape = MakeShape(go, info, Shape.CollisionMode.Volume); + + var volume = go.AddComponent(); + volume._shape = shape; + + if (info.reveals != null) + { + var factRevealVolume = go.AddComponent(); + factRevealVolume._factIDs = info.reveals; + } + + if (!string.IsNullOrEmpty(info.achievementID)) + { + var achievementVolume = go.AddComponent(); + achievementVolume.achievementID = info.achievementID; + } } private static void MakeObservable(GameObject go, Sector sector, PropModule.RevealInfo info, IModBehaviour mod) { go.layer = LayerMask.NameToLayer("Interactible"); - SphereCollider newSphere = go.AddComponent(); - newSphere.radius = info.radius; - OWCollider newCollider = go.AddComponent(); - ShipLogFactObserveTrigger newObserveTrigger = go.AddComponent(); - newObserveTrigger._factIDs = info.reveals; - newObserveTrigger._maxViewDistance = info.maxDistance == -1f ? 2f : info.maxDistance; - newObserveTrigger._maxViewAngle = info.maxAngle; - newObserveTrigger._owCollider = newCollider; - newObserveTrigger._disableColliderOnRevealFact = true; + + var sphere = go.AddComponent(); + sphere.radius = info.radius; + + var collider = go.AddComponent(); + + var maxDistance = info.maxDistance == -1f ? 2f : info.maxDistance; + + if (info.reveals != null) + { + var observeTrigger = go.AddComponent(); + observeTrigger._factIDs = info.reveals; + observeTrigger._maxViewDistance = maxDistance; + observeTrigger._maxViewAngle = info.maxAngle; + observeTrigger._owCollider = collider; + observeTrigger._disableColliderOnRevealFact = true; + } + + if (!string.IsNullOrEmpty(info.achievementID)) + { + var achievementTrigger = go.AddComponent(); + achievementTrigger.achievementID = info.achievementID; + achievementTrigger.disableColliderOnUnlockAchievement = true; + achievementTrigger.maxViewDistance = maxDistance; + achievementTrigger.maxViewAngle = info.maxAngle; + } } private static void MakeSnapshot(GameObject go, Sector sector, PropModule.RevealInfo info, IModBehaviour mod) { - SphereShape newShape = MakeShape(go, info, Shape.CollisionMode.Manual); - ShapeVisibilityTracker newTracker = go.AddComponent(); - newTracker._shapes = new Shape[] { newShape }; - ShipLogFactSnapshotTrigger newSnapshotTrigger = go.AddComponent(); - newSnapshotTrigger._maxDistance = info.maxDistance == -1f ? 200f : info.maxDistance; - newSnapshotTrigger._factIDs = info.reveals; + var shape = MakeShape(go, info, Shape.CollisionMode.Manual); + + var visibilityTracker = go.AddComponent(); + visibilityTracker._shapes = new Shape[] { shape }; + + var maxDistance = info.maxDistance == -1f ? 200f : info.maxDistance; + + if (info.reveals != null) + { + var snapshotTrigger = go.AddComponent(); + snapshotTrigger._maxDistance = maxDistance; + snapshotTrigger._factIDs = info.reveals; + } + + if (!string.IsNullOrEmpty(info.achievementID)) + { + var achievementTrigger = go.AddComponent(); + achievementTrigger.maxDistance = maxDistance; + achievementTrigger.achievementID = info.achievementID; + } } } } diff --git a/NewHorizons/External/Modules/PropModule.cs b/NewHorizons/External/Modules/PropModule.cs index 9414d1eb..a46a1ecd 100644 --- a/NewHorizons/External/Modules/PropModule.cs +++ b/NewHorizons/External/Modules/PropModule.cs @@ -385,6 +385,11 @@ namespace NewHorizons.External.Modules /// A list of facts to reveal /// public string[] reveals; + + /// + /// An achievement to unlock. Optional. + /// + public string achievementID; } [JsonObject]