go back to using transform syncs. it just gets too desynced without it

This commit is contained in:
JohnCorby 2021-12-06 03:09:23 -08:00
parent 1fa41d30fd
commit 4978ece2ff
7 changed files with 30 additions and 122 deletions

View File

@ -103,6 +103,5 @@
public const string QSBAuthorityQueue = nameof(QSBAuthorityQueue);
public const string QSBJellyfishRising = nameof(QSBJellyfishRising);
public const string QSBTornadoFormState = nameof(QSBTornadoFormState);
public const string QSBBodyResync = nameof(QSBBodyResync);
}
}

View File

@ -108,7 +108,6 @@ namespace QSB.Events
new FragmentResyncEvent(),
new JellyfishRisingEvent(),
new TornadoFormStateEvent(),
new BodyResyncEvent(),
// Conversation/dialogue/exploration
new ConversationEvent(),
new ConversationStartEndEvent(),

View File

@ -9,6 +9,7 @@ using QSB.QuantumSync;
using QSB.Tools.TranslatorTool.TranslationSync;
using QSB.Tools.TranslatorTool.TranslationSync.WorldObjects;
using QSB.TornadoSync;
using QSB.TornadoSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
@ -96,7 +97,8 @@ namespace QSB.Player.Events
QSBWorldSync.GetWorldObjects<QSBFragment>().ForEach(fragment
=> QSBEventManager.FireEvent(EventNames.QSBFragmentResync, fragment));
TornadoManager.FireResync();
QSBWorldSync.GetWorldObjects<QSBTornado>().ForEach(tornado
=> QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, tornado));
}
}
}

View File

@ -1,43 +0,0 @@
using QSB.Events;
using QSB.Syncs;
namespace QSB.TornadoSync.Events
{
public class BodyResyncEvent : QSBEvent<BodyResyncMessage>
{
public override bool RequireWorldObjectsReady => true;
public override void SetupListener()
=> GlobalMessenger<OWRigidbody, OWRigidbody>.AddListener(EventNames.QSBBodyResync, Handler);
public override void CloseListener()
=> GlobalMessenger<OWRigidbody, OWRigidbody>.RemoveListener(EventNames.QSBBodyResync, Handler);
private void Handler(OWRigidbody body, OWRigidbody refBody) => SendEvent(CreateMessage(body, refBody));
private BodyResyncMessage CreateMessage(OWRigidbody body, OWRigidbody refBody)
{
var pos = body.GetPosition();
return new BodyResyncMessage
{
BodyIndex = CenterOfTheUniverse.s_rigidbodies.IndexOf(body),
RefBodyIndex = CenterOfTheUniverse.s_rigidbodies.IndexOf(refBody),
Pos = refBody.transform.EncodePos(pos),
Rot = refBody.transform.EncodeRot(body.GetRotation()),
Vel = refBody.EncodeVel(body.GetVelocity(), pos),
AngVel = refBody.EncodeAngVel(body.GetAngularVelocity())
};
}
public override void OnReceiveRemote(bool isHost, BodyResyncMessage message)
{
var body = CenterOfTheUniverse.s_rigidbodies[message.BodyIndex];
var refBody = CenterOfTheUniverse.s_rigidbodies[message.RefBodyIndex];
var pos = refBody.transform.DecodePos(message.Pos);
body.SetPosition(pos);
body.SetRotation(refBody.transform.DecodeRot(message.Rot));
body.SetVelocity(refBody.DecodeVel(message.Vel, pos));
body.SetAngularVelocity(refBody.DecodeAngVel(message.AngVel));
}
}
}

View File

@ -1,38 +0,0 @@
using QSB.Messaging;
using QuantumUNET.Transport;
using UnityEngine;
namespace QSB.TornadoSync.Events
{
public class BodyResyncMessage : PlayerMessage
{
public int BodyIndex;
public int RefBodyIndex;
public Vector3 Pos;
public Quaternion Rot;
public Vector3 Vel;
public Vector3 AngVel;
public override void Deserialize(QNetworkReader reader)
{
base.Deserialize(reader);
BodyIndex = reader.ReadInt32();
RefBodyIndex = reader.ReadInt32();
Pos = reader.ReadVector3();
Rot = reader.ReadQuaternion();
Vel = reader.ReadVector3();
AngVel = reader.ReadVector3();
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(BodyIndex);
writer.Write(RefBodyIndex);
writer.Write(Pos);
writer.Write(Rot);
writer.Write(Vel);
writer.Write(AngVel);
}
}
}

View File

@ -1,44 +1,49 @@
using QSB.Events;
using QSB.TornadoSync.TransformSync;
using QSB.TornadoSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET;
namespace QSB.TornadoSync
{
public class TornadoManager : WorldObjectManager
{
protected override void RebuildWorldObjects(OWScene scene) =>
protected override void RebuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBTornado, TornadoController>();
public static void FireResync()
{
QSBWorldSync.GetWorldObjects<QSBTornado>().ForEach(tornado
=> QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, tornado));
if (!QSBCore.IsHost)
{
return;
}
foreach (var transformSync in QSBWorldSync.GetUnityObjects<OccasionalTransformSync>())
{
QNetworkServer.Destroy(transformSync.gameObject);
}
var gdBody = Locator._giantsDeep.GetOWRigidbody();
// cannon
var cannon = Locator._orbitalProbeCannon.GetRequiredComponent<OrbitalProbeLaunchController>();
QSBEventManager.FireEvent(EventNames.QSBBodyResync, cannon.GetAttachedOWRigidbody(), gdBody);
foreach (var fake in cannon._fakeDebrisBodies)
SpawnOccasional(cannon.GetAttachedOWRigidbody(), gdBody);
foreach (var proxy in cannon._realDebrisSectorProxies)
{
if (fake)
{
QSBEventManager.FireEvent(EventNames.QSBBodyResync,
fake.GetAttachedOWRigidbody(), gdBody);
}
SpawnOccasional(proxy.transform.root.GetAttachedOWRigidbody(), gdBody);
}
foreach (var real in cannon._realDebrisSectorProxies)
{
QSBEventManager.FireEvent(EventNames.QSBBodyResync,
real.transform.root.GetAttachedOWRigidbody(), gdBody);
}
QSBEventManager.FireEvent(EventNames.QSBBodyResync, cannon._probeBody, gdBody);
SpawnOccasional(cannon._probeBody, gdBody);
// islands
foreach (var island in QSBWorldSync.GetUnityObjects<IslandController>())
{
QSBEventManager.FireEvent(EventNames.QSBBodyResync, island._islandBody, gdBody);
SpawnOccasional(island._islandBody, gdBody);
}
}
private static void SpawnOccasional(OWRigidbody body, OWRigidbody refBody)
{
var transformSync = Instantiate(QSBNetworkManager.Instance.OccasionalPrefab).GetRequiredComponent<OccasionalTransformSync>();
transformSync.InitBodyIndexes(body, refBody);
transformSync.gameObject.SpawnWithServerAuthority();
}
}
}

View File

@ -34,12 +34,6 @@ namespace QSB.TornadoSync.TransformSync
SetReferenceTransform(CenterOfTheUniverse.s_rigidbodies[_refBodyIndex].transform);
_sectors = ((OWRigidbody)AttachedObject).GetComponentsInChildren<Sector>()
.Select(x => x.name).ToArray();
// to prevent change in rotation/angvel
if (!HasAuthority && AttachedObject.TryGetComponent<AlignWithDirection>(out var align))
{
align.enabled = false;
}
}
public override void SerializeTransform(QNetworkWriter writer, bool initialState)
@ -73,7 +67,6 @@ namespace QSB.TornadoSync.TransformSync
_shouldUpdate = true;
}
/// replacement that handles KinematicRigidbody
protected override bool UpdateTransform()
{
if (HasAuthority)
@ -140,17 +133,8 @@ namespace QSB.TornadoSync.TransformSync
}
}
if (((OWRigidbody)AttachedObject).RunningKinematicSimulation())
{
((OWRigidbody)AttachedObject).SetPosition(positionToSet);
((OWRigidbody)AttachedObject).SetRotation(rotationToSet);
}
else
{
// does nothing for KinematicRigidbody
((OWRigidbody)AttachedObject).MoveToPosition(positionToSet);
((OWRigidbody)AttachedObject).MoveToRotation(rotationToSet);
}
((OWRigidbody)AttachedObject).SetPosition(positionToSet);
((OWRigidbody)AttachedObject).SetRotation(rotationToSet);
var targetVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeVel(_relativeVelocity, targetPos);
var targetAngularVelocity = ReferenceTransform.GetAttachedOWRigidbody().DecodeAngVel(_relativeAngularVelocity);