Dynamisches Fraktionsystem(KP wie weiter)

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 versuche ein Dynamisches Fraktionssystem zumachen mit allem drum und dran Fraktionsname ändern Ränge ändern.
    Bis jetzt bin ich so weit:
    #define MAX_FRAKTIONEN 15
    enum FrakDaten
    {
    pFID,
    pFName,
    pLeader,
    pCoLeader,
    pRang1[30],
    pRang2[30],
    pRang3[30],
    pRang4[30],
    pRang5[30],
    pRang6[30]
    };
    new FDaten[MAX_FRAKTIONEN][FrakDaten];
    Ist nicht viel ich weiß,aber ich hoffe ihr könnt mir helfen wie ich weiter machen kann?
    Danke im voraus :)

  • Mal zu dein enum.


    Das könntest du mal so ändern :)
    enum FrakDaten
    {
    pFID,
    pFName[64], //Der Name der Fraktion darf höchstens 64 Zeichen haben
    pLeader[MAX_PLAYER_NAME],
    pCoLeader[MAX_PLAYER_NAME],
    pRang1,
    pSkin,
    pColor,
    Float:s_x,//s_ spawn
    Float:s_y,
    Float:s_z
    };

    Dann habe ich noch eine Funktion für dich, dass ist für deine Rang namen.
    GetRangName(playerid)
    {
    new name[70];
    new fID = pInfo[playerid][pFraktion];
    if(fID == 1) //bsp SAPD
    {
    if(FDaten[fID][pRang] == 1) format(name, sizeof(name), "Streife 1");
    else if(FDaten[fID][pRang] == 2) format(name, sizeof(name), "Streife 2");
    else if(FDaten[fID][pRang] == 3) format(name, sizeof(name), "Streife 3");
    else if(FDaten[fID][pRang] == 4) format(name, sizeof(name), "Streife 4");
    else if(FDaten[fID][pRang] == 5) format(name, sizeof(name), "Ausbilder");
    else if(FDaten[fID][pRang] == 6) format(name, sizeof(name), "Leader");
    }
    return name;
    }


    bsp:
    format(string,128,"Du hast dein Member den Rang (%d - %s) vergeben.",pInfo[playerid][pRang],GetRangName(playerid));

  • Wie baue ich diesen Befehl denn:
    ocmd:makeleader(playerid, params[])
    {
    if(SpielerInfo[playerid][pAdminlevel] < 6) return SendClientMessage(playerid,Rot,"M�glich ab: "COLO" Adminrank 6");
    new pID, fID;
    if(!IsPlayerConnected(pID)) return SendClientMessage(playerid,Rot,"Keiner ist Verbunden mit dieser ID!");
    if(sscanf(params,"ui",pID,fID))return SendClientMessage(playerid,Rot, ""COLO"Verwendung: "COLR"/makeleader [playerid] [Fraktionsid]");
    if(fID >= sizeof(fInfo))return SendClientMessage(playerid,Rot, ""COLO""servertag""COLR"Fraktion existiert nicht.");
    SpielerInfo[pID][pFraktion] = fID;
    SpielerInfo[pID][pLeader] =fID;
    if(fID != 0) SpielerInfo[pID][pRang] = 6;
    else SpielerInfo[pID][pRang] = 0;
    SavePlayer(pID);
    new string[128];
    format(string,sizeof(string),""COLO"[%s]%s "COLR"hat dich zum Leader der Fraktion "COLO"%s"COLR" gemacht.",adminrang(playerid),GetName(playerid), fInfo[fID][f_name]);
    SendClientMessage(pID, Rot, string);
    SendClientMessage(playerid, Rot, ""COLO""servertag"""Du hast einen Spieler zum Leader gemacht.");
    return 1;
    }


    Nun zu meinem Fraktions Enum um?
    enum FrakDaten
    {
    fID,
    fName[128],
    fRang1[30],
    fRang2[30],
    fRang3[30],
    fRang4[30],
    fRang5[30],
    fRang6[30],
    fSpawnX,
    fSpawnY,
    fSpawnZ,
    fSpawnI
    };
    new FDaten[MAX_FRAKTIONEN][FrakDaten];

  • Mal paar kleine Anhaltspunkte:


    • Array erstellen mit allen benötigten Variablen
    • Du benötigst eine Lade- und Speicherfunktion für deine Werte.
    • Die benötigten Befehle schreiben

    Am besten stellst du dir die Werte in einer Tabelle vor, wenn du eine Zeile füllen willst musst du immer erst ermitteln , welche Zeile frei ist das geht über eine Schleife,
    dazu pickst du dir eine variable raus , welche du überprüfst ob diese leer ist wie zum beispiel einen String oder einen anderen wert der auf jeden Fall leer sein muss, wenn diese Zeile nicht belegt ist. Wenn du einen Wert abfragen möchtest musst du die Zeilen rasufiltern, du verwendest dazu auch wieder eine Schleife und ermittelst darüber den entsprechenden index.
    [table=4]
    [*]fID[*]fName[*]fRang1[*]weiteres
    [*]1 [*]Ballas[*]Anwerber[*]...
    [*]2 [*]Grove[*]Anwerber[*]...
    [*]...[*]...[*]...[*]...
    [/table]
    Beispiel: du willst abfragen ob eine Fraktion existiert
    stock fractionExist(fid){
    for(new i; i != MAX_FRAKTIONEN;++i){
    if(!FDaten[i][fName][0])continue;
    if(FDaten[i][fID] == fid)return 1;
    }
    return 0;
    }




    [/table]


  • Naja man muss nicht extra ein stock machen um abfragen zu können ob diese Fraktion existiert.
    Er könnte das ja in sein Befehl einbauen
    if(fID >= sizeof(fInfo))return SendClientMessage(playerid,COLOR_GRAU, " Info: Fraktion existiert nicht.");

  • Naja man muss nicht extra ein stock machen um abfragen zu können ob diese Fraktion existiert.
    Er könnte das ja in sein Befehl einbauen


    Du frägst nur ab ob die fID größer sei als die Anzahl der Indexe des Array's. Schon mal dran gedacht das ein Index nicht belegt sein kann, zum Beispiel du kannst 10 Fraktionen erstellen und nur 5 hast du erstellt und machst den Spieler zum Leader der Fraktion 6.


    Ebenfalls ist bei mir das Problem auf negative Indexe zuzugreifen gelöst, das ist bei deiner einfachen Abfrage nicht der Fall.


    Solltest du auf einen negativen Index eines Arrays zugreifen so schmiert dir der Server ab.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen