30

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

LastUchiha, чел, не знаю что у тебя за картошка, но это видео у меня мобилка воспроизводит.
Загруженные файлы
30

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

LastUchiha, не нужно делать Франкенштейна из ресурса. Изначальный Буран был прекрасен своей простотой. Оставь его как есть, убери скриншоты и запиши короткое видео с прокастом. Притом желательно для целей юзать всяких футманов и прочую тир1 шушпару.
Картинку для предосмотра лучше вставляй только в предосмотр. Для это в коротком описании ресурса первой строкой сделай так:
<- картинка
А продвинутый буран опубликуй следующим ресурсом. Для примера глянь на количество вариаций AOE Благодати.
30

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

странно оно всё конечно работает
Что именно то странного?
И я кстати протупил и за был not здесь:
if not HaveSavedBoolean(HT, TimerId, 'ends') and GetRandomInt(1, 100) <= 30 then
30

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

LastUchiha, вот, смотри, набросал на коленку:
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 
30

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

Вместо этого не умножаю на два, а просто вместо единицы прибавляю 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
30

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

А вот автору удобнее работать со своим кодом.
Среднестатистическому автору удобей работать со своим кодом_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_Копировать_002
30

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

у каждого свои 100500 систем
Видел я эти системы. Лучше бы импортировали скилы.
30

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

nazarpunk, что-то понял но 80% не понял :D
Ну смотри, что нам нужно? Через 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
30

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

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

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

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

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

это та что слева для превью на ресурсе получается?
Ну да, я ж специально с рамками без фона сделал, чтоб красиво смотрелась как у меня на боевом плоту.
30

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

Кстати, держи, сгенерил тебе картинку для превью и основу для иконки.
Загруженные файлы
30

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

этот момент пока что отпустим так сказать.
А зачем его опускать? Так же будет намного круче. Эволюция так сказать. В этом спеле ты дал новичкам базу, а в спеле с отдельными плямбами уже немного математики за пятый класс.
30

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

то полетит не 1 выстрел, а чуть больше половины от всего спелла.
Читай комментарий выше. Если сделать с плямбами, то у тебя будет индекс последней плямбы и флаг о том, что плямбы больше плодить не нужно. Когда ты ловишь отмену приказа, то просто ставишь флаг горшочек не вари и ждёшь когда текущий тик станет больше последнего.
30

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

не дружу с математикой на самом деле.
Ну смотри, значения в виде равкодов 'cstr' и прочих очень большие. Значит у тебя свободно начало индексов. Тебе нужно хранить массив точек, куда ты направляешь плямбы. Вот например есть у тебя индексы:
[0,1,2,3,4,5,6,7,8,9]
Но у точки же две координаты - [x,y]
[[0,1],[2,3],[4,5],[6,7],[8,9]]
Ну и изи ищем индексы иксов:
x0 = 0*2 = 0
x1 = 1*2 = 2
x2 = 2*2 = 4
x3 = 3*2= 6
x4 = 4*2 = 8
Ну а игрик будет тупо идти следующим.
Ну а дальше всё вообще просто. В таблицу целых чисел, которая не пересекается с реальными, в ячейку номера тика ложишь индекс плямбы.
Например, на 24 тике должна бахнуть плямба номер 1. Вот и сохраянешь по ключу 24 значение 1. А потом просто проверяешь каждый тик, есть ли плямба.
30

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

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

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

визуально я попал бураном по цели, а до стадии урона не дошло дело.
Ну так нужно дать таймеру ещё потикать. И положить значение в HT которое говорит, что каст уже отменён, но мы ждём урона.
30

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

это всё конечно хорошо, но вот это...
Что именно? Каст после отмены или спавн в одну точку?
30

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

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

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

код норм ?
Вполне. Для новичка вообще идеальный. Отдельный лайк за то, что догадался считать тики таймера и работать с целыми числами.
call SaveInteger( HT, TimerId, 'time', LoadInteger( HT, TimerId, 'time' ) + 1 )