AutoAFK System

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
  • #define AUTO_AFK_CHECK_INTERVAL 5000


    new AutoAFK_Detected[MAX_PLAYERS],
    PlayerPos_Before[MAX_PLAYERS],
    PlayerPos_Now[MAX_PLAYERS];


    new AutoAFK_Timer[MAX_PLAYERS];


    //=============================================================================================================================================================================================================================================================


    public OnGameModeInit()
    {
    SetTimer("AutoAFK_Check", AUTO_AFK_CHECK_INTERVAL, true);
    return AA_OnGameModeInit();
    }


    forward AA_OnGameModeInit();
    #if defined _ALS_OnGameModeInit
    #undef OnGameModeInit
    #else
    #define _ALS_OnGameModeInit
    #endif
    #define OnGameModeInit AA_OnGameModeInit


    //=============================================================================================================================================================================================================================================================


    public OnPlayerSpawn(playerid)
    {
    new Float:X, Float:Y, Float:Z;
    PlayerPos_Before[playerid] = GetPlayerPos(playerid, X, Y, Z); //Für den ersten Spawn, damit es einen Vergleichswert hat.
    return AA_OnPlayerSpawn(playerid);
    }


    forward AA_OnPlayerSpawn(playerid);
    #if defined _ALS_OnPlayerSpawn
    #undef OnPlayerSpawn
    #else
    #define _ALS_OnPlayerSpawn
    #endif
    #define OnPlayerSpawn AA_OnPlayerSpawn


    //=============================================================================================================================================================================================================================================================


    forward AutoAFK_Processed(playerid);
    public AutoAFK_Processed(playerid)
    {
    CallLocalFunction("StartAFK", "i", playerid); //Wenn 15min vorbei sind, dann setze den Spieler in den AFK Modus.
    return 1;
    }


    //=============================================================================================================================================================================================================================================================


    forward AutoAFK_Check();
    public AutoAFK_Check()
    {
    new Float:X, Float:Y, Float:Z;
    for(new i; i < MAX_PLAYERS; i++)
    {
    PlayerPos_Now[i] = GetPlayerPos(i, X, Y, Z); //Finde die jetzige Position des Spielers raus.
    if(IsPlayerAFK[i]) return 1; //Wenn der Spieler schon AFK ist, Funktion beenden.
    if(PlayerPos_Now[i] == PlayerPos_Before[i]) //Wenn die Position vorher mit der jetzigen Position übereinstimmt...
    {
    AutoAFK_Detected[i] = true; //Variable setzen: Stillstand des Spielers entdeckt.
    AutoAFK_Timer[i] = SetTimerEx("AutoAFK_Processed", 15*60000, false, "i", i); //Starte einen 15min Timer.
    PlayerPos_Now[i] = PlayerPos_Before[i]; //Setze die jetzige Position auf die Variable, mit der die später neu ermittelte Position verglichen werden soll.
    SendClientMessage(i, -1, "AutoAFK detected. Initiating Timer of 15min.");
    }
    else //Wenn die vorige und jetzige Position nicht übereinstimmen...
    {
    if(AutoAFK_Detected[i]) //Wenn der Spieler schon entdeckt wurde, bzw. der Timer schon läuft...
    {
    KillTimer(AutoAFK_Timer[i]); //Zerstöre den Timer
    }
    AutoAFK_Detected[i] = false; //Variable setzen: Spieler unentdeckt.
    PlayerPos_Now[i] = PlayerPos_Before[i]; //Setze die jetzige Position auf die Variable, mit der die später neu ermittelte Position verglichen werden soll.
    }
    }
    return 1;
    }


    Das System will nicht so recht. Errors krieg ich zwar keine, aber funktionieren tut es auch nicht, wie es soll. In den Kommentaren steht, was ich mir dabei gedacht habe. Wäre euch dankbar für eure Hilfe!

  • Mach es doch einfach direkt mit der Positionsabfrage:
    new Float:neuer[MAX_PLAYERS[3], IsAFK[MAX_PLAYERS],CheckVariable[MAX_PLAYERS]; //In dieser Zeile musst du noch einen Fehler finden ;)
    forward CheckTimer(playerid);//forward für das Public
    #define CheckZeit 5000 //Zeit des Timers


    //OnPlayerSpawn
    CheckVariable[playerid] = 0;//Variable wird auf 0 gesetzt
    SetTimerEx("CheckTimer",CheckZeit,true,"i",playerid);//Timer wird gesetzt


    public CheckTimer(playerid)//Timerpublic
    {
    if(IsAFK[playerid] == 0)//Wenn der Spieler nicht afk ist
    {
    if(CheckVariable[playerid] == 1)//und die Variable 1 ist
    {
    if(!IsPlayerInRangeOfPoint(playerid,0,neu[playerid][0],neu[playerid][1],neu[playerid][2])return 1;//und der Spieler nicht auf der selben Stelle ist, passiert nichts
    CheckVariable[playerid] = 1;//ansonsten wird die Variable auf 1 gesetzt, also dauerhafter Check der selben Position
    IsAFK[playerid] = 1;//Der Spieler ist nun afk
    }
    else if(CheckVariable[playerid] == 0) {//Wenn die Variable 0 ist
    GetPlayerPos(playerid,neu[playerid][0],neu[playerid][1],neu[playerid][2]);}//wird die Position für die 2. Abfrage gespeichert
    return 1;//der Timer bekommt einen Return
    }
    else if(IsAFK[playerid] == 1)return 1; //Wenn der Spieler afk ist, passiert nichts
    }


    Das ganze ist jetzt gerade ungetestet. Ich weis auch nicht, ob es funktioniert, da ich aufgrund der Uhrzeit ziemlich Müde bin ^^
    Sollte es jemand wissen, kann er mich eines besseren belehren