quantum-space-buddies/QSB/MeteorSync/Messages/FragmentResyncMessage.cs

147 lines
4.5 KiB
C#
Raw Normal View History

using Mirror;
using OWML.Common;
2021-12-22 22:59:08 -08:00
using QSB.Messaging;
using QSB.MeteorSync.WorldObjects;
using QSB.Utility;
using QSB.WorldSync;
2021-11-14 03:29:58 -08:00
using UnityEngine;
2021-11-13 20:41:46 -08:00
2021-12-23 02:17:56 -08:00
namespace QSB.MeteorSync.Messages
2021-11-13 20:41:46 -08:00
{
2021-12-22 22:59:08 -08:00
/// called when we request a resync on client join
/// pain
public class FragmentResyncMessage : QSBWorldObjectMessage<QSBFragment>
2021-11-13 20:41:46 -08:00
{
2021-12-22 22:59:08 -08:00
private float Integrity;
private float OrigIntegrity;
private float LeashLength;
private bool IsDetached;
2021-11-13 20:41:46 -08:00
2021-12-22 22:59:08 -08:00
private bool IsThruWhiteHole;
2021-12-29 01:08:14 -08:00
private Vector3 RelPos;
private Quaternion RelRot;
private Vector3 RelVel;
private Vector3 RelAngVel;
2021-11-14 03:29:58 -08:00
2021-12-23 01:24:57 -08:00
public FragmentResyncMessage(QSBFragment qsbFragment)
2021-11-13 20:41:46 -08:00
{
2021-12-23 01:24:57 -08:00
Integrity = qsbFragment.AttachedObject._integrity;
OrigIntegrity = qsbFragment.AttachedObject._origIntegrity;
LeashLength = qsbFragment.LeashLength;
IsDetached = qsbFragment.IsDetached;
2021-12-22 22:59:08 -08:00
2021-11-18 22:23:39 -08:00
if (IsDetached)
2021-11-14 03:29:58 -08:00
{
2021-12-23 01:24:57 -08:00
IsThruWhiteHole = qsbFragment.IsThruWhiteHole;
2021-12-22 22:59:08 -08:00
2021-12-23 01:24:57 -08:00
var body = qsbFragment.Body;
var refBody = qsbFragment.RefBody;
2021-12-22 22:59:08 -08:00
var pos = body.GetPosition();
2021-12-29 01:08:14 -08:00
RelPos = refBody.transform.ToRelPos(pos);
RelRot = refBody.transform.ToRelRot(body.GetRotation());
RelVel = refBody.ToRelVel(body.GetVelocity(), pos);
RelAngVel = refBody.ToRelAngVel(body.GetAngularVelocity());
2021-11-14 03:29:58 -08:00
}
2021-11-13 20:41:46 -08:00
}
public override void Serialize(NetworkWriter writer)
2021-11-13 20:41:46 -08:00
{
base.Serialize(writer);
writer.Write(Integrity);
writer.Write(OrigIntegrity);
2021-11-15 02:39:06 -08:00
writer.Write(LeashLength);
2021-11-18 22:23:39 -08:00
writer.Write(IsDetached);
if (IsDetached)
2021-11-14 03:29:58 -08:00
{
2021-11-15 00:29:36 -08:00
writer.Write(IsThruWhiteHole);
2021-12-29 01:08:14 -08:00
writer.Write(RelPos);
writer.Write(RelRot);
writer.Write(RelVel);
writer.Write(RelAngVel);
2021-11-14 03:29:58 -08:00
}
2021-11-13 20:41:46 -08:00
}
2021-12-22 22:59:08 -08:00
public override void Deserialize(NetworkReader reader)
2021-12-22 22:59:08 -08:00
{
base.Deserialize(reader);
Integrity = reader.Read<float>();
OrigIntegrity = reader.Read<float>();
LeashLength = reader.Read<float>();
IsDetached = reader.Read<bool>();
2021-12-22 22:59:08 -08:00
if (IsDetached)
{
IsThruWhiteHole = reader.Read<bool>();
2021-12-29 01:08:14 -08:00
RelPos = reader.ReadVector3();
RelRot = reader.ReadQuaternion();
RelVel = reader.ReadVector3();
RelAngVel = reader.ReadVector3();
2021-12-22 22:59:08 -08:00
}
}
public override void OnReceiveRemote()
{
var qsbFragment = ObjectId.GetWorldObject<QSBFragment>();
2021-12-22 22:59:08 -08:00
qsbFragment.AttachedObject._integrity = Integrity;
qsbFragment.AttachedObject._origIntegrity = OrigIntegrity;
qsbFragment.LeashLength = LeashLength;
qsbFragment.AttachedObject.CallOnTakeDamage();
if (IsDetached)
{
// the detach is delayed, so wait until that happens
QSBCore.UnityEvents.RunWhen(() => qsbFragment.IsDetached, () =>
{
var body = qsbFragment.Body;
if (IsThruWhiteHole && !qsbFragment.IsThruWhiteHole)
{
var whiteHoleVolume = MeteorManager.WhiteHoleVolume;
var attachedFluidDetector = body.GetAttachedFluidDetector();
var attachedForceDetector = body.GetAttachedForceDetector();
if (attachedFluidDetector is ConstantFluidDetector constantFluidDetector)
{
constantFluidDetector.SetDetectableFluid(whiteHoleVolume._fluidVolume);
}
if (attachedForceDetector is ConstantForceDetector constantForceDetector)
{
constantForceDetector.ClearAllFields();
}
qsbFragment.DetachableFragment.ChangeFragmentSector(whiteHoleVolume._whiteHoleSector,
whiteHoleVolume._whiteHoleProxyShadowSuperGroup);
qsbFragment.DetachableFragment.EndWarpScaling();
body.gameObject.AddComponent<DebrisLeash>().Init(whiteHoleVolume._whiteHoleBody, qsbFragment.LeashLength);
whiteHoleVolume._ejectedBodyList.Add(body);
}
else if (!IsThruWhiteHole && qsbFragment.IsThruWhiteHole)
{
// should only happen if client is way too far ahead and they try to connect. we fail here.
2022-01-23 00:29:59 -08:00
DebugLog.ToConsole($"{qsbFragment.ToString()} is thru white hole, but msg is not. fuck", MessageType.Error);
2021-12-22 22:59:08 -08:00
return;
}
if (qsbFragment.IsThruWhiteHole)
{
var debrisLeash = body.GetComponent<DebrisLeash>();
debrisLeash._deccelerating = false;
debrisLeash.enabled = true;
}
var refBody = qsbFragment.RefBody;
2021-12-29 01:08:14 -08:00
var pos = refBody.transform.FromRelPos(RelPos);
2021-12-22 22:59:08 -08:00
body.SetPosition(pos);
2021-12-29 01:08:14 -08:00
body.SetRotation(refBody.transform.FromRelRot(RelRot));
body.SetVelocity(refBody.FromRelVel(RelVel, pos));
body.SetAngularVelocity(refBody.FromRelAngVel(RelAngVel));
2021-12-22 22:59:08 -08:00
});
}
else if (!IsDetached && qsbFragment.IsDetached)
{
// should only happen if client is way too far ahead and they try to connect. we fail here.
2022-01-23 00:29:59 -08:00
DebugLog.ToConsole($"{qsbFragment.ToString()} is detached, but msg is not. fuck", MessageType.Error);
2021-12-22 22:59:08 -08:00
}
}
2021-11-13 20:41:46 -08:00
}
2021-12-22 22:59:08 -08:00
}