mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-03-02 19:13:34 +00:00
body resyncing
This commit is contained in:
parent
543e2d57d5
commit
fbb88b5775
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -108,6 +108,7 @@ namespace QSB.Events
|
||||
new FragmentResyncEvent(),
|
||||
new JellyfishRisingEvent(),
|
||||
new TornadoFormStateEvent(),
|
||||
new BodyResyncEvent(),
|
||||
// Conversation/dialogue/exploration
|
||||
new ConversationEvent(),
|
||||
new ConversationStartEndEvent(),
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
43
QSB/TornadoSync/Events/BodyResyncEvent.cs
Normal file
43
QSB/TornadoSync/Events/BodyResyncEvent.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
}
|
38
QSB/TornadoSync/Events/BodyResyncMessage.cs
Normal file
38
QSB/TornadoSync/Events/BodyResyncMessage.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user