mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-03-11 19:13:32 +00:00
wip
This commit is contained in:
parent
8e7ff076bf
commit
082996cb61
@ -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");
|
||||
}
|
||||
|
@ -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);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
|
@ -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(() =>
|
||||
{
|
||||
|
74
QSB/MeteorSync/TransformSync/MeteorTransformSync.cs
Normal file
74
QSB/MeteorSync/TransformSync/MeteorTransformSync.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
13
QSB/MeteorSync/WorldObjects/QSBFragment.cs
Normal file
13
QSB/MeteorSync/WorldObjects/QSBFragment.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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" />
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user