600 Commits

Author SHA1 Message Date
Kawe Mazidjatari
99edd0229d Localize: add language codes
Newly added g_LanguageCodes maps directly with g_LanguageNames.
2024-06-01 11:52:53 +02:00
Kawe Mazidjatari
30c514110f Tier1: fix ctor bug in class bf_read
Parameter 'nBytes' was unused while it should've been, causing invalid buffer sizes being set. Bug was found after careful inspection of generation assembly code.
2024-06-01 11:52:53 +02:00
Kawe Mazidjatari
df363414df Engine: fix numerous exploitable bugs in voice protocol
- Fixed stack smash in CClient:ProcessVoiceData (oob read on bitbuf).
- Fixed stack smash in CClient:ProcessDurangoVoiceData (oob read on bitbuf).
- Fixed ability to bypass team check on Durango voice packets if forced as reliable from the sender (client).
- Incorporated the following missing checks in the durango version of voice broadcasting:
  - Enforce chat between multiple teams using cvar 'sv_alltalk'.
  - Ability to also disable Durango voice data with cvar 'sv_voiceenable'.
  - Ability to echo voice with Durango voice data using cvar 'sv_voiceEcho'.
2024-06-01 11:52:52 +02:00
Kawe Mazidjatari
299ab763e4 VpkLib: light cleanup
Improve global names, initialize VPKDirHeader_t structure, make inlines for checking if language or target exists.
2024-06-01 11:49:15 +02:00
Kawe Mazidjatari
8cfcc00bc5 PluginSystem: add callback for chatroom receiver
Allow plugins to block chat msg's based on their text.
2024-06-01 11:49:15 +02:00
Kawe Mazidjatari
3883597cb2 RTech: fix bitwise order in define
Put in parentheses.
2024-06-01 11:49:14 +02:00
Kawe Mazidjatari
0cea07ab8f VScript: properly implement script command callback
Previously we did sq_pushroottable() and a subsequent sq_call() after compiling the text buffer, but this didn't work for code that was threaded, or using Get/SetNetVar* functions.

The second issue was that the callback for the "script" command was ran in the main thread. Server script should always run in the server frame thread, the Set/GetNetVar* functions check thread id to retrieve the correct VM context, so running server script from the main thread ended up with Set/GetNetVar* functions retrieving the client VM context rather than server's, causing undefined behavior.

Script commands are now queued to the server frame thread, ultimately fixing this bug.

Also fixed a small bug with function 'sq_compilebuffer()'; it takes an extra argument but this wasn't taken into account in the SDK.
2024-06-01 11:49:13 +02:00
Kawe Mazidjatari
639f4741b1 VScript: add ScriptStatus_t enum
Enum values are correct based on 'CSquirrelVM::ExecuteFunction()'.
2024-06-01 11:46:05 +02:00
Kawe Mazidjatari
d80268492a Tier1: fix typo in byteswap.h 2024-06-01 11:43:09 +02:00
Kawe Mazidjatari
890ffa923e Launcher: light overhaul and use KeyValues class
Reworked some of the code to make globals static and used KeyValues class to parse VDF files instead.
2024-06-01 11:35:07 +02:00
Kawe Mazidjatari
2c5e272c30 Tier0: bump sigcache version to force full rebuild
Many signatures have changed, force a full rebuild for the next patch to significantly speed up startup times.
2024-06-01 11:30:36 +02:00
Kawe Mazidjatari
bc7a26b170 Game: make GameMode_t an enum class
Used as enum class throughout code base, avoids potential name clashes in the future.
2024-06-01 11:30:35 +02:00
Kawe Mazidjatari
824b5098b3 Game: add CBaseEntity::GetFlags() and FL_FAKECLIENT constant 2024-06-01 11:25:59 +02:00
Kawe Mazidjatari
cdaf4f1b76 Game: fixup types in CPlayerState 2024-06-01 11:25:59 +02:00
Kawe Mazidjatari
2587392f88 RTech: use more consistent type names
Force consistency between type names (follow scheme used in tier0 and rtech_game export symbols).
2024-06-01 11:25:58 +02:00
Kawe Mazidjatari
dea96ddf31 RTech: rename pak defines
More correct and consistent naming.
2024-06-01 11:25:58 +02:00
Kawe Mazidjatari
90e4711425 Tier2: move random generator from tier0 to tier2
Moved into cryptutils.cpp.
2024-06-01 11:25:58 +02:00
Kawe Mazidjatari
b26ed2f746 Engine: implement encryption for RCON protocol
RCON lacked encryption, added AES-CTR encryption on RCON frames. Slightly adjusted protocol to take this into account (sending nonces, encrypted data itself, etc).
2024-06-01 11:24:47 +02:00
Kawe Mazidjatari
7a24371f64 Tier1: add utlhash
Core SourceSDK type.
2024-04-05 18:40:37 +02:00
Kawe Mazidjatari
1e8dd63e4c Tier0: move GetUnixTimeStamp() to utility code 2024-04-05 18:40:36 +02:00
Kawe Mazidjatari
a546836a10 RTech: small cleanup for PakDecoder_s
Removed unused union
2024-04-05 18:40:36 +02:00
Kawe Mazidjatari
80fecfa228 Tier1: create simple depth manager class
Will be used to manage depths of nested arrays
2024-04-05 18:35:06 +02:00
Kawe Mazidjatari
25e5bb667d Tier0: add new thread tools
- Add ThreadInMainOrServerFrameThread()
- Add ThreadCouldDoServerWork()
- Add ThreadJoinServerJob()
- Properly implement ThreadInServerFrameThread()
- Export all these functions for external DLL usage (plugins, etc)
2024-04-05 18:35:06 +02:00
Kawe Mazidjatari
fa421f259c Tier0: JobThreads improvements
- Add JobUserData_s for JT functions (used as arguments for JT callbacks).
- Add JT_GetCurrentJob().
- Add JT_WaitForJobAndOnlyHelpWithJobTypes().
2024-04-05 18:35:05 +02:00
Kawe Mazidjatari
1b039d52be VScript: remove ScriptLanguage_t
Doesn't exist in r5 and its unused in the SDK. The game only supports squirrel.
2024-04-05 18:35:05 +02:00
Kawe Mazidjatari
b1b80d3be0 Tier0: fix DEBUG compile error
Only occurred in DEBUG as Assert otherwise gets compiled out, and CThreadSpinRWLock::m_iWriteDepth only exists when compiled with REENTRANT_THREAD_SPIN_RW_LOCK. The game does not feature this so this is not defined. Moved to the REENTRANT_THREAD_SPIN_RW_LOCK block to only check on this assert when this feature is enabled.
2024-04-05 18:33:09 +02:00
Kawe Mazidjatari
d7478d3228 Tier2: WebSocket system improvements
Naming improvements, additional new comments/documentation and a few assertions. No logic has been changed.
2024-04-05 18:33:09 +02:00
Kawe Mazidjatari
e02f8f36fe Tier2: create modular WebSocket system
This code was actually part of the LiveAPI system, but there were many opportunities to make this particular code modular, so it has been decoupled and moved to Tier2. The LiveAPI system will soon use this class instead. The implementation has also been improved by adding dedicated routines for updating socket parameters, disconnecting/reconnecting and destroying sockets.

This commit also removes legacy workaround code in UtlVector which was used for before we had early enough access to the game's memalloc singleton. This code was no longer used.

This commit also implements the CUtlStringList class, which is now used for the new websocket class to split each socket connection up by a comma delimiter.
2024-04-05 18:31:58 +02:00
Kawe Mazidjatari
9d7eb7b07b Pylon: rename field "playerCount" to "numPlayers"
Force consistency between code structure.
2024-04-05 18:28:26 +02:00
Kawe Mazidjatari
8c593f666f Miles: add global type and prevent non-existent banks from loading
This patch adds miles globals and additional code to prevent banks from loading that don't exist. It falls back to "english" if requested language isn't installed.
2024-04-05 18:28:26 +02:00
Kawe Mazidjatari
f67d8e87b1 Tier1: use template index type for memory allocation
For CUtl* classes: use the index type rather than just ssize_t, this will throw compile warnings for code that constructs a CUtl* object allocating more memory than the index type allows (e.g. allocating UINT16_MAX while the index type has been set to UINT8_MAX).
2024-04-05 18:27:09 +02:00
Kawe Mazidjatari
582ec3791e Tier1: fully implement CUtlSymbol(*)
The class has been modified to match the implementation of the engine, the only modifications done were changing size types, so they compile to the correct size based on the platform (in case of the GameSDK project, this will be 64 bits).
2024-04-05 18:26:04 +02:00
Kawe Mazidjatari
615598c1b9 Tier0: implement CThreadSpinRWLock
Implementation matches that of the game executable, this will be used for CUtlStringTableMT.
2024-04-05 18:26:04 +02:00
Kawe Mazidjatari
44d663bf1c ImGui: cleanup and improvement to surface implementation
* Properly run fade in-out animations
* Make common methods/members shared
* Remove extraneous SDK thread
2024-04-05 18:22:56 +02:00
Kawe Mazidjatari
23a3c8fc00 Engine: make task queue singleton static
Compile it as static object & renamed to more correct names. Also made the integral type for frame delay an unsigned int instead
2024-04-05 18:19:39 +02:00
Kawe Mazidjatari
6cf88dc16c Engine: render ImGui in main thread and fix many threading bugs
ImGui drawing code now takes place in the main thread, a snapshot of the render data is created in CMaterialSystem::SwapBuffers(), and is being rendered in the render thread right before SpinPresent().

The reason why this was necessary, is because ConVar::GetString() isn't thread safe if its not marked FCVAR_MATERIAL_SYSTEM_THREAD or FCVAR_ACCESSIBLE_FROM_THREADS, and we used it for the console suggestions window, which iterates over every ConVar, accessible from threads or not.
2024-04-05 18:17:12 +02:00
Kawe Mazidjatari
a89ab882af Tier1: fix ConCommand::Dispatch()
Fix incorrect function prototype and add additional logic implemented in the engine. The code was crashing as the first parameter is the command target, but appears unused, the second parameter was actually the parameter that contained a pointer to the CCommand object which we needed.
2024-04-05 18:13:32 +02:00
Kawe Mazidjatari
609d705a0c Tier1: static construction of ConVar objects during link time
Fully implemented ConVar class so we could statically construct all SDK convars, this avoids a level of indirection, and allows for creating ConVar's everywhere in the project.

This patch also removed the settings tab of the ImGui server browser, as it has threading issues, while it technically never caused a crash yet, it has been removed as there was no point keeping it vs the work required to make it thread save (it only managed 2 convars which are perfectly manageable through cfg's or the in-game console).

Also temporarily disabled the creation of ConVar's in the mod system due to a memory leak, we would allocate and register a convar based on details parsed out of a mod file definition, but never unregister and free it.
2024-04-05 18:13:32 +02:00
Kawe Mazidjatari
d6b14fa12c Statically construct all ConCommand
Properly implement the ConCommandBase and ConCommand classes so we could statically construct all ConCommand objects in the global scope of each translation unit, this way we don't need to put them in a global file and deal with preprocessor directives to compile then in/out for certain projects.
2024-04-05 18:13:31 +02:00
Kawe Mazidjatari
6e7bfab4bd RTech: major cleanup of pak globals and improvement
Add missing types to fully mapped out PakGlobals_s struct, which is a 13MiB+ structure! This covers the vast majority of the pakfile system which is why we had to change a bunch of stuff for this patch. This patch also comes with:

- Reversed 'JobFifoLock_s' structure
- Reversed 'PakTracker_s' structure
- Reversed 'PakAssetTracker_s' structure

Many globals have been dropped as they were covered by the large PakGlobals_s singleton.

The pak decoder logic has been changed up as well, we now use a decode mode enumerant which will make it easier to add in more decoders for the pak files in the future.
2024-04-05 18:13:31 +02:00
Kawe Mazidjatari
2baa80d253 Engine: improve CClient::Authenticate performance
- Removed 2 std::string copy constructions
- Removed 32 sprintf calls per token auth request.
- Fixed a bug where we format the NucleusID as s64 instead of u64.
- Added additional hardening for when token/sessionId stitching fails, this will now always reject the connection.
- Improved the macro to make sure we always free the JWT claims if it has been allocated.
2024-04-05 18:07:38 +02:00
Kawe Mazidjatari
74da5c7c20 Engine: cleanup data block sender/receiver and add types
* Move member vars to correct place, to match it with the engine.
* Added out-of-band network message ID's for the R5 engine.

Also implemented 'ServerDataBlockSender::SendDataBlock()' and 'ClientDataBlockReceiver::AcknowledgeTransmission()'. NOTE that these are currently not tested, and also not in use! The code uses the version stored in the vftable which is what the engine itself provides. These have been implemented for reference only. If they need to be used, they need to be thoroughly tested first!
2024-04-05 18:06:36 +02:00
Kawe Mazidjatari
99af2877a6 Tier1: fully implement bitbuf classes
All routines are now fully implemented. This was delayed on purpose as some bit buffer functions have changed due to the use of 64bit integers for sizes, and also the coord types. The porting of this has to be done carefully; all
reimplemented functions have been changed to feature 64bit integers (where necessary) for syze types, and all values in coordsize.h have been tweaked to reflect the changes in the R5 engine 1:1, allowing us to properly implement the coord bit buffer functions as well.
2024-04-05 18:02:39 +02:00
Kawe Mazidjatari
48a12e17b6 Tier1: assert on LZSS window size being a power of 2 2024-04-05 18:02:39 +02:00
Kawe Mazidjatari
12485342ae Tier1: optimize V_GetFileExtension()
If we are going to do a strlen to do a reverse check, then just check from the start and avoid another loop.
2024-04-05 18:02:39 +02:00
Kawe Mazidjatari
2bed5d4437 Tier1: add CUtlHashTable 2024-04-05 18:01:23 +02:00
Kawe Mazidjatari
f18a4c17a4 Engine: rebuild CClientState::ProcessCreateStringTable()
Rebuild CClientState::ProcessCreateStringTable() and add notes for multiple 'potential' exploit vectors that are currently in place. Also add wrappers for compressing/decompressing net packets.
2024-04-05 17:59:53 +02:00
Kawe Mazidjatari
ee64d07e5b Tier0: emit text to debug console if debugger is attached
Small quality of life improvement while debugging the application.
2024-04-05 17:59:53 +02:00
Kawe Mazidjatari
0d390955fd Engine: partial rebuild for data block sender/receiver
This patch partially rebuilds the data block sender/receiver. The receiver leaks memory if the sender sends a bogus LZ4 packet, it would allocate memory to copy the encoded data into, from which it would decode it to the scratch buffer, but it would never deallocate this temporary buffer is the LZ4 decoder failed. This has been fixed. The second reason to rebuild these was to look into potential compression optimization. The data block rebuild now also features the latest LZ4 codec.
2024-04-05 17:59:53 +02:00
Kawe Mazidjatari
373b18ddb8 Tier1: use signed size types for buffer size field 2024-04-05 17:56:54 +02:00