diff --git a/QSB/Events/EventNames.cs b/QSB/Events/EventNames.cs index 81a70cc2..39a06366 100644 --- a/QSB/Events/EventNames.cs +++ b/QSB/Events/EventNames.cs @@ -89,5 +89,8 @@ public static string QSBDebugEvent = "QSBDebugEvent"; public static string QSBEnterNomaiHeadZone = "QSBEnterNomaiHeadZone"; public static string QSBExitNomaiHeadZone = "QSBExitNomaiHeadZone"; + public static string QSBEnterSatelliteCamera = "QSBEnterSatelliteCamera"; + public static string QSBExitSatelliteCamera = "QSBExitSatelliteCamera"; + public static string QSBSatelliteSnapshot = "QSBSatelliteSnapshot"; } } \ No newline at end of file diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index be7a01f7..4553f923 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -6,6 +6,8 @@ * MISC. */ DebugEvent, + SatelliteProjector, + SatelliteProjectorSnapshot, /* * SERVER EVENTS diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index 68029535..583fbaab 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -15,6 +15,7 @@ using QSB.Player.Events; using QSB.ProbeSync.Events; using QSB.QuantumSync.Events; using QSB.RoastingSync.Events; +using QSB.SatelliteSync.Events; using QSB.ShipSync.Events; using QSB.ShipSync.Events.Component; using QSB.ShipSync.Events.Hull; @@ -69,6 +70,7 @@ namespace QSB.Events new ServerStateEvent(), new ClientStateEvent(), new DebugEvent(), + new SatelliteProjectorEvent(), // World Objects new ElevatorEvent(), new GeyserEvent(), diff --git a/QSB/Patches/QSBPatchManager.cs b/QSB/Patches/QSBPatchManager.cs index bf71ee58..d9f082c4 100644 --- a/QSB/Patches/QSBPatchManager.cs +++ b/QSB/Patches/QSBPatchManager.cs @@ -16,6 +16,7 @@ using QSB.Player.Patches; using QSB.PoolSync.Patches; using QSB.QuantumSync.Patches; using QSB.RoastingSync.Patches; +using QSB.SatelliteSync.Patches; using QSB.ShipSync.Patches; using QSB.StatueSync.Patches; using QSB.TimeSync.Patches; @@ -67,7 +68,8 @@ namespace QSB.Patches new MapPatches(), new RespawnPatches(), new LauncherPatches(), - new SolanumPatches() + new SolanumPatches(), + new SatelliteProjectorPatches() }; TypeToInstance = new Dictionary diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index 79e1b2b9..f65b9fd1 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -200,6 +200,10 @@ + + + + diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index ef1c7bc0..c72b4687 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -16,6 +16,7 @@ using QSB.Player; using QSB.Player.TransformSync; using QSB.PoolSync; using QSB.QuantumSync; +using QSB.SatelliteSync; using QSB.SectorSync; using QSB.ShipSync; using QSB.StatueSync; @@ -102,6 +103,7 @@ namespace QSB gameObject.AddComponent(); gameObject.AddComponent(); gameObject.AddComponent(); + gameObject.AddComponent(); // WorldObject managers gameObject.AddComponent(); diff --git a/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs b/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs new file mode 100644 index 00000000..b2d8356e --- /dev/null +++ b/QSB/SatelliteSync/Events/SatelliteProjectorEvent.cs @@ -0,0 +1,42 @@ +using QSB.Events; +using QSB.Messaging; + +namespace QSB.SatelliteSync.Events +{ + class SatelliteProjectorEvent : QSBEvent + { + public override EventType Type => EventType.SatelliteProjector; + + public override void SetupListener() + { + GlobalMessenger.AddListener(EventNames.QSBEnterSatelliteCamera, () => Handler(true)); + GlobalMessenger.AddListener(EventNames.QSBExitSatelliteCamera, () => Handler(false)); + } + + public override void CloseListener() + { + GlobalMessenger.RemoveListener(EventNames.QSBEnterSatelliteCamera, () => Handler(true)); + GlobalMessenger.RemoveListener(EventNames.QSBExitSatelliteCamera, () => Handler(false)); + } + + private void Handler(bool usingProjector) => SendEvent(CreateMessage(usingProjector)); + + private BoolMessage CreateMessage(bool usingProjector) => new BoolMessage + { + AboutId = LocalPlayerId, + Value = usingProjector + }; + + public override void OnReceiveRemote(bool isHost, BoolMessage message) + { + if (message.Value) + { + SatelliteProjectorManager.Instance.RemoteEnter(); + } + else + { + SatelliteProjectorManager.Instance.RemoteExit(); + } + } + } +} diff --git a/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs b/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs new file mode 100644 index 00000000..5dbba575 --- /dev/null +++ b/QSB/SatelliteSync/Events/SatelliteProjectorSnapshotEvent.cs @@ -0,0 +1,34 @@ +using QSB.Events; +using QSB.Messaging; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace QSB.SatelliteSync.Events +{ + class SatelliteProjectorSnapshotEvent : QSBEvent + { + public override EventType Type => EventType.SatelliteProjectorSnapshot; + + public override void SetupListener() + { + GlobalMessenger.AddListener(EventNames.QSBSatelliteSnapshot, (bool forward) => Handler(forward)); + } + + public override void CloseListener() + { + GlobalMessenger.RemoveListener(EventNames.QSBSatelliteSnapshot, (bool forward) => Handler(forward)); + } + + private void Handler(bool forward) => SendEvent(CreateMessage(forward)); + + private BoolMessage CreateMessage(bool forward) => new BoolMessage + { + AboutId = LocalPlayerId, + Value = forward + }; + + public override void OnReceiveRemote(bool isHost, BoolMessage message) => SatelliteProjectorManager.Instance.RemoteTakeSnapshot(message.Value); + } +} diff --git a/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs b/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs new file mode 100644 index 00000000..62c26f17 --- /dev/null +++ b/QSB/SatelliteSync/Patches/SatelliteProjectorPatches.cs @@ -0,0 +1,28 @@ +using HarmonyLib; +using QSB.Events; +using QSB.Patches; + +namespace QSB.SatelliteSync.Patches +{ + [HarmonyPatch] + class SatelliteProjectorPatches : QSBPatch + { + public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect; + + [HarmonyPrefix] + [HarmonyPatch(typeof(SatelliteSnapshotController), nameof(SatelliteSnapshotController.OnPressInteract))] + public static bool UseProjector() + { + QSBEventManager.FireEvent(EventNames.QSBEnterSatelliteCamera); + return true; + } + + [HarmonyPrefix] + [HarmonyPatch(typeof(SatelliteSnapshotController), nameof(SatelliteSnapshotController.TurnOffProjector))] + public static bool LeaveProjector() + { + QSBEventManager.FireEvent(EventNames.QSBExitSatelliteCamera); + return true; + } + } +} diff --git a/QSB/SatelliteSync/SatelliteProjectorManager.cs b/QSB/SatelliteSync/SatelliteProjectorManager.cs new file mode 100644 index 00000000..17c68308 --- /dev/null +++ b/QSB/SatelliteSync/SatelliteProjectorManager.cs @@ -0,0 +1,89 @@ +using QSB.Utility; +using System.Linq; +using UnityEngine; + +namespace QSB.SatelliteSync +{ + class SatelliteProjectorManager : MonoBehaviour + { + public static SatelliteProjectorManager Instance { get; private set; } + + public SatelliteSnapshotController Projector { get; private set; } + + public void Start() + { + Instance = this; + QSBSceneManager.OnUniverseSceneLoaded += OnSceneLoaded; + } + + public void OnDestroy() + { + QSBSceneManager.OnUniverseSceneLoaded -= OnSceneLoaded; + } + + private void OnSceneLoaded(OWScene oldScene, OWScene newScene) + { + if (newScene == OWScene.SolarSystem) + { + Projector = Resources.FindObjectsOfTypeAll().First(); + Projector._loopingSource.spatialBlend = 1f; + Projector._oneShotSource.spatialBlend = 1f; + } + } + + public void RemoteEnter() + { + DebugLog.DebugWrite($"Remote Enter"); + + Projector.enabled = true; + Projector._interactVolume.DisableInteraction(); + + if (Projector._showSplashTexture) + { + Projector._splashObject.SetActive(false); + Projector._diagramObject.SetActive(true); + Projector._projectionScreen.gameObject.SetActive(false); + } + + if (Projector._fadeLight != null) + { + Projector._fadeLight.StartFade(0f, 2f, 0f); + } + + var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorActivate, 1f); + Projector._loopingSource.FadeIn(audioClip.length, false, false, 1f); + } + + public void RemoteExit() + { + DebugLog.DebugWrite($"Remote Exit"); + + Projector.enabled = false; + Projector._interactVolume.ResetInteraction(); + + if (Projector._showSplashTexture) + { + Projector._splashObject.SetActive(true); + Projector._diagramObject.SetActive(false); + Projector._projectionScreen.gameObject.SetActive(false); + } + + if (Projector._fadeLight != null) + { + Projector._fadeLight.StartFade(Projector._initLightIntensity, 2f, 0f); + } + + var audioClip = Projector._oneShotSource.PlayOneShot(AudioType.TH_ProjectorStop, 1f); + Projector._loopingSource.FadeOut(audioClip.length, OWAudioSource.FadeOutCompleteAction.STOP, 0f); + } + + public void RemoteTakeSnapshot(bool forward) + { + Projector._satelliteCamera.transform.localEulerAngles = forward + ? Projector._initCamLocalRot + : Projector._initCamLocalRot + new Vector3(0f, 180f, 0f); + + Projector.RenderSnapshot(); + } + } +} diff --git a/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs b/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs index c96b8506..ae9e0fcf 100644 --- a/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs +++ b/QSB/Tools/ProbeLauncherTool/Patches/LauncherPatches.cs @@ -71,12 +71,20 @@ namespace QSB.Tools.ProbeLauncherTool.Patches // TODO : ehhhh idk about this. maybe copy each sound source so we have a 2d version (for local) and a 3d version (for remote)? // this would probably be a whole qsb version on it's own - [HarmonyPostfix] + [HarmonyPrefix] [HarmonyPatch(typeof(ProbeLauncherEffects), nameof(ProbeLauncherEffects.PlayRetrievalClip))] - public static void ProbeLauncherEffects_PlayRetrievalClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f; + public static bool ProbeLauncherEffects_PlayRetrievalClip(OWAudioSource ____owAudioSource) + { + ____owAudioSource.GetAudioSource().spatialBlend = 1f; + return true; + } - [HarmonyPostfix] + [HarmonyPrefix] [HarmonyPatch(typeof(ProbeLauncherEffects), nameof(ProbeLauncherEffects.PlayLaunchClip))] - public static void ProbeLauncherEffects_PlayLaunchClip(OWAudioSource ____owAudioSource) => ____owAudioSource.GetAudioSource().spatialBlend = 1f; + public static bool ProbeLauncherEffects_PlayLaunchClip(OWAudioSource ____owAudioSource) + { + ____owAudioSource.GetAudioSource().spatialBlend = 1f; + return true; + } } } diff --git a/QSB/default-config.json b/QSB/default-config.json index ffe88285..fedee1d0 100644 --- a/QSB/default-config.json +++ b/QSB/default-config.json @@ -3,7 +3,7 @@ "settings": { "defaultServerIP": "localhost", "port": 7777, - "debugMode": false, + "debugMode": true, "showLinesInDebug": false } } \ No newline at end of file