AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   Finding Players near Player (https://forums.alliedmods.net/showthread.php?t=154009)

Juri 04-01-2011 18:13

Finding Players near Player
 
Hello. I want to make Mod like Quake 3 Freeze TDM, and I need to find Players near freezed Player. I think about find_sphere_class, but i dont know how to use this with Player and finding other player near him. I want to find number of players and if players are being 7 seconds near freezed Player i want to make something with freezed Player(unfreeze Player).

Any Solutions for this ?

hornet 04-01-2011 22:54

Re: Finding Players near Player
 
Well you could try something like this, where check() is simply your function which is called everytime your going to check for players, whether it be in PreThink or a task you set every second or so:

PHP Code:

public checkid )
{
    new 
num, list[ 32 ], Float:dist 1000.0;
    
num find_sphere_classid"player"dist, list, 32 );
    
    new 
player;
    for ( new 
num i++ )
    {        
        
player = list[ ];
        if( !
is_user_aliveplayer ) || get_user_teamplayer ) != get_user_teamid ) )
            continue;
            
        
//unfreeze player
    
}


EDIT: Can only players only unfreeze a team mate?

Juri 04-02-2011 05:06

Re: Finding Players near Player
 
Yes, ofcorse only team mate can unfreeze player.

How to make timer when player unfreeze when plaeyers are near him ?

And how work dist? Any number 1 or 300 it's unfreeze from every distance on map ^^

Exolent[jNr] 04-02-2011 05:48

Re: Finding Players near Player
 
Use PreThink for the frozen player and check if the number of teammates around him for 7 seconds.

Juri 04-02-2011 06:14

Re: Finding Players near Player
 
Quote:

Originally Posted by Exolent[jNr] (Post 1443025)
check if the number of teammates around him for 7 seconds.

But how ? And why distance dont work ? If I put 1 or 1000 it's unfreeze from any distance -.-

HTML Code:

public check( id )
{
    new num, list[ 32 ], Float:dist = 250.0;
    num = find_sphere_class( id, "player", dist+0.0, list, 32 );
   
    new player;
    for ( new i ; i < num ; i++ )
    {       
        player = list[ i ];
        if( !is_user_alive( player ) || get_user_team( player ) != get_user_team( id ) || gfFrost[id] == 0 )
        {
            continue;
        }
        set_task(5.0,"odmroz",id)
    }
}

public odmroz(id)
{
    gfFrost[id]=0;
    set_user_health(id,100);
    set_user_rendering(id, kRenderFxNone, 0, 0, 0, kRenderNormal, 0)
    set_pev(id, pev_maxspeed, 250.0)
}


hornet 04-02-2011 12:25

Re: Finding Players near Player
 
Try that... and then obviously you'll reset their frost variable to false on every new round.
PHP Code:

new bool:gbFrost33 ];

public 
checkid )
{
    if( !
gbFrostid ] )
    return 
PLUGIN_HANDLED;
    
    new 
num, list[ 32 ], Float:dist 250.0;
    
num find_sphere_classid"player"dist, list, 32 );
    
    new 
player;
    for ( new 
num i++ )
    {        
        
player = list[ ];
        if( !
is_user_aliveplayer ) || get_user_teamplayer ) != get_user_teamid ) || gbFrostplayer ] )
            continue;
        
         
set_task5.0"odmroz"id );
    }
}  

public 
odmrozid )
{
    
gbFrostid ] = false;
    
set_user_healthid100 );
    
set_user_renderingidkRenderFxNone000kRenderNormal);
    
set_pevidpev_maxspeed250.0 ) ;



Juri 04-02-2011 14:26

Re: Finding Players near Player
 
Hmmm still nothing. It's freeze for few seconds and unfreeze when i'm and only 1 enemy is ! What is wrong ?

PHP Code:

#include <amxmodx>
#include <hamsandwich>
#include <fakemeta_util>
#include <fun>
#include <cstrike>
#include <amxmisc>
#include <engine>

#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "DarkGL"

#define MAX 32


new bool:gfFrost33 ];

public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
RegisterHam(Ham_TakeDamage"player","fwTakeDamage",0);
    
register_forward(FM_PlayerPreThink"fwPreThink"1);
    
register_forward(FM_PlayerPreThink"check"1);
    
register_event("CurWeapon","switchweapon","be","1=1","2!29")
    
register_forward(FM_UpdateClientData"UpdateClientData_Post"1
    
RegisterHam(Ham_Spawn,"player","fwh_spawned",1)
}

public 
fwTakeDamage(ididinflictoridattackerFloat:damagedamagebits){
    new 
zycie;
    
zycie get_user_health(id);
    if (
zycie-damage 1)
    {
    
gfFrost[id]=true;
    if (
cs_get_user_team(id) == CS_TEAM_T){
        
set_user_rendering(idkRenderFxGlowShell25500kRenderNormal30)
        }
        else if (
cs_get_user_team(id) == CS_TEAM_CT){
        
set_user_rendering(idkRenderFxGlowShell00255kRenderNormal30)
        }
    return 
HAM_SUPERCEDE;
    }
}

public 
fwh_spawned(id){
    if(!
is_user_alive(id)){
        return 
HAM_IGNORED;
    } 
    
gfFrost[id]=false;
    
set_user_rendering(idkRenderFxNone000kRenderNormal0)
    return 
HAM_IGNORED;
}

public 
fwPreThink(id){
    if(
gfFrost[id] == true){
    
set_pev(idpev_maxspeed1.0
    
set_pev(idpev_buttonpev(id,pev_button) & ~IN_ATTACK
    
set_pev(idpev_buttonpev(id,pev_button) & ~IN_ATTACK2
    }
}

public 
switchweapon(id)
{
    if(
gfFrost[id] == true){
        
engclient_cmd(id,"weapon_knife")
        
client_cmd(id,"weapon_knife")
    }
}

public 
UpdateClientData_Post(idsendweaponscd_handle

    if(
gfFrost[id] == true){
    if(!
is_user_alive(id)) 
        return 
FMRES_IGNORED 
     
    
if(get_user_weapon(id) != CSW_KNIFE
        return 
FMRES_IGNORED 
     
    set_cd
(cd_handleCD_ID0)        
     
    return 
FMRES_HANDLED
    
}
    else
    {
    return 
FMRES_IGNORED
    
}
}  

public 
checkid )
{

    if( !
gfFrost[id] )
    return 
PLUGIN_HANDLED;
    
    new 
num, list[32], Float:dist 250.0;
    
num find_sphere_classid"player"dist, list, 32 );
    
    new 
player;
    for ( new 
num i++ )
    {        
        
player = list[ ];
        if( !
is_user_aliveplayer ) || get_user_teamplayer ) != get_user_teamid ))
        {
            continue;
        }
        
odmroz(id);
    }
}

public 
odmroz(id)
{
    
gfFrost[id] = false;
    
set_user_health(id,100);
    
set_user_rendering(idkRenderFxNone000kRenderNormal0)
    
set_pev(idpev_maxspeed250.0


Yea, i find mistake in plugin:

if( !is_user_alive( player ) || get_user_team( player ) != get_user_team( id ) || id == player)

and working perfect :D

And now, how to make check when players are near freeze Player 5 seconds then unfreeze Player?

Maybe set_task 1 second check(id) and make variable and if this variable = 5 then odmroz(id) ?

Yea and i make this :D Working amazing, when i am go out or killed when i unfreezed player then player is still unfreezed :D:

PHP Code:

public fwPreThink(id){
    if (!
task_exists(id)){
    
set_task(1.0,"check",id);
    } 

And check:

PHP Code:

public checkid )
{

    if( !
gfFrost[id] )
    return 
PLUGIN_HANDLED;
    
    new 
num, list[32], Float:dist 250.0;
    
num find_sphere_classid"player"dist, list, 32 );
    
    new 
player;
    for ( new 
num i++ )
    {        
        
player = list[ ];
        if( !
is_user_aliveplayer ) || get_user_teamplayer ) != get_user_teamid ) || id == player)
        {
            continue;
        }
        
tuf[id]=tuf[id]+1;
        if (
tuf[id] == 5){
        
tuf[id]=0;
        
odmroz(id);
        }
    }



grimvh2 04-02-2011 15:34

Re: Finding Players near Player
 
If you want some less task, you could check ham_touch, and after they touched check 7 seconds if he is still near him. So you don't need a task wich is always checking for close players.

Juri 04-02-2011 15:38

Re: Finding Players near Player
 
But ham_touch is "task" repeat 1 second ?

Exolent[jNr] 04-02-2011 16:52

Re: Finding Players near Player
 
Code:
#include <amxmodx> #include <engine> /* distance around player for teammates to be in */ #define TEAMMATE_RADIUS     100.0 /* how many teammates must be around the player */ #define TEAMMATE_COUNT      3 /* how long (in seconds) teammates must be around player to unfreeze */ #define UNFREEZE_TIME       7.0 public client_PreThink(id) {     static Float:start[33];         if( gfFrost[id] )     {         if( start[id] > 0.0 )         {             if( GetTeammateRadius(id, TEAMMATE_RADIUS) >= TEAMMATE_COUNT )             {                 if( (get_gametime() - start[id]) >= UNFREEZE_TIME )                 {                     /* unfreeze player */                     odmroz(id);                                         start[id] = 0.0;                 }             }             else             {                 start[id] = 0.0;             }         }         else if( GetTeammateRadius(id, TEAMMATE_RADIUS) >= TEAMMATE_COUNT )         {             start[id] = get_gametime();         }     }     else     {         start[id] = 0.0;     } } GetTeammateRadius(id, Float:radius) {     new players[32];     new pnum = find_sphere_class(id, "player", radius, players, 32);         new team = get_user_team(id);         for( new i = 0; i < pnum; i++ )     {         if( get_user_team(players[i]) != team )         {             players[i--] = players[--pnum];         }     }         return pnum; }


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

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