Skip to content

Commit dc08465

Browse files
committed
Added CollisionMap.
1 parent f12d4cb commit dc08465

File tree

4 files changed

+190
-3
lines changed

4 files changed

+190
-3
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
# Entities
1919
from _entities._collisions import CollisionHash
2020
from _entities._collisions import CollisionManager
21+
from _entities._collisions import CollisionMap
2122
from _entities._collisions import CollisionRules
2223
from _entities._collisions import CollisionSet
2324
from _entities._collisions import collision_manager
@@ -30,6 +31,7 @@
3031
'CollisionHash',
3132
'CollisionHook',
3233
'CollisionManager',
34+
'CollisionMap',
3335
'CollisionRules',
3436
'CollisionSet',
3537
'collision_manager',

src/core/modules/entities/entities_collisions.cpp

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -501,8 +501,12 @@ CCollisionCache *CCollisionManager::GetCache(unsigned int uiIndex)
501501
//-----------------------------------------------------------------------------
502502
// ICollisionRules class.
503503
//-----------------------------------------------------------------------------
504-
ICollisionRules::ICollisionRules()
504+
ICollisionRules::ICollisionRules(bool bRegister)
505505
{
506+
if (!bRegister) {
507+
return;
508+
}
509+
506510
static CCollisionManager *pManager = GetCollisionManager();
507511
pManager->RegisterRules(this);
508512
}
@@ -638,6 +642,18 @@ list CCollisionHash::GetPairs(void *pObject)
638642
//-----------------------------------------------------------------------------
639643
// CCollisionSet class.
640644
//-----------------------------------------------------------------------------
645+
CCollisionSet::CCollisionSet():
646+
ICollisionRules()
647+
{
648+
649+
}
650+
651+
CCollisionSet::CCollisionSet(bool bRegister):
652+
ICollisionRules(bRegister)
653+
{
654+
655+
}
656+
641657
void CCollisionSet::Add(CBaseEntityWrapper *pEntity)
642658
{
643659
if (Contains(pEntity)) {
@@ -703,6 +719,89 @@ bool CCollisionSet::ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther)
703719
};
704720

705721

722+
//-----------------------------------------------------------------------------
723+
// CCollisionMap class.
724+
//-----------------------------------------------------------------------------
725+
boost::shared_ptr<CCollisionSet> CCollisionMap::Find(CBaseEntityWrapper *pEntity)
726+
{
727+
boost::shared_ptr<CCollisionSet> spSet;
728+
spSet = m_mapSets[pEntity];
729+
730+
if (!get_pointer(spSet)) {
731+
if (!pEntity->IsNetworked()) {
732+
BOOST_RAISE_EXCEPTION(
733+
PyExc_ValueError,
734+
"Given entity is not networked."
735+
)
736+
}
737+
738+
spSet = boost::shared_ptr<CCollisionSet>(new CCollisionSet(false));
739+
m_mapSets[pEntity] = spSet;
740+
}
741+
742+
return spSet;
743+
}
744+
745+
void CCollisionMap::Remove(void *pObject)
746+
{
747+
m_mapSets.erase(pObject);
748+
}
749+
750+
void CCollisionMap::Clear()
751+
{
752+
m_mapSets.clear();
753+
}
754+
755+
bool CCollisionMap::Contains(void *pObject)
756+
{
757+
return m_mapSets.find(pObject) != m_mapSets.end();
758+
}
759+
760+
unsigned int CCollisionMap::GetSize()
761+
{
762+
return m_mapSets.size();
763+
}
764+
765+
bool CCollisionMap::HasElements()
766+
{
767+
return !m_mapSets.empty();
768+
}
769+
770+
object CCollisionMap::Iterate()
771+
{
772+
list oElements;
773+
774+
if (HasElements()) {
775+
for (boost::unordered_map<void *, boost::shared_ptr<CCollisionSet> >::const_iterator it = m_mapSets.begin();
776+
it != m_mapSets.end(); it++) {
777+
oElements.append(make_tuple(object(it->first), object(it->second)));
778+
}
779+
}
780+
781+
return oElements.attr("__iter__")();
782+
}
783+
784+
void CCollisionMap::OnEntityDeleted(CBaseEntity *pEntity)
785+
{
786+
for (boost::unordered_map<void *, boost::shared_ptr<CCollisionSet> >::const_iterator it = m_mapSets.begin();
787+
it != m_mapSets.end(); it++) {
788+
it->second->OnEntityDeleted(pEntity);
789+
}
790+
791+
Remove(pEntity);
792+
}
793+
794+
bool CCollisionMap::ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther)
795+
{
796+
CCollisionSet *pSet = get_pointer(m_mapSets[pEntity]);
797+
if (!pSet) {
798+
return true;
799+
}
800+
801+
return !pSet->Contains(pOther);
802+
}
803+
804+
706805
//-----------------------------------------------------------------------------
707806
// CCollisionListenerManager class.
708807
//-----------------------------------------------------------------------------

src/core/modules/entities/entities_collisions.h

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ struct CollisionHookData_t
110110
class ICollisionRules
111111
{
112112
public:
113-
ICollisionRules();
113+
ICollisionRules(bool bRegister = true);
114114
virtual ~ICollisionRules();
115115

116116
virtual void OnEntityDeleted(CBaseEntity *pEntity) = 0;
@@ -153,6 +153,9 @@ class CCollisionHash : public ICollisionRules
153153
class CCollisionSet : public ICollisionRules
154154
{
155155
public:
156+
CCollisionSet();
157+
CCollisionSet(bool bRegister);
158+
156159
void Add(CBaseEntityWrapper *pEntity);
157160
void Remove(void *pObject);
158161
void Clear(void *pObject);
@@ -171,6 +174,31 @@ class CCollisionSet : public ICollisionRules
171174
};
172175

173176

177+
//-----------------------------------------------------------------------------
178+
// CCollisionMap class.
179+
//-----------------------------------------------------------------------------
180+
class CCollisionMap: public ICollisionRules
181+
{
182+
public:
183+
void OnEntityDeleted(CBaseEntity *pEntity);
184+
bool ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther);
185+
186+
boost::shared_ptr<CCollisionSet> Find(CBaseEntityWrapper *pEntity);
187+
188+
void Remove(void *pObject);
189+
void Clear();
190+
191+
bool Contains(void *pObject);
192+
unsigned int GetSize();
193+
bool HasElements();
194+
195+
object Iterate();
196+
197+
private:
198+
boost::unordered_map<void *, boost::shared_ptr<CCollisionSet> > m_mapSets;
199+
};
200+
201+
174202
//-----------------------------------------------------------------------------
175203
// CCollisionCache class.
176204
//-----------------------------------------------------------------------------

src/core/modules/entities/entities_collisions_wrap.cpp

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ static void export_collision_manager(scope);
3939
static void export_collision_rules(scope);
4040
static void export_collision_hash(scope);
4141
static void export_collision_set(scope);
42+
static void export_collision_map(scope);
4243

4344

4445
//-----------------------------------------------------------------------------
@@ -50,6 +51,7 @@ DECLARE_SP_SUBMODULE(_entities, _collisions)
5051
export_collision_rules(_collisions);
5152
export_collision_hash(_collisions);
5253
export_collision_set(_collisions);
54+
export_collision_map(_collisions);
5355
}
5456

5557

@@ -169,7 +171,7 @@ void export_collision_hash(scope _collisions)
169171
//-----------------------------------------------------------------------------
170172
void export_collision_set(scope _collisions)
171173
{
172-
class_<CCollisionSet, bases<ICollisionRules> > CollisionSet(
174+
class_<CCollisionSet, boost::shared_ptr<CCollisionSet>, bases<ICollisionRules> > CollisionSet(
173175
"CollisionSet",
174176
"Collision rules where contained elements never collide with anything."
175177
);
@@ -218,3 +220,59 @@ void export_collision_set(scope _collisions)
218220
"Returns the amount of elements contained in the set."
219221
);
220222
}
223+
224+
225+
//-----------------------------------------------------------------------------
226+
// Exports CCollisionMap.
227+
//-----------------------------------------------------------------------------
228+
void export_collision_map(scope _collisions)
229+
{
230+
class_<CCollisionMap, bases<ICollisionRules> > CollisionMap(
231+
"CollisionMap",
232+
"Collision rules that overrides one-way collisions."
233+
);
234+
235+
// Methods...
236+
CollisionMap.def(
237+
"clear",
238+
&CCollisionMap::Clear,
239+
"Removes all elements from the map."
240+
);
241+
242+
// Special methods...
243+
CollisionMap.def(
244+
"__getitem__",
245+
&CCollisionMap::Find,
246+
"Returns the collision set associated with the given entity."
247+
);
248+
249+
CollisionMap.def(
250+
"__delitem__",
251+
&CCollisionMap::Remove,
252+
"Removes the collision set associated with the given entity."
253+
);
254+
255+
CollisionMap.def(
256+
"__bool__",
257+
&CCollisionMap::HasElements,
258+
"Returns whether the map is empty or not."
259+
);
260+
261+
CollisionMap.def(
262+
"__contains__",
263+
&CCollisionMap::Contains,
264+
"Returns whether the given element is in the map or not."
265+
);
266+
267+
CollisionMap.def(
268+
"__len__",
269+
&CCollisionMap::GetSize,
270+
"Returns the amount of elements contained in the map."
271+
);
272+
273+
CollisionMap.def(
274+
"__iter__",
275+
&CCollisionMap::Iterate,
276+
"Iterates over all elements contained in the map."
277+
);
278+
}

0 commit comments

Comments
 (0)