#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#include <zombie_plague_special>
#include <zmvip>
#define CustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
// CWeaponBox
#define m_rgpPlayerItems_CWeaponBox 34
// CBasePlayerItem
#define m_pPlayer 41
#define m_pNext 42
#define m_iId 43
// CBasePlayerWeapon
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
#define m_iPrimaryAmmoType 49
#define m_iClip 51
#define m_fInReload 54
#define m_iWeaponState 74
// CBaseMonster
#define m_flNextAttack 83
// CBasePlayer
#define m_iFOV 363
#define m_rpgPlayerItems 367
#define m_pActiveItem 373
#define m_rgAmmo 376
/*-----------------------------------------------------*/
#define ANIM_IDLE 0
#define ANIM_ATTACK random_num(3, 5)
#define ANIM_RELOAD 1
#define ANIM_DRAW 2
#define ANIM_IDLE_TIME 2/30.0
#define ANIM_SHOOT_TIME 17/20.0
#define ANIM_RELOAD_TIME 91/37.0
#define ANIM_DRAW_TIME 31/30.0
#define WEAPON_KEY 48384221
#define WEAPON_OLD "weapon_ak47"
#define WEAPON_NEW "weapon_akmbb_mxd"
new const iWeaponList[ ] = {
2, 90, -1, -1, 0, 1, 28, 0
}
/*-----------------------------------------------------*/
#define WEAPON_MODEL_VIEW "models/m_xd/v_akmbb.mdl"
#define WEAPON_MODEL_PLAYER "models/m_xd/p_akmbb.mdl"
#define WEAPON_MODEL_WORLD "models/m_xd/w_akmbb.mdl"
#define WEAPON_BODY 0
#define WEAPON_SOUND_SHOOT "weapons/akm-1.wav"
#define WEAPON_SPRITE_HIT "sprites/m_xd/balrog5stack_blue.spr"
/*-----------------------------------------------------*/
#define WEAPON_NAME "\rA-Rifle \wAKM Balrog Blue"
#define WEAPON_COST 0
#define WEAPON_CLIP 35
#define WEAPON_AMMO 90
#define WEAPON_RATE 0.089
#define WEAPON_RECOIL 0.63
#define WEAPON_DAMAGE 1.47
#define WEAPON_NATIVE "give_weapon_akmbb"
/*-----------------------------------------------------*/
new g_AllocString_V,
g_AllocString_P,
g_AllocString_E,
HamHook: g_fw_TraceAttack[4],
g_iSpriteHit,
g_iMsgID_Weaponlist,
g_akmbb;
public plugin_init() {
register_plugin("ZP Extraitem: AKM Balrog Blue", "1.0", "Base: Batcon & xUnicorn(t3rkecorejz); ReEdit: Markus_XD(BOSS_XD)");
RegisterHam(Ham_Item_Deploy, WEAPON_OLD, "fw_Item_Deploy_Post", 1);
RegisterHam(Ham_Item_PostFrame, WEAPON_OLD, "fw_Item_PostFrame");
RegisterHam(Ham_Item_AddToPlayer, WEAPON_OLD, "fw_Item_AddToPlayer_Post", 1);
RegisterHam(Ham_Weapon_Reload, WEAPON_OLD, "fw_Weapon_Reload");
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_OLD, "fw_Weapon_WeaponIdle");
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_OLD, "fw_Weapon_PrimaryAttack");
RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack_Post", 1);
RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack_Post", 1);
g_fw_TraceAttack[0] = RegisterHam(Ham_TraceAttack, "func_breakable", "fw_TraceAttack");
g_fw_TraceAttack[1] = RegisterHam(Ham_TraceAttack, "info_target", "fw_TraceAttack");
g_fw_TraceAttack[2] = RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack");
g_fw_TraceAttack[3] = RegisterHam(Ham_TraceAttack, "hostage_entity", "fw_TraceAttack");
fm_ham_hook(false);
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1);
register_forward(FM_PlaybackEvent, "fw_PlaybackEvent");
register_forward(FM_SetModel, "fw_SetModel");
g_iMsgID_Weaponlist = get_user_msgid("WeaponList");
g_akmbb = zv_register_extra_item(WEAPON_NAME, WEAPON_COST, ZV_TEAM_HUMAN);
}
public plugin_precache() {
register_clcmd(WEAPON_NEW, "HookSelect");
g_AllocString_V = engfunc(EngFunc_AllocString, WEAPON_MODEL_VIEW);
g_AllocString_P = engfunc(EngFunc_AllocString, WEAPON_MODEL_PLAYER);
g_AllocString_E = engfunc(EngFunc_AllocString, WEAPON_OLD);
UTIL_PrecacheSpritesFromTxt(WEAPON_NEW);
g_iSpriteHit = engfunc(EngFunc_PrecacheModel, WEAPON_SPRITE_HIT);
UTIL_PrecacheSoundsFromModel(WEAPON_MODEL_VIEW);
engfunc(EngFunc_PrecacheSound, WEAPON_SOUND_SHOOT);
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_VIEW);
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_PLAYER);
engfunc(EngFunc_PrecacheModel, WEAPON_MODEL_WORLD);
}
public zv_extra_item_selected(iPlayer, iItemID) {
if(iItemID == g_akmbb)
give_akmbb(iPlayer);
}
public HookSelect(iPlayer) {
engclient_cmd(iPlayer, WEAPON_OLD);
return PLUGIN_HANDLED;
}
public give_akmbb(iPlayer) {
static iEnt; iEnt = engfunc(EngFunc_CreateNamedEntity, g_AllocString_E);
if(iEnt <= 0) return 0;
set_pev(iEnt, pev_spawnflags, SF_NORESPAWN);
set_pev(iEnt, pev_impulse, WEAPON_KEY);
ExecuteHam(Ham_Spawn, iEnt);
UTIL_DropWeapon(iPlayer, 1);
if(!ExecuteHamB(Ham_AddPlayerItem, iPlayer, iEnt)) {
engfunc(EngFunc_RemoveEntity, iEnt);
return 0;
}
ExecuteHamB(Ham_Item_AttachToPlayer, iEnt, iPlayer);
set_pdata_int(iEnt, m_iClip, WEAPON_CLIP, 4);
new iAmmoType = m_rgAmmo +get_pdata_int(iEnt, m_iPrimaryAmmoType, 4);
if(get_pdata_int(iPlayer, m_rgAmmo, 5) < WEAPON_AMMO)
set_pdata_int(iPlayer, iAmmoType, WEAPON_AMMO, 5);
emit_sound(iPlayer, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
return 1;
}
public plugin_natives() {
register_native(WEAPON_NATIVE, "give_akmbb", 1);
}
public fw_Item_Deploy_Post(iItem) {
if(!CustomItem(iItem)) return;
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
if(get_user_flags(iPlayer) & ADMIN_BAN) {
set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
set_pev(iPlayer, pev_body, 11);
}
else {
set_pev_string(iPlayer, pev_viewmodel2, g_AllocString_V);
}
set_pev_string(iPlayer, pev_weaponmodel2, g_AllocString_P);
UTIL_SendWeaponAnim(iPlayer, ANIM_DRAW);
set_pdata_float(iPlayer, m_flNextAttack, ANIM_DRAW_TIME, 5);
set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_DRAW_TIME, 4);
}
public fw_Item_PostFrame(iItem) {
if(!CustomItem(iItem)) return HAM_IGNORED;
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
if(get_pdata_int(iItem, m_fInReload, 4) == 1) {
static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
static iAmmo; iAmmo = get_pdata_int(iPlayer, iAmmoType, 5);
static j; j = min(WEAPON_CLIP - iClip, iAmmo);
set_pdata_int(iItem, m_iClip, iClip+j, 4);
set_pdata_int(iPlayer, iAmmoType, iAmmo-j, 5);
set_pdata_int(iItem, m_fInReload, 0, 4);
}
else switch(get_pdata_int(iItem, m_iWeaponState, 4) ) {
case 0: {
if(get_pdata_float(iItem, m_flNextSecondaryAttack, 4) <= 0.0)
if(pev(iPlayer, pev_button) & IN_ATTACK2) {
set_pdata_int(iPlayer, m_iFOV, get_pdata_int(iPlayer, m_iFOV, 5) == 90 ? 70 : 90);
set_pdata_float(iItem, m_flNextSecondaryAttack, 0.3, 4);
}
}
}
return HAM_IGNORED;
}
public fw_Item_AddToPlayer_Post(iItem, iPlayer) {
switch(pev(iItem, pev_impulse)) {
case WEAPON_KEY: s_weaponlist(iPlayer, true);
case 0: s_weaponlist(iPlayer, false);
}
}
public fw_Weapon_Reload(iItem) {
if(!CustomItem(iItem)) return HAM_IGNORED;
static iClip; iClip = get_pdata_int(iItem, m_iClip, 4);
if(iClip >= WEAPON_CLIP) return HAM_SUPERCEDE;
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
static iAmmoType; iAmmoType = m_rgAmmo + get_pdata_int(iItem, m_iPrimaryAmmoType, 4);
if(get_pdata_int(iPlayer, iAmmoType, 5) <= 0) return HAM_SUPERCEDE
if(get_pdata_int(iPlayer, m_iFOV, 5) != 90) set_pdata_int(iPlayer, m_iFOV, 90, 5);
set_pdata_int(iItem, m_iClip, 0, 4);
ExecuteHam(Ham_Weapon_Reload, iItem);
set_pdata_int(iItem, m_iClip, iClip, 4);
set_pdata_int(iItem, m_fInReload, 1, 4);
set_pdata_float(iItem, m_flNextPrimaryAttack, ANIM_RELOAD_TIME, 4);
set_pdata_float(iItem, m_flNextSecondaryAttack, ANIM_RELOAD_TIME, 4);
set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_RELOAD_TIME, 4);
set_pdata_float(iPlayer, m_flNextAttack, ANIM_RELOAD_TIME, 5);
UTIL_SendWeaponAnim(iPlayer, ANIM_RELOAD);
return HAM_SUPERCEDE;
}
public fw_Weapon_WeaponIdle(iItem) {
if(!CustomItem(iItem) || get_pdata_float(iItem, m_flTimeWeaponIdle, 4) > 0.0) return HAM_IGNORED;
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
UTIL_SendWeaponAnim(iPlayer, ANIM_IDLE);
set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_IDLE_TIME, 4);
return HAM_SUPERCEDE;
}
public fw_Weapon_PrimaryAttack(iItem) {
if(!CustomItem(iItem)) return HAM_IGNORED;
static iPlayer; iPlayer = get_pdata_cbase(iItem, m_pPlayer, 4);
if(get_pdata_int(iItem, m_iClip, 4) == 0) {
ExecuteHam(Ham_Weapon_PlayEmptySound, iItem);
set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, 4);
return HAM_SUPERCEDE;
}
fm_ham_hook(true);
state FireBullets: Enabled;
ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
state FireBullets: Disabled;
fm_ham_hook(false);
static Float:vecPunchangle[3];
pev(iPlayer, pev_punchangle, vecPunchangle);
vecPunchangle[0] *= WEAPON_RECOIL;
vecPunchangle[1] *= WEAPON_RECOIL;
vecPunchangle[2] *= WEAPON_RECOIL;
set_pev(iPlayer, pev_punchangle, vecPunchangle);
emit_sound(iPlayer, CHAN_WEAPON, WEAPON_SOUND_SHOOT, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
UTIL_SendWeaponAnim(iPlayer, ANIM_ATTACK);
set_pdata_float(iItem, m_flNextPrimaryAttack, WEAPON_RATE, 4);
set_pdata_float(iItem, m_flTimeWeaponIdle, ANIM_SHOOT_TIME, 4);
return HAM_SUPERCEDE;
}
public fw_PlaybackEvent() <FireBullets: Enabled> { return FMRES_SUPERCEDE; }
public fw_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
public fw_PlaybackEvent() <> { return FMRES_IGNORED; }
public fw_TraceAttack(iVictim, iAttacker, Float:flDamage) {
if(!is_user_connected(iAttacker)) return;
static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
if(iItem <= 0 || !CustomItem(iItem)) return;
SetHamParamFloat(3, flDamage * WEAPON_DAMAGE);
}
public fw_UpdateClientData_Post(iPlayer, SendWeapons, CD_Handle) {
if(get_cd(CD_Handle, CD_DeadFlag) != DEAD_NO) return;
static iItem; iItem = get_pdata_cbase(iPlayer, m_pActiveItem, 5);
if(iItem <= 0 || !CustomItem(iItem)) return;
set_cd(CD_Handle, CD_flNextAttack, 999999.0);
}
public fw_SetModel(iEnt) {
static i, szClassname[32], iItem;
pev(iEnt, pev_classname, szClassname, 31);
if(!equal(szClassname, "weaponbox")) return FMRES_IGNORED;
for(i = 0; i < 6; i++) {
iItem = get_pdata_cbase(iEnt, m_rgpPlayerItems_CWeaponBox + i, 4);
if(iItem > 0 && CustomItem(iItem)) {
engfunc(EngFunc_SetModel, iEnt, WEAPON_MODEL_WORLD);
set_pev(iEnt, pev_body, WEAPON_BODY);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public fw_TraceAttack_Post(pEntity, iAttacker, Float:flDamage, Float:direction[3], tr, damage_type) {
if(!is_user_connected(iAttacker) || !(damage_type & DMG_BULLET)) return;
static iItem; iItem = get_pdata_cbase(iAttacker, m_pActiveItem, 5);
if(!CustomItem(iItem)) return;
new Float:flvecEnd[3], Float:vecPlane[3];
get_tr2(tr, TR_vecEndPos, flvecEnd);
get_tr2(tr, TR_vecPlaneNormal, vecPlane);
xs_vec_mul_scalar(vecPlane, 5.0, vecPlane);
if(!is_user_alive(pEntity)) {
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_GUNSHOTDECAL);
engfunc(EngFunc_WriteCoord, flvecEnd[0]);
engfunc(EngFunc_WriteCoord, flvecEnd[1]);
engfunc(EngFunc_WriteCoord, flvecEnd[2]);
write_short(pEntity);
write_byte(random_num(41, 45));
message_end();
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_STREAK_SPLASH);
engfunc(EngFunc_WriteCoord, flvecEnd[0]);
engfunc(EngFunc_WriteCoord, flvecEnd[1]);
engfunc(EngFunc_WriteCoord, flvecEnd[2]);
write_coord(random_num(-20, 20));
write_coord(random_num(-20, 20));
write_coord(random_num(-20, 20));
write_byte(3);
write_short(35);
write_short(3);
write_short(75);
message_end();
}
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(TE_EXPLOSION);
engfunc(EngFunc_WriteCoord, flvecEnd[0]);
engfunc(EngFunc_WriteCoord, flvecEnd[1]);
engfunc(EngFunc_WriteCoord, flvecEnd[2]);
write_short(g_iSpriteHit);
write_byte(3);
write_byte(15);
write_byte(TE_EXPLFLAG_NOSOUND|TE_EXPLFLAG_NODLIGHTS|TE_EXPLFLAG_NOPARTICLES);
message_end();
}
public fm_ham_hook(bool:on) {
if(on) {
EnableHamForward(g_fw_TraceAttack[0]);
EnableHamForward(g_fw_TraceAttack[1]);
EnableHamForward(g_fw_TraceAttack[2]);
EnableHamForward(g_fw_TraceAttack[3]);
}
else {
DisableHamForward(g_fw_TraceAttack[0]);
DisableHamForward(g_fw_TraceAttack[1]);
DisableHamForward(g_fw_TraceAttack[2]);
DisableHamForward(g_fw_TraceAttack[3]);
}
}
stock UTIL_SendWeaponAnim(iPlayer, iAnim) {
set_pev(iPlayer, pev_weaponanim, iAnim);
message_begin(MSG_ONE, SVC_WEAPONANIM, _, iPlayer);
write_byte(iAnim);
write_byte(0);
message_end();
}
stock UTIL_DropWeapon(iPlayer, iSlot) {
static iEntity, iNext, szWeaponName[32];
iEntity = get_pdata_cbase(iPlayer, m_rpgPlayerItems + iSlot, 5);
if(iEntity > 0) {
do {
iNext = get_pdata_cbase(iEntity, m_pNext, 4)
if(get_weaponname(get_pdata_int(iEntity, m_iId, 4), szWeaponName, 31)) {
engclient_cmd(iPlayer, "drop", szWeaponName);
}
} while(( iEntity = iNext) > 0);
}
}
stock s_weaponlist(iPlayer, bool:on) {
message_begin(MSG_ONE, g_iMsgID_Weaponlist, _, iPlayer);
write_string(on ? WEAPON_NEW : WEAPON_OLD);
write_byte(iWeaponList[0]);
write_byte(on ? WEAPON_AMMO : iWeaponList[1]);
write_byte(iWeaponList[2]);
write_byte(iWeaponList[3]);
write_byte(iWeaponList[4]);
write_byte(iWeaponList[5]);
write_byte(iWeaponList[6]);
write_byte(iWeaponList[7]);
message_end();
}
stock UTIL_PrecacheSoundsFromModel( const szModelPath[] ) {
new iFile;
if ( ( iFile = fopen( szModelPath, "rt" ) ) ) {
new szSoundPath[ 64 ];
new iNumSeq, iSeqIndex;
new iEvent, iNumEvents, iEventIndex;
fseek( iFile, 164, SEEK_SET );
fread( iFile, iNumSeq, BLOCK_INT );
fread( iFile, iSeqIndex, BLOCK_INT );
for ( new k, i = 0; i < iNumSeq; i++ ) {
fseek( iFile, iSeqIndex + 48 + 176 * i, SEEK_SET );
fread( iFile, iNumEvents, BLOCK_INT );
fread( iFile, iEventIndex, BLOCK_INT );
fseek( iFile, iEventIndex + 176 * i, SEEK_SET );
for ( k = 0; k < iNumEvents; k++ ) {
fseek( iFile, iEventIndex + 4 + 76 * k, SEEK_SET );
fread( iFile, iEvent, BLOCK_INT );
fseek( iFile, 4, SEEK_CUR );
if ( iEvent != 5004 )
continue;
fread_blocks( iFile, szSoundPath, 64, BLOCK_CHAR );
if ( strlen( szSoundPath ) ) {
strtolower( szSoundPath );
precache_sound( szSoundPath );
}
}
}
}
fclose(iFile);
}
stock UTIL_PrecacheSpritesFromTxt(const szWeaponList[]) {
new szTxtDir[64], szSprDir[64];
new szFileData[128], szSprName[48], temp[1];
format(szTxtDir, charsmax(szTxtDir), "sprites/%s.txt", szWeaponList);
engfunc(EngFunc_PrecacheGeneric, szTxtDir);
new iFile = fopen(szTxtDir, "rb");
while(iFile && !feof(iFile)) {
fgets(iFile, szFileData, charsmax(szFileData));
trim(szFileData);
if(!strlen(szFileData))
continue;
new pos = containi(szFileData, "640");
if(pos == -1)
continue;
format(szFileData, charsmax(szFileData), "%s", szFileData[pos+3]);
trim(szFileData);
strtok(szFileData, szSprName, charsmax(szSprName), temp, charsmax(temp), ' ', 1);
trim(szSprName);
format(szSprDir, charsmax(szSprDir), "sprites/%s.spr", szSprName);
engfunc(EngFunc_PrecacheGeneric, szSprDir);
}
if(iFile) fclose(iFile);
}