30

» WarCraft 3 / [JASS] - Буран

LastUchiha, не, ну красота же. Можно публиковать следующую версию. Ну и в этом и следующем ресурсе лучше видео вместо скриншота делать.
30

» WarCraft 3 / [JASS] - Буран

KaneThaumaturge, можно вообще решить этот вопрос эллегантно - создать DamageDeal систему с 0.1 таймером. Которая будет отложенно наносить урон.
Но здесь уже мы ступаем в область архитектуры.
30

» WarCraft 3 / [JASS] - Буран

не я про то, что в этом коде коллизия может быть с глобалками потому что он исполняется после нанесения урона
Именно в этом не может. Потому что после урона нет работы с глобалками и тик таймера завершается. А следующий тик таймера перепишет глобалки заново.
Стопе, забыл. Чтоб точно не было коллизий нужно урон в самый низ отправить:
function SpellBlizzardCallback takes nothing returns nothing
	set Timer = GetExpiredTimer()
	set TimerId = GetHandleId(Timer)
    
	set Caster = LoadUnitHandle(HT, TimerId, 'cstr')

	if GetUnitCurrentOrder(Caster) != 0xd0079 then // blizzard
		call PauseTimer(Timer)
		call DestroyTimer(Timer)
		call FlushChildHashtable(HT, TimerId)
       return
	endif 

	set CasterX = LoadReal(HT, TimerId, 'cstX')
	set CasterY = LoadReal(HT, TimerId, 'cstY')

	call GroupEnumUnitsInRange(Group, CasterX, CasterY, SpellBlizzardRange, null)
	call ForGroup(Group, function SpellBlizzardEnum) 
	call GroupClear(Group)    
endfunction 
30

» WarCraft 3 / [JASS] - Буран

ну дак как сделать это нормально ?
Запускаешь таймер с минимальным периодом, например 0.1 и спавнишь чё надо. Заодно приказ проверяешь. Гемороя не сильно больше чем сейчас, но правда требует аккуратности.
30

» WarCraft 3 / [JASS] - Буран

не понял сарказм, а этот код шутка?
Это простая и эллегантная проверка на какст channel. Что не так то?
30

» WarCraft 3 / [JASS] - Буран

ну или например ты ту же глобалку с таймером используешь где-то ещё, и этот код может затриггерится при уроне или смерти.
Может. Но всегда же можно вручную переменные заприватить. Благо уже даже плагины для этого есть.
30

» WarCraft 3 / [JASS] - Буран

то можно таймер и кастера потерять после строки нанесения урона.
Посмотрел я после строки нанесения урона, как жаль, там столько использования этих переменных...
30

» WarCraft 3 / [JASS] - Буран

Плохая практика использовать комбинированый стиль именования.
Здесь нет грязножасса. При наличии триггера Blizzard игра вызовет такую нативку.
30

» WarCraft 3 / [WarCraft III] Jass identifier renamer

Хм, а почему просто не переименовать в редакторе?
Загруженные файлы
30

» WarCraft 3 / [JASS] - Буран

вполне себе строчный ключ
Напомни мне пожалуйста, когда в варкрафт завезли нормальную работу со строками? Ну а то что он каждый раз вычисляется тебя вообще не смущает?
30

» WarCraft 3 / [JASS] - Буран

попробуй напади!
Они падают скучно, одной пачкой. Сделал бы чтоб они вразнобой летели, как например здесь.
30

» WarCraft 3 / [JASS] - Буран

так а про итерацию, вынести к комментам в начале триггера?
Ну да. В блоке удаления это явно не к месту.
30

» WarCraft 3 / [JASS] - Буран

Как я понял, ты просто взял дефолт буран и добавил к нему урона. А будет версия с рандомными эффектами?
30

» WarCraft 3 / [JASS] - Буран

group Group = CreateGroup() //Создаём группу, которую будем использовать для моментальной выборки юнитов
30

» WarCraft 3 / [JASS] - Буран

LastUchiha, у приказове есть целлочисленный id, который и использует игра. А есть представление в виде строки, которое используется в РО и гуймуй чтоб кожанным мешкам было удобней.
//if GetUnitCurrentOrder( Caster ) != 0xd0079 then - этот вариант работает быстрее, так как использует ид приказа без лишней возни со строками
30

» WarCraft 3 / [JASS] - Буран

Итерация (повторение) - повторение таймера или цикла (тут таймер повторяется раз в 1 секунду, то есть раз в 1 секунду происходит итерация таймера)
Этот коммент вообще не в том месте находится.

Когда копипастил забыл вкомментариях изменить ключи:
call SaveReal( HT, TimerId, 'cstX', GetSpellTargetX() ) //Сохраняется точка применения способности X по дочернему ключу 'cstr'
call SaveReal( HT, TimerId, 'cstY', GetSpellTargetY() ) //Сохраняется точка применения способности Y по дочернему ключу 'cstr'

group Group = CreateGroup() //Создаёт темповая группа
Это не темповая (слово "временна" видать запретили), а глобальная группа, которая используется для всех одноразовых переборов GroupEnum*.
30

» WarCraft 3 / [JASS] - Буран

LastUchiha, годнота. Лайк. Только формулировка сбивает с толку:
это результат конвертации строки "blizzard" в целочисленное значение
Это не конвертация, это настоящий ид приказа. Строки сбоку присраны для гуймуйщмков.
30

» WarCraft 3 / [JASS] - Буран

LastUchiha,
  1. Вкусовщина
  2. Вкусовщина
  3. Вкусовщина
  4. Вкусовщина
  5. Здесь важно. Напиши ниже вариант с числом и закомментируй его.
  6. Вкусовщина. И в жассе мой способ не сильно повышает читаемость. Ибо строки плодит. Вот в ангеле и Зинке там была бы одна строка и Мега читаемость.
30

» WarCraft 3 / [JASS] - Буран

я согласен теперь что не нужно его юзать.
А толку от твоего согласия если он до сих пор в исходнике? Можешь кстати тупо мой код взять и под себя переделать. Дарю.
30

» WarCraft 3 / [JASS] - Буран

Лишний раз срабатывает i = i + 1
Тоесть по твоему инкримент один раз на карту это страшно, а вычиление хэша строки на каждый чих это норм?
30

» WarCraft 3 / [JASS] - Буран

LastUchiha, а сам Filter ты не учитываешь? Или он не занимает память, которую ты так яросто пытаешься сэкономить?
30

» WarCraft 3 / [JASS] - Буран

LastUchiha, этот момент предотвращает создание Condition. Бояться лишней integer и плодить Condition пачками это верх гейниальности.
30

» WarCraft 3 / [JASS] - Буран

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