Problem beim Tanksystem

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
  • Ich hoffe jemand hat hier eine Idee hierzu. Es handelt sich um ein Tanksystem was nicht mit einem festen Wert für alle Fahrzeugmodelle arbeitet, sondern mit verschiedenen Float-Werte pro Model.


    So sieht das System bisher aus:

    enum CarInfo{
    model[32],
    Float:tank
    }
    new cInfo[][CarInfo] ={
    {"Landstalker",38.0},
    {"Bravura",42.0},
    ... //Für bessere Anzeige ist die Liste gekürzt, aber in meinem Script sind alle Modelle vorhanden
    {"Boxville",60.0},
    {"Tiller",62.0},
    {"Utility Trailer",45.0}
    };


    new Float:cartank[MAX_VEHICLES];


    public OnGameModeInit()
    {
    for(new i=0; i<MAX_VEHICLES; i++) //Beim Serverstart sollen alle Fahrzeuge ihren Tank mit den Daten aus der cInfo[id in der Liste -400][tank] gefüllt bekommen -> Und genau hier liegt das Problem!
    {
    new vID = GetVehicleModel(i);
    cartank[i] = cInfo[vID-400][tank]; //Warum -400? Weil die VehicleIDs nicht mit 1 beginnen wie wir alle wissen
    }
    return 1;
    }


    Fehlermeldung:
    [16:05:02] [debug] Run time error 4: "Array index out of bounds"[16:05:02] [debug] Accessing element at negative index -400[16:05:02] [debug] AMX backtrace:[16:05:02] [debug] #0 00006cd0 in public SSCANF_OnGameModeInit () from server.amx[16:05:02] [debug] #1 00000a34 in public OnGameModeInit () from server.amx


    Hat jemand eine Löung für das Problem? Ich wäre echt dankbar!


    Gruß Addra

    Code
    #define GeprüfterTastaturZerhacker Positiv

    Kopf trifft Tisch kritisch! -- Der ging nicht durch!
    ----
    Whisky löst keine Probleme! Das tut Milch aber auch nicht.

  • Du liest hier die vID aus also die ID die das Fahrzeug hat. Daher funktioniert das ganze nicht. Denn wir Fragen hier nicht das Modell des Fahrzeuges ab sondern eben die Fahrzeug ID die der Server zählt. Also


    cartank[i] = cInfo[vID-400][tank];


    zu


    cartank[i] = cInfo[vID][tank];


    bzw


    cartank[i] = cInfo[i][tank];

  • Es muss auch das Model abgefragt werden, damit auch die Tankanzeige stimmt! In meinem Script hat jedes Fahrzeugmodel unterschiedlich Tankgrößen


    Beispiel:
    Der Buffalo fasst 40.0 l während der Bravura bei vollem Tank 42.0 l fasst.


    Dieses System wollte ich beibehalten.


    Wenn ich das bei OnGameModeInit() eintrage


    for(new i=0; i<sizeof(cartank); i++)
    {
    cartank[i] = cInfo[i][tank];
    }


    erhalte ich trotzdem folgende Fehlermeldung , wenn ich den Server starte

    [18:38:22] [debug] Run time error 4: "Array index out of bounds"
    [18:38:22] [debug] Accessing element at index 212 past array upper bound 211

    Code
    #define GeprüfterTastaturZerhacker Positiv

    Kopf trifft Tisch kritisch! -- Der ging nicht durch!
    ----
    Whisky löst keine Probleme! Das tut Milch aber auch nicht.

  • ah hier liegt glaube ich der Fehler mit.


    for(new i=0; i<sizeof(cartank); i++) { cartank[i] = cInfo[i][tank]; }


    Ich würde sagen man behebt erstmal den ersten Fehler. Wenn ich mich nicht täusche kann er garnicht das Fahrzeug ermitteln da i für den cartank steht. Ich habe nun nochmal eine andere Schleifen Methode erstellt und hoffe es geht dann.



    for(new i=0; i<sizeof(cartank); i++)
    {
    for(new id=0; i<MAX_VEHICLES; id++)
    {
    cartank[i] = cInfo[id][tank];
    }
    return 1;

    }


    Wenn du hilfe brauchst beim ermitteln welches Fahrzeug es ist gerne nachdem der Fehler behoben ist.

  • Es ist immer noch derselbe Fehler.


    [00:24:38] [debug] Run time error 4: "Array index out of bounds"[00:24:38] [debug] Accessing element at index 212 past array upper bound 211[00:24:38] [debug] AMX backtrace:[00:24:38] [debug] #0 00006cc8 in public SSCANF_OnGameModeInit () from server.amx[00:24:38] [debug] #1 00000a34 in public OnGameModeInit () from server.amx


    Was soll das Ding können?
    Alle Auto durch-"schleifen", die Model-ID rausfinden und den Tank zuweisen


    BTW:
    new Float:cartank[MAX_VEHICLES];
    ist bereits deklariert.



    GetVehicleModel sollte wegen der Sache mit den verschiedenen Tankgrößen eigentlich drin sein! Wie bereits gesagt:



    Nicht jedes Modell hat die selbe Tankgröße!



    Nochmals der Code für die Sache:
    enum CarInfo{
    model[32],
    Float:tank //Tankgröße die abgefragt werden, je nach Modell
    }
    new cInfo[][CarInfo] ={
    {"Landstalker",38.0},
    {"Bravura",42.0},
    {"Buffalo",40.0},...// Gekürzt wegen Platz
    {"Boxville",60.0},
    {"Tiller",62.0},
    {"Utility Trailer",45.0}
    };


    new Float:cartank[MAX_VEHICLES];


    public OnGameModeInit()
    {


    for(new i=0; i<sizeof(cartank); i++) //Beim Serverstart sollen alle Fahrzeuge ihren Tank mit den Daten aus der cInfo[id in der Liste -400][tank] gefüllt bekommen -> Und genau hier liegt das Problem!
    {
    new vID = GetVehicleModel(i); //<- Wird wegen der Model-ID gebraucht!
    cartank[i] = cInfo[vID-400][tank]; //Warum -400? Weil die VehicleIDs nicht mit 1 beginnen wie wir alle wissen
    }
    return 1;
    }

    Code
    #define GeprüfterTastaturZerhacker Positiv

    Kopf trifft Tisch kritisch! -- Der ging nicht durch!
    ----
    Whisky löst keine Probleme! Das tut Milch aber auch nicht.

    2 Mal editiert, zuletzt von DisturbedNoobTV ()

  • Beitrag von BreadScript ()

    Dieser Beitrag wurde vom Autor gelöscht ().
  • Beitrag von BreadScript ()

    Dieser Beitrag wurde vom Autor aus folgendem Grund gelöscht: müll ().
  • Ein Tank kann genauso gut ein float als Wert beinhalten.
    Mit einen float kann man viel genauer berechnen(0.5,1.0) statt 1,2,3.
    Float bedeutet nicht gleich das es sich hier zwangsweise immer um Koordinaten handelt.
    Denn deine Tanknadel kann auch mal zwischen 1 und 2 stehen.

    „Auge um Auge - und die ganze Welt wird blind sein.“
    - Mahatma Gandhi

  • Ein Tank kann genauso gut ein float als Wert beinhalten.
    Mit einen float kann man viel genauer berechnen(0.5,1.0) statt 1,2,3.
    Float bedeutet nicht gleich das es sich hier zwangsweise immer um Koordinaten handelt.
    Denn deine Tanknadel kann auch mal zwischen 1 und 2 stehen.

    Stimmt hast du auch Recht ist mir im nachhinein eingefallen. Ich habe das oben gerade mal getestet es funktioniert leider aber auch nicht. Klar ist er muss den Namen auslesen bevor er den Tank vergeben kann so wie er es gemacht hat.


    Also @Addra versuche den Fahrzeugnamen auszulesen. Hierzu gebe ich dir folgende 2 Dinge mit auf dem weg



    stock zum ermittelnt des Fahrzeuges



    stock GetVehicleFriendlyName(vehicleid)
    {
    new GVFNstring[56];
    format(GVFNstring, sizeof(GVFNstring), VehicleFriendlyNames[GetVehicleModel(vehicleid)-400]);
    return GVFNstring;
    }


    und das waas der stock aufruft



    new VehicleFriendlyNames[212][] =
    {
    {"Landstalker"},{"Bravura"},{"Buffalo"},{"Linerunner"},{"Perrenial"},{"Sentinel"},
    {"Dumper"},{"Firetruck"},{"Trashmaster"},{"Stretch"},{"Manana"},{"Infernus"},{"Voodoo"},
    {"Pony"},{"Mule"},{"Cheetah"},{"Ambulance"},{"Leviathan"},{"Moonbeam"},{"Esperanto"},{"Taxi"},
    {"Washington"},{"Bobcat"},{"Mr. Whoopee"},{"BF. Injection"},{"Hunter"},{"Premier"},{"Enforcer"},
    {"Securicar"},{"Banshee"},{"Predator"},{"Bus"},{"Rhino"},{"Barracks"},{"Hotknife"},{"Article Trailer"},
    {"Previon"},{"Coach"},{"Cabbie"},{"Stallion"},{"Rumpo"},{"RC Bandit"},{"Romero"},{"Packer"},{"Monster"},
    {"Admiral"},{"Squalo"},{"Seasparrow"},{"Pizzaboy"},{"Tram"},{"Article Trailer 2"},{"Turismo"},{"Speeder"},
    {"Reefer"},{"Tropic"},{"Flatbed"},{"Yankee"},{"Caddy"},{"Solair"},{"Berkley's RC Van"},{"Skimmer"},
    {"PCJ-600"},{"Faggio"},{"Freeway"},{"RC Baron"},{"RC Raider"},{"Glendale"},{"Oceanic"},{"Sanchez"},
    {"Sparrow"},{"Patriot"},{"Quad"},{"Coastguard"},{"Dinghy"},{"Hermes"},{"Sabre"},{"Rustler"},{"ZR-350"},
    {"Walton"},{"Regina"},{"Comet"},{"BMX"},{"Burrito"},{"Camper"},{"Marquis"},{"Baggage"},{"Dozer"},
    {"Maverick"},{"News Chopper"},{"Rancher"},{"FBI Rancher"},{"Virgo"},{"Greenwood"},{"Jetmax"},{"Hotring"},
    {"Sandking"},{"Blista Compact"},{"PD Maverick"},{"Boxville"},{"Benson"},{"Mesa"},{"RC Goblin"},
    {"Hotring Racer A"},{"Hotring Racer B"},{"Bloodring Banger"},{"Rancher"},{"Super GT"},{"Elegant"},
    {"Journey"},{"Bike"},{"Mountain Bike"},{"Beagle"},{"Cropdust"},{"Stunt"},{"Tanker"},{"Roadtrain"},
    {"Nebula"},{"Majestic"},{"Buccaneer"},{"Shamal"},{"Hydra"},{"FCR-900"},{"NRG-500"},{"HPV1000"},
    {"Cement Truck"},{"Tow Truck"},{"Fortune"},{"Cadrona"},{"FBI Truck"},{"Willard"},{"Forklift"},
    {"Tractor"},{"Combine"},{"Feltzer"},{"Remington"},{"Slamvan"},{"Blade"},{"Freight"},{"Streak"},
    {"Vortex"},{"Vincent"},{"Bullet"},{"Clover"},{"Sadler"},{"Firetruck LA"},{"Hustler"},{"Intruder"},
    {"Primo"},{"Cargobob"},{"Tampa"},{"Sunrise"},{"Merit"},{"Utility"},{"Nevada"},{"Yosemite"},{"Windsor"},
    {"Monster A"},{"Monster B"},{"Uranus"},{"Jester"},{"Sultan"},{"Stratum"},{"Elegy"},{"Raindance"},
    {"RC Tiger"},{"Flash"},{"Tahoma"},{"Savanna"},{"Bandito"},{"Freight Flat"},{"Streak Carriage"},
    {"Kart"},{"Mower"},{"Dunerider"},{"Sweeper"},{"Broadway"},{"Tornado"},{"AT-400"},{"DFT-30"},{"Huntley"},
    {"Stafford"},{"BF-400"},{"Newsvan"},{"Tug"},{"Article Trailer 3"},{"Emperor"},{"Wayfarer"},{"Euros"},{"Mobile Hotdog"},
    {"Club"},{"Freight Carriage"},{"Trailer 3"},{"Andromada"},{"Dodo"},{"RC Cam"},{"Launch"},{"Police (LSPD)"},
    {"Police Car (SFPD)"},{"Police Car (LVPD)"},{"Police Ranger"},{"Picador"},{"S.W.A.T Van"},{"Alpha"},
    {"Phoenix"},{"Glendale"},{"Sadler"},{"Luggage Trailer A"},{"Luggage Trailer B"},{"Stair Trailer"},
    {"Boxville"},{"Farm Plow"},{"Utility Trailer"}
    };

  • MAX_VEHICLES ist eine Konstante und beinhaltet immer ein festen Wert. Angenommen du modifizierst den Wert nicht, beträgt er 2000. Solltest du nun 200 Fahrzeuge erstellen, loopt er trotzdem bis 2000 (oder 1999, je nach Gestaltung des Schleifenkopfs). Das Problem: GetVehicleModel() gibt 0 zurück, wenn das Fahrzeug nicht existiert -> 0 - 400 ergibt -400 -> du zersprengst deinen Array. Entweder du überprüfst, ob GetVehicleModel() nicht gleich 0 ist, oder du modifizierst deinen Schleifenkopf.

  • @Douq: Danke das war mein Fehler! Warum denkt man so selten an die Null? :D


    So klappts jetzt:



    for(new i=0; i<MAX_VEHICLES; i++)
    {
    new mID = GetVehicleModel(i);
    if(mID == 0)continue; // Wenn Null, dann überspringen und Schleife zu Ende bringen! Nicht gerade ressourcenschonend, aber in der Zeit der heutigen CPUs ist das eher egal
    cartank[i] = cInfo[mID-400][tank];
    }


    @BreadScript: Was du vorgeschlagen hattest, ist ja eigentlich bereits im Script drin, aber danke dir


    Ich danke auch euch allen anderen, die geholfen haben! Ich werde das System vllt. veröffentlichen, wenn es komplett fertig ist.


    Gruß Addra

    Code
    #define GeprüfterTastaturZerhacker Positiv

    Kopf trifft Tisch kritisch! -- Der ging nicht durch!
    ----
    Whisky löst keine Probleme! Das tut Milch aber auch nicht.