/**

 * Do not edit this file.  Any changes will be overwritten by the gamedata

 * updater or by upgrading your SourceMod install.

 *

 * To override data in this file, create a subdirectory named "custom" and

 * place your own gamedata file(s) inside of it.  Such files will be parsed

 * after SM's own.

 *

 * For more information, see http://wiki.alliedmods.net/Gamedata_Updating_(SourceMod)

 */



"Games"

{

	"#default"

	{

		"Keys"

		{

			"PriceKey"		"in game price"

		}

		"Offsets"

		{

			// Offset of szClassName in CCSWeaponData, szDefaultName is @ 140 which returns the default weapon class for the loadoutslot ignoring the users inventory.

			"WeaponName"

			{

				"windows"		"4"

				"linux"			"4"

				"linux64"		"8"

				"mac64"			"8"

			}

			// In HandleCommand_Buy_Internal

			// -*(_DWORD *)(v34 + 8) in ida 7 -v34[52]

			"WeaponPrice"

			{

				"windows"		"208"

				"linux"			"208"

				"linux64"		"328"

				"mac64"			"328"

			}

			//Offset into CheckRestartRound

			"CTTeamScoreOffset"

			{

				"windows"	"174"

				"linux"		"142"

				"linux64"	"143"

				"mac64"		"148"

			}

			//Offset into CheckRestartRound

			"TTeamScoreOffset"

			{

				"windows"	"201"

				"linux"		"169"

				"linux64"	"174"

				"mac64"		"177"

			}

			//Offset into HandleCommand_Buy_Internal

			"CCSPlayerInventoryOffset"

			{

				"windows"	"57"

				"linux"		"90"

				"linux64"	"107"

				"mac64"		"73"

			}

			"GetItemInLoadout"

			{

				"windows"	"8"

				"linux"		"9"

				"linux64"	"9"

				"mac64"		"9"

			}

			"GetItemDefintionByName" //_ZN15CEconItemSchema23GetItemDefinitionByNameEPKc

			{

				"windows"		"42"

				"linux"			"41"

				"linux64"		"41"

				"mac64"			"41"

			}

			// Search for "%s (ID %llu) at backpack slot %d" (CCSPlayerInventory::DumpInventoryToConsole(bool))

			// Jump to the vtable 2 functions above calls CCStrike15ItemDefinition::GetLoadoutSlot(CCStrike15ItemDefinition *this, int)

			// This is an offset into CCStrike15ItemDefinition that contains the loadoutslot IGNORING the team param (the second param in the function)

			"LoadoutSlotOffset"

			{

				"windows"	"588"

				"linux"		"588"

				"linux64"	"908"

				"mac64"		"908"

			}

			// Offset into CEconItemSchema * to a hashmap of all itemdefs

			// Offset can be found in... GetItemDefinitionMutable (easy to get offset on windows should be the same)

			"ItemDefHashOffset"

			{

				"windows"	"172"

				"linux"		"172"

				"linux64"	"232"

				"mac64"		"232"

			}

		}

		"Signatures"

		{

			"GetItemSchema"

			{

				"library"	"server"

				"windows"	"\xA1\x2A\x2A\x2A\x2A\x85\xC0\x75\x2A\xA1\x2A\x2A\x2A\x2A\x56\x68\x2A\x2A\x00\x00\x8B"

				"linux"		"\x55\x89\xE5\x83\xEC\x08\xE8\x2A\x2A\x2A\x2A\xC9\x83\xC0\x04\xC3"

				"linux64"	"\x55\x48\x89\xE5\xE8\x2A\x2A\x2A\x2A\x5D\x48\x83\xC0\x08\xC3"

				"mac64"		"\x55\x48\x89\xE5\x41\x56\x53\x48\x8B\x1D\x2A\x2A\x2A\x2A\x48\x85\xDB\x75"

			}

			"RoundRespawn"

			{

				"library"	"server"

				"windows"	"\x55\x8B\xEC\x83\xEC\x0C\x53\x56\x57\x8B\xF9\x8B\x0D\x2A\x2A\x2A\x2A\x8B\x01"

				"linux"		"\x55\x89\xE5\x56\x53\x83\xEC\x1C\x8B\x5D\x08\xFF\x35\x2A\x2A\x2A\x2A\xE8\x2A\x2A\x2A\x2A\x83\xC4\x10\x84\xC0\x0F\x85\x2A\x2A\x2A\x2A\x8B\x13"

				"linux64"	"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x18\x4C\x8B\x25\x85\x17\xB4\x00"

				"mac64"		"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x48\x83\xEC\x10\x49\x89\xFC\x4C\x8D\x3D\xD7\xB9\x90\x00"

			}

			"SwitchTeam"

			{

				"library"	"server"

				"windows"	"\x55\x8B\xEC\x83\xEC\x10\x53\x56\x8B\x75\x08\x57\x8B\xF9\x85\xF6\x0F\x88\x2A\x2A\x2A\x2A\x3B\x35"

				"linux"		"\x55\x89\xE5\x56\x53\x83\xEC\x2C\x8B\x5D\x2A\x8B\x75\x2A\x53"

				"linux64"	"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x49\x89\xFC\x89\xF7\x53\x89\xF3"

				"mac64"		"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x18\x89\xF3\x49\x89\xFC"

			}

			"HandleCommand_Buy_Internal"//Wildcard first 6 bytes for getting address for weapon price.

			{

				"library"		"server"

				"windows"		"\x2A\x2A\x2A\x2A\x2A\x2A\x53\x56\x57\x6A\x01\x8B\xF9"

				"linux"			"\x2A\x2A\x2A\x2A\x2A\x2A\x83\xEC\x54\x8B\x5D\x2A\x6A\x01\x8B\x7D\x2A\x8B"

				"linux64"		"\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x89\xCE\x41\x55\x49\x89\xD5\x41\x54\x41\x89\xF4"

				"mac64"			"\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x58\x41\x89\xCF\x49\x89\xD4"

			}

			"CSWeaponDropBB" //Revert back to using CSWeaponDrop(weapon, bool, bool)

			{

				"library"		"server"

				"windows"		"\x2A\x2A\x2A\x2A\x2A\x2A\x83\xE4\xF8\x83\xC4\x04\x55\x8B\x6B\x04\x89\x6C\x24\x04\x8B\xEC\x83\xEC\x34\x56"

				"linux"			"\x2A\x2A\x2A\x2A\x2A\x2A\x83\xEC\x48\x8B\x5D\x2A\x8B\x7D\x2A\x8B\x75"

				"linux64"		"\x2A\x2A\x2A\x2A\x2A\x2A\x41\x89\xCE\x41\x55\x41\x89\xD5\x41\x54\x49\x89\xF4"

				"mac64"			"\x2A\x2A\x2A\x2A\x2A\x2A\x41\x56\x41\x54\x53\x48\x83\xEC\x30\x41\x89\xCC\x41\x89\xD7"

			}

			"TerminateRound"

			{

				"library"		"server"

				"windows"		"\x55\x8B\xEC\x83\xE4\xF8\x83\xEC\x6C\x53\x56\x8B\xF1\xF3\x0F\x11\x4C\x24\x24"

				"linux"			"\x55\x89\xE5\x57\x56\x53\x83\xEC\x6C\x8B\x7D\x08\x8B\x87"

				//"linux64"		"\x55\x48\x89\xE5\x41\x57\x41\x56\x49\x89\xFE\x41\x55\x41\x54\x53\x48\x81\xEC\x98\x00\x00\x00\x89\xB5\x68\xFF\xFF\xFF"

				"mac64"			"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x81\xEC\x08\x01\x00\x00\x41\x89\xF6"

			}

			//In CS:GO this is actually CCSGameRules::CheckRestartRound(void) but to keep same gamedata as cs:s.

			"CheckWinLimit"

			{

				"library"	"server"

				"windows"	"\x55\x8B\xEC\x83\xE4\xF8\x83\xEC\x2A\x53\x8B\xD9\x8B\x0D\x2A\x2A\x2A\x2A\x56\x57\x81\xF9"

				"linux"		"\x55\x89\xE5\x57\x56\x53\x83\xEC\x5C\x8B\x5D\x08\x65\xA1\x14\x00\x00\x00\x89\x45\xE4\x31\xC0\xA1\x2A\x2A\x2A\x2A"

				"linux64"	"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x58\x64\x48\x8B\x04\x25\x28\x00\x00\x00\x48\x89\x45\xC8\x31\xC0\x4C\x8B\x2D\x46\xD3\xBB\x00"

				"mac64"		"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x55\x41\x54\x53\x48\x83\xEC\x58\x49\x89\xFD\x48\x8B\x1D\x85\x76\x60\x00"

			}

			"SetModelFromClass"

			{

				"library"	"server"

				"windows"	"\x53\x56\x57\x8B\xF9\x8B\x87\x14\x03\x00\x00"

				"linux"		"\x55\x89\xE5\x57\x56\x53\x83\xEC\x18\x8B\x5D\x08\x53\xE8\x2A\x2A\x2A\x2A\x83\xC4\x10\x83\xF8\x02"

				"linux64"	"\x55\x48\x89\xE5\x41\x55\x41\x54\x53\x48\x89\xFB\x48\x83\xEC\x18\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02"

				"mac64"		"\x55\x48\x89\xE5\x41\x57\x41\x56\x41\x54\x53\x49\x89\xFC\xE8\x2A\x2A\x2A\x2A\x83\xF8\x02"

			}

			//GetCCSWeaponData Found in HandleCommand_Buy_Internal

			//Uses an econitemview

			"GetCCSWeaponData"

			{

				"library"	"server"

				"windows"	"\x85\xC9\x75\x2A\x33\xC0\xC3\xE8\x2A\x2A\x2A\x2A\x8B"

				"linux"		"\x55\x89\xE5\x83\xEC\x08\x8B\x45\x2A\x85\xC0\x74\x2A\x83\xEC\x0C\x50\xE8\x2A\x2A\x2A\x2A\x83\xC4\x10\x89\x45"

				"linux64"	"\x48\x85\xFF\x74\x2A\x55\x48\x89\xE5\xE8\x2A\x2A\x2A\x2A\x5D\x48\x89\xC7"

				"mac64"		"\x55\x48\x89\xE5\x41\x56\x53\x31\xC0\x48\x85\xFF\x74\x2A\xE8\x2A\x2A\x2A\x2A\x48"

			}

		}

	}

	

	"#default"

	{

		"Keys"

		{

			"AssistsBase"		"m_iFrags"

		}

		

		"Offsets"

		{

			"Assists"

			{

				"windows"	"4"

				"linux"		"4"

				"linux64"	"4"

				"mac64"		"4"

			}

		}

	}

	

	"#default"

	{

		"Keys"

		{

			"CScoreBase"		"m_bIsHoldingLookAtWeapon"

		}

		

		"Offsets"

		{

			"CScore"

			{

				"windows"	"51"

				"linux"		"51"

				"linux64"	"51"

				"mac64"		"51"

			}

		}

	}

	

	"#default"

	{

		"Keys"

		{

			"MVPsBase"		"m_bIsHoldingLookAtWeapon"

		}

		

		"Offsets"

		{

			"MVPs"

			{

				"windows"	"11"

				"linux"		"11"

				"linux64"	"11"

				"mac64"		"11"

			}

		}

	}

	

	// Used for SetClanTag and GetClanTag

	// to find the ClanTag offset start with the string "ClanTagChanged". Inside the function there is 2 KeyValues::GetString, one for "tag", and one for "name"

	// The respective function underneath each are SetClanTag and SetClanName.

	// To get the offset of the base (m_flGroundAccelLinearFracLastTime) unqiue string is "------- accelspeed = %f, flGoalSpeed = %f, flStoredAccel = %f\n"

	// Inside that function right above the debug message is an if with a call to CBaseEntity::NetworkStateChanged and a member set with the same offset.

	// Do math.

	// Note: Second offset can be skipped by simply dumping the netprops instead on each os although the distance will probably be the same on all.

	

	"#default"

	{

		"Keys"

		{

			"ClanTagBase"		"m_flGroundAccelLinearFracLastTime"

		}

		

		"Offsets"

		{

			"ClanTagSize"

			{

				"windows"	"16"

				"linux"		"16"

				"linux64"	"16"

				"mac64"		"16"

			}

			"ClanTag"

			{

				"windows"	"140"

				"linux"		"140"

				"linux64"	"140"

				"mac64"		"140"

			}

		}

	}

	

	"#default"

	{

		"Addresses"

		{

			// Offset from NET_SendPacket sig to MTU

			"MaxMTU"

			{

				"windows"

				{

					"signature"	"NET_SendPacket"

					"offset"	"4"

				}

				"linux"

				{

					"signature"	"NET_SendPacket"

					"offset"	"5"

				}

				"linux64"

				{

					"signature"	"NET_SendPacket"

					"offset"	"4"

				}

			}

		}

		"Signatures"

		{

			// This isn't the start of the function, but closer to where we want to patch, including the exact bytes we will replace

			"NET_SendPacket"

			{

				"library"	"engine"

				// "[NET] Cannot send %d-byte packet to %s.  MTU is %u.  %02x %02x %02x %02x %02x\n"

				"windows"	"\x8B\xFA\x81\xFB\xB0\x04\x00\x00\x7E"

				// _Z14NET_SendPacketP11INetChanneliRK10ns_addressPKhiP8bf_writebj

				"linux"		"\x31\xC0\x81\x7D\x2A\xB0\x04\x00\x00"

				"linux64"	"\x31\xC0\x81\xF9\xB0\x04\x00\x00\x0F"

			}

		}

	}

}

