2021-11-18 01:07:27 -08:00
|
|
|
|
using OWML.Common;
|
2021-11-14 03:29:58 -08:00
|
|
|
|
using QSB.Events;
|
2021-11-13 20:41:46 -08:00
|
|
|
|
using QSB.MeteorSync.WorldObjects;
|
2021-11-19 00:28:36 -08:00
|
|
|
|
using QSB.Syncs;
|
2021-11-14 03:29:58 -08:00
|
|
|
|
using QSB.Utility;
|
2021-11-13 20:41:46 -08:00
|
|
|
|
using QSB.WorldSync;
|
|
|
|
|
|
|
|
|
|
namespace QSB.MeteorSync.Events
|
|
|
|
|
{
|
|
|
|
|
/// called when we request a resync on client join
|
2021-11-14 03:29:58 -08:00
|
|
|
|
/// pain
|
2021-11-13 20:41:46 -08:00
|
|
|
|
public class FragmentResyncEvent : QSBEvent<FragmentResyncMessage>
|
|
|
|
|
{
|
|
|
|
|
public override void SetupListener()
|
|
|
|
|
=> GlobalMessenger<QSBFragment>.AddListener(EventNames.QSBFragmentResync, Handler);
|
|
|
|
|
|
|
|
|
|
public override void CloseListener()
|
|
|
|
|
=> GlobalMessenger<QSBFragment>.RemoveListener(EventNames.QSBFragmentResync, Handler);
|
|
|
|
|
|
|
|
|
|
private void Handler(QSBFragment qsbFragment) => SendEvent(CreateMessage(qsbFragment));
|
|
|
|
|
|
|
|
|
|
private FragmentResyncMessage CreateMessage(QSBFragment qsbFragment)
|
|
|
|
|
{
|
|
|
|
|
var msg = new FragmentResyncMessage
|
|
|
|
|
{
|
|
|
|
|
ObjectId = qsbFragment.ObjectId,
|
2021-11-13 21:15:01 -08:00
|
|
|
|
Integrity = qsbFragment.AttachedObject._integrity,
|
2021-11-15 18:05:34 -08:00
|
|
|
|
OrigIntegrity = qsbFragment.AttachedObject._origIntegrity,
|
2021-11-18 22:23:39 -08:00
|
|
|
|
LeashLength = qsbFragment.LeashLength,
|
|
|
|
|
IsDetached = qsbFragment.IsDetached
|
2021-11-13 20:41:46 -08:00
|
|
|
|
};
|
|
|
|
|
|
2021-11-18 22:23:39 -08:00
|
|
|
|
if (msg.IsDetached)
|
2021-11-14 03:29:58 -08:00
|
|
|
|
{
|
2021-11-15 00:29:36 -08:00
|
|
|
|
msg.IsThruWhiteHole = qsbFragment.IsThruWhiteHole;
|
2021-11-14 03:29:58 -08:00
|
|
|
|
|
2021-11-15 17:08:15 -08:00
|
|
|
|
var body = qsbFragment.Body;
|
2021-11-18 22:23:39 -08:00
|
|
|
|
var refBody = qsbFragment.RefBody;
|
|
|
|
|
var pos = body.GetPosition();
|
2021-11-19 00:28:36 -08:00
|
|
|
|
msg.Pos = refBody.transform.EncodePos(pos);
|
|
|
|
|
msg.Rot = refBody.transform.EncodeRot(body.GetRotation());
|
|
|
|
|
msg.Vel = refBody.EncodeVel(body.GetVelocity(), pos);
|
|
|
|
|
msg.AngVel = refBody.EncodeAngVel(body.GetAngularVelocity());
|
2021-11-14 03:29:58 -08:00
|
|
|
|
}
|
|
|
|
|
|
2021-11-13 20:41:46 -08:00
|
|
|
|
return msg;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override void OnReceiveRemote(bool isHost, FragmentResyncMessage msg)
|
|
|
|
|
{
|
2021-11-13 21:15:01 -08:00
|
|
|
|
if (!MeteorManager.Ready)
|
2021-11-13 20:41:46 -08:00
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var qsbFragment = QSBWorldSync.GetWorldFromId<QSBFragment>(msg.ObjectId);
|
|
|
|
|
qsbFragment.AttachedObject._integrity = msg.Integrity;
|
2021-11-13 21:15:01 -08:00
|
|
|
|
qsbFragment.AttachedObject._origIntegrity = msg.OrigIntegrity;
|
2021-11-15 18:05:34 -08:00
|
|
|
|
qsbFragment.LeashLength = msg.LeashLength;
|
2021-11-14 00:45:25 -08:00
|
|
|
|
qsbFragment.AttachedObject.CallOnTakeDamage();
|
2021-11-14 03:29:58 -08:00
|
|
|
|
|
2021-11-18 22:23:39 -08:00
|
|
|
|
if (msg.IsDetached)
|
2021-11-14 03:29:58 -08:00
|
|
|
|
{
|
2021-11-17 02:38:27 -08:00
|
|
|
|
// the detach is delayed, so wait until that happens
|
2021-11-18 22:23:39 -08:00
|
|
|
|
QSBCore.UnityEvents.RunWhen(() => qsbFragment.IsDetached, () =>
|
2021-11-14 03:29:58 -08:00
|
|
|
|
{
|
2021-11-18 22:23:39 -08:00
|
|
|
|
var body = qsbFragment.Body;
|
|
|
|
|
|
2021-11-15 00:29:36 -08:00
|
|
|
|
if (msg.IsThruWhiteHole && !qsbFragment.IsThruWhiteHole)
|
2021-11-14 03:29:58 -08:00
|
|
|
|
{
|
2021-11-18 22:23:39 -08:00
|
|
|
|
var whiteHoleVolume = MeteorManager.WhiteHoleVolume;
|
|
|
|
|
var attachedFluidDetector = body.GetAttachedFluidDetector();
|
|
|
|
|
var attachedForceDetector = body.GetAttachedForceDetector();
|
2021-11-20 19:49:50 +00:00
|
|
|
|
if (attachedFluidDetector is not null and ConstantFluidDetector constantFluidDetector)
|
2021-11-18 22:23:39 -08:00
|
|
|
|
{
|
|
|
|
|
constantFluidDetector.SetDetectableFluid(whiteHoleVolume._fluidVolume);
|
|
|
|
|
}
|
2021-11-25 15:38:05 +00:00
|
|
|
|
|
2021-11-20 19:49:50 +00:00
|
|
|
|
if (attachedForceDetector is not null and ConstantForceDetector constantForceDetector)
|
2021-11-18 22:23:39 -08:00
|
|
|
|
{
|
|
|
|
|
constantForceDetector.ClearAllFields();
|
|
|
|
|
}
|
2021-11-25 15:38:05 +00:00
|
|
|
|
|
2021-11-18 22:23:39 -08:00
|
|
|
|
qsbFragment.DetachableFragment.ChangeFragmentSector(whiteHoleVolume._whiteHoleSector,
|
|
|
|
|
whiteHoleVolume._whiteHoleProxyShadowSuperGroup);
|
|
|
|
|
|
2021-11-15 18:02:43 -08:00
|
|
|
|
qsbFragment.DetachableFragment.EndWarpScaling();
|
2021-11-18 22:23:39 -08:00
|
|
|
|
body.gameObject.AddComponent<DebrisLeash>().Init(whiteHoleVolume._whiteHoleBody, qsbFragment.LeashLength);
|
|
|
|
|
whiteHoleVolume._ejectedBodyList.Add(body);
|
2021-11-15 00:29:36 -08:00
|
|
|
|
}
|
|
|
|
|
else if (!msg.IsThruWhiteHole && qsbFragment.IsThruWhiteHole)
|
|
|
|
|
{
|
|
|
|
|
// should only happen if client is way too far ahead and they try to connect. we fail here.
|
2021-11-16 01:08:24 -08:00
|
|
|
|
DebugLog.ToConsole($"{qsbFragment.LogName} is thru white hole, but msg is not. fuck", MessageType.Error);
|
|
|
|
|
return;
|
2021-11-15 00:29:36 -08:00
|
|
|
|
}
|
2021-11-25 15:38:05 +00:00
|
|
|
|
|
2021-11-18 22:23:39 -08:00
|
|
|
|
if (qsbFragment.IsThruWhiteHole)
|
|
|
|
|
{
|
|
|
|
|
var debrisLeash = body.GetComponent<DebrisLeash>();
|
|
|
|
|
debrisLeash._deccelerating = false;
|
|
|
|
|
debrisLeash.enabled = true;
|
|
|
|
|
}
|
2021-11-14 03:29:58 -08:00
|
|
|
|
|
2021-11-15 17:08:15 -08:00
|
|
|
|
var refBody = qsbFragment.RefBody;
|
2021-11-19 00:28:36 -08:00
|
|
|
|
var pos = refBody.transform.DecodePos(msg.Pos);
|
2021-11-18 22:23:39 -08:00
|
|
|
|
body.SetPosition(pos);
|
2021-11-19 00:28:36 -08:00
|
|
|
|
body.SetRotation(refBody.transform.DecodeRot(msg.Rot));
|
|
|
|
|
body.SetVelocity(refBody.DecodeVel(msg.Vel, pos));
|
|
|
|
|
body.SetAngularVelocity(refBody.DecodeAngVel(msg.AngVel));
|
2021-11-17 02:38:27 -08:00
|
|
|
|
});
|
2021-11-14 03:29:58 -08:00
|
|
|
|
}
|
2021-11-18 22:23:39 -08:00
|
|
|
|
else if (!msg.IsDetached && qsbFragment.IsDetached)
|
2021-11-14 03:29:58 -08:00
|
|
|
|
{
|
2021-11-18 22:23:39 -08:00
|
|
|
|
// should only happen if client is way too far ahead and they try to connect. we fail here.
|
|
|
|
|
DebugLog.ToConsole($"{qsbFragment.LogName} is detached, but msg is not. fuck", MessageType.Error);
|
2021-11-14 03:29:58 -08:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-11-13 20:41:46 -08:00
|
|
|
|
}
|
|
|
|
|
}
|