body resyncing

This commit is contained in:
JohnCorby 2021-12-05 21:30:04 -08:00
parent 543e2d57d5
commit fbb88b5775
6 changed files with 101 additions and 40 deletions

View File

@ -103,5 +103,6 @@
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,6 +108,7 @@ namespace QSB.Events
new FragmentResyncEvent(),
new JellyfishRisingEvent(),
new TornadoFormStateEvent(),
new BodyResyncEvent(),
// Conversation/dialogue/exploration
new ConversationEvent(),
new ConversationStartEndEvent(),

View File

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

View File

@ -0,0 +1,43 @@
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

@ -0,0 +1,38 @@
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,56 +1,35 @@
using QSB.TornadoSync.TransformSync;
using QSB.Events;
using QSB.TornadoSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET;
using UnityEngine;
namespace QSB.TornadoSync
{
public class TornadoManager : WorldObjectManager
{
protected override void RebuildWorldObjects(OWScene scene)
{
protected override void RebuildWorldObjects(OWScene scene) =>
QSBWorldSync.Init<QSBTornado, TornadoController>();
return;
if (!QSBCore.IsHost)
{
return;
}
public static void FireResync()
{
QSBWorldSync.GetWorldObjects<QSBTornado>().ForEach(tornado
=> QSBEventManager.FireEvent(EventNames.QSBTornadoFormState, tornado));
foreach (var transformSync in QSBWorldSync.GetWorldObjects<OccasionalTransformSync>())
// cannon
var cannon = Locator._orbitalProbeCannon.GetRequiredComponent<OrbitalProbeLaunchController>();
var gdBody = Locator._giantsDeep.GetOWRigidbody();
QSBEventManager.FireEvent(EventNames.QSBBodyResync, cannon.GetAttachedOWRigidbody(), gdBody);
foreach (var proxy in cannon._realDebrisSectorProxies)
{
QNetworkServer.Destroy(transformSync.gameObject);
}
// cannon parts
foreach (var cannonPartNames in new[]
{
"OrbitalProbeCannon_Body",
"CannonBarrel_Body",
"CannonMuzzle_Body"
})
{
var cannonPart = GameObject.Find(cannonPartNames).GetAttachedOWRigidbody();
var transformSync = Instantiate(QSBNetworkManager.Instance.OccasionalPrefab).GetComponent<OccasionalTransformSync>();
transformSync.InitBodyIndexes(cannonPart, Locator._giantsDeep.GetOWRigidbody());
transformSync.gameObject.SpawnWithServerAuthority();
QSBEventManager.FireEvent(EventNames.QSBBodyResync,
proxy.transform.root.GetAttachedOWRigidbody(), gdBody);
}
QSBEventManager.FireEvent(EventNames.QSBBodyResync, cannon._probeBody, gdBody);
// islands
foreach (var islandNames in new[]
foreach (var island in QSBWorldSync.GetUnityObjects<IslandController>())
{
"GabbroIsland_Body",
"StatueIsland_Body",
"ConstructionYardIsland_Body",
"BrambleIsland_Body"
})
{
var island = GameObject.Find(islandNames).GetAttachedOWRigidbody();
var transformSync = Instantiate(QSBNetworkManager.Instance.OccasionalPrefab).GetComponent<OccasionalTransformSync>();
transformSync.InitBodyIndexes(island, Locator._giantsDeep.GetOWRigidbody());
transformSync.gameObject.SpawnWithServerAuthority();
QSBEventManager.FireEvent(EventNames.QSBBodyResync, island._islandBody, gdBody);
}
}
}