Gutes Tutorial für Pawno-Einsteiger

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 hatte gerade nichts besseres zu tun, also habe ich mich an dieses Tutorial gemacht ;)


    1. Pawno


    Pawno ist der Editor, mit dem man üblicherweise SA:MP Scripte erstellt.
    Es gibt auch zahlreiche Erweiterungen bzw. Überarbeitungen (z.B. Breadfishs Visual Pawn).
    Neue offizielle Versionen von Pawno erhält man immer über die SA-MP Seite.


    In diesem Archiv, das man dort erhält, ist zudem noch eine Serversoftware, die man später braucht, um überhaupt das Script zu testen.


    Links:
    SA-MP Server v0.2X (Windows)
    SA-MP Server v0.2X (Linux)
    SA-MP Client v0.2X u1


    2.Der Server


    Der Server läuft unter Windows und Linux.
    Um das Script zu testen sollte man es eigentlich gleich in Linux tun, da es einige Funktionen gibt, die unter Linux nicht richtig arbeiten.
    Einen Windows Server ins Netz zu stellen, wäre viel zu unsicher.


    Wenn man die Datei heruntergeladen hat entpackt man sie (es verläuft alles symmetrisch bei Linux), am besten ins GTA San Andreas Verzeichnis im Ordner Server.
    Bevor man den Server in Betrieb nehmen kann, muss man noch die Config verändern.


    Code
    echo Executing Server Config...lanmode 0rcon_password changememaxplayers 32port 7777hostname Unnamed 0.2X Servergamemode0 lvdm 1filterscripts adminspec vactionsannounce 1query 1weburl www.sa-mp.comanticheat 0


    Rot markierte Texte müssen verändert werden!
    Das rcon_password (RCON Passwort) ist nötig, um volle Zugriffsrechte zu erhalten.
    Es gibt auch Admin Systeme, die dies virtuell erledigen, falls es jedoch Probleme gibt, muss man RCON benutzen.


    Grüne Felder kann man so stehen lassen, sollte man jedoch verändern (besonders bei dem Server, den man ins Netz stellt).


    2. Teil weiter unten

  • Thx hat mir weitergeholfen. Habe nun nur ein Problem und zwar der übernimmt mir die neuen Sachen nicht ins Game. Habe ein Roleplay Script hier runter geladen und ein paar Sachen geändert und hinzugefügt. Aber IG passiert nichts. Bitte um Hilfe drehe noch durch ?(

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • naja wenns klappen würde :D werd noch voll irre mit :cursing:

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • Brauche immer noch Hilfe bei, wenn ich das mit Pawno scripte und dann abspeichere übernimmt er es IG einfach nicht.

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • Hast du auf den blauen Pfeil im Editor geklickt?
    Und hast du dann auch die amx. Datei hochgeladen?

  • wie amx ? wenn ich die bei Pawno hochlade zeigt er mir nur Hyroglyphen und wenn ich die amx datei nochmals in Flilescripts tuhe funzt der Server nicht mehr. Also wollte die pwn datei aus GMX ändern.

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • Hää...?
    Willst du nun einen Gamemode oder ein Filterscript hochladen?

  • ok hab jetz auf den Pfeil geklickt und heut habe ich nun nee fehlermeldung :


    einmal hier

    if(strcmp(cmd, "/clearchat", true) == 0)
    {
    if (IsPlayerAdmin(playerid) == 1)
    {
    {
    for (new a=1;a<=10;a++)
    {


    da sagt er mir in der ersten Zeile gleich den Fehler
    dann hier:
    else
    {
    SendClientMessage(playerid,0, "\n", "Du Bist Kein Admin oO!");
    }
    return 1;
    }
    und hier in der 3 Zeile


    if(strcmp(cmd, "/pay", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD1, "USAGE: /pay [playerid/PartOfName] [amount]");
    return 1;
    }
    //giveplayerid = strval(tmp);
    giveplayerid = ReturnUser(tmp);
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD1, "USAGE: /pay [playerid/PartOfName] [amount]");
    return 1;
    }
    moneys = strval(tmp);
    if(moneys > 1000 && PlayerInfo[playerid][pLevel] < 3)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "You must be level 3 to pay over 1000");
    return 1;
    }
    if(moneys < 1 || moneys > 99999)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Dont go below 1, or above 99999 at once.");
    return 1;
    }
    if (IsPlayerConnected(giveplayerid))
    {
    if(giveplayerid != INVALID_PLAYER_ID)
    {
    if(PlayerInfo[giveplayerid][pLocal] == 106)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Command not allowed in this location");
    return 1;
    }
    if (ProxDetectorS(5.0, playerid, giveplayerid))
    {
    GetPlayerName(giveplayerid, giveplayer, sizeof(giveplayer));
    GetPlayerName(playerid, sendername, sizeof(sendername));
    playermoney = GetPlayerMoney(playerid);
    if (moneys > 0 && playermoney >= moneys)
    {
    ConsumingMoney[giveplayerid] = 1;
    GivePlayerMoney(playerid, (0 - moneys));
    GivePlayerMoney(giveplayerid, moneys);
    format(string, sizeof(string), " You have sent %s(player: %d), $%d.", giveplayer,giveplayerid, moneys);
    PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0);
    SendClientMessage(playerid, COLOR_GRAD1, string);
    format(string, sizeof(string), " You have recieved $%d from %s(player: %d).", moneys, sendername, playerid);
    SendClientMessage(giveplayerid, COLOR_GRAD1, string);
    format(string, sizeof(string), "%s has paid $%d to %s", sendername, moneys, giveplayer);
    PayLog(string);
    if(moneys >= 1000000)
    {
    ABroadCast(COLOR_YELLOW,string,1);
    }
    PlayerPlaySound(giveplayerid, 1052, 0.0, 0.0, 0.0);
    format(string, sizeof(string), "* %s nahm sein geld aus seiner Tasche, und drückte es %s in die Hand.", sendername ,giveplayer);
    ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Invalid transaction amount.");
    }
    }
    else
    {
    SendClientMessage(playerid, COLOR_GRAD1, " Your too far away.");
    }
    }//invalid id
    }
    else
    {
    format(string, sizeof(string), " %d is not an active player.", giveplayerid);
    SendClientMessage(playerid, COLOR_GRAD1, string);
    }
    }
    return 1;
    hier auch gleich wieder in der ersten Zeile und in den Zeilen 17 und 51 Auch noch.


    Das hier ist der letzte Fehler:


    if (strcmp(cmdtext, "/yopen", true)==0)
    {
    if(PlayerInfo[playerid][pMember] == 6 || PlayerInfo[playerid][pLeader] == 6)
    {
    MoveObject(yakuzator,725.692383, -1417.382813, 15.030107, 3.5);
    SetTimer("yakuzator1", 9000, 0);
    }
    return 1;
    Wieder in der ersten Zeile.


    Ich habe gerade erst angefangen mit scripten und wollte es bisschen auf meinem Homeserver machen. Von daher würde ich einen von euch gerne bitten mal schnell einen blick drauf zu werfen und vil erkennt ja einer den Fehler.
    ps. Ja die AMX Dat ist ein GMD und ich wollte die PWN Dat verändern !!!

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • 3. Scripting
    Kommen wir zum Wesentlichen, das Scripten.


    Dinge, die wichtig sind:
    - Eigene Scripts kommentieren
    - Die Einrückungen (mit TAB) immer korrekt machen
    - Eine anständige Darstellung
    - Ressourcenschonen programmieren (dazu gibt es auch ein Tutorial)
    - etc.


    Falls dieses Tutorial nichts bringen sollte, kann man natürlich auch andere (englische) Tutorials nehmen ;)


    Fangen wir doch gleich mal an:

    #include <a_samp>


    Was wir hier sehen, ist etwas alltägliches bei Pawn, ein Include.
    In einem Include sind Funktionen definiert, die dann im Hintergrund etwas bewirken.
    Man kann auch selbst Includes erstellen, die es anderen Leuten vereinfachen können, bestimmte Ziele zu verwirklichen.

    #define MEINE_DEFINITION 123

    Schaut man sich dieses Codestückchen an, merkt man, dass es der Variable sehr ähnelt.
    Das #define zeigt, dass es eine Definition von etwasem ist.
    MEINE_DEFINITION ist der Name der Definition und 123 der Wert.


    public OnGameModeInit()
    {
    SetGameModeText("Mein Gamemode!");
    return 1;
    }

    Schauen wir uns doch einmal diese Public-Funktion an.
    Public kann nur 0 und 1 ausgeben, deshalb muss man manchmal auch mit anderen Mitteln arbeiten, dazu später mehr.
    Hier sieht man schonmal den Aufbau der Syntax, Struktur der Sprache, die eigentlich nicht kompliziert ist.
    Es gibt viele Funktionen, die schon definiert sind, dies sind alle wichtigen, die man braucht.
    Schauen wir uns mal den Namen der Funktion an.


    public OnGameModeInit()

    Das public ist die Art der Funktion (meistens wird public verwendet), das OnGameModeInit heisst übersetzt: WennSpielBetriebInitialisiert, d.h. wenn euer Script initialisiert wird, bei dem Spieler der auf den Server kommt.
    Die beiden () werden benötigt, um den Header zu definieren, das bedeutet, ob darin noch andere Funktionen, wie z.B. playerid verwendet werden, dazu aber auch später mehr.
    Bei normalen Funktionen, die dem Spieler nichts sagen sollen, sondern nur im Hintergrund etwas machen, braucht es im Header nichts, d.h. man setzt einfach zwei ().


    Kommen wir zum nächsten Teil...


    SetGameModeText("Mein GameMode!");

    Diese Funktion bestimmt den Namen deines GameModes.

    Dieser wird dann folgendermassen angezeigt:


    Bild


    Wichtig ist es, nach jeder Funktion wie SetGameModeText() ein Semikolon ( ; ) zu setzen, bei public nicht!

    Dann schauen wir uns noch zwei Sachen an.


    {
    }

    Die Beiden geschweiften Klammern (Curly Braces) werden benutzt, um Codeblöcke zu bilden.
    Kommt eine neue "Verzweigung" werden die Anweisungen z.B. duch Bedingungen abgetrennt und mit geschweiften Klammern versehen.


    Geschweifte Klammern kommen nur bei Funktionen!


    return 1;

    Das bedeutet einfach, dass das Script 1 = true = wahr zurückgibt, wäre hier 0 würde eine Meldung im Spiel erscheinen: SERVER: Unknown Command.


    Mit den Codeblöcken und geschweiften Klammern ist auch ein sehr wichtiges Thema gekommen.
    Es geht um die richtige Einrückung des Codes.
    Einrücken bedeutet, dass man im Editor eine Position / Stufe weiter nach hinten geht.
    Mit der TAB(ulator)-Taste (zwei Pfeile) werden Einrückungen gemacht (diese befindet sich über der Caps Lock Taste).


    Bei allen Funktionen mit public verläuft es nach dem gleichen Prinzip.



    TEIL 3 WEITER UNTEN

  • Damit unser GameMode lauffähig ist benötigen wir noch einige weitere publics.
    Wie wär's zum Beispiel mit folgendem public:


    public OnPlayerConnect(playerid)

    Was sofort auffällt ist, dass zwischen den Klammern playerid steht.
    Playerid ist schlicht jeder einzelne Spieler, der auf dem Server spielt.
    Man kann es auch mit dem localhost (127.0.0.1) vergleichen.


    Aber warum wird hier überhaupt playerid verwendet?
    OnPlayerConnect ist eigentlich die 2. Stufe vom Laden des GameModes.
    Da OnGameModeInit kein playerid unterstützt verwendet man OnPlayerConnect.


    Wir erweitern unseren GameMode mit OnPlayerConnect:


    public OnGameModeInit()
    {
    SetGameModeText("Mein GameMode!");
    return 1;
    }


    public OnPlayerConnect(playerid)
    {
    SendClientMessage(playerid, COLOR_WHITE, "Willkommen auf meinem Server!");
    return 1;
    }

    Hier haben wir einige Neuerungen, die wir uns anschauen:


    SendClientMessage(playerid, COLOR_WHITE, "Willkommen auf meinem Server!");

    Nun betrachten wir jeden einzelnen Abschnitt:
    SendClientMessage(WEM, FARBE, TEXT);


    Hier wird jemandem eine Nachricht geschickt, die oben links im Chat für den jeweiligen Spieler angezeigt wird.
    Wem wird meistens durch playerid ersetzt.
    Farbe ist eine Farbe, z.B. 0xFFFFFFAA (= weiss).
    Damit man sich diese Hexadezimalcodes nicht merken muss, kann man oben im Script einfach folgendes einfügen:


    #define COLOR_WHITE 0xFFFFFFAA


    Jetzt ist COLOR_WHITE definiert.
    Text wird gesendet, ein normaler Satz wird so geschrieben "Hallo Leute!", Zahlen ebenfalls wie Texte "1 2 3" und Variablen ohne Anführungs- und Schlusszeichen.

    Kommt nun ein Spieler auf den Server wird er durch die neue Funktion begrüsst.


    Unser nächstes Thema werden Variablen sein.
    Hier ein kurzes Beispiel einer Variablen:


    new Erdbeertorte;


    Das sollte selbsterklärend sein...
    Dies wäre nun eine globale Variable, d.h. man kann sie im ganzen Script verwenden.


    public OnPlayerConnect(playerid)
    {
    new Schokotorte;
    return 1;
    }


    Das wäre eine lokale Variable, da man sie nur innerhalb von OnPlayerConnect verwenden kann.
    Versucht man eine globale Variable neu zu erstellen, kommt folgender Fehler:

    Code
    warning 219: local variable "VARIABLE" shadows a variable at a preceding level


    Beispiel:


    new Erdbeertorte;


    public OnPlayerConnect(playerid)
    {
    new Erdbeertorte;
    return 1;
    }


    Ein guter Einstieg ist es, ein einfaches Death Match Script zu schreiben.
    Also richten wir unseren GameMode auf Death Match aus.
    Zuerst müssen wir uns einige Dinge überlegen:
    - Wo spielt das Script (LS, SF, LV, ...)
    - Was soll darin vorkommen
    ...


    Während du dieses Script schreibst werden dir noch viele weitere Ideen in den Sinn kommen ;)


    Wir haben nun OnGameModeInit und OnPlayerConnect.
    Nun sollten wir einmal eine Map erstellen.
    In einem Script dürfen aber nur 150 Objekte, die man im Map Editor hinzufügt, vorhanden sein, sonst crasht er Server.
    Dieses Problem kann mit mit Object Streamern umgehen, diese Erstellen Objekte erst, wenn der Spieler in der Nähe ist.
    Im ersten Post vom Tutorial ist auch der Downloadlink für MTA + Object Streamer.


    under construction...
    LEIDER KANN ICH DIE NÄCHSTEN 4320MIN (72H / 3 TAGE) IN DIESEM THREAD NICHTS MEHR POSTEN.
    DER TEIL MIT DEM DEATHMATCH GEHÖRT EIGENTLICH IN DEN NÄCHSTEN POST...

  • Wolltest du nicht weiter machen ? die drei tage sind doch schon lange um ^^ ,


    wuerde mich gerne um den anderen Teil intressieren.^^