Entities velocity query
Im trying to make it so i can shoot a grenade from my grenade launcher, but when i look straight up or down, the grenade shoots at an angle and not where I look. Here is the code:
I dont think im creating the entity correctly.
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <engine>
#include <cstrike>
#define PLUGIN "Weapons Menu"
#define VERSION "1.0"
#define AUTHOR "Max!"
#define MAXDAMAGE 0.0
#define EXPLODERADIUS 100.0
#define MAXWEAPONS 3
#define SHOTDELAY 0.5
#define GRENADE 3695
new g_WeaponType[MAXWEAPONS]
new Float:g_shotdelay[33]
new explosion, rocketsmoke
static const g_rocketmodel[32] = "models/rpgrocket.mdl"
public plugin_precache()
{
precache_model(g_rocketmodel)
explosion = precache_model("sprites/zerogxplode.spr")
rocketsmoke = precache_model("sprites/smoke.spr")
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_event("CurWeapon", "Event_CurWeapon", "be")
register_forward(FM_PlayerPreThink, "Forward_PreThink", 1)
register_forward(FM_UpdateClientData, "UpdateClientData_Post", 1)
register_forward(FM_Touch, "Forward_Touch")
}
public Event_CurWeapon(id)
{
}
public UpdateClientData_Post( id, sendweapons, cd_handle )
{
if (!is_user_alive(id))
return FMRES_IGNORED
set_cd(cd_handle, CD_ID, 0)
return FMRES_HANDLED
}
public Forward_PreThink(id)
{
if(g_shotdelay[id] <= get_gametime())
{
if(pev(id, pev_button) & IN_ATTACK)
{
new Float:origin[3]
pev(id, pev_origin, origin)
origin[2] += 15
new Float:vAngles[3]
new Float:vReturn[3]
new Float:fDistance = 1200.0
new Float:Angle[3]
entity_get_vector(id,EV_VEC_v_angle,vAngles)
vReturn[0] = floatcos( vAngles[1], degrees ) * fDistance
vReturn[1] = floatsin( vAngles[1], degrees ) * fDistance
vReturn[2] = floatsin( -vAngles[0], degrees ) * fDistance
new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
engfunc(EngFunc_SetOrigin, ent, origin)
set_pev(ent, pev_movetype, MOVETYPE_BOUNCE)
pev(id, pev_angles, Angle)
set_pev(ent, pev_angles, Angle)
engfunc(EngFunc_SetSize, ent, Float:{-3.0, -3.0, -3.0}, Float:{3.0, 3.0, 3.0})
engfunc(EngFunc_SetModel, ent, g_rocketmodel)
set_pev(ent, pev_gravity, 0.3)
set_pev(ent, pev_iuser3, GRENADE)
set_pev(ent, pev_velocity, vReturn)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(22)
write_short(ent)
write_short(rocketsmoke)
write_byte(3)
write_byte(3)
write_byte(255)
write_byte(255)
write_byte(255)
write_byte(255)
message_end()
g_shotdelay[id] = get_gametime() + SHOTDELAY
}
set_pev(id, pev_button, pev(id,pev_button) & ~IN_ATTACK )
}
else
{
set_pev(id, pev_button, pev(id,pev_button) & ~IN_ATTACK )
}
}
public Forward_Touch(toucher, touched)
{
if(pev(touched, pev_iuser3) == GRENADE)
{
Explosion(touched)
}
}
public Explosion(grenade)
{
new ent = -1
new Float:grenadeorigin[3]
pev(grenade, pev_origin, grenadeorigin)
while((ent = engfunc( EngFunc_FindEntityInSphere, ent, grenadeorigin, EXPLODERADIUS)) != 0)
{
if(is_user_alive(ent))
{
new Float:origin[3]
pev(ent, pev_origin, origin)
new Float:damage = MAXDAMAGE * (floatabs((EXPLODERADIUS - get_distance_f(grenadeorigin, origin)) / EXPLODERADIUS))
fakedamage(ent, "weapon_hegrenade", damage, DMG_BLAST)
Bounce(ent, grenade)
}
}
message_begin(MSG_BROADCAST, SVC_TEMPENTITY) // Explosion
write_byte(TE_EXPLOSION)
write_coord(floatround(grenadeorigin[0]))
write_coord(floatround(grenadeorigin[1]))
write_coord(floatround(grenadeorigin[2])+5)
write_short(explosion)
write_byte(20)
write_byte(12) // framerate
write_byte(TE_EXPLFLAG_NONE)
message_end()
engfunc(EngFunc_RemoveEntity, grenade)
}
Bounce(id, explosion)
{
new Float:distance, Float:origin[3], Float:origin2[3]
pev(id, pev_origin, origin)
pev(explosion, pev_origin, origin2)
distance = get_distance_f(origin, origin2) * 5
new Float:vReturn[3]
new Float:Angle1[3]
new Float:Angle2[3]
new Float:Return[3]
entity_get_vector(id,EV_VEC_v_angle, Angle1)
entity_get_vector(explosion,EV_VEC_v_angle, Angle2)
Return[0] = (Angle2[0] - Angle1[0])
Return[1] = (Angle2[1] - Angle1[1])
vReturn[0] = floatcos(Return[1] + 180, degrees) * distance
vReturn[1] = floatsin(Return[1], degrees) * distance
vReturn[2] = floatsin(-Return[0], degrees) * distance
//new Float:damage = MAXDAMAGE * (floatabs((EXPLODERADIUS - get_distance_f(grenadeorigin, origin)) / EXPLODERADIUS))
set_pev(id, pev_velocity, vReturn)
}
|