diff --git a/NewHorizons/Builder/Props/SlideReelBuilder.cs b/NewHorizons/Builder/Props/ProjectionBuilder.cs similarity index 58% rename from NewHorizons/Builder/Props/SlideReelBuilder.cs rename to NewHorizons/Builder/Props/ProjectionBuilder.cs index ffebda8a..e5214014 100644 --- a/NewHorizons/Builder/Props/SlideReelBuilder.cs +++ b/NewHorizons/Builder/Props/ProjectionBuilder.cs @@ -9,21 +9,30 @@ using NewHorizons.Utility; using OWML.ModHelper; using OWML.Common; using NewHorizons.Handlers; +using Logger = NewHorizons.Utility.Logger; namespace NewHorizons.Builder.Props { - public static class SlideReelBuilder + public static class ProjectionBuilder { - private static GameObject _prefab; - public static void Make(GameObject go, Sector sector, PropModule.SlideReelInfo info, IModBehaviour mod) + private static GameObject _slideReelPrefab; + private static GameObject _autoPrefab; + public static void Make(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) { - if (_prefab == null) + if (info.type == "Auto") MakeAutoProjector(go, sector, info, mod); + else if (info.type == "SlideReel") MakeSlideReel(go, sector, info, mod); + else Logger.LogError($"Invalid projection type {info.type}"); + } + + private static void MakeSlideReel(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) + { + if (_slideReelPrefab == null) { - _prefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Sector_SlideBurningRoom_Zone1/Interactables_SlideBurningRoom_Zone1/Prefab_IP_SecretAlcove/RotationPivot/SlideReelSocket/Prefab_IP_Reel_1_LibraryPath").gameObject.InstantiateInactive(); - _prefab.name = "Prefab_IP_Reel"; + _slideReelPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone1/Sector_SlideBurningRoom_Zone1/Interactables_SlideBurningRoom_Zone1/Prefab_IP_SecretAlcove/RotationPivot/SlideReelSocket/Prefab_IP_Reel_1_LibraryPath").gameObject.InstantiateInactive(); + _slideReelPrefab.name = "Prefab_IP_Reel"; } - var slideReelObj = _prefab.InstantiateInactive(); + var slideReelObj = _slideReelPrefab.InstantiateInactive(); slideReelObj.name = $"Prefab_IP_Reel_{mod.ModHelper.Manifest.Name}"; var slideReel = slideReelObj.GetComponent(); @@ -39,7 +48,7 @@ namespace NewHorizons.Builder.Props slideReelObj.transform.parent = sector?.transform ?? go.transform; slideReelObj.transform.localPosition = (Vector3)(info.position ?? Vector3.zero); - slideReelObj.transform.rotation = Quaternion.Euler((Vector3)(info.position ?? Vector3.zero)); + slideReelObj.transform.localRotation = Quaternion.Euler((Vector3)(info.rotation ?? Vector3.zero)); // Now we replace the slides int slidesCount = info.slides.Length; @@ -67,11 +76,13 @@ namespace NewHorizons.Builder.Props // Else when you put them down you can't pick them back up slideReelObj.GetComponent()._physicsRemoved = false; - // Idk why but it wants reveals to be comma delimited not a list slideCollectionContainer.slideCollection = slideCollection; + + // Idk why but it wants reveals to be comma delimited not a list if (info.reveals != null) slideCollectionContainer._shipLogOnComplete = string.Join(",", info.reveals); OWAssetHandler.LoadObject(slideReelObj); + sector.OnOccupantEnterSector.AddListener((x) => OWAssetHandler.LoadObject(slideReelObj)); var slidesBack = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Back").GetComponent(); var slidesFront = slideReelObj.transform.Find("Props_IP_SlideReel_7/Slides_Front").GetComponent(); @@ -86,6 +97,56 @@ namespace NewHorizons.Builder.Props slideReelObj.SetActive(true); } + public static void MakeAutoProjector(GameObject go, Sector sector, PropModule.ProjectionInfo info, IModBehaviour mod) + { + if (_autoPrefab == null) + { + _autoPrefab = GameObject.Find("RingWorld_Body/Sector_RingInterior/Sector_Zone4/Sector_BlightedShore/Sector_JammingControlRoom_Zone4/Interactables_JammingControlRoom_Zone4/AutoProjector_SignalJammer/Prefab_IP_AutoProjector_SignalJammer").gameObject.InstantiateInactive(); + _autoPrefab.name = "Prefab_IP_AutoProjector"; + } + + var projectorObj = _autoPrefab.InstantiateInactive(); + projectorObj.name = $"Prefab_IP_AutoProjector_{mod.ModHelper.Manifest.Name}"; + + var autoProjector = projectorObj.GetComponent(); + autoProjector._sector = sector; + + var slideCollectionContainer = autoProjector.GetRequiredComponent(); + + autoProjector.transform.parent = sector?.transform ?? go.transform; + autoProjector.transform.localPosition = (Vector3)(info.position ?? Vector3.zero); + autoProjector.transform.localRotation = Quaternion.Euler((Vector3)(info.rotation ?? Vector3.zero)); + + // Now we replace the slides + int slidesCount = info.slides.Length; + var slideCollection = new SlideCollection(slidesCount); + + for (int i = 0; i < slidesCount; i++) + { + var slide = new Slide(); + var slideInfo = info.slides[i]; + + var texture = ImageUtilities.GetTexture(mod, slideInfo.imagePath); + slide.textureOverride = ImageUtilities.Invert(texture); + + AddModules(slideInfo, ref slide); + + slideCollection.slides[i] = slide; + } + + slideCollectionContainer.slideCollection = slideCollection; + + OWAssetHandler.LoadObject(projectorObj); + sector.OnOccupantEnterSector.AddListener((x) => OWAssetHandler.LoadObject(projectorObj)); + + // Change the picture on the lens + var lens = projectorObj.transform.Find("Spotlight/Prop_IP_SingleSlideProjector/Projector_Lens").GetComponent(); + lens.materials[1].mainTexture = slideCollection.slides[0]._textureOverride; + lens.materials[1].SetTexture("_EmissionMap", slideCollection.slides[0]._textureOverride); + + projectorObj.SetActive(true); + } + private static void AddModules(PropModule.SlideInfo slideInfo, ref Slide slide) { var modules = new List(); diff --git a/NewHorizons/Builder/Props/PropBuildManager.cs b/NewHorizons/Builder/Props/PropBuildManager.cs index 26a22922..b59ac416 100644 --- a/NewHorizons/Builder/Props/PropBuildManager.cs +++ b/NewHorizons/Builder/Props/PropBuildManager.cs @@ -78,11 +78,11 @@ namespace NewHorizons.Builder.Props EntryLocationBuilder.Make(go, sector, entryLocationInfo, mod); } } - if(config.Props.SlideReels != null) + if(config.Props.SlideShows != null) { - foreach (var slideReelInfo in config.Props.SlideReels) + foreach (var slideReelInfo in config.Props.SlideShows) { - SlideReelBuilder.Make(go, sector, slideReelInfo, mod); + ProjectionBuilder.Make(go, sector, slideReelInfo, mod); } } } diff --git a/NewHorizons/External/PropModule.cs b/NewHorizons/External/PropModule.cs index 3f39f1c6..7c72b12b 100644 --- a/NewHorizons/External/PropModule.cs +++ b/NewHorizons/External/PropModule.cs @@ -18,7 +18,7 @@ namespace NewHorizons.External public DialogueInfo[] Dialogue; public RevealInfo[] Reveal; public EntryLocationInfo[] EntryLocation; - public SlideReelInfo[] SlideReels; + public ProjectionInfo[] SlideShows; public class ScatterInfo { @@ -102,12 +102,13 @@ namespace NewHorizons.External public MVector3 position; } - public class SlideReelInfo + public class ProjectionInfo { public MVector3 position; public MVector3 rotation; public string[] reveals; public SlideInfo[] slides; + public string type = "SlideReel"; } public class SlideInfo