Befehl Frage

  • Hallo!


    Dem Rat von @Jeffry zufolge erstelle ich hier n extra Thema, da mein Anliegen wohl etwas schwieiriger ist.


    Ich habe in meinem Script Verwalterränge, welche zb. Hausverwalter, Bizverwalter etc. sind. Dies sind zusätzliche Teamränge, damit zb. nicht jeder Admin Hausverwalter ist. Ein Teamler kann bis zu 4 Verwalterränge gleichzeitig haben.


    Das sind meine DB Spalten:


    Verwalter1
    Verwalter2
    Verwalter3
    Verwalter4


    Wie mache ich am besten den /makeverwalter Befehl, dass wenn ich schreibe /makeverwalter Spielerid Verwalterrang der Verwalterrang 6 zb nicht in 2 verschiedenen Spalten ist? Wie mache ich es, dass der Befehl weiß in welche Spalte er schreiben soll?


    Hiermein /makeverwalter

    ocmd:makeverwalter(playerid, params[])
    {
    //if(SD[playerid][pEingeloggt] == 0)return SCM(playerid, GRAU, "Du bist nicht eingeloggt!");
    new pID, verwid, string[128];
    if(!iPAA(playerid,5))
    {
    if(sscanf(params, "ui", pID, verwid))return makeadmin;
    //if(adminid < 2)return SCM(playerid, GRAU, "Du kannst nur ab Rang 2 vergeben.");
    if(IPN(pID))return 1;
    //if(IsPlayerNPC(pID))return 1;
    //if(!Eingeloggt[pID])return SCM(playerid, GRAU, "Dieser Spieler ist nicht eingeloggt!");
    //if(SD[pID][pIntro] < 1)return SCM(playerid, GRAU, "Der Spieler ist noch im Tutorial.");
    if(verwid == 0)
    {
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter1] = verwid;
    format(string, sizeof(string), "Du hast %s %s aus dem Teamposten %s entlassen", string,SD[pID][pName], string);
    SCM(playerid, BLAU, string);
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter1] = verwid;
    format(string, sizeof(string), "%s %s hat dir den Rang %s entzogenn!", string,SD[playerid][pName],GVRN(pID));
    SCM(pID, BLAU, string);
    format(string,sizeof(string), GVRN(playerid));
    SD[pID][pVerwalter1] = verwid;
    format(string, sizeof(string), "AdmCMD: %s %s hat %s %s den Rang %s entzogen!", string,SD[playerid][pName],string, SD[pID][pName],GVRN(pID));
    SAM(BLAU, string);
    SD[pID][pVerwalter1] = 0;
    SUS(pID);
    return 1;
    }
    if(verwid < 1 || verwid > 7)return adminrangnichtexistent;
    format(string,sizeof(string), GVRN(pID));
    SD[pID][pVerwalter1] = verwid;
    format(string, sizeof(string), "Du hast %s %s den Teamrang %s gegeben", string,SD[pID][pName], GVRN(pID));
    SCM(playerid, BLAU, string);
    format(string, sizeof(string), "%s %s hat dir den Teamrang %s gegeben",GVRN(playerid),SD[playerid][pName],GVRN(pID));
    SCM(pID, BLAU, string);
    format(string,sizeof(string), GVRN(pID));
    SD[pID][pVerwalter1] = verwid;
    format(string, sizeof(string), "AdmCMD: %s %s hat %s %s zum %s ernannt.",string, SD[playerid][pName],string, SD[pID][pName], GVRN(pID));
    SAM(BLAU,string);
    SUS(pID);
    return 1;
    }
    else {SCM(playerid, GRAU, "Du hast nicht genügend Rechte für diesen Befehl.");}
    return 1;
    }


    MfG

  • Wäre es nicht klüger nur eine Spalte zu haben in der eine Zahl steht die einem Typ Verwalter zugeordnet ist?

    Intel Xeon X5670 Hexacore @ 4.2 GHz - 18 GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

  • Hm, ich hät ja gerne, dass ein Spieler bis zu 4 verschiedene Verwalterränge gleichzeitig haben kann.


    Abgesehn davon viel mri grade auf, so wie der Befehl gechrieben ist, kann man sich den Verwalterrang settzen wen man Rang 0 ist. Wie kan ch das am besten umgehen?


    if(iPAA(playerid,5)) funktioniert nicht.

  • Leider weiß ich nicht was iPAA() macht.



    Zur Datenbankstruktur: so etwas wird in der Regel über zusätzliche Tabellen gelöst.


    Also du hast eine "Haupttabelle", lass es eine User-Tabelle sein, mit einem Primary Key und für diesen Fall wohl ausreichend eine zweite Tabelle mit den Verwaltungs-IDs.


    Diese zusätzliche Tabelle hat dann mindestens drei Spalten, und zwar den Primary Key für sich selber, einen Foreign Key der auf die Haupttabelle referenziert und die Daten, z.B. deine Verwalter-ID.


    Über den Primary Key der Usertabelle kannst du nun in der zusätzlichen Tabelle alle Verwaltungs-IDs des betreffenden Users abfragen, zählen, mit JOINS in die Haupttabelle einblenden, etc..

    Intel Xeon X5670 Hexacore @ 4.2 GHz - 18 GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

  • In deiner Datenbank. Welches Datenbanksystem verwendest du denn?

    Intel Xeon X5670 Hexacore @ 4.2 GHz - 18 GB Triple Channel DDR3 - GeForce RTX 2070 Super - Asus P6T Deluxe V1

    Mainboard 11 Jahre, CPU 10 Jahre alt - old but gold!

  • Was breadfish sagt ist absolut richtig, für deine Anforderung aber vermutlich etwas zu viel des Guten.
    Daher würde ich dir, auch wenn man es eigentlich nicht so machen sollte, erst mal raten, das Ganze mit 4 Spalten in der User-Tabelle zu realisieren. Das ist einfacher und für dich besser verständlich.


    Wie mache ich es, dass der Befehl weiß in welche Spalte er schreiben soll?

    Woher soll er es denn wissen? Wenn 0 drin steht, oder was sagt dem Befehl, dass er in 1,2,3 oder 4 schreiben soll?
    Außerdem, beim Entziehen, wie soll er da wissen, welchen Rang er entziehen soll?


    Eventuell musst du deinen Befehl nochmal überdenken, was alles angegeben werden soll. Soll zusätzlich der Index angegeben werden, oder beim entziehen noch zusätzlich der Rang, der entzogen werden soll?


  • Dann benötigst du einen zusätzlichen Eingabeparameter im Befehl (Spalte).
    Setze außerdem im Enum dein pVerwalter1, ... auf:
    pVerwalter1[4],


    Dann kannst du über den eingegebenen Parameter "Spalte" auf den Index zugreifen:
    SD[pID][pVerwalter][spalte] = verwid;


    Um zu prüfen, ob er diesen Rang bereits hat, mache eine Schleife durch alle 4 Spalten und gebe eine Nachricht aus, falls du die verwid bereits in einer der Spalte findest.


    Außerdem muss deine "GVRN" auch die Spalte mit als Parameter beinhalten, sonst weiß der Code ja nicht, welche Spalte du auslesen willst.

  • Also die Spalten Veralter 1 bis Verwalter 4 lassen?
    SD[pID][pVerwalter][spalte] = verwid; für jede der 4 Spaten?

    Um zu prüfen, ob er diesen Rang bereits hat, mache eine Schleife durch alle 4 Spalten und gebe eine Nachricht aus, falls du die verwid bereits in einer der Spalte findest.
    Außerdem muss deine "GVRN" auch die Spalte mit als Parameter beinhalten, sonst weiß der Code ja nicht, welche Spalte du auslesen willst.

    Wie mach ich so ne Schleife?
    Wie meinst das mit GetVerwalterRangName(GVRN)?

  • 1. Ja.
    2. Nein, die spalte gibt der User im Befehl ein, also in sscanf aufnehmen.
    3. Mit "for" wie jede andere Schleife auch, versuche dich doch erst mal dran.
    4. Wenn ein User 4 unterschiedliche Rang Namen haben kann, dann musst du der Funktion natürlich auch mitgeben, welcher der vier Ränge zurück gegeben werden soll.

  • Also if(sscanf(params, "ui", pID, spalte,adminid))return makeadmin; nur was müsste ich dann bei ui dazuschreiben?


    for Schleife so? for(new verwalter; verwalter < 4 players ++) so?


    format(string,sizeof(string), GVRN(playerid)[Spalte]); so?

  • 1. Ein i, hast du doch bei der verwid auch hinbekommen, warum jetzt nicht?


    2. So in etwa, probiere es doch einfach erst mal im Code aus, der Compiler wird dir schon sagen, ob es syntaktisch passt.


    3. Du musst die Spalte genau gleich im Funktionskopf mitgeben, wie die playerid auch, das hast du doch auch hinbekommen, warum verkomplizierst du es jetzt so?



    Probiere es bitte einfach im Code aus. Andernfalls kann dir jemand oder ich den Befehl fertig geben, dann hast du aber nichts dabei gelernt und stellst die gleichen Fragen nächstes mal wieder.

  • Habs versucht, wirftkeine Fehlermeldungen. Aber jetzt meckert der Compiler wegen



    public OnUserRegister(playerid)
    {
    SpielerDaten[playerid][p_id] = cache_insert_id();
    SpielerDaten[playerid][pEingeloggt] = true;
    SCM(playerid, 0x00FF00FF, "[Konto] Registration erfolgreich.");
    SaveUserStats(playerid);
    return 1;
    }



    public OnUserLogin(playerid)
    {
    new rows;
    cache_get_row_count(rows);
    if(rows == 0)
    {
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung", "Bitte logge Dich ein:\n{FF0000}Falsches Passwort!", "Ok", "Abbrechen");
    }
    else
    {
    cache_get_value_name_int(0, "ID", SpielerDaten[playerid][p_id]);
    cache_get_value_name_int(0, "Level", SpielerDaten[playerid][pLevel]);
    cache_get_value_name_int(0, "Geld", SpielerDaten[playerid][pGeld]);
    cache_get_value_name_int(0, "Skin", SpielerDaten[playerid][pSkin]);
    cache_get_value_name_int(0, "Admin", SpielerDaten[playerid][pAdmin]);
    cache_get_value_name_int(0, "Verwalter1", SpielerDaten[playerid][pVerwalter1]);
    cache_get_value_name_int(0, "Verwalter2", SpielerDaten[playerid][pVerwalter2]);
    cache_get_value_name_int(0, "Verwalter3", SpielerDaten[playerid][pVerwalter3]);
    cache_get_value_name_int(0, "Verwalter4", SpielerDaten[playerid][pVerwalter4]);
    SpielerDaten[playerid][pEingeloggt] = true;
    SCM(playerid, 0x00FF00FF, "[Konto] Erfolgreich eingeloggt.");
    GivePlayerMoney(playerid, SpielerDaten[playerid][pGeld]);
    }
    return 1;
    }


    Bei den pverwalter sagt er undefined



    stock SaveUserStats(playerid)
    {
    if(!SpielerDaten[playerid][pEingeloggt]) return 1;
    new query[1024];
    mysql_format(handle, query, sizeof(query), "UPDATE accounts SET Level = '%d', Geld = '%d', Skin = '%d', Admin = '%d',",
    SpielerDaten[playerid][pLevel],SpielerDaten[playerid][pGeld],GetPlayerSkin(playerid),SpielerDaten[playerid][pAdmin]);



    mysql_format(handle,query,sizeof(query),"%s Verwalter1 = '%d', Verwalter2 = '%d', Verwalter3 = '%d', Verwalter4 = '%d' WHERE id = '%d'",
    query,SpielerDaten[playerid][pVerwalter1],SpielerDaten[playerid][pVerwalter2],SpielerDaten[playerid][pVerwalter3],SpielerDaten[playerid][pVerwalter4],SpielerDaten[playerid][p_id]);
    mysql_pquery(handle, query);
    return 1;
    }


    Bei den pverwalter sagt er hier auch undefined