Frage wegen Timer

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
  • Hi,


    ich habe ein Problem mit einem Timer, und zwar wenn der Spieler in den Wagen einsteigt, startet ein Timer mit Intervall 1 Sekunden der Carhealth überprüft. Wenn die dann unter 300 ist soll der Spieler eingeklemmt sein, also TogglePlayerControllable(playerid, 0). Das Funktioniert soweit auch, nur habe ich folgendes Problem:


    Wenn ich in ein Fahrzeug einsteige, danach wieder raus gehe und ein anderer User steigt ein, dann kommt bei mir die Meldung das ich eingeklemmt wäre, das passiert auch umgekehrt.
    Ich hab alles versucht den TImer zu löschen sobald ich aus dem Fahrzeug austeige:


    Bei OnPlayerStateChange(playerid):


    if(newstate == 2)
    {
    if(CarInfo[carid][tankaktuell] == 0)
    {
    SendClientMessage(playerid, ORANGE, "Der Tank ist leer! Du musst den Pannendienst rufen.");
    SendClientMessage(playerid, ORANGE, "Tippe /exit um wieder auszusteigen!");
    TogglePlayerControllable(playerid, 0);
    }
    else
    {
    Tanktimer = SetTimer("Tankanzeigetimer", 1000, true);
    TextDrawShowForPlayer(playerid, Tankanzeige);
    Tankfunktionstimer = SetTimer("Tankfunktion", 100000, true);
    //Geschwindigkeitstimer = SetTimer("Geschwindigkeitstimer2", 1000, true);
    //TextDrawShowForPlayer(playerid, Geschwindigkeit);
    }
    if(CarInfo[carid][carshealth] <= 300)
    {
    SendClientMessage(playerid, ORANGE, "Dein Wagen hat einen Motorschaden! Du musst den Pannendienst rufen.");
    SendClientMessage(playerid, ORANGE, "Tippe /exit um wieder auszusteigen!");
    TogglePlayerControllable(playerid, 0);
    return 1;
    }
    else
    {
    Tachotimer = SetTimer("Tacho", 1000, true);
    TextDrawShowForPlayer(playerid, Tachoanzeige);
    }
    }


    Dann beim Aussteigen:


    if(newstate == 1)
    {
    TextDrawHideForPlayer(playerid, Tachoanzeige);
    TextDrawHideForPlayer(playerid, Tankanzeige);
    KillTimer(Tachotimer);
    KillTimer(Tanktimer);
    KillTimer(Tankfunktionstimer);;
    }


    Zur Sicherheit habe ich bei OnPlayerExitVehicle das "KillTimer(Tachotimer)" nochmal rein aber das problem tritt immer wieder auf :(
    Hoffe mir kann jemand helfen!


    Gruß samu

    :rolleyes:

    2 Mal editiert, zuletzt von samu ()

  • Wenn aber 50 Leute in einem Auto sitzen, laufen 50 Timer gleichzeitig, nur um zu überprüfen, ob das CarHealth unter 300 ist.
    Ich würde alles in einen Timer packen und mit einer For-Schleife prüfen lassen ...dann passiert auch nicht, dass A) zu viele TImer laufen und das Script stark belasten B) der Timer gelöscht wird. Pack am besten alles in einen...per For-Schleife und GetPlayerSeat/GetPlayerState.

  • aso, ok jettz versteh ich das Problem ^^


    Wie muss die for schleife dann genau aussehen?


    EDIT: Habe das ganze jetzt umgeschrieben, der Timer Tacho wird bei OnGameModeinit() erstellt:


    public Tacho()
    {
    for(new playerid = 0; playerid < MAX_PLAYERS; playerid ++)
    {
    if(IsPlayerConnected(playerid) && IsPlayerInAnyVehicle(playerid))
    {
    new car = GetPlayerVehicleID(playerid);
    new Float:CarHealth;
    GetVehicleHealth(car, CarHealth);
    new string[30];
    if(CarHealth == 1000)
    {
    format(string, sizeof(string),"Zustand: unbeschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 950 )
    {
    format(string, sizeof(string),"Zustand: leicht beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 700 )
    {
    format(string, sizeof(string),"Zustand: beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 500 )
    {
    format(string, sizeof(string),"Zustand: stark beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 300 )
    {
    format(string, sizeof(string),"Zustand: Motorschaden");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(JobInfo[playerid][Hjob] == 5 && JobInfo[playerid][Jobactive] == 1)
    {
    return 1;
    }
    else
    {
    TogglePlayerControllable(playerid, 0);
    GameTextForPlayer(playerid,"Du bist eingeklemmt!~n~Die ~r~Feuerwehr kann dich befreien.", 4000, 5);
    }
    }
    }
    return 1;
    }


    OnGameModeInit:


    Tachotimer = SetTimer("Tacho", 1000, true);


    Funktionieren tut garnichts, Ig wird kein string an das Textdraw gesendet ;(

    :rolleyes:

    3 Mal editiert, zuletzt von samu ()

  • // GELÖSCHT


    So aktueller Stand:


    public Tacho()
    {
    printf("Timer work ...");
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    new statee = GetPlayerState(i);
    if(IsPlayerInAnyVehicle(i) && statee == PLAYER_STATE_DRIVER)
    {
    new car = GetPlayerVehicleID(i);
    new Float:CarHealth;
    GetVehicleHealth(car, CarHealth);
    new string[30];
    if(CarHealth == 1000)
    {
    format(string, sizeof(string),"Zustand: ~g~unbeschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 950 )
    {
    format(string, sizeof(string),"Zustand: ~y~leicht beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 700 )
    {
    format(string, sizeof(string),"Zustand: ~y~beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 500 )
    {
    format(string, sizeof(string),"Zustand: ~r~stark beschaedigt");
    TextDrawSetString(Tachoanzeige, string);
    }
    if(CarHealth <= 300 )
    {
    format(string, sizeof(string),"Zustand: ~r~Motorschaden");
    TextDrawSetString(canzeige, string);
    }
    if(JobInfo[i][Hjob] == 5 && JobInfo[i][Jobactive] == 1)
    {
    return 1;
    }
    else
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(i, x, y, z);
    CreateExplosion(x, y, z, 12, 3.0);
    TogglePlayerControllable(i, 0);
    GameTextForPlayer(i,"Du bist eingeklemmt!~n~Die ~r~Feuerwehr kann dich befreien.", 4000, 5);
    }
    }
    }
    return 1;
    }


    Ich versteh es einfach nich, hab einen simplen Timer gemacht der bei OnGameModeInit startet, am Anfang ne for schleife rein, aber nie geht das, wenn ich normal playerid verwende gehts, warum funktioniert das nicht ?( :pinch:

    :rolleyes:

    5 Mal editiert, zuletzt von samu ()