Tipps für Programmierung/Server [ANFÄNGER]

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
  • Worum geht es in diesem Tutorial?
    In diesem Tutorial geht es darum, wie man am besten programmieren kann, damit dein Code übersichtlich bleibt und du später keine Probleme mit dem Script hast.


    Wie fange ich an?
    Wenn du wirklich einen großen Projekt haben willst, musst du erst dein Projekt zeichnen, damit du erst alles in Sicht hast.
    Wie es aussehen soll, worum es geht, die Spawnpositionen, den Server Name, die Sprache, usw. musst du dir erst überlegen und dann starten dein Server zu programmieren.


    Tipps für den Server
    Damit dein Server auch mehr Spieler bekommt sollst du aufjedenfall keine Werbungen in anderen Servern machen/spammen. Poste auf breadfish, oder auf SA-MP official forum.
    Dein Server Name muss du dir gut überlegen. Namen wie "[SUCHE ADMIN] TDM", "CnR [http://www.example.com]", usw. sind nicht gut. Er soll kein Tags und Werbungen enthalten z.B. "The Kills of Deaths" etc. Du musst auch Admins haben, die dein Server überwachen. Stats (Score, Kills etc.) musst du auch selbst verdienen. Das heißt auch du musst für Score arbeiten und nicht auf 999999 ändern. Admins müssen wirklich ihren Rank verdienen. Außerdem sollst du auch dir einen Webseite besorgen. Ein Domain brauchst du auch, wie z.B. tkd-cnr.de


    Die Programmierung
    Oft machen viele Fehler beim programmieren. Benutzt immer die SA-MP Wiki und liest euch was ein bestimmtes Funktion macht, was sie zurückgibt und welche Fehler auftreten können.


    Zuerst müsst Ihr die Unterzeilen immer mit TAB einrücken. Hier sind zwei Beispiele, wie der Unterschied aussieht.
    Sowas sollte man aufjedenfall NICHT tuhen.
    if(IsPlayerInAnyVehicle(playerid))

    {
    SendClientMessage( playerid, RED,"HI");
    }
    So soll es sein.
    if (IsPlayerInAnyVehicle(playerid)) {
    SendClientMessage(playerid, COLOR_RED, "Hallo");
    }


    Auch hier benutzen viele Leute bei manchen Befehlen Fehler Meldungen, die oft vorkommt. Die könnte man in einem Array speichern oder sie definieren.


    Mit Array könnte es so aussehen.
    //ID definieren
    #define ERROR_INVEHICLE 0


    // Array erstellen
    new ErrorMsg[][158] = {
    "{0000FF}You cannot use this command in a vehicle."
    };


    // Ausgeben
    SendClientMessage(playerid, -1, ErrorMsg[ERROR_INVEHICLE]);
    ACHTUNG: Hier muss die Reihenfolge mit ID und Text stimmen, ansonsten kommt ihr nicht mehr weiter.


    Aber man sie auch kürzer machen.
    // Definieren
    #define InVehicle_Error(%0, %1) SendClientMessage(%0, %1, "You cannot use this command in a vehicle")


    // Ausgeben
    if(IsPlayerInAnyVehicle(playerid)) return InVehicle_Error(playerid, -1);
    Wenn ihr so macht, dann habt ihr den Vorteil, um den Text einmal zu ändern. Also wenn du später den Text ändern möchtest musst nur einen Satz ändern, dann wird bei allen Befehlen das gleiche.


    Ich habe auch jemanden gesehen, der sein Code voll mit unnötigen Zeilen verschwendet hat. So sah sein Code aus.
    //OnPlayerConnect


    if(IsPlayerNPC(playerid)) {
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, botname, sizeof(botname));
    if(!strcmp(botname, "Hans", true)) {
    Eingeloggt[playerid] = true;
    }
    }
    if(IsPlayerNPC(playerid)) {
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, botname, sizeof(botname));
    if(!strcmp(botname, "Mario", true)) {
    Eingeloggt[playerid] = true;
    }
    }
    if(IsPlayerNPC(playerid)) {
    new botname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, botname, sizeof(botname));
    if(!strcmp(botname, "Peter", true)) {
    Eingeloggt[playerid] = true;
    }
    }
    // usw.
    Man kann natürlich noch kürzer machen. Und zwar einen Array erstellen und dort die Namen schreiben. Außerdem braucht man nicht immer prüfen ob der Spieler ein Bot ist, sondern eine reicht schon. Anschließend kann man auch ein Funktion erstellen, die den Name von playerid zurückgibt.
    // Array definieren
    new BotName[][MAX_PLAYER_NAME] = {
    "Hans",
    "Mario",
    "Peter"
    };


    // OnPlayerConnect
    if(IsPlayerNPC(playerid)) {
    for(new i = 0; i < sizeof(BotName); i++) {
    if(!strcmp(GetName(playerid), BotName, true)) {
    Eingeloggt[playerid] = true;
    break;
    }
    }
    }


    // Funktion
    stock GetName(playerid) {
    new userName[MAX_PLAYER_NAME];
    GetPlayerName(playerid, userName, sizeof(userName));
    return userName;
    }


    Nun kommen zur SA-MP wiki. Wir wollen wissen ob ein Spieler gerade ein Fahrzeug betritt. Dafür müssen wir natürlich OnPlayerStateChange benutzen. Aber es gibt auch OnPlayerEnterVehicle. Wofür ist es? Das können wir auf SA-MP wiki schauen.

    Code
    Dieses Callback wird aufgerufen, wenn ein Spieler beginnt ein Fahrzeug zu betreten. Der Spieler ist also noch nicht im Fahrzeug, wenn OnPlayerEnterVehicle aufgerufen wird.



    Das heißt er wird nur aufgerufen wenn der startet ein Fahrzeug zu betreten, aber er ist noch nicht im Fahrzeug. Das heißt der Spieler könnte F-Taste drücken und dann einen Animation ausführen damit er abbricht. Trotzdem wurde OnPlayerEnterVehicle aufgerufen. Das heißt dieser Callback wird uns nicht mehr weiterbringen.
    Wie schon gesagt, hilft SA-MP wiki immer auf solchen Fällen.


    Ende
    Das wars. Wenn ihr die Regeln behält, wird ihr später keine Probleme haben und ihr wird einen berühmten Server haben. Bei Fragen könnt ihr mir PN schicken. Danke, tschüss.

    "Everybody in this country should learn to program a computer, because it teaches you how to think."
    Steve Jobs

  • Schönes Tutorial!
    Für Anfänger ist das sicher sehr nützlich!

    Mittelsmann Service
    Seit 2014 agiere ich in diesem Forum als Mittelsmann. Als es Mein-Mittelsmann noch gab, zählte ich zu den vertrauenswürdigsten Mittelsmännern, welche auch hier im Forum aufgelistet waren. Seit Beginn meiner Laufbahn wickelte ich bisher schon rund 100 Transaktionen mit Erfolg ab. Wenn du also nach einem erfahrenen und vertrauenswürdigem Mittelsmann suchst, kontaktiere mich gerne.

  • Beitrag von Malik.Kevin ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Ich denke es reicht auch wenn man sich die PAWN Synthax anschaut, ich finde dieses Tutorial überflüssig!


    mfg :thumbup:

    Kein Tutorial ist überflüssig. Wie gesagt für Anfänger ist es vielleicht nützlich, die sich Syntax nicht angeschaut haben.

    Mittelsmann Service
    Seit 2014 agiere ich in diesem Forum als Mittelsmann. Als es Mein-Mittelsmann noch gab, zählte ich zu den vertrauenswürdigsten Mittelsmännern, welche auch hier im Forum aufgelistet waren. Seit Beginn meiner Laufbahn wickelte ich bisher schon rund 100 Transaktionen mit Erfolg ab. Wenn du also nach einem erfahrenen und vertrauenswürdigem Mittelsmann suchst, kontaktiere mich gerne.

  • Kleiner Kritikpunkt:

    //ID definieren
    #define ERROR_INVEHICLE 0


    // Array erstellen
    new ErrorMsg[][158] = {
    "{0000FF}You cannot use this command in a vehicle."
    };


    // Ausgeben
    SendClientMessage(playerid, -1, ErrorMsg[ERROR_INVEHICLE]);


    Erachte ich als schwachsinniges Beispiel, denn es kommt nicht der Intention des Threads nach, effektiv zu programmieren.


    Man nutzt unnötig viel Code.
    Wenn man sowieso noch defines verwendet, dann kann man die Errors auch direkt in den Defines definieren, anstatt erst mit den Defines einen Index zu bestimmen und anhand dessen dann aus dem Array die Fehlermeldung zu entnehmen.


    Dadurch macht man sich nur unnötig Arbeit, nicht nur beim Hinufügen von Errors, sondern auch beim Anwenden der Errormeldungen.

    SendClientMessage(playerid, -1, ErrorMessages[ERROR_INVEHICLE]);
    SendClientMessage(playerid, -1, ERROR_INVEHICLE);


    Ich denke, man sieht den Unterschied beim Tippen deutlich.