-
Sziasztok!
Egy játékmódon dolgozok, és ott a parancsoknál szükségem lenne, egy olyanra, hogy ha olyan játékos Nevét/ID-jét irja be aki offline, nincs fent a szerveren akkor hibaüzenetet irjon.
Erre tökéletesen jó lenne a :
if(IsPlayerConnected(playerid))
függvény, azonban ez csak a csatlakozott játékost ellenörzi le, viszont nekem az kéne,hogyha be is van jelentekzve,
erre van egy, ilyen változóm :
Belepve[playerid]
Itt a kód :
CMD:adminad(playerid,params[])
{
new kinek,szint;
if(!Admin(playerid,4)) return NincsJog(playerid);
if(sscanf(params,\"ui\",kinek,szint)) return Uzenet(playerid,\"Használat: /adminad <Név/ID> <Szint>\");
{
if(!Belepve[kinek]) return NemOnline(playerid);
if(szint < 1 || szint > 5) return Uzenet(playerid,\"Az Admin szintnek 1 és 5 között kell lennie !\");
Uzenet(kinek,\"Admint kaptál\");
JatekosInfo[kinek][pAdmin] = szint;
}
return 1;
}
if(!Belepve[kinek]) return NemOnline(playerid); // Így csak az online playereknek enged adni admint, offline játékos ID-t irok be vagy egy kitalált nevet, akkor SERVER:Unknow command, gondolom mert a például beirom, az 5-s ID-t és az ha nem online akkor Belepve[5] és ennek nincs értéke ezért irja ki hogy Unknow command.
if(IsPlayerConnected(kinek)) // Így viszont müködik, mert gondolom itt úgy fut le, hogy IsPlayerConnected(5) és itt letudja ellenőrözni.
Na most nekem a Belepve[kinek]-el kéne valami megoldás, hiszen ha nincs bejelentkezve a játékos akkor még nem kaphat admint stb.
Ötletek?
-
if(IsPlayerConnected(kinek) && Belepve[kinek])
http://nyelvek.inf.elte.hu/leirasok/Pawn/index.php?chapter=4#section_2
Kicsit tekerj lejjebb, és nézd meg a logikai operátorokat
-
Itt is az IsPlayerConnected miatt az egyik része jó, de az és(&&) miatt kellene a Belepve[kinek] is, de ahogyan említettem, beírok egy random ID-t pl. 5 és akkor
if(Belepve[5])
Mivel nincs 5-s IDjű játékos akinek ilyen értéke lenne ezért SERVER : Unknown command :(
Dupla hozzászólás automatikusan összefûzve. ( 2016. április 06. - 15:25:35 )
CMD:teszt1(playerid,params[])
{
new kinek;
if(sscanf(params,\"u\",kinek)) return Uzenet(playerid,\"Használat: /teszt < JÁTÉKOS NÉV / JÁTÉKOS ID >\");
{
if(IsPlayerConnected(kinek))
{
Uzenet(playerid,\"Bejelentkezve\");
}
else Uzenet(playerid,\"Nem online\");
}
return 1;
}
CMD:teszt2(playerid,params[])
{
new kinek;
if(sscanf(params,\"u\",kinek)) return Uzenet(playerid,\"Használat: /teszt < JÁTÉKOS NÉV / JÁTÉKOS ID >\");
{
if(Belepve[kinek])
{
Uzenet(playerid,\"Bejelentkezve\");
}
else Uzenet(playerid,\"Nem online\");
}
return 1;
}
Ittvan két kód, hogy lehessen látni közöttük a különbséget. Ha /teszt1 1Mark6-t irsz be akkor kiirja, hogy bejelentkezve, ha /teszt Sajt(nem online játékos) akkor kiirja, hogy nem online. Nos ez lenne az IsPlayerConnect, na de most /teszt2-vel ugyanezeket megcsinálva, amikor beirod pl. /teszt2 Sajt => SERVER:UNKNOWN COMMAND.
-
if(IsPlayerConnected(kinek)) {
if(!Belepve[kinek]) return SCM(playerid,-1,\"heloszia\");
// ur scrt code hr
}
-
Sajnos ezzel a módszerrel sem müködik, viszont rájöttem valamire.
Az \'u\' egy speciális értéket kezel, ami lehet a játékos neve és a játékos ID-je.
Az IsPlayerConnected() - Mindkét esetet tudja kezelni, IsPlayerConnected(20) vagy IsPlayerConnected(\"1Mark6\") <- ezt a programkód hibásnak irja, de a parancs lefutásakor logikailag ez helyetesítődik.
A változó \"Belepve[playerid]\" - Viszont csak az ID-t tudja kezelni, Belepve[20], a nevet nem tudja, még csupán logikailag sem, -> Belepve[1Mark6].
Ehhez kellene valami ötlet, hogy csak az olyan játékosokon tudja használni a parancsot, akiknél a Belepve[playerid] = true, jöhet a felvetés használj \'u\' helyett, \'d,i\' igen ezekkel tisztában vagyok, azonban nekem kényelmesebbnek tünne úgy, hogy ha a játékos nevét lehetne beirni.
-
Egyszerű, ha nevet írsz be, akkor végigfutsz minden játékoson egy ciklussal, majd lekéred a nevüket, ha valaki neve egyezik a beírt névvel, akkor eltárolod az ID-t
Ha nincs olyan név akkor visszatérsz INVALID_PLAYER_ID-vel vagy amivel éppen akarsz. a visszatérés értéke alapján pedig elágazásokkal csinálod tovább!
-
Sokkal egyszerűbb egy enumba létrehozni változót, majd egy tömböt létrehozni minden játékosnak és mikor belép, akkor 1-re, true-ra, vagy akármire állítani az értékét.
Gyakorlatban:
enum jatekosinfo
{
bool:pBelepve
}
new pInfo[MAX_PLAYERS][jatekosinfo];
//és mikor belép a játékos
pInfo[playerid][pBelepve] = true;
Egy hátránya van szerintem, ez akkor jó, ha sok változója van egy játékosnak. De ez a legjobb módszer. Szerintem. Jobb mint a ciklus :D
Aztán mikor le akarod kérni, hogy be van-e lépve:
if(pInfo[playerid][pBelepve])
{
//belépve
}
else
{
//nincs belépve
}
-
Igazad van enumba használva kényelmesebb, azonban a probléma továbbra is fent áll, ha olyan játékos nevét / ID-t irom be aki nem online, kapom a SERVER:UNKNOWN COMMAND hibaüzenet, azonban ha az online játékos nevét / ID-t irom akkor müködik.
-
https://wiki.sa-mp.com/wiki/GetPlayerID
Ha nem számot írt be, kérd le az ID-jét és utána már le tudod ellenőrizni.
-
Egyszerű, ha nevet írsz be, akkor végigfutsz minden játékoson egy ciklussal, majd lekéred a nevüket, ha valaki neve egyezik a beírt névvel, akkor eltárolod az ID-t
Ha nincs olyan név akkor visszatérsz INVALID_PLAYER_ID-vel vagy amivel éppen akarsz. a visszatérés értéke alapján pedig elágazásokkal csinálod tovább!
Ez a megoldás pont arra szolgál, higy névvel is mukodjon
-
Na szóval. Nem kell ciklus, ugyanis szerintem itt te rontottál el valamit. Magyarázat:
Az \"u\" elválasztó azért speciális, mert ha te egy nevet, vagyis stringet írsz be, akkor is az ID-vel, vagyis intigerrel tér vissza. Gyakorlati példa:
Van fent 2 játékos, legyen Te és Én. A Te ID-d a 0(1Mark6), az enyém az 1(Ryan). Parancs, amivel teszteljük:
CMD:teszt(playerid, params[])
{
new id;
sscanf(params, \"u\", id);
printf(\"%d\", id);
return true;
}
Én beírom, hogy /teszt 1Mark6, akkor ezt fogja kiadni:
nulla, azaz 0
Mivel a Te ID-d az 0. Ugyanez van más esetnél is, amikor a csatlakozott játékos van. De ha azt írom be, hogy Sajt, akkor ezt fogja kiprintelni:
65535
mivel Sajt nincs fent így INVALID_PLAYER_ID-vel tért vissza. Tehát mindig intigerrel tér vissza, ha nevet vagy név töredéket írsz be.
Így nem az a hiba, hanem valami más.
Szerintem próbáld meg így:
CMD:adminad(playerid,params[])
{
new kinek,szint;
if(!Admin(playerid,4))
return NincsJog(playerid);
if(sscanf(params,\"ui\",kinek,szint))
return Uzenet(playerid,\"Használat: /adminad <Név/ID> <Szint>\");
if(!Belepve[kinek])
return NemOnline(playerid);
if(szint < 1 || szint > 5)
return Uzenet(playerid,\"Az Admin szintnek 1 és 5 között kell lennie !\");
Uzenet(kinek,\"Admint kaptál\");
JatekosInfo[kinek][pAdmin] = szint;
return true;
}
Ennyit tudtam segíteni, ha ez sem jó, akkor tanácstalan vagyok. :shurg:
-
Köszönöm szépen a segitséget, amit irtál azon elgondolkozva ez a megoldás született :
if(!IsPlayerConnected(kinek) || !Belepve[kinek]) return NemOnline(playerid);
Szóval ha a játékos nincs felcsatlakozva a szerverre, akkor kiirja neki, ez a BUGFIX mert ez képes az INVALID PLAYER ID-t is kezelni, és ha fentvan a szerveren átugrik a másik feltételre, hogyha a Belepve változója hamis, és mivel felvan csatlakozva így már létezik az a változó index ID. Szóval köszönöm szépen :D