"Games"
{
	"left4dead2" 
	{
		"MemPatches"
		{
			"ZombieManager::CanZombieSpawnHere::IsInTransitionCondition"
			{
				"signature"		"ZombieManager::CanZombieSpawnHere"

				"linux"
				{
					"offset"	"29h"
					"verify"	"\x0F\x85\x39\x03\x00\x00"
					"patch"		"\x90\x90\x90\x90\x90\x90"
				}
				
				"windows"
				{
					"offset"	"32h"
					"verify"	"\x0F\x85\x33\x04\x00\x00"
					"patch"		"\x90\x90\x90\x90\x90\x90"
				}
			}

			"CTerrorPlayer::OnPreThinkGhostState::IsInTransitionCondition"
			{
				"signature"		"CTerrorPlayer::OnPreThinkGhostState"

				"linux"
				{
					"offset"	"1Eh"
					"verify"	"\x74\x10"
					"patch"		"\xEB\x10"
				}
				
				"windows"
				{
					"offset"	"37h"
					"verify"	"\x0F\x85\xA5\x07\x00\x00"
					"patch"		"\x90\x90\x90\x90\x90\x90"
				}
			}

			"CTerrorPlayer::OnPreThinkGhostState::SpawnDisabledCondition"
			{
				"signature"		"CTerrorPlayer::OnPreThinkGhostState"

				"linux"
				{
					"offset"	"104h"
					"verify"	"\x74\x3A"
					"patch"		"\xEB\x3A"
				}
				
				"windows"
				{
					"offset"	"FAh"
					"verify"	"\x74\x39"
					"patch"		"\xEB\x39"
				}
			}

			"ZombieManager::AccumulateSpawnAreaCollection::EnforceFinaleNavSpawnRulesCondition"
			{
				"signature"		"ZombieManager::AccumulateSpawnAreaCollection"

				"linux"
				{
					"offset"	"905h"
					"verify"	"\x0F\x84\xBB\xF9\xFF\xFF"
					"patch"		"\x90\xE9\xBB\xF9\xFF\xFF"
				}
				
				"windows"
				{
					"offset"	"322h"
					"verify"	"\x74\x64"
					"patch"		"\xEB\x64"
				}
			}

			"ZombieManager::AccumulateSpawnAreaCollection::IgnoreClearState"
			{
				"signature"		"ZombieManager::AccumulateSpawnAreaCollection"

				"linux"
				{
					"offset"	"2CAh"
					"verify"	"\x0F\x84\x6C\x06\x00\x00"
					"patch"		"\x90\x90\x90\x90\x90\x90"
				}
				
				"windows"
				{
					"offset"	"38Ch"
					"verify"	"\x75\x0F"
					"patch"		"\xEB\x0F"
				}
			}
		}

		"Signatures"
		{
			/* ZombieManager::CanZombieSpawnHere(Vector const&,TerrorNavArea *,ZombieClassType,bool,CBaseCombatCharacter *) */
			"ZombieManager::CanZombieSpawnHere"
			{
				"library"	"server"
				"linux"		"@_ZNK13ZombieManager18CanZombieSpawnHereERK6VectorP13TerrorNavArea15ZombieClassTypebP20CBaseCombatCharacter"
				"windows"	"\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\x2A\xA1\x2A\x2A\x2A\x2A\x33\x2A\x89\x2A\x2A\x8B\x2A\x2A\x8B\x0D\x2A\x2A\x2A\x2A\x53\x8B\x2A\x2A\x56\x8B\x2A\x2A\x57"
				/* ? ? ? ? ? ? ? ? ? A1 ? ? ? ? 33 ? 89 ? ? 8B ? ? 8B 0D ? ? ? ? 53 8B ? ? 56 8B ? ? 57 */
			}

			/* CTerrorPlayer::OnPreThinkGhostState(CTerrorPlayer *__hidden this) */
			"CTerrorPlayer::OnPreThinkGhostState"
			{
				"library"	"server"
				"linux"		"@_ZN13CTerrorPlayer20OnPreThinkGhostStateEv"
				"windows"	"\x53\x8B\xDC\x83\xEC\x08\x83\xE4\xF0\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x81\xEC\xD8\x00\x00\x00\xA1\x2A\x2A\x2A\x2A\x33\xC5\x89\x45\xFC\x56\x8B\xF1\x8B\x0D\x2A\x2A\x2A\x2A"
				/* 53 8B DC 83 EC 08 83 E4 F0 83 C4 04 55 8B 6B 04 89 6C 24 04 8B EC 81 EC D8 00 00 00 A1 ? ? ? ? 33 C5 89 45 FC 56 8B F1 8B 0D ? ? ? ? */
			}
			
			/* ZombieManager::AccumulateSpawnAreaCollection(CUtlVector<CNavArea *, CUtlMemory<CNavArea *, int>> const&, ZombieManager::MobLocationType, ZombieClassType, float, CUtlVector<CNavArea *, CUtlMemory<CNavArea *, int>>*, bool, bool)const */
			"ZombieManager::AccumulateSpawnAreaCollection"
			{
				"library"	"server"
				"linux"		"@_ZNK13ZombieManager29AccumulateSpawnAreaCollectionERK10CUtlVectorIP8CNavArea10CUtlMemoryIS2_iEENS_15MobLocationTypeE15ZombieClassTypefPS5_bb"
				"windows"	"\x55\x8B\xEC\x83\xEC\x48\xA1\x2A\x2A\x2A\x2A\x53\x56\x33\xF6\x89\x75\xDC"
				/* 55 8B EC 83 EC 48 A1 ? ? ? ? 53 56 33 F6 89 75 DC */
			}
		}
	}
}
