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.
30

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

LastUchiha, потому что так визуальней удобней смотреть, а не разгребать огромную моностроку. Ну и показать новичкам как можно использовать return в коллбэке.
30

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

сам не знаю ответ на этот вопрос)
Я знаю, но за такое на сайте варны дают.
30

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

Рецензия на публикацию

Ужас

Если код подразумевается как обучение новичков, то автора необходимо расстрелять за вредительство. Вместо тысячи слов я его переписал по человечески.
native UnitAlive takes unit id returns boolean

globals
	hashtable HT = InitHashtable()
	group Group = CreateGroup()

	unit Caster
	real CasterX
	real CasterY

	unit Target

	timer Timer
	integer TimerId

	constant integer SpellBlizzardId = 'A000'
	constant real SpellBlizzardRange = 300
	constant real SpellBlizzardDamage = 300
endglobals

function SpellBlizzardEnum takes nothing returns nothing
	set Target = GetEnumUnit()
	if not UnitAlive(Target) then 
		return 
	endif
	if not IsUnitEnemy(Target, GetOwningPlayer(Caster)) then 
		return 
	endif
	if IsUnitType(Target, UNIT_TYPE_STRUCTURE) then
		return 
	endif

	call UnitDamageTarget(Caster, Target, SpellBlizzardDamage, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS) 
endfunction 

function SpellBlizzardCallback takes nothing returns nothing
	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')

	call GroupEnumUnitsInRange(Group, CasterX, CasterY, SpellBlizzardRange, null)
	call ForGroup(Group, function SpellBlizzardEnum) 
	call GroupClear(Group)
    
	if GetUnitCurrentOrder(Caster) != 0xd0079 then // blizzard
		call PauseTimer(Timer)
		call DestroyTimer(Timer)
		call FlushChildHashtable(HT, TimerId)
	endif 
endfunction 

function SpellBlizzardAction takes nothing returns nothing 
	if GetSpellAbilityId() != SpellBlizzardId then
		return
	endif
	set Caster = GetTriggerUnit()
	set CasterX = GetSpellTargetX()
	set CasterY = GetSpellTargetY()
	set Timer = CreateTimer() 
	set TimerId = GetHandleId(Timer)
    
	call SaveUnitHandle(HT, TimerId, 'cstr', Caster)
	call SaveReal(HT, TimerId, 'cstX', CasterX)
	call SaveReal(HT, TimerId, 'cstY', CasterY)
	call TimerStart(TimerId, 1.0, true, function SpellBlizzardCallback) 
endfunction

function InitTrig_Blizzard takes nothing returns nothing
	local trigger t = CreateTrigger()
	local integer i = -1

	loop
		set i = i + 1
		exitwhen i == bj_MAX_PLAYER_SLOTS
		call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) //регистрирует событие применения способности для игрока i (изначально 0, 0 = 1 игрок, и так далее по порядку)
	endloop
    
	call TriggerAddAction(t, function SpellBlizzardAction) 
	set t = null
endfunction

P.S. Сюда бы по хорошему добавить уровней абилки и правильную работу с расстоянием до юнита, но в рамках пособия и так сойдёт.
30

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

LastUchiha, и ты тем же временем боишься заюзать лишнюю integer. Ещё никто не восхищайлся твоей гейниальностью?
30

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

Ужас. Три вызова функции GetFilterUnit и почему UnitAlive не в самом начале?
function Blizzard_Filter takes nothing returns boolean //функция фильтра (фильтруются юниты, в группе юнитов остаются только враги)
    return IsUnitEnemy( GetFilterUnit(), GetOwningPlayer( uTemp ) ) and not IsUnitType( GetFilterUnit(), UNIT_TYPE_STRUCTURE ) and UnitAlive( GetFilterUnit() ) //сам фильтр       
endfunction 
30

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

StringHash( "caster" ) за такое принято отрывать руки и засовывать туда, где не всходит солнце.
30

» WarCraft 3 / Насколько быстро выполняется if ? - [Jass]

LastUchiha, у тебя остальной код настолько вылизан, что один integer внесёт значимый вклад?
Ну а если ты упоролся в производительность, то знай - самые быстрые функции это те, которые не имеют аргументов и локалок. Живи теперь с этим.
30

» Unryze Jass API / UjAPI

Для развития проекта неплохо бы сделать подробную документацию по функциям.
Никто тебя не останавливает.