Beiträge von Manyula

    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?

    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;
    }

    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.

    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.

    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! 8o
    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.^^

    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;
    }