Fix the weird orb bug

This commit is contained in:
Nick 2022-09-30 23:57:25 -04:00
parent 9bc68d74e3
commit 29be18c69c
3 changed files with 159 additions and 133 deletions

View File

@ -1,11 +1,9 @@
using NewHorizons.Builder.Atmosphere;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace NewHorizons.Components
{
/*
public class EyeSunLightParamUpdater : MonoBehaviour
{
public static readonly int SunPosition = Shader.PropertyToID("_SunPosition");
@ -21,13 +19,18 @@ namespace NewHorizons.Components
public void LateUpdate()
{
var currentIntensity = TimeLoop.GetSecondsRemaining() > -10 ? intensity : 0;
// Changing these global shader values breaks the CosmicInflationController orb shader
// So DON'T use this component (sad)
Shader.SetGlobalVector(SunPosition, new Vector4(position.x, position.y, position.z, radius));
Shader.SetGlobalVector(OWSunPositionRange, new Vector4(position.x, position.y, position.z, range * range));
Shader.SetGlobalVector(OWSunColorIntensity, new Vector4(color.r, color.g, color.b, currentIntensity));
foreach (var (_, material) in AtmosphereBuilder.Skys)
{
material.SetFloat(SunIntensity, currentIntensity);
}
}
}
*/
}

View File

@ -0,0 +1,138 @@
using NewHorizons.Builder.General;
using NewHorizons.Components;
using NewHorizons.Components.Orbital;
using NewHorizons.Components.Stars;
using NewHorizons.Utility;
using UnityEngine;
namespace NewHorizons.Handlers
{
public static class EyeSceneHandler
{
public static void OnSceneLoad()
{
// Create astro objects for eye and vessel because they didn't have them somehow.
var eyeOfTheUniverse = SearchUtilities.Find("EyeOfTheUniverse_Body");
var eyeSector = eyeOfTheUniverse.FindChild("Sector_EyeOfTheUniverse").GetComponent<Sector>();
var eyeAO = eyeOfTheUniverse.AddComponent<EyeAstroObject>();
var eyeBody = eyeOfTheUniverse.GetAttachedOWRigidbody();
var eyeMarker = eyeOfTheUniverse.AddComponent<MapMarker>();
var eyeSphere = eyeSector.GetComponent<SphereShape>();
eyeSphere.SetLayer(Shape.Layer.Sector);
eyeAO._owRigidbody = eyeBody;
eyeAO._rootSector = eyeSector;
eyeAO._gravityVolume = eyeSector.GetComponentInChildren<GravityVolume>();
eyeAO._customName = "Eye Of The Universe";
eyeAO._name = AstroObject.Name.Eye;
eyeAO._type = AstroObject.Type.None;
eyeAO.Register();
eyeMarker._markerType = MapMarker.MarkerType.Sun;
eyeMarker._labelID = UITextType.LocationEye_Cap;
var eyeRFV = RFVolumeBuilder.Make(eyeOfTheUniverse, eyeBody, 400, new External.Modules.ReferenceFrameModule());
var vessel = SearchUtilities.Find("Vessel_Body");
var vesselSector = vessel.FindChild("Sector_VesselBridge").GetComponent<Sector>();
var vesselAO = vessel.AddComponent<EyeAstroObject>();
var vesselBody = vessel.GetAttachedOWRigidbody();
var vesselMapMarker = vessel.AddComponent<MapMarker>();
vesselAO._owRigidbody = vesselBody;
vesselAO._primaryBody = eyeAO;
eyeAO._satellite = vesselAO;
vesselAO._rootSector = vesselSector;
vesselAO._customName = "Vessel";
vesselAO._name = AstroObject.Name.CustomString;
vesselAO._type = AstroObject.Type.SpaceStation;
vesselAO.Register();
vesselMapMarker._markerType = MapMarker.MarkerType.Moon;
vesselMapMarker._labelID = (UITextType)TranslationHandler.AddUI("VESSEL");
RFVolumeBuilder.Make(vessel, vesselBody, 600, new External.Modules.ReferenceFrameModule { localPosition = new MVector3(0, 0, -207.375f) });
// Resize vessel sector so that the vessel is fully collidable.
var vesselSectorTrigger = vesselSector.gameObject.FindChild("SectorTriggerVolume_VesselBridge");
vesselSectorTrigger.transform.localPosition = new Vector3(0, 0, -207.375f);
var vesselSectorTriggerBox = vesselSectorTrigger.GetComponent<BoxShape>();
vesselSectorTriggerBox.size = new Vector3(600, 600, 600);
vesselSectorTriggerBox.SetLayer(Shape.Layer.Sector);
// Why were the vessel's lights inside the eye? Let's move them from the eye to vessel.
var vesselPointlight = eyeSector.gameObject.FindChild("Pointlight_NOM_Vessel");
vesselPointlight.transform.SetParent(vesselSector.transform, true);
var vesselSpotlight = eyeSector.gameObject.FindChild("Spotlight_NOM_Vessel");
vesselSpotlight.transform.SetParent(vesselSector.transform, true);
var vesselAmbientLight = eyeSector.gameObject.FindChild("AmbientLight_Vessel");
vesselAmbientLight.transform.SetParent(vesselSector.transform, true);
// Add sector streaming to vessel just in case some one moves the vessel.
var vesselStreaming = new GameObject("Sector_Streaming");
vesselStreaming.transform.SetParent(vesselSector.transform, false);
var vessel_ss = vesselStreaming.AddComponent<SectorStreaming>();
vessel_ss._streamingGroup = eyeSector.gameObject.FindChild("StreamingGroup_EYE").GetComponent<StreamingGroup>();
vessel_ss.SetSector(vesselSector);
var eyeCoordinatePromptTrigger = vesselSector.GetComponentInChildren<EyeCoordinatePromptTrigger>(true);
eyeCoordinatePromptTrigger._warpController = eyeCoordinatePromptTrigger.GetComponentInParent<VesselWarpController>();
eyeCoordinatePromptTrigger.gameObject.SetActive(true);
var solarSystemRoot = SearchUtilities.Find("SolarSystemRoot");
// Disable forest and observatory so that a custom body doesn't accidentally pass through them. (they are 6.5km away from eye)
// idk why mobius didn't add activation controllers for these
var forestActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
forestActivation._object = eyeSector.gameObject.FindChild("ForestOfGalaxies_Root");
forestActivation._activeStates = new EyeState[]
{
EyeState.Observatory,
EyeState.ZoomOut,
EyeState.ForestOfGalaxies,
EyeState.ForestIsDark
};
// mark
var observatoryActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
observatoryActivation._object = eyeSector.gameObject.FindChild("Sector_Observatory");
observatoryActivation._activeStates = new EyeState[]
{
EyeState.IntoTheVortex,
EyeState.Observatory,
EyeState.ZoomOut
};
var referenceFrameActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
referenceFrameActivation._object = eyeRFV;
referenceFrameActivation._activeStates = new EyeState[]
{
EyeState.AboardVessel,
EyeState.WarpedToSurface,
EyeState.IntoTheVortex
};
// This component breaks the cosmic orb guy but only on Steam?
// solarSystemRoot.AddComponent<EyeSunLightParamUpdater>();
var distantSun = eyeSector.gameObject.FindChild("DistantSun/Directional light");
var starController = distantSun.AddComponent<StarController>();
var sunLight = distantSun.GetComponent<Light>();
starController.Light = sunLight;
var ambientLightFake = new GameObject("AmbientLightFake", typeof(Light));
ambientLightFake.transform.SetParent(distantSun.transform, false);
ambientLightFake.SetActive(false);
var ambientLight = ambientLightFake.GetComponent<Light>();
ambientLight.intensity = 0;
ambientLight.range = 0;
ambientLight.enabled = false;
starController.AmbientLight = ambientLight;
starController.Intensity = 0.2f;
starController.SunColor = new Color(0.3569f, 0.7843f, 1, 1);
var sunLightController = distantSun.AddComponent<SunLightController>();
sunLightController._sunLight = sunLight;
sunLightController._ambientLight = ambientLight;
sunLightController.Initialize();
var starLightController = distantSun.AddComponent<SunLightEffectsController>();
starLightController.Awake();
SunLightEffectsController.AddStar(starController);
SunLightEffectsController.AddStarLight(sunLight);
}
}
}

View File

@ -299,7 +299,10 @@ namespace NewHorizons
}
}
if (isEyeOfTheUniverse) _currentStarSystem = "EyeOfTheUniverse";
if (isEyeOfTheUniverse)
{
_currentStarSystem = "EyeOfTheUniverse";
}
else if (IsWarpingBackToEye)
{
IsWarpingBackToEye = false;
@ -360,135 +363,7 @@ namespace NewHorizons
// EOTU fixes
if (isEyeOfTheUniverse)
{
// Create astro objects for eye and vessel because they didn't have them somehow.
var eyeOfTheUniverse = SearchUtilities.Find("EyeOfTheUniverse_Body");
var eyeSector = eyeOfTheUniverse.FindChild("Sector_EyeOfTheUniverse").GetComponent<Sector>();
var eyeAO = eyeOfTheUniverse.AddComponent<EyeAstroObject>();
var eyeBody = eyeOfTheUniverse.GetAttachedOWRigidbody();
var eyeMarker = eyeOfTheUniverse.AddComponent<MapMarker>();
var eyeSphere = eyeSector.GetComponent<SphereShape>();
eyeSphere.SetLayer(Shape.Layer.Sector);
eyeAO._owRigidbody = eyeBody;
eyeAO._rootSector = eyeSector;
eyeAO._gravityVolume = eyeSector.GetComponentInChildren<GravityVolume>();
eyeAO._customName = "Eye Of The Universe";
eyeAO._name = AstroObject.Name.Eye;
eyeAO._type = AstroObject.Type.None;
eyeAO.Register();
eyeMarker._markerType = MapMarker.MarkerType.Sun;
eyeMarker._labelID = UITextType.LocationEye_Cap;
var eyeRFV = RFVolumeBuilder.Make(eyeOfTheUniverse, eyeBody, 400, new External.Modules.ReferenceFrameModule());
var vessel = SearchUtilities.Find("Vessel_Body");
var vesselSector = vessel.FindChild("Sector_VesselBridge").GetComponent<Sector>();
var vesselAO = vessel.AddComponent<EyeAstroObject>();
var vesselBody = vessel.GetAttachedOWRigidbody();
var vesselMapMarker = vessel.AddComponent<MapMarker>();
vesselAO._owRigidbody = vesselBody;
vesselAO._primaryBody = eyeAO;
eyeAO._satellite = vesselAO;
vesselAO._rootSector = vesselSector;
vesselAO._customName = "Vessel";
vesselAO._name = AstroObject.Name.CustomString;
vesselAO._type = AstroObject.Type.SpaceStation;
vesselAO.Register();
vesselMapMarker._markerType = MapMarker.MarkerType.Moon;
vesselMapMarker._labelID = (UITextType)TranslationHandler.AddUI("VESSEL");
RFVolumeBuilder.Make(vessel, vesselBody, 600, new External.Modules.ReferenceFrameModule { localPosition = new MVector3(0, 0, -207.375f) });
// Resize vessel sector so that the vessel is fully collidable.
var vesselSectorTrigger = vesselSector.gameObject.FindChild("SectorTriggerVolume_VesselBridge");
vesselSectorTrigger.transform.localPosition = new Vector3(0, 0, -207.375f);
var vesselSectorTriggerBox = vesselSectorTrigger.GetComponent<BoxShape>();
vesselSectorTriggerBox.size = new Vector3(600, 600, 600);
vesselSectorTriggerBox.SetLayer(Shape.Layer.Sector);
// Why were the vessel's lights inside the eye? Let's move them from the eye to vessel.
var vesselPointlight = eyeSector.gameObject.FindChild("Pointlight_NOM_Vessel");
vesselPointlight.transform.SetParent(vesselSector.transform, true);
var vesselSpotlight = eyeSector.gameObject.FindChild("Spotlight_NOM_Vessel");
vesselSpotlight.transform.SetParent(vesselSector.transform, true);
var vesselAmbientLight = eyeSector.gameObject.FindChild("AmbientLight_Vessel");
vesselAmbientLight.transform.SetParent(vesselSector.transform, true);
// Add sector streaming to vessel just in case some one moves the vessel.
var vesselStreaming = new GameObject("Sector_Streaming");
vesselStreaming.transform.SetParent(vesselSector.transform, false);
var vessel_ss = vesselStreaming.AddComponent<SectorStreaming>();
vessel_ss._streamingGroup = eyeSector.gameObject.FindChild("StreamingGroup_EYE").GetComponent<StreamingGroup>();
vessel_ss.SetSector(vesselSector);
var eyeCoordinatePromptTrigger = vesselSector.GetComponentInChildren<EyeCoordinatePromptTrigger>(true);
eyeCoordinatePromptTrigger._warpController = eyeCoordinatePromptTrigger.GetComponentInParent<VesselWarpController>();
eyeCoordinatePromptTrigger.gameObject.SetActive(true);
var solarSystemRoot = SearchUtilities.Find("SolarSystemRoot");
// Disable forest and observatory so that a custom body doesn't accidentally pass through them. (they are 6.5km away from eye)
// idk why mobius didn't add activation controllers for these
var forestActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
forestActivation._object = eyeSector.gameObject.FindChild("ForestOfGalaxies_Root");
forestActivation._activeStates = new EyeState[]
{
EyeState.Observatory,
EyeState.ZoomOut,
EyeState.ForestOfGalaxies,
EyeState.ForestIsDark
};
var observatoryActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
observatoryActivation._object = eyeSector.gameObject.FindChild("Sector_Observatory");
observatoryActivation._activeStates = new EyeState[]
{
EyeState.IntoTheVortex,
EyeState.Observatory,
EyeState.ZoomOut
};
var referenceFrameActivation = solarSystemRoot.AddComponent<EyeStateActivationController>();
referenceFrameActivation._object = eyeRFV;
referenceFrameActivation._activeStates = new EyeState[]
{
EyeState.AboardVessel,
EyeState.WarpedToSurface,
EyeState.IntoTheVortex
};
solarSystemRoot.AddComponent<EyeSunLightParamUpdater>();
var distantSun = eyeSector.gameObject.FindChild("DistantSun/Directional light");
var starController = distantSun.AddComponent<StarController>();
var sunLight = distantSun.GetComponent<Light>();
starController.Light = sunLight;
var ambientLightFake = new GameObject("AmbientLightFake", typeof(Light));
ambientLightFake.transform.SetParent(distantSun.transform, false);
ambientLightFake.SetActive(false);
var ambientLight = ambientLightFake.GetComponent<Light>();
ambientLight.intensity = 0;
ambientLight.range = 0;
ambientLight.enabled = false;
starController.AmbientLight = ambientLight;
starController.Intensity = 0.2f;
starController.SunColor = new Color(0.3569f, 0.7843f, 1, 1);
var sunLightController = distantSun.AddComponent<SunLightController>();
sunLightController._sunLight = sunLight;
sunLightController._ambientLight = ambientLight;
sunLightController.Initialize();
var starLightController = distantSun.AddComponent<SunLightEffectsController>();
starLightController.Awake();
SunLightEffectsController.AddStar(starController);
SunLightEffectsController.AddStarLight(sunLight);
if (IsWarpingFromShip && _ship != null)
{
var eyeShip = GameObject.Instantiate(_ship);
eyeShip.name = "Ship_Body";
_shipWarpController = eyeShip.GetComponent<ShipWarpController>();
SceneManager.MoveGameObjectToScene(eyeShip, scene);
eyeShip.SetActive(true);
}
EyeSceneHandler.OnSceneLoad();
}
if (isSolarSystem || isEyeOfTheUniverse)
@ -603,6 +478,16 @@ namespace NewHorizons
IsSystemReady = true;
OnSystemReady(false, false);
});
if (IsWarpingFromShip && _ship != null)
{
var eyeShip = GameObject.Instantiate(_ship);
eyeShip.name = "Ship_Body";
_shipWarpController = eyeShip.GetComponent<ShipWarpController>();
SceneManager.MoveGameObjectToScene(eyeShip, scene);
eyeShip.SetActive(true);
}
IsWarpingFromShip = false;
IsWarpingFromVessel = false;
}