Problem mit AFK 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
  • Hallo,
    Ich versuche jetzt schon länger den Fehler zu finden.
    Ich möchte nämlich ein AFK System machen und weiß nicht genau wie ich die Positionsabfrage machen soll:


    Ich habe es schon per PVar ausprobiert, hat aber nicht gut funktioniert, jetzt habe ich die X, Y, Z Koordinaten mit dem Timer mit der aktuellen Position verglichen, da klappt aber auch irgendwas wieder nicht.


    Unter OnPlayerUpdate:


    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(playerid, X, Y, Z);
    SetTimerEx("AFKChecker",1000*10,1,"ifff",playerid,X,Y,Z);


    Dann hier der Teil des Timeres, der nicht funktioniert:


    public AFKChecker(playerid,X,Y,Z)
    {
    new Float:pX, Float:pY, Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    if(pX == X && pY == Y && pZ==Z && GetPVarInt(playerid,"AFKVerdacht")!=1)


    Vorher habe ich die Posion per PVars gespeichert bei OnPlayerUpdate und unten verglichen, hat wie oben gesagt nicht geklappt.
    Vielleicht habe ich aber auch nur einen kleinen Fehler, den ich andauernd überlese, bitte um Hilfe


    MFG Ketchup

  • Meine Methode:


    3 neue Variablen und einen forward

    new IsPlayerAFK[MAX_PLAYERS];
    new GoAFKTimer[MAX_PLAYERS];
    new Float:PlayerPos[MAX_PLAYERS][6];


    forward AFKTimer();


    OnGameModeInit:



    SetTimer("AFKTimer", 80000, 1);


    OnPlayerDisconnect:



    KillTimer(GoAFKTimer[playerid]);


    Der Timer:



    public AFKTimer()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && PlayerInfo[i][pEingeloggt] == 1 && !IsPlayerNPC(i))//ggf. an dein Script anpassen
    {
    GetPlayerPos(i, PlayerPos[i][0], PlayerPos[i][1], PlayerPos[i][2]);
    if(PlayerPos[i][0] == PlayerPos[i][3] && PlayerPos[i][1] == PlayerPos[i][4] && PlayerPos[i][2] == PlayerPos[i][5])
    {
    if(IsPlayerAFK[i] == 0)
    {
    IsPlayerAFK[i] = 1;
    //Und was noch passieren sollte SendClientMesssage usw...
    }
    }
    PlayerPos[i][3] = PlayerPos[i][0];
    PlayerPos[i][4] = PlayerPos[i][1];
    PlayerPos[i][5] = PlayerPos[i][2];
    }
    }
    }


    MFG,
    Shanon!

  • Das wäre mir jetzt etwas zu viel umstellung, ich wollte ja eigentlich nur die Abfrage richtig zum funktionieren bringen.
    Danke für die Mühe, aber das wäre mir jetzt viel zu viel umzustellen, bitte einfach das was ich oben gepostet habe zum Laufen bringen.

  • Ich möchte die Position speichern und dann soll sie nach x Minuten mit dieser Position verglichen werden und wenn es die gleiche ist, soll halt das AFK Verdachtssystem starten.


    Bsp.


    Ich bin um 15:00Uhr an der Postion 12,47,32 , nach 10 Minuten an der Position 47,12,36 - kein AFK Verdacht
    Ich bin um 15:00Uhr an der Postion 12,47,32 , nach 10 Minuten an der Position 12,47,32 - AFK Verdacht, das System startet


    Da ich selber das System schon fertig habe, ist mein einziges Problem die Positionsabfrage, die irgendwie nicht funktioniert

  • Du solltest auf keinen Fall den Timer unter OnPlayerUpdate starten und schon garnicht wiederholend.
    Weißt du wieviele Timer du dann am Ende hast? Ein Spieler updatet sehr oft in der Sekunde.


    Mach da am besten einen Timer:


    forward GetPlayerAFKPos()
    public GetPlayerAFKPos()
    {
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    new Float:X, Float:Y, Float:Z;
    GetPlayerPos(i, X, Y, Z);
    SetTimerEx("AFKChecker",1000*10,0,"ifff",playerid,X,Y,Z);
    }
    }


    public OnGameModeInit()
    {
    SetTimer("GetPlayerAFKPos", 5000, 1);
    }


    Soviel dazu, jetzt zum eigentlichen Problem:


    Du vergleichst hier Floats und Integer, du musst natürlich in der Parameterliste
    die Variablen auch als Float kennzeichnen:


    public AFKChecker(playerid, Float:X, Float:Y, Float:Z)
    {
    new Float:pX, Float:pY, Float:pZ;
    GetPlayerPos(playerid, pX, pY, pZ);
    if(pX == X && pY == Y && pZ==Z && GetPVarInt(playerid,"AFKVerdacht")!=1)
    }



    BlackLegend