Beiträge von XonarZ

    Ich hab da so ein weiteres problem... Ich komm mir richtig dumm vor ehrlich xD


    Ich habe einen enter befehl:

    Code
    ocmd:enter(playerid, params[]){
    	for(new i = 0; i < sizeof(tInfo[]); i++){
    	    //ZEILE 787 -> if(!tInfo[i][id_x]) continue;
    		if(tInfo[i][enter_x] == 0.0) continue;
    		if(!IsPlayerInRangeOfPoint(playerid, 5, tInfo[i][enter_x], tInfo[i][enter_y], tInfo[i][enter_z])) continue;
    		break;
    	}
    	return 1;
    }


    Wenn ich das So Compile gibts keine Fehler, wenn ich allerdings ingame dann /enter eingebe, kommt folgendes in der Serverlog:



    Code
    [11:11:09] [debug] Run time error 5: "Invalid memory access"
    [11:11:09] [debug] AMX backtrace:
    [11:11:09] [debug] #0 0000f74c in public ocmd_enter (playerid=0, params[]=@0006efd4 " ") at ... gamemodes\selfmade.pwn:787
    [11:11:09] [debug] #1 native CallLocalFunction () in samp-server.exe
    [11:11:09] [debug] #2 000073e0 in public OnPlayerCommandText (playerid=0, cmdtext[]=@0006efb8 "/enter") at ... pawno\include\ocmd.inc:78

    Ich kann mich dunkel erinnern, dass ich schon mal son Invalid Memory Access hatte, allerdings finde ich den Beitrag gerade nicht mehr und komm auch nicht mehr drauf was war :/

    Da setzt du das doch jeweils...wieso?


    Wieso +=?


    Das erhöht sich doch schon automatisch.

    Naja nicht wirklich... kmstand[MAX_VEHICLES] ist ja eine globale Variable, diese wird auch gesetzt mit dem Wert aus der Datenkbank sobald der Spieler sich einloggt... Dann ist es so, dass ich mit GetKilometers(vehicleid) die distance "auslese" und meiner globalen Variable addiere ... ich glaube nämlich, dass GetKilometers auf 0 gesetzt wird sobald der Server restartet und dann wäre der KMStand ja immer 0... Desweiteren kommt nach meinem setVehicleKM, ein ResetMetersTraveled ... Sprich ich resette den auf 0 um einfach immer nur die 0... km zu addieren.


    Hier mal mein Stock setVehicleKM:

    Code
    stock setVehicleKM(playerid){
    	new vID = getCarID(playerid), string[256];
    	if(vID == INVALID_VEHICLE_ID) vID = GetPlayerVehicleID(playerid);
    	format(string, sizeof(string), "%0.2f km", kmstand[vID]);
       	PlayerTextDrawSetString(playerid, Tacho_TD[playerid][6], string);
    	return 1;
    }

    Ich rufe den Stock nur auf wenn ich ein Fahrzeug betrete damit er den Textdraw setzt ...



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

    Ne nur beim Motor starten, ansonsten rufe ich den Stock auf beim einsteigen wie gesagt...



    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.

    Hm okay, aber würde es nicht mehr sinn machen, den Timer nur dann laufen zu lassen, wenn der Motor auch startet ? Weil ich hab ja schon den Timer mit dem tankLost ... geht das nicht iwie auf die Perfomance wenn ich 2 Timer permanent laufen lasse? Immerhin sollen ja nur KM gezählt werden, sobald der Motor an ist... Versteh ich irgendwas falsch ?


    //EDIT Mir ist auch aufgefallen, dass sobald 1 Spieler im Auto sitzt und rumfährt, dass beim Spieler 2 der auch rumfährt, dass der KM Stand nicht addiert wird, da passiert einfach gar nix.


    MfG
    XonarZ

    Moin / Nabend liebe Community,


    ich benutze auf Empfehlung das KM Include:


    https://forum.sa-mp.com/showthread.php?t=404367


    Meine Codeschnipsel:


    Hier wird der Timer zum Aktualisieren Gestartet beim Anschalten und gekillt beim abschalten.

    Problem ist jetzt folgendes:


    Wenn ich als einziger Spieler (Playerid 0) auf dem Server bin und fahre läuft alles super, doch sobald ein zweiter Spieler (Sandbox) drauf ist, in einem Fahrzeug sitzt MOTOR ist allerdings AUS und ich fahre mit playerid 0 weiter zählt er mehr km als normal ist... Zumal wenn ich mit PlayerID 0 stehen bleibe (egal ob Motor an oder aus), der KM Stand geht immer weiter ...


    Ich hoffe es war einigermaßen verständlich ^^


    MfG
    XonarZ

    mach es mal so:

    Code
    enum vehDataEnum {
    	Float:e_fuel
    };
    new vehData[MAX_VEHICLES][vehDataEnum];
    Code
    if((newstate == PLAYER_STATE_DRIVER) || (newstate == PLAYER_STATE_PASSENGER))
    	{
    	    new vid = GetPlayerVehicleID(playerid);
    		new string[128], modelid = GetVehicleModel(GetPlayerVehicleID(playerid)), idx = modelid-400;
    		format(string, sizeof(string), "%0.2f/%dLiter", vehData[vid][e_fuel],vehDefaultData[idx][e_maxFuel]);
      		PlayerTextDrawSetString(playerid, textdraw[5][playerid], string);
    	}
    
    
    //Textdraw wo es angezeigt wird

    Heyho


    Ich hab da son kleinen "Warning" eigentlich sind warnings ja nichts schlimmes, nur sieht es dennoch hässlich aus bei einem Selfmade :D


    Code
    ...selfmade.pwn(349) : warning 213: tag mismatch
    Pawn compiler 3.2.3664	 	 	Copyright (c) 1997-2006, ITB CompuPhase
    
    
    
    
    1 Warning.



    Mein Stock dazu:


    Code
    stock isCarAnAhCar(vID){
    	for(new i = 0; i < sizeof(ahCars); i++){
    	    if(ahCars[i][id_x] == vID){
    		    return true;
    		}else{
    		    return false;
    		}
    	}
    	return 0;
    }

    Ich hoffe ihr habt eine idee 8| ich komme irgendwie immer durcheinander wann nun ein Stock und wann ein Callback genutzt werden sollte.


    MfG
    XonarZ


    //EDIT also ich musste statt if(isCarAnAhCar(vID) == false) ... einfach if(!isCarAnAhCar(vID)){ } machen und nun ist der warning weg :D

    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

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

    Pack eventuell unter das PlayerTextDrawSetString mal ein PlayerTextDrawShow.

    Sorry das ich mich jetzt erst melde...


    Leider hat dies nix gebracht ... Davor hatte ich es mit einer for schleife für cInfo allerdings wäre das dann ja nur für Privatcars...


    MfG
    XonarZ

    Wie kann ich einbauen wenn ich bsp. /kwertwer schreibe da steht "Der Befehl /kwertwer wurde nicht gefunden." ?

    Du schreibst unter OnPlayerCommandText vor die schließende Klammer statt ein return 1;


    return SendClientMessage(playerid, COLOR, "TEXT");


    Code
    public OnPlayerCommandText(playerid, cmdtext[])
    {
    	//BEFEHLE
    	return SendClientmessage(playerid, FARBE, "TEXT");
    }

    Warum sollte er seinen ganzen Befehl neu machen?

    Weil sein anderer befehl /find ist und nicht /showpos ^^ Außerdem sollte er meins nur als "Grundbasis" nehmen, weil so wie ich es verstanden habe, wollte er den Marker für seinen Kollegen setzen ... (vermutlich damit der Fahrer nicht Befehle eingeben muss und der immer langsamer wird)

    Als "Grundbasis" wie folgt:


    Die Koordinaten kannst du nun verwenden wie du willst.


    Mit freundlichen Grüßen
    XonarZ

    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

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

    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

    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