Szerző Téma: admins parancs  (Megtekintve 984 alkalommal)

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
admins parancs
« Dátum: 2012. július 11. - 14:15:01 »
0 Show voters
Ü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)
« Utoljára szerkesztve: 2012. július 11. - 14:16:53 írta ZyZu »

admins parancs
« Válasz #1 Dátum: 2012. július 11. - 14:22:03 »
0 Show voters
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;
}

Nem elérhető Erik3333

  • 945
  • SMF | phpBB | TS3 | PHP | HTML | CSS | JS | PAWN | JAVA
    • Profil megtekintése
admins parancs
« Válasz #2 Dátum: 2012. július 11. - 14:40:38 »
0 Show voters
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;
}
« Utoljára szerkesztve: 2012. július 11. - 21:51:58 írta Erik3333 »

Nem elérhető Gabor..

  • 1883
  • Gabor..
    • Profil megtekintése
admins parancs
« Válasz #3 Dátum: 2012. július 11. - 17:47:15 »
0 Show voters
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;
}
« Utoljára szerkesztve: 2012. július 11. - 17:49:27 írta Gabor.. »

Nem elérhető DaVe

  • 149
    • Profil megtekintése
admins parancs
« Válasz #4 Dátum: 2012. július 11. - 21:42:57 »
0 Show voters
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;
}

Nem elérhető Erik3333

  • 945
  • SMF | phpBB | TS3 | PHP | HTML | CSS | JS | PAWN | JAVA
    • Profil megtekintése
admins parancs
« Válasz #5 Dátum: 2012. július 11. - 21:53:04 »
0 Show voters
Idézetet írta: DaVe date=1342035777\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"24169\" data-ipsquote-contentclass=\"forums_Topic
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.

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
admins parancs
« Válasz #6 Dátum: 2012. július 11. - 22:41:40 »
+1 Show voters
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;
}
« Utoljára szerkesztve: 2012. július 11. - 22:57:21 írta DrAkE »

dexi

  • Vendég
admins parancs
« Válasz #7 Dátum: 2012. július 11. - 23:01:49 »
0 Show voters
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.
« Utoljára szerkesztve: 2012. július 11. - 23:35:38 írta Fl0rian »

admins parancs
« Válasz #8 Dátum: 2012. július 11. - 23:28:59 »
0 Show voters
@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.

Nem elérhető DaVe

  • 149
    • Profil megtekintése
admins parancs
« Válasz #9 Dátum: 2012. július 12. - 13:22:15 »
0 Show voters
Idézetet írta: DrAkE date=1342039300\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"24169\" data-ipsquote-contentclass=\"forums_Topic
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 ;)
« Utoljára szerkesztve: 2012. július 12. - 13:25:14 írta DaVe »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal