LastUchiha, не нужно делать Франкенштейна из ресурса. Изначальный Буран был прекрасен своей простотой. Оставь его как есть, убери скриншоты и запиши короткое видео с прокастом. Притом желательно для целей юзать всяких футманов и прочую тир1 шушпару.
Картинку для предосмотра лучше вставляй только в предосмотр. Для это в коротком описании ресурса первой строкой сделай так:
<- картинка
А продвинутый буран опубликуй следующим ресурсом. Для примера глянь на количество вариаций AOE Благодати.
function SpellBlizzardCallback1 takes nothing returns nothing
local integer i // Номер тика
local integer last // Номер последнего тика
local integer xk // Ключ для x
local integer yk // Ключ для y
local real x // Координата x
local real y // Координата y
set Timer = GetExpiredTimer()
set TimerId = GetHandleId(Timer)
set Caster = LoadUnitHandle(HT, TimerId, 'cstr')
set CasterX = LoadReal(HT, TimerId, 'cstX')
set CasterY = LoadReal(HT, TimerId, 'cstY')
set i = LoadInteger(HT, TimerId, 'tick') // Получаем номер тика
call SaveInteger(HT, TimerId, 'tick', i + 1) // Увеличиваем тик на единицу
set last = LoadInteger(HT, TimerId, 'last') // Получаем номер последнего тика
// Проверяем флаг и рандомим плямбу
if HaveSavedBoolean(HT, TimerId, 'ends') and GetRandomInt(1, 100) <= 30 then
// Рандомим координаты плямбы.
set x = CasterX + SpellBlizzardRange * GetRandomReal(-1, 1)
set y = CasterY + SpellBlizzardRange * GetRandomReal(-1, 1)
set last = last + 8 // Откладываем на восемь тиков
call SaveInteger(HT, TimerId, 'last', last) // Сохраняем тик последнего урона
// Расчитываем ключ для сохранения
set xk = last * 2
set yk = xk + 1
// Сохраняем координаты
call SaveReal(HT, TimerId, xk, x)
call SaveReal(HT, TimerId, yk, y)
// Спавним эффект
// DestroyEffect ... лень писать
endif
// Проверяем плямбу на текущем тике
set xk = i * 2
set yk = xk + 1
// Для проверки тупо проверяем, сохранено ли что либо на ячейке
if HaveSavedReal(HT, TimerId, xk) then
set x = LoadReal(HT, TimerId, xk)
set y = LoadReal(HT, TimerId, yk)
// Наносим урон в координанах
endif
// Проверяем приказ и пишем флаг
if GetUnitCurrentOrder(Caster) != 0xd0079 then // blizzard
call SaveBoolean(HT, TimerId, 'ends', true)
endif
// Останавливаем каст если выполнены условия
if HaveSavedBoolean(HT, TimerId, 'ends') and i >= last then
call PauseTimer(Timer)
call DestroyTimer(Timer)
call FlushChildHashtable(HT, TimerId)
endif
endfunction
Вместо этого не умножаю на два, а просто вместо единицы прибавляю 100 для уверенности.
Не нужно писать числа наугад. Перечитай коммент. Тут же всё просто:
set i = 14 // Номер тика, integer
set xk = i * 2 // Ключ x, integer
set yk = xk + 1 // Ключ y, integer
set x = GetReal(xk) // Значение x, real
set y = GetReal(yk) // Значение y, real
Среднестатистическому автору удобей работать со своим кодом_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_002
Ну смотри, что нам нужно? Через 8 тиков нанести урон по точке. Для этого нужно сохранить точку на номер тика. В хэштаблице нам доступно миллион индексов, поэтому не паримся что индексы закончатся. Так как мы упаковываем двумерные массивы [x,y] в одномерный, то индексов у нас становится в два раза меньше, но полмиллиона нам точно хватит.
Назовём ключи [xk, yk], а номер тика i. Тогда номер ключа будет находиться таким образом:
xk = i * 2
yk = i * 2 + 1
Когда с упаковкой точек разобрались, разберёмся с тиками. Допустим мы хотим плодить плямбы со случайными промежутками. Единственное ограничение, мы не сможем сделать две плямбы в один тик. Разберём тики тупо по порядку:
1 2 3 - Рандом сработал, через 8 тиков на нужно нанести урон. Значит i = 8 + 3 = 11. Сохраняем на 11 тик координаты. 4 5 - Рандом сработал, через 8 тиков на нужно нанести урон. Значит i = 8 + 5 = 13. Сохраняем на 13 тик координаты. 6 7 - Кастер прервал заклинание, но i=13, а 7 < 13, пишем флаг, что плодить плямбы больше не нужно и продолжаем тикать 8 9 10 11 - В этой ячейке есть координаты, наносим урон 12 13 - В этой ячейке есть координаты, наносим урон, заодно прерываем заклинание ибо есть флаг и 13 >= 13
А зачем его опускать? Так же будет намного круче. Эволюция так сказать. В этом спеле ты дал новичкам базу, а в спеле с отдельными плямбами уже немного математики за пятый класс.
то полетит не 1 выстрел, а чуть больше половины от всего спелла.
Читай комментарий выше. Если сделать с плямбами, то у тебя будет индекс последней плямбы и флаг о том, что плямбы больше плодить не нужно. Когда ты ловишь отмену приказа, то просто ставишь флаг горшочек не вари и ждёшь когда текущий тик станет больше последнего.
Ну смотри, значения в виде равкодов 'cstr' и прочих очень большие. Значит у тебя свободно начало индексов. Тебе нужно хранить массив точек, куда ты направляешь плямбы. Вот например есть у тебя индексы:
Ну или вообще заморочиться с тем, чтоб каждая плямба наносила урон. Там если немного вспомнить математику не сильно сложно доработать сделав из хт многомерный массив.
я сонный просто и не мог догадаться до столь простого решения
Я это решение очень редко вижу, вместо него лепят просто страшные городухи из миллиона таймеров, хотя можно было сделать намного проще. Новичкам очень полезно его показать.
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. nazarpunk
» WarCraft 3 / [Jass] - Буран
Ред. nazarpunk
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / Небольшой вопрос касательно хэш-таблиц
» WarRaft / Order
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. nazarpunk
» WarCraft 3 / [Jass] - Буран
2
3 - Рандом сработал, через 8 тиков на нужно нанести урон. Значит i = 8 + 3 = 11. Сохраняем на 11 тик координаты.
4
5 - Рандом сработал, через 8 тиков на нужно нанести урон. Значит i = 8 + 5 = 13. Сохраняем на 13 тик координаты.
6
7 - Кастер прервал заклинание, но i=13, а 7 < 13, пишем флаг, что плодить плямбы больше не нужно и продолжаем тикать
8
9
10
11 - В этой ячейке есть координаты, наносим урон
12
13 - В этой ячейке есть координаты, наносим урон, заодно прерываем заклинание ибо есть флаг и 13 >= 13
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
Ред. nazarpunk
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран
» WarCraft 3 / [Jass] - Буран