"Games"
{
	"left4dead2"
	{
		"Offsets"
		{
			/* Offset into CDirectorMusicBanks::OnRoundStart */
			"TheDirector"
			{
				"windows"	"8"
			}
			
			/* Offset into CDirector::AreWanderersAllowed */
			"CDirectorScavengeMode"
			{
				"windows"	"8"   /* mov ecx, [esi+568h] */
				"linux"		"31"  /* mov eax, [ebx+578h] */
			}
			
			/* Offset from ConnectClientLobbyCheck to cmp with max players check
			   
			   string #Valve_Reject_Server_Full
			 */
			"ValveRejectServerFullFirst"
			{
				"windows"	"31"  /* cmp eax, [esi+180h] -> cmp eax, imm32 */ 
				"linux"		"42"  /* cmp edi, [esi+17ch] -> cmp edi, imm32 */
			}
			
			/* Offset into g_pGameRules */
			"VersusMaxCompletionScore"
			{
				"windows"	"1176"
				"linux"		"1168"
			}
			/* Offset into CTerrorPlayer */
			"SpawnTimer"
			{
				"windows"	"11268"
				"linux"		"11252"
			}
			/* Offset into DifficultyChanged() */
			"HasConfigurableDifficultySetting"
			{
				"windows"	"49"
			}
			/* Offset into ReadWeaponDataFromFileForSlot_SubCall_01 */
			"WeaponInfoDatabase"
			{
				"windows"	"12"
			}
			/* Offset into MeleeWeaponInfoStore_Construction */
			"CMeleeWeaponInfoStore"
			{
				"windows"	"11"
			}
		}
		
		"Signatures"
		{
			
			/* 
			* CTerrorGameRules::GetTeamScore(int,bool)
			*/
			"GetTeamScore"
			{
					"library"    "server"
					"linux"    "@_ZN16CTerrorGameRules12GetTeamScoreEib"
				"windows" "\x8B\x2A\x2A\x2A\x85\xC0\x2A\x2A\x33\xC0\xC2" // found by psychonic
				/* 8B ? ? ? 85 C0 ? ? 33 C0 C2 */
			}
			
			/*
			 * CTerrorGameRules::SetCampaignScores(int,int)
			 */
			"SetCampaignScores" 
			{
				"library"	"server"
				"linux"		"@_ZN16CTerrorGameRules17SetCampaignScoresEii"
				"windows" "\x56\x8D\x44\x2A\x2A\x8D\xB1\x2A\x2A\x2A\x2A\x50\x6A\x00\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x8D\x4C\x2A\x2A\x51\x6A\x01\x8B\xCE\xE8\x2A\x2A\x2A\x2A\x5E\xC2\x08\x00"
					/* 56 8D 44 ? ? 8D B1 ? ? ? ? 50 6A 00 8B CE E8 ? ? ? ? 8D 4C ? ? 51 6A 01 8B CE E8 ? ? ? ? 5E C2 08 00 */
			}
			
			/*
			 * CTerrorGameRules::ClearTeamScores(bool)
			 */
			"ClearTeamScores"
			{
				"library"	"server"
				"linux"		"@_ZN16CTerrorGameRules15ClearTeamScoresEb"
				"windows" "\x51\x53\x55\x56\x8B\xE9\x57\x33\xDB\x33\xF6**********\x50\x56"
			}
			
			/*
			 * CBaseServer::SetReservationCookie(uint64_t, char*, va_list)
			 *  - clear the reservation by setting a cookie of 0
			 */
			"SetReservationCookie" 
			{
				"library"	"engine"
				"linux"		"@_ZN11CBaseServer20SetReservationCookieEyPKcz"
				"windows" "\x81\xEC\x2A\x2A\x2A\x2A\x55\x8B\xAC\x24\x2A\x2A\x2A\x2A\x56\x8B\xB4\x24\x2A\x2A\x2A\x2A\x57\x8B\xBC\x24\x2A\x2A\x2A\x2A\x3B\xBE\x2A\x2A\x2A\x2A\x75\x08\x3B\xAE\x2A\x2A\x2A\x2A\x74\x63"
				/* 81 EC ? ? ? ? 55 8B AC 24 ? ? ? ? 56 8B B4 24 ? ? ? ? 57 8B BC 24 ? ? ? ? 3B BE ? ? ? ? 75 08 3B AE ? ? ? ? 74 63 */
			}
			
			/*
			 * CTerrorPlayer::TakeOverBot
			 */
			"TakeOverBot"
			{
				"library"    "server"
				"linux"    "@_ZN13CTerrorPlayer11TakeOverBotEb"
				"windows" "\x81\x2A\x2A\x2A\x2A\x2A\x53\x55\x56\x8D\x2A\x2A\x2A\x57\x8B\xF1\x33\xDB"
				/* 81 ? ? ? ? ? 53 55 56 8D ? ? ? 57 8B F1 33 DB */
			}
			
			/* 
			 * SurvivorBot::SetHumanSpectator(CTerrorPlayer*) 
			 */
			"SetHumanSpec"
			{
				"library"	"server"
				"linux"		"@_ZN11SurvivorBot17SetHumanSpectatorEP13CTerrorPlayer"
				"windows"	"\x53\x56\x8B\xF1\x33\xDB\x39\x2A\x2A\x2A\x2A\x2A\x7E\x2A\x5E\x32\xC0\x5B\xC2\x04\x00"
			}
			
			/* CDirectorScavengeMode::OnBeginRoundSetupTime
		        *  used to reset the setup timer during scavenge mode
 			*/
			"CDirectorScavengeMode_OnBeginRoundSetupTime"
			{
				"library" 	"server"
				"linux"		"@_ZN21CDirectorScavengeMode21OnBeginRoundSetupTimeEv"
				"windows" 	"\x83\xEC\x10\x56\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x84\xC0\x74\x2A\xA1\x2A\x2A\x2A\x2A\xD9\x40\x2A\x51"
				/* 83 EC 10 56 8B F1 E8 ? ? ? ? 84 C0 74 ? A1 ? ? ? ? D9 40 ? 51 */
			}
			/* CTerrorGameRules::ResetRoundNumber
			 *  used to reset the round number during scavenge mode
 			 */
			"CTerrorGameRules_ResetRoundNumber"
			{
				"library" 	"server"
				"linux"		"@_ZN16CTerrorGameRules16ResetRoundNumberEv"
				"windows" 	"\x56\x8B\xF1\x83\xBE\x2A\x2A\x2A\x2A\x00\x74\x2A\xE8\x2A\x2A\x2A\x2A\xC7\x86\x2A\x2A\x2A\x2A\x00\x00\x00\x00\x5E\xC3"
				/* 56 8B F1 83 BE ? ? ? ? 00 74 ? E8 ? ? ? ? C7 86 ? ? ? ? 00 00 00 00 5E C3 */
			}
			
			/* CTerrorGameRules::SetRoundEndTime(float)
			 *  used to freeze the scavenge game clock
 			 */
			"CTerrorGameRules_SetRoundEndTime"
			{
				"library" 	"server"
				"linux"		"@_ZN16CTerrorGameRules15SetRoundEndTimeEf"
				"windows" 	"\xD9\x44\x24\x04\x56\x8B\xF1\xD8\x9E\x2A\x2A\x2A\x2A\x57\xDF\xE0\xF6\xC4\x2A\x7B\x2A\xE8"
				/* D9 44 24 04 56 8B F1 D8 9E ? ? ? ? 57 DF E0 F6 C4 ? 7B ? E8 */
			}
			
			
			/* Used to get offset for CDirectorScavengeMode 
				*(director + offset) == ptr to CDirectorScavengeMode
 			*/
			"CDirector_AreWanderersAllowed"
			{
				"library" 	"server"
				"linux"		"@_ZNK9CDirector19AreWanderersAllowedEv"
				"windows" 	"\x83\xEC\x0C\x56\x8B\xF1\x8B\x8E\x2A\x2A\x2A\x2A\x8D\x2A\x2A\x2A\x50\xE8\x2A\x2A\x2A\x2A\x84\xC0"
				/* 83 EC 0C 56 8B F1 8B 8E ? ? ? ? 8D ? ? ? 50 E8 ? ? ? ? 84 C0 */
			}
			
			/* Used solely to get the offset for TheDirector */
			"DirectorMusicBanks_OnRoundStart"
			{
				"library"	"server"
				"windows"       "\x83\xEC\x14\x57\x8B\xF9\x8B\x0D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x53\x55\x6A\x24\xE8"
				/* 83 EC 14 57 8B F9 8B 0D ? ? ? ? E8 ? ? ? ? 84 C0 0F ? ? ? ? ? 53 55 6A 24 E8 */
			}
			
			/* Find the Director/ZombieManager singleton classes */
			
			"TheDirector"
			{
				"library"	"server"
				"linux"		"@TheDirector"
			}
			
			/* Find the WeaponInfo Database dictionary */
			"WeaponInfoDatabase"
			{
				"library"	"server"
				"linux"		"@_ZL20m_WeaponInfoDatabase"
			}
			
			/* We can find the WeaponInfoDatabase location in this sub on windows */
			"ReadWeaponDataFromFileForSlot"
			{
				"library"        "server"
				"windows"        "\x83\xEC\x08\x85\xF6\x74\x2A\x8D\x04\x24\x50\xB9"
					/* 83 EC 08 85 F6 74 ? 8D 04 24 50 B9 */
			}
			
			/* Find the Melee Weapon Info dictionary */
			"CMeleeWeaponInfoStore"
			{
				"library"	"server"
				"linux"		"@g_MeleeWeaponInfoStore"
			}
			
			/* We can find the CMeleeWeaponInfo location in this sub on windows */
			"MeleeWeaponInfoStore_Construction"
			{
				"library"        "server"
				"windows"        "\x53\x8B\xD9\x8B\x83\x2A\x2A\x2A\x2A\x50\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x75\x09\xB8\x2A\x2A\x2A\x2A\x5B\xC2"
					/* 53 8B D9 8B 83 ? ? ? ? 50 B9 ? ? ? ? E8 ? ? ? ? 85 C0 75 09 B8 ? ? ? ? 5B C2*/

			}
			
			/*
			 * CDirector::RestartScenarioFromVote(const char*)
			 */
			"RestartScenarioFromVote"
			{
				"library"	"server"
				"linux"	"@_ZN9CDirector23RestartScenarioFromVoteEPKc"
				"windows" "\x56\x8B\xF1\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x57\x74\x2A\x6A\x01\xE8\x2A\x2A\x2A\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9"
					/* 56 8B F1 8B 0D ? ? ? ? 85 C9 57 74 ? 6A 01 E8 ? ? ? ? 8B 0D ? ? ? ? 85 C9 */
			}
			
			/*
			* ZombieManager::SpawnTank(Vector  const&, QAngle  const&)
			*/
			"SpawnTank"
			{ 
				"library" "server"
				"linux" "@_ZN13ZombieManager9SpawnTankERK6VectorRK6QAngle"
				"windows" "\x57\x8B\xF9\x8B\x0D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x7C\x14\x8B\x0D\x2A\x2A\x2A\x2A\x39\x81\x2A\x2A\x2A\x2A\x7C\x06"
				/* 57 8B F9 8B 0D ? ? ? ? E8 ? ? ? ? 85 C0 7C 14 8B 0D ? ? ? ? 39 81 ? ? ? ? 7C 06 */
			}
			
			/*
			* ZombieManager::SpawnWitch(Vector  const&, QAngle  const&)
			*/
			"SpawnWitch"
			{ 
				"library" "server"
				"linux" "@_ZN13ZombieManager10SpawnWitchERK6VectorRK6QAngle"
				"windows" "\x8B\x0D\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x75\x2A\xC2"
					/* 8B 0D ? ? ? ? E8 ? ? ? ? 85 C0 75 ? C2 */
			}
			
			
			/*
			* CDirectorVersusMode::OnVersusRoundStarted()
			*/
			"OnVersusRoundStarted"
			{ 
				"library" "server"
				"linux" "@_ZN19CDirectorVersusMode20OnVersusRoundStartedEv"
				"windows" "\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x11\xA1\x2A\x2A\x2A\x2A\xD9\x40\x2A\x51\xD9\x1C\x24"
					/* 8B 0D ? ? ? ? 85 C9 74 11 A1 ? ? ? ? D9 40 ? 51 D9 1C 24 */
			}
			
			/*
			 * CDirector::OnFirstSurvivorLeftSafeArea(CTerrorPlayer *)
			 */
			"OnFirstSurvivorLeftSafeArea"
			{ 
				"library" "server"
				"linux" "@_ZN9CDirector27OnFirstSurvivorLeftSafeAreaEP13CTerrorPlayer"
				"windows" "\x83\xEC\x10\x55\x8B\x6C\x24\x18\x56\x8B\xF1\x8B\x8E\x2A\x2A\x2A\x2A\x55\xE8\x2A\x2A\x2A\x2A\x84\xC0"
					/* 83 EC 10 55 8B 6C 24 18 56 8B F1 8B 8E ? ? ? ? 55 E8 ? ? ? ? 84 C0 */
			}
			
			/*
			 * CDirector::GetScriptValue(const char*, int)
			 */
			"CDirector_GetScriptValueInt"
			{
				"library" "server"
				"linux" "@_ZN9CDirector14GetScriptValueEPKci"
				"windows" "\x8B\x81\x2A\x2A\x2A\x2A\x83\xEC\x08\x83\xF8\xFF\x74\x55\x8B\x0D\x2A\x2A\x2A\x2A\x33\xD2\x3B\xCA\x74\x49\x56\x8D\x74\x24\x04\x56\x8B\x74\x24\x14\x66\x89\x54\x24\x0C\x66\x89\x54\x24\x0E\x89\x54\x24\x08\x8B\x11\x56\x50\x8B\x42\x2A\xFF\xD0\x84\xC0\x5E\x74\x23\x8D\x4C\x24\x10\x51\x8D\x4C\x24\x04\xE8\x2A\x2A\x2A\x2A\x84\xC0\x75\x11\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x11\x8B\x52\x2A\x8D\x04\x24\x50\xFF\xD2\x8B\x44\x24\x10\x83\xC4\x08\xC2\x08\x00"
					 /* 8B 81 ? ? ? ? 83 EC 08 83 F8 FF 74 55 8B 0D ? ? ? ? 33 D2 3B CA 74 49 56 8D 74 24 04 56 8B 74 24 14 66 89 54 24 0C 66 89 54 24 0E 89 54 24 08 8B 11 56 50 8B 42 ? FF D0 84 C0 5E 74 23 8D 4C 24 10 51 8D 4C 24 04 E8 ? ? ? ? 84 C0 75 11 8B 0D ? ? ? ? 8B 11 8B 52 ? 8D 04 24 50 FF D2 8B 44 24 10 83 C4 08 C2 08 00 */
			}
			
			/*
			 * CDirector::GetScriptValue(const char*, float)
			 */
			"CDirector_GetScriptValueFloat"
			{
				"library" "server"
				"linux" "@_ZN9CDirector14GetScriptValueEPKcf"
				"windows" "\x8B\x81\x2A\x2A\x2A\x2A\x83\xEC\x2A\x83\x2A\x2A\x74\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x33\xD2\x3B\xCA\x74\x2A\x56\x8D\x74\x2A\x2A\x56\x8B\x74\x2A\x2A\x66\x89\x2A\x2A\x2A\x66\x89\x2A\x2A\x2A\x89\x54\x2A\x2A\x8B\x11\x56\x50\x8B\x42\x2A\xFF\xD0\x84\xC0\x5E\x74\x2A\x8D\x4C\x2A\x2A\x51\x8D\x4C\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x84\xC0\x75\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x11\x8B\x52\x2A\x8D\x2A\x2A\x50\xFF\xD2\xD9\x2A\x2A\x2A\x83\xC4\x2A\xC2"
					 /* 8B 81 ? ? ? ? 83 EC ? 83 ? ? 74 ? 8B 0D ? ? ? ? 33 D2 3B CA 74 ? 56 8D 74 ? ? 56 8B 74 ? ? 66 89 ? ? ? 66 89 ? ? ? 89 54 ? ? 8B 11 56 50 8B 42 ? FF D0 84 C0 5E 74 ? 8D 4C ? ? 51 8D 4C ? ? E8 ? ? ? ? 84 C0 75 ? 8B 0D ? ? ? ? 8B 11 8B 52 ? 8D ? ? 50 FF D2 D9 ? ? ? 83 C4 ? C2 */
			}
			
			/*
			 * CDirector::GetScriptValue(const char*, const char*, char*, int)
			 */
			"CDirector_GetScriptValueString"
			{
				"library" "server"
				"linux" "@_ZN9CDirector14GetScriptValueEPKcS1_Pci"
				"windows" "\x8B\x81\x2A\x2A\x2A\x2A\x83\xEC\x2A\x83\xF8\x2A\x56\x8B\x74\x2A\x2A\x74\x2A\x8B"
					 /* 8B 81 ? ? ? ? 83 EC ? 83 F8 ? 56 8B 74 ? ? 74 ? 8B */
			}
			
			/*
			 * CDirector::IsFinaleEscapeInProgress(void)
			 */
			"CDirector_IsFinaleEscapeInProgress"
			{
				"library" "server"
				"linux" "@_ZNK9CDirector24IsFinaleEscapeInProgressEv"
				"windows" "\x8B\x81\x2A\x2A\x2A\x2A\x83\x38\x2A\x75\x03\x32\xC0\xC3\x33\xC0\x83\xB9\x2A\x2A\x2A\x2A\x02\x0F\x94\xC0\xC3"
					 /* 8B 81 ? ? ? ? 83 38 ? 75 03 32 C0 C3 33 C0 83 B9 ? ? ? ? 02 0F 94 C0 C3 */
			}
			
			/*
			 * CTerrorPlayer::CanBecomeGhost(bool areSpawnsDisabled)
			 */
			"CTerrorPlayer_CanBecomeGhost"
			{
				"library" "server"
				"linux" "@_ZN13CTerrorPlayer14CanBecomeGhostEb"
				"windows" "\x83\xEC\x2A\x56\x57\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x83\xF8\x2A\x74\x2A\x33\xFF\x39\xBE\x2A\x2A\x2A\x2A\x74\x2A\x80\x2A\x2A\x2A\x0F"
					 /* 83 EC ? 56 57 8B F1 E8 ? ? ? ? 83 F8 ? 74 ? 33 FF 39 BE ? ? ? ? 74 ? 80 ? ? ? 0F */
			}
			
			/*
			 * CTerrorPlayer::OnEnterGhostState()
			 */

			"CTerrorPlayer_OnEnterGhostState"
			{
				"library"	"server"
				"linux"		"@_ZN13CTerrorPlayer17OnEnterGhostStateEv"
				"windows"	"\x53\x55\x56\x8B\xF1\x8B\x86\x2A\x2A\x2A\x2A\x8B\x50\x2A\x8D\x8E\x2A\x2A\x2A\x2A\x57\xFF"
			 /* 53 55 56 8B F1 8B 86 ? ? ? ? 8B 50 ? 8D 8E ? ? ? ? 57 FF */
			}
			
			/*
			 * CDirector::IsFinale(void)const
			 */
			"CDirector_IsFinale"
			{
				"library"	"server"
				"linux"	"@_ZNK9CDirector8IsFinaleEv"
				"windows" "\x8B\x81****\x33\xC9\x83\x38*\x0F\x95\xC1\x8A\xC1\xC3"
				/* 8B 81 ? ? ? ? 33 C9 83 38 ? 0F 95 C1 8A C1 C3 */
			}
			
			/*
			 * CDirector::TryOfferingTankBot(void)
			 */
			"TryOfferingTankBot"
			{
				"library"	"server"
				"linux"	"@_ZN9CDirector18TryOfferingTankBotEP11CBaseEntityb"
				"windows" "\x51\x83\x7C\x24\x08\x00\x55\x8B\xE9\x0F\x84"
				/* 51 83 7C 24 08 00 55 8B E9 0F 84  - No addresses-fairly unique call*/
			}
			
			/*
			 * CDirector::OnMobRushStart(void) - used by boomer and natural horde functions. Resets natural horde timer.
			 *
			 * find by String: "MobMinSize", its inlined in Windows
			 */
			"OnMobRushStart"
			{
				"library"	"server"
				"linux"	"@_ZN9CDirector14OnMobRushStartEv"
				"windows" "\xA1\x2A\x2A\x2A\x2A\xD9\x2A\x2A\x56\x51\xD9\x2A\x2A\x68\x2A\x2A\x2A\x2A\x8B\xF1\xE8"
				/* A1 ? ? ? ? D9 ? ? 56 51 D9 ? ? 68 ? ? ? ? 8B F1 E8 */
			}
			
			/*
			 * CDirector::SpawnMobs(void) - fired every frame, useless
			 *
			 * is xref to OnMobRushStart
			 */
			"CDirector_SpawnMobs"
			{
				"library"	"server"
				"linux"	"@_ZN9CDirector9SpawnMobsEv"
				"windows" "\xA1\x2A\x2A\x2A\x2A\x83\x2A\x2A\x2A\x56\x8B\xF1\x75\x2A\x83\x2A\x2A\x2A\x2A\x2A\x2A\x75\x2A\xD9\xEE"
				/* A1 ? ? ? ? 83 ? ? ? 56 8B F1 75 ? 83 ? ? ? ? ? ? 75 ? D9 EE */
			}
			
			/*
			 * ZombieManager::SpawnITMob(int) - used for bile hordes, increases spawn count
			 *
			 * has strings in it
			 */
			"Zombiemanager_SpawnITMob"
			{
				"library"	"server"
				"linux"	"@_ZN13ZombieManager10SpawnITMobEi"
				"windows" "\xA1\x2A\x2A\x2A\x2A\xD9\x2A\x2A\x56\x57\x8B\x7C\x2A\x2A\x57\x83\xEC\x2A\xDD"
				/* A1 ? ? ? ? D9 ? ? 56 57 8B 7C ? ? 57 83 EC ? DD */
			}
			
			/*
			 * ZombieManager::SpawnITMob(int) - used for natural/z_spawn 
			 *		hordes, increases spawn count and calls horde music, etc
			 *
			 * has more strings in it
			 */
			"Zombiemanager_SpawnMob"
			{
				"library"	"server"
				"linux" "@_ZN13ZombieManager8SpawnMobEi"
				"windows" "\xA1\x2A\x2A\x2A\x2A\xD9\x40\x2A\x83\xEC\x08\x53\x56\x57"
				/* A1 ? ? ? ? D9 40 ? 83 EC 08 53 56 57 */

			}
			
			/*
			 *   CTerrorPlayer::OnStaggered(CBaseEntity *, Vector  const*) - used by L4D2 on Survivors, causes staggering (e.g. Charger Impact nearby)
			 */
			"CTerrorPlayer_OnStaggered"
			{
				"library"	"server"
				"linux"	"@_ZN13CTerrorPlayer11OnStaggeredEP11CBaseEntityPK6Vector"
				"windows" "\x83\xEC\x2A\x53\x55\x56\x57\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x8B\x06\x8B\x90\x2A\x2A\x2A\x2A\x8B\xCE\xFF\xD2\x84\xC0\x0F"
				/* 83 EC ? 53 55 56 57 8B F1 E8 ? ? ? ? 84 C0 0F ? ? ? ? ? 8B 06 8B 90 ? ? ? ? 8B CE FF D2 84 C0 0F */
			}
			
			/*
			 *   CTerrorPlayer::OnShovedBySurvivor(CTerrorPlayer*, Vector  const&) - used by L4D2 on Special Infected (got melee'd)
			 */
			"CTerrorPlayer_OnShovedBySurvivor"
			{
				"library"	"server"
				"linux"	"@_ZN13CTerrorPlayer18OnShovedBySurvivorEPS_RK6Vector"
				"windows" "\x81\xEC\x2A\x2A\x2A\x2A\x56\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x84\xC0\x0F\x2A\x2A\x2A\x2A\x2A\x8B\x8C\x2A\x2A\x2A\x2A\x2A\x55\x33\xED\x3B\xCD\x74"
				/* 81 EC ? ? ? ? 56 8B F1 E8 ? ? ? ? 84 C0 0F ? ? ? ? ? 8B 8C ? ? ? ? ? 55 33 ED 3B CD 74 */
			}
			
			/*
			 *   CTerrorPlayer::GetWalkTopSpeed(void)const
			 */
			"CTerrorPlayer_GetWalkTopSpeed"
			{
				"library"	"server"
				"linux"	"@_ZNK13CTerrorPlayer15GetWalkTopSpeedEv"
				"windows" "\x56\x8B\xF1\x80\x2A\x2A\x2A\x2A\x2A\x2A\x74\x2A\x5E\xE9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x50\xE8"
				/* 56 8B F1 80 ? ? ? ? ? ? 74 ? 5E E9 ? ? ? ? E8 ? ? ? ? 50 E8 */
			}
			
			/*
			 *   CTerrorPlayer::GetRunTopSpeed(void)const
			 */
			"CTerrorPlayer_GetRunTopSpeed"
			{
				"library"	"server"
				"linux"	"@_ZNK13CTerrorPlayer14GetRunTopSpeedEv"
				"windows" "\x83\xEC\x2A\x56\x8B\xF1\x8B\x06\x8B\x90\x2A\x2A\x2A\x2A\xFF\xD2\x84\xC0\x74\x2A\xA1"
				/* 83 EC ? 56 8B F1 8B 06 8B 90 ? ? ? ? FF D2 84 C0 74 ? A1 */
			}
			
			/*
			 *   CTerrorPlayer::GetCrouchTopSpeed(void)const
			 */
			"CTerrorPlayer_GetCrouchTopSpeed"
			{
				"library"	"server"
				"linux"	"@_ZNK13CTerrorPlayer17GetCrouchTopSpeedEv"
				"windows" "\x56\x8B\xF1\x80\x2A\x2A\x2A\x2A\x2A\x2A\x74\x2A\x5E\xE9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xF8"
				/* 56 8B F1 80 ? ? ? ? ? ? 74 ? 5E E9 ? ? ? ? E8 ? ? ? ? 83 F8 */
			}
			
			/*
			 *   GetDifficulty(void)
			 */
			"GetDifficulty"
			{
				"library"	"server"
				"linux"	"@_Z13GetDifficultyv"
				"windows" "\xA1\x2A\x5C\x68\x10\xC3"
				/* A1 ? 5C 68 10 C3 */
			}
			
			/*
			 *	 CTerrorGameRules::HasConfigurableDifficultySetting(void)
			 */
			"HasConfigurableDifficulty"
			{
				"library"	"server"
				"linux"		"@_ZN16CTerrorGameRules32HasConfigurableDifficultySettingEv"
				"windows"	"\xE8\x2A\xFC\xFF\xFF\x84\xC0\x75\x0C\xE8\x2A\x2A\xFF\xFF\x84\xC0\x75\x03\x33\xC0\xC3\xB8\x01\x00\x00\x00\xC3"
				/* E8 ? FC FF FF 84 C0 75 0C E8 ? ? FF FF 84 C0 75 03 33 C0 C3 B8 01 00 00 00 C3 */

				/* Using offset for windows */
			}
			
			/*
			 *	 DifficultyChanged(ConVar *)
			 *		Only used for windows to find HasConfigurableDifficulty
			 */
			"DifficultyChanged"
			{
				"library"	"server"
				"linux"		"@_ZL17DifficultyChangedP7IConVarPKcf"
				"windows"	"\x8B\x44\x24\x04\x83\xEC\x08\x53\x57\x50\x8D\x4C\x24\x0C\xE8\x2A\x2A\x2A\x2A\x8B"
				/* 8B 44 24 04 83 EC 08 53 57 50 8D 4C 24 0C E8 ? ? ? ? 8B */
			}
			/*
			 *   CTerrorGameRules::GetSurvivorSet(void)
			 */
			"GetSurvivorSet"
			{
				"library"	"server"
				"linux"	"@_ZN16CTerrorGameRules14GetSurvivorSetEv"
				"windows" "\xA1\x2A\x2A\x2A\x2A\x85\xC0\x75\x2A\x56\x8D"
				/* A1 ? ? ? ? 85 C0 75 ? 56 8D */
			}
			
			/*
			 *   CTerrorGameRules::FastGetSurvivorSet(void)
			 */
			"FastGetSurvivorSet"
			{
				"library"	"server"
				"linux"	"@_ZN16CTerrorGameRules18FastGetSurvivorSetEv"
				"windows" "\x56\xBE\x02\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x74"
				/* 56 BE 02 ? ? ? E8 ? ? ? ? 85 C0 74 */
			}
			
			/*
			 *	CDirectorVersusMode::GetMissionVersusBossSpawning(float&, float&, float&, float&)
			 */
			 
			"GetMissionVersusBossSpawning"
			{
				"library"	"server"
				"linux"		"@_ZN19CDirectorVersusMode28GetMissionVersusBossSpawningERfS0_S0_S0_"			
				"windows"	"\x6A\x00\xE8\x2A\x2A\x2A\x2A\x83\xC4\x04\x85\xC0\x75\x05\x32\xC0\xC2\x10\x00"
				/* 6A 00 E8 ? ? ? ? 83 C4 04 85 C0 75 05 32 C0 C2 10 00 */
			}
			
			/*
			 *	CTerrorGameRules::GetMissionCurrentMap(KeyValues **)
			 */
			"GetMissionCurrentMap"
			{
				"library"	"server"
				"linux" 	"@_ZN16CTerrorGameRules20GetMissionCurrentMapEPP9KeyValues"
				"windows"	"\x56\x57\x8B\x7C\x2A\x2A\x85\xFF\x74\x2A\xC7\x2A\x2A\x2A\x2A\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x2A\xFF\xD2\x8B\x10\x8B\xC8\x8B\x42\x2A\x6A\x00\xFF\xD0\x8B\xF0\x85\xF6\x75\x2A\x5F\x5E\xC3\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x11\x8B\x42\x2A\x57\x56\xFF\xD0\x8B"
			}
			
			/*
			 *	CThrow::ActivateAbililty()
			 *		Start a tank rock throw
			 */
			"CThrowActivate"
			{
				"library"	"server"
				"linux"		"@_ZN6CThrow15ActivateAbilityEv"
				"windows"	"\x53\x8B\xD9\x8B\x83\x2A\x2A\x2A\x2A\x83\xF8\xFF\x0F\x84\xEC\x01"
				/*  53 8B D9 8B 83 ? ? ? ? 83 F8 FF 0F 84 EC 01 */
			}
			
			/*
			 *	InfectedShoved::OnShoved(Infected *, CBaseEntity *)
			 *		Common Infected gets staggered
			 */
			"OnInfectedShoved"
			{
				"library"	"server"
				"linux"		"@_ZN14InfectedShoved8OnShovedEP8InfectedP11CBaseEntity"
				"windows"	"\x8B\x44\x2A\x2A\x50\xE8\x2A\x2A\x2A\x2A\x8B\x44\x2A\x2A\x33\xC9\xC7"
				/* 8B 44 ? ? 50 E8 ? ? ? ? 8B 44 ? ? 33 C9 C7 */
			}
			
			/*
			 *	CTerrorMeleeWeapon::StartMeleeSwing(CTerrorPlayer *, bool)
			 *
			 *  find from TestMeleeSwingCollision (string "MeleeSlashSplatter") xref -> DoMeleeSwing -> xref of that
			 */
			"StartMeleeSwing"
			{
				"library"	"server"
				"linux"		"@_ZN18CTerrorMeleeWeapon15StartMeleeSwingEP13CTerrorPlayerb"
				"windows"	"\x53\x55\x56\x8B\xF1\x8B\x86\x2A\x2A\x2A\x2A\x50\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x8B\xE8\x33\xDB\x3B\xEB\x0F"
				/* 53 55 56 8B F1 8B 86 ? ? ? ? 50 B9 ? ? ? ? E8 ? ? ? ? 8B E8 33 DB 3B EB 0F */
			}
			
			/*
			 *	CDirectorScriptedEventManager::SendInRescueVehicle(void)
			 *
			 *  find by String "FinaleEscapeStarted"
			 */
			"SendInRescueVehicle"
			{
				"library"	"server"
				"linux"		"@_ZN29CDirectorScriptedEventManager19SendInRescueVehicleEv"
				"windows"	"\x83\xEC\x18\x56\x68\x2A\x2A\x2A\x2A\x8B\xF1\x6A\x00\xB9\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x85\xC0\x75\x2A\x68"
                /* 83 EC 18 56 68 ? ? ? ? 8B F1 6A 00 B9 ? ? ? ? E8 ? ? ? ? 85 C0 75 ? 68 */
			}
			
			/*
			 *	CDirectorScriptedEventManager__ChangeFinaleStage(int, char arg, int)
			 * or CDirectorScriptedEventManager::ChangeFinaleStage(CDirectorScriptedEventManager::FinaleStageType,char  const*)
			 *
			 *  find by String "CHANGEFINALESTAGEOVERRIDE: %s\n"
			 */
			"ChangeFinaleStage"
			{
				"library"	"server"
				"linux"		"@_ZN29CDirectorScriptedEventManager17ChangeFinaleStageENS_15FinaleStageTypeEPKc"
				"windows"	"\x2A\x2A\x2A\x2A\x2A\x2A\x53\x8B\x9C\x2A\x2A\x2A\x2A\x2A\x57\x53\x68"
				/* ? ? ? ? ? ? 53 8B 9C ? ? ? ? ? 57 53 68 */
			}

			/*
			 *	CDirectorVersusMode::EndVersusModeRound(bool)
			 *  Updates scores using a bunch of CTerrorGameRules calls and triggers the fullscreen_vs_scoreboard viewport panel
			 *
			 *  find by String "fullscreen_vs_scoreboard", and look for a func which also creates a "scores" kv and sets values for "t1", "t2", "c1", "c2", and "tiebreak"
			 */
			"EndVersusModeRound"
			{
				"library"	"server"
				"linux"		"@_ZN19CDirectorVersusMode18EndVersusModeRoundEb"
				"windows"	"\x83\xEC\x10\x57\x8B\xF9\xE8"
				/* 83 EC 10 57 8B F9 E8 */
			}
			
/*********************************************************************
****************** PLAYER SLOTS PATCHING *****************************
*********************************************************************/

			/*
			* CTerrorGameRules::GetMaxHumanPlayers(void)
			* We just override the return value to our own
			* 
			* This method is called for max players when viewing server info
			* Overriding this on Linux changes the server browser maxplayers
			*
			* On Windows overriding it doesn't fix the server browser,
			* but it does break scavenge mode (like the map doesn't support scavenge)
			*/
			"GetMaxHumanPlayers"
			{
				"library" "server"
				"linux" "@_ZNK16CTerrorGameRules18GetMaxHumanPlayersEv"
				"windows" "\xF7\x05\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x74\x2A\xB8\x2A\x2A\x2A\x2A\xEB\x2A\xA1\x2A\x2A\x2A\x2A\x8B\x40\x2A\x85\xC0\x75\x2A\xB8\x2A\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x2A\x2A\x8B\x11\x50\x8B\x2A\x2A\xFF\xD0\x85\xC0\x74\x2A\x6A\x00\x68\x2A\x2A\x2A\x2A\x8B\xC8\xE8\x2A\x2A\x2A\x2A\x85\xC0\x7E"
			}
			
			/*
			* Total Number of Players Supported (Steam Group/Lobby)
			* Currently disabled - SourceMod unable to look up other libraries.
			*
				"GetTotalNumPlayersSupported"
				{
					"library"       "matchmaking_ds"
					"linux"         "@_ZN11CMatchTitle27GetTotalNumPlayersSupportedEv"
				}
			*/
			
			/* CServerGameClients::GetPlayerLimits(int& , int&, int&) */
			
			"GetPlayerLimits"
			{
				"library"	"server"
				"linux"		"@_ZNK18CServerGameClients15GetPlayerLimitsERiS0_S0_"
				"windows"    "\x8B\x44\x24\x04\x8B\x4C\x24\x08\xC7\x00\x2A\x2A\x2A\x2A\xC7\x01\x2A\x2A\x2A\x2A\x8B\x10"
					/* 8B 44 24 04 8B 4C 24 08 C7 00 ? ? ? ? C7 01 ? ? ? ? 8B 10 */
			}
			
			/*
			* int CBaseServer::GetMasterServerPlayerCounts(int &, int &, int &)
			* 
			* Used to override server browser maxplayers reporting (Windows)
			*/
			"GetMasterServerPlayerCounts"
			{
				"library" "engine"
				"linux" "@_ZN11CBaseServer27GetMasterServerPlayerCountsERiS0_S0_"
				"windows" "\x56\x8B\xF1\xE8\x2A\x2A\x2A\x2A\x8B\x4C\x24\x08\x89\x01\x8B\x0D\x2A\x2A\x2A\x2A\x85\xC9\x74\x2A\x8B\x11\x8B\x42\x48"

				/* 
56 8B F1 E8 ? ? ? ? 8B 4C 24 08 89 01 8B 0D ? ? ? ? 85 C9 74 ? 8B 11 8B 42 48
				*/

			}
			
			/* Not an actual function,
			   this is inside CBaseServer::ConnectClient (a jz instruction)
			   
			   use it to remove skippable code when sv_allow_lobby_connect 0
			   */
			"ConnectClientLobbyCheck"
			{
				/* look for "#Valve_Reject_Server_Full" */
				"library"	"engine"
				"linux"		"\x8B\x2A\x2A\x2A\x00\x00\x85\x2A\x74\x2C"
                /* 8B ? ? ? 00 00 85 ? 74 2C */

				"windows"	"\x74\x2A\x8B\x54\x2A\x2A\x8B\x06\x8B\x7A\x2A\x8B\x50\x2A\x8B\xCE\xFF\xD2\x2B\xF8\x8B\x06\x8B\x50\x2A\x8B\xCE\xFF\xD2\x03\xC7"
					/* 74 ?  8B 54 ?  ?  8B 06 8B 7A ?  8B 50 ?  8B CE FF D2 2B F8 8B 06 8B 50 ?  8B CE FF D2 03 C7 */			
			}
			
			
			/* Not an actual function,
			   This rejects players when there are all full human players
			   
			   string "Human player limit reached (%d/%d)"
			   
			   deprecated on linux: This function checks GetMaxHumanPlayers 
					on linux, so patching this to an unconditional jump 
					removes a check on maxplayers.
			   */
			"HumanPlayerLimitReached"
			{
				"library"	"server"
				"linux"		"\x7E\x2A\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x2A\x89\x2A\x2A\x2A\x8B\x2A\x2A"
				/* linux: 7E ? 8B ? ? 89 ? ? ? 8B ? ? 89 ? ? ? 8B ? ? 89 ? ? ? 8B ? ? 89 ? ? ? 8B ? ? 89 ? ? ? 8B ? ? */
				"windows" "\x7C\x2A\x8B\x2A\x2A\x2A\x8B\x2A\x2A\x2A\x50\x57\x68\x2A\x2A\x2A\x2A\x51\x52\xE8\x2A\x2A\x2A\x2A\x83\xC4\x2A\x5F\x5E\x32\xC0\x5B"
				/* windows: 7C ?  8B ?  ?  ?  8B  ? ?  ?  50 57 68 ?  ?  ?  ? 51 52 E8 ? ?  ? ? 83 C4 ? 5F 5E 32 C0 5B */			
			}
			
/*********************************************************************
****************** MISC USEFUL NATIVES *******************************
*********************************************************************/			

			/* CTerrorGameRules::IsMissionFinalMap()
				Uses campaign mission file to determine if the current map 
				is a Final(e) map.
				*/
			"IsMissionFinalMap"
			{
				"library"	"server"
				"linux"		"@_ZN16CTerrorGameRules17IsMissionFinalMapEv"
				"windows"	"\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01\x8B\x50\x28\x56\xFF\xD2\x8B\x10\x8B\xC8\x8B\x42\x04\x6A\x00\xFF\xD0\x8B\xF0\x85\xF6\x75\x04\xB0" 
							/* 8B 0D ? ? ? ? 8B 01 8B 50 28 56 FF D2 8B 10 8B C8 8B 42 04 6A 00 FF D0 8B F0 85 F6 75 04 B0 */
			}
			/* CDirector::ResetMobTimer()
				Resets the Director's natural horde timer. Normally this
				is called when a horde is spawned naturally or by boomer.
				Small function, nearly hits another segment in the file.
				The offset 0x1CC is the unique portion.
				*/
			"ResetMobTimer"
			{
				"library"	"server"
				"linux"		"@_ZN9CDirector13ResetMobTimerEv"
				"windows"	"\xD9\xEE\x51\x81\xC1\xD4\x01\x00\x00\xD9\x1C\x24\xE8\x2A\x2A\x2A\x2A\xC3"
							/* D9 EE 51 81 C1 D4 01 00 00 D9 1C 24 E8 ? ? ? ? C3 */
			}
			/* CGameRulesProxy::NotifyNetworkStateChanged()
				This function is called before changing a variety of 
				pieces of networked data (data which is reflected in network
				game states).
				*/
			"NotifyNetworkStateChanged"
			{
				"library"	"server"
				"linux"		"@_ZN15CGameRulesProxy25NotifyNetworkStateChangedEv"
				"windows"	"\xA1\x2A\x2A\x2A\x2A\x85\xC0\x74\x42"
							/* A1 ? ? ? ? 85 C0 74 42 */
			}
		}
	}
}
