Jump to content
  • 0

pomoc Problém s /admins


TeeZee

Dotaz

Zdravím,

Mám problém s príkazom /admins

 

dcmd_admins(playerid, params[])
{
   	#pragma unused params
   	if(info[playerid][ALevel] == 0) return ShowPlayerDialog(playerid,d_admins1,DIALOG_STYLE_MSGBOX,"Online A-Team","Momentálne nie je prítomný žiaden člen A-Teamu","Potvrdiť","");
  	new string[255];
	for(new i=0;i<=MAX_PLAYERS_EX;i++)
	{
	if(IsPlayerConnected(i))
		{
		if(info[playerid][ALevel] == 1)
		{
			format(string, 60, "%s | Organizátor Akcii",meno(i));
			ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť","");
		}
		else if(info[playerid][ALevel] == 2)
		{
			format(string, 60, "%s | Moderátor", meno(i));
			ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť","");
		}
        else if(info[playerid][ALevel] == 3)
		{
			format(string, 60, "%s | Administrátor",meno(i));
			ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť","");
		}
		}
	}
	return true;
}

 

Ked sa pripojím na server a dám si ALevel 3, a pripojí sa na server dalsí hráč s alevel 0, v /admins ukazuje jeho s "levelom 2" ako moderátor a mňa vôbec ...

Za každú radu budem rád.

Link to comment
Share on other sites

9 odpovědí na tuto otázku

Recommended Posts

  • 0
dcmd_admins(playerid, params[]) {
#pragma unused params
new bool:adminsonline = false, str[255], line[45];
   
 for(new i; i <= GetPlayerPoolSize(); i++) {
  if(!IsPlayerConnected(i)) continue;
  if(pInfo[i][ALevel] == 1) {
    if(IsPlayerAdmin(i)) format(line, sizeof line, "\n%s | Organizátor akcí | RCON", meno(i));
    else format(line, sizeof line, "\n%s | Organizátor akcí", meno(i));
    strcat(str, line);
    adminscount = true;
   }
	if(pInfo[i][ALevel] == 2)
    {
    	// ...                                
    }
 }
 if(adminsonline == false) return ShowPlayerDialog(playerid, d_admins1, DIALOG_STYLE_MSGBOX, "Online A-Team", "Momentálne nie je prítomný žiaden člen A-Teamu",
 "Potvrdiť", "");
 ShowPlayerDialog(playerid, d_admins, DIALOG_STYLE_MSGBOX, "Online A-Team", str, "Potvrdiť", "");
 return 1;
}

EDIT:// Upravený kód od NeoRevCrew, chyby som neopravil

Edited by Guyy
Link to comment
Share on other sites

  • 0

Pokud používáš 0.3.7, bude lepší, když použiješ GetPlayerPoolSize() místo MAX_PLAYERS_EX. Fce GetPlayerPoolSize() vrací nejvyšší playerid připojené na serveru.

for(new i = 0, j = GetPlayerPoolSize(); i <= j; i++) 
    {
        //tady kód
    }

 

K tvému problému, v podmíkách v cyklu máš místo 

info[i][ALevel] == 1

toto

info[playerid][ALevel] == 1

Takže porovnáváš admin level toho hráče, co zavolal příkaz, ne toho, kterého momentálně procházíš cyklem. 

To vysvětluje to, proč to vypisuje hráče, který admin level nemá. Příkaz voláš ty.. projdeš podmínkou, ale v cyklus prochází jiného hráče a zjistí jméno toho dotyčného hráče, ale vypíše ho s tvým levelem.

Stejně tak je divná i tato podmínka

if(info[playerid][ALevel] == 0) return ShowPlayerDialog(playerid,d_admins1,DIALOG_STYLE_MSGBOX,"Online A-Team","Momentálne nie je prítomný žiaden člen A-Teamu","Potvrdiť","");

která opět kontroluje admin level hráče, který příkaz volá... 

Edited by GaRGoyLeS
Link to comment
Share on other sites

  • 0

Ahoj, problém je především v tom, že vždycky přepíšeš obsah řetězce "string". Proto se ukáže vždycky hráč s nejvyšším id, který má nějaký level.

Toto by měla být funkční napodobenina tvého kódu:

Spoiler
dcmd_admins(playerid, params[]) {
#pragma unused params
new bool:adminsonline = false, str[255], line[45];
   
 for(new i; i <= GetPlayerPoolSize(); i++) {
  if(!IsPlayerConnected(i)) continue;
  switch(info[ i ] [ALevel]) {
   case 1: {
    format(line, sizeof line, "\n%s | Organizátor akcí", meno(i));
    strcat(str, line);
    adminscount = true;
   }
   case 2: {
    format(line, sizeof line, "\n%s | Moderátor", meno(i));
    strcat(str, line);
    adminscount = true;
   }
   case 3: {
     format(line, sizeof line, "\n%s | Administrátor", meno(i));
    strcat(str, line);
    adminscount = true;
   }
  }
 }
 if(adminsonline == false) return ShowPlayerDialog(playerid, d_admins1, DIALOG_STYLE_MSGBOX, "Online A-Team", "Momentálne nie je prítomný žiaden člen A-Teamu", "Potvrdiť", "");
 ShowPlayerDialog(playerid, d_admins, DIALOG_STYLE_MSGBOX, "Online A-Team", str, "Potvrdiť", "");
 return 1;
}

Osobně bych ti ale dal pár rad, protože toto se mi zdá jako dost odporné řešení, jednak bych udělal nějakou globální proměnnou, kam by se ti (například při přihlášení - odpojení) ukládali admini, kteří jsou online, potom bych dal na první místo podmínku, pokud vůbec na serveru nějaký admin je, kterou jsem v případě, který jsi zamýšlel ty, dal až na konec kódu, což je naprostá zbytečnost, protože určitě nastane situace, kdy admin není online, hráč dá příkaz /admins a zbytečně se vytváří proměnné, které ani de facto nejsou použity.

Další taková rada je, aby sis názvy těch levelů uložil do proměnné, potom bys jednoduše použil podmínku, pokud má dotyčný větší level než 0, a pokud ano, tak by se už ta hodnost načetla sama při formátování.

Doufám, že ti alespoň trochu pomohlo. 

Edited by NeoRevCrew
Vypadlo mi slůvko o:)
Link to comment
Share on other sites

  • 0

Toto mi ukáže ked použijem tvoj kod ->

C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(683) : warning 217: loose indentation
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(689) : error 017: undefined symbol "adminscount"
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(689) : warning 215: expression has no effect
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(694) : error 017: undefined symbol "adminscount"
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(694) : warning 215: expression has no effect
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(698) : warning 217: loose indentation
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(699) : error 017: undefined symbol "adminscount"
C:\Users\PC\Desktop\GTA SA Pawn\gamemodes\mod.pwn(699) : warning 215: expression has no effect

 

Link to comment
Share on other sites

  • 0

Dobre, ešte si to mal zle nariadkované, to som už opravil ...

Tak zatiaľ díki, vyskúšam a napíšem.

 

Ešte, mohol by si mi poslať ako to má byť, keby tam chcem aj Rcon vidieť ? :d

Edited by TeeZee
Link to comment
Share on other sites

  • 0

No, fuha, teď mě nenapadá žádné elegantní řešení, jak to dát do toho tvého kódu a zároveň z toho neudělat totální hnus.
Tady už bych určitě (alespoň já osobně) použil tu proměnnou na názvy levelů:
 

Spoiler

new levelname[][] = { EOS, "Organizátor akcí", "Moderátor", "Administrátor" }; //Ten EOS tam být nemusí, uvidíš za chvilku

 

no a potom bych cyklus nahradil tímto:
 

Spoiler

 for(new i; i <= GetPlayerPoolSize(); i++) {

  if(!IsPlayerConnected(i)) continue;

  if(info[ i ][ALevel] == 0) continue; 

  if(!IsPlayerAdmin(i)) format(line, sizeof line, "\n%s | %s", meno(i), levelname[info[ALevel]]);  //Kdybys v proměnné levelname neměl ten EOS, tak by muselo být levelname[info[ALevel]-1]);

  else format(line, sizeof line, "\n%s | %s + RCON", meno(i), levelname[info[ALevel]]); //Tady to samé

  strcat(str, line);

  adminsonline = true;

}

Jinak možná by sis měl upravit velikost řetězce line (56 bych řekl, že by mohlo stačit), a jako bojový úkol by sis mohl udělat ten počet online adminů do globální proměnné, to bys mohl zvládnout. 

Edited by NeoRevCrew
Link to comment
Share on other sites

  • 0
před 22 minutami, Guyy said:

dcmd_admins(playerid, params[]) {
#pragma unused params
new bool:adminsonline = false, str[255], line[45];
   
 for(new i; i <= GetPlayerPoolSize(); i++) {
  if(!IsPlayerConnected(i)) continue;
  if(pInfo[i][ALevel] == 1) {
    if(IsPlayerAdmin(i)) format(line, sizeof line, "\n%s | Organizátor akcí | RCON", meno(i));
    else format(line, sizeof line, "\n%s | Organizátor akcí", meno(i));
    strcat(str, line);
    adminscount = true;
   }
	if(pInfo[i][ALevel] == 2)
    {
    	// ...                                
    }
 }
 if(adminsonline == false) return ShowPlayerDialog(playerid, d_admins1, DIALOG_STYLE_MSGBOX, "Online A-Team", "Momentálne nie je prítomný žiaden člen A-Teamu",
 "Potvrdiť", "");
 ShowPlayerDialog(playerid, d_admins, DIALOG_STYLE_MSGBOX, "Online A-Team", str, "Potvrdiť", "");
 return 1;
}

EDIT:// Upravený kód od NeoRevCrew, chyby som neopravil

Toto som použil a zatiaľ funguje, pokiaľ som na servery sám ...

Zajtra uvidím, ale dúfam že to bude v pohode.

 

Ďakujem všetkým za pomoc. Zajtra ešte napíšem, že či je to na 100% vyriešené.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...