85 lines
2.2 KiB
C#
Raw Normal View History

2025-09-24 11:24:38 +05:00
namespace Fusion.Addons.KCC
{
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
public unsafe struct KCCNetworkID
{
// CONSTANTS
public const int WORD_COUNT = 2;
// PUBLIC MEMBERS
[FieldOffset(0)]
public uint Value0;
[FieldOffset(4)]
public uint Value1;
public bool IsValid => Value1 != default;
// PUBLIC METHODS
public bool Equals(KCCNetworkID other) => Value0 == other.Value0 && Value1 == other.Value1;
public static KCCNetworkID GetNetworkID(NetworkRunner runner, NetworkObject networkObject)
{
if (networkObject == null)
return default;
KCCNetworkID networkID = new KCCNetworkID();
if (networkObject.Id.IsValid == true)
{
networkID.Value0 = networkObject.Id.Raw;
networkID.Value1 = 1U;
}
else
{
NetworkObjectTypeId networkTypeId = networkObject.NetworkTypeId;
if (networkTypeId.IsValid == false)
{
if (networkObject.TryGetComponent(out NetworkObjectPrefabData bakeData) == true)
{
NetworkPrefabId networkPrefabId = runner.Prefabs.GetId(bakeData.Guid);
if (networkPrefabId.IsValid == true)
{
networkTypeId = networkPrefabId;
networkObject.NetworkTypeId = networkTypeId;
}
}
}
KCCNetworkID networkTypeIdAsKCCNetworkID = *((KCCNetworkID*)&networkTypeId);
networkID.Value0 = networkTypeIdAsKCCNetworkID.Value0;
networkID.Value1 = 2U | (networkTypeIdAsKCCNetworkID.Value1 << 2);
}
return networkID;
}
public static NetworkObject GetNetworkObject(NetworkRunner runner, KCCNetworkID networkID)
{
uint type = networkID.Value1 & 3U;
if (type == 1U)
{
NetworkId networkId = new NetworkId();
networkId.Raw = networkID.Value0;
return runner.FindObject(networkId);
}
else if (type == 2U)
{
KCCNetworkID networkIDAsNetworkTypeId = new KCCNetworkID();
networkIDAsNetworkTypeId.Value0 = networkID.Value0;
networkIDAsNetworkTypeId.Value1 = networkID.Value1 >> 2;
NetworkObjectTypeId networkObjectTypeId = *((NetworkObjectTypeId*)&networkIDAsNetworkTypeId);
if (networkObjectTypeId.IsPrefab == true)
return runner.Config.PrefabTable.Load(networkObjectTypeId.AsPrefabId, true);
}
return default;
}
}
}