Hi, ich hätte mal eine Frage zu Timern.
Nehmen wir an ich lasse einen spielerspezifischen Timer einige sehr resourcenlastige Berechnungen durchführen, deren Ausführungszeiten über dem Timerintervall liegen - es kommt offensichtlich zu massiven Lags. Sind diese Lags dann nur für den Spieler spürbar auf dem dieser Timer läuft, oder sind die Lags serverweit spürbar?
Beiträge von Manyula
-
-
Hab ich, es funktioniert nach wie vor nicht.
EDIT: Ich hab die Lösung. Es liegt an fixes2, entweder an dem Plugin, an der Include oder an beidem. Ich hab beide mal exkludiert, und jetzt gehts.
-
Also, wenn ein Spieler stirbt, werden seine Animationen gecleart und seine HP auf unendlich gesetzt, sodass die default Sterbeanimation sofort übersprungen wird. OnPlayerDeath und OnPlayerSpawn werden also unmittelbar nacheinander aufgerufen. Wenn der Spieler respawnt, starte ich den Timer unter OnPlayerSpawn, wie oben im Code schon aufgezeigt.
Kleines Addendum: Ich habe nun versucht den Timer manuell per CMD zu beenden. Das klappt auch nicht. Er wütet trotzdem rum.
-
Hallo,
der Titel sagt bereits alles. Der Timer wird trotz KillTimer nicht gekillt und ich hab nicht die leiseste Ahnung wieso. Da ich das ganze immer alleine gestetet habe, beziehe ich mich auf die letzte if-Abfrage, also ob a kleiner gleich 0 ist. Wenns da aber schon fehlschlägt, dann wohl in der ganzen Funktion.
//Globale Variable
new Downstate_Timer[MAX_PLAYERS];//Unter OnPlayerSpawn
Downstate_Timer[playerid] = SetTimerEx("DownstateTimer", 250, true, "i", playerid);//Timer Funktion
forward DownstateTimer(playerid);
public DownstateTimer(playerid)
{
Downstate_Counter[playerid]++;
if(Downstate_Counter[playerid] == 4)
{
Downstate_Counter[playerid] = 0;
new Float:a;
GetPlayerArmour(playerid, a);
if(0.0 < a < 100.0)
{
SetPlayerArmour(playerid, a - 1.0);
}
if(a == 100.0)
{
KillTimer(Downstate_Timer[playerid]);
Condition[playerid] = CONDITION_ALIVE;
Downstate_Counter[playerid] = 0;
ClearAnimations(playerid);
SetPlayerHealth(playerid, 30);
SetPlayerArmour(playerid, 0);
//TO DO: Hide all textdraws from the downstate
}
if(a <= 0.0)
{
KillTimer(Downstate_Timer[playerid]);
Condition[playerid] = CONDITION_DEAD;
Downstate_Counter[playerid] = 0;
ApplyAnimation(playerid, "CRACK", "crckdeth1", 4.1, false, true, true, true, 24*60000, true);
//TO DO: Offer Respawn Hotkey
PlayerTextDrawHide(playerid, TD_Downstate[playerid][0]); //Downstate
PlayerTextDrawHide(playerid, TD_Downstate[playerid][1]); //WeaponCoverBox
PlayerTextDrawHide(playerid, TD_Downstate[playerid][2]); //Infobox
PlayerTextDrawHide(playerid, TD_Downstate[playerid][3]); //HealthCoverBox
PlayerTextDrawHide(playerid, TD_Downstate[playerid][4]); //Indicator arrow
PlayerTextDrawHide(playerid, TD_Downstate[playerid][5]); //Stop the bleeding
PlayerTextDrawHide(playerid, TD_Downstate[playerid][6]); //Cry for help
PlayerTextDrawHide(playerid, TD_Downstate[playerid][7]); //Last strength
PlayerTextDrawHide(playerid, TD_Downstate[playerid][8]); //Medicine
PlayerTextDrawHide(playerid, TD_Downstate[playerid][9]); //Up and down arrow of main circle
PlayerTextDrawHide(playerid, TD_Downstate[playerid][10]); //Left and right arrow of main circle
PlayerTextDrawHide(playerid, TD_Downstate[playerid][11]); //Medicine drop down menu
PlayerTextDrawHide(playerid, TD_Downstate[playerid][12]); //Close box info
//TO DO: Hide downstate action textdraws and infobox (when respawned, hide all downstate textdraws)
}
}
return 1;
} -
Ah okay, na dann ist alles klar. Dann werde ich auf anklickbare Textdraws zurückgreifen, da dürften die Probleme ja nicht auftreten. Vielen Dank für deine/eure Hilfe!
-
Ich bin momentan im Urlaub und habe keinen Zugriff auf meinen Code.
Ich habe auch schon daran gedacht einfach 1 in den beiden Blöcken zu returnen, dass der Code einfach abbricht, bevor der nächste Block, der dann ja auch erfüllt wird, ausgeführt wird. Ich glaub auch, dass beide Print's nur aufgerufen wurden, weil sie direlt aufeinandet geprintet wurden, also bei einem Tastendruck. Ich werde den Code in einer Woche testen können, bis dahin setz ich mal vorerst einen Riegel hiervor.
Danke bis hierhin!
EDIT: So, bin wieder zurück. Hier ein kleines Update.
Ich habe nun die Variante mit else, als auch die return Variante ausprobiert. Weder das eine noch das andere klappt. Mir ist jedoch etwas aufgefallen. Ich erkläre es am besten an einem Beispiel:
Ich drücke RMB, der Dialog erscheint, Open wird geprintet.
Drücke ich RMB, solange der Dialog offen ist, passiert nichts. Der Dialog schließt sich nicht und es wird kein Close geprintet.
Wenn ich auf einen Dialog-Button klicke, schließt sich der Dialog. Es wird aber noch kein Close geprintet.
Ist der Dialog zu, muss ich RMB 2x (!) drücken, damit der Dialog wieder aufgerufen wird. Bei ersten Klicken wird nur Close geprintet, beim zweiten wieder Open und der Dialog erscheint.Scheinbar wird der Tastendruck nicht erkannt solange der Dialog offen ist.
-
Ja, der Close print wird aufgerufen.
-
Es klappt trotz "else if" nicht. Es muss an etwas anderem liegen.
Danke an dieser Stelle für deine Hilfe!
-
Ich bin jetzt mal auf folgende Variante umgesprungen.
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(Condition[playerid] == CONDITION_DOWNED)
{
if(newkeys & (KEY_HANDBRAKE))
{
if(Downstate_DialogSwitch[playerid] == true)
{
Downstate_DialogSwitch[playerid] = false;
ShowPlayerDialog(playerid, -1, DIALOG_STYLE_LIST, "a", "a", "a", "a");
print("Close");
}
if(Downstate_DialogSwitch[playerid] == false)
{
Downstate_DialogSwitch[playerid] = true;
new
ds[MAX_LANGUAGES][150];format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
print("Open");
}
}
}
return 1;
}Der Dialog wird einerseits beim Drücken geöffnet, wenn er zu ist, und andererseits geschlossen, wenn er offen ist - so die Absicht. Allerdings wird er nicht geschlossen. Geprintet wird alles.
-
Ja, hab ich. Haben keine andere Wirkung als die ausgeschriebene Variante.
-
Also, anfänglich wird mir ja kein Dialog angezeigt. Wenn ich dann RMB zunächst drücke, soll ja auch noch nichts passieren.
Wenn ich beim ersten Mal dann RMB loslasse, wird mir der Dialog angezeigt. Wenn ich dann wieder RMB loslasse, dann verschwindet der Dialog nicht. -
Hi,
ich möchte, dass ein Dialog angezeigt wird, wenn man RMB gedrückt hält, und wieder verschwindet, sobald man RMB loslässt. Hier der Code.
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if(Condition[playerid] == CONDITION_DOWNED)
{
if((newkeys & KEY_HANDBRAKE) && !(oldkeys & KEY_HANDBRAKE))
{
ShowPlayerDialog(playerid, -1, DIALOG_STYLE_LIST, "", "", "", ""); //Hide dialog when RMB is pressed
}
if((oldkeys & KEY_HANDBRAKE) && !(newkeys & KEY_HANDBRAKE))
{
new
ds[MAX_LANGUAGES][150];
format(ds[LANGUAGE_DE], sizeof(ds[]), "Blutung stoppen\nLetzte Kraft\nHilferuf\nBlutbeutel (%d)\nMorphin (%d)\nBeruhigungsmittel (%d)\nAdrenalin (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
format(ds[LANGUAGE_EN], sizeof(ds[]), "Stop the bleeding\nLast strength\nCall for help\nBloodbag (%d)\nMorphine (%d)\nTranquilizer (%d)\nAdrenaline (%d)", Item_Bloodbag[playerid], Item_Morphine[playerid], Item_Tranquilizer[playerid], Item_Adrenaline[playerid]);
ShowLanguageDialog(playerid, DIALOG_DOWNSTATE, DIALOG_STYLE_LIST, "Downstate Aktionen", "Downstate actions", ds[LANGUAGE_DE], ds[LANGUAGE_EN], "OK", "OK", "", "");
}
}
return 1;
}So, wenn ich RMB nun drücke, erscheint der Dialog, wie gewollt. Wenn ich RMB allerdings wieder loslasse, dann verschwindet der Dialog allerdings nicht.
-
Also, ich hab meinen Code mal exakt mit dem des bare Gamemodes verglichen, und außer dem switch erkenne ich da null Unterschied. Ich hab natürlich auch schon an den Workaround gedacht mit SetPlayerPos unter OnPlayerSpawn, ich wollte aber erst einmal schauen, ob vllt doch irgendein Fehler vorliegt, den ich übersehen habe. Selbst wenn ich debugge, kann ich ja nicht nachverfolgen was er mit den Koordinaten aus AddPlayerClass anstellt... Dann werd ich wohl auf SetPlayerPos ausweichen müssen.
EDIT: SetPlayerPos funktioniert nicht. O.o
EDIT 2: Ich hab die Lösung!
Ich hatte unter der angegebenen if-Abfrage den Boolean JustLoggedIn auf false gesetzt, und darunter kam nochmal eine Abfrage, die das dan abgefangen hat und die Koordinaten übernommen hat, die in globalen Positionsvariablen waren. Diese waren aber leer. Ich habe jetzt unter jede if-Abfrage ein 1 returnt, jetzt klappts! -
Hi,
mein Spieler wird nicht entsprechend der Koordinaten, die bei AddPlayerClass angegeben wurden, gespawnt, sondern landet in der Pampa, unter der Map.
//OnGameModeInit
AddPlayerClass(105, 1958.3783, 1343.1572, 15.3746, 270.1425, 0, 0, 0, 0, 0, 0);//OnPlayerSpawn
new w = GetPlayerVirtualWorld(playerid);
switch(w)
{
case 0:
{
if(JustLoggedIn[playerid] == true)
{
//set spawnprotection
TeleportsLocked[playerid] = false;
JustLoggedIn[playerid] = false;
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
PlayerTextDrawShow(playerid, TD_Morale[playerid][1]);
PlayerTextDrawShow(playerid, TD_Morale[playerid][2]);
PlayerTextDrawShow(playerid, TD_Morale[playerid][3]);
}
//weiterer Code...
Was übersehe ich? -
Zunächst einmal, vielen Dank, dass du meinem Hilferuf nachgegangen bist!
Ich hab nun
if(PlayerMoraleSpree[killerid] > -15 && PlayerMoraleSpree[killerid] < 25)
//und
if(PlayerMoraleSpree[playerid] > -15 && PlayerMoraleSpree[playerid] < 25)
zu
if(killerid != INVALID_PLAYER_ID && PlayerMoraleSpree[killerid] > -15 && PlayerMoraleSpree[killerid] < 25)
//und
if(killerid != INVALID_PLAYER_ID && PlayerMoraleSpree[playerid] > -15 && PlayerMoraleSpree[playerid] < 25)
geändert.Desweiteren hab ich auch gesondert noch die Abfrage...
if(killerid == INVALID_PLAYER_ID)
über die anderen zwei geschrieben und darunter nochmal den passenden switch eingebaut. Jetzt funktioniert es einwandfrei!Danke dir!
-
Ich hab den Code jetzt mal angepasst. Hier ist der ganze Code.
public OnPlayerDeath(playerid, killerid, reason)
{
new w = GetPlayerVirtualWorld(playerid);
switch(w)
{
case 0:
{
//Downstate
GetPlayerPos(playerid, GlobalX[playerid], GlobalY[playerid], GlobalZ[playerid]);
GetPlayerFacingAngle(playerid, GlobalFA[playerid]);SavePlayerWeapons(playerid);
ResetPlayerWeapons(playerid);Condition[playerid] = CONDITION_DOWNED;
SetPlayerHealth(playerid, FLOAT_INFINITY);
ClearAnimations(playerid); //Bis hier hin wird alles ausgeführt! ============================================================================//Morale
if(PlayerMoraleSpree[killerid] > -15 && PlayerMoraleSpree[killerid] < 25)
{
if(killerid == INVALID_PLAYER_ID) PlayerMoraleSpree[playerid]--;
else PlayerMoraleSpree[killerid]++;
printf("killerid: %d", PlayerMoraleSpree[killerid]); //Wird nicht geprintet! ================================================================switch(PlayerMoraleSpree[killerid])
{
case -14..-5:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[killerid]);
PlayerMorale[killerid] = -5;
PlayerMoraleSpree[killerid] = -5;
DamageModifier[killerid] = -1.01;
HealthModifier[killerid] = -1.05;
PlayerTextDrawSetString(killerid, TD_Morale[killerid][3], spree);
PlayerTextDrawSetString(killerid, TD_Morale[killerid][2], "~d~");
PlayerTextDrawSetString(killerid, TD_Morale[killerid][1], "~r~~h~-5%");
PlayerTextDrawBoxColor(killerid, TD_Morale[killerid][0], C_RED);
PlayerTextDrawShow(killerid, TD_Morale[killerid][0]);
print("-14..-15"); //Wird nicht geprintet! ===================================================================================
}
case -4..-1:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[killerid]);
PlayerMorale[killerid] = 0;
PlayerMoraleSpree[killerid] = 0;
DamageModifier[killerid] = 1.0;
HealthModifier[killerid] = 1.0;
PlayerTextDrawSetString(killerid, TD_Morale[killerid][3], spree);
PlayerTextDrawSetString(killerid, TD_Morale[killerid][2], "~t~");
PlayerTextDrawSetString(killerid, TD_Morale[killerid][1], "~w~0%");
PlayerTextDrawBoxColor(killerid, TD_Morale[killerid][0], C_GREEN);
PlayerTextDrawShow(killerid, TD_Morale[killerid][0]);
print("-4..-1"); //Wird nicht geprintet! =====================================================================================
}
case 0..9:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[killerid]);
PlayerMorale[killerid] = 0;
DamageModifier[killerid] = 1.0;
HealthModifier[killerid] = 1.0;
PlayerTextDrawSetString(killerid, TD_Morale[killerid][3], spree);
PlayerTextDrawSetString(killerid, TD_Morale[killerid][2], "~t~");
PlayerTextDrawSetString(killerid, TD_Morale[killerid][1], "~w~0%");
PlayerTextDrawBoxColor(killerid, TD_Morale[killerid][0], C_GREEN);
PlayerTextDrawShow(killerid, TD_Morale[killerid][0]);
print("0..9"); //Wird nicht geprintet! =======================================================================================
}
case 10..24:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[killerid]);
PlayerMorale[killerid] = 5;
DamageModifier[killerid] = 1.01;
HealthModifier[killerid] = 1.05;
PlayerTextDrawSetString(killerid, TD_Morale[killerid][3], spree);
PlayerTextDrawSetString(killerid, TD_Morale[killerid][2], "~u~");
PlayerTextDrawSetString(killerid, TD_Morale[killerid][1], "~b~~h~+5%");
PlayerTextDrawBoxColor(killerid, TD_Morale[killerid][0], C_BLUE);
PlayerTextDrawShow(killerid, TD_Morale[killerid][0]);
print("10..24"); //Wird nicht geprintet! ==============================================================================
}
case 25:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[killerid]);
PlayerMorale[killerid] = 10;
DamageModifier[killerid] = 1.025;
HealthModifier[killerid] = 1.10;
PlayerTextDrawSetString(killerid, TD_Morale[killerid][3], spree);
PlayerTextDrawSetString(killerid, TD_Morale[killerid][2], "~u~");
PlayerTextDrawSetString(killerid, TD_Morale[killerid][1], "~b~+10%");
PlayerTextDrawBoxColor(killerid, TD_Morale[killerid][0], C_BLUE);
PlayerTextDrawShow(killerid, TD_Morale[killerid][0]);
print("25"); //Wird nicht geprintet! ==================================================================================
}
}
}
if(PlayerMoraleSpree[playerid] > -15 && PlayerMoraleSpree[playerid] < 25)
{
PlayerMoraleSpree[playerid]--;
printf("playerid: %d", PlayerMoraleSpree[playerid]); //Wird nicht geprintet! ==========================================================
switch(PlayerMoraleSpree[playerid])
{
case -15:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[playerid]);
PlayerMorale[playerid] = -10;
DamageModifier[playerid] = 1.025;
HealthModifier[playerid] = 1.10;
PlayerTextDrawSetString(playerid, TD_Morale[playerid][3], spree);
PlayerTextDrawSetString(playerid, TD_Morale[playerid][2], "~d~");
PlayerTextDrawSetString(playerid, TD_Morale[playerid][1], "~r~-10%");
PlayerTextDrawBoxColor(playerid, TD_Morale[playerid][0], C_RED);
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
print("-15"); //Wird nicht geprintet! ===================================================================================
}
case -14..-5:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[playerid]);
PlayerMorale[playerid] = -5;
DamageModifier[playerid] = 1.01;
HealthModifier[playerid] = 1.05;
PlayerTextDrawSetString(playerid, TD_Morale[playerid][3], spree);
PlayerTextDrawSetString(playerid, TD_Morale[playerid][2], "~d~");
PlayerTextDrawSetString(playerid, TD_Morale[playerid][1], "~r~~h~-5%");
PlayerTextDrawBoxColor(playerid, TD_Morale[playerid][0], C_RED);
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
print("-14..-15"); //Wird nicht geprintet! ===============================================================================
}
case -4..-1:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[playerid]);
PlayerMorale[playerid] = 0;
DamageModifier[playerid] = 1.0;
HealthModifier[playerid] = 1.0;
PlayerTextDrawSetString(playerid, TD_Morale[playerid][3], spree);
PlayerTextDrawSetString(playerid, TD_Morale[playerid][2], "~t~");
PlayerTextDrawSetString(playerid, TD_Morale[playerid][1], "~w~0%");
PlayerTextDrawBoxColor(playerid, TD_Morale[playerid][0], C_GREEN);
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
print("-4..-1"); //Wird nicht geprintet! ===================================================================================
}
case 0..9:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[playerid]);
PlayerMorale[playerid] = 0;
PlayerMoraleSpree[playerid] = 0;
DamageModifier[playerid] = 1.0;
HealthModifier[playerid] = 1.0;
PlayerTextDrawSetString(playerid, TD_Morale[playerid][3], spree);
PlayerTextDrawSetString(playerid, TD_Morale[playerid][2], "~t~");
PlayerTextDrawSetString(playerid, TD_Morale[playerid][1], "~w~0%");
PlayerTextDrawBoxColor(playerid, TD_Morale[playerid][0], C_GREEN);
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
print("0..9"); //Wird nicht geprintet! ===================================================================================
}
case 10..24:
{
new
spree[4];format(spree, sizeof(spree), "%d", PlayerMoraleSpree[playerid]);
PlayerMorale[playerid] = 5;
PlayerMoraleSpree[playerid] = 10;
DamageModifier[playerid] = 1.01;
HealthModifier[playerid] = 1.05;
PlayerTextDrawSetString(playerid, TD_Morale[playerid][3], spree);
PlayerTextDrawSetString(playerid, TD_Morale[playerid][2], "~u~");
PlayerTextDrawSetString(playerid, TD_Morale[playerid][1], "~b~~h~+5%");
PlayerTextDrawBoxColor(playerid, TD_Morale[playerid][0], C_BLUE);
PlayerTextDrawShow(playerid, TD_Morale[playerid][0]);
print("10..24"); //Wird nicht geprintet! ===================================================================================
}
}
}
}
}
return 1;
}Erklärung: PlayerMoraleSpree ist eine Zählvariable. Die Variable des Killers wird pro Kill um 1 erhöht, und die des Opfers um 1 verkleinert. Wie gesagt, die Variablen sind global deklariert und unter OnPlayerConnect initialisiert auf den Wert 0.
-
Es wird alles bis zur if-Abfrage aufgerufen. Die letzte Funktion, die ausgeführt wird, ist "SetPlayerHealth(playerid, FLOAT_INFINITY);".
Edit: Es liegt an ClearAnimations(playerid);.
Die Funktion bewirkt, dass OnPlayerSpawn sofort aufgerufen wird. Wenn ich sie beseitige, dann funktioniert alles, allerdings brauche ich sie drinnen. Und ich hab kp wohin.^^ -
Das hab ich schon korrigiert, das geht ebenfalls nicht.
-
Das ist leider nicht die Lösung. Es wird immer noch nichts geprintet.
-
Irgendwie wird nichts geprintet. Ich setze die Variablen beide auf 0, wenn der Spieler dem Server beitritt, und die Abfrage lautet doch, ob der Wert zwischen -15 und 25 liegt.
new PlayerMorale[MAX_PLAYERS];
new PlayerMoraleSpree[MAX_PLAYERS];//OnPlayerConnect
PlayerMorale[playerid] = 0;
PlayerMoraleSpree[playerid] = 0;//OnPlayerDeath
new w = GetPlayerVirtualWorld(playerid);
switch(w)
{
case 0:
{
GetPlayerPos(playerid, GlobalX[playerid], GlobalY[playerid], GlobalZ[playerid]);
GetPlayerFacingAngle(playerid, GlobalFA[playerid]);SavePlayerWeapons(playerid);
ResetPlayerWeapons(playerid);Condition[playerid] = CONDITION_DOWNED;
ClearAnimations(playerid);
SetPlayerHealth(playerid, FLOAT_INFINITY);
if(-15 < PlayerMoraleSpree[killerid] < 25)
{
PlayerMoraleSpree[killerid]++;
printf("%d", PlayerMoraleSpree[killerid]);
}
if(-15 < PlayerMoraleSpree[playerid] < 25)
{
PlayerMoraleSpree[playerid]--;
printf("%d", PlayerMoraleSpree[playerid]);
}
if(killerid == INVALID_PLAYER_ID)
{
PlayerMoraleSpree[playerid]--;
printf("%d", PlayerMoraleSpree[playerid]);
}
}
return 1;
}