using UnityEngine; namespace NewHorizons.Components.Volumes { /// /// Currently only relevant for Vanilla planets, which actually have streaming groups /// internal class StreamingWarpVolume : BaseVolume { public StreamingGroup streamingGroup; private bool _probeInVolume; private bool _playerInVolume; private bool _preloadingRequiredAssets; private bool _preloadingGeneralAssets; private SurveyorProbe _probe; public void Start() { _probe = Locator.GetProbe(); base.enabled = false; } public void FixedUpdate() { bool probeActive = _probe.IsLaunched() && !_probe.IsAnchored(); bool shouldBeLoadingRequiredAssets = _playerInVolume || (_probeInVolume && probeActive); bool shouldBeLoadingGeneralAssets = _playerInVolume; UpdatePreloadingState(shouldBeLoadingRequiredAssets, shouldBeLoadingGeneralAssets); } private void UpdatePreloadingState(bool shouldBeLoadingRequiredAssets, bool shouldBeLoadingGeneralAssets) { if (!this._preloadingRequiredAssets && shouldBeLoadingRequiredAssets) { this.streamingGroup.RequestRequiredAssets(0); this._preloadingRequiredAssets = true; } else if (this._preloadingRequiredAssets && !shouldBeLoadingRequiredAssets) { this.streamingGroup.ReleaseRequiredAssets(); this._preloadingRequiredAssets = false; } if (!this._preloadingGeneralAssets && shouldBeLoadingGeneralAssets) { this.streamingGroup.RequestGeneralAssets(0); this._preloadingGeneralAssets = true; return; } if (this._preloadingGeneralAssets && !shouldBeLoadingGeneralAssets) { this.streamingGroup.ReleaseGeneralAssets(); this._preloadingGeneralAssets = false; } } public override void OnSectorOccupantsUpdated() { if (this._sector.ContainsAnyOccupants(DynamicOccupant.Player | DynamicOccupant.Probe)) { if (StreamingManager.isStreamingEnabled && this.streamingGroup != null) { base.enabled = true; return; } } else { this.UpdatePreloadingState(false, false); base.enabled = false; } } public override void OnTriggerVolumeEntry(GameObject hitObj) { OWRigidbody attachedOWRigidbody = hitObj.GetAttachedOWRigidbody(false); if (attachedOWRigidbody != null) { if (attachedOWRigidbody.CompareTag("Player")) { this._playerInVolume = true; return; } if (attachedOWRigidbody.CompareTag("Probe")) { this._probeInVolume = true; } } } public override void OnTriggerVolumeExit(GameObject hitObj) { OWRigidbody attachedOWRigidbody = hitObj.GetAttachedOWRigidbody(false); if (attachedOWRigidbody != null) { if (attachedOWRigidbody.CompareTag("Player")) { this._playerInVolume = false; return; } if (attachedOWRigidbody.CompareTag("Probe")) { this._probeInVolume = false; } } } } }