countdown for near players
#1

PHP Code:
new CountDown = -1;
forward countdown();
public 
countdown()
{
    if(
CountDown == 6GameTextForAll("~p~Starting..."10006);
    
CountDown--;
    if(
CountDown == 0)
    {
        
GameTextForAll("~g~GO~ r~!"10006);
        
CountDown = -1;
        for(new 
0MAX_PLAYERSi++) {
            
TogglePlayerControllable(itrue);
            
PlayerPlaySound(i10570.00.00.0);
        }
        return 
0;
    }
    else
    {
        new 
text[7]; format(textsizeof(text), "~w~%d"CountDown);
        for(new 
0MAX_PLAYERSi++) {
            
PlayerPlaySound(i10560.00.00.0);
            
TogglePlayerControllable(ifalse);
        }
         
GameTextForAll(text10006);
    }
    
SetTimer("countdown"10000);
    return 
0;
}
CMD:countdown(playeridparams[]) {
    if(
PlayerInfo[playerid][Level] >= 4) {
        if(
CountDown == -1) {
            
CountDown 6;
            
SetTimer("countdown"10000);
            return 
CMDMessageToAdmins(playerid"COUNTDOWN");
        } else return 
SendClientMessage(playeridred"ERROR: Countdown in progress");
    } else return 
SendClientMessage(playeridred"ERROR: You are not a high enough level to use this command");

How to make the countdowns are just for near 'playerid'?
I think I can use IsPlayerInRangeOfPoint but it would do the countdown just to the one nearest person (i guess)

EDIT: Or I can just use ProxDetector ? But idk how
Reply
#2

Use " IsPlayerInRangeOfPoint " with Foreach. It will work trust me.
Reply
#3

You can have something like this or just loop all connected players and check if they're in range with the countdown issuer using IsPlayerInRangeOfPoint by getting the issuer's position and comparing it to other players
PHP Code:
forward Float:GetDistanceBetweenPlayers(p1,p2);
public 
Float:GetDistanceBetweenPlayers(p1,p2)
{
    new 
Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if (!
IsPlayerConnected(p1) || !IsPlayerConnected(p2))
    {
        return -
1.00;
    }
    
GetPlayerPos(p1,x1,y1,z1);
    
GetPlayerPos(p2,x2,y2,z2);
    return 
floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
public 
countdown()
{
    for(new 
i=0i<MAX_PLAYERSi++)
    {
        if(
IsPlayerConnected(i) && GetDistanceBetweenPlayers(playeridi) < 100.0// your range
        
{
            if(
CountDown == 6GameTextForAll("~p~Starting..."10006);
            
CountDown--;
            if(
CountDown == 0)
            {
                
GameTextForAll("~g~GO~ r~!"10006);
                
CountDown = -1;
                for(new 
0MAX_PLAYERSi++) {
                    
TogglePlayerControllable(itrue);
                    
PlayerPlaySound(i10570.00.00.0);
                }
                return 
0;
            }
            else
            {
                new 
text[7]; format(textsizeof(text), "~w~%d"CountDown);
                for(new 
0MAX_PLAYERSi++) {
                    
PlayerPlaySound(i10560.00.00.0);
                    
TogglePlayerControllable(ifalse);
                }
                 
GameTextForAll(text10006);
            }
            
SetTimer("countdown"10000);
        }
    }
    return 
0;

Reply
#4

Quote:
Originally Posted by Ghazal
View Post
You can have something like this or just loop all connected players and check if they're in range with the countdown issuer using IsPlayerInRangeOfPoint by getting the issuer's position and comparing it to other players
PHP Code:
forward Float:GetDistanceBetweenPlayers(p1,p2);
public 
Float:GetDistanceBetweenPlayers(p1,p2)
{
    new 
Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if (!
IsPlayerConnected(p1) || !IsPlayerConnected(p2))
    {
        return -
1.00;
    }
    
GetPlayerPos(p1,x1,y1,z1);
    
GetPlayerPos(p2,x2,y2,z2);
    return 
floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));
}
public 
countdown()
{
    for(new 
i=0i<MAX_PLAYERSi++)
    {
        if(
IsPlayerConnected(i) && GetDistanceBetweenPlayers(playeridi) < 100.0// your range
        
{
            if(
CountDown == 6GameTextForAll("~p~Starting..."10006);
            
CountDown--;
            if(
CountDown == 0)
            {
                
GameTextForAll("~g~GO~ r~!"10006);
                
CountDown = -1;
                for(new 
0MAX_PLAYERSi++) {
                    
TogglePlayerControllable(itrue);
                    
PlayerPlaySound(i10570.00.00.0);
                }
                return 
0;
            }
            else
            {
                new 
text[7]; format(textsizeof(text), "~w~%d"CountDown);
                for(new 
0MAX_PLAYERSi++) {
                    
PlayerPlaySound(i10560.00.00.0);
                    
TogglePlayerControllable(ifalse);
                }
                 
GameTextForAll(text10006);
            }
            
SetTimer("countdown"10000);
        }
    }
    return 
0;

Is there an example map of, 100.0 range or 200.0 range?
Reply
#5

So guys, I made it like this :

PHP Code:
forward Float:GetDistanceBetweenPlayers(p1,p2);
public 
Float:GetDistanceBetweenPlayers(p1,p2){
    new 
Float:x1,Float:y1,Float:z1,Float:x2,Float:y2,Float:z2;
    if (!
IsPlayerConnected(p1) || !IsPlayerConnected(p2))
    {
        return -
1.00;
    }
    
GetPlayerPos(p1,x1,y1,z1);
    
GetPlayerPos(p2,x2,y2,z2);
    return 
floatsqroot(floatpower(floatabs(floatsub(x2,x1)),2)+floatpower(floatabs(floatsub(y2,y1)),2)+floatpower(floatabs(floatsub(z2,z1)),2));

PHP Code:
forward countdown(playerid);
public 
countdown(playerid)
{
    for(new 
0MAX_PLAYERSi++)
    {
        if(
IsPlayerConnected(i) && GetDistanceBetweenPlayers(playeridi) < 200.0)
        {
            if(
CountDown == 6GameTextForPlayer(i"~p~Starting..."10006);
            
CountDown--;
            if(
CountDown == 0)
            {
                
GameTextForPlayer(i"~g~GO~ r~!"10006);
                
CountDown = -1;
                
TogglePlayerControllable(itrue);
                
PlayerPlaySound(i10570.00.00.0);
                return 
0;
            }
            else
            {
                new 
text[7]; format(textsizeof(text), "~w~%d"CountDown);
                
PlayerPlaySound(i10560.00.00.0);
                
TogglePlayerControllable(ifalse);
                
GameTextForPlayer(itext10006);
            }
            
SetTimer("countdown"10000);
        }
    }
    return 
0;
}
CMD:countdown(playeridparams[]) {
    if(
PlayerInfo[playerid][Level] >= 4) {
        if(
CountDown == -1) {
            
CountDown 6;
            
SetTimer("countdown"10000);
            return 
CMDMessageToAdmins(playerid"COUNTDOWN");
        } else return 
SendClientMessage(playeridred"ERROR: Countdown in progress");
    } else return 
SendClientMessage(playeridred"ERROR: You are not a high enough level to use this command");

And when i start the countdown, nothing happened. It just sends me the "CMDMessageToAdmins(playerid, "COUNTDOWN");". No one sees the countdown, me nor my friends. Even they're beside me

And I made a duel countdown like this :

PHP Code:
forward duelTimer(playerid);
public 
duelTimer(playerid)
{
    
/*if(DuelCD[dueler1] == 6) {
        GameTextForPlayer(dueler1, "~p~Starting...", 1000, 6);
        GameTextForPlayer(dueler2, "~p~Starting...", 1000, 6);
    }*/
    
DuelCD[dueler1]--;
    if(
DuelCD[dueler1] == 0)
    {
        
GameTextForPlayer(dueler1"~g~go get em~ r~!"10006);
        
GameTextForPlayer(dueler2"~g~go get em~ r~!"10006);
        
//DuelCD[dueler1] = -1;
        
TogglePlayerControllable(dueler1true);
        
TogglePlayerControllable(dueler2true);
        
PlayerPlaySound(dueler110570.00.00.0);
        
PlayerPlaySound(dueler210570.00.00.0);
        return 
0;
    }
    else
    {
        new 
text[7]; format(textsizeof(text), "~w~%d"CountDown);
        
PlayerPlaySound(dueler110560.00.00.0);
        
PlayerPlaySound(dueler210560.00.00.0);
        
TogglePlayerControllable(dueler1false);
        
TogglePlayerControllable(dueler2false);
        
GameTextForPlayer(dueler1text10006);
        
GameTextForPlayer(dueler2text10006);
        
SetCameraBehindPlayer(dueler1);
        
SetCameraBehindPlayer(dueler2);
    }
    
SetTimer("duelTimer"10000);
    return 
0;

And I call it like this in somewhere.

PHP Code:
SetTimer("duelTimer"10000); 
But idk why, countdown isn't "5,4,3,2,1" but it goes like "-1,-1,-1,-1,-1"

How to fix this guys?
Reply
#6

You need to use SetTimerEx to pass the playerid parameter to your countdown callback
pawn Code:
SetTimerEx("countdown", 1000, false, "i", playerid);
Also, just use IsPlayerInRangeOfPoint. I'm sure it's more optimized than the custom function you are using.
pawn Code:
forward countdown(playerid);
public countdown(playerid)
{
    new Float: x, Float: y, Float: z;
    GetPlayerPos(playerid, x, y, z);
   
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i) && IsPlayerInRangeOfPoint(i, 200.0, x, y, z))
        {
            // rest of code
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)