Knast durch Relogg umgangen

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


    bei mir tritt folgendes Problem auf:
    Der Befehl /einsperren funkioniert super.
    Doch allerdings ist es leider so, wenn der Spieler reloggt, wird der Timer "KnastTimer" nicht abgerufen und die Variable Knast bleibt ewig auf 1.


    enum SpielerDaten
    {
    pScore,
    pAdmin,
    pGeld,
    pKnast,
    pFraktion,
    pLeader,
    pRang,
    pTazed,
    pContract,
    pContractGeld,
    pHaus


    }



    ocmd:einsperren(playerid,params[])
    {
    new pID,Time,MSG[150],MSGToAll[225];
    if(SpielerInfo[playerid][pFraktion] != 6)return SendClientMessage(playerid,FARBE_ROT,"Du bist kein Polizist !");
    if(!IsPlayerInRangeOfPoint(playerid,2.0,221.9013,121.0338,999.0294))return SendClientMessage(playerid,FARBE_ROT, "Du bist nicht am Arrest-Point !");
    if(sscanf(params,"ui", pID,Time))return SendClientMessage(playerid, FARBE_GRAU, "Fehler: /einsperren [Username/ID] [Zeit in MIN]");
    if(GetPlayerWantedLevel(pID == 0))return SendClientMessage(playerid,FARBE_ROT,"Error: Du kannst nur Wanteds einsperren!");
    if(!GetDistanceBetweenPlayers(playerid,pID,25))return SendClientMessage(playerid,FARBE_ROT,"Error: Der Spieler ist nicht in deiner Nähe !");
    format(MSG,sizeof(MSG),"Du wurdest von Officer %s für %i Minuten in den Knast gesteckt!", SpielerName(playerid), Time);
    SendClientMessage(pID,FARBE_HELLBLAU, MSG);
    format(MSGToAll,sizeof(MSGToAll), "** %s wurde von Officer %s in den Knast gesteckt **",SpielerName(pID),SpielerName(playerid));
    SendClientMessageToAll(FARBE_ROT, MSGToAll);
    SetTimerEx("KnastTimer", Time*1000*60, false,"d",pID);
    SetPlayerPos(pID,215.4654,110.5644,999.0156);
    SpielerInfo[pID][pKnast] = 0;
    return 1;
    }


    forward KnastTimer(pID);
    public KnastTimer(pID)
    {
    SetPlayerPos(pID,221.9013,121.0338,999.0294);
    SendClientMessage(pID,FARBE_HELLBLAU, "Du wurdest aus dem Knast entlassen !");
    SpielerInfo[pID][pKnast] = 0;
    return 1;
    }


    OnPlayerSpawn
    if(SpielerInfo[playerid][pKnast] == 1)
    {
    SetPlayerPos(playerid, 215.4654,110.5644,999.0156 );
    SetPlayerInterior(playerid, 10);
    SendClientMessage(playerid, FARBE_ROT, "Du hast deine Knastzeit noch nicht abgesessen !");
    return 1;
    }


    Sprich,
    Spieler wird in knast gesteckt, er reloggt, dann wird der timer nicht mehr abgerufen, er bleibt ganze zeit im knast ;(


    regards,
    iAIR

  • Bitte gib mir ein Beispiel,


    mein Kopf ist heut kaputt gegangen.


    regards

  • Hm was mir gerade nur direkt ins Auge sticht, vielleicht liegt es daran


    ocmd:einsperren(playerid,params[])
    {
    new pID,Time,MSG[150],MSGToAll[225];
    if(SpielerInfo[playerid][pFraktion] != 6)return SendClientMessage(playerid,FARBE_ROT,"Du bist kein Polizist !");
    if(!IsPlayerInRangeOfPoint(playerid,2.0,221.9013,121.0338,999.0294))return SendClientMessage(playerid,FARBE_ROT, "Du bist nicht am Arrest-Point !");
    if(sscanf(params,"ui", pID,Time))return SendClientMessage(playerid, FARBE_GRAU, "Fehler: /einsperren [Username/ID] [Zeit in MIN]");
    if(GetPlayerWantedLevel(pID == 0))return SendClientMessage(playerid,FARBE_ROT,"Error: Du kannst nur Wanteds einsperren!");
    if(!GetDistanceBetweenPlayers(playerid,pID,25))return SendClientMessage(playerid,FARBE_ROT,"Error: Der Spieler ist nicht in deiner Nähe !");
    format(MSG,sizeof(MSG),"Du wurdest von Officer %s für %i Minuten in den Knast gesteckt!", SpielerName(playerid), Time);
    SendClientMessage(pID,FARBE_HELLBLAU, MSG);
    format(MSGToAll,sizeof(MSGToAll), "** %s wurde von Officer %s in den Knast gesteckt **",SpielerName(pID),SpielerName(playerid));
    SendClientMessageToAll(FARBE_ROT, MSGToAll);
    SetTimerEx("KnastTimer", Time*1000*60, false,"d",pID);
    SetPlayerPos(pID,215.4654,110.5644,999.0156);
    SpielerInfo[pID][pKnast] = 0; // vielleicht auf SpielerInfo[pID][pKnast] = 1; setzen
    return 1;
    }

    Verkaufe FREEROAM/DM/STUNT/MISSION vollständige Gamemodes Billig
    -> Melden per PN

  • Machen wir dein Kopf mal an



    • Wie soll dein Script wissen wie lange der User nach einem Relog noch im knast sein muss?
    • Wie kann die Zeit ablaufen wenn beim Spawn garkein Timer gestartet wird?
    • Ist dein Kopf wieder an?
  • Ja, das Problem ist ja, ich weiß ja das das Script garnet wissen kann das ein Timer gesatartet wird, da ich keinen ersteltl habe.


    aber wie soll ich das abfragen, ich weiß einfach keine Lösung.


    Gebt mir mal ein Beispiel.


    regards

  • Wie schon gesagt musst du zuerst rausfinden, wie lange der Spieler im Knast sein muss.


    // Bei /einsperren
    SetPVarInt(pID,"KnastZeit",Time*1000*60);
    SetPVarInt(pID,"KnastStart",gettime()); //Damit speicherst du den aktuellen Unix-Zeitstempel ab.

    Die PVars kannst du beim Entlassen wieder löschen.
    Beim disconnecten findest du nun raus, wie lange der Spieler im Knast war:
    new dauer = gettime() - GetPVarInt(pID,"KnastStart"); //Damit findest du raus, wie lange der Spieler im Knast war
    new restliche_zeit = GetPVarInt(pID,"KnastZeit") - dauer; //Die Zeit, die er im Knast war, wird jetzt von der gesamt-Zeit abgezogen - du weißt nun wie lange er noch im Knast bleiben muss

    Den Wert musst du dann nurnoch abspeichern. Beim Spawn startest du dann einen Timer.

  • wofür KnastStart abspeichern, wenn ich eh auto. KnastZeit berechne, ich bin wohl zu dumm ^^

  • KnastZeit ist nur die komplette Zeit, die er absitzen muss. Wenn KnastZeit 10 Minuten sind, und der Spieler nach 5 Minuten offline geht, dann musst du ja irgendwie rausfinden wie lange der Spieler im Knast war. Das findest du raus, indem du über gettime() dir den Zeitstempel speicherst, und ihn beim offline gehen mit dem aktuellen vergleichst. Dadurch findest du raus, wie viele Sekunden der Spieler im Knast war. Diese ziehst du dann von der KnastZeit (10 Minuten) ab, und weißt, wie lange der Spieler noch im Knast bleiben musst.

  • So ich speicher jetzt pKnastZeit und pKnastStart.


    Dann hab ich bei einsperren, dass jetzt hinzugefügt:
    SpielerInfo[pID][pKnastZeit] = Time*1000*60;
    SpielerInfo[pID][pKnastStart] = gettime();



    dann bei OnPlayerDisconnect:

    new pID;
    new dauer = gettime() - SpielerInfo[pID][pKnastStart];
    new restliche_zeit = SpielerInfo[pID][pKnastZeit] - dauer;


    was soll ich noch machen?


    sry aber ich steh gerade voll auf der Leitung.


    regards