PHP Code:
#pragma semicolon 1
#include <amxmodx>
#include <fakemeta>
#include <reapi>
#include <xs>
#include <api_custom_weapons>
#define PLUGIN "[Custom Weapon] Test Pistol"
#define VERSION "1.0.0"
#define AUTHOR "Hedgehog Fog"
#define WEAPON_V_MODEL "models/v_9mmhandgun.mdl"
#define WEAPON_P_MODEL "models/p_9mmhandgun.mdl"
#define WEAPON_W_MODEL "models/w_9mmhandgun.mdl"
#define WEAPON_SHELL_MODEL "models/shell.mdl"
#define WEAPON_SHOT_SOUND "sound/weapons/pl_gun1.wav"
#define WEAPON_RELOAD_START_SOUND "sound/weapons/reload2.wav"
#define WEAPON_RELOAD_END_SOUND "sound/weapons/reload1.wav"
#define WEAPON_HUD_TXT "sprites/test_pistol.txt"
#define WEAPON_NAME "test_pistol"
#define WEAPON_ID CSW_FIVESEVEN
#define WEAPON_CLIP_SIZE 7
#define WEAPON_PRIMARY_AMMO_ID 0
#define WEAPON_PRIMARY_AMMO_LIMIT 60
#define WEAPON_SECONDARY_AMMO_ID -1
#define WEAPON_SECONDARY_AMMO_LIMIT -1
#define WEAPON_SLOT_ID 1
#define WEAPON_SLOT_POSITION 6
#define WEAPON_FLAGS 0
#define WEAPON_ICON "fiveseven"
#define WEAPON_CUSTOM_FLAGS CWF_None
#define WEAPON_DAMAGE 20.0
#define WEAPON_RANGE_MODIFIER 0.8
#define WEAPON_FIRE_RATE 0.125
#define WEAPON_SPREAD_VEC Float:VECTOR_CONE_3DEGREES
#define WEAPON_RECOIL_VEC Float:{-2.5, 0.0, 0.0}
#define WEAPON_RELOAD_DURATION 1.68
#define WEAPON_PLAYER_ANIM_EXT "onehanded"
#define WEAPON_SEQ_IDLE_1 0
#define WEAPON_SEQ_IDLE_2 1
#define WEAPON_SEQ_IDLE_3 2
#define WEAPON_SEQ_PRIMARY_ATTACK 3
#define WEAPON_SEQ_RELOAD 5
#define WEAPON_SEQ_DRAW 7
#define WEAPON_SEQ_DURATION_IDLE_1 ANIM_DURATION(61, 16)
#define WEAPON_SEQ_DURATION_IDLE_2 ANIM_DURATION(41, 16)
#define WEAPON_SEQ_DURATION_IDLE_3 ANIM_DURATION(50, 14)
#define WEAPON_SEQ_DURATION_PRIMARY_ATTACK ANIM_DURATION(15, 25)
#define WEAPON_MAX_SPEED 250.0
stock Float:ANIM_DURATION(iFrameCount, iFramesPerSecond) {
return float(iFrameCount) / float(iFramesPerSecond);
}
new CW:g_iCwHandler;
public plugin_precache() {
precache_generic(WEAPON_HUD_TXT);
precache_model(WEAPON_V_MODEL);
precache_model(WEAPON_P_MODEL);
precache_model(WEAPON_W_MODEL);
precache_model(WEAPON_SHELL_MODEL);
precache_sound(WEAPON_SHOT_SOUND);
precache_sound(WEAPON_RELOAD_START_SOUND);
precache_sound(WEAPON_RELOAD_END_SOUND);
g_iCwHandler = CW_Register(
WEAPON_NAME,
WEAPON_ID,
WEAPON_CLIP_SIZE,
WEAPON_PRIMARY_AMMO_ID,
WEAPON_PRIMARY_AMMO_LIMIT,
WEAPON_SECONDARY_AMMO_ID,
WEAPON_SECONDARY_AMMO_ID,
WEAPON_SLOT_ID,
WEAPON_SLOT_POSITION,
WEAPON_FLAGS,
WEAPON_ICON,
WEAPON_CUSTOM_FLAGS
);
CW_Bind(g_iCwHandler, CWB_Idle, "@Weapon_Idle");
CW_Bind(g_iCwHandler, CWB_PrimaryAttack, "@Weapon_PrimaryAttack");
CW_Bind(g_iCwHandler, CWB_Reload, "@Weapon_Reload");
CW_Bind(g_iCwHandler, CWB_DefaultReloadEnd, "@Weapon_DefaultReloadEnd");
CW_Bind(g_iCwHandler, CWB_Deploy, "@Weapon_Deploy");
CW_Bind(g_iCwHandler, CWB_GetMaxSpeed, "@Weapon_GetMaxSpeed");
CW_Bind(g_iCwHandler, CWB_Spawn, "@Weapon_Spawn");
CW_Bind(g_iCwHandler, CWB_WeaponBoxModelUpdate, "@Weapon_WeaponBoxSpawn");
}
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
}
// idle implementation
public @Weapon_Idle(this) {
switch (random(3)) {
case 0: {
CW_PlayAnimation(this, WEAPON_SEQ_IDLE_1, WEAPON_SEQ_DURATION_IDLE_1);
}
case 1: {
CW_PlayAnimation(this, WEAPON_SEQ_IDLE_2, WEAPON_SEQ_DURATION_IDLE_2);
}
case 2: {
CW_PlayAnimation(this, WEAPON_SEQ_IDLE_3, WEAPON_SEQ_DURATION_IDLE_3);
}
}
}
// primary attack implementation
public @Weapon_PrimaryAttack(this) {
// block automatic firing
if (get_member(this, m_Weapon_iShotsFired) > 0) {
return;
}
// using shot implementation from Half-Life
if (CW_DefaultShot(this, WEAPON_DAMAGE, WEAPON_RANGE_MODIFIER, WEAPON_FIRE_RATE, WEAPON_SPREAD_VEC)) {
CW_PlayAnimation(this, WEAPON_SEQ_PRIMARY_ATTACK, WEAPON_SEQ_DURATION_PRIMARY_ATTACK);
new pPlayer = CW_GetPlayer(this);
emit_sound(pPlayer, CHAN_WEAPON, WEAPON_SHOT_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
// adding some recoil
static Float:vecPunchAngle[3];
pev(pPlayer, pev_punchangle, vecPunchAngle);
xs_vec_add(vecPunchAngle, WEAPON_RECOIL_VEC, vecPunchAngle);
if (xs_vec_len(vecPunchAngle) > 0.0) {
set_pev(pPlayer, pev_punchangle, vecPunchAngle);
}
// ejecting shells
CW_EjectWeaponBrass(this, engfunc(EngFunc_ModelIndex, WEAPON_SHELL_MODEL), 1);
}
}
// reload start implemetation
public @Weapon_Reload(this) {
new pPlayer = CW_GetPlayer(this);
// using reload implementation from Half-Life
if (CW_DefaultReload(this, WEAPON_SEQ_RELOAD, WEAPON_RELOAD_DURATION)) {
emit_sound(pPlayer, CHAN_WEAPON, WEAPON_RELOAD_START_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
}
// reload end implementation
public @Weapon_DefaultReloadEnd(this) {
new pPlayer = CW_GetPlayer(this);
emit_sound(pPlayer, CHAN_WEAPON, WEAPON_RELOAD_END_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}
// deploy implementation
public @Weapon_Deploy(this) {
CW_DefaultDeploy(this, WEAPON_V_MODEL, WEAPON_P_MODEL, WEAPON_SEQ_DRAW, WEAPON_PLAYER_ANIM_EXT);
}
// calculate max speed
public Float:@Weapon_GetMaxSpeed(this) {
return WEAPON_MAX_SPEED;
}
// change weapon entity model
public @Weapon_Spawn(this) {
engfunc(EngFunc_SetModel, this, WEAPON_W_MODEL);
}
// change weaponbox entity model
public @Weapon_WeaponBoxSpawn(this, pWeaponBox) {
engfunc(EngFunc_SetModel, pWeaponBox, WEAPON_W_MODEL);
}