Ошибка в работе find_ent_by_owner и rg_find_ent_by_owner

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
403
Реакции
114
Помог
2 раз(а)
Здравствуйте!

Столкнулся с ошибкой в работе плагина... после отладки выяснилось что обе функции, а возможно и вторая пара find_ent_by_class работают не так как описано.

Код:
i_entity = -1;
while (!is_nullent((i_entity = find_ent_by_owner(i_entity, s_class_name, id))) && i_stop < 10) {
...
i_stop++
}
  1. Из описания работы функции следует, что она ищет начиная с позиции заданной первым параметром функции.
  2. В моем примере должна увеличить индекс на 1 и начать искать с 0.
  3. Далее она находит допустим единственную entity c id = 26.
  4. После чего, если на вход подать i_entity = 26, на выходе мы получим опять i_entity = 26, хотя она должна увеличить индекс на 1, и начать искать с позиции 27, ничего не найти и вернуть -1. По крайней мере я так ожидаю...
  5. И так продлится до тех пор пока цикл не упрется в ограничитель i_stop = 10.

Я попытался ее обмануть, но даже если я на вход подам i_entity = 27, она все равно на выходе дает 26.... Очевидно она ищет не начиная с переданного индекса, а с 0.

Код:
i_entity = -1;
while (!is_nullent((i_entity = find_ent_by_owner(i_entity, s_class_name, id))) && i_stop < 10) {
...
i_entity++;
i_stop++
}
Подскажите, пожалуйста, я что-то делаю не так, или в работе функции имеется ошибка?

UPD: Я нашел кусок из reapi, той же функции:
Код:
cell AMX_NATIVE_CALL rg_find_ent_by_owner(AMX *amx, cell *params)
{
    enum args_e { arg_count, arg_start_index, arg_classname, arg_onwer };

    CHECK_ISENTITY(arg_onwer);

    char classname[256];

    cell& startIndex = *getAmxAddr(amx, params[arg_start_index]);
    const char* value = getAmxString(amx, params[arg_classname], classname);
    edict_t* pOwner = edictByIndexAmx(params[arg_onwer]);
    edict_t* pEntity = g_pEdicts + startIndex;

    for (int i = startIndex; i < gpGlobals->maxEntities; i++, pEntity++)
    {
        if (pEntity->v.owner != pOwner)
            continue;

        // yet not allocated
        if (!pEntity->pvPrivateData || pEntity->free)
            continue;

        if (FClassnameIs(pEntity, value))
        {
            startIndex = i;
            return TRUE;
        }
    }

    return FALSE;
}
Берем цикл поиска, с учетом того что функция возращает TRUE или FALSE:

Код:
i_entity = 0;
while (rg_find_ent_by_owner(i_entity, s_class_name, id) && i_stop < 10) {
...
i_stop++
}
И если я в внутри цикла не увеличу i_entity на 1, то... на выходе rg_find_ent_by_owner найдет ту же самую entity.... 10 раз.
 
Последнее редактирование:
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Код:
DeletePatchByPlayer(const id)
{
    new iEnt = MaxClients;

    while(rg_find_ent_by_owner(iEnt, "beam", id))
    {
        set_entvar(iEnt, var_flags, FL_KILLME);
        iEnt += 1;
    }
}

Изменено: с версии ReAPI 5.24.0.302 не надо вручную увеличивать индекс ent. Комментарий ниже
Код:
    while(rg_find_ent_by_owner(iEnt, "beam", id))
    {
        set_entvar(iEnt, var_flags, FL_KILLME);
    }
 
Последнее редактирование:
Сообщения
3,593
Реакции
1,576
Помог
141 раз(а)
Refresh, мне тут подсказали, что в rg_find_ent_by_owner всё-таки баг, и инкремент делать не надо. И это уже поправили в reapi.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу