rgr_02@3519: /** rgr_02@3519: * vim: set ts=4 : rgr_02@3519: * ============================================================================= rgr_02@3519: * SourceMod Counter-Strike:Source Extension rgr_02@3519: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved. rgr_02@3519: * ============================================================================= rgr_02@3519: * rgr_02@3519: * This program is free software; you can redistribute it and/or modify it under rgr_02@3519: * the terms of the GNU General Public License, version 3.0, as published by the rgr_02@3519: * Free Software Foundation. rgr_02@3519: * rgr_02@3519: * This program is distributed in the hope that it will be useful, but WITHOUT rgr_02@3519: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS rgr_02@3519: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more rgr_02@3519: * details. rgr_02@3519: * rgr_02@3519: * You should have received a copy of the GNU General Public License along with rgr_02@3519: * this program. If not, see . rgr_02@3519: * rgr_02@3519: * As a special exception, AlliedModders LLC gives you permission to link the rgr_02@3519: * code of this program (as well as its derivative works) to "Half-Life 2," the rgr_02@3519: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software rgr_02@3519: * by the Valve Corporation. You must obey the GNU General Public License in rgr_02@3519: * all respects for all other code used. Additionally, AlliedModders LLC grants rgr_02@3519: * this exception to all derivative works. AlliedModders LLC defines further rgr_02@3519: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), rgr_02@3519: * or . rgr_02@3519: * rgr_02@3519: * Version: $Id$ rgr_02@3519: */ rgr_02@3519: rgr_02@3519: #include "util_cstrike.h" rgr_02@3519: rgr_02@3519: #include "extension.h" rgr_02@3519: #include "RegNatives.h" rgr_02@3519: rgr_02@3519: #define REGISTER_ADDR(name, defaultret, code) \ rgr_02@3519: void *addr; \ rgr_02@3519: if (!g_pGameConf->GetMemSig(name, &addr) || !addr) \ rgr_02@3519: { \ rgr_02@3519: g_pSM->LogError(myself, "Failed to locate function."); \ rgr_02@3519: return defaultret; \ rgr_02@3519: } \ rgr_02@3519: code; \ rgr_02@3519: g_RegNatives.Register(pWrapper); rgr_02@3519: rgr_02@3519: void *GetWeaponInfo(int weaponID) rgr_02@3519: { rgr_02@3519: static ICallWrapper *pWrapper = NULL; rgr_02@3519: if (!pWrapper) rgr_02@3519: { rgr_02@3519: REGISTER_ADDR("GetWeaponInfo", NULL, rgr_02@3519: PassInfo pass[1]; \ rgr_02@3519: PassInfo retpass; \ rgr_02@3519: pass[0].flags = PASSFLAG_BYVAL; \ rgr_02@3519: pass[0].type = PassType_Basic; \ rgr_02@3519: pass[0].size = sizeof(int); \ rgr_02@3519: retpass.flags = PASSFLAG_BYVAL; \ rgr_02@3519: retpass.type = PassType_Basic; \ rgr_02@3519: retpass.size = sizeof(void *); \ rgr_02@3519: pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retpass, pass, 1)) rgr_02@3519: } rgr_02@3519: rgr_02@3519: void *info; rgr_02@3519: rgr_02@3519: unsigned char vstk[sizeof(int)]; rgr_02@3519: unsigned char *vptr = vstk; rgr_02@3519: rgr_02@3519: *(int *)vptr = weaponID; rgr_02@3519: rgr_02@3519: pWrapper->Execute(vstk, &info); rgr_02@3519: rgr_02@3519: return info; rgr_02@3519: } rgr_02@3519: rgr_02@3519: const char *GetTranslatedWeaponAlias(const char *weapon) rgr_02@3519: { rgr_02@3519: static ICallWrapper *pWrapper = NULL; rgr_02@3519: rgr_02@3519: if (!pWrapper) rgr_02@3519: { rgr_02@3519: REGISTER_ADDR("GetTranslatedWeaponAlias", weapon, rgr_02@3519: PassInfo pass[1]; \ rgr_02@3519: PassInfo retpass; \ rgr_02@3519: pass[0].flags = PASSFLAG_BYVAL; \ rgr_02@3519: pass[0].type = PassType_Basic; \ rgr_02@3519: pass[0].size = sizeof(const char *); \ rgr_02@3519: retpass.flags = PASSFLAG_BYVAL; \ rgr_02@3519: retpass.type = PassType_Basic; \ rgr_02@3519: retpass.size = sizeof(const char *); \ rgr_02@3519: pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retpass, pass, 1)) rgr_02@3519: } kyle@3634: const char *ret = NULL; rgr_02@3519: rgr_02@3519: unsigned char vstk[sizeof(const char *)]; rgr_02@3519: unsigned char *vptr = vstk; rgr_02@3519: rgr_02@3519: *(const char **)vptr = weapon; rgr_02@3519: rgr_02@3519: pWrapper->Execute(vstk, &ret); rgr_02@3519: rgr_02@3519: return ret; rgr_02@3519: } rgr_02@3519: rgr_02@3519: int AliasToWeaponID(const char *weapon) rgr_02@3519: { rgr_02@3519: static ICallWrapper *pWrapper = NULL; rgr_02@3519: rgr_02@3519: if (!pWrapper) rgr_02@3519: { rgr_02@3519: REGISTER_ADDR("AliasToWeaponID", 0, rgr_02@3519: PassInfo pass[1]; \ rgr_02@3519: PassInfo retpass; \ rgr_02@3519: pass[0].flags = PASSFLAG_BYVAL; \ rgr_02@3519: pass[0].type = PassType_Basic; \ rgr_02@3519: pass[0].size = sizeof(const char *); \ rgr_02@3519: retpass.flags = PASSFLAG_BYVAL; \ rgr_02@3519: retpass.type = PassType_Basic; \ rgr_02@3519: retpass.size = sizeof(int); \ rgr_02@3519: pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retpass, pass, 1)) rgr_02@3519: } rgr_02@3519: int weaponID = 0; rgr_02@3519: rgr_02@3519: unsigned char vstk[sizeof(const char *)]; rgr_02@3519: unsigned char *vptr = vstk; rgr_02@3519: rgr_02@3519: *(const char **)vptr = weapon; rgr_02@3519: rgr_02@3519: pWrapper->Execute(vstk, &weaponID); rgr_02@3519: rgr_02@3519: return weaponID; kyle@3702: } kyle@3702: kyle@3702: const char *WeaponIDToAlias(int weaponID) kyle@3702: { kyle@3702: static ICallWrapper *pWrapper = NULL; kyle@3702: kyle@3702: if (!pWrapper) kyle@3702: { kyle@3702: REGISTER_ADDR("WeaponIDToAlias", 0, kyle@3702: PassInfo pass[1]; \ kyle@3702: PassInfo retpass; \ kyle@3702: pass[0].flags = PASSFLAG_BYVAL; \ kyle@3702: pass[0].type = PassType_Basic; \ kyle@3702: pass[0].size = sizeof(int); \ kyle@3702: retpass.flags = PASSFLAG_BYVAL; \ kyle@3702: retpass.type = PassType_Basic; \ kyle@3702: retpass.size = sizeof(const char *); \ kyle@3702: pWrapper = g_pBinTools->CreateCall(addr, CallConv_Cdecl, &retpass, pass, 1)) kyle@3702: } kyle@3702: const char *ret = NULL; kyle@3702: kyle@3702: unsigned char vstk[sizeof(int)]; kyle@3702: unsigned char *vptr = vstk; kyle@3702: kyle@3702: *(int *)vptr = GetRealWeaponID(weaponID); kyle@3702: kyle@3702: pWrapper->Execute(vstk, &ret); kyle@3702: kyle@3702: return ret; rgr_02@3519: } rgr_02@3519: int GetRealWeaponID(int weaponId) rgr_02@3519: { rgr_02@3519: #if SOURCE_ENGINE == SE_CSGO rgr_02@3519: switch((SMCSWeapon)weaponId) rgr_02@3519: { rgr_02@3519: case SMCSWeapon_NONE: rgr_02@3519: return (int)CSGOWeapon_NONE; rgr_02@3519: case SMCSWeapon_DEAGLE: rgr_02@3519: return (int)CSGOWeapon_DEAGLE; rgr_02@3519: case SMCSWeapon_ELITE: rgr_02@3519: return (int)CSGOWeapon_ELITE; rgr_02@3519: case SMCSWeapon_FIVESEVEN: rgr_02@3519: return (int)CSGOWeapon_FIVESEVEN; rgr_02@3519: case SMCSWeapon_GLOCK: rgr_02@3519: return (int)CSGOWeapon_GLOCK; rgr_02@3519: case SMCSWeapon_P228: rgr_02@3519: return (int)CSGOWeapon_P228; rgr_02@3519: case SMCSWeapon_USP: rgr_02@3519: return (int)CSGOWeapon_USP; rgr_02@3519: case SMCSWeapon_AK47: rgr_02@3519: return (int)CSGOWeapon_AK47; rgr_02@3519: case SMCSWeapon_AUG: rgr_02@3519: return (int)CSGOWeapon_AUG; rgr_02@3519: case SMCSWeapon_AWP: rgr_02@3519: return (int)CSGOWeapon_AWP; rgr_02@3519: case SMCSWeapon_FAMAS: rgr_02@3519: return (int)CSGOWeapon_FAMAS; rgr_02@3519: case SMCSWeapon_G3SG1: rgr_02@3519: return (int)CSGOWeapon_G3SG1; rgr_02@3519: case SMCSWeapon_GALIL: rgr_02@3519: return (int)CSGOWeapon_GALIL; rgr_02@3519: case SMCSWeapon_GALILAR: rgr_02@3519: return (int)CSGOWeapon_GALILAR; rgr_02@3519: case SMCSWeapon_M249: rgr_02@3519: return (int)CSGOWeapon_M249; rgr_02@3519: case SMCSWeapon_M3: rgr_02@3519: return (int)CSGOWeapon_M3; rgr_02@3519: case SMCSWeapon_M4A1: rgr_02@3519: return (int)CSGOWeapon_M4A1; rgr_02@3519: case SMCSWeapon_MAC10: rgr_02@3519: return (int)CSGOWeapon_MAC10; rgr_02@3519: case SMCSWeapon_MP5NAVY: rgr_02@3519: return (int)CSGOWeapon_MP5NAVY; rgr_02@3519: case SMCSWeapon_P90: rgr_02@3519: return (int)CSGOWeapon_P90; rgr_02@3519: case SMCSWeapon_SCOUT: rgr_02@3519: return (int)CSGOWeapon_SCOUT; rgr_02@3519: case SMCSWeapon_SG550: rgr_02@3519: return (int)CSGOWeapon_SG550; rgr_02@3519: case SMCSWeapon_SG552: rgr_02@3519: return (int)CSGOWeapon_SG552; rgr_02@3519: case SMCSWeapon_TMP: rgr_02@3519: return (int)CSGOWeapon_TMP; rgr_02@3519: case SMCSWeapon_UMP45: rgr_02@3519: return (int)CSGOWeapon_UMP45; rgr_02@3519: case SMCSWeapon_XM1014: rgr_02@3519: return (int)CSGOWeapon_XM1014; rgr_02@3519: case SMCSWeapon_BIZON: rgr_02@3519: return (int)CSGOWeapon_BIZON; rgr_02@3519: case SMCSWeapon_MAG7: rgr_02@3519: return (int)CSGOWeapon_MAG7; rgr_02@3519: case SMCSWeapon_NEGEV: rgr_02@3519: return (int)CSGOWeapon_NEGEV; rgr_02@3519: case SMCSWeapon_SAWEDOFF: rgr_02@3519: return (int)CSGOWeapon_SAWEDOFF; rgr_02@3519: case SMCSWeapon_TEC9: rgr_02@3519: return (int)CSGOWeapon_TEC9; rgr_02@3519: case SMCSWeapon_TASER: rgr_02@3519: return (int)CSGOWeapon_TASER; rgr_02@3519: case SMCSWeapon_HKP2000: rgr_02@3519: return (int)CSGOWeapon_HKP2000; rgr_02@3519: case SMCSWeapon_MP7: rgr_02@3519: return (int)CSGOWeapon_MP7; rgr_02@3519: case SMCSWeapon_MP9: rgr_02@3519: return (int)CSGOWeapon_MP9; rgr_02@3519: case SMCSWeapon_NOVA: rgr_02@3519: return (int)CSGOWeapon_NOVA; rgr_02@3519: case SMCSWeapon_P250: rgr_02@3519: return (int)CSGOWeapon_P250; rgr_02@3519: case SMCSWeapon_SCAR17: rgr_02@3519: return (int)CSGOWeapon_SCAR17; rgr_02@3519: case SMCSWeapon_SCAR20: rgr_02@3519: return (int)CSGOWeapon_SCAR20; rgr_02@3519: case SMCSWeapon_SG556: rgr_02@3519: return (int)CSGOWeapon_SG556; rgr_02@3519: case SMCSWeapon_SSG08: rgr_02@3519: return (int)CSGOWeapon_SSG08; rgr_02@3519: case SMCSWeapon_KNIFE_GG: rgr_02@3519: return (int)CSGOWeapon_KNIFE_GG; rgr_02@3519: case SMCSWeapon_KNIFE: rgr_02@3519: return (int)CSGOWeapon_KNIFE; rgr_02@3519: case SMCSWeapon_FLASHBANG: rgr_02@3519: return (int)CSGOWeapon_FLASHBANG; rgr_02@3519: case SMCSWeapon_HEGRENADE: rgr_02@3519: return (int)CSGOWeapon_HEGRENADE; rgr_02@3519: case SMCSWeapon_SMOKEGRENADE: rgr_02@3519: return (int)CSGOWeapon_SMOKEGRENADE; rgr_02@3519: case SMCSWeapon_MOLOTOV: rgr_02@3519: return (int)CSGOWeapon_MOLOTOV; rgr_02@3519: case SMCSWeapon_DECOY: rgr_02@3519: return (int)CSGOWeapon_DECOY; rgr_02@3519: case SMCSWeapon_INCGRENADE: rgr_02@3519: return (int)CSGOWeapon_INCGRENADE; rgr_02@3519: case SMCSWeapon_C4: rgr_02@3519: return (int)CSGOWeapon_C4; rgr_02@3519: case SMCSWeapon_KEVLAR: rgr_02@3519: return (int)CSGOWeapon_KEVLAR; rgr_02@3519: case SMCSWeapon_ASSAULTSUIT: rgr_02@3519: return (int)CSGOWeapon_ASSAULTSUIT; rgr_02@3519: case SMCSWeapon_NIGHTVISION: rgr_02@3519: return (int)CSGOWeapon_NVG; rgr_02@3519: case SMCSWeapon_DEFUSER: rgr_02@3519: return (int)CSGOWeapon_DEFUSER; rgr_02@3519: default: kyle@4028: return (int)CSGOWeapon_NONE; rgr_02@3519: } rgr_02@3519: #else kyle@4028: if (weaponId > (int)SMCSWeapon_NIGHTVISION || weaponId < (int)SMCSWeapon_NONE) kyle@4028: return (int)SMCSWeapon_NONE; rgr_02@3519: else rgr_02@3519: return weaponId; rgr_02@3519: #endif rgr_02@3519: } rgr_02@3519: rgr_02@3519: int GetFakeWeaponID(int weaponId) rgr_02@3519: { rgr_02@3519: #if SOURCE_ENGINE == SE_CSGO rgr_02@3519: switch((CSGOWeapon)weaponId) rgr_02@3519: { rgr_02@3519: case CSGOWeapon_NONE: rgr_02@3519: return (int)SMCSWeapon_NONE; rgr_02@3519: case CSGOWeapon_DEAGLE: rgr_02@3519: return (int)SMCSWeapon_DEAGLE; rgr_02@3519: case CSGOWeapon_ELITE: rgr_02@3519: return (int)SMCSWeapon_ELITE; rgr_02@3519: case CSGOWeapon_FIVESEVEN: rgr_02@3519: return (int)SMCSWeapon_FIVESEVEN; rgr_02@3519: case CSGOWeapon_GLOCK: rgr_02@3519: return (int)SMCSWeapon_GLOCK; rgr_02@3519: case CSGOWeapon_P228: rgr_02@3519: return (int)SMCSWeapon_P228; rgr_02@3519: case CSGOWeapon_USP: rgr_02@3519: return (int)SMCSWeapon_USP; rgr_02@3519: case CSGOWeapon_AK47: rgr_02@3519: return (int)SMCSWeapon_AK47; rgr_02@3519: case CSGOWeapon_AUG: rgr_02@3519: return (int)SMCSWeapon_AUG; rgr_02@3519: case CSGOWeapon_AWP: rgr_02@3519: return (int)SMCSWeapon_AWP; rgr_02@3519: case CSGOWeapon_FAMAS: rgr_02@3519: return (int)SMCSWeapon_FAMAS; rgr_02@3519: case CSGOWeapon_G3SG1: rgr_02@3519: return (int)SMCSWeapon_G3SG1; rgr_02@3519: case CSGOWeapon_GALIL: rgr_02@3519: return (int)SMCSWeapon_GALIL; rgr_02@3519: case CSGOWeapon_GALILAR: rgr_02@3519: return (int)SMCSWeapon_GALILAR; rgr_02@3519: case CSGOWeapon_M249: rgr_02@3519: return (int)SMCSWeapon_M249; rgr_02@3519: case CSGOWeapon_M3: rgr_02@3519: return (int)SMCSWeapon_M3; rgr_02@3519: case CSGOWeapon_M4A1: rgr_02@3519: return (int)SMCSWeapon_M4A1; rgr_02@3519: case CSGOWeapon_MAC10: rgr_02@3519: return (int)SMCSWeapon_MAC10; rgr_02@3519: case CSGOWeapon_MP5NAVY: rgr_02@3519: return (int)SMCSWeapon_MP5NAVY; rgr_02@3519: case CSGOWeapon_P90: rgr_02@3519: return (int)SMCSWeapon_P90; rgr_02@3519: case CSGOWeapon_SCOUT: rgr_02@3519: return (int)SMCSWeapon_SCOUT; rgr_02@3519: case CSGOWeapon_SG550: rgr_02@3519: return (int)SMCSWeapon_SG550; rgr_02@3519: case CSGOWeapon_SG552: rgr_02@3519: return (int)SMCSWeapon_SG552; rgr_02@3519: case CSGOWeapon_TMP: rgr_02@3519: return (int)SMCSWeapon_TMP; rgr_02@3519: case CSGOWeapon_UMP45: rgr_02@3519: return (int)SMCSWeapon_UMP45; rgr_02@3519: case CSGOWeapon_XM1014: rgr_02@3519: return (int)SMCSWeapon_XM1014; rgr_02@3519: case CSGOWeapon_BIZON: rgr_02@3519: return (int)SMCSWeapon_BIZON; rgr_02@3519: case CSGOWeapon_MAG7: rgr_02@3519: return (int)SMCSWeapon_MAG7; rgr_02@3519: case CSGOWeapon_NEGEV: rgr_02@3519: return (int)SMCSWeapon_NEGEV; rgr_02@3519: case CSGOWeapon_SAWEDOFF: rgr_02@3519: return (int)SMCSWeapon_SAWEDOFF; rgr_02@3519: case CSGOWeapon_TEC9: rgr_02@3519: return (int)SMCSWeapon_TEC9; rgr_02@3519: case CSGOWeapon_TASER: rgr_02@3519: return (int)SMCSWeapon_TASER; rgr_02@3519: case CSGOWeapon_HKP2000: rgr_02@3519: return (int)SMCSWeapon_HKP2000; rgr_02@3519: case CSGOWeapon_MP7: rgr_02@3519: return (int)SMCSWeapon_MP7; rgr_02@3519: case CSGOWeapon_MP9: rgr_02@3519: return (int)SMCSWeapon_MP9; rgr_02@3519: case CSGOWeapon_NOVA: rgr_02@3519: return (int)SMCSWeapon_NOVA; rgr_02@3519: case CSGOWeapon_P250: rgr_02@3519: return (int)SMCSWeapon_P250; rgr_02@3519: case CSGOWeapon_SCAR17: rgr_02@3519: return (int)SMCSWeapon_SCAR17; rgr_02@3519: case CSGOWeapon_SCAR20: rgr_02@3519: return (int)SMCSWeapon_SCAR20; rgr_02@3519: case CSGOWeapon_SG556: rgr_02@3519: return (int)SMCSWeapon_SG556; rgr_02@3519: case CSGOWeapon_SSG08: rgr_02@3519: return (int)SMCSWeapon_SSG08; rgr_02@3519: case CSGOWeapon_KNIFE_GG: rgr_02@3519: return (int)SMCSWeapon_KNIFE_GG; rgr_02@3519: case CSGOWeapon_KNIFE: rgr_02@3519: return (int)SMCSWeapon_KNIFE; rgr_02@3519: case CSGOWeapon_FLASHBANG: rgr_02@3519: return (int)SMCSWeapon_FLASHBANG; rgr_02@3519: case CSGOWeapon_HEGRENADE: rgr_02@3519: return (int)SMCSWeapon_HEGRENADE; rgr_02@3519: case CSGOWeapon_SMOKEGRENADE: rgr_02@3519: return (int)SMCSWeapon_SMOKEGRENADE; rgr_02@3519: case CSGOWeapon_MOLOTOV: rgr_02@3519: return (int)SMCSWeapon_MOLOTOV; rgr_02@3519: case CSGOWeapon_DECOY: rgr_02@3519: return (int)SMCSWeapon_DECOY; rgr_02@3519: case CSGOWeapon_INCGRENADE: rgr_02@3519: return (int)SMCSWeapon_INCGRENADE; rgr_02@3519: case CSGOWeapon_C4: rgr_02@3519: return (int)SMCSWeapon_C4; rgr_02@3519: case CSGOWeapon_KEVLAR: rgr_02@3519: return (int)SMCSWeapon_KEVLAR; rgr_02@3519: case CSGOWeapon_ASSAULTSUIT: rgr_02@3519: return (int)SMCSWeapon_ASSAULTSUIT; rgr_02@3519: case CSGOWeapon_NVG: rgr_02@3519: return (int)SMCSWeapon_NIGHTVISION; rgr_02@3519: case CSGOWeapon_DEFUSER: rgr_02@3519: return (int)SMCSWeapon_DEFUSER; rgr_02@3519: default: kyle@4028: return (int)SMCSWeapon_NONE; rgr_02@3519: } rgr_02@3519: #else kyle@4028: if (weaponId > (int)SMCSWeapon_NIGHTVISION || weaponId < (int)SMCSWeapon_NONE) kyle@4028: return (int)SMCSWeapon_NONE; rgr_02@3519: else rgr_02@3519: return weaponId; rgr_02@3519: #endif rgr_02@3519: } drifter01620@3965: bool IsValidWeaponID(int id) drifter01620@3965: { kyle@4028: if (id <= (int)SMCSWeapon_NONE) drifter01620@3965: return false; drifter01620@3965: //Why are these even HERE!?! They dont exist in CS:GO but have valid ID's still drifter01620@3965: #if SOURCE_ENGINE == SE_CSGO kyle@4028: else if (id > (int)SMCSWeapon_DEFUSER || id == (int)SMCSWeapon_P228 || id == (int)SMCSWeapon_SCOUT || id == (int)SMCSWeapon_SG550 || id == (int)SMCSWeapon_GALIL || kyle@4028: id == (int)SMCSWeapon_SCAR17 || id == (int)SMCSWeapon_USP || id == (int)SMCSWeapon_M3 || id == (int)SMCSWeapon_MP5NAVY || id == (int)SMCSWeapon_TMP || id == (int)SMCSWeapon_SG552) drifter01620@3965: return false; drifter01620@3965: #else kyle@4028: else if (id > (int)SMCSWeapon_NIGHTVISION) drifter01620@3965: return false; drifter01620@3965: #endif drifter01620@3965: return true; drifter01620@3965: }