XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
Vampirrr
O_o
offline
Опыт: 19,286
Активность:
Как проверить, пуста ли группа?
Собственно не могу найти замены функции IsUnitGpoupEmptyBJ, а очень хотелось бы..
Старый 08.02.2009, 21:49
alexkill

offline
Опыт: 18,872
Активность:
Vampirr, тема еще не закрыта. Автора не знаешь? )

Вот еще полезная тема.
Старый 08.02.2009, 22:07
Toadcop

offline
Опыт: 54,313
Активность:
кстати как бы там небыло... FirstOfGroup() для большай части случие лутчый способ НО есть група полностью "произваолная" и "висела" то может быть что в ней остлись "призраки" (удалёный юниты) и тем сама FirstOfGroup() вернёт null НО после этого юнита напр есть еще другие юниты. тем самым получитса фейл. (это кстати серьёзней чам многие могут думать)
а вот ForGroup() коректно обрабатывает всю группу.
ну как я писал если у вас не произвольные юниты в группе (напр те которые не удаляютса) то проблем нету. или эта группа было тока что составлена.
Старый 09.02.2009, 00:50
NETRAT

offline
Опыт: 83,712
Активность:
Toadcop чет я сильно сомневаюсь в наличии описанного спецэффекта - в этом случае концепция групп, внедренная в движок сама по себе является фейлом а ForGroup мало чем будет отличаться от указателя на первый элемент по наличию ошибок
откуда столько ошибок в посте?
Старый 09.02.2009, 01:44
Toadcop

offline
Опыт: 54,313
Активность:
NETRAT ну дык сомневайся я пишу то что я и не тока видел сам =) я помню как вексориан парилса с этим 2 недели xD у него цыкл обратоки на FirstOfGroup() обрывалса. когда были чумные тучи в ней...

всё очень просто кстати... когда унит удаляетса... его хендл (или чё либо) остаётса в группе ибо это не рацыонально всё что возможно чистить от него (напр есть 100 груп где есть этот юнит и т.п)

ну и тем самым он остатса в ней как мусор.
ForGroup() фильтрует таких юнитов и делает действия тока с нормальными в то время как FirstOfGroup() возращает первого юнита из группы. (каким бы он небыл) наверно близы просто не подумали об этом и всё... если интересует на wc3camp есть несока топегов посвещёны этой теме.

Toadcop добавил:
ах да... а особеносте кодинга близзов.... я так и досихпор не понял в чём была проблема сделать пометку на хендл что он активный. и тока в этом случие помещять его в стек (там он и метитса как не активный) тем самым было бы просто невозможно помещять несколько одинаковых хендлв в стек. (из за чего сильно страдал вар3 мапмейкинг в 2006 году...) да и досих пор в доте они есть/появляютса.

кстати в этой всей истории есть "зло" я не помню на 100% коректность но. если присвоить переменой несуществующий хендл т.е. напр запись в кеш... юнит здох, удалилса (напр) типо хендл мертвый но всё же он типо висит мы потом это присваеваем переменой и вот здесь... я не помню или при обнулени или даже просто этот хендл снова помещаетса в стек. вроде даже просто. т.е. что либо "делать" с несуществующими объектами зло. это как бы всё логично и круто НО на практике такие ситуацыи могут очень не предсказуемо происходить особено когда есть неистественый обрыв процесов (удаление/взрыв юнитов) тоже самое впринцыпе любих объектов касаетса просто на юнитах больше всего делаетса таких косяков (я уверен).

и снова кусов из "Закона Пустоты" кстати как оказываетса я тогда был таки достаточно прав =)

для потверждения этого я наверно сделаю мапу... позже.
Старый 09.02.2009, 03:53
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Советую втыкнуть: GroupUtils by Rising_Dusk. Наработка была сделана с применением наработки, написанной Captain Griffen. Привожу перевод основной сути проблемы:
Цитата:
Сообщение от Captain Griffen
юниты, которые каким-либо образом удалены из игры и в то же время находятся в группе, остаются висеть в таблице хендлов. Они также остаются в списке группы (что может привести к проблемам при использовании функции FirstOfGroup в циклах.

Также привожу вышеупомянутую библиотеку:
Код:
// by Captain Griffen
library GroupRefresh

    globals
        private boolean clear
        private group enumed
    endglobals

    private function AddEx takes nothing returns nothing
        if clear then
            call GroupClear(enumed)
            set clear = false
        endif
        call GroupAddUnit(enumed, GetEnumUnit())
    endfunction

    function GroupRefresh takes group g returns nothing
        set clear = true
        set enumed = g
        call ForGroup(enumed, function AddEx)
        if clear then
             call GroupClear(g)
        endif
    endfunction

endlibrary
Старый 09.02.2009, 06:59
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 07:03.