From 0d3fd1558542aeddac9dfba83eb08b958d718c5d Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Wed, 10 Nov 2021 09:12:05 +0000 Subject: [PATCH] add tools and stuffz --- QSB/QSB.csproj | 2 + QSB/Syncs/SyncBase.cs | 2 +- QSB/Tools/PlayerToolsManager.cs | 2 + QSB/Tools/QSBTool.cs | 4 +- .../TranslatorTool/QSBNomaiTranslator.cs | 172 ++++++++++++++++++ .../TranslatorTool/QSBNomaiTranslatorProp.cs | 149 +++++++++++++++ QSB/Tools/TranslatorTool/TranslatorCreator.cs | 50 ++--- 7 files changed, 356 insertions(+), 25 deletions(-) create mode 100644 QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs create mode 100644 QSB/Tools/TranslatorTool/QSBNomaiTranslatorProp.cs diff --git a/QSB/QSB.csproj b/QSB/QSB.csproj index b2f1c2ce..23c6b54c 100644 --- a/QSB/QSB.csproj +++ b/QSB/QSB.csproj @@ -252,6 +252,8 @@ + + diff --git a/QSB/Syncs/SyncBase.cs b/QSB/Syncs/SyncBase.cs index 988231d3..9628d248 100644 --- a/QSB/Syncs/SyncBase.cs +++ b/QSB/Syncs/SyncBase.cs @@ -228,7 +228,7 @@ namespace QSB.Syncs ReparentAttachedObject(ReferenceTransform); } - UpdateTransform(); + oh rUpdateTransform(); base.Update(); } diff --git a/QSB/Tools/PlayerToolsManager.cs b/QSB/Tools/PlayerToolsManager.cs index eab24ce1..eb7fc62b 100644 --- a/QSB/Tools/PlayerToolsManager.cs +++ b/QSB/Tools/PlayerToolsManager.cs @@ -15,6 +15,7 @@ namespace QSB.Tools public static Material Props_HEA_PlayerTool_mat; public static Material Props_HEA_Lightbulb_mat; public static Material Props_HEA_Lightbulb_OFF_mat; + public static Material Structure_HEA_PlayerShip_Screens_mat; public static void Init(Transform playerCamera) { @@ -22,6 +23,7 @@ namespace QSB.Tools Props_HEA_PlayerTool_mat = GameObject.Find("Props_HEA_ProbeLauncher_ProbeCamera/ProbeLauncherChassis").GetComponent().materials[0]; Props_HEA_Lightbulb_OFF_mat = GameObject.Find("Props_HEA_Probe_Prelaunch").GetComponent().materials[1]; + if (QSBSceneManager.CurrentScene == OWScene.SolarSystem) { Props_HEA_Lightbulb_mat = GameObject.Find("Props_HEA_Lantern (10)/Lantern_Lamp").GetComponent().materials[0]; diff --git a/QSB/Tools/QSBTool.cs b/QSB/Tools/QSBTool.cs index 08d15018..1a001d99 100644 --- a/QSB/Tools/QSBTool.cs +++ b/QSB/Tools/QSBTool.cs @@ -31,8 +31,8 @@ namespace QSB.Tools set => _arrivalDegrees = value; } - public void OnEnable() => ToolGameObject?.SetActive(true); - public void OnDisable() => ToolGameObject?.SetActive(false); + public virtual void OnEnable() => ToolGameObject?.SetActive(true); + public virtual void OnDisable() => ToolGameObject?.SetActive(false); public void ChangeEquipState(bool equipState) { diff --git a/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs new file mode 100644 index 00000000..dfe58ff5 --- /dev/null +++ b/QSB/Tools/TranslatorTool/QSBNomaiTranslator.cs @@ -0,0 +1,172 @@ +using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; + +namespace QSB.Tools.TranslatorTool +{ + class QSBNomaiTranslator : QSBTool + { + public static float distToClosestTextCenter = 1f; + + public const float MAX_INTERACT_RANGE = 25f; + + public Transform RaycastTransform; + private Collider _lastHitCollider; + private QSBNomaiTranslatorProp _translatorProp; + private NomaiText _currentNomaiText; + private NomaiTextLine _lastHighlightedTextLine; + private bool _lastLineWasTranslated; + private bool _lastLineLocked; + private float _lastLineDist; + + private void Awake() + { + DebugLog.DebugWrite($"Awake."); + _lastHitCollider = null; + _translatorProp = this.GetRequiredComponentInChildren(); + _currentNomaiText = null; + } + + public override void OnDisable() + { + _translatorProp.OnFinishUnequipAnimation(); + } + + public override void EquipTool() + { + DebugLog.DebugWrite($"Equip."); + base.EquipTool(); + _translatorProp.OnEquipTool(); + } + + public override void UnequipTool() + { + DebugLog.DebugWrite($"Unequip."); + base.UnequipTool(); + _translatorProp.OnUnequipTool(); + } + + public override void Update() + { + base.Update(); + if (!_isEquipped) + { + return; + } + + distToClosestTextCenter = 1f; + var tooCloseToTarget = false; + var num = float.MaxValue; + if (Physics.Raycast(RaycastTransform.position, RaycastTransform.forward, out var raycastHit, 25f, OWLayerMask.blockableInteractMask)) + { + _lastHitCollider = raycastHit.collider; + _currentNomaiText = _lastHitCollider.GetComponent(); + if (_currentNomaiText != null) + { + DebugLog.DebugWrite($"Found Nomai text."); + } + + if (_currentNomaiText != null && !_currentNomaiText.CheckAllowFocus(raycastHit.distance, RaycastTransform.forward)) + { + DebugLog.DebugWrite($"This text doesn't allow focus."); + _currentNomaiText = null; + } + num = raycastHit.distance; + } + else + { + _lastHitCollider = null; + _currentNomaiText = null; + } + + if (_currentNomaiText != null) + { + tooCloseToTarget = (num < _currentNomaiText.GetMinimumReadableDistance()); + + if (_currentNomaiText is NomaiWallText) + { + DebugLog.DebugWrite($"Wall text."); + var nomaiTextLine = (_currentNomaiText as NomaiWallText).GetClosestTextLineByCenter(raycastHit.point); + if (_lastLineLocked) + { + var distToCenter = _lastHighlightedTextLine.GetDistToCenter(raycastHit.point); + if (distToCenter > _lastLineDist + 0.1f) + { + _lastHighlightedTextLine = nomaiTextLine; + _lastLineWasTranslated = (nomaiTextLine != null && nomaiTextLine.IsTranslated()); + _lastLineLocked = false; + } + else + { + nomaiTextLine = _lastHighlightedTextLine; + } + + if (distToCenter < _lastLineDist) + { + _lastLineDist = distToCenter; + } + } + else if (_lastHighlightedTextLine != null && _lastHighlightedTextLine.IsTranslated() && !_lastLineWasTranslated) + { + _lastLineWasTranslated = true; + _lastLineDist = _lastHighlightedTextLine.GetDistToCenter(raycastHit.point); + _lastLineLocked = true; + } + else + { + _lastHighlightedTextLine = nomaiTextLine; + _lastLineWasTranslated = (nomaiTextLine != null && nomaiTextLine.IsTranslated()); + } + + if (nomaiTextLine && !nomaiTextLine.IsHidden() && nomaiTextLine.IsActive()) + { + distToClosestTextCenter = Vector3.Distance(raycastHit.point, nomaiTextLine.GetWorldCenter()); + _translatorProp.SetNomaiTextLine(nomaiTextLine); + } + else + { + _translatorProp.ClearNomaiTextLine(); + _lastHighlightedTextLine = null; + _lastLineWasTranslated = false; + _lastLineLocked = false; + } + } + else if (_currentNomaiText is NomaiComputer) + { + DebugLog.DebugWrite($"Nomai Computer"); + var closestRing = (_currentNomaiText as NomaiComputer).GetClosestRing(raycastHit.point, out var num2); + if (closestRing) + { + distToClosestTextCenter = Mathf.Min(num2 * 2f, 1f); + _translatorProp.SetNomaiComputerRing(closestRing); + } + } + else if (_currentNomaiText is NomaiVesselComputer) + { + var closestRing2 = (_currentNomaiText as NomaiVesselComputer).GetClosestRing(raycastHit.point, out var num3); + if (closestRing2) + { + distToClosestTextCenter = Mathf.Min(num3 * 2f, 1f); + _translatorProp.SetNomaiVesselComputerRing(closestRing2); + } + } + else if (_currentNomaiText is GhostWallText) + { + var ghostWallText = _currentNomaiText as GhostWallText; + _translatorProp.SetNomaiTextLine(ghostWallText.GetTextLine()); + } + } + else + { + _translatorProp.ClearNomaiTextLine(); + _translatorProp.ClearNomaiComputerRing(); + _translatorProp.ClearNomaiVesselComputerRing(); + } + + _translatorProp.SetTooCloseToTarget(tooCloseToTarget); + } + } +} diff --git a/QSB/Tools/TranslatorTool/QSBNomaiTranslatorProp.cs b/QSB/Tools/TranslatorTool/QSBNomaiTranslatorProp.cs new file mode 100644 index 00000000..dee0c1f0 --- /dev/null +++ b/QSB/Tools/TranslatorTool/QSBNomaiTranslatorProp.cs @@ -0,0 +1,149 @@ +using QSB.Utility; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using UnityEngine; +using UnityEngine.UI; + +namespace QSB.Tools.TranslatorTool +{ + class QSBNomaiTranslatorProp : MonoBehaviour + { + public GameObject TranslatorProp; + + private TranslatorTargetBeam _targetBeam; + private TranslatorScanBeam[] _scanBeams; + private bool _isTranslating; + + private void Awake() + { + DebugLog.DebugWrite($"Awake."); + _targetBeam = transform.GetComponentInChildren(); + _scanBeams = transform.GetComponentsInChildren(); + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].enabled = false; + } + TranslatorProp.SetActive(false); + } + + private void Start() + { + DebugLog.DebugWrite($"Start."); + enabled = false; + } + + public void OnEquipTool() + { + DebugLog.DebugWrite($"OnEquipTool."); + enabled = true; + if (_targetBeam) + { + _targetBeam.Activate(); + } + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].enabled = true; + } + TranslatorProp.SetActive(true); + } + + public void OnUnequipTool() + { + DebugLog.DebugWrite($"On unequip tool."); + enabled = false; + StopTranslating(); + } + + public void OnFinishUnequipAnimation() + { + DebugLog.DebugWrite($"On finish unequip animation."); + + if (_targetBeam) + { + _targetBeam.Deactivate(); + } + + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].enabled = false; + } + TranslatorProp.SetActive(false); + } + + public void SetTooCloseToTarget(bool value) + { + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetTooCloseToTarget(value); + } + } + + public void SetNomaiTextLine(NomaiTextLine line) + { + DebugLog.DebugWrite($"Set Nomai Text Line."); + + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiTextLine(line); + _scanBeams[i].SetNomaiComputerRing(null); + _scanBeams[i].SetNomaiVesselComputerRing(null); + } + } + + public void ClearNomaiTextLine() + { + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiTextLine(null); + } + } + + public void SetNomaiComputerRing(NomaiComputerRing ring) + { + DebugLog.DebugWrite($"Set nomai computer ring."); + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiTextLine(null); + _scanBeams[i].SetNomaiComputerRing(ring); + _scanBeams[i].SetNomaiVesselComputerRing(null); + } + } + + public void ClearNomaiComputerRing() + { + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiComputerRing(null); + } + } + + public void SetNomaiVesselComputerRing(NomaiVesselComputerRing ring) + { + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiTextLine(null); + _scanBeams[i].SetNomaiComputerRing(null); + _scanBeams[i].SetNomaiVesselComputerRing(ring); + } + } + + public void ClearNomaiVesselComputerRing() + { + for (var i = 0; i < _scanBeams.Length; i++) + { + _scanBeams[i].SetNomaiVesselComputerRing(null); + } + } + + private void StopTranslating() + { + DebugLog.DebugWrite($"Stop Translating."); + if (_isTranslating) + { + _isTranslating = false; + } + } + } +} diff --git a/QSB/Tools/TranslatorTool/TranslatorCreator.cs b/QSB/Tools/TranslatorTool/TranslatorCreator.cs index d46586cb..94a27bb1 100644 --- a/QSB/Tools/TranslatorTool/TranslatorCreator.cs +++ b/QSB/Tools/TranslatorTool/TranslatorCreator.cs @@ -9,42 +9,48 @@ namespace QSB.Tools.TranslatorTool internal static void CreateTranslator(Transform cameraBody) { - var original = GameObject.Find("NomaiTranslatorProp"); + var NomaiTranslatorProp = GameObject.Find("NomaiTranslatorProp"); - var translatorRoot = original.InstantiateInactive(); - translatorRoot.name = "REMOTE_NomaiTranslatorProp"; + var REMOTE_NomaiTranslatorProp = NomaiTranslatorProp.InstantiateInactive(); + REMOTE_NomaiTranslatorProp.name = "REMOTE_NomaiTranslatorProp"; - var group = translatorRoot.transform.Find("TranslatorGroup"); - var model = group.Find("Props_HEA_Translator"); + var REMOTE_TranslatorGroup = REMOTE_NomaiTranslatorProp.transform.Find("TranslatorGroup"); + var REMOTE_Props_HEA_Translator = REMOTE_TranslatorGroup.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") + var oldProp = REMOTE_NomaiTranslatorProp.GetComponent(); + var newProp = REMOTE_NomaiTranslatorProp.AddComponent(); + newProp.TranslatorProp = REMOTE_TranslatorGroup.gameObject; + + Object.Destroy(REMOTE_NomaiTranslatorProp.GetComponent()); + Object.Destroy(REMOTE_TranslatorGroup.Find("Canvas").gameObject); + //Object.Destroy(REMOTE_TranslatorGroup.Find("Lighting").gameObject); + //Object.Destroy(REMOTE_TranslatorGroup.Find("TranslatorBeams").gameObject); + Object.Destroy(REMOTE_Props_HEA_Translator.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); + Object.Destroy(REMOTE_Props_HEA_Translator.Find("Props_HEA_Translator_Prepass").gameObject); - var oldTranslator = translatorRoot.GetComponent(); - var tool = translatorRoot.AddComponent(); + var oldTranslator = REMOTE_NomaiTranslatorProp.GetComponent(); + var tool = REMOTE_NomaiTranslatorProp.AddComponent(); tool.MoveSpring = oldTranslator._moveSpring; tool.StowTransform = PlayerToolsManager.StowTransform; tool.HoldTransform = PlayerToolsManager.HoldTransform; tool.ArrivalDegrees = 5f; tool.Type = ToolType.Translator; - tool.ToolGameObject = group.gameObject; + tool.ToolGameObject = REMOTE_TranslatorGroup.gameObject; + tool.RaycastTransform = cameraBody; Object.Destroy(oldTranslator); - PlayerToolsManager.GetRenderer(translatorRoot, "Props_HEA_Translator_Geo").material = PlayerToolsManager.Props_HEA_PlayerTool_mat; - PlayerToolsManager.GetRenderer(translatorRoot, "Props_HEA_Translator_RotatingPart").material = PlayerToolsManager.Props_HEA_PlayerTool_mat; - PlayerToolsManager.GetRenderer(translatorRoot, "Props_HEA_Translator_Button_L").material = PlayerToolsManager.Props_HEA_Lightbulb_mat; - PlayerToolsManager.GetRenderer(translatorRoot, "Props_HEA_Translator_Button_R").material = PlayerToolsManager.Props_HEA_Lightbulb_mat; + PlayerToolsManager.GetRenderer(REMOTE_NomaiTranslatorProp, "Props_HEA_Translator_Screen").material = PlayerToolsManager.Structure_HEA_PlayerShip_Screens_mat; + PlayerToolsManager.GetRenderer(REMOTE_NomaiTranslatorProp, "Props_HEA_Translator_Geo").material = PlayerToolsManager.Props_HEA_PlayerTool_mat; + PlayerToolsManager.GetRenderer(REMOTE_NomaiTranslatorProp, "Props_HEA_Translator_RotatingPart").material = PlayerToolsManager.Props_HEA_PlayerTool_mat; + PlayerToolsManager.GetRenderer(REMOTE_NomaiTranslatorProp, "Props_HEA_Translator_Button_L").material = PlayerToolsManager.Props_HEA_Lightbulb_mat; + PlayerToolsManager.GetRenderer(REMOTE_NomaiTranslatorProp, "Props_HEA_Translator_Button_R").material = PlayerToolsManager.Props_HEA_Lightbulb_mat; - translatorRoot.transform.parent = cameraBody; - translatorRoot.transform.localPosition = Vector3.zero; - translatorRoot.transform.localScale = TranslatorScale; - QSBCore.UnityEvents.FireOnNextUpdate(() => translatorRoot.SetActive(true)); + REMOTE_NomaiTranslatorProp.transform.parent = cameraBody; + REMOTE_NomaiTranslatorProp.transform.localPosition = Vector3.zero; + REMOTE_NomaiTranslatorProp.transform.localScale = TranslatorScale; + QSBCore.UnityEvents.FireOnNextUpdate(() => REMOTE_NomaiTranslatorProp.SetActive(true)); } } }