Motor- und Tanksystem

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
  • Hallo,
    ursprünglich habe ich ja ein Tanksystem geschrieben, bei dem allerdings anscheinend ein paar Fehler drin waren. Dann würde ich hiermit ein neues schreiben und es gleich noch um ein Motorensystem erweiten.


    Gliederung:

    • Was erkläre ich?
    • Motorystem (Motor an/aus mit Command)
    • Tank verringern
    • Command zum Tanken
    • TextDraw zur Anzeige erstellen


    1. Was erkläre ich?
    Ich versuche euch hiermit beizubringen, wie ihr ein simples funktionierendes Motor- und Tanksystem schreiben könnt.Das ganze wird wie folgt ablaufen: Alle Fahrzeuge spawnen mit ausgeschaltetem Motor und 100 Liter Tank (abgesehen von Fahrrädern). Man steigt ein und startet ihn mit /m. Solang der Motor läuft (also solang man ihn nicht mit erneuter Eingabe von /m ausgeschaltet hat), verbraucht das Auto alle 10 Sekunden 1 Liter Benzin.Wenn der Tank leer ist, kann man ihn mit /tanken wieder für einen gewissen Betrag auffüllen (Preis änderbar).

    • Jedes Fahrzeug hat genau 100 Liter Benzin (abgesehen von Fahrrädern)
    • Der Tank sinkt bei jedem Fahrzeug gleich schnell
    • /tanken ist überall nutzbar. Wer dies nur an Tankstellen haben will, soll noch mit IsPlayerInRangeOfPoint arbeiten.
    • Das Motorsystem ist ohne das Tanksystem nutzbar, jedoch NICHT andersrum (Tanksystem nicht alleine nutzbar.
    • Für das gesamte Tutorial wird Grundwissen erwartet.


    2. Motorsystem
    Dann fangen wir mal mit dem Tutorial an. Zuerst müssen wir uns einen Boolean erstellen, ob der Motor der Fahrzeuge eingeschaltet ist. Außerdem brauchen wir noch Variablen für die VehicleParams (Motorsystem aus SAMP 0.3c). Also setzen wir an den Anfang des Scripts folgenden Code:
    new engine,lights,alarm,doors,bonnet,boot,objective; // Dies sind die Variablen die für das einschalten des Motors benötigt werden.
    new bool:Motor[MAX_VEHICLES]=false; // Dies ist die Boolean für den Motor. [MAX_VEHICLES] ist angehängt, da sie für jedes Fahrzeug unterschiedlich sein kann.


    Nun muss nach dem Spawn der verschiedenen Fahrzeuge auch noch ihr Motor ausgeschaltet werden. Also erstellen wir im Callback OnGameModeInit eine Schleife:

    ManualVehicleEngineAndLights(); // Dies muss in OnGameModeInit angegeben werden, damit das ganze System überhaupt funktioniert.


    for (new i=0; i< MAX_VEHICLES; i++)
    {
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }


    public OnVehicleSpawn(vehicleid)
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[vehicleid] = false;
    return 1;
    }
    Dabei wird durch die Schleife die Variable i erstellt, die den Wert 0 trägt und kleiner als die Anzahl aller Fahrzeuge ist (= MAX_VEHICLES) und sich bei jedem Durchlauf der Schleife um 1 erhöht.
    GetVehicleParamsEx speichert die Parameter des Fahrzeuges, das gerade in der Schleife durchlaufen wird.
    SetVehicleParamsEx schaltet dann den Motor aus, und lässt die restlichen Parameter so wie sie vorher waren.
    Die letzte Zeile der Schleife setzt den Boolean Motor (den wir oben definiert haben) für dieses Fahrzeug auf falsch.
    Danach wird noch in dem Callback OnVehicleSpawn der Motor ausgeschaltet, damit Fahrzeuge die zerstört wurden und danach respawnen auch einen ausgeschalteten Motor haben.


    Nun müssen wir allerdings noch den Command zum Starten/Ausschalten des Motors erstellen. Das geht wie folgt im Callback OnPlayerCommandText:
    if(strcmp(cmdtext, "/m", true) == 0)
    {
    if(GetPlayerVehicleSeat(playerid) == 0) // Überprüft zuerst ob der Spieler der Fahrer eines Fahrzeugs ist.
    {
    new car = GetPlayerVehicleID(playerid); // Erstellt die Variable car, die die FahrzeugID des Spielers trägt.
    if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510) // Wenn das Fahrzeug ein Fahrrad ist,
    { // dann sende dem Spieler die Nachricht, sodass er es auch weiß.
    SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Motor[car] == false) // Ansonsten, wenn der Motor des Fahrzeugs ausgeschaltet ist (haben wir ja oben mit dem bool Motor definiert)
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Selbe Prozedur wie oben, nur dass der Motor nun eingeschaltet wird.
    Motor[car] = true; // Setzt den Bool Motor auf true
    }


    else // Ansonsten, wenn der Motor an ist
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false; // Setzt den Bool wieder auf falsch zurück.
    }
    }
    return 1;
    }


    Damit wäre der Command auch erstellt. Allerdings haben wir jetzt das Problem, dass bei Fahrrädern der Motor zu Anfang auch ausgeschaltet wurde und mit einer Eingabe von /m bei Fahrrädern ja nur die Nachricht kommt, dass diese keinen Motor haben.
    Das können wir aber auch sehr leicht lösen, nämlich unter dem Callback OnPlayerEnterVehicle
    if(GetVehicleModel(vehicleid) == 509 || GetVehicleModel(vehicleid) == 481 || GetVehicleModel(vehicleid) == 510) // Überprüft ob das Fahrzeug ein Fahrrad ist (wie im Command oben)
    {
    GetVehicleParamsEx(vehicleid,engine,lights,alarm,doors,bonnet,boot,objective); // Speichere den derzeitigen Status
    SetVehicleParamsEx(vehicleid,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective); // Behalte alles bei, aber starte den Motor.
    }
    So. Nun wären wir mit dem Motorsystem schon fertig. Wenn ihr wollt, könnt ihr nun aufhören, ansonsten aber auch gerne weitermachen und das Tanksystem auch noch in euer Script einbeziehen.


    3. Tank verringern
    Für das Tanksystem müssen wir auch erstmal einige Dinge am Anfang des Scriptes definieren:
    #define VERLUST 10000 // Die Zeit, die der Motor braucht um 1 Liter zu verbrennen in Millisekunden (Hier 10 Sekunden)
    #define BENZINPREIS 3 // Der Preis, den das Benzin pro Liter kostet (Hier 3$)


    forward BenzinVerlust(); // Wir forwarden unseren Timer für den Benzinverlust
    forward Auftanken(playerid); // Wir forwarden unseren Timer für das Tanken


    new Tank[MAX_VEHICLES], bool:TanktGerade[MAX_VEHICLES]=false, tanktimer[MAX_PLAYERS];
    Die Variable Tank steht hier für die Litermenge im Tank des einzelnen Fahrzeuges. TanktGerade ist wieder ein Boolean, der wieder für jedes Fahrzeug einzeln gilt. tanktimer wird der Timer zum Tanken für die einzelnen Spieler sein.
    Da wir den Tank für jedes Fahrzeug nun erstmal auf 100 Liter setzen wollen, müssen wir in unsere Schleife aus dem Motorensystem gehen. Außerdem benötigen wir noch den Start des Timers zum Reduzieren des Tanks. Dafür muss das Callback OnGameModeInit wie folgt aussehen:
    SetTimer("BenzinVerlust", VERLUST, true);
    for (new i=0; i< MAX_VEHICLES; i++)
    {
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    Tank[i] = 100;
    }
    Als erstes wird der Timer um die Funktion BenzinVerlust aufzurufen gesetzt. VERLUST wurde ja oben definiert und gibt die Zeit an, in der das Fahrzeug 1 Liter verliert. Die Schleife haben wir ja so bereits erstellt, allerdings ist nun noch das Tank(i) = 100;*hinzugekommen, was den Tank für jedes Fahrzeug auf 100 setzt. (* die normalen Klammern durch eckige ersetzen. Das würde allerdings kursiven Text erzeugen, daher mit normalen geschrieben.)


    Weiter geht es HIER

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    4 Mal editiert, zuletzt von Padarom () aus folgendem Grund: Tabstops gesetzt

  • Variable einmal lokal und einmal global erstellt.


    EDIT zum Tut:


    Zitat

    #define VEHICLE_PARAMS_UNSET -1
    #define VEHICLE_PARAMS_OFF 0
    #define VEHICLE_PARAMS_ON 1


    muss nicht definiert werden, ist bereits in den Includes


    Die Schleifen-Aktion: Überprüf doch gleich dort, ob das Fahrzeug ein Fahrrad ist. Ansonsten hat das halt den Nachteil, dass alle nach OnGameModeInit erstellten Fahrzeuge unter diese Regelung nicht fallen.



    Mehr lässt sich ja noch nicht sagen...sonst aber ganz gut, viel erklärt, besser als das meiste hier.

    Einmal editiert, zuletzt von BloodyEric ()

  • Fortsetzung folgt Sontag Nachmittag, musste das Tutorial wegen 10.000-Zeichengrenze aufspalten und inzwischen bin ich nicht mehr daheim (gerade mit iPhone on und fahren in paar Stunden nach Österreich snowboarden).


    Mit freundlich. Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Zitat


    Soweit ich Lesen kann ist das Tutorial doch nicht mal Fertig ?



    Lol...

    wollte wahrscheinlich beiträge pushen

  • Sehr gutes Tutorial !
    Kannst du bitte noch Hinzufügen dass, man im auto ~shift~ drücken kann.
    Das währ noch hilfreicher


    Aber ist immernoch 10/10 Punkten mach weiter so.

  • So, sry dass es erst jetzt gepostet ist, hier ist der Rest des Tutorials (und danke für das positive Feedback :) :


    4. Command zum Tanken
    Nun schreiben wir den Command um zu tanken. Dafür gehen wir wieder in das Callback OnPlayerCommandText und geben folgenden Code ein:
    if(strcmp(cmdtext, "/tanken", true) == 0)
    {
    else if (GetPlayerVehicleSeat(playerid) != 0) return SendClientMessage(playerid,COLOR_RED,"Du bist in keinem Fahrzeug (oder kein Fahrer).");
    new car = GetPlayerVehicleID(playerid);
    else if (TanktGerade[car]) return SendClientMessage(playerid,COLOR_RED,"Du tankst schon!");
    else if (Motor[car] == true) return SendClientMessage(playerid,COLOR_RED,"Du musst vor dem Tanken den Motor ausschalten.");
    new ZuTanken = 100-Tank[car];
    new preis = ZuTanken * BENZINPREIS;
    if (GetPlayerMoney(playerid)-preis < 0) return SendClientMessage(playerid,COLOR_TOMATO,"Du hast nicht genug Geld!");
    GivePlayerMoney(playerid, -preis);
    SendClientMessage(playerid, COLOR_GREEN, "Tanken wird gestartet.");
    SetCameraBehindPlayer(playerid);
    TogglePlayerControllable(playerid,0);
    TanktGerade[car] = true;
    tanktimer[playerid] = SetTimerEx("Auftanken",500,true,"i",playerid);
    return 1;
    }
    Was machen wir hier genau? Als erstes schauen wir ob der Spieler Fahrer eines Fahrzeuges ist. Wenn ja, dann erstellen wir die Variable car mit dem Wert der FahrzeugID des Spielers. Nun überprüfen wir erstmal ob der Spieler gerade am Tanken ist und dann ob der Motor des Fahrzeuges eingeschaltet ist. Wenn alles passt, wird eine Variable namens ZuTanken erstellt, die den maximalen Tankwert - den jetzigen nimmt und somit schaut wieviel Liter zu tanken sind. Danach wird die Variable preis erstellt, die die Anzahl der zu tankenden Liter mal den BENZINPREIS (oben änderbar) errechnet. Wenn der Spieler nun zu wenig Geld zum Tanken hat erhält er erneut eine Nachricht. Jetzt beginnt aber das eigentliche Tanken:
    Der Spieler bekommt den Tankpreis abgezogen, erhält eine Nachricht, wird mit TogglePlayerControllable gefreezt und die Kamera wird hinter ihn gesetzt (da dies schöner aussieht). Dann wird der Bool TanktGerade des Fahrzeuges auf wahr gesetzt und der Tanktimer für den Spieler gestartet, der dem Fahrzeug pro Sekunde 2 Liter Benzin gibt.


    Nun müssen wir noch die beiden Timer erstellen und wir sind mit dem Tanksystem an sich fast fertig.
    public BenzinVerlust()
    {
    for(new i=0; i<MAX_VEHICLES; i++)
    {
    if (Motor[i] == true)
    {
    Tank[i] = Tank[i]-1;
    if (Tank[i]<1)
    {
    Tank[i] = 0;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[i] = false;
    }
    }
    }
    return 1;
    }


    public Auftanken(playerid)
    {
    new car = GetPlayerVehicleID(playerid);
    Tank[car] = Tank[car] +1;
    if(Tank[car] >= 100)
    {
    TanktGerade[car] = false;
    Tank[car] = 100;
    SendClientMessage(playerid, COLOR_GREEN, "Dein Fahrzeug wurde vollgetankt.");
    TogglePlayerControllable(playerid,1);
    KillTimer(tanktimer[playerid]);
    }
    return 1;
    }
    Der erste Timer (BenzinVerlust) zieht dem Auto bei jeder Auslösung Benzin ab. Genau passiert dabei folgendes: Zuerst wird wieder eine Schleife erstellt, die alle Fahrzeuge durchgeht. Diese Schleife schaut zuerst, ob der Motor des Fahrzeuges an ist (Eine Abfrage ob das Auto im Moment getankt wird brauchen wir nicht, da der Motor ja so oder so aus sein muss zum tanken). Wenn ja, subtrahiert sie vom Wert des Tankes 1. Wenn der Wert nun unter 1 ist, geht der Motor des Fahrzeuges automatisch aus. Das erneute setzen des Wertes Tank(i) = 0; wird benötigt, da der Tank ansonsten auf -1, -2, -3, ... springen würde.


    Nun der zweite Timer (Auftanken): Zuerst wird die FahrzeugID des Spielers in der Variable car gespeichert. Nun wird der Tank um 1 erhöht. Ist der Wert nun größer/gleich 100 wird das Tanken gestoppt, die Variable TanktGerade auf falsch gesetzt, der Spieler bekommt eine Nachricht, kann sich wieder bewegen UND der Timer wird nun eliminiert/gestoppt, so dass das Auto nicht weiter tankt.
    Warum in der if-Funktion größer/gleich steht hat folgenden Grund: Wenn der Spieler sein Auto bereits bei einem Tankwert von 100 tankt, dann ist der Tank bei 101. Daher ist ein normales ist gleich nicht nutzvoll, da der Timer sonst immer weiter läuft. Daher wird der Tank auch wieder auf 100 gesetzt (Tank[car] = 100).


    Nun fehlt allerdings noch 1 Sache: Der Motor geht trotzdem an, obwohl der Tank leer ist. Wenn wir dies verhindern wollen müssen wir den Command /m (von oben) um folgendes erweitern:
    if(strcmp(cmdtext, "/m", true) == 0)
    {
    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new car = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(car) == 509 || GetVehicleModel(car) == 481 || GetVehicleModel(car) == 510)
    {
    SendClientMessage(playerid, COLOR_RED, "Du sitzt auf einem Fahrrad. Das hat keinen Motor!");
    }


    else if (Tank[car] < 1)
    {
    SendClientMessage(playerid, COLOR_RED, "Der Tank ist leer. Du musst erst /tanken.");
    }


    else if (Motor[car] == false )
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = true; // Setzt den Bool Motor auf true
    }


    else
    {
    GetVehicleParamsEx(car,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(car,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    Motor[car] = false; // Setzt den Bool wieder auf falsch zurück.
    }
    }
    return 1;
    }

    5. TextDraw erstellen

    So, nun müssen wir noch eine Variable für das TextDraw erstellen. Das machen wir wie folgt (wo auch die anderen Variablen definiert wurden):
    new Text:Anzeige[MAX_PLAYERS];
    Damit erstellen wir die Text-Variable Anzeige, die durch MAX_PLAYERS wieder für jeden Spieler unterschiedlich sein kann. Als erstes müssen wir das TextDraw formatieren, das tun wir unter OnPlayerConnect:
    Anzeige[playerid] = TextDrawCreate(630.0,410.0," "); // Erstellt das TextDraw an X|Y-Position 630|410 (unten rechts)
    TextDrawSetOutline(Anzeige[playerid], 1); // Setzt dem TextDraw Outlines
    TextDrawAlignment(Anzeige[playerid], 3); // Macht das TextDraw rechtsbündig
    TextDrawSetShadow(Anzeige[playerid], 0); // Schaltet den Schatten des TextDraws aus
    TextDrawShowForPlayer(playerid,Anzeige[playerid]); // Zeigt das TextDraw dem Spieler


    Nun gehen wir in das Callback OnPlayerUpdate (zur Info: OnPlayerUpdate wird jedes Mal aufgerufen, wenn der Spieler Pakete an den Server sendet. Da allerdings mein Tacho etc. auch dort positioniert ist, ist dieser Platz am besten geeignet meiner Meinung nach) und setzen die Eigenschaften für das Textdraw.


    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new vehicleid;
    vehicleid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(vehicleid) != 509 && GetVehicleModel(vehicleid) != 481 && GetVehicleModel(vehicleid) != 510)
    {
    new string[125];
    if(Tank[vehicleid] < 10) format(string,sizeof string,"~w~Tank: ~r~%i",Tank[vehicleid]);
    else if(Tank[vehicleid] < 30) format(string,sizeof string,"~w~Tank: ~y~%i",Tank[vehicleid]);
    else if(Tank[vehicleid] <= 100) format(string,sizeof string,"~w~Tank: ~g~%i",Tank[vehicleid]);
    TextDrawSetString(Anzeige[playerid],string);
    }
    }
    else
    {
    TextDrawSetString(Anzeige[playerid], " ");
    }
    Okay, nun zur Erklärung: Als erstes wird wieder überprüft, ob der Spieler Fahrer eines Fahrzeuges ist. Wenn nicht, dann wird der Inhalt des Textdraws auf " " gesetzt, also ein Leerzeichen das man nicht sieht. Wenn der Spieler allerdings in einem Fahrzeug sitzt und dieses Fahrzeug kein Fahrrad ist, dann wird der Tankinhalt des Fahrzeuges ausgelesen. Wenn er kleiner als 10 ist, dann wird der Tankinhalt in Rot dargestellt, wenn er kleiner 30 ist, in gelb und kleiner/gleich 100 in grün. Somit kann man auf einen Blick sehen, ob man noch genug Benzin hat. Nach der Überprüfung wird das TextDraw noch geupdatet.


    Ich hoffe ich konnte euch hiermit helfen.


    Mit freundlichen Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

    5 Mal editiert, zuletzt von Padarom () aus folgendem Grund: Tabstops im Script gesetzt (2x)

  • Hast du bei Verlust auch einen Wert in Millisekunden eingetragen? Vielleicht hast du ja 1-2 Nullen zu viel und deswegen dauert es länger um 1 Liter zu verlieren. Oder eventuell hast du vergessen den Timer "BenzinVerlust" zu repeaten oder gar zu starten? Ansonsten wüsste ich leider nicht weiter, ich habe die Scriptbeispiele aus meinem eigenen Script (etwas abgeändert, bei mir ist das ganze komplexer gestaltet) und bei mir funktioniert alles.

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • @Myfarmer: Dankeschön :)
    @BuzZ: Also hast du dein eigenes Tanksystem? Dann musst du aber auch die Variable Tank[vehicleid] (so heißt sie bei mir) so umbenennen, dass dann die Variable in deinem Script rauskommt. Hast du also z.B. statt new Tank[MAX_VEHICLES]; new Liter[MAX_VEHICLES]; gemacht, dann musst du in der Abfrage auch Liter[vehicleid] machen.


    Mit freundl. Grüßen
    Padarom

    Ich bin
    .. seit etwa 2007 in der Webentwicklung tätig, seit 2013 professionell
    .. Erfahrener Entwickler in PHP, Swift, Javascript, Typescript und Ruby. Zusätzlich habe ich Erfahrung in Python, Java, C#, C++, Prolog und einigen esoterischen Programmiersprachen
    .. Luftfahrtenthusiast und Segelflieger

  • Ja hab ich moment hier der Code:


    if(GetPlayerVehicleSeat(playerid) == 0)
    {
    new vehicleid;
    vehicleid = GetPlayerVehicleID(playerid);
    if(GetVehicleModel(vehicleid) != 509 && GetVehicleModel(vehicleid) != 481 && GetVehicleModel(vehicleid) != 510)
    {
    new string[125];
    if(Tankmenge[vehicleid] < 10) format(string,sizeof string,"~w~Tank: ~r~%i",Tankmenge[vehicleid]);
    else if(Tankmenge[vehicleid] < 30) format(string,sizeof string,"~w~Tank: ~y~%i",Tankmenge[vehicleid]);
    else if(Tankmenge[vehicleid] <= 100) format(string,sizeof string,"~w~Tank: ~g~%i",Tankmenge[vehicleid]);
    TextDrawSetString(TankAnzeige[playerid],string);
    }
    }
    else
    {
    TextDrawSetString(TankAnzeige[playerid], " ");
    }

  • Ich hab ein kleines Problem ich bekomme 18 erros wenn cihe s in mienen gm einfüge .
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(885) : error 021: symbol already defined: "lights"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(2330) : error 017: undefined symbol "GetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(2331) : error 017: undefined symbol "SetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3585) : error 017: undefined symbol "ManualVehicleEngineAndLights"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3589) : error 017: undefined symbol "GetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3590) : error 017: undefined symbol "SetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3593) : error 017: undefined symbol "cmdtext"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3595) : error 017: undefined symbol "playerid"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3597) : error 017: undefined symbol "playerid"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3600) : error 017: undefined symbol "playerid"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3605) : error 017: undefined symbol "GetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3606) : error 017: undefined symbol "SetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3612) : error 017: undefined symbol "GetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(3613) : error 017: undefined symbol "SetVehicleParamsEx"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(6400) : warning 203: symbol is never used: "params"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(9059) : error 028: invalid subscript (not an array or too many subscripts): "lights"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(9059) : warning 215: expression has no effect
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(9059) : error 001: expected token: ";", but found "]"
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(9059) : error 029: invalid expression, assumed zero
    D:\Datenablage\Users\Ronny\Games\modded games\Reallife\neue version\gamemodes\reallifetest.pwn(9059) : fatal error 107: too many error messages on one line


    Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase



    18 Errors.

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