SoulWeaver16
08-17-2022 09:02
Extended Arm Weapon Skin + Inspect
4 Attachment(s)
I have my
Extended Arm Weapon Skin plugin and
CS:GO Weapon Inspect Plugin
Video Preview
The issue is that when inspecting the weapon, it chooses a random submodel instead of respecting the one chosen by the user.
I don't see what I would need to change to make it compatible, I leave the .sma here:
Modified SetViewEntityBody 2
Spoiler
SetViewEntityBody2_edit.sma
Code:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define PLUGIN "SetViewEntityBody [CS1.6-CZ]"
#define VERSION "2"
#define AUTHOR "1xAero mod. by KayDee"
//Builds by Hanna https://forums.alliedmods.net/showthread.php?t=287754
//Profile https://forums.alliedmods.net/member.php?u=273346
//Natives
native cs_set_viewmodel_body(iPlayer, iValue);
native cs_get_viewmodel_body(iPlayer);
native cs_set_user_sex(iPlayer, iValue);
native cs_get_user_sex(iPlayer);
//Linux diff
#define XO_WEAPON 4
#define XO_PLAYER 5
//Spectator options
#define NULLENT -1
#define OBS_IN_EYE 4
//Player base
#define MAXPLAYERS 32
#define MALE 0
#define FEMALE 1
#define TRUE 1
#define FALSE 0
//Weapon State
#define WPNSTATE_GLOCK18_BURST_MODE (1<<1)
#define WPNSTATE_FAMAS_BURST_MODE (1<<4)
#define WPNSTATE_M4A1_SILENCED (1<<2)
#define WPNSTATE_USP_SILENCED (1<<0)
#define WPNSTATE_ELITE_LEFT (1<<3)
#define UNSIL 0
#define SILENCED 1
//Weapon type
#define WEAPONTYPE_ELITE 1
#define WEAPONTYPE_GLOCK18 2
#define WEAPONTYPE_FAMAS 3
#define WEAPONTYPE_OTHER 4
#define WEAPONTYPE_M4A1 5
#define WEAPONTYPE_USP 6
//Weapon anims
#define IDLE_ANIM 0
#define GLOCK18_SHOOT2 4
#define GLOCK18_SHOOT3 5
#define AK47_SHOOT1 3
#define AUG_SHOOT1 3
#define AWP_SHOOT2 2
#define DEAGLE_SHOOT1 2
#define ELITE_SHOOTLEFT5 6 //TODO
#define ELITE_SHOOTRIGHT5 12
#define CLARION_SHOOT2 4
#define CLARION_SHOOT3 3
#define FIVESEVEN_SHOOT1 1
#define G3SG1_SHOOT 1
#define GALIL_SHOOT3 5
#define M3_FIRE2 2
#define XM1014_FIRE2 2
#define M4A1_SHOOT3 3
#define M4A1_UNSIL_SHOOT3 10
#define M249_SHOOT2 2
#define MAC10_SHOOT1 3
#define MP5N_SHOOT1 3
#define P90_SHOOT1 3
#define P228_SHOOT2 2
#define SCOUT_SHOOT 1
#define SG550_SHOOT 1
#define SG552_SHOOT2 4
#define TMP_SHOOT3 5
#define UMP45_SHOOT2 4
#define USP_UNSIL_SHOOT3 11
#define USP_SHOOT3 3
//Weapon Sounds
#define DRYFIRE_PISTOL "weapons/dryfire_pistol.wav"
#define DRYFIRE_RIFLE "weapons/dryfire_rifle.wav"
#define GLOCK18_BURST_SOUND "weapons/glock18-1.wav"
#define GLOCK18_SHOOT_SOUND "weapons/glock18-2.wav"
#define AK47_SHOOT_SOUND "weapons/ak47-1.wav"
#define AUG_SHOOT_SOUND "weapons/aug-1.wav"
#define AWP_SHOOT_SOUND "weapons/awp1.wav"
#define DEAGLE_SHOOT_SOUND "weapons/deagle-2.wav"
#define ELITE_SHOOT_SOUND "weapons/elite_fire.wav"
#define CLARION_BURST_SOUND "weapons/famas-burst.wav"
#define CLARION_SHOOT_SOUND "weapons/famas-1.wav"
#define FIVESEVEN_SHOOT_SOUND "weapons/fiveseven-1.wav"
#define G3SG1_SHOOT_SOUND "weapons/g3sg1-1.wav"
#define GALIL_SHOOT_SOUND "weapons/galil-1.wav"
#define M3_SHOOT_SOUND "weapons/m3-1.wav"
#define XM1014_SHOOT_SOUND "weapons/xm1014-1.wav"
#define M4A1_SILENT_SOUND "weapons/m4a1-1.wav"
#define M4A1_SHOOT_SOUND "weapons/m4a1_unsil-1.wav"
#define M249_SHOOT_SOUND "weapons/m249-1.wav"
#define MAC10_SHOOT_SOUND "weapons/mac10-1.wav"
#define MP5_SHOOT_SOUND "weapons/mp5-1.wav"
#define P90_SHOOT_SOUND "weapons/p90-1.wav"
#define P228_SHOOT_SOUND "weapons/p228-1.wav"
#define SCOUT_SHOOT_SOUND "weapons/scout_fire-1.wav"
#define SG550_SHOOT_SOUND "weapons/sg550-1.wav"
#define SG552_SHOOT_SOUND "weapons/sg552-1.wav"
#define TMP_SHOOT_SOUND "weapons/tmp-1.wav"
#define UMP45_SHOOT_SOUND "weapons/ump45-1.wav"
#define USP_SHOOT_SOUND "weapons/usp_unsil-1.wav"
#define USP_SILENT_SOUND "weapons/usp1.wav"
//Knife models
#define MALE_KNIFE "models/weapons/v_knife.mdl"
#define FEMALE_KNIFE "models/weapons/v_knife_w.mdl"
//Shell Models
#define SHELL_MODEL "models/pshell.mdl"
#define SHOTGUN_SHELL_MODEL "models/shotgunshell.mdl"
//Macros
#define WEAPON_STRING(%0,%1) (pev(%0, pev_classname, %1, charsmax(%1)))
#define WEAPON_ENT(%0) (get_pdata_int(%0, m_iId, XO_WEAPON))
#define CLIENT_DATA(%0,%1,%2) (get_user_info(%0, %1, %2, charsmax(%2)))
#define HOOK_DATA(%0,%1,%2) (set_user_info(%0, %1, %2))
// CBasePlayerItem
stock m_pPlayer = 41 // CBasePlayer *
stock m_iId = 43 // int
// CBasePlayerWeapon
stock m_flNextPrimaryAttack = 46 // float
stock m_iClip = 51 // int
stock m_iShellId = 57 // int
stock m_iShotsFired = 64 // int
stock m_iWeaponState = 74 // int
stock m_flLastEventCheck = 38 // float
// CBasePlayer
stock m_flEjectBrass = 111 // float
stock m_pActiveItem = 373 // CBasePlayerItem *
//Weapon ents
new WeaponNames[][] = { "weapon_knife", "weapon_glock18", "weapon_ak47", "weapon_aug", "weapon_awp", "weapon_c4", "weapon_deagle", "weapon_elite", "weapon_famas",
"weapon_fiveseven", "weapon_flashbang", "weapon_g3sg1", "weapon_galil", "weapon_hegrenade", "weapon_m3", "weapon_xm1014", "weapon_m4a1", "weapon_m249", "weapon_mac10",
"weapon_mp5navy", "weapon_p90", "weapon_p228", "weapon_scout", "weapon_sg550", "weapon_sg552", "weapon_smokegrenade", "weapon_tmp", "weapon_ump45", "weapon_usp" }
//World decals
new TraceBullets[][] = { "func_breakable", "func_wall", "func_door", "func_plat", "func_rotating", "worldspawn", "func_door_rotating" }
//Old models to unprecache
new g_OldModels[][] = { "models/v_knife.mdl", "models/v_glock18.mdl", "models/v_ak47.mdl", "models/v_aug.mdl", "models/v_awp.mdl", "models/v_c4.mdl" , "models/v_deagle.mdl",
"models/v_elite.mdl", "models/v_famas.mdl", "models/v_fiveseven.mdl", "models/v_flashbang.mdl", "models/v_g3sg1.mdl", "models/v_galil.mdl", "models/v_hegrenade.mdl",
"models/v_m3.mdl", "models/v_xm1014.mdl", "models/v_m4a1.mdl", "models/v_m249.mdl", "models/v_mac10.mdl", "models/v_mp5.mdl", "models/v_p90.mdl", "models/v_p228.mdl",
"models/v_scout.mdl", "models/v_sg550.mdl", "models/v_sg552.mdl", "models/v_smokegrenade.mdl", "models/v_tmp.mdl", "models/v_ump45.mdl", "models/v_usp.mdl" }
new iBodyIndex[MAXPLAYERS + 1]
const GUN_SHOT_DECAL_NUM = 5
new iSex[MAXPLAYERS + 1], g_szModName[8], g_iGunShotDecalNums[GUN_SHOT_DECAL_NUM]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
for (new i; i < sizeof WeaponNames; i++)
{
RegisterHam(Ham_Item_Deploy, WeaponNames[i], "HamF_Item_Deploy_Post", TRUE);
RegisterHam(Ham_CS_Weapon_SendWeaponAnim, WeaponNames[i], "HamF_CS_Weapon_SendWeaponAnim_Post", TRUE);
RegisterHam(Ham_Weapon_PrimaryAttack, WeaponNames[i], "HamF_Weapon_PrimaryAttack");
}
for (new i; i < sizeof TraceBullets; i++)
RegisterHam(Ham_TraceAttack, TraceBullets[i], "HamF_TraceAttack_Post", TRUE);
register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", TRUE);
register_forward(FM_PlaybackEvent, "Forward_PlaybackEvent");
register_forward(FM_ClientUserInfoChanged, "Forward_ClientUserInfoChanged");
get_modname(g_szModName, charsmax(g_szModName))
// Gun Shot decals
if (equali(g_szModName,"cstrike"))
{
g_iGunShotDecalNums = {41, 42, 43, 44, 45}
}
else if (equali(g_szModName,"czero"))
{
g_iGunShotDecalNums = {53, 54, 55, 56, 57}
}
}
public Forward_PrecacheModel(const iModels[])
{
for (new i; i < sizeof g_OldModels; i++)
{
if(!strcmp(iModels, g_OldModels[i]))
{
forward_return(FMV_CELL, 0);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public HamF_Item_Deploy_Post(iEnt)
{
static iPlayer;
iPlayer = get_pdata_cbase(iEnt, m_pPlayer, XO_WEAPON);
set_pev(iPlayer, pev_viewmodel2, ""); //Because we unprecached our default viewmodels or we don't want to show the original bodyid
set_task(0.1, "DeployWeaponSwitch", iPlayer); //Set with a bit delay to prevent bug, m_flLastEventCheck need delay too
}
public HamF_CS_Weapon_SendWeaponAnim_Post(iEnt, iAnim, Skiplocal)
{
static iPlayer;
iPlayer = get_pdata_cbase(iEnt, m_pPlayer, XO_WEAPON);
SendWeaponAnim(iPlayer, iAnim, iBodyIndex[iPlayer]); //Our v_ animations overhaul (reload, sil, unsil and other)
}
public HamF_Weapon_PrimaryAttack(iEnt)
{
switch(WEAPON_ENT(iEnt))
{
case CSW_C4, CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
return HAM_IGNORED;
default: PrimaryAttackEmulation(iEnt);
}
return HAM_IGNORED;
}
public HamF_TraceAttack_Post(iEnt, iAttacker, Float:damage, Float:fDir[3], ptr, iDamageType)
{
static iWeapon, Float:vecEnd[3];
iWeapon = get_pdata_cbase(iAttacker, m_pActiveItem, XO_PLAYER);
switch(WEAPON_ENT(iWeapon))
{
case CSW_KNIFE:
return HAM_IGNORED;
default:
{
get_tr2(ptr, TR_vecEndPos, vecEnd);
// Decal effects, add here spark, any
engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, vecEnd, 0);
write_byte(TE_GUNSHOTDECAL);
engfunc(EngFunc_WriteCoord, vecEnd[0]);
engfunc(EngFunc_WriteCoord, vecEnd[1]);
engfunc(EngFunc_WriteCoord, vecEnd[2]);
write_short(iEnt);
write_byte(g_iGunShotDecalNums[random_num(0, GUN_SHOT_DECAL_NUM - 1)]);
message_end();
}
}
return HAM_IGNORED;
}
enum
{
SPEC_MODE,
SPEC_TARGET,
SPEC_END
};
//CS weapon animations hook/block fire here. With pev_iuser2 checkout. This code part by fl0wer
public FM_Hook_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle)
{
static aSpecInfo[33][SPEC_END];
static Float: flGameTime;
static Float: flLastEventCheck;
static iTarget;
static iSpecMode;
static iActiveItem;
static iId;
iTarget = (iSpecMode = pev(iPlayer, pev_iuser1)) ? pev(iPlayer, pev_iuser2) : iPlayer;
if(!pev_valid(iTarget))
return FMRES_IGNORED
iActiveItem = get_pdata_cbase(iTarget, m_pActiveItem, XO_PLAYER);
if(!iActiveItem || iActiveItem == NULLENT || !pev_valid(iActiveItem))
return FMRES_IGNORED;
iId = get_pdata_int(iActiveItem, m_iId, XO_WEAPON);
if(!iId || iId == FM_NULLENT || !pev_valid(iId))
return FMRES_IGNORED;
flGameTime = get_gametime();
flLastEventCheck = get_pdata_float(iActiveItem, m_flLastEventCheck, XO_WEAPON);
if(iSpecMode)
{
if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
{
aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode;
aSpecInfo[iPlayer][SPEC_TARGET] = FALSE;
}
if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
{
aSpecInfo[iPlayer][SPEC_TARGET] = iTarget;
new iTaskData[2];
iTaskData[0] = iBodyIndex[iTarget];
iTaskData[1] = IDLE_ANIM;
//Because once pushing LMB u will immediately move to OBS_IN_EYE, the anim message may skip, so let's make delay
set_task(0.1, "SPEC_OBS_IN_EYE", iPlayer, iTaskData, sizeof(iTaskData)); //Delay 0.1, because with high ping this may skip this 99%
}
}
if(!flLastEventCheck)
{
set_cd(CD_Handle, CD_flNextAttack, flGameTime + 0.001);
set_cd(CD_Handle, CD_WeaponAnim, IDLE_ANIM);
return FMRES_HANDLED;
}
if(flLastEventCheck <= flGameTime)
{
SendWeaponAnim(iTarget, GetWeaponDrawAnim(iActiveItem), iBodyIndex[iTarget]); //Custom weapon draw anim should go there too
set_pdata_float(iActiveItem, m_flLastEventCheck, 0.0, XO_WEAPON);
}
return FMRES_IGNORED;
}
public Forward_PlaybackEvent(iFlags, pPlayer, iEvent, Float:fDelay, Float:vecOrigin[3], Float:vecAngle[3], Float:flParam1, Float:flParam2, iParam1, iParam2, bParam1, bParam2)
{
//Fire anim for spectator, don't worry this will not touch anything, except pev_iuser2
static i, iCount, iSpectator, iszSpectators[32];
get_players(iszSpectators, iCount, "bch");
for(i = 0; i < iCount; i++)
{
iSpectator = iszSpectators[i];
if(pev(iSpectator, pev_iuser1) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != pPlayer)
continue;
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED; //Let other things to be pass, such as custom weapons
}
public Forward_ClientUserInfoChanged(iPlayer)
{
static iUserInfo[6] = "cl_lw", iClientValue[2], iServerValue[2] = "1"; //Preventing them from enabling server weapons to avoid clientside bugs
//I guess cl_minmodels block should go here too, will do later
if(CLIENT_DATA(iPlayer, iUserInfo, iClientValue))
{
HOOK_DATA(iPlayer, iUserInfo, iServerValue);
//client_print(iPlayer, print_chat, "User Local Weapons Value: %s, Server Local Weapons Value: %s", iClientValue, iServerValue);
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
//Natives
public plugin_natives()
{
register_native("cs_set_viewmodel_body", "ViewBodySwitch", TRUE);
register_native("cs_get_viewmodel_body", "GetViewBodySwitch", TRUE);
register_native("cs_set_user_sex", "SetSex", TRUE);
register_native("cs_get_user_sex", "GetSex", TRUE);
}
public ViewBodySwitch(iPlayer, iValue)
iBodyIndex[iPlayer] = iValue;
public GetViewBodySwitch(iPlayer)
return iBodyIndex[iPlayer];
public SetSex(iPlayer, iValue)
iSex[iPlayer] = iValue;
public GetSex(iPlayer)
return iSex[iPlayer];
/***************************************************************************/
/***************************************************************************/
/*CUSTOM FUNCTIONS*/
/***************************************************************************/
/***************************************************************************/
//Get .mdl draw anim sequence
stock GetWeaponDrawAnim(iEntity)
{
static DrawAnim, iWeaponState;
if(get_pdata_int(iEntity, m_iWeaponState, XO_WEAPON) & WPNSTATE_USP_SILENCED || get_pdata_int(iEntity, m_iWeaponState, XO_WEAPON) & WPNSTATE_M4A1_SILENCED)
iWeaponState = SILENCED
else
iWeaponState = UNSIL
switch(WEAPON_ENT(iEntity))
{
case CSW_P228, CSW_XM1014, CSW_M3: DrawAnim = 6;
case CSW_SCOUT, CSW_SG550, CSW_M249, CSW_G3SG1: DrawAnim = 4;
case CSW_MAC10, CSW_AUG, CSW_UMP45, CSW_GALIL, CSW_FAMAS, CSW_MP5NAVY, CSW_TMP, CSW_SG552, CSW_AK47, CSW_P90: DrawAnim = 2;
case CSW_ELITE: DrawAnim = 15;
case CSW_FIVESEVEN, CSW_AWP, CSW_DEAGLE: DrawAnim = 5;
case CSW_USP:
{
switch(iWeaponState)
{
case SILENCED: DrawAnim = 6;
case UNSIL: DrawAnim = 14;
}
}
case CSW_M4A1:
{
switch(iWeaponState)
{
case SILENCED: DrawAnim = 5;
case UNSIL: DrawAnim = 12;
}
}
case CSW_GLOCK18: DrawAnim = 8;
case CSW_KNIFE, CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE: DrawAnim = 3;
case CSW_C4: DrawAnim = 1;
}
return DrawAnim;
}
//Emulation, not attack replace
stock PrimaryAttackEmulation(iEnt)
{
switch(WEAPON_ENT(iEnt))
{
//Func description: WeaponShootInfo(iWeapon, iAnim, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)
case CSW_GLOCK18: WeaponShootInfo(iEnt, GLOCK18_SHOOT3, DRYFIRE_PISTOL, GLOCK18_SHOOT_SOUND, FALSE, WEAPONTYPE_GLOCK18);
case CSW_AK47: WeaponShootInfo(iEnt, AK47_SHOOT1, DRYFIRE_RIFLE, AK47_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_AUG: WeaponShootInfo(iEnt, AUG_SHOOT1, DRYFIRE_RIFLE, AUG_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_AWP: WeaponShootInfo(iEnt, AWP_SHOOT2, DRYFIRE_RIFLE, AWP_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_DEAGLE: WeaponShootInfo(iEnt, DEAGLE_SHOOT1, DRYFIRE_PISTOL, DEAGLE_SHOOT_SOUND, FALSE, WEAPONTYPE_OTHER);
case CSW_ELITE: WeaponShootInfo(iEnt, ELITE_SHOOTRIGHT5, DRYFIRE_PISTOL, ELITE_SHOOT_SOUND, FALSE, WEAPONTYPE_ELITE);
case CSW_FAMAS: WeaponShootInfo(iEnt, CLARION_SHOOT3, DRYFIRE_RIFLE, CLARION_SHOOT_SOUND, TRUE, WEAPONTYPE_FAMAS);
case CSW_FIVESEVEN: WeaponShootInfo(iEnt, FIVESEVEN_SHOOT1, DRYFIRE_PISTOL, FIVESEVEN_SHOOT_SOUND, FALSE, WEAPONTYPE_OTHER);
case CSW_G3SG1: WeaponShootInfo(iEnt, G3SG1_SHOOT, DRYFIRE_RIFLE, G3SG1_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_GALIL: WeaponShootInfo(iEnt, GALIL_SHOOT3, DRYFIRE_RIFLE, GALIL_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_M3: WeaponShootInfo(iEnt, M3_FIRE2, DRYFIRE_RIFLE, M3_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_XM1014: WeaponShootInfo(iEnt, XM1014_FIRE2, DRYFIRE_RIFLE, XM1014_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_M4A1: WeaponShootInfo(iEnt, M4A1_UNSIL_SHOOT3, DRYFIRE_RIFLE, M4A1_SHOOT_SOUND, TRUE, WEAPONTYPE_M4A1);
case CSW_M249: WeaponShootInfo(iEnt, M249_SHOOT2, DRYFIRE_RIFLE, M249_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_MAC10: WeaponShootInfo(iEnt, MAC10_SHOOT1, DRYFIRE_RIFLE, MAC10_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_MP5NAVY: WeaponShootInfo(iEnt, MP5N_SHOOT1, DRYFIRE_RIFLE, MP5_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_P90: WeaponShootInfo(iEnt, P90_SHOOT1, DRYFIRE_RIFLE, P90_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_P228: WeaponShootInfo(iEnt, P228_SHOOT2, DRYFIRE_PISTOL, P228_SHOOT_SOUND, FALSE, WEAPONTYPE_OTHER);
case CSW_SCOUT: WeaponShootInfo(iEnt, SCOUT_SHOOT, DRYFIRE_RIFLE, SCOUT_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_SG550: WeaponShootInfo(iEnt, SG550_SHOOT, DRYFIRE_RIFLE, SG550_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_SG552: WeaponShootInfo(iEnt, SG552_SHOOT2, DRYFIRE_RIFLE, SG552_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_TMP: WeaponShootInfo(iEnt, TMP_SHOOT3, DRYFIRE_RIFLE, TMP_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_UMP45: WeaponShootInfo(iEnt, UMP45_SHOOT2, DRYFIRE_RIFLE, UMP45_SHOOT_SOUND, TRUE, WEAPONTYPE_OTHER);
case CSW_USP: WeaponShootInfo(iEnt, USP_UNSIL_SHOOT3, DRYFIRE_PISTOL, USP_SHOOT_SOUND, FALSE, WEAPONTYPE_USP);
}
return HAM_IGNORED;
}
//Set here anims, sounds
stock WeaponShootInfo(iEnt, iAnim, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)
{
static iPlayer, iClip;
iPlayer = get_pdata_cbase(iEnt, m_pPlayer, XO_WEAPON);
iClip = get_pdata_int(iEnt, m_iClip, XO_WEAPON);
if(!iClip)
{
emit_sound(iPlayer, CHAN_AUTO, szSoundEmpty, 0.8, ATTN_NORM, 0, PITCH_NORM);
set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.2, XO_WEAPON); //m_flNextPrimaryAttack = GetNextAttackDelay(0.2);
return HAM_SUPERCEDE;
}
if(get_pdata_int(iEnt, m_iShotsFired, XO_WEAPON) && !iAutoShoot)
return HAM_SUPERCEDE;
switch(iWeaponType)
{
case WEAPONTYPE_ELITE:
{
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_ELITE_LEFT)
PlayWeaponState(iPlayer, ELITE_SHOOT_SOUND, ELITE_SHOOTLEFT5);
}
case WEAPONTYPE_GLOCK18:
{
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_GLOCK18_BURST_MODE)
PlayWeaponState(iPlayer, GLOCK18_BURST_SOUND, GLOCK18_SHOOT2);
}
case WEAPONTYPE_FAMAS:
{
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_FAMAS_BURST_MODE)
PlayWeaponState(iPlayer, CLARION_BURST_SOUND, CLARION_SHOOT2);
}
case WEAPONTYPE_M4A1:
{
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_M4A1_SILENCED)
PlayWeaponState(iPlayer, M4A1_SILENT_SOUND, M4A1_SHOOT3);
}
case WEAPONTYPE_USP:
{
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_USP_SILENCED)
PlayWeaponState(iPlayer, USP_SILENT_SOUND, USP_SHOOT3);
}
}
//Second mode disabled or weapontype other
if(!(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON)))
PlayWeaponState(iPlayer, szSoundFire, iAnim);
EjectBrass(iPlayer, iEnt);
return HAM_IGNORED;
}
//Play shoot anim and emit fire sounds
stock PlayWeaponState(iPlayer, const szShootSound[], iWeaponAnim)
{
emit_sound(iPlayer, CHAN_WEAPON, szShootSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
SendWeaponAnim(iPlayer, iWeaponAnim, iBodyIndex[iPlayer])
}
//Animation stock (include Spectators check) by fl0wer
stock SendWeaponAnim(iPlayer, iAnim, iBody)
{
static i, iCount, iSpectator, iszSpectators[32];
set_pev(iPlayer, pev_weaponanim, iAnim);
message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
write_byte(iAnim);
write_byte(iBody);
message_end();
if(pev(iPlayer, pev_iuser1))
return;
get_players(iszSpectators, iCount, "bch");
for(i = 0; i < iCount; i++)
{
iSpectator = iszSpectators[i];
if(pev(iSpectator, pev_iuser1) != OBS_IN_EYE || pev(iSpectator, pev_iuser2) != iPlayer)
continue;
set_pev(iSpectator, pev_weaponanim, iAnim);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, iSpectator);
write_byte(iAnim);
write_byte(iBody);
message_end();
}
}
//Shells, i've searched the client burst shell ejection, but the function does same effect, so let it be
EjectBrass(iPlayer, iEnt)
{
static iShellRifle, iShellShotgun;
if(!iShellRifle || !iShellShotgun)
{
iShellRifle = engfunc(EngFunc_PrecacheModel, SHELL_MODEL);
iShellShotgun = engfunc(EngFunc_PrecacheModel, SHOTGUN_SHELL_MODEL);
}
switch(WEAPON_ENT(iEnt))
{
case CSW_M3, CSW_XM1014: set_pdata_int(iEnt, m_iShellId, iShellShotgun, XO_WEAPON);
case CSW_ELITE: return; //Dual Weapon client part side, should do with message, let skip this currently
default: set_pdata_int(iEnt, m_iShellId, iShellRifle, XO_WEAPON);
}
if(get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_FAMAS_BURST_MODE || get_pdata_int(iEnt, m_iWeaponState, XO_WEAPON) & WPNSTATE_GLOCK18_BURST_MODE)
set_task(0.1, "EjectAdditionalBurstShell", iPlayer) //Temporarly, but don't need to create entity through amxx
set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), XO_PLAYER);
}
/***************************************************************************/
/***************************************************************************/
/*TASK DATA*/
/***************************************************************************/
/***************************************************************************/
public DeployWeaponSwitch(iPlayer)
{
static iEnt, iWeaponName[24];
iEnt = get_pdata_cbase(iPlayer, m_pActiveItem, XO_PLAYER);
if(!iEnt || iEnt == FM_NULLENT || !pev_valid(iEnt))
return;
WEAPON_STRING(iEnt, iWeaponName);
set_pdata_float(iEnt, m_flLastEventCheck, get_gametime() + 0.001, XO_WEAPON); //0.001 is good enough
SendWeaponAnim(iPlayer, IDLE_ANIM, iBodyIndex[iPlayer]); //Slow message
}
public SPEC_OBS_IN_EYE(iTaskData[], iPlayer)
{
SendWeaponAnim(iPlayer, iTaskData[1], iTaskData[0]);
}
public EjectAdditionalBurstShell(iPlayer)
set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), XO_PLAYER);
Extended Arm Weapon Skin
Spoiler
Extended_Arm_Weapon_Skin.sma
Code:
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>
//Linux diff
#define XO_WEAPON 4
// CBasePlayerItem
#define m_pPlayer 41 // CBasePlayer *
native cs_set_viewmodel_body(iPlayer, iValue); //This will set v_ .mdl body (PlayerIndex, Bodygroup number)
enum _:BodyID
{
Arctic,
Gign,
GSG9,
Guerilla,
Leet,
SAS,
Terror,
Urban,
VIP,
Militia,
Spetsnaz,
};
new const g_szModelName[BodyID][] =
{
"arctic",
"gign",
"gsg9",
"guerilla",
"leet",
"sas",
"terror",
"urban",
"vip",
"militia",
"spetsnaz",
}
enum _:TaskData
{
iPlayer,
szWeaponModelName[64]
}
new const g_szUserInfoModel[] = "model"
new const g_szWeaponNameMp5Navy[] = "weapon_mp5navy"
new const g_szNewWeaponDirectoryMp5Navy[] = "models/extended/v_mp5.mdl"
new const g_szWeaponNamePrefix[] = "weapon_"
new const g_szNewWeaponDirectory[] = "models/extended/v_"
new const g_szModelNameExtension[] = ".mdl"
new Trie:g_Models
//Weapon ents
new WeaponNames[][] = {"weapon_knife", "weapon_glock18", "weapon_ak47", "weapon_aug", "weapon_awp", "weapon_c4", "weapon_deagle", "weapon_elite", "weapon_famas",
"weapon_fiveseven", "weapon_flashbang", "weapon_g3sg1", "weapon_galil", "weapon_hegrenade", "weapon_m3", "weapon_xm1014", "weapon_m4a1", "weapon_m249", "weapon_mac10",
"weapon_mp5navy", "weapon_p90", "weapon_p228", "weapon_scout", "weapon_sg550", "weapon_sg552", "weapon_smokegrenade", "weapon_tmp", "weapon_ump45", "weapon_usp" }
//Old models to unprecache
new g_OldModels[][] = {"models/v_knife.mdl", "models/v_glock18.mdl", "models/v_ak47.mdl", "models/v_aug.mdl", "models/v_awp.mdl", "models/v_c4.mdl" , "models/v_deagle.mdl",
"models/v_elite.mdl", "models/v_famas.mdl", "models/v_fiveseven.mdl", "models/v_flashbang.mdl", "models/v_g3sg1.mdl", "models/v_galil.mdl", "models/v_hegrenade.mdl",
"models/v_m3.mdl", "models/v_xm1014.mdl", "models/v_m4a1.mdl", "models/v_m249.mdl", "models/v_mac10.mdl", "models/v_mp5.mdl", "models/v_p90.mdl", "models/v_p228.mdl",
"models/v_scout.mdl", "models/v_sg550.mdl", "models/v_sg552.mdl", "models/v_smokegrenade.mdl", "models/v_tmp.mdl", "models/v_ump45.mdl", "models/v_usp.mdl" }
//New models to precache
new g_NewModels[][] = {"models/extended/v_knife.mdl", "models/extended/v_glock18.mdl", "models/extended/v_ak47.mdl", "models/extended/v_aug.mdl", "models/extended/v_awp.mdl",
"models/extended/v_c4.mdl" , "models/extended/v_deagle.mdl", "models/extended/v_elite.mdl", "models/extended/v_famas.mdl", "models/extended/v_fiveseven.mdl",
"models/extended/v_flashbang.mdl", "models/extended/v_g3sg1.mdl", "models/extended/v_galil.mdl", "models/extended/v_hegrenade.mdl", "models/extended/v_m3.mdl",
"models/extended/v_xm1014.mdl", "models/extended/v_m4a1.mdl", "models/extended/v_m249.mdl", "models/extended/v_mac10.mdl", "models/extended/v_mp5.mdl", "models/extended/v_p90.mdl",
"models/extended/v_p228.mdl", "models/extended/v_scout.mdl", "models/extended/v_sg550.mdl", "models/extended/v_sg552.mdl", "models/extended/v_smokegrenade.mdl", "models/extended/v_tmp.mdl",
"models/extended/v_ump45.mdl", "models/extended/v_usp.mdl"}
public plugin_init()
{
register_plugin("Extended Arm Weapon Skin", "BETA", "KayDee")
register_cvar("arm_extended_credits", "SoulWeaver16")
for(new i; i < sizeof WeaponNames; i++)
{
RegisterHam(Ham_Item_Deploy, WeaponNames[i], "ItemDeployPost", 1)
}
g_Models = TrieCreate()
for(new i = 0; i < BodyID; i++)
{
TrieSetCell(g_Models, g_szModelName[i], i)
}
}
public plugin_precache()
{
register_forward(FM_PrecacheModel, "Forward_PrecacheModel") //Unprecache old viewmodels
for(new i; i < sizeof g_NewModels; i++)
precache_model(g_NewModels[i]) //Precache now new viewmodels
}
public Forward_PrecacheModel(const iModels[])
{
for(new i; i < sizeof g_OldModels; i++)
{
if(!strcmp(iModels, g_OldModels[i]))
{
forward_return(FMV_CELL, 0)
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public ItemDeployPost(iWeapon)
{
static id
id = get_pdata_cbase(iWeapon, m_pPlayer, XO_WEAPON)
static model[32]
get_user_info(id, g_szUserInfoModel, model, charsmax(model))
new iNum;
if(TrieGetCell(g_Models, model, iNum))
{
cs_set_viewmodel_body(id, iNum)
set_task(0.1, "SetSkin", id) //this task is needed
}
}
public SetSkin(id)
{
if(!is_user_alive(id))
return
new szWeapon[64], iWeapon = get_user_weapon(id)
if(!iWeapon)
return
get_weaponname(iWeapon, szWeapon, charsmax(szWeapon))
if(equal(szWeapon, g_szWeaponNameMp5Navy))
{
replace(szWeapon, charsmax(szWeapon), szWeapon, g_szNewWeaponDirectoryMp5Navy)
}
else
{
replace(szWeapon, charsmax(szWeapon), g_szWeaponNamePrefix, g_szNewWeaponDirectory)
formatex(szWeapon, charsmax(szWeapon), "%s%s", szWeapon, g_szModelNameExtension)
}
set_pev(id, pev_viewmodel2, szWeapon)
}
CS:GO Weapon Inspection Plugin
Spoiler
csgo_inspect_weapon.sma
Code:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>
#include <hamsandwich>
const XoWeapon = 4;
const XoPlayer = 5;
const m_pPlayer = 41;
const m_flNextPrimaryAttack = 46;
const m_flTimeWeaponIdle = 48;
const m_fInSpecialReload = 55;
const m_flNextAttack = 83;
const m_pActiveItem = 373;
new const PLUGIN[] = "CS:GO Inspect Weapon";
new const VERSION[] = "5.1.5";
new const DATE[] = "9th Apri1 2020";
new const wpns_without_inspect = (1 << CSW_C4) | (1 << CSW_HEGRENADE) | (1 << CSW_FLASHBANG) | (1 << CSW_SMOKEGRENADE);
new const wpns_scoped = (1 << CSW_AUG) | (1 << CSW_AWP) | (1 << CSW_G3SG1) | (1 << CSW_SCOUT) | (1 << CSW_SG550) | (1 << CSW_SG552);
new g_deagle_overide[33];
new inspect_anim[] =
{
0, //null
7, //p228
0, //shield
5, //scout
0, //hegrenade
7, //xm1014
0, //c4
6, //mac10
6, //aug
0, //smoke grenade
16, //elites
6, //fiveseven
6, //ump45
5, //sg550
6, //galil
6, //famas
16, //usp
13, //glock
6, //awp
6, //mp5
5, //m249
7, //m3
14, //m4a1
6, //tmp
5, //g3sg1
0, //flashbang
6, //deagle
6, //sg552
6, //ak47
8, //knife
6 //p90
}
new Float:idle_calltime[] =
{
0.0, //null
6.5, //p228
0.0, //shield
5.3, //scout
0.0, //hegrenade
4.6, //xm1014
0.0, //c4
6.5, //mac10
4.4, //aug
0.0, //smoke grenade
4.6, //elites
6.5, //fiveseven
6.9, //ump45
5.3, //sg550
4.6, //galil
6.4, //famas
6.5, //usp
6.5, //glock
5.0, //awp
7.7, //mp5
6.9, //m249
5.6, //m3
5.1, //m4a1
7.4, //tmp
4.5, //g3sg1
0.0, //flashbang
8.5, //deagle
4.4, //sg552
4.6, //ak47
6.3, //knife
5.4 //p90
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, "hellmonja");
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p228", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_scout", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_xm1014", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mac10", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_aug", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_elite", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_fiveseven","Fw_Weapon_PrimaryAttack",true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ump45", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg550", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_galil", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_famas", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_usp", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_glock18", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_awp", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_mp5navy", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m249", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m3", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_m4a1", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_tmp", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_g3sg1", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_deagle", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_sg552", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_ak47", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_knife", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_PrimaryAttack, "weapon_p90", "Fw_Weapon_PrimaryAttack", true);
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_aug", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_awp", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_g3sg1", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_scout", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_sg550", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Weapon_SecondaryAttack, "weapon_sg552", "Fw_Weapon_SecondaryAttack");
RegisterHam(Ham_Item_Deploy, "weapon_deagle", "Fw_Deagle_Disable");
RegisterHam(Ham_Weapon_Reload, "weapon_deagle", "Fw_Deagle_Disable");
register_clcmd("cl_inspect", "Inspect_Weapon");
register_concmd("inspect", "Inspect_Weapon");
register_concmd("ver_csgo_inspect", "Code_Version");
}
public Code_Version(id)
{
console_print(id, "==============================");
console_print(id, "%s v%s", PLUGIN, VERSION);
console_print(id, "%s", DATE);
console_print(id, "==============================");
}
public Fw_Weapon_PrimaryAttack(weapon)
{
static id;
id = get_pdata_cbase(weapon, m_pPlayer, XoWeapon);
if(!is_user_alive(id))
return
new wpn_id = get_user_weapon(id);
static model[32];
pev(id, pev_viewmodel2, model, 31);
switch(wpn_id)
{
case CSW_DEAGLE:
g_deagle_overide[id] = 1;
case CSW_AWP, CSW_SCOUT, CSW_M3:
set_pdata_float(weapon, m_flTimeWeaponIdle, 1.5, XoWeapon);
case CSW_KNIFE:
set_pdata_float(weapon, m_flTimeWeaponIdle, 2.0, XoWeapon);
default:
set_pdata_float(weapon, m_flTimeWeaponIdle, 0.5, XoWeapon);
}
}
public Fw_Weapon_SecondaryAttack(weapon)
{
static id;
id = get_pdata_cbase(weapon, m_pPlayer, XoWeapon);
new wpn_id = get_user_weapon(id);
if(wpns_scoped & (1 << wpn_id) && cs_get_user_zoom(id) <= 1)
{
set_pev(id, pev_weaponanim, 0);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id);
write_byte(0);
write_byte(pev(id, pev_body));
message_end();
}
}
public Fw_Deagle_Disable(weapon)
{
static id;
id = get_pdata_cbase(weapon, m_pPlayer, XoWeapon);
remove_task(id)
}
public Deagle_Overide(id)
{
g_deagle_overide[id] = 1;
play_inspect(id, 0);
}
public Inspect_Weapon(id)
{
if(!is_user_alive(id) || !is_user_connected(id))
return PLUGIN_HANDLED
if(cs_get_user_zoom(id) > 1)
return PLUGIN_HANDLED
new wpn_id = get_user_weapon(id);
if(wpns_without_inspect & (1 << wpn_id))
return PLUGIN_HANDLED
static weapon; weapon = get_pdata_cbase(id, m_pActiveItem);
static Float:flNextAttack; flNextAttack = get_pdata_float(id, m_flNextAttack, XoPlayer);
static Float:flNextPrimaryAttack; flNextPrimaryAttack = get_pdata_float(weapon, m_flNextPrimaryAttack, XoWeapon);
if(flNextAttack <= 0 && flNextPrimaryAttack <= 0)
{
static model[32]; pev(id, pev_viewmodel2, model, 31);
static anim; anim = inspect_anim[wpn_id];
static current_anim; current_anim = pev(get_pdata_cbase(weapon, m_pPlayer, XoWeapon), pev_weaponanim);
if(cs_get_user_shield(id) == 1)
{
switch (wpn_id)
{
case CSW_KNIFE: anim = random_num(7, 9);
case CSW_GLOCK18, CSW_USP, CSW_P228, CSW_DEAGLE, CSW_FIVESEVEN:
{
anim = 9;
if(wpn_id == CSW_DEAGLE)
{
if(task_exists(id)) remove_task(id);
set_task(idle_calltime[wpn_id], "Deagle_Overide", id);
}
}
}
}
else
{
switch (wpn_id)
{
case CSW_USP: if(!cs_get_weapon_silen(weapon)) anim = 17;
case CSW_M4A1:if(!cs_get_weapon_silen(weapon)) anim = 15;
case CSW_KNIFE: anim = random_num(8, 10);
case CSW_DEAGLE:
{
if(g_deagle_overide[id] == 1)
{
anim = random_num(6, 10);
new Float:f_temp;
if(anim == 10) f_temp = 8.53;
else f_temp = idle_calltime[CSW_DEAGLE]
play_inspect(id, anim);
remove_task(id);
g_deagle_overide[id] = 0;
set_task(f_temp, "Deagle_Overide", id);
return PLUGIN_CONTINUE
}
}
}
}
if(wpn_id == CSW_KNIFE && (current_anim == 8 || current_anim == 9 || current_anim == 10 ))
return PLUGIN_HANDLED
if(!get_pdata_int(weapon, m_fInSpecialReload, 4) && current_anim != anim)
{
play_inspect(id, anim);
set_pdata_float(weapon, m_flTimeWeaponIdle, idle_calltime[wpn_id], XoWeapon);
}
}
return PLUGIN_CONTINUE
}
play_inspect(id, anim)
{
set_pev(id, pev_weaponanim, anim);
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id);
write_byte(anim);
write_byte(pev(id, pev_body));
message_end();
}