Würde das sogehen ? (Timer in Timer)

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
  • Warum sollte es nicht funktionieren?


    Probier es einfach aus, dann siehste es schon ^^


    naja weil ich mir net sicher bin (nacht druch :) ob er den timer net dann immer wieder mit aufruft also sollte es doch mit de rveriable gehen ich teste es einfach und lass feedback da

  • es bugt leider jetzt bringt er alle um :D
    forward HPTimer(playerid);
    public HPTimer(playerid)
    {
    new Float:Leben, anlib[32], anname[32];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerState(i) == PLAYER_STATE_ONFOOT)
    {
    GetPlayerHealth(i, Leben);
    GetAnimationName(i,anlib,32,anname,32);
    if(Leben < 18.0)
    {
    GameTextForPlayer(i, "~r~Du bist schwer verletzt", 4000, 5);
    ApplyAnimation(i, "CRACK", "crckdeth2", 3.4, 1, 0, 0, 0, 0, 1);
    PlayerInfo[i][pDown] = 1;
    ismedictan = 1;
    }
    if(Leben > 35.0)
    {
    PlayerInfo[i][pDown] = 0;
    }
    if(ismedictan == 1)// er soll hie rnet dauernd druch laufen sondern nur eimal bei dem opfer damit er auch nach 3 min verreckt (10 sec sind nur test ^^)
    {
    killtimerdown = SetTimerEx("Killen",10000,0,"i",playerid);
    }
    }
    }
    return 1;
    }
    forward Killen(playerid);
    public Killen(playerid)
    {
    SetPlayerHealth(playerid,0.0);
    SendClientMessage(playerid, COLOR_RED,"Es kamm kein Medic vorbei du bist gestroben!");
    return 1;
    }

  • public HPTimer(playerid)
    {
    new Float:Leben, anlib[32], anname[32];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerState(i) == PLAYER_STATE_ONFOOT)
    {
    GetPlayerHealth(i, Leben);
    GetAnimationName(i,anlib,32,anname,32);
    if(Leben < 18.0)
    {
    GameTextForPlayer(i, "~r~Du bist schwer verletzt", 4000, 5);
    ApplyAnimation(i, "CRACK", "crckdeth2", 3.4, 1, 0, 0, 0, 0, 1);
    PlayerInfo[i][pDown] = 1;
    ismedictan = 1;
    }
    if(Leben > 35.0)
    {
    PlayerInfo[i][pDown] = 0;
    }
    if(ismedictan == 1)// er soll hie rnet dauernd druch laufen sondern nur eimal bei dem opfer damit er auch nach 3 min verreckt (10 sec sind nur test ^^)
    {
    killtimerdown = SetTimerEx("Killen",10000,0,"i",playerid);
    }
    }
    }
    return 1;
    }


    Du erstellst ein public mit playerid aber machst trotzdem eine For schleife ? Hä ?!


  • Hä ? was genau meinst du jetzt ?

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • ja aber es war voher ohne playerid weil er muss doch abfragen ob ein player aufn server unter 12 hp hat um ihn hinzulegen ?
    also uhrsprünglich war es so



    forward HPTimer();
    public HPTimer()
    {
    new Float:Leben, anlib[32], anname[32];
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
    if(GetPlayerState(i) == PLAYER_STATE_ONFOOT)
    {
    GetPlayerHealth(i, Leben);
    GetAnimationName(i,anlib,32,anname,32);
    if(Leben < 18.0)
    {
    GameTextForPlayer(i, "~r~Du bist schwer verletzt", 4000, 5);
    ApplyAnimation(i, "CRACK", "crckdeth2", 3.4, 1, 0, 0, 0, 0, 1);
    PlayerInfo[i][pDown] = 1;
    }
    if(Leben > 35.0)
    {
    PlayerInfo[i][pDown] = 0;
    }
    }
    }
    return 1;
    }

  • Den Timer koennte man sich eventuell sparen. In http://wiki.sa-mp.com/wiki/OnPlayerTakeDamage koennte man die schwer-verletzt Abfrage machen und gegebenenfalls den kill-timer starten. Sollte etwas effizienter sein, als staendig alle Spieler zu ueberpruefen.


    ja aber man soll sich ja auch so verletzen könne da hatte ich heute morgen auch schon dran gemacht ^^

  • Ich habs jetzt mal so gebaut



    forward OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid);
    public OnPlayerTakeDamage(playerid, issuerid, Float:amount, weaponid)
    {
    new Float:Leben, anlib[32], anname[32];
    GetPlayerHealth(playerid, Leben);
    GetAnimationName(playerid,anlib,32,anname,32);
    if(Leben < 18.0)
    {
    GameTextForPlayer(playerid, "~r~Du bist schwer verletzt", 4000, 5);
    ApplyAnimation(player, "CRACK", "crckdeth2", 3.4, 1, 0, 0, 0, 0, 1);
    PlayerInfo[playerid][pDown] = 1;
    killtimerdown = SetTimerEx("Killen",10000,0,"i",playerid);
    }
    if(Leben > 35.0)
    {
    PlayerInfo[playerid][pDown] = 0;
    }
    return1;
    }

  • Was mir gerade auffaellt ist der aufruf zu GetAnimationName: GetAnimationName(playerid,anlib,32,anname,32);
    Erstens verwendest du es falsch. Der erste parameter ist nicht die playerid sondern die id der Animation: ( http://wiki.sa-mp.com/wiki/GetAnimationName ) - Du muesstest also GetPlayerAnimationIndex(playerid) als ersten parameter fuer die Funktion verwenden.
    Zweitens ist der Funktionsaufruf und die damit verbundenen Variablen (anlib, anname) nutzlos, da du nichts mit den Informationen ueber die Animation machst. Das kann also weg gelassen werden.


    Wie es mit der synchronisation aussieht, bin ich mir nicht sicher, da der Client OnPlayerTakeDamage sofort sendet, aber die Health-Information im OnFoot-Update enthalten ist und das Update alle x Millisekunden (standardmaessig alle 30 ms, wenn ich mich nicht irre) gesendet wird. Darum solltest du einfach mal ausprobieren, ob GetPlayerHealth() korrekt ist, oder, ob GetPlayerHealth()-amount korrekt ist. (Einfach beide Varianten ausgeben und ingame wo runter fallen und mit dem Ergebnis von einem /myHealth command vergleichen.)

  • Jo mir aus noch was aufgefallen so ist es jetzt richtig ghet auch wunder bar nur er spammt jetzt die naricht das ich gestorben bin :D


    so habe ich es jetzt



    new Float:Leben, anlib[32], anname[32];
    GetPlayerHealth(Damage, Leben);
    GetAnimationName(Damage,anlib,32,anname,32);
    if(Leben < 18.0)
    {
    GameTextForPlayer(Damage, "~r~Du bist schwer verletzt", 4000, 5);
    ApplyAnimation(Damage, "CRACK", "crckdeth2", 3.4, 1, 0, 0, 0, 0, 1);
    PlayerInfo[playerid][pDown] = 1;
    killtimerdown = SetTimerEx("Killen",10000,0,"i",playerid);
    }
    if(Leben > 35.0)
    {
    PlayerInfo[playerid][pDown] = 0;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen