greatly simplified nomai text object/message

This commit is contained in:
JohnCorby 2021-12-26 20:10:38 -08:00
parent 942f28a65b
commit 108fe3da04
9 changed files with 41 additions and 168 deletions

View File

@ -14,7 +14,7 @@ namespace QSB.MeteorSync
{
// wait for all late initializers (which includes meteor launchers) to finish
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.s_lateInitializers.Count == 0, () =>
QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.isDoneInitializing, () =>
{
FinishDelayedReady();
WhiteHoleVolume = QSBWorldSync.GetUnityObjects<WhiteHoleVolume>().First();

View File

@ -1,5 +1,4 @@
using OWML.Common;
using OWML.Utils;
using QSB.CampfireSync.Messages;
using QSB.CampfireSync.WorldObjects;
using QSB.ClientServerStateSync;
@ -92,22 +91,10 @@ namespace QSB.Player.Messages
QSBWorldSync.ShipLogFacts.ForEach(fact
=> new RevealFactMessage(fact.Id, fact.SaveGame, false) { To = From }.Send());
foreach (var wallText in QSBWorldSync.GetWorldObjects<QSBWallText>().Where(x => x.AttachedObject.GetValue<bool>("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0))
foreach (var text in QSBWorldSync.GetWorldObjects<QSBNomaiText>())
{
wallText.GetTranslatedIds().ForEach(id
=> wallText.SendMessage(new WallTextTranslatedMessage(id) { To = From }));
}
foreach (var computer in QSBWorldSync.GetWorldObjects<QSBComputer>().Where(x => x.AttachedObject.GetValue<bool>("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0))
{
computer.GetTranslatedIds().ForEach(id
=> computer.SendMessage(new ComputerTranslatedMessage(id) { To = From }));
}
foreach (var vesselComputer in QSBWorldSync.GetWorldObjects<QSBVesselComputer>().Where(x => x.AttachedObject.GetValue<bool>("_initialized") && x.AttachedObject.GetNumTextBlocks() > 0))
{
vesselComputer.GetTranslatedIds().ForEach(id
=> vesselComputer.SendMessage(new VesselComputerTranslatedMessage(id) { To = From }));
text.GetTranslatedIds().ForEach(id =>
text.SendMessage(new SetAsTranslatedMessage(id) { To = From }));
}
QSBWorldSync.GetWorldObjects<IQSBQuantumObject>().ForEach(x =>

View File

@ -1,13 +1,14 @@
using QSB.Messaging;
using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects;
using QSB.WorldSync;
using QuantumUNET.Transport;
namespace QSB.Tools.TranslatorTool.TranslationSync.Messages
{
internal abstract class SetAsTranslatedMessage<T> : QSBWorldObjectMessage<T> where T : IWorldObject
internal class SetAsTranslatedMessage : QSBWorldObjectMessage<QSBNomaiText>
{
protected int TextId;
private int TextId;
public SetAsTranslatedMessage(int textId) => TextId = textId;
public override void Serialize(QNetworkWriter writer)
{
@ -20,23 +21,7 @@ namespace QSB.Tools.TranslatorTool.TranslationSync.Messages
base.Deserialize(reader);
TextId = reader.ReadInt32();
}
}
internal class WallTextTranslatedMessage : SetAsTranslatedMessage<QSBWallText>
{
public WallTextTranslatedMessage(int textId) => TextId = textId;
public override void OnReceiveRemote() => WorldObject.HandleSetAsTranslated(TextId);
}
internal class ComputerTranslatedMessage : SetAsTranslatedMessage<QSBComputer>
{
public ComputerTranslatedMessage(int textId) => TextId = textId;
public override void OnReceiveRemote() => WorldObject.HandleSetAsTranslated(TextId);
}
internal class VesselComputerTranslatedMessage : SetAsTranslatedMessage<QSBVesselComputer>
{
public VesselComputerTranslatedMessage(int textId) => TextId = textId;
public override void OnReceiveRemote() => WorldObject.HandleSetAsTranslated(TextId);
public override void OnReceiveRemote() => WorldObject.SetAsTranslated(TextId);
}
}

View File

@ -7,51 +7,25 @@ using QSB.WorldSync;
namespace QSB.Tools.TranslatorTool.TranslationSync.Patches
{
[HarmonyPatch]
internal class SpiralPatches : QSBPatch
{
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiWallText), nameof(NomaiWallText.SetAsTranslated))]
public static bool NomaiWallText_SetAsTranslated(NomaiWallText __instance, int id)
[HarmonyPatch(typeof(NomaiText), nameof(NomaiText.SetAsTranslated))]
public static void SetAsTranslated(NomaiText __instance, int id)
{
if (__instance is GhostWallText)
{
return;
}
if (__instance.IsTranslated(id))
{
return true;
return;
}
__instance.GetWorldObject<QSBWallText>()
.SendMessage(new WallTextTranslatedMessage(id));
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiComputer), nameof(NomaiWallText.SetAsTranslated))]
public static bool NomaiComputer_SetAsTranslated(NomaiComputer __instance, int id)
{
if (__instance.IsTranslated(id))
{
return true;
}
__instance.GetWorldObject<QSBComputer>()
.SendMessage(new ComputerTranslatedMessage(id));
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(NomaiVesselComputer), nameof(NomaiWallText.SetAsTranslated))]
public static bool NomaiVesselComputer_SetAsTranslated(NomaiVesselComputer __instance, int id)
{
if (__instance.IsTranslated(id))
{
return true;
}
__instance.GetWorldObject<QSBVesselComputer>()
.SendMessage(new VesselComputerTranslatedMessage(id));
return true;
__instance.GetWorldObject<QSBNomaiText>()
.SendMessage(new SetAsTranslatedMessage(id));
}
}
}

View File

@ -9,9 +9,13 @@ namespace QSB.Tools.TranslatorTool.TranslationSync
protected override void RebuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBWallText, NomaiWallText>();
QSBWorldSync.Init<QSBComputer, NomaiComputer>();
QSBWorldSync.Init<QSBVesselComputer, NomaiVesselComputer>();
// wait for all late initializers (which includes nomai text) to finish
StartDelayedReady();
QSBCore.UnityEvents.RunWhen(() => LateInitializerManager.isDoneInitializing, () =>
{
FinishDelayedReady();
QSBWorldSync.Init<QSBNomaiText, NomaiText>(typeof(GhostWallText));
});
}
}
}

View File

@ -1,40 +0,0 @@
using OWML.Utils;
using QSB.WorldSync;
using System.Collections.Generic;
namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects
{
internal class QSBComputer : WorldObject<NomaiComputer>
{
public void HandleSetAsTranslated(int id)
{
if (AttachedObject.IsTranslated(id))
{
return;
}
AttachedObject.SetAsTranslated(id);
}
public IEnumerable<int> GetTranslatedIds()
{
var activeList = AttachedObject.GetValue<List<NomaiComputerRing>>("_activeRingList");
foreach (var item in activeList)
{
if (AttachedObject.IsTranslated(item.GetEntryID()))
{
yield return item.GetEntryID();
}
}
var inactiveList = AttachedObject.GetValue<List<NomaiComputerRing>>("_inactiveRingList");
foreach (var item in inactiveList)
{
if (AttachedObject.IsTranslated(item.GetEntryID()))
{
yield return item.GetEntryID();
}
}
}
}
}

View File

@ -0,0 +1,16 @@
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects
{
internal class QSBNomaiText : WorldObject<NomaiText>
{
public void SetAsTranslated(int id) => AttachedObject.SetAsTranslated(id);
public IEnumerable<int> GetTranslatedIds() =>
AttachedObject._dictNomaiTextData
.Where(x => x.Value.IsTranslated)
.Select(x => x.Key);
}
}

View File

@ -1,28 +0,0 @@
using OWML.Utils;
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects
{
internal class QSBVesselComputer : WorldObject<NomaiVesselComputer>
{
public void HandleSetAsTranslated(int id)
{
if (AttachedObject.IsTranslated(id))
{
return;
}
AttachedObject.SetAsTranslated(id);
}
public IEnumerable<int> GetTranslatedIds()
{
var rings = AttachedObject.GetValue<NomaiVesselComputerRing[]>("_computerRings");
return rings
.Where(ring => AttachedObject.IsTranslated(ring.GetEntryID()))
.Select(ring => ring.GetEntryID());
}
}
}

View File

@ -1,25 +0,0 @@
using QSB.WorldSync;
using System.Collections.Generic;
using System.Linq;
namespace QSB.Tools.TranslatorTool.TranslationSync.WorldObjects
{
internal class QSBWallText : WorldObject<NomaiWallText>
{
public void HandleSetAsTranslated(int id)
{
if (AttachedObject.IsTranslated(id))
{
return;
}
AttachedObject.SetAsTranslated(id);
}
public IEnumerable<int> GetTranslatedIds()
{
var dict = AttachedObject._idToNodeDict;
return dict.Keys.Where(key => AttachedObject.IsTranslated(key));
}
}
}