SA-MP Forums

SA-MP Forums (https://forum.sa-mp.com/index.php)
-   Scripting Help (https://forum.sa-mp.com/forumdisplay.php?f=12)
-   -   countdown for near players (https://forum.sa-mp.com/showthread.php?t=675662)

Filbert 18/05/2020 12:31 AM

countdown for near players
 
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

AzertyTheProgrammer 18/05/2020 12:58 AM

Re: countdown for near players
 
Use " IsPlayerInRangeOfPoint " with Foreach. It will work trust me.

Ghazal 18/05/2020 01:25 AM

Re: countdown for near players
 
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;



Filbert 18/05/2020 01:36 AM

Re: countdown for near players
 
Quote:

Originally Posted by Ghazal (Post 4146574)
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?

Filbert 19/05/2020 07:40 PM

Re: countdown for near players
 
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?

Grim_ 19/05/2020 11:25 PM

Re: countdown for near players
 
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


All times are GMT. The time now is 09:53 AM.

Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.