Files
BoneSync/BoneSync/Sync/Components/SyncablePhysics.cs
2025-02-28 12:20:55 +02:00

90 lines
3.0 KiB
C#

using BoneSync.Networking;
using BoneSync.Networking.Messages;
using BoneSync.Patching;
using MelonLoader;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
namespace BoneSync.Sync.Components
{
public partial class Syncable : MonoBehaviour
{
private void SetKinematic(bool kinematic)
{
foreach (Rigidbody rb in rigidbodies)
{
rb.isKinematic = kinematic;
}
}
public ObjectSyncTransform[] GetObjectSyncTransforms()
{
ObjectSyncTransform[] objectSyncTransforms = new ObjectSyncTransform[rigidbodies.Length];
for (int i = 0; i < _transforms.Length; i++)
{
objectSyncTransforms[i] = new ObjectSyncTransform()
{
transform = new SimpleTransform(_transforms[i]),
velocity = Vector3.zero
};
}
return objectSyncTransforms;
}
public void ApplyObjectSyncTransforms(ObjectSyncTransform[] objectSyncTransforms)
{
if (objectSyncTransforms.Length != rigidbodies.Length)
{
MelonLogger.Warning("ObjectSyncTransforms length mismatch: " + objectSyncTransforms.Length + " != " + _transforms.Length);
return;
}
for (int i = 0; i < objectSyncTransforms.Length; i++)
{
ObjectSyncTransform objectSyncTransform = objectSyncTransforms[i];
rigidbodies[i].angularVelocity = objectSyncTransform.angularVelocity;
rigidbodies[i].velocity = objectSyncTransform.velocity;
rigidbodies[i].position = objectSyncTransform.transform.position;
rigidbodies[i].rotation = objectSyncTransform.transform.rotation;
_transforms[i].localScale = objectSyncTransform.transform.scale;
//_transforms[i].ApplySimpleTransform(objectSyncTransform.transform);
}
}
private Rigidbody[] UpdateRigidbodyList()
{
if (interactableManager)
{
return interactableManager.hosts.Select(host => host.rb).ToArray();
}
if (interactableHost)
{
return new Rigidbody[] { interactableHost.rb };
}
if (poolee)
{
return new Rigidbody[] { poolee.GetComponentInChildren<Rigidbody>() };
}
return new Rigidbody[0];
}
private void UpdateTransformList()
{
// get non-null rigidbodies
Rigidbody[] rbs = UpdateRigidbodyList().Where(rb => rb != null).ToArray();
rigidbodies = rbs;
_transforms = rbs.Select(rb => rb.transform).ToArray();
}
private void UpdateKinematic()
{
SetKinematic(_ownerId != BoneSync.lobby.GetLocalId() && Registered);
}
// on collision
}
}