OnPlayerUpdate geht nicht?

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,


    Ich habs shcons elber gemacht und es halt leide rnicht funktioniert und nun hab eich es mal mittels iRFT seine Inc getestret doch es geht auch nicht


    [ TOOL ] Desktop Check Version 0.1


    Der OnPlayerUpdate Callback muss iwie Fehlerhaft ab 0.3z geworden sein ?!?


    Hier mein Code


    stock UpdateNametag(playerid) {
    new namestr[MAX_PLAYER_NAME + 40], Float: health, healthstr[20] = "/",healthvar , Float: healthv;
    GetPlayerHealth(playerid,health);
    healthv = floatround(health,floatround_round) / 10;
    healthvar = floatround(healthv,floatround_ceil);
    if(PlayerInfo[playerid][aduty]) healthstr = "Aduty";
    if(IsPlayerOnDesktop(playerid)) healthstr = "AFK / Desktop";
    else {
    format(healthstr,sizeof(healthstr),"");
    for(new i; i < healthvar; i++) strcat(healthstr,"|");
    }
    if(strlen(healthstr) == 1) format(healthstr,sizeof(healthstr),"/");
    format(namestr,sizeof(namestr),"%s (%i)\n["html_red"%s"html_white"]",PlayerInfo[playerid][_name],playerid,healthstr);
    Update3DTextLabelText(PlayerInfo[playerid][nametag], white, namestr);
    }


    Und der Spieler ist Ingame :)


    Gruss

  • Was geht denn nicht?


    Ich würde vermuten, dass du AFK im Label meinst. Aber die Frage ist vielmehr, wie rufst du die Funktion auf, wie sagst du dem Server das er den Spieler updaten soll?
    Deine Funktion ist nicht public also wird es schon mal kein Timer sein. Das ist vermutlich auch das Problem :P

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

    Margarete Stokowski

  • Das Include ist extrem schlecht geschrieben und dazu noch fehlerhaft.


    Ändere im Include dieses public zu:
    public Desk_SecondTimer()
    {
    for(new i = 0; i < MAX_PLAYERS; i ++)
    {
    if(!IsPlayerConnected(i)) continue;
    if(GetPVarInt(i, "DeskCheck") == 1)
    {
    SetPVarInt(i, "DeskCheck", 0);
    SetPVarInt(i, "AFKTime", 0);
    }
    else
    {
    SetPVarInt(i, "AFKTime", GetPVarInt(i, "AFKTime")+1);
    }
    }
    return true;
    }


    Der Timer funktioniert sonst immer nur für den Spieler, der die kleinste ID hat.



    Leider kann ich nur raten was der Fehler ist, da du uns ja nicht sagst, was genau falsch ist. Wird AFK immer angezeigt, oder gar nicht, ...

  • Das bedeutet, dass dein OnPlayerUpdate nicht korrekt aufgerufen wird.
    Füge das mal bei OnPlayerUpdate in deinem GM ein, und zwar an erster Stelle:


    printf("Called ID %d", playerid);


    und das ganz unten:
    printf("Processed ID %d", playerid);


    Wird das beides schön geprintet?


    Wenn nein, hast du Filterscripts am laufen?

  • Dann schmeiß die ganze Include raus und nimm das:


    new p_AFK[MAX_PLAYERS];
    new p_LastUpdate[MAX_PLAYERS];


    public OnPlayerUpdate(playerid)
    {
    p_LastUpdate[playerid] = GetTickCount();
    p_AFK[playerid] = 0;
    return 1;
    }


    forward p_AFK_Check();
    public p_AFK_Check()
    {
    new t = GetTickCount();
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    if(IsPlayerConnected(i) && p_AFK[i] == 0 && p_LastUpdate[i] < t-1000)
    {
    p_AFK[i] = 1;
    }
    }
    return 1;
    }


    OnGameModeInit:
    SetTimer("p_AFK_Check", 1000, 1);



    #define IsPlayerOnDesktop(%0) p_AFK[%0]

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Dann poste den gesamten dazugehörigen Code so wie er jetzt ist, und beschreibe was passiert.


    Die include hast du hoffentlich rausgenommen.


    Klar habe ich die Include rausgenommen ;)


    stock UpdateNametag(playerid) {
    new namestr[MAX_PLAYER_NAME + 40], Float: health, healthstr[20] = "/",healthvar , Float: healthv,zstr[7];
    GetPlayerHealth(playerid,health);
    healthv = floatround(health,floatround_round) / 10;
    healthvar = floatround(healthv,floatround_ceil);
    if(PlayerInfo[playerid][aduty]) healthstr = "Aduty";
    if(IsPlayerOnDesktop(playerid)) zstr = "[%%] ";
    if(!IsPlayerOnDesktop(playerid) && !PlayerInfo[playerid][aduty]) {
    format(healthstr,sizeof(healthstr),"");
    for(new i; i < healthvar; i++) strcat(healthstr,"|");
    }
    format(namestr,sizeof(namestr),"%s%s (%i)\n["html_red"%s"html_white"]",zstr,PlayerInfo[playerid][_name],playerid,healthstr);
    Update3DTextLabelText(PlayerInfo[playerid][nametag], white, namestr);
    }


    new t = gettime();
    if(IsPlayerConnected(playerid) && p_AFK[playerid] == 0 && p_LastUpdate[playerid] < t-1000) p_AFK[playerid] = 1;
    UpdateNametag(playerid);


    Ist im ptimer der jede Sekunde aufgerufen wird :)


    Edit:
    Jeffry: brauchst du noch iwas

    Einmal editiert, zuletzt von NicoWiss ()

  • Da du mir auch noch eine PM geschrieben hast zwecks deines Debug-Versuches, kannst du mir die Ergebnisse davon und den Code mit deinem Debug Zeugs hier mal posten? Dann kann ich das selbst prüfen.
    Also server_log vom Debug und den Code dazu.

  • Also ich bin angemdlet


    http://www.pic-upload.de/view-23372408/debug.png.html


    Der code



    public ptimer(playerid) {
    if(!IsPlayerConnectedEx(playerid)) return 1;
    printf("State: %i",IsPlayerOnDesktop(playerid));
    new aimtplayer = GetPlayerTargetPlayer(playerid), msg[109];
    if(aimtplayer != INVALID_PLAYER_ID) {
    if(!IsPlayerNPC(aimtplayer)) return 1;
    if(IsPlayerInRangeOfPoint(playerid,4.0,1373.8241,-1758.2440,13.5481)) Bankrob(playerid);
    if(!strcmp(BotInfo[aimtplayer][botname],"Bankdame2",false)) {
    if(!BotInfo[aimtplayer][inanimation]) ApplyAnimation(aimtplayer,"ped","handsup",4.1,0,1,1,1,0,1), BotInfo[aimtplayer][inanimation] = true, SetTimerEx("ClearAnimation",1000*60,false,"i",aimtplayer);
    if(PlayerInfo[playerid][bankrob] == true) PlayerInfo[playerid][bankrobsecs]++;
    }
    if(!strcmp(BotInfo[aimtplayer][botname],"Bankdame1",false) || !strcmp(BotInfo[aimtplayer][botname],"Bankdame2_Ani",false)) if(!BotInfo[aimtplayer][inanimation] && IsPlayerInRangeOfPoint(playerid,5.0,1375.9094,-1759.5554,13.5504)) ApplyAnimation(aimtplayer,"ped","handsup",4.1,0,1,1,1,0,1), BotInfo[aimtplayer][inanimation] = true, SetTimerEx("ClearAnimation",1000*60,false,"i",aimtplayer);
    } else if(aimtplayer == INVALID_PLAYER_ID) {
    if(PlayerInfo[playerid][bankrob]) PlayerInfo[playerid][btimer]++;
    if(PlayerInfo[playerid][bankrob] && PlayerInfo[playerid][btimer] > 10) GivePlayerMoney(playerid,PlayerInfo[playerid][bankrobsecs]*10), format(msg,sizeof(msg),"Du hast $%i erbeutet!",PlayerInfo[playerid][bankrobsecs]*10), SendClientMessage(playerid,white,msg), PlayerInfo[playerid][bankrob] = false, PlayerInfo[playerid][btimer] = 0, PlayerInfo[playerid][bankrobsecs] = 0, SendCopMsg(lightblue,"[SECURE-SYSTEM]: Der manuelle Alarmschalter in der Bank wurde betätigt!");
    }
    new Float: armourx;
    GetPlayerArmour(playerid,armourx);
    if(armourx == 0) SetPlayerArmourEx(playerid,0);
    new t = gettime();
    printf("pLU: %i || Time: %i, reachedT: %i", p_LastUpdate[playerid], t, t-1000);
    if(p_AFK[playerid] == 0 && p_LastUpdate[playerid] < t-1000) p_AFK[playerid] = 1;
    UpdateNametag(playerid);
    return 1;
    }


    Wenn ich auff Desktop bin returnt er 0


    public OnPlayerUpdate(playerid)
    {
    p_LastUpdate[playerid] = gettime();
    p_AFK[playerid] = 0;
    return 1;
    }


    Deine IsPlayerOnline Abfrage hab ich rausgeklatscht da der Timer erst gestratet wird (ptimer) wenn der spieler einbgeloggt ist

  • Du hast nicht ernsthaft einen Timer erstellt, der 3x pro Millisekunde aufgerufen wird, oder?!? Das solltest du aber dringendst ändern.


    Und dann mach es mal so, und poste dann was im server_log steht.
    Und bitte nimm nicht diese doofe Seite, zig tausende Werbungen. Nimm http://www.tinypic.com, oder http://www.pastebin.com für Text.



    public ptimer(playerid) {
    if(!IsPlayerConnectedEx(playerid)) return 1;
    new aimtplayer = GetPlayerTargetPlayer(playerid), msg[109];
    if(aimtplayer != INVALID_PLAYER_ID) {
    if(!IsPlayerNPC(aimtplayer)) return 1;
    if(IsPlayerInRangeOfPoint(playerid,4.0,1373.8241,-1758.2440,13.5481)) Bankrob(playerid);
    if(!strcmp(BotInfo[aimtplayer][botname],"Bankdame2",false)) {
    if(!BotInfo[aimtplayer][inanimation]) ApplyAnimation(aimtplayer,"ped","handsup",4.1,0,1,1,1,0,1), BotInfo[aimtplayer][inanimation] = true, SetTimerEx("ClearAnimation",1000*60,false,"i",aimtplayer);
    if(PlayerInfo[playerid][bankrob] == true) PlayerInfo[playerid][bankrobsecs]++;
    }
    if(!strcmp(BotInfo[aimtplayer][botname],"Bankdame1",false) || !strcmp(BotInfo[aimtplayer][botname],"Bankdame2_Ani",false)) if(!BotInfo[aimtplayer][inanimation] && IsPlayerInRangeOfPoint(playerid,5.0,1375.9094,-1759.5554,13.5504)) ApplyAnimation(aimtplayer,"ped","handsup",4.1,0,1,1,1,0,1), BotInfo[aimtplayer][inanimation] = true, SetTimerEx("ClearAnimation",1000*60,false,"i",aimtplayer);
    } else if(aimtplayer == INVALID_PLAYER_ID) {
    if(PlayerInfo[playerid][bankrob]) PlayerInfo[playerid][btimer]++;
    if(PlayerInfo[playerid][bankrob] && PlayerInfo[playerid][btimer] > 10) GivePlayerMoney(playerid,PlayerInfo[playerid][bankrobsecs]*10), format(msg,sizeof(msg),"Du hast $%i erbeutet!",PlayerInfo[playerid][bankrobsecs]*10), SendClientMessage(playerid,white,msg), PlayerInfo[playerid][bankrob] = false, PlayerInfo[playerid][btimer] = 0, PlayerInfo[playerid][bankrobsecs] = 0, SendCopMsg(lightblue,"[SECURE-SYSTEM]: Der manuelle Alarmschalter in der Bank wurde betätigt!");
    }
    new Float: armourx;
    GetPlayerArmour(playerid,armourx);
    if(armourx == 0) SetPlayerArmourEx(playerid,0);
    new t = GetTickCount();
    if(p_AFK[playerid] == 0 && p_LastUpdate[playerid] < t-1000) p_AFK[playerid] = 1;
    printf("playerid: %d -- pLU: %i || Time: %i, reachedT: %i || State: %d || p_AFK: %d", playerid, p_LastUpdate[playerid], t, t-1000, IsPlayerOnDesktop(playerid), p_AFK[playerid]);
    UpdateNametag(playerid);
    return 1;
    }


    public OnPlayerUpdate(playerid)
    {
    printf("Called playerid %d @ %d", playerid, GetTickCount());
    p_LastUpdate[playerid] = GetTickCount();
    p_AFK[playerid] = 0;
    return 1;
    }


    Was kommt im Server log?
    Markiere bitte die Stelle, an der du auf den Desktop gegangen bist.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Du hast nicht ernsthaft einen Timer erstellt, der 3x pro Millisekunde aufgerufen wird, oder?!? Das solltest du aber dringendst ändern.


    Intervall = 1000


    Wo steht was von 3 ?


    Edit: Jeffry:



    Zum Timer der wird jede Sekunde einmal aufgerufen nicht pro Millisekunde 3 mal wie soll das gehen SetTimer(...,0.333333,...);
    Also das returnt er

    Einmal editiert, zuletzt von NicoWiss ()