using NewHorizons.Components; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; using NewHorizons.External; using NewHorizons.Utility; using OWML.Common; using UnityEngine; using UnityEngine.UI; using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.ShipLog { public static class RevealBuilder { public static void Make(GameObject go, Sector sector, PropModule.RevealInfo info, IModBehaviour mod) { GameObject newRevealGO = MakeGameObject(go, sector, info, mod); switch (info.revealOn.ToLower()) { case "enter": MakeTrigger(newRevealGO, sector, info, mod); break; case "observe": MakeObservable(newRevealGO, sector, info, mod); break; case "snapshot": MakeSnapshot(newRevealGO, sector, info, mod); break; default: Logger.LogError("Invalid revealOn: " + info.revealOn); break; } newRevealGO.SetActive(true); } private static SphereShape MakeShape(GameObject go, PropModule.RevealInfo info, Shape.CollisionMode collisionMode) { SphereShape newShape = go.AddComponent(); newShape.radius = info.radius; newShape.SetCollisionMode(collisionMode); return newShape; } private static GameObject MakeGameObject(GameObject go, Sector sector, PropModule.RevealInfo info, IModBehaviour mod) { GameObject revealTriggerVolume = new GameObject("Reveal Volume (" + info.revealOn + ")"); revealTriggerVolume.SetActive(false); revealTriggerVolume.transform.parent = sector?.transform ?? go.transform; revealTriggerVolume.transform.localPosition = info.position; return revealTriggerVolume; } 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; } 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; } 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; } } }