HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- Посчитать количество энтить (https://hlfx.ru/forum/showthread.php?threadid=2856)
Отправлено FreeSlave 28-05-2011 в 18:16:
Посчитать количество энтить
Есть ли в SDK готовая функция, подсчитываются количество энтить на карте или нужно подсчитывать с помощью UTIL_FindEntityByClassname ? Как она вообще работает - возвращает первую, которую найдет? И зачем туда посылать CBaseEntity * ?
__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 28-05-2011 в 18:31:
есть готовая функция, которая торчит в engineface - это pfnNumberOfEntities. Также, в ксаше узнать статистику можно введя в консоль команду edicts_info. Для GoldSrc такая команда вроде бы тоже есть, но я её непомню.
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 28-05-2011 в 18:44:
Цитата:
Дядя Миша писал:
есть готовая функция, которая торчит в engineface - это pfnNumberOfEntities. Также, в ксаше узнать статистику можно введя в консоль команду edicts_info. Для GoldSrc такая команда вроде бы тоже есть, но я её непомню.
Извини, я не совсем точно выразился. Я имел в виду подсчёт количества конкретных энтить, а не всех.
В коде оспри вроде есть нечто такое для подсчёта хгрюнтов на карте, но я не совсем разобрался.__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 28-05-2011 в 18:54:
Цитата:
FreeSlave писал:
Я имел в виду подсчёт количества конкретных энтить, а не всех.
тогда уж не конкретных, а энтить с определенным класснеймом?
нет, в движке такой функции нету, придется немного покодить самостоятельно.
Для наглядности возьмем код из поиска сатчелов и немного видоизменим его:
C++ Source Code:
1 | int UTIL_CountNamedEdicts( const char *pClassname ) |
5 | if( !pClassname || !*pClassname ) |
9 | pFind = FIND_ENTITY_BY_CLASSNAME( NULL, pClassname ); |
11 | while ( !FNullEnt( pFind ) ) |
13 | CBaseEntity *pEnt = CBaseEntity::Instance( pFind ); |
14 | if ( pEnt ) numEdicts++; |
16 | pFind = FIND_ENTITY_BY_CLASSNAME( pFind, pClassname ); |
Собственно вот это вот CBaseEntity::Instance по большому счету и не нужно, но на всякий случай оставлю.__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'
Отправлено FreeSlave 28-05-2011 в 19:12:
Дядя Миша, спасибо. А не подскажешь зачем в FIND_ENTITY_BY_CLASSNAME первый аргумент?
__________________
I'm on github
I'm on opendesktop.org
Отправлено Дядя Миша 28-05-2011 в 19:17:
Цитата:
FreeSlave писал:
А не подскажешь зачем в FIND_ENTITY_BY_CLASSNAME первый аргумент?
указывает с какого эдикта начинать поиск. С этим делом в квейке вообще путаница. Некоторые функции возвращали указатель на эдикт, у которого значение pent->v.chain было ненулевым. Таким образом идя по цепочке можно было просмотреть все найденные эдикты.
Другие функции, такие как FIND_ENTITY_BY_STRING возвращали лишь первую найденную энтить, начиная искать с самого начала, т.е. с ворлдспавна. Легко заметить, что для продолжения поиска мы должны начать с того самого места, на котором он закончился. Именно для этого и был введен первый аргумент - указатель на энтитю, с которой следует начать поиск.
Добавлено 28-05-2011 в 23:17:
ЗЫ. В терминологии программиста это не первый, а нулевой аргумент 
__________________
My Projects: download page
F.A.Q по XashNT
Блог разработчика в телеграме
Цитата:
C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'