Settimerex 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
  • Hallo ich habe folgendes Problem:
    wenn ich /robbank eingebe muss man 95 sekunden warten und dann raubt man geld aus.. (soweit alles richtig)


    manchmal aber
    sobald die 95 sekunden vorbei sind raubt er jede Sekunde Geld.
    und wenn man denn punkt verlässt steht da die ganze zeit der in eine Gamemodtext "Du hast den Punktverlassen"


    Ich danke mal das lingt an dem Settimer der wird die ganze zeit ausgefürt



    RobBankTimer = SetTimerEx("RobBank",1000,true,"i",playerid);



    es ist eine entlosschleife weil ich glaube der Timer wird nicht gekillt
    eine frage aber jetzt warum?


    Code


    if(strcmp(cmd, "/robbank", true) == 0)
    {
    new success = random(2);
    if(success == 1)
    {
    SendClientMessage(playerid, COLOR_ORANGE, "* Du raubst jetzt die Bank aus, bitte bleibe für 95 sekunden im Checkpoint!");
    RobbingTime[playerid] = 95;
    RobBankTimer = SetTimerEx("RobBank",1000,true,"i",playerid);
    WantedPoints[playerid] += 4;
    PlayerInfo[playerid][pWanted] = 1;
    SetPlayerCriminal(playerid,255, "Robbing Bank");
    PlayerInfo[playerid][pRobTime] = 900;
    CityHallRobbedRecently = 1;
    SetTimer("UnsetBankRob",1500000,false);
    OnePlayAnim(playerid, "SHOP", "ROB_Shifty", 4.0, 0, 0, 0, 0, 0);
    }
    else
    {
    SendClientMessage(playerid, COLOR_ORANGE, "* Du hast es nicht geschaft die Bank auszurauben!");
    WantedPoints[playerid] += 4;
    SetPlayerCriminal(playerid,255, "Versuchte die Bank auszurauben");
    PlayerInfo[playerid][pRobTime] = 500;
    }
    return 1;
    }



    forward RobBank(playerid);


    new RobBankTimer;



    public RobBank(playerid)
    {
    new string[128];
    if(IsPlayerInRangeOfPoint(playerid, 2, 2309.6060,-4.0211,26.7422))
    {
    if(RobbingTime[playerid] > 0)
    {
    RobbingTime[playerid] --;
    GameTextForPlayer(playerid, "~w~Bleibe im ~r~Pickup ~w~bis die Zeit endet!", 1000,4);
    }
    else
    {
    RobbingTime[playerid] = 0;
    KillTimer(RobBankTimer);
    new money = random(2500);
    SafeGivePlayerMoney(playerid, money);
    format(string, sizeof(string),"~w~Du klaust ~g~$%d ~w~aus der ~y~Bank!", money);
    GameTextForPlayer(playerid, string, 6000, 4);
    format(string, sizeof(string),"* Du klaust $%d aus der Bank!",money);
    SendClientMessage(playerid, COLOR_GREY, string);
    WantedPoints[playerid] += 14;
    PlayerInfo[playerid][pWanted] = 1;
    SetPlayerCriminal(playerid,255, "Robbing Bank");
    }
    }
    else
    {
    GameTextForPlayer(playerid, "~w~Du hast den Checkpoint verlasssen!", 1000,4);
    RobbingTime[playerid] = 0;
    KillTimer(RobBankTimer);


    }
    }



    mfg JoJu_RED ;)

  • Du brauchst denn Timer eigentlich nicht killen...
    mach einfach nur von dies:
    RobBankTimer = SetTimerEx("RobBank",1000,true,"i",playerid);
    zu dies:
    SetTimerEx("RobBank",1000,false,"i",playerid);


    Das true oder false bedeutet ob der Timer wiederholt werden soll. Deswegen False für 0 und somit keine Wiederholung.
    Somit läuft der Timer nur 1 mal durch.


    MFG

  • das weis ich ja auch aber er muss sich ja wiederholen weil es läuft ja noch ein 2ter timer
    ( RobbingTime[playerid] = 95; )


    der SettimerEx soll ja abfragen ob die RobbingTime abgelaufen ist und wenn es nur einmal durchläuft ginge es ja nicht



    if(RobbingTime[playerid] > 0)
    {
    RobbingTime[playerid] --;
    GameTextForPlayer(playerid, "~w~Bleibe im ~r~Pickup ~w~bis die Zeit endet!", 1000,4); //bis der " RobbingTime[playerid] = 95; " abgelaufen ist
    }


    //EDIT vlt den Timer so? weis es aber nicht genau nur sone überlegung " KillTimer(RobCityHallTimer[playerid]); "

    Einmal editiert, zuletzt von JoJu_RED ()

  • deine überlegung ist schon richtig, da du ja bei mehreren spielern mehrere timer erstellst, reicht eine einfache variable nicht mehr aus, um die verschiedenen timerIDs zu speichern.
    (deshalb werden die timer auch machmal nicht beendet).
    allerdings ist das script insgesamt nicht besonders gut, geht elegeanter:



    //oben
    #define BANK_ROB_SECONDS (90)


    // "/robbank"
    //blabla
    TogglePlayerControllable(playerid, 0);
    SetTimerEx("EndBankRob", BANK_ROB_SECONDS*1000, false, "i", playerid);
    //
    public EndBankRob(playerid)
    {
    TogglePlayerControllable(playerid, 1);
    new rand=random(2);
    if(rand)
    {
    //erfolgreich...
    }
    else
    {
    //nicht erfolgreich...
    }
    return 1;
    }

    Keine Scripting-Fragen per PM!