mirror of
https://github.com/Outer-Wilds-New-Horizons/new-horizons.git
synced 2025-12-11 20:15:44 +01:00
Merge branch 'dev' into what-if-more-frames
This commit is contained in:
commit
71ae25ae2a
@ -7,6 +7,7 @@ using System.Linq;
|
||||
using NewHorizons.Components.Stars;
|
||||
using NewHorizons.Utility.OuterWilds;
|
||||
using NewHorizons.Utility.Files;
|
||||
using NewHorizons.Utility.OWML;
|
||||
|
||||
namespace NewHorizons.Builder.Body
|
||||
{
|
||||
@ -348,28 +349,42 @@ namespace NewHorizons.Builder.Body
|
||||
solarFlareEmitter.name = "SolarFlareEmitter";
|
||||
solarFlareEmitter.SetActive(true);
|
||||
|
||||
var emitter = solarFlareEmitter.GetComponent<SolarFlareEmitter>();
|
||||
|
||||
if (starModule.solarFlareSettings != null)
|
||||
{
|
||||
emitter._minTimeBetweenFlares = starModule.solarFlareSettings.minTimeBetweenFlares;
|
||||
emitter._maxTimeBetweenFlares = starModule.solarFlareSettings.maxTimeBetweenFlares;
|
||||
emitter._lifeLength = starModule.solarFlareSettings.lifeLength;
|
||||
}
|
||||
|
||||
if (starModule.tint != null)
|
||||
{
|
||||
var flareTint = starModule.tint.ToColor();
|
||||
var emitter = solarFlareEmitter.GetComponent<SolarFlareEmitter>();
|
||||
emitter.tint = flareTint;
|
||||
emitter.tint = starModule.tint.ToColor();
|
||||
}
|
||||
|
||||
var material = new Material(_flareMaterial);
|
||||
// Since the star isn't awake yet the controllers haven't been made
|
||||
foreach (var prefab in new GameObject[] { emitter.domePrefab, emitter.loopPrefab, emitter.streamerPrefab })
|
||||
var material = new Material(_flareMaterial);
|
||||
// Since the star isn't awake yet the controllers haven't been made
|
||||
foreach (var prefab in new GameObject[] { emitter.domePrefab, emitter.loopPrefab, emitter.streamerPrefab })
|
||||
{
|
||||
var controller = prefab.GetComponent<SolarFlareController>();
|
||||
// controller._meshRenderer doesn't exist yet since Awake hasn't been called
|
||||
if (starModule.tint != null)
|
||||
{
|
||||
var controller = prefab.GetComponent<SolarFlareController>();
|
||||
// controller._meshRenderer doesn't exist yet since Awake hasn't been called
|
||||
controller.GetComponent<MeshRenderer>().sharedMaterial = material;
|
||||
controller._color = Color.white;
|
||||
controller._tint = flareTint;
|
||||
controller._tint = starModule.tint.ToColor();
|
||||
}
|
||||
if (starModule.solarFlareSettings != null)
|
||||
{
|
||||
controller._scaleFactor = Vector3.one * starModule.solarFlareSettings.scaleFactor;
|
||||
}
|
||||
}
|
||||
|
||||
starGO.transform.position = rootObject.transform.position;
|
||||
starGO.transform.localScale = starModule.size * Vector3.one;
|
||||
|
||||
TessellatedSphereRenderer surface = sunSurface.GetComponent<TessellatedSphereRenderer>();
|
||||
var surface = sunSurface.GetComponent<TessellatedSphereRenderer>();
|
||||
|
||||
if (starModule.tint != null)
|
||||
{
|
||||
|
||||
@ -24,10 +24,12 @@ namespace NewHorizons.Builder.Orbital
|
||||
initialMotion._initAngularSpeed = orbit.siderealPeriod == 0 ? 0f : 2f * Mathf.PI / (orbit.siderealPeriod * 60f);
|
||||
var rotationAxis = Quaternion.AngleAxis(orbit.axialTilt, Vector3.right) * Vector3.up;
|
||||
|
||||
// For things with children this is broken
|
||||
// For stock planets with unsuspended rigidbody children this is broken
|
||||
// For planets with rafts this is broken
|
||||
if (AstroObjectLocator.GetChildren(secondaryBody).Length == 0)
|
||||
{
|
||||
secondaryBody.transform.rotation = Quaternion.FromToRotation(Vector3.up, rotationAxis);
|
||||
secondaryBody.transform.Rotate(rotationAxis, orbit.initialRotation);
|
||||
}
|
||||
|
||||
if (!orbit.isStatic && primaryBody != null)
|
||||
|
||||
@ -134,9 +134,18 @@ namespace NewHorizons.Components.ShipLog
|
||||
}
|
||||
else
|
||||
{
|
||||
var path = Path.Combine("planets", uniqueID + ".png");
|
||||
var mod = Main.SystemDict[uniqueID].Mod;
|
||||
|
||||
var path = Path.Combine("systems", uniqueID + ".png");
|
||||
|
||||
// Else check the old location
|
||||
if (!File.Exists(Path.Combine(mod.ModHelper.Manifest.ModFolderPath, path)))
|
||||
{
|
||||
path = Path.Combine("planets", uniqueID + ".png");
|
||||
}
|
||||
|
||||
NHLogger.LogVerbose($"ShipLogStarChartManager - Trying to load {path}");
|
||||
texture = ImageUtilities.GetTexture(Main.SystemDict[uniqueID].Mod, path);
|
||||
texture = ImageUtilities.GetTexture(mod, path);
|
||||
}
|
||||
}
|
||||
catch (Exception) { }
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
using NewHorizons.External.SerializableEnums;
|
||||
using NewHorizons.Handlers;
|
||||
using NewHorizons.Utility;
|
||||
using NewHorizons.Utility.OWML;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
@ -28,7 +29,7 @@ namespace NewHorizons.Components.Volumes
|
||||
if (hitObj.CompareTag("PlayerDetector") && enabled)
|
||||
{
|
||||
// Have to run it off the mod behaviour since the game over controller disables everything
|
||||
Main.Instance.StartCoroutine(GameOver());
|
||||
Delay.StartCoroutine(GameOver());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
6
NewHorizons/External/Modules/OrbitModule.cs
vendored
6
NewHorizons/External/Modules/OrbitModule.cs
vendored
@ -34,6 +34,12 @@ namespace NewHorizons.External.Modules
|
||||
/// </summary>
|
||||
public float siderealPeriod;
|
||||
|
||||
/// <summary>
|
||||
/// Offsets the planet's starting sidereal rotation. In degrees.
|
||||
/// </summary>
|
||||
[Range(0f, 360f)]
|
||||
public float initialRotation;
|
||||
|
||||
/// <summary>
|
||||
/// Should the body always have one side facing its primary?
|
||||
/// </summary>
|
||||
|
||||
@ -104,6 +104,39 @@ namespace NewHorizons.External.Modules.VariableSize
|
||||
/// The type of stellar remnant your star will leave behind.
|
||||
/// </summary>
|
||||
[DefaultValue("default")] public StellarRemnantType stellarRemnantType = StellarRemnantType.Default;
|
||||
|
||||
/// <summary>
|
||||
/// Allows overriding solar flare graphical settings.
|
||||
/// </summary>
|
||||
public SolarFlareModule solarFlareSettings;
|
||||
|
||||
[JsonObject]
|
||||
public class SolarFlareModule
|
||||
{
|
||||
/// <summary>
|
||||
/// Size multiuplier for solar flares. Defaults to 1.
|
||||
/// </summary>
|
||||
[DefaultValue(1)]
|
||||
public float scaleFactor = 1f;
|
||||
|
||||
/// <summary>
|
||||
/// How long a solar flare is visible for. Defaults to 15.
|
||||
/// </summary>
|
||||
[DefaultValue(15f)]
|
||||
public float lifeLength = 15f;
|
||||
|
||||
/// <summary>
|
||||
/// Solar flares are emitted randomly. This is the minimum ammount of time between solar flares.
|
||||
/// </summary>
|
||||
[DefaultValue(5f)]
|
||||
public float minTimeBetweenFlares = 5f;
|
||||
|
||||
/// <summary>
|
||||
/// Solar flares are emitted randomly. This is the maximum ammount of time between solar flares.
|
||||
/// </summary>
|
||||
[DefaultValue(30f)]
|
||||
public float maxTimeBetweenFlares = 30f;
|
||||
}
|
||||
}
|
||||
|
||||
[JsonConverter(typeof(StringEnumConverter))]
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
using NewHorizons.Utility.OWML;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
@ -6,7 +7,7 @@ namespace NewHorizons.Handlers
|
||||
{
|
||||
public static class FadeHandler
|
||||
{
|
||||
public static void FadeOut(float length) => Main.Instance.StartCoroutine(FadeOutCoroutine(length));
|
||||
public static void FadeOut(float length) => Delay.StartCoroutine(FadeOutCoroutine(length));
|
||||
|
||||
private static IEnumerator FadeOutCoroutine(float length)
|
||||
{
|
||||
@ -24,7 +25,7 @@ namespace NewHorizons.Handlers
|
||||
yield return new WaitForEndOfFrame();
|
||||
}
|
||||
|
||||
public static void FadeThen(float length, Action action) => Main.Instance.StartCoroutine(FadeThenCoroutine(length, action));
|
||||
public static void FadeThen(float length, Action action) => Delay.StartCoroutine(FadeThenCoroutine(length, action));
|
||||
|
||||
private static IEnumerator FadeThenCoroutine(float length, Action action)
|
||||
{
|
||||
|
||||
@ -349,6 +349,13 @@ namespace NewHorizons.Handlers
|
||||
BrambleDimensionBuilder.Make(body, go, ao, sector, owRigidBody);
|
||||
|
||||
go = SharedGenerateBody(body, go, sector, owRigidBody);
|
||||
|
||||
// Not included in SharedGenerate to not mess up gravity on base game planets
|
||||
if (body.Config.Base.surfaceGravity != 0)
|
||||
{
|
||||
GravityBuilder.Make(go, ao, owRigidBody, body.Config);
|
||||
}
|
||||
|
||||
body.Object = go;
|
||||
|
||||
AstroObjectLocator.RegisterCustomAstroObject(ao);
|
||||
|
||||
@ -41,7 +41,7 @@ namespace NewHorizons.Handlers
|
||||
if (matchInitialMotion != null) UnityEngine.Object.Destroy(matchInitialMotion);
|
||||
|
||||
// Arbitrary number, depending on the machine some people die, some people fall through the floor, its very inconsistent
|
||||
Main.Instance.StartCoroutine(SpawnCoroutine(10));
|
||||
Delay.StartCoroutine(SpawnCoroutine(10));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -230,6 +230,7 @@ namespace NewHorizons
|
||||
NHLogger.LogWarning("Couldn't find planets folder");
|
||||
}
|
||||
|
||||
// Call this from the menu since we hadn't hooked onto the event yet
|
||||
Delay.FireOnNextUpdate(() => OnSceneLoaded(SceneManager.GetActiveScene(), LoadSceneMode.Single));
|
||||
Delay.FireOnNextUpdate(() => _firstLoad = false);
|
||||
Instance.ModHelper.Menus.PauseMenu.OnInit += DebugReload.InitializePauseMenu;
|
||||
@ -545,6 +546,9 @@ namespace NewHorizons
|
||||
{
|
||||
NHLogger.LogError($"Exception thrown when invoking star system loaded event with parameter [{Instance.CurrentStarSystem}]:\n{e}");
|
||||
}
|
||||
|
||||
// Wait for player to be awake and also for frames to pass
|
||||
Delay.RunWhenAndInNUpdates(() => OnSystemReady(DidWarpFromShip, DidWarpFromVessel), () => _playerAwake && PlayerSpawned, 30);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -560,29 +564,33 @@ namespace NewHorizons
|
||||
_currentStarSystem = _defaultStarSystem;
|
||||
}
|
||||
}
|
||||
|
||||
// Wait for player to be awake and also for frames to pass
|
||||
Delay.RunWhenAndInNUpdates(() => OnSystemReady(DidWarpFromShip, DidWarpFromVessel), () => _playerAwake && PlayerSpawned, 30);
|
||||
}
|
||||
|
||||
// Had a bunch of separate unity things firing stuff when the system is ready so I moved it all to here
|
||||
private void OnSystemReady(bool shouldWarpInFromShip, bool shouldWarpInFromVessel)
|
||||
{
|
||||
IsSystemReady = true;
|
||||
if (IsSystemReady)
|
||||
{
|
||||
NHLogger.LogWarning("OnSystemReady was called twice.");
|
||||
}
|
||||
else
|
||||
{
|
||||
IsSystemReady = true;
|
||||
|
||||
// ShipWarpController will handle the invulnerability otherwise
|
||||
if (!shouldWarpInFromShip)
|
||||
Delay.FireOnNextUpdate(() => InvulnerabilityHandler.MakeInvulnerable(false));
|
||||
// ShipWarpController will handle the invulnerability otherwise
|
||||
if (!shouldWarpInFromShip)
|
||||
Delay.FireOnNextUpdate(() => InvulnerabilityHandler.MakeInvulnerable(false));
|
||||
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugRaycaster>();
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugPropPlacer>();
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugMenu>();
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugRaycaster>();
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugPropPlacer>();
|
||||
Locator.GetPlayerBody().gameObject.AddComponent<DebugMenu>();
|
||||
|
||||
PlayerSpawnHandler.OnSystemReady(shouldWarpInFromShip, shouldWarpInFromVessel);
|
||||
PlayerSpawnHandler.OnSystemReady(shouldWarpInFromShip, shouldWarpInFromVessel);
|
||||
|
||||
VesselCoordinatePromptHandler.RegisterPrompts(SystemDict.Where(system => system.Value.Config.Vessel?.coords != null).Select(x => x.Value).ToList());
|
||||
VesselCoordinatePromptHandler.RegisterPrompts(SystemDict.Where(system => system.Value.Config.Vessel?.coords != null).Select(x => x.Value).ToList());
|
||||
|
||||
CloakHandler.OnSystemReady();
|
||||
CloakHandler.OnSystemReady();
|
||||
}
|
||||
}
|
||||
|
||||
public void EnableWarpDrive()
|
||||
|
||||
@ -1034,6 +1034,13 @@
|
||||
"description": "Rotation period in minutes.",
|
||||
"format": "float"
|
||||
},
|
||||
"initialRotation": {
|
||||
"type": "number",
|
||||
"description": "Offsets the planet's starting sidereal rotation. In degrees.",
|
||||
"format": "float",
|
||||
"maximum": 360.0,
|
||||
"minimum": 0.0
|
||||
},
|
||||
"isTidallyLocked": {
|
||||
"type": "boolean",
|
||||
"description": "Should the body always have one side facing its primary?"
|
||||
@ -3228,6 +3235,10 @@
|
||||
"description": "The type of stellar remnant your star will leave behind.",
|
||||
"default": "default",
|
||||
"$ref": "#/definitions/StellarRemnantType"
|
||||
},
|
||||
"solarFlareSettings": {
|
||||
"description": "Allows overriding solar flare graphical settings.",
|
||||
"$ref": "#/definitions/SolarFlareModule"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -3267,6 +3278,36 @@
|
||||
"custom"
|
||||
]
|
||||
},
|
||||
"SolarFlareModule": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"scaleFactor": {
|
||||
"type": "number",
|
||||
"description": "Size multiuplier for solar flares. Defaults to 1.",
|
||||
"format": "float",
|
||||
"default": 1
|
||||
},
|
||||
"lifeLength": {
|
||||
"type": "number",
|
||||
"description": "How long a solar flare is visible for. Defaults to 15.",
|
||||
"format": "float",
|
||||
"default": 15.0
|
||||
},
|
||||
"minTimeBetweenFlares": {
|
||||
"type": "number",
|
||||
"description": "Solar flares are emitted randomly. This is the minimum ammount of time between solar flares.",
|
||||
"format": "float",
|
||||
"default": 5.0
|
||||
},
|
||||
"maxTimeBetweenFlares": {
|
||||
"type": "number",
|
||||
"description": "Solar flares are emitted randomly. This is the maximum ammount of time between solar flares.",
|
||||
"format": "float",
|
||||
"default": 30.0
|
||||
}
|
||||
}
|
||||
},
|
||||
"WaterModule": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
|
||||
@ -1,15 +1,49 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace NewHorizons.Utility.OWML
|
||||
{
|
||||
public static class Delay
|
||||
{
|
||||
public static void RunWhen(Func<bool> predicate, Action action) => Main.Instance.ModHelper.Events.Unity.RunWhen(predicate, action);
|
||||
public static void FireInNUpdates(Action action, int n) => Main.Instance.ModHelper.Events.Unity.FireInNUpdates(action, n);
|
||||
public static void FireOnNextUpdate(Action action) => Main.Instance.ModHelper.Events.Unity.FireOnNextUpdate(action);
|
||||
public static void RunWhenAndInNUpdates(Action action, Func<bool> predicate, int n) => Main.Instance.StartCoroutine(RunWhenOrInNUpdatesCoroutine(action, predicate, n));
|
||||
#region OnSceneUnloaded
|
||||
static Delay() => SceneManager.sceneUnloaded += OnSceneUnloaded;
|
||||
|
||||
private static void OnSceneUnloaded(Scene _) => Main.Instance.StopAllCoroutines();
|
||||
#endregion
|
||||
|
||||
#region public methods
|
||||
public static void StartCoroutine(IEnumerator coroutine) => Main.Instance.StartCoroutine(coroutine);
|
||||
|
||||
public static void RunWhen(Func<bool> predicate, Action action) => StartCoroutine(RunWhenCoroutine(action, predicate));
|
||||
|
||||
public static void FireInNUpdates(Action action, int n) => StartCoroutine(FireInNUpdatesCoroutine(action, n));
|
||||
|
||||
public static void FireOnNextUpdate(Action action) => FireInNUpdates(action, 1);
|
||||
|
||||
public static void RunWhenAndInNUpdates(Action action, Func<bool> predicate, int n) => Delay.StartCoroutine(RunWhenOrInNUpdatesCoroutine(action, predicate, n));
|
||||
#endregion
|
||||
|
||||
#region Coroutines
|
||||
private static IEnumerator RunWhenCoroutine(Action action, Func<bool> predicate)
|
||||
{
|
||||
while (!predicate.Invoke())
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
}
|
||||
|
||||
action.Invoke();
|
||||
}
|
||||
|
||||
private static IEnumerator FireInNUpdatesCoroutine(Action action, int n)
|
||||
{
|
||||
for (int i = 0; i < n; i++)
|
||||
{
|
||||
yield return new WaitForEndOfFrame();
|
||||
}
|
||||
action?.Invoke();
|
||||
}
|
||||
|
||||
private static IEnumerator RunWhenOrInNUpdatesCoroutine(Action action, Func<bool> predicate, int n)
|
||||
{
|
||||
@ -24,5 +58,6 @@ namespace NewHorizons.Utility.OWML
|
||||
|
||||
action.Invoke();
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user