Warum sollte es nicht funktionieren?
Probier es einfach aus, dann siehste es schon
Warum sollte es nicht funktionieren?
Probier es einfach aus, dann siehste es schon
Klar geht das
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
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
Sofern du bei "OnGameModeInit" den Timer definiert hast müsste es gehen.
Sofern du bei "OnGameModeInit" den Timer definiert hast müsste es gehen.
Was ist dass den für ein Quatsch? OMG müssen denn unwissende solche Kommentare hinterlassen?
es bugt leider jetzt bringt er alle um
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ä ?!
Alles anzeigenpublic 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 ?
Du erstellst im Public Playerid. gehst aber trotzdem alle Spieler durch ? Mach doch einfach Playerid, für jeden Spieler einzelnd. Dann kacken auch nicht alle ab.
stimmt
also das ganze pulic ohne for schleife ?
Jep.
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;
}
wie ist der Timer von
HPTimer
SetTimer("HPTimer",230,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.
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
Mit "auch so verletzen koennen" meinst du bestimmt, dass das auch passieren soll, wenn man z.B. irgendwo runter faellt? Das wird von OnPlayerTakeDamage auch gemeldet. Die issuerid ist dann INVALID_PLAYER_ID und die weaponid ist WEAPON_COLLISION (in Zahlen 54. Siehe: http://wiki.sa-mp.com/wiki/Weapons ).
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
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;
}