Beiträge von Stas


    format(speedtext,sizeof(speedtext)," %d",ErmittleGeschwindigkeit(playerid,true));
    TextDrawSetString(PlayerTacho[playerid], speedtext);


    Wenn due anstatt true, false machst, dann zeigt er die mp/h an (bei denen ich nicht bestätigen kann, ob die Uwandlung wirklich auf die Meile genau ist :P )

    Aber man kann diese dann nicht mit den anderen FilterScripts verwenden. Was ist wenn du alle 16 brauchst, da du so schlau warst und deinen GameMode gut ausgelagert hast und diese auch CallRemote benutzen? ;) :P :D

    Vorwort:
    Da ich leider feststellen musste, das es wirklich sehr viele Leute gibt, die nicht mal wissen, was ein überhaupt Include ist und wie man diesen, schreibe ich mal ein kleines Tutorials dazu. Erwartet nicht zu viel, da es noch Sonntagmorgen ist. *Ausrede*


    Wozu werden Includes verwendet:
    Includes sind doof ausgedrückt Funktionen, welche in eine andere Datei gesteckt werden, damit diese den GameMode nicht unnötig vollstopfen.
    Diese werden im Kopf des GameModes eingefügt und werden dort auch compilt.
    Dies ist eine sehr schöne, moderne und gute Möglichkeit zum schreiben von sogenannten "SelfMade"-GameModes.
    Jede Funtkion wird in seine dazugehörige Include gesteckt und direkt im GameMode aufgerufen.


    Beispiel:

    Spoiler anzeigen
    Wir haben eine Funktion, welche die Position des Spielers abfragt und ermittelt, ob er zb. über ein Nagelband gefahren ist.
    Normalerweise würde man es im GameMode reinpacken, genauer genau in den dazu erstellten Timer. Dann haben wir da 99 unnötige Zeilen rumstehen, welche das Lesen des GameModes und die Suche nach Fehlern erschweren. Also packt man die Funktion in einen Include und sagt dem Script einfach "BenutzeFunktion();".
    Schon führt er die Funktion, welche in der Include festgelegt wurde, aus.


    Genau genommen, ist es eigentlich egal, ob man es direkt in den GameMode steckt oder über eine Include laufen lässt, da beides in einer gleichen .amx landet.
    Aber, die Gründe dafür habe ich schon oben genannt. Es ist einfach besser zu lesen und viel professioneller. Dann hat man eine .pwn - Datei mit nur 5.000 satt 50.000 Zeilen, wo nur die Funktionen aufgerufen werden. Wenn man dann nun einen Bug hat, weiß man genau wo man suchen muss.
    Hat man nun zum Beispiel ein Fehler am Nagelband System, weiß man direkt:"Aha, ich muss jetzt die Nagelnband.ini nach dem Fehler untersuchen, wo ich nur 500 Zeilen habe und das dann schneller lesen kann"


    Außerdem verwenden Scripter Includes, damit sie einige Funktionen ganz einfach und ohne viele weitere Eingriffe in den GameMode des Benutzers veröffentlichen können. Diese müssen die heruntergeladene Include einfach in das Script einfügen und "BenutzeFunktion();" ausführen.


    Wie binde ich eine Include in meinen GameMode ein:
    Das ist ganz einfach und bereits oben beschrieben. In diesem Teil zeige ich es euch aber in der Pawn Sprache.


    Als erstes ladet ihr die include runter. Falls es in pastebin veröffentlicht wurde, müsst ihr den Code kopieren und in einer .inc - Datei abspeichern.
    Diese Datei verschiebt ihr dann in den Pawno/Includes - Ordner. Dort findet ihr bereits einige andere Includes, welche euch von SAMP zur Verfügung gestellt werden.


    Meist sind einige Includes immer oben in eurem GameMode schon vorhanden. Zum Beispiel die samp.inc.
    // Standard - Includes
    #include <a_samp>


    Darunter fügt ihr nur noch die heruntergeladene Include ein:
    // Standard - Includes
    #include <a_samp>
    #include <blitzer>


    Es kann aber auch so aussehen, wenn ihr eure Includes in einen weiteren Unterordner aussortieren möchtet:
    // GameMode - Includes
    #include "unterordner_name/blitzer"


    Als nächstes guckt ihr euch die Funktionen an, welche der Spieler euch zur Verfügung stellt.
    Bleiben wir bei meinem Blitzer Beispiel *Schleichwerbung* : AddBlitzer(playerid);


    Nun erstellt ihr einen Befehl. Davor guckt ihr, ob ihr dmcd oder strcmp verwendet.
    Ich zeige es mal für strcmp, da die dcmd Nutzer eigentlich so ein Tutorial garnicht brauchen, weil diese schon erfahrener sind:


    if(strcmp(cmd, "/blitzer", true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, 0x33CCFFAA, "[BENUTZUNG:] /blitzer [Funktion]");
    SendClientMessage(playerid, 0xffffffff, "Verfügbare Funktionen: add, remove, removeall, count");
    return 1;
    }
    if (!IsACop(playerid)) return SendClientMessage(playerid, COLOR_LIGHTRED, "[ERROR:] Du bist kein Polizist!");
    if(strcmp(tmp,"add",true) == 0)
    {
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "[BENUTZUNG:] /blitzer [add] [Geschwindigkeit] [Radius]");

    new b_speed;
    b_speed = strval(tmp);
    if(b_speed < 20 || b_speed > 180) return SendClientMessage(playerid, COLOR_LIGHTRED, "[ERROR:] Die Geschwindigkeit muss zwischen 20 und 180 km/h liegen!");


    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp)) return SendClientMessage(playerid, COLOR_LIGHTBLUE, "[BENUTZUNG:] /blitzer [add] [Geschwindigkeit] [Radius]");


    new b_radius;
    b_radius = strval(tmp);
    if(b_radius < 5 || b_radius > 50) return SendClientMessage(playerid, COLOR_LIGHTRED, "[ERROR:] Der Radius muss zwischen 5 und 50 Meter liegen!");
    AddBlitzer(playerid,b_speed,b_radius);
    SendClientMessage(playerid, 0xffffffff, "Ein Blitzer wurde erfolgreich aufgestellt und registriert!");
    return 1;
    }
    else if(strcmp(tmp,"remove",true) == 0)
    {
    RemoveBlitzer(playerid);
    SendClientMessage(playerid, 0xffffffff, "Dieser Blitzer wurde erfolgreich abgebaut und aus der Akte entfernt!");
    return 1;
    }
    else if(strcmp(tmp,"removeall",true) == 0)
    {
    RemoveAllBlitzer();
    SendClientMessage(playerid, 0xffffffff, "Dieser Blitzer wurde erfolgreich abgebaut und aus der Akte entfernt!");
    return 1;
    }
    else if(strcmp(tmp,"count",true) == 0)
    {
    SendFormattedText(playerid, 0xffffffff, "Es sind momentan %d Blitzer registriert und werden um 4.00 Uhr abgebaut!", CountBlitzer());
    return 1;
    }
    else
    {
    SendClientMessage(playerid, 0x33CCFFAA, "[BENUTZUNG:] /blitzer [Funktion]");
    SendClientMessage(playerid, 0xffffffff, "Verfügbare Funktionen: add, remove, removeall, count");
    return 1;
    }
    }


    Include selber erstellen:
    Eine Include selber erstellen, ist nicht sehr schwer. Genau genommen sind es einfach die Funktionen, die genauso im GameMode geschrieben werden können.
    Damit ihr aber nicht immer den kompletten GameMode compilen musst, um zu gucken, ob in der Include keine Fehler sind, kann man in diese Include ebenfalls andere Includes (a_samp) includen. So könnte eine eigene Include aussehen: PasteBin


    Schlusswort:
    Ich hoffe, ich konnte euch verdeutlichen, was nun gemeint ist, wenn ihr in diesem Forum das Wort Includes hört.
    Nun müsst ihr nicht mehr in Panik geraten :thumbup:

    Öhh, es ist Sonntagmorgen und ich soll an Schule denken? ?( Was erwartest du von mir? 8|
    Die Wiki spuckt da nichts zu aus, da das eine normale C/C++/Pawn Funktion ist, womit das Entwickler-Team nichts zu tun hat.
    Was ich dir sagen kann: Es ist meines Erdenkens die aktuellste, beste und genauste Methode/Rechnung für die Geschwindigkeit des Spielers.

    FilterScripts werden halt getrennt vom GameMode geladen. Daher ist es besser, manche Funktionen in einem FilterSchript zulassen.
    Dabei ist es relativ egal, ob man 5 oder 15 Stück hat, solange alle vernünftig gescriptet sind.

    if(!tmp[0])return SendClientMessage(playerid,farbe,"nachricht");


    Genau genommen ist es schlecht, wenn man professioneller Programierer ist. Du weißt nicht, das SendClientMessega für einen Wert wieder gibt.
    Stell dir vor, die würden beim nächsten Update schönheitshalber den Wert auf 0 setzen.

    Zu einer vernünftigen Bewertung gehört Kritik. Mir fallen folgende Kleinigkeiten auf:


    - Menu sind veraltet - Dialogs sind die Zukunft
    - new SpielerObjekte[MAX_PLAYERS; unnötiger Ressourcenverbrauch; dafür sind nun die pVars
    - viele wichtige Funktionen fehlen (Move, Attach, Destroy etc.)


    Daher gibt es leider nicht die volle Punktzahl, schaut aber dennoch ganz okay aus.

    Lass einen TextDraw oder GameText aktualisieren welcher folgenden Inhalt wiedergibt:
    stock ErmittleGeschwindigkeit(playerid,bool:kmh) {
    new Float:x,Float:y,Float:z,Float:rtn;
    if(IsPlayerInAnyVehicle(playerid)) GetVehicleVelocity(GetPlayerVehicleID(playerid),x,y,z); else GetPlayerVelocity(playerid,x,y,z);
    rtn = floatsqroot(x*x+y*y+z*z);
    return kmh?floatround(rtn * 100 * 1.61):floatround(rtn * 100);
    }
    [MSIE_newline_end ]

    Wenn du es nicht getestet hast, woher willst du wissen dass die nicht kaputt gehen? Naya, insgesamt sehr schön und für Reallife Server gut gebräuchlich. Gehen die Reifen denn nun kaputt? ^^


    Ansonsten wenn sie kaputt gehen sollten 10/10, sonst 9,5/10.


    In dem Video kannst du nun sehen, dass sie kaputt gehen : )

    Ich verstehe nich ganz was du meinst?
    Nagelbänder und Straßensperre werden nicht gleichzeitig gesetzt sondern extra.
    Für die Nagelbänder ist doch schon die neue Funktion drin:


    forward NagelBand_Timer();
    public NagelBand_Timer() {
    for (new playerid = 0; playerid < MAX_PLAYERS; playerid++) {
    if(!IsPlayerInAnyVehicle(playerid) || IsPlayerNPC(playerid)) continue;
    for(new i = 0; i < sizeof(NagelBand); i++) {
    if(NagelBand[i][nErstellt] == 1) {
    if(IsPlayerInRangeOfPoint(playerid, 4, NagelBand[i][NagelBandX], NagelBand[i][NagelBandY], NagelBand[i][NagelBandZ])) {
    if(IsPlayerInAnyVehicle(playerid)) {
    new panels, doors, lights, tires;
    GetVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, tires);
    tires = encode_tires(1, 1, 1, 1);
    UpdateVehicleDamageStatus(GetPlayerVehicleID(playerid), panels, doors, lights, tires);
    }
    }
    }
    }
    }
    return 1;
    }