This commit is contained in:
JohnCorby 2021-11-13 16:57:06 -08:00
parent 8e7ff076bf
commit 082996cb61
9 changed files with 237 additions and 123 deletions

View File

@ -36,33 +36,33 @@ namespace QSB.MeteorSync.Events
FragmentTransforms = new MeteorResyncMessage.TransformMessage[fragments.Length]
};
var refBody = Locator._brittleHollow.GetOWRigidbody();
for (var i = 0; i < qsbMeteors.Length; i++)
{
msg.Suspended[i] = qsbMeteors[i].AttachedObject.isSuspended;
msg.Damage[i] = qsbMeteors[i].Damage;
var body = qsbMeteors[i].AttachedObject.owRigidbody;
msg.MeteorTransforms[i] = new MeteorResyncMessage.TransformMessage
{
pos = refBody.transform.InverseTransformPoint(body.transform.position),
rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
vel = GetRelativeVelocity(body, refBody),
angVel = body.GetRelativeAngularVelocity(refBody)
};
}
for (var i = 0; i < fragments.Length; i++)
{
msg.Integrity[i] = fragments[i].GetIntegrity();
var body = fragments[i].GetAttachedOWRigidbody();
msg.FragmentTransforms[i] = new MeteorResyncMessage.TransformMessage
{
pos = refBody.transform.InverseTransformPoint(body.transform.position),
rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
vel = GetRelativeVelocity(body, refBody),
angVel = body.GetRelativeAngularVelocity(refBody)
};
}
// var refBody = Locator._brittleHollow.GetOWRigidbody();
// for (var i = 0; i < qsbMeteors.Length; i++)
// {
// msg.Suspended[i] = qsbMeteors[i].AttachedObject.isSuspended;
// msg.Damage[i] = qsbMeteors[i].Damage;
// var body = qsbMeteors[i].AttachedObject.owRigidbody;
// msg.MeteorTransforms[i] = new MeteorResyncMessage.TransformMessage
// {
// pos = refBody.transform.InverseTransformPoint(body.transform.position),
// rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
// vel = GetRelativeVelocity(body, refBody),
// angVel = body.GetRelativeAngularVelocity(refBody)
// };
// }
//
// for (var i = 0; i < fragments.Length; i++)
// {
// msg.Integrity[i] = fragments[i].GetIntegrity();
// var body = fragments[i].GetAttachedOWRigidbody();
// msg.FragmentTransforms[i] = new MeteorResyncMessage.TransformMessage
// {
// pos = refBody.transform.InverseTransformPoint(body.transform.position),
// rot = refBody.transform.InverseTransformRotation(body.transform.rotation),
// vel = GetRelativeVelocity(body, refBody),
// angVel = body.GetRelativeAngularVelocity(refBody)
// };
// }
return msg;
}
@ -77,47 +77,47 @@ namespace QSB.MeteorSync.Events
var qsbMeteors = QSBWorldSync.GetWorldObjects<QSBMeteor>().ToArray();
var fragments = QSBWorldSync.GetUnityObjects<FragmentIntegrity>().ToArray();
var refBody = Locator._brittleHollow.GetOWRigidbody();
for (var i = 0; i < qsbMeteors.Length; i++)
{
if (!msg.Suspended[i] && qsbMeteors[i].AttachedObject.isSuspended)
{
// todo
DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO unsuspend");
}
else if (msg.Suspended[i] && !qsbMeteors[i].AttachedObject.isSuspended)
{
// todo
DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO suspend");
}
qsbMeteors[i].Damage = msg.Damage[i];
var body = qsbMeteors[i].AttachedObject.owRigidbody;
var targetPos = refBody.transform.TransformPoint(msg.MeteorTransforms[i].pos);
var targetRot = refBody.transform.TransformRotation(msg.MeteorTransforms[i].rot);
var targetVel = refBody.GetPointVelocity(targetPos) + msg.MeteorTransforms[i].vel;
var targetAngVel = refBody.GetAngularVelocity() + msg.MeteorTransforms[i].angVel;
body.MoveToPosition(targetPos);
body.MoveToRotation(targetRot);
SetVelocity(body, targetVel);
body.SetAngularVelocity(targetAngVel);
}
for (var i = 0; i < fragments.Length; i++)
{
fragments[i]._integrity = 0;
fragments[i].AddDamage(fragments[i]._origIntegrity - msg.Integrity[i]);
var body = fragments[i].GetAttachedOWRigidbody();
var targetPos = refBody.transform.TransformPoint(msg.FragmentTransforms[i].pos);
var targetRot = refBody.transform.TransformRotation(msg.FragmentTransforms[i].rot);
var targetVel = refBody.GetPointVelocity(targetPos) + msg.FragmentTransforms[i].vel;
var targetAngVel = refBody.GetAngularVelocity() + msg.FragmentTransforms[i].angVel;
body.MoveToPosition(targetPos);
body.MoveToRotation(targetRot);
SetVelocity(body, targetVel);
body.SetAngularVelocity(targetAngVel);
}
// var refBody = Locator._brittleHollow.GetOWRigidbody();
// for (var i = 0; i < qsbMeteors.Length; i++)
// {
// if (!msg.Suspended[i] && qsbMeteors[i].AttachedObject.isSuspended)
// {
// // todo
// DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO unsuspend");
// }
// else if (msg.Suspended[i] && !qsbMeteors[i].AttachedObject.isSuspended)
// {
// // todo
// DebugLog.DebugWrite($"{qsbMeteors[i].LogName} - TODO suspend");
// }
//
// qsbMeteors[i].Damage = msg.Damage[i];
// var body = qsbMeteors[i].AttachedObject.owRigidbody;
// var targetPos = refBody.transform.TransformPoint(msg.MeteorTransforms[i].pos);
// var targetRot = refBody.transform.TransformRotation(msg.MeteorTransforms[i].rot);
// var targetVel = refBody.GetPointVelocity(targetPos) + msg.MeteorTransforms[i].vel;
// var targetAngVel = refBody.GetAngularVelocity() + msg.MeteorTransforms[i].angVel;
// body.MoveToPosition(targetPos);
// body.MoveToRotation(targetRot);
// SetVelocity(body, targetVel);
// body.SetAngularVelocity(targetAngVel);
// }
//
// for (var i = 0; i < fragments.Length; i++)
// {
// fragments[i]._integrity = 0;
// fragments[i].AddDamage(fragments[i]._origIntegrity - msg.Integrity[i]);
//
// var body = fragments[i].GetAttachedOWRigidbody();
// var targetPos = refBody.transform.TransformPoint(msg.FragmentTransforms[i].pos);
// var targetRot = refBody.transform.TransformRotation(msg.FragmentTransforms[i].rot);
// var targetVel = refBody.GetPointVelocity(targetPos) + msg.FragmentTransforms[i].vel;
// var targetAngVel = refBody.GetAngularVelocity() + msg.FragmentTransforms[i].angVel;
// body.MoveToPosition(targetPos);
// body.MoveToRotation(targetRot);
// SetVelocity(body, targetVel);
// body.SetAngularVelocity(targetAngVel);
// }
DebugLog.DebugWrite($"METEOR RESYNC REQUESTED - synced {qsbMeteors.Length} meteors and {fragments.Length} fragments");
}

View File

@ -19,64 +19,64 @@ namespace QSB.MeteorSync.Events
{
base.Deserialize(reader);
Suspended = new bool[reader.ReadInt32()];
for (var i = 0; i < Suspended.Length; i++)
{
Suspended[i] = reader.ReadBoolean();
}
Damage = new float[reader.ReadInt32()];
for (var i = 0; i < Damage.Length; i++)
{
Damage[i] = reader.ReadSingle();
}
MeteorTransforms = new TransformMessage[reader.ReadInt32()];
for (var i = 0; i < MeteorTransforms.Length; i++)
{
MeteorTransforms[i] = reader.ReadMessage<TransformMessage>();
}
Integrity = new float[reader.ReadInt32()];
for (var i = 0; i < Integrity.Length; i++)
{
Integrity[i] = reader.ReadSingle();
}
FragmentTransforms = new TransformMessage[reader.ReadInt32()];
for (var i = 0; i < FragmentTransforms.Length; i++)
{
FragmentTransforms[i] = reader.ReadMessage<TransformMessage>();
}
// Suspended = new bool[reader.ReadInt32()];
// for (var i = 0; i < Suspended.Length; i++)
// {
// Suspended[i] = reader.ReadBoolean();
// }
// Damage = new float[reader.ReadInt32()];
// for (var i = 0; i < Damage.Length; i++)
// {
// Damage[i] = reader.ReadSingle();
// }
// MeteorTransforms = new TransformMessage[reader.ReadInt32()];
// for (var i = 0; i < MeteorTransforms.Length; i++)
// {
// MeteorTransforms[i] = reader.ReadMessage<TransformMessage>();
// }
//
// Integrity = new float[reader.ReadInt32()];
// for (var i = 0; i < Integrity.Length; i++)
// {
// Integrity[i] = reader.ReadSingle();
// }
// FragmentTransforms = new TransformMessage[reader.ReadInt32()];
// for (var i = 0; i < FragmentTransforms.Length; i++)
// {
// FragmentTransforms[i] = reader.ReadMessage<TransformMessage>();
// }
}
public override void Serialize(QNetworkWriter writer)
{
base.Serialize(writer);
writer.Write(Suspended.Length);
foreach (var x in Suspended)
{
writer.Write(x);
}
writer.Write(Damage.Length);
foreach (var x in Damage)
{
writer.Write(x);
}
writer.Write(MeteorTransforms.Length);
foreach (var x in MeteorTransforms)
{
writer.Write(x);
}
writer.Write(Integrity.Length);
foreach (var x in Integrity)
{
writer.Write(x);
}
writer.Write(FragmentTransforms.Length);
foreach (var x in FragmentTransforms)
{
writer.Write(x);
}
// writer.Write(Suspended.Length);
// foreach (var x in Suspended)
// {
// writer.Write(x);
// }
// writer.Write(Damage.Length);
// foreach (var x in Damage)
// {
// writer.Write(x);
// }
// writer.Write(MeteorTransforms.Length);
// foreach (var x in MeteorTransforms)
// {
// writer.Write(x);
// }
//
// writer.Write(Integrity.Length);
// foreach (var x in Integrity)
// {
// writer.Write(x);
// }
// writer.Write(FragmentTransforms.Length);
// foreach (var x in FragmentTransforms)
// {
// writer.Write(x);
// }
}

View File

@ -10,6 +10,7 @@ namespace QSB.MeteorSync
protected override void RebuildWorldObjects(OWScene scene)
{
QSBWorldSync.Init<QSBMeteorLauncher, MeteorLauncher>();
QSBWorldSync.Init<QSBFragment, FragmentIntegrity>();
// wait a bit because meteors get created late
QSBCore.UnityEvents.FireInNUpdates(() =>
{

View File

@ -0,0 +1,74 @@
using System.Collections.Generic;
using QSB.MeteorSync.WorldObjects;
using QSB.Syncs.Unsectored.Rigidbodies;
using QSB.Utility;
using QSB.WorldSync;
using UnityEngine;
namespace QSB.MeteorSync.TransformSync
{
public class MeteorTransformSync : UnsectoredRigidbodySync
{
public override bool IsReady => MeteorManager.MeteorsReady;
public override bool UseInterpolation => false;
private QSBMeteor _qsbMeteor;
private static readonly List<MeteorTransformSync> _instances = new List<MeteorTransformSync>();
protected override OWRigidbody GetRigidbody()
=> _qsbMeteor.AttachedObject.owRigidbody;
public override void Start()
{
_instances.Add(this);
base.Start();
}
protected override void OnDestroy()
{
_instances.Remove(this);
base.OnDestroy();
}
public override float GetNetworkSendInterval()
=> 5f;
protected override void Init()
{
_qsbMeteor = QSBWorldSync.GetWorldFromId<QSBMeteor>(_instances.IndexOf(this));
_qsbMeteor.TransformSync = this;
base.Init();
SetReferenceTransform(Locator._brittleHollow.transform);
DebugLog.DebugWrite($"{LogName} - init");
}
protected override bool UpdateTransform()
{
// DebugLog.DebugWrite($"{LogName} - {Time.time - _lastClientSendTime}");
if (Time.time - _lastClientSendTime > GetNetworkSendInterval())
{
return base.UpdateTransform();
}
return false;
}
protected override void OnRenderObject()
{
if (!QSBCore.WorldObjectsReady
|| !QSBCore.DebugMode
|| !QSBCore.ShowLinesInDebug
|| !IsReady
|| ReferenceTransform == null
|| _intermediaryTransform.GetReferenceTransform() == null
|| _qsbMeteor.AttachedObject.isSuspended)
{
return;
}
base.OnRenderObject();
}
}
}

View File

@ -0,0 +1,13 @@
using QSB.WorldSync;
namespace QSB.MeteorSync.WorldObjects
{
public class QSBFragment : WorldObject<FragmentIntegrity>
{
public override void Init(FragmentIntegrity attachedObject, int id)
{
ObjectId = id;
AttachedObject = attachedObject;
}
}
}

View File

@ -1,17 +1,33 @@
using QSB.WorldSync;
using QSB.MeteorSync.TransformSync;
using QSB.Utility;
using QSB.WorldSync;
using QuantumUNET;
using UnityEngine;
namespace QSB.MeteorSync.WorldObjects
{
public class QSBMeteor : WorldObject<MeteorController>
{
public MeteorTransformSync TransformSync;
public override void Init(MeteorController attachedObject, int id)
{
ObjectId = id;
AttachedObject = attachedObject;
if (QSBCore.IsHost)
{
Object.Instantiate(QSBNetworkManager.Instance.MeteorPrefab).SpawnWithServerAuthority();
}
}
public override void OnRemoval()
{
if (QSBCore.IsHost)
{
QNetworkServer.Destroy(TransformSync.gameObject);
}
MeteorManager.MeteorsReady = false;
}

View File

@ -132,6 +132,8 @@
<Compile Include="MeteorSync\MeteorManager.cs" />
<Compile Include="MeteorSync\Patches\MeteorClientPatches.cs" />
<Compile Include="MeteorSync\Patches\MeteorServerPatches.cs" />
<Compile Include="MeteorSync\TransformSync\MeteorTransformSync.cs" />
<Compile Include="MeteorSync\WorldObjects\QSBFragment.cs" />
<Compile Include="MeteorSync\WorldObjects\QSBMeteor.cs" />
<Compile Include="MeteorSync\WorldObjects\QSBMeteorLauncher.cs" />
<Compile Include="OrbSync\TransformSync\NomaiOrbTransformSync.cs" />

View File

@ -13,6 +13,7 @@ using QSB.Player.TransformSync;
using QSB.PoolSync;
using QSB.ShipSync.TransformSync;
using QSB.Anglerfish.TransformSync;
using QSB.MeteorSync.TransformSync;
using QSB.TimeSync;
using QSB.Tools.ProbeTool.TransformSync;
using QSB.Utility;
@ -39,6 +40,7 @@ namespace QSB
public GameObject OrbPrefab { get; private set; }
public GameObject ShipPrefab { get; private set; }
public GameObject AnglerPrefab { get; private set; }
public GameObject MeteorPrefab { get; private set; }
public string PlayerName { get; private set; }
private const int MaxConnections = 128;
@ -90,6 +92,12 @@ namespace QSB
AnglerPrefab.AddComponent<AnglerTransformSync>();
spawnPrefabs.Add(AnglerPrefab);
MeteorPrefab = _assetBundle.LoadAsset<GameObject>("assets/networkmeteor.prefab");
SetupNetworkId(MeteorPrefab, 6);
SetupNetworkTransform(MeteorPrefab);
MeteorPrefab.AddComponent<MeteorTransformSync>();
spawnPrefabs.Add(MeteorPrefab);
ConfigureNetworkManager();
}

View File

@ -10,7 +10,7 @@ namespace QuantumUNET.Components
{
public float SendInterval { get; set; } = 0.05f;
private float _lastClientSendTime;
protected float _lastClientSendTime;
protected Vector3 _prevPosition;
protected Quaternion _prevRotation;
private QNetworkWriter _localTransformWriter;
@ -206,4 +206,4 @@ namespace QuantumUNET.Components
public override float GetNetworkSendInterval()
=> SendInterval;
}
}
}