2004-09-14 09:58:45 +00:00
/* AMX Mod X
2004-02-23 12:53:07 +00:00
* Counter - Strike Module
*
* by the AMX Mod X Development Team
*
* This file is part of AMX Mod X .
*
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation ; either version 2 of the License , or ( at
* your option ) any later version .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software Foundation ,
* Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*
* In addition , as a special exception , the author gives permission to
* link the code of this program with the Half - Life Game Engine ( " HL
* Engine " ) and Modified Game Libraries ( " MODs " ) developed by Valve,
* L . L . C ( " Valve " ) . You must obey the GNU General Public License in all
* respects for all of the code used other than the HL Engine and MODs
* from Valve . If you modify this file , you may extend this exception
* to your version of the file , but you are not obligated to do so . If
* you do not wish to do so , delete this exception statement from your
* version .
*/
// cstrike MODULE TO DO HERE: http://www.amxmodx.org/forums/viewtopic.php?t=45
2004-03-04 16:08:31 +00:00
// This implementation uses Vexd's way (lightly modified) of setting models on players.
2004-02-20 15:45:45 +00:00
# include <extdll.h>
# include <meta_api.h>
2004-05-03 14:01:40 +00:00
# include "amxxmodule.h"
2004-03-04 16:08:31 +00:00
# include "CstrikePlayer.h"
2004-02-20 15:45:45 +00:00
2004-03-04 16:08:31 +00:00
# define GETINFOKEYBUFFER (*g_engfuncs.pfnGetInfoKeyBuffer)
# define SETCLIENTKEYVALUE (*g_engfuncs.pfnSetClientKeyValue)
# define GETCLIENTKEYVALUE (*g_engfuncs.pfnInfoKeyValue)
2004-06-17 15:42:43 +00:00
# define CREATENAMEDENTITY (*g_engfuncs.pfnCreateNamedEntity)
2004-03-01 17:25:56 +00:00
# if defined __linux__
2004-03-04 16:08:31 +00:00
# define EXTRAOFFSET 5 // offsets 5 higher in Linux builds
2004-10-29 14:44:48 +00:00
# define EXTRAOFFSET_WEAPONS 4 // weapon offsets are obviously only 4 steps higher on Linux!
2004-03-01 17:25:56 +00:00
# else
2004-03-04 16:08:31 +00:00
# define EXTRAOFFSET 0 // no change in Windows builds
2004-10-29 14:44:48 +00:00
# define EXTRAOFFSET_WEAPONS 0
2004-03-01 17:25:56 +00:00
# endif // defined __linux__
2004-10-29 14:44:48 +00:00
/*
Offset history :
04102 9 :
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 . . .
*/
2004-02-27 13:36:02 +00:00
2005-01-30 05:10:42 +00:00
# define HAS_SHIELD (1<<24) //16777216
2004-07-18 14:11:07 +00:00
// "player" entities
2004-09-14 09:35:52 +00:00
# if !defined __amd64__
2004-09-26 13:02:22 +00:00
// 32 bit offsets here
2005-01-16 16:30:18 +00:00
# define OFFSET_ARMORTYPE 112 + EXTRAOFFSET
2004-09-14 09:35:52 +00:00
# define OFFSET_TEAM 114 + EXTRAOFFSET
# define OFFSET_CSMONEY 115 + EXTRAOFFSET
# define OFFSET_PRIMARYWEAPON 116 + EXTRAOFFSET
# define OFFSET_INTERNALMODEL 126 + EXTRAOFFSET
# define OFFSET_NVGOGGLES 129 + EXTRAOFFSET
# define OFFSET_DEFUSE_PLANT 193 + EXTRAOFFSET
2004-09-24 05:21:39 +00:00
# define OFFSET_VIP 209 + EXTRAOFFSET
2004-09-26 13:02:22 +00:00
# define OFFSET_TK 216 + EXTRAOFFSET // 040926
2004-09-24 21:13:07 +00:00
# define OFFSET_BUYZONE 235 + EXTRAOFFSET
2004-09-26 13:02:22 +00:00
# define OFFSET_ISDRIVING 350 + EXTRAOFFSET // 040926
2004-09-27 10:54:41 +00:00
# define OFFSET_STATIONARY 362 + EXTRAOFFSET // 040927 (363 works also!)
2004-03-04 16:08:31 +00:00
2004-10-29 14:44:48 +00:00
# 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
2004-03-04 16:08:31 +00:00
2004-09-26 13:02:22 +00:00
# define OFFSET_CSDEATHS 444 + EXTRAOFFSET // 040926
2005-02-06 11:59:41 +00:00
# define OFFSET_SHIELD 510 + EXTRAOFFSET
2004-09-14 09:35:52 +00:00
// "weapon_*" entities
2004-10-29 14:44:48 +00:00
# define OFFSET_WEAPONTYPE 43 + EXTRAOFFSET_WEAPONS
# define OFFSET_CLIPAMMO 51 + EXTRAOFFSET_WEAPONS
# define OFFSET_SILENCER_FIREMODE 74 + EXTRAOFFSET_WEAPONS
2004-09-14 09:35:52 +00:00
// "hostage_entity" entities
# define OFFSET_HOSTAGEFOLLOW 86 + EXTRAOFFSET
# define OFFSET_HOSTAGEID 487 + EXTRAOFFSET
2005-08-07 20:43:29 +00:00
// "armoury_entity"
2006-03-29 23:33:38 +00:00
# define OFFSET_ARMOURY_TYPE 34 + EXTRAOFFSET_WEAPONS
2004-09-14 09:35:52 +00:00
# else
2004-09-26 13:02:22 +00:00
// Amd64 offsets here
2005-01-30 05:10:42 +00:00
# define OFFSET_ARMORTYPE 137 + EXTRAOFFSET
2004-09-14 09:35:52 +00:00
# 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
2004-09-27 13:28:51 +00:00
# define OFFSET_TK 249 + EXTRAOFFSET // +33 040927
2004-09-14 09:35:52 +00:00
# define OFFSET_BUYZONE 268 + EXTRAOFFSET // +27
2004-09-27 10:54:41 +00:00
# define OFFSET_ISDRIVING 386 + EXTRAOFFSET // 040927
# define OFFSET_STATIONARY 400 + EXTRAOFFSET // 040927 (401 works also)
2004-09-14 09:35:52 +00:00
# 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
2004-09-26 13:02:22 +00:00
# define OFFSET_CSDEATHS 493 + EXTRAOFFSET // +49
2005-02-06 11:59:41 +00:00
# define OFFSET_SHIELD 559 + EXTRAOFFSET
2004-09-14 09:35:52 +00:00
// "weapon_*" entities
# define OFFSET_WEAPONTYPE 57 + EXTRAOFFSET // +14
# define OFFSET_CLIPAMMO 65 + EXTRAOFFSET // +14
# define OFFSET_SILENCER_FIREMODE 88 + EXTRAOFFSET // +14
// "hostage_entity" entities
2004-09-27 10:54:41 +00:00
# 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.)
2004-09-14 09:35:52 +00:00
# define OFFSET_HOSTAGEID 516 + EXTRAOFFSET // +29
# endif
2004-02-23 12:53:07 +00:00
// Ids of weapons in CS
# define CSW_P228 1
//#define CSW_SHIELD 2
# 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
2004-02-20 15:45:45 +00:00
# define CSW_FAMAS 15
# define CSW_USP 16
# define CSW_GLOCK18 17
2004-02-23 12:53:07 +00:00
# define CSW_AWP 18
# define CSW_MP5NAVY 19
# define CSW_M249 20
# define CSW_M3 21
2004-02-20 15:45:45 +00:00
# define CSW_M4A1 22
2004-02-23 12:53:07 +00:00
# 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
2005-08-07 20:43:29 +00:00
# define CSW_VEST 31 // Brand new invention!
# define CSW_VESTHELM 32 // Brand new invention!
// 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
2004-02-20 15:45:45 +00:00
2004-03-22 12:20:00 +00:00
# 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
2004-02-20 15:45:45 +00:00
# define GLOCK_SEMIAUTOMATIC 0
# define GLOCK_BURSTMODE 2
# define FAMAS_AUTOMATIC 0
# define FAMAS_BURSTMODE 16
2004-03-11 09:29:08 +00:00
# define PLAYER_IS_VIP (1<<8)
2004-02-20 15:45:45 +00:00
2004-04-22 09:38:30 +00:00
# define TEAM_UNASSIGNED 0
2004-02-20 15:45:45 +00:00
# define TEAM_T 1
# define TEAM_CT 2
# define TEAM_SPECTATOR 3
2004-02-27 13:36:02 +00:00
# define CAN_PLANT_BOMB (1<<8) // 256
# define HAS_DEFUSE_KIT (1<<16) // 65536
2004-02-20 15:45:45 +00:00
# define DEFUSER_COLOUR_R 0
# define DEFUSER_COLOUR_G 160
# define DEFUSER_COLOUR_B 0
2004-02-27 13:36:02 +00:00
# define HAS_NVGOGGLES (1<<0)
2004-04-22 12:38:57 +00:00
# define SCOREATTRIB_NOTHING 0
# define SCOREATTRIB_DEAD 1
# define SCOREATTRIB_BOMB 2 // t only
# define SCOREATTRIB_VIP 4 // ct only
2004-09-27 10:54:41 +00:00
# define AMD64_STATIONARY_NO 2
# define AMD64_STATIONARY_YES 3
2005-01-16 16:30:18 +00:00
# define CS_ARMOR_NONE 0
# define CS_ARMOR_KEVLAR 1
# define CS_ARMOR_ASSAULTSUIT 2
2004-04-22 12:38:57 +00:00
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
} ;
2004-02-20 15:45:45 +00:00
// cstrike-specific defines above
2004-03-04 16:08:31 +00:00
CCstrikePlayer g_players [ 33 ] ;
2004-06-17 15:42:43 +00:00
bool g_precachedknife = false ;
bool g_noknives = false ;
2004-02-20 15:45:45 +00:00
// Globals above
2004-10-03 21:10:10 +00:00
# define CHECK_ENTITY(x) \
2004-10-03 23:21:54 +00:00
if ( x < 0 | | x > gpGlobals - > maxEntities ) { \
2004-10-03 21:10:10 +00:00
MF_LogError ( amx , AMX_ERR_NATIVE , " Entity out of range (%d) " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} else { \
if ( x < = gpGlobals - > maxClients ) { \
if ( ! MF_IsPlayerIngame ( x ) ) { \
MF_LogError ( amx , AMX_ERR_NATIVE , " Invalid player %d (not in-game) " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} \
} else { \
2004-10-03 23:21:54 +00:00
if ( x ! = 0 & & FNullEnt ( INDEXENT ( x ) ) ) { \
2004-10-03 21:10:10 +00:00
MF_LogError ( amx , AMX_ERR_NATIVE , " Invalid entity %d " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} \
} \
}
# define CHECK_PLAYER(x) \
if ( x < 1 | | x > gpGlobals - > maxClients ) { \
MF_LogError ( amx , AMX_ERR_NATIVE , " Player out of range (%d) " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} else { \
if ( ! MF_IsPlayerIngame ( x ) | | FNullEnt ( MF_GetPlayerEdict ( x ) ) ) { \
MF_LogError ( amx , AMX_ERR_NATIVE , " Invalid player %d " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} \
}
# define CHECK_NONPLAYER(x) \
if ( x < 1 | | x < = gpGlobals - > maxClients | | x > gpGlobals - > maxEntities ) { \
MF_LogError ( amx , AMX_ERR_NATIVE , " Non-player entity %d out of range " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} else { \
if ( FNullEnt ( INDEXENT ( x ) ) ) { \
MF_LogError ( amx , AMX_ERR_NATIVE , " Invalid non-player entity %d " , x ) ; \
2004-10-04 05:51:27 +00:00
return 0 ; \
2004-10-03 21:10:10 +00:00
} \
}
# define GETEDICT(n) \
2005-08-24 06:57:32 +00:00
( ( n > = 1 & & n < = gpGlobals - > maxClients ) ? MF_GetPlayerEdict ( n ) : INDEXENT ( n ) )