diff --git a/api/Omp.Net.CApi/Events/NativeClassEvent.cs b/api/Omp.Net.CApi/Events/NativeClassEvent.cs index 96dfc4a..c2f7741 100644 --- a/api/Omp.Net.CApi/Events/NativeClassEvent.cs +++ b/api/Omp.Net.CApi/Events/NativeClassEvent.cs @@ -17,6 +17,7 @@ private static int OnPlayerRequestClass(EntityId player, uint classId) { return 1; } - return NativeOnPlayerRequestClass(player, classId) ? 1 : 0; + var ret = NativeOnPlayerRequestClass(player, classId); + return Unsafe.As(ref ret); } } diff --git a/api/Omp.Net.CApi/Events/NativeConsoleEvent.cs b/api/Omp.Net.CApi/Events/NativeConsoleEvent.cs index cd2a161..0ce3f4e 100644 --- a/api/Omp.Net.CApi/Events/NativeConsoleEvent.cs +++ b/api/Omp.Net.CApi/Events/NativeConsoleEvent.cs @@ -25,7 +25,8 @@ private static unsafe int OnConsoleText(IntPtr command, IntPtr parameters, void* unsafe { var senderType = *((int*)senderDataPtr + 0); - return NativeOnConsoleText(Marshal.PtrToStringAnsi(command) ?? string.Empty, Marshal.PtrToStringAnsi(parameters) ?? string.Empty, senderType) ? 1 : 0; + var ret = NativeOnConsoleText(Marshal.PtrToStringAnsi(command) ?? string.Empty, Marshal.PtrToStringAnsi(parameters) ?? string.Empty, senderType); + return *(int*)&ret; } } diff --git a/api/Omp.Net.CApi/Events/NativeCustomModelEvent.cs b/api/Omp.Net.CApi/Events/NativeCustomModelEvent.cs index 41d0a0e..929dd22 100644 --- a/api/Omp.Net.CApi/Events/NativeCustomModelEvent.cs +++ b/api/Omp.Net.CApi/Events/NativeCustomModelEvent.cs @@ -26,6 +26,7 @@ private static int OnPlayerRequestDownload(EntityId player, ModelDownloadType ty { return 1; } - return NativeOnPlayerRequestDownload(player, type, checksum) ? 1 : 0; + var ret = NativeOnPlayerRequestDownload(player, type, checksum); + return Unsafe.As(ref ret); } } diff --git a/api/Omp.Net.CApi/Events/NativePlayerEvent.cs b/api/Omp.Net.CApi/Events/NativePlayerEvent.cs index 2289ffb..5f94910 100644 --- a/api/Omp.Net.CApi/Events/NativePlayerEvent.cs +++ b/api/Omp.Net.CApi/Events/NativePlayerEvent.cs @@ -124,7 +124,8 @@ private static int OnPlayerText(EntityId player, IntPtr message) { return 1; } - return NativeOnPlayerText(player, Marshal.PtrToStringAnsi(message) ?? string.Empty) ? 1 : 0; + var ret = NativeOnPlayerText(player, Marshal.PtrToStringAnsi(message) ?? string.Empty); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -134,7 +135,8 @@ private static int OnPlayerCommandText(EntityId player, IntPtr message) { return 1; } - return NativeOnPlayerCommandText(player, Marshal.PtrToStringAnsi(message) ?? string.Empty) ? 1 : 0; + var ret = NativeOnPlayerCommandText(player, Marshal.PtrToStringAnsi(message) ?? string.Empty); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -144,7 +146,8 @@ private static int OnPlayerShotMissed(EntityId player, PlayerBulletData bulletDa { return 1; } - return NativeOnPlayerShotMissed(player, bulletData) ? 1 : 0; + var ret = NativeOnPlayerShotMissed(player, bulletData); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] private static int OnPlayerShotPlayer(EntityId player, EntityId target, PlayerBulletData bulletData) @@ -153,7 +156,8 @@ private static int OnPlayerShotPlayer(EntityId player, EntityId target, PlayerBu { return 1; } - return NativeOnPlayerShotPlayer(player, target, bulletData) ? 1 : 0; + var ret = NativeOnPlayerShotPlayer(player, target, bulletData); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -163,7 +167,8 @@ private static int OnPlayerShotVehicle(EntityId player, EntityId target, PlayerB { return 1; } - return NativeOnPlayerShotVehicle(player, target, bulletData) ? 1 : 0; + var ret = NativeOnPlayerShotVehicle(player, target, bulletData); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -173,7 +178,8 @@ private static int OnPlayerShotObject(EntityId player, EntityId target, PlayerBu { return 1; } - return NativeOnPlayerShotObject(player, target, bulletData) ? 1 : 0; + var ret = NativeOnPlayerShotObject(player, target, bulletData); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -183,7 +189,8 @@ private static int OnPlayerShotPlayerObject(EntityId player, EntityId target, Pl { return 1; } - return NativeOnPlayerShotPlayerObject(player, target, bulletData) ? 1 : 0; + var ret = NativeOnPlayerShotPlayerObject(player, target, bulletData); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -259,6 +266,7 @@ private static int OnPlayerUpdate(EntityId player, long now) { return 1; } - return NativeOnPlayerUpdate(player, now) ? 1 : 0; + var ret = NativeOnPlayerUpdate(player, now); + return Unsafe.As(ref ret); } } diff --git a/api/Omp.Net.CApi/Events/NativePoolEvent.cs b/api/Omp.Net.CApi/Events/NativePoolEvent.cs index e12e970..ffb292d 100644 --- a/api/Omp.Net.CApi/Events/NativePoolEvent.cs +++ b/api/Omp.Net.CApi/Events/NativePoolEvent.cs @@ -1,7 +1,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using Omp.Net.Shared; -using Omp.Net.Shared.Data; namespace Omp.Net.CApi.Events; diff --git a/api/Omp.Net.CApi/Events/NativeTextDrawEvent.cs b/api/Omp.Net.CApi/Events/NativeTextDrawEvent.cs index a0a7ebe..720d25f 100644 --- a/api/Omp.Net.CApi/Events/NativeTextDrawEvent.cs +++ b/api/Omp.Net.CApi/Events/NativeTextDrawEvent.cs @@ -35,7 +35,8 @@ private static int OnPlayerCancelTextDrawSelection(EntityId player) { return 1; } - return NativeOnPlayerCancelTextDrawSelection(player) ? 1 : 0; + var ret = NativeOnPlayerCancelTextDrawSelection(player); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -45,6 +46,7 @@ private static int OnPlayerCancelPlayerTextDrawSelection(EntityId player) { return 1; } - return NativeOnPlayerCancelPlayerTextDrawSelection(player) ? 1 : 0; + var ret = NativeOnPlayerCancelPlayerTextDrawSelection(player); + return Unsafe.As(ref ret); } } diff --git a/api/Omp.Net.CApi/Events/NativeVehicleEvent.cs b/api/Omp.Net.CApi/Events/NativeVehicleEvent.cs index 002487a..29104f9 100644 --- a/api/Omp.Net.CApi/Events/NativeVehicleEvent.cs +++ b/api/Omp.Net.CApi/Events/NativeVehicleEvent.cs @@ -80,7 +80,8 @@ private static int OnVehiclePaintJob(EntityId player, EntityId vehicle, int pain { return 1; } - return NativeOnVehiclePaintJob(player, vehicle, paintJob) ? 1 : 0; + var ret = NativeOnVehiclePaintJob(player, vehicle, paintJob); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -90,7 +91,8 @@ private static int OnVehicleMod(EntityId player, EntityId vehicle, int component { return 1; } - return NativeOnVehicleMod(player, vehicle, component) ? 1 : 0; + var ret = NativeOnVehicleMod(player, vehicle, component); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -100,7 +102,8 @@ private static int OnVehicleRespray(EntityId player, EntityId vehicle, int color { return 1; } - return NativeOnVehicleRespray(player, vehicle, color1, color2) ? 1 : 0; + var ret = NativeOnVehicleRespray(player, vehicle, color1, color2); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -122,7 +125,8 @@ private static int OnUnoccupiedVehicleUpdate(EntityId vehicle, EntityId player, { return 1; } - return NativeOnUnoccupiedVehicleUpdate(vehicle, player, data) ? 1 : 0; + var ret = NativeOnUnoccupiedVehicleUpdate(vehicle, player, data); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -132,7 +136,8 @@ private static int OnTrailerUpdate(EntityId player, EntityId trailer) { return 1; } - return NativeOnTrailerUpdate(player, trailer) ? 1 : 0; + var ret = NativeOnTrailerUpdate(player, trailer); + return Unsafe.As(ref ret); } [UnmanagedCallersOnly(CallConvs = new[] { typeof(CallConvCdecl) })] @@ -142,6 +147,7 @@ private static int OnVehicleSirenStateChange(EntityId player, EntityId vehicle, { return 1; } - return NativeOnVehicleSirenStateChange(player, vehicle, sirenState) ? 1 : 0; + var ret = NativeOnVehicleSirenStateChange(player, vehicle, sirenState); + return Unsafe.As(ref ret); } } diff --git a/api/Omp.Net/Core.cs b/api/Omp.Net/Core.cs index 8325cbf..4f06814 100644 --- a/api/Omp.Net/Core.cs +++ b/api/Omp.Net/Core.cs @@ -8,10 +8,11 @@ namespace Omp.Net; -public sealed class Core +public sealed partial class Core { public static Core Instance { get; private set; } = null!; + public CoreEvents Events { get; } public IEntityPool PlayerPool { get; } public IEntityPool VehiclePool { get; } public ITextDrawPool GlobalTextDrawPool { get; } @@ -21,11 +22,13 @@ internal Core(BaseEntry entry) { Instance = this; this.entry = entry; - tickSchedulerFactory = entry.GetTickSchedulerFactory(); + + Events = new CoreEvents(this); PlayerPool = new PlayerPool(entry.GetPlayerFactory()); VehiclePool = new VehiclePool(entry.GetVehicleFactory()); GlobalTextDrawPool = new TextDrawPool(entry.GetTextDrawFactory()); textDrawFactory = entry.GetTextDrawFactory(); + tickSchedulerFactory = entry.GetTickSchedulerFactory(); tickScheduler = tickSchedulerFactory.Create(Thread.CurrentThread); tickDelegate = tickScheduler.Tick; diff --git a/api/Omp.Net/CoreEvents.Checkpoint.cs b/api/Omp.Net/CoreEvents.Checkpoint.cs new file mode 100644 index 0000000..a4c3fad --- /dev/null +++ b/api/Omp.Net/CoreEvents.Checkpoint.cs @@ -0,0 +1,48 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using static Omp.Net.CApi.Events.NativeCheckpointEvent; + +namespace Omp.Net; + +public delegate void PlayerEnterCheckpointDelegate(IPlayer player); +public delegate void PlayerLeaveCheckpointDelegate(IPlayer player); +public delegate void PlayerEnterRaceCheckpointDelegate(IPlayer player); +public delegate void PlayerLeaveRaceCheckpointDelegate(IPlayer player); + +public sealed partial class CoreEvents +{ + public event PlayerEnterCheckpointDelegate? PlayerEnterCheckpoint; + public event PlayerLeaveCheckpointDelegate? PlayerLeaveCheckpoint; + public event PlayerEnterRaceCheckpointDelegate? PlayerEnterRaceCheckpoint; + public event PlayerLeaveRaceCheckpointDelegate? PlayerLeaveRaceCheckpoint; + + private void RegisterCheckpointEvents() + { + NativeOnPlayerEnterCheckpoint += HandleNativeOnPlayerEnterCheckpoint; + NativeOnPlayerLeaveCheckpoint += HandleNativeOnPlayerLeaveCheckpoint; + NativeOnPlayerEnterRaceCheckpoint += HandleNativeOnPlayerEnterRaceCheckpoint; + NativeOnPlayerLeaveRaceCheckpoint += HandleNativeOnPlayerLeaveRaceCheckpoint; + } + + private void HandleNativeOnPlayerEnterCheckpoint(EntityId player) + { + PlayerEnterCheckpoint?.Invoke(playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnPlayerLeaveCheckpoint(EntityId player) + { + PlayerLeaveCheckpoint?.Invoke(playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnPlayerEnterRaceCheckpoint(EntityId player) + { + PlayerEnterRaceCheckpoint?.Invoke(playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnPlayerLeaveRaceCheckpoint(EntityId player) + { + PlayerLeaveRaceCheckpoint?.Invoke(playerPool.Get(player.NativeHandle)); + } + +} + diff --git a/api/Omp.Net/CoreEvents.Class.cs b/api/Omp.Net/CoreEvents.Class.cs new file mode 100644 index 0000000..f30fb31 --- /dev/null +++ b/api/Omp.Net/CoreEvents.Class.cs @@ -0,0 +1,22 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using static Omp.Net.CApi.Events.NativeClassEvent; + +namespace Omp.Net; + +public delegate bool PlayerRequestClassDelegate(IPlayer player, uint classId); + +public sealed partial class CoreEvents +{ + public event PlayerRequestClassDelegate? PlayerRequestClass; + + private void RegisterClassEvents() + { + NativeOnPlayerRequestClass += HandleNativeOnPlayerRequestClass; + } + + private bool HandleNativeOnPlayerRequestClass(EntityId player, uint classId) + { + return PlayerRequestClass?.Invoke(playerPool.Get(player.NativeHandle), classId) ?? true; + } +} diff --git a/api/Omp.Net/CoreEvents.CustomModel.cs b/api/Omp.Net/CoreEvents.CustomModel.cs new file mode 100644 index 0000000..24bf292 --- /dev/null +++ b/api/Omp.Net/CoreEvents.CustomModel.cs @@ -0,0 +1,31 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using Omp.Net.Shared.Enums; +using static Omp.Net.CApi.Events.NativeCustomModelEvent; + +namespace Omp.Net; + +public delegate void PlayerFinishedDownloadingDelegate(IPlayer player); +public delegate bool PlayerRequestDownloadDelegate(IPlayer player, ModelDownloadType type, uint checksum); + +public sealed partial class CoreEvents +{ + public event PlayerFinishedDownloadingDelegate? PlayerFinishedDownloading; + public event PlayerRequestDownloadDelegate? PlayerRequestDownload; + + private void RegisterCustomModelEvents() + { + NativeOnPlayerFinishedDownloading += HandleNativeOnPlayerFinishedDownloading; + NativeOnPlayerRequestDownload += HandleNativeOnPlayerRequestDownload; + } + + private void HandleNativeOnPlayerFinishedDownloading(EntityId player) + { + PlayerFinishedDownloading?.Invoke(playerPool.Get(player.NativeHandle)); + } + + private bool HandleNativeOnPlayerRequestDownload(EntityId player, ModelDownloadType type, uint checksum) + { + return PlayerRequestDownload?.Invoke(playerPool.Get(player.NativeHandle), type, checksum) ?? true; + } +} diff --git a/api/Omp.Net/CoreEvents.Dialog.cs b/api/Omp.Net/CoreEvents.Dialog.cs new file mode 100644 index 0000000..9e66a2f --- /dev/null +++ b/api/Omp.Net/CoreEvents.Dialog.cs @@ -0,0 +1,23 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using Omp.Net.Shared.Enums; +using static Omp.Net.CApi.Events.NativeDialogEvent; + +namespace Omp.Net; + +public delegate void DialogResponseDelegate(IPlayer player, int dialogId, DialogResponse response, int listItem, string inputText); + +public sealed partial class CoreEvents +{ + public event DialogResponseDelegate? DialogResponse; + + private void RegisterDialogEvents() + { + NativeOnDialogResponse += HandleNativeOnDialogResponse; + } + + public void HandleNativeOnDialogResponse(EntityId player, int dialogId, DialogResponse response, int listItem, string inputText) + { + DialogResponse?.Invoke(playerPool.Get(player.NativeHandle), dialogId, response, listItem, inputText); + } +} diff --git a/api/Omp.Net/CoreEvents.GangZone.cs b/api/Omp.Net/CoreEvents.GangZone.cs new file mode 100644 index 0000000..b0104f8 --- /dev/null +++ b/api/Omp.Net/CoreEvents.GangZone.cs @@ -0,0 +1,38 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using static Omp.Net.CApi.Events.NativeGangZoneEvent; + +namespace Omp.Net; + +public delegate void PlayerEnterGangZoneDelegate(IPlayer player, int zoneId); +public delegate void PlayerLeaveGangZoneDelegate(IPlayer player, int zoneId); +public delegate void PlayerClickGangZoneDelegate(IPlayer player, int zoneId); + +public sealed partial class CoreEvents +{ + public event PlayerEnterGangZoneDelegate? PlayerEnterGangZone; + public event PlayerLeaveGangZoneDelegate? PlayerLeaveGangZone; + public event PlayerClickGangZoneDelegate? PlayerClickGangZone; + + private void RegisterGangZoneEvents() + { + NativeOnPlayerEnterGangZone += HandleNativeOnPlayerEnterGangZone; + NativeOnPlayerLeaveGangZone += HandleNativeOnPlayerLeaveGangZone; + NativeOnPlayerClickGangZone += HandleNativeOnPlayerClickGangZone; + } + + private void HandleNativeOnPlayerEnterGangZone(EntityId player, int zoneId) + { + PlayerEnterGangZone?.Invoke(playerPool.Get(player.NativeHandle), zoneId); + } + + private void HandleNativeOnPlayerLeaveGangZone(EntityId player, int zoneId) + { + PlayerLeaveGangZone?.Invoke(playerPool.Get(player.NativeHandle), zoneId); + } + + private void HandleNativeOnPlayerClickGangZone(EntityId player, int zoneId) + { + PlayerClickGangZone?.Invoke(playerPool.Get(player.NativeHandle), zoneId); + } +} diff --git a/api/Omp.Net/CoreEvents.Menu.cs b/api/Omp.Net/CoreEvents.Menu.cs new file mode 100644 index 0000000..f288ecb --- /dev/null +++ b/api/Omp.Net/CoreEvents.Menu.cs @@ -0,0 +1,29 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Shared; +using static Omp.Net.CApi.Events.NativeMenuEvent; + +namespace Omp.Net; + +public delegate void PlayerSelectedMenuRowDelegate(IPlayer player, byte row); +public delegate void PlayerExitedMenuDelegate(IPlayer player); + +public sealed partial class CoreEvents +{ + public event PlayerSelectedMenuRowDelegate? PlayerSelectedMenuRow; + public event PlayerExitedMenuDelegate? PlayerExitedMenu; + + private void RegisterMenuEvents() + { + NativeOnPlayerSelectedMenuRow += HandleNativeOnPlayerSelectedMenuRow; + NativeOnPlayerExitedMenu += HandleNativeOnPlayerExitedMenu; + } + + private void HandleNativeOnPlayerSelectedMenuRow(EntityId player, byte row) + { + PlayerSelectedMenuRow?.Invoke(playerPool.Get(player.NativeHandle), row); + } + private void HandleNativeOnPlayerExitedMenu(EntityId player) + { + PlayerExitedMenu?.Invoke(playerPool.Get(player.NativeHandle)); + } +} diff --git a/api/Omp.Net/CoreEvents.Player.cs b/api/Omp.Net/CoreEvents.Player.cs new file mode 100644 index 0000000..0d498ea --- /dev/null +++ b/api/Omp.Net/CoreEvents.Player.cs @@ -0,0 +1,235 @@ +using System.Numerics; +using Omp.Net.Entities.Player; +using Omp.Net.Entities.Vehicle; +using Omp.Net.Shared; +using Omp.Net.Shared.Data; +using Omp.Net.Shared.Enums; +using static Omp.Net.CApi.Events.NativePlayerEvent; + +namespace Omp.Net; + +public delegate void IncomingConnectionDelegate(IPlayer player, string ipAddress, ushort port); +public delegate void PlayerConnectDelegate(IPlayer player); +public delegate void PlayerDisconnectDelegate(IPlayer player, int reason); +public delegate void PlayerClientInitDelegate(IPlayer player); +public delegate int PlayerRequestSpawnDelegate(IPlayer player); +public delegate void PlayerSpawnDelegate(IPlayer player); +public delegate void PlayerStreamInDelegate(IPlayer player, IPlayer forPlayer); +public delegate void PlayerStreamOutDelegate(IPlayer player, IPlayer forPlayer); +public delegate bool PlayerTextDelegate(IPlayer player, string message); +public delegate bool PlayerCommandTextDelegate(IPlayer player, string message); +public delegate bool PlayerShotMissedDelegate(IPlayer player, PlayerBulletData bulletData); +public delegate bool PlayerShotPlayerDelegate(IPlayer player, IPlayer target, PlayerBulletData bulletData); +public delegate bool PlayerShotVehicleDelegate(IPlayer player, IVehicle target, PlayerBulletData bulletData); +public delegate bool PlayerShotObjectDelegate(IPlayer player, EntityId target, PlayerBulletData bulletData); +public delegate bool PlayerShotPlayerObjectDelegate(IPlayer player, EntityId target, PlayerBulletData bulletData); +public delegate void PlayerScoreChangeDelegate(IPlayer player, int score); +public delegate void PlayerNameChangeDelegate(IPlayer player, string oldName); +public delegate void PlayerInteriorChangeDelegate(IPlayer player, uint newInterior, uint oldInterior); +public delegate void PlayerStateChangeDelegate(IPlayer player, PlayerState newState, PlayerState oldState); +public delegate void PlayerKeyStateChangeDelegate(IPlayer player, uint newKeys, uint oldKeys); +public delegate void PlayerDeathDelegate(IPlayer player, IPlayer killer, int reason); +public delegate void PlayerTakeDamageDelegate(IPlayer player, IPlayer from, float amount, uint weapon, BodyPart part); +public delegate void PlayerGiveDamageDelegate(IPlayer player, IPlayer to, float amount, uint weapon, BodyPart part); +public delegate void PlayerClickMapDelegate(IPlayer player, Vector3 pos); +public delegate void PlayerClickPlayerDelegate(IPlayer player, IPlayer clicked, PlayerClickSource source); +public delegate void ClientCheckResponseDelegate(IPlayer player, int actionType, int address, int results); +public delegate bool PlayerUpdateDelegate(IPlayer player, long now); + +public sealed partial class CoreEvents +{ + public event IncomingConnectionDelegate? IncomingConnection; + public event PlayerConnectDelegate? PlayerConnect; + public event PlayerDisconnectDelegate? PlayerDisconnect; + public event PlayerClientInitDelegate? PlayerClientInit; + public event PlayerRequestSpawnDelegate? PlayerRequestSpawn; + public event PlayerSpawnDelegate? PlayerSpawn; + public event PlayerStreamInDelegate? PlayerStreamIn; + public event PlayerStreamOutDelegate? PlayerStreamOut; + public event PlayerTextDelegate? PlayerText; + public event PlayerCommandTextDelegate? PlayerCommandText; + public event PlayerShotMissedDelegate? PlayerShotMissed; + public event PlayerShotPlayerDelegate? PlayerShotPlayer; + public event PlayerShotVehicleDelegate? PlayerShotVehicle; + public event PlayerShotObjectDelegate? PlayerShotObject; + public event PlayerShotPlayerObjectDelegate? PlayerShotPlayerObject; + public event PlayerScoreChangeDelegate? PlayerScoreChange; + public event PlayerNameChangeDelegate? PlayerNameChange; + public event PlayerInteriorChangeDelegate? PlayerInteriorChange; + public event PlayerStateChangeDelegate? PlayerStateChange; + public event PlayerKeyStateChangeDelegate? PlayerKeyStateChange; + public event PlayerDeathDelegate? PlayerDeath; + public event PlayerTakeDamageDelegate? PlayerTakeDamage; + public event PlayerGiveDamageDelegate? PlayerGiveDamage; + public event PlayerClickMapDelegate? PlayerClickMap; + public event PlayerClickPlayerDelegate? PlayerClickPlayer; + public event ClientCheckResponseDelegate? ClientCheckResponse; + public event PlayerUpdateDelegate? PlayerUpdate; + + private void RegisterPlayerEvents() + { + NativeOnIncomingConnection += HandleNativeOnIncomingConnection; + NativeOnPlayerConnect += HandleNativeOnPlayerConnect; + NativeOnPlayerDisconnect += HandleNativeOnPlayerDisconnect; + NativeOnPlayerClientInit += HandleNativeOnPlayerClientInit; + NativeOnPlayerRequestSpawn += HandleNativeOnPlayerRequestSpawn; + NativeOnPlayerSpawn += HandleNativeOnPlayerSpawn; + NativeOnPlayerStreamIn += HandleNativeOnPlayerStreamIn; + NativeOnPlayerStreamOut += HandleNativeOnPlayerStreamOut; + NativeOnPlayerScoreChange += HandleNativeOnPlayerScoreChange; + NativeOnPlayerNameChange += HandleNativeOnPlayerNameChange; + NativeOnPlayerInteriorChange += HandleNativeOnPlayerInteriorChange; + NativeOnPlayerStateChange += HandleNativeOnPlayerStateChange; + NativeOnPlayerKeyStateChange += HandleNativeOnPlayerKeyStateChange; + NativeOnPlayerDeath += HandleNativeOnPlayerDeath; + NativeOnPlayerTakeDamage += HandleNativeOnPlayerTakeDamage; + NativeOnPlayerGiveDamage += HandleNativeOnPlayerGiveDamage; + NativeOnPlayerClickMap += HandleNativeOnPlayerClickMap; + NativeOnPlayerClickPlayer += HandleNativeOnPlayerClickPlayer; + NativeOnClientCheckResponse += HandleNativeOnClientCheckResponse; + NativeOnPlayerText += HandleNativeOnPlayerText; + NativeOnPlayerCommandText += HandleNativeOnPlayerCommandText; + NativeOnPlayerShotMissed += HandleNativeOnPlayerShotMissed; + NativeOnPlayerShotPlayer += HandleNativeOnPlayerShotPlayer; + NativeOnPlayerShotVehicle += HandleNativeOnPlayerShotVehicle; + NativeOnPlayerShotObject += HandleNativeOnPlayerShotObject; + NativeOnPlayerShotPlayerObject += HandleNativeOnPlayerShotPlayerObject; + NativeOnPlayerUpdate += HandleNativeOnPlayerUpdate; + } + + private void HandleNativeOnIncomingConnection(EntityId player, string ipAddress, ushort port) + { + IncomingConnection?.Invoke(playerPool.Get(player.NativeHandle, player.Id), ipAddress, port); + } + + private void HandleNativeOnPlayerConnect(EntityId player) + { + PlayerConnect?.Invoke(playerPool.Get(player.NativeHandle, player.Id)); + } + + private void HandleNativeOnPlayerDisconnect(EntityId player, int reason) + { + PlayerDisconnect?.Invoke(playerPool.Get(player.NativeHandle, player.Id), reason); + } + + private void HandleNativeOnPlayerClientInit(EntityId player) + { + PlayerClientInit?.Invoke(playerPool.Get(player.NativeHandle, player.Id)); + } + + private int HandleNativeOnPlayerRequestSpawn(EntityId player) + { + return PlayerRequestSpawn?.Invoke(playerPool.Get(player.NativeHandle, player.Id)) ?? default; + } + + private void HandleNativeOnPlayerSpawn(EntityId player) + { + PlayerSpawn?.Invoke(playerPool.Get(player.NativeHandle, player.Id)); + } + + private void HandleNativeOnPlayerStreamIn(EntityId player, EntityId forPlayer) + { + PlayerStreamIn?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(forPlayer.NativeHandle, forPlayer.Id)); + } + + private void HandleNativeOnPlayerStreamOut(EntityId player, EntityId forPlayer) + { + PlayerStreamOut?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(forPlayer.NativeHandle, forPlayer.Id)); + } + + private bool HandleNativeOnPlayerText(EntityId player, string message) + { + return PlayerText?.Invoke(playerPool.Get(player.NativeHandle, player.Id), message) ?? default; + } + + private bool HandleNativeOnPlayerCommandText(EntityId player, string message) + { + return PlayerCommandText?.Invoke(playerPool.Get(player.NativeHandle, player.Id), message) ?? default; + } + + private bool HandleNativeOnPlayerShotMissed(EntityId player, PlayerBulletData bulletData) + { + return PlayerShotMissed?.Invoke(playerPool.Get(player.NativeHandle, player.Id), bulletData) ?? default; + } + + private bool HandleNativeOnPlayerShotPlayer(EntityId player, EntityId target, PlayerBulletData bulletData) + { + return PlayerShotPlayer?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(target.NativeHandle, target.Id), bulletData) ?? default; + } + + private bool HandleNativeOnPlayerShotVehicle(EntityId player, EntityId target, PlayerBulletData bulletData) + { + return PlayerShotVehicle?.Invoke(playerPool.Get(player.NativeHandle, player.Id), core.VehiclePool.Get(target.NativeHandle, target.Id), bulletData) ?? default; + } + + private bool HandleNativeOnPlayerShotObject(EntityId player, EntityId target, PlayerBulletData bulletData) + { + return PlayerShotObject?.Invoke(playerPool.Get(player.NativeHandle, player.Id), target, bulletData) ?? default; + } + + private bool HandleNativeOnPlayerShotPlayerObject(EntityId player, EntityId target, PlayerBulletData bulletData) + { + return PlayerShotPlayerObject?.Invoke(playerPool.Get(player.NativeHandle, player.Id), target, bulletData) ?? default; + } + + private void HandleNativeOnPlayerScoreChange(EntityId player, int score) + { + PlayerScoreChange?.Invoke(playerPool.Get(player.NativeHandle, player.Id), score); + } + + private void HandleNativeOnPlayerNameChange(EntityId player, string oldName) + { + PlayerNameChange?.Invoke(playerPool.Get(player.NativeHandle, player.Id), oldName); + } + + private void HandleNativeOnPlayerInteriorChange(EntityId player, uint newInterior, uint oldInterior) + { + PlayerInteriorChange?.Invoke(playerPool.Get(player.NativeHandle, player.Id), newInterior, oldInterior); + } + + private void HandleNativeOnPlayerStateChange(EntityId player, PlayerState newState, PlayerState oldState) + { + PlayerStateChange?.Invoke(playerPool.Get(player.NativeHandle, player.Id), newState, oldState); + } + + private void HandleNativeOnPlayerKeyStateChange(EntityId player, uint newKeys, uint oldKeys) + { + PlayerKeyStateChange?.Invoke(playerPool.Get(player.NativeHandle, player.Id), newKeys, oldKeys); + } + + private void HandleNativeOnPlayerDeath(EntityId player, EntityId killer, int reason) + { + PlayerDeath?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(killer.NativeHandle, killer.Id), reason); + } + + private void HandleNativeOnPlayerTakeDamage(EntityId player, EntityId from, float amount, uint weapon, BodyPart part) + { + PlayerTakeDamage?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(from.NativeHandle, from.Id), amount, weapon, part); + } + + private void HandleNativeOnPlayerGiveDamage(EntityId player, EntityId to, float amount, uint weapon, BodyPart part) + { + PlayerGiveDamage?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(to.NativeHandle, to.Id), amount, weapon, part); + } + + private void HandleNativeOnPlayerClickMap(EntityId player, Vector3 pos) + { + PlayerClickMap?.Invoke(playerPool.Get(player.NativeHandle, player.Id), pos); + } + + private void HandleNativeOnPlayerClickPlayer(EntityId player, EntityId clicked, PlayerClickSource source) + { + PlayerClickPlayer?.Invoke(playerPool.Get(player.NativeHandle, player.Id), playerPool.Get(clicked.NativeHandle, clicked.Id), source); + } + + private void HandleNativeOnClientCheckResponse(EntityId player, int actionType, int address, int results) + { + ClientCheckResponse?.Invoke(playerPool.Get(player.NativeHandle, player.Id), actionType, address, results); + } + + private bool HandleNativeOnPlayerUpdate(EntityId player, long now) + { + return PlayerUpdate?.Invoke(playerPool.Get(player.NativeHandle, player.Id), now) ?? default; + } +} + diff --git a/api/Omp.Net/CoreEvents.TextDraw.cs b/api/Omp.Net/CoreEvents.TextDraw.cs new file mode 100644 index 0000000..6c08057 --- /dev/null +++ b/api/Omp.Net/CoreEvents.TextDraw.cs @@ -0,0 +1,55 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Entities.TextDraw; +using Omp.Net.Shared; +using static Omp.Net.CApi.Events.NativeTextDrawEvent; + +namespace Omp.Net; + +public delegate void PlayerClickTextDrawDelegate(IPlayer player, ITextDraw td); +public delegate void PlayerClickPlayerTextDrawDelegate(IPlayer player, ITextDraw td); +public delegate bool PlayerCancelTextDrawSelectionDelegate(IPlayer player); +public delegate bool PlayerCancelPlayerTextDrawSelectionDelegate(IPlayer player); + +public sealed partial class CoreEvents +{ + public event PlayerClickTextDrawDelegate? PlayerClickTextDraw; + public event PlayerClickPlayerTextDrawDelegate? PlayerClickPlayerTextDraw; + public event PlayerCancelTextDrawSelectionDelegate? PlayerCancelTextDrawSelection; + public event PlayerCancelPlayerTextDrawSelectionDelegate? PlayerCancelPlayerTextDrawSelection; + + private void RegisterTextDrawEvents() + { + NativeOnPlayerClickTextDraw += HandleNativeOnPlayerClickTextDraw; + NativeOnPlayerClickPlayerTextDraw += HandleNativeOnPlayerClickPlayerTextDraw; + NativeOnPlayerCancelTextDrawSelection += HandleNativeOnPlayerCancelTextDrawSelection; + NativeOnPlayerCancelPlayerTextDrawSelection += HandleNativeOnPlayerCancelPlayerTextDrawSelection; + } + + private void HandleNativeOnPlayerClickTextDraw(EntityId player, EntityId td) + { + if (PlayerClickTextDraw is null + || !textDrawPool.TryGet(td.NativeHandle, out var textDraw)) + { + return; + } + PlayerClickTextDraw.Invoke(playerPool.Get(player.NativeHandle), textDraw); + } + private void HandleNativeOnPlayerClickPlayerTextDraw(EntityId player, EntityId td) + { + var pooledPlayer = playerPool.Get(player.NativeHandle); + var clickedTD = pooledPlayer.TextDraws.FirstOrDefault(playerTD => playerTD.NativeHandle == td.NativeHandle); + if (clickedTD is null) + { + return; + } + PlayerClickPlayerTextDraw?.Invoke(pooledPlayer, clickedTD); + } + private bool HandleNativeOnPlayerCancelTextDrawSelection(EntityId player) + { + return PlayerCancelTextDrawSelection?.Invoke(playerPool.Get(player.NativeHandle)) ?? true; + } + private bool HandleNativeOnPlayerCancelPlayerTextDrawSelection(EntityId player) + { + return PlayerCancelPlayerTextDrawSelection?.Invoke(playerPool.Get(player.NativeHandle)) ?? true; + } +} diff --git a/api/Omp.Net/CoreEvents.Vehicle.cs b/api/Omp.Net/CoreEvents.Vehicle.cs new file mode 100644 index 0000000..d886406 --- /dev/null +++ b/api/Omp.Net/CoreEvents.Vehicle.cs @@ -0,0 +1,130 @@ +using Omp.Net.Entities.Player; +using Omp.Net.Entities.Vehicle; +using Omp.Net.Shared; +using Omp.Net.Shared.Data; +using static Omp.Net.CApi.Events.NativeVehicleEvent; + +namespace Omp.Net; + +public delegate void VehicleStreamInDelegate(IVehicle vehicle, IPlayer player); +public delegate void VehicleStreamOutDelegate(IVehicle vehicle, IPlayer player); +public delegate void VehicleDeathDelegate(IVehicle vehicle, IPlayer player); +public delegate void PlayerEnterVehicleDelegate(IPlayer player, IVehicle vehicle, bool passenger); +public delegate void PlayerExitVehicleDelegate(IPlayer player, IVehicle vehicle); +public delegate void VehicleDamageStatusUpdateDelegate(IVehicle vehicle, IPlayer player); +public delegate bool VehiclePaintJobDelegate(IPlayer player, IVehicle vehicle, int paintJob); +public delegate bool VehicleModDelegate(IPlayer player, IVehicle vehicle, int component); +public delegate bool VehicleResprayDelegate(IPlayer player, IVehicle vehicle, int color1, int color2); +public delegate void EnterExitModShopDelegate(IPlayer player, bool enterexit, int interiorID); +public delegate void VehicleSpawnDelegate(IVehicle vehicle); +public delegate bool UnoccupiedVehicleUpdateDelegate(IVehicle vehicle, IPlayer player, UnoccupiedVehicleUpdateData data); +public delegate bool TrailerUpdateDelegate(IPlayer player, IVehicle trailer); +public delegate bool VehicleSirenStateChangeDelegate(IPlayer player, IVehicle vehicle, byte sirenState); + +public sealed partial class CoreEvents +{ + public event VehicleStreamInDelegate? VehicleStreamIn; + public event VehicleStreamOutDelegate? VehicleStreamOut; + public event VehicleDeathDelegate? VehicleDeath; + public event PlayerEnterVehicleDelegate? PlayerEnterVehicle; + public event PlayerExitVehicleDelegate? PlayerExitVehicle; + public event VehicleDamageStatusUpdateDelegate? VehicleDamageStatusUpdate; + public event VehiclePaintJobDelegate? VehiclePaintJob; + public event VehicleModDelegate? VehicleMod; + public event VehicleResprayDelegate? VehicleRespray; + public event EnterExitModShopDelegate? EnterExitModShop; + public event VehicleSpawnDelegate? VehicleSpawn; + public event UnoccupiedVehicleUpdateDelegate? UnoccupiedVehicleUpdate; + public event TrailerUpdateDelegate? TrailerUpdate; + public event VehicleSirenStateChangeDelegate? VehicleSirenStateChange; + + private void RegisterVehicleEvents() + { + NativeOnVehicleStreamIn += HandleNativeOnVehicleStreamIn; + NativeOnVehicleStreamOut += HandleNativeOnVehicleStreamOut; + NativeOnVehicleDeath += HandleNativeOnVehicleDeath; + NativeOnPlayerEnterVehicle += HandleNativeOnPlayerEnterVehicle; + NativeOnPlayerExitVehicle += HandleNativeOnPlayerExitVehicle; + NativeOnVehicleDamageStatusUpdate += HandleNativeOnVehicleDamageStatusUpdate; + NativeOnVehiclePaintJob += HandleNativeOnVehiclePaintJob; + NativeOnVehicleMod += HandleNativeOnVehicleMod; + NativeOnVehicleRespray += HandleNativeOnVehicleRespray; + NativeOnEnterExitModShop += HandleNativeOnEnterExitModShop; + NativeOnVehicleSpawn += HandleNativeOnVehicleSpawn; + NativeOnUnoccupiedVehicleUpdate += HandleNativeOnUnoccupiedVehicleUpdate; + NativeOnTrailerUpdate += HandleNativeOnTrailerUpdate; + NativeOnVehicleSirenStateChange += HandleNativeOnVehicleSirenStateChange; + } + + private void HandleNativeOnVehicleStreamIn(EntityId vehicle, EntityId player) + { + VehicleStreamIn?.Invoke(vehiclePool.Get(vehicle.NativeHandle), playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnVehicleStreamOut(EntityId vehicle, EntityId player) + { + VehicleStreamOut?.Invoke(vehiclePool.Get(vehicle.NativeHandle), playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnVehicleDeath(EntityId vehicle, EntityId player) + { + VehicleDeath?.Invoke(vehiclePool.Get(vehicle.NativeHandle), playerPool.Get(player.NativeHandle)); + } + + private void HandleNativeOnPlayerEnterVehicle(EntityId player, EntityId vehicle, bool passenger) + { + PlayerEnterVehicle?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle), passenger); + } + + private void HandleNativeOnPlayerExitVehicle(EntityId player, EntityId vehicle) + { + PlayerExitVehicle?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle)); + } + + private void HandleNativeOnVehicleDamageStatusUpdate(EntityId vehicle, EntityId player) + { + VehicleDamageStatusUpdate?.Invoke(vehiclePool.Get(vehicle.NativeHandle), playerPool.Get(player.NativeHandle)); + } + + private bool HandleNativeOnVehiclePaintJob(EntityId player, EntityId vehicle, int paintJob) + { + return VehiclePaintJob?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle), paintJob) ?? true; + } + + private bool HandleNativeOnVehicleMod(EntityId player, EntityId vehicle, int component) + { + return VehicleMod?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle), component) ?? true; + } + + private bool HandleNativeOnVehicleRespray(EntityId player, EntityId vehicle, int color1, int color2) + { + return VehicleRespray?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle), color1, color2) ?? true; + } + + private void HandleNativeOnEnterExitModShop(EntityId player, bool enterexit, int interiorID) + { + EnterExitModShop?.Invoke(playerPool.Get(player.NativeHandle), enterexit, interiorID); + } + + private void HandleNativeOnVehicleSpawn(EntityId vehicle) + { + VehicleSpawn?.Invoke(vehiclePool.Get(vehicle.NativeHandle)); + } + + private bool HandleNativeOnUnoccupiedVehicleUpdate(EntityId vehicle, EntityId player, UnoccupiedVehicleUpdateData data) + { + return UnoccupiedVehicleUpdate?.Invoke(vehiclePool.Get(vehicle.NativeHandle), playerPool.Get(player.NativeHandle), data) ?? true; + } + + private bool HandleNativeOnTrailerUpdate(EntityId player, EntityId vehicle) + { + return TrailerUpdate?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle)) ?? true; + } + + private bool HandleNativeOnVehicleSirenStateChange(EntityId player, EntityId vehicle, byte sirenState) + { + return VehicleSirenStateChange?.Invoke(playerPool.Get(player.NativeHandle), vehiclePool.Get(vehicle.NativeHandle), sirenState) ?? true; + } + +} + diff --git a/api/Omp.Net/CoreEvents.cs b/api/Omp.Net/CoreEvents.cs new file mode 100644 index 0000000..03c5fed --- /dev/null +++ b/api/Omp.Net/CoreEvents.cs @@ -0,0 +1,33 @@ +using Omp.Net.Entities; +using Omp.Net.Entities.Player; +using Omp.Net.Entities.TextDraw; +using Omp.Net.Entities.Vehicle; + +namespace Omp.Net; + +public sealed partial class CoreEvents +{ + private readonly Core core; + private readonly IEntityPool playerPool; + private readonly IEntityPool vehiclePool; + private readonly ITextDrawPool textDrawPool; + + public CoreEvents(Core core) + { + this.core = core; + playerPool = core.PlayerPool; + vehiclePool = core.VehiclePool; + textDrawPool = core.GlobalTextDrawPool; + + RegisterCheckpointEvents(); + RegisterClassEvents(); + RegisterCustomModelEvents(); + RegisterDialogEvents(); + RegisterGangZoneEvents(); + RegisterMenuEvents(); + RegisterPlayerEvents(); + RegisterTextDrawEvents(); + RegisterVehicleEvents(); + } +} + diff --git a/runtime b/runtime index d3725ac..76c90fd 160000 --- a/runtime +++ b/runtime @@ -1 +1 @@ -Subproject commit d3725ac12fbdfafd45d87baa28f463d56052388c +Subproject commit 76c90fdac6be28ef3169adfe4521a3b2db20f3b9