2022-07-01 10:48:30 +01:00

213 lines
7.8 KiB
C#

using HarmonyLib;
using QSB.Messaging;
using QSB.Patches;
using QSB.Tools.TranslatorTool.Messages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace QSB.Tools.TranslatorTool.Patches;
internal class TranslatorPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPatch(typeof(NomaiTranslatorProp), nameof(NomaiTranslatorProp.Update))]
public static bool Update(NomaiTranslatorProp __instance)
{
var targetTranslated = __instance._nomaiTextComponent != null && __instance._nomaiTextComponent.IsTranslated(__instance._currentTextID);
var canTranslate = !__instance._isTargetingGhostText && !targetTranslated && __instance._textNodeToDisplay != null;
__instance._centerTranslatePrompt.SetVisibility(canTranslate && !__instance._hasUsedTranslator);
__instance._translatePrompt.SetVisibility(canTranslate && __instance._hasUsedTranslator);
if (!__instance._hasUsedTranslator && targetTranslated && Locator.GetPlayerSuit().IsWearingHelmet())
{
PlayerData.SetPersistentCondition("HAS_USED_TRANSLATOR", true);
__instance._hasUsedTranslator = true;
}
__instance.UpdateTimeFreeze(targetTranslated, __instance._nomaiTextComponent);
if (__instance._textNodeToDisplay != null && __instance._textNodeToDisplay != __instance._lastTextNodeToDisplay)
{
__instance.StopTranslating();
__instance.SwitchTextNode(__instance._textNodeToDisplay);
}
__instance._lastTextNodeToDisplay = __instance._textNodeToDisplay;
if (__instance._isTargetingGhostText)
{
__instance._textField.text = UITextLibrary.GetString(__instance._isTooCloseToTarget
? UITextType.TranslatorTooCloseWarning
: UITextType.TranslatorUntranslatableWarning);
}
else if (__instance._textNodeToDisplay == null)
{
__instance._textField.text = "";
__instance._pageNumberTextField.text = "";
__instance.StopTranslating();
}
else if (__instance._isTooCloseToTarget)
{
__instance._textField.text = UITextLibrary.GetString(UITextType.TranslatorTooCloseWarning);
}
else
{
__instance.DisplayTextNode();
}
__instance._textField.rectTransform.sizeDelta = new Vector2(__instance._textField.rectTransform.sizeDelta.x, __instance._textField.preferredHeight);
__instance._scrollRect.content.sizeDelta = new Vector2(__instance._scrollRect.content.sizeDelta.x, __instance._textField.preferredHeight);
var num = __instance._textField.fontSize / (__instance._textField.preferredHeight - __instance._scrollRect.viewport.sizeDelta.y);
if (OWInput.IsNewlyPressed(InputLibrary.toolOptionUp, InputMode.All))
{
__instance._scrollRect.verticalNormalizedPosition = Mathf.Clamp01(__instance._scrollRect.verticalNormalizedPosition + num);
new TranslatorScrollMessage(__instance._scrollRect.verticalNormalizedPosition).Send();
}
if (OWInput.IsNewlyPressed(InputLibrary.toolOptionDown, InputMode.All))
{
__instance._scrollRect.verticalNormalizedPosition = Mathf.Clamp01(__instance._scrollRect.verticalNormalizedPosition - num);
new TranslatorScrollMessage(__instance._scrollRect.verticalNormalizedPosition).Send();
}
__instance._scrollPrompt.SetVisibility(__instance._textField.preferredHeight > __instance._scrollRect.viewport.sizeDelta.y);
var hasPages = __instance._inNomaiAudioVolume
&& __instance._nomaiTextComponent != null
&& __instance._nomaiTextComponent.IsTranslated(1)
&& !__instance._isTranslating
&& __instance._nomaiTextComponent.GetNumTextBlocks() > 1;
var currentPage = __instance._currentTextID;
if (hasPages)
{
var numTextBlocks = __instance._nomaiTextComponent.GetNumTextBlocks();
if (OWInput.IsNewlyPressed(InputLibrary.toolOptionLeft, InputMode.All))
{
currentPage = Mathf.Max(1, __instance._currentTextID - 1);
}
if (OWInput.IsNewlyPressed(InputLibrary.toolOptionRight, InputMode.All))
{
currentPage = Mathf.Min(numTextBlocks, __instance._currentTextID + 1);
}
if (currentPage != __instance._currentTextID)
{
__instance._currentTextID = currentPage;
if (__instance._nomaiTextComponent != null && __instance._inNomaiAudioVolume)
{
__instance._textNodeToDisplay = __instance._nomaiTextComponent.GetTextNode(__instance._currentTextID);
__instance.SetNomaiAudioArrowEmissions();
}
}
if (__instance._pageNumberTextField != null)
{
__instance._pageNumberStrBuilder.Length = 0;
__instance._pageNumberStrBuilder.Append(currentPage);
__instance._pageNumberStrBuilder.Append(" / ");
__instance._pageNumberStrBuilder.Append(numTextBlocks);
if (__instance._pageNumberTextField.text != __instance._pageNumberStrBuilder.ToString())
{
__instance._pageNumberTextField.text = __instance._pageNumberStrBuilder.ToString();
}
}
}
else if (__instance._pageNumberTextField != null && __instance._pageNumberTextField.text != "")
{
__instance._pageNumberTextField.text = "";
}
__instance._pagePrompt.SetVisibility(hasPages);
return false;
}
[HarmonyPatch(typeof(NomaiTranslatorProp), nameof(NomaiTranslatorProp.DisplayTextNode))]
public static bool DisplayTextNode(NomaiTranslatorProp __instance)
{
if (!__instance._nomaiTextComponent.IsTranslated(__instance._currentTextID))
{
if (OWInput.IsPressed(InputLibrary.toolActionPrimary, 0f) || (__instance._inNomaiAudioVolume && __instance._currentTextID > 1))
{
__instance._translationTimeElapsed += Time.deltaTime;
if (!__instance._isTranslating)
{
new IsTranslatingMessage(true).Send();
__instance._isTranslating = true;
__instance._audioController.PlayTranslateAudio();
}
}
else if (__instance._isTranslating)
{
new IsTranslatingMessage(false).Send();
__instance.StopTranslating();
}
}
else if (__instance._nomaiTextComponent.IsTranslated(__instance._currentTextID))
{
__instance._translationTimeElapsed += Time.deltaTime;
}
var isDynamic = false;
string text;
if (__instance._translationTimeElapsed == 0f && !__instance._nomaiTextComponent.IsTranslated(__instance._currentTextID))
{
text = __instance._inNomaiAudioVolume ? UITextLibrary.GetString(UITextType.TranslatorUntranslatedRecordingWarning) : UITextLibrary.GetString(UITextType.TranslatorUntranslatedWritingWarning);
}
else
{
if (__instance._translationTimeElapsed > (float)(__instance._numTranslatedWords + 1) * __instance._perWordTranslationTime && __instance._numTranslatedWords < __instance._listDisplayWords.Count)
{
__instance._listDisplayWordsByLength[__instance._numTranslatedWords].BeginTranslation(__instance._perWordTranslationTime);
__instance._numTranslatedWords++;
}
for (var i = 0; i < __instance._listDisplayWords.Count; i++)
{
__instance._listDisplayWordsByLength[i].UpdateDisplayText(Time.deltaTime);
}
__instance._strBuilder.Length = 0;
var allWordsTranslated = true;
for (var j = 0; j < __instance._listDisplayWords.Count; j++)
{
var translatorWord = __instance._listDisplayWords[j];
__instance._strBuilder.Append(translatorWord.DisplayText);
if (!translatorWord.IsTranslated())
{
allWordsTranslated = false;
}
}
text = __instance._strBuilder.ToString();
if (allWordsTranslated)
{
__instance.StopTranslating();
__instance._nomaiTextComponent.SetAsTranslated(__instance._currentTextID);
__instance.SetNomaiAudioArrowEmissions();
if (text.Contains("</i>") || text.Contains("</b>") || text.Contains("</u>") || text.Contains("</size>"))
{
isDynamic = true;
}
}
}
if (isDynamic && __instance._textField.font != __instance._dynamicFontInUse)
{
__instance._textField.font = __instance._dynamicFontInUse;
}
else if (!isDynamic && __instance._textField.font != __instance._fontInUse)
{
__instance._textField.font = __instance._fontInUse;
}
__instance._textField.text = text;
return false;
}
}