Raised This Month: $19 Target: $400
 4% 

SetViewEntityBody 2


Post New Thread Reply   
 
Thread Tools Display Modes
1xAero
Member
Join Date: Feb 2018
Location: Sakha, Russia
Old 08-09-2022 , 00:48   Re: SetViewEntityBody 2
Reply With Quote #31

Quote:
Originally Posted by SoulWeaver16 View Post
Is there a way to use skins instead of submodels?
I think no. At least i've not found way to do that with v_ models, but for player models it's pev_skin
1xAero is offline
SoulWeaver16
Senior Member
Join Date: May 2021
Location: Uruguay
Old 08-09-2022 , 01:21   Re: SetViewEntityBody 2
Reply With Quote #32

Quote:
Originally Posted by 1xAero View Post
I think no. At least i've not found way to do that with v_ models, but for player models it's pev_skin
At some point it will be possible
__________________
Extended Arm Weapon Skin v2.1 {16/Apr/23}
(Detect which class is and associate it with the corresponding arms)
SideWeapons v0.2 {01/Sep/22}
(New version of Back Weapons v1.87)
SoulWeaver16 is offline
1xAero
Member
Join Date: Feb 2018
Location: Sakha, Russia
Old 08-09-2022 , 08:10   Re: SetViewEntityBody 2
Reply With Quote #33

Draw animation bug fixed (no idle on swap anymore)
Fixed usp/m4a1 attachments bug
Fixed crash on death
Fixed spec obs for silenced/unsilenced weapons (usp/m4a1)

Last edited by 1xAero; 08-13-2022 at 08:04.
1xAero is offline
bibu
Veteran Member
Join Date: Sep 2010
Old 08-22-2022 , 09:17   Re: SetViewEntityBody 2
Reply With Quote #34

It's very cool to see, that you took over this plugin and that you're active. I haven't figured myself any errors (apart from crash on death) until your last version. However I do have some things, which I would like to share. I have edited your plugin to make it work for a requested plugin: https://forums.alliedmods.net/showthread.php?t=338882

1) Your submitted plugin should be more provided as an API. With that, everyone will be able to work with it. That's the reason why I had to edit your plugin.

2) Please check the adjustments I made to your plugin. You can use a code comparison reader and check it for youself. I did following changes and a few would need to be adjusted:
- Removed the sex option, since there is no use in my opinion.
- A few defines should be used as constants, so there is no double-allocating in memory.
- I added CZ support. Bullet decals were showing wrong there.
- I added shield support.
- I commented a few unused params in hooked forwards. I don't know if this optimized code performance.
- I changed the messages in spectator mode to unreliable channel. Maybe even the players channel should be changed to that.

So far I only noticed, that the burst sound from glock/famas sounds different than in original. But overall very good work!!
__________________
Selling tons of my own private works.
Accepting paid work for clans and communities.
Don't hesitate to contact me.
bibu is offline
SoulWeaver16
Senior Member
Join Date: May 2021
Location: Uruguay
Old 08-22-2022 , 09:42   Re: SetViewEntityBody 2
Reply With Quote #35

Quote:
Originally Posted by bibu View Post
It's very cool to see, that you took over this plugin and that you're active. I haven't figured myself any errors (apart from crash on death) until your last version. However I do have some things, which I would like to share. I have edited your plugin to make it work for a requested plugin: https://forums.alliedmods.net/showthread.php?t=338882

1) Your submitted plugin should be more provided as an API. With that, everyone will be able to work with it. That's the reason why I had to edit your plugin.

2) Please check the adjustments I made to your plugin. You can use a code comparison reader and check it for youself. I did following changes and a few would need to be adjusted:
- Removed the sex option, since there is no use in my opinion.
- A few defines should be used as constants, so there is no double-allocating in memory.
- I added CZ support. Bullet decals were showing wrong there.
- I added shield support.
- I commented a few unused params in hooked forwards. I don't know if this optimized code performance.
- I changed the messages in spectator mode to unreliable channel. Maybe even the players channel should be changed to that.

So far I only noticed, that the burst sound from glock/famas sounds different than in original. But overall very good work!!
I think it sounds different because it uses 3 consecutive single shots instead of using its Burst mode sound, but in my opinion the animation is the one that usually looks weird, more than the sound.
__________________
Extended Arm Weapon Skin v2.1 {16/Apr/23}
(Detect which class is and associate it with the corresponding arms)
SideWeapons v0.2 {01/Sep/22}
(New version of Back Weapons v1.87)
SoulWeaver16 is offline
Nax0ne
Senior Member
Join Date: Jul 2011
Location: Chile
Old 01-23-2025 , 14:53   Re: SetViewEntityBody 2
Reply With Quote #36

Does anyone know this is working properly? I've tested in AMXX version +1.9.0 and plugin throws me an error... so it stops:

Quote:
L 01/23/2025 - 16:50:21: [AMXX] Plugin ("setviewentitybody.amxx") is setting itself as failed.
L 01/23/2025 - 16:50:21: [AMXX] Plugin says: Function cstrike_weapon_sendweaponanim is not configured in hamdata.ini.
L 01/23/2025 - 16:50:21: [AMXX] Run time error 1 (plugin
__________________
Nax0ne is offline
Old 04-23-2025, 11:33
dw312382354
This message has been deleted by dw312382354.
dw312382354
New Member
Join Date: Jun 2024
Old 04-23-2025 , 12:01   Re: SetViewEntityBody 2
Reply With Quote #37

Quote:
Originally Posted by soulweaver16 View Post
is there a way to use skins instead of submodels?
试试这些.

/* 本插件由 AMXX-Studio 中文版修改生成 */
/* UTF-8 func by www.DT-Club.net */

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

native nst_get_user_sex(id)
native nst_get_user_hand(player)

#define PLUGIN "NST Wpn Hand"
#define VERSION "1.0"

#define AUTHOR "NST & Hanna"
/*
//Builds by Hanna
https://forums.alliedmods.net/showthread.php?t=287754, profile https://forums.alliedmods.net/member.php?u=273346
*/

//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 State
#define WPNSTATE_USP_SILENCED (1<<0)
#define WPNSTATE_GLOCK18_BURST_MODE (1<<1)
#define WPNSTATE_M4A1_SILENCED (1<<2)
#define WPNSTATE_ELITE_LEFT (1<<3)
#define WPNSTATE_FAMAS_BURST_MODE (1<<4)

new cvar_run
new g_wpn[33], g_silen[33][CSW_P90+1], g_attack[33], g_anim[33], g_glock[33], g_change[33], g_IsCustom[31][33]
const SILENT_BS = ((1<<CSW_USP)|(1<<CSW_M4A1))
const PISTOLS_BS = ((1<<CSW_P22|(1<<CSW_ELITE)|(1<<CSW_FIVESEV EN)|(1<<CSW_USP)|(1<<CSW_GLOCK1|(1<<CSW_DEA GLE))

//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_fSilent = 74 //int //m_iWeaponState
stock m_flLastEventCheck = 38 //float

//CBasePlayer
stock m_flEjectBrass = 111 //float
stock m_pActiveItem = 373 //CBasePlayerItem *

enum
{
ANIM_IDLE = 1,
ANIM_DRAW,
ANIM_SHOOT,
ANIM_SHOOT2,
ANIM_SHOOT_EMPTY
}
new const V_KNIFE[2][] = {"models/v_knife.mdl", "models/nst_wpn/v_knife_w.mdl"}

new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10", "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90" }

//World decals
new TraceBullets[][] = { "func_breakable", "func_wall", "func_door", "func_plat", "func_rotating", "worldspawn", "func_door_rotating" }
//Weapon Sounds
new const FIRE_SOUND[][] = {"weapons/dryfire_pistol.wav", "weapons/dryfire_rifle.wav",
"weapons/glock18-2.wav", "weapons/deagle-2.wav", "weapons/elite_fire.wav", "weapons/fiveseven-1.wav", "weapons/p228-1.wav", "weapons/usp_unsil-1.wav",
"weapons/m3-1.wav", "weapons/xm1014-1.wav",
"weapons/mac10-1.wav", "weapons/mp5-1.wav", "weapons/p90-1.wav", "weapons/tmp-1.wav", "weapons/ump45-1.wav",
"weapons/m4a1_unsil-1.wav", "weapons/aug-1.wav", "weapons/famas-1.wav", "weapons/ak47-1.wav", "weapons/sg552-1.wav", "weapons/galil-1.wav",
"weapons/awp1.wav", "weapons/scout_fire-1.wav", "weapons/sg550-1.wav", "weapons/g3sg1-1.wav",
"weapons/m249-1.wav" ,
"weapons/glock18-1.wav", "weapons/usp1.wav", "weapons/m4a1-1.wav", "weapons/famas-burst.wav" //30
}
new g_fwWeaponDraw, g_fwDummyResult
const NOSHOOT2_BS = ((1<<CSW_KNIFE)|(1<<CSW_GLOCK1|(1<<CSW_ELIT E))

//Taskid
enum (+= 100)
{
TASK_DEPLOY = 7000,
TASK_OBS_DELAY,
TASK_SHELL_EJECT
}
//Spectator options
#define OBS_IN_EYE 4


// ########################## MAIN PLUGINS ##########################
public plugin_natives()
{
register_native("nst_wpn_send_weapon_anim", "natives_send_weapon_anim", 1)
register_native("nst_wpn_send_weapon_anim_dra w", "natives_send_weapon_anim_draw", 1)
register_native("cs_set_weapon_drawanim", "natives_send_weapon_anim_draw", 1);
}
public plugin_precache()
{
//engfunc(EngFunc_PrecacheModel, V_KNIFE[0])
engfunc(EngFunc_PrecacheModel, V_KNIFE[1])
for (new i = 0; i < sizeof FIRE_SOUND; i++)
{
engfunc(EngFunc_PrecacheSound, FIRE_SOUND[i])
}
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)

for (new i=1; i<=CSW_P90; i++)
{
if (strlen(WEAPONENTNAMES[i]))
{
RegisterHam(Ham_Weapon_SendWeaponAnim, WEAPONENTNAMES[i], "fw_Weapon_SendWeaponAnim")
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPONENTNAMES[i], "fw_Weapon_PrimaryAttack")
RegisterHam(Ham_Item_PostFrame, WEAPONENTNAMES[i], "fw_Item_PostFrame")
}
}

register_event("DeathMsg", "Death", "a")
register_event("CurWeapon","checkWeapon","be" ,"1=1")
register_forward(FM_CmdStart, "fw_CmdStart")

for (new i; i < sizeof TraceBullets; i++)
RegisterHam(Ham_TraceAttack, TraceBullets[i], "HamF_TraceAttack_Post", 1);

register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", 1);
register_forward(FM_PlaybackEvent, "Forward_PlaybackEvent");
register_forward(FM_ClientUserInfoChanged, "Forward_ClientUserInfoChanged");
//register_concmd("qq", "qq")

cvar_run = register_cvar("nst_wpn_hand", "1")

// Custom Forwards
g_fwWeaponDraw = CreateMultiForward("nst_wpn_weapon_draw", ET_IGNORE, FP_CELL)
}

// ########################## MAIN PUBLIC ##########################
public Death()
{
new victim = read_data(2)
for (new i=1; i<=CSW_P90; i++)
{
g_silen[victim][i] = 0
}

}
public fw_Item_PostFrame(ent)
{
new id = pev(ent, pev_owner)
if (!is_user_connected(id)) return HAM_IGNORED

static iId ; iId = get_pdata_int(ent, m_iId, 4)
if (SILENT_BS & (1<<iId)) // check silent
{
if (get_pdata_int(ent, m_fSilent, 4)) g_silen[id][iId] = 1
else g_silen[id][iId] = 0
}

return HAM_IGNORED
}
public fw_Weapon_SendWeaponAnim(ent, iAnim, skiplocal, body)
{
new id = pev(ent, pev_owner)
if (!is_user_connected(id)) return HAM_IGNORED

// get idwpn
new classname[64] ; pev(ent, pev_classname, classname, charsmax(classname))
new idwpn = cs_weapon_name_to_id(classname)
g_attack[id] = 0

//new anim_set = iAnim//, fastrun = nst_wpn_get_user_fastrun(id)
//if (fastrun && iAnim==get_num_anim(id, idwpn, ANIM_IDLE))
//anim_set = nst_wpn_get_fastrunanim_weapon(id, NST_ANI_FASTRUN_IDLE)

//playanim(id, anim_set) // send anim

if (iAnim == get_num_anim(id, idwpn, ANIM_DRAW) && g_wpn[id] == idwpn) // draw
{
g_change[id] = 1
ExecuteForward(g_fwWeaponDraw, g_fwDummyResult, id)

//client_print(0, print_chat, "[%s][%s]", g_weapon_models[id][0], g_weapon_models[id][1])
return HAM_SUPERCEDE
}

if (idwpn == CSW_GLOCK1 // Fix Anim Glock18
{
if (iAnim == 8 || iAnim == 11) g_anim[id] = iAnim
else if (iAnim == 0 || iAnim == 1 || iAnim == 2)
{
g_glock[id] = 1
g_anim[id] = iAnim
}
else g_anim[id] = 0
}
playanim2(id, iAnim)
//client_print(0, print_chat, "[%i][%i][%i][%i]", id, iAnim, skiplocal, body)
return HAM_IGNORED
}
public fw_Weapon_PrimaryAttack(ent)
{
static plrClip;plrClip = get_pdata_int(ent, m_iClip, 4);
if (plrClip) g_attack[get_pdata_cbase(ent, m_pPlayer, 4)] = 1

switch(get_pdata_int(ent, m_iId, 4))
{
case CSW_C4, CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
return HAM_IGNORED;

default: PrimaryAttackEmulation(ent);
}

return HAM_IGNORED
}

public checkWeapon(id)
{
new plrClip, plrAmmo, plrWeapId
plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (g_attack[id]) // send anim shoot
{
new ani
if (!plrClip) ani = get_num_anim(id, plrWeapId, ANIM_SHOOT_EMPTY)
else if (!ani) ani = get_num_anim(id, plrWeapId, ANIM_SHOOT)

playanim2(id, ani)
g_attack[id] = 0
}

if (plrWeapId == CSW_KNIFE) // set v_model knife of gilr
{
new model_v[64]; pev(id, pev_viewmodel2, model_v, charsmax(model_v))
if (equal(model_v, V_KNIFE[0]))
{
if (nst_get_user_sex(id) == 2) set_pev(id, pev_viewmodel2, V_KNIFE[1])
else set_pev(id, pev_viewmodel2, V_KNIFE[0])
}
}
//client_print(id, print_chat, "2[%i]", plrClip)

}
public fw_CmdStart(id, uc_handle, seed)
{
//new num = pev(id, pev_weaponanim)
//client_print(id, print_chat, "AT[%i]", g_silen[id])

if (!is_user_alive(id)) return;

new plrClip, plrAmmo, plrWeapId
plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

if (g_wpn[id] != plrWeapId || g_change[id])
{
new anim = get_num_anim(id, plrWeapId, ANIM_DRAW)
if (plrWeapId == CSW_GLOCK1
{
anim = max(anim, g_anim[id])
g_anim[id] = 0
}

playanim2(id, anim)

g_wpn[id] = plrWeapId
g_attack[id] = g_change[id] = 0
}
else if (!g_attack[id])
{
if (plrWeapId == CSW_GLOCK18 && g_glock[id])
{
playanim(id, g_anim[id])
g_glock[id] = g_anim[id] = 0
}
}
}
public HamF_TraceAttack_Post(iVictim, iAttacker, Float:damage, Float:fDir[3], Ptr, iDamageType)
{
//if(!is_user_connected(iAttacker)) return HAM_IGNORED

//switch(WEAPON_ENT(get_pdata_cbase(iAttacker, m_pActiveItem, 5)))
switch(get_pdata_int(get_pdata_cbase(iAttacke r, m_pActiveItem, 5), m_iId, 4))
{
case CSW_KNIFE: return HAM_IGNORED;
default:
{
static Float:flEnd[3]; get_tr2(Ptr, TR_vecEndPos, flEnd)
static Float:vecPlane[3]; get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)
//Decal effects, add here spark, any
MakeBullet_Hole_And_Smoke(iAttacker, flEnd)
//Make_BulletSmoke(iAttacker, Ptr)
}
}

return HAM_IGNORED;
}
//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)
{
enum
{
SPEC_MODE,
SPEC_TARGET,
SPEC_END
};

static aSpecInfo[33][SPEC_END],iSpecMode,iActiveItem, iTarget;
iTarget = (iSpecMode = pev(iPlayer, pev_iuser1)) ? pev(iPlayer, pev_iuser2) : iPlayer;

if (pev_valid(iTarget)) iActiveItem = get_pdata_cbase(iTarget, m_pActiveItem, 5);
if(!iActiveItem || iActiveItem == FM_NULLENT || !pev_valid(iActiveItem))
return FMRES_IGNORED;

static iId;iId = get_pdata_int(iActiveItem, m_iId, 4);
if(!iId || iId == FM_NULLENT || !pev_valid(iId)) return FMRES_IGNORED;
static Float: flGameTime, Float: flLastEventCheck;flGameTime = get_gametime();
flLastEventCheck = get_pdata_float(iActiveItem, m_flLastEventCheck, 4);
new anim = get_num_anim(pev(iActiveItem, pev_owner), iId, ANIM_DRAW)
if(iSpecMode)
{
if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
{
aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode;
aSpecInfo[iPlayer][SPEC_TARGET] = 0;
}
if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
{
aSpecInfo[iPlayer][SPEC_TARGET] = iTarget;
new iTaskData[1];//iTaskData[0] = iBodyIndex[iTarget];
//Checkout, if obs target weapon is silenced and send proper anim from model to us
iTaskData[0] = get_num_anim(pev(iActiveItem,pev_owner), iId, ANIM_IDLE)
//If not silenced
//Because once pushing LMB u will immediately move to OBS_IN_EYE, the anim message may skip, so let's make delay
if (task_exists(iPlayer + TASK_OBS_DELAY))
remove_task(iPlayer + TASK_OBS_DELAY)

set_task(0.1, "SPEC_OBS_IN_EYE", iPlayer + TASK_OBS_DELAY, 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, ANIM_IDLE);

return FMRES_HANDLED;
}
//Custom weapon draw anim should go there too
if(flLastEventCheck <= flGameTime)//;
{
//playanim2(iTarget,GetWeaponDrawAnim(iActiveIt em),iBodyIndex[iTarget]);
playanim2(iTarget,anim)
set_pdata_float(iActiveItem, m_flLastEventCheck, 0.0, 4);
}

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)
{
//#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))

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))
if(get_user_info(iPlayer, iUserInfo, iClientValue, charsmax(iClientValue)))
{
//HOOK_DATA(iPlayer, iUserInfo, iServerValue);
set_user_info(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;
}
//Emulation, not attack replace
stock PrimaryAttackEmulation(iEnt)
{
//new id = pev(iEnt, pev_owner)
//new anim = get_num_anim(id, get_pdata_int(iEnt, m_iId, 4), ANIM_SHOOT)
switch(get_pdata_int(iEnt, m_iId, 4))
{
//Func description: WeaponShootInfo(iWeapon, iAnim, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)

case CSW_GLOCK18: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[2], 0, WEAPONTYPE_GLOCK1;
case CSW_DEAGLE: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[3], 0, WEAPONTYPE_OTHER);
case CSW_ELITE: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[4], 0, WEAPONTYPE_ELITE);
case CSW_FIVESEVEN: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[5], 0, WEAPONTYPE_OTHER);
case CSW_P228: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[6], 0, WEAPONTYPE_OTHER);
case CSW_USP: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[7], 0, WEAPONTYPE_USP);

case CSW_M3: WeaponShootInfo(iEnt, FIRE_SOUND[1],FIRE_SOUND[8], 1, WEAPONTYPE_OTHER);
case CSW_XM1014: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[9], 1, WEAPONTYPE_OTHER);

case CSW_MAC10: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[10], 1, WEAPONTYPE_OTHER);
case CSW_MP5NAVY: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[11], 1, WEAPONTYPE_OTHER);
case CSW_P90: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[12], 1, WEAPONTYPE_OTHER);
case CSW_TMP: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[13], 1, WEAPONTYPE_OTHER);
case CSW_UMP45: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[14], 1, WEAPONTYPE_OTHER);

case CSW_M4A1: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[15], 1, WEAPONTYPE_M4A1);
case CSW_AUG: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[16], 1, WEAPONTYPE_OTHER);
case CSW_FAMAS: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[17], 1, WEAPONTYPE_FAMAS);
case CSW_AK47: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[18], 1, WEAPONTYPE_OTHER);
case CSW_SG552: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[19], 1, WEAPONTYPE_OTHER);
case CSW_GALIL: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[20], 1, WEAPONTYPE_OTHER);

case CSW_AWP: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[21], 1, WEAPONTYPE_OTHER);
case CSW_SCOUT: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[22], 1, WEAPONTYPE_OTHER);
case CSW_SG550: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[23], 1, WEAPONTYPE_OTHER);
case CSW_G3SG1: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[24], 1, WEAPONTYPE_OTHER);

case CSW_M249: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[25], 1, WEAPONTYPE_OTHER);
}
return HAM_IGNORED;
}
//Set here anims, sounds
stock WeaponShootInfo(iEnt, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)
{
static iPlayer ; iPlayer = get_pdata_cbase(iEnt, m_pPlayer, 4);
if(!g_attack[iPlayer])
{
emit_sound(iPlayer, CHAN_AUTO, szSoundEmpty, 0.8, ATTN_NORM, 0, PITCH_NORM);
//m_flNextPrimaryAttack = GetNextAttackDelay(0.2);
set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.2, 4);

return HAM_SUPERCEDE;
}
if(get_pdata_int(iEnt, m_iShotsFired, 4) && !iAutoShoot)
return HAM_SUPERCEDE;
new plrClip, plrAmmo, plrWeapId
plrWeapId = get_user_weapon(iPlayer, plrClip , plrAmmo)

switch(iWeaponType)
{
case WEAPONTYPE_ELITE:
{
if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_ELITE_LEFT)
WeaponShootSound(iPlayer, FIRE_SOUND[4]);
//else WeaponShootSound(iPlayer, FIRE_SOUND[4],12);
}
case WEAPONTYPE_GLOCK18:
{
if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_GLOCK18_BURST_MODE)
WeaponShootSound(iPlayer, FIRE_SOUND[26]);
}
case WEAPONTYPE_USP:
{
if(plrWeapId == CSW_USP && g_silen[iPlayer][CSW_USP])
WeaponShootSound(iPlayer, FIRE_SOUND[27]);
}
case WEAPONTYPE_M4A1:
{
if(plrWeapId == CSW_M4A1 && g_silen[iPlayer][CSW_M4A1])
WeaponShootSound(iPlayer, FIRE_SOUND[28]);
}
case WEAPONTYPE_FAMAS:
{
if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_FAMAS_BURST_MODE)
WeaponShootSound(iPlayer, FIRE_SOUND[29]);
}
case WEAPONTYPE_OTHER:
WeaponShootSound(iPlayer, szSoundFire);
//default:
//{
//Second mode disabled or weapontype other
//if(!(get_pdata_int(iEnt, m_fSilent, 4)))
//WeaponShootSound(iPlayer, szSoundFire);
//}
}
//Second mode disabled or weapontype other
if(!(get_pdata_int(iEnt, m_fSilent, 4)))
WeaponShootSound(iPlayer, szSoundFire);

EjectBrass(iPlayer, iEnt);

return HAM_IGNORED;
}
//Play shoot anim and emit fire sounds
stock WeaponShootSound(iPlayer, const szShootSound[])
{
emit_sound(iPlayer, CHAN_WEAPON, szShootSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);

}
public SPEC_OBS_IN_EYE(iTaskData[], taskid)
{
new id = taskid - TASK_OBS_DELAY
playanim2(id, iTaskData[0]);

//client_print(id, print_chat, "Target's v_ body num: %d", iTaskData[0]);
}
//Shells, i've searched the client burst shell ejection, but the function does same effect, so let it be
stock EjectBrass(iPlayer, iEnt)
{
static iShellRifle, iShellShotgun;

if(!iShellRifle || !iShellShotgun)
{
iShellRifle = engfunc(EngFunc_PrecacheModel, "models/pshell.mdl");
iShellShotgun = engfunc(EngFunc_PrecacheModel,"models/shotgunshell.mdl");
}

switch(get_pdata_int(iEnt, m_iId, 4))
{
case CSW_M3, CSW_XM1014: set_pdata_int(iEnt, m_iShellId, iShellShotgun, 4);
case CSW_ELITE: return; //Dual Weapon clientside part, should do with message, let skip this currently
default: set_pdata_int(iEnt, m_iShellId, iShellRifle, 4);
}

if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_FAMAS_BURST_MODE || get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_GLOCK18_BURST_MODE)
{
if (task_exists(iPlayer + TASK_SHELL_EJECT))
remove_task(iPlayer + TASK_SHELL_EJECT)

set_task(0.1, "EjectAdditionalBurstShell", iPlayer + TASK_SHELL_EJECT) //Temporarly, but don't need to create entity through amxx
}

set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), 4);
}
public EjectAdditionalBurstShell(taskid)
{
new iPlayer = taskid - TASK_SHELL_EJECT

set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), 5);
}
stock MakeBullet_Hole_And_Smoke(id, Float:aimOrigin[3])
{
new target, body;get_user_aiming(id, target, body)
if(!(1 <= target <= get_maxplayers()))
{
if(target)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_DECAL)
engfunc(EngFunc_WriteCoord, aimOrigin[0])
engfunc(EngFunc_WriteCoord, aimOrigin[1])
engfunc(EngFunc_WriteCoord, aimOrigin[2])
write_byte(random_num(41, 45))
write_short(target)
message_end()
}
else
{
message_begin(MSG_ALL, SVC_TEMPENTITY)
write_byte(TE_WORLDDECAL) // TE id
engfunc(EngFunc_WriteCoord, aimOrigin[0]) // x
engfunc(EngFunc_WriteCoord, aimOrigin[1]) // y
engfunc(EngFunc_WriteCoord, aimOrigin[2]) // z
write_byte(random_num(41, 45))
message_end()
}
message_begin(MSG_ALL, SVC_TEMPENTITY)
write_byte(TE_SPARKS)
engfunc(EngFunc_WriteCoord, aimOrigin[0])
engfunc(EngFunc_WriteCoord, aimOrigin[1])
engfunc(EngFunc_WriteCoord, aimOrigin[2])
message_end()

message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_GUNSHOTDECAL)
engfunc(EngFunc_WriteCoord, aimOrigin[0])
engfunc(EngFunc_WriteCoord, aimOrigin[1])
engfunc(EngFunc_WriteCoord, aimOrigin[2])
write_short(id)
write_byte(random_num(41, 45))
message_end()

static TE_FLAG;
TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
TE_FLAG |= TE_EXPLFLAG_NOSOUND
TE_FLAG |= TE_EXPLFLAG_NOPARTICLES

engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, aimOrigin, 0)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, aimOrigin[0])
engfunc(EngFunc_WriteCoord, aimOrigin[1])
engfunc(EngFunc_WriteCoord, aimOrigin[2] - 10.0)
write_short(engfunc(EngFunc_PrecacheModel,"sp rites/wall_puff1.spr"))
write_byte(2)
write_byte(50)
write_byte(TE_FLAG)
message_end()
}
}
public qq(id)
{

}

// ########################## FUNCTION ##########################
public playanim(player, anim)
{
if (!is_user_alive(player) || !get_pcvar_num(cvar_run)) return;
if (g_wpn[player] == CSW_ELITE && g_attack[player]) return;

new hand = nst_get_user_hand(player)
if (!hand) return;

//set_pev(player, pev_weaponanim, anim)
//set_weapon_anim(player, anim, hand)
send_weapon_anim(player, anim, hand)
}
public playanim2(player, anim)
{
new hand = nst_get_user_hand(player)

//set_pev(player, pev_weaponanim, anim)
//set_weapon_anim(player, anim, hand)
send_weapon_anim(player, anim, hand)
}
public set_weapon_anim(player, anim, hand)
{
//set_pev(player, pev_weaponanim, anim)
message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, player)
write_byte(anim)
write_byte(hand)
message_end()
}
//Animation stock (include Spectators check) by fl0wer
stock send_weapon_anim(iPlayer, iAnim, iBody)
{
set_pev(iPlayer, pev_weaponanim, iAnim)
set_weapon_anim(iPlayer, iAnim, iBody)

if(pev(iPlayer, pev_iuser1)) return;
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) != iPlayer) continue;
set_pev(iSpectator, pev_weaponanim, iAnim)
set_weapon_anim(iSpectator, iAnim, iBody)
}
}
stock cs_weapon_name_to_id(const weapon[])
{
for (new i = 0; i < sizeof WEAPONENTNAMES; i++)
{
if (equal(weapon, WEAPONENTNAMES[i]))
return i;
}

return 0;
}
stock get_num_anim(id, wpn, type)
{
// type = 1 : draw - type = 2 : shoot
new draw, shoot, shoot_empty, idle
new iEnt = get_pdata_cbase(id, m_pActiveItem, 5)
new WeaponState = get_pdata_int(iEnt,m_fSilent,4)
if(g_IsCustom[iEnt][id] > 0) draw = g_IsCustom[iEnt][id]
else
{
switch(wpn)
{
case CSW_KNIFE:
{
draw = 3
//shoot = 1
}
case CSW_DEAGLE, CSW_FIVESEVEN:
{
draw = 5
shoot = 1
shoot_empty = 3
}
case CSW_ELITE:
{
draw = 15
//shoot = 6
shoot = !(WeaponState & WPNSTATE_ELITE_LEFT) ? 12 : 6
shoot_empty = 7
}
case CSW_P228:
{
draw = 6
shoot = 1
shoot_empty = 4
}
case CSW_GLOCK18:
{
draw = 8
shoot = 5
shoot_empty = 6
}
case CSW_AWP:
{
draw = 5
shoot = 1
}
case CSW_M3, CSW_XM1014:
{
draw = 6
shoot = 1
}
case CSW_MAC10, CSW_MP5NAVY, CSW_P90,CSW_TMP, CSW_UMP45:
{
draw = 2
shoot = 3
}
case CSW_GALIL, CSW_AK47, CSW_FAMAS, CSW_AUG,CSW_SG552:
{
draw = 2
shoot = 3
}
case CSW_SG550, CSW_G3SG1,CSW_SCOUT, CSW_M249:
{
draw = 4
shoot = 1
}
case CSW_USP:
{
idle = 8
draw = 14
shoot = 9
shoot_empty = 12
}
case CSW_M4A1:
{
idle = 7
draw = 12
shoot = 8
}
case CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
{
draw = 3
}
case CSW_C4:
{
draw = 1
}
}

// silen wpn
if (wpn == CSW_M4A1 && g_silen[id][CSW_M4A1])
{
idle -= 7
draw -= 7
shoot -= 7
shoot_empty -= 7
}
else if (wpn == CSW_USP && g_silen[id][CSW_USP])
{
idle -= 8
draw -= 8
shoot -= 8
shoot_empty -= 8
}

// random anim shoot2
if (!(NOSHOOT2_BS & (1<<wpn))) shoot += random_num(0, 1)

// return value
if (type == ANIM_IDLE) return idle
else if (type == ANIM_DRAW) return draw
else if (type == ANIM_SHOOT) return shoot
else if (type == ANIM_SHOOT_EMPTY) return shoot_empty
}
return 0
}

// ########################## NATIVES ##########################
public natives_send_weapon_anim(player, anim)
{
playanim2(player, anim)
return 1
}
public natives_send_weapon_anim_draw(id, iCSW, iAnim) g_IsCustom[iCSW][id] = iAnim;

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
Attached Files
File Type: zip cs默认武器和spr.zip (5.00 MB, 0 views)
File Type: sma Get Plugin or Get Source (NST_Wpn_New_Hand.SMA - 8 views - 24.6 KB)
File Type: sma Get Plugin or Get Source (NST_Radio.sma - 5 views - 4.3 KB)
File Type: sma Get Plugin or Get Source (zp50_class_human.sma - 9 views - 22.4 KB)
File Type: sma Get Plugin or Get Source (zp50_class_human_classic.sma - 10 views - 4.2 KB)
File Type: sma Get Plugin or Get Source (zp50_class_woman_classic.sma - 9 views - 2.7 KB)
File Type: sma Get Plugin or Get Source (zp_hclasses_female_buffclass23s1tr.sma - 12 views - 8.0 KB)

Last edited by dw312382354; 04-23-2025 at 12:19.
dw312382354 is offline
SoulWeaver16
Senior Member
Join Date: May 2021
Location: Uruguay
Old 04-23-2025 , 17:11   Re: SetViewEntityBody 2
Reply With Quote #38

Quote:
Originally Posted by dw312382354 View Post
Code:
试试这些.

/* 本插件由 AMXX-Studio 中文版修改生成 */
/* UTF-8 func by www.DT-Club.net */
      
#include <amxmodx>
#include <hamsandwich>
#include <fakemeta>

native nst_get_user_sex(id)
native nst_get_user_hand(player)

#define PLUGIN "NST Wpn Hand"
#define VERSION "1.0"

#define AUTHOR "NST & Hanna"
/* 
//Builds by Hanna 
https://forums.alliedmods.net/showthread.php?t=287754, profile https://forums.alliedmods.net/member.php?u=273346
*/

//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 State
#define WPNSTATE_USP_SILENCED (1<<0)
#define WPNSTATE_GLOCK18_BURST_MODE (1<<1)
#define WPNSTATE_M4A1_SILENCED (1<<2)
#define WPNSTATE_ELITE_LEFT (1<<3)
#define WPNSTATE_FAMAS_BURST_MODE (1<<4)

new cvar_run
new g_wpn[33], g_silen[33][CSW_P90+1], g_attack[33], g_anim[33], g_glock[33], g_change[33], g_IsCustom[31][33]
const SILENT_BS	= ((1<<CSW_USP)|(1<<CSW_M4A1))
const PISTOLS_BS = ((1<<CSW_P228)|(1<<CSW_ELITE)|(1<<CSW_FIVESEVEN)|(1<<CSW_USP)|(1<<CSW_GLOCK18)|(1<<CSW_DEAGLE))

//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_fSilent = 74 //int	//m_iWeaponState
stock m_flLastEventCheck = 38 //float

//CBasePlayer
stock m_flEjectBrass = 111 //float
stock m_pActiveItem = 373 //CBasePlayerItem *

enum
{
	ANIM_IDLE = 1,
	ANIM_DRAW,
	ANIM_SHOOT,
	ANIM_SHOOT2,
	ANIM_SHOOT_EMPTY
}
new const V_KNIFE[2][] = {"models/v_knife.mdl", "models/nst_wpn/v_knife_w.mdl"}

new const WEAPONENTNAMES[][] = { "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",	"weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
	"weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp", "weapon_mp5navy", "weapon_m249",	"weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1", "weapon_flashbang", "weapon_deagle", "weapon_sg552",	"weapon_ak47", "weapon_knife", "weapon_p90" }

//World decals
new TraceBullets[][] = { "func_breakable", "func_wall", "func_door", "func_plat", "func_rotating", "worldspawn", "func_door_rotating" }
//Weapon Sounds
new const FIRE_SOUND[][] = {"weapons/dryfire_pistol.wav", "weapons/dryfire_rifle.wav",
	"weapons/glock18-2.wav", "weapons/deagle-2.wav", "weapons/elite_fire.wav", "weapons/fiveseven-1.wav", "weapons/p228-1.wav", "weapons/usp_unsil-1.wav",
	"weapons/m3-1.wav",  "weapons/xm1014-1.wav",
	"weapons/mac10-1.wav", "weapons/mp5-1.wav", "weapons/p90-1.wav", "weapons/tmp-1.wav", "weapons/ump45-1.wav",
	"weapons/m4a1_unsil-1.wav",  "weapons/aug-1.wav", "weapons/famas-1.wav", "weapons/ak47-1.wav", "weapons/sg552-1.wav", "weapons/galil-1.wav",
	"weapons/awp1.wav", "weapons/scout_fire-1.wav", "weapons/sg550-1.wav", "weapons/g3sg1-1.wav",
	"weapons/m249-1.wav" ,
	"weapons/glock18-1.wav", "weapons/usp1.wav", "weapons/m4a1-1.wav", "weapons/famas-burst.wav"	//30
}
new g_fwWeaponDraw, g_fwDummyResult
const NOSHOOT2_BS = ((1<<CSW_KNIFE)|(1<<CSW_GLOCK18)|(1<<CSW_ELITE))

//Taskid
enum (+= 100)
{
	TASK_DEPLOY = 7000,
	TASK_OBS_DELAY,
	TASK_SHELL_EJECT
}
//Spectator options
#define OBS_IN_EYE 4


// ########################## MAIN PLUGINS ##########################
public plugin_natives()
{
	register_native("nst_wpn_send_weapon_anim", "natives_send_weapon_anim", 1)
	register_native("nst_wpn_send_weapon_anim_draw", "natives_send_weapon_anim_draw", 1)
	register_native("cs_set_weapon_drawanim", "natives_send_weapon_anim_draw", 1);
}
public plugin_precache()
{
	//engfunc(EngFunc_PrecacheModel, V_KNIFE[0])
	engfunc(EngFunc_PrecacheModel, V_KNIFE[1])
	for (new i = 0; i < sizeof FIRE_SOUND; i++)
	{
		engfunc(EngFunc_PrecacheSound, FIRE_SOUND[i])
	}
}
public plugin_init()
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
	
	for (new i=1; i<=CSW_P90; i++)
	{
		if (strlen(WEAPONENTNAMES[i]))
		{
			RegisterHam(Ham_Weapon_SendWeaponAnim, WEAPONENTNAMES[i], "fw_Weapon_SendWeaponAnim")
			RegisterHam(Ham_Weapon_PrimaryAttack, WEAPONENTNAMES[i], "fw_Weapon_PrimaryAttack")
			RegisterHam(Ham_Item_PostFrame, WEAPONENTNAMES[i], "fw_Item_PostFrame")
		}
	}
	
	register_event("DeathMsg", "Death", "a")
	register_event("CurWeapon","checkWeapon","be","1=1")
	register_forward(FM_CmdStart, "fw_CmdStart")

	for (new i; i < sizeof TraceBullets; i++)		
		RegisterHam(Ham_TraceAttack, TraceBullets[i], "HamF_TraceAttack_Post", 1);

	register_forward(FM_UpdateClientData, "FM_Hook_UpdateClientData_Post", 1);
	register_forward(FM_PlaybackEvent, "Forward_PlaybackEvent");
	register_forward(FM_ClientUserInfoChanged, "Forward_ClientUserInfoChanged");
	//register_concmd("qq", "qq")
	
	cvar_run = register_cvar("nst_wpn_hand", "1")
	
	// Custom Forwards
	g_fwWeaponDraw = CreateMultiForward("nst_wpn_weapon_draw", ET_IGNORE, FP_CELL)
}

// ########################## MAIN PUBLIC ##########################
public Death()
{
	new victim = read_data(2) 	
	for (new i=1; i<=CSW_P90; i++)
	{
		g_silen[victim][i] = 0
	}
	
}
public fw_Item_PostFrame(ent)
{
	new id = pev(ent, pev_owner)
	if (!is_user_connected(id)) return HAM_IGNORED

	static iId ; iId = get_pdata_int(ent, m_iId, 4)
	if (SILENT_BS & (1<<iId))	// check silent
	{
		if (get_pdata_int(ent, m_fSilent, 4)) g_silen[id][iId] = 1
		else g_silen[id][iId] = 0
	}
	
	return HAM_IGNORED
}
public fw_Weapon_SendWeaponAnim(ent, iAnim, skiplocal, body)
{
	new id = pev(ent, pev_owner)
	if (!is_user_connected(id)) return HAM_IGNORED

	// get idwpn
	new classname[64] ; pev(ent, pev_classname, classname, charsmax(classname))
	new idwpn = cs_weapon_name_to_id(classname)
	g_attack[id] = 0
	
	//new anim_set = iAnim//, fastrun = nst_wpn_get_user_fastrun(id) 
	//if (fastrun && iAnim==get_num_anim(id, idwpn, ANIM_IDLE))
		//anim_set = nst_wpn_get_fastrunanim_weapon(id, NST_ANI_FASTRUN_IDLE)

	//playanim(id, anim_set)	// send anim
	
	if (iAnim == get_num_anim(id, idwpn, ANIM_DRAW) && g_wpn[id] == idwpn)	// draw
	{
		g_change[id] = 1
		ExecuteForward(g_fwWeaponDraw, g_fwDummyResult, id)
		
		//client_print(0, print_chat, "[%s][%s]", g_weapon_models[id][0], g_weapon_models[id][1])
		return HAM_SUPERCEDE
	}
	
	if (idwpn == CSW_GLOCK18)	// Fix Anim Glock18
	{
		if (iAnim == 8 || iAnim == 11) g_anim[id] = iAnim
		else if (iAnim == 0 || iAnim == 1 || iAnim == 2)
		{
			g_glock[id] = 1
			g_anim[id] = iAnim
		}
		else g_anim[id] = 0
	}
	playanim2(id, iAnim)
	//client_print(0, print_chat, "[%i][%i][%i][%i]", id, iAnim, skiplocal, body)
	return HAM_IGNORED
}
public fw_Weapon_PrimaryAttack(ent)
{
	static plrClip;plrClip = get_pdata_int(ent, m_iClip, 4);	
	if (plrClip)		g_attack[get_pdata_cbase(ent, m_pPlayer, 4)] = 1

	switch(get_pdata_int(ent, m_iId, 4))
	{
		case CSW_C4, CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
			return HAM_IGNORED;
			
		default: PrimaryAttackEmulation(ent);
	}
	
	return HAM_IGNORED
}

public checkWeapon(id)
{
	new plrClip, plrAmmo, plrWeapId
	plrWeapId = get_user_weapon(id, plrClip , plrAmmo)
	
	if (g_attack[id])	// send anim shoot
	{
		new ani
		if (!plrClip) ani = get_num_anim(id, plrWeapId, ANIM_SHOOT_EMPTY)
		else if (!ani) ani = get_num_anim(id, plrWeapId, ANIM_SHOOT)
		
		playanim2(id, ani)
		g_attack[id] = 0
	}
	
	if (plrWeapId == CSW_KNIFE)	// set v_model knife of gilr
	{
		new model_v[64]; pev(id, pev_viewmodel2, model_v, charsmax(model_v))
		if (equal(model_v, V_KNIFE[0]))
		{
			if (nst_get_user_sex(id) == 2) set_pev(id, pev_viewmodel2, V_KNIFE[1])
			else set_pev(id, pev_viewmodel2, V_KNIFE[0])
		}
	}
	//client_print(id, print_chat, "2[%i]", plrClip)

}
public fw_CmdStart(id, uc_handle, seed)
{
	//new num = pev(id, pev_weaponanim)
	//client_print(id, print_chat, "AT[%i]", g_silen[id])
	
	if (!is_user_alive(id)) return;
	
	new plrClip, plrAmmo, plrWeapId
	plrWeapId = get_user_weapon(id, plrClip , plrAmmo)

	if (g_wpn[id] != plrWeapId || g_change[id])
	{
		new anim = get_num_anim(id, plrWeapId, ANIM_DRAW)
		if (plrWeapId == CSW_GLOCK18)
		{
			anim = max(anim, g_anim[id])
			g_anim[id] = 0
		}
		
		playanim2(id, anim)
		
		g_wpn[id] = plrWeapId
		g_attack[id] = g_change[id] = 0
	}
	else if (!g_attack[id])
	{
		if (plrWeapId == CSW_GLOCK18 && g_glock[id])
		{
			playanim(id, g_anim[id])
			g_glock[id] = g_anim[id] = 0
		}
	}
}
public HamF_TraceAttack_Post(iVictim, iAttacker, Float:damage, Float:fDir[3], Ptr, iDamageType)
{
	//if(!is_user_connected(iAttacker))	return HAM_IGNORED	

	//switch(WEAPON_ENT(get_pdata_cbase(iAttacker, m_pActiveItem, 5)))
	switch(get_pdata_int(get_pdata_cbase(iAttacker, m_pActiveItem, 5), m_iId, 4))
	{
		case CSW_KNIFE: 	return HAM_IGNORED;			
		default:
		{
			static Float:flEnd[3]; get_tr2(Ptr, TR_vecEndPos, flEnd)
			static Float:vecPlane[3]; get_tr2(Ptr, TR_vecPlaneNormal, vecPlane)	
			//Decal effects, add here spark, any
			MakeBullet_Hole_And_Smoke(iAttacker, flEnd)
			//Make_BulletSmoke(iAttacker, Ptr)			
		}
	}
	
	return HAM_IGNORED;	
}
//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)
{
	enum
	{
		SPEC_MODE,
		SPEC_TARGET,
		SPEC_END
	}; 
	
	static aSpecInfo[33][SPEC_END],iSpecMode,iActiveItem, iTarget;
	iTarget = (iSpecMode = pev(iPlayer, pev_iuser1)) ? pev(iPlayer, pev_iuser2) : iPlayer;
	
	if (pev_valid(iTarget))	iActiveItem = get_pdata_cbase(iTarget, m_pActiveItem, 5);
	if(!iActiveItem || iActiveItem == FM_NULLENT || !pev_valid(iActiveItem))
		return FMRES_IGNORED;

	static iId;iId = get_pdata_int(iActiveItem, m_iId, 4);
	if(!iId || iId == FM_NULLENT || !pev_valid(iId)) return FMRES_IGNORED;
	static Float: flGameTime, Float: flLastEventCheck;flGameTime = get_gametime();
	flLastEventCheck = get_pdata_float(iActiveItem, m_flLastEventCheck, 4);
	new anim = get_num_anim(pev(iActiveItem, pev_owner), iId, ANIM_DRAW)
	if(iSpecMode)
	{
		if(aSpecInfo[iPlayer][SPEC_MODE] != iSpecMode)
		{
			aSpecInfo[iPlayer][SPEC_MODE] = iSpecMode;
			aSpecInfo[iPlayer][SPEC_TARGET] = 0;
		}
		if(iSpecMode == OBS_IN_EYE && aSpecInfo[iPlayer][SPEC_TARGET] != iTarget)
		{
			aSpecInfo[iPlayer][SPEC_TARGET] = iTarget;
			new iTaskData[1];//iTaskData[0] = iBodyIndex[iTarget];
			//Checkout, if obs target weapon is silenced and send proper anim from model to us
			iTaskData[0] = get_num_anim(pev(iActiveItem,pev_owner), iId, ANIM_IDLE)			
			//If not silenced				
			//Because once pushing LMB u will immediately move to OBS_IN_EYE, the anim message may skip, so let's make delay
			if (task_exists(iPlayer + TASK_OBS_DELAY))
					remove_task(iPlayer + TASK_OBS_DELAY)
				
			set_task(0.1, "SPEC_OBS_IN_EYE", iPlayer + TASK_OBS_DELAY, 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, ANIM_IDLE);
					
		return FMRES_HANDLED;
	}
	//Custom weapon draw anim should go there too	
	if(flLastEventCheck <= flGameTime)//;
	{			
		//playanim2(iTarget,GetWeaponDrawAnim(iActiveItem),iBodyIndex[iTarget]);
		playanim2(iTarget,anim)
		set_pdata_float(iActiveItem, m_flLastEventCheck, 0.0, 4);
	}

	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)
{
	//#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))

	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))	
	if(get_user_info(iPlayer, iUserInfo, iClientValue, charsmax(iClientValue)))
	{
		//HOOK_DATA(iPlayer, iUserInfo, iServerValue);
		set_user_info(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;
}
//Emulation, not attack replace
stock PrimaryAttackEmulation(iEnt)
{
	//new id = pev(iEnt, pev_owner)
	//new anim = get_num_anim(id, get_pdata_int(iEnt, m_iId, 4), ANIM_SHOOT)
	switch(get_pdata_int(iEnt, m_iId, 4))
	{		
		//Func description: WeaponShootInfo(iWeapon, iAnim, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)
		
		case CSW_GLOCK18: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[2], 0, WEAPONTYPE_GLOCK18);
		case CSW_DEAGLE: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[3], 0, WEAPONTYPE_OTHER);
		case CSW_ELITE: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[4], 0, WEAPONTYPE_ELITE);
		case CSW_FIVESEVEN: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[5], 0, WEAPONTYPE_OTHER);
		case CSW_P228: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[6], 0, WEAPONTYPE_OTHER);
		case CSW_USP: WeaponShootInfo(iEnt, FIRE_SOUND[0], FIRE_SOUND[7], 0, WEAPONTYPE_USP);	

		case CSW_M3: WeaponShootInfo(iEnt, FIRE_SOUND[1],FIRE_SOUND[8], 1, WEAPONTYPE_OTHER);
		case CSW_XM1014: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[9], 1, WEAPONTYPE_OTHER);

		case CSW_MAC10: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[10], 1, WEAPONTYPE_OTHER);
		case CSW_MP5NAVY: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[11], 1, WEAPONTYPE_OTHER);
		case CSW_P90: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[12], 1, WEAPONTYPE_OTHER);
		case CSW_TMP: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[13], 1, WEAPONTYPE_OTHER);
		case CSW_UMP45: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[14], 1, WEAPONTYPE_OTHER);

		case CSW_M4A1: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[15], 1, WEAPONTYPE_M4A1);
		case CSW_AUG: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[16], 1, WEAPONTYPE_OTHER);
		case CSW_FAMAS: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[17], 1, WEAPONTYPE_FAMAS);
		case CSW_AK47: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[18], 1, WEAPONTYPE_OTHER);
		case CSW_SG552: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[19], 1, WEAPONTYPE_OTHER);
		case CSW_GALIL: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[20], 1, WEAPONTYPE_OTHER);

		case CSW_AWP: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[21], 1, WEAPONTYPE_OTHER);
		case CSW_SCOUT: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[22], 1, WEAPONTYPE_OTHER);
		case CSW_SG550: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[23], 1, WEAPONTYPE_OTHER);
		case CSW_G3SG1: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[24], 1, WEAPONTYPE_OTHER);

		case CSW_M249: WeaponShootInfo(iEnt, FIRE_SOUND[1], FIRE_SOUND[25], 1, WEAPONTYPE_OTHER);
	}
	return HAM_IGNORED;
}
//Set here anims, sounds
stock WeaponShootInfo(iEnt, const szSoundEmpty[], const szSoundFire[], iAutoShoot, iWeaponType)
{
	static iPlayer ; iPlayer = get_pdata_cbase(iEnt, m_pPlayer, 4);	 		
	if(!g_attack[iPlayer]) 
	{	
		emit_sound(iPlayer, CHAN_AUTO, szSoundEmpty, 0.8, ATTN_NORM, 0, PITCH_NORM);
		//m_flNextPrimaryAttack = GetNextAttackDelay(0.2);	
		set_pdata_float(iEnt, m_flNextPrimaryAttack, 0.2, 4); 
		
		return HAM_SUPERCEDE;		
	}	
	if(get_pdata_int(iEnt, m_iShotsFired, 4) && !iAutoShoot)
		return HAM_SUPERCEDE;
	new plrClip, plrAmmo, plrWeapId
	plrWeapId = get_user_weapon(iPlayer, plrClip , plrAmmo)

	switch(iWeaponType)
	{
		case WEAPONTYPE_ELITE:
		{
			if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_ELITE_LEFT)
				WeaponShootSound(iPlayer, FIRE_SOUND[4]);
				//else WeaponShootSound(iPlayer, FIRE_SOUND[4],12);
		}	
		case WEAPONTYPE_GLOCK18:
		{
			if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_GLOCK18_BURST_MODE)
				WeaponShootSound(iPlayer, FIRE_SOUND[26]);		
		}
		case WEAPONTYPE_USP:
		{
			if(plrWeapId == CSW_USP && g_silen[iPlayer][CSW_USP])
				WeaponShootSound(iPlayer, FIRE_SOUND[27]);	
		}
		case WEAPONTYPE_M4A1:
		{
			if(plrWeapId == CSW_M4A1 && g_silen[iPlayer][CSW_M4A1])
				WeaponShootSound(iPlayer, FIRE_SOUND[28]);	
		}
		case WEAPONTYPE_FAMAS:
		{
			if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_FAMAS_BURST_MODE)
				WeaponShootSound(iPlayer, FIRE_SOUND[29]);	
		}
		case WEAPONTYPE_OTHER:
			WeaponShootSound(iPlayer, szSoundFire);		
		//default:
		//{
			//Second mode disabled or weapontype other
			//if(!(get_pdata_int(iEnt, m_fSilent, 4)))
				//WeaponShootSound(iPlayer, szSoundFire);			
		//}		
	}
	//Second mode disabled or weapontype other
	if(!(get_pdata_int(iEnt, m_fSilent, 4)))
		WeaponShootSound(iPlayer, szSoundFire);	
	
	EjectBrass(iPlayer, iEnt);
	
	return HAM_IGNORED;	
}
//Play shoot anim and emit fire sounds
stock WeaponShootSound(iPlayer, const szShootSound[])
{
	emit_sound(iPlayer, CHAN_WEAPON, szShootSound, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
			
}
public SPEC_OBS_IN_EYE(iTaskData[], taskid)
{
	new id = taskid - TASK_OBS_DELAY
	playanim2(id, iTaskData[0]);
	
	//client_print(id, print_chat, "Target's v_ body num: %d", iTaskData[0]);
}
//Shells, i've searched the client burst shell ejection, but the function does same effect, so let it be
stock EjectBrass(iPlayer, iEnt)
{
	static iShellRifle, iShellShotgun;
	
	if(!iShellRifle || !iShellShotgun)
	{
		iShellRifle = engfunc(EngFunc_PrecacheModel, "models/pshell.mdl");
		iShellShotgun = engfunc(EngFunc_PrecacheModel,"models/shotgunshell.mdl");
	}	
	
	switch(get_pdata_int(iEnt, m_iId, 4))
	{
		case CSW_M3, CSW_XM1014: set_pdata_int(iEnt, m_iShellId, iShellShotgun, 4);
		case CSW_ELITE: return;	//Dual Weapon clientside part, should do with message, let skip this currently	
		default: set_pdata_int(iEnt, m_iShellId, iShellRifle, 4);	
	}
	
	if(get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_FAMAS_BURST_MODE || get_pdata_int(iEnt, m_fSilent, 4) & WPNSTATE_GLOCK18_BURST_MODE)
	{
		if (task_exists(iPlayer + TASK_SHELL_EJECT))
			remove_task(iPlayer + TASK_SHELL_EJECT)
		
		set_task(0.1, "EjectAdditionalBurstShell", iPlayer + TASK_SHELL_EJECT) //Temporarly, but don't need to create entity through amxx
	}
	
	set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), 4);	
}
public EjectAdditionalBurstShell(taskid)
{
	new iPlayer = taskid - TASK_SHELL_EJECT
	
	set_pdata_float(iPlayer, m_flEjectBrass, get_gametime(), 5);
}
stock MakeBullet_Hole_And_Smoke(id, Float:aimOrigin[3])
{
	new target, body;get_user_aiming(id, target, body)
	if(!(1 <= target <= get_maxplayers()))
	{
		if(target)
		{
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_DECAL)
			engfunc(EngFunc_WriteCoord, aimOrigin[0])
			engfunc(EngFunc_WriteCoord, aimOrigin[1])
			engfunc(EngFunc_WriteCoord, aimOrigin[2])
			write_byte(random_num(41, 45))
			write_short(target)
			message_end()
		}
		else
		{
			message_begin(MSG_ALL, SVC_TEMPENTITY)
			write_byte(TE_WORLDDECAL) // TE id
			engfunc(EngFunc_WriteCoord, aimOrigin[0]) // x
			engfunc(EngFunc_WriteCoord, aimOrigin[1]) // y
			engfunc(EngFunc_WriteCoord, aimOrigin[2]) // z
			write_byte(random_num(41, 45))
			message_end()
		}
		message_begin(MSG_ALL, SVC_TEMPENTITY)
		write_byte(TE_SPARKS)
		engfunc(EngFunc_WriteCoord, aimOrigin[0])
		engfunc(EngFunc_WriteCoord, aimOrigin[1])
		engfunc(EngFunc_WriteCoord, aimOrigin[2])
		message_end()

		message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
		write_byte(TE_GUNSHOTDECAL)
		engfunc(EngFunc_WriteCoord, aimOrigin[0])
		engfunc(EngFunc_WriteCoord, aimOrigin[1])
		engfunc(EngFunc_WriteCoord, aimOrigin[2])
		write_short(id)
		write_byte(random_num(41, 45))
		message_end()

		static TE_FLAG;
		TE_FLAG |= TE_EXPLFLAG_NODLIGHTS
		TE_FLAG |= TE_EXPLFLAG_NOSOUND
		TE_FLAG |= TE_EXPLFLAG_NOPARTICLES
		
		engfunc(EngFunc_MessageBegin, MSG_PAS, SVC_TEMPENTITY, aimOrigin, 0)
		write_byte(TE_EXPLOSION)
		engfunc(EngFunc_WriteCoord, aimOrigin[0])
		engfunc(EngFunc_WriteCoord, aimOrigin[1])
		engfunc(EngFunc_WriteCoord, aimOrigin[2] - 10.0)
		write_short(engfunc(EngFunc_PrecacheModel,"sprites/wall_puff1.spr"))
		write_byte(2)
		write_byte(50)
		write_byte(TE_FLAG)
		message_end()
	}
}
public qq(id)
{

}

// ########################## FUNCTION ##########################
public playanim(player, anim)
{
	if (!is_user_alive(player) || !get_pcvar_num(cvar_run)) return;
	if (g_wpn[player] == CSW_ELITE && g_attack[player]) return;
	
	new hand = nst_get_user_hand(player)
	if (!hand) return;
	
	//set_pev(player, pev_weaponanim, anim)
	//set_weapon_anim(player, anim, hand)	
	send_weapon_anim(player, anim, hand)
}
public playanim2(player, anim)
{
	new hand = nst_get_user_hand(player)

	//set_pev(player, pev_weaponanim, anim)
	//set_weapon_anim(player, anim, hand)	
	send_weapon_anim(player, anim, hand)
}
public set_weapon_anim(player, anim, hand)
{	
	//set_pev(player, pev_weaponanim, anim)
	message_begin(MSG_ONE, SVC_WEAPONANIM, {0, 0, 0}, player)
	write_byte(anim)
	write_byte(hand)
	message_end()
}
//Animation stock (include Spectators check) by fl0wer
stock send_weapon_anim(iPlayer, iAnim, iBody)
{
	set_pev(iPlayer, pev_weaponanim, iAnim)
	set_weapon_anim(iPlayer, iAnim, iBody)

	if(pev(iPlayer, pev_iuser1))	return;
	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) != iPlayer) 			continue;
		set_pev(iSpectator, pev_weaponanim, iAnim)
		set_weapon_anim(iSpectator, iAnim, iBody)
	}	
}
stock cs_weapon_name_to_id(const weapon[])
{
	for (new i = 0; i < sizeof WEAPONENTNAMES; i++)
	{
		if (equal(weapon, WEAPONENTNAMES[i]))
			return i;
	}
	
	return 0;
}
stock get_num_anim(id, wpn, type)
{
	// type = 1 : draw - type = 2 : shoot
	new draw, shoot, shoot_empty, idle
	new iEnt = get_pdata_cbase(id, m_pActiveItem, 5)
	new WeaponState = get_pdata_int(iEnt,m_fSilent,4)
	if(g_IsCustom[iEnt][id] > 0) draw = g_IsCustom[iEnt][id]
	else
	{
	switch(wpn)
	{
		case CSW_KNIFE:
		{
			draw = 3
			//shoot = 1
		}
		case CSW_DEAGLE, CSW_FIVESEVEN:
		{
			draw = 5
			shoot = 1
			shoot_empty = 3
		}
		case CSW_ELITE:
		{
			draw = 15
			//shoot = 6
			shoot = !(WeaponState & WPNSTATE_ELITE_LEFT) ? 12 : 6
			shoot_empty = 7
		}
		case CSW_P228:
		{
			draw = 6
			shoot = 1
			shoot_empty = 4
		}
		case CSW_GLOCK18:
		{
			draw = 8
			shoot = 5
			shoot_empty = 6
		}
		case CSW_AWP:
		{
			draw = 5
			shoot = 1
		}
		case CSW_M3, CSW_XM1014:
		{
			draw = 6
			shoot = 1
		}
		case CSW_MAC10, CSW_MP5NAVY, CSW_P90,CSW_TMP, CSW_UMP45:
		{
			draw = 2
			shoot = 3
		}
		case CSW_GALIL, CSW_AK47, CSW_FAMAS, CSW_AUG,CSW_SG552:
		{
			draw = 2
			shoot = 3
		}
		case CSW_SG550, CSW_G3SG1,CSW_SCOUT, CSW_M249:
		{
			draw = 4
			shoot = 1
		}
		case CSW_USP:
		{
			idle = 8
			draw = 14
			shoot = 9
			shoot_empty = 12
		}
		case CSW_M4A1:
		{
			idle = 7
			draw = 12
			shoot = 8
		}
		case CSW_HEGRENADE, CSW_FLASHBANG, CSW_SMOKEGRENADE:
		{
			draw = 3
		}
		case CSW_C4:
		{
			draw = 1
		}
	}
	
	// silen wpn
	if (wpn == CSW_M4A1 && g_silen[id][CSW_M4A1])
	{
		idle -= 7
		draw -= 7
		shoot -= 7
		shoot_empty -= 7
	}
	else if (wpn == CSW_USP && g_silen[id][CSW_USP])
	{
		idle -= 8
		draw -= 8
		shoot -= 8
		shoot_empty -= 8
	}
	
	// random anim shoot2
	if (!(NOSHOOT2_BS & (1<<wpn))) shoot += random_num(0, 1)

	// return value
	if (type == ANIM_IDLE) return idle
	else if (type == ANIM_DRAW) return draw
	else if (type == ANIM_SHOOT) return shoot
	else if (type == ANIM_SHOOT_EMPTY) return shoot_empty
	}	
	return 0
}

// ########################## NATIVES ##########################
public natives_send_weapon_anim(player, anim)
{
	playanim2(player, anim)
	return 1
}
public natives_send_weapon_anim_draw(id, iCSW, iAnim) g_IsCustom[iCSW][id] = iAnim;

/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1033\\ f0\\ fs16 \n\\ par }
*/
You have to put it inside so that it doesn't take up the whole page
SoulWeaver16 is offline
dw312382354
New Member
Join Date: Jun 2024
Old 04-23-2025 , 23:12   Re: SetViewEntityBody 2
Reply With Quote #39

Quote:
Originally Posted by soulweaver16 View Post
you have to put it inside so that it doesn't take up the whole page
放在裡面的指哪裡?
dw312382354 is offline
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 07:23.


Powered by vBulletin®
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Theme made by Freecode