Beiträge von Jari

    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...

    Bei allen
    SendClientMessage
    fehlt die Angabe, an wen das gesendet wird (z.B. playerid)...
    Richtig wäre z.B.:

    SendClientMessage(playerid, COLOR_YELLOW2, "|____ Tutorial: Wilkommen ____|");


    Edit// Versuch mal das:

    public tuttimer(playerid)
    {
    if(Tutorial[playerid] >= 1)
    {
    Tutorial[playerid] += 1;
    if(Tutorial[playerid] == 4)//Wenn 4 sec vorbei sind
    {
    SendClientMessage(playerid, COLOR_YELLOW2, "|____ Tutorial: Wilkommen ____|");
    SendClientMessage(playerid, COLOR_YELLOW2, "Das ist ein Real-Game-Server.");
    SendClientMessage(playerid, COLOR_YELLOW2, "Das Heist wenn sie nur Herumschissen möchten Suchen sie sich bitte ein DM Server.");
    SendClientMessage(playerid, COLOR_YELLOW2, "Jeder Server hat seine gewissen regeln, Auch unserer die ich ihnen nun Aufliste.");


    }
    if(Tutorial[playerid] == 8)//Wenn 8 sec vorbei sind
    {
    SendClientMessage(playerid, COLOR_YELLOW2, "|____ Tutorial: Regeln ____|");
    SendClientMessage(playerid, COLOR_YELLOW2, "1. Werbung für andere server oder sonstiges ist hier Verboten.");
    SendClientMessage(playerid, COLOR_YELLOW2, "2. Beschimpfungen oder Beleidigungen Werden sofort mit einen Ban Bestraft .");
    SendClientMessage(playerid, COLOR_YELLOW2, "3. Deathmatch ist hier VERBOTEN und wird mit einen kick bzw. bei öffteren vorkommen mit einen Ban Bestraft.");
    SendClientMessage(playerid, COLOR_YELLOW2, "4. Cheaten und Bugusing wird ebenfalls sofort mit einen Kick/Ban Bestrafft");
    }
    if(Tutorial[playerid] == 12)//Wenn 12 sec vorbei sind
    {
    SendClientMessage(playerid, COLOR_YELLOW2, "|____ Tutorial: Hilfestellung ____|");
    SendClientMessage(playerid, COLOR_YELLOW2, "Sie können sich in jedem Gewandgeschäft ein skin aussuchen gehen .");
    SendClientMessage(playerid, COLOR_YELLOW2, "Das Funktioniert in dem sie vor das Geschäft gehen und eingeben /enterstore .");
    SendClientMessage(playerid, COLOR_YELLOW2, "Nach 5 Minuten Spielen, werden sie hunger bekommen.");
    SendClientMessage(playerid, COLOR_YELLOW2, "sie können an einen burgershoot oder in jedem Restaurant etwas Essen gehen, Wir Haben auch ein drivein.");
    SendClientMessage(playerid, COLOR_YELLOW2, "Auf der Bank können sie mit /loan Geld ausborgen, und mit /payoff das Geld dann wieder zurück Zahlen.");
    SendClientMessage(playerid, COLOR_YELLOW2, "Hier gibt es auch in jeder stadt einen Flughafen, Damit können sie von Stadt zu Stadt FLiegen.");
    SendClientMessage(playerid, COLOR_YELLOW2, "Wenn sie Hilfe brauchen oder Probleme haben.");
    SendClientMessage(playerid, COLOR_YELLOW2, "können sie mit /report uns einen Report schreiben, Wir werden uns so bald wie möglich um sie kümmern. ");
    if(Tutorial[playerid] ==/*ENDE*/)
    }
    Tutorial[playerid] = 0;
    }
    }
    return 1;
    }


    Und pass auf, dass du Tutorial[playerid] auch immer erhöhst und nicht bei 8 lässt!

    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

    Hallo
    Nachdem ich gestern Probleme hatte mit meinem Menüs, die den Server crashten, entdeckte ich neue Probleme.
    Die Server Crashes habe ich mittlerweile behoben.


    Ich schildere hier mal mein Problem:
    Ich habe ein Ursprungsmenü (Menü A), ein Untermenü (Menü B) und ein 2. Untermenü (Menü C).
    Jetzt öffne ich Menü A und wähle den Punkt zu Menü C, klappt super.
    Ich schliesse Menü C und öffne Menü A erneut.
    Dann wähle ich den Unterpunkt zu Menü B.
    Ich schliesse Menü B und öffne Menü A erneut.
    Wieder wähle ich den Unterpunkt zu Menü C, es öffnet sich jedoch Menü B.


    Im Code gibt es keinerlei Warning oder Errors.
    Da er über 1000 Zeilen lang ist, will ich ihn hier nicht posten.
    AddMenuItem weist immer den Korrekten Menüs die Items zu.
    ShowMenuForPlayer zeigt auch immer das korrekte Menü, alles schon mehrmals durchgeschaut.


    Im SA-MP Forum habe ich auch einen Thread gefunden, bei dem es um dasselbe Problem geht, finde ihn momentan leider nicht.


    Ich wäre extrem dankbar, wenn jemand das Problem lösen könnte.
    MfG

    forward piss(playerid);
    public piss(playerid)
    {
    TogglePlayerControllable(playerid, true);
    }
    SetTimer("piss", 10000, 0);

    Folgendes Problem:
    Wenn ich ein Menü genug oft aufrufe crasht irgendwann der Server.
    Mit der SuFu habe ich Threads entdeckt, bei denen es um dasselbe Problem geht, jedoch konnte man es dort fixen (leider steht nicht wie).
    Thread
    Bei mir gibt es keine Errors und keine Warnings.
    Das Menü hat 4 Untermenüs.


    Kann mir vllt jemand helfen?


    Edit// Problem gelöst...
    Grund:
    AddMenuItem hat dem falschen Menü Sachen zugewiesen.

    achja, es ist kein bug 8| sowas nennt man script-fehler lol^^
    aber warnings sind net schlimm.
    da kannste 100 von (DIESEN) warning haben, das macht NIX.^^

    Nicht immer, z.B. bei zu wenigen Informationen (ShowMenuForPlayer(X);).
    Das gibt auch nur die Warning "number of arguments does not match definition", ist aber so schlimm wie ein Error.

    Das eine ist ein Array, das andere eine einfache Variable.
    Mehr dazu hier: SA-MP.com Wiki | Scripting Basics - Variables


    Und wehe du meckerst jetzt dass dort alles englisch ist...

    Das weiss ich schon, ich habe vielleicht die Frage ein bisschen falsch formuliert.
    Hier mal ein Beispiel aus dem GodFather Script:
    new gActivePlayers[MAX_PLAYERS];
    Wieso nicht einfach
    new gActivePlayers;
    ??


    Edit// Jetzt hab' ich's doch noch gefunden, habe noch bisschen weitergelesen, dann kam es :pinch:

    Funzt leider nicht :/
    Bei IP steht in der ini 50?!?


    GetPlayerIp(playerid, pIP, sizeof(pIP));
    format(var, 32, "IP=%s\n",pIP);
    fwrite(hFile, var);

    Hallo
    Hatte schon bei Google und der SuFu geschaut, habe leider aber nichts gefunden.
    Wie bringe ich es fertig, dass die IP in der .ini des Spieles gespeichert wird?
    Das Problem ist eher GetPlayerIP, denn dies liefert mir nicht die richtige IP :/


    Hat jemand eine Idee, wie man das lösen könnte?
    MfG


    Thx, klappt wunderbar, musste nur noch IsPlayerAdmin fixen ;D
    Hast was gut bei mir ;)


    Den Text könnt man auch freundlicher formulieren ;)


    Ich finde es eine sehr gute Ausdrucksweise ^^