Kleines /admins Problem

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Ich habe mich als Adminlevel 5 gemacht.
    Aber wenn ich jetzt im Spiel eingebe /admins wir mir Adminlevel 1 Moderrator angezeigt.


    ocmd:admins(playerid,params[])
    {
    #pragma unused params
    SendClientMessage(playerid, BLAU, "|______Supporter / Administratoren Online:______|");


    new i = 0, aname[256], string[256];
    for(; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i))
    {
    if(isPlayerAnAdmin(i,1))
    {
    GetPlayerName(i, aname, sizeof(aname));
    format(string, 256, " Moderrator: %s", aname);
    SendClientMessage(playerid, GRAU, string);
    }
    else if(isPlayerAnAdmin(i,2))
    {
    GetPlayerName(i, aname, sizeof(aname));
    format(string, 256, " Supporter: %s", aname);
    SendClientMessage(playerid, GRAU, aname);
    }
    else if(isPlayerAnAdmin(i,3))
    {
    GetPlayerName(i, aname, sizeof(aname));
    format(string, 256, " Super Supporter: %s", aname);
    SendClientMessage(playerid, GRAU, string);
    }
    else if(isPlayerAnAdmin(i,4))
    {
    GetPlayerName(i, aname, sizeof(aname));
    format(string, 256, " Administrator: %s", aname);
    SendClientMessage(playerid, GRAU, string);
    }
    else if(isPlayerAnAdmin(i,5))
    {
    GetPlayerName(i, aname, sizeof(aname));
    format(string, 256, " Projektleiter: %s", aname);
    SendClientMessage(playerid, GRAU, string);
    }
    }
    }
    return 1;
    }


    Meine Adminabfrage sieht so aus:
    stock isPlayerAnAdmin(playerid,rang)
    {
    if(GetPVarInt(playerid,"Adminlevel")>=rang)return 1;
    return 0;
    }


    /Edit

  • Da kommt dann error:


    C:\Users\Lukas\Desktop\Scripting\Mein Server\gamemodes\Somalia.pwn(344) : error 029: invalid expression, assumed zero
    C:\Users\Lukas\Desktop\Scripting\Mein Server\gamemodes\Somalia.pwn(344) : warning 215: expression has no effect
    C:\Users\Lukas\Desktop\Scripting\Mein Server\gamemodes\Somalia.pwn(344) : error 001: expected token: ";", but found ")"
    C:\Users\Lukas\Desktop\Scripting\Mein Server\gamemodes\Somalia.pwn(344) : error 029: invalid expression, assumed zero
    C:\Users\Lukas\Desktop\Scripting\Mein Server\gamemodes\Somalia.pwn(344) : fatal error 107: too many error messages on one line

  • versuche es mal so::


    ocmd:admins(playerid,params[])
    {
    #pragma unused params
    new name[MAX_PLAYER_NAME];
    SendClientMessage(playerid, 0xFDD700FF, "|______Supporter / Administratoren Online:______|");
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(isPlayerAnAdmin(i))
    {
    new str[128];
    GetPlayerName(i,name,sizeof(name));
    format(str,sizeof(str),"%s (AdmLv: %i)\n",name,AdminLevel(playerid));
    return 1;
    }
    return 1;
    }
    return 1;
    }
    stock AdminLevel(playerid)
    {
    new alvl;
    alvl = GetPVarInt(playerid,"Adminlevel");
    return alvl;
    }
    stock isPlayerAnAdmin(playerid)
    {
    if(GetPVarInt(playerid,"Adminlevel")>=0)return 1;
    return 0;
    }

  • bomber... wie komt man auf solche ideeen ? verdammt...


    also du wirst als moderator angezeigt, da die adminabfrage ja zurückgibt ob du einen adminrang größer oder gleich dem adminrang der benötigt wird besitzt.
    wenn du also 5 bist, aber 1 benötigt wird, wird trotzdem true zurückgegeben.


    entweder du erstellst einen stock der abfrägt ob der spieler genau diesen adminrang hat:


    stock isPlayerAnAdmin(playerid,rang)
    {
    if(GetPVarInt(playerid,"Adminlevel")==rang)return 1;
    return 0;
    }


    oder du arbeitest in deinem befehl, oder mein favorit, du erstellst dir einen stock, der dir den namen, des adminlevels ausgibt, denn diesen wirst du öfter benötigen.
    zB so:


    stock getadminrankname(playerid)
    {
    new rName[32];
    switch(GetPVarInt(playerid, "Adminlevel")) {
    case 0 : rName="";
    case 1 : rName="Moderator";
    ...


    }
    return rName
    }

  • Also, den isPlayerAnAdmin stock habe ich jetzt geändert, aber wie muss das jetzt z.B. hier aussehen:


    ocmd:aduty(playerid, params[])
    {
    #pragma unused params
    if(!isPlayerAnAdmin(playerid,1))return SendClientMessage(playerid,ROT,"Du bist kein Admin.");
    {
    if(aDuty[playerid]==1) return SendClientMessage(playerid, ROT, "Du bist bereits On Duty!");
    else
    {
    aDuty[playerid] = 1;
    new str[128], pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));
    format(str, sizeof(str),"%s hat sich als Supporter angemeldet!", pname);
    SendClientMessageToAll( 0x0069FFFF, str);
    SetPlayerColor(playerid, 0x050000FF);
    SetPlayerArmour(playerid, 100);
    }
    }
    return 1;
    }


    Denn wenn ich jetzt eingebe /aduty wird mir gesagt Du bist kein Admin.

  • Ich geh mal auf den Code im Ausgangspost ein. Interessiert eventuell ja Jemanden der ein ähnliches Problem hat.


    Das Problem ist,dass die Reihenfolge für die Level-Abfrage falsch ist.
    Angenommen du bist Level 5 und zuerst wird abgefragt ob das Stimmt:
    if(isPlayerAnAdmin(i,1))
    Stimmt natürlich.Du bist 5,also auch mindestens Level 1.
    Jetzt kommen die Anderen Abfragen gar nicht mehr dran,weil es "else if" ist und der erste Fall ( "if(isPlayerAnAdmin(i,1))" ) bereits eingetroffen ist:
    else if(isPlayerAnAdmin(i,2))
    else if(isPlayerAnAdmin(i,3))
    else if(isPlayerAnAdmin(i,4))
    else if(isPlayerAnAdmin(i,5))


    Damit es richtig wäre,hättest du nur die Reihenfolge von 1 , 2 , 3 , 4 und 5 in 5 , 4 , 3 , 2 und 1 ändern müssen.


    Der Ausgangscode würde auch funktionieren,wenn du nur die isPlayerAdmin Abfrage geändert hättest:
    if(GetPVarInt(playerid,"Adminlevel")>=rang)return 1; // <-- nicht >= , sondern ==
    Würde auch funktionieren. Ich würde aber nie das exakte Adminlevel Abfragen,sondern immer ob es größer/gleich ( >= ) einem Level ist.