Individueller Benzinverbrauch

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
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 Community,
    ich wollte gerne einen individuellen Benzinverbrauch erstellen. Ich habe soweit schon den Verbrauch auf 100km für jedes Fahrzeug und ein KM Zähler, der sowohl meter als auch Kilometer zählt, also zwei Variablen Meters und KMeters. Da ich aber zu blöd bin um die Rechnung zu erstellen, brauche ich eure hilfe. Es soll umgerechnet werden, sodass er jede 100 meter was abzieht. Ein Timer ist schon vorhanden. Es wäre nett wenn ihr mir helfen könntet.


    Mit freundlichen Grüßen
    Ch4oS

  • Mit den einzelnen Vehicle ID`s arbeiten?


    z.B
    Wenn es eine NRG (Erfunden: ID 425) ist 2 Liter pro 100 Meter
    Wenn es ein Infernus (ID 411) ist 3 Liter pro 100 Meter


    Oder meinst du unterschiedliche Zeiten und jedesmal 1 Liter?


    Nein habe es auf jedes Vehicle geschrieben Beispiel:


    Infernus: Litervermögen 70.0(FLOAT); Verbauch 23.7(FLOAT)


    So sieht es in etwa im Script aus(Ausschnitt):
    new GasMax[][aVerbrauch] = {
    {70.0,14.6}, //"Landstalker",
    {60.0,11.2},//"Bravura",
    {70.0,19.6},//"Buffalo",
    {250.0,22.8},//"Linerunner",
    {50.0,11.9},//"Pereniel",
    {60.0,12.4},//"Sentinel",
    {250.0,24.6},//"Dumper",
    {150.0,18.4},//"Firetruck",
    {100.0,15.7},//"Trashmaster",
    {80.0,13.6},//"Stretch",
    {40.0,10.8},//"Manana",
    {70.0,23.7},//"Infernus",...


    Edit: Meine frage ist nun, wie ich das mache das er dann genau z.B. 23.7 Lioter auf 100km verliert.

  • //Unter die Includes
    new Float:OldPos[MAX_PLAYERS][3];


    //OnGameModeInit
    SetTimer("PosTimer", 100, 1);


    //Unten im Code
    forward PosTimer();
    public PosTimer()
    {
    new Float:x, Float:y, Float:z, Float:d, Float:v;
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    GetPlayerPos(i, x,y,z);
    if(OldPos[i][0] != 0.0 && OldPos[i][1] != 0.0 && OldPos[i][2] != 0.0)
    {
    d=floatsqroot(((OldPos[i][0]-x)*(OldPos[i][0]-x))+((OldPos[i][1]-y)*(OldPos[i][1]-y))+((OldPos[i][2]-z)*(OldPos[i][2]-z))); //Distanz
    v = d / 100.0 * GasMax[GetVehicleModel(GetPlayerVehicleID(i))-400][aVerbrauch]; //Verbrauch = Distanz von 100km * max.verbrauch(vehicle)
    Tank[i] -= v; //Vom Tank des Spielers (wenn du das Auto willst, i zu GetPlayerVehicleID ändern) abziehen.
    }
    OldPos[i][0] = x;
    OldPos[i][1] = y;
    OldPos[i][2] = z;
    }
    return 1;
    }


    //OnPlayerEnterVehicle / OnPlayerStateChange
    OldPos[i][0] = 0.0;
    OldPos[i][1] = 0.0;
    OldPos[i][2] = 0.0;


    Ich hab es etwas kommentiert, falls dir was unklar ist kann ich es dir gerne explizit erklären.
    Den Tank[] solltest du halt irgendwo schon gesetzt haben, gegebenenfalls die Variable zu deiner umbenennen. Darauf achten, dass i = Spieler IDs sind.

  • Der timer ist viel zu schnell.


    Nein...und eine Aussage ohne Begründung macht wenig Sinn.


    Je schneller desto genauer, am Besten wäre es, den ganzen Teil unter OnPlayerUpdate zu setzen. Ich habe damit schon einige Tests gemacht.
    Warum?
    => Wenn du einen 10 Sekunden Timer nimmst kannst du "kostenlos" im Kreis fahren. Daher ein kleiner timer, das macht dem Server auch gar nichts aus.

  • Wieso zu schnell.
    Erstmal Danke an Jeffrey:!


    Edit:


    Habe jetzt ein Problem :s
    Bekomme Warnings:


    if(vehmodel >= 400 && vehmodel <= 611)
    {
    return GasMax[vehmodel-400][Liter];//DIE ZEILE
    }


    Code
    (14845) : warning 213: tag mismatch


    Edit2:
    Hier das enum und mehr
    enum aVerbrauch
    {
    Float:Liter,
    Float:Verbrauch
    }


    new GasMax[][aVerbrauch] = {

  • Vorrausetzlich ich weiß es noch richtig hab ne Pause hinter mir ^^
    kann man keine Floats Returnen allerdings Kannst du da du ja einen Wert ermitteln willst So was machen:



    forward GetFloatFromFunction(paramenter,&Liter);
    public GetFloatFromFunction(paramenter,&Float:Liter) {
    Liter = 1.2;
    return 1;
    }
    new Float:Wert;
    GetFloatFromFunction(paramenter,Wert);
    printf("%f",Wert);


    //Edit: Müsste aber auch so gehen


    forward Float:GetFloatFromFunction();
    public Float:GetFloatFromFunction() {
    return 1.2;
    }


  • Ne nur kurz motor angelassen. So schicke jetzt mal Code:
    public CheckGas()
    {
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    if(motor[i] == 1)
    {
    if(IsASweeper(i) || IsABus(i) || IsATaxi(i) || IsAMechanikCar(i) || IsAFarmCar(i) || IsAFahrschulCar(i))
    {
    Gas[i] = GetGasMax(GetVehicleModel(i));
    return 1;
    }
    if(Gas[i] >= 0.1)
    {
    new Float:x, Float:y, Float:z, Float:d, Float:v;
    for(new p=0; p<MAX_PLAYERS; p++)
    {
    GetPlayerPos(p, x,y,z);
    if(OldPos[p][0] != 0.0 && OldPos[p][1] != 0.0 && OldPos[p][2] != 0.0)
    {
    d=floatsqroot(((OldPos[p][0]-x)*(OldPos[p][0]-x))+((OldPos[p][1]-y)*(OldPos[p][1]-y))+((OldPos[p][2]-z)*(OldPos[p][2]-z))); //Distanz
    v = d / 100.0 * GasMax[GetVehicleModel(i)-400][Verbrauch]; //Verbrauch = Distanz von 100km * max.verbrauch(vehicle)
    Gas[i] -= v; //Vom Tank des Spielers (wenn du das Auto willst, i zu GetPlayerVehicleID ändern) abziehen.
    }
    OldPos[p][0] = x;
    OldPos[p][1] = y;
    OldPos[p][2] = z;
    }
    }
    else if(Gas[i] <= 0.0)
    {
    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(i,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(i,0,lights,alarm,doors,bonnet,boot,objective);
    motor[i] = 0;
    NoFuel[i] = 1;
    }
    }
    }
    return 1;
    }


    Und hier mal GetGasMax:
    forward Float:GetGasMax(vehmodel);
    public Float:GetGasMax(vehmodel)
    {
    if(vehmodel >= 400 && vehmodel <= 611)
    {
    return GasMax[vehmodel-400][Liter];
    }
    return 100.0;
    }


    Gas:
    new Float:Gas[MAX_VEHICLES];


    Kilometer beim Zähler wachsen zu schnell

  • OldPos[p][0] = 0.0;
    OldPos[p][1] = 0.0;
    OldPos[p][2] = 0.0;


    zu:
    if(!IsPlayerInAnyVehicle(p))
    {
    OldPos[p][0] = 0.0;
    OldPos[p][1] = 0.0;
    OldPos[p][2] = 0.0;
    }
    else
    {
    OldPos[p][0] = x;
    OldPos[p][1] = y;
    OldPos[p][2] = z;
    }



    Habs getestet, tut dann. Liegt wahrscheinlich an der Zeitverzögerung zwischen den Aufrufen der Funktionen, so tuts aber.


    Logs:


    EDIT:
    Das return 1; bei IsASweeper (...) ist nicht gut. Wenn du den Verbrauch überspringen willst, dann nimm continue; sonst wird die Schleife einfach abgebrochen.

  • Ok probiere ich morgen


    Gesendet vom Handy


    Edit: Habe es probiert funktioniert, aber irgendwie bugt meine Anzeige:
    also ich habe mir mal beim Infernus Benzin und Tankgröße ausgeben lassen. Es kommt raus: Benzin: 100.0 und Tankgröße: 70.0. Ist schonmal komisch beim /veh befehl wird Gas auf die maximale anzahl gesetzt


    public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
    {
    new string[128];
    format(string,sizeof string,"Benzin: %0.1f Maximal: %0.1f",Gas[GetPlayerVehicleID(vehicleid)],GetGasMax(GetVehicleModel(vehicleid)));
    SendClientMessage(playerid,COLOR_GREY,string);
    return 1;
    }


    if(strcmp(cmd, "/veh", true) == 0)
    {
    if(!IsAdmin(playerid,4))return SendClientMessage(playerid, COLOR_GRAD1, " Du bist kein Admin !");
    new vid,color1,color2;
    if(sscanf(params,"iii",vid,color1,color2)) return SendClientMessage(playerid,COLOR_GREEN,"[Benutzung]:{FFFFFF} /veh [ID] [Farbe1] [Farbe2]");
    if(vid < 400 || vid > 611) return SendClientMessage(playerid,COLOR_RED,"Falsche Vehicleid");
    if(color1 < 0 || color1 > 255) return SendClientMessage(playerid,COLOR_RED,"Falsche Farbe");
    if(color2 < 0 || color2 > 255) return SendClientMessage(playerid,COLOR_RED,"Falsche Farbe");
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    new carid = CreateVehicle(vid,x+2,y+2,z+2,0,color1,color2,-1);
    motor[carid] = 0;
    Gas[carid] = GetGasMax(vid); // Hier wird der Tank gesetzt
    return 1;
    }


    So das GetGasMax public steht ja schon oben aber hier nochmal:


    public Float:GetGasMax(vehmodel)
    {
    if(vehmodel >= 400 && vehmodel <= 611)
    {
    return Float:GasMax[vehmodel-400][Liter];
    }
    return 100.0;
    }


    GasMax, war auch schon oben:
    enum aVerbrauch
    {
    Float:Liter,
    Float:Verbrauch
    }


    new GasMax[][aVerbrauch] = {