Skip to content

Commit fa85a5a

Browse files
committed
Solid masks are now resolved dynamically.
1 parent 62730cf commit fa85a5a

File tree

10 files changed

+78
-38
lines changed

10 files changed

+78
-38
lines changed

addons/source-python/data/source-python/entities/bms/CBaseEntity.ini

Lines changed: 6 additions & 0 deletions
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 = 181
55+
offset_windows = 180
56+
return_type = UINT
57+
5258

5359
[input]
5460

addons/source-python/data/source-python/entities/csgo/CBaseEntity.ini

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,10 @@ srv_check = False
5151
offset_linux = 105
5252
offset_windows = 104
5353
arguments = POINTER
54+
55+
# _ZNK11CBasePlayer25PhysicsSolidMaskForEntityEv
56+
# https://gist.github.com/jordanbriere/679e6d09ebaa9830979b6f60e61d4b9c
57+
[[get_solid_mask]]
58+
offset_linux = 169
59+
offset_windows = 168
60+
return_type = UINT

addons/source-python/data/source-python/entities/gmod/CBaseEntity.ini

Lines changed: 6 additions & 0 deletions
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

addons/source-python/data/source-python/entities/l4d2/CBaseEntity.ini

Lines changed: 6 additions & 0 deletions
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

addons/source-python/data/source-python/entities/orangebox/CBaseEntity.ini

Lines changed: 6 additions & 0 deletions
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

addons/source-python/packages/source-python/entities/collisions.py

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
# >> ALL DECLARATION
3030
# =============================================================================
3131
__all__ = [
32-
'SOLID_MASKS',
3332
'BaseCollisionHash',
3433
'CollisionHash',
3534
'CollisionHook',
@@ -46,30 +45,6 @@
4645
BaseCollisionHash.__bases__ = (AutoUnload,) + BaseCollisionHash.__bases__
4746

4847

49-
# =============================================================================
50-
# >> GLOBAL VARIABLES
51-
# =============================================================================
52-
#: Masks that are considered solid.
53-
SOLID_MASKS = (
54-
ContentMasks.SOLID,
55-
ContentMasks.PLAYER_SOLID,
56-
ContentMasks.NPC_SOLID,
57-
58-
# Teams
59-
ContentMasks.PLAYER_SOLID | ContentFlags.TEAM1,
60-
ContentMasks.PLAYER_SOLID | ContentFlags.TEAM2,
61-
)
62-
63-
# Assign masks that are considered solid for the current game.
64-
if GAME_NAME == 'csgo':
65-
SOLID_MASKS += (
66-
# Projectiles
67-
(ContentFlags.CURRENT_90 | ContentMasks.SOLID |
68-
ContentMasks.VISIBLE_AND_NPCS | ContentFlags.HITBOX
69-
) & ~ContentFlags.DEBRIS,
70-
)
71-
72-
7348
# =============================================================================
7449
# >> CLASSES
7550
# =============================================================================

src/core/modules/entities/entities_collisions.cpp

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,6 @@ void CCollisionManager::Initialize()
8888
return;
8989
}
9090

91-
BEGIN_BOOST_PY()
92-
static boost::python::tuple oSolidMasks(import("entities.collisions").attr("SOLID_MASKS"));
93-
for (int i = 0; i < len(oSolidMasks); i++) {
94-
m_setSolidMasks.insert(extract<unsigned long>(object(oSolidMasks[i])));
95-
}
96-
END_BOOST_PY()
97-
9891
RegisterHook(&IEngineTrace::TraceRay, 3, 2, "TraceRay");
9992
RegisterHook(&IEngineTrace::TraceRayAgainstLeafAndEntityList, 4, 3, "TraceRayAgainstLeafAndEntityList");
10093
RegisterHook(&IEngineTrace::SweepCollideable, 6, 5, "SweepCollideable");
@@ -121,7 +114,6 @@ void CCollisionManager::Finalize()
121114
}
122115

123116
m_mapHooks.clear();
124-
m_setSolidMasks.clear();
125117

126118
m_bInitialized = false;
127119
}
@@ -148,6 +140,18 @@ void CCollisionManager::UnregisterHash(ICollisionHash *pHash)
148140
DecRef();
149141
}
150142

143+
void CCollisionManager::OnNetworkedEntityCreated(object oEntity)
144+
{
145+
BEGIN_BOOST_PY()
146+
unsigned int uiMask = extract<unsigned long>(oEntity.attr("get_solid_mask")());
147+
if (m_setSolidMasks.find(uiMask) == m_setSolidMasks.end()) {
148+
m_setSolidMasks.insert(uiMask);
149+
m_setSolidMasks.insert(uiMask | CONTENTS_TEAM1);
150+
m_setSolidMasks.insert(uiMask | CONTENTS_TEAM2);
151+
}
152+
END_BOOST_PY()
153+
}
154+
151155
void CCollisionManager::OnNetworkedEntityDeleted(CBaseEntity *pEntity)
152156
{
153157
FOR_EACH_VEC(m_vecHashes, i) {
@@ -167,6 +171,22 @@ void CCollisionManager::UnregisterCollisionHook(object oCallback)
167171
DecRef();
168172
}
169173

174+
list CCollisionManager::GetSolidMasks()
175+
{
176+
list oMasks;
177+
178+
if (!m_setSolidMasks.size()) {
179+
return oMasks;
180+
}
181+
182+
static object ContentFlags = import("engines").attr("trace").attr("ContentFlags");
183+
for (boost::unordered_set<unsigned long>::const_iterator it=m_setSolidMasks.begin(); it != m_setSolidMasks.end(); it++) {
184+
oMasks.append(ContentFlags(*it));
185+
}
186+
187+
return oMasks;
188+
}
189+
170190
template<typename T>
171191
void CCollisionManager::RegisterHook(T tFunc, unsigned int uiFilterIndex, unsigned int uiMaskIndex, const char *szDebugName)
172192
{

src/core/modules/entities/entities_collisions.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,14 @@ class CCollisionManager
186186
void RegisterHash(ICollisionHash *pHash);
187187
void UnregisterHash(ICollisionHash *pHash);
188188

189+
void OnNetworkedEntityCreated(object oEntity);
189190
void OnNetworkedEntityDeleted(CBaseEntity *pEntity);
190191

191192
void RegisterCollisionHook(object oCallback);
192193
void UnregisterCollisionHook(object oCallback);
193194

195+
list GetSolidMasks();
196+
194197
protected:
195198
void IncRef();
196199
void DecRef();

src/core/modules/entities/entities_collisions_wrap.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ void export_collision_manager(scope _collisions)
7171
"Unregisters a collision hook."
7272
);
7373

74+
// Properties...
75+
CollisionManager.add_property(
76+
"solid_masks",
77+
&CCollisionManager::GetSolidMasks,
78+
"Returns a list containing the masks that are currently considered solid."
79+
);
80+
7481
// Singleton...
7582
_collisions.attr("collision_manager") = object(ptr(GetCollisionManager()));
7683
}

src/core/sp_main.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -647,16 +647,20 @@ void CSourcePython::OnEntityCreated( CBaseEntity *pEntity )
647647

648648
CALL_LISTENERS(OnEntityCreated, ptr((CBaseEntityWrapper*) pEntity));
649649

650-
GET_LISTENER_MANAGER(OnNetworkedEntityCreated, on_networked_entity_created_manager);
651-
if (!on_networked_entity_created_manager->GetCount())
652-
return;
653-
654650
unsigned int uiIndex;
655651
if (!IndexFromBaseEntity(pEntity, uiIndex))
656652
return;
657653

658654
static object Entity = import("entities").attr("entity").attr("Entity");
659-
CALL_LISTENERS_WITH_MNGR(on_networked_entity_created_manager, Entity(uiIndex));
655+
object oEntity = Entity(uiIndex);
656+
657+
GET_LISTENER_MANAGER(OnNetworkedEntityCreated, on_networked_entity_created_manager);
658+
if (on_networked_entity_created_manager->GetCount()) {
659+
CALL_LISTENERS_WITH_MNGR(on_networked_entity_created_manager, oEntity);
660+
}
661+
662+
static CCollisionManager *pCollisionManager = GetCollisionManager();
663+
pCollisionManager->OnNetworkedEntityCreated(oEntity);
660664
}
661665

662666
void CSourcePython::OnEntitySpawned( CBaseEntity *pEntity )

0 commit comments

Comments
 (0)