Skip to content

Commit 02cb12e

Browse files
Add explosion and weapon damage events
1 parent fdb7d09 commit 02cb12e

File tree

13 files changed

+264
-33
lines changed

13 files changed

+264
-33
lines changed

api/AltV.Net.Async/AltAsync.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,18 @@ public static event PlayerDeadAsyncDelegate OnPlayerDead
3636
add => Module.PlayerDeadAsyncEventHandler.Add(value);
3737
remove => Module.PlayerDeadAsyncEventHandler.Remove(value);
3838
}
39+
40+
public static event ExplosionAsyncDelegate OnExplosion
41+
{
42+
add => Module.ExplosionAsyncEventHandler.Add(value);
43+
remove => Module.ExplosionAsyncEventHandler.Remove(value);
44+
}
45+
46+
public static event WeaponDamageAsyncDelegate OnWeaponDamage
47+
{
48+
add => Module.WeaponDamageAsyncEventHandler.Add(value);
49+
remove => Module.WeaponDamageAsyncEventHandler.Remove(value);
50+
}
3951

4052
public static event PlayerChangeVehicleSeatAsyncDelegate OnPlayerChangeVehicleSeat
4153
{

api/AltV.Net.Async/AsyncModule.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Runtime.Loader;
44
using System.Threading.Tasks;
55
using AltV.Net.Async.Events;
6+
using AltV.Net.Data;
67
using AltV.Net.Elements.Entities;
78
using AltV.Net.Elements.Args;
89
using AltV.Net.Native;
@@ -26,6 +27,12 @@ public class AsyncModule : Module
2627
internal readonly AsyncEventHandler<PlayerDeadAsyncDelegate> PlayerDeadAsyncEventHandler =
2728
new AsyncEventHandler<PlayerDeadAsyncDelegate>();
2829

30+
internal readonly AsyncEventHandler<ExplosionAsyncDelegate> ExplosionAsyncEventHandler =
31+
new AsyncEventHandler<ExplosionAsyncDelegate>();
32+
33+
internal readonly AsyncEventHandler<WeaponDamageAsyncDelegate> WeaponDamageAsyncEventHandler =
34+
new AsyncEventHandler<WeaponDamageAsyncDelegate>();
35+
2936
internal readonly AsyncEventHandler<PlayerChangeVehicleSeatAsyncDelegate>
3037
PlayerChangeVehicleSeatAsyncEventHandler =
3138
new AsyncEventHandler<PlayerChangeVehicleSeatAsyncDelegate>();
@@ -74,7 +81,8 @@ public AsyncModule(IServer server, AssemblyLoadContext assemblyLoadContext, Nati
7481
IBaseObjectPool<IBlip> blipPool,
7582
IBaseObjectPool<ICheckpoint> checkpointPool,
7683
IBaseObjectPool<IVoiceChannel> voiceChannelPool,
77-
IBaseObjectPool<IColShape> colShapePool) : base(server, assemblyLoadContext, moduleResource, baseBaseObjectPool,
84+
IBaseObjectPool<IColShape> colShapePool) : base(server, assemblyLoadContext, moduleResource,
85+
baseBaseObjectPool,
7886
baseEntityPool, playerPool, vehiclePool, blipPool,
7987
checkpointPool, voiceChannelPool, colShapePool)
8088
{
@@ -96,23 +104,23 @@ public override void OnPlayerConnectEvent(IPlayer player, string reason)
96104
Task.Run(() => PlayerConnectAsyncEventHandler.CallAsyncWithoutTask(@delegate => @delegate(player, reason)));
97105
}
98106

99-
public override void OnPlayerDamageEvent(IPlayer player, IEntity attacker, uint weapon, ushort damage)
107+
public override void OnExplosionEvent(IPlayer sourcePlayer, ExplosionType explosionType, Position position,
108+
uint explosionFx)
100109
{
101-
base.OnPlayerDamageEvent(player, attacker, weapon, damage);
102-
if (!PlayerDamageAsyncEventHandler.HasEvents()) return;
103-
var oldHealth = player.Health;
104-
var oldArmor = player.Armor;
110+
base.OnExplosionEvent(sourcePlayer, explosionType, position, explosionFx);
111+
if (!ExplosionAsyncEventHandler.HasEvents()) return;
105112
Task.Run(() =>
106-
PlayerDamageAsyncEventHandler.CallAsyncWithoutTask(@delegate =>
107-
@delegate(player, attacker, oldHealth, oldArmor, weapon, damage)));
113+
ExplosionAsyncEventHandler.CallAsyncWithoutTask(@delegate =>
114+
@delegate(sourcePlayer, explosionType, position, explosionFx)));
108115
}
109116

110-
public override void OnPlayerDeathEvent(IPlayer player, IEntity killer, uint weapon)
117+
public override void OnWeaponDamageEvent(IPlayer sourcePlayer, IEntity targetEntity, uint weapon, ushort damage,
118+
Position shotOffset, BodyPart bodyPart)
111119
{
112-
base.OnPlayerDeathEvent(player, killer, weapon);
113-
if (!PlayerDeadAsyncEventHandler.HasEvents()) return;
114-
Task.Run(() =>
115-
PlayerDeadAsyncEventHandler.CallAsyncWithoutTask(@delegate => @delegate(player, killer, weapon)));
120+
base.OnWeaponDamageEvent(sourcePlayer, targetEntity, weapon, damage, shotOffset, bodyPart);
121+
if (!WeaponDamageAsyncEventHandler.HasEvents()) return;
122+
Task.Run(() => WeaponDamageAsyncEventHandler.CallAsyncWithoutTask(@delegate =>
123+
@delegate(sourcePlayer, targetEntity, weapon, damage, shotOffset, bodyPart)));
116124
}
117125

118126
public override void OnPlayerChangeVehicleSeatEvent(IVehicle vehicle, IPlayer player, byte oldSeat,

api/AltV.Net.Async/Events/Events.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,10 @@ public delegate Task PlayerChangeVehicleSeatAsyncDelegate(IVehicle vehicle, IPla
3737
public delegate Task MetaDataChangeAsyncDelegate(IEntity entity, string key, object value);
3838

3939
public delegate Task ColShapeAsyncDelegate(IColShape colShape, IEntity targetEntity, bool state);
40+
41+
public delegate Task ExplosionAsyncDelegate(IPlayer player, ExplosionType explosionType, Position position,
42+
uint explosionFx);
43+
44+
public delegate Task WeaponDamageAsyncDelegate(IPlayer player, IEntity target, uint weapon, ushort damage,
45+
Position shotOffset, BodyPart bodyPart);
4046
}

api/AltV.Net/Alt.Events.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,18 @@ public static event PlayerDeadDelegate OnPlayerDead
3838
remove => Module.PlayerDeadEventHandler.Remove(value);
3939
}
4040

41+
public static event ExplosionDelegate OnExplosion
42+
{
43+
add => Module.ExplosionEventHandler.Add(value);
44+
remove => Module.ExplosionEventHandler.Remove(value);
45+
}
46+
47+
public static event WeaponDamageDelegate OnWeaponDamage
48+
{
49+
add => Module.WeaponDamageEventHandler.Add(value);
50+
remove => Module.WeaponDamageEventHandler.Remove(value);
51+
}
52+
4153
public static event PlayerDisconnectDelegate OnPlayerDisconnect
4254
{
4355
add => Module.PlayerDisconnectEventHandler.Add(value);

api/AltV.Net/CSharpResourceImpl.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ internal void SetDelegates(AltNative.Resource.MainDelegate onStartResource)
6969

7070
GCHandle.Alloc(onPlayerDeath);
7171

72+
AltNative.Resource.ExplosionDelegate explosionDelegate = ModuleWrapper.OnExplosion;
73+
74+
GCHandle.Alloc(explosionDelegate);
75+
76+
AltNative.Resource.WeaponDamageDelegate weaponDamageDelegate = ModuleWrapper.OnWeaponDamage;
77+
78+
GCHandle.Alloc(weaponDamageDelegate);
79+
7280
AltNative.Resource.PlayerDisconnectDelegate onPlayerDisconnect = ModuleWrapper.OnPlayerDisconnect;
7381

7482
GCHandle.Alloc(onPlayerDisconnect);
@@ -160,7 +168,8 @@ internal void SetDelegates(AltNative.Resource.MainDelegate onStartResource)
160168

161169
AltNative.Resource.CSharpResource_SetMain(NativePointer, onStart, onStop, onTick, onServerEvent,
162170
onCheckpoint,
163-
onClientEvent, onPlayerDamage, onPlayerConnect, onPlayerDeath, onPlayerDisconnect, onPlayerRemove,
171+
onClientEvent, onPlayerDamage, onPlayerConnect, onPlayerDeath, explosionDelegate, weaponDamageDelegate,
172+
onPlayerDisconnect, onPlayerRemove,
164173
onVehicleRemove,
165174
onPlayerChangeVehicleSeat, onPlayerEnterVehicle, onPlayerLeaveVehicle, onCreatePlayer, onRemovePlayer,
166175
onCreateVehicle, onRemoveVehicle,

api/AltV.Net/Data/BodyPart.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
namespace AltV.Net.Data
2+
{
3+
public enum BodyPart : sbyte
4+
{
5+
Pelvis,
6+
LeftHip,
7+
LeftLeg,
8+
LeftFoot,
9+
RightHip,
10+
RightLeg,
11+
RightFoot,
12+
LowerTorso,
13+
UpperTorso,
14+
Chest,
15+
UnderNeck,
16+
LeftShoulder,
17+
LeftUpperArm,
18+
LeftElbrow,
19+
LeftWrist,
20+
RightShoulder,
21+
RightUpperArm,
22+
RightElbrow,
23+
RightWrist,
24+
Neck,
25+
Head,
26+
27+
Unknown = -1
28+
}
29+
}

api/AltV.Net/Data/ExplosionType.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
namespace AltV.Net.Data
2+
{
3+
public enum ExplosionType : sbyte
4+
{
5+
Grenade,
6+
GrenadeLauncher,
7+
StickyBomb,
8+
Molotov,
9+
Rocket,
10+
TankShell,
11+
HiOctane,
12+
Car,
13+
Plane,
14+
PetrolPump,
15+
Bike,
16+
DirSteam,
17+
DirFlame,
18+
DirWaterHydrant,
19+
DirGasCanister,
20+
Boat,
21+
ShipDestroy,
22+
Truck,
23+
Bullet,
24+
SmokeGrenadeLauncher,
25+
SmokeGrenade,
26+
BzGas,
27+
Flare,
28+
GasCanister,
29+
Extinguisher,
30+
Programmablear,
31+
Train,
32+
Barrel,
33+
Propane,
34+
Blimp,
35+
DirFlameExplode,
36+
Tanker,
37+
PlaneRocket,
38+
VehicleBullet,
39+
GasTank,
40+
Firework,
41+
Snowball,
42+
ProxMine,
43+
ValkyrieCannon,
44+
45+
Unknown = -1
46+
}
47+
}

api/AltV.Net/Events/Events.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using AltV.Net.Data;
12
using AltV.Net.Elements.Entities;
23
using AltV.Net.Native;
34

@@ -36,8 +37,14 @@ namespace AltV.Net.Events
3637
public delegate void ServerCustomEventEventDelegate(string eventName, ref MValueArray mValueArray);
3738

3839
public delegate void ConsoleCommandDelegate(string name, string[] args);
39-
40+
4041
public delegate void MetaDataChangeDelegate(IEntity entity, string key, object value);
41-
42+
4243
public delegate void ColShapeDelegate(IColShape colShape, IEntity targetEntity, bool state);
44+
45+
public delegate void ExplosionDelegate(IPlayer player, ExplosionType explosionType, Position position,
46+
uint explosionFx);
47+
48+
public delegate void WeaponDamageDelegate(IPlayer player, IEntity target, uint weapon, ushort damage,
49+
Position shotOffset, BodyPart bodyPart);
4350
}

api/AltV.Net/Module.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
using System.IO;
44
using System.Linq;
55
using System.Reflection;
6-
using System.Runtime.CompilerServices;
76
using System.Runtime.InteropServices;
87
using System.Runtime.Loader;
8+
using AltV.Net.Data;
99
using AltV.Net.Elements.Args;
1010
using AltV.Net.Elements.Entities;
1111
using AltV.Net.Events;
@@ -70,6 +70,12 @@ public class Module
7070

7171
internal readonly IEventHandler<PlayerDeadDelegate> PlayerDeadEventHandler =
7272
new HashSetEventHandler<PlayerDeadDelegate>();
73+
74+
internal readonly IEventHandler<ExplosionDelegate> ExplosionEventHandler =
75+
new HashSetEventHandler<ExplosionDelegate>();
76+
77+
internal readonly IEventHandler<WeaponDamageDelegate> WeaponDamageEventHandler =
78+
new HashSetEventHandler<WeaponDamageDelegate>();
7379

7480
internal readonly IEventHandler<PlayerChangeVehicleSeatDelegate> PlayerChangeVehicleSeatEventHandler =
7581
new HashSetEventHandler<PlayerChangeVehicleSeatDelegate>();
@@ -389,6 +395,44 @@ public virtual void OnPlayerDeathEvent(IPlayer player, IEntity killer, uint weap
389395
@delegate(player, killer, weapon);
390396
}
391397
}
398+
399+
public void OnExplosion(IntPtr playerPointer, ExplosionType explosionType, Position position, uint explosionFx)
400+
{
401+
if (!PlayerPool.GetOrCreate(playerPointer, out var sourcePlayer))
402+
{
403+
return;
404+
}
405+
406+
OnExplosionEvent(sourcePlayer, explosionType, position, explosionFx);
407+
}
408+
409+
public virtual void OnExplosionEvent(IPlayer sourcePlayer, ExplosionType explosionType, Position position, uint explosionFx)
410+
{
411+
foreach (var @delegate in ExplosionEventHandler.GetEvents())
412+
{
413+
@delegate(sourcePlayer, explosionType, position, explosionFx);
414+
}
415+
}
416+
417+
public void OnWeaponDamage(IntPtr playerPointer, IntPtr entityPointer, BaseObjectType entityType, uint weapon, ushort damage, Position shotOffset, BodyPart bodyPart)
418+
{
419+
if (!PlayerPool.GetOrCreate(playerPointer, out var sourcePlayer))
420+
{
421+
return;
422+
}
423+
424+
BaseEntityPool.GetOrCreate(entityPointer, entityType, out var targetEntity);
425+
426+
OnWeaponDamageEvent(sourcePlayer, targetEntity, weapon, damage, shotOffset, bodyPart);
427+
}
428+
429+
public virtual void OnWeaponDamageEvent(IPlayer sourcePlayer, IEntity targetEntity, uint weapon, ushort damage, Position shotOffset, BodyPart bodyPart)
430+
{
431+
foreach (var @delegate in WeaponDamageEventHandler.GetEvents())
432+
{
433+
@delegate(sourcePlayer, targetEntity, weapon, damage, shotOffset, bodyPart);
434+
}
435+
}
392436

393437
public void OnPlayerChangeVehicleSeat(IntPtr vehiclePointer, IntPtr playerPointer, byte oldSeat,
394438
byte newSeat)

api/AltV.Net/ModuleWrapper.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Runtime.CompilerServices;
33
using System.Runtime.Loader;
4+
using AltV.Net.Data;
45
using AltV.Net.Elements.Args;
56
using AltV.Net.Elements.Entities;
67
using AltV.Net.Native;
@@ -136,6 +137,18 @@ public static void OnPlayerDeath(IntPtr playerPointer, IntPtr killerEntityPointe
136137
_module.OnPlayerDeath(playerPointer, killerEntityPointer, killerBaseObjectType, weapon);
137138
}
138139

140+
public static void OnExplosion(IntPtr playerPointer, ExplosionType explosionType,
141+
Position position, uint explosionFx)
142+
{
143+
_module.OnExplosion(playerPointer, explosionType, position, explosionFx);
144+
}
145+
146+
public static void OnWeaponDamage(IntPtr playerPointer, IntPtr entityPointer,
147+
BaseObjectType entityType, uint weapon, ushort damage, Position shotOffset, BodyPart bodyPart)
148+
{
149+
_module.OnWeaponDamage(playerPointer, entityPointer, entityType, weapon, damage, shotOffset, bodyPart);
150+
}
151+
139152
public static void OnPlayerChangeVehicleSeat(IntPtr vehiclePointer, IntPtr playerPointer, byte oldSeat,
140153
byte newSeat)
141154
{

0 commit comments

Comments
 (0)