90 lines
3.0 KiB
C#
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
|
|
}
|
|
}
|