Здравствуйте!
Столкнулся с интересным моментом при получении кол-ва пулек на игроке, небольшой код плагина:
Показывает верный запас - 160 пулек.
Дальше я залез в реапи и скопировал алгоритм натива
Какой-то бредовый код, подумал я, и поковырявшись в регейм упростил его до:
Получив опять в
И вуаля, мои 160 пулек для АК47 идут не под индексом 2, а под индексом 1... А пульки для дигла не под индексом 8, а под индексом 7. Заменяем строку на:
И вроде все работает... Но меня терзают смутные сомнения... Почему из плагина реапишная
Забыл показать что такое item:
Такое ощущение, что указатель
Столкнулся с интересным моментом при получении кол-ва пулек на игроке, небольшой код плагина:
Код:
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 и все новые свойства и указатели на функции добавляются тупо в конец "класса".
Последнее редактирование: