Files
BoneSync/BoneSync/Sync/Components/SyncableNetworking.cs
2025-03-04 15:09:34 +02:00

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);
}
}
}