Jump to content
  • 0

Cum fac sa trimita o singura data mesajul jucatorului care intra in raza Aero LS?


Question

Posted (edited)

salut,

Cum fac sa trimita o singura data mesajul jucatorului care intra in raza Aero LS?

 

Quote

// Timer-ul asta e apelat odata la o secunda la OnGameModeInit;

function EsteInZonaAeroLS() {
    foreach(Player, i) {
        if(IsPlayerConnected(i) && IsPlayerLogged[i] == 1) {
            if(IsPlayerInRangeOfPoint(i, 150.0, 1950.2032,-2366.4846,13.5469)) {
                ZonaAeroLS[i] = 1;
                MessageAeroLS(i);
            }
        }
     }
    return 1;
}

Quote

// Mesajul care sa-l trimita jucatorului:

stock MessageAeroLS(playerid) { 
    if(ZonaAeroLS[playerid] == 0) return 1; 
    SCM(playerid, COLOR_YELLOW, "Ai intrat in zona Aero LS.");
    return 1;

 

Edited by cstef4n

3 answers to this question

Recommended Posts

  • 0
Posted (edited)

salut, in loc sa scrii un loop prin toti playerii conectati, poti folosi areas din streamer (https://github.com/samp-incognito/samp-streamer-plugin/wiki/Natives-(Areas))
de ex: la OnGameModeInit poti face o zona pentru aeroport:

aeroLS = CreateDynamicSphere(1950.2032, -2366.4846, 13.5469, 150.0);

streamer-ul are doua callback-uri specifice pentru area-uri: OnPlayerEnterDynamicArea si OnPlayerLeaveDynamicArea. ai un exemplu mai jos:

public OnPlayerEnterDynamicArea(playerid, areaid)
{
    if(areaid == aeroLS)
    {
        SCM(playerid, COLOR_YELLOW, "Ai intrat in zona Aero LS.");
    }
}

public OnPlayerLeaveDynamicArea(playerid, areaid)
{
    if(areaid == aeroLS)
    {
        SCM(playerid, COLOR_YELLOW, "Ai iesit din zona Aero LS.");
    }
}

 

Edited by sunkie
  • Upvote 1
  • 0
Posted

Problema este că timerul tău rulează o dată pe secundă, iar cât timp playerul rămâne în raza de 150.0, condiția rămâne adevărată și MessageAeroLS(i) este apelat în fiecare secundă. IsPlayerInRangeOfPoint doar verifică dacă playerul este în raza respectivă; nu ține minte dacă a intrat deja.

Tu ai deja ZonaAeroLS[i], deci trebuie să o folosești ca flag.

Varianta corectă

 
 
function EsteInZonaAeroLS()
{
    foreach(Player, i)
    {
        if(IsPlayerConnected(i) && IsPlayerLogged[i] == 1)
        {
            if(IsPlayerInRangeOfPoint(i, 150.0, 1950.2032, -2366.4846, 13.5469))
            {
                // Playerul tocmai a intrat în zonă
                if(ZonaAeroLS[i] == 0)
                {
                    ZonaAeroLS[i] = 1;
                    MessageAeroLS(i);
                }
            }
            else
            {
                // Playerul a ieșit din zonă
                ZonaAeroLS[i] = 0;
            }
        }
    }
    return 1;
}
 

Cum funcționează

Când playerul este în afara zonei:

 
 
ZonaAeroLS[i] = 0;
 

Când intră în raza de 150:

 
 
if(ZonaAeroLS[i] == 0)
 

este adevărat, deci:

 
 
ZonaAeroLS[i] = 1;
MessageAeroLS(i);
 

Mesajul se trimite o singură dată.

Apoi timerul verifică din nou după o secundă, dar:

 
 
ZonaAeroLS[i] == 1
 

deci MessageAeroLS(i) nu mai este executat.

Când playerul iese din raza de 150, se face:

 
 
ZonaAeroLS[i] = 0;
 

iar când intră din nou, primește din nou mesajul.


⚠️ Foarte important

Trebuie să ai array-ul definit undeva global, de exemplu:

 
 
new ZonaAeroLS[MAX_PLAYERS];
 

Și recomand să îl resetezi când playerul se conectează:

 
 
public OnPlayerConnect(playerid)
{
    ZonaAeroLS[playerid] = 0;
    return 1;
}
 

și eventual la disconnect:

 
 
public OnPlayerDisconnect(playerid, reason)
{
    ZonaAeroLS[playerid] = 0;
    return 1;
}

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.