Prisonzeit als PVar

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
  • Guten Abend Community,


    Ich habe einen /prison befehl der ein bisschen komplexer ist.


    Sieht wie folgt aus:
    ocmd:prison(playerid,params[])
    {
    if(isPlayerAnAdmin(playerid, 5))
    {
    new pID, string[128], Zeit, Grund[50];
    new name[MAX_PLAYER_NAME];
    new pName[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    GetPlayerName(playerid,pName,sizeof(pName));

    if(sscanf(params,"uds",pID,Zeit,Grund))return SendClientMessage(playerid,-1,"{FF3034}Server: {FFFFFF}/unprison [Id/Name][Zeit][Grund]");
    {
    format(string, sizeof(string), "%s hat %s zum Prison teleportiert für %d Minuten. Grund: %s",name, pName, Zeit, Grund);
    SendClientMessageToAll(COLOR_RED,string);
    SetPVarInt(pID, "Prisonzeit", 0+Zeit);
    }
    }
    else return SendClientMessage(playerid, color_yellow, "{FF0000}SERVER: {FFFF00}Du darfst diesen Befehl nicht benutzen!");
    return 1;
    }


    Wo frage ich jetzt am besten die PVar ab bzw, wie Setzte ich am besten den Timer, und wie wird alles gespeichert, damit der Spieler sich nicht ausloggen kann?


    Was würdet ihr mir raten?
    Danke im vorraus.


    Mit freundlichen Grüßen,
    TheFirstRush

  • SetPVarInt(pID, "Prisonzeit", 0+Zeit);
    kannst du zu
    SetPVarInt(pID, "Prisonzeit", Zeit);
    machen.



    Wie speicherst du denn allgemein deine Statistiken? Post das mal.



    Aus dem Gefängnis kannst du ihn am besten über einen globalen Timer holen, der alle Spieler prüft.

  • Genau. Und so wie du die anderen Sachen lädst, auch die Zeit wieder laden.
    Wenn es größer als 0 beim Spawn ist, setzt du ihn wieder in den Knast.


    Bei OnGameModeInit machst du einen globalen Timer:
    SetTimer("CheckUnjail", 30000, 1);


    forward CheckUnjail();
    public CheckUnjail()
    {
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(GetPVarInt(i,"Prisonzeit") <= 0)
    {
    //unjail hier (playerid ist i)
    }
    else SetPVarInt(i,"Prisonzeit", GetPVarInt(i,"Prisonzeit")-1);
    }
    return 1;
    }

  • Auch hier bietet es sich, wie so oft, an mit Timestamps zu arbeiten, dann muss die PVar nicht jede Sekunde neu bearbeitet werden.
    So setzt du die Variable also zum Anfang einfach nur noch auf "timestamp"+Zeit (in ms) und fragst in deinem Callback ab, ob die aktuelle Zeit schon erreicht bzw überschritten wurde.
    Loggt sich der Spieler aus, wird die abgesessene Differenz subtrahiert und beim Login eine neue, subtrahierte Zeit hinzugefügt.


    Mein CS:GO Server: 62.75.168.39:27016


    Ich bin so hungrig, dass ich vor lauter Durst nicht weiß, was ich rauchen soll - so müde bin ich!
    Freedom is just another word for 'Nothing left to lose'

  • LeijaT: Ich habe keine Ahnung was ein Timestamp ist :/ Sorry... Wie sähe dann sowas etwa aus? Kannst du mir grob ein Beispiel geben?


    Jeffrey: Der Timer für CheckUnjail ist ja auf 30000 gestellt aber sind das nicht 30 sekunden?
    wenn ja, warum soll dann nach 30 Sekunden - 1 von Prisonzeit abgezogen werden?



    #Edit: Habe den CheckUnjail Timer auf 60000 gesetzt
    SetTimer("CheckUnjail", 60000, 1);





    Bin so gesehen schon Erfahren, weis aber auch nicht alles :) Das was ich nicht weis, möchte ich von euch lernen :) Script @ 2911 Zeilen GM+ 430 Zeilen FS1 + 414 Zeilen FS2

  • Habe es jetzt so gemacht:
    OnGameModeInit
    SetTimer("CheckUnjail", 60000, 1);


    OnPlayerSpawn
    new pZeit;
    pZeit = GetPVarInt(playerid,"Prisonzeit");
    if(pZeit>0)
    {
    SetPlayerPos(playerid,2144.1353, 1638.1118, 993.6439);
    SetPlayerInterior(playerid,1);
    ResetPlayerWeapons(playerid);
    SetTimerEx("Unprison",pZeit,false,"i",playerid);
    }