Индексы m_rgAmmo[]

  • Автор темы Автор темы Refresh
  • Дата начала Дата начала

Refresh

Скриптер
Участник
Сообщения
45
Реакции
7
Баллы
8
Здравствуйте!

Столкнулся с интересным моментом при получении кол-ва пулек на игроке, небольшой код плагина:
Код:
new ammo, active_item = get_member(target_id, m_pActiveItem);
if (!is_nullent(active_item)) {
    ammo = rg_get_user_bpammo(id, get_member(active_item, m_iId));
}
client_print(id, print_chat, "TARGET = %d, ACTIVE = %d, WID = %d, AMMO = %d", target_id, active_item, get_member(active_item, m_iId), ammo);

Показывает верный запас - 160 пулек.

Дальше я залез в реапи и скопировал алгоритм натива rg_get_user_bpammo, и получил 0 пулек в m_rgAmmo[] по индексу m_iPrimaryAmmoType...
Код:
CBasePlayerWeapon *wp = nullptr;
auto wp_info = g_ReGameApi->GetWeaponSlot(static_cast<WeaponIdType>(item->m_iId));
if (wp_info)
{
    wp = pl_from->ForEachItem<CBasePlayerWeapon>([ wp_info ](CBasePlayerWeapon *wp) {
        return (wp->IsWeapon() && wp->m_iId == wp_info->id);
    });
    if (wp)
    {
        bp_ammo = pl_from->m_rgAmmo[ wp->m_iPrimaryAmmoType ];
        DEBUG("%s(): from %s, GET AMMO = %d, TYPE = %d, WP = %p", __func__, findPluginFast(amx)->getName(), bp_ammo, wp->m_iPrimaryAmmoType, wp);
    }
}

Какой-то бредовый код, подумал я, и поковырявшись в регейм упростил его до:
Код:
int bp_ammo = 0;
auto ammo_type = item->PrimaryAmmoIndex();
if (ammo_type)
{
    bp_ammo = pl_from->m_rgAmmo[ ammo_type ];
    DEBUG("%s(): from %s, GET AMMO = %d, TYPE = %d", __func__, findPluginFast(amx)->getName(), bp_ammo, ammo_type);
}

Получив опять в bp_ammo = 0. Поковырявшись часик, я задампил весь массив в отладку:
Код:
auto pl_from = UTIL_PlayerByIndex(params[arg_from_id]);
for (int i = 0; i < MAX_AMMO_SLOTS; i++)
    DEBUG("%s(): from %s, GET AMMO[%d] = %d", __func__, findPluginFast(amx)->getName(), i, pl_from->m_rgAmmo[ i ]);

И вуаля, мои 160 пулек для АК47 идут не под индексом 2, а под индексом 1... А пульки для дигла не под индексом 8, а под индексом 7. Заменяем строку на:
Код:
auto ammo_type = item->PrimaryAmmoIndex() - 1;

И вроде все работает... Но меня терзают смутные сомнения... Почему из плагина реапишная rg_get_user_bpammo дает правильное кол-во пулек, а мой "эквивалент" нет... У меня где-то косяк?
Сообщение автоматически объединено:

Забыл показать что такое item:
Код:
auto item = (CBasePlayerItem *)GET_PRIVATE(INDEXENT(index));
Сообщение автоматически объединено:

Такое ощущение, что указатель item на CBasePlayerItem почему-то сдвинут на -1. Или я выбрал приведение ни к тому базовому типу... надо еще проверитьCBasePlayerWeapon... Хотя, по-моему, любую энтити можно привести к любому типу, поскольку наследование идет через vitrual и все новые свойства и указатели на функции добавляются тупо в конец "класса".
 
Последнее редактирование:
Заменил приведение item к CBasePlayerWeapon результат не поменялся, индексы в массиве m_rgAmmo[]сдвинуты "на 1 вниз"... Надо еще попробовать обновить инклуды из новой регейм, может быть там какой-то гений добавил новое свойство типа int базового класса где-нибудь в середине, перед m_rgAmmo[].... Проверю описание базовых классов...
Сообщение автоматически объединено:

Нууу.. Точно! :ROFLMAO: :ROFLMAO: :ROFLMAO:
1761208458729.png


Пик (+1 int32):
1761208485423.png


Поэтому у меня и краши полезли....
 
Последнее редактирование:
За 0
@Javekson, разобрался... Твой коммит не при чем, извини. :(

В cdll_dll.h из cssdk:

Код:
const int MAX_WEAPON_SLOTS = 5;        // hud item selection slots
const int MAX_ITEM_TYPES   = 6;        // hud item selection slots
const int MAX_AMMO_SLOTS   = 32;    // not really slots
const int MAX_ITEMS        = 4;        // hard coded item types

const int DEFAULT_FOV      = 90;    // the default field of view

А в файлике amxxmodule.h параметр MAX_ITEMS был равен 5:
Код:
#define UD_FINDPLUGIN    3
#define UD_DEBUGGER        2
#define UD_OPCODELIST    1
#define    UD_HANDLER        0
#define    UT_NATIVE        3
#define UT_OPTIMIZER    2
#define UT_BROWSEHOOK    1
#define UT_BINLOGS        0

#define MAX_REG_MSGS                256 + 16
#define MAX_WEAPONS                    32        // ???
#define MAX_WEAPON_SLOTS            5    // hud item selection slots
#define MAX_ITEM_TYPES                6    // hud item selection slots
//#define MAX_ITEMS                    5    // hard coded item types     <==========================
#define    MAX_AMMO_TYPES                32        // ???
#define MAX_AMMO_SLOTS              32        // not really slots

#define HUD_PRINTNOTIFY                1
#define HUD_PRINTCONSOLE            2
#define HUD_PRINTTALK                3
#define HUD_PRINTCENTER                4

#define WEAPON_SUIT                    31

Ну и в player.h из cssdk получался сдвиг +1 на строке:
Код:
int m_rgItems[MAX_ITEMS];
 
За 0

Кто просматривает тему

Назад
Верх