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