ReGameDLL [Meta-Plugin] Fix Custom iMaxClip

Vaqtincha

Разработчик
Регистрация
28 Янв 2018
Сообщения
499
Симпатии
303
#1
Автор: Vaqtincha
Версия: 0.1


Описание:
Мета-Плагин который исправляет баг с перезарядкой (при cl_lw 1) у кастомных оружей если установлен кол-во патронов (iMaxClip) больше или меньше чем дефолтный. Это скорее не баг на самом деле. В предикшене просто отсутствует передача iMaxClip а при cl_lw 1 клиент "думает" патроны меньше и при нажатии кнопки перезарядки начинает проигривать анимацию.
Всячески попытались исправить тут

Мой способ простой и эффективный. Я отправляю iClip дефолтным iMaxClip если iClip равно на кастомный iMaxClip. Юзается хук GetWeaponData. Это один из причин почему не написал амхх плагин. Другая причина это функция часто вызывается для клиентов с cl_lw 1

Скомпилил только под win (тк нет возможности под lin скомпилировать) исходники прикрипляю для желающих компилить под линукс.
Плагин использует апи от регейма.
 

Вложения

Последнее редактирование: Vaqtincha

perfectblood0

Команда форума
Администратор
Регистрация
29 Окт 2017
Сообщения
1.777
Симпатии
574
#3

Vaqtincha

Разработчик
Регистрация
28 Янв 2018
Сообщения
499
Симпатии
303
#6
d3m37r4, Пока нужны тесты и подтверждение что хак работает.
8 Окт 2019
И все равно там трата времени. пр никогда не принимают.
 
Последнее редактирование: Vaqtincha

Phantom

Пользователь
Регистрация
8 Июн 2017
Сообщения
141
Симпатии
65
#7
Код:
int GetWeaponData_Post(edict_t *pEdict, struct weapon_data_s *info)
{
    CBasePlayer *pPlayer = (CBasePlayer *)GET_PRIVATE(pEdict);
    
    if (!pPlayer)
        RETURN_META_VALUE(MRES_IGNORED, 1);

    //for (int i = PRIMARY_WEAPON_SLOT; i <= PISTOL_SLOT; i++)
    {
        //auto pPlayerItem = pPlayer->m_rgpPlayerItems[i];
        
        //while (pPlayerItem)
        {
            // auto pWeapon = (CBasePlayerWeapon *)pPlayerItem->GetWeaponPtr();
            auto pWeapon = (CBasePlayerWeapon *)pPlayer->m_pActiveItem;

            if (pWeapon && pWeapon->UseDecrement())
            {
                WeaponIdType WeaponID = (WeaponIdType)pWeapon->m_iId;

                if (WeaponID >= WEAPON_P228 && WeaponID <= WEAPON_P90)
                {
                    CCSPlayerItem *pItem = pWeapon->CSPlayerItem();
                    int iMax = pItem->m_ItemInfo.iMaxClip;

                    if (iMax > g_iMaxClip[WeaponID] || iMax < g_iMaxClip[WeaponID])
                    {
                        if (pWeapon->m_iClip == iMax)
                        {
                            auto item = &info[WeaponID];
                            item->m_iClip = g_iMaxClip[WeaponID]; // send def max clip
                            
                            //CONSOLE_PRINT("iId %i m_iClip %i iMaxClip %i def %i ", WeaponID, pWeapon->m_iClip, iMax, g_iMaxClip[WeaponID]);
                        }
                    }
                }
            }

            //pPlayerItem = pPlayerItem->m_pNext;
        }
    }

    RETURN_META_VALUE(MRES_IGNORED, 1);
}
Vaqtincha, для чего закомментил некоторые строчки?