"Games"
{
    "csgo"
    {
        "Signatures"
        {
            // Logging
            "Msg"
            {
                "library"		"tier0"
                "windows"		"@Msg"
                "linux"			"@Msg"
            }
            "ConDMsg"
            {
                "library"		"tier0"
                "windows"		"@ConDMsg"
                "linux"			"@ConDMsg"
            }
            "DevMsg"
            {
                "library"		"tier0"
                "windows"		"@DevMsg"
                "linux"			"@DevMsg"
            }
            "Warning"
            {
                "library"		"tier0"
                "windows"		"@Warning"
                "linux"			"@Warning"
            }
            "DevWarning"
            {
                "library"		"tier0"
                "windows"		"@DevWarning"
                "linux"			"@DevWarning"
            }
            "LoggingSystem_Log"
            {
                "library"		"tier0"
                "windows"		"@LoggingSystem_Log"
                "linux"			"@LoggingSystem_Log"
            }
            "LoggingSystem_LogDirect"
            {
                "library"		"tier0"
                "windows"		"@LoggingSystem_LogDirect"
                "linux"			"@LoggingSystem_LogDirect"
            }
            "LoggingSystem_LogAssert"
            {
                "library"		"tier0"
                "windows"		"@LoggingSystem_LogAssert"
                "linux"			"@LoggingSystem_LogAssert"
            }

            // String: "\"Console<0>\" say \"%s\"\n"
            "Host_Say"
            {
                "library"		"server"
                "windows"		"\x44\x89\x4C\x24\x2A\x44\x88\x44\x24\x2A\x55\x53\x56\x57\x41\x54\x41\x55"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xFF\x41\x56\x41\x55\x41\x54\x4D\x89\xC4"
            }
            // Called from Host_Say
            "UTIL_SayTextFilter"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x2A\x55\x56\x57\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x49\x8B\xD8"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xD7\x31\xD2\x41\x56\x4C\x8D\x75\x98"
            }
            // Called from Host_Say
            "UTIL_SayText2Filter"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x2A\x55\x56\x57\x48\x8D\x6C\x24\x2A\x48\x81\xEC\x2A\x2A\x2A\x2A\x41\x0F\xB6\xF8"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x4C\x8D\xBD\x2A\x2A\x2A\x2A\x41\x56\x4D\x89\xC6\x41\x55\x4D\x89\xCD"
            }
            // String: "<unconnected>"
            "UTIL_ClientPrintAll"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x08\x48\x89\x6C\x24\x10\x48\x89\x74\x24\x18\x57\x48\x81\xEC\x70\x01\x2A\x2A\x8B\xE9"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xD7\x41\x56\x49\x89\xF6\x41\x55\x41\x89\xFD"
            }
            // String: "Console command too long"
            "ClientPrint"
            {
                "library"		"server"
                "windows"		"\x48\x85\xC9\x0F\x84\x2A\x2A\x2A\x2A\x48\x8B\xC4\x48\x89\x58\x18"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x49\x89\xCF\x41\x56\x49\x89\xD6\x41\x55\x41\x89\xF5\x41\x54\x4C\x8D\xA5\xA0\xFE\xFF\xFF"
            }
            "NetworkStateChanged"
            {
                "library"		"server"
                "windows"		"\x4C\x8B\xC9\x48\x8B\x09\x48\x85\xC9\x74\x2A\x48\x8B\x41\x10"
                "linux"			"\x4C\x8B\x07\x4D\x85\xC0\x74\x2A\x49\x8B\x40\x10"
            }
            "StateChanged"
            {
                "library"		"server"
                "windows"		"\x48\x89\x54\x24\x10\x55\x53\x57\x41\x55"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x89\xD3"
            }
            "VoiceShouldHear"
            {
                "library"		"engine"
                "windows"		"\x48\x89\x5C\x24\x10\x44\x88\x4C\x24\x20\x44\x88\x44\x24\x18"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x41\x89\xD7\x41\x56\x49\x89\xF6\x41\x55\x41\x54\x49\x89\xFC\x53\x48\x83\xEC\x28"
            }
            "IsHearingClient"
            {
                "library"		"engine"
                "windows"		"\x40\x53\x48\x83\xEC\x20\x48\x8B\xD9\x3B\x91\xB8"
                "linux"			"\x55\x48\x89\xE5\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x08\x3B\xB7\xC8"
            }
            // String: "Playing sound on non-networked entity %s"
            "CSoundEmitterSystem_EmitSound"
            {
                "library"		"server"
                "windows"		"\x48\x8B\xC4\x4C\x89\x40\x18\x55\x57"
                "linux"			"\x48\xB8\x2A\x2A\x2A\x2A\xFF\xFF\xFF\xFF\x55\x48\x89\xE5\x41\x57\x41\x89\xF7"
            }
            // String: "hammerUniqueId"
            "CBaseEntity_Spawn"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x10\x48\x89\x74\x24\x18\x57\x48\x83\xEC\x30\x48\x8B\xF2"
                "linux"			"\x55\x48\x89\xE5\x41\x56\x41\x55\x41\x54\x49\x89\xF4\x53\x48\x89\xFB\x48\x83\xEC\x10\xE8\x2A\x2A\x2A\x2A"
            }
            // Is the 4th function in the CCSWeaponBase vtable
            "CCSWeaponBase_Spawn"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x08\x48\x89\x6C\x24\x18\x48\x89\x74\x24\x20\x57\x48\x83\xEC\x30\x48\x8B\xDA\x48\x8B\xE9\xE8\x2A\x2A\x2A\x2A"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x4C\x8D\x75\xC0\x41\x55\x49\x89\xFD\x41\x54\x49\x89\xF4"
            }
            // idk a good way to find this again, i just brute forced the vtable. offset is 133 on CTriggerPush
            "TriggerPush_Touch"
            {
                "library"		"server"
                "windows"		"\x48\x89\x5C\x24\x10\x48\x89\x7C\x24\x18\x55\x48\x8D\xAC\x24\x60\xE0\xFF\xFF"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xF5\x41\x54\x49\x89\xFC\x53\x48\x81\xEC\x28\x20\x2A\x2A\xE8"
            }
            // 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\x10\x48\x89\x6C\x24\x18\x48\x89\x7C\x24\x20\x41\x56\x48\x83\xEC\x20\x0F\xB6\x81\xC0\x02\x2A\x2A\x48"
                "linux"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x49\x89\xF5\x41\x54\x49\x89\xFC\x53\x48\x83\xEC\x08\x0F\xB6\x87\xA8\x05\x2A\x2A\x83"
            }
            // Check vauff's pin in #scripting
            "ServerMovementUnlock"
            {
                "library"		"server"
                "windows"		"\x76\x2A\xF2\x0F\x10\x57\x2A\xF3\x0F\x10\x2A\x2A\x0F\x28\xCA\xF3\x0F\x59\xC0"
                "linux"			"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED\x66\x0F\xD6\x85\x2A\x2A\x2A\x2A"
            }
            // Check vauff's pin in #scripting
            "ClientMovementUnlock"
            {
                "library"		"client"
                "windows"		"\x76\x2A\xF2\x0F\x10\x57\x2A\xF3\x0F\x10\x2A\x2A\x0F\x28\xCA\xF3\x0F\x59\xC0"
                "linux"			"\x0F\x87\x2A\x2A\x2A\x2A\x49\x8B\x7C\x24\x2A\xE8\x2A\x2A\x2A\x2A\x66\x0F\xEF\xED\x66\x0F\xD6\x85\x2A\x2A\x2A\x2A"
            }
            // Check tilgep's pin in #scripting
            "VScriptEnable"
            {
                "library"		"vscript"
                "windows"		"\xBE\x01\x2A\x2A\x2A\x2B\xD6\x74\x2A\x3B\xD6"
                "linux"			"\x83\xFE\x01\x0F\x84\x2A\x2A\x2A\x2A\x83"
            }
            // String: "Noise removal", there should be 3 customermachine checks
            "HammerNoCustomerMachine"
            {
                "library"		"hammer"
                "windows"		"\xFF\x15\x2A\x2A\x2A\x2A\x84\xC0\x0F\x85\x2A\x2A\x2A\x2A\xB9"
                "linux"			""
            }
            // String: "CCSPlayerPawnBase::SwitchTeam", just keep in mind this is actually CCSPlayerController::SwitchTeam
            "CCSPlayerController_SwitchTeam"
            {
                "library"       "server"
                "windows"       "\x40\x56\x57\x48\x81\xEC\x2A\x2A\x2A\x2A\x48\x8B\xF9\x8B\xF2\x8B\xCA"
                "linux"         "\x55\x48\x89\xE5\x41\x55\x49\x89\xFD\x89\xF7"
            }

            // String: "StartGravity", a function call in the function with startgravity in ends with "return (sub_XXX( a1 + 48) > 1);", change the 1 to 2
            "WaterLevelGravity"
            {
                "library"       "server"
                "windows"       "\x3C\x01\x49\x8B\x5B\x10\x49\x8B\x7B\x18\x0F\x97\xC0\x41\x0F\x28"
                "linux"         "\x3C\x01\x0F\x97\xC0\x48\x81\xC4\x50\x01"
            }
            
			// String: "PlayerMove_PostMove", generally function called before the postmove func is CategorizePosition, find the == 1.0 check in CategorizePosition
            "CategorizeUnderwater"
            {
                "library"       "server"
                "windows"       "\x75\x2A\xB3\x01\xEB\x2A\x32\xDB\x45\x32\xED"
                "linux"         "\x0F\x45\xC1\x4D\x85\xC0\x0F\x95\xC1\x20\xC8"
            }

			// Called right after "Removed %s(%s)\n"
			"UTIL_Remove"
            {
                "library"       "server"
                "windows"       "\x48\x85\xC9\x74\x2A\x48\x8B\xD1\x48\x8B\x0D\x01\xC1\xDE\x2A"
                "linux"         "\x48\x89\xFE\x48\x85\xFF\x74\x2A\x48\x8D\x05\x91\xDF\xC4\x2A"
            }
        }
        "Offsets"
        {
            "GameEntitySystem"
            {
                "windows"   "88"
                "linux"     "80"
            }
            "Teleport"
            {
                "windows"   "148"
                "linux"     "147"
            }
            "CollisionRulesChanged"
            {
                "windows"   "173"
                "linux"     "172"
            }
			"IsEntityPawn"
            {
                "windows"   "152"
                "linux"     "151"
            }
			"IsEntityController"
            {
                "windows"   "153"
                "linux"     "152"
            }
        }
        "Patches"
        {
            // Server
            "ServerMovementUnlock"
            {
                "windows"		"\xEB"
                "linux"			"\x90\x90\x90\x90\x90\x90"
            }
            "VScriptEnable"
            {
                "windows"		"\xBE\x02"
                "linux"			"\x83\xFE\x02"
            }
            "WaterLevelGravity"
            {
                "windows"               "\x3C\x02"
                "linux"                 "\x3C\x02"
            }
            "CategorizeUnderwater"
            {
                "windows"               "\x73"
                "linux"                 "\x0F\x42"
            }

            // Client
            "ClientMovementUnlock"
            {
                "windows"		"\xEB"
                "linux"			"\x90\x90\x90\x90\x90\x90"
            }

            // Hammer
            "HammerNoCustomerMachine"
            {
                "windows"		"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
                "linux"			""
            }
        }
    }
}
