66#include " sn_bf_write.hpp"
77#include " net.hpp"
88
9- #include < inetmsghandler.h>
10- #include < cdll_int.h>
11- #include < scanning/symbolfinder.hpp>
129#include < GarrysMod/Lua/Helpers.hpp>
13- #include < detouring/classproxy .hpp>
10+ #include < GarrysMod/FunctionPointers .hpp>
1411#include < Platform.hpp>
1512
13+ #include < detouring/classproxy.hpp>
14+
15+ #include < inetmsghandler.h>
16+ #include < cdll_int.h>
17+
1618namespace Hooks
1719{
1820
@@ -64,17 +66,6 @@ namespace Hooks
6466 class CNetChanProxy : public Detouring::ClassProxy<CNetChan, CNetChanProxy>
6567 {
6668 private:
67-
68- #if defined SYSTEM_WINDOWS
69-
70- typedef bool ( __thiscall *ProcessMessages_t )( CNetChan *netchan, bf_read &buf );
71-
72- #else
73-
74- typedef bool ( *ProcessMessages_t )( CNetChan *netchan, bf_read &buf );
75-
76- #endif
77-
7869 typedef CNetChan TargetClass;
7970 typedef CNetChanProxy SubstituteClass;
8071
@@ -83,25 +74,12 @@ namespace Hooks
8374 return NetChannel::Get ( LUA, index );
8475 }
8576
86- static const char ProcessMessages_sig[];
87- static const size_t ProcessMessages_siglen;
88-
89- static ProcessMessages_t ProcessMessages_original;
77+ static FunctionPointers::CNetChan_ProcessMessages_t ProcessMessages_original;
9078
9179 public:
9280 static void Initialize ( GarrysMod::Lua::ILuaBase *LUA )
9381 {
94- {
95- SymbolFinder symfinder;
96-
97- ProcessMessages_original =
98- reinterpret_cast <ProcessMessages_t>( symfinder.Resolve (
99- global::engine_loader.GetModuleLoader ( ).GetModule ( ),
100- ProcessMessages_sig,
101- ProcessMessages_siglen
102- ) );
103- }
104-
82+ ProcessMessages_original = FunctionPointers::CNetChan_ProcessMessages ( );
10583 if ( ProcessMessages_original == nullptr )
10684 LUA->ThrowError ( " failed to locate CNetChan::ProcessMessages" );
10785 }
@@ -210,15 +188,19 @@ namespace Hooks
210188 {
211189 CNetChan *netchan = This ( );
212190
213- static uint8_t data[100000 ] = { 0 };
214191 if ( !buf.IsOverflowed ( ) )
215192 {
216- memcpy ( data, buf. GetBasePointer ( ), buf. GetNumBytesRead ( ) ) ;
193+ static uint8_t data[ 100000 ] = { 0 } ;
217194
218- int32_t bitsread = buf.GetNumBitsRead ( );
195+ const int32_t bytesread = buf.GetNumBytesRead ( );
196+ if ( bytesread > 0 )
197+ std::memcpy ( data, buf.GetBasePointer ( ), bytesread );
198+
199+ const int32_t bitsread = buf.GetNumBitsRead ( );
219200 bf_write write ( data, sizeof ( data ) );
220201 write.SeekToBit ( bitsread );
221202
203+ bool handled = false ;
222204 HOOK_INIT ( " PreProcessMessages" );
223205 HOOK_PUSH ( NetChannel::Push ( LUA, netchan ) );
224206 HOOK_PUSH ( bf_read **reader = sn_bf_read::Push ( LUA, &buf ) );
@@ -232,18 +214,27 @@ namespace Hooks
232214 ) );
233215 }
234216
235- HOOK_CALL ( 0 );
217+ if ( HOOK_CALL ( 1 ) )
218+ {
219+ if ( LUA->IsType ( -1 , GarrysMod::Lua::Type::BOOL ) )
220+ handled = LUA->GetBool ( -1 );
221+
222+ LUA->Pop ( 1 );
223+ }
236224
237225 *reader = nullptr ;
238226 *writer = nullptr ;
239227 HOOK_END ( );
240228
241- buf.StartReading (
242- write.GetBasePointer ( ),
243- write.GetNumBytesWritten ( ),
244- bitsread,
245- write.GetNumBitsWritten ( )
246- );
229+ if ( handled )
230+ buf.StartReading (
231+ write.GetBasePointer ( ),
232+ write.GetNumBytesWritten ( ),
233+ bitsread,
234+ write.GetNumBitsWritten ( )
235+ );
236+ else
237+ buf.Seek ( bitsread );
247238 }
248239
249240 return Call<bool , bf_read &>( ProcessMessages_original, buf );
@@ -262,28 +253,7 @@ namespace Hooks
262253
263254 CNetChanProxy CNetChanProxy::Singleton;
264255
265- #if defined SYSTEM_WINDOWS
266-
267- const char CNetChanProxy::ProcessMessages_sig[] = " \x55\x8B\xEC\x83\xEC\x2C\xF7\x05 " ;
268- const size_t CNetChanProxy::ProcessMessages_siglen =
269- sizeof ( CNetChanProxy::ProcessMessages_sig ) - 1 ;
270-
271- #elif ( defined SYSTEM_LINUX && defined SOURCENET_SERVER ) || defined SYSTEM_MACOSX
272-
273- const char CNetChanProxy::ProcessMessages_sig[] =
274- " @_ZN8CNetChan15ProcessMessagesER7bf_read" ;
275- const size_t CNetChanProxy::ProcessMessages_siglen = 0 ;
276-
277- #elif defined SYSTEM_LINUX && defined SOURCENET_CLIENT
278-
279- const char CNetChanProxy::ProcessMessages_sig[] =
280- " \x55\x89\xE5\x57\x56\x53\x83\xEC\x6C\x8B\x3D\x2A\x2A\x2A\x2A\x8B " ;
281- const size_t CNetChanProxy::ProcessMessages_siglen =
282- sizeof ( CNetChanProxy::ProcessMessages_sig ) - 1 ;
283-
284- #endif
285-
286- CNetChanProxy::ProcessMessages_t CNetChanProxy::ProcessMessages_original = nullptr ;
256+ FunctionPointers::CNetChan_ProcessMessages_t CNetChanProxy::ProcessMessages_original = nullptr ;
287257
288258 class INetChannelHandlerProxy : public Detouring ::ClassProxy<INetChannelHandler, INetChannelHandlerProxy>
289259 {
0 commit comments