// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
//     https://alliedmods.net/amxmodx-license

//
// Counter-Strike Module
//

#ifndef CSTRIKE_DATA_H
#define CSTRIKE_DATA_H

#include "amxxmodule.h"

#if defined(__linux__) || defined (__APPLE__)
	#define EXTRAOFFSET					5 // offsets 5 higher in Linux builds
	#define EXTRAOFFSET_WEAPONS			4 // weapon offsets are obviously only 4 steps higher on Linux!
	#define ACTUAL_EXTRA_OFFSET			20 // actual, byte-addressable offset
#else
	#define EXTRAOFFSET					0 // no change in Windows builds
	#define EXTRAOFFSET_WEAPONS			0
	#define ACTUAL_EXTRA_OFFSET			0
#endif

/*
	Offset history:
	041029:
	Confirmed (pretty much) ALL offsets for 32 bit Windows, 32 bit Linux and amd64 (yes that's all of them).
	Found out that weapon offsets are only +4 higher on Linux.
	Also backpack ammo offsets were all obviously 5 steps too high since unknown time...

*/
// "player" entities
#if !defined __amd64__
	// 32 bit offsets here
	#define OFFSET_ARMORTYPE			112 + EXTRAOFFSET
	#define OFFSET_TEAM					114 + EXTRAOFFSET
	#define OFFSET_CSMONEY				115 + EXTRAOFFSET
	#define OFFSET_PRIMARYWEAPON		116 + EXTRAOFFSET
	#define OFFSET_LASTACTIVITY			124 + EXTRAOFFSET
	#define OFFSET_INTERNALMODEL		126 + EXTRAOFFSET
	#define OFFSET_NVGOGGLES			129 + EXTRAOFFSET
	#define OFFSET_DEFUSE_PLANT			193 + EXTRAOFFSET
	#define OFFSET_MENU					205 + EXTRAOFFSET
	#define OFFSET_VIP					209 + EXTRAOFFSET
	#define OFFSET_TK					216 + EXTRAOFFSET // 040926
	#define OFFSET_HOSTAGEKILLS			217 + EXTRAOFFSET
	#define OFFSET_MAPZONE				235 + EXTRAOFFSET
	#define OFFSET_ISDRIVING			350 + EXTRAOFFSET // 040926
	#define OFFSET_STATIONARY			362 + EXTRAOFFSET // 040927 (363 works also!)
	#define OFFSET_ZOOMTYPE				363 + EXTRAOFFSET

	#define OFFSET_AWM_AMMO				377 + EXTRAOFFSET // 041029: All of these *_AMMO:s were changed -5
	#define OFFSET_SCOUT_AMMO			378 + EXTRAOFFSET
	#define OFFSET_PARA_AMMO			379 + EXTRAOFFSET
	#define OFFSET_FAMAS_AMMO			380 + EXTRAOFFSET
	#define OFFSET_M3_AMMO				381 + EXTRAOFFSET
	#define OFFSET_USP_AMMO				382 + EXTRAOFFSET
	#define OFFSET_FIVESEVEN_AMMO		383 + EXTRAOFFSET
	#define OFFSET_DEAGLE_AMMO			384 + EXTRAOFFSET
	#define OFFSET_P228_AMMO			385 + EXTRAOFFSET
	#define OFFSET_GLOCK_AMMO			386 + EXTRAOFFSET
	#define OFFSET_FLASH_AMMO			387 + EXTRAOFFSET
	#define OFFSET_HE_AMMO				388 + EXTRAOFFSET
	#define OFFSET_SMOKE_AMMO			389 + EXTRAOFFSET
	#define OFFSET_C4_AMMO				390	+ EXTRAOFFSET

	#define OFFSET_CSDEATHS				444 + EXTRAOFFSET // 040926
	#define OFFSET_SHIELD				510 + EXTRAOFFSET
	// "weapon_*" entities
	#define OFFSET_WEAPONTYPE			43 + EXTRAOFFSET_WEAPONS
	#define OFFSET_CLIPAMMO				51 + EXTRAOFFSET_WEAPONS
	#define OFFSET_SILENCER_FIREMODE	74 + EXTRAOFFSET_WEAPONS
	// "hostage_entity" entities
	#define OFFSET_HOSTAGEFOLLOW		86 + EXTRAOFFSET
	#define OFFSET_HOSTAGE_NEXTUSE		100 + EXTRAOFFSET
	#define OFFSET_HOSTAGE_LASTUSE		483 + EXTRAOFFSET
	#define OFFSET_HOSTAGEID			487 + EXTRAOFFSET
	// "armoury_entity"
	#define OFFSET_ARMOURY_TYPE			34 + EXTRAOFFSET_WEAPONS
	// C4 offsets
	#define OFFSET_C4_EXPLODE_TIME		100 + EXTRAOFFSET
	#define OFFSET_C4_DEFUSING			0x181 + ACTUAL_EXTRA_OFFSET
#else
	// Amd64 offsets here
	#define OFFSET_ARMORTYPE			137 + EXTRAOFFSET
	#define OFFSET_TEAM					139 + EXTRAOFFSET // +25
	#define OFFSET_CSMONEY				140 + EXTRAOFFSET // +25
	#define OFFSET_PRIMARYWEAPON		141 + EXTRAOFFSET // +25
	#define OFFSET_INTERNALMODEL		152 + EXTRAOFFSET // +26
	#define OFFSET_NVGOGGLES			155 + EXTRAOFFSET // +26
	#define OFFSET_DEFUSE_PLANT			219 + EXTRAOFFSET // +26
	#define OFFSET_VIP					242 + EXTRAOFFSET // +27
	#define OFFSET_TK					249 + EXTRAOFFSET // +33 040927
	#define OFFSET_MAPZONE				268 + EXTRAOFFSET // +27
	#define OFFSET_ISDRIVING			386 + EXTRAOFFSET // 040927
	#define OFFSET_STATIONARY			400 + EXTRAOFFSET // 040927 (401 works also)
	#define OFFSET_ZOOMTYPE				402 + EXTRAOFFSET

	#define OFFSET_AWM_AMMO				426 + EXTRAOFFSET // +44
	#define OFFSET_SCOUT_AMMO			427 + EXTRAOFFSET // +44
	#define OFFSET_PARA_AMMO			428 + EXTRAOFFSET // +44
	#define OFFSET_FAMAS_AMMO			429 + EXTRAOFFSET // +44
	#define OFFSET_M3_AMMO				430 + EXTRAOFFSET // +44
	#define OFFSET_USP_AMMO				431 + EXTRAOFFSET // +44
	#define OFFSET_FIVESEVEN_AMMO		432 + EXTRAOFFSET // +44
	#define OFFSET_DEAGLE_AMMO			433 + EXTRAOFFSET // +44
	#define OFFSET_P228_AMMO			434 + EXTRAOFFSET // +44
	#define OFFSET_GLOCK_AMMO			435 + EXTRAOFFSET // +44
	#define OFFSET_FLASH_AMMO			436 + EXTRAOFFSET // +44
	#define OFFSET_HE_AMMO				437 + EXTRAOFFSET // +44
	#define OFFSET_SMOKE_AMMO			438 + EXTRAOFFSET // +44
	#define OFFSET_C4_AMMO				439	+ EXTRAOFFSET // +44

	#define OFFSET_CSDEATHS				493 + EXTRAOFFSET // +49
	#define OFFSET_SHIELD				559 + EXTRAOFFSET
	// "weapon_*" entities
	#define OFFSET_WEAPONTYPE			57 + EXTRAOFFSET // +14
	#define OFFSET_CLIPAMMO				65 + EXTRAOFFSET // +14
	#define OFFSET_SILENCER_FIREMODE	88 + EXTRAOFFSET // +14
	// "hostage_entity" entities
	#define OFFSET_HOSTAGEFOLLOW		51 + EXTRAOFFSET // +21, long=51, int=107! (must use the long* offset because pointers on amd64 are stored the size of longs, 8 bytes, instead of the usual int 4 bytes.)
	#define OFFSET_HOSTAGEID			516 + EXTRAOFFSET // +29
#endif

#if defined(__linux__)
	#define CS_IDENT_USEBOTARGS					"UseBotArgs"
	#define CS_IDENT_BOTARGS					"BotArgs"
	#define CS_IDENT_HIDDEN_STATE				false
#elif defined(__APPLE__)
	#define CS_IDENT_USEBOTARGS					"UseBotArgs"
	#define CS_IDENT_BOTARGS					"BotArgs"
	#define CS_IDENT_HIDDEN_STATE				true
#else
	#define CS_CLICMD_OFFS_USEBOTARGS			2
	#define CS_CLICMD_OFFS_BOTARGS				22
#endif

/** 
 * CS_OnBuy forward 
 */
#if defined(__linux__)
	#define CS_IDENT_GIVENSHIELD        "_ZN11CBasePlayer10GiveShieldEb"
	#define CS_IDENT_GIVENAMEDITEM		"_ZN11CBasePlayer13GiveNamedItemEPKc"
	#define CS_IDENT_ADDACCOUNT			"_ZN11CBasePlayer10AddAccountEib"
	#define CS_IDENT_HIDDEN_STATE		false
#elif defined(__APPLE__)
	#define CS_IDENT_GIVENSHIELD        "_ZN11CBasePlayer10GiveShieldEb"
	#define CS_IDENT_GIVENAMEDITEM		"_ZN11CBasePlayer13GiveNamedItemEPKc"
	#define CS_IDENT_ADDACCOUNT			"_ZN11CBasePlayer10AddAccountEib"
	#define CS_IDENT_HIDDEN_STATE		true
#elif defined(WIN32)
	#define CS_IDENT_GIVENSHIELD        "\\x56\\x8B\\x2A\\x57\\x33\\x2A\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\xB0"
	#define CS_IDENT_GIVENAMEDITEM		"\\x8B\\x2A\\x2A\\x2A\\x56\\x57\\x8B\\x2A\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x2B"
	#define CS_IDENT_ADDACCOUNT			"\\x8B\\x2A\\x2A\\x2A\\x56\\x8B\\x2A\\x8B\\x2A\\x2A\\x2A\\x2A\\x2A\\x03"
	#define CS_IDENT_HIDDEN_STATE		false
#endif

#define CSI_P228						CSW_P228
#define CSI_SCOUT						CSW_SCOUT
#define CSI_HEGRENADE					CSW_HEGRENADE
#define CSI_XM1014						CSW_XM1014
#define CSI_C4							CSW_C4
#define CSI_MAC10						CSW_MAC10
#define CSI_AUG							CSW_AUG
#define CSI_SMOKEGRENADE				CSW_SMOKEGRENADE
#define CSI_ELITE						CSW_ELITE
#define CSI_FIVESEVEN					CSW_FIVESEVEN
#define CSI_UMP45						CSW_UMP45
#define CSI_SG550						CSW_SG550
#define CSI_GALI						CSW_GALI
#define CSI_FAMAS						CSW_FAMAS
#define CSI_USP							CSW_USP
#define CSI_GLOCK18						CSW_GLOCK18
#define CSI_AWP							CSW_AWP
#define CSI_MP5NAVY						CSW_MP5NAVY
#define CSI_M249						CSW_M249
#define CSI_M3							CSW_M3
#define CSI_M4A1						CSW_M4A1
#define CSI_TMP							CSW_TMP
#define CSI_G3SG1						CSW_G3SG1
#define CSI_FLASHBANG					CSW_FLASHBANG
#define CSI_DEAGLE						CSW_DEAGLE
#define CSI_SG552						CSW_SG552
#define CSI_AK47						CSW_AK47
#define CSI_KNIFE						CSW_KNIFE
#define CSI_P90							CSW_P90
#define CSI_SHIELDGUN					CSW_SHIELDGUN
#define CSI_VEST						CSW_VEST		 // Custom
#define CSI_VESTHELM					CSW_VESTHELM	 // Custom
#define CSI_DEFUSER						33				 // Custom
#define CSI_NVGS						34				 // Custom
#define CSI_PRIMAMMO					36				 // Custom
#define CSI_SECAMMO						37				 // Custom

#define BITS_PISTOLS					(1<<CSI_GLOCK18 | 1<<CSI_USP | 1<<CSI_P228 | 1<<CSI_DEAGLE | 1<<CSI_ELITE | 1<<CSI_FIVESEVEN)

// Ids of weapons in CS
#define CSW_P228						1
#define CSW_SCOUT						3
#define CSW_HEGRENADE					4
#define CSW_XM1014						5
#define CSW_C4							6
#define CSW_MAC10						7
#define CSW_AUG							8
#define CSW_SMOKEGRENADE				9
#define CSW_ELITE						10
#define CSW_FIVESEVEN					11
#define CSW_UMP45						12
#define CSW_SG550						13
#define CSW_GALI						14
#define CSW_FAMAS						15
#define CSW_USP							16
#define CSW_GLOCK18						17
#define CSW_AWP							18
#define CSW_MP5NAVY						19
#define CSW_M249						20
#define CSW_M3							21
#define CSW_M4A1						22
#define CSW_TMP							23
#define CSW_G3SG1						24
#define CSW_FLASHBANG					25
#define CSW_DEAGLE						26
#define CSW_SG552						27
#define CSW_AK47						28
//#define CSW_KNIFE						29
#define CSW_P90							30
#define CSW_VEST						31 // Brand new invention!
#define CSW_VESTHELM					32 // Brand new invention!
#define CSW_SHIELDGUN					99

// These are used with armoury_entity:s.
#define CSA_MP5NAVY						0
#define CSA_TMP							1
#define CSA_P90							2
#define CSA_MAC10						3
#define CSA_AK47						4
#define CSA_SG552						5
#define CSA_M4A1						6
#define CSA_AUG							7
#define CSA_SCOUT						8
#define CSA_G3SG1						9
#define CSA_AWP							10
#define CSA_M3							11
#define CSA_XM1014						12
#define CSA_M249						13
#define CSA_FLASHBANG					14
#define CSA_HEGRENADE					15
#define CSA_VEST						16
#define CSA_VESTHELM					17
#define CSA_SMOKEGRENADE				18

#define M4A1_SILENCED					(1<<2)
#define M4A1_ATTACHSILENCEANIM			6
#define M4A1_DETACHSILENCEANIM			13
#define USP_SILENCED					(1<<0)
#define USP_ATTACHSILENCEANIM			7
#define USP_DETACHSILENCEANIM			15

#define GLOCK_SEMIAUTOMATIC				0
#define GLOCK_BURSTMODE					2
#define FAMAS_AUTOMATIC					0
#define FAMAS_BURSTMODE					16

#define PLAYER_IS_VIP					(1<<8)

#define PLAYER_IN_BUYZONE				(1<<0)

#define TEAM_UNASSIGNED					0
#define TEAM_T							1
#define TEAM_CT							2
#define TEAM_SPECTATOR					3

#define CAN_PLANT_BOMB					(1<<8) // 256
#define HAS_DEFUSE_KIT					(1<<16) // 65536

#define DEFUSER_COLOUR_R				0
#define DEFUSER_COLOUR_G				160
#define DEFUSER_COLOUR_B				0

#define HAS_NVGOGGLES					(1<<0)

#define SCOREATTRIB_NOTHING				0
#define SCOREATTRIB_DEAD				1
#define SCOREATTRIB_BOMB				2 // t only
#define SCOREATTRIB_VIP					4 // ct only

#define AMD64_STATIONARY_NO				2
#define AMD64_STATIONARY_YES			3

#define CS_ARMOR_NONE					0
#define CS_ARMOR_KEVLAR					1
#define CS_ARMOR_ASSAULTSUIT			2

#define CS_FIRST_ZOOM					0x28
#define CS_SECOND_AWP_ZOOM				0xA
#define CS_SECOND_NONAWP_ZOOM			0xF
#define CS_AUGSG552_ZOOM				0x37
#define CS_NO_ZOOM						0x5A

#define HAS_SHIELD						(1<<24) //16777216 


enum CS_Internal_Models {
	CS_DONTCHANGE = 0,
	CS_CT_URBAN = 1,
	CS_T_TERROR = 2,
	CS_T_LEET = 3,
	CS_T_ARCTIC = 4,
	CS_CT_GSG9 = 5,
	CS_CT_GIGN = 6,
	CS_CT_SAS = 7,
	CS_T_GUERILLA = 8,
	CS_CT_VIP = 9,
	CZ_T_MILITIA = 10,
	CZ_CT_SPETSNAZ = 11
};

enum
{
	CS_RESET_ZOOM = 0,
	CS_SET_NO_ZOOM,
	CS_SET_FIRST_ZOOM,
	CS_SET_SECOND_ZOOM,
	CS_SET_AUGSG552_ZOOM,
};

typedef enum
{
	Menu_OFF,
	Menu_ChooseTeam,
	Menu_IGChooseTeam,
	Menu_ChooseAppearance,
	Menu_Buy,
	Menu_BuyPistol,
	Menu_BuyRifle,
	Menu_BuyMachineGun,
	Menu_BuyShotgun,
	Menu_BuySubMachineGun,
	Menu_BuyItem,
	Menu_Radio1,
	Menu_Radio2,
	Menu_Radio3,
	Menu_ClientBuy

} Menu;

#endif // CSTRIKE_DATA_H
