Здравствуйте!
Столкнулся с ошибкой в работе плагина... после отладки выяснилось что обе функции, а возможно и вторая пара find_ent_by_class работают не так как описано.
Я попытался ее обмануть, но даже если я на вход подам i_entity = 27, она все равно на выходе дает 26.... Очевидно она ищет не начиная с переданного индекса, а с 0.
Подскажите, пожалуйста, я что-то делаю не так, или в работе функции имеется ошибка?
UPD: Я нашел кусок из reapi, той же функции:
Берем цикл поиска, с учетом того что функция возращает TRUE или FALSE:
И если я в внутри цикла не увеличу i_entity на 1, то... на выходе rg_find_ent_by_owner найдет ту же самую entity.... 10 раз.
Столкнулся с ошибкой в работе плагина... после отладки выяснилось что обе функции, а возможно и вторая пара 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 и начать искать с 0.
- Далее она находит допустим единственную entity c id = 26.
- После чего, если на вход подать i_entity = 26, на выходе мы получим опять i_entity = 26, хотя она должна увеличить индекс на 1, и начать искать с позиции 27, ничего не найти и вернуть -1. По крайней мере я так ожидаю...
- И так продлится до тех пор пока цикл не упрется в ограничитель 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;
}
Код:
i_entity = 0;
while (rg_find_ent_by_owner(i_entity, s_class_name, id) && i_stop < 10) {
...
i_stop++
}
Последнее редактирование: