1 Q: Как сделать что бы из нескольких вещей собиралась одна?
A: Допустим у нас есть 2 вещи - Х и Y. Вот так будет выглядеть триггер для объеденения вещи X и Y в вещь Z
Code |
Event - Unit Acquries an Item Condition - Or - Any (Condition) are True Condition: (Item-type of(Item Being Manipulated) Equal to X) (Item-type of(Item Being Manipulated) Equal to Y) Action - If (All Condition are True) then do (Then Action) else do (Else Action) If - Conditions: ((Hero Manipulating Item) has an item of type X) ((Hero Manipulating Item) has an item of type Y) Then - Action: Remove (Item carried by (Hero Manipulating Item) of type X) Remove (Item carried by (Hero Manipulating Item) of type Y) Create Z and give it to (Hero Manipulating Item) Else - Action: --- |
2 Q: Как отследить нахождение в инвентаре сразу двух одинаковых вещей?
A: Если у нас есть 2 вещи типа Х, то если мы уберем 1 вещь типа
Х, то вторая вещь типа Х останется лежать. Так и делаем, из двух Х делаем Z.
Code |
Event - Unit Acquries an Item Condition - (Item-type of(Item Being Manipulated) Equal to X) Action - Turn off (This Trigger) Remove (Item carried by (Hero Manipulating Item) of type X) If (All Condition are True) then do (Then Action) else do (Else Action) If - Conditions: ((Hero Manipulating Item) has an item of type X) Then - Action: Remove (Item carried by (Hero Manipulating Item) of type X) Create Z and give it to (Hero Manipulating Item) Else - Action: --- Create X and give it to (Hero Manipulating Item) Turn off (This Trigger) (пишется не в Else, а после IF) |
Самое интересное в том, что если не выключать триггер во время его работы, то ничего не получится. Вещь будет моргать в инвентаре. Ведь действие Create X and give it to (Hero Manipulating Item) Равно Событию
Unit Acquries an Item
3 Q: Если я покупаю вещь, которая является последней для двух
комплектов, что будет?
A: Соберется та вещь, которая будет стоять выше в триггерах. Т.е. Если считать сверху. Вначале создан триггер что бы собирать вещь XZ, а потом что бы собирать вещь YZ. Значит при покупке вещи Z, соберется XZ.
4 Q: Как сделать что бы после покупки героя в таверне, он становился
недоступным для всех игрков?
A: Делается при помощи действия
Code |
Player - Set Training/Construction Availability of unit |
Здесь можно разрешить\запретить использовать юнита для игрка.
5 Q: Как сделать героя прозрачным?
A: С помощью Действия Animation - Change Unit Vertex Coloring. Первые 3 цифры (100% по умолчанию), это цвета юнитов. А последняя (0% по умолчанию), это его прозрачность. Ее мы и меняем, для того что бы сделать юнита прозравным, или даже неведимкой при 100%.
6 Q: Мне очень понравилась способность Omnislash. Как сделать такую же?
A: Незнаю как делали создатели DotA, но я сделал по своему. Суть в том, что каждые 0.1 секунду, мы берем случайного юнита из группы вражеских юнитов вокруг героя, мнгновенно перемещаем туда героя с соответственными спец. эффектами, проигрываем анимацию Attack, и тригерно наносим урон. Подробнее можно посмотреть в карте примере, где все хорошо описано. В примере, способность сделана только для 1 героя. Для двух или более героев, нужно знать jass, хоть минимум, поэтому я не стал делать универсальный OmniSlash. Так же, без jass, требуется довольно много, для одного спелла переменных.
7 Q: Мне бы хотел заглянуть в саму доту. Что и как в ней устроено. Но при открытии возникает ошибка, и ничего не запускается. Что делать?
A: Это означает что на карте стоит защита. Снять ее можно несколькими способами. Существует также программы, называемые Deprotector'ы. Можешь поискать ее в любом поисковике. Например www.yandex.ru.
Оптимизация.
Это как бы маленькое дополнение. Хочу рассказать (вернее пересказать) основные утечки и то как и какими командами из узбежать. I Самая большая утечка - UnitGroup. Устраняется двумя способами.
Code |
1) Перед использованием группы пишется в Custom Script'e следущее: set bj_wantDestroyGroup = true. Тогда сразу же после первого использования группы она уничтожится. 2) Создавать группу, а потом ее уничтожать. Set group = (Unit in (Playble Map Area)) --- Действия с этой группой --- call DestroyGroup (udg_group) |
II Вторая утечка, малозагрязняющая память, но самая
частосовершаемая мапперами - точка. При любом действием с точкой (Создание юнита "где-то", Создание эффекта "Где-то", Перенос юнита "Куда-то" и т. д.). Он остается в памяти и не удаляется. Этого можно избежать следующим путем. Мы будем давать "ссылку" на точку, а потом убирать эту "ссылку" из памяти. Допустим создаем юнита в центре карты. Нужно: Переменную Loc типа point.
Code |
Set Loc = (Center of(Playble Map Area)) Create 1 footman in Loc .... call RemoveLocation (udg_Loc) -(писать в Custom Script) |
Это и есть самые основные утечки в варе. Если ты будешь избегать хотя бы их, то карта станет заметно меньше грузится. И не будет "Зависать" со временем.