[0.3d]OnPlayerDeath glitch?
#1

Hey guys. I have some code in my OnPlayerDeath callback. Now, when a player dies but isn't killed by any other player, ex. falling, it only runs some of the code but not all of it... Any ideas? Heres the code:
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    SendDeathMessage(killerid, playerid, reason);
    TogglePlayerSpectating(playerid, true);
    PlayerSpectatePlayer(playerid, killerid);
    SetTimerEx("spec", 5000, false, "i", playerid);

    HandleKS(playerid, killerid);

    SetPlayerScore(killerid, GetPlayerScore(killerid)+1);

    if(pInfo[playerid][team] == 0)
    {
        gt--;
    }
    else if(pInfo[playerid][team] == 1)
    {
        bt--;
    }

    TextDrawHideForPlayer(playerid, rTD[playerid]);
    TextDrawHideForPlayer(playerid, kdTD[playerid]);
    TextDrawHideForPlayer(killerid, rTD[killerid]);
    TextDrawHideForPlayer(killerid, kdTD[killerid]);

    pInfo[playerid][deaths]++;
    pInfo[killerid][kills]++;

    if(pInfo[killerid][kills] >= 25)
    {
        pInfo[killerid][rank] = 2;
    }
    else if(pInfo[killerid][kills] >= 50)
    {
        pInfo[killerid][rank] = 3;
    }
    else if(pInfo[killerid][kills] >= 75)
    {
        pInfo[killerid][rank] = 4;
    }
    else if(pInfo[killerid][kills] >= 100)
    {
        pInfo[killerid][rank] = 5;
    }
    else if(pInfo[killerid][kills] >= 125)
    {
        pInfo[killerid][rank] = 6;
    }
    else if(pInfo[killerid][kills] >= 150)
    {
        pInfo[killerid][rank] = 7;
    }
    else
    {
        pInfo[killerid][rank] = 1;
    }

    new tdS2[10];
    format(tdS2, sizeof(tdS2), "RANK: %i", pInfo[killerid][rank]);
    TextDrawSetString(rTD[killerid], tdS2);

    new tdsS2[10];
    format(tdsS2, sizeof(tdS2), "%i:%i", pInfo[killerid][kills], pInfo[killerid][deaths]);
    TextDrawSetString(kdTD[killerid], tdsS2);

    TextDrawShowForPlayer(killerid, kdTD[killerid]);
    TextDrawShowForPlayer(killerid, rTD[killerid]);
    return 1;
}
I cant figure it out. When a player kills another player, it works like a charm. However, when a player just dies, it doesnt get to the part where it edits the text draws. They still show up. AND, they stay the same. Any ideas? PLEASE HELP! URGENT! THX!
Reply
#2

Check that the killerid is valid.

pawn Код:
if(killerid != INVALID_PLAYER_ID)
{
    // Do stuff with killerid
}
else
{
    // There is no killerid, don't set a value for killerid here
}
Reply
#3

so... i should put all my code in the if and the else part? or just the top one? ooooh... you mean... alrighty... but then how to i ... im confused... ill figure it out. thanks.
Reply
#4

I got this, but it still doesnt work:
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    if(killerid != INVALID_PLAYER_ID)
    {
        SendDeathMessage(killerid, playerid, reason);
        TogglePlayerSpectating(playerid, true);
        PlayerSpectatePlayer(playerid, killerid);
        SetTimerEx("spec", 5000, false, "i", playerid);

        HandleKS(playerid, killerid);

        SetPlayerScore(killerid, GetPlayerScore(killerid)+1);

        if(pInfo[playerid][team] == 0)
        {
            gt--;
        }
        else if(pInfo[playerid][team] == 1)
        {
            bt--;
        }

        TextDrawHideForPlayer(playerid, rTD[playerid]);
        TextDrawHideForPlayer(playerid, kdTD[playerid]);
        TextDrawHideForPlayer(killerid, rTD[killerid]);
        TextDrawHideForPlayer(killerid, kdTD[killerid]);

        pInfo[playerid][deaths]++;
        pInfo[killerid][kills]++;

        if(pInfo[killerid][kills] >= 25)
        {
            pInfo[killerid][rank] = 2;
        }
        else if(pInfo[killerid][kills] >= 50)
        {
            pInfo[killerid][rank] = 3;
        }
        else if(pInfo[killerid][kills] >= 75)
        {
            pInfo[killerid][rank] = 4;
        }
        else if(pInfo[killerid][kills] >= 100)
        {
            pInfo[killerid][rank] = 5;
        }
        else if(pInfo[killerid][kills] >= 125)
        {
            pInfo[killerid][rank] = 6;
        }
        else if(pInfo[killerid][kills] >= 150)
        {
            pInfo[killerid][rank] = 7;
        }
        else
        {
            pInfo[killerid][rank] = 1;
        }

        new tdS2[10];
        format(tdS2, sizeof(tdS2), "RANK: %i", pInfo[killerid][rank]);
        TextDrawSetString(rTD[killerid], tdS2);

        new tdsS2[10];
        format(tdsS2, sizeof(tdS2), "%i:%i", pInfo[killerid][kills], pInfo[killerid][deaths]);
        TextDrawSetString(kdTD[killerid], tdsS2);

        TextDrawShowForPlayer(killerid, kdTD[killerid]);
        TextDrawShowForPlayer(killerid, rTD[killerid]);
    }
    else
    {
        SendDeathMessage(killerid, playerid, reason);
        TogglePlayerSpectating(playerid, true);
        PlayerSpectatePlayer(playerid, killerid);
        SetTimerEx("spec", 5000, false, "i", playerid);

        HandleKS(playerid, killerid);

        if(pInfo[playerid][team] == 0)
        {
            gt--;
        }
        else if(pInfo[playerid][team] == 1)
        {
            bt--;
        }

        TextDrawHideForPlayer(playerid, rTD[playerid]);
        TextDrawHideForPlayer(playerid, kdTD[playerid]);

        pInfo[playerid][deaths]++;
    }
    return 1;
}
Reply
#5

sorry for that bump. just so u no, i had to move the handleks function to be AFTER i remove the text draws. idk y. it does return./. o well. it works
Reply
#6

don't bump threads, it's stopping because the killerid is invalid which is a really high number like 65535 and you're trying to access an array index still which it can't reach and the script stops
Reply
#7

Here you go:

pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    SendDeathMessage(killerid, playerid, reason);
    TextDrawHideForPlayer(playerid, rTD[playerid]);
    TextDrawHideForPlayer(playerid, kdTD[playerid]);

    if(killerid != INVALID_PLAYER_ID) // Valid killer
    {
        TogglePlayerSpectating(playerid, true);
        PlayerSpectatePlayer(playerid, killerid);
        SetTimerEx("spec", 5000, false, "i", playerid);
        HandleKS(playerid, killerid);
        SetPlayerScore(killerid, GetPlayerScore(killerid)+1);
        TextDrawHideForPlayer(killerid, rTD[killerid]);
        TextDrawHideForPlayer(killerid, kdTD[killerid]);

        pInfo[killerid][kills]++;
        if(pInfo[killerid][kills] >= 25)
        {
            pInfo[killerid][rank] = 2;
        }
        else if(pInfo[killerid][kills] >= 50)
        {
            pInfo[killerid][rank] = 3;
        }
        else if(pInfo[killerid][kills] >= 75)
        {
            pInfo[killerid][rank] = 4;
        }
        else if(pInfo[killerid][kills] >= 100)
        {
            pInfo[killerid][rank] = 5;
        }
        else if(pInfo[killerid][kills] >= 125)
        {
            pInfo[killerid][rank] = 6;
        }
        else if(pInfo[killerid][kills] >= 150)
        {
            pInfo[killerid][rank] = 7;
        }
        else
        {
            pInfo[killerid][rank] = 1;
        }

        new tdS2[10];
        format(tdS2, sizeof(tdS2), "RANK: %i", pInfo[killerid][rank]);
        TextDrawSetString(rTD[killerid], tdS2);

        new tdsS2[10];
        format(tdsS2, sizeof(tdS2), "%i:%i", pInfo[killerid][kills], pInfo[killerid][deaths]);
        TextDrawSetString(kdTD[killerid], tdsS2);

        TextDrawShowForPlayer(killerid, kdTD[killerid]);
        TextDrawShowForPlayer(killerid, rTD[killerid]);
    }

    if(pInfo[playerid][team] == 0)
    {
        gt--;
    }
    else if(pInfo[playerid][team] == 1)
    {
        bt--;
    }

    pInfo[playerid][deaths]++;
    }
    return 1;
}
Should work fine.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)