Rawr moar stuff. This allows you to change weapon information that you would find in the ctx files.
PHP Code:
class CTFWeaponInfo : // 2884
public FileWeaponInfo_t // +0
{
public :
int m_nDamage; // +1704
int m_nBulletsPerShot; // +1708
float m_fRange; // +1712
float m_fSpread; // +1716
float m_fPunchAngle; // +1720
float m_fTimeFireDelay; // +1724
float m_fTimeIdle; // +1728
float m_fTimeIdleEmpty; // +1732
float m_fTimeReloadStart; // +1736
float m_fTimeReload; // +1740
bool m_bDrawCrosshair; // +1744
int m_nProjectileType; // +1748
int m_nAmmoPerShot; // +1752
float m_fProjectileSpeed; // +1756
float m_fSmackDelay; // +1760
bool m_bUseRapidFireCrits; // +1764
int m_nSecondary_Damage; // +1768
int m_nSecondary_BulletsPerShot; // +1772
float m_fSecondary_Range; // +1776
float m_fSecondary_Spread; // +1780
float m_fSecondary_PunchAngle; // +1784
float m_fSecondary_TimeFireDelay; // +1788
float m_fSecondary_TimeIdle; // +1792
float m_fSecondary_TimeIdleEmpty; // +1796
float m_fSecondary_TimeReloadStart; // +1800
float m_fSecondary_TimeReload; // +1804
bool m_bSecondary_DrawCrosshair; // +1808
int m_nSecondary_ProjectileTyp; // +1812
int m_nSecondary_AmmoPerShot; // +1816
int m_nUnknown1; // +1820
float m_fSecondary_SmackDelay; // +1824
bool m_bSecondary_UseRapidFireCrits; // +1828
int m_nWeaponType; // +1832
bool m_bGrenade; // +1836
float m_fDamageRadius; // +1840
float m_fPrimerTimer; // +1844
bool m_bLowerMainWeapon; // +1848
bool m_bPlayGrenTimer; // +1849
bool m_bHasTeamSkins; // +1850
bool m_bHasTeamSkins_Worldmodel; // +1851
char m_achMuzzleFlashModel[128]; // +1852
float m_fMuzzleFlashModelDuration; // +1980
char m_achMuzzleFlashParticleEffect[128]; // +1984
char m_achTracerEffect[128]; // +2112
bool m_bDoInstantEjectBrass; // +2240
char m_achBrassModel[128]; // +2241
char m_achExplosionSound[128]; // +2369
char m_achExplosionEffect[128]; // +2497
char m_achExplosionPlayerEffect[128]; // +2625
char m_achExplosionWaterEffect[128]; // +2753
bool m_bDontDrop; // +2881
};
typedef CUtlDict< CTFWeaponInfo *, unsigned short > WeaponDatabase;
WeaponDatabase *g_pWeaponInfoDatabase;
CON_COMMAND(wazz_weapon, "Wazz Environment :: Weapon info hacks")
{
if (args.ArgC() == 1)
{
META_CONPRINTF("Wazz Environment :: Weapon info hacks\n");
return;
}
static bool bInit = false;
if (!bInit)
{
#ifdef _WIN32
void *addr;
int offset;
/*
"ReadWeaponDataFromFileForSlot_SubCall_01"
{
"library" "server"
"windows" "\x83\xEC\x08\x85\xF6\x74\x2A\x8D\x04\x24\x50\xB9"
}
*/
if (!g_pGameConf->GetMemSig("ReadWeaponDataFromFileForSlot_SubCall_01", &addr) || !addr)
{
META_CONPRINTF("NULL 1\n");
return;
}
/*
"WeaponDatabase_Offset"
{
"windows" "12"
}
*/
if (!g_pGameConf->GetOffset("WeaponDatabase_Offset", &offset))
{
META_CONPRINTF("NULL 2\n");
return;
}
g_pWeaponInfoDatabase = *(WeaponDatabase **)((uint32)addr + offset);
#else
/*
"m_WeaponInfoDatabase"
{
"library" "server"
"linux" "@m_WeaponInfoDatabase"
}
*/
void *addr;
if (!g_pGameConf->GetMemSig("m_WeaponInfoDatabase", &addr) || !addr)
{
META_CONPRINTF("NULL 1\n");
return;
}
g_pWeaponInfoDatabase = (WeaponDatabase *)addr;
#endif
META_CONPRINTF("Address: %p\n", g_pWeaponInfoDatabase);
META_CONPRINTF("Count: %i\n", g_pWeaponInfoDatabase->Count());
bInit = true;
}
if (args.ArgC() != 3)
{
META_CONPRINTF("Wrong number of args u slag\n");
return;
}
const char *pszName = args.Arg(1);
int iIndex = g_pWeaponInfoDatabase->Find(pszName);
if (!g_pWeaponInfoDatabase->IsValidIndex(iIndex))
{
META_CONPRINTF("Invalid Name: %s\n", pszName);
return;
}
CTFWeaponInfo *pInfo = g_pWeaponInfoDatabase->Element(iIndex);
pInfo->m_nProjectileType = atoi(args.Arg(2));
META_CONPRINTF("Done\n");
return;
}
The CONCOMMAND is just an example, if you were to use it and do wazz_weapons tf_weapon_minigun 2 you would have a minigun that shoots rockets. Changes are instant but this method effects all weapons of that type. To have a per-weapon setup you should detour `CTFWeaponBase::GetTFWpnData(void)const` and return your own instance of CTFWeaponInfo... I guess.
Edit: Include weapon_parse.h from the HL SDK for the FileWeaponInfo_t class.