Unbeschreibares Problem mit Float-Variable...

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 hätte ne bessere Beschreibung für das Problem, wenn ich wüsste was da abgeht.


    Kurzes Beispiel:


    Dieser Befehl soll das Leben des Spielers verändern. Zusätzlich benutze ich von Southclaw die von ihm verbesserte progressbars-lib.
    Nach dem dieser Befehl ausgeführt wird, soll die progressbar auch geupdatet werden. (SetPlayerProgressBarValue).
    Das sollte ja eigentlich funktionieren.. so hat es für mich zumindest in anderen Gamemodes.
    Hier ist aber mein Problem das die PlayerBar erst beim zweiten mal ausführen gesetzt wird, aber auch nur mit dem Wert den der Spieler vorher hatte.
    Ebenso wenn ich die PlayerBar z.B bei OnPlayerSpawn updaten will. Dann wird beim ersten Spawn statt dem Leben 55.0 - 0.0 wiedergeben.
    Beim zweiten mal Spawnen dann 55 statt dem aktuellen Wert dem neuen Wert 20 - und immer so weiter.
    1 Mal:
    Spieler hat 51 HP - print gibt aber 0 aus.
    2 Mal:
    Spieler hat 23 HP, gibt aber 51 aus.
    und so weiter.
    Ich kann mir dieses Problem nicht erklären.


    OnPlayerSpawn:


    Hoffe jemand versteht was ich meine xD
    Lg

  • Das könnte am Lag liegen.
    Versuche es so:
    ocmd:sethp(playerid,params[])
    {
    if(!IsAdmin(playerid,2))return noaccess
    if(AdminDuty[playerid]!=1)return SendClientMessage(playerid,GRAU,"Du bist nicht On-Duty.");
    new pid,heal;
    if(sscanf(params,"ui",pid,heal))return SendClientMessage(playerid,WEIß,"Verwendung: /sethp (Spieler/ID) (Heal)");
    if(!PlayerOnline(pid))return SendClientMessage(playerid,GRAU,"Dieser Spieler ist nicht erreichbar.");
    new str[145];
    format(str,sizeof(str),"%s %s hat dein Leben auf %i gesetzt.",RangName(playerid),PlayerName(playerid),heal);
    SendClientMessage(playerid,GRUEN,"Leben des Spielers gesetzt.");
    SetPlayerHealth(pid,heal);
    SetPlayerProgressBarValue(pid, pBar_Leben[pid], heal);
    return 1;
    }

  • @Jeffry,
    Das würde für den Befehl zwar alles beseitigen, aber das selbe Problem habe ich auch wenn ich z.b beim Spawnen die PlayerBar updaten will. Dort habe ich ja nur die möglichkeit den Wert per GetPlayerHealth zu getten.
    Und dann passiert aber das selbe problem. Und es ist ja egal wo, unter jedem Callback passiert das selbe.

  • Wäre dann, falls das so ist, aber nur für maximal eine Sekunde, oder nicht? Wenn du den Timer gegebenenfalls 4 mal pro Sekunde aufrufst, dann wären es maximal 250ms Differenz.


    Einen globalen Timer, der alle X Millisekunden aufgerufen wird und eine Schleife durch alle Spieler macht, und jeweils deren StatusBar aktualisiert. Versuche es mal damit, ob das klappt.

  • Das Problem liegt hier eben beim Lag, dass SetPlayerHealth noch nicht ausgeführt ist, wenn GetPlayerHealth ein paar Zeilen drunter aufgerufen wird. Das einzige was du noch machen kannst, damit das nicht vorkommt ist, dass du immer den direkten Wert von SetPlayerHealth auch in die StatusBar schreibst (gegebenenfalls indem du SetPlayerHealth hookst), dann sollte es auch gehen, da der Lag so ja nicht in Frage kommt.


    Mit dem Timer umgehst du das Problem dahingehend, dass eben immer eine kleine Verzögerung drin ist, die größer als die Latenz ist.