Problema Public SA-MP non funzionano correttamente

UsernameRoot

Utente Medio
Autore del topic
22 Giugno 2012
171
28
Miglior risposta
0
Salve a tutti!

Ho un problema con delle public nel mio server SA-MP.

Premetto che: Queste funzioni public che sto per riportarvi qua sotto, funzionano solo se io sono online da solo, ovvero senza nessun'altro utente collegato, e forse so anche il motivo. Infatti se un'altro utente si collega queste funzioni che dovrebbero funzionare solo per me, all'altro gli si buggano.

Facendo un esempio, con un Timer e un public do $20 ogni 20 minuti, e funziona se sono solo io online.
Se c'è un altro utente arrivano i miei, più i suoi e di tutti gli altri utenti.

Questo è uno dei tanti codici:
Per la precisione serve a mandare a tutti gli utenti collegati un Messaggio con scritto che l'admin blabla si è collegato:
public check_rank()
{
for(new i = 0; i <= MAX_PLAYERS; i++)
{
if(IsAdminLevel(i,4)){
SetTimer("connadmin",5000,false);
return 1;
}
if(IsAdminLevel(i,3)){
SetTimer("connadmin",5000,false);
return 1;
}
if(IsAdminLevel(i,2)){
SetTimer("connmod",5000,false);
return 1;
}
if(IsAdminLevel(i,1)){
SetTimer("conpremium",5000,false);
return 1;
}
}
return 1;
}

public connadmin(playerid)
{
for(new i = 0; i <= MAX_PLAYERS; i++)
{
if(IsAdminLevel(i,4)){
new giocatore[MAX_PLAYER_NAME];
GetPlayerName(playerid,giocatore, sizeof(giocatore));
format(string,sizeof(string),"L'admin %s si è collegato ***", giocatore, playerid);
SendClientMessageToAll(COLORE_AZZURRO,string);
return 1;
}
}
return 1;
}

Ho messo il check_rank che verifica al login se l'utente collegato è rankato (difatti vedere 2,3,4)
E un altro public connadmin da le relative funzioni se l'utente ha il rank "4"

Ci sono anche gli altri ma non li metto tutti ne metto solo io per farvi capire, tanto i codici sono uguali per ogni rank.

Questo codice funziona se io sono collegato, appena entra un altro amministratore gli appare il messaggio col mio stesso nome, invece gli dovrebbe apparire il suo...

Come potrei risolvere?
 
Al posto del playerid quando c'e scritto che è entrato nel format metti i.

Inviato dal mio GT-S5570 con Tapatalk 2
 
Al posto del playerid quando c'e scritto che è entrato nel format metti i.

Inviato dal mio GT-S5570 con Tapatalk 2

Ho provato anche con i, le ho provate di tutte ma non so perchè.

Anzi non ho provato a cambiare connadmin(MAX_PLAYERS) ma non so se sia coretto, non saprei.

- - - Aggiornato - - -

Al posto del playerid quando c'e scritto che è entrato nel format metti i.

Inviato dal mio GT-S5570 con Tapatalk 2

Ora funziona questo del rank.

Però non mi va correttamente quello del $20 ogni 20 minuti, come potrei fare?

Un timer o qualcosa del genere?
 
Allora, visto che quello dell'admin l'abbiamo risolto, eccoti quello che ogni 20 minuti da 20$.

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Questo timer lo metti in OnGameModeInit

Poi fai un public cosi:

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Ecco a te ;)
 
Salve a tutti!

Ho un problema con delle public nel mio server SA-MP.

Premetto che: Queste funzioni public che sto per riportarvi qua sotto, funzionano solo se io sono online da solo, ovvero senza nessun'altro utente collegato, e forse so anche il motivo. Infatti se un'altro utente si collega queste funzioni che dovrebbero funzionare solo per me, all'altro gli si buggano.

Facendo un esempio, con un Timer e un public do $20 ogni 20 minuti, e funziona se sono solo io online.
Se c'è un altro utente arrivano i miei, più i suoi e di tutti gli altri utenti.

Questo è uno dei tanti codici:
Per la precisione serve a mandare a tutti gli utenti collegati un Messaggio con scritto che l'admin blabla si è collegato:
public check_rank()
{
for(new i = 0; i <= MAX_PLAYERS; i++)
{
if(IsAdminLevel(i,4)){
SetTimer("connadmin",5000,false);
return 1;
}
if(IsAdminLevel(i,3)){
SetTimer("connadmin",5000,false);
return 1;
}
if(IsAdminLevel(i,2)){
SetTimer("connmod",5000,false);
return 1;
}
if(IsAdminLevel(i,1)){
SetTimer("conpremium",5000,false);
return 1;
}
}
return 1;
}

public connadmin(playerid)
{
for(new i = 0; i <= MAX_PLAYERS; i++)
{
if(IsAdminLevel(i,4)){
new giocatore[MAX_PLAYER_NAME];
GetPlayerName(playerid,giocatore, sizeof(giocatore));
format(string,sizeof(string),"L'admin %s si è collegato ***", giocatore, playerid);
SendClientMessageToAll(COLORE_AZZURRO,string);
return 1;
}
}
return 1;
}

Ho messo il check_rank che verifica al login se l'utente collegato è rankato (difatti vedere 2,3,4)
E un altro public connadmin da le relative funzioni se l'utente ha il rank "4"

Ci sono anche gli altri ma non li metto tutti ne metto solo io per farvi capire, tanto i codici sono uguali per ogni rank.

Questo codice funziona se io sono collegato, appena entra un altro amministratore gli appare il messaggio col mio stesso nome, invece gli dovrebbe apparire il suo...

Come potrei risolvere?
Beh e grazie ci credo che li manda doppi per ogni utente connesso..
Hai messo un ciclo for, andando a mettere MAX_PLAYERS (utenti massimi che si possono connettere al server), quindi ripeterà il ciclo for per ogni persona connessa a quel momento. La soluzione migliore da attuare è quella consigliata da vinnythebest.
Magari, puoi vedere se aggiungere qualche define..
Poi ovviamente, puoi anche fare, che da i soldi al player, dopo il login ad esempio. E anziché fare un loop continuo con quel timer simile, puoi fare così:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Funziona bene anche come ha detto @vinnythebest ma forse, essendo che deve dare i soldi ai player, per evitare problemi in futuro,
potresti sfruttare un timer per ogni player, anziché uno globale.
 
Ultima modifica:
Beh e grazie ci credo che li manda doppi per ogni utente connesso..
Hai messo un ciclo for, andando a mettere MAX_PLAYERS (utenti massimi che si possono connettere al server), quindi ripeterà il ciclo for per ogni persona connessa a quel momento. La soluzione migliore da attuare è quella consigliata da vinnythebest.
Magari, puoi vedere se aggiungere qualche define..
Poi ovviamente, puoi anche fare, che da i soldi al player, dopo il login ad esempio. E anziché fare un loop continuo con quel timer simile, puoi fare così:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

Funziona bene anche come ha detto @vinnythebest ma forse, essendo che deve dare i soldi ai player, per evitare problemi in futuro,
potresti sfruttare un timer per ogni player, anziché uno globale.


In timersoldi = settimerex non dovresti fare timersoldi[playerid] = settimerex? Anche nel killtimer cioè KillTimer(timersoldi[playerid]);
 
Ultima modifica:
In timersoldi = settimerex non dovresti fare timersoldi[playerid] = settimerex? Anche nel killtimer cioè KillTimer(timersoldi[playerid]);

Si dimenticanza mia, correggo.

Ho corretto lo script, adesso dovrebbe essere giusto.
(Mi succede sempre di dimenticarmi i playerid quando metto i MAX_PLAYERS) :emoji_relieved:

Per cui aspettiamo risposta da parte di @UsernameRoot e vediamo se risolve il suo problema ;)
 
Ultima modifica:
  • Like
Reactions: 1 person