#include <amxmodx>
#include <fakemeta>
#include <xs>
#include <hamsandwich>
#include <zombieplague>
#include "weapons/vars.inl"
#define weapon_name "weapon_ump45"
#define weapon_new "files/weapon_dualkrisshero_zombus"
enum
{
ANIM_IDLE = 0,
ANIM_IDLE_LEFT_EMPTY,
ANIM_SHOOT_LEFT1,
ANIM_SHOOT_LEFT2,
ANIM_SHOOT_LEFT_LAST,
ANIM_SHOOT_RIGHT1,
ANIM_SHOOT_RIGHT2,
ANIM_SHOOT_RIGHT_LAST,
ANIM_RELOAD,
ANIM_DRAW
}
#define WEAPON_KEY 10003
#define Is_CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
#define sound_shot "files/dualkrisshero-1.wav"
#define model_v "models/files/v_dualkrisshero.mdl"
#define model_p "models/files/p_dualkrisshero.mdl"
#define model_w "models/weapons/w_files_weapons.mdl"
#define weapon_punchangle 0 //0.8
#define weapon_damage 5.0
#define weapon_aspeed 0.09
#define weapon_ammo 50
#define weapon_bpammo 100
#define idle_time 4.1
#define draw_time 1.36
#define reload_time 3.1
new g_cvarMaxSpeed, g_cvarSpeed
new const sounds_dump[][] =
{
"dualkriss_clipin.wav",
"dualkriss_clipout.wav",
"dualkriss_draw.wav",
"dualkrisshero-1.wav"
}
new const precache_dump[][] =
{
"sprites/weapon_dualkrisshero_zombus.txt",
"sprites/640hud127.spr"
}
public plugin_precache()
{
engfunc(EngFunc_PrecacheModel, model_v)
engfunc(EngFunc_PrecacheModel, model_p)
engfunc(EngFunc_PrecacheModel, model_w)
new index;
for(index = 0; index < sizeof(sounds_dump); index++) engfunc(EngFunc_PrecacheSound, sounds_dump[index])
for(index = 0; index < sizeof(precache_dump); index++) engfunc(EngFunc_PrecacheGeneric, precache_dump[index])
register_forward(FM_Spawn, "HookFm_Spawn", false)
}
public plugin_init()
{
RegisterHam(Ham_Item_Deploy, weapon_name, "HookHam_Weapon_Deploy", true)
RegisterHam(Ham_Item_AddToPlayer, weapon_name, "HookHam_Weapon_Add", true)
RegisterHam(Ham_Item_PostFrame, weapon_name, "HookHam_Weapon_Frame")
RegisterHam(Ham_Weapon_Reload, weapon_name, "HookHam_Weapon_Reload")
RegisterHam(Ham_Weapon_WeaponIdle, weapon_name, "HookHam_Weapon_Idle", false)
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_name, "HookHam_Weapon_PrimaryAttack", false)
// RegisterHam(Ham_TakeDamage, weapon_name, "HookHam_TakeDamage", false)
register_forward(FM_UpdateClientData, "HookFm_UpdateClientData", true)
register_forward(FM_SetModel, "HookFm_SetModel")
register_clcmd(weapon_new, "hook_item")
g_iItemID = zp_register_extra_item("Dual KRISS", 0, ZP_TEAM_HUMAN);
g_cvarSpeed = register_cvar("amx_infspeed", "300")
}
public zp_extra_item_selected(id, itemid)
{
if (itemid == g_iItemID)
{
get_item(id);
}
}
public get_item(iPlayer)
{
UTIL_DropWeapon(iPlayer, 1);
new iWeapon = make_weapon();
if(iWeapon <= 0)
return
if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iWeapon))
{
engfunc(EngFunc_RemoveEntity, iWeapon);
return;
}
ExecuteHam(Ham_Item_AttachToPlayer, iWeapon, iPlayer)
new ammotype = pDataKey_ibpAmmo + get_pdata_int(iWeapon, pDataKey_iPrimaryAmmoType, pData_Item)
set_pdata_int(iPlayer, ammotype, weapon_bpammo, pData_Player)
set_pdata_int(iWeapon, pDataKey_iClip, weapon_ammo, pData_Item)
emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
}
public hook_item(iPlayer)
{
engclient_cmd(iPlayer, weapon_name)
return PLUGIN_HANDLED
}
public HookHam_Weapon_Deploy(iEntity)
{
if(!Is_CustomItem(iEntity))
return HAM_IGNORED
static iPlayer; iPlayer = get_pdata_cbase(iEntity, pDataKey_iOwner, pData_Item)
set_pev(iPlayer, pev_viewmodel2, model_v)
set_pev(iPlayer, pev_weaponmodel2, model_p)
set_pdata_float(iEntity, pDataKey_flNextPrimaryAttack, draw_time, pData_Item)
set_pdata_float(iEntity, pDataKey_flNextSecondaryAttack, draw_time, pData_Item)
Play_WeaponAnim(iPlayer, ANIM_DRAW)
set_pdata_string(iPlayer, 1968, "dualpistols", -1, 20)
return HAM_IGNORED
}
public HookHam_Weapon_Add(iEntity, iPlayer)
{
switch(pev(iEntity, pev_impulse))
{
case WEAPON_KEY: Weaponlist(iPlayer, true)
case 0: Weaponlist(iPlayer, false)
}
return HAM_IGNORED
}
public HookHam_Weapon_Frame(iEntity)
{
if(!Is_CustomItem(iEntity))
return HAM_IGNORED;
static iPlayer, iClip, iAmmoType, iAmmo, iAmount;
iPlayer = get_pdata_cbase(iEntity, pDataKey_iOwner, pData_Item);
if(get_pdata_int(iEntity, pDataKey_iInReload, pData_Item))
{
iClip = get_pdata_int(iEntity, pDataKey_iClip, pData_Item);
iAmmoType = pDataKey_ibpAmmo + get_pdata_int(iEntity, pDataKey_iPrimaryAmmoType, pData_Item);
iAmmo = get_pdata_int(iPlayer, iAmmoType, pData_Player);
iAmount = min(weapon_ammo - iClip, iAmmo);
set_pdata_int(iEntity, pDataKey_iClip, iClip + iAmount, pData_Item);
set_pdata_int(iPlayer, iAmmoType, iAmmo - iAmount, pData_Player);
set_pdata_int(iEntity, pDataKey_iInReload, 0, pData_Item);
}
return HAM_IGNORED;
}
public HookHam_Weapon_Reload(iEntity)
{
if(!Is_CustomItem(iEntity))
return HAM_IGNORED;
static iPlayer, iClip, iAmmoType;
iClip = get_pdata_int(iEntity, pDataKey_iClip, pData_Item);
iPlayer = get_pdata_cbase(iEntity, pDataKey_iOwner, pData_Item);
iAmmoType = pDataKey_ibpAmmo + get_pdata_int(iEntity, pDataKey_iPrimaryAmmoType, pData_Item);
if(iClip >= weapon_ammo)
return HAM_SUPERCEDE;
if(get_pdata_int(iPlayer, iAmmoType, pData_Player) <= 0)
return HAM_SUPERCEDE
set_pdata_int(iEntity, pDataKey_iClip, 0, pData_Item);
ExecuteHam(Ham_Weapon_Reload, iEntity);
set_pdata_int(iEntity, pDataKey_iClip, iClip, pData_Item);
set_pdata_float(iPlayer, 83, reload_time, pData_Item)
set_pdata_int(iEntity, pDataKey_iInReload, 1, pData_Item);
Play_WeaponAnim(iPlayer, ANIM_RELOAD)
return HAM_SUPERCEDE;
}
public plugin_cfg()
{
g_cvarMaxSpeed = get_cvar_pointer("sv_maxspeed")
}
public HookHam_Weapon_Idle(iEntity)
{
if(!Is_CustomItem(iEntity))
return HAM_IGNORED
if(get_pdata_float(iEntity, pDataKey_flNextTimeWeaponIdle, pData_Item) > 0.0)
return HAM_IGNORED
set_pdata_float(iEntity, pDataKey_flNextTimeWeaponIdle, idle_time, pData_Item)
Play_WeaponAnim(get_pdata_cbase(iEntity, pDataKey_iOwner, pData_Item), ANIM_IDLE)
return HAM_SUPERCEDE
}
public HookHam_Weapon_PrimaryAttack(iEntity)
{
if(!Is_CustomItem(iEntity))
return HAM_IGNORED
static iClip;
iClip = get_pdata_int(iEntity, pDataKey_iClip, pData_Item);
if(iClip <= 0)
{
ExecuteHam(Ham_Weapon_PlayEmptySound, iEntity);
set_pdata_float(iEntity, pDataKey_flNextPrimaryAttack, weapon_aspeed, pData_Item)
return HAM_SUPERCEDE
}
static iPlayer, Float: flOldPush[3], Float: flNewPush[3], FM_TraceLineHook, FM_PlayBackEventHook;
iPlayer = get_pdata_cbase(iEntity, pDataKey_iOwner, pData_Item)
FM_PlayBackEventHook = register_forward(FM_PlaybackEvent, "HookFm_PlayBackEvent", false)
FM_TraceLineHook = register_forward(FM_TraceLine, "HookFm_TraceLine", true)
pev(iPlayer, pev_punchangle, flOldPush)
//state FireBullets: Enabled;
ExecuteHam(Ham_Weapon_PrimaryAttack, iEntity)
//state FireBullets: Disabled;
unregister_forward(FM_TraceLine, FM_TraceLineHook, true)
unregister_forward(FM_PlaybackEvent, FM_PlayBackEventHook, false)
pev(iPlayer, pev_punchangle, flNewPush)
flNewPush[0] = flOldPush[0] + (flNewPush[0] - flOldPush[0]) * weapon_punchangle
flNewPush[1] = flOldPush[1] + (flNewPush[1] - flOldPush[1]) * weapon_punchangle
flNewPush[2] = flOldPush[2] + (flNewPush[2] - flOldPush[2]) * weapon_punchangle
set_pev(iPlayer, pev_punchangle, flNewPush)
emit_sound(iPlayer, CHAN_WEAPON, sound_shot, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
enum
{
Left,
Right
}
if(get_pdata_int(iEntity, pDataKey_iSpecialReload, 4) == Left)
{
set_pdata_int(iEntity,pDataKey_iSpecialReload, Right, 4)
Play_WeaponAnim(iPlayer, iClip == 2 ? ANIM_SHOOT_LEFT_LAST : random_num(ANIM_SHOOT_LEFT1, ANIM_SHOOT_LEFT2))
}
else
{
set_pdata_int(iEntity, pDataKey_iSpecialReload, Left, 4)
Play_WeaponAnim(iPlayer, iClip == 1 ? ANIM_SHOOT_RIGHT_LAST : random_num(ANIM_SHOOT_RIGHT1, ANIM_SHOOT_RIGHT2))
}
set_pdata_float(iEntity, pDataKey_flNextPrimaryAttack, weapon_aspeed, pData_Item)
set_pdata_float(iEntity, pDataKey_flNextSecondaryAttack, weapon_aspeed, pData_Item)
set_pdata_int(iEntity, pDataKey_iClip, iClip - 1, pData_Item)
return HAM_SUPERCEDE
}
public HookHam_TakeDamage(iVictim, iInflictor, iAttacker, Float:fLDamage) <FireBullets: Enabled>
{
SetHamParamFloat(4, fLDamage * weapon_damage);
return HAM_OVERRIDE;
}
public HookHam_TakeDamage() <FireBullets: Disabled>
{
return HAM_IGNORED;
}
public HookHam_TakeDamage() <>
{
return HAM_IGNORED;
}
public HookFm_SetModel(iEntity)
{
static szClassName[32], iWeapon;
pev(iEntity, pev_classname, szClassName, 31);
if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED;
for(new i = 0; i < 6; i++)
{
iWeapon = get_pdata_cbase(iEntity, pDataKey_WeaponBoxItems + i, 4);
if(iWeapon > 0 && Is_CustomItem(iWeapon))
{
engfunc(EngFunc_SetModel, iEntity, model_w);
set_pev(iEntity, pev_body, 11)
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public HookFm_PlayBackEvent()
{
return FMRES_SUPERCEDE
}
public HookFm_TraceLine(Float: tr_start[3], Float: tr_end[3], tr_flag, tr_ignore, tr)
{
static iHit, iDecal, iGlassDecal;
iHit = get_tr2(tr, TR_pHit)
if(!iGlassDecal)
iGlassDecal = engfunc(EngFunc_DecalIndex, "{bproof1")
if(iHit > 0 && pev_valid(iHit))
{
if(pev(iHit, pev_solid) != SOLID_BSP)
{
return FMRES_IGNORED
}
else
{
if(pev(iHit, pev_rendermode) != 0)
{
iDecal = iGlassDecal
}
else
{
iDecal = random_num(41, 45)
}
}
}
else
{
iDecal = random_num(41, 45)
}
static Float: vecEnd[3];
get_tr2(tr, TR_vecEndPos, vecEnd)
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(iHit > 0 ? iHit : 0)
write_byte(iDecal)
message_end()
static Float: WallVector[3];
get_tr2(tr, TR_vecPlaneNormal, WallVector)
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecEnd, 0);
write_byte(TE_STREAK_SPLASH)
engfunc(EngFunc_WriteCoord, vecEnd[0]);
engfunc(EngFunc_WriteCoord, vecEnd[1]);
engfunc(EngFunc_WriteCoord, vecEnd[2]);
engfunc(EngFunc_WriteCoord, WallVector[0] * random_float(25.0,30.0));
engfunc(EngFunc_WriteCoord, WallVector[1] * random_float(25.0,30.0));
engfunc(EngFunc_WriteCoord, WallVector[2] * random_float(25.0,30.0));
write_byte(111) //colorid
write_short(12) //count
write_short(3) //speed
write_short(75) //random velocity
message_end()
return FMRES_IGNORED
}
public HookFm_UpdateClientData(iPlayer, SendWeapons, CD_Handle)
{
static iEntity;
iEntity = get_pdata_cbase(iPlayer, pDataKey_iActiveItem, pData_Player)
if(iEntity <= 0 || !Is_CustomItem(iEntity))
return FMRES_IGNORED
set_cd(CD_Handle, CD_flNextAttack, 99999.0)
static Float:fSpeed; fSpeed = get_pcvar_float(g_cvarSpeed)
if(fSpeed < 0.0)
set_pev(iPlayer, pev_maxspeed, get_pcvar_float(g_cvarMaxSpeed))
else if(fSpeed > 0.0)
set_pev(iPlayer, pev_maxspeed, fSpeed)
return FMRES_HANDLED
}
public HookFm_Spawn(iPlayer)
{
if(pev_valid(iPlayer) != 2)
return FMRES_IGNORED
static szClName[32];
pev(iPlayer, pev_classname, szClName, charsmax(szClName))
if(strlen(szClName) < 5)
return FMRES_IGNORED
static Trie: ClBuffer;
if(!ClBuffer)
ClBuffer = TrieCreate()
if(!TrieKeyExists(ClBuffer, szClName))
{
TrieSetCell(ClBuffer, szClName, 1)
RegisterHamFromEntity(Ham_TakeDamage, iPlayer, "HookHam_TakeDamage", false)
}
return FMRES_IGNORED
}
stock make_weapon()
{
static ent;
static g_AllocString_E;
if(g_AllocString_E || (g_AllocString_E = engfunc(EngFunc_AllocString, weapon_name)))
ent = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E)
else
return 0
if(ent <= 0)
return 0;
set_pev(ent, pev_spawnflags, SF_NORESPAWN);
set_pev(ent, pev_impulse, WEAPON_KEY);
ExecuteHam(Ham_Spawn, ent)
return ent
}
stock UTIL_DropWeapon(iPlayer, iSlot)
{
static iEntity;
iEntity = get_pdata_cbase(iPlayer, (pDataKey_iPlayerItems + iSlot), pData_Player);
if(iEntity > 0)
{
static iNext,szWeaponName[32];
do
{
iNext = get_pdata_cbase(iEntity, pDataKey_iNext, 4);
if(get_weaponname(get_pdata_int(iEntity, pDataKey_iId, 4), szWeaponName, 31))
engclient_cmd(iPlayer, "drop", szWeaponName)
}
while(( iEntity = iNext) > 0);
}
}
stock Play_WeaponAnim(iPlayer, iAnim)
{
set_pev(iPlayer, pev_weaponanim, iAnim)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, _, iPlayer)
write_byte(iAnim)
write_byte(0)
message_end()
}
stock Weaponlist(iPlayer, bool:bChange)
{
if(!is_user_connected(iPlayer))
return
message_begin(MSG_ONE, get_user_msgid("WeaponList"), _, iPlayer);
write_string(bChange ? weapon_new : weapon_name);
write_byte(6);
write_byte(100);
write_byte(-1);
write_byte(-1);
write_byte(0);
write_byte(15);
write_byte(12);
write_byte(0);
message_end();
}
#define MESSAGE_BEGIN(%0,%1,%2,%3) engfunc(EngFunc_MessageBegin, %0, %1, %2, %3)
#define MESSAGE_END() message_end()
#define WRITE_ANGLE(%0) engfunc(EngFunc_WriteAngle, %0)
#define WRITE_BYTE(%0) write_byte(%0)
#define WRITE_COORD(%0) engfunc(EngFunc_WriteCoord, %0)
#define WRITE_SHORT(%0) write_short(%0)