25/08/2019, 11:53 AM
Hola necesito que me ayuden a quitarle el friendly fire a esta arma ya que al usar el click derecho ataca como en el CSNZ y con sus animaciones pero mata a la persona que este usando el arma haga ese ataque
CODIGO
CODIGO
Código PHP:
#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#define PLUGIN "[ZP] Extra: CSO Weapon Dual Beretta Gunslinger"
#define VERSION "0.1"
#define AUTHOR "KORD_12.7"
#pragma ctrlchar '\'
#pragma compress 1
//**********************************************
//* Weapon Settings. *
//**********************************************
// Main
#define WEAPON_KEY 9753153
#define WEAPON_NAME "weapon_buffbaretta"
#define WEAPON_NAME2 "weapon_buffbaretta2"
#define WEAPON_REFERANCE "weapon_usp"
#define WEAPON_MAX_CLIP 36
#define WEAPON_DEFAULT_AMMO 100
#define WEAPON_MULTIPLIER_DAMAGE 1.15
#define WEAPON_RADIUS_DAMAGE_ATTACK random_float(30.0, 70.0)
#define WEAPON_RADIUS_ATTACK 250.0
#define WEAPON_KNOCKBACK_POWER 500.0
#define WEAPON_TIME_NEXT_IDLE 3.0
#define WEAPON_TIME_NEXT_ATTACK 0.07
#define WEAPON_TIME_DELAY_DEPLOY 1.0
#define WEAPON_TIME_DELAY_RELOAD 2.0
#define ZP_ITEM_NAME "Dual Beretta Gunslinger"
#define MODEL_VIEW "models/v_buffbarreta_fix3.mdl"
#define MODEL_PLAYER "models/p_buffbaretta.mdl"
#define MODEL_PLAYER3 "models/ef_scorpion_hole.mdl"
#define MODEL_WORLD "models/w_buffbaretta.mdl"
#define MODEL_MAN "models/ef_man.mdl"
// Sounds
#define SOUND_FIRE "weapons/gunkata-1.wav"
#define SOUND_EXP "weapons/gunkata_skill_last_exp.wav"
#define SOUND_HIT "weapons/turbulent9_hit1.wav"
#define SOUND_HIT2 "weapons/turbulent9_hit2.wav"
// Sprites
#define WEAPON_HUD_TXT "sprites/weapon_buffbaretta.txt"
#define WEAPON_HUD_TXT2 "sprites/weapon_buffbaretta2.txt"
#define WEAPON_HUD_SPR_1 "sprites/640hud176.spr"
#define WEAPON_HUD_SPR_2 "sprites/640hud18_2.spr"
#define WEAPON_HUD_SPR_HIT "sprites/640hudnull.spr"
#define WEAPON_SPR_MUZZLE "sprites/muzzleflash77.spr"
// Animation
#define ANIM_EXTENSION "dualpistols"
// Animation sequences
enum
{
ANIM_IDLE_A,
ANIM_IDLE_B,
ANIM_SHOOT_A,
ANIM_SHOOT_LAST_A,
ANIM_SHOOT_B,
ANIM_SHOOT_LAST_B,
ANIM_RELOAD_A,
ANIM_RELOAD_B,
ANIM_DRAW_A,
ANIM_DRAW_B,
ANIM_SKILL_LEVEL_1,
ANIM_SKILL_LEVEL_2,
ANIM_SKILL_LEVEL_3,
ANIM_SKILL_LEVEL_4,
ANIM_SKILL_LEVEL_5,
ANIM_SKILL_LAST
};
//**********************************************
//* Some macroses. *
//**********************************************
#define GET_ATTACHMENT(%0,%1,%2,%3) engfunc(EngFunc_GetAttachment, %0, %1, %2, %3)
#define GET_TIME(%0) get_pdata_float(%0, m_flLastEventCheck, extra_offset_weapon)
#define SET_TIME(%0,%1) set_pdata_float(%0, m_flLastEventCheck, %1, extra_offset_weapon)
#define MDLL_Spawn(%0) dllfunc(DLLFunc_Spawn, %0)
#define MDLL_Touch(%0,%1) dllfunc(DLLFunc_Touch, %0, %1)
#define SET_MODEL(%0,%1) engfunc(EngFunc_SetModel, %0, %1)
#define SET_ORIGIN(%0,%1) engfunc(EngFunc_SetOrigin, %0, %1)
#define PRECACHE_MODEL(%0) engfunc(EngFunc_PrecacheModel, %0)
#define PRECACHE_SOUND(%0) engfunc(EngFunc_PrecacheSound, %0)
#define PRECACHE_GENERIC(%0) engfunc(EngFunc_PrecacheGeneric, %0)
#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_STRING(%0) write_string(%0)
#define WRITE_SHORT(%0) write_short(%0)
#define BitSet(%0,%1) (%0 |= (1 << (%1 - 1)))
#define BitClear(%0,%1) (%0 &= ~(1 << (%1 - 1)))
#define BitCheck(%0,%1) (%0 & (1 << (%1 - 1)))
//**********************************************
//* PvData Offsets. *
//**********************************************
// Linux extra offsets
#define extra_offset_weapon 4
#define extra_offset_player 5
new g_bitIsConnected;
#define m_fInSuperBullets 30
#define m_rgpPlayerItems_CWeaponBox 34
#define m_flLastEventCheck 38
// CBasePlayerItem
#define m_pPlayer 41
#define m_pNext 42
// CBasePlayerWeapon
#define m_fFireOnEmpty 45
#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_iDirection 60
#define m_flAccuracy 62
#define m_iShotsFired 64
#define m_fWeaponState 74
#define m_flNextAttack 83
#define m_iLastZoom 109
#define m_fResumeZoom 110
// CBasePlayer
#define m_iFOV 363
#define m_rgpPlayerItems_CBasePlayer 367
#define m_pActiveItem 373
#define m_rgAmmo_CBasePlayer 376
#define m_szAnimExtention 492
#define IsValidPev(%0) (pev_valid(%0) == 2)
#define MUZZLE_CLASSNAME "MuzzleBuffBarreta"
#define EXPLODE_CLASSNAME "ExplodeModel"
#define MAN_CLASSNAME "ManModel"
#define SKILL_CLASSNAME "SkillModel"
//**********************************************
//* Let's code our weapon. *
//**********************************************
new iBlood[2];
Weapon_OnPrecache()
{
PRECACHE_SOUND_FROM_MODEL(MODEL_VIEW);
PRECACHE_MODEL(MODEL_VIEW);
PRECACHE_MODEL(MODEL_PLAYER);
PRECACHE_MODEL(MODEL_PLAYER3);
PRECACHE_MODEL(MODEL_WORLD);
PRECACHE_MODEL(MODEL_MAN);
PRECACHE_SOUND(SOUND_FIRE);
PRECACHE_SOUND(SOUND_EXP);
PRECACHE_SOUND(SOUND_HIT);
PRECACHE_SOUND(SOUND_HIT2);
PRECACHE_SOUND("weapons/gunkata_skill_01.wav");
PRECACHE_SOUND("weapons/gunkata_skill_02.wav");
PRECACHE_SOUND("weapons/gunkata_skill_03.wav");
PRECACHE_SOUND("weapons/gunkata_skill_04.wav");
PRECACHE_SOUND("weapons/gunkata_skill_05.wav");
PRECACHE_GENERIC(WEAPON_HUD_TXT);
PRECACHE_GENERIC(WEAPON_HUD_TXT2);
PRECACHE_GENERIC(WEAPON_HUD_SPR_1);
PRECACHE_GENERIC(WEAPON_HUD_SPR_2);
PRECACHE_GENERIC(WEAPON_HUD_SPR_HIT);
PRECACHE_MODEL(WEAPON_SPR_MUZZLE);
iBlood[0] = PRECACHE_MODEL("sprites/bloodspray.spr");
iBlood[1] = PRECACHE_MODEL("sprites/blood.spr");
}
Weapon_OnSpawn(const iItem)
{
// Setting world model.
SET_MODEL(iItem, MODEL_WORLD);
}
Weapon_OnDeploy(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iClip, iAmmoPrimary, iState
set_pdata_int(iItem, m_fInReload, 0, extra_offset_weapon);
set_pdata_string(iPlayer, m_szAnimExtention * 4, ANIM_EXTENSION, -1, extra_offset_player * 4);
set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_DELAY_DEPLOY, extra_offset_weapon);
set_pdata_float(iPlayer, m_flNextAttack, WEAPON_TIME_DELAY_DEPLOY, extra_offset_player);
new iAnim;
switch (iBullets)
{
case 1,2,3:iAnim=ANIM_DRAW_A
case 4,5,6:iAnim=ANIM_DRAW_B
}
Weapon_DefaultDeploy(iPlayer, MODEL_VIEW, MODEL_PLAYER, iAnim, ANIM_EXTENSION);
set_pev(iItem, pev_iuser1, 0);
set_pev(iItem, pev_iuser4, 0);
}
Weapon_OnHolster(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iPlayer, iClip, iBullets, iAmmoPrimary, iState
set_pdata_int(iItem, m_fInReload, 0, extra_offset_weapon);
set_pev(iItem, pev_iuser1, 0);
}
Weapon_OnIdle(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iClip, iAmmoPrimary, iState
ExecuteHamB(Ham_Weapon_ResetEmptySound, iItem);
if (get_pdata_float(iItem, m_flTimeWeaponIdle, extra_offset_weapon) > 0.0)
{
return;
}
new iAnim;
switch (iBullets)
{
case 1,2,3:iAnim=ANIM_IDLE_A
case 4,5,6:iAnim=ANIM_IDLE_B
}
Weapon_SendAnim(iPlayer, iAnim);
set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_NEXT_IDLE, extra_offset_weapon);
}
Weapon_OnReload(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iBullets, iState
if (min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary) <= 0 || pev(iItem, pev_fuser1))
{
return;
}
set_pdata_int(iItem, m_iClip, 0, extra_offset_weapon);
ExecuteHam(Ham_Weapon_Reload, iItem);
set_pdata_int(iItem, m_iClip, iClip, extra_offset_weapon);
static szAnimation[64];
formatex(szAnimation, charsmax(szAnimation), "ref_reload_%s", ANIM_EXTENSION);
Player_SetAnimation(iPlayer, szAnimation);
set_pdata_float(iPlayer, m_flNextAttack, WEAPON_TIME_DELAY_RELOAD, extra_offset_player);
set_pdata_float(iItem, m_flTimeWeaponIdle, WEAPON_TIME_DELAY_RELOAD, extra_offset_weapon);
Weapon_SendAnim(iPlayer, random_num(ANIM_RELOAD_A, ANIM_RELOAD_B));
}
Weapon_OnPrimaryAttack(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iAmmoPrimary, iState
if (iClip <= 0)
{
if (get_pdata_int(iItem, m_fFireOnEmpty, extra_offset_player))
{
ExecuteHamB(Ham_Weapon_PlayEmptySound, iItem);
set_pdata_float(iItem, m_flNextPrimaryAttack, 0.2, extra_offset_weapon);
}
return;
}
CallOrigFireBullets3(iItem);
static szAnimation[64];
switch (iBullets)
{
case 1:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_A, WEAPON_TIME_NEXT_ATTACK);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 1);
}
case 2:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_A, WEAPON_TIME_NEXT_ATTACK);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 1);
}
case 3:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_LAST_A, 0.4);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 1);
}
case 4:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_B, WEAPON_TIME_NEXT_ATTACK);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 3);
}
case 5:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_B, WEAPON_TIME_NEXT_ATTACK);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 3);
}
case 6:
{
Weapon_ShootAnim(iItem, iPlayer, ANIM_SHOOT_LAST_B, 0.4);
MuzzleFlash(iPlayer, WEAPON_SPR_MUZZLE, 0.06, 1.0, 3);
set_pdata_int(iItem, m_fInSuperBullets, 0, extra_offset_weapon);
}
}
formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION);
Player_SetAnimation(iPlayer, szAnimation);
set_pdata_int(iItem, m_iShotsFired, 0, extra_offset_weapon);
set_pdata_float(iItem, m_flAccuracy, 1.0, extra_offset_weapon);
set_pdata_int(iItem, m_fInSuperBullets, get_pdata_int(iItem, m_fInSuperBullets, extra_offset_weapon)+1, extra_offset_weapon);
Punchangle(iPlayer, .iVecx = - 1.0, .iVecy = 0.0, .iVecz = 0.0)
emit_sound(iPlayer, CHAN_WEAPON, SOUND_FIRE, 0.9, ATTN_NORM, 0, PITCH_NORM);
}
Weapon_OnSecondaryAttack(const iItem, const iPlayer, const iClip, const iBullets, const iState, const iAmmoPrimary)
{
#pragma unused iAmmoPrimary, iBullets
if (iClip <= 0)
{
Weapon_SendAnim(iPlayer, ANIM_SKILL_LAST);
set_pdata_float(iItem, m_flTimeWeaponIdle, 1.0, extra_offset_weapon);
set_pdata_float(iItem, m_flNextSecondaryAttack, 1.0, extra_offset_weapon);
set_pev(iItem, pev_fuser2, get_gametime() + 0.5);
set_pev(iItem, pev_iuser1, 1);
return;
}
#define ANIM_EXTENSION2 "grenade"
static szAnimation[64];formatex(szAnimation, charsmax(szAnimation), "ref_shoot_%s", ANIM_EXTENSION2);Player_SetAnimation(iPlayer, szAnimation);
static Float:StartPos[3];pev(iPlayer, pev_origin, StartPos);
switch (iState)
{
case 0:
{
Weapon_SkillAnim(iItem, iPlayer, ANIM_SKILL_LEVEL_1, 0.6);
Spawn_Man(iPlayer, 0, 6);
emit_sound(iPlayer, CHAN_WEAPON, "weapons/gunkata_skill_01.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fWeaponState, iState+1, extra_offset_weapon);
}
case 1:
{
Weapon_SkillAnim(iItem, iPlayer, ANIM_SKILL_LEVEL_2, 0.67);
Spawn_Man(iPlayer, 1, 7);
emit_sound(iPlayer, CHAN_WEAPON, "weapons/gunkata_skill_02.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fWeaponState, iState+1, extra_offset_weapon);
}
case 2:
{
Weapon_SkillAnim(iItem, iPlayer, ANIM_SKILL_LEVEL_3, 0.7);
Spawn_Man(iPlayer, 2, 8);
emit_sound(iPlayer, CHAN_WEAPON, "weapons/gunkata_skill_03.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fWeaponState, iState+1, extra_offset_weapon);
}
case 3:
{
Weapon_SkillAnim(iItem, iPlayer, ANIM_SKILL_LEVEL_4, 0.6);
Spawn_Man(iPlayer, 3, 9);
emit_sound(iPlayer, CHAN_WEAPON, "weapons/gunkata_skill_04.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fWeaponState, iState+1, extra_offset_weapon);
}
case 4:
{
Weapon_SkillAnim(iItem, iPlayer, ANIM_SKILL_LEVEL_5, 0.6);
Spawn_Man(iPlayer, random_num(4,5), random_num(10, 11));
emit_sound(iPlayer, CHAN_WEAPON, "weapons/gunkata_skill_05.wav", 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fWeaponState, 0, extra_offset_weapon);
}
}
}
Weapon_ShootAnim(const iItem, const iPlayer, const iAnim, const Float:iTime)
{
set_pdata_float(iItem, m_flTimeWeaponIdle, iTime + 0.4, extra_offset_weapon);
set_pdata_float(iItem, m_flNextPrimaryAttack, iTime, extra_offset_weapon);
set_pdata_float(iItem, m_flNextSecondaryAttack, iTime, extra_offset_weapon);
set_pdata_float(iPlayer, m_flNextAttack, iTime, extra_offset_player);
Weapon_SendAnim(iPlayer, iAnim);
}
Weapon_SkillAnim(const iItem, const iPlayer, const iAnim, const Float:iTime)
{
Weapon_SendAnim(iPlayer, iAnim);
set_pdata_float(iItem, m_flTimeWeaponIdle, iTime, extra_offset_weapon);
set_pdata_float(iItem, m_flNextPrimaryAttack, iTime, extra_offset_weapon);
set_pdata_float(iItem, m_flNextSecondaryAttack, iTime, extra_offset_weapon);
}
//*********************************************************************
//* Don't modify the code below this line unless *
//* you know _exactly_ what you are doing!!! *
//*********************************************************************
#define MSGID_WEAPONLIST 78
new g_iItemID;
#define IsCustomItem(%0) (pev(%0, pev_impulse) == WEAPON_KEY)
public plugin_precache()
{
Weapon_OnPrecache();
register_clcmd(WEAPON_NAME, "Cmd_WeaponSelect");
register_clcmd(WEAPON_NAME2, "Cmd_WeaponSelect");
register_message(MSGID_WEAPONLIST, "MsgHook_WeaponList");
register_message(get_user_msgid("DeathMsg"), "MsgHook_Death");
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_forward(FM_SetModel, "FakeMeta_SetModel", false);
register_forward(FM_PlaybackEvent, "FakeMeta_PlaybackEvent", false);
register_forward(FM_UpdateClientData, "FakeMeta_UpdateClientData_Post", true);
register_forward(FM_Think, "FakeMeta_Think", false);
// Weaponbox
RegisterHam(Ham_Spawn, "weaponbox", "HamHook_Weaponbox_Spawn_Post", true);
RegisterHam(Ham_TraceAttack, "func_breakable", "HamHook_Entity_TraceAttack", false);
RegisterHam(Ham_TraceAttack, "info_target", "HamHook_Entity_TraceAttack", false);
RegisterHam(Ham_TraceAttack, "player", "HamHook_Entity_TraceAttack", false);
RegisterHam(Ham_Item_Deploy, WEAPON_REFERANCE, "HamHook_Item_Deploy_Post", true);
RegisterHam(Ham_Item_Holster, WEAPON_REFERANCE, "HamHook_Item_Holster", false);
RegisterHam(Ham_Item_AddToPlayer, WEAPON_REFERANCE, "HamHook_Item_AddToPlayer", false);
RegisterHam(Ham_Item_PostFrame, WEAPON_REFERANCE, "HamHook_Item_PostFrame", false);
RegisterHam(Ham_Weapon_Reload, WEAPON_REFERANCE, "HamHook_Item_Reload", false);
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_REFERANCE, "HamHook_Item_WeaponIdle", false);
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_REFERANCE, "HamHook_Item_PrimaryAttack", false);
RegisterHam(Ham_Weapon_SecondaryAttack, WEAPON_REFERANCE, "HamHook_Item_SecondaryAttack", false);
RegisterHam(Ham_TakeDamage, "player", "HamHook_HamTakeDamage", false);
}
public plugin_natives( )
register_native( "arma_dualbuff", "zp_extra_item_selected", 1 )
public zp_extra_item_selected(id)
{
Weapon_Give(id);
}
//**********************************************
//* Block client weapon. *
//**********************************************
public FakeMeta_UpdateClientData_Post(const iPlayer, const iSendWeapons, const CD_Handle)
{
static iActiveItem;iActiveItem = get_pdata_cbase(iPlayer, m_pActiveItem, extra_offset_player);
static Float:flGameTime;flGameTime = get_gametime();
if (!IsValidPev(iActiveItem) || !IsCustomItem(iActiveItem))
{
return FMRES_IGNORED;
}
set_cd(CD_Handle, CD_flNextAttack, get_gametime() + 0.001);
if (GET_TIME(iActiveItem) && GET_TIME(iActiveItem) <= flGameTime)
{
MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, get_user_msgid("HideWeapon"), {0.0,0.0,0.0}, iPlayer);
WRITE_BYTE(1>>6);
MESSAGE_END();
MsgHook_WeaponList(MSGID_WEAPONLIST, iActiveItem, iPlayer, false);
MESSAGE_BEGIN(MSG_ONE, get_user_msgid("CurWeapon"), {0.0, 0.0, 0.0}, iPlayer);
WRITE_BYTE(1);
WRITE_BYTE(CSW_USP);
WRITE_BYTE(get_pdata_int(iActiveItem, m_iClip, extra_offset_weapon));
MESSAGE_END();
SET_TIME(iActiveItem, 0.0);
}
return FMRES_IGNORED;
}
//**********************************************
//* Item (weapon) hooks. *
//**********************************************
#define _call.%0(%1,%2) \
\
Weapon_On%0 \
( \
%1, \
%2, \
\
get_pdata_int(%1, m_iClip, extra_offset_weapon), \
get_pdata_int(%1, m_fInSuperBullets, extra_offset_weapon), \
get_pdata_int(%1, m_fWeaponState, extra_offset_weapon), \
GetAmmoInventory(%2, PrimaryAmmoIndex(%1)) \
)
public HamHook_Item_Deploy_Post(const iItem)
{
new iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
_call.Deploy(iItem, iPlayer);
return HAM_IGNORED;
}
public HamHook_Item_Holster(const iItem)
{
new iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
set_pev(iPlayer, pev_viewmodel, 0);
set_pev(iPlayer, pev_weaponmodel, 0);
_call.Holster(iItem, iPlayer);
return HAM_SUPERCEDE;
}
public HamHook_Item_WeaponIdle(const iItem)
{
static iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
_call.Idle(iItem, iPlayer);
return HAM_SUPERCEDE;
}
public HamHook_Item_Reload(const iItem)
{
static iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
_call.Reload(iItem, iPlayer);
return HAM_SUPERCEDE;
}
public HamHook_Item_PrimaryAttack(const iItem)
{
static iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
_call.PrimaryAttack(iItem, iPlayer);
return HAM_SUPERCEDE;
}
public HamHook_Item_SecondaryAttack(const iItem)
{
static iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
_call.SecondaryAttack(iItem, iPlayer);
return HAM_SUPERCEDE;
}
public HamHook_Item_PostFrame(const iItem)
{
static iPlayer;
if (!CheckItem(iItem, iPlayer))
{
return HAM_IGNORED;
}
if (get_pdata_int(iItem, m_fInReload, extra_offset_weapon))
{
new iClip = get_pdata_int(iItem, m_iClip, extra_offset_weapon);
new iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem);
new iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex);
new iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary);
set_pdata_int(iItem, m_iClip, iClip + iAmount, extra_offset_weapon);
set_pdata_int(iItem, m_fInReload, false, extra_offset_weapon);
SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount);
set_pdata_int(iItem, m_fInSuperBullets, 1, extra_offset_weapon);
set_pdata_int(iItem, m_fWeaponState, 0, extra_offset_weapon);
set_pev(iItem, pev_iuser1, 0);
}
static pevVictim; pevVictim = -1;
static Float:iTime2;pev(iItem, pev_fuser2, iTime2);
static Float:Origin[3];pev(iPlayer, pev_origin, Origin);
if (pev(iItem, pev_iuser1) && get_pdata_int(iItem, m_iClip, extra_offset_weapon) == 0 && iTime2 <= get_gametime())
{
static pevVictim; pevVictim = -1;
static Float:StartPos[3], iEntExp;pev(iPlayer, pev_origin, StartPos);StartPos[2] -= 30.0;
iEntExp = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
SET_MODEL(iEntExp, MODEL_PLAYER3);
SET_ORIGIN(iEntExp, StartPos);
set_pev(iEntExp, pev_classname, EXPLODE_CLASSNAME);
set_pev(iEntExp, pev_movetype, MOVETYPE_FLY);
set_pev(iEntExp, pev_solid, SOLID_NOT);
set_pev(iEntExp, pev_framerate, 1.0);
set_pev(iEntExp, pev_sequence, 1);
set_pev(iEntExp, pev_animtime, get_gametime())
set_pev(iEntExp, pev_nextthink, get_gametime() + 0.6);
while((pevVictim = engfunc(EngFunc_FindEntityInSphere, pevVictim, Origin, WEAPON_RADIUS_ATTACK)) != 0 )
{
if (!is_user_alive(pevVictim))continue;
CreateKnockBack(iPlayer, pevVictim, WEAPON_KNOCKBACK_POWER*3)
}
emit_sound(iPlayer, CHAN_ITEM, SOUND_EXP, 0.9, ATTN_NORM, 0, PITCH_NORM);
set_pdata_int(iItem, m_fInSuperBullets, 1, extra_offset_weapon);
set_pdata_int(iItem, m_fWeaponState, 0, extra_offset_weapon);
new iClip = get_pdata_int(iItem, m_iClip, extra_offset_weapon);
new iPrimaryAmmoIndex = PrimaryAmmoIndex(iItem);
new iAmmoPrimary = GetAmmoInventory(iPlayer, iPrimaryAmmoIndex);
new iAmount = min(WEAPON_MAX_CLIP - iClip, iAmmoPrimary);
set_pdata_int(iItem, m_iClip, iClip + iAmount, extra_offset_weapon);
set_pdata_int(iItem, m_fInReload, false, extra_offset_weapon);
SetAmmoInventory(iPlayer, iPrimaryAmmoIndex, iAmmoPrimary - iAmount);
set_pdata_float(iPlayer, m_flNextAttack, 0.8, extra_offset_player);
set_pev(iItem, pev_iuser1, 0);
set_pev(iItem, pev_fuser2, 0.0);
}
if (pev(iPlayer, pev_button) & IN_ATTACK2 && get_pdata_float(iPlayer, m_flNextAttack, extra_offset_player) <= 0.0)
{
if (get_pdata_int(iItem, m_iClip, extra_offset_weapon) <= 0)
{
return HAM_IGNORED;
}
while((pevVictim = engfunc(EngFunc_FindEntityInSphere, pevVictim, Origin, WEAPON_RADIUS_ATTACK)) != 0 )
{
if (!is_user_alive(pevVictim))continue;
new Float:vOrigin[3];pev(pevVictim, pev_origin, vOrigin);
message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
write_byte(TE_BLOODSPRITE);
WRITE_COORD(vOrigin[0]);
WRITE_COORD(vOrigin[1]);
WRITE_COORD(vOrigin[2]);
write_short(iBlood[0]);
write_short(iBlood[1]);
write_byte(76);
write_byte(10);
message_end();
switch (random(2))
{
case 0:emit_sound(iPlayer, CHAN_VOICE, SOUND_HIT, 0.5, ATTN_NORM, 0, PITCH_NORM);
case 1:emit_sound(iPlayer, CHAN_ITEM, SOUND_HIT2, 0.5, ATTN_NORM, 0, PITCH_NORM);
}
ExecuteHamB(Ham_TakeDamage, pevVictim, iPlayer, iPlayer, WEAPON_RADIUS_DAMAGE_ATTACK, DMG_BULLET);
}
set_pdata_int(iItem, m_iClip, get_pdata_int(iItem, m_iClip, extra_offset_weapon)-1, extra_offset_weapon);
set_pdata_float(iPlayer, m_flNextAttack, 0.11, extra_offset_player);
set_pev(iItem, pev_iuser4, 1);
}
else
{
if (!iTime2 && pev(iItem, pev_iuser4))
{
ExecuteHamB(Ham_Item_Deploy, iItem);
}
}
return HAM_IGNORED;
}
public HamHook_HamTakeDamage(const iVictim, const iInflictor, const iAttacker, const Float:fDamage, const iBitDamage)
{
static iItem;
if (!BitCheck(g_bitIsConnected, iAttacker) || !IsValidPev(iAttacker))
{
return;
}
iItem = get_pdata_cbase(iAttacker, m_pActiveItem, extra_offset_player);
if (!IsValidPev(iItem))
{
return;
}
}
//**********************************************
//* Fire Bullets. *
//**********************************************
CallOrigFireBullets3(const iItem)
{
static FakeMetaTraceLine;FakeMetaTraceLine=register_forward(FM_TraceLine,"FakeMeta_TraceLine",true)
state FireBullets: Enabled;
ExecuteHam(Ham_Weapon_PrimaryAttack, iItem);
state FireBullets: Disabled;
unregister_forward(FM_TraceLine,FakeMetaTraceLine,true)
}
public FakeMeta_TraceLine(Float:vecStart[3], Float:VecEnd[3], iFlags, Ignore, iTrase)// Chrescoe1
{
if (iFlags & IGNORE_MONSTERS)
{
return FMRES_IGNORED;
}
static iHit;
static Decal;
static glassdecal;
static Float:vecPlaneNormal[3];
static Float:vecEndPos[3];
iHit=get_tr2(iTrase,TR_pHit);
if (!glassdecal)
{
glassdecal=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)Decal=glassdecal;
else Decal=random_num(41,45);
else Decal=random_num(41,45);
get_tr2(iTrase, TR_vecEndPos, vecEndPos);
get_tr2(iTrase, TR_vecPlaneNormal, vecPlaneNormal);
MESSAGE_BEGIN(MSG_PAS, SVC_TEMPENTITY, vecEndPos, 0);
WRITE_BYTE(TE_GUNSHOTDECAL);
WRITE_COORD(vecEndPos[0]);
WRITE_COORD(vecEndPos[1]);
WRITE_COORD(vecEndPos[2]);
WRITE_SHORT(iHit > 0 ? iHit : 0);
WRITE_BYTE(Decal);
MESSAGE_END();
MESSAGE_BEGIN(MSG_PVS, SVC_TEMPENTITY, vecEndPos, 0);
WRITE_BYTE(TE_STREAK_SPLASH)
WRITE_COORD(vecEndPos[0]);
WRITE_COORD(vecEndPos[1]);
WRITE_COORD(vecEndPos[2]);
WRITE_COORD(vecPlaneNormal[0] * random_float(20.0,30.0));
WRITE_COORD(vecPlaneNormal[1] * random_float(20.0,30.0));
WRITE_COORD(vecPlaneNormal[2] * random_float(20.0,30.0));
WRITE_BYTE(26); //Colorid
WRITE_SHORT(10); //Count
WRITE_SHORT(3); //Speed
WRITE_SHORT(60); //Random speed
MESSAGE_END();
return FMRES_IGNORED;
}
public FakeMeta_Think(const iEnt)
{
if (!pev_valid(iEnt))
{
return FMRES_IGNORED;
}
static iClassname[32];pev(iEnt, pev_classname, iClassname, sizeof(iClassname));
static iAttacker;iAttacker = pev(iEnt, pev_owner);
if (equal(iClassname, EXPLODE_CLASSNAME))
{
set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
return FMRES_SUPERCEDE;
}
if (equal(iClassname, MAN_CLASSNAME))
{
static Float:iAmt;pev(iEnt, pev_renderamt, iAmt);
iAmt -= 20.0;
if (iAmt <= 0.0)
{
set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
return FMRES_SUPERCEDE;
}
set_pev(iEnt, pev_renderamt, iAmt);
set_pev(iEnt, pev_nextthink, get_gametime() + 0.1);
}
if (equal(iClassname, MUZZLE_CLASSNAME))
{
set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
return FMRES_SUPERCEDE;
}
if (equal(iClassname, SKILL_CLASSNAME))
{
static Float:iTime;pev(iEnt, pev_fuser4, iTime);
static Float:StartPos[3];GetPosition(iAttacker, 0.0, 0.0, 0.0, StartPos);
static Float:iAngles[3];pev(iAttacker, pev_v_angle, iAngles);
static Float:Angles[3];
Angles[0] = 360.0 - iAngles[0];
Angles[1] = iAngles[1];
Angles[2] = iAngles[2];
SET_ORIGIN(iEnt, StartPos);
set_pev(iEnt, pev_angles, Angles);
if (iTime <= get_gametime())
{
set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
return FMRES_SUPERCEDE;
}
set_pev(iEnt, pev_nextthink, get_gametime() + 0.01);
}
return FMRES_IGNORED;
}
public MsgHook_Death() <FireBullets: Enabled>
{
static szTruncatedWeaponName[32];
if (szTruncatedWeaponName[0] == EOS)
{
copy(szTruncatedWeaponName, charsmax(szTruncatedWeaponName), WEAPON_NAME);
replace(szTruncatedWeaponName, charsmax(szTruncatedWeaponName), "weapon_", "");
}
set_msg_arg_string(4, szTruncatedWeaponName);
}
public FakeMeta_PlaybackEvent() <FireBullets: Enabled>
{
return FMRES_SUPERCEDE;
}
public HamHook_Entity_TraceAttack(const iEntity, const iAttacker, const Float: flDamage) <FireBullets: Enabled>
{
static iItem;
if (!BitCheck(g_bitIsConnected, iAttacker) || !IsValidPev(iAttacker))
{
return;
}
iItem = get_pdata_cbase(iAttacker, m_pActiveItem, extra_offset_player);
if (!IsValidPev(iItem))
{
return;
}
SetHamParamFloat(3, flDamage * WEAPON_MULTIPLIER_DAMAGE);
}
public MsgHook_Death() </* Empty statement */> { /* Fallback */ }
public MsgHook_Death() <FireBullets: Disabled> { /* Do notning */ }
public FakeMeta_PlaybackEvent() </* Empty statement */> { return FMRES_IGNORED; }
public FakeMeta_PlaybackEvent() <FireBullets: Disabled> { return FMRES_IGNORED; }
public HamHook_Entity_TraceAttack() </* Empty statement */> { /* Fallback */ }
public HamHook_Entity_TraceAttack() <FireBullets: Disabled> { /* Do notning */ }
//**********************************************
//* Create and check our custom weapon. *
//**********************************************
Weapon_Create(const Float: vecOrigin[3] = {0.0, 0.0, 0.0})
{
new iWeapon;
static iszAllocStringCached;
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, WEAPON_REFERANCE)))
{
iWeapon = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
}
if (!IsValidPev(iWeapon))
{
return FM_NULLENT;
}
MDLL_Spawn(iWeapon);
SET_ORIGIN(iWeapon, vecOrigin);
set_pdata_int(iWeapon, m_iClip, WEAPON_MAX_CLIP, extra_offset_weapon);
set_pdata_int(iWeapon, m_fInSuperBullets, 1, extra_offset_weapon);
set_pev(iWeapon, pev_impulse, WEAPON_KEY);
set_pev(iWeapon, pev_angles, {0.0, 0.0, 0.0});
Weapon_OnSpawn(iWeapon);
return iWeapon;
}
Weapon_Give(const iPlayer)
{
if (!IsValidPev(iPlayer))
{
return FM_NULLENT;
}
new iWeapon, Float: vecOrigin[3];
pev(iPlayer, pev_origin, vecOrigin);
if ((iWeapon = Weapon_Create(vecOrigin)) != FM_NULLENT)
{
Player_DropWeapons(iPlayer, ExecuteHamB(Ham_Item_ItemSlot, iWeapon));
set_pev(iWeapon, pev_spawnflags, pev(iWeapon, pev_spawnflags) | SF_NORESPAWN);
MDLL_Touch(iWeapon, iPlayer);
SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iWeapon), WEAPON_DEFAULT_AMMO);
return iWeapon;
}
return FM_NULLENT;
}
Player_DropWeapons(const iPlayer, const iSlot)
{
new szWeaponName[32], iItem = get_pdata_cbase(iPlayer, m_rgpPlayerItems_CBasePlayer + iSlot, extra_offset_player);
while (IsValidPev(iItem))
{
pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName));
engclient_cmd(iPlayer, "drop", szWeaponName);
iItem = get_pdata_cbase(iItem, m_pNext, extra_offset_weapon);
}
}
Weapon_SendAnim(const iPlayer, const iAnim)
{
set_pev(iPlayer, pev_weaponanim, iAnim);
MESSAGE_BEGIN(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0.0, 0.0, 0.0}, iPlayer);
WRITE_BYTE(iAnim);
WRITE_BYTE(0);
MESSAGE_END();
}
stock Punchangle(iPlayer, Float:iVecx = 0.0, Float:iVecy = 0.0, Float:iVecz = 0.0)
{
static Float:iVec[3];pev(iPlayer, pev_punchangle,iVec);
iVec[0] = iVecx;iVec[1] = iVecy;iVec[2] = iVecz
set_pev(iPlayer, pev_punchangle, iVec);
}
stock Weapon_DefaultDeploy(const iPlayer, const szViewModel[], const szWeaponModel[], const iAnim, const szAnimExt[])
{
set_pev(iPlayer, pev_viewmodel2, szViewModel);
set_pev(iPlayer, pev_weaponmodel2, szWeaponModel);
set_pev(iPlayer, pev_fov, 89.0);
set_pdata_int(iPlayer, m_iFOV, 89, extra_offset_player);
set_pdata_int(iPlayer, m_fResumeZoom, 0, extra_offset_player);
set_pdata_int(iPlayer, m_iLastZoom, 89, extra_offset_player);
set_pdata_string(iPlayer, m_szAnimExtention * 4, szAnimExt, -1, extra_offset_player * 4);
Weapon_SendAnim(iPlayer, iAnim);
}
stock Player_SetAnimation(const iPlayer, const szAnim[])
{
#define ACT_RANGE_ATTACK1 28
// Linux extra offsets
#define extra_offset_animating 4
// CBaseAnimating
#define m_flFrameRate 36
#define m_flGroundSpeed 37
#define m_flLastEventCheck 38
#define m_fSequenceFinished 39
#define m_fSequenceLoops 40
// CBaseMonster
#define m_Activity 73
#define m_IdealActivity 74
// CBasePlayer
#define m_flLastAttackTime 220
new iAnimDesired, Float: flFrameRate, Float: flGroundSpeed, bool: bLoops;
if ((iAnimDesired = lookup_sequence(iPlayer, szAnim, flFrameRate, bLoops, flGroundSpeed)) == -1)
{
iAnimDesired = 0;
}
new Float: flGametime = get_gametime();
set_pev(iPlayer, pev_frame, 0.0);
set_pev(iPlayer, pev_framerate, 1.0);
set_pev(iPlayer, pev_animtime, flGametime );
set_pev(iPlayer, pev_sequence, iAnimDesired);
set_pdata_int(iPlayer, m_fSequenceLoops, bLoops, extra_offset_animating);
set_pdata_int(iPlayer, m_fSequenceFinished, 0, extra_offset_animating);
set_pdata_float(iPlayer, m_flFrameRate, flFrameRate, extra_offset_animating);
set_pdata_float(iPlayer, m_flGroundSpeed, flGroundSpeed, extra_offset_animating);
set_pdata_float(iPlayer, m_flLastEventCheck, flGametime , extra_offset_animating);
set_pdata_int(iPlayer, m_Activity, ACT_RANGE_ATTACK1, extra_offset_player);
set_pdata_int(iPlayer, m_IdealActivity, ACT_RANGE_ATTACK1, extra_offset_player);
set_pdata_float(iPlayer, m_flLastAttackTime, flGametime , extra_offset_player);
}
stock Spawn_Man(const iPlayer, const iSec, const iSecDuck)
{
static Float:StartPos[3];pev(iPlayer, pev_origin, StartPos);
static Float:Angle[3];pev(iPlayer, pev_angles, Angle);
static iFlags;iFlags = (pev(iPlayer, pev_flags) & FL_DUCKING)
static iszAllocStringCached;
static iEntity;
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
{
iEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
}
//static currentmodel[32];fm_cs_get_user_model(iPlayer, currentmodel, charsmax(currentmodel));
//fm_cs_set_user_model_index(iEntity, currentmodel);
//static model[100];formatex(model, charsmax(model), "models/player/%s/%s.mdl", currentmodel, currentmodel)
//SET_MODEL(iEntity, model);
SET_MODEL(iEntity, MODEL_MAN);
SET_ORIGIN(iEntity, StartPos);
set_pev(iEntity, pev_classname, MAN_CLASSNAME);
set_pev(iEntity, pev_movetype, MOVETYPE_NONE);
set_pev(iEntity, pev_solid, SOLID_NOT);
set_pev(iEntity, pev_framerate, 1.0);
set_pev(iEntity, pev_sequence, iFlags ? iSecDuck:iSec);
set_pev(iEntity, pev_owner, iPlayer);
set_pev(iEntity, pev_rendermode, kRenderTransAdd);
set_pev(iEntity, pev_renderfx, kRenderFxHologram);
set_pev(iEntity, pev_renderamt, 255.0);
set_pev(iEntity, pev_angles, Angle);
set_pev(iEntity, pev_animtime, get_gametime());
set_pev(iEntity, pev_nextthink, get_gametime() + 0.01);
}
public Spawn_Skill(const iPlayer, const iSec, const Float:iTime)
{
static Float:StartPos[3];GetPosition(iPlayer, 0.0, 0.0, 0.0, StartPos);
static Float:iAngles[3];pev(iPlayer, pev_v_angle, iAngles);
static Float:Angles[3];
static iszAllocStringCached;
static iEntity;
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
{
iEntity = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached)
}
Angles[0] = 360.0 - iAngles[0];
Angles[1] = iAngles[1];
Angles[2] = iAngles[2];
SET_MODEL(iEntity, MODEL_VIEW);
SET_ORIGIN(iEntity, StartPos);
set_pev(iEntity, pev_classname, SKILL_CLASSNAME);
set_pev(iEntity, pev_movetype, MOVETYPE_FOLLOW);
set_pev(iEntity, pev_solid, SOLID_NOT);
set_pev(iEntity, pev_owner, iPlayer);
set_pev(iEntity, pev_animtime ,get_gametime())
set_pev(iEntity, pev_framerate, 0.8);
set_pev(iEntity, pev_sequence, iSec);
set_pev(iEntity, pev_angles, Angles);
set_pev(iEntity, pev_velocity, {0.01,0.01,0.01});
set_pev(iEntity, pev_fuser4, get_gametime() + iTime);
set_pev(iEntity, pev_nextthink, get_gametime() + 0.01);
set_pev(iEntity, pev_flags, pev(iEntity, pev_flags) &~ (1<<8));
}
stock CreateKnockBack(iAttacker, iVictim, Float:fMulti)
{
new Float:vVictim[3], Float:vAttacker[3];pev(iVictim, pev_origin, vVictim);pev(iAttacker, pev_origin, vAttacker);
new Float:vVelocity[3];pev(iVictim, pev_velocity, vVelocity);vVictim[2] += 10.0;
xs_vec_sub(vVictim, vAttacker, vVictim);
xs_vec_normalize(vVictim, vVictim);
xs_vec_mul_scalar(vVictim, fMulti, vVictim);
xs_vec_add(vVelocity, vVictim, vVelocity);
set_pev(iVictim, pev_velocity, vVictim);
}
stock GetPosition(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
static Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3];
pev(id, pev_origin, vOrigin);
pev(id, pev_view_ofs, vUp);
xs_vec_add(vOrigin, vUp, vOrigin);
pev(id, pev_v_angle, vAngle);
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward);
angle_vector(vAngle, ANGLEVECTOR_RIGHT, vRight);
angle_vector(vAngle, ANGLEVECTOR_UP, vUp);
vStart[0] = vOrigin[0] + vForward[0] * forw + vRight[0] * right + vUp[0] * up;
vStart[1] = vOrigin[1] + vForward[1] * forw + vRight[1] * right + vUp[1] * up;
vStart[2] = vOrigin[2] + vForward[2] * forw + vRight[2] * right + vUp[2] * up;
}
public client_putinserver(id)
{
BitSet(g_bitIsConnected, id);
}
public client_disconnected(id)
{
BitClear(g_bitIsConnected, id);
}
bool: CheckItem(const iItem, &iPlayer)
{
if (!IsValidPev(iItem) || !IsCustomItem(iItem))
{
return false;
}
iPlayer = get_pdata_cbase(iItem, m_pPlayer, extra_offset_weapon);
if (!IsValidPev(iPlayer) || !BitCheck(g_bitIsConnected, iPlayer))
{
return false;
}
return true;
}
//**********************************************
//* Weapon list update. *
//**********************************************
public Cmd_WeaponSelect(const iPlayer)
{
engclient_cmd(iPlayer, WEAPON_REFERANCE);
return PLUGIN_HANDLED;
}
public HamHook_Item_AddToPlayer(const iItem, const iPlayer)
{
if (!IsValidPev(iItem) || !IsValidPev(iPlayer))
{
return HAM_IGNORED;
}
switch(pev(iItem, pev_impulse))
{
case 0:
{
MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer, false);
}
case WEAPON_KEY:
{
MsgHook_WeaponList(MSGID_WEAPONLIST, iItem, iPlayer, false);
SetAmmoInventory(iPlayer, PrimaryAmmoIndex(iItem), pev(iItem, pev_iuser2));
MESSAGE_BEGIN(MSG_ONE, get_user_msgid("AmmoPickup"), {0.0,0.0,0.0}, iPlayer);
WRITE_BYTE(6); // Ammoid
WRITE_BYTE(get_pdata_int(iItem, m_iClip, extra_offset_weapon)); // Ammount
MESSAGE_END();
}
}
return HAM_IGNORED;
}
public MsgHook_WeaponList(const iMsgID, const iMsgDest, const iMsgEntity, bool:iSet)
{
static arrWeaponListData[8];
if (!iMsgEntity)
{
new szWeaponName[32];
get_msg_arg_string(1, szWeaponName, charsmax(szWeaponName));
if (!strcmp(szWeaponName, WEAPON_REFERANCE))
{
for (new i, a = sizeof arrWeaponListData; i < a; i++)
{
arrWeaponListData[i] = get_msg_arg_int(i + 2);
}
}
}
else
{
if (!IsCustomItem(iMsgDest) && pev(iMsgDest, pev_impulse))
{
return;
}
MESSAGE_BEGIN(MSG_ONE, iMsgID, {0.0, 0.0, 0.0}, iMsgEntity);
WRITE_STRING(IsCustomItem(iMsgDest) ? iSet ? WEAPON_NAME2 : WEAPON_NAME : WEAPON_REFERANCE);
for (new i, a = sizeof arrWeaponListData; i < a; i++)
{
WRITE_BYTE(arrWeaponListData[i]);
}
MESSAGE_END();
}
}
//**********************************************
//* Muzzleflash stuff. *
//**********************************************
stock Sprite_SetTransparency(const iSprite, const iRendermode, const Float: vecColor[3], const Float: flAmt, const iFx = kRenderFxNone)
{
set_pev(iSprite, pev_rendermode, iRendermode);
set_pev(iSprite, pev_rendercolor, vecColor);
set_pev(iSprite, pev_renderamt, flAmt);
set_pev(iSprite, pev_renderfx, iFx);
}
stock MuzzleFlash(const iPlayer, const szMuzzleSprite[], const Float: flScale, const Float: flFramerate, const iBody)
{
if (global_get(glb_maxEntities) - engfunc(EngFunc_NumberOfEntities) < 100)
{
return FM_NULLENT;
}
static iSprite, iszAllocStringCached;
if (iszAllocStringCached || (iszAllocStringCached = engfunc(EngFunc_AllocString, "info_target")))
{
iSprite = engfunc(EngFunc_CreateNamedEntity, iszAllocStringCached);
}
if (!IsValidPev(iSprite))
{
return FM_NULLENT;
}
static Float:iAngles[3];pev(iSprite, pev_angles, iAngles);iAngles[2] = random_float(0.0, 180.0);
static Float:Origin[3], Float:Angles[3];GET_ATTACHMENT(iPlayer, 0, Origin, Angles);
SET_MODEL(iSprite, szMuzzleSprite);
SET_ORIGIN(iSprite, Origin);
set_pev(iSprite, pev_classname, MUZZLE_CLASSNAME);
set_pev(iSprite, pev_owner, iPlayer);
set_pev(iSprite, pev_movetype, MOVETYPE_FOLLOW);
set_pev(iSprite, pev_skin, iPlayer);
set_pev(iSprite, pev_body, iBody);
set_pev(iSprite, pev_frame, 0.0);
Sprite_SetTransparency(iSprite, kRenderTransAdd, Float:{250.0,250.0,250.0}, 250.0);
set_pev(iSprite, pev_framerate, flFramerate);
set_pev(iSprite, pev_scale, flScale);
set_pev(iSprite, pev_angles, iAngles);
set_pev(iSprite, pev_nextthink, get_gametime() + 0.03);
return iSprite;
}
//**********************************************
//* Weaponbox world model. *
//**********************************************
public HamHook_Weaponbox_Spawn_Post(const iWeaponBox)
{
if (IsValidPev(iWeaponBox))
{
state (IsValidPev(pev(iWeaponBox, pev_owner))) WeaponBox: Enabled;
}
return HAM_IGNORED;
}
public FakeMeta_SetModel(const iEntity) <WeaponBox: Enabled>
{
state WeaponBox: Disabled;
if (!IsValidPev(iEntity))
{
return FMRES_IGNORED;
}
#define MAX_ITEM_TYPES 6
for (new i, iItem; i < MAX_ITEM_TYPES; i++)
{
iItem = get_pdata_cbase(iEntity, m_rgpPlayerItems_CWeaponBox + i, extra_offset_weapon);
if (IsValidPev(iItem) && IsCustomItem(iItem))
{
SET_MODEL(iEntity, MODEL_WORLD);
set_pev(iItem, pev_iuser2, GetAmmoInventory(pev(iEntity,pev_owner), PrimaryAmmoIndex(iItem)))
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public FakeMeta_SetModel() </* Empty statement */> { /* Fallback */ return FMRES_IGNORED; }
public FakeMeta_SetModel() < WeaponBox: Disabled > { /* Do nothing */ return FMRES_IGNORED; }
//**********************************************
//* Ammo Inventory. *
//**********************************************
PrimaryAmmoIndex(const iItem)
{
return get_pdata_int(iItem, m_iPrimaryAmmoType, extra_offset_weapon);
}
GetAmmoInventory(const iPlayer, const iAmmoIndex)
{
if (iAmmoIndex == -1)
{
return -1;
}
return get_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, extra_offset_player);
}
SetAmmoInventory(const iPlayer, const iAmmoIndex, const iAmount)
{
if (iAmmoIndex == -1)
{
return 0;
}
set_pdata_int(iPlayer, m_rgAmmo_CBasePlayer + iAmmoIndex, iAmount, extra_offset_player);
return 1;
}
PRECACHE_SOUND_FROM_MODEL(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);
}