Есть некоторые условия, на которых основаны действия всех скиллов. Через эти условия цепляет группу юнитов и накладывает на них эффекты/дамажит/хилит их.
Изначальное:
((constant function IsUnitAliveAndAlly takes unit u,unit s returns boolean
return not IsUnitType(u,UNIT_TYPE_DEAD)and IsUnitAlly(u,GetOwningPlayer(s))
endfunction
constant function IsUnitAlive takes unit u returns boolean
return not IsUnitType(u,UNIT_TYPE_DEAD)and pV[GetPlayerId(GetOwningPlayer(u))]
endfunction
))
После добавления условия о невыделяемости (чтобы не цепляло лишние даммики)
Клац:
((constant function IsUnitAliveAndAlly takes unit u,unit s returns boolean
return not IsUnitType(u,UNIT_TYPE_DEAD)and IsUnitAlly(u,GetOwningPlayer(s))and GetUnitAbilityLevel(u,'Aloc')<1
endfunction
constant function IsUnitAlive takes unit u returns boolean
return not IsUnitType(u,UNIT_TYPE_DEAD)and pV[GetPlayerId(GetOwningPlayer(u))] and GetUnitAbilityLevel(u,'Aloc')<1
endfunction
))
После добавления в любую из этих (и других) функций карта отказывается работать(вылетает в главное меню после попытки захостить)
Прошу помощи у форумчан в этом несложном вопросе.

Принятый ответ

про москитов вот
0
19
6 лет назад
0
Похожие вопросы:

ответ
  1. Думаю, что можно.
Берем основную модель, возможно, вообще без мяса, только с гусеницами, но с кучей точек крепления. Также берем кучу моделей-аттачметов, представляющих собой эти самые пушки, корпуса и все прочее. При выборе характеристик модели через диалог или интерфейс соответственно создаем на основной модели эффекты-аттачменты, будет собрана техника. Такие штуки, как двигатель и прочие невидные извне элементы будут скорее входить в математическую модель юнита, но это также можно запилить. Название танка - сразу не скажу, есть ли триггер на смену, но на таблице рекордов можно отобразить что угодно.

2.Тоже можно.
Создаем погодный в определенной местности и делаем два триггера для контроля входа-выхода юнитов из нее. На искомых юнитов применяем нужные способности - и все готово.

  1. Здесь чуть сложнее: нужно постоянно проверять тип местности под юнитом, но тоже можно. Проверка на ограждения тоже может бить сделана.

4.Это уже интереснее. Видел раньше подобное в играх. При каждой атаке юнита случайным образом наносим или не наносим доп. урон, эффект горения, кидаем спелл на цель в зависимости от теоретического места попадания атаки.

5.И это можно. Но нужно писать нестандартную систему Альянса. Но через триггеры и JASS все можно...

  1. Продажа техники - лучше через способность, что бы кидать ее на понравившегося юнита, не стоит покупать кота в мешке. Стоимость должна зависеть от технического уровня юнита, его текущего состояния (мертвый танк попадет вам бесплатно, сами чините!), если он был модернизован дополнительно, то это тоже входит в стоимость. Разрешение на продажу делаем аналогично.

  1. Это легко через Custom Value и переменние.

Как ты понял, все что ты предложил создать можно, но на это нужно потрать хороший кусок времени. Остается пожелать тебе удачи над созданием проекта - мне идея уже нравится.
ответ
pricoluwa, ну тогда вопрос закрыт
с секретными разработками тут не помогают
ответ
Steal nerves:
огромная инфа
GetTriggerEvalCount - сколько раз условие сработает (если триггер выключен, то событие с условием все равно работают, и будет прибавлять без конца). Еще понял, что, если выключен (через галочку), то это не будет работать. Есть специальная команда TriggerEvaluate, можно проверить с помощью нее. Это короче сколько раз прокатывает условие (см. TriggerEvaluate)
GetTriggerExecCount - сколько раз сработал триггер (если триггер выключен, то счетчик GetTriggerExecCount не засчитает это). Вроде это за поток отвечает, например Execute. Мне вот интересно, а вот в ForGroup проверить можно сколько потоков стало? вроде ничего не будет
TriggerEvaluate - проверка, проверяет есть ли у триггера условие. Проверяет скорее всего, то что прокатывает ли условие (пример функции ConditionalTriggerExecute). Можно на любом триггере проверить это. Если триггер выключен (не в самих триггерах, а в разделе редактора триггеров через галочку - если снять включен, то не работает проверка), то это не проверишь. Некоторые хитрецы используют функцию условия, это будет быстрее, а точнее раньше выполняется. С этим можно использовать TriggerEvaluate
TriggerExecute - запускает поток функции (действие триггера запускает), игнорируя условие и событие. Однако, не используйте варкрафтовские переменные вроде GetTriggerUnit(), так как они не будут работать, ибо они пусты и зависят от события.
TriggerExecuteWait - то же самое, что и TriggerExecute. В чем разница между двумя мне неизвестно. Проверял маленько.
ResetTrigger - перезапускает триггер и обнуляет значения GetTriggerEvalCount и GetTriggerExecCount
TriggerSleepAction - он же вэйт, паузит на время поток (не паузит весь триггер), короче действие (action). В условии эта штука не работает, обрывает поток. В некоторых функциях он также не работает, например ForGroup, В ForGroup видимо отдельные потоки создает и шлет, на каждого свой поток, если вставит там вэйт, то он обрубает поток и все. А то что внизу осталось, он до конца не обработает уже никогда. Это пример.
раскрыть
Вот результаты:
  1. Вызов TriggerSleepAction внутри TriggerEvaluate убивает поток, и он никогда не возобновляется.
  2. Вызов TriggerSleepAction внутри TriggerExecute работает.
  3. Вызов TriggerSleepAction внутри TriggerExecuteWait выполняет то же самое, что и TriggerExecute.
  4. Иногда может обрывать поток в неожиданных местах. Например, ForGroup. А иногда работает.
IsTriggerWaitOnSleeps, - эта особая проверка триггера, проверяет включена ли пауза (короче вэйт TriggerSleepAction будет работать, иначе нет). С этой функцией связана другая функция TriggerWaitOnSleeps. IsTriggerWaitOnSleeps возвращает истину true - значит вэйт включен, false - вэйт выключен. Кстати я долго мучался, оказывается, что, если все в первый раз, то функция вернет false, даже, если вэйт работает.
TriggerWaitOnSleeps - функция которая включает вэйт (true) и выключает вэйт (false). Короче пропускает время ожидания вэйта. У меня эта функция работает не сразу, или вообще не работала, тыкал пока не заработало.
ответ
Не удивительно, кто так делает?
Никаких вейтов в гуппах использовать нельзя, что за глупость! Для задержек существуют таймеры!
Слишком низкое время жизни дамми юнита, ставь секунд 5, то рисукуешь убить юнита неизвестно кем.
Ты не даешь видимость и не создаешь даммика за нейтрально пассивных, а зря! Даммик может не удивить в кого ему кинуть корни, цель можеть быть в тумане войны.
Чтобы кинуть корни в случайных юнитов в радиусе, есть особое дейстие GroupPickRandomUnit().
Спелл нужно переписать с 0, так же удалить русс. триггеры!

0
32
6 лет назад
0
Даммиков EnumUnitsInRange не питает никогда, москиты не попадают в группы при пике по области, только при пике Юнитов игроков.
0
17
6 лет назад
0
quq_CCCP, а в условие IsUnitInRangeXY(u,x,y,550) они попадают?
0
32
6 лет назад
0
PyCCKuu_4eJl, Насколько помню - нет.
0
17
6 лет назад
0
Как показывает практика, на даммиках появляются эффекты и их уничтожает спеллами, которые напрямую убивают юнитов (не через дамаг) функцией GroupEnumUnitsInRange()
Даммиков* = юнитов со способностью Москиты - Aloc
0
32
6 лет назад
0
PyCCKuu_4eJl, скорее на мертвых и так далее, москиты не попадают в групуу при пике в области.
0
17
6 лет назад
Отредактирован N1ghtSiren
0
Это не отменяет главной проблемы :d
Карта не хочет воспринимать проверку юнита на наличие способности Москиты, хотя синтаксис вроде верен
функция должна возвращать "True":
return not IsUnitType(u,UNIT_TYPE_DEAD) юнит НЕ мёртв = да
IsUnitAlly(u,GetOwningPlayer(s)) юнит дружественен к кастеру = да
GetUnitAbilityLevel(u,'Aloc')<1 абилка Москиты ниже нуля (отсутствует) = да
=== возвращает да
но при этом если добавить проверку на москитов вот сюда:
function IsUnitAliveAndEnemyNotAvul takes unit u,unit s returns boolean
return UnitAlive(u)and IsUnitEnemy(u,GetOwningPlayer(s))and GetUnitAbilityLevel(u,'Avul')==0 and GetUnitAbilityLevel(u,'Aloc')==0
endfunction
то всё спокойно работает
1
32
6 лет назад
Отредактирован quq_CCCP
1
PyCCKuu_4eJl, кривые руки? Или сборка редактора хз откуда?
Проверять на 'Avul' глупо, кроме зданий ни у кого нету такой абилки, что мастера клинка, что паладина эта проверка не отсеет.
Еще раз, москиты не попадают в группу, так что проблема где то еще:..
Загруженные файлы
0
17
6 лет назад
Отредактирован N1ghtSiren
0
quq_CCCP, на 'Avul' проверяется для того, чтобы спеллы, так или иначе двигающие/перекрашивающие/оглушающие/поджигающие/и тд цель не влияли на нипов в городах, окружение типо выделяемого окружения - оленей, рыб, собак и тд...
Спасибо за наглядную демонстрацию работы эффекта :3
quq_CCCP, Можете подсказать, какие из локальных переменных необходимо очищать/обнулять и есть ли смысл в call DestroyGroup(g) и set g=null для локальных групп? :d
Загруженные файлы
0
32
6 лет назад
0
PyCCKuu_4eJl, ну разумеется нужно удалять и очищать группу, а так же обнулять локалку.
Для мгновенных дейсвтий, не нужно создавать локальную группу, достаточно одной глобальной группы, которую нужно очищать перед использованием.
0
27
6 лет назад
Отредактирован MpW
0
про москитов вот
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.