Knast - Relogg - schlechte Kombi ;(

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,


    also ich möchte, wenn der spieler für 5min arrestet wurde, und bereits 1min abgessessen hat, und nachher wieder on kommt, das er dann nurnoch 4min im Knast sein muss.
    Das is fail.
    Wenn er reloggt, spawnt er ganz normal.


    Hier meine CMDS:


    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);
    KnastTimerx = SetTimerEx("KnastTimer", Time*1000*60, false,"d",pID);
    SetPlayerPos(pID,215.4654,110.5644,999.0156);
    SetPlayerWantedLevel(pID,0);
    if(SpielerInfo[pID][pFraktion] == 0 || SpielerInfo[pID][pLeader] == 0)
    {
    SetPlayerColor(pID, FARBE_WEISS);
    }


    if(SpielerInfo[pID][pFraktion] == 1 || SpielerInfo[pID][pLeader] == 1)
    {
    SetPlayerColor(pID, FARBE_DUNKELGRÜN);
    }


    if(SpielerInfo[pID][pFraktion] == 2 || SpielerInfo[pID][pFraktion] == 2)
    {
    SetPlayerColor(pID, FARBE_BRAUN);
    }


    if(SpielerInfo[pID][pFraktion] == 3 || SpielerInfo[pID][pFraktion] == 3)
    {
    SetPlayerColor(pID, FARBE_DUNKELROT);
    }


    if(SpielerInfo[pID][pFraktion] == 4 || SpielerInfo[pID][pLeader] == 4)
    {
    SetPlayerColor(pID, FARBE_PINK);
    }


    if(SpielerInfo[pID][pFraktion] == 5 || SpielerInfo[pID][pLeader] == 5)
    {
    SetPlayerColor(pID, FARBE_LILA);
    }


    if(SpielerInfo[pID][pFraktion] == 6 || SpielerInfo[pID][pLeader] == 6)
    {
    SetPlayerColor(pID, FARBE_BLAU);
    }
    if(SpielerInfo[pID][pFraktion] == 7 || SpielerInfo[pID][pLeader] == 7)
    {
    SetPlayerColor(pID, FARBE_GRÜN);
    }
    if(SpielerInfo[pID][pFraktion] == 8 || SpielerInfo[pID][pLeader] == 8)
    {
    SetPlayerColor(pID, FARBE_ROT);
    }


    if(SpielerInfo[pID][pFraktion] == 9 || SpielerInfo[pID][pLeader] == 9)
    {
    SetPlayerColor(pID, FARBE_GELB);
    }
    SpielerInfo[pID][pKnast] = 1;
    SpielerInfo[pID][pZeit] = Time;
    MinTimerx = SetTimerEx("MinTimer",1000*60, false, "d", pID);
    return 1;
    }


    OnPLayerDisconnect:
    KillTimer(KnastTimerx);
    SpielerInfo[playerid][pKnast] = 2;
    SpielerInfo[playerid][pDifferenzZeit] = SpielerInfo[playerid][pZeit] - SpielerInfo[playerid][pMinZeit];


    OnPlayerSpawn:
    if(SpielerInfo[playerid][pKnast] == 2)
    {
    SetPlayerPos(playerid, 215.4654,110.5644,999.0156 );
    SetPlayerInterior(playerid,10);
    SetTimerEx("KnastTimer2", SpielerInfo[playerid][pDifferenzZeit], false, "d",playerid);
    return 1;
    }


    Timer:


    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;
    }


    forward KnastTimer2(playerid);
    public KnastTimer2(playerid)
    {
    SendClientMessage(playerid, FARBE_HELLBLAU, "Du wurdest aus dem Knast entlassen !");
    SpielerInfo[playerid][pKnast] = 0;
    return 1;
    }


    regards


    //edit pwn zeilen

    Einmal editiert, zuletzt von iAIR ()

  • ´Das musst du dann in einer Datei speichern, wenn er offline geht, wird abgefragt, wie lange er schon gesessen hat und dass wird dann in seine SpielerDatei eingetragen.


    Und dann wenn er on kommt, wird abfragt aus der Datei, ob die Knastzeit über 0 ist, wenn ja, wird er %d lange eingesperrt. %d = Dann der Wert der in der Datei steht bzw. ausgelesen wird.


    PS: Brauche Hilfe hierbei, wenn mir einer helfen könnte :)
    Rotation des Spielers für CreateObject und MoveObject, wie ?


    MfG
    MrS.

  • if(SpielerInfo[playerid][pKnast] == 2)


    Dass muss heißen:
    if(SpielerInfo[playerid][pKnast] == 1)


    Denn, du hast ja die Variable, 0 oder 1 --- Nein oder Ja.



    Und wenn du Knast auf 2 machst, also abfragst, dann sagt er, geht nicht, gibts nicht, und amch weiter.


    Also mach das auf 1, dann wird er eingeknastet nach dem Relog, wenn er vorher im Knast war.


    MfG
    MrS.

  • klar kann ich die variablen höher als 1 setzten ..
    pKnast = 1 ist bei mir der normale knast.
    pKnast = 2 soll der Knast sein, nachdem er reloggt hat

  • Wieso speicherst du das er im Knast ist in seiner Spielerdatei und liest es dann bei OnPlayerSpawn wieder aus?


    Wenn der Spieler laut seiner Spielerdatei noch im Knast ist, steckst du ihn einfach in den Knast 2

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Ok schön und gut soweit.
    Nur was hat das für einen Sinn:
    SpielerInfo[playerid][pKnast] = 2;
    SpielerInfo[playerid][pDifferenzZeit] = SpielerInfo[playerid][pZeit] - SpielerInfo[playerid][pMinZeit];
    Ok wenn du dich reloggst ohne GMX und wieder die gleiche ID hast dann müsste es klappen aber im späteren Verlauf werden andere statt dir in den Knast kommen.
    Daher speicher beim Disconnecten die Variablen in die Spielerdatei ab und lade sie beim connecten wieder in die Variablen.
    Dann nicht vergessen das nach dem speichern die Variablen zu leeren sonst kommen andere Spieler statt dir in den Knast.
    Wenn du es nicht schaffst, dann schick mal die Codes wo der Acc gespeichert und geladen wird.

  • Gut,


    danke für deine Antwort, im groben verstehe ich schon was du meinst, das schätze ich sehr.


    Nur leider funkioniert es bei mir bei der umsetztung nicht.



    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    new Name[MAX_PLAYER_NAME],path[64];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    format(path, sizeof(path),"/Spieler/%s.ini", Name);
    SpielerInfo[playerid][pScore] = dini_Int(path, "Level");
    SpielerInfo[playerid][pAdmin] = dini_Int(path, "Admin");
    SpielerInfo[playerid][pKnast] = dini_Int(path, "Knast");
    SpielerInfo[playerid][pMinZeit] = dini_Int(path, "MinZeit");
    SpielerInfo[playerid][pZeit] = dini_Int(path, "Zeit");
    SpielerInfo[playerid][pDifferenzZeit] = dini_Int(path, "DifferenzZeit");
    SpielerInfo[playerid][pTutorial] = dini_Int(path, "Tutorial");
    SpielerInfo[playerid][pFraktion] = dini_Int(path, "Fraktion");
    SpielerInfo[playerid][pGeld] = dini_Int(path, "Geld");
    SpielerInfo[playerid][pLeader] = dini_Int(path, "Leader");
    SpielerInfo[playerid][pRang] = dini_Int(path, "Rang");
    SpielerInfo[playerid][pContract] = dini_Int(path, "Contract");
    SpielerInfo[playerid][pContractGeld] = dini_Int(path, "ContractGeld");
    SpielerInfo[playerid][pTazed] = dini_Int(path, "Tazed");
    SpielerInfo[playerid][pHaus] = dini_Int(path, "Haus");
    }
    return 1;
    }


    stock SavePlayer(playerid)
    {
    if(GetPVarInt(playerid, "Eingeloggt") == 1)
    {
    new Name[MAX_PLAYER_NAME],path[64];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    format(path, sizeof(path),"/Spieler/%s.ini", Name);
    dini_IntSet(path,"Level", SpielerInfo[playerid][pScore]);
    dini_IntSet(path,"Admin", SpielerInfo[playerid][pAdmin]);
    dini_IntSet(path,"Knast",SpielerInfo[playerid][pKnast]);
    dini_IntSet(path, "MinZeit", SpielerInfo[playerid][pMinZeit]);
    dini_IntSet(path, "Zeit", SpielerInfo[playerid][pZeit]);
    dini_IntSet(path, "DifferenzZeit", SpielerInfo[playerid][pDifferenzZeit]);
    dini_IntSet(path, "Tutorial", SpielerInfo[playerid][pTutorial]);
    dini_IntSet(path, "Fraktion",SpielerInfo[playerid][pFraktion]);
    dini_IntSet(path, "Contract", SpielerInfo[playerid][pContract]);
    dini_IntSet(path, "ContractGeld", SpielerInfo[playerid][pContractGeld]);
    dini_IntSet(path,"Geld", SpielerInfo[playerid][pGeld]);
    dini_IntSet(path,"Leader", SpielerInfo[playerid][pLeader]);
    dini_IntSet(path,"Rang", SpielerInfo[playerid][pRang]);
    dini_IntSet(path,"Tazed", SpielerInfo[playerid][pTazed]);
    dini_IntSet(path,"Haus", SpielerInfo[playerid][pHaus]);
    }
    return 1;
    }


    regards

  • Dann nicht vergessen das nach dem speichern die Variablen zu leeren sonst kommen andere Spieler statt dir in den Knast.


    Das wäre aber unnötig, wenn er die Variablen gleich beim einloggen überschreibt ;)


    @iAIR
    Wie wäre es jetzt mit dem prüfen in OnPlayerSpawn ob er im Knast ist und ihn dann dahin setzen?

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • hab ich so:


    if(SpielerInfo[playerid][pKnast] == 2)
    {
    SetPlayerPos(playerid, 215.4654,110.5644,999.0156 );
    SetPlayerInterior(playerid,10);
    SetTimerEx("KnastTimer2", SpielerInfo[playerid][pDifferenzZeit], false, "d",playerid);
    return 1;
    }

  • Versuch es so:
    Hoffe ich habe nichts wesentliches übersehen, bin mit den Gedanken wo anders :)


    OnPlayerDisconnect(playerid)
    {
    SpielerInfo[playerid][pZeit]=0;
    return 1;
    }


    stock LoadPlayer(playerid)
    {
    if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
    {
    new Name[MAX_PLAYER_NAME],path[64];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    format(path, sizeof(path),"/Spieler/%s.ini", Name);
    SpielerInfo[playerid][pScore] = dini_Int(path, "Level");
    SpielerInfo[playerid][pAdmin] = dini_Int(path, "Admin");
    SpielerInfo[playerid][pKnast] = dini_Int(path, "Knast");
    SpielerInfo[playerid][pMinZeit] = dini_Int(path, "MinZeit");
    SpielerInfo[playerid][pZeit] = dini_Int(path, "Zeit");
    SpielerInfo[playerid][pDifferenzZeit] = dini_Int(path, "DifferenzZeit");
    SpielerInfo[playerid][pTutorial] = dini_Int(path, "Tutorial");
    SpielerInfo[playerid][pFraktion] = dini_Int(path, "Fraktion");
    SpielerInfo[playerid][pGeld] = dini_Int(path, "Geld");
    SpielerInfo[playerid][pLeader] = dini_Int(path, "Leader");
    SpielerInfo[playerid][pRang] = dini_Int(path, "Rang");
    SpielerInfo[playerid][pContract] = dini_Int(path, "Contract");
    SpielerInfo[playerid][pContractGeld] = dini_Int(path, "ContractGeld");
    SpielerInfo[playerid][pTazed] = dini_Int(path, "Tazed");
    SpielerInfo[playerid][pHaus] = dini_Int(path, "Haus");
    SpielerInfo[playerid][pKnast] = dini_Int(path, "Knaststatus");
    SpielerInfo[playerid][pDifferenzZeit] = dini_Int(path, "KnastDifferenzZeit");
    }
    return 1;
    }
    stock SavePlayer(playerid)
    {
    if(GetPVarInt(playerid, "Eingeloggt") == 1)
    {
    new Name[MAX_PLAYER_NAME],path[64];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    format(path, sizeof(path),"/Spieler/%s.ini", Name);
    dini_IntSet(path,"Level", SpielerInfo[playerid][pScore]);
    dini_IntSet(path,"Admin", SpielerInfo[playerid][pAdmin]);
    dini_IntSet(path,"Knast",SpielerInfo[playerid][pKnast]);
    dini_IntSet(path, "MinZeit", SpielerInfo[playerid][pMinZeit]);
    dini_IntSet(path, "Zeit", SpielerInfo[playerid][pZeit]);
    dini_IntSet(path, "DifferenzZeit", SpielerInfo[playerid][pDifferenzZeit]);
    dini_IntSet(path, "Tutorial", SpielerInfo[playerid][pTutorial]);
    dini_IntSet(path, "Fraktion",SpielerInfo[playerid][pFraktion]);
    dini_IntSet(path, "Contract", SpielerInfo[playerid][pContract]);
    dini_IntSet(path, "ContractGeld", SpielerInfo[playerid][pContractGeld]);
    dini_IntSet(path,"Geld", SpielerInfo[playerid][pGeld]);
    dini_IntSet(path,"Leader", SpielerInfo[playerid][pLeader]);
    dini_IntSet(path,"Rang", SpielerInfo[playerid][pRang]);
    dini_IntSet(path,"Tazed", SpielerInfo[playerid][pTazed]);
    dini_IntSet(path,"Haus", SpielerInfo[playerid][pHaus]);
    dini_IntSet(path,"Knaststatus", SpielerInfo[playerid][pKnast]);
    dini_IntSet(path,"KnastDifferenzZeit", SpielerInfo[playerid][pDifferenzZeit]);
    }
    return 1;
    }

  • versteh ich nicht wieso du die KnastZeit auf 0 setzt . :D


    Bei mir ist Knast: ob der spieler im knast ist
    MinZeit: wv. minuten der spieler bereits im knast ist
    Zeit: für wv. min der spieler arrestet wurde


    regards

  • Ja das hab ich auch bemerkt.
    Du verwendest die Variable pZeit nur zu dem Zeitpunkt wo er eingesperrt wird.
    Wenn er aber reloggt wird nur die Zeit benötigt die er noch absitzen muss.
    Daher wird die Gesamtzeit nicht mehr benötigt.
    Deswegen wird sie auch nicht gespeichert und gelöscht.
    Wenn er jetzt Connected wird die Zeit ausgelesen die er noch absitzen muss und wird in das Knast gesteckt und der Timer wird gestartet.


    Ich hoffe ich erklär es verständlich.

  • ok gut danke.


    Erklärts gut :D


    letzte frage, (hoffe ich).


    KillTimer(KnastTimerx);
    SpielerInfo[playerid][pKnast] = 2;
    SpielerInfo[playerid][pDifferenzZeit] = SpielerInfo[playerid][pZeit] - SpielerInfo[playerid][pMinZeit];


    kann ich das wegmachen bei OnPlayerDisconnect ?


    regards

  • Nein sonst passiert folgendes:
    Der Timer läuft weiter obwohl der User nicht mehr Online ist.
    Und es würden dann als pKnast die Zahl 1 gespeichert werden und nicht 2.
    Und die Zeit die er beim wieder einloggen absitzen muss wäre dann gleich 0.
    Weil die Variable "SpielerInfo[playerid][pDifferenzZeit]" dann keinen Wert hätte.


    Wichtig ist noch das du diese Zeilen vor dem Speichern ausführst.


    Hoffe es funktioniert^^

  • Nach Relogg, kommt der Spieler nicht mehr aus dem Knast nach der abgelaufenen zeit.


    regards


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


    regards


    /edit:
    forward MinTimer(pID);
    public MinTimer(pID)
    {
    new Hour, Minute, Second;
    gettime(Hour, Minute, Second);
    if(Hour == 0 && Minute == 1 && Second == 0)
    {
    SpielerInfo[pID][pMinZeit] = SpielerInfo[pID][pMinZeit] +1;
    return 1;
    }

    else if(SpielerInfo[pID][pZeit] == SpielerInfo[pID][pMinZeit])
    {
    KillTimer(MinTimerx);
    }
    return 1;
    }

  • Wird garnichts angezeigt oder läuft einfach was falsch wenn ja was?
    Was bekommst angezeigt?
    Ok sehe da weitere Fehler:

    forward MinTimer(pID);
    public MinTimer(pID)
    {
    SpielerInfo[pID][pMinZeit] += 1;
    if(SpielerInfo[pID][pZeit] == SpielerInfo[pID][pMinZeit])
    {
    KillTimer(MinTimerx);
    }
    return 1;
    }
    Was wolltest du mit der Abfrage bewirken?
    Denn gettime gibt dir die aktuelle Zeit aus.
    Das bedeutet du würdest nur um 00:01 eine Minute dazu bekommen.
    Das heißt einmal am Tag :)


    if(SpielerInfo[playerid][pKnast] == 2)
    {
    SetPlayerPos(playerid, 215.4654,110.5644,999.0156 );
    SetPlayerInterior(playerid,10);
    SetTimerEx("KnastTimer2", SpielerInfo[playerid][pDifferenzZeit]*60*1000, false, "d",playerid);
    return 1;
    }
    Das hast du beim Spawn drinnen.
    Nur muss man bei einem Timer immer die Zeit in Millisekunden angeben und du hattest es in Minuten.
    Daher rechnen wir die Zeit * 60 um Sekunden zu erhalten und rechnen diesen Wert *1000 um auf Millisekunden zu kommen.


    mfg.
    Opa