SA-MP Forums Archive
GetPlayerWeaponData doesn't return the correct info - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP (https://sampforum.blast.hk/forumdisplay.php?fid=3)
+--- Forum: Bug Reports (https://sampforum.blast.hk/forumdisplay.php?fid=20)
+--- Thread: GetPlayerWeaponData doesn't return the correct info (/showthread.php?tid=596346)



GetPlayerWeaponData doesn't return the correct info - Cypress - 16.12.2015

Well, I've been trying to create a list of weapons and it seems that GetPlayerWeaponData limits it.

A better example would be to give player some weapons and run GetPlayerWeaponData. It returns the correct info till now. After, give the player another weapon and run GetPlayerWeaponData again. Guess what? The new weapon you just gave the player isn't returned by the function.

pawn Код:
CMD:test( playerid )
{
        GivePlayerWeapon( playerid, 24, 300 );
        GivePlayerWeapon( playerid, 25, 300 );

    new
                weapon_id_test[ 13 ],
                weapon_ammo_test[ 13 ]
            ;

            for ( new i = 0; i <= 12; i ++ )
            {
                GetPlayerWeaponData( playerid, i, weapon_id_test[ i ], weapon_ammo_test[ i ] );
                printf("Weapon: %d and ammo: %d", weapon_id_test[ i ], weapon_ammo_test[ i ] );
            }

            GivePlayerWeapon( playerid, 31, 300 );

            new
                w_data[13][2];

            for(new a = 0; a < 13; a++)
            {
                GetPlayerWeaponData(playerid, a, w_data[a][0], w_data[a][1]);
                printf("Weaponry for slot %i: weapon (%i), amount (%i)", a, w_data[a][0], w_data[a][1]);
            }
            return 1;
}
If there is something I did wrong, just let me know in the comments bellow. Thanks.


Re: GetPlayerWeaponData doesn't return the correct info - RoboN1X - 16.12.2015

I saw, there is nothing wrong. I tested and it actually returns data before that command was used (even though guns are given on command).

I guess GetPlayerWeaponData is not server sided weapon data, so both function (perhaps, getplayerweapon too) need to wait for player sync. I think without this, an anti-cheat script would have failure possibility. All you can do is probably to wait (by using timer).


Re: GetPlayerWeaponData doesn't return the correct info - SickAttack - 16.12.2015

Two workarounds available:

1. No sync (to be used only when needed):

pawn Код:
// ** INCLUDES

#include <a_samp>
#include <zcmd>

// ** VARIABLES

// *** PER-PLAYER VARIABLES

// **** GLOBAL

new pWeaponData[MAX_PLAYERS][2][13];

// ** MAIN

main()
{
    print("Loaded \"get_player_weapon_data_no_sync.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

// ** COMMANDS

CMD:weapondata1(playerid, params[])
{
    new string[144], weapon_id[13], weapon_ammo[13];
    GivePlayerWeapon_NoSync(playerid, 26, 500);

    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData_NoSync(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}

CMD:weapondata2(playerid, params[])
{
    new string[144], weapon_id[13], weapon_ammo[13];
    GivePlayerWeapon_NoSync(playerid, 27, 500);

    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData_NoSync(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}

// ** FUNCTIONS

stock GivePlayerWeapon_NoSync(playerid, weapon_id, weapon_ammo)
{
    new weapon_data[2], slot = GetWeaponSlot(weapon_id);
    GetPlayerWeaponData(playerid, slot, weapon_data[0], weapon_data[1]);

    if(weapon_data[1] >= 1)
    {
        pWeaponData[playerid][1][slot] = weapon_data[1] + weapon_ammo;
    }
    else
    {
        pWeaponData[playerid][0][slot] = weapon_id;
        pWeaponData[playerid][1][slot] = weapon_ammo;
    }
    return GivePlayerWeapon(playerid, weapon_id, weapon_ammo);
}

stock GetPlayerWeaponData_NoSync(playerid, slot, &weapon_id, &weapon_ammo)
{
    weapon_id = pWeaponData[playerid][0][slot];
    weapon_ammo = pWeaponData[playerid][1][slot];
    return 1;
}

stock GetWeaponSlot(weaponid)
{
    new slot;
    switch(weaponid)
    {
        case 0, 1: slot = 0;
        case 2, 3, 4, 5, 6, 7, 8, 9: slot = 1;
        case 22, 23, 24: slot = 2;
        case 25, 26, 27: slot = 3;
        case 28, 29, 32: slot = 4;
        case 30, 31: slot = 5;
        case 33, 34: slot = 6;
        case 35, 36, 37, 38: slot = 7;
        case 16, 17, 18, 39: slot = 8;
        case 41, 42, 43: slot = 9;
        case 10, 11, 12, 13, 14, 15: slot = 10;
        case 44, 45, 46: slot = 11;
        case 40: slot = 12;
    }
    return slot;
}
2. Delay:

pawn Код:
// ** INCLUDES

#include <a_samp>
#include <zcmd>

// ** VARIABLES

// *** PER-PLAYER VARIABLES

// **** TIMERS

new tmPrintPlayerWeaponData[MAX_PLAYERS];

// ** MAIN

main()
{
    print("Loaded \"get_player_weapon_data_delay.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    KillTimer(tmPrintPlayerWeaponData[playerid]);
    return 1;
}

// ** COMMANDS:

CMD:weapondata(playerid, params[])
{
    GivePlayerWeapon(playerid, 24, 300);
    GivePlayerWeapon(playerid, 25, 300);
    GivePlayerWeapon(playerid, 31, 300);

    tmPrintPlayerWeaponData[playerid] = SetTimerEx("PrintPlayerWeaponData", 500, false, "i", playerid);
    return 1;
}

// ** FUNCTIONS

forward PrintPlayerWeaponData(playerid);
public PrintPlayerWeaponData(playerid)
{
    new string[144], weapon_id[13], weapon_ammo[13];
    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}



Re: GetPlayerWeaponData doesn't return the correct info - Cypress - 16.12.2015

Quote:
Originally Posted by SickAttack
Посмотреть сообщение
Two workarounds available:

1. No sync (to be used only when needed):

pawn Код:
// ** INCLUDES

#include <a_samp>
#include <zcmd>

// ** VARIABLES

// *** PER-PLAYER VARIABLES

// **** GLOBAL

new pWeaponData[MAX_PLAYERS][2][13];

// ** MAIN

main()
{
    print("Loaded \"get_player_weapon_data_no_sync.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

// ** COMMANDS

CMD:weapondata1(playerid, params[])
{
    new string[144], weapon_id[13], weapon_ammo[13];
    GivePlayerWeapon_NoSync(playerid, 26, 500);

    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData_NoSync(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}

CMD:weapondata2(playerid, params[])
{
    new string[144], weapon_id[13], weapon_ammo[13];
    GivePlayerWeapon_NoSync(playerid, 27, 500);

    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData_NoSync(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}

// ** FUNCTIONS

stock GivePlayerWeapon_NoSync(playerid, weapon_id, weapon_ammo)
{
    new weapon_data[2], slot = GetWeaponSlot(weapon_id);
    GetPlayerWeaponData(playerid, slot, weapon_data[0], weapon_data[1]);

    if(weapon_data[1] >= 1)
    {
        pWeaponData[playerid][1][slot] = weapon_data[1] + weapon_ammo;
    }
    else
    {
        pWeaponData[playerid][0][slot] = weapon_id;
        pWeaponData[playerid][1][slot] = weapon_ammo;
    }
    return GivePlayerWeapon(playerid, weapon_id, weapon_ammo);
}

stock GetPlayerWeaponData_NoSync(playerid, slot, &weapon_id, &weapon_ammo)
{
    weapon_id = pWeaponData[playerid][0][slot];
    weapon_ammo = pWeaponData[playerid][1][slot];
    return 1;
}

stock GetWeaponSlot(weaponid)
{
    new slot;
    switch(weaponid)
    {
        case 0, 1: slot = 0;
        case 2, 3, 4, 5, 6, 7, 8, 9: slot = 1;
        case 22, 23, 24: slot = 2;
        case 25, 26, 27: slot = 3;
        case 28, 29, 32: slot = 4;
        case 30, 31: slot = 5;
        case 33, 34: slot = 6;
        case 35, 36, 37, 38: slot = 7;
        case 16, 17, 18, 39: slot = 8;
        case 41, 42, 43: slot = 9;
        case 10, 11, 12, 13, 14, 15: slot = 10;
        case 44, 45, 46: slot = 11;
        case 40: slot = 12;
    }
    return slot;
}
2. Delay:

pawn Код:
// ** INCLUDES

#include <a_samp>
#include <zcmd>

// ** VARIABLES

// *** PER-PLAYER VARIABLES

// **** TIMERS

new tmPrintPlayerWeaponData[MAX_PLAYERS];

// ** MAIN

main()
{
    print("Loaded \"get_player_weapon_data_delay.amx\".");
}

// ** CALLBACKS

public OnGameModeInit()
{
    return 1;
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    KillTimer(tmPrintPlayerWeaponData[playerid]);
    return 1;
}

// ** COMMANDS:

CMD:weapondata(playerid, params[])
{
    GivePlayerWeapon(playerid, 24, 300);
    GivePlayerWeapon(playerid, 25, 300);
    GivePlayerWeapon(playerid, 31, 300);

    tmPrintPlayerWeaponData[playerid] = SetTimerEx("PrintPlayerWeaponData", 500, false, "i", playerid);
    return 1;
}

// ** FUNCTIONS

forward PrintPlayerWeaponData(playerid);
public PrintPlayerWeaponData(playerid)
{
    new string[144], weapon_id[13], weapon_ammo[13];
    for(new i = 0; i < 13; i ++)
    {
        GetPlayerWeaponData(playerid, i, weapon_id[i], weapon_ammo[i]);

        format(string, sizeof(string), "Slot: %d - Weapon ID: %d - Ammo: %d", i, weapon_id[i], weapon_ammo[i]);
        SendClientMessage(playerid, -1, string);
    }
    return 1;
}
I'm aware that workarounds are available. Thanks for sharing though