Hello, can someone fix this thing? It causes tryalloc error in my server, I don't know why. I can't find other alternatives of this plugin.
PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <xs>
#include <zp50_core>
#include <reapi>
#include <crxknives>
#define PLUGIN "[ZP] Knife: Miracle Prism Sword"
#define VERSION "1.2"
#define AUTHOR "Asdian DX"
#define CSW_MAGICKNIFE CSW_KNIFE
#define weapon_magicknife "weapon_knife"
#define v_model "models/gcg_csze/v_magicknife.mdl"
#define p_model "models/gcg_csze/p_magicknife.mdl"
#define spr_wpn "knife_magicknife"
new const weapon_sound[][] =
{
"weapons/magicknife_slash1.wav", // 0
"weapons/magicknife_slash2.wav", // 1
"weapons/magicknife_slash3.wav", // 2
"weapons/magicknife_slash4.wav", // 3
"weapons/magicknife_slash_end.wav", // 4
"weapons/magicknife_draw.wav", // 5
"weapons/magicknife_charge_start.wav", // 6
"weapons/magicknife_charge_idle2_1.wav", // 7
"weapons/magicknife_charge_idle2_2.wav", // 8
"weapons/magicknife_charge_finish.wav", // 9
"weapons/magicknife_charge_attack2.wav", // 10
"weapons/magicknife_magic_start.wav", // 11
"weapons/magicknife_magic_end.wav", // 12
"weapons/magicknife_magic_hit.wav", // 13
"weapons/magicknife_magic_end.wav", // 14
"weapons/tomahawk_slash1_hit.wav", // 15
"weapons/tomahawk_slash2_hit.wav", // 16
"weapons/combatknife_wall.wav" // 17
}
new const chara_specialsound[][] =
{
"weapons/buffclass19s3ct/skill/miracleprismsword1.wav",
"weapons/buffclass19s3ct/skill/miracleprismsword2.wav",
"weapons/buffclass19s3tr/skill/miracleprismsword1.wav",
"weapons/buffclass19s3tr/skill/miracleprismsword2.wav"
}
new const szMagicSprites[][] =
{
"sprites/gcg_csze/ef_mgknife_start.spr", //0
"sprites/gcg_csze/ef_mgknife_loop.spr", //1
"sprites/gcg_csze/ef_mgknife_end.spr", //2
"sprites/gcg_csze/ef_mgknife_exp01.spr", //3
"sprites/gcg_csze/ef_mgknife_exp02.spr" //4
}
//SLASH
#define SLASH_ANGLE 120.0
#define SLASH_DAMAGE random_float(300.0,350.0)
#define SLASH_RANGE 130.0
#define SLASH_KNOCKBACK 3.0
//CHARGE
#define CHARGE_DAMAGE random_float(600.0,650.0)
#define CHARGE_RANGE 160.0
#define CHARGE_ANGLE 179.0
#define CHARGE_KNOCKBACK 1000.0
//MAGIC
#define MAGIC_EXPLOSION_DAMAGE 2000.0
#define MAGIC_SLASH_DAMAGE 1000.0
//Hit
#define RESULT_HIT_NONE 0
#define RESULT_HIT_PLAYER 1
#define RESULT_HIT_WORLD 2
new g_had_magicknife[33], g_freezetime
new spr_blood_spray, spr_blood_drop
new const ATTRIBUTE_BONUS_XP[] = "MAGIC"
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_logevent("LogEvent_Round_Start",2, "1=Round_Start")
register_event("HLTV","Event_HLTV","a","1=0","2=0")
register_event("CurWeapon", "Event_CurWeapon", "be", "1=1")
register_message(get_user_msgid("DeathMsg"), "message_DeathMsg")
RegisterHam(Ham_Think, "info_target", "MagicThink")
RegisterHam(Ham_Item_PostFrame, weapon_magicknife, "fw_Item_PostFrame")
register_clcmd(spr_wpn, "hook_rb")
}
public plugin_precache()
{
precache_model(v_model)
precache_model(p_model)
new i
for(i = 0; i < sizeof(chara_specialsound); i++)
precache_sound(chara_specialsound[i])
for(i = 0; i < sizeof(weapon_sound); i++)
precache_sound(weapon_sound[i])
for(i = 0; i < sizeof(szMagicSprites); i++)
engfunc(EngFunc_PrecacheModel, szMagicSprites[i])
spr_blood_spray = precache_model("sprites/bloodspray.spr")
spr_blood_drop = precache_model("sprites/blood.spr")
new Txt[32]
format(Txt, 31, "sprites/gcg_csze/%s.txt", spr_wpn)
engfunc(EngFunc_PrecacheGeneric, Txt)
}
public hook_rb(id)
{
engclient_cmd(id, weapon_magicknife)
return PLUGIN_HANDLED
}
public crxknives_knife_updated(id, iKnife, bool:bOnConnect)
{
static iValue
if(crxknives_get_attribute_int(id, ATTRIBUTE_BONUS_XP, iValue) && iValue == 1)
{
get_magicknife(id)
}
else
{
g_had_magicknife[id] = 0
}
}
public zp_fw_core_infect_post(id) remove_crow9(id)
public zp_fw_core_cure_post(id) remove_crow9(id)
public get_magicknife(id)
{
if (!is_user_alive(id))
return
g_had_magicknife[id] = 1
if (get_user_weapon(id) == CSW_MAGICKNIFE) Event_CurWeapon(id)
else engclient_cmd(id,weapon_magicknife)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
write_string(g_had_magicknife[id] == 1 ? spr_wpn : weapon_magicknife)
write_byte(-1)
write_byte(-1)
write_byte(-1)
write_byte(-1)
write_byte(2)
write_byte(1)
write_byte(CSW_MAGICKNIFE)
write_byte(0)
message_end()
}
public remove_crow9(id)
{
g_had_magicknife[id] = 0
}
public Event_HLTV() g_freezetime = 1
public LogEvent_Round_Start() g_freezetime = 0
public Event_CurWeapon(id)
{
if(!is_user_alive(id))
return 1
if(get_user_weapon(id) != CSW_MAGICKNIFE)
return 1
if(!g_had_magicknife[id])
return 1
set_pev(id, pev_viewmodel2, v_model)
set_pev(id, pev_weaponmodel2, p_model)
Set_WeaponAnim(id, 6)
static iEnt; iEnt = fm_get_user_weapon_entity(id, CSW_MAGICKNIFE)
if(!pev_valid(iEnt)) return 1
set_pdata_float(id, 83, 1.0)
set_pdata_float(iEnt, 46, 1.03);
set_pdata_float(iEnt, 47, 1.03);
set_pdata_float(iEnt, 48, 1.03);
set_pev(iEnt, pev_iuser1, 0)
set_pev(iEnt, pev_iuser2, 0)
set_pev(iEnt, pev_iuser3, 0)
return 0
}
public message_DeathMsg(msg_id, msg_dest, msg_ent)
{
new szWeapon[64]
get_msg_arg_string(4, szWeapon, charsmax(szWeapon))
if (strcmp(szWeapon, "knife"))
return PLUGIN_CONTINUE
new iEntity = get_pdata_cbase(get_msg_arg_int(1), 373)
if (!pev_valid(iEntity) || get_pdata_int(iEntity, 43, 4) != CSW_MAGICKNIFE || !g_had_magicknife[get_msg_arg_int(1)])
return PLUGIN_CONTINUE
set_msg_arg_string(4, "magicknife")
return PLUGIN_CONTINUE
}
public fw_Item_PostFrame(ent)
{
new id = pev(ent, pev_owner)
if(!is_user_connected(id))
return HAM_IGNORED
if(get_user_weapon(id) != CSW_MAGICKNIFE || !g_had_magicknife[id])
return HAM_IGNORED
new iButton = pev(id,pev_button)
return AurezLegendOfBotac(id, ent, iButton)
}
public AurezLegendOfBotac(id, iEnt, iButton)
{
if(g_freezetime) return HAM_IGNORED
new iSnd = pev(iEnt, pev_iuser2);
new iState = pev(iEnt, pev_iuser3)
//new IsSpec = (bStab == 2)
if(!(iButton & IN_ATTACK) && get_pdata_float(iEnt, 48, 4) <= 0.0 && iSnd == 1)
{
set_pdata_float(iEnt, 46, 0.83,4);
set_pdata_float(iEnt, 47, 0.83,4);
set_pdata_float(iEnt, 48, 0.85,4);
Set_WeaponAnim(id, 5)
set_pev(iEnt, pev_iuser1, 0)
set_pev(iEnt, pev_iuser2, 0)
}
if(!(iButton & IN_ATTACK2))
{
if(iState == 2 || iState == 3)
{
set_pev(iEnt, pev_iuser3, 0)
Set_WeaponAnim(id, 11)
set_pdata_float(id, 83, 0.3)
set_pdata_float(iEnt, 46, 2.16);
set_pdata_float(iEnt, 47, 2.16);
set_pdata_float(iEnt, 48, 2.16)
set_pev(iEnt, pev_iuser1, 1)
set_pev(iEnt, pev_iuser2, 2)
set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
}
if(iState == 4)
{
set_pev(iEnt, pev_iuser3, 0)
Set_WeaponAnim(id, 12)
set_pdata_float(id, 83, 0.3)
set_pdata_float(iEnt, 46, 2.16);
set_pdata_float(iEnt, 47, 2.16);
set_pdata_float(iEnt, 48, 2.16)
set_pev(iEnt, pev_iuser1, 1)
set_pev(iEnt, pev_iuser2, 3)
set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
client_cmd(id, "spk weapons/buffclass19s3ct/skill/miracleprismsword1.wav")
client_cmd(id, "spk weapons/buffclass19s3tr/skill/miracleprismsword1.wav")
}
}
if (get_pdata_float(id, 83) <= 0.0 && pev(iEnt, pev_iuser1))
{
new Float:Damage[4]
Damage[0] = SLASH_RANGE
Damage[1] = SLASH_ANGLE
Damage[2] = SLASH_DAMAGE
Damage[3] = SLASH_KNOCKBACK
new iHitResult = KnifeAttack_Global(id, 0, Damage[0], Damage[1], Damage[2], Damage[3])
switch (iHitResult)
{
case RESULT_HIT_PLAYER : SendSound(id, CHAN_VOICE, weapon_sound[random_num(15, 16)])
case RESULT_HIT_WORLD : SendSound(id, CHAN_VOICE, weapon_sound[17])
}
if(iSnd == 2) SendSound(id, CHAN_WEAPON, weapon_sound[random_num(0,3)])
if(iSnd == 3) { SendSound(id, CHAN_WEAPON, weapon_sound[10]); DoMagic(id); }
set_pev(iEnt, pev_iuser1, 0);
if(iSnd > 1) set_pev(iEnt, pev_iuser2, 0)
}
if((iButton & IN_ATTACK2) && iState == 4)
{
new Float:fTimer1; pev(iEnt, pev_fuser1, fTimer1)
if(fTimer1 && fTimer1 < get_gametime())
{
SendSound(id, CHAN_WEAPON, weapon_sound[8])
set_pev(iEnt, pev_fuser1, get_gametime() + 3.31)
}
}
if(get_pdata_float(iEnt, 46) > 0.0)
return HAM_IGNORED
if(iButton & IN_ATTACK)
{
new iAnim = pev(iEnt, pev_iuser4)
set_pdata_float(id, 83, 0.05)
set_pdata_float(iEnt, 46, 0.35,4);
set_pdata_float(iEnt, 47, 0.35,4);
set_pdata_float(iEnt, 48, 0.45,4);
set_pev(iEnt, pev_iuser1, 1)
set_pev(iEnt, pev_iuser2, 1)
set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
Set_WeaponAnim(id, 1 + iAnim)
SendSound(id, CHAN_WEAPON, weapon_sound[0 + iAnim])
if(iAnim > 2) iAnim = 0
else iAnim++
set_pev(iEnt, pev_iuser4, iAnim)
}
if((iButton & IN_ATTACK2) && !iSnd)
{
switch(iState)
{
case 0:
{
Set_WeaponAnim(id, 13)
set_pdata_float(iEnt, 46, 0.6)
set_pdata_float(iEnt, 47, 0.6)
set_pdata_float(iEnt, 48, 0.65)
set_pev(iEnt, pev_iuser3, 1)
}
case 1:
{
Set_WeaponAnim(id, 7)
SendSound2(id, weapon_sound[6])
set_pdata_float(iEnt, 46, 0.36);
set_pdata_float(iEnt, 47, 0.36);
set_pdata_float(iEnt, 48, 0.36);
set_pev(iEnt, pev_iuser3, 2)
}
case 2:
{
Set_WeaponAnim(id, 9)
set_pdata_float(iEnt, 46, 1.03);
set_pdata_float(iEnt, 47, 1.03);
set_pdata_float(iEnt, 48, 1.03);
set_pev(iEnt, pev_iuser3, 3)
}
case 3:
{
Set_WeaponAnim(id, 8)
set_pdata_float(iEnt, 46, 0.36);
set_pdata_float(iEnt, 47, 0.36);
set_pdata_float(iEnt, 48, 0.36);
set_pev(iEnt, pev_iuser3, 4)
set_pev(iEnt, pev_fuser1, get_gametime() + 0.01)
client_cmd(id, "spk weapons/buffclass19s3ct/skill/miracleprismsword1.wav")
client_cmd(id, "spk weapons/buffclass19s3tr/skill/miracleprismsword2.wav")
}
case 4:
{
set_pdata_float(iEnt, 46, 0.93);
set_pdata_float(iEnt, 47, 0.93);
set_pdata_float(iEnt, 48, 0.93);
Set_WeaponAnim(id, 10)
set_pev(iEnt, pev_iuser3, 4)
MagicInit(id)
}
}
} else {
if(iState == 1)
{
set_pev(iEnt, pev_iuser3, 0)
set_pdata_float(id, 83, 0.2)
set_pdata_float(iEnt, 46, 1.0)
set_pdata_float(iEnt, 47, 1.0)
set_pdata_float(iEnt, 48, 2.6)
set_pev(iEnt, pev_iuser1, 1)
set_pev(iEnt, pev_iuser2, 2)
set_pev(iEnt, pev_fuser4, get_gametime() + get_pdata_float(id, 83))
}
}
iButton &= ~IN_ATTACK;
iButton &= ~IN_ATTACK2;
set_pev(id, pev_button, iButton);
return HAM_IGNORED
}
public MagicInit(id)
{
static Float:vOrigin[3], Float:pOrigin[3]
pev(id, pev_origin, vOrigin)
for(new x = 0; x < get_maxplayers(); x ++)
{
if(!is_user_connected(x) || !is_user_alive(x) || !zp_core_is_zombie(x))
continue;
pev(x, pev_origin, pOrigin);
if(isClearLine(pOrigin, vOrigin) && vector_distance(pOrigin, vOrigin) <= 650.0 && !isLocked(x, id))
MakeMagic(id, x)
}
}
public MakeMagic(pevAttacker, iVictim)
{
static Float:pOrigin[3], Float:vOrigin[3], Float:vDir[3], Float:vAngle[3];
pev(iVictim, pev_origin, vOrigin);
pev(pevAttacker, pev_origin, pOrigin);
xs_vec_sub(vOrigin, pOrigin, vDir);
xs_vec_normalize(vDir, vDir);
static Ent; Ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"));
dllfunc(DLLFunc_Spawn, Ent);
engfunc(EngFunc_SetModel, Ent, szMagicSprites[0])
set_pev(Ent, pev_origin, vOrigin);
set_pev(Ent, pev_classname, "magicknife_magic")
set_pev(Ent, pev_owner, pevAttacker);
set_pev(Ent, pev_rendermode, kRenderTransAdd);
set_pev(Ent, pev_renderamt, 255.0);
set_pev(Ent, pev_scale, 0.57);
set_pev(Ent, pev_iuser1, 0);
set_pev(Ent, pev_iuser2, 0);
set_pev(Ent, pev_iuser3, 0);
set_pev(Ent, pev_frame, 0.0);
vector_to_angle(vDir, vAngle);
set_pev(Ent, pev_angles, vAngle);
set_pev(Ent, pev_enemy, iVictim);
set_pev(Ent, pev_nextthink, get_gametime());
engfunc(EngFunc_EmitAmbientSound, Ent, vOrigin, weapon_sound[11], 1.0, 0.8, 0, 100);
}
public DoMagic(id)
{
new pEnt = -1
while(( pEnt = engfunc(EngFunc_FindEntityByString, pEnt, "classname", "magicknife_magic")) != 0)
{
if(!pev_valid(pEnt) || pev(pEnt, pev_owner) != id)
continue;
if(pev(pEnt, pev_iuser2) == 0)
set_pev(pEnt, pev_iuser1, 4);
}
}
public MagicThink(Ent)
{
if(!isMagic(Ent))
return;
new Float:pOrigin[3], Float:vOrigin[3], Float:vDir[3], Float:vAngle[3], Float:flFrame, iMode, iCheck, iVictim, pevAttacker;
static iStat; iStat = 0
pev(Ent, pev_origin, vOrigin);
iMode = pev(Ent, pev_iuser1)
iCheck = pev(Ent, pev_iuser2)
switch(iMode)
{
case 1:
{
pev(Ent, pev_frame, flFrame);
flFrame += 1.0
if(flFrame >= 14.0) flFrame = 0.0
set_pev(Ent, pev_frame, flFrame);
}
case 2: // removed
{
engfunc(EngFunc_SetModel, Ent, szMagicSprites[2])
set_pev(Ent, pev_iuser1, 3);
set_pev(Ent, pev_iuser2, 1);
set_pev(Ent, pev_frame, 0.0);
engfunc(EngFunc_EmitAmbientSound, Ent, vOrigin, weapon_sound[12], 1.0, 0.8, 0, 100);
}
case 3:
{
pev(Ent, pev_frame, flFrame);
flFrame = floatmin(44.0, flFrame+1.0);
if(flFrame >= 44.0)
{
engfunc(EngFunc_RemoveEntity, Ent);
return;
}
set_pev(Ent, pev_frame, flFrame);
}
case 4: // hit
{
engfunc(EngFunc_SetModel, Ent, szMagicSprites[3])
set_pev(Ent, pev_frame, 0.0);
set_pev(Ent, pev_iuser1, 5);
set_pev(Ent, pev_iuser2, 2);
engfunc(EngFunc_EmitAmbientSound, Ent, vOrigin, weapon_sound[13], 1.0, 0.6, 0, 100);
iStat = 1
}
case 5:
{
pev(Ent, pev_frame, flFrame);
flFrame = floatmin(34.0, flFrame+0.8);
if(flFrame >= 12.0 && pev(Ent, pev_iuser3) != 1)
{
iStat = 2
set_pev(Ent, pev_iuser3, 1);
engfunc(EngFunc_EmitAmbientSound, Ent, vOrigin, weapon_sound[14], 1.0, 0.6, 0, 100);
}
if(flFrame >= 34.0)
{
set_pev(Ent, pev_iuser1, 6);
engfunc(EngFunc_SetModel, Ent, szMagicSprites[4])
flFrame = 0.0
}
set_pev(Ent, pev_frame, flFrame);
}
case 6:
{
pev(Ent, pev_frame, flFrame);
flFrame = floatmin(34.0, flFrame+1.0);
if(flFrame >= 34.0)
{
engfunc(EngFunc_RemoveEntity, Ent);
return;
}
set_pev(Ent, pev_frame, flFrame);
}
default:
{
pev(Ent, pev_frame, flFrame);
flFrame = floatmin(44.0, flFrame + 0.8);
if(flFrame >= 44.0)
{
set_pev(Ent, pev_iuser1, 1);
engfunc(EngFunc_SetModel, Ent, szMagicSprites[1])
flFrame = 0.0
}
set_pev(Ent, pev_frame, flFrame);
}
}
set_pev(Ent, pev_nextthink, get_gametime());
pevAttacker = pev(Ent, pev_owner);
iVictim = pev(Ent, pev_enemy);
if(!is_user_connected(pevAttacker) || !is_user_alive(pevAttacker))
{
engfunc(EngFunc_RemoveEntity, Ent);
return;
}
if(iCheck == 1)
return;
pev(pevAttacker, pev_origin, pOrigin);
pev(iVictim, pev_origin, vOrigin);
xs_vec_sub(vOrigin, pOrigin, vDir);
xs_vec_normalize(vDir, vDir);
vector_to_angle(vDir, vAngle);
if(!iCheck)
{
vAngle[0] = 0.0
set_pev(Ent, pev_angles, vAngle);
set_pev(Ent, pev_origin, vOrigin);
}
if(zp_core_is_zombie(pevAttacker) || (get_user_weapon(pevAttacker) != CSW_KNIFE || !g_had_magicknife[pevAttacker]) || !is_user_alive(iVictim) || !is_user_connected(iVictim))
{
if(iMode != 2 && iCheck != 2)
set_pev(Ent, pev_iuser1, 2);
return;
}
if((vector_distance(vOrigin, pOrigin) > 650.0 || !isClearLine(vOrigin, pOrigin)) && iMode != 2 && iCheck != 2)
{
set_pev(Ent, pev_iuser1, 2);
return;
}
if(iStat == 1) ShootTraceAttack(pevAttacker, vOrigin, MAGIC_SLASH_DAMAGE)
else if(iStat == 2)
{
ExecuteHamB(Ham_TakeDamage, iVictim, pevAttacker, pevAttacker, MAGIC_EXPLOSION_DAMAGE, DMG_CLUB);
HoldUp(iVictim)
} HoldUp(iVictim, 0.6)
}
stock isLocked(Ent, pevAttacker)
{
new pEnt = -1
while(( pEnt = engfunc(EngFunc_FindEntityByString, pEnt, "classname", "magicknife_magic")) != 0)
{
if(!pev_valid(pEnt) || pev(pEnt, pev_owner) != pevAttacker)
continue;
if(pev(pEnt, pev_enemy) == Ent && pev(pEnt, pev_iuser2) == 0)
return 1;
}
return 0;
}
stock isMagic(Ent)
{
if(!pev_valid(Ent)) return 0;
static szClassName[32]; pev(Ent, pev_classname,szClassName, 31);
return (equal(szClassName, "magicknife_magic"))
}
stock isClearLine(Float:vOrigin1[3], Float:vOrigin2[3])
{
new Float:flFraction;
engfunc(EngFunc_TraceLine, vOrigin1, vOrigin2, IGNORE_MONSTERS, 0, 0);
get_tr2(0, TR_flFraction, flFraction)
if (flFraction < 1.0) return 0;
return 1;
}
stock ShootTraceAttack(id, Float:vTarget[3], Float:flDamage, iDamageBits = DMG_BULLET)
{
new Float:vecSrc[3], Float:vecEnd[3], Float:vDir[3], Float:vForward[3]
GetGunPosition(id, vecSrc);
xs_vec_sub(vTarget, vecSrc, vDir);
xs_vec_normalize(vDir, vDir);
xs_vec_mul_scalar(vDir, 8192.0, vForward);
xs_vec_add(vecEnd, vForward, vecEnd);
new tr = create_tr2();
engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
get_tr2(tr, TR_flFraction, flFraction);
if (flFraction < 1.0)
{
new pEnt = get_tr2(tr, TR_pHit);
if (pev_valid(pEnt))
{
rg_multidmg_clear();
ExecuteHamB(Ham_TraceAttack, pEnt, id, flDamage, vDir, tr, iDamageBits);
rg_multidmg_apply(id, id);
}
}
free_tr2(tr)
}
stock HoldUp(iEnt, Float:flMultiple = 0.1)
{
static Float:vecVelocity[3];
pev(iEnt, pev_velocity, vecVelocity);
vecVelocity[0] *= flMultiple
vecVelocity[1] *= flMultiple
set_pev(iEnt, pev_velocity, vecVelocity);
}
stock SendSound(id, chan, sample[]) emit_sound(id, chan, sample, VOL_NORM, ATTN_NORM, 0, PITCH_NORM)
stock SendSound2(id, sample[]) client_cmd(id, "spk %s", sample)
stock KnifeAttack_Global(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
{
new iHitResult
if(fAngle > 0.0) iHitResult = KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack)
else iHitResult = KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack)
return iHitResult
}
stock KnifeAttack(id, bStab, Float:flRange, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bitsDamageType = DMG_NEVERGIB | DMG_CLUB)
{
new Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
GetGunPosition(id, vecSrc);
pev(id, pev_v_angle, v_angle);
engfunc(EngFunc_MakeVectors, v_angle);
global_get(glb_v_forward, vecForward);
xs_vec_mul_scalar(vecForward, flRange, vecForward);
xs_vec_add(vecSrc, vecForward, vecEnd);
new tr = create_tr2();
engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
get_tr2(tr, TR_flFraction, flFraction);
new Float:EndPos2[3]
get_tr2(tr, TR_vecEndPos, EndPos2)
new iHitResult = RESULT_HIT_NONE;
if (flFraction < 1.0)
{
new pEntity = get_tr2(tr, TR_pHit);
iHitResult = RESULT_HIT_WORLD;
if (pev_valid(pEntity) && (IsPlayer(pEntity) || IsHostage(pEntity)))
{
if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
flDamage *= 3.0;
iHitResult = RESULT_HIT_PLAYER;
}
if (pev_valid(pEntity))
{
engfunc(EngFunc_MakeVectors, v_angle);
global_get(glb_v_forward, vecForward);
if (iHitgroup != -1)
set_tr2(tr, TR_iHitgroup, iHitgroup);
Stock_Fake_KnockBack(id, pEntity, flKnockBack)
rg_multidmg_clear();
ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, bitsDamageType);
rg_multidmg_apply(id, id);
if (IsAlive(pEntity))
{
free_tr2(tr);
return iHitResult;
}
}
}
free_tr2(tr);
return iHitResult;
}
stock KnifeAttack2(id, bStab, Float:flRange, Float:fAngle, Float:flDamage, Float:flKnockBack, iHitgroup = -1, bNoTraceCheck = 0, bitsDamageType = DMG_NEVERGIB | DMG_CLUB)
{
new Float:vecOrigin[3], Float:vecSrc[3], Float:vecEnd[3], Float:v_angle[3], Float:vecForward[3];
pev(id, pev_origin, vecOrigin);
new iHitResult = RESULT_HIT_NONE;
GetGunPosition(id, vecSrc);
pev(id, pev_v_angle, v_angle);
engfunc(EngFunc_MakeVectors, v_angle);
global_get(glb_v_forward, vecForward);
xs_vec_mul_scalar(vecForward, flRange, vecForward);
xs_vec_add(vecSrc, vecForward, vecEnd);
new tr = create_tr2();
engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
new Float:EndPos2[3]
get_tr2(tr, TR_vecEndPos, EndPos2)
new Float:flFraction; get_tr2(tr, TR_flFraction, flFraction);
if (flFraction < 1.0) iHitResult = RESULT_HIT_WORLD;
new Float:vecEndZ = vecEnd[2];
new pEntity = -1;
while ((pEntity = engfunc(EngFunc_FindEntityInSphere, pEntity, vecOrigin, flRange)) != 0)
{
if (!pev_valid(pEntity))
continue;
if (id == pEntity)
continue;
if (!IsAlive(pEntity))
continue;
if (!CheckAngle(id, pEntity, fAngle))
continue;
GetGunPosition(id, vecSrc);
Stock_Get_Origin(pEntity, vecEnd);
vecEnd[2] = vecSrc[2] + (vecEndZ - vecSrc[2]) * (get_distance_f(vecSrc, vecEnd) / flRange);
xs_vec_sub(vecEnd, vecSrc, vecForward);
xs_vec_normalize(vecForward, vecForward);
xs_vec_mul_scalar(vecForward, flRange, vecForward);
xs_vec_add(vecSrc, vecForward, vecEnd);
engfunc(EngFunc_TraceLine, vecSrc, vecEnd, 0, id, tr);
get_tr2(tr, TR_flFraction, flFraction);
if (flFraction >= 1.0) engfunc(EngFunc_TraceHull, vecSrc, vecEnd, 0, 3, id, tr);
get_tr2(tr, TR_flFraction, flFraction);
if (flFraction < 1.0)
{
if (IsPlayer(pEntity) || IsHostage(pEntity))
{
iHitResult = RESULT_HIT_PLAYER;
if (CheckBack(id, pEntity) && bStab && iHitgroup == -1)
flDamage *= 3.0;
}
if (get_tr2(tr, TR_pHit) == pEntity || bNoTraceCheck)
{
engfunc(EngFunc_MakeVectors, v_angle);
global_get(glb_v_forward, vecForward);
if (iHitgroup != -1) set_tr2(tr, TR_iHitgroup, iHitgroup);
Stock_Fake_KnockBack(id, pEntity, flKnockBack)
rg_multidmg_clear();
ExecuteHamB(Ham_TraceAttack, pEntity, id, flDamage, vecForward, tr, bitsDamageType);
rg_multidmg_apply(id, id);
}
}
free_tr2(tr);
}
return iHitResult;
}
stock Set_WeaponAnim(id, anim)
{
set_pev(id, pev_weaponanim, anim)
message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, {0, 0, 0}, id)
write_byte(anim)
write_byte(pev(id, pev_body))
message_end()
}
stock Set_WeaponIdleTime(id, WeaponId ,Float:TimeIdle)
{
static entwpn; entwpn = fm_get_user_weapon_entity(id, WeaponId)
if(!pev_valid(entwpn))
return
set_pdata_float(entwpn, 46, TimeIdle, 4)
set_pdata_float(entwpn, 47, TimeIdle, 4)
set_pdata_float(entwpn, 48, TimeIdle + 0.5, 4)
}
stock Set_PlayerNextAttack(id, Float:nexttime)
{
set_pdata_float(id, 83, nexttime, 5)
}
stock Stock_Get_Postion(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)
engfunc(EngFunc_AngleVectors, vAngle, vForward, vRight, 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
}
stock IsPlayer(pEntity) return is_user_connected(pEntity)
stock IsHostage(pEntity)
{
new classname[32]; pev(pEntity, pev_classname, classname, charsmax(classname))
return equal(classname, "hostage_entity")
}
stock IsAlive(pEntity)
{
if (pEntity < 1) return 0
return (pev(pEntity, pev_deadflag) == DEAD_NO && pev(pEntity, pev_health) > 0)
}
stock GetGunPosition(id, Float:vecScr[3])
{
new Float:vecViewOfs[3]
pev(id, pev_origin, vecScr)
pev(id, pev_view_ofs, vecViewOfs)
xs_vec_add(vecScr, vecViewOfs, vecScr)
}
stock CheckBack(iEnemy,id)
{
new Float:anglea[3], Float:anglev[3]
pev(iEnemy, pev_v_angle, anglea)
pev(id, pev_v_angle, anglev)
new Float:angle = anglea[1] - anglev[1]
if (angle < -180.0) angle += 360.0
if (angle <= 45.0 && angle >= -45.0) return 1
return 0
}
stock CheckAngle(iAttacker, iVictim, Float:fAngle) return(Stock_CheckAngle(iAttacker, iVictim) > floatcos(fAngle,degrees))
stock Float:Stock_CheckAngle(id,iTarget)
{
new Float:vOricross[2],Float:fRad,Float:vId_ori[3],Float:vTar_ori[3],Float:vId_ang[3],Float:fLength,Float:vForward[3]
Stock_Get_Origin(id, vId_ori)
Stock_Get_Origin(iTarget, vTar_ori)
pev(id,pev_angles,vId_ang)
for(new i=0;i<2;i++) vOricross[i] = vTar_ori[i] - vId_ori[i]
fLength = floatsqroot(vOricross[0]*vOricross[0] + vOricross[1]*vOricross[1])
if (fLength<=0.0)
{
vOricross[0]=0.0
vOricross[1]=0.0
} else {
vOricross[0]=vOricross[0]*(1.0/fLength)
vOricross[1]=vOricross[1]*(1.0/fLength)
}
engfunc(EngFunc_MakeVectors,vId_ang)
global_get(glb_v_forward,vForward)
fRad = vOricross[0]*vForward[0]+vOricross[1]*vForward[1]
return fRad //-> RAD 90' = 0.5rad
}
stock Stock_Get_Origin(id, Float:origin[3])
{
new Float:maxs[3],Float:mins[3]
if (pev(id, pev_solid) == SOLID_BSP)
{
pev(id,pev_maxs,maxs)
pev(id,pev_mins,mins)
origin[0] = (maxs[0] - mins[0]) / 2 + mins[0]
origin[1] = (maxs[1] - mins[1]) / 2 + mins[1]
origin[2] = (maxs[2] - mins[2]) / 2 + mins[2]
} else pev(id, pev_origin, origin)
}
stock SpawnBlood(const Float:vecOrigin[3], iColor, iAmount)
{
if(iAmount == 0)
return
if (!iColor)
return
iAmount *= 2
if(iAmount > 255) iAmount = 255
engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, vecOrigin)
write_byte(TE_BLOODSPRITE)
engfunc(EngFunc_WriteCoord, vecOrigin[0])
engfunc(EngFunc_WriteCoord, vecOrigin[1])
engfunc(EngFunc_WriteCoord, vecOrigin[2])
write_short(spr_blood_spray)
write_short(spr_blood_drop)
write_byte(iColor)
write_byte(min(max(3, iAmount / 10), 16))
message_end()
}
public Stock_Fake_KnockBack(id, iVic, Float:iKb)
{
if(iVic > 32) return
new Float:vAttacker[3], Float:vVictim[3], Float:vVelocity[3], flags
pev(id, pev_origin, vAttacker)
pev(iVic, pev_origin, vVictim)
vAttacker[2] = vVictim[2] = 0.0
flags = pev(id, pev_flags)
xs_vec_sub(vVictim, vAttacker, vVictim)
new Float:fDistance
fDistance = xs_vec_len(vVictim)
xs_vec_mul_scalar(vVictim, 1 / fDistance, vVictim)
pev(iVic, pev_velocity, vVelocity)
xs_vec_mul_scalar(vVictim, iKb, vVictim)
xs_vec_mul_scalar(vVictim, 50.0, vVictim)
vVictim[2] = xs_vec_len(vVictim) * 0.15
if(flags &~ FL_ONGROUND)
{
xs_vec_mul_scalar(vVictim, 1.2, vVictim)
vVictim[2] *= 0.4
}
if(xs_vec_len(vVictim) > xs_vec_len(vVelocity)) set_pev(iVic, pev_velocity, vVictim)
}
stock Float:Stock_Get_Body_Dmg(iBody)
{
switch (iBody)
{
case HIT_GENERIC: return 0.75
case 1: return 4.0
case 2: return 1.0
case 3: return 1.25
case 4,5,6,7: return 0.75
default: return 0.75
}
return 1.0
}
stock Stock_BloodEffect(Float:vecOri[3], scale)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_BLOODSPRITE)
engfunc(EngFunc_WriteCoord,vecOri[0])
engfunc(EngFunc_WriteCoord,vecOri[1])
engfunc(EngFunc_WriteCoord,vecOri[2])
write_short(spr_blood_spray)
write_short(spr_blood_drop)
write_byte(75)
write_byte(scale)
message_end()
}
stock can_damage(id1, id2)
{
if(id1 <= 0 || id1 >= 33 || id2 <= 0 || id2 >= 33)
return 1
// Check team
return(get_pdata_int(id1, 114) != get_pdata_int(id2, 114))
}