Tank Abziehen jede Sekunde

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
  • Sehr geehrte Community,


    ich stehe mal wieder auf dem Schlauch ... Ich möchte jetzt, jede Sekunde (Timer) Tank abziehen von dem was in der Datenbank steht. Dies soll nur für Autos sein deren Motor an ist...


    Ich habe eine motor Variable die auf 0 bzw. 1 gesetzt wird, sobald man /motor macht. Ich habe die Variable Float:tank[MAX_VEHICLES]; definiert ... Die Tanks werden auch richtig ausgelesen ... nur wie mache ich es jetzt am besten, dass der Tank auch abgezogen wird, wenn keiner im Auto ist aber der Motor an ist...


    Ich hatte schon versuche, die allerdings scheiterten... Da war es so, dass entweder gar kein Sprit abgezogen wurde oder ab 2 Spieler bei beiden Autos was abgezogen wurde, sobald nur 1 Motor an war.


    Ich hoffe ihr könnt mir helfen...


    MfG
    XonarZ

  • Folgende Schritte im Callback des Timers:

    • Schleife durch MAX_VEHICLES
    • Prüfen ob Motor an ist
    • Tank abziehen


    Den Timer bei OnGameModeInit starten.

    Ich habe es jetzt wie folgt:



    //EDIT vergessen zu beschreiben, was nicht geht haha ... Der zieht kein Tank ab leider... bzw. Textdraw ändert sich nicht.


    MfG
    XonarZ

    Einmal editiert, zuletzt von XonarZ ()

  • Du machst dir das viel zu kompliziert.


    Die innere Schleife mit dem mInfo ist komplett unnötig, da du ja durch GetVehicleModel doch schon weißt, um welches Model es sich handelt.


    Ich glaube so macht das mehr Sinn.


    So brauchst du auch keine Schleifen schachteln..weil ja sonst deine Laufzeit extremst wäre..du müsstest ja jedes mal MAX_VEHICLES*MAX_VEHICLES*MAX_PLAYERS durchlaufen...das ist ja Irrsinn.

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

    Einmal editiert, zuletzt von Kaliber () aus folgendem Grund: Mach mal den String bissl größer 16 ist echt eng haha xD

  • Danke dir für die Mühe, nur leider passiert nix ... :(

  • Danke dir für die Mühe, nur leider passiert nix ...

    Dann lade mal 1. crashdetect und schaue ob irgendwelche Fehler auftreten :)


    2. Hau in den Timer mal ein print, damit du sicher bist, dass das auch aufgerufen wird :D

    ast2ufdyxkb1.png


    Leute, lernt scripten und versucht mal lieber etwas selber zu schreiben, als es aus einem GF zu kopieren. :S

  • Dann lade mal 1. crashdetect und schaue ob irgendwelche Fehler auftreten :)
    2. Hau in den Timer mal ein print, damit du sicher bist, dass das auch aufgerufen wird :D

    Also ich habe crashdetect schon von anfang an drinne ...


    Ich hab jetzt nen Print eingefügt beim Callback... der wird auch jede sekunde ausgeführt.


    MfG
    XonarZ

  • 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.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 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.

    mein Enum:


    Code
    enum modelData{
    	mID, //MODELID
    	mName[32],
    	mBat,
    	fuelTyp[16],
    	Float:maxTank,
    	Float:lpm
    }


    mInfo:

    Code
    new mInfo[][modelData] = {
    {400, "Landstalker", 12, "Diesel", 10.0, 0.1},
    {411, "Infernus", 12, "Benzin", 10.0, 0.1}
    };

    Noch etwas?


    Leider gehts nämlich nicht...

  • 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.

  • Okay... Heißt also: Ich hätte theoretisch eine for schleife machen müssen um an den Index der richtigen mID (Modelid) zu kommen um dann den den lpm wert und den maxTank wert auszulesen ?


    Und damit ich eben nicht jedes mal eine for schleife machen muss, hast du mir netterweise eine funktion geschrieben die das für mich erledigt ?


    hab ich das soweit richtig verstanden ?


    MfG
    XonarZ

  • 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.