-
Üdv! Szeretnék kéri tõletek egy /Admins parancsot de ha lehet kérem dialogban írja a neveket, hogy ki az online admin!
Admin paracsok használata: if(PlayerInfo[playerid][Level] < 1)
-
CMD:adminok(playerid, params[])
{
new nev;
for(new i=0; i<MAX_PLAYERS; i++)
{
GetPlayerName(i, nev, sizeof(nev));
if(PlayerInfo[Level] < 1)
{
format(str, 128, \"%s | Szint: %d\"nev,PlayerInfo[Level] );
ShowPlayerDialog(playerid,20,DIALOG_STYLE_LIST,\"Adminok\",str,\"OK\",\"Mégse\");
}
}
return 1;
}
-
Helyesen:
CMD:adminok(playerid, params[])
{
new nev;
for(new i=0; i < MAX_PLAYERS; i++)
{
GetPlayerName(i, nev, sizeof(nev));
if(PlayerInfo[Level] > 0)
{
format(str, 128, \"%s | Szint: %d\"nev, PlayerInfo[Level] );
ShowPlayerDialog(playerid,20,DIALOG_STYLE_LIST,\"Adminok\",str,\"OK\",\"Mégse\");
}
}
return 1;
}
-
Ezek a megoldások pazarlóak, mivel minden lefutáskor lekéri a játékos nevét, még akkor is, ha nem talált egyezést. A változókat is létrehozza, minden parancs beírásakor, de ez mind felesleges, ha nincs találat. De elég akkor lekérdezni a nevét, ha talált egyezést. Meg ha már a ciklusnál tartunk, akkor inkább foreach-ot használjuk. A szint lekérdezés sem jó.
#include < a_samp >
#include < zcmd >
#include < foreach >
CMD:admins( playerid, params[] )
{
foreach(Player, i)
{
if( PlayerInfo[ i ][ Level ] > 0 )
{
new
szFormat[ 60 + 1 ],
szName[ MAX_PLAYER_NAME + 1 ];
GetPlayerName( i, szName, MAX_PLAYER_NAME );
format( szFormat, sizeof( szFormat ), \"%s(%d) -> Szint: %d\", szName, PlayerInfo[ i ][ Level ] );
SendClientMessage( playerid, -1, szFormat );
}
}
return 1;
}
-
Tulajdonképpen egyik megoldás sem jó, mert az utóbbi nem dialogban írja, a másik kettõ pedig mindig csak egy ember nevét írja ki dialogban, arról nem is beszélve, hogy az \"str\" tömböt létre se hozták és a \"nev\" nem tömb. És egyébként a te megoldásod is pazarló, mert két tömböt hoztál létre :)
Szóval akkor utoljára, helyesen:
CMD:adminok(playerid, params[])
{
new str[10*(MAX_PLAYER_NAME+14)+1] = \"Nincsenek adminok\"; //10 darab játékos * (maximum név + \" | Szint: \" + maximum négyjegyû szám) + \"\\n\"
for(new i=0; i < MAX_PLAYERS; i++)
{
if(PlayerInfo[Level] < 0)
{
new nev[MAX_PLAYER_NAME];
GetPlayerName(i, nev, sizeof(nev));
format(str, sizeof str, \"%s | Szint: %d\\n\",nev, PlayerInfo[Level] );
}
}
ShowPlayerDialog(playerid,20,DIALOG_STYLE_LIST,\"Adminok\",str,\"OK\",\"Mégse\");
return 1;
}
-
Tulajdonképpen egyik megoldás sem jó, mert az utóbbi nem dialogban írja, a másik kettõ pedig mindig csak egy ember nevét írja ki dialogban, arról nem is beszélve, hogy az \"str\" tömböt létre se hozták és a \"nev\" nem tömb. És egyébként a te megoldásod is pazarló, mert két tömböt hoztál létre :)
Szóval akkor utoljára, helyesen:
CMD:adminok(playerid, params[])
{
new str[10*(MAX_PLAYER_NAME+14)+1] = \"Nincsenek adminok\"; //10 darab játékos * (maximum név + \" | Szint: \" + maximum négyjegyû szám) + \"\\n\"
for(new i=0; i < MAX_PLAYERS; i++)
{
if(PlayerInfo[Level] < 0)
{
new nev[MAX_PLAYER_NAME];
GetPlayerName(i, nev, sizeof(nev));
format(str, sizeof str, \"%s | Szint: %d\\n\",nev, PlayerInfo[Level] );
}
}
ShowPlayerDialog(playerid,20,DIALOG_STYLE_LIST,\"Adminok\",str,\"OK\",\"Mégse\");
return 1;
}
Jó lenne, csak van egy hiba:
if(PlayerInfo[Level] < 0)
Ez csak akkor írja, ha 0 alatt van az Adminja.
-
Kajakra mondom, még DaVe a tied sem tökéletes, és mûködõ képes, most konkrétan végig futtotok egy cikluson, megformázzátok a(z) \"str\" változót, illetve mindig létrehoztok egy \"nev\" változót, viszont ennek a mérete 24 + 1-nek kellene lennie, mert a \"\\0\" jelet is kell tárolni, ezen felül, ahhoz hogy eltároljuk ezt a nagy adatmennyiséget szükség lenne még egy változóra, mondjuk egy (512 - 1024) + 1-es változó megtenné, de még enélkül is meglehet oldani ezeket. Na mindjárt megírom. Illetve ha már a foreachnál járunk, én speciel nem használom, mivel tömbben tárolja az adatokat ( ha jól tudom ) és azokon fut végig. Illetve ez a leggyorsabb ciklus.
CMD:admins(playerid, params[])
{
new
str[1024 + 1],
nev[MAX_PLAYER_NAME + 1],
i = -1,
fentlevo = 0;
str[0] = EOS;
for(;++i < MAX_PLAYERS;)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[Level] > 0)
{
fentlevo++;
nev[0] = EOS;
GetPlayerName(i, nev, MAX_PLAYER_NAME + 1);
format(str, sizeof(str), \"%s%s | Szint: %d\\n\", str, nev, PlayerInfo[Level]);
}
}
}
if(!fentlevo)
format(str, sizeof(str), \"Nincs fent jelenleg egy admin sem!\");
ShowPlayerDialog(playerid, 1573, DIALOG_STYLE_MSGBOX, \"Fentlévõ Adminok\", str, \"Oké\", \"\");
return 1;
}
-
DELETE. Elnéztem a dolgokat benne :D. Rám jött a versengés és elsietve elrontottam.
Személy szerint így oldanám meg. Drake-é is tökéletes.
-
@FlOrian
És az az 1016 darab 2 cella értékû (new g_szString[ (35 * 29) + 1 ][ 2 ]) változó hogyan tárolja el mondjuk az én nevemet?
A leggyorsabb sima ciklus sorozat mely átékos azonosítószámokkal fut le, abból adódik hogy feltételezzük hogy egy szerver nem a MAX_PLAYERS értékével megegyezõ slot számmal került elindításra.
Ezt az értéket a GetMaxPlayers() native funkció adja vissza nekünk.
Ennek az alkalmazásnak leggyorsabb módja ha csak egyszer kérjük le, és nem minden ciklus lépésenként.
Viszont ezt kettõ változó használatával tudjuk megoldani:
for(new i = 0, gmp = GetMaxPlayers(); i < gmp; i++)
Ez induláskor tárolja a szerver maximális játékosainak számát a gmp változóban és meg is õrzi minden egyes ciklus lépésben.
Amit sokan helyesnek tartanak az tulajdonképpen nem az:
for(new i = 0; i < GetMaxPlayers(); i++)
Itt az a probléma merül fel hogy a for ciklus minden egyes lépésnél lekérdezi a szerveren lévõ maximális slotok számát, és ez pazarló.
A leggyakrabban használt ciklus képlet viszont a samp 0.3e verziója mellett már 500-szor ismétlõdik:
for(new i = 0; i < MAX_PLAYERS; i++)
Erre találták ki a GetMaxPlayers()-t hogy egy ciklus sorozat ne ismétlõdjön 500-szor ha pl.: csak 30 slotos a szerver.
Viszont van egy másik módszer miszerint a MAX_PLAYERS definíciónak új értéket adunk viszont ezt szerver üzemeltetõknek változtatni kell ahogy változik a slotok száma.
#undef MAX_PLAYERS
#define MAX_PLAYERS 30
Ezzel a módszerrel számos helyen alkalmazott MAX_PLAYERS definicót a kívánt értékre állíthatunk.
Elõnye hogy mi?
A válasz egyszerû ha létrehozunk egy változót mely memória területet foglal el:
new valami[MAX_PLAYERS];
akkor alapból 500 darab cellát hozunk létre és ha ezt egy 30 slotos szerveren használjuk akkor van 470 darab feleslegesen létrehozott cella mely csak foglalja a memória területet kihasználatlanul.
A for, while, ciklusok ahol MAX_PLAYERS definíciót alkalmazunk csak annyiszor futnak le amennyi férõhelyes a szerver, nem ismétlõdik a példában szereplõ 470 alkalommal feleslegesen.
-
Kajakra mondom, még DaVe a tied sem tökéletes, és mûködõ képes, most konkrétan végig futtotok egy cikluson, megformázzátok a(z) \"str\" változót, illetve mindig létrehoztok egy \"nev\" változót, viszont ennek a mérete 24 + 1-nek kellene lennie, mert a \"\\0\" jelet is kell tárolni, ezen felül, ahhoz hogy eltároljuk ezt a nagy adatmennyiséget szükség lenne még egy változóra, mondjuk egy (512 - 1024) + 1-es változó megtenné, de még enélkül is meglehet oldani ezeket. Na mindjárt megírom. Illetve ha már a foreachnál járunk, én speciel nem használom, mivel tömbben tárolja az adatokat ( ha jól tudom ) és azokon fut végig. Illetve ez a leggyorsabb ciklus.
CMD:admins(playerid, params[])
{
new
str[1024 + 1],
nev[MAX_PLAYER_NAME + 1],
i = -1,
fentlevo = 0;
str[0] = EOS;
for(;++i < MAX_PLAYERS;)
{
if(IsPlayerConnected(i))
{
if(PlayerInfo[Level] > 0)
{
fentlevo++;
nev[0] = EOS;
GetPlayerName(i, nev, MAX_PLAYER_NAME + 1);
format(str, sizeof(str), \"%s%s | Szint: %d\\n\", str, nev, PlayerInfo[Level]);
}
}
}
if(!fentlevo)
format(str, sizeof(str), \"Nincs fent jelenleg egy admin sem!\");
ShowPlayerDialog(playerid, 1573, DIALOG_STYLE_MSGBOX, \"Fentlévõ Adminok\", str, \"Oké\", \"\");
return 1;
}
Igaz, bár én abból indultam ki, hogy nekem a MAX_PLAYERS újradefiniálása az elsõ :)
És felesleges ellenõrizni, hogy van fen-e admin. Ha alapból azt az értéket adod a tömbnek, hogy \"Nincs fent admin\" akkor ha nem talál megfelelõ játékost, a ciklus nem fog rajt változtatni ;)