85 lines
2.2 KiB
C#
85 lines
2.2 KiB
C#
|
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;
|
||
|
}
|
||
|
}
|
||
|
}
|