Skip to content

Commit f129713

Browse files
authored
Entity collision and transmission functionalities. (#484)
Adds entity collision and transmission functionalities.
1 parent fe82f6b commit f129713

26 files changed

+4048
-6
lines changed

Diff for: addons/source-python/data/source-python/entities/bms/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@
4949
offset_windows = 109
5050
arguments = POINTER
5151

52+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
53+
[[get_solid_mask]]
54+
offset_linux = 180
55+
offset_windows = 179
56+
return_type = UINT
57+
5258

5359
[input]
5460

Diff for: addons/source-python/data/source-python/entities/csgo/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,9 @@ srv_check = False
5151
offset_linux = 105
5252
offset_windows = 104
5353
arguments = POINTER
54+
55+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
56+
[[get_solid_mask]]
57+
offset_linux = 169
58+
offset_windows = 168
59+
return_type = UINT

Diff for: addons/source-python/data/source-python/entities/gmod/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@
4848
offset_linux = 103
4949
offset_windows = 102
5050
arguments = POINTER
51+
52+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
53+
[[get_solid_mask]]
54+
offset_linux = 173
55+
offset_windows = 172
56+
return_type = UINT

Diff for: addons/source-python/data/source-python/entities/l4d2/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@
4848
offset_linux = 110
4949
offset_windows = 109
5050
arguments = POINTER
51+
52+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
53+
[[get_solid_mask]]
54+
offset_linux = 178
55+
offset_windows = 177
56+
return_type = UINT

Diff for: addons/source-python/data/source-python/entities/orangebox/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@
4949
offset_windows = 100
5050
arguments = POINTER
5151

52+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
53+
[[get_solid_mask]]
54+
offset_linux = 168
55+
offset_windows = 167
56+
return_type = UINT
57+
5258

5359
[input]
5460

Diff for: addons/source-python/data/source-python/entities/orangebox/tf/CBaseEntity.ini

+6
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@
4848
offset_linux = 106
4949
offset_windows = 105
5050
arguments = POINTER
51+
52+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
53+
[[get_solid_mask]]
54+
offset_linux = 174
55+
offset_windows = 173
56+
return_type = UINT

Diff for: addons/source-python/docs/source-python/source/developing/module_tutorials/listeners.rst

+86
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,48 @@ Called when a networked entity has been spawned.
324324
pass
325325
326326
327+
OnEntityCollision
328+
-----------------
329+
330+
Called when a non-player entity is about to collide with another entity.
331+
332+
.. note::
333+
334+
This listener can be extremely noisy. Use :class:`entities.collisions.CollisionHash`,
335+
:class:`entities.collisions.CollisionMap`, or :class:`entities.collisions.CollisionSet`
336+
if you don't have dynamic conditions to test for.
337+
338+
.. code-block:: python
339+
340+
from listeners import OnEntityCollision
341+
342+
@OnEntityCollision
343+
def on_entity_collision(entity, other):
344+
# Disable weapons/projectiles collisions with everything except players
345+
return not (entity.is_weapon() and not other.is_player())
346+
347+
348+
OnEntityTransmit
349+
----------------
350+
351+
Called when a non-player entity is about to be transmitted to a player.
352+
353+
.. note::
354+
355+
This listener can be extremely noisy. Use :class:`entities.transmit.TransmitHash`,
356+
:class:`entities.transmit.TransmitMap`, or :class:`entities.transmit.TransmitSet`
357+
if you don't have dynamic conditions to test for.
358+
359+
.. code-block:: python
360+
361+
from listeners import OnEntityTransmit
362+
363+
@OnEntityTransmit
364+
def on_entity_transmit(player, entity):
365+
# Never transmit hostages
366+
return entity.classname != 'hostage_entity'
367+
368+
327369
OnLevelInit
328370
-----------
329371

@@ -406,6 +448,50 @@ Called when the button state of a player changed.
406448
button or button combination has been pressed or released.
407449

408450

451+
OnPlayerCollision
452+
-----------------
453+
454+
Called when a player is about to collide with an entity.
455+
456+
.. note::
457+
458+
This listener can be extremely noisy. Use :class:`entities.collisions.CollisionHash`,
459+
:class:`entities.collisions.CollisionMap`, or :class:`entities.collisions.CollisionSet`
460+
if you don't have dynamic conditions to test for.
461+
462+
.. code-block:: python
463+
464+
from listeners import OnPlayerCollision
465+
466+
@OnPlayerCollision
467+
def on_player_collision(player, entity):
468+
# Disable teammates collisions
469+
if not entity.is_player():
470+
return
471+
return player.team_index != entity.team_index
472+
473+
474+
OnPlayerTransmit
475+
----------------
476+
477+
Called when a player is about to be transmitted to another.
478+
479+
.. note::
480+
481+
This listener can be extremely noisy. Use :class:`entities.transmit.TransmitHash`,
482+
:class:`entities.transmit.TransmitMap`, or :class:`entities.transmit.TransmitSet`
483+
if you don't have dynamic conditions to test for.
484+
485+
.. code-block:: python
486+
487+
from listeners import OnPlayerTransmit
488+
489+
@OnPlayerTransmit
490+
def on_player_transmit(player, other):
491+
# Don't transmit teammates
492+
return player.team != other.team
493+
494+
409495
OnPlayerRunCommand
410496
--------------------
411497

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
entities.collisions module
2+
==========================
3+
4+
.. automodule:: entities.collisions
5+
:members:
6+
:undoc-members:
7+
:show-inheritance:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
entities.transmit module
2+
========================
3+
4+
.. automodule:: entities.transmit
5+
:members:
6+
:undoc-members:
7+
:show-inheritance:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# ../entities/collisions.py
2+
3+
"""Provides entity collisions functionality."""
4+
5+
# =============================================================================
6+
# >> IMPORTS
7+
# =============================================================================
8+
# Source.Python Imports
9+
# Core
10+
from core import AutoUnload
11+
from core import WeakAutoUnload
12+
13+
14+
# =============================================================================
15+
# >> FORWARD IMPORTS
16+
# =============================================================================
17+
# Source.Python Imports
18+
# Entities
19+
from _entities._collisions import BaseCollisionRules
20+
from _entities._collisions import CollisionHash
21+
from _entities._collisions import CollisionManager
22+
from _entities._collisions import CollisionMap
23+
from _entities._collisions import CollisionMode
24+
from _entities._collisions import CollisionSet
25+
from _entities._collisions import collision_manager
26+
27+
28+
# =============================================================================
29+
# >> ALL DECLARATION
30+
# =============================================================================
31+
__all__ = ('BaseCollisionRules',
32+
'CollisionHash',
33+
'CollisionHook',
34+
'CollisionManager',
35+
'CollisionMap',
36+
'CollisionMode',
37+
'CollisionSet',
38+
'collision_manager',
39+
)
40+
41+
42+
# =============================================================================
43+
# >> INITIALIZATION
44+
# =============================================================================
45+
# Inject WeakAutoUnload into BaseCollisionRules's hierarchy.
46+
if not issubclass(BaseCollisionRules, WeakAutoUnload):
47+
BaseCollisionRules.__bases__ = (
48+
WeakAutoUnload,) + BaseCollisionRules.__bases__
49+
50+
51+
# =============================================================================
52+
# >> CLASSES
53+
# =============================================================================
54+
class CollisionHook(AutoUnload):
55+
"""Decorator used to create collision hooks that auto unload.
56+
57+
Example:
58+
59+
.. code:: python
60+
61+
from engines.trace import ContentFlags
62+
from entities.collisions import CollisionHook
63+
64+
@CollisionHook
65+
def collision_hook(entity, other, trace_filter, mask):
66+
# Prevent hostages from being killed by bullets
67+
if not mask & ContentFlags.HITBOX:
68+
return
69+
return other.classname != 'hostage_entity'
70+
"""
71+
72+
def __init__(self, callback):
73+
"""Registers the collision hook.
74+
75+
:param function callback:
76+
Function to register as a collision hook callback.
77+
"""
78+
self.callback = callback
79+
collision_manager.register_hook(callback)
80+
81+
def _unload_instance(self):
82+
"""Unregisters the collision hook.
83+
84+
:param function callback:
85+
Function to unregister as a collision hook callback.
86+
"""
87+
collision_manager.unregister_hook(self.callback)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# ../entities/transmit.py
2+
3+
"""Provides entity transmission functionality."""
4+
5+
# =============================================================================
6+
# >> IMPORTS
7+
# =============================================================================
8+
# Source.Python Imports
9+
# Core
10+
from core import AutoUnload
11+
from core import WeakAutoUnload
12+
13+
14+
# =============================================================================
15+
# >> FORWARD IMPORTS
16+
# =============================================================================
17+
# Source.Python Imports
18+
# Entities
19+
from _entities._transmit import BaseTransmitRules
20+
from _entities._transmit import TransmitHash
21+
from _entities._transmit import TransmitManager
22+
from _entities._transmit import TransmitMap
23+
from _entities._transmit import TransmitMode
24+
from _entities._transmit import TransmitSet
25+
from _entities._transmit import TransmitStates
26+
from _entities._transmit import transmit_manager
27+
28+
29+
# =============================================================================
30+
# >> ALL DECLARATION
31+
# =============================================================================
32+
__all__ = ('BaseTransmitRules',
33+
'TransmitHash',
34+
'TransmitHook',
35+
'TransmitManager',
36+
'TransmitMap',
37+
'TransmitMode',
38+
'TransmitSet',
39+
'TransmitStates',
40+
'transmit_manager',
41+
)
42+
43+
44+
# =============================================================================
45+
# >> INITIALIZATION
46+
# =============================================================================
47+
# Inject WeakAutoUnload into BaseTransmitRules's hierarchy.
48+
if not issubclass(BaseTransmitRules, WeakAutoUnload):
49+
BaseTransmitRules.__bases__ = (
50+
WeakAutoUnload,) + BaseTransmitRules.__bases__
51+
52+
53+
# =============================================================================
54+
# >> CLASSES
55+
# =============================================================================
56+
class TransmitHook(AutoUnload):
57+
"""Decorator used to create transmit hooks that auto unload.
58+
59+
Example:
60+
61+
.. code:: python
62+
63+
from entities.transmit import TransmitHook
64+
65+
@TransmitHook
66+
def transmit_hook(player, indexes, states):
67+
# Don't transmit anything to this player except himself
68+
player_index = player.index
69+
for index in indexes:
70+
if index == player_index:
71+
continue
72+
states[index] = False
73+
"""
74+
75+
def __init__(self, callback):
76+
"""Registers the transmit hook.
77+
78+
:param function callback:
79+
Function to register as a transmit hook callback.
80+
"""
81+
self.callback = callback
82+
transmit_manager.register_hook(callback)
83+
84+
def _unload_instance(self):
85+
"""Unregisters the transmit hook.
86+
87+
:param function callback:
88+
Function to unregister as a transmit hook callback.
89+
"""
90+
transmit_manager.unregister_hook(self.callback)

0 commit comments

Comments
 (0)