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

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

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

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

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

Я же не могу сетнуть глобалку выше объявления локалок.
Правда? А ты моск для этого пытался использовать?
globals
	hashtable HT // текущая таблица
	integer HI // текуший главный ключ таблицы
endglobals

function GetInt takes integer k return integer
	return GetSavedInteger(HT, HI, k)
endfunction
// ... пачка функций на каждый тип

function GetTimerId takes hashtable ht returns integer
	set HT = ht
	set HI = GetHandleInd(GetExpiredTimer())
	return HI	
endfunction

function callback takes nothing returns nothing
	local integer id = GetTimerId(SomeHashtable)

	local integer myInt = GetInt(1)
	local string myStr = GetStr(22)
	//...

endfunction
30

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

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

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

LastUchiha, потому что мне лень вспоминать как нативка зовётся. По коду основная мысль и так понятна.
30

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

quq_CCCP, это дефолт обёртка над хт
globals
	hashtable HT // текущая таблица
	integer HI // текуший главный ключ таблицы
endglobals

function GetInt takes integer k return integer
	return GetSavedInteger(HT, HI, k)
endfunction
// ... пачка функций на каждый тип

function callback takes nothing returns nothing
	set HT = SomeHashtable
	set HI = GetHandleInd(GetExpiredTimer())

	set myInt = GetInt(1)
	set myStr = GetStr(22)
	//...

endfunction
30

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

Думаю такой вариант будет лучше
Если MUIID когда-то примет значение отличное от ноля, то она больше никогда ничего кроме него не вернёт. Гениально.
30

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

Экономить на наносекундах - такое себе)
Ты не понимаешь, нужно экономить на наносекундах вызова функции, а потом писать шикарные O(n!) алгоритмы.
30

» WarCraft 3 / JNGP: Rebuild от PT153

По-другому никак.
Тогда выходит что я сломал реальность и нарушил правила мироздания.
30

» Game Dev / Entity Component System (ECS)

bifurcated, ну, на грязножассе нет нормального ООП, посему и сравнивать с ECS некорректно.