set this function to libcod:
PHP Code:
void gsc_utils_getweaponidbyname() {
char* weapon;
if(!stackGetParams("s", &weapon)) {
printf("scriptengine> wrongs args for: gsc_utils_getweaponkeydatabyidandoffset(weapon)\n");
stackPushUndefined();
return;
}
stackPushInt(getWeapon(hook_findWeaponIndex(weapon)));
}
void gsc_utils_getweaponkeydatabyidandoffset() {
int id;
int offset;
int type;
if(!stackGetParams("iii", &id, &offset, &type)) {
printf("scriptengine> wrongs args for: gsc_utils_getweaponkeydatabyidandoffset(id,offset,type)\n");
stackPushUndefined();
return;
}
if(type == 0)
stackPushString(*(char**)(id + offset));
else if(type == 1)
stackPushInt(*(int*)(id + offset));
else
stackPushFloat(*(float*)(id + offset));
}
void gsc_utils_setweaponkeydatabyidandoffset_int() {
int id;
int offset;
int value;
if(!stackGetParams("iii", &id, &offset, &value)) {
printf("scriptengine> wrongs args for: gsc_utils_setweaponkeydatabyidandoffset(id,offset,value)\n");
stackPushUndefined();
return;
}
*(int*)(id + offset) = value;
}
void gsc_utils_setweaponkeydatabyidandoffset_string() {
int id;
int offset;
char* value;
if(!stackGetParams("iis", &id, &offset, &value)) {
printf("scriptengine> wrongs args for: gsc_utils_setweaponkeydatabyidandoffset(id,offset,value)\n");
stackPushUndefined();
return;
}
*(char**)(id + offset) = value;
}
void gsc_utils_setweaponkeydatabyidandoffset_float() {
int id;
int offset;
float value;
if(!stackGetParams("iif", &id, &offset, &value)) {
printf("scriptengine> wrongs args for: gsc_utils_setweaponkeydatabyidandoffset(id,offset,value)\n");
stackPushUndefined();
return;
}
*(float*)(id + offset) = value;
}
and in gsc:
PHP Code:
getOffset(key)
{
switch(key)
{
case "displayName": return 4;
case "modeName": return 112;
case "playerAnimType ": return 116;
case "AIOverlayDescription": return 8;
case "gunModel": return 12;
case "handModel": return 16;
case "worldModel": return 436;
case "idleAnim": return 24;
case "emptyIdleAnim": return 28;
case "fireAnim": return 32;
case "lastShotAnim": return 40;
case "rechamberAnim": return 44;
case "meleeAnim": return 48;
case "reloadAnim": return 52;
case "reloadEmptyAnim": return 56;
case "reloadStartAnim": return 60;
case "reloadEndAnim": return 64;
case "raiseAnim": return 68;
case "dropAnim": return 72;
case "altRaiseAnim": return 76;
case "altDropAnim": return 80;
case "quickRaiseAnim": return 84;
case "quickDropAnim": return 88;
case "adsFireAnim": return 92;
case "adsLastShotAnim": return 96;
case "adsRechamberAnim": return 100;
case "adsUpAnim": return 104;
case "adsDownAnim": return 108;
case "viewFlashEffect": return 144;
case "worldFlashEffect": return 148;
case "pickupSound": return 152;
case "ammoPickupSound": return 156;
case "fireSound": return 168;
case "fireSoundPlayer": return 172;
case "lastShotSound": return 192;
case "lastShotSoundPlayer": return 196;
case "meleeSwipeSound": return 200;
case "rechamberSound": return 204;
case "rechamberSoundPlayer": return 208;
case "reloadSound": return 212;
case "reloadSoundPlayer": return 216;
case "reloadEmptySound": return 220;
case "reloadEmptySoundPlayer": return 224;
case "reloadStartSound": return 228;
case "reloadStartSoundPlayer": return 232;
case "reloadEndSound": return 236;
case "reloadEndSoundPlayer": return 240;
case "raiseSound": return 244;
case "altSwitchSound": return 248;
case "putawaySound": return 252;
case "noteTrackSoundA": return 256;
case "noteTrackSoundB": return 260;
case "noteTrackSoundC": return 264;
case "noteTrackSoundD": return 268;
case "shellEjectEffect": return 272;
case "lastShotEjectEffect": return 276;
case "reticleCenter": return 280;
case "reticleSide": return 284;
case "reticleCenterSize": return 288;
case "reticleSideSize": return 292;
case "reticleMinOfs": return 296;
case "hudIcon": return 440;
case "modeIcon": return 444;
case "killIcon": return 844;
case "ammoName": return 452;
case "startAmmo": return 448;
case "clipName": return 460;
case "maxAmmo": return 468;
case "clipSize": return 472;
case "shotCount": return 476;
case "damage": return 492;
case "minDamage": return 1424;
case "meleeDamage": return 500;
case "minDamageRange": return 1432;
case "maxDamageRange": return 1436;
case "fireDelay": return 508;
case "meleeDelay": return 512;
case "fireTime": return 516;
case "rechamberTime": return 520;
case "rechamberBoltTime": return 524;
case "meleeTime": return 532;
case "reloadTime": return 536;
case "reloadEmptyTime": return 540;
case "reloadAddTime": return 544;
case "reloadStartTime": return 548;
case "reloadStartAddTime": return 552;
case "reloadEndTime": return 556;
case "dropTime": return 560;
case "raiseTime": return 564;
case "altDropTime": return 568;
case "altRaiseTime": return 572;
case "quickDropTime": return 576;
case "quickRaiseTime": return 580;
case "adsTransInTime": return 704;
case "adsTransOutTime": return 708;
case "aiVsAiAccuracyGraph": return 1292;
case "aiVsPlayerAccuracyGraph": return 1296;
case "fireRumble": return 1532;
case "meleeImpactRumble": return 1536;
case "adsOverlayShader": return 628;
case "adsOverlayWidth": return 636;
case "adsOverlayHeight": return 640;
case "altWeapon": return 872;
case "moveSpeedScale": return 612;
case "weaponType": return 120;
case "weaponClass": return 124;
case "weaponSlot": return 128;
case "rifleBullet": return 796;
case "armorPiercing": return 800;
case "semiAuto": return 804;
case "boltAction": return 808;
case "aimDownSight": return 812;
case "rechamberWhileAds": return 816;
case "noPartialReload": return 856;
case "segmentedReload": return 860;
case "wideListIcon": return 836;
case "wideKillIcon": return 848;
case "flipKillIcon": return 848;
case "dropAmmoMin": return 880;
case "dropAmmoMax": return 884;
case "reloadAmmoAdd": return 864;
case "reloadStartAdd": return 868;
case "locNone": return 1456;
case "locHelmet": return 1460;
case "locHead": return 1464;
case "locNeck": return 1468;
case "locTorsoUpper": return 1472;
case "locTorsoLower": return 1476;
case "locRightArmUpper": return 1480;
case "locRightArmLower": return 1484;
case "locRightHand": return 1488;
case "locLeftArmUpper": return 1492;
case "locLeftArmLower": return 1496;
case "locLeftHand": return 1500;
case "locRightLegUpper": return 1504;
case "locRightLegLower": return 1508;
case "locRightFoot": return 1512;
case "locLeftLegUpper": return 1516;
case "locLeftLegLower": return 1520;
case "locLeftFoot": return 1524;
case "locGun": return 1528;
default: return 0;
}
}
getType(key)
{
switch(key)
{
case "displayName":
case "modeName":
case "AIOverlayDescription":
case "gunModel":
case "handModel":
case "worldModel":
case "idleAnim":
case "emptyIdleAnim":
case "fireAnim":
case "lastShotAnim":
case "rechamberAnim":
case "meleeAnim":
case "reloadAnim":
case "reloadEmptyAnim":
case "reloadStartAnim":
case "reloadEndAnim":
case "raiseAnim":
case "dropAnim":
case "altRaiseAnim":
case "altDropAnim":
case "quickRaiseAnim":
case "quickDropAnim":
case "adsFireAnim":
case "adsLastShotAnim":
case "adsRechamberAnim":
case "adsUpAnim":
case "adsDownAnim":
case "viewFlashEffect":
case "worldFlashEffect":
case "pickupSound":
case "ammoPickupSound":
case "fireSound":
case "fireSoundPlayer":
case "lastShotSound":
case "lastShotSoundPlayer":
case "meleeSwipeSound":
case "rechamberSound":
case "rechamberSoundPlayer":
case "reloadSound":
case "reloadSoundPlayer":
case "reloadEmptySound":
case "reloadEmptySoundPlayer":
case "reloadStartSound":
case "reloadStartSoundPlayer":
case "reloadEndSound":
case "reloadEndSoundPlayer":
case "raiseSound":
case "altSwitchSound":
case "putawaySound":
case "noteTrackSoundA":
case "noteTrackSoundB":
case "noteTrackSoundC":
case "noteTrackSoundD":
case "shellEjectEffect":
case "lastShotEjectEffect":
case "reticleCenter":
case "reticleSide":
case "hudIcon":
case "modeIcon":
case "killIcon":
case "ammoName":
case "clipName":
case "aiVsAiAccuracyGraph":
case "aiVsPlayerAccuracyGraph":
case "fireRumble":
case "meleeImpactRumble":
case "adsOverlayShader":
case "altWeapon":
return "string";
case "playerAnimType":
case "startAmmo":
case "maxAmmo":
case "reticleCenterSize":
case "reticleSideSize":
case "reticleMinOfs":
case "clipSize":
case "shotCount":
case "damage":
case "minDamage":
case "meleeDamage":
case "weaponType":
case "weaponClass":
case "weaponSlot":
case "rifleBullet":
case "armorPiercing":
case "semiAuto":
case "boltAction":
case "aimDownSight":
case "rechamberWhileAds":
case "noPartialReload":
case "segmentedReload":
case "wideListIcon":
case "wideKillIcon":
case "flipKillIcon":
case "dropAmmoMin":
case "dropAmmoMax":
case "reloadAmmoAdd":
case "reloadStartAdd":
return "int";
case "fireDelay":
case "meleeDelay":
case "fireTime":
case "rechamberTime":
case "rechamberBoltTime":
case "meleeTime":
case "reloadTime":
case "reloadEmptyTime":
case "reloadAddTime":
case "reloadStartTime":
case "reloadStartAddTime":
case "reloadEndTime":
case "dropTime":
case "raiseTime":
case "altDropTime":
case "altRaiseTime":
case "quickDropTime":
case "quickRaiseTime":
case "adsTransInTime":
case "adsTransOutTime":
return "int_multiplied";
case "moveSpeedScale":
case "minDamageRange":
case "maxDamageRange":
case "adsOverlayWidth":
case "adsOverlayHeight":
case "locNone":
case "locHelmet":
case "locHead":
case "locNeck":
case "locTorsoUpper":
case "locTorsoLower":
case "locRightArmUpper":
case "locRightArmLower":
case "locRightHand":
case "locLeftArmUpper":
case "locLeftArmLower":
case "locLeftHand":
case "locRightLegUpper":
case "locRightLegLower":
case "locRightFoot":
case "locLeftLegUpper":
case "locLeftLegLower":
case "locLeftFoot":
case "locGun":
return "float";
}
}
readWeaponKeyData(name, key)
{
id = getweaponidbyname(name);
offset = getOffset(key);
if(offset == 0)
return "unknown key or offset (" + key + ")";
type = getType(key);
data = "";
switch(type)
{
case "string":
data = getweaponkeydatabyidandoffset(id, offset, 0);
break;
case "int":
data = getweaponkeydatabyidandoffset(id, offset, 1);
break;
case "int_multiplied":
data = getweaponkeydatabyidandoffset(id, offset, 1) / 1000;
break;
case "float":
data = getweaponkeydatabyidandoffset(id, offset, 2);
break;
}
switch(key)
{
case "playerAnimType":
switch(data)
{
case 0: data = "none"; break;
case 1: data = "other"; break;
case 2: data = "panzerfaust"; break;
case 3: data = "stickgrenade"; break;
case 4: data = "springfield"; break;
case 5: data = "bar"; break;
case 6: data = "mp40"; break;
case 7: data = "thompson"; break;
case 8: data = "sten"; break;
case 9: data = "bren"; break;
case 10: data = "kar98k"; break;
case 11: data = "m1carbine"; break;
case 12: data = "enfield"; break;
}
break;
case "weaponType":
switch(data)
{
case 0: data = "bullet"; break;
case 1: data = "grenade"; break;
case 2: data = "projectile"; break;
case 3: data = "binoculars"; break;
}
break;
case "weaponClass":
switch(data)
{
case 0: data = "rifle"; break;
case 1: data = "mg"; break;
case 2: data = "smg"; break;
case 3: data = "spread"; break;
case 4: data = "pistol"; break;
case 5: data = "grenade"; break;
case 6: data = "rocketlauncher"; break;
case 7: data = "turret"; break;
case 8: data = "non-player"; break;
case 9: data = "item"; break;
}
break;
case "weaponSlot":
switch(data)
{
case 0: data = "none"; break;
case 1: data = "primary"; break;
}
break;
}
return data;
}
setWeaponKeyData(name, key, value)
{
id = getweaponidbyname(name);
offset = getOffset(key);
if(offset == 0)
return false;
type = getType(key);
switch(key)
{
case "playerAnimType":
switch(value)
{
case "none": value = 0; break;
case "other": value = 1; break;
case "panzerfaust": value = 2; break;
case "stickgrenade": value = 3; break;
case "springfield": value = 4; break;
case "bar": value = 5; break;
case "mp40": value = 6; break;
case "thompson": value = 7; break;
case "sten": value = 8; break;
case "bren": value = 9; break;
case "kar98k": value = 10; break;
case "m1carbine": value = 11; break;
case "enfield": value = 12; break;
default: value = 0; break;
}
break;
case "weaponType":
switch(value)
{
case "bullet": value = 0; break;
case "grenade": value = 1; break;
case "projectile": value = 2; break;
case "binoculars": value = 3; break;
default: value = 0; break;
}
break;
case "weaponClass":
switch(value)
{
case "rifle": value = 0; break;
case "mg": value = 1; break;
case "smg": value = 2; break;
case "spread": value = 3; break;
case "pistol": value = 4; break;
case "grenade": value = 5; break;
case "rocketlauncher": value = 6; break;
case "turret": value = 7; break;
case "non-player": value = 8; break;
case "item": value = 9; break;
default: value = 0; break;
}
break;
case "weaponSlot":
switch(value)
{
case "none": value = 0; break;
case "primary": value = 1; break;
default: value = 1; break;
}
break;
}
switch(type)
{
case "string":
setweaponkeydatabyidandoffset_string(id, offset, value);
break;
case "int":
setweaponkeydatabyidandoffset_int(id, offset, value);
break;
case "int_multiplied":
setweaponkeydatabyidandoffset_int(id, offset, int(value * 1000));
break;
case "float":
setweaponkeydatabyidandoffset_float(id, offset, value);
break;
}
return true;
}
use it like:
PHP Code:
//get weapon information (the small and capital letters are important. see getOffset or getType function how to write it)
name = readWeaponKeyData("thompson_mp", "displayName");
iprintln(name);
setWeaponKeyData("thompson_mp", "displayName", "some variable");
setWeaponKeyData("thompson_mp", "fireTime", 0.05);
setWeaponKeyData("thompson_mp", "maxAmmo", 400);
Every weapon's variable is tested and working.
However, if you change something it will not affect client side. (E.g models or sounds)