Русское сообщество по скриптингу

вопрос про функции CWeaponBox::GiveAmmo

Все вопросы по скриптингу для Metamod, помощь в редактировании плагинов.
Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для
Metamod.


Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник плагина.

вопрос про функции CWeaponBox::GiveAmmo

Сообщение Vaqtincha » 28 май 2018, 14:12

Есть такой код странный
Код: Выделить всё
int CWeaponBox::GiveAmmo(int iCount, char *szName, int iMax, int *pIndex)
{
    int i;
    for (= 1; i < MAX_AMMO_SLOTS && !FStringNull(m_rgiszAmmo[i]); i++)
    {
        if (!Q_stricmp(szName, STRING(m_rgiszAmmo[i])))
        {
            if (pIndex)
                *pIndex = i;

            int iAdd = Q_min(iCount, iMax - m_rgAmmo[i]);
            if (iCount == 0 || iAdd > 0)
            {
                m_rgAmmo[i] += iAdd;
                return i;
            }

            return -1;
        }
    }

    if (< MAX_AMMO_SLOTS)
    {
        if (pIndex)
            *pIndex = i;

        m_rgiszAmmo[i] = MAKE_STRING(szName);
        m_rgAmmo[i] = iCount;

        return i;
    }

    ALERT(at_console, "out of named ammo slots\n");
    return i;
}


Он не логичный не так ли ?
Для чего 4й аргумент pIndex если мы все равно возврашаем индекс.

Короче можно ли просто упростить код вот так:

Код: Выделить всё
int CWeaponBox::GiveAmmo(int iCount, char *szName, int iMax)
{
    int iAmmoIndex = GetAmmoIndex(szName);
    
    if 
(iAmmoIndex < 0 || iAmmoIndex >= MAX_AMMO_SLOTS)
    {
        ALERT(at_console, "out of named ammo slots\n");
        return -1;
    }
    
    int iAdd 
= Q_min(iCount, iMax - m_rgAmmo[iAmmoIndex]);
    
    if 
(iAdd < 1)
        return iAmmoIndex;

    m_rgAmmo[iAmmoIndex] += iAdd;
 
   if (FStringNull(m_rgiszAmmo[iAmmoIndex])) {
    
m_rgiszAmmo[iAmmoIndex] = MAKE_STRING(szName);
    }

    return iAmmoIndex;
}


Теперь аммо хранит не в первой ячейке массива а "по человечески"

зы: я знаю что в веапонбокс можно упоковать больше чем одного оружие (в кс не юзается)

Добавлено спустя 15 минут 38 секунд:
вот наглядный пример как он вызывает путаницу

Код: Выделить всё
stock WeaponBox_PackAmmo(const pWeaponBox, const iAmmoId, const iCount)
{
    const MAX_AMMO_TYPES = 15
    
    if 
(!(<= iAmmoId <= MAX_AMMO_TYPES) || iCount <= 0)
        return

    static const szAmmoTypes
[MAX_AMMO_TYPES][] = {
        "", "338Magnum", "762Nato", "556NatoBox", "556Nato", "buckshot", "45acp", "57mm", 
        
"50AE", "357SIG", "9mm", "Flashbang", "HEGrenade", "SmokeGrenade", "C4"
    }

    set_member(pWeaponBox, m_WeaponBox_rgiszAmmo, szAmmoTypes[iAmmoId], 1 /*элемент*/)
    set_member(pWeaponBox, m_WeaponBox_rgAmmo, iCount, 1 /*элемент*/)

#if defined PL_DEBUG
    new szAmmoName[16]; get_member(pWeaponBox, m_WeaponBox_rgiszAmmo, szAmmoName, charsmax(szAmmoName), 1)
    server_print("AmmoName: %s | AmmoID: %d | AmmoPacked: %d", szAmmoName, iAmmoId, iCount)
#endif
У вас нет необходимых прав для просмотра вложений в этом сообщении.
админгандонсоси
Аватара пользователя
Vaqtincha
 
Сообщения: 277
Зарегистрирован: 28 мар 2018, 15:05
Забанен
Благодарил (а): 8 раз.
Поблагодарили: 53 раз.

Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6