Skip to content

Commit fbc5090

Browse files
committed
feat(client): add debug infos
1 parent 9f02fd1 commit fbc5090

File tree

8 files changed

+167
-15
lines changed

8 files changed

+167
-15
lines changed

api/AltV.Net.CApi.Generator/TypeRegistry.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -112,19 +112,15 @@ public static class TypeRegistry
112112
{ "rgba_t", "Rgba" },
113113
{ "rgba_t&", "Rgba*" },
114114
{ "std::vector<uint32_t>", "UIntArray*" },
115-
116115
{ "alt::Quaternion", "Quaternion" },
117116
{ "alt::Quaternion&", "Quaternion*" },
118-
119117
{ "position_t&", "Vector3*" },
120118
{ "position_t", "Vector3" },
121119
{ "alt::Position", "Vector3" },
122120
{ "rotation_t&", "Rotation*" },
123121
{ "rotation_t", "Rotation" },
124122
{ "alt::Rotation", "Rotation" },
125-
126123
{ "vehicleBadgePosition_t[]", "VehicleBadgePosition[]" },
127-
128124
{ "cloth_t&", "Cloth*" },
129125
{ "cloth_t", "Cloth" },
130126
{ "dlccloth_t&", "DlcCloth*" },
@@ -170,9 +166,7 @@ public static class TypeRegistry
170166
{ "const alt::MValueList&", "MValue*" }, //no c# representation for MValue list memory layout yet
171167
{ "alt::MValueDict&", "MValue*" }, //no c# representation for MValue dictionary memory layout yet
172168
{ "alt::ICheckpoint*", "nint" },
173-
{
174-
"alt::MValueFunction&", "MValue*"
175-
}, //no c# representation for MValue function memory layout yet, this is only in commented code and not required
169+
{ "alt::MValueFunction&", "MValue*" }, //no c# representation for MValue function memory layout yet, this is only in commented code and not required
176170
{ "alt::CEvent::Type", "ushort" },
177171
{ "alt::CEvent*", "nint" },
178172
{ "alt::CCancellableEvent*", "nint" },

api/AltV.Net.CApi/Libraries/ClientLibrary.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ public unsafe interface IClientLibrary
273273
public delegate* unmanaged[Cdecl]<nint, nint> CustomTexture_GetBaseObject { get; }
274274
public delegate* unmanaged[Cdecl]<nint, uint> CustomTexture_GetID { get; }
275275
public delegate* unmanaged[Cdecl]<nint, uint> Entity_GetScriptID { get; }
276+
public delegate* unmanaged[Cdecl]<nint, nint*, void> Entity_GetSyncInfo { get; }
276277
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceErrorModuleDelegate, void> Event_SetAnyResourceErrorDelegate { get; }
277278
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStartModuleDelegate, void> Event_SetAnyResourceStartDelegate { get; }
278279
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStopModuleDelegate, void> Event_SetAnyResourceStopDelegate { get; }
@@ -900,7 +901,7 @@ public unsafe interface IClientLibrary
900901

901902
public unsafe class ClientLibrary : IClientLibrary
902903
{
903-
public readonly uint Methods = 1767;
904+
public readonly uint Methods = 1769;
904905
public delegate* unmanaged[Cdecl]<nint, nint, void> Audio_AddOutput { get; }
905906
public delegate* unmanaged[Cdecl]<nint, nint> Audio_GetBaseObject { get; }
906907
public delegate* unmanaged[Cdecl]<nint, double> Audio_GetCurrentTime { get; }
@@ -1163,6 +1164,7 @@ public unsafe class ClientLibrary : IClientLibrary
11631164
public delegate* unmanaged[Cdecl]<nint, nint> CustomTexture_GetBaseObject { get; }
11641165
public delegate* unmanaged[Cdecl]<nint, uint> CustomTexture_GetID { get; }
11651166
public delegate* unmanaged[Cdecl]<nint, uint> Entity_GetScriptID { get; }
1167+
public delegate* unmanaged[Cdecl]<nint, nint*, void> Entity_GetSyncInfo { get; }
11661168
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceErrorModuleDelegate, void> Event_SetAnyResourceErrorDelegate { get; }
11671169
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStartModuleDelegate, void> Event_SetAnyResourceStartDelegate { get; }
11681170
public delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStopModuleDelegate, void> Event_SetAnyResourceStopDelegate { get; }
@@ -2310,6 +2312,8 @@ public unsafe class ClientLibrary : IClientLibrary
23102312
private static uint CustomTexture_GetIDFallback(nint _costumTexture) => throw new Exceptions.OutdatedSdkException("CustomTexture_GetID", "CustomTexture_GetID SDK method is outdated. Please update your module nuget");
23112313
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate uint Entity_GetScriptIDDelegate(nint _entity);
23122314
private static uint Entity_GetScriptIDFallback(nint _entity) => throw new Exceptions.OutdatedSdkException("Entity_GetScriptID", "Entity_GetScriptID SDK method is outdated. Please update your module nuget");
2315+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Entity_GetSyncInfoDelegate(nint _entity, nint* _syncInfo);
2316+
private static void Entity_GetSyncInfoFallback(nint _entity, nint* _syncInfo) => throw new Exceptions.OutdatedSdkException("Entity_GetSyncInfo", "Entity_GetSyncInfo SDK method is outdated. Please update your module nuget");
23132317
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Event_SetAnyResourceErrorDelegateDelegate(nint _resource, ClientEvents.AnyResourceErrorModuleDelegate _delegate);
23142318
private static void Event_SetAnyResourceErrorDelegateFallback(nint _resource, ClientEvents.AnyResourceErrorModuleDelegate _delegate) => throw new Exceptions.OutdatedSdkException("Event_SetAnyResourceErrorDelegate", "Event_SetAnyResourceErrorDelegate SDK method is outdated. Please update your module nuget");
23152319
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void Event_SetAnyResourceStartDelegateDelegate(nint _resource, ClientEvents.AnyResourceStartModuleDelegate _delegate);
@@ -3565,7 +3569,7 @@ private IntPtr GetUnmanagedPtr<T>(IDictionary<ulong, IntPtr> funcTable, ulong ha
35653569
public ClientLibrary(Dictionary<ulong, IntPtr> funcTable)
35663570
{
35673571
if (!funcTable.TryGetValue(0, out var capiHash)) Outdated = true;
3568-
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 16106728582837015091UL) Outdated = true;
3572+
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 12612033657027659340UL) Outdated = true;
35693573
Audio_AddOutput = (delegate* unmanaged[Cdecl]<nint, nint, void>) GetUnmanagedPtr<Audio_AddOutputDelegate>(funcTable, 9914412815391408844UL, Audio_AddOutputFallback);
35703574
Audio_GetBaseObject = (delegate* unmanaged[Cdecl]<nint, nint>) GetUnmanagedPtr<Audio_GetBaseObjectDelegate>(funcTable, 6330360502401226894UL, Audio_GetBaseObjectFallback);
35713575
Audio_GetCurrentTime = (delegate* unmanaged[Cdecl]<nint, double>) GetUnmanagedPtr<Audio_GetCurrentTimeDelegate>(funcTable, 2944324482134975819UL, Audio_GetCurrentTimeFallback);
@@ -3828,6 +3832,7 @@ public ClientLibrary(Dictionary<ulong, IntPtr> funcTable)
38283832
CustomTexture_GetBaseObject = (delegate* unmanaged[Cdecl]<nint, nint>) GetUnmanagedPtr<CustomTexture_GetBaseObjectDelegate>(funcTable, 4168880360490742954UL, CustomTexture_GetBaseObjectFallback);
38293833
CustomTexture_GetID = (delegate* unmanaged[Cdecl]<nint, uint>) GetUnmanagedPtr<CustomTexture_GetIDDelegate>(funcTable, 12755828446518747613UL, CustomTexture_GetIDFallback);
38303834
Entity_GetScriptID = (delegate* unmanaged[Cdecl]<nint, uint>) GetUnmanagedPtr<Entity_GetScriptIDDelegate>(funcTable, 11915813456855488252UL, Entity_GetScriptIDFallback);
3835+
Entity_GetSyncInfo = (delegate* unmanaged[Cdecl]<nint, nint*, void>) GetUnmanagedPtr<Entity_GetSyncInfoDelegate>(funcTable, 18237250479106097113UL, Entity_GetSyncInfoFallback);
38313836
Event_SetAnyResourceErrorDelegate = (delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceErrorModuleDelegate, void>) GetUnmanagedPtr<Event_SetAnyResourceErrorDelegateDelegate>(funcTable, 14079997901958077241UL, Event_SetAnyResourceErrorDelegateFallback);
38323837
Event_SetAnyResourceStartDelegate = (delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStartModuleDelegate, void>) GetUnmanagedPtr<Event_SetAnyResourceStartDelegateDelegate>(funcTable, 18259284189737259993UL, Event_SetAnyResourceStartDelegateFallback);
38333838
Event_SetAnyResourceStopDelegate = (delegate* unmanaged[Cdecl]<nint, ClientEvents.AnyResourceStopModuleDelegate, void>) GetUnmanagedPtr<Event_SetAnyResourceStopDelegateDelegate>(funcTable, 13707820718504089625UL, Event_SetAnyResourceStopDelegateFallback);

api/AltV.Net.CApi/Libraries/ServerLibrary.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ public unsafe interface IServerLibrary
485485

486486
public unsafe class ServerLibrary : IServerLibrary
487487
{
488-
public readonly uint Methods = 1767;
488+
public readonly uint Methods = 1769;
489489
public delegate* unmanaged[Cdecl]<nint, nint, void> BaseObject_DeleteSyncedMetaData { get; }
490490
public delegate* unmanaged[Cdecl]<nint, nint[], nint[], ulong, void> BaseObject_SetMultipleSyncedMetaData { get; }
491491
public delegate* unmanaged[Cdecl]<nint, nint, nint, void> BaseObject_SetSyncedMetaData { get; }
@@ -1905,7 +1905,7 @@ private IntPtr GetUnmanagedPtr<T>(IDictionary<ulong, IntPtr> funcTable, ulong ha
19051905
public ServerLibrary(Dictionary<ulong, IntPtr> funcTable)
19061906
{
19071907
if (!funcTable.TryGetValue(0, out var capiHash)) Outdated = true;
1908-
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 16106728582837015091UL) Outdated = true;
1908+
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 12612033657027659340UL) Outdated = true;
19091909
BaseObject_DeleteSyncedMetaData = (delegate* unmanaged[Cdecl]<nint, nint, void>) GetUnmanagedPtr<BaseObject_DeleteSyncedMetaDataDelegate>(funcTable, 8228424877092269355UL, BaseObject_DeleteSyncedMetaDataFallback);
19101910
BaseObject_SetMultipleSyncedMetaData = (delegate* unmanaged[Cdecl]<nint, nint[], nint[], ulong, void>) GetUnmanagedPtr<BaseObject_SetMultipleSyncedMetaDataDelegate>(funcTable, 1390762125822890831UL, BaseObject_SetMultipleSyncedMetaDataFallback);
19111911
BaseObject_SetSyncedMetaData = (delegate* unmanaged[Cdecl]<nint, nint, nint, void>) GetUnmanagedPtr<BaseObject_SetSyncedMetaDataDelegate>(funcTable, 8002999088966424231UL, BaseObject_SetSyncedMetaDataFallback);

api/AltV.Net.CApi/Libraries/SharedLibrary.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ public unsafe interface ISharedLibrary
247247
public delegate* unmanaged[Cdecl]<nint, void> FreeResourceArray { get; }
248248
public delegate* unmanaged[Cdecl]<nint, void> FreeString { get; }
249249
public delegate* unmanaged[Cdecl]<nint, uint, void> FreeStringArray { get; }
250+
public delegate* unmanaged[Cdecl]<nint, void> FreeSyncInfo { get; }
250251
public delegate* unmanaged[Cdecl]<nint, void> FreeTextLabelArray { get; }
251252
public delegate* unmanaged[Cdecl]<nint, void> FreeUInt32Array { get; }
252253
public delegate* unmanaged[Cdecl]<nint, void> FreeUInt8Array { get; }
@@ -425,7 +426,7 @@ public unsafe interface ISharedLibrary
425426

426427
public unsafe class SharedLibrary : ISharedLibrary
427428
{
428-
public readonly uint Methods = 1767;
429+
public readonly uint Methods = 1769;
429430
public delegate* unmanaged[Cdecl]<nint, uint> Audio_GetID { get; }
430431
public delegate* unmanaged[Cdecl]<nint, uint> AudioAttachedOutput_GetID { get; }
431432
public delegate* unmanaged[Cdecl]<nint, uint> AudioFilter_GetID { get; }
@@ -662,6 +663,7 @@ public unsafe class SharedLibrary : ISharedLibrary
662663
public delegate* unmanaged[Cdecl]<nint, void> FreeResourceArray { get; }
663664
public delegate* unmanaged[Cdecl]<nint, void> FreeString { get; }
664665
public delegate* unmanaged[Cdecl]<nint, uint, void> FreeStringArray { get; }
666+
public delegate* unmanaged[Cdecl]<nint, void> FreeSyncInfo { get; }
665667
public delegate* unmanaged[Cdecl]<nint, void> FreeTextLabelArray { get; }
666668
public delegate* unmanaged[Cdecl]<nint, void> FreeUInt32Array { get; }
667669
public delegate* unmanaged[Cdecl]<nint, void> FreeUInt8Array { get; }
@@ -1308,6 +1310,8 @@ public unsafe class SharedLibrary : ISharedLibrary
13081310
private static void FreeStringFallback(nint _string) => throw new Exceptions.OutdatedSdkException("FreeString", "FreeString SDK method is outdated. Please update your module nuget");
13091311
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void FreeStringArrayDelegate(nint _stringArray, uint _size);
13101312
private static void FreeStringArrayFallback(nint _stringArray, uint _size) => throw new Exceptions.OutdatedSdkException("FreeStringArray", "FreeStringArray SDK method is outdated. Please update your module nuget");
1313+
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void FreeSyncInfoDelegate(nint _syncInfo);
1314+
private static void FreeSyncInfoFallback(nint _syncInfo) => throw new Exceptions.OutdatedSdkException("FreeSyncInfo", "FreeSyncInfo SDK method is outdated. Please update your module nuget");
13111315
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void FreeTextLabelArrayDelegate(nint _textLabelArray);
13121316
private static void FreeTextLabelArrayFallback(nint _textLabelArray) => throw new Exceptions.OutdatedSdkException("FreeTextLabelArray", "FreeTextLabelArray SDK method is outdated. Please update your module nuget");
13131317
[UnmanagedFunctionPointer(CallingConvention.Cdecl)] private delegate void FreeUInt32ArrayDelegate(nint _uInt32Array);
@@ -1665,7 +1669,7 @@ private IntPtr GetUnmanagedPtr<T>(IDictionary<ulong, IntPtr> funcTable, ulong ha
16651669
public SharedLibrary(Dictionary<ulong, IntPtr> funcTable)
16661670
{
16671671
if (!funcTable.TryGetValue(0, out var capiHash)) Outdated = true;
1668-
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 16106728582837015091UL) Outdated = true;
1672+
else if (capiHash == IntPtr.Zero || *(ulong*)capiHash != 12612033657027659340UL) Outdated = true;
16691673
Audio_GetID = (delegate* unmanaged[Cdecl]<nint, uint>) GetUnmanagedPtr<Audio_GetIDDelegate>(funcTable, 4464042055475980737UL, Audio_GetIDFallback);
16701674
AudioAttachedOutput_GetID = (delegate* unmanaged[Cdecl]<nint, uint>) GetUnmanagedPtr<AudioAttachedOutput_GetIDDelegate>(funcTable, 17725794901805112189UL, AudioAttachedOutput_GetIDFallback);
16711675
AudioFilter_GetID = (delegate* unmanaged[Cdecl]<nint, uint>) GetUnmanagedPtr<AudioFilter_GetIDDelegate>(funcTable, 8824535635529306325UL, AudioFilter_GetIDFallback);
@@ -1902,6 +1906,7 @@ public SharedLibrary(Dictionary<ulong, IntPtr> funcTable)
19021906
FreeResourceArray = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeResourceArrayDelegate>(funcTable, 7782187912558785270UL, FreeResourceArrayFallback);
19031907
FreeString = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeStringDelegate>(funcTable, 10646355260907021718UL, FreeStringFallback);
19041908
FreeStringArray = (delegate* unmanaged[Cdecl]<nint, uint, void>) GetUnmanagedPtr<FreeStringArrayDelegate>(funcTable, 9817201133426969670UL, FreeStringArrayFallback);
1909+
FreeSyncInfo = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeSyncInfoDelegate>(funcTable, 756563802353195975UL, FreeSyncInfoFallback);
19051910
FreeTextLabelArray = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeTextLabelArrayDelegate>(funcTable, 247876811202044668UL, FreeTextLabelArrayFallback);
19061911
FreeUInt32Array = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeUInt32ArrayDelegate>(funcTable, 2025110884526748511UL, FreeUInt32ArrayFallback);
19071912
FreeUInt8Array = (delegate* unmanaged[Cdecl]<nint, void>) GetUnmanagedPtr<FreeUInt8ArrayDelegate>(funcTable, 15676846424137302955UL, FreeUInt8ArrayFallback);
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
using System.Runtime.InteropServices;
2+
using AltV.Net.Data;
3+
4+
namespace AltV.Net.Client.Elements.Data;
5+
6+
7+
[StructLayout(LayoutKind.Sequential)]
8+
internal struct SyncInfoInternal
9+
{
10+
public byte Active;
11+
public uint ReceivedTick;
12+
public uint FullyReceivedTick;
13+
public uint SendTick;
14+
public uint AckedSendTick;
15+
public ushort PropertyCount;
16+
public byte ComponentCount;
17+
public IntPtr PropertiesUpdateTick;
18+
public IntPtr ComponentPropertyIndex;
19+
20+
public uint[] GetPropertiesUpdateTick()
21+
{
22+
if (PropertyCount == 0)
23+
{
24+
return Array.Empty<uint>();
25+
}
26+
27+
var value = ComponentPropertyIndex;
28+
var values = new uint[PropertyCount];
29+
var buffer = new byte[4];
30+
31+
for (var i = 0; i < values.Length; i++)
32+
{
33+
values[i] = UIntArray.ReadUInt32(buffer, value);
34+
value += UIntArray.UInt32Size;
35+
}
36+
37+
return values;
38+
}
39+
40+
public uint[] GetComponentPropertyIndex()
41+
{
42+
if (ComponentCount == 0)
43+
{
44+
return Array.Empty<uint>();
45+
}
46+
47+
var value = ComponentPropertyIndex;
48+
var values = new uint[ComponentCount];
49+
var buffer = new byte[4];
50+
51+
for (var i = 0; i < values.Length; i++)
52+
{
53+
values[i] = UIntArray.ReadUInt32(buffer, value);
54+
value += UIntArray.UInt32Size;
55+
}
56+
57+
return values;
58+
}
59+
60+
public SyncInfo ToPublic()
61+
{
62+
return new SyncInfo(
63+
Active,
64+
ReceivedTick,
65+
FullyReceivedTick,
66+
SendTick,
67+
AckedSendTick,
68+
PropertyCount,
69+
ComponentCount,
70+
GetPropertiesUpdateTick(),
71+
GetComponentPropertyIndex());
72+
}
73+
}
74+
75+
[StructLayout(LayoutKind.Sequential)]
76+
public struct SyncInfo : IEquatable<SyncInfo>
77+
{
78+
public byte Active;
79+
public uint ReceivedTick;
80+
public uint FullyReceivedTick;
81+
public uint SendTick;
82+
public uint AckedSendTick;
83+
public ushort PropertyCount;
84+
public byte ComponentCount;
85+
public uint[] PropertiesUpdateTick;
86+
public uint[] ComponentPropertyIndex;
87+
88+
public SyncInfo(byte active, uint receivedTick, uint fullyReceivedTick, uint sendTick, uint ackedSendTick, ushort propertyCount, byte componentCount, uint[] propertiesUpdateTick, uint[] componentPropertyIndex)
89+
{
90+
Active = active;
91+
ReceivedTick = receivedTick;
92+
FullyReceivedTick = fullyReceivedTick;
93+
SendTick = sendTick;
94+
AckedSendTick = ackedSendTick;
95+
PropertyCount = propertyCount;
96+
ComponentCount = componentCount;
97+
PropertiesUpdateTick = propertiesUpdateTick;
98+
ComponentPropertyIndex = componentPropertyIndex;
99+
}
100+
101+
public bool Equals(SyncInfo other)
102+
{
103+
return Active == other.Active && ReceivedTick == other.ReceivedTick && FullyReceivedTick == other.FullyReceivedTick && SendTick == other.SendTick && AckedSendTick == other.AckedSendTick && PropertyCount == other.PropertyCount && ComponentCount == other.ComponentCount && PropertiesUpdateTick.Equals(other.PropertiesUpdateTick) && ComponentPropertyIndex.Equals(other.ComponentPropertyIndex);
104+
}
105+
106+
public override bool Equals(object obj)
107+
{
108+
return obj is SyncInfo other && Equals(other);
109+
}
110+
111+
public override int GetHashCode()
112+
{
113+
var hashCode = new HashCode();
114+
hashCode.Add(Active);
115+
hashCode.Add(ReceivedTick);
116+
hashCode.Add(FullyReceivedTick);
117+
hashCode.Add(SendTick);
118+
hashCode.Add(AckedSendTick);
119+
hashCode.Add(PropertyCount);
120+
hashCode.Add(ComponentCount);
121+
hashCode.Add(PropertiesUpdateTick);
122+
hashCode.Add(ComponentPropertyIndex);
123+
return hashCode.ToHashCode();
124+
}
125+
}

api/AltV.Net.Client/Elements/Entities/Entity.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Runtime.CompilerServices;
22
using System.Runtime.InteropServices;
3+
using AltV.Net.Client.Elements.Data;
34
using AltV.Net.Client.Elements.Interfaces;
45
using AltV.Net.Data;
56
using AltV.Net.Elements.Args;
@@ -67,6 +68,26 @@ public uint ScriptId
6768
}
6869
}
6970

71+
public SyncInfo SyncInfo
72+
{
73+
get
74+
{
75+
unsafe
76+
{
77+
CheckIfEntityExistsOrCached();
78+
79+
var syncInfoPtr = IntPtr.Zero;
80+
Core.Library.Client.Entity_GetSyncInfo(EntityNativePointer, &syncInfoPtr);
81+
82+
var syncInfo = Marshal.PtrToStructure<SyncInfoInternal>(syncInfoPtr).ToPublic();
83+
84+
Core.Library.Shared.FreeSyncInfo(syncInfoPtr);
85+
86+
return syncInfo;
87+
}
88+
}
89+
}
90+
7091
public bool Spawned => ScriptId != 0;
7192

7293
public Position Position

0 commit comments

Comments
 (0)