now release the flamethrower to buy the shield.
the skin is reset each round and catch the ground ...
But do not fire him being on the water.
Since the event I have to detect if the player is in the water "water_zone (id)" and bool "inwater [id]"
PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <fakemeta_util>
#include <hamsandwich>
#include <cstrike>
#include <xs>
#include <fun>
// #include <zombieplague>
#define PLUGIN "Salamander"
#define VERSION "4.3"
#define AUTHOR "ALBJB"
#define DAMAGE 38
#define RECOIL 0.1
#define FIRE_SPEED 500.0
#define BURN_DAMAGE 15
#define BURN_LOOP 1.0
#define BURN_TIME 5.0
#define FIREBURN_CLASSNAME "fire_burn"
#define CSW_SALAMANDER CSW_M249
#define weapon_salamander "weapon_m249"
#define DEFAULT_W_MODEL "models/w_m249.mdl"
#define WEAPON_SECRET_CODE 1962+400
#define FIRE_CLASSNAME "fire"
// Fire Start
#define WEAPON_ATTACH_F 40.0
#define WEAPON_ATTACH_R 5.0
#define WEAPON_ATTACH_U -15.0
#define TASK_RESET_AMMO 5434
const pev_ammo = pev_iuser4
new const WeaponModel[3][] =
{
"models/v_flamethrower.mdl",
"models/p_flamethrower.mdl",
"models/w_flamethrower.mdl"
}
new const WeaponSound[6][] =
{
"weapons/flamegun-1.wav",
"weapons/flamegun-2.wav",
"weapons/flamegun_draw.wav",
"weapons/flamegun_clipin1.wav",
"weapons/flamegun_clipout1.wav",
"weapons/flamegun_clipout2.wav"
}
new const WeaponResource[7][] =
{
"sprites/flame_puff01.spr",
"sprites/flame_burn01.spr",
"sprites/weapon_flamethrower.txt",
"sprites/640hud7_2.spr",
"sprites/640hud59_2.spr",
"sprites/640hud60_2.spr",
"sprites/smokepuff.spr"
}
enum
{
MODEL_V = 0,
MODEL_P,
MODEL_W
}
enum
{
SALAMANDER_ANIM_IDLE = 0,
SALAMANDER_ANIM_SHOOT_BEGIN,
SALAMANDER_ANIM_SHOOT_END,
SALAMANDER_ANIM_RELOAD,
SALAMANDER_ANIM_DRAW
}
//g_had_salamander[33] = 0-1 Para saber si lo tienes o no puesto
new g_salamander
new g_had_salamander[33], g_old_weapon[33], Float:g_PunchAngles[33][3]
new g_smokepuff_id, g_weapon_event, g_register
new bool:tener[33]
new bool:inwater[33]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
/*
permisos:
a - global, para todos los jugadores sin usar id
b - para cada jugador con id
c - para repetir a cada jugador ??
d - para los jugadores muertos ??
e - para los jugadores vivos
*/
register_event("ResetHUD", "reset_salamander", "be")
register_event("DeathMsg", "muerte", "be")
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0")
register_event("CurWeapon", "event_CurWeapon", "be", "1=1")
register_forward(FM_UpdateClientData, "fw_UpdateClientData_Post", 1)
register_forward(FM_SetModel, "fw_SetModel")
register_forward(FM_PlaybackEvent, "fw_PlaybackEvent")
register_forward(FM_CmdStart, "fw_CmdStart")
register_think(FIRE_CLASSNAME, "fw_Fire_Think")
register_think(FIREBURN_CLASSNAME, "fw_FireBurn_Think")
register_touch(FIRE_CLASSNAME, "*", "fw_Fire_Touch")
RegisterHam(Ham_Spawn, "player", "fw_Spawn_Post", 1)
RegisterHam(Ham_Item_AddToPlayer, weapon_salamander, "fw_AddToPlayer_Post", 1)
RegisterHam(Ham_TraceAttack, "player", "fw_TraceAttack")
RegisterHam(Ham_TraceAttack, "worldspawn", "fw_TraceAttack")
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_salamander, "fw_Weapon_PrimaryAttack")
RegisterHam(Ham_Weapon_PrimaryAttack, weapon_salamander, "fw_Weapon_PrimaryAttack_Post", 1)
register_clcmd("say /lanzallamas", "get_salamander")
register_clcmd("say_team /lanzallamas", "get_salamander")
register_clcmd("lanzallamas", "hook_weapon")
register_forward(FM_PrecacheEvent, "fw_PrecacheEvent_Post", 1)
register_forward(FM_PlayerPreThink, "water_zone")//para saber si el jugador esta en el agua
register_cvar("salamander_cost", "8000")
}
public plugin_precache()
{
new i
for(i = 0; i < sizeof(WeaponModel); i++)
engfunc(EngFunc_PrecacheModel, WeaponModel[i])
for(i = 0; i < sizeof(WeaponSound); i++)
engfunc(EngFunc_PrecacheSound, WeaponSound[i])
engfunc(EngFunc_PrecacheModel, WeaponResource[0])
engfunc(EngFunc_PrecacheModel, WeaponResource[1])
//engfunc(EngFunc_PrecacheGeneric, WeaponResource[2])
engfunc(EngFunc_PrecacheModel, WeaponResource[3])
engfunc(EngFunc_PrecacheModel, WeaponResource[4])
engfunc(EngFunc_PrecacheModel, WeaponResource[5])
g_smokepuff_id = engfunc(EngFunc_PrecacheModel, WeaponResource[6])
/*
//WeaponModel[3]
precache_model("models/v_flamethrower.mdl")
precache_model("models/p_flamethrower.mdl")
precache_model("models/w_flamethrower.mdl")
//WeaponSound[6]
precache_sound("weapons/flamegun-1.wav")
precache_sound("weapons/flamegun-2.wav")
precache_sound("weapons/flamegun_draw.wav")
precache_sound("weapons/flamegun_clipin1.wav")
precache_sound("weapons/flamegun_clipout1.wav")
precache_sound("weapons/flamegun_clipout2.wav")
//WeaponResource[7]
precache_model("sprites/flame_puff01.spr")
precache_model("sprites/flame_burn01.spr")
precache_generic("sprites/weapon_flamethrower.txt")
precache_model("sprites/640hud7_2.spr")
precache_model("sprites/640hud59_2.spr")
precache_model("sprites/640hud60_2.spr")
precache_model("sprites/smokepuff.spr")
*/
}
public water_zone(id){
new waterlevel = pev(id, pev_waterlevel)
if (waterlevel > 0 && is_user_alive(id) && is_user_connected(id)){//Si el jugador esta en el agua
inwater[id] = true
}
else{
inwater[id] = false
}
/*
if(inwater[id] == true){
client_print ( id , print_chat , "Agua -> %d", inwater[id])
return
}
*/
}
public fw_PrecacheEvent_Post(type, const name[])
{
if(equal("events/m249.sc", name))
g_weapon_event = get_orig_retval()
}
public client_putinserver(id)
{
if(is_user_bot(id) && !g_register)
{
g_register = 1
set_task(0.1, "do_register", id)
}
}
public do_register(id)
{
RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
}
public zp_extra_item_selected(id, itemid)
{
if(itemid == g_salamander) get_salamander(id)
}
public get_salamander(id) //Cuando se escribe say: /salamander
{
new coste = get_cvar_num("salamander_cost")
if(!is_user_alive(id)){ //Si estas muerto
client_print(id, print_chat, "Intentalo cuando estes vivo...")
return
}
if ( cs_get_user_money(id) < coste ) { //Si NO tienes dinero
client_print(id, print_chat, "Necesitas %d$ para comprar el Lanzallamas.", get_cvar_num( "salamander_cost" ) )
return
}
if ( g_had_salamander[id] == 1 && tener[id] == true ) { //Si YA la tienes puesta
client_print(id, print_chat, "Ya la tienes puesta!" )
return
}
else{
cs_set_user_money( id, cs_get_user_money(id) - coste )
drop_weapons(id, 1) //para soltar el arma antigua al comprar la nueva
g_had_salamander[id] = 1
tener[id] = true //declara que si la tienes
fm_give_item(id, weapon_salamander)
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("CurWeapon"), _, id)
write_byte(1)
write_byte(CSW_SALAMANDER)
write_byte(100)
message_end()
give_item(id, "item_kevlar")
cs_set_user_bpammo(id, CSW_SALAMANDER, 200)//pone las balas
}
}
public remove_salamnader(id) //Cuando reinicia la ronda, cuando cojes y cuando sueltas el arma
{
if(!is_user_connected(id))
return
g_had_salamander[id] = 0
}
public hook_weapon(id) engclient_cmd(id, weapon_salamander)
public Event_NewRound()
{
remove_entity_name(FIRE_CLASSNAME)
remove_entity_name(FIREBURN_CLASSNAME)
}
public event_CurWeapon(id) //cuando sostener/ver/mantener arma
{
if(!is_user_alive(id))
return
if(get_user_weapon(id) == CSW_SALAMANDER && g_had_salamander[id]) //establece el model
{
set_pev(id, pev_viewmodel2, WeaponModel[MODEL_V])
set_pev(id, pev_weaponmodel2, WeaponModel[MODEL_P])
tener[id] = true
if(g_old_weapon[id] != CSW_SALAMANDER)
{
set_weapon_anim(id, SALAMANDER_ANIM_DRAW)
set_pdata_float(id, 83, 1.0, 5)
}
}
g_old_weapon[id] = get_user_weapon(id)
}
public reset_salamander(id) {
if ( tener[id] == true) { //Si YA la tienes puesta
g_had_salamander[id] = 1
//event_CurWeapon(id)
set_task(0.1, "event_CurWeapon", id)
return
}
}
public muerte(id) {
g_had_salamander[id] = 0
tener[id] = false
inwater[id] = false
}
public fw_UpdateClientData_Post(id, sendweapons, cd_handle)
{
if(!is_user_connected(id) || !is_user_alive(id))
return FMRES_IGNORED
if(get_user_weapon(id) != CSW_SALAMANDER || !g_had_salamander[id])
return FMRES_IGNORED
set_cd(cd_handle, CD_flNextAttack, get_gametime() + 0.001)
return FMRES_HANDLED
}
public fw_SetModel(entity, model[])
{
if(!pev_valid(entity))
return FMRES_IGNORED
static szClassName[33]
pev(entity, pev_classname, szClassName, charsmax(szClassName))
if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED
static id
id = pev(entity, pev_owner)
if(equal(model, DEFAULT_W_MODEL))
{
static weapon
weapon = fm_find_ent_by_owner(-1, weapon_salamander, entity)
if(!pev_valid(weapon))
return FMRES_IGNORED
if(g_had_salamander[id])
{
set_pev(weapon, pev_impulse, WEAPON_SECRET_CODE)
engfunc(EngFunc_SetModel, entity, WeaponModel[MODEL_W])
remove_salamnader(id) //cuando la sueltas
tener[id] = false
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public fw_PlaybackEvent(flags, invoker, eventid, Float:delay, Float:origin[3], Float:angles[3], Float:fparam1, Float:fparam2, iParam1, iParam2, bParam1, bParam2)
{
if(!is_user_connected(invoker) || !is_user_alive(invoker))
return FMRES_IGNORED
if(get_user_weapon(invoker) != CSW_SALAMANDER || !g_had_salamander[invoker])
return FMRES_IGNORED
if(eventid == g_weapon_event)
{
playback_event(flags | FEV_HOSTONLY, invoker, eventid, delay, origin, angles, fparam1, fparam2, iParam1, iParam2, bParam1, bParam2)
set_weapon_anim(invoker, SALAMANDER_ANIM_SHOOT_BEGIN)
return FMRES_SUPERCEDE
}
return FMRES_HANDLED
}
public fw_CmdStart(id, uc_handle, seed)
{
if(!is_user_connected(id) || !is_user_alive(id))
return FMRES_IGNORED
if(get_user_weapon(id) != CSW_SALAMANDER || !g_had_salamander[id])
return FMRES_IGNORED
static PressedButton
PressedButton = get_uc(uc_handle, UC_Buttons)
if(!(PressedButton & IN_ATTACK))
{
if((pev(id, pev_oldbuttons) & IN_ATTACK) && pev(id, pev_weaponanim) == SALAMANDER_ANIM_SHOOT_BEGIN)
{
static weapon; weapon = fm_get_user_weapon_entity(id, CSW_SALAMANDER)
if(pev_valid(weapon)) set_pdata_float(weapon, 48, 2.0, 4)
set_weapon_anim(id, SALAMANDER_ANIM_SHOOT_END)
make_fire_smoke(id)
}
}
return FMRES_HANDLED
}
public fw_Spawn_Post(id)
{
if(tener[id] == true){
remove_salamnader(id) //cuando se reinicia la ronda
}
}
public fw_AddToPlayer_Post(ent, id)
{
if(!pev_valid(ent))
return HAM_IGNORED
if(pev(ent, pev_impulse) == WEAPON_SECRET_CODE)
{
remove_salamnader(id)
g_had_salamander[id] = 1
tener[id] = true
}
message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("WeaponList"), _, id)
write_string(g_had_salamander[id] == 1 ? "weapon_flamethrower" : "weapon_m249")
write_byte(3)
write_byte(200)
write_byte(-1)
write_byte(-1)
write_byte(0)
write_byte(4)
write_byte(CSW_SALAMANDER)
write_byte(0)
message_end()
return HAM_HANDLED
}
public fw_TraceAttack(Ent, Attacker, Float:Damage, Float:Dir[3], ptr, DamageType)
{
if(!is_user_alive(Attacker))
return HAM_IGNORED
if(get_user_weapon(Attacker) != CSW_SALAMANDER || !g_had_salamander[Attacker])
return HAM_IGNORED
static Float:Origin[3], Float:TargetOrigin[3]
get_position(Attacker, WEAPON_ATTACH_F, WEAPON_ATTACH_R, WEAPON_ATTACH_U + 10.0, Origin)
get_position(Attacker, WEAPON_ATTACH_F * 100.0, WEAPON_ATTACH_R, WEAPON_ATTACH_U + 10.0, TargetOrigin)
create_fire(Attacker, Origin, TargetOrigin, FIRE_SPEED)
return HAM_SUPERCEDE
}
public fw_Weapon_PrimaryAttack(ent)
{
static id; id = pev(ent, pev_owner)
pev(id, pev_punchangle, g_PunchAngles[id])
return HAM_IGNORED
}
public fw_Weapon_PrimaryAttack_Post(ent)
{
static id; id = pev(ent,pev_owner)
if(get_user_weapon(id) == CSW_SALAMANDER && g_had_salamander[id])
{
static Float:push[3]
pev(id, pev_punchangle, push)
xs_vec_sub(push, g_PunchAngles[id], push)
xs_vec_mul_scalar(push, RECOIL, push)
xs_vec_add(push, g_PunchAngles[id], push)
set_pev(id, pev_punchangle, push)
}
return HAM_IGNORED
}
public create_fake_attack(id)
{
static weapon
weapon = fm_find_ent_by_owner(-1, "weapon_knife", id)
if(pev_valid(weapon)) ExecuteHamB(Ham_Weapon_PrimaryAttack, weapon)
}
public create_fire(id, Float:Origin[3], Float:TargetOrigin[3], Float:Speed)
{
new iEnt = create_entity("env_sprite")
static Float:vfAngle[3], Float:MyOrigin[3], Float:Velocity[3]
pev(id, pev_angles, vfAngle)
pev(id, pev_origin, MyOrigin)
vfAngle[2] = float(random(18) * 20)
// set info for ent
set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
set_pev(iEnt, pev_rendermode, kRenderTransAdd)
set_pev(iEnt, pev_renderamt, 250.0)
set_pev(iEnt, pev_fuser1, get_gametime() + 1.0) // time remove
set_pev(iEnt, pev_scale, 0.5)
set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
entity_set_string(iEnt, EV_SZ_classname, FIRE_CLASSNAME)
engfunc(EngFunc_SetModel, iEnt, WeaponResource[0])
set_pev(iEnt, pev_mins, Float:{-1.0, -1.0, -1.0})
set_pev(iEnt, pev_maxs, Float:{1.0, 1.0, 1.0})
set_pev(iEnt, pev_origin, Origin)
set_pev(iEnt, pev_gravity, 0.01)
set_pev(iEnt, pev_angles, vfAngle)
set_pev(iEnt, pev_solid, SOLID_TRIGGER)
set_pev(iEnt, pev_owner, id)
set_pev(iEnt, pev_frame, 0.0)
set_pev(iEnt, pev_iuser2, get_user_team(id))
get_speed_vector(Origin, TargetOrigin, Speed, Velocity)
set_pev(iEnt, pev_velocity, Velocity)
emit_sound(iEnt, CHAN_BODY, WeaponSound[random_num(0, 1)], 1.0, ATTN_NORM, 0, PITCH_NORM)
}
public fw_Fire_Think(iEnt)
{
if(!pev_valid(iEnt))
return
new Float:fFrame, Float:fScale, Float:fNextThink
pev(iEnt, pev_frame, fFrame)
pev(iEnt, pev_scale, fScale)
// effect exp
new iMoveType = pev(iEnt, pev_movetype)
if (iMoveType == MOVETYPE_NONE)
{
fNextThink = 0.015
fFrame += 1.0
fScale = floatmax(fScale, 1.75)
if (fFrame > 21.0)
{
engfunc(EngFunc_RemoveEntity, iEnt)
return
}
}
// effect normal
else
{
fNextThink = 0.045
fFrame += 1.0
fFrame = floatmin(21.0, fFrame)
fScale += 0.2
fScale = floatmin(fScale, 1.75)
}
set_pev(iEnt, pev_frame, fFrame)
set_pev(iEnt, pev_scale, fScale)
set_pev(iEnt, pev_nextthink, get_gametime() + fNextThink)
// time remove
static Float:fTimeRemove
pev(iEnt, pev_fuser1, fTimeRemove)
if (get_gametime() >= fTimeRemove)
{
engfunc(EngFunc_RemoveEntity, iEnt)
return;
}
}
public fw_Fire_Touch(ent, id)
{
if(!pev_valid(ent))
return
if(pev_valid(id))
{
static Classname[32]
pev(id, pev_classname, Classname, sizeof(Classname))
if(equal(Classname, FIRE_CLASSNAME)) return
else if(is_user_alive(id))
{
static EntTeam; EntTeam = pev(ent, pev_iuser2)
if(get_user_team(id) != EntTeam)
{
do_attack(pev(ent, pev_owner), id, 0, float(DAMAGE))
Make_FireBurn(id)
}
}
}
set_pev(ent, pev_movetype, MOVETYPE_NONE)
set_pev(ent, pev_solid, SOLID_NOT)
}
public make_fire_smoke(id)
{
static Float:Origin[3]
get_position(id, WEAPON_ATTACH_F, WEAPON_ATTACH_R, WEAPON_ATTACH_U, Origin)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(TE_EXPLOSION)
engfunc(EngFunc_WriteCoord, Origin[0])
engfunc(EngFunc_WriteCoord, Origin[1])
engfunc(EngFunc_WriteCoord, Origin[2])
write_short(g_smokepuff_id)
write_byte(5)
write_byte(30)
write_byte(14)
message_end()
}
public Make_FireBurn(id)
{
static Ent; Ent = fm_find_ent_by_owner(-1, FIREBURN_CLASSNAME, id)
if(!pev_valid(Ent))
{
new iEnt = create_entity("env_sprite")
static Float:MyOrigin[3]
pev(id, pev_origin, MyOrigin)
// set info for ent
set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
set_pev(iEnt, pev_rendermode, kRenderTransAdd)
set_pev(iEnt, pev_renderamt, 250.0)
set_pev(iEnt, pev_fuser1, get_gametime() + 5.0) // time remove
set_pev(iEnt, pev_scale, 1.0)
set_pev(iEnt, pev_nextthink, get_gametime() + 0.5)
entity_set_string(iEnt, EV_SZ_classname, FIREBURN_CLASSNAME)
engfunc(EngFunc_SetModel, iEnt, WeaponResource[1])
set_pev(iEnt, pev_origin, MyOrigin)
set_pev(iEnt, pev_owner, id)
set_pev(iEnt, pev_aiment, id)
set_pev(iEnt, pev_frame, 0.0)
}
}
public fw_FireBurn_Think(iEnt)
{
if(!pev_valid(iEnt))
return
static Float:fFrame
pev(iEnt, pev_frame, fFrame)
// effect exp
fFrame += 1.0
if(fFrame > 15.0) fFrame = 0.0
set_pev(iEnt, pev_frame, fFrame)
set_pev(iEnt, pev_nextthink, get_gametime() + 0.05)
static id
id = pev(iEnt, pev_owner)
if(get_gametime() - BURN_LOOP > pev(iEnt, pev_fuser2))
{
ExecuteHam(Ham_TakeDamage, id, 0, id, 0.0, DMG_BURN)
if((get_user_health(id) - BURN_DAMAGE) > 0)
set_user_health(id, get_user_health(id) - BURN_DAMAGE)
else
user_kill(id)
set_pev(iEnt, pev_fuser2, get_gametime())
}
// time remove
static Float:fTimeRemove
pev(iEnt, pev_fuser1, fTimeRemove)
if (get_gametime() >= fTimeRemove)
{
engfunc(EngFunc_RemoveEntity, iEnt)
return;
}
}
do_attack(Attacker, Victim, Inflictor, Float:fDamage)
{
fake_player_trace_attack(Attacker, Victim, fDamage)
fake_take_damage(Attacker, Victim, fDamage, Inflictor)
}
public fake_player_trace_attack(iAttacker, iVictim, &Float:fDamage)
{
// get fDirection
new Float:fAngles[3], Float:fDirection[3]
pev(iAttacker, pev_angles, fAngles)
angle_vector(fAngles, ANGLEVECTOR_FORWARD, fDirection)
// get fStart
new Float:fStart[3], Float:fViewOfs[3]
pev(iAttacker, pev_origin, fStart)
pev(iAttacker, pev_view_ofs, fViewOfs)
xs_vec_add(fViewOfs, fStart, fStart)
// get aimOrigin
new iAimOrigin[3], Float:fAimOrigin[3]
get_user_origin(iAttacker, iAimOrigin, 3)
IVecFVec(iAimOrigin, fAimOrigin)
// TraceLine from fStart to AimOrigin
new ptr = create_tr2()
engfunc(EngFunc_TraceLine, fStart, fAimOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr)
new pHit = get_tr2(ptr, TR_pHit)
new iHitgroup = get_tr2(ptr, TR_iHitgroup)
new Float:fEndPos[3]
get_tr2(ptr, TR_vecEndPos, fEndPos)
// get target & body at aiming
new iTarget, iBody
get_user_aiming(iAttacker, iTarget, iBody)
// 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
new Float:fVicOrigin[3], Float:fVicViewOfs[3], Float:fAimInVictim[3]
pev(iVictim, pev_origin, fVicOrigin)
pev(iVictim, pev_view_ofs, fVicViewOfs)
xs_vec_add(fVicViewOfs, fVicOrigin, fAimInVictim)
fAimInVictim[2] = fStart[2]
fAimInVictim[2] += get_distance_f(fStart, fAimInVictim) * floattan( fAngles[0] * 2.0, degrees )
// check aim in size of iVictim
new iAngleToVictim = get_angle_to_target(iAttacker, fVicOrigin)
iAngleToVictim = abs(iAngleToVictim)
new Float:fDis = 2.0 * get_distance_f(fStart, fAimInVictim) * floatsin( float(iAngleToVictim) * 0.5, degrees )
new Float:fVicSize[3]
pev(iVictim, pev_size , fVicSize)
if ( fDis <= fVicSize[0] * 0.5 )
{
// TraceLine from fStart to aimOrigin in iVictim
new ptr2 = create_tr2()
engfunc(EngFunc_TraceLine, fStart, fAimInVictim, DONT_IGNORE_MONSTERS, iAttacker, ptr2)
new pHit2 = get_tr2(ptr2, TR_pHit)
new iHitgroup2 = get_tr2(ptr2, TR_iHitgroup)
// if ptr2 find target is iVictim
if ( pHit2 == iVictim && (iHitgroup2 != HIT_HEAD || fDis <= fVicSize[0] * 0.25) )
{
pHit = iVictim
iHitgroup = iHitgroup2
get_tr2(ptr2, TR_vecEndPos, fEndPos)
}
free_tr2(ptr2)
}
// if pHit still not is iVictim then set default HitGroup
if (pHit != iVictim)
{
// set default iHitgroup
iHitgroup = HIT_GENERIC
new ptr3 = create_tr2()
engfunc(EngFunc_TraceLine, fStart, fVicOrigin, DONT_IGNORE_MONSTERS, iAttacker, ptr3)
get_tr2(ptr3, TR_vecEndPos, fEndPos)
// free ptr3
free_tr2(ptr3)
}
}
// set new Hit & Hitgroup & EndPos
set_tr2(ptr, TR_pHit, iVictim)
set_tr2(ptr, TR_iHitgroup, iHitgroup)
set_tr2(ptr, TR_vecEndPos, fEndPos)
// hitgroup multi fDamage
new Float:fMultifDamage
switch(iHitgroup)
{
case HIT_HEAD: fMultifDamage = 4.0
case HIT_STOMACH: fMultifDamage = 1.25
case HIT_LEFTLEG: fMultifDamage = 0.75
case HIT_RIGHTLEG: fMultifDamage = 0.75
default: fMultifDamage = 1.0
}
fDamage *= fMultifDamage
// ExecuteHam
fake_trake_attack(iAttacker, iVictim, fDamage, fDirection, ptr)
// free ptr
free_tr2(ptr)
}
stock fake_trake_attack(iAttacker, iVictim, Float:fDamage, Float:fDirection[3], iTraceHandle, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHam(Ham_TraceAttack, iVictim, iAttacker, fDamage, fDirection, iTraceHandle, iDamageBit)
}
stock fake_take_damage(iAttacker, iVictim, Float:fDamage, iInflictor, iDamageBit = (DMG_NEVERGIB | DMG_BULLET))
{
ExecuteHam(Ham_TakeDamage, iVictim, iInflictor, iAttacker, fDamage, iDamageBit)
}
stock get_angle_to_target(id, const Float:fTarget[3], Float:TargetSize = 0.0)
{
new Float:fOrigin[3], iAimOrigin[3], Float:fAimOrigin[3], Float:fV1[3]
pev(id, pev_origin, fOrigin)
get_user_origin(id, iAimOrigin, 3) // end position from eyes
IVecFVec(iAimOrigin, fAimOrigin)
xs_vec_sub(fAimOrigin, fOrigin, fV1)
new Float:fV2[3]
xs_vec_sub(fTarget, fOrigin, fV2)
new iResult = get_angle_between_vectors(fV1, fV2)
if (TargetSize > 0.0)
{
new Float:fTan = TargetSize / get_distance_f(fOrigin, fTarget)
new fAngleToTargetSize = floatround( floatatan(fTan, degrees) )
iResult -= (iResult > 0) ? fAngleToTargetSize : -fAngleToTargetSize
}
return iResult
}
stock get_angle_between_vectors(const Float:fV1[3], const Float:fV2[3])
{
new Float:fA1[3], Float:fA2[3]
engfunc(EngFunc_VecToAngles, fV1, fA1)
engfunc(EngFunc_VecToAngles, fV2, fA2)
new iResult = floatround(fA1[1] - fA2[1])
iResult = iResult % 360
iResult = (iResult > 180) ? (iResult - 360) : iResult
return iResult
}
stock set_weapon_anim(id, anim)
{
if(!is_user_alive(id) || pev(id, pev_weaponanim) == anim)
return
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 drop_weapons(id, dropwhat) //para soltar el arma antigua al comprar la nueva
{
static weapons[32], num, i, weaponid
num = 0
get_user_weapons(id, weapons, num)
const PRIMARY_WEAPONS_BIT_SUM = (1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_MAC10)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_MAC10)|(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)
for (i = 0; i < num; i++)
{
weaponid = weapons[i]
if (dropwhat == 1 && ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM))
{
static wname[32]
get_weaponname(weaponid, wname, sizeof wname - 1)
engclient_cmd(id, "drop", wname)
}
}
if( cs_get_user_shield(id) > 0 )//Para saber si tiene el escudo y soltarlo
engclient_cmd(id, "drop", "weapon_shield")
}
stock set_player_nextattack(player, weapon_id, Float:NextTime)
{
const m_flNextPrimaryAttack = 46
const m_flNextSecondaryAttack = 47
const m_flTimeWeaponIdle = 48
const m_flNextAttack = 83
static weapon
weapon = fm_get_user_weapon_entity(player, weapon_id)
set_pdata_float(player, m_flNextAttack, NextTime, 5)
if(pev_valid(weapon))
{
set_pdata_float(weapon, m_flNextPrimaryAttack , NextTime, 4)
set_pdata_float(weapon, m_flNextSecondaryAttack, NextTime, 4)
set_pdata_float(weapon, m_flTimeWeaponIdle, NextTime, 4)
}
}
stock get_position(id,Float:forw, Float:right, Float:up, Float:vStart[])
{
new 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) //for player
xs_vec_add(vOrigin,vUp,vOrigin)
pev(id, pev_v_angle, vAngle) // 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
}
stock get_speed_vector(const Float:origin1[3],const Float:origin2[3],Float:speed, Float:new_velocity[3])
{
new_velocity[0] = origin2[0] - origin1[0]
new_velocity[1] = origin2[1] - origin1[1]
new_velocity[2] = origin2[2] - origin1[2]
new Float:num = 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;
}