Modyfikowanie pingu gracza – SVC_PINGS

Modyfikowanie pingu gracza odbywa się poprzez wysyłanie message SVC_PINGS.

Jego budowę można poznać tutaj

https://wiki.alliedmods.net/Half-Life_1_Engine_Messages#SVC_PINGS

Message ma dość specyficzną budowę.

W kolejnych polach wypełniamy strukturę Flag + PlayerID + Ping + Loss niestety struktura jest cieżka do wypełnienia poprzez funkcje amxx’a.

Warto jednak spojrzeć w ten przykładowy kod powinno to trochę wyjaśnić sytuację.

#include <amxmodx>
#include <fakemeta>

public plugin_init()
{
    register_forward(FM_UpdateClientData, "fw_updateClientData")
}

public fw_updateClientData(id)
{
    // Scoreboard key being pressed?
    if (!(pev(id, pev_button) & IN_SCORE) && !(pev(id, pev_oldbuttons) & IN_SCORE))
        return;
        
    new ping = 928 // make sure it's not negative or above 4095
    new ping1
    new ping2
    new offset1
    new offset2
    new sending

    for(new player = 1; player < get_maxplayers(); player++)
    {
        if(!is_user_connected(id))
            continue;
    
        for(new offset1 = 0; offset1 < 4; offset1++)
        {
            if ((ping - offset1) % 4 == 0)
            {
                ping1 = (ping - offset1) / 4
                break;
            }
        }

        for(new offset2 = 0; offset2 < 2; offset2++)
        {
            if ((ping - offset2) % 2 == 0)
            {
                ping2 = (ping - offset2) / 4
                break;
            }
        }

        switch(sending)
        {
            case 0:
            {
                message_begin(MSG_ONE_UNRELIABLE, SVC_PINGS, _, id)
                write_byte((offset1 * 64) + (1 + 2 * (player - 1)))
                write_short(ping1)

                sending++
            }
            case 1:
            {
                write_byte((offset2 * 128) + (2 + 4 * (player - 1)))
                write_short(ping2)

                sending++
            }
            case 2:
            {
                write_byte((4 + 8 * (player - 1)))
                write_short(ping)
                write_byte(0)
                message_end()

                sending = 0
            }
        }
    }
    
    if(sending)
    {
        write_byte(0)
        message_end()
    }
}

Dodatkowo warto spojrzeć na ten plugin https://forums.alliedmods.net/showthread.php?p=767048?p=767048

W końcu nic tak nie rozjaśnia sytuacji jak kod 😉

Dodaj komentarz