Tank Volumen Problem

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
  • Guten Tag,
    Ich habe das so gemacht:
    #define GasMax vehTank[GetVehicleModel(veh)-400]
    new vehTank[212] =
    {
    250,
    175,
    105,
    650,
    65,
    85,
    1450,
    564,....


    Nun habe ich folgendes Problem da das davor so war:
    #define GasMax 1000


    Errors:
    if(IsPlayerConnected(playerid))
    {
    new VID,
    FillUp,
    string[256],
    TankKosten;
    VID = GetPlayerVehicleID(playerid);
    FillUp = GasMax - Gas[VID];//1. Error
    TogglePlayerControllable(playerid, 1);
    if(Refueling[playerid] == 1){
    if(Gas[VID] < GasMax){//Error 2.
    for(new TB = 0; TB < sizeof(TankenBizInfo); TB++){
    if(PlayerToPoint(5, playerid, TankenBizInfo[TB][TBPosX], TankenBizInfo[TB][TBPosY], TankenBizInfo[TB][TBPosZ]) && TankenBizInfo[TB][TBProducts] > 0){
    TankKosten = FillUp * TankenBizInfo[TB][TBSpritPreis];
    if(IsACopCar(VID) || IsAOAmtCar(VID) || IsAMedicCar(VID))
    {
    Gas[VID] += FillUp;
    TankenBizInfo[TB][TBProducts] -= FillUp;
    format(string,sizeof(string),"* Du hast deinen Dienstwagen für $%d auf Kosten des Staates betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
    TankenBizInfo[TB][TBKasse] += TankKosten;
    ExtortionTankenBiz(TB, TankKosten/100*10);
    Refueling[playerid] = 0;
    Update3DTextTanke(TB);
    }


    :\Users\Daniel\Desktop\irp.pwn(10042) : error 017: undefined symbol "veh"
    C:\Users\Daniel\Desktop\irp.pwn(10045) : error 017: undefined symbol "veh"
    C:\Users\Daniel\Desktop\irp.pwn(13936) : error 017: undefined symbol "veh"
    forward MustCarRefuel(playerid, carid);
    public MustCarRefuel(playerid, carid)
    {
    if(GetVehicleModel(carid) == 482)
    {
    if(Gas[carid] < 100)
    {
    new string[156];
    new FillUp,
    TankKosten;
    FillUp = GasMax - Gas[carid];//3.Error Zeile
    TankKosten = FillUp * 30;
    Gas[carid] += FillUp;
    format(string,sizeof(string),"* Du hast das Fahrzeug für $%d (30$ pro Liter)betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    GivePlayerMoneys(playerid, -TankKosten);
    return 1;
    }
    }
    return 1;
    }
    Danke im vorraus,

  • Jetzt verstehe ich die Fehler von vorhin. So war das aber nicht gemeint.


    Ersetze alle deine "GasMax" einfach mit:
    vehTank[GetVehicleModel(veh)-400]


    In dem einen public ist "veh" eben "carid":
    forward MustCarRefuel(playerid, carid);
    public MustCarRefuel(playerid, carid)
    {
    if(GetVehicleModel(carid) == 482)
    {
    if(Gas[carid] < 100)
    {
    new string[156];
    new FillUp,
    TankKosten;
    FillUp = vehTank[GetVehicleModel(carid)-400] - Gas[carid];//3.Error Zeile
    TankKosten = FillUp * 30;
    Gas[carid] += FillUp;
    format(string,sizeof(string),"* Du hast das Fahrzeug für $%d (30$ pro Liter)betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    GivePlayerMoneys(playerid, -TankKosten);
    return 1;
    }
    }
    return 1;
    }


  • Sobald ich das mache bekomme ich Unknown Gamemode und es funktioniert nix Warnings hab ich nicht.

  • Komplette Code:
    for(new veh = 0; veh < MAX_VEHICLES; veh++)
    {
    Gas[veh] = vehTank[GetVehicleModel(veh)-400];
    VehicleObject[veh] = -1;
    }
    if(strcmp("/fuelcars", cmd, true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if(PlayerInfo[playerid][pAdmin] >= 5)
    {
    for(new veh = 0; veh < MAX_VEHICLES; veh++){
    Gas[veh] = vehTank[GetVehicleModel(veh)-400];
    }
    SendClientMessage(playerid, COLOR_ERRORTEXT, " Alle Autos wurden aufgetankt!");
    format(string,sizeof(string),"Admin %s hat alle cars gefüllt.", sendername);
    Entertolog("fuelcars",string);
    }
    else
    {
    SendClientMessage(playerid, COLOR_KEINADMIN, "Du kannst diesen Befehl nicht benutzen");
    return 1;
    }
    }
    return 1;
    }
    public Fillup(playerid)
    {
    if(IsPlayerConnected(playerid))
    {
    new VID,
    FillUp,
    string[256],
    TankKosten;
    VID = GetPlayerVehicleID(playerid);
    FillUp = vehTank[GetVehicleModel(VID)-400] - Gas[VID];
    TogglePlayerControllable(playerid, 1);
    if(Refueling[playerid] == 1){
    if(Gas[VID] < vehTank[GetVehicleModel(VID)-400]){
    for(new TB = 0; TB < sizeof(TankenBizInfo); TB++){
    if(PlayerToPoint(5, playerid, TankenBizInfo[TB][TBPosX], TankenBizInfo[TB][TBPosY], TankenBizInfo[TB][TBPosZ]) && TankenBizInfo[TB][TBProducts] > 0){
    TankKosten = FillUp * TankenBizInfo[TB][TBSpritPreis];
    if(IsACopCar(VID) || IsAOAmtCar(VID) || IsAMedicCar(VID))
    {
    Gas[VID] += FillUp;
    TankenBizInfo[TB][TBProducts] -= FillUp;
    format(string,sizeof(string),"* Du hast deinen Dienstwagen für $%d auf Kosten des Staates betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE,string);
    TankenBizInfo[TB][TBKasse] += TankKosten;
    ExtortionTankenBiz(TB, TankKosten/100*10);
    Refueling[playerid] = 0;
    Update3DTextTanke(TB);
    }
    else
    {
    TankKosten = FillUp * TankenBizInfo[TB][TBSpritPreis];
    if(GetPlayerMoney(playerid) >= TankKosten)
    {
    Gas[VID] += FillUp;
    TankenBizInfo[TB][TBProducts] -= FillUp;
    format(string,sizeof(string),"* Du hast dein Fahrzeug für $%d betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    GivePlayerMoneys(playerid, -TankKosten);
    TankenBizInfo[TB][TBKasse] += TankKosten;
    ExtortionTankenBiz(TB, TankKosten/100*10);
    Refueling[playerid] = 0;
    Update3DTextTanke(TB);
    }
    else
    {
    format(string,sizeof(string),"* Du hast nicht genug Geld dabei, das Tank auffüllen kostet $%d.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    }
    }
    }
    }
    forward MustCarRefuel(playerid, carid);
    public MustCarRefuel(playerid, carid)
    {
    if(GetVehicleModel(carid) == 482)
    {
    if(Gas[carid] < 100)
    {
    new string[156];
    new FillUp,
    TankKosten;
    FillUp = vehTank[GetVehicleModel(carid)-400] - Gas[carid];
    TankKosten = FillUp * 30;
    Gas[carid] += FillUp;
    format(string,sizeof(string),"* Du hast das Fahrzeug für $%d (30$ pro Liter)betankt.", TankKosten);
    SendClientMessage(playerid, COLOR_LIGHTBLUE, string);
    GivePlayerMoneys(playerid, -TankKosten);
    return 1;
    }
    }
    return 1;
    }


    Log:[19:48:52] [debug] Run time error 4: "Array index out of bounds"
    [19:48:52] [debug] Accessing element at negative index -400
    [19:48:52] [debug] AMX backtrace:
    [19:48:52] [debug] #0 00065ccc in public OnGameModeInit () from irp.amx

  • Du solltest als erstes mal mit vollständigen Debuginformationen kompilieren.
    http://forum.sa-mp.com/showpost.php?p=1253632&postcount=7
    Im Idealfall erhälst du dann auch die genaue Zeile die den Crash verursacht. Denn aktuell würde ich auf OnGameModeInit tippen:

    Zitat

    [19:48:52] [debug] #0 00065ccc in public OnGameModeInit () from irp.amx


    Und da der Index -400 ist, fehlt dir wahrscheinlich irgendwo eine Gültige Model-ID eines Fahrzeuges:

    Zitat

    [19:48:52] [debug] Accessing element at negative index -400

  • Ich nehme mal an, dass
    for(new veh = 0; veh < MAX_VEHICLES; veh++)
    {
    Gas[veh] = vehTank[GetVehicleModel(veh)-400];
    VehicleObject[veh] = -1;
    }
    bei dir bei OnGameModeInit steht.


    Ändere das zu:
    new model;
    for(new veh = 0; veh < MAX_VEHICLES; veh++)
    {
    model = GetVehicleModel(veh);
    if(model >= 400 && model <= 611) Gas[veh] = vehTank[model-400];
    else Gas[veh] = 0; //Fahrzeug existiert (noch) nicht.
    VehicleObject[veh] = -1;
    }


    Das würde den Fehler erklären.



    Allinone: Das passt so wie es ist.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()


  • if(model >= 400 && model <= 611) Gas[veh] = vehTank[model-400];
    Schau dir mal die Zeile genauer an.
    Wenn model über oder gleich 400 und unter oder gleich 611 ist,
    dann wäre ja wenn das model bspw. 412 ist bei dieser Zeile:
    vehTank[model-400];
    12. Entweder habe ich wegen meiner Müdigkeit Probleme beim Verstehen oder du hast dich verwirrt.


    Was soll denn bei vehTank hin? Wenns die Model ID ist reicht doch
    vehTank[model];
    ansonnsten wenn es doch die ID ist, so:
    vehTank[veh];
    Oder habe ich etwas falsch verstanden?

    Für das Moderationsteam:
    Ich nutze offene WLAN's und bin im Intercafe oder im Hotel. (Vor Ban wegen Multiaccount deswegen bitte eine private Nachricht, um dies zu klären).

  • Er hat im Array ja bereits die Fahrzeugnamen deklariert, und da es dort bei 0 anfängt zu zählen, muss man einfach -400 rechnen.
    Sprich so:
    Du fährst einen Infernus, der die ModelID 411 hat - Das stimmt
    Im Array hast du aber keinen Wert mit 411, da "Infernus" aber an 11. Stelle steht, musst du -400 rechnen.
    411 - 400 = 11 == Infernus (Infernus liegt an 11. Stelle im Array)


    Ich hoffe das ganze konnte man einigermaßen erklären, denn das ist nicht gerade einfach zu erklären ^^

  • 411 - 400 = 11 == Infernus (Infernus liegt an 11. Stelle im Array)


    Nicht ganz richtig, es liegt an 12. Stelle.
    Die 0 muss man mitzählen.
    Es gibt ja auch nicht 211 verschiedene "Fahrzeuge" in GTA sondern 212.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski