Beiträge von Jeffry

    e_fuel muss im enum als Float deklariert werden.


    Dann muss die Tankanzeige wie im großen Code in Zeile 25 mit %0.2f gemacht werden.


    Anschließend musst du die Stellen anpassen, an denen Tankwerte gesetzt werden, je nach dem, welche Werte du dann da neu haben willst (mit Kommazahlen?).


    Zusätzlich musst du folgende Abfragen (und ähnliche) anpassen:
    if(vehData[vehicleid][e_fuel] < 1)
    auf:
    if(vehData[vehicleid][e_fuel] <= 0)


    Da sonst ab 0.99 bereits der Tank leer wäre.

    Ich vermute mal, das liegt daran, dass du den Timer mehrfach startest.
    Wie und wo startest du denn den Timer? Vermutlich bei OnPlayerConnect?


    Grundsätzlich müsstest du setKiloMeter nur einmal bei OnGameModeInit starten, die playerid aus dem Kopf nehmen und im Code von setKiloMeter alle "playerid" mit "i" ersetzen. Zusätzlich müsstest du noch die Abfrage einbauen, ob der Motor auch an ist.

    Aber wie gebe ich den Schlüssel weiter und das dann angezeigt wird im Dialog ob das Fahrzeug überhaupt da ist.

    Ich würde das vermutlich über die Datenbank-ID des Fahrzeugs regeln. Sprich, beim weitergeben des Schlüssels wird die Datenbank-ID des Fahrzeugs von Spieler A in die Variable von Spieler B geschrieben. Gegebenenfalls dazu auch die Model-ID.
    Der Rest muss natürlich vollständig integriert werden, heißt, dass das Fahrzeug beim verlassen nicht gelöscht wird, etc.



    Wie mache ich das mit den PCars also im Dialog.

    Zeige das in einem weiteren Tab an, wie das Kennzeichen.



    Der Code ist gleich wie im Post 107

    Der Log Eintrag kommt nicht vom Code aus Post 107, da dort kein Zugriff auf den Cache erfolgt.

    Frage spontan ob ich GTA 2 mal laufen lassen kann um bestimmte Sachen zu testen, geht so etwas?

    Du kannst alternativ auch folgende Variante nutzen, dazu musst du nichts installieren oder anpassen.
    Du kannst an deinem PC zwei Benutzerkonten einrichten und dich mit beiden Benutzerkonten auf deinen Server verbinden. Das Benutzerkonto wechselst du einfach über Benutzer wechseln, dann bleibt die Session bestehen.


    Der Rest ist weitaus mehr als einen kleine Frage und gehört somit hier nicht rein.

    Nein.


    Beispiel:
    Spieler A bekommt das Textdraw angezeigt, das Textdraw hat die ID 0, weil es das erste ist.
    Die Variable hat den Wert 0.


    Spieler B bekommt das Textdraw irgendwann später auch erstellt und angezeigt, hat zuvor aber ein anderes Textdraw erstellt bekommen, dann hat sein Textdraw die ID 1. Die Variable damit auch.


    Wenn du jetzt für Spieler A das Textdraw löschst, dann wird für Spieler A das Textdraw 1 gelöscht, sprich ein falsches.



    Deine Variante funktioniert nur solange, wie du nicht mehr auf das Textdraw zugreifen willst, oder solange, alle Spieler das Textdraw mit der gleichen ID haben (Zufall).

    Noch zur Info:
    Der Grund für die Warnung war, dass du ein boolean (false) mit einem Integer (was dir die Funktion zurück gibt) verglichen hast. Da passt der Tag (bool: und keiner) nicht überein, daher die Warnung.


    Warnungen können zwar ignoriert werden, sprich der Code wird trotzdem kompiliert, sollten aber nicht ignoriert werden, da es trotzdem zu Fehlern kommen kann. Daher immer alle Warnungen beheben.



    Ein Callback nutzt du, wenn du die Funktion über einen Timer oder über mysql_pquery beispielsweise aufrufst. Einen stock (simple Funktion), wenn du diesen nur über direkte Code Zugriffe (also kein Timer, etc) aufrufst. Insofern hast du alles richtig gemacht.

    Sorry, hatte den Thread schon als gelesen markiert und dann nicht mehr drauf geachtet.

    Er speichert mir den Fuel nicht ab. Laden tut er aber wenn ich ein Wert in die Tabelle gebe.

    Gibt dir der MySQL Log etwas aus?



    Kann ich irgendwie ohne großartig die Tankart wieder zu speichern sie irgendwie in einem Dialog anzeigen lassen?

    Grundsätzlich schon, kommt halt drauf an wie dein Code dazu aktuell aussieht.



    Wenn Spieler X auf dem Server ist kann Spieler Y sein Fahrzeug öffnen wenn er seinen Schlüssel hat.

    Kannst du das genauer erklären? Willst du den Schlüssel sozusagen an einen anderen Spieler weitergeben?

    hab ich das soweit richtig verstanden ?

    Korrekt!



    Dein Ansatz hier:
    for(new j = 0; j < sizeof(mInfo); j++){
    if(mInfo[j][mID] != vModel) continue;
    War absolut richtig.
    Nur die Verschachtelung der Schleifen war nicht ganz richtig, daher konnte das nicht klappen.


    Die Funktion macht es nur einfacher und übersichtlicher. Man könnte es aber genauso gut mit der Schleife im Code schreiben, wie du es gemacht hast. Bläht den Code aber nur auf.

    Dann bitte so versuchen:
    public tankLostTimer()
    {
    new vModel, vehicleid, string[32], Float:lpmnew;
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    vModel = GetModelIdx(GetVehicleModel(i));
    if(vModel == -1) continue;
    if(motor[i] == 0) continue;
    if(tank[i] <= 0)
    {
    tank[i] = 0;
    motor[i] = 0;
    SetVehicleParamsEx(i, 0, 0, 0, 0, 0, 0, 0);
    }
    else
    {
    lpmnew = mInfo[vModel][lpm] / 60;
    tank[i] -= lpmnew;
    }
    }
    for(new player = 0; player < MAX_PLAYERS; player++)
    {
    if(!IsPlayerConnected(player) || !IsPlayerInAnyVehicle(player)) continue;
    vehicleid = GetPlayerVehicleID(player);
    vModel = GetModelIdx(GetVehicleModel(vehicleid));
    if(vModel == -1) continue;
    format(string, sizeof(string), "%0.2f / %0.2f", tank[vehicleid], mInfo[vModel][maxTank]);
    PlayerTextDrawSetString(player, Tacho_TD[player][15], string);
    }
    return 1;
    }


    stock GetModelIdx(modelid)
    {
    if(modelid)
    {
    for(new i = 0; i < sizeof(mInfo); i++)
    {
    if(mInfo[i][mID] == modelid) return i;
    }
    }
    return -1;
    }


    Da du nicht alle Fahrzeuge in mInfo drin hast, muss der Index der Model-ID erst herausgefunden werden.
    Das hattest du ja in deinem Code gewissermaßen auch drin, meine Annahme daraus war aber, dass ohnehin alle Fahrzeuge gelistet sind.


    Wobei er mit vModel im Index ohnehin auch auf die Bretter gegangen wäre, sehe ich grade.

    Versuche es so, das ist näher an deinem ursprünglichen Code dran gehalten:
    public tankLostTimer()
    {
    new vModel, vehicleid, string[32], Float:lpmnew;
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    vModel = GetVehicleModel(i);
    if(!vModel) continue;
    if(motor[i] == 0) continue;
    if(tank[i] <= 0)
    {
    tank[i] = 0;
    motor[i] = 0;
    SetVehicleParamsEx(i, 0, 0, 0, 0, 0, 0, 0);
    }
    else
    {
    lpmnew = mInfo[vModel][lpm] / 60;
    tank[i] -= lpmnew;
    }
    }
    for(new player = 0; player < MAX_PLAYERS; player++)
    {
    if(!IsPlayerConnected(player) || !IsPlayerInAnyVehicle(player)) continue;
    vehicleid = GetPlayerVehicleID(player);
    vModel = GetVehicleModel(vehicleid);
    format(string, sizeof(string), "%0.2f / %0.2f", tank[vehicleid], mInfo[vModel][maxTank]);
    PlayerTextDrawSetString(player, Tacho_TD[player][15], string);
    }
    return 1;
    }


    Falls es nicht geht, poste bitte die dein mInfo Array mit Daten aussieht.

    Nein, das macht er nicht.
    Dafür ist der Code da:
    for(new d = 0; d < sizeof(PCar[]); d++)
    {
    //Prüfe, ob Fahrzeug existiert. Wenn nicht, nutze den Slot und lege das Fahrzeug an.
    if(PCar[playerid][d][P_MID] == 0)


    Ist in Slot 0 schon ein Fahrzeug, nimmt er Slot 1. Ist dort auch schon eins, nimmt er Slot 2, etc.