Raised This Month: $51 Target: $400
 12% 

Ent Follow Players


Post New Thread Reply   
 
Thread Tools Display Modes
Author Message
Arje
Senior Member
Join Date: Apr 2020
Location: Córdoba, Argentina
Old 02-11-2022 , 15:45   Ent Follow Players
Reply With Quote #1

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 == ) {
            
            
set_task(get_cvar_float("give_grenadetimer"), "give_weapons"id)
            new 
iGrenade = -1
            
while ( (iGrenade find_ent_by_class(iGrenade"grenade")) > ) {
                    

                
// 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"0parm3)

                
// Set the fuse
                
set_task(get_cvar_float("henade_fuse"), "unpause_nade"iGrenadeparm2)
                }
            }
        }

        else if ( 
iAmmoCount ) {
            
// 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 distanceteam[33], rgb[3], players[SH_MAXSLOTS], pnum

        get_user_team
(grenadeOwnerteam32)

        
// Find all alive enemies and set trail color
        
if ( cs_get_user_team(grenadeOwner) == CS_TEAM_CT ) {
            
get_players(playerspnum"ae""TERRORIST")
            
rgb = {5050175}
        }
        else {
            
get_players(playerspnum"ae""CT")
            
rgb = {1755050}
        }

        
// Find the closest enemy
        
for (new 0pnumi++) {
            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 ) {
            
// Trail on grenade
            
message_begin(MSG_BROADCASTSVC_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+1000parm3"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(grenadetarget)
    }
    else {
        
// Remove the seek loop
        
remove_task(grenade+1000)

        
// Stop the Trail
        
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
        
write_byte(99)            //TE_KILLBEAM
        
write_short(grenade)    // entity
        
message_end()

        
// Find a new player to seek
        
set_task(0.1"find_target"0parm3)
    }
}
//----------------------------------------------------------------------------------------------
stock entity_set_follow(entitytarget)
{
    if ( !
is_valid_ent(entity) || !is_user_alive(target) ) return 0

    
new Float:fl_Origin[3], Float:fl_EntOrigin[3]
    
entity_get_vector(targetEV_VEC_originfl_Origin)
    
entity_get_vector(entityEV_VEC_originfl_EntOrigin)

    new 
Float:fl_InvTime = (gNadeSpeed vector_distance(fl_Originfl_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
(entityEV_VEC_velocityfl_Velocity)

    new 
Float:fl_NewAngle[3]
    
vector_to_angle(fl_Velocityfl_NewAngle)
    
entity_set_vector(entityEV_VEC_anglesfl_NewAngle)

    return 
1
}
//---------------------------------------------------------------------------------------------- 
Arje is offline
kww
Senior Member
Join Date: Feb 2021
Location: Russia
Old 02-13-2022 , 10:17   Re: Ent Follow Players
Reply With Quote #2

offtop: use pcvars
__________________
Now working on: Side Weapons (Very lazy, tbh)
Avatar source: https://bit.ly/3BAk19g
Discord: kww#9951
kww is offline
AdrenalinesWrath
Junior Member
Join Date: Aug 2017
Old 02-14-2022 , 18:38   Re: Ent Follow Players
Reply With Quote #3

try this, untested.

Code:
stock drag_player(id,victim,Float:Speed)
{
	if(!is_user_alive(id) || !is_user_alive(victim))
		return;
	
	new Float:FVel[3],Float:Origin_id[3], Float:Origin_Victim[3],FDist;
	
	pev(id,pev_origin,Origin_id);
	pev(victim,pev_origin,Origin_Victim);
	FDist = get_distance_f(Origin_id, Origin_Victim);
	
	if (FDist > 2.0) {
		FVel[0] = (Origin_id[0] - Origin_Victim[0]) / (FDist / Speed);
		FVel[1] = (Origin_id[1] - Origin_Victim[1]) / (FDist / Speed);
		FVel[2] = (Origin_id[2] - Origin_Victim[2]) / (FDist / Speed);
	} else {
		FVel[0] = 0.0;
		FVel[1] = 0.0;
		FVel[2] = 0.0;
	}
	set_pev(victim,pev_velocity,FVel);
}
__________________
"True Strength's keeping everything together, while everyone expects you to fall apart."
AdrenalinesWrath is offline
Arje
Senior Member
Join Date: Apr 2020
Location: Córdoba, Argentina
Old 02-14-2022 , 20:23   Re: Ent Follow Players
Reply With Quote #4

Thanks for the time, but not found for me.
but I was able to solve it with the first code that I had uploaded

PHP Code:

public chidori(id)
{
    if ( !
is_user_alive(id) ) return;
    
    new 
attacker id
    
//new target = read_data(2)
    
    // Set speed here since it gets called so much
    
gNadeSpeed get_pcvar_float(PcvarSpeed)
    if ( 
gNadeSpeed <= 0.0 gNadeSpeed 1.0 
    
    
new parm[2]
    
parm[0] = attacker
    
//parm[1] = target
    
    
set_task(0.1"find_target"0parm2)
    
    new 
classname[32]
    
entity_get_string(attackerEV_SZ_classnameclassname31)
    if ( 
equal(classname"player") ) {
            
gPauseEntity[attacker] = true
        
}
    
}
    
//----------------------------------------------------------------------------------------------
public find_target(parm[])
{
    new 
attacker parm[0]
    
    if ( 
is_user_alive(attacker) ) {
        
        new 
classname[32]
        
entity_get_string(attackerEV_SZ_classnameclassname31)
        if ( 
equal(classname"player") ) {
            
            
gPauseEntity[attacker] = true
        
            
new shortestDistance 9999
            
new nearestPlayer 0
            
new distanceteam[33], rgb[3], players[SH_MAXSLOTS], pnum

            get_user_team
(attackerteam32

            
// Find all alive enemies and set trail color
            
if ( cs_get_user_team(attacker) == CS_TEAM_CT ) {
                
get_players(playerspnum"ae""TERRORIST")
                
rgb = {5050175}
            }
            else {
                
get_players(playerspnum"ae""CT")
                
rgb = {1755050}
            }

        
          
            
// Find the closest enemy
            
for (new 0pnumi++) {
                if ( !
is_user_alive(players[i]) ) continue

                
distance =  get_entity_distance(players[i], attacker)

                if ( 
distance <= shortestDistance ) {
                    
shortestDistance distance
                    nearestPlayer 
players[i]
                }
            }
 
            
// Make the nade seek that enemy if one exists
            
if ( nearestPlayer ) {
                
// Trail on grenade
                
message_begin(MSG_BROADCASTSVC_TEMPENTITY)
                
write_byte(22)                // TE_BEAMFOLLOW
                
write_short(attacker)        // 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[1] = nearestPlayer
                set_task
(0.1"seek_target"attacker+1000parm2"b")
            }
        }
    }
}
//----------------------------------------------------------------------------------------------
public seek_target(parm[])
{
    new 
attacker parm[0]
    new 
targetn parm[1]

    if ( !
is_valid_ent(attacker) ) {
        
remove_task(attacker+1000)
        return 
    }

    if ( 
is_user_alive(targetn) ) {
        
entity_set_follow(attackertargetn)
    }
    
/*
    else {
        // Remove the seek loop
        remove_task(attacker+1000)

        // Stop the Trail
        message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
        write_byte(99)        //TE_KILLBEAM
        write_short(attacker)    // entity
        message_end()

        // Find a new player to seek
        set_task(0.1, "find_target", 0, parm, 3)
    }*/
    
    
new ptr attacker
    
new ptd targetn
    pfn_touch
(ptrptd
}
//----------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------
stock entity_set_follow(entitytarget)
{
    if ( !
is_valid_ent(entity) || !is_user_alive(target) ) return 0

    
new Float:fl_Origin[3], Float:fl_EntOrigin[3]
    
entity_get_vector(targetEV_VEC_originfl_Origin)
    
entity_get_vector(entityEV_VEC_originfl_EntOrigin)

    new 
Float:fl_InvTime = (gNadeSpeed vector_distance(fl_Originfl_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
(entityEV_VEC_velocityfl_Velocity)

    new 
Float:fl_NewAngle[3]
    
vector_to_angle(fl_Velocityfl_NewAngle)
    
entity_set_vector(entityEV_VEC_anglesfl_NewAngle)

    return 
1
}
//---------------------------------------------------------------------------------------------- 
I leave it in case anyone ever needs it, credits to the original author of the script, I just modified it a bit
Arje is offline
Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 06:43.


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