This is what happens when i do admin_gluon "my name" , i recieve an ordinary m249
it doesn't shoot at first but when you click R it reloads and goes back to normal m249 then it starts to be m249 why?
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <beams>
#include <fakemeta>
#include <hamsandwich>
// Access for admin flag
#define ADMIN_EGON ADMIN_RESERVATION
// Weapon name. If you change it, dont forget to change it in HUD_SPRITES too!!!
new const EGON_NAME[] = "weapon_egon"
// Weapon models
new const EGON_MODEL_V[] = "models/v_egon.mdl"
new const EGON_MODEL_P[] = "models/p_egon.mdl"
new const EGON_MODEL_W[] = "models/w_egon.mdl"
// Weapon sounds
new const EGON_SOUND_OFF[] = "weapons/egon_off1.wav"
new const EGON_SOUND_RUN[] = "weapons/egon_run3.wav"
new const EGON_SOUND_STARTUP[] = "weapons/egon_windup2.wav"
// Beam sprites
new const EGON_BEAM_SPRITE[] = "sprites/xbeam1.spr"
// Weapon sprites
new const HUD_SPRITES[][] =
{
"sprites/weapon_egon.txt", // MUST match with EGON_NAME
"sprites/weapon_egon.spr"
};
// View model animation sequences
#define EGON_SEQ_DEPLOY 3
#define EGON_SEQ_SHOOT1 1 //primary attack
#define EGON_SEQ_SHOOT2 2 //secondary attack
// Ammo
#define EGON_DEFAULT_AMMO 100 // Ammo given when buy
#define EGON_MAX_CARRY 200 // Maximum ammo player can carry
// Damage
#define EGON_DAMAGE 20.0 // Primary attack
#define EGON_DAMAGE2 10.0 // Secondary attack
// Radius damage(only for primary attack)
#define EGON_RADIUS_DAMAGE EGON_DAMAGE/4.0
#define EGON_RADIUS 128.0
// Ammo use
#define EGON_AMMOUSE 0.2 // Ammo use primary attack
#define EGON_AMMOUSE2 0.1 // Ammo use secondary attack
// How often damage will be done
#define EGON_PULSE_INTERVAL 0.1 // Secondary attack
#define EGON_DISCHARGE_INTERVAL 0.1 // Primary attack
// This also enables custom unused secondary attack which
// was supposed to be in Half-Life, but was cut. To disable
// it just comment this line.
#define USE_BETA_SECONDARY_ATTACK
//=====================================================================
new g_bsBlockAttack;
enum _:eFireState
{
FIRE_OFF = 0,
FIRE_CHARGE
};
enum _:eFireMode
{
FIRE_WIDE = 0,
FIRE_NARROW
};
new g_iMaxClients;
new gmsgWeaponList;
new gmsgShake;
const PRIMARY_WEAPONS_BITSUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
new const WEAPON_ENT[] = "weapon_m249";
#define m_rgpPlayerItems_CWeaponBox 34
#define m_pPlayer 41
#define m_flNextPrimaryAttack 46
#define m_flNextSecondaryAttack 47
#define m_flTimeWeaponIdle 48
#define m_iClip 51
#define m_iDefaultAmmo 56
#define m_iWeaponVolume 239
#define m_rgPlayerAmmoSlot 376
#define pev_fireState pev_iuser2
#define pev_fireMode pev_iuser3
#define pev_shakeTime pev_fuser3
#define pev_pBeam pev_euser1
#define pev_pNoise pev_euser2
#define pev_flAmmoUseTime pev_fuser2
#define EGON_IMPULSE 46928
#define ValidPrivateData(%0) (pev_valid(%0) == 2)
#define IsEgon(%0) (pev(%0, pev_iuser1) == EGON_IMPULSE)
#define GetOwner(%0) (get_pdata_cbase(%0, 41, 4))
#define Instance(%0) (%0 == -1 ? 0 : %0)
#define IsClient(%0) (1 <= %0 <= g_iMaxClients)
#define STOP_SOUND(%0,%1,%2) emit_sound(%0, %1, %2, 0.0, ATTN_NORM, SND_STOP, 0)
#define VectorMA(%0,%1,%2,%3) (%3[0] = %0[0] + %1[0] * %2, %3[1] = %0[1] + %1[1] * %2, %3[2] = %0[2] + %1[2] * %2)
#define VectorAdd(%0,%1,%2) (%2[0] = %0[0] + %1[0], %2[1] = %0[1] + %1[1], %2[2] = %0[2] + %1[2])
#define VectorSub(%0,%1,%2) (%2[0] = %0[0] - %1[0], %2[1] = %0[1] - %1[1], %2[2] = %0[2] - %1[2])
#define VectorLength(%0) (floatsqroot(%0[0]*%0[0] + %0[1]*%0[1] + %0[2]*%0[2]))
#define FBitSet(%0,%1) (%0 & (1 << (%1 & 31)))
#define SetBits(%0,%1) (%0 |= (1 << (%1 & 31)))
#define ClearBits(%0,%1) (%0 &= ~(1 << (%1 & 31)))
public plugin_precache()
{
precache_model(EGON_MODEL_V);
precache_model(EGON_MODEL_P);
precache_model(EGON_MODEL_W);
precache_sound(EGON_SOUND_OFF);
precache_sound(EGON_SOUND_RUN);
precache_sound(EGON_SOUND_STARTUP);
precache_model(EGON_BEAM_SPRITE);
for (new i = 0; i < sizeof HUD_SPRITES; i++)
precache_generic(HUD_SPRITES[i]);
RegisterHam(Ham_Spawn, WEAPON_ENT, "EgonSpawn");
}
public plugin_init()
{
register_plugin("[ZP[ Extra Item: Gluon Gun", "1.0", "NiHiLaNTh");
register_clcmd(EGON_NAME, "EgonSwitch");
register_concmd("admin_gluon", "EgonGive", ADMIN_EGON, "<target> - Give a Gluon Gun to the player");
register_forward(FM_SetModel, "fw_SetModel");
register_forward(FM_UpdateClientData, "fw_UpdateClientData", 1);
RegisterHam(Ham_Item_AddToPlayer, WEAPON_ENT, "EgonAddToPlayer", 1);
RegisterHam(Ham_Item_Deploy, WEAPON_ENT, "EgonDeploy", 1);
RegisterHam(Ham_Item_Holster, WEAPON_ENT, "EgonHolster");
RegisterHam(Ham_Weapon_PrimaryAttack, WEAPON_ENT, "EgonPrimaryAttack");
RegisterHam(Ham_Weapon_Reload, WEAPON_ENT, "EgonReload");
#if defined USE_BETA_SECONDARY_ATTACK
RegisterHam(Ham_Item_PostFrame, WEAPON_ENT, "EgonPostFrame");
#endif
RegisterHam(Ham_Weapon_WeaponIdle, WEAPON_ENT, "EgonWeaponIdle");
gmsgWeaponList = get_user_msgid("WeaponList");
gmsgShake = get_user_msgid("ScreenShake");
g_iMaxClients = get_maxplayers();
}
public EgonSwitch(pPlayer)
{
engclient_cmd(pPlayer, WEAPON_ENT);
return PLUGIN_HANDLED;
}
public EgonGive(pPlayer, iLevel, cId)
{
if (!cmd_access(pPlayer, iLevel, cId, 2))
{
return PLUGIN_HANDLED;
}
new szArg[32]; read_argv(1, szArg, charsmax(szArg));
new pTarget = cmd_target(pPlayer, szArg, (CMDTARGET_ONLY_ALIVE | CMDTARGET_ALLOW_SELF));
if (!pTarget)
{
return PLUGIN_HANDLED;
}
DropWeapons(pTarget);
GiveNamedItem(pTarget, WEAPON_ENT, EGON_IMPULSE);
client_print(pTarget, print_chat, "[AMXX] ADMIN gave a you free gluon gun.");
return PLUGIN_HANDLED;
}
public fw_SetModel(pEntity, const szModel[])
{
if (!pev_valid(pEntity))
return FMRES_IGNORED;
new szClass[32]; pev(pEntity, pev_classname, szClass, charsmax(szClass));
if (!equal(szClass, "weaponbox"))
return FMRES_IGNORED;
new pWeapon = -1;
for (new i = 0; i < 6; i++)
{
pWeapon = get_pdata_cbase(pEntity, m_rgpPlayerItems_CWeaponBox + i, 4);
if (pWeapon > 0 && IsEgon(pWeapon))
{
engfunc(EngFunc_SetModel, pEntity, EGON_MODEL_W);
return FMRES_SUPERCEDE;
}
}
return FMRES_IGNORED;
}
public fw_UpdateClientData(pPlayer, SendWeapons, hClientData)
{
if (!FBitSet(g_bsBlockAttack, pPlayer))
return FMRES_IGNORED;
set_cd(hClientData, CD_flNextAttack, get_gametime() + 0.001);
return FMRES_HANDLED;
}
public EgonSpawn(pWeapon)
{
if (!IsEgon(pWeapon) || !ValidPrivateData(pWeapon))
return;
set_pdata_int(pWeapon, m_iClip, -1, 4);
set_pdata_int(pWeapon, m_iDefaultAmmo, EGON_DEFAULT_AMMO, 4);
}
public EgonAddToPlayer(pWeapon, pPlayer)
{
if (IsEgon(pWeapon))
{
message_begin(MSG_ONE, gmsgWeaponList, .player = pPlayer);
write_string(EGON_NAME);
write_byte(3);
write_byte(EGON_MAX_CARRY);
write_byte(-1);
write_byte(-1);
write_byte(0);
write_byte(4);
write_byte(CSW_M249);
write_byte(0);
message_end();
}
}
public EgonDeploy(pWeapon)
{
if (!IsEgon(pWeapon) || !ValidPrivateData(pWeapon))
return;
new pPlayer = GetOwner(pWeapon);
SetBits(g_bsBlockAttack, pPlayer);
set_pev(pPlayer, pev_viewmodel2, EGON_MODEL_V);
set_pev(pPlayer, pev_weaponmodel2, EGON_MODEL_P);
SendWeaponAnim(pPlayer, EGON_SEQ_DEPLOY);
set_pev(pWeapon, pev_fireState, FIRE_OFF);
}
public EgonHolster(pWeapon)
{
if (!IsEgon(pWeapon) || !ValidPrivateData(pWeapon))
return;
new pPlayer = GetOwner(pWeapon);
ClearBits(g_bsBlockAttack, pPlayer);
EndAttack(pWeapon, pPlayer, pev(pWeapon, pev_fireState));
}
public EgonPrimaryAttack(pWeapon)
{
if (!IsEgon(pWeapon) || !ValidPrivateData(pWeapon))
return HAM_IGNORED;
set_pev(pWeapon, pev_fireMode, FIRE_WIDE);
Attack(pWeapon, GetOwner(pWeapon));
return HAM_SUPERCEDE;
}
public EgonReload(pWeapon)
{
if (!IsEgon(pWeapon))
return HAM_IGNORED;
return HAM_SUPERCEDE;
}
#if defined USE_BETA_SECONDARY_ATTACK
public EgonPostFrame(pWeapon)
{
if (!IsEgon(pWeapon))
return HAM_IGNORED;
static pPlayer; pPlayer = GetOwner(pWeapon);
static buttons; buttons = pev(pPlayer, pev_button);
if ((buttons & IN_ATTACK2) && get_pdata_float(pWeapon, m_flNextSecondaryAttack, 4) <= 0.0)
{
set_pev(pWeapon, pev_fireMode, FIRE_NARROW);
Attack(pWeapon, pPlayer);
set_pev(pPlayer, pev_button, buttons & ~IN_ATTACK2);
return HAM_SUPERCEDE;
}
return HAM_IGNORED;
}
#endif
public EgonWeaponIdle(pWeapon)
{
if (!IsEgon(pWeapon) || !ValidPrivateData(pWeapon))
return;
static iFireState;
if ((iFireState = pev(pWeapon, pev_fireState)) != FIRE_OFF)
EndAttack(pWeapon, GetOwner(pWeapon), iFireState);
}
Attack(pWeapon, pPlayer)
{
new iFireState = pev(pWeapon, pev_fireState);
if (pev(pPlayer, pev_waterlevel) == 3)
{
if (iFireState != FIRE_OFF || pev_valid(pev(pWeapon, pev_pBeam)))
{
EndAttack(pWeapon, pPlayer, iFireState);
}
else
{
ExecuteHam(Ham_Weapon_PlayEmptySound, pWeapon);
}
return;
}
new Float:tTime = get_gametime();
switch (iFireState)
{
case FIRE_OFF:
{
if (!HasAmmo(pPlayer))
{
set_pdata_float(pWeapon, m_flNextPrimaryAttack, 0.25, 4);
set_pdata_float(pWeapon, m_flNextSecondaryAttack, 0.25, 4);
ExecuteHam(Ham_Weapon_PlayEmptySound, pWeapon);
return;
}
set_pev(pWeapon, pev_flAmmoUseTime, tTime);
EgonFireEvent(pPlayer, pev(pWeapon, pev_fireMode), true);
set_pev(pWeapon, pev_shakeTime, 0.0);
set_pdata_int(pPlayer, m_iWeaponVolume, 450);
set_pdata_float(pWeapon, m_flTimeWeaponIdle, 0.1, 4);
set_pev(pWeapon, pev_fuser1, get_gametime() + 2.0);
set_pev(pWeapon, pev_dmgtime, get_gametime() + EGON_PULSE_INTERVAL);
set_pev(pWeapon, pev_fireState, FIRE_CHARGE);
}
case FIRE_CHARGE:
{
UTIL_MakeVectors(pPlayer);
new Float:vecSrc[3]; GetGunPosition(pPlayer, vecSrc);
new Float:vecAiming[3]; global_get(glb_v_forward, vecAiming);
Fire(pWeapon, pPlayer, vecSrc, vecAiming);
set_pdata_int(pPlayer, m_iWeaponVolume, 450);
new Float:flNextEvent; pev(pWeapon, pev_fuser1, flNextEvent);
if (flNextEvent <= get_gametime())
{
EgonFireEvent(pPlayer, pev(pWeapon, pev_fireMode), false);
set_pev(pWeapon, pev_fuser1, 1000.0);
}
if (!HasAmmo(pPlayer))
{
EndAttack(pWeapon, pPlayer, iFireState);
set_pdata_float(pWeapon, m_flNextPrimaryAttack, 1.0, 4);
set_pdata_float(pWeapon, m_flNextSecondaryAttack, 1.0, 4);
}
}
}
}
Fire(pWeapon, pPlayer, Float:vecOrigSrc[3], Float:vecDir[3])
{
new Float:vecDest[3]; VectorMA(vecOrigSrc, vecDir, 2048.0, vecDest);
new tr = create_tr2();
engfunc(EngFunc_TraceLine, vecOrigSrc, vecDest, DONT_IGNORE_MONSTERS, pPlayer, tr);
if (get_tr2(tr, TR_AllSolid))
return;
new pEntity = Instance(get_tr2(tr, TR_pHit));
new Float:timedist;
new Float:flDMGTime; pev(pWeapon, pev_dmgtime, flDMGTime)
new Float:tTime = get_gametime();
new Float:vecEndPos[3]; get_tr2(tr, TR_vecEndPos, vecEndPos);
switch (pev(pWeapon, pev_fireMode))
{
case FIRE_NARROW:
{
if (flDMGTime < tTime)
{
new Float:flTakeDamage; pev(pEntity, pev_takedamage, flTakeDamage);
if (flTakeDamage != DAMAGE_NO)
{
ExecuteHamB(Ham_TraceAttack, pEntity, pPlayer, EGON_DAMAGE2, vecDir, tr, DMG_ENERGYBEAM);
ExecuteHamB(Ham_TakeDamage, pEntity, pPlayer, pPlayer, EGON_DAMAGE2, DMG_ENERGYBEAM);
}
new Float:flAmmoUseTime; pev(pWeapon, pev_flAmmoUseTime, flAmmoUseTime);
if (tTime >= flAmmoUseTime)
{
set_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 3, get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 3) - 1);
set_pev(pWeapon, pev_flAmmoUseTime, tTime + EGON_AMMOUSE2);
}
set_pev(pWeapon, pev_dmgtime, tTime + EGON_PULSE_INTERVAL);
}
timedist = (flDMGTime - tTime) / EGON_PULSE_INTERVAL;
}
case FIRE_WIDE:
{
if (flDMGTime < tTime)
{
new Float:flTakeDamage; pev(pEntity, pev_takedamage, flTakeDamage);
if (flTakeDamage != DAMAGE_NO)
{
ExecuteHamB(Ham_TraceAttack, pEntity, pPlayer, EGON_DAMAGE, vecDir, tr, DMG_ENERGYBEAM|DMG_ALWAYSGIB);
ExecuteHamB(Ham_TakeDamage, pEntity, pPlayer, pPlayer, EGON_DAMAGE, DMG_ENERGYBEAM|DMG_ALWAYSGIB);
}
new Float:vecEndPos[3]; get_tr2(tr, TR_vecEndPos, vecEndPos);
RadiusDamage3(vecEndPos, pWeapon, pPlayer, EGON_RADIUS_DAMAGE, EGON_RADIUS, DMG_ENERGYBEAM|DMG_ALWAYSGIB);
if (!ExecuteHam(Ham_IsAlive, pPlayer))
{
return;
}
new Float:flAmmoUseTime; pev(pWeapon, pev_flAmmoUseTime, flAmmoUseTime);
if (tTime >= flAmmoUseTime)
{
set_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 3, get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 3) - 1);
set_pev(pWeapon, pev_flAmmoUseTime, tTime + EGON_AMMOUSE);
}
set_pev(pWeapon, pev_dmgtime, tTime + EGON_DISCHARGE_INTERVAL);
new Float:flShakeTime; pev(pWeapon, pev_shakeTime, flShakeTime);
if (flShakeTime < tTime)
{
UTIL_ScreenShake(vecEndPos, 5.0, 150.0, 0.75, 250.0);
set_pev(pWeapon, pev_shakeTime, tTime + 1.5);
}
}
timedist = (flDMGTime - tTime) / EGON_DISCHARGE_INTERVAL;
}
}
if (timedist < 0.0)
timedist = 0.0;
else if (timedist > 1.0)
timedist = 1.0;
timedist = 1.0 - timedist;
UpdateEffect(pWeapon, pPlayer, vecEndPos, timedist);
free_tr2(tr);
}
UpdateEffect(pWeapon, pPlayer, Float:endPoint[3], Float:timeBlend)
{
new pBeam = pev(pWeapon, pev_pBeam);
if (!pev_valid(pBeam))
{
CreateEffect(pWeapon, pPlayer);
pBeam = pev(pWeapon, pev_pBeam);
if (!pev_valid(pBeam))
return;
}
Beam_SetStartPos(pBeam, endPoint);
Beam_SetBrightness(pBeam, 255.0 - (timeBlend * 180.0));
Beam_SetWidth(pBeam, 40.0 - (timeBlend * 20.0));
new Float:vecColor[3];
if (pev(pWeapon, pev_fireMode) == FIRE_WIDE)
{
vecColor[0] = 30.0 + (25.0 * timeBlend);
vecColor[1] = 30.0 + (30.0 * timeBlend);
vecColor[2] = 64.0 + 80.0 * floatabs(floatsin(get_gametime() * 1.0));
}
else
{
vecColor[0] = 30.0 + (25.0 * timeBlend);
vecColor[1] = 120.0 + (30.0 * timeBlend);
vecColor[2] = 64.0 + 80.0 * floatabs(floatsin(get_gametime() * 1.0));
}
Beam_SetColor(pBeam, vecColor);
pBeam = pev(pWeapon, pev_pNoise);
if (pev_valid(pBeam))
{
Beam_SetStartPos(pBeam, endPoint);
}
}
CreateEffect(pWeapon, pPlayer)
{
DestroyEffect(pWeapon);
new Float:origin[3]; pev(pPlayer, pev_origin, origin);
new pBeam = Beam_Create(EGON_BEAM_SPRITE, 40.0);
Beam_PointEntInit(pBeam, origin, pPlayer);
Beam_SetFlags(pBeam, BEAM_FSINE);
Beam_SetEndAttachment(pBeam, 1);
set_pev(pBeam, pev_spawnflags, pev(pBeam, pev_spawnflags) | SF_BEAM_TEMPORARY);
set_pev(pBeam, pev_owner, pPlayer);
new pNoise = Beam_Create(EGON_BEAM_SPRITE, 55.0);
Beam_PointEntInit(pNoise, origin, pPlayer);
Beam_SetScrollRate(pNoise, 25.0);
Beam_SetBrightness(pNoise, 100.0);
Beam_SetEndAttachment(pNoise, 1);
set_pev(pNoise, pev_spawnflags, pev(pNoise, pev_spawnflags) | SF_BEAM_TEMPORARY);
set_pev(pNoise, pev_owner, pPlayer);
if (pev(pWeapon, pev_fireMode) == FIRE_WIDE)
{
Beam_SetScrollRate(pBeam, 50.0);
Beam_SetNoise(pBeam, 20);
Beam_SetColor(pNoise, Float:{50.0, 50.0, 255.0});
Beam_SetNoise(pNoise, 8);
}
else
{
Beam_SetScrollRate(pBeam, 110.0);
Beam_SetNoise(pBeam, 5);
Beam_SetColor(pNoise, Float:{80.0, 120.0, 255.0});
Beam_SetNoise(pNoise, 2);
}
set_pev(pWeapon, pev_pBeam, pBeam);
set_pev(pWeapon, pev_pNoise, pNoise);
}
EndAttack(pWeapon, pPlayer, iFireState)
{
if (iFireState != FIRE_OFF)
{
set_pev(pWeapon, pev_fireState, FIRE_OFF);
STOP_SOUND(pPlayer, CHAN_STATIC, EGON_SOUND_RUN);
emit_sound(pPlayer, CHAN_WEAPON, EGON_SOUND_OFF, 0.98, ATTN_NORM, 0, 100);
}
set_pdata_float(pWeapon, m_flTimeWeaponIdle, 2.0, 4);
set_pdata_float(pWeapon, m_flNextPrimaryAttack, 0.5, 4);
set_pdata_float(pWeapon, m_flNextSecondaryAttack, 0.5, 4);
DestroyEffect(pWeapon);
}
DestroyEffect(pWeapon)
{
new pBeam = pev(pWeapon, pev_pBeam);
if (pev_valid(pBeam))
{
engfunc(EngFunc_RemoveEntity, pBeam);
set_pev(pWeapon, pev_pBeam, -1);
}
new pNoise = pev(pWeapon, pev_pNoise);
if (pev_valid(pNoise))
{
engfunc(EngFunc_RemoveEntity, pNoise);
set_pev(pWeapon, pev_pNoise, -1);
}
}
EgonFireEvent(pPlayer, iFireMode, bool:bStartup)
{
if (bStartup)
{
if (iFireMode == FIRE_WIDE)
emit_sound(pPlayer, CHAN_WEAPON, EGON_SOUND_STARTUP, 0.98, ATTN_NORM, 0, 125);
else
emit_sound(pPlayer, CHAN_WEAPON, EGON_SOUND_STARTUP, 0.9, ATTN_NORM, 0, 100);
}
else
{
if (iFireMode == FIRE_WIDE)
emit_sound(pPlayer, CHAN_STATIC, EGON_SOUND_RUN, 0.98, ATTN_NORM, 0, 125);
else
emit_sound(pPlayer, CHAN_STATIC, EGON_SOUND_RUN, 0.9, ATTN_NORM, 0, 100);
}
SendWeaponAnim(pPlayer, iFireMode == FIRE_WIDE ? EGON_SEQ_SHOOT1 : EGON_SEQ_SHOOT2);
}
bool:HasAmmo(pPlayer)
{
if (get_pdata_int(pPlayer, m_rgPlayerAmmoSlot + 3) <= 0)
return false;
return true;
}
GetGunPosition(pPlayer, Float:vecSrc[3])
{
new Float:origin[3]; pev(pPlayer, pev_origin, origin);
new Float:view_ofs[3]; pev(pPlayer, pev_view_ofs, view_ofs);
VectorAdd(origin, view_ofs, vecSrc);
}
SendWeaponAnim(pPlayer, iAnimIndex)
{
set_pev(pPlayer, pev_weaponanim, iAnimIndex);
message_begin(MSG_ONE, SVC_WEAPONANIM, .player = pPlayer);
write_byte(iAnimIndex);
write_byte(0);
message_end();
//TODO. Add weapon anims for the observers
}
BodyTarget(pEntity, Float:vecSrc[3])
{
new Float:origin[3]; pev(pEntity, pev_origin, origin);
if (IsClient(pEntity))
{
new Float:view_ofs[3]; pev(pEntity, pev_view_ofs, view_ofs);
VectorAdd(origin, view_ofs, origin);
}
vecSrc = origin;
}
RadiusDamage3(Float:vecSrc[3], pevInflictor, pevAttacker, Float:flDamage, Float:flRadius, bitsDamageType)
{
new pEntity = -1;
new tr = create_tr2();
new Float:flAdjustedDamage, Float:falloff;
new Float:vecSpot[3];
if (flRadius > 0)
falloff = flDamage / flRadius;
else
falloff = 1.0;
new bool:bInWater = bool:(engfunc(EngFunc_PointContents, vecSrc) == CONTENTS_WATER);
vecSrc[2] += 1.0;
if (!pevAttacker)
pevAttacker = pevInflictor;
while ((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecSrc, flRadius)) != 0)
{
static Float:flTakeDamage; pev(pEntity, pev_takedamage, flTakeDamage);
if (flTakeDamage != DAMAGE_NO)
{
if (bInWater && pev(pEntity, pev_waterlevel) == 0)
continue;
if (!bInWater && pev(pEntity, pev_waterlevel) == 3)
continue;
BodyTarget(pEntity, vecSrc);
engfunc(EngFunc_TraceLine, vecSrc, vecSpot, DONT_IGNORE_MONSTERS, pevInflictor, tr);
static Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
if (flFraction == 1.0 || get_tr2(tr, TR_pHit) == pEntity)
{
if (get_tr2(tr, TR_StartSolid))
{
set_tr2(tr, TR_vecEndPos, vecSrc);
set_tr2(tr, TR_flFraction, 0.0);
flFraction = 0.0;
}
static Float:vecEnd[3]; get_tr2(tr, TR_vecEndPos, vecEnd);
VectorSub(vecSrc, vecEnd, vecEnd);
flAdjustedDamage = VectorLength(vecEnd) * falloff;
flAdjustedDamage = flDamage - flAdjustedDamage;
if (flAdjustedDamage < 0)
{
flAdjustedDamage = 0.0;
}
ExecuteHamB(Ham_TakeDamage, pEntity, pevInflictor, pevAttacker, flAdjustedDamage, bitsDamageType);
}
}
}
}
UTIL_MakeVectors(pPlayer)
{
new Float:v_angle[3], Float:punchangle[3];
pev(pPlayer, pev_v_angle, v_angle);
pev(pPlayer, pev_punchangle, punchangle);
VectorAdd(v_angle, punchangle, v_angle);
engfunc(EngFunc_MakeVectors, v_angle);
}
UTIL_ScreenShake(Float:center[3], Float:amplitude, Float:frequency, Float:duration, Float:radius)
{
new i;
new Float:localAmplitude;
new finalDuration = FixedUnsigned16(duration, 1<<12);
new finalFrequency = FixedUnsigned16(frequency, 1<<8);
for (i = 1; i <= g_iMaxClients; i++)
{
if (!is_user_alive(i) || !(pev(i, pev_flags) & FL_ONGROUND))
continue;
localAmplitude = 0.0;
if (radius <= 0)
{
localAmplitude = amplitude;
}
else
{
static Float:delta[3], Float:origin[3];
pev(i, pev_origin, origin);
VectorSub(center, origin, delta);
static Float:distance; distance = VectorLength(delta);
if (distance < radius)
localAmplitude = amplitude;
}
if (localAmplitude)
{
static finalAmplitude; finalAmplitude = FixedUnsigned16(localAmplitude, 1<<12);
message_begin(MSG_ONE, gmsgShake, .player = i);
write_short(finalAmplitude);
write_short(finalDuration);
write_short(finalFrequency);
message_end();
}
}
}
FixedUnsigned16(Float:value, scale)
{
new output = floatround(value * scale);
if (output < 0)
output = 0;
else if (output > 0xFFFF)
output = 0xFFFF;
return output;
}
DropWeapons(pPlayer)
{
new aWeapons[32], numWeapons, index, iWeaponIndex;
get_user_weapons(pPlayer, aWeapons, numWeapons);
for (index = 0; index < numWeapons; index++)
{
iWeaponIndex = aWeapons[index];
if ((1<<iWeaponIndex) & PRIMARY_WEAPONS_BITSUM)
{
new szWeapon[32];
get_weaponname(iWeaponIndex, szWeapon, charsmax(szWeapon));
engclient_cmd(pPlayer, "drop", szWeapon);
}
}
}
GiveNamedItem(pPlayer, const szWeapon[], iWeaponIndex)
{
new pEntity = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, szWeapon));
if (!pev_valid(pEntity))
{
return 0;
}
new Float:vecSrc[3]; pev(pPlayer, pev_origin, vecSrc);
set_pev(pEntity, pev_origin, vecSrc);
set_pev(pEntity, pev_iuser1, iWeaponIndex);
set_pev(pEntity, pev_spawnflags, pev(pEntity, pev_spawnflags) | SF_NORESPAWN);
dllfunc(DLLFunc_Spawn, pEntity);
new iSavedSolid = pev(pEntity, pev_solid);
dllfunc(DLLFunc_Touch, pEntity, pPlayer);
if (pev(pEntity, pev_solid) != iSavedSolid)
{
return pEntity;
}
engfunc(EngFunc_RemoveEntity, pEntity);
return -1;
}
/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par }
*/