diff --git a/QSB/Events/EventHandler.cs b/QSB/Events/EventHandler.cs index 8747fb6b..f6e52d67 100644 --- a/QSB/Events/EventHandler.cs +++ b/QSB/Events/EventHandler.cs @@ -65,13 +65,21 @@ namespace QSB.Events PlayerRegistry.UpdateState(message.SenderId, State.Suit, false); break; case EventType.EquipSignalscope: - PlayerRegistry.UpdateState(message.SenderId, State.SignalScope, true); + PlayerRegistry.UpdateState(message.SenderId, State.Signalscope, true); PlayerRegistry.GetPlayerSignalscope(message.SenderId).EquipTool(); break; case EventType.UnequipSignalscope: - PlayerRegistry.UpdateState(message.SenderId, State.SignalScope, false); + PlayerRegistry.UpdateState(message.SenderId, State.Signalscope, false); PlayerRegistry.GetPlayerSignalscope(message.SenderId).UnequipTool(); break; + case EventType.EquipTranslator: + PlayerRegistry.UpdateState(message.SenderId, State.Translator, true); + PlayerRegistry.GetPlayerTranslator(message.SenderId).EquipTool(); + break; + case EventType.UnequipTranslator: + PlayerRegistry.UpdateState(message.SenderId, State.Translator, false); + PlayerRegistry.GetPlayerTranslator(message.SenderId).UnequipTool(); + break; } } } diff --git a/QSB/Events/EventType.cs b/QSB/Events/EventType.cs index 48b0ab06..a51968f6 100644 --- a/QSB/Events/EventType.cs +++ b/QSB/Events/EventType.cs @@ -7,6 +7,8 @@ SuitUp, RemoveSuit, EquipSignalscope, - UnequipSignalscope + UnequipSignalscope, + EquipTranslator, + UnequipTranslator } } diff --git a/QSB/PlayerRegistry.cs b/QSB/PlayerRegistry.cs index d4954840..0a94234f 100644 --- a/QSB/PlayerRegistry.cs +++ b/QSB/PlayerRegistry.cs @@ -85,6 +85,17 @@ namespace QSB return tools.First(x => x.Type == ToolType.Signalscope); } + public static QSBTool GetPlayerTranslator(uint id) + { + var tools = GetPlayer(id).Camera.GetComponentsInChildren(); + if (tools.Length == 0) + { + DebugLog.ToConsole("Error - Zero items in QSBTool list while trying to get Translator", MessageType.Error); + return null; + } + return tools.First(x => x.Type == ToolType.Translator); + } + // Update player data : public static void HandleFullStateMessage(FullStateMessage message) diff --git a/QSB/State.cs b/QSB/State.cs index 19a52233..07c23ec8 100644 --- a/QSB/State.cs +++ b/QSB/State.cs @@ -8,7 +8,8 @@ namespace QSB Flashlight = 0, Suit = 1, ProbeLauncher = 2, - SignalScope = 4 + Signalscope = 4, + Translator = 8 //Increment these in binary to add more states } } \ No newline at end of file diff --git a/QSB/Utility/PlayerToolsManager.cs b/QSB/Utility/PlayerToolsManager.cs index 66fd3e2c..2667d1b3 100644 --- a/QSB/Utility/PlayerToolsManager.cs +++ b/QSB/Utility/PlayerToolsManager.cs @@ -1,5 +1,6 @@ using OWML.ModHelper.Events; using QSB.Animation; +using System.Linq; using UnityEngine; namespace QSB.Utility @@ -9,20 +10,27 @@ namespace QSB.Utility private static Transform _cameraBody; private static Transform _toolStowTransform; private static Transform _toolHoldTransform; + private static Material _playerToolsMaterial; + private static Material _lightbulbMaterial; private static readonly Vector3 FlashlightOffset = new Vector3(0.7196316f, -0.2697681f, 0.3769455f); private static readonly Vector3 SignalscopeScale = new Vector3(1.5f, 1.5f, 1.5f); + private static readonly Vector3 TranslatorScale = new Vector3(0.75f, 0.75f, 0.75f); public static void Init(Transform camera) { _cameraBody = camera; - CreateStowTransform(_cameraBody); + CreateStowTransforms(_cameraBody); + + _playerToolsMaterial = GameObject.Find("PlayerSuit_Jetpack").GetComponent().materials[0]; + _lightbulbMaterial = GameObject.Find("Props_HEA_Lantern (10)/Lantern_Lamp").GetComponent().materials[0]; CreateFlashlight(); CreateSignalscope(); + CreateTranslator(); } - private static void CreateStowTransform(Transform root) + private static void CreateStowTransforms(Transform root) { var stow = new GameObject("ToolStowTransform"); _toolStowTransform = stow.transform; @@ -58,8 +66,10 @@ namespace QSB.Utility { var signalscopeRoot = GameObject.Instantiate(GameObject.Find("Signalscope")); signalscopeRoot.SetActive(false); + Object.Destroy(signalscopeRoot.GetComponent()); - Object.Destroy(signalscopeRoot.transform.Find("Props_HEA_Signalscope_Prepass")); + Object.Destroy(signalscopeRoot.transform.Find("Props_HEA_Signalscope") + .Find("Props_HEA_Signalscope_Prepass").gameObject); var oldSignalscope = signalscopeRoot.GetComponent(); var tool = signalscopeRoot.AddComponent(); @@ -69,13 +79,57 @@ namespace QSB.Utility tool.SetValue("_arrivalDegrees", 5f); tool.Type = ToolType.Signalscope; tool.ToolGameObject = signalscopeRoot.transform.Find("Props_HEA_Signalscope").gameObject; - signalscopeRoot.transform.Find("Props_HEA_Signalscope").gameObject.layer = 0; oldSignalscope.enabled = false; + GetRenderer(signalscopeRoot, "Props_HEA_Signalscope").material = _playerToolsMaterial; + signalscopeRoot.transform.parent = _cameraBody; signalscopeRoot.transform.localPosition = Vector3.zero; signalscopeRoot.transform.localScale = SignalscopeScale; signalscopeRoot.SetActive(true); } + + private static void CreateTranslator() + { + var translatorRoot = GameObject.Instantiate(GameObject.Find("NomaiTranslatorProp")); + translatorRoot.SetActive(false); + + var group = translatorRoot.transform.Find("TranslatorGroup"); + var model = group.Find("Props_HEA_Translator"); + + Object.Destroy(translatorRoot.GetComponent()); + Object.Destroy(group.Find("Canvas").gameObject); + Object.Destroy(group.Find("Lighting").gameObject); + Object.Destroy(group.Find("TranslatorBeams").gameObject); + Object.Destroy(model.Find("Props_HEA_Translator_Pivot_RotatingPart") + .Find("Props_HEA_Translator_RotatingPart") + .Find("Props_HEA_Translator_RotatingPart_Prepass").gameObject); + Object.Destroy(model.Find("Props_HEA_Translator_Prepass").gameObject); + + var oldTranslator = translatorRoot.GetComponent(); + var tool = translatorRoot.AddComponent(); + tool.SetValue("_moveSpring", oldTranslator.GetValue("_moveSpring")); + tool.SetValue("_stowTransform", _toolStowTransform); + tool.SetValue("_holdTransform", _toolHoldTransform); + tool.SetValue("_arrivalDegrees", 5f); + tool.Type = ToolType.Translator; + tool.ToolGameObject = group.gameObject; + oldTranslator.enabled = false; + + GetRenderer(translatorRoot, "Props_HEA_Translator_Geo").material = _playerToolsMaterial; + GetRenderer(translatorRoot, "Props_HEA_Translator_RotatingPart").material = _playerToolsMaterial; + GetRenderer(translatorRoot, "Props_HEA_Translator_Button_L").material = _lightbulbMaterial; + GetRenderer(translatorRoot, "Props_HEA_Translator_Button_R").material = _lightbulbMaterial; + + translatorRoot.transform.parent = _cameraBody; + translatorRoot.transform.localPosition = Vector3.zero; + translatorRoot.transform.localScale = TranslatorScale; + translatorRoot.SetActive(true); + } + + private static MeshRenderer GetRenderer(GameObject root, string gameobjectName) + { + return root.GetComponentsInChildren(true).First(x => x.name == gameobjectName); + } } }