Fraktionen Inklusive Befehle erstellen[Fortgeschritten]

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
  • Guten Tag zu meinem zweiten Tutorial, heute geht es darum wie wir eine Fraktion + makeleader & invite befehl erstellen.
    Tutorial schreiber: .Art.
    Was braucht ihr für dieses Tutorial:
    1x Login & Register Script
    1x Grundkenntnisse.


    Als beispiel nehme ich mal Julians Login & Register Script, zum einloggen ohne Befehl :)
    [url = http://www.megaupload.com/?d=93Q2E8NZ]Klick[/url]
    Hier ist es ;)
    nun werde ich euch Stück für Stück alles Zeigen + Erklären :D
    Wir gehen als erstes zu enum SInfo
    und fügen dort 3 sachen ein.
    1. Chef//Chef der Fraktion
    2. Beruf//Mitglied der Fraktion
    3. Firma//Die Firma :D
    Das würde dan so aussehen:
    enum SInfo
    {
    Passwort[256],
    Wanteds,
    Geld,
    Chef,
    Beruf,
    Firma,
    }
    Gut, Weiter gehts zum Speichern der Fraktion d.H nach dem Ausloggen wird es Gespeichert, beim Connecten wird es Geladen.
    Bei diesem Login & Register müssen wir mit STRG + F diesen public suchen: public Registrieren(playerid)
    Da sehen wir dan diesen Code:

    ....
    dini_IntSet(Spielerdatei,"Wanteds",SpielerInfo[playerid][Wanteds]);
    dini_IntSet(Spielerdatei,"Geld",SpielerInfo[playerid][Geld]);
    ....
    Dan fügen wir dort sein:
    dini_IntSet(Spielerdatei,"Chef",SpielerInfo[playerid][Chef]);
    dini_IntSet(Spielerdatei,"Beruf",SpielerInfo[playerid][Beruf]);
    dini_IntSet(Spielerdatei,"Firma",SpielerInfo[playerid][Firma]);
    Gut, nun wird beim Regestrieren in der Ini Chef, Beruf, Firma gespeichert :)
    nun suchen wir wieder mit STRG + F den public:
    public Anmelden(playerid)
    In diesem Public gibt es wieder Datein die wir brauchen:

    ....
    SpielerInfo[playerid][Wanteds] = dini_Int(Spielerdatei,"Wanteds");
    ....
    Dan fügen wir dort ein
    SpielerInfo[playerid][Chef] = dini_Int(Spielerdatei,"Chef");
    SpielerInfo[playerid][Beruf] = dini_Int(Spielerdatei,"Beruf");
    SpielerInfo[playerid][Firma] = dini_Int(Spielerdatei,"Firma");


    Wow, Glückwunsch... ihr habt eure Fraktion speichern lassen ;)
    nun zu dem Makeleader und Invite command.
    Dafür benutzen wir Dini
    Also fügen wir Ganz oben:
    #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1
    nun gehen wir zu " OnPlayerCommandText
    Da fügen wir 2 dinge ein
    dcmd(makeleader,10,cmdtext);
    dcmd(einladen,8,cmdtext);
    Das heißt wir Definieren einen Command mit einmal der Länge 10 und einmal der Länge 8.
    nun Fügt ihr ganz unten in euer Script das Hier ein:
    dcmd_makeleader(playerid,params[])
    {
    new pID;
    new frakid;
    new string[128];
    new string2[256];
    if (sscanf(params, "ui", pID, frakid)) SendClientMessage(playerid, Farbe, "Info: /makeleader [SpielerID] [FraktionID]");
    else if (pID == INVALID_PLAYER_ID || IsPlayerNPC(pID)) SendClientMessage(playerid, Farbe, "*:: Dieser Spieler kann nicht erreicht werden. ::*");
    else if (frakid < 0 || frakid > 3) SendClientMessage(playerid, Farbe, "Die FraktionID muss zwischen 0 und 3 sein!");
    else
    {
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    if(ISTADMIN)//Eure admin Abfrage
    {
    if(frakid == 0) { SpielerInfo[pID][Firma] = 0; SpielerInfo[pID][Chef] = 0; } //Zivilist
    if(frakid == 1) { SpielerInfo[pID][Firma] = 1; SpielerInfo[pID][Chef] = 1; } //Fraktion 1
    if(frakid == 2) { SpielerInfo[pID][Firma] = 2; SpielerInfo[pID][Chef] = 2; } //Fraktion 2
    ResetPlayerWeapons(playerid);
    format(string, sizeof(string),"Du hast ID: %d zum Chef der Job ID: %d gemacht.",pID,frakid);
    format(string2, sizeof(string2),"Du wurdest vom Admin %s zum Chef der Job ID: %d gemacht.",name, frakid);
    SendClientMessage(pID, Farbe, string2);
    SendClientMessage(playerid, Farbe, string);
    }
    else
    {
    SendClientMessage(playerid, Farbe, "Du bist kein Admin");
    }
    }
    return 1;
    }
    dcmd_einladen(playerid,params[])
    {
    new pID;
    new frakid = SpielerInfo[playerid][Chef];
    new string[128];
    new string2[256];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, sizeof(name));
    if(SpielerInfo[playerid][Chef] > 0)
    {
    if(sscanf(params, "u",pID))
    {
    return SendClientMessage(playerid,0xFFFFFFFF,"/Einladen [playerid]");
    }
    if(!IsPlayerConnected(pID)) {
    return SendClientMessage(playerid,0xFFFFFFFF,"Kein Spieler mit angegebener ID Online!");
    }
    if(frakid == 1) { SpielerInfo[pID][Firma] = 1; SpielerInfo[pID][Beruf] = 1; } //Fraktion 1
    else if(frakid == 2) { SpielerInfo[pID][Firma] = 2; SpielerInfo[pID][Beruf] = 2; } //Fraktion 2
    format(string, sizeof(string),"Du hast ID:%d in deine Firma eingeladen.",pID);
    format(string2, sizeof(string2),"Du wurdest von Chef %s in seine Firma eingeladen.",name);
    SendClientMessage(pID, Farbe, string2);
    SendClientMessage(playerid, Farbe, string);
    }
    else
    {
    SendClientMessage(playerid, Farbe, "Du bist kein Chef");
    }
    return 1;
    }
    Nun falls ihr noch wollt das eure Fraktion an einem bestimmten Ort spawnt müsst ihr erst mit STRG + F zu OnPlayerSpawn gehen.
    Dan fügt ihr diesen Code ein:
    if(SpielerInfo[playerid][Firma] == 1)
    {
    SetPlayerPos(playerid, Float:X, Float:Y, Float:Y);
    SetPlayerInterior(playerid, Int);
    SetPlayerVirtualWorld(playerid, World);
    return 1;
    }

    Wo ich jetzt das Beispiel gemacht habe, müsst ihr den Code natürlich anpassen :)
    nun ihr wollt noch einen kleinen Command für eure Fraktion?
    dan geht ihr mit STRG + F zu
    OnPlayerCommandText
    und fügt:
    if(strcmp(cmd, "/Fraktion1", true) == 0)
    {
    if(SpielerInfo[playerid][Firma] == 1)
    {
    SendClientMessage(playerid, FARBE, "Du bist in der Fraktion 1");
    }
    return 1;
    }


    So, nun habt ihr es.. ihr könnt es natürlich verändern und und und.. ich habe nicht all zuviel erklärt da ein Fortgeschrittener Scripter die Basics behärschen müsste :)


    Hier mal das Gamemode:
    http://www.megaupload.com/?d=UD0SN33S


    Credits to .Art. wegen dem Tutorial
    Credits to RFT aka Julian wegen dem Login & Register :)


    //Edit:
    Neuer Link Uploadet : )
    //Edit 2: Befehl + Spawn
    //Edit 3: Habe mal das ganze GM gemacht mit makeadmin, makeleader, einladen und spawns :)

    3 Mal editiert, zuletzt von .Art. ()

  • könntest du noch ein beispiel schreiben wie man festlegt das dann die leute z.b aus einer fraktion immer an einem bestimmsten ort spawnen und wie man festlegt wie man einen befehl nur ausführen kann wenn man nur in dieser fraktion ist ? dann wäre das tut perfekt :D

  • Mache ich gerne :)
    //Edit:
    2 kleine Test's hinzugefügt.
    1 Kleiner Command um zu Testen ob es geklappt hat und 1 kleiner Spawn :)

    Einmal editiert, zuletzt von .Art. ()

  • danke :D und was muss ich machen wenn dieser error kommt : undefined symbol "sscanf"

  • Wen du willst kannst du dir ganz unten vom Tutorial das Script downloaden da geht alles, ist Makeadmin Makeleader Einladen Spawns undso drine,
    Falls nicht füg das gaaanz unten in dein script:
    stock sscanf(string[], format[], {Float,_}:...)
    {
    #if defined isnull
    if (isnull(string))
    #else
    if (string[0] == 0 || (string[0] == 1 && string[1] == 0))
    #endif
    {
    return format[0];
    }
    #pragma tabsize 4
    new
    formatPos = 0,
    stringPos = 0,
    paramPos = 2,
    paramCount = numargs(),
    delim = ' ';
    while (string[stringPos] && string[stringPos] <= ' ')
    {
    stringPos++;
    }
    while (paramPos < paramCount && string[stringPos])
    {
    switch (format[formatPos++])
    {
    case '\0':
    {
    return 0;
    }
    case 'i', 'd':
    {
    new
    neg = 1,
    num = 0,
    ch = string[stringPos];
    if (ch == '-')
    {
    neg = -1;
    ch = string[++stringPos];
    }
    do
    {
    stringPos++;
    if ('0' <= ch <= '9')
    {
    num = (num * 10) + (ch - '0');
    }
    else
    {
    return -1;
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num * neg);
    }
    case 'h', 'x':
    {
    new
    num = 0,
    ch = string[stringPos];
    do
    {
    stringPos++;
    switch (ch)
    {
    case 'x', 'X':
    {
    num = 0;
    continue;
    }
    case '0' .. '9':
    {
    num = (num << 4) | (ch - '0');
    }
    case 'a' .. 'f':
    {
    num = (num << 4) | (ch - ('a' - 10));
    }
    case 'A' .. 'F':
    {
    num = (num << 4) | (ch - ('A' - 10));
    }
    default:
    {
    return -1;
    }
    }
    }
    while ((ch = string[stringPos]) > ' ' && ch != delim);
    setarg(paramPos, 0, num);
    }
    case 'c':
    {
    setarg(paramPos, 0, string[stringPos++]);
    }
    case 'f':
    {


    new changestr[16], changepos = 0, strpos = stringPos;
    while(changepos < 16 && string[strpos] && string[strpos] != delim)
    {
    changestr[changepos++] = string[strpos++];
    }
    changestr[changepos] = '\0';
    setarg(paramPos,0,_:floatstr(changestr));
    }
    case 'p':
    {
    delim = format[formatPos++];
    continue;
    }
    case '\'':
    {
    new
    end = formatPos - 1,
    ch;
    while ((ch = format[++end]) && ch != '\'') {}
    if (!ch)
    {
    return -1;
    }
    format[end] = '\0';
    if ((ch = strfind(string, format[formatPos], false, stringPos)) == -1)
    {
    if (format[end + 1])
    {
    return -1;
    }
    return 0;
    }
    format[end] = '\'';
    stringPos = ch + (end - formatPos);
    formatPos = end + 1;
    }
    case 'u':
    {
    new
    end = stringPos - 1,
    id = 0,
    bool:num = true,
    ch;
    while ((ch = string[++end]) && ch != delim)
    {
    if (num)
    {
    if ('0' <= ch <= '9')
    {
    id = (id * 10) + (ch - '0');
    }
    else
    {
    num = false;
    }
    }
    }
    if (num && IsPlayerConnected(id))
    {
    setarg(paramPos, 0, id);
    }
    else
    {
    #if !defined foreach
    #define foreach(%1,%2) for (new %2 = 0; %2 < MAX_PLAYERS; %2++) if (IsPlayerConnected(%2))
    #define __SSCANF_FOREACH__
    #endif
    string[end] = '\0';
    num = false;
    new
    name[MAX_PLAYER_NAME];
    id = end - stringPos;
    foreach (Player, playerid)
    {
    GetPlayerName(playerid, name, sizeof (name));
    if (!strcmp(name, string[stringPos], true, id))
    {
    setarg(paramPos, 0, playerid);
    num = true;
    break;
    }
    }
    if (!num)
    {
    setarg(paramPos, 0, INVALID_PLAYER_ID);
    }
    string[end] = ch;
    #if defined __SSCANF_FOREACH__
    #undef foreach
    #undef __SSCANF_FOREACH__
    #endif
    }
    stringPos = end;
    }
    case 's', 'z':
    {
    new
    i = 0,
    ch;
    if (format[formatPos])
    {
    while ((ch = string[stringPos++]) && ch != delim)
    {
    setarg(paramPos, i++, ch);
    }
    if (!i)
    {
    return -1;
    }
    }
    else
    {
    while ((ch = string[stringPos++]))
    {
    setarg(paramPos, i++, ch);
    }
    }
    stringPos--;
    setarg(paramPos, i, '\0');
    }
    default:
    {
    continue;
    }
    }
    while (string[stringPos] && string[stringPos] != delim && string[stringPos] > ' ')
    {
    stringPos++;
    }
    while (string[stringPos] && (string[stringPos] == delim || string[stringPos] <= ' '))
    {
    stringPos++;
    }
    paramPos++;
    }
    do
    {
    if ((delim = format[formatPos++]) > ' ')
    {
    if (delim == '\'')
    {
    while ((delim = format[formatPos++]) && delim != '\'') {}
    }
    else if (delim != 'z')
    {
    return delim;
    }
    }
    }
    while (delim > ' ');
    return 0;
    }
    Ich rate dir das Script zu downloaden, http://www.megaupload.com/?d=UD0SN33S

  • Es sind leider 2 Fehler drin :( einmal wenn ich schon einen account habe steht da ich haben keinen kann mich aber trotzdem mit dem pw einloggen und der 2te ist wenn ich mich manuel in den script files als cop eintrage bleibt es gespeichert aber wenn ich es als befehl ingame mit /makeleader machen bleibt es nach dem relog nicht gespeichert ....

    Einmal editiert, zuletzt von khaos ()

  • Cooles Tutorial!


    Nur!


    Irgendwie erkennt mein Pawno die "Wandets" nicht an
    (Musste alles mit "Wandets" Rauslöschen


    Zudem krieg ich jetzt immernoch dieses Fehlermeldungen
    C:\Users\Beni\Desktop\Games\GTA\Alter Server things\Server\gamemodes\Restart!.pwn(384) : error 017: undefined symbol "sscanf"
    C:\Users\Beni\Desktop\Games\GTA\Alter Server things\Server\gamemodes\Restart!.pwn(391) : error 017: undefined symbol "ISTADMIN"
    C:\Users\Beni\Desktop\Games\GTA\Alter Server things\Server\gamemodes\Restart!.pwn(421) : error 017: undefined symbol "sscanf"
    Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    3 Errors.


    Wüsste jemand die Lösung dazu?


    Greez beni

    Gewalt ist keine Lösung aber ein Weg zum Ziel :thumbup:

  • ISTADMIN & sscanf sind undefiniert, steht da doch...


    ISTADMIN evtl.


    #define ISTADMIN IsPlayerAdmin(playerid)


    Aber SSCANF hab ich persönlich in einer include ;)

    Die deutsche Rechtschreibung ist Freeware, sprich du darfst sie kostenlos nutzen...
    Sie ist aber nicht Open Source, somit darfst du sie nicht verändern oder in veränderter Form veröffentlichen!


  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Wen du dir dieses Script downloadest da ist alles dabei, da sind auch keine Errors...
    und mit ISTADMIN meinte ich halt eure abfrage^^

  • dcmd_makeleader(playerid,params[])
    {
    new pID,frakid;
    if (sscanf(params, "ui", pID, frakid)) SendClientMessage(playerid, Farbe, "Info: /makeleader [SpielerID] [FraktionID]");
    else if (pID == INVALID_PLAYER_ID || IsPlayerNPC(pID)) SendClientMessage(playerid, Farbe, "*:: Dieser Spieler kann nicht erreicht werden. ::*");
    else if (frakid < 0 || frakid > 3) SendClientMessage(playerid, Farbe, "Die FraktionID muss zwischen 0 und 3 sein!");
    else
    {
    if(ISTADMIN)//Eure admin Abfrage
    {
    SpielerInfo[pID][Firma] = frakid;
    SpielerInfo[pID][Chef] = frakid;
    new name[20], str[128];
    GetPlayerName(playerid, name, sizeof(name));
    ResetPlayerWeapons(playerid); // Warum die Waffen des Spielers zurücksetzen der den Befehl eingegeben hat?
    format(str, sizeof(str),"Du hast ID: %d zum Chef der Job ID: %d gemacht.",pID,frakid);
    SendClientMessage(playerid, Farbe, str);
    format(str, sizeof(str),"Du wurdest vom Admin %s zum Chef der Job ID: %d gemacht.",name, frakid);
    SendClientMessage(pID, Farbe, str);
    }
    else return SendClientMessage(playerid, Farbe, "Du bist kein Admin");
    }
    return 1;
    }
    Ich hab das mal ein wenig optimiert, weil warum erstellst zu 2 Strings, einen mit 128 Zeichen und den anderen mit 256? Ist doch Quatsch, man benötigt nur einen und der wird nach dem Senden umformatiert ^^

  • Ich habe das ganze als Filterscript O.o drinnen und es funtkioniert.


    Nur:
    Wenn ich spawne kommt die Meldung (Du musst dich erst registrieren) und ich sterbe gleich!
    Nur (Am Anfang) kommt eine Meldung das ich noch nicht registriert bin und ich muss mein Passwort eingeben (was ich auch mache). Nur das das mich zur Skin Auswahl bringt und DIE hat zur Folge das ich ständig sterbe (und zur Skin Auswahl) zurückgeworfen werde


    Hat jemand eine Lösung
    (Sehe keinen Grund warum das nur als Gamemode nutzbar ist O.o /Edit: Versteh ich da was falsch?)


    greez Beni


    -----


    Edit: Anderes schwerwiegenderes Problem -.-
    !
    Nun kann ich mich einloggen der Gamemode läuft! Nur speichert es anscheinend die UserDaten nicht ab! (Zumindest finde ich sie nicht) und kann mich daher auch nicht zum Admin machen!


    Zudem Erscheint dies in meinem Server Fenster


    Script[gamemodes/Restart!.amx]: Run time error 20: "Invalid index parameter <bad entry point)"
    ?(

    Gewalt ist keine Lösung aber ein Weg zum Ziel :thumbup:

    2 Mal editiert, zuletzt von _Beni_ ()

  • erstmal danke für das Tutorial aber habe ein par Probleme:Habe alle Errors etc. behoben...
    Habe das alles Als Filterscript....
    habe mir das dini Include runtergelanden:
    http://dracoblue.net/download-release/35/dini_1_6.zip


    und das sscanf Include habe ich auch weggemacht und selber im
    Filterscript definiert...
    Aber bei mir kommt folgendes:
    -Wenn ich mich anmelde passiert nichts.
    -Wenn ich spawnen will sterbe ich weil ich mich ja nicht regestriert habe...
    Vllt kann mir ja jemmand helfen



    Mfg leon


    //edit: sind dort eig Ränge usw dabei?

  • also ich habe dieses scripi script jetzt und habe es auch schon ein wenig umgebaut und wollte jetzt fragen wie das mit dem login/register dort gemacht wurde.WO erden die spielerdaten beim regsiter gespeichert???kann ich dann auch admin von meinem server werden endlich^^?


    ______________________________________________________________________________________________________________________________


    341 GetPlayerMoney(playerid,SpielerInfo[playerid][Geld]);
    342 GetPlayerWantedLevel(playerid,SpielerInfo[playerid][Wanteds]);



    ich habe fehlermeldungen:(341) : warning 202: number of arguments does not match definition
    (342) : warning 202: number of arguments does not match definition


    2 Warnings.
    wie bekomme ich die weg :( ?


    habe das editiert:



    achso und das mit dem : OnPlayerCommand


    dcmd(makeleader,10,cmdtext);
    dcmd(einladen,8,cmdtext);


    geht net bekomme wegen den beiden errors-.- kann mir wer helfen und welche fraktion ist das eig^^den vorherigen thread auch plspls beantworten :love:

    Einmal editiert, zuletzt von kevin888 ()

  • Habe die selben Errors... Kann uns jemmand dabei helfen?


    //edit1: Endschuldigung habe die Errors

    J:\GTA-Reallife-Server\gamemodes\Reallife.pwn(737) : warning 203: symbol is never used: "dcmd_einladen"
    J:\GTA-Reallife-Server\gamemodes\Reallife.pwn(737) : warning 203: symbol is never used: "dcmd_makeleader"

    Einmal editiert, zuletzt von Möchtigern ()

  • Zitat


    J:\GTA-Reallife-Server\gamemodes\Reallife.pwn(737) : warning 203: symbol is never used: "dcmd_einladen"
    J:\GTA-Reallife-Server\gamemodes\Reallife.pwn(737) : warning 203: symbol is never used: "dcmd_makeleader"


    Das sind keine Errors sondern warnings und die warnings kann man ignorieren :)

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