Diaboliko, все по тому же принципу что если бы ты выполнил функцию через call, таймер может быть периодическим, аргумент не теряется пока не вызвать таймер с другой функцией. Одновременно можно пихать в 1 функцию с разными значениями разным таймерам и все будет работать.
Этот код позволяет сравнительно просто передать аргумент в функцию таймера, чтобы не трахать себе мозг хештаблицами и структурами там, где это особо не надо. Так же это снижает кол-во писанины в разы.
Аргумент функции по сути локалка, так что пробуйте, мб пригодится.
Пока я писал ИИ меня осинило, как же надоедать вызывать всякие отсроченные дейсвтия, вроде приказал кастануть абилку и ждешь, докастует или нет, аттачить к таймеру каждый раз юнита.... гемор, при этом подобных задач куча, а просто как в гуях - указал юнита и запустил таймер, все...
PT153, в гуях? Ок, делай...
Нет если серьезно можно все делать на одном таймере и триггере, но как бы тут гуи ясельного уровня, поэтому надо попроще...
Daniil18, в этой наработке вам ненужно ломать себе голову, скопировали папку из тестовой карты и все работает. Там авто инииализация, таймером.
Чтобы не убить маин после оптимизаторов.
Есть такое соыбытие - время настало, ну или переодически проверяешь игровое время, больше 6.00 и меньше 17.59 , условие значение в целочисленной переменной меньше 1, дейсвтие - CustomDefeat вроде называется эта функция в гуи, кароче установить поражение игроку 12 и выпнуть его из игры.
Требование предмета, правда тогда не смогут купить все. Иначе при покупке возвращать бабки и писать - "вам нет 18 лет, похмельное зелье не продадим" к примеру...
Для начала создай триггер, с событием время истекло, периодический, никаких условий в него не ставь, изначально триггер должен быть отключен.
Создай новую переменную типа "отряд" (название по вкусу). В действиях триггера, вносишь действие для каждого юнита в группе, сделать действие - нанести урон юниту GetEnumUnit(), сколько урона и какого типа по вкусу.
Потом делаешь второй триггер, у него событие время изменилось, ну и действия включить или выключить первый триггер.
Третий триггер, событие - юнит игрока умирает. Условие юнит находится в группе юнитов (та переменная что ты создал в первом триггере)
Действие - удалить юнита из группы.
Третий триггер - событие юнит выходит из области, условие - юнит принадлежит игроку 12, действие добавить юнита в группу (переменную из первого триггера)
Ну и еще для входа обратно, думаю догадаешься.
Причем тут гуи если он спрашивает как сделать? Если он просит готовый код - это плохая затея,пусть сам разбирается, скинет сюда что у него не получается, хоть сам чуть чуть научится..
PT153, увы да, но зачем подгружать все? Если и половины в игре не будет?
При пике подгружайте все данные этого героя.
Тем более сделать через preloader скрипт ничего не стоит автоматически, все сделает для вас движок.
Имея файла задаете исходя из id героя (или даммика который продается в таверне), так не понадобится делать базу данных...
Очень просто, брать всех юнитов на карте подходящих под условие - жив, принадлежит 12 игроку, не здание (ну те кто недолжен терять хп).
Проверять принадлежат ли их текущие координаты некой зоне где хп не снимается, если не принадлежат то наносить урон, так каждую секунду.
Или при выходе из безопасной зоны, юнит добавляется в глобальную группу юнитов, которую перебирает таймер каждую секунду и наносит урон каждому юниту. При входе в безопасную зону, юнит удаляется из этой группы, при смерти тоже удаляй юнита из группы.
При респауне (если это герой), респаунь его в безопасной зоне.
Включать и выключть таймер будешь в зависимости от наступления времени суток.
PT153, ну у меня тоже дофига, правда я разделил добавление таймером - можно уперется в лимит операций.
Можно схитрить, сделать по pld скрипту для каждого героя, а в таверне продавать пустышки - при выборе героя, вызываем pld скрипт, после подгрузки - секунды 3, создаем героя для игрока.
ScopteRectuS, нет, это просто ничего не дает - constant служебный оператор для интерпретатора, он не оказывает никакого влияния на работу функции, нужен этот оператор только чтобы защитить себя от ошибок в коде - не дать сменить значение переменной.
constant function name... юзали для того чтобы показать где настраивать значения, поиск в коде по слову constant вполне удобный.
conatant не стирают оптимизаторы, сразу видно какая переменная или функция отвечает за настройки, допусти строки которая выводится на экран.
Как все запущено...
Id абилки это именно целое число, в 256'ричной системе счислений он выглядит как 'ANeg' к примеру, а как число в десятичной системе - 1095656807 вот так, ну или вот так 414E6567 как шестнадцатеричное.
Делаешь базу данных, всех абилок и всех пустышек, либо через хештаблицу - первое число луюбое, второе твоя пустышка, сохраненное значение - твой ид абилки.
Либо 2 массива, в первом id пустышек, во втором абилок и перебор циклом, пока число в ячейке n массива пустышек не будет равно id текущей пустышки (ту которую купил юнит), ну а потом вручаем юниту абилку из массива абилок из ячейки n. Способов как сопоставить 2 массива чисел не мало, так что мб подумаешь о завязывании с ГУИ, говорят он вызывает рак мозга..
ScopteRectuS, вот тут есть пример перебора структуры с пояснениями ссылка
И вот тут ссылка.
Но особо увлекаться этим не вижу смысла, ну только если у вас не 300+ объектов для перебора..
ScopteRectuS, Скорее его там нет, это просто свойство интерпретатора, как и тип nothing, который объявить нельзя, так вероятно и constant - просто дает понять интерпретатору что эту переменную вынести в отдельное место, так же проверить код- нет ли операции присвоение этой переменной.
Если есть - выдать ошибку. Обращение к переменной медленнее обращение к конкретному значению, указанному в месте использования.
call CreateUnit( pl, 'hpea', x, y, bj_unitFacing) медленнее call CreateUnit( pl, 'hpea', x, y, 270.00 ).
Потому что движок сначала ищет переменную, потом берет из нее значение, иначе сразу вводит значение.
т.к есть макросы, дефайны, всякие фитчи тулов векса по замене констант, это все нафиг никому не упало. Софт все сделает за вас.
Карту в студию, судя по вашему коду там все печально.
Иллюзия такой же юнит, как и остальные, но её отличает то что на нее не работает событие смерти (ну когда иллюзия умирает в доте же нам не пишут дабл килл или так далее) ну и проверка IsUnitIllusion().
Так же у вас в коде полно утечек.
» WarCraft 3 / Передаем аргументы в фунции callback'ов
Этот код позволяет сравнительно просто передать аргумент в функцию таймера, чтобы не трахать себе мозг хештаблицами и структурами там, где это особо не надо. Так же это снижает кол-во писанины в разы.
Аргумент функции по сути локалка, так что пробуйте, мб пригодится.
Пока я писал ИИ меня осинило, как же надоедать вызывать всякие отсроченные дейсвтия, вроде приказал кастануть абилку и ждешь, докастует или нет, аттачить к таймеру каждый раз юнита.... гемор, при этом подобных задач куча, а просто как в гуях - указал юнита и запустил таймер, все...
» WarCraft 3 / Герою отнимается здоровье днем.
Нет если серьезно можно все делать на одном таймере и триггере, но как бы тут гуи ясельного уровня, поэтому надо попроще...
» WarCraft 3 / Хак на память Warcraft3
Чтобы не убить маин после оптимизаторов.
» WarCraft 3 / Хак на память Warcraft3
» WarCraft 3 / Герою отнимается здоровье днем.
» WarCraft 3 / Продажа предметов
» WarCraft 3 / Герою отнимается здоровье днем.
Создай новую переменную типа "отряд" (название по вкусу). В действиях триггера, вносишь действие для каждого юнита в группе, сделать действие - нанести урон юниту GetEnumUnit(), сколько урона и какого типа по вкусу.
Потом делаешь второй триггер, у него событие время изменилось, ну и действия включить или выключить первый триггер.
Третий триггер, событие - юнит игрока умирает. Условие юнит находится в группе юнитов (та переменная что ты создал в первом триггере)
Действие - удалить юнита из группы.
Третий триггер - событие юнит выходит из области, условие - юнит принадлежит игроку 12, действие добавить юнита в группу (переменную из первого триггера)
Ну и еще для входа обратно, думаю догадаешься.
» WarCraft 3 / Герою отнимается здоровье днем.
» WarCraft 3 / Герою отнимается здоровье днем.
» WarCraft 3 / Герою отнимается здоровье днем.
» WarCraft 3 / PreloadAbility( integer )
При пике подгружайте все данные этого героя.
Тем более сделать через preloader скрипт ничего не стоит автоматически, все сделает для вас движок.
Имея файла задаете исходя из id героя (или даммика который продается в таверне), так не понадобится делать базу данных...
» WarCraft 3 / Герою отнимается здоровье днем.
Проверять принадлежат ли их текущие координаты некой зоне где хп не снимается, если не принадлежат то наносить урон, так каждую секунду.
Или при выходе из безопасной зоны, юнит добавляется в глобальную группу юнитов, которую перебирает таймер каждую секунду и наносит урон каждому юниту. При входе в безопасную зону, юнит удаляется из этой группы, при смерти тоже удаляй юнита из группы.
При респауне (если это герой), респаунь его в безопасной зоне.
Включать и выключть таймер будешь в зависимости от наступления времени суток.
» WarCraft 3 / PreloadAbility( integer )
Но важно чтобы юнита видели игроки - иначе модели и звуки с иконками и текстом не подгрузятся...
» WarCraft 3 / PreloadAbility( integer )
Можно схитрить, сделать по pld скрипту для каждого героя, а в таверне продавать пустышки - при выборе героя, вызываем pld скрипт, после подгрузки - секунды 3, создаем героя для игрока.
» WarCraft 3 / constant function
constant function name... юзали для того чтобы показать где настраивать значения, поиск в коде по слову constant вполне удобный.
conatant не стирают оптимизаторы, сразу видно какая переменная или функция отвечает за настройки, допусти строки которая выводится на экран.
» WarCraft 3 / constant function
» WarCraft 3 / Последний вопрос в рубрике: джассеры, помогите с оптим. кода. =)
Id абилки это именно целое число, в 256'ричной системе счислений он выглядит как 'ANeg' к примеру, а как число в десятичной системе - 1095656807 вот так, ну или вот так 414E6567 как шестнадцатеричное.
Делаешь базу данных, всех абилок и всех пустышек, либо через хештаблицу - первое число луюбое, второе твоя пустышка, сохраненное значение - твой ид абилки.
Либо 2 массива, в первом id пустышек, во втором абилок и перебор циклом, пока число в ячейке n массива пустышек не будет равно id текущей пустышки (ту которую купил юнит), ну а потом вручаем юниту абилку из массива абилок из ячейки n.
Способов как сопоставить 2 массива чисел не мало, так что мб подумаешь о завязывании с ГУИ, говорят он вызывает рак мозга..
» WarCraft 3 / структура и перебирание данных в ней
И вот тут ссылка.
Но особо увлекаться этим не вижу смысла, ну только если у вас не 300+ объектов для перебора..
» WarCraft 3 / структура и перебирание данных в ней
» WarCraft 3 / constant function
Если есть - выдать ошибку. Обращение к переменной медленнее обращение к конкретному значению, указанному в месте использования.
call CreateUnit( pl, 'hpea', x, y, bj_unitFacing) медленнее call CreateUnit( pl, 'hpea', x, y, 270.00 ).
Потому что движок сначала ищет переменную, потом берет из нее значение, иначе сразу вводит значение.
т.к есть макросы, дефайны, всякие фитчи тулов векса по замене констант, это все нафиг никому не упало. Софт все сделает за вас.
» WarCraft 3 / баг компиляции
» WarCraft 3 / Событие с иллюзией.
Иллюзия такой же юнит, как и остальные, но её отличает то что на нее не работает событие смерти (ну когда иллюзия умирает в доте же нам не пишут дабл килл или так далее) ну и проверка IsUnitIllusion().
Так же у вас в коде полно утечек.
» WarCraft 3 / Как сделать модель лежащего предмета.
Настройки предмета ни о чем не говорят?
» WarCraft 3 / Как сделать модель лежащего предмета. Warcraft 3
» WarCraft 3 / Способность с указанием цели, без анимации каста