Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Проблема с GroupEnumUnits в .ai-скрипте.
Очень странно работают функции набора в группу. Сколько ни пробовал, а заставить аи собрать нужную мне группу не удалось. В чём проблема: В обычном кастом скрипте отлично пашет следующий код -
Код:
Значение глобалок AIPLAYER и TOWER_TYPE[10] валидное, оно выставляется один раз и не меняется. При любом раскладе группа оказывается пустой и выводится сообщение. При использовании аналогов - сбор башен в радиусе определённого ректа или от координат юнита ничего не даёт. Проблему не смог решить самостоятельно. Кто-нибудь сталкивался с таким? Есть подозрение, что во время сбора не действуют глобалки на вызываемый фильтр (имхо бред, но не знаю что и думать). Как всё-таки оживить фильтрацию по равкоду в данном случае? Отредактировано Preveder, 07.05.2009 в 12:28. |
06.05.2009, 19:01 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Preveder, Filter?? первый раз вижу такую функцию(Можно еще Condition) А зачем использовать глобалку, когда можно сразу тип подставить??? SIEGETOWERUPFOCUS - а это глобальная переменна?
|
06.05.2009, 20:19 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Спасибо, что хоть кто-то откликнулся. Да, есть такая функция: Код:
В чём их разница с Кондишен я не знаю, ибо оба являются boolexpr, но Filter короче по написанию :). SIEGETOWERUPFOCUS - глобальная типа юнит. Сразу значение подставить невыгодно, ибо скрипт планируется размножить с отличиями в основном в именно в башнях (равкодах) и логике остройки компьютера. Основные оперирующие функции останутся теми же, так что глобалки будут актуальны - меньше переписывать. Как ни пыхтел, а заставить компа "фильтровать базар" не смог. Думаю поизвращаться с РБ и кэшем. Основной скрипт карты посылает ИИ команду с H2I(кэш), ИИ скрипт определяет её как кэш, пишет в этот кэш каким образом надо отбирать юнитов и ставится в цикл с ожиданием изменения значения переменной, а основной скрипт карты в это время каждую секунду мониторит значения в кэше, извлекает значение фильтра для ИИ, сортирует, выбирает юнита и отправляет его как команду ИИ... Опять же, как H2I. ИИ отвечает на эту команду изменением глобалки (из интеджера в юнит), и скрипт выходит из цикла... Попробую этот дикий изврат реализовать, если с фильтром ничего не выйдет.... Отредактировано Preveder, 06.05.2009 в 20:43. |
|
06.05.2009, 20:29 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
alexprey
познающий Unity
offline
Опыт:
68,501Активность: |
Preveder, есть большая разница! Filter возвращает filterfunc, а Condition - conditionfunc!
Код:
А вот какая разница между filterfunc и conditionfunc, я ненашел!)) King Ksel добавил: хотя обе образованы от boolexpr Ты попробуй выводить какие значения выдает фильтрация! Мне лично это помогает! |
06.05.2009, 21:32 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Разницы между filterfunc и conditionfunc на мой взгляд нету, ибо и то и то boolexpr. Видимо, задумывалось близзами, что одно логическое выражение для условий в триггере и конструкциях if/then/else, а другое для фильтров. Фильтрация возвращает ложь в моём случае. Проверял. Даже проверил ручным вбиванием интеджера. И всё равно ложь :). Целый вечер развлекаюсь с этим весёлым скриптом. |
|
06.05.2009, 22:07 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Hellfim
Новичок
offline
Опыт:
79,700Активность: |
Preveder, что забито в переменных AIPLAYER и SIEGETOWERUPFOCUS?
|
06.05.2009, 22:53 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
В AIPLAYER забит сам комп. а в SIEGETOWERUPFOCUS изначально null, вышеуказанная функция должна её заполнить, но проблема с фильтром, потому и не набирается группа. |
07.05.2009, 08:32 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
SRes
1110101000
offline
Опыт:
9,997Активность: |
Я понимаю, мысль глупая - но попробуй убрать лишние скобки, т.е.
Код:
Врядли это на что-то повлияет, но всеже. Та и хз что там за особенности у близзов в ИИ скрипте. Имхо, лучше писать как обычную функцию в самой мапе. Ну не будет у тебя парочки функций и что? Зато мешочек глюков останется ждать другую жертву. |
07.05.2009, 10:01 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Попробую. Извращался с искусственным фильтром а.к.а. собрать всех юнитов игрока через ReturnTrue а потом уже сортировать через GetEnumUnit().
Даже при Код:
SIEGETOWERUPFOCUS остаётся null. Значит, группы и впрямь пустые тут получаются.... |
07.05.2009, 10:22 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Код:
Отредактировано J, 07.05.2009 в 11:04. |
07.05.2009, 10:46 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Выводит phail при попытке маркануть фокусную сиедж башню и её проапгрейдить. Может быть ИИ с фильтрациями не знаком вообще? Проблема в том, что никто не знает, по-видимому, какие функции из common.j ИИ-скрипт кушает. Кстати говоря, значения в кэш ИИ записывать может. |
07.05.2009, 11:15 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
call Echo(I2S(GetUnitTypeId(f))+" - "+GetUnitName(f))
а это вообще ни разу не срабатывает что ли? |
07.05.2009, 11:21 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Не-а, вообще. Всё, что выводится при попытке обозначить сиедж, это phail=\. Видимо, GetFilterUnit() он не знает или не умеет использовать.
Мало того, return true тоже не сработал! Не может даже собрать всех юнитов игрока. Потом попытаюсь через триггеры основного скрипта добавлять компу всех юнитов в выделение. А потом обозначать глобалкой группу всех выделенных, оттуда сортировать первую попавшуюся осадную. Preveder добавил: Попытки создать триггер для отлова через регион тоже не увенчались успехом. Код:
Пишет только последние две строчки из инициализатора. Значит воистину фильтры в ИИ не работают. (IS_TRUE - глобальная boolexpr возвращающая return true.) Отредактировано Preveder, 07.05.2009 в 11:35. |
07.05.2009, 12:21 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
J
expert
offline
Опыт:
48,447Активность: |
Цитата:
|
|
07.05.2009, 12:50 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Цитата:
Знаю, но я на всякий случай сделал через return true. Но результат и при null, и при return true одинаковый. |
|
07.05.2009, 13:22 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Preveder
StarCraft II® Inside
offline
Опыт:
1,927Активность: |
Методом научного тыка мной были перепробованы практически все комбинации фильтров в ai-скрипте (если придумаете ещё какую-нибудь очень извращённую реализацию этого - напишите) и были успешно признаны недееспособными. Придётся часть служебных функций компа писать в специальной библиотеке в основном скрипте, для последующего обмена данными с ИИ-скриптом. Аминь. |
08.05.2009, 17:52 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|