AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Set damage to NPC with custom weapon (https://forums.alliedmods.net/showthread.php?t=313358)

Point 01-06-2019 13:15

Set damage to NPC with custom weapon
 
Hi! I could use some help finding a good way to do this and i think this is the best place.
So, as the title says. how can i set the npc to take damage from a custom weapon which per example shoot fireballs or something similar.
Lets say this one
PHP Code:

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <xs>

#define PLUGIN "[ZBHeroEx] Primary: Cannon"
#define VERSION "1.0"
#define AUTHOR "Dias"

#define V_MODEL "models/v_cannon.mdl"
#define P_MODEL "models/p_cannon.mdl"
#define W_MODEL "models/w_cannon.mdl"

#define DAMAGE 600
#define RADIUS 400

#define CANNON_ROUND 20

#define TIME_DRAW 0.75
#define TIME_RELOAD 3.0

#define CSW_CANNON CSW_MP5NAVY
#define weapon_cannon "weapon_mp5navy"

#define WEAPON_EVENT "events/mp5n.sc"
#define WEAPON_W_MODEL "models/w_mp5.mdl"
#define WEAPON_ANIMEXT "carbine"
#define WEAPON_SECRET_CODE 5786

#define CANNONFIRE_CLASSNAME "cannon"

// Fire Start
#define WEAPON_ATTACH_F 30.0
#define WEAPON_ATTACH_R 10.0
#define WEAPON_ATTACH_U -5.0

new const WeaponSounds[2][] =
{
    
"weapons/cannon-1.wav",
    
"weapons/cannon_draw.wav"
}

new const 
WeaponResources[4][] = 
{
    
"sprites/fire_cannon.spr",
    
"sprites/weapon_cannon.txt",
    
"sprites/640hud69_2.spr",
    
"sprites/640hud2_2.spr"
}

enum
{
    
CANNON_ANIM_IDLE 0,
    
CANNON_ANIM_SHOOT1,
    
CANNON_ANIM_SHOOT2,
    
CANNON_ANIM_DRAW
}

// MACROS
#define Get_BitVar(%1,%2) (%1 & (1 << (%2 & 31)))
#define Set_BitVar(%1,%2) %1 |= (1 << (%2 & 31))
#define UnSet_BitVar(%1,%2) %1 &= ~(1 << (%2 & 31))

new g_Cannon
new g_Had_Cannong_InTempingAttack
new g_OldWeapon[33], g_CannonRound[33], Float:g_LastAttack[33], Float:g_NextTime[33]
new 
g_SmokePuff_SprIdg_MsgCurWeapong_MsgAmmoXg_MsgWeaponList

public plugin_init() 
{
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_event("CurWeapon""Event_CurWeapon""be""1=1")

    
register_think(CANNONFIRE_CLASSNAME"fw_Cannon_Think")
    
register_touch(CANNONFIRE_CLASSNAME"*""fw_Cannon_Touch")    
    
register_clcmd("say givecannon""Get_Cannon");
    
    
register_forward(FM_UpdateClientData"fw_UpdateClientData_Post"1)
    
register_forward(FM_CmdStart"fw_CmdStart")
    
register_forward(FM_SetModel"fw_SetModel")    
    
register_forward(FM_EmitSound"fw_EmitSound")
    
register_forward(FM_TraceLine"fw_TraceLine")
    
register_forward(FM_TraceHull"fw_TraceHull")        
    
    
RegisterHam(Ham_Item_AddToPlayerweapon_cannon"fw_Item_AddToPlayer_Post"1)
    
    
g_MsgCurWeapon get_user_msgid("CurWeapon")
    
g_MsgAmmoX get_user_msgid("AmmoX")
    
g_MsgWeaponList get_user_msgid("WeaponList")
    
    
register_clcmd("weapon_cannon""HookWeapon")
}

public 
plugin_precache()
{
    
engfunc(EngFunc_PrecacheModelV_MODEL)
    
engfunc(EngFunc_PrecacheModelP_MODEL)
    
engfunc(EngFunc_PrecacheModelW_MODEL)
    
    new 
i
    
for(0sizeof(WeaponSounds); i++)
        
engfunc(EngFunc_PrecacheSoundWeaponSounds[i])
    for(
0sizeof(WeaponResources); i++)
    {
        if(
== 1engfunc(EngFunc_PrecacheGenericWeaponResources[i])
        else 
engfunc(EngFunc_PrecacheModelWeaponResources[i])
    }
    
    
g_SmokePuff_SprId engfunc(EngFunc_PrecacheModel"sprites/smokepuff.spr")
}

public 
Get_Cannon(id)
{
    if(!
is_user_alive(id))
        return
        
    
Set_BitVar(g_Had_Cannonid)
    
UnSet_BitVar(g_InTempingAttackid)
    
g_CannonRound[id] = CANNON_ROUND
    
    fm_give_item
(idweapon_cannon)
    
update_ammo(id, -1CANNON_ROUND)
    
    
g_NextTime[id] = 0.0
}

public 
Remove_Cannon(id)
{
    
UnSet_BitVar(g_Had_Cannonid)
    
UnSet_BitVar(g_InTempingAttackid)
    
g_CannonRound[id] = 0
}

public 
HookWeapon(id)
{
    
engclient_cmd(idweapon_cannon)
    return 
PLUGIN_HANDLED
}

public 
Event_CurWeapon(id)
{
    if(!
is_user_alive(id))
        return
        
    static 
CSWIDCSWID read_data(2)
    if((
CSWID == CSW_CANNON && g_OldWeapon[id] != CSW_CANNON) && Get_BitVar(g_Had_Cannonid))
    {
        
set_pev(idpev_viewmodel2V_MODEL)
        
set_pev(idpev_weaponmodel2P_MODEL)
        
        
set_weapon_anim(idCANNON_ANIM_DRAW)
        
set_pdata_float(id83TIME_DRAW5)
        
        
set_pdata_string(id, (492) * 4WEAPON_ANIMEXT, -20)
        
update_ammo(id, -1g_CannonRound[id])
    } else if((
CSWID == CSW_CANNON && g_OldWeapon[id] == CSW_CANNON) && Get_BitVar(g_Had_Cannonid)) {
        
update_ammo(id, -1g_CannonRound[id])
    }
    
    
g_OldWeapon[id] = CSWID
}


public 
fw_Cannon_Think(iEnt)
{
    if(!
pev_valid(iEnt)) 
        return
    
    static 
Float:fFrameFloat:fNextThinkFloat:fScale
    pev
(iEntpev_framefFrame)
    
pev(iEntpev_scalefScale)
    
    
// effect exp
    
static iMoveTypeiMoveType pev(iEntpev_movetype)
    if (
iMoveType == MOVETYPE_NONE)
    {
        
fNextThink 0.0015
        fFrame 
+= random_float(0.250.75)
        
fScale += 0.01
        
        
if(fFrame 21.0)
        {
            
engfunc(EngFunc_RemoveEntityiEnt)
            return
        }
    } else {
        
fNextThink 0.045
        
        fFrame 
+= random_float(0.51.0)
        
fScale += 0.01
        
        fFrame 
floatmin(21.0fFrame)
        
fScale floatmin(2.0fFrame)
    }
    
    
set_pev(iEntpev_framefFrame)
    
set_pev(iEntpev_scalefScale)
    
set_pev(iEntpev_nextthinkhalflife_time() + fNextThink)
    
    
// time remove
    
static Float:fTimeRemove
    pev
(iEntpev_fuser1fTimeRemove)
    if(
get_gametime() >= fTimeRemove)
    {
        static 
Float:Amountpev(iEntpev_renderamtAmount)
        if(
Amount <= 5.0)
        {
            
engfunc(EngFunc_RemoveEntityiEnt)
            return
        } else {
            
Amount -= 10.0
            set_pev
(iEntpev_renderamtAmount)
        }
    }
}

public 
fw_Cannon_Touch(entid)
{
    if(!
pev_valid(ent))
        return
        
    if(
pev_valid(id))
    {
        static 
Classname[32]
        
pev(idpev_classnameClassnamesizeof(Classname))
        
        if(
equal(ClassnameCANNONFIRE_CLASSNAME)) return
    }
        
    
set_pev(entpev_movetypeMOVETYPE_NONE)
    
set_pev(entpev_solidSOLID_NOT)
}

public 
fw_UpdateClientData_Post(idsendweaponscd_handle)
{
    if(!
is_user_alive(id))
        return 
FMRES_IGNORED
    
if(get_user_weapon(id) != CSW_CANNON || !Get_BitVar(g_Had_Cannonid))
        return 
FMRES_IGNORED
    
    set_cd
(cd_handleCD_flNextAttackget_gametime() + 0.001
    
    return 
FMRES_HANDLED
}

public 
fw_CmdStart(iduc_handleseed)
{
    if(!
is_user_alive(id) || !is_user_connected(id))
        return 
FMRES_IGNORED
    
if(get_user_weapon(id) != CSW_CANNON || !Get_BitVar(g_Had_Cannonid))
        return 
FMRES_IGNORED
    
    
static CurButton
    CurButton 
get_uc(uc_handleUC_Buttons)
    
    if(
CurButton IN_ATTACK)
    {
        
CurButton &= ~IN_ATTACK
        set_uc
(uc_handleUC_ButtonsCurButton)
        
        
HandleShoot_Cannon(id)
    }
    
    
Check_CannonTime(id)
    
    return 
FMRES_HANDLED
}

public 
fw_SetModel(entitymodel[])
{
    if(!
pev_valid(entity))
        return 
FMRES_IGNORED
    
    
static szClassName[33]
    
pev(entitypev_classnameszClassNamecharsmax(szClassName))
    
    if(!
equal(szClassName"weaponbox"))
        return 
FMRES_IGNORED
    
    
static id
    id 
pev(entitypev_owner)
    
    if(
equal(modelWEAPON_W_MODEL))
    {
        static 
weapon
        weapon 
fm_find_ent_by_owner(-1weapon_cannonentity)
        
        if(!
pev_valid(weapon))
            return 
FMRES_IGNORED
        
        
if(Get_BitVar(g_Had_Cannonid))
        {
            
set_pev(weaponpev_impulseWEAPON_SECRET_CODE)
            
set_pev(weaponpev_iuser1g_CannonRound[id])
            
            
engfunc(EngFunc_SetModelentityW_MODEL)
            
Remove_Cannon(id)
            
            return 
FMRES_SUPERCEDE
        
}
    }

    return 
FMRES_IGNORED
}

public 
fw_EmitSound(idchannel, const sample[], Float:volumeFloat:attnflagspitch)
{
    if(!
is_user_connected(id))
        return 
FMRES_IGNORED
    
if(!Get_BitVar(g_InTempingAttackid))
        return 
FMRES_IGNORED
        
    
if(sample[8] == 'k' && sample[9] == 'n' && sample[10] == 'i')
    {
        if(
sample[14] == 's' && sample[15] == 'l' && sample[16] == 'a')
            return 
FMRES_SUPERCEDE
        
if (sample[14] == 'h' && sample[15] == 'i' && sample[16] == 't')
        {
            if (
sample[17] == 'w')  return FMRES_SUPERCEDE
            
else  return FMRES_SUPERCEDE
        
}
        if (
sample[14] == 's' && sample[15] == 't' && sample[16] == 'a')
            return 
FMRES_SUPERCEDE;
    }
    
    return 
FMRES_IGNORED
}

public 
fw_TraceLine(Float:vector_start[3], Float:vector_end[3], ignored_monsteridhandle)
{
    if(!
is_user_alive(id))
        return 
FMRES_IGNORED    
    
if(!Get_BitVar(g_InTempingAttackid))
        return 
FMRES_IGNORED
    
    
static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
    
    
pev(idpev_originfOrigin)
    
pev(idpev_view_ofsview_ofs)
    
xs_vec_add(fOriginview_ofsvecStart)
    
pev(idpev_v_anglev_angle)
    
    
engfunc(EngFunc_MakeVectorsv_angle)
    
get_global_vector(GL_v_forwardv_forward)

    
xs_vec_mul_scalar(v_forward0.0v_forward)
    
xs_vec_add(vecStartv_forwardvecEnd)
    
    
engfunc(EngFunc_TraceLinevecStartvecEndignored_monsteridhandle)
    
    return 
FMRES_SUPERCEDE
}

public 
fw_TraceHull(Float:vector_start[3], Float:vector_end[3], ignored_monsterhullidhandle)
{
    if(!
is_user_alive(id))
        return 
FMRES_IGNORED    
    
if(!Get_BitVar(g_InTempingAttackid))
        return 
FMRES_IGNORED
    
    
static Float:vecStart[3], Float:vecEnd[3], Float:v_angle[3], Float:v_forward[3], Float:view_ofs[3], Float:fOrigin[3]
    
    
pev(idpev_originfOrigin)
    
pev(idpev_view_ofsview_ofs)
    
xs_vec_add(fOriginview_ofsvecStart)
    
pev(idpev_v_anglev_angle)
    
    
engfunc(EngFunc_MakeVectorsv_angle)
    
get_global_vector(GL_v_forwardv_forward)
    
    
xs_vec_mul_scalar(v_forward0.0v_forward)
    
xs_vec_add(vecStartv_forwardvecEnd)
    
    
engfunc(EngFunc_TraceHullvecStartvecEndignored_monsterhullidhandle)
    
    return 
FMRES_SUPERCEDE
}

public 
fw_Item_AddToPlayer_Post(entid)
{
    if(!
pev_valid(ent))
        return 
HAM_IGNORED
        
    
if(pev(entpev_impulse) == WEAPON_SECRET_CODE)
    {
        
Remove_Cannon(id)
        
        
Set_BitVar(g_Had_Cannonid)
        
g_CannonRound[id] = pev(idpev_iuser1)
    }
    
    
message_begin(MSG_ONE_UNRELIABLEg_MsgWeaponList_id)
    
write_string(Get_BitVar(g_Had_Cannonid) ? "weapon_cannon" "weapon_mp5navy")
    
write_byte(10)
    
write_byte(20)
    
write_byte(-1)
    
write_byte(-1)
    
write_byte(0)
    
write_byte(7)
    
write_byte(Get_BitVar(g_Had_Cannonid) ? CSW_CANNON CSW_MP5NAVY)
    
write_byte(0)
    
message_end()            
    
    return 
HAM_HANDLED    
}

public 
HandleShoot_Cannon(id)
{
    if(
get_pdata_float(id835) > 0.0)
        return
    if(
g_CannonRound[id] <= 0)
        return
    if(
get_gametime() - TIME_RELOAD <= g_LastAttack[id])
    {
        
set_player_nextattack(idg_LastAttack[id] - get_gametime())
        return
    }
        
    static 
EntEnt fm_get_user_weapon_entity(idCSW_CANNON)
    if(!
pev_valid(Ent)) return        
    
    
g_CannonRound[id]--
    
update_ammo(id, -1g_CannonRound[id])

    
Create_FakeAttack(id)
    
    
set_weapon_anim(idrandom_num(CANNON_ANIM_SHOOT1CANNON_ANIM_SHOOT2))
    
emit_sound(idCHAN_WEAPONWeaponSounds[0], 1.0ATTN_NORM0PITCH_NORM)
    
    
Create_CannonFire(id)
    
Make_Push(id)

    
set_player_nextattack(idTIME_RELOAD)
    
set_weapons_timeidle(idCSW_CANNONTIME_RELOAD)
    
    
g_LastAttack[id] = get_gametime()
    
g_NextTime[id] = get_gametime()
}

public 
Check_CannonTime(id)
{
    if(
g_NextTime[id] == 0.0)
        return
    
    if(
get_gametime() - 0.1 g_NextTime[id])
    {
        
emit_sound(idCHAN_WEAPONWeaponSounds[0], 1.0ATTN_NORM0PITCH_NORM)
        
        
Make_FireSmoke(id)
        
Create_CannonFire(id)
        
Check_RadiusDamage(id)
        
        
// Stop
        
g_NextTime[id] = 0.0
    
}
}

public 
Create_CannonFire(id)
{
    const 
MAX_FIRE 12
    
static Float:StartOrigin[3], Float:TargetOrigin[MAX_FIRE][3], Float:Speed[MAX_FIRE]

    
// Get Target
    
    // -- Left
    
get_position(id100.0random_float(-10.0, -40.0), WEAPON_ATTACH_UTargetOrigin[0]); Speed[0] = 150.0
    get_position
(id100.0random_float(-10.0, -40.0), WEAPON_ATTACH_UTargetOrigin[1]); Speed[1] = 180.0
    get_position
(id100.0,    random_float(-10.0, -40.0), WEAPON_ATTACH_UTargetOrigin[2]); Speed[2] = 210.0
    get_position
(id100.0random_float(-10.0, -40.0), WEAPON_ATTACH_UTargetOrigin[3]); Speed[3] = 240.0
    get_position
(id100.0random_float(-10.0, -40.0), WEAPON_ATTACH_UTargetOrigin[4]); Speed[4] = 300.0

    
// -- Center
    
get_position(id100.00.0WEAPON_ATTACH_UTargetOrigin[5]); Speed[5] = 150.0
    get_position
(id100.00.0WEAPON_ATTACH_UTargetOrigin[6]); Speed[6] = 300.0
    
    
// -- Right
    
get_position(id100.0random_float(10.040.0), WEAPON_ATTACH_UTargetOrigin[7]); Speed[7] = 150.0
    get_position
(id100.0random_float(10.040.0), WEAPON_ATTACH_UTargetOrigin[8]); Speed[8] = 180.0
    get_position
(id100.0,    random_float(10.040.0), WEAPON_ATTACH_UTargetOrigin[9]); Speed[9] = 210.0
    get_position
(id100.0random_float(10.040.0), WEAPON_ATTACH_UTargetOrigin[10]); Speed[10] = 240.0
    get_position
(id100.0random_float(10.040.0), WEAPON_ATTACH_UTargetOrigin[11]); Speed[11] = 300.0

    
for(new 0MAX_FIREi++)
    {
        
// Get Start
        
get_position(idrandom_float(30.040.0), 0.0WEAPON_ATTACH_UStartOrigin)
        
Create_Fire(idStartOriginTargetOrigin[i], Speed[i])
    }
}

public 
Create_Fire(idFloat:Origin[3], Float:TargetOrigin[3], Float:Speed)
{
    static 
EntEnt engfunc(EngFunc_CreateNamedEntityengfunc(EngFunc_AllocString"env_sprite"))
    if(!
pev_valid(Ent)) return
    
    static 
Float:Velocity[3]

    
// Set info for ent
    
set_pev(Entpev_movetypeMOVETYPE_FLY)
    
set_pev(Entpev_rendermodekRenderTransAdd)
    
set_pev(Entpev_renderamt250.0)
    
set_pev(Entpev_fuser1get_gametime() + 0.75)    // time remove
    
set_pev(Entpev_scale0.5)
    
set_pev(Entpev_nextthinkhalflife_time() + 0.05)
    
    
entity_set_string(EntEV_SZ_classnameCANNONFIRE_CLASSNAME)
    
engfunc(EngFunc_SetModelEntWeaponResources[0])
    
set_pev(Entpev_minsFloat:{-1.0, -1.0, -1.0})
    
set_pev(Entpev_maxsFloat:{1.01.01.0})
    
set_pev(Entpev_originOrigin)
    
set_pev(Entpev_gravity0.01)
    
set_pev(Entpev_solidSOLID_TRIGGER)
    
set_pev(Entpev_frame0.0)
    
    
get_speed_vector(OriginTargetOriginSpeedVelocity)
    
set_pev(Entpev_velocityVelocity)
}

public 
Make_FireSmoke(id)
{
    static 
Float:Origin[3]
    
get_position(idWEAPON_ATTACH_FWEAPON_ATTACH_RWEAPON_ATTACH_UOrigin)
    
    
message_begin(MSG_BROADCASTSVC_TEMPENTITY
    
write_byte(TE_EXPLOSION
    
engfunc(EngFunc_WriteCoordOrigin[0])
    
engfunc(EngFunc_WriteCoordOrigin[1])
    
engfunc(EngFunc_WriteCoordOrigin[2])
    
write_short(g_SmokePuff_SprId)
    
write_byte(10)
    
write_byte(15)
    
write_byte(14)
    
message_end()
}

public 
Check_RadiusDamage(id)
{
    static 
Float:Origin[3]
    for(new 
0get_maxplayers(); i++)
    {
        if(!
is_user_alive(i))
            continue
        if(
id == i)
            continue
        
pev(ipev_originOrigin)
        if(!
is_in_viewcone(idOrigin1))
            continue
        if(
entity_range(idi) > float(RADIUS))
            continue
            
        
do_attack(idi0float(DAMAGE))
    }
}

public 
Create_FakeAttack(id)
{
    static 
EntEnt fm_get_user_weapon_entity(idCSW_KNIFE)
    if(!
pev_valid(Ent)) return
    
    
Set_BitVar(g_InTempingAttackid)
    
ExecuteHamB(Ham_Weapon_PrimaryAttackEnt)

    
// Set Real Attack Anim
    
static iAnimDesired,  szAnimation[64]

    
formatex(szAnimationcharsmax(szAnimation), (pev(idpev_flags) & FL_DUCKING) ? "crouch_shoot_%s" "ref_shoot_%s"WEAPON_ANIMEXT)
    if((
iAnimDesired lookup_sequence(idszAnimation)) == -1)
        
iAnimDesired 0
    
    set_pev
(idpev_sequenceiAnimDesired)
    
UnSet_BitVar(g_InTempingAttackid)
}

public 
Make_Push(id)
{
    static 
Float:VirtualVec[3]
    
VirtualVec[0] = random_float(-3.5, -7.0)
    
VirtualVec[1] = random_float(3.0, -3.0)
    
VirtualVec[2] = 0.0    
    
    set_pev
(idpev_punchangleVirtualVec)        
}

public 
update_ammo(idAmmoBpAmmo)
{
    
message_begin(MSG_ONE_UNRELIABLEg_MsgCurWeapon_id)
    
write_byte(1)
    
write_byte(CSW_CANNON)
    
write_byte(Ammo)
    
message_end()
    
    
message_begin(MSG_ONE_UNRELIABLEg_MsgAmmoX_id)
    
write_byte(10)
    
write_byte(BpAmmo)
    
message_end()
    
    
cs_set_user_bpammo(idCSW_CANNONBpAmmo)
}

do_attack(AttackerVictimInflictorFloat:fDamage)
{
    
fake_player_trace_attack(AttackerVictimfDamage)
    
fake_take_damage(AttackerVictimfDamageInflictor)
}

fake_player_trace_attack(iAttackeriVictim, &Float:fDamage)
{
    
// get fDirection
    
static Float:fAngles[3], Float:fDirection[3]
    
pev(iAttackerpev_anglesfAngles)
    
angle_vector(fAnglesANGLEVECTOR_FORWARDfDirection)
    
    
// get fStart
    
static Float:fStart[3], Float:fViewOfs[3]
    
pev(iAttackerpev_originfStart)
    
pev(iAttackerpev_view_ofsfViewOfs)
    
xs_vec_add(fViewOfsfStartfStart)
    
    
// get aimOrigin
    
static iAimOrigin[3], Float:fAimOrigin[3]
    
get_user_origin(iAttackeriAimOrigin3)
    
IVecFVec(iAimOriginfAimOrigin)
    
    
// TraceLine from fStart to AimOrigin
    
static ptrptr create_tr2() 
    
engfunc(EngFunc_TraceLinefStartfAimOriginDONT_IGNORE_MONSTERSiAttackerptr)
    static 
pHitpHit get_tr2(ptrTR_pHit)
    static 
iHitgroupiHitgroup get_tr2(ptrTR_iHitgroup)
    static 
Float:fEndPos[3]
    
get_tr2(ptrTR_vecEndPosfEndPos)

    
// get target & body at aiming
    
static iTargetiBody
    get_user_aiming
(iAttackeriTargetiBody)
    
    
// if aiming find target is iVictim then update iHitgroup
    
if (iTarget == iVictim)
    {
        
iHitgroup iBody
    
}
    
    
// if ptr find target not is iVictim
    
else if (pHit != iVictim)
    {
        
// get AimOrigin in iVictim
        
static Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
        
pev(iVictimpev_originfVicOrigin)
        
pev(iVictimpev_view_ofsfVicViewOfs
        
xs_vec_add(fVicViewOfsfVicOriginfAimInVictim)
        
fAimInVictim[2] = fStart[2]
        
fAimInVictim[2] += get_distance_f(fStartfAimInVictim) * floattanfAngles[0] * 2.0degrees )
        
        
// check aim in size of iVictim
        
static iAngleToVictimiAngleToVictim get_angle_to_target(iAttackerfVicOrigin)
        
iAngleToVictim abs(iAngleToVictim)
        static 
Float:fDisfDis 2.0 get_distance_f(fStartfAimInVictim) * floatsinfloat(iAngleToVictim) * 0.5degrees )
        static 
Float:fVicSize[3]
        
pev(iVictimpev_size fVicSize)
        if ( 
fDis <= fVicSize[0] * 0.5 )
        {
            
// TraceLine from fStart to aimOrigin in iVictim
            
static ptr2ptr2 create_tr2() 
            
engfunc(EngFunc_TraceLinefStartfAimInVictimDONT_IGNORE_MONSTERSiAttackerptr2)
            static 
pHit2pHit2 get_tr2(ptr2TR_pHit)
            static 
iHitgroup2iHitgroup2 get_tr2(ptr2TR_iHitgroup)
            
            
// if ptr2 find target is iVictim
            
if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
            {
                
pHit iVictim
                iHitgroup 
iHitgroup2
                get_tr2
(ptr2TR_vecEndPosfEndPos)
            }
            
            
free_tr2(ptr2)
        }
        
        
// if pHit still not is iVictim then set default HitGroup
        
if (pHit != iVictim)
        {
            
// set default iHitgroup
            
iHitgroup HIT_GENERIC
            
            
static ptr3ptr3 create_tr2() 
            
engfunc(EngFunc_TraceLinefStartfVicOriginDONT_IGNORE_MONSTERSiAttackerptr3)
            
get_tr2(ptr3TR_vecEndPosfEndPos)
            
            
// free ptr3
            
free_tr2(ptr3)
        }
    }
    
    
// set new Hit & Hitgroup & EndPos
    
set_tr2(ptrTR_pHitiVictim)
    
set_tr2(ptrTR_iHitgroupiHitgroup)
    
set_tr2(ptrTR_vecEndPosfEndPos)

    
// ExecuteHam
    
fake_trake_attack(iAttackeriVictimfDamagefDirectionptr)
    
    
// free ptr
    
free_tr2(ptr)
}

stock fake_trake_attack(iAttackeriVictimFloat:fDamageFloat:fDirection[3], iTraceHandleiDamageBit = (DMG_NEVERGIB DMG_BULLET))
{
    
ExecuteHamB(Ham_TraceAttackiVictimiAttackerfDamagefDirectioniTraceHandleiDamageBit)
}

stock fake_take_damage(iAttackeriVictimFloat:fDamageiInflictoriDamageBit = (DMG_NEVERGIB DMG_BULLET))
{
    
ExecuteHamB(Ham_TakeDamageiVictimiInflictoriAttackerfDamageiDamageBit)
}

stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize 0.0)
{
    static 
Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
    
pev(idpev_originfOrigin)
    
get_user_origin(idiAimOrigin3// end position from eyes
    
IVecFVec(iAimOriginfAimOrigin)
    
xs_vec_sub(fAimOriginfOriginfV1)
    
    static 
Float:fV2[3]
    
xs_vec_sub(fTargetfOriginfV2)
    
    static 
iResultiResult get_angle_between_vectors(fV1fV2)
    
    if (
TargetSize 0.0)
    {
        static 
Float:fTanfTan TargetSize get_distance_f(fOriginfTarget)
        static 
fAngleToTargetSizefAngleToTargetSize floatroundfloatatan(fTandegrees) )
        
iResult -= (iResult 0) ? fAngleToTargetSize : -fAngleToTargetSize
    
}
    
    return 
iResult
}

stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
    static 
Float:fA1[3], Float:fA2[3]
    
engfunc(EngFunc_VecToAnglesfV1fA1)
    
engfunc(EngFunc_VecToAnglesfV2fA2)
    
    static 
iResultiResult floatround(fA1[1] - fA2[1])
    
iResult iResult 360
    iResult 
= (iResult 180) ? (iResult 360) : iResult
    
    
return iResult
}

stock PlaySound(id, const sound[])
{
    if(
equal(sound[strlen(sound)-4], ".mp3")) client_cmd(id"mp3 play ^"sound/%s^""sound)
    else 
client_cmd(id"spk ^"%s^""sound)
}

stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speedFloat:new_velocity[3])
{
    
new_velocity[0] = origin2[0] - origin1[0]
    
new_velocity[1] = origin2[1] - origin1[1]
    
new_velocity[2] = origin2[2] - origin1[2]
    static 
Float:numnum floatsqroot(speed*speed / (new_velocity[0]*new_velocity[0] + new_velocity[1]*new_velocity[1] + new_velocity[2]*new_velocity[2]))
    
new_velocity[0] *= num
    new_velocity
[1] *= num
    new_velocity
[2] *= num
    
    
return 1;
}

stock set_weapons_timeidle(idWeaponId ,Float:TimeIdle)
{
    static 
entwpnentwpn fm_get_user_weapon_entity(idWeaponId)
    if(!
pev_valid(entwpn)) 
        return
        
    
set_pdata_float(entwpn46TimeIdle4)
    
set_pdata_float(entwpn47TimeIdle4)
    
set_pdata_float(entwpn48TimeIdle 0.54)
}

stock set_player_nextattack(idFloat:nexttime)
{
    
set_pdata_float(id83nexttime5)
}

stock set_weapon_anim(idanim)
{
    
set_pev(idpev_weaponanimanim)
    
    
message_begin(MSG_ONE_UNRELIABLESVC_WEAPONANIM, {000}, id)
    
write_byte(anim)
    
write_byte(pev(idpev_body))
    
message_end()
}

stock get_position(id,Float:forwFloat:rightFloat:upFloat:vStart[])
{
    static 
Float:vOrigin[3], Float:vAngle[3], Float:vForward[3], Float:vRight[3], Float:vUp[3]
    
    
pev(idpev_originvOrigin)
    
pev(idpev_view_ofs,vUp//for player
    
xs_vec_add(vOrigin,vUp,vOrigin)
    
pev(idpev_v_anglevAngle// if normal entity ,use pev_angles
    
    
angle_vector(vAngle,ANGLEVECTOR_FORWARD,vForward//or use EngFunc_AngleVectors
    
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


PHP Code:

public Entity_TakeDamage(const pEntity, const pInflictor, const pAttacker)
{
    static 
szClassName[sizeof NPC_CLASSNAME];
    
entity_get_string(pEntityEV_SZ_classnameszClassNamecharsmax(szClassName));
    if(!
equal(szClassNameNPC_CLASSNAME)) return;

    
entity_set_edict(pEntityEV_ENT_dmg_inflictorpAttacker);


I just can't think of a way. tried with native but failed. Any examples would be much appreciated.

Thanks in advance


All times are GMT -4. The time now is 07:33.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.