Fahrzeugsystem - Tank & Kilometerstand

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,


    habe jeweils ein Problem mit meiner Tank & Kilometerstand Funktion.
    An meiner Tank Funktion wird die Tank-Menge der Privatfahrzeuge zwar in die Variable ausgelesen, aber im TextDraw ( Tacho ) wird mir ein leerer Tank gezeigt.
    Sowie bei meinem /motor Befehl, man kann logischer Weise nämlich nur den Motor starten mit einem gefüllten Tank, jedoch steht auch dort, dass mein Tank leer wäre.
    In der MySQL Spalte des Fahrzeugs steht jedoch 40, also 40 Liter im Tank.
    Habe mir es auch schon printen lassen, dort steht auch in der Variable 40.
    Jedoch tritt dieses Problem bei den Polizeifahrzeugen nicht auf, die separat geladen werden.



    Dann kommen wir mal zum zweiten Problem.
    Hierbei wird erst gar nicht die Kilometer-Strecke gespeichert.
    Aber im Tacho steht eine Strecke, und zwar die vom 0 Punkt bis zur Position des Fahrzeuges.
    Wenn ihr versteht was ich meine.



    Das sollte alles notwendige sein.
    Ich hoffe ihr könnt mir helfen.

    Einmal editiert, zuletzt von malE ()

  • Das Problem ist, dass du auf den Index von VehicleInfo mit der vehicleid drauf zu greifst, das geht aber nicht, da die vehicleid nicht der Index-ID entspricht.
    Erstelle dazu eine folgende Funktion, um aus der vehicleid den Index zu bekommen:
    stock getVehIndex(vehicleid)
    {
    for(new i = 0; i < sizeof(VehicleInfo); i++)
    {
    if(VehicleInfo[i][v_Objekt] == vehicleid)
    {
    return i;
    }
    }
    return -1;
    }


    Dann kannst du die TachoTimer Funktion so schreiben:
    forward TachoTimer();
    public TachoTimer()
    {
    for(new i=0; i < MAX_PLAYERS; i++)
    {
    new vID = GetPlayerVehicleID(i);
    if(!IsPlayerConnected(i) || PlayerInfo[i][p_LoggedIn] != true)continue;
    if(!IsPlayerInAnyVehicle(i))continue;
    new idx = getVehIndex(vID);
    if(idx == -1) continue;
    new tacho[256], Float:hp;
    GetVehicleHealth(vID, hp);
    VehicleInfo[idx][v_Kilometer] += e_GetDistance(vID);
    format(tacho, sizeof(tacho), "%s~n~Geschwindigkeit: %dkm/h~n~Kilometerstand: %d.%dkm~n~Treibstoff: %dl~n~Schaden: %0.2f", VehicleNames[GetVehicleModel(vID)-400], GetPlayerSpeed(i), VehicleInfo[idx][v_Kilometer]/1000, VehicleInfo[idx][v_Kilometer]%1000, VehicleInfo[idx][v_Tank], hp);
    PlayerTextDrawSetString(i, Tacho[i][0], tacho);
    if(VehicleEngineOn(vID))PlayerTextDrawSetString(i, Tacho[i][2], "~g~Motor");
    else PlayerTextDrawSetString(i, Tacho[i][2], "~w~Motor");
    if(VehicleLightsOn(vID))PlayerTextDrawSetString(i, Tacho[i][3], "~g~Licht");
    else PlayerTextDrawSetString(i, Tacho[i][3], "~w~Licht");
    if(VehicleDoorLocked(vID))PlayerTextDrawSetString(i, Tacho[i][4], "~g~Tueren");
    else PlayerTextDrawSetString(i, Tacho[i][4], "~w~Tueren");
    GetVehiclePos(vID, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    }
    return 1;
    }





    Zu dem anderen Problem:
    Da musst du die e_GetDistance Funktion ebenfalls abändern. Und zwar zu:
    stock e_GetDistance(vehicleid)
    {
    new Float:x2, Float:y2, Float:z2, Float:value, idx = getVehIndex(vehicleid);
    if(idx == -1) return 0;
    GetVehiclePos(vehicleid, x2, y2, z2);
    value = floatsqroot(floatpower(floatabs(floatsub(x2, VehicleInfo[idx][v_KMX])), 2)+floatpower(floatabs(floatsub(y2, VehicleInfo[idx][v_KMY])), 2)+floatpower(floatabs(floatsub(z2, VehicleInfo[idx][v_KMZ])), 2));
    return floatround(value);
    }
    Zudem musst du dann beim Laden der Fahrzeuge den Wert von diesen Variablen
    VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]
    auf den Wert von
    VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]
    setzen, damit nicht der Null-Punkt als Berechnungsstart genommen wird.


    Dann musst du außerdem, wenn die Distanz dazu gerechnet wurde, also in der Funktion zur Positionsberechnung, oder dort wo es der Variable hinzugefügt wird (je nach dem wie der Rest deines Systems aussieht) die Koordinaten aktualisieren, sprich:
    GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    Damit diese neue Position als neuer Berechnungsstart genommen wird.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry () aus folgendem Grund: Fehler ausgebesser im letzten GetVehiclePos.

  • Vielen Dank erstmal!


    Zudem musst du dann beim Laden der Fahrzeuge den Wert von diesen Variablen
    VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]
    auf den Wert von
    VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]
    setzen, damit nicht der Null-Punkt als Berechnungsstart genommen wird.

    Soll ich idx durch i ersetzen oder den stock benutzen den du mir erstellt hast?

    Dann musst du außerdem, wenn die Distanz dazu gerechnet wurde, also in der Funktion zur Positionsberechnung, oder dort wo es der Variable hinzugefügt wird (je nach dem wie der Rest deines Systems aussieht) die Koordinaten aktualisieren, sprich:


    GetVehiclePos(vehicleid, VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]);
    Damit diese neue Position als neuer Berechnungsstart genommen wird.

    Das hier soll ich dann durch GetVehiclePos(vID, VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]); im public TachoTimer ersetzen?
    Fehler: Sobald ich in ein Fahrzeug einsteige wird der Kilometerstand automatisch hochgezählt.


    Logischer Weise tritt der Fehler mit dem Tank der Privatfahrzeuge auch im Motor-Befehl auf.
    Soll ich im Befehl den Index von vID zu idx ersetzen?

  • Soll ich idx durch i ersetzen oder den stock benutzen den du mir erstellt hast?

    Ersetze es durch "i".



    Das hier soll ich dann durch GetVehiclePos(vID, VehicleInfo[idx][v_X], VehicleInfo [idx][v_Y], VehicleInfo[idx][v_Z]); im public TachoTimer ersetzen?
    Fehler: Sobald ich in ein Fahrzeug einsteige wird der Kilometerstand automatisch hochgezählt.

    Da bin ich mit den Variablen durcheinander gekommen.
    Nutze
    GetVehiclePos(vehicleid, VehicleInfo[idx][v_KMX], VehicleInfo[idx][v_KMY], VehicleInfo[idx][v_KMZ]);
    Diese Werte müssen aktualisiert werden.
    Mit idx, ja.




    Soll ich im Befehl den Index von vID zu idx ersetzen?

    Ja, für die Indexe ([vID]) jeweils.

  • Scheint zu funktionieren, Kilometerstand wird auch gespeichert sowie der Tank.
    Jedoch hakt es nun am Motor Befehl.
    Der Motor geht nicht an, ich kann so oft wie ich möchte /motor eingeben, aber der Motor geht nicht an.
    Jedoch wird mir die InfoBox angezeigt, dass der Motor an wäre.

  • Beitrag von YaBroo ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: Dump post ().
  • Wie oben schon erwähnt, wird der Motor nicht gestartet, weil der Tank leer ist.
    Obwohl der nicht leer ist. Deswegen kann ich vID schon mal nicht benutzen.


    // Edit:
    Mir ist gerade aufgefallen, dass nur bei den Polizeifahrzeugen der Tacho funktioniert, außerdem wird mir beim Kilometerstand die Entfernung vom Nullpunkt bis zur
    Position des Fahrzeugs angezeigt.

  • Du darfst den Index (idx) auch nur im Index (das was zwischen [ ] steht) von VehicleInfo nutzen, nicht als vehicleid.
    vehicleid != Index


    GetVehicleParamsEx(idx, engine, lights, alarm, doors, bonnet, boot, objective);
    zu:
    GetVehicleParamsEx(vID, engine, lights, alarm, doors, bonnet, boot, objective);
    Gleiches beim Set... .

  • Gut zu wissen ^^ , getVehIndex muss ich nun immer benutzen wenn ich VehicleInfo[... benutze?
    Jetzt werden die leider die Privatfahrzeuge immer am Nullpunkt gespawnt.
    Am speichern hängt es nicht, habe es mir schon printen lassen.
    Ich weiß jedoch nicht wo hier der Fehler liegt.


  • Code
    VehicleInfo[i][v_X] = cache_get_field_content_float(i, "x", handle), VehicleInfo[i][v_X] = VehicleInfo[i][v_KMX];

    Warum speicherst'n du Floats in einer Variable die du direkt durch einen anderen Wert anschließend neudefinierst?

    KleineHilfe 2.0

  • Hä, das einzige was du da machst sind deine geladenen Koordinaten mit neuen Daten überschreiben, bevor du das Fahrzeug überhaupt erstellst.
    Hast sie leicht vertauscht; ich glaube du wolltest es so handhaben. :)


    VehicleInfo[i][v_KMX] = VehicleInfo[i][v_X];
    VehicleInfo[i][v_KMY] = VehicleInfo[i][v_Y];
    VehicleInfo[i][v_KMZ] = VehicleInfo[i][v_Z];


    Vari1 = Vari2;
    Vari2 wird in Vari1 gespeichert, nicht andersrum.


    lg,
    YaBroo

    KleineHilfe 2.0