Hello I have this code that makes the grenades follow the enemy, I wanted to know if it is possible (and how) to make the player follow other players?
Or if it is possible to create an entity that follows players, but the player in turn chases them through the entity?
PHP Code:
#define AMMOX_HEGRENADE 12
public plugin_init() {
// FIND THROWN GRENADES
register_event("AmmoX", "on_AmmoX", "b")
}
//----------------------------------------------------------------------------------------------
public on_AmmoX(id)
{
if ( !is_user_alive(id) ) return
new iAmmoType = read_data(1)
new iAmmoCount = read_data(2)
if ( iAmmoType == AMMOX_HEGRENADE ) {
if ( iAmmoCount == 0 ) {
set_task(get_cvar_float("give_grenadetimer"), "give_weapons", id)
new iGrenade = -1
while ( (iGrenade = find_ent_by_class(iGrenade, "grenade")) > 0 ) {
// Set speed here since it gets called so much
gNadeSpeed = get_cvar_float("henade_nadespeed")
if ( gNadeSpeed <= 0.0 ) gNadeSpeed = 1.0
gPauseEntity[iGrenade] = true
new parm[3]
parm[0] = iGrenade
parm[1] = id
// If this changes so must nade_reset time or cooldown may not be set
// The longer the nade_rest time the more chance for error with attacker identity
set_task(1.0, "find_target", 0, parm, 3)
// Set the fuse
set_task(get_cvar_float("henade_fuse"), "unpause_nade", iGrenade, parm, 2)
}
}
}
else if ( iAmmoCount > 0 ) {
// Got a new nade remove the timer
remove_task(id)
}
}
//----------------------------------------------------------------------------------------------
public find_target(parm[])
{
new grenadeID = parm[0]
new grenadeOwner = parm[1]
if ( is_valid_ent(grenadeID) ) {
new shortestDistance = 9999
new nearestPlayer = 0
new distance, team[33], rgb[3], players[SH_MAXSLOTS], pnum
get_user_team(grenadeOwner, team, 32)
// Find all alive enemies and set trail color
if ( cs_get_user_team(grenadeOwner) == CS_TEAM_CT ) {
get_players(players, pnum, "ae", "TERRORIST")
rgb = {50, 50, 175}
}
else {
get_players(players, pnum, "ae", "CT")
rgb = {175, 50, 50}
}
// Find the closest enemy
for (new i = 0; i < pnum; i++) {
if ( !is_user_alive(players[i]) ) continue
distance = get_entity_distance(players[i], grenadeID)
if ( distance <= shortestDistance ) {
shortestDistance = distance
nearestPlayer = players[i]
}
}
// Make the nade seek that enemy if one exists
if ( nearestPlayer > 0 ) {
// Trail on grenade
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(22) // TE_BEAMFOLLOW
write_short(grenadeID) // entity:attachment to follow
write_short(gSpriteTrail) // sprite index
write_byte(10) // life in 0.1's
write_byte(3) // line width in 0.1's
write_byte(rgb[0]) // r
write_byte(rgb[1]) // g
write_byte(rgb[2]) // b
switch(random_num(0,2)) {
case 0:write_byte(64) // brightness
case 1:write_byte(128)
case 2:write_byte(192)
}
message_end()
parm[2] = nearestPlayer
set_task(0.1, "seek_target", grenadeID+1000, parm, 3, "b")
}
}
}
//----------------------------------------------------------------------------------------------
public seek_target(parm[])
{
new grenade = parm[0]
new target = parm[2]
if ( !is_valid_ent(grenade) ) {
remove_task(grenade+1000)
return
}
if ( is_user_alive(target) ) {
entity_set_follow(grenade, target)
}
else {
// Remove the seek loop
remove_task(grenade+1000)
// Stop the Trail
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
write_byte(99) //TE_KILLBEAM
write_short(grenade) // entity
message_end()
// Find a new player to seek
set_task(0.1, "find_target", 0, parm, 3)
}
}
//----------------------------------------------------------------------------------------------
stock entity_set_follow(entity, target)
{
if ( !is_valid_ent(entity) || !is_user_alive(target) ) return 0
new Float:fl_Origin[3], Float:fl_EntOrigin[3]
entity_get_vector(target, EV_VEC_origin, fl_Origin)
entity_get_vector(entity, EV_VEC_origin, fl_EntOrigin)
new Float:fl_InvTime = (gNadeSpeed / vector_distance(fl_Origin, fl_EntOrigin))
new Float:fl_Distance[3]
fl_Distance[0] = fl_Origin[0] - fl_EntOrigin[0]
fl_Distance[1] = fl_Origin[1] - fl_EntOrigin[1]
fl_Distance[2] = fl_Origin[2] - fl_EntOrigin[2]
new Float:fl_Velocity[3]
fl_Velocity[0] = fl_Distance[0] * fl_InvTime
fl_Velocity[1] = fl_Distance[1] * fl_InvTime
fl_Velocity[2] = fl_Distance[2] * fl_InvTime
entity_set_vector(entity, EV_VEC_velocity, fl_Velocity)
new Float:fl_NewAngle[3]
vector_to_angle(fl_Velocity, fl_NewAngle)
entity_set_vector(entity, EV_VEC_angles, fl_NewAngle)
return 1
}
//----------------------------------------------------------------------------------------------