Quote:
Originally Posted by soulweaver16
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 }
*/