﻿"Games"
{
	"csgo"
	{
		"Signatures"
		{
			// Called from Host_Say
			"UTIL_SayTextFilter"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x74\x24\x2A\x55\x57\x41\x56\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x49\x8B\xD8"
				"linux"			"\x55\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x4C\x8D\x75\x2A\x41\x55\x41\x89\xCD"
			}
			// Called from Host_Say
			"UTIL_SayText2Filter"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x74\x24\x2A\x55\x57\x41\x56\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x41\x0F\xB6\xF8"
				"linux"			"\x55\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x89\xD7\x31\xD2"
			}
			"IsHearingClient"
			{
				"library"		"engine"
				"windows"		"\x40\x53\x48\x83\xEC\x2A\x48\x8B\xD9\x3B\x51"
				"linux"			"\x55\x48\x89\xE5\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x39\x77"
			}
			// idk a good way to find this again, i just brute forced the vtable. offset is 136 on CTriggerPush
			"TriggerPush_Touch"
			{
				"library"		"server"
				"windows"		"\x40\x55\x53\x57\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\x02\x48\x8B\xF9"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xF5\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0"
			}
			// this is called in CTriggerPush::Touch, using IDA pseudocode look in an `if ( ( v & 0x80 ) != 0 )` and then `if ( v > 0.0 ) SetGroundEntity()`
			"SetGroundEntity"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x6C\x24\x2A\x56\x57\x41\x54\x48\x83\xEC\x2A\x44\x8B\x89"
				"linux"			"\x55\x48\x8D\x87\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xD6"
			}
			// Check vauff's pin in #scripting
			"ServerMovementUnlock"
			{
				"library"		"server"
				"windows"		"\x76\x2A\xF3\x0F\x58\xD4\x0F\x57\xC0\xF3\x0F\x58\xD3"
				"linux"			"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\x48\x85\xFF\x0F\x84\x2A\x2A\x2A\x2A\xE8"
			}
			// String: "CCSPlayerPawnBase::SwitchTeam", just keep in mind this is actually CCSPlayerController::SwitchTeam
			"CCSPlayerController_SwitchTeam"
			{
				"library"		"server"
				"windows"		"\x40\x53\x57\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\xD9\x8B\xFA"
				"linux"			"\x55\x48\x89\xE5\x41\x54\x49\x89\xFC\x89\xF7"
			}
			// String: "player_jump", then find 42C80000h or in pseudocode "*(a2 + 68) = 1120403456;", changing from 100 to 145
			"CheckJumpButtonWater"
			{
				"library"		"server"
				"windows"		"\xC8\x42\xEB\x2A\x4C\x39\x67\x30"
				"linux"			"\xC8\x42\xEB\x2A\x4C\x89\xE7\xE8\x2A\x2A\x2A\x2A"
			}
			// Called right after "Removed %s(%s)\n"
			"UTIL_Remove"
			{
				"library"		"server"
				"windows"		"\x48\x85\xC9\x74\x2A\x48\x8B\xD1\x48\x8B\x0D\x2A\x2A\x2A\x2A"
				"linux"			"\x48\x89\xFE\x48\x85\xFF\x74\x2A\x48\x8D\x05\x2A\x2A\x2A\x2A\x48"
			}
			// "SetPosition" is passed to this
			"CEntitySystem_AddEntityIOEvent"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x18\x4C\x89\x4C\x24\x20\x48\x89\x4C\x24\x08\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x83\xEC\x20"
				"linux"			"\x55\x48\x89\xE5\x41\x55\x49\x89\xCD\x41\x54\x49\x89\xFC"
			}
			// "BombPlanted" is passed to this
			"CEntityInstance_AcceptInput"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x74\x24\x2A\x57\x48\x83\xEC\x2A\x49\x8B\xF0\x48\x8B\xD9\x48\x8B\x0D"
				"linux"			"\x55\x48\x89\xF0\x48\x89\xE5\x41\x57\x49\x89\xFF\x41\x56\x48\x8D\x7D"
			}
			// Called by CEntityInstance_AcceptInput
			"CEntityIdentity_AcceptInput"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x54\x24\x2A\x48\x89\x4C\x24\x2A\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\xAC\x24\x2A\x2A\x2A\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\x02"
				"linux"			"\x55\x49\x89\xD3\x48\x89\xE5\x41\x57\x45\x89\xCF\x41\x56"
			}
			// func_pushable inside CTriggerBrush::Use calls CEntityIOOutput::FireOutputInternal
			// Windows - https://imgur.com/a/A3zcxQm
			// Linux doesn't inline it so you need to find any of the xrefs and the proper function is right after it.
			// You can tell it apart by the arguments: (a1 + 2616, v4, a1, &v6, 0.0);
			"CEntityIOOutput_FireOutputInternal"
			{
				"library"		"server"
				"windows"		"\x4C\x89\x4C\x24\x2A\x48\x89\x4C\x24\x2A\x53\x56"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xFF\x41\x56\x41\x55\x41\x54\x49\x89\xD4\x53\x48\x89\xF3"
			}
			// "multi_manager" is passed to this
			"CGameEntitySystem_FindEntityByClassName"
			{
				"library"		"server"
				"windows"		"\x48\x83\xEC\x68\x45\x33\xC9"
				"linux"			"\x55\x45\x31\xC0\x31\xC9\x48\x89\xE5\x53\x48\x8D\x5D\x2A\x48\x83\xEC\x2A\x48\x89\xDF"
			}
			// "commentary_semaphore" is passed to this
			"CGameEntitySystem_FindEntityByName"
			{
				"library"		"server"
				"windows"		"\x48\x81\xEC\x88\x2A\x2A\x2A\x4D\x85\xC0"
				"linux"			"\x55\x48\x89\xE5\x41\x54\x53\x48\x83\xEC\x2A\x48\x85\xD2"
			}
			// "CBaseEntity::TakeDamageOld"
			"CBaseEntity_TakeDamageOld"
			{
				"library"		"server"
				"windows"		"\x4C\x8B\xDC\x56\x57\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\x41"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x81\xEC\x2A\x2A\x2A\x2A\x4C\x8D\x25\x2A\x2A\x2A\x2A\x49\x8B\x3C\x24"
			}
			// Should be xref'd right above "flGravity", takes a float arg
			"CBaseEntity::SetGravityScale"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x2A\xF3\x0F\x10\x81\x04\x04\x00\x00"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x81\xEC\x2A\x2A\x2A\x2A\x0F\x2E\x87\x2A\x2A\x2A\x2A\x7A\x2A\x75\x2A\x48\x81\xC4\x2A\x2A\x2A\x2A\x5B\x41\x5C\x41\x5D\x41\x5E\x41\x5F\x5D\xC3\x0F\x1F\x40\x2A\x31\xC9\x31\xF6\x31\xFF\xF3\x0F\x11\x85\x2A\x2A\x2A\x2A\x66\x89\x8D\x2A\x2A\x2A\x2A\xBA\x2A\x2A\x2A\x2A\xB9\x2A\x2A\x2A\x2A\x66\x0F\xEF\xC9\x48\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x48\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x48\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x48\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x0F\x29\x8D\x2A\x2A\x2A\x2A\x48\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\xC7\x85\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xF3\x0F\x10\x85\x2A\x2A\x2A\x2A\x85\xC0\x41\x89\xC4\x0F\x8E\x2A\x2A\x2A\x2A\x48\x63\x8D\x2A\x2A\x2A\x2A\x48\x63\xD0\x31\xF6\xF3\x0F\x11\x85\x2A\x2A\x2A\x2A\x48\xC1\xE2\x2A\x48\x8B\xBD\x2A\x2A\x2A\x2A\x48\xC1\xE1\x2A\x81\xBD\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x40\x0F\x96\xC6\xE8\x2A\x2A\x2A\x2A\x8B\x95\x2A\x2A\x2A\x2A\xF3\x0F\x10\x85\x2A\x2A\x2A\x2A\x48\x89\x85\x2A\x2A\x2A\x2A\x81\xFA\x2A\x2A\x2A\x2A\x0F\x87"
			}
			// "Game System %s is defined twice!\n"
			// Note that this signature points to the instruction with sm_pFirst which is the first qword referenced in the function.
			"IGameSystem_InitAllSystems_pFirst"
			{
				"library"		"server"
				"windows"		"\x48\x8B\x1D\x2A\x2A\x2A\x2A\x48\x85\xDB\x0F\x84\x2A\x2A\x2A\x2A\xBD"
				"linux"			"\x4C\x8B\x35\x2A\x2A\x2A\x2A\x4D\x85\xF6\x75\x2A\xE9"
			}
			// Windows "%s:  IGameSystem::LoopPostInitAllSystems(start)\n"
			// Linux "%s:  IGameSystem::LoopInitAllSystems(start)"
			// In windows it's the only qword that gets nullchecked, while in linux it gets set to another qword's address
			"IGameSystem_LoopPostInitAllSystems_pEventDispatcher"
			{
				"library"		"server"
				"windows"		"\x48\x39\x1D\x2A\x2A\x2A\x2A\x74\x2A\x39\x05"
				"linux"			"\x4C\x8B\x25\x2A\x2A\x2A\x2A\x48\x8B\x05\x2A\x2A\x2A\x2A\x8B\x35"
			}
			// "--CLoopModeGame::SetWorldSession"
			// In the above, a number is checked if > 0 then the function is called
			"IGameSystem_LoopDestroyAllSystems_s_GameSystems"
			{
				"library"		"server"
				"windows"		"\x8B\x05\x2A\x2A\x2A\x2A\x83\xE8\x2A\x48\x63\xF8\x0F\x88"
				"linux"			"\x8B\x05\x2A\x2A\x2A\x2A\x89\xC2\x83\xEA\x2A\x0F\x88\x2A\x2A\x2A\x2A\x4C\x8D\x3D"
			}
			"CBasePlayerController_SetPawn"
			{
				"library"		"server"
				"windows"		"\x44\x88\x4C\x24\x2A\x53\x57\x41\x54\x41\x56\x41\x57\x48\x83\xEC"
				"linux"			"\x55\x48\x8D\x87\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x41\x89\xCE\x41\x55\x45\x89\xCD"
			}
			// String: "CNavMesh::GetNearestNavArea"
			"CNavMesh_GetNearestNavArea"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x44\x89\x4C\x24\x2A\x48\x89\x54\x24\x2A\x48\x89\x4C\x24\x2A\x55\x56\x57\x41\x54\x41\x55\x41\x56\x41\x57\x48\x8D\xAC\x24"
				"linux"			"\x55\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xD5\x41\x54\x4C\x8D\x25"
			}
			// Search "Changes's player's model", look for a function containing 'models/%s.vmdl'. Below V_snprintf is the one
			// This matches 2 functions, however they're literally identical
			"CBaseModelEntity_SetModel"
			{
				"library"		"server"
				"windows"		"\x40\x53\x48\x83\xEC\x2A\x48\x8B\xD9\x4C\x8B\xC2\x48\x8B\x0D\x2A\x2A\x2A\x2A\x48\x8D\x54\x24\x2A\x48\x8B\x01\xFF\x50\x2A\x48\x8B\x44\x24"
				"linux"			"\x55\x48\x89\xF2\x48\x89\xE5\x53\x48\x89\xFB\x48\x8D\x7D\x2A\x48\x83\xEC\x2A\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x8B\x30\x48\x8B\x06"
			}
			"CGameRules_TerminateRound"
			{
				"library"		"server"
				"windows"		"\x48\x8B\xC4\x4C\x89\x48\x2A\x48\x89\x48\x2A\x55\x56"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xFE\x41\x55\x41\x54\x53\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8D\x05\x2A\x2A\x2A\x2A\xF3\x0F\x11\x85"
			}
			"CCSPlayer_WeaponServices_CanUse"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x6C\x24\x2A\x56\x57\x41\x56\x48\x83\xEC\x2A\x48\x8B\x01\x48\x8B\xFA"
				"linux"			"\x55\x48\x8D\x15\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x55\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x83\xEC\x2A\x48\x8B\x07\x48\x8B\x80"
			}
			"CCSPlayer_WeaponServices_EquipWeapon"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x57\x48\x83\xEC\x2A\x48\x83\x79\x2A\x2A\x48\x8B\xFA\x48\x8B\xD9\x75\x2A\xE8\x2A\x2A\x2A\x2A\x48\x8B\x53"
				"linux"			"\x55\x48\x89\xE5\x41\x55\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x83\xEC\x2A\x48\x8B\x77"
			}
			"CreateEntityByName"
			{
				"library"		"server"
				"windows"		"\x48\x83\xEC\x48\xC6\x44\x24\x30\x00"
				"linux"			"\x48\x8D\x05\x2A\x2A\x2A\x2A\x55\x48\x89\xFA"
			}
			"DispatchSpawn"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x10\x57\x48\x83\xEC\x30\x48\x8B\xDA\x48\x8B\xF9\x48\x85\xC9"
				"linux"			"\x48\x85\xFF\x74\x2A\x55\x48\x89\xE5\x41\x55\x49\x89\xFD"
			}
			// Look for "SetEntityName", that will be the vscript binding definition
			// Scroll a bit down and you'll find something like this (note the offset): *(_QWORD *)(v453 + 64) = sub_1807B0350;
			// that function is just a jump to the one we want
			"CEntityIdentity_SetEntityName"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x10\x57\x48\x83\xEC\x20\x48\x8B\xD9\x4C\x8B\xC2"
				"linux"			"\x55\x48\x89\xF2\x48\x89\xE5\x41\x55\x41\x54\x53"
			}
			// "Error - cannot add bots after game is over."
			"BotNavIgnore"
			{
				"library"		"server"
				"windows"		"\x0F\x84\x2A\x2A\x2A\x2A\x80\xB8\x2A\x2A\x2A\x2A\x00\x0F\x84\x2A\x2A\x2A\x2A\x80\x3D\x2A\x2A\x2A\x2A\x00\x74\x15"
				"linux"			"\x0F\x84\x2A\x2A\x2A\x2A\x44\x0F\xB6\xB0\x2A\x2A\x2A\x2A\x45\x84\xF6\x0F\x84"
			}
			// next to "soundname", in windows it's the last referenced sub while in linux it's right after
			// this is a vscript binding though so it may be removed in the future?
			"CBaseEntity_EmitSoundParams"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x74\x24\x2A\x48\x89\x7C\x24\x2A\x4C\x89\x74\x24\x2A\x55\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x45\x33\xF6\x48\xC7\x45"
				"linux"			"\x48\xB8\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x55\x0F\x28\xD0"
			}
			// Called right after this in windows "Entity %s(%s) is ambiguously parented to..."
			"CBaseEntity_SetParent"
			{
				"library"		"server"
				"windows"		"\x4D\x8B\xD9\x48\x85\xD2\x74\x2A"
				"linux"			"\x48\x85\xF6\x74\x2A\x48\x8B\x47\x10\xF6\x40\x31\x02\x75\x2A\x48\x8B\x46\x10\xF6\x40\x31\x02\x75\x2A\xB8\x2A\x2A\x2A\x2A"
			}
			// "ParticleEffect", found in a function with 9 arguments
			"DispatchParticleEffect"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x08\x48\x89\x74\x24\x10\x48\x89\x7C\x24\x18\x4C\x89\x74\x24\x20\x55\x48\x8D\x6C\x24\xD1"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x41\x89\xCC\x53\x48\x89\xD3"
			}
			// search for "land_%s", this is called after that string is referenced (the one with 4 parameters).
			// (function that calls it also contains "T_Default.SuitLand").
			"CBaseEntity_EmitSoundFilter"
			{
				"library"		"server"
				"windows"		"\x4C\x8B\xDC\x49\x89\x5B\x2A\x49\x89\x6B\x2A\x49\x89\x73\x2A\x49\x89\x7B\x2A\x41\x56\x48\x83\xEC\x2A\x49\xC7\x43\x2A\x2A\x2A\x2A\x2A\x48\x8D\x05\x2A\x2A\x2A\x2A\x49\x89\x43\x2A\x41\x8B\xF8"
				"linux"			"\x55\x48\x8D\x05\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x49\x89\xCF\x41\x56\x41\x89\xD6"
			}
			// the longer function containing "___clientsideitemsplaceholder0___"
			"CNetworkStringTable_DeleteAllStrings"
			{
				"library" 		"engine"
				"windows" 		"\x48\x89\x5C\x24\x2A\x48\x89\x6C\x24\x2A\x48\x89\x74\x24\x2A\x48\x89\x7C\x24\x2A\x41\x56\x48\x83\xEC\x2A\x45\x33\xF6\x48\x8B\xD9"
				"linux" 		"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x45\x31\xE4\x53\x48\x89\xFB\x48\x83\xEC\x2A\x48\x83\x7F"
			}
			// "PlayerMovementTraces"
			"ProcessMovement"
			{
				"library"		"server"
				"windows"		"\x40\x57\x41\x57\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x83\x79"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x49\x89\xF4\x53\x48\x89\xFB\x48\x83\xEC\x2A\x48\x8B\x7F\x2A\x48\x85\xFF\x0F\x84\x2A\x2A\x2A\x2A\x8B\x8F"
			}
			// "env_shake %s with", in either xref there will be a call to SetMoveType(a1, 0, 0) at the top
			"CBaseEntity_SetMoveType"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x6C\x24\x2A\x48\x89\x74\x24\x2A\x48\x89\x7C\x24\x2A\x41\x56\x48\x83\xEC\x2A\x41\x0F\xB6\xF0"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x89\xD5\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x2A\x40\x38\xB7"
			}
			// Use CBaseEntity::Use offset
			// This signature points directly to the instruction to patch
			"CPhysBox_Use"
			{
				"library"		"server"
				"windows"		"\x4C\x8B\x43\x2A\x48\x8D\x8F\x2A\x2A\x2A\x2A\x48\x8B\x13\xE8\x2A\x2A\x2A\x2A\x48\x8B\x5C\x24\x2A\x48\x83\xC4\x2A\x5F\xC3\xCC\xCC\xCC\xCC\x40\x53"
				"linux"			"\x49\x8B\x54\x24\x2A\x45\x31\xC9\x45\x31\xC0\xC7\x45\x2A\x2A\x2A\x2A\x2A\x49\x8B\x34\x24\x48\x8D\x4D\x2A\x66\x0F\xEF\xC0\x48\xC7\x45\x2A\x2A\x2A\x2A\x2A\x48\x8D\xBB\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\xF6\x45\x2A\x2A\x74\x2A\x48\x8B\x05\x2A\x2A\x2A\x2A\x48\x8B\x75\x2A\x48\x8B\x38\x48\x8B\x07\xFF\x50\x2A\x48\x83\xC4"
			}
			"CTakeDamageInfo"
			{
				"library"		"server"
				"windows"		"\x40\x53\x48\x83\xEC\x60\x48\xC7\x41\x38\xFF\xFF\xFF\xFF"
				"linux"			"\x49\xBB\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x55\x66\x0F\xEF\xC9\x48\x89\xE5"
			}
			// "%sRecv usercmd %d.  Margin:%5.1fms net +%2d queue =%5.1f total\n"
			"ProcessUsercmds"
			{
				"library"		"server"
				"windows"		"\x48\x8B\xC4\x44\x88\x48\x20\x44\x89\x40\x18\x48\x89\x50\x10\x53"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x2A\x89\x4D"
			}
			"CGamePlayerEquip_InputTriggerForAllPlayers"
			{
				"library"		"server"
				"windows"		"\x40\x55\x53\x41\x54\x41\x56\x48\x8B\xEC\x48\x83\xEC\x2A\x4C\x8B\xF1"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xFD\x41\x54\x53\x48\x83\xEC\x2A\xE8\x2A\x2A\x2A\x2A\xC7\x45"
			}
			"CGamePlayerEquip_InputTriggerForActivatedPlayer"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x18\x56\x48\x83\xEC\x20\x48\x8B\x1A"
				"linux"			"\x55\x48\x89\xE5\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x2A\x48\x8B\x1E"
			}
			// Return value of this function is used to determine whether "NETWORK_DISCONNECT_REJECT_SERVERFULL to %s: Cannot get free client\n" gets printed
			"GetFreeClient"
			{
				"library"		"engine"
				"windows"		"\x48\x89\x54\x24\x2A\x53\x56\x57\x41\x56\x48\x83\xEC"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xFE\x41\x55\x41\x54\x49\x89\xF4\x53\x48\x81\xEC\x2A\x2A\x2A\x2A\x41\xC6\x01"
			}
			// The only function with "weapon_shield" and does fminf with 260.0 earlier
			"CCSPlayerPawn_GetMaxSpeed"
			{
				"library"		"server"
				// Inlined by MSVC as of 2025-07-28 CS2 update
				//"windows"		"\x40\x53\x48\x83\xEC\x2A\x48\x8B\xD9\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x84\x2A\x2A\x2A\x2A\x48\x8B\x0D"
				"linux"			"\x55\x48\x89\xE5\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x75\x2A\x48\x8D\x05"
			}
			// str: "Radial using: %s\n"
			"FindUseEntity"
			{
				"library"		"server"
				"windows"		"\x4C\x89\x44\x24\x2A\xF3\x0F\x11\x4C\x24\x2A\x55\x53\x56"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xFD\x41\x54\x48\x8D\x3D\x2A\x2A\x2A\x2A\x53\x48\x81\xEC"
			}
			"TraceFunc"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x08\x48\x89\x6C\x24\x10\x48\x89\x74\x24\x18\x48\x89\x7C\x24\x20\x41\x54\x41\x56\x41\x57\x48\x81\xEC\x80\x00\x00\x00\x45\x33\xE4"
				"linux"			"\x48\xB8\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x55\x48\x89\xE5\x41\x55\x41\x54\x4C\x8D\x6F\x2A\x49\x89\xCC"
			}
			// str: "Physics/TraceShape (Server)"
			"TraceShape"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x48\x89\x4C\x24\x2A\x55\x57"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xCF\x41\x56\x49\x89\xF6\x41\x55\x4D\x89\xC5"
			}
			"CBasePlayerPawn_GetEyePosition"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x57\x48\x83\xEC\x2A\x48\x8B\xF9\x48\x8B\xDA\x48\x8B\x89\x2A\x2A\x2A\x2A\x48\x85\xC9\x74\x2A\x48\x8B\x01"
				"linux"			"\x55\x48\x89\xE5\x53\x48\x89\xFB\x48\x83\xEC\x2A\x48\x8B\xBF\x2A\x2A\x2A\x2A\x48\x85\xFF\x0F\x84"
			}
			"CBasePlayerPawn_GetEyeAngles"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x57\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\xF9\x48\x8B\xDA\x48\x8B\x89"
				"linux"			"\x55\x48\x89\xE5\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x2A\x48\x8B\xBF\x2A\x2A\x2A\x2A\x48\x85\xFF\x0F\x84\x2A\x2A\x2A\x2A\x48\x8B\x07\x48\x8D\x15"
			}
			// Only ever referenced right next to string "TestActivator"
			"CBaseFilter_InputTestActivator"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x2A\x57\x48\x83\xEC\x2A\x4C\x8B\x02"
				"linux"			"\x55\x48\x89\xE5\x41\x54\x49\x89\xF4\x53\x48\x89\xFB\x48\x83\xEC\x2A\x48\x8B\x07\x48\x8B\x16"
			}
			// "Kicking user %s (sv_kick_players_with_cooldown=%d)\n"
			"GameSystem_Think_CheckSteamBan"
			{
				"library"		"server"
				"windows"		"\x41\x54\x48\x81\xEC\x2A\x2A\x2A\x2A\xBA\x2A\x2A\x2A\x2A\x48\x8D\x0D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x48\x85\xC0"
				"linux"			"\x55\x48\x8D\x3D\x2A\x2A\x2A\x2A\xBE\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x48\x85\xC0\x0F\x84\x2A\x2A\x2A\x2A\x8B\x10"
			}
			// Location to CUtlMap unk that is referenced on Windows by function with "Notification about user penalty: %u/%u (%u sec)\n" string
			// On Linux, a qword appears twice in GameSystem_Think_CheckSteamBan, and thrice in a sub-function of the function used for Windows (1 top, 2 bottom), the only other reference to this qword is some convar registration function with two unks above, sm_mapGcBanInformation is the unk further away
			"CCSGameRules__sm_mapGcBanInformation"
			{
				"library"		"server"
				"windows"		"\x48\x8D\x0D\x2A\x2A\x2A\x2A\x48\x89\x45\x2A\x0F\x11\x45"
				"linux"			"\x48\x8D\x0D\x2A\x2A\x2A\x2A\x48\x63\x51\x2A\x83\xFA\x2A\x0F\x84\x2A\x2A\x2A\x2A\xF7\x41\x2A\x2A\x2A\x2A\x2A\x74"
			}
			// Called right before "%d spawn groups:\n"
			"GetSpawnGroups"
			{
				"library"		"server"
				"windows"		"\x40\x56\x48\x83\xEC\x2A\x48\x89\x5C\x24\x2A\x48\x8D\xB1"
				"linux"			"\x55\x49\x89\xF1\xBE\x2A\x2A\x2A\x2A\x48\x89\xE5\x41\x57\x41\x56\x4C\x8D\xBF"
			}
			// Only has "weapon_incgrenade" and "weapon_incgrenade" strings
			// May need to look into custom way of acquiring this function address, normal sig sees frequent breakage in the CS# project
			"CCSPlayer_ItemServices_CanAcquire"
			{
				"library"		"server"
				"windows"		"\x44\x89\x44\x24\x2A\x48\x89\x54\x24\x2A\x48\x89\x4C\x24\x2A\x55\x53\x56\x57\x41\x55\x41\x56\x41\x57\x48\x8B\xEC"
				"linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xCD\x41\x54\x49\x89\xFC\x53\x48\x89\xF3\x48\x83\xEC"
			}
			"CTriggerGravity_GravityTouch"
			{
				"library"		"server"
				"windows"		"\x48\x89\x5C\x24\x08\x57\x48\x83\xEC\x2A\x48\x8B\x02\x48\x8B\xF9\x48\x8B\xCA\x48\x8B\xDA\xFF\x90\x60\x05\x00\x00\x84\xC0\x74\x2A\xF3\x0F\x10\x8F\x14\x04\x00\x00"
				"linux"			"\x55\x48\x89\xE5\x41\x54\x49\x89\xFC\x48\x89\xF7\x53\x48\x89\xF3\xFF\x90\x58\x05\x00\x00"
			}
		}
		"Offsets"
		{
			"CBaseEntity::Precache"
			{
				"windows"		"4"
				"linux"			"5"
			}
			"CBaseEntity::SetOwner"
			{
				"windows"		"50"
				"linux"			"49"
			}
			// String: "%s<%i><%s><%s>" ChangeTeam() CTMDBG..."
			"CCSPlayerController_ChangeTeam"
			{
				"windows"		"106"
				"linux"			"105"
			}
			"GetHammerUniqueId"
			{
				"windows"		"115"
				"linux"			"114"
			}
			"CBaseEntity::Use"
			{
				"windows"		"147"
				"linux"			"146"
			}
			"CBaseEntity::StartTouch"
			{
				"windows"		"150"
				"linux"			"149"
			}
			"CBaseEntity::Touch"
			{
				"windows"		"151"
				"linux"			"150"
			}
			"CBaseEntity::EndTouch"
			{
				"windows"		"152"
				"linux"			"151"
			}
			"Teleport"
			{
				"windows"		"165"
				"linux"			"164"
			}
			// For these two, look for the names, you'll find vscript bindings
			// Scroll down to where the var + 64 gets set to a function, that calls the offset we want
			"IsPlayerPawn"
			{
				"windows"		"172"
				"linux"			"171"
			}
			"IsPlayerController"
			{
				"windows"		"173"
				"linux"			"172"
			}
			"CollisionRulesChanged"
			{
				"windows"		"189"
				"linux"			"188"
			}
			"CCSPlayerController_Respawn"
			{
				"windows"		"275"
				"linux"			"277"
			}
			// CBaseTrigger
			"PassesTriggerFilters"
			{
				"windows"		"269"
				"linux"			"270"
			}
			// Long function with "player_hurt" in the middle and then inserts userid, health, priority, attacker strings
			"CBasePlayerPawn::OnTakeDamage_Alive"
			{
				"windows"		"252"
				"linux"			"253"
			}
			// Look for the kill command, go through its callback and you should a find call like this, with v9 being a pawn pointer:
			// return (*(*v9 + 2976LL))(v9, v27, 0LL);
			// 2976 (372 * 8) is the offset
			"CBasePlayerPawn_CommitSuicide"
			{
				"windows"		"408"
				"linux"			"408"
			}
			"GameEntitySystem"
			{
				"windows"		"88"
				"linux"			"80"
			}
			// In the function with "[%03d] Found: %s, firing\n", you'll find a call into a pointer offset just a bit higher, that's the offset * 8
			"CGameRules_FindPickerEntity"
			{
				"windows"		"25"
				"linux"			"26"
			}
			"CCSGameRules_GoToIntermission"
			{
				"windows"		"127"
				"linux"			"128"
			}
			"CheckTransmitPlayerSlot"
			{
				"windows"		"576"
				"linux"			"576"
			}
			// engine
			// "tried to sprint to a non-client", there will be a check above like this: if ( a2 >= *(v5 + 632) ), note that this is a CUtlVector
			"CNetworkGameServer_ClientList"
			{
				"windows"		"78"
				"linux"			"80"
			}
			// Right above "mapgroup workshop;" string there is a virtual call to this on g_pGameTypes using "workshop" string
			"IGameTypes_CreateWorkshopMapGroup"
			{
				"windows"		"37"
				"linux"			"38"
			}
			// There's no easy way to find this, but it's a function that checks entity flags (0x370) and ends by calling RemoveFlag with 0x800000 (FL_BASEVELOCITY)
			"CCSPlayer_MovementServices::CheckMovingGround"
			{
				"windows"		"36"
				"linux"			"37"
			}
			"CCSPlayer_WeaponServices::DropWeapon"
			{
				"windows"		"23"
				"linux"			"24"
			}
			"CCSPlayer_WeaponServices::SelectItem"
			{
				"windows"		"25"
				"linux"			"26"
			}
			// server.dll -> xref 'sv_phys_stop_at_collision' first __fastcall
			"CVPhys2World::GetTouchingList"
			{
				"windows"		"122"
				"linux"			"122"
			}
		}
		"Patches"
		{
			// Server
			"ServerMovementUnlock"
			{
				"windows"		"\xEB"
				"linux"			"\x90\x90\x90\x90\x90\x90"
			}
			"FixWaterFloorJump"
			{
				"windows"		"\x11\x43"
				"linux"			"\x11\x43"
			}
			// Jumping over a check for nav mesh
			"BotNavIgnore"
			{
				"windows"		"\xE9\x2C\x00\x00\x00\x90"
				"linux"			"\xE9\x25\x00\x00\x00\x90"
			}
			// Make func_physbox pass itself as the caller in OnPlayerUse
			// pCaller = inputdata->pCaller ->  pCaller = this
			// Windows:  mov r8, [rbx+8]  	->  mov r8, rdi
			// Linux: 	 mov rdx, [r12+8] 	->  mov rdx, rbx
			"CPhysBox_Use"
			{
				"windows"		"\x49\x89\xF8\x90"
				"linux"			"\x48\x89\xDA\x90\x90"
			}
		}
	}
}
