123 lines
4.0 KiB
C#
123 lines
4.0 KiB
C#
using BoneSync.Networking.Messages;
|
|
using BoneSync.Patching;
|
|
using MelonLoader;
|
|
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using UnityEngine;
|
|
|
|
namespace BoneSync.Sync.Components
|
|
{
|
|
// SyncableNetworking.cs
|
|
public partial class Syncable : MonoBehaviour
|
|
{
|
|
private void SendObjectSync()
|
|
{
|
|
_lastSyncTime = Time.time;
|
|
ObjectSync.SendObjectSyncMessage(this);
|
|
}
|
|
public IEnumerator SyncCoroutineAsync()
|
|
{
|
|
MelonLogger.Msg("Running sync coroutine for: " + transform.GetPath());
|
|
if (_syncCoroutineRunning) yield break;
|
|
_syncCoroutineRunning = true;
|
|
while (isOwner)
|
|
{
|
|
if (ShouldSendSync()) SendObjectSync();
|
|
yield return new WaitForSeconds(!Registered ? 1 : 1 / SYNC_FPS);
|
|
}
|
|
_syncCoroutineRunning = false;
|
|
yield break;
|
|
}
|
|
public void SetOwner(ulong ownerId)
|
|
{
|
|
MelonLogger.Msg("Setting owner for " + _syncId + " to " + ownerId);
|
|
_ownerId = ownerId;
|
|
FindAndUpdateComponents();
|
|
MelonCoroutines.Start(SyncCoroutineAsync());
|
|
UpdateKinematic();
|
|
}
|
|
|
|
public bool ClientSpawningAllowed()
|
|
{
|
|
if (poolee && poolee.pool)
|
|
{
|
|
return PoolBlacklist.IsClientSpawnPool(poolee.pool);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void _SendRegisterSync()
|
|
{
|
|
MelonLogger.Msg("Registering syncable object: " + gameObject.name);
|
|
SetOwner(BoneSync.lobby.GetLocalId());
|
|
SetSyncId(ObjectSync.SendRegisterSyncableMessage(this));
|
|
}
|
|
|
|
private void _SendDiscard(bool despawn = false)
|
|
{
|
|
MelonLogger.Msg("Sending discard for " + _syncId + " despawn: " + despawn);
|
|
DiscardSyncableMessageData discardSyncableMessageData = new DiscardSyncableMessageData()
|
|
{
|
|
syncId = _syncId,
|
|
despawn = despawn
|
|
};
|
|
DiscardSyncableMessage discardSyncableMessage = new DiscardSyncableMessage(discardSyncableMessageData);
|
|
discardSyncableMessage.Broadcast();
|
|
}
|
|
public void OnOwnershipTransferRequest(ulong newOwnerId)
|
|
{
|
|
//MelonLogger.Msg("Ownership transfer request for " + _syncId + " to " + newOwnerId);
|
|
if (isOwner && !IsHolding())
|
|
{
|
|
MelonLogger.Msg("Sending ownership transfer for " + _syncId + " to " + newOwnerId);
|
|
OwnershipTransferMessageData data = new OwnershipTransferMessageData()
|
|
{
|
|
syncId = _syncId,
|
|
NewOwnerId = newOwnerId,
|
|
force = true
|
|
};
|
|
OwnershipTransferMessage message = new OwnershipTransferMessage(data);
|
|
message.Broadcast();
|
|
SetOwner(newOwnerId);
|
|
}
|
|
}
|
|
|
|
public void TryBecomeOwner()
|
|
{
|
|
if (Registered && !isOwner)
|
|
{
|
|
MelonLogger.Msg("Attempting to become owner of " + _syncId);
|
|
OwnershipTransferMessageData data = new OwnershipTransferMessageData()
|
|
{
|
|
syncId = _syncId,
|
|
NewOwnerId = BoneSync.lobby.GetLocalId(),
|
|
force = false
|
|
};
|
|
OwnershipTransferMessage message = new OwnershipTransferMessage(data);
|
|
message.Broadcast();
|
|
}
|
|
}
|
|
|
|
public bool ShouldSendSync()
|
|
{
|
|
if (!Registered) return false;
|
|
if (!isOwner) return false;
|
|
if (isStale) return true;
|
|
if (AllRigidbodiesSleeping()) return false;
|
|
return true;
|
|
}
|
|
|
|
public ushort GetSyncId() => _syncId;
|
|
public void SetSyncId(ushort id)
|
|
{
|
|
|
|
_syncId = id;
|
|
ObjectSyncCache.UpdateSyncId(this);
|
|
}
|
|
}
|
|
}
|