Skip to content

Commit a09a79b

Browse files
committed
- Listeners should all work now
1 parent 97625a6 commit a09a79b

File tree

4 files changed

+50
-78
lines changed

4 files changed

+50
-78
lines changed

src/core/addons/sp_addon.cpp

Lines changed: 38 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -206,40 +206,50 @@ void CAddonManager::ClientSettingsChanged( edict_t *pEdict )
206206
//---------------------------------------------------------------------------------
207207
// Calls client connect listeners.
208208
//---------------------------------------------------------------------------------
209-
void CAddonManager::ClientConnect( bool *bAllowConnect, edict_t *pEntity, const char *pszName, const char *pszAddress, char *reject, int maxrejectlen )
209+
void CAddonManager::ClientConnect( bool *bAllowConnect, edict_t *pEntity,
210+
const char *pszName, const char *pszAddress, char *reject, int maxrejectlen )
210211
{
211212
// Wrap the parameters
212213
CListenerManager::Param p1, p2, p3, p4, p5, p6;
213214

214-
p1.name="is_allowed_to_connect";
215-
p1.type=CListenerManager::BOOL;
216-
p1.bool_value=bAllowConnect;
215+
p1.name="edict";
216+
p1.type=CListenerManager::EDICT_T_PTR;
217+
p1.edict_t_ptr=pEntity;
217218

218-
p2.name="edict";
219-
p2.type=CListenerManager::EDICT_T_PTR;
220-
p2.edict_t_ptr=pEntity;
219+
p2.name="playername";
220+
p2.type=CListenerManager::CONST_CHAR_PTR;
221+
p2.const_char_ptr=pszName;
221222

222-
p3.name="playername";
223+
p3.name="network_address";
223224
p3.type=CListenerManager::CONST_CHAR_PTR;
224-
p3.const_char_ptr=pszName;
225+
p3.const_char_ptr=pszAddress;
225226

226-
p4.name="network_address";
227-
p4.type=CListenerManager::CONST_CHAR_PTR;
228-
p4.const_char_ptr=pszAddress;
227+
p4.name="max_reject_len";
228+
p4.type=CListenerManager::INT;
229+
p4.int_value=maxrejectlen;
229230

230-
// Is this an int? Maybe just convert and remove unnused CHAR_PTR
231+
// Must be casted in order to avoid crash
232+
// TODO: Maybe in the future this can done properly, so people can reject the
233+
// connection from python, but for now it's read-only
234+
const char* reject_copy = reject;
231235
p5.name="reject";
232-
p5.type=CListenerManager::CHAR_PTR;
233-
p5.char_ptr=reject;
236+
p5.type=CListenerManager::CONST_CHAR_PTR;
237+
p5.const_char_ptr=reject_copy;
234238

235-
p6.name="max_recject_len";
236-
p6.type=CListenerManager::INT;
237-
p6.int_value=maxrejectlen;
239+
p6.name="is_allowed_to_connect";
240+
p6.type=CListenerManager::BOOL;
241+
p6.bool_value=&bAllowConnect;
242+
238243
// Dispatch all LevelInit listeners
239244
get_client_connect_listener_manager()->call_listeners(6, p1, p2, p3, p4, p5, p6);
240245
}
241246

242-
void CAddonManager::OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue )
247+
//---------------------------------------------------------------------------------
248+
// Calls on query cvar value finished listeners.
249+
//---------------------------------------------------------------------------------
250+
void CAddonManager::OnQueryCvarValueFinished( QueryCvarCookie_t iCookie,
251+
edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName,
252+
const char *pCvarValue )
243253
{
244254
// Wrap the parameters
245255
CListenerManager::Param p1, p2, p3, p4, p5;
@@ -253,9 +263,9 @@ void CAddonManager::OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t
253263
p2.type=CListenerManager::EDICT_T_PTR;
254264
p2.edict_t_ptr=pPlayerEntity;
255265

256-
p3.name="edict";
257-
p3.type=CListenerManager::EDICT_T_PTR;
258-
p3.edict_t_ptr=pPlayerEntity;
266+
p3.name="cookie_status";
267+
p3.type=CListenerManager::INT;
268+
p3.int_value=static_cast<int>(eStatus);
259269

260270
p4.name="cvar_name";
261271
p4.type=CListenerManager::CONST_CHAR_PTR;
@@ -298,16 +308,16 @@ void CAddonManager::OnEdictAllocated( edict_t *edict )
298308
void CAddonManager::OnEdictFreed( const edict_t *edict )
299309
{
300310
// Wrap the parameters
301-
/*CListenerManager::Param p1;
302-
303-
TODO: Const edict
311+
CListenerManager::Param p1;
304312

305313
p1.name="edict";
306314
p1.type=CListenerManager::EDICT_T_PTR;
307-
p1.edict_t_ptr=edict;
315+
// This might not be a good idea, who knows :P
316+
p1.edict_t_ptr=const_cast<edict_t*>(edict);
317+
308318
// Dispatch all LevelInit listeners
309-
get_on_edict_freed_listener_manager()->call_listeners(1, p1);*/
319+
get_on_edict_freed_listener_manager()->call_listeners(1, p1);
310320

311-
get_on_edict_freed_listener_manager()->call_listeners(0);
321+
//get_on_edict_freed_listener_manager()->call_listeners(0);
312322
}
313323
#endif

src/core/modules/listeners/client_connect_listeners_wrap.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ class CClientConnectListenerManager: public CListenerManager
4040
{
4141
};
4242

43+
//-----------------------------------------------------------------------------
44+
// ClientConnectListenerManager accessor.
45+
//-----------------------------------------------------------------------------
46+
4347
CClientConnectListenerManager* get_client_connect_listener_manager();
4448

4549
#endif // _CLIENT_CONNECT_LISTENER_MANAGER_H

src/core/modules/listeners/listenermanager.cpp

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,15 @@ void CListenerManager::call_listeners(int argc, ...)
5353
Param p = va_arg(varargs, Param);
5454
switch (p.type)
5555
{
56-
case CListenerManager::INT:
57-
dReturn[p.name] = p.int_value;
58-
break;
5956
case CListenerManager::BOOL:
6057
dReturn[p.name] = p.bool_value;
6158
break;
59+
case CListenerManager::INT:
60+
dReturn[p.name] = p.int_value;
61+
break;
6262
case CListenerManager::CONST_CHAR_PTR:
6363
dReturn[p.name] = p.const_char_ptr;
6464
break;
65-
case CListenerManager::CHAR_PTR:
66-
dReturn[p.name] = p.char_ptr;
67-
break;
6865
case CListenerManager::EDICT_T_PTR:
6966
dReturn[p.name] = CEdict(p.edict_t_ptr);
7067
}
@@ -99,38 +96,4 @@ void CListenerManager::call_listeners(int argc, ...)
9996
END_BOOST_PY_NORET()
10097
}
10198
}
102-
}
103-
104-
/*
105-
void CListenerManager::call_listeners()
106-
{
107-
for(int i = 0; i < m_vecCallables.Count(); i++)
108-
{
109-
BEGIN_BOOST_PY()
110-
111-
// Get the PyObject instance of the callable
112-
PyObject* pCallable = m_vecCallables[i].ptr();
113-
114-
// Call the callable
115-
CALL_PY_FUNC(pCallable);
116-
117-
END_BOOST_PY_NORET()
118-
}
119-
}
120-
121-
void CListenerManager::call_listeners( edict_t *pEntity )
122-
{
123-
for(int i = 0; i < m_vecCallables.Count(); i++)
124-
{
125-
BEGIN_BOOST_PY()
126-
127-
// Get the PyObject instance of the callable
128-
PyObject* pCallable = m_vecCallables[i].ptr();
129-
130-
// Call the callable
131-
CALL_PY_FUNC(pCallable, pEntity);
132-
133-
END_BOOST_PY_NORET()
134-
}
135-
}
136-
*/
99+
}

src/core/modules/listeners/listenermanager.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,18 @@ class CListenerManager
1616
public:
1717

1818
enum types {
19-
INT=0,
20-
BOOL, // Only used in ClientConnect
19+
BOOL,
20+
INT,
2121
CONST_CHAR_PTR,
22-
CHAR_PTR, // Only used in ClientConnect
23-
EDICT_T_PTR,
22+
EDICT_T_PTR
2423
};
2524

2625
struct Param {
2726
int type;
2827
const char* name; // For naming in the dict
2928
union {
30-
int int_value;
3129
bool bool_value;
32-
char* char_ptr;
30+
int int_value;
3331
const char* const_char_ptr;
3432
edict_t* edict_t_ptr;
3533
};
@@ -39,9 +37,6 @@ class CListenerManager
3937
void unregister_listener(PyObject* pCallable);
4038

4139
void call_listeners(int argc, ...);
42-
/*void call_listeners();
43-
// A lot of listener just pass an entity pointer
44-
void call_listeners( edict_t *pEntity );*/
4540

4641
protected:
4742
CUtlVector<object> m_vecCallables;

0 commit comments

Comments
 (0)