Ок Сам спелл, это канал, не требующий цель. Target Type - Instant (No Target). Когда герой кликает на спелл, то через 0.4 секунды, все трупы которые валяются вокруг героя в радиусе 900, взрываются. Каждый взорвавшийся труп наносит урон всем юнитам в радиусе 180 (от трупа). Урон может наноситься не только врагам, но и союзникам, если они находятся в радиусе 180 от взорвавшегося трупа.
Формула зависимости урона от уровня способности? И тогда сделаю.
Нет. То есть урон то зависит от уровня, но не формула урона. Это тупо 10 ифзенов, но, формула есть. Урон спелла = (Уровень спелла + 1) * 5 + Урон предыдущего уровня * Если уровень спелла равен 1, то Урон предыдущего уровня = 40. Вообщем урон на 1 уровне спелла будет 50, на втором 65, на третим 85 итд...
Quote (SirNikolas)
И есть ли JNGP?
Нет.
Добавлено (23 Сентябрь 2011, 15:23:09) --------------------------------------------- Я смог это сделать на джассе, но при этом пришлось сделать 2 глобалки! Дамми (массив юнитов) + количество дамми (интежер).
Сообщение отредактировал FatalBlade - Пятница, 23 Сентября 2011, 15:23:57
function Trig_Explode_Corpses_Timer takes nothing returns nothing local timer t = GetExpiredTimer() local integer id = GetHandleId(t) local group g = LoadGroupHandle(udg_Hash, id, 0) local integer l = LoadInteger(udg_Hash, id, 1) local unit u = LoadUnitHande(udg_Hash, id, 2) local unit u2 local unit u3 local real d local real x local real y if l <= 4 then if l <= 2 then if l == 1 then set d = 50. else set d = 65. endif elseif l == 3 then set d = 85. else set d = 110. endif elseif l <= 8 then if l <= 6 then if l == 5 then set d = 140. else set d = 175. endif elseif l == 7 then set d = 215. else set d = 260. endif elseif l == 9 then set d = 310. else set d = 365. endif call AttachSoundToUnit(gg_snd_ImpaleLand, u) call SetSoundVolume(gg_snd_ImpaleLand, 127) call StartSound(gg_snd_ImpaleLand) loop set u2 = FirstOfGroup(g) exitwhen u2 == null call GroupRemoveUnit(g, u2) set x = GetWidgetX(u2) set y = GetWidgetY(u2) call DestroyEffect(AddSpecialEffect("Units\\Undead\\Abomination\\AbominationExplosion.mdl", x, y)) call RemoveUnit(u2) call GroupEnumUnitsInRange(udg_Group, x, y, 180., null) loop set u3 = FirstOfGroup(udg_Group) exitwhen u3 == null call GroupRemoveUnit(udg_Group, u3) call UnitDamageTarget(u, u3, d, true, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_MAGIC, WEAPON_TYPE_WHOKNOWS) endloop endloop call DestroyGroup(g) call FlushChildHashtable(udg_Hash, id) call DestroyTimer(t) set t = null set g = null set u = null set u2 = null set u3 = null endfunction
function Trig_Explode_Corpses_Actions takes nothing returns nothing local unit u = GetTriggerUnit() local group g = CreateGroup() local timer t = CreateTimer() local integer id = GetHandleId(t) local unit u call GroupEnumUnitsInRange(udg_Group, GetWidgetX(u), GetWidgetY(u), 900., null) loop set u = FirstOfGroup(udg_Group) exitwhen u == null call GroupRemoveUnit(udg_Group, u) if GetWidgetLife(u) <= .0 and IsUnitType(u, UNIT_TYPE_HERO) == false then call GroupAddUnit(g, u) endif endloop call SaveAgentHandle(udg_Hash, id, 0, g) call SaveInteger(udg_Hash, id, 1, GetUnitAbilityLevel(u, 'A0QT')) call SaveAgentHandle(udg_Hash, id, 2, u) call TimerStart(t, .4, false, function Trig_Explode_Corpses_Timer) set g = null set t = null set u = null endfunction
function InitTrig_Explode_Corpses takes nothing returns nothing local trigger trig = CreateTrigger() local integer i = 0 loop call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) exitwhen i == 11 set i = i + 1 endloop call TriggerAddCondition(trig, Filter(function Trig_Explode_Corpses_Conditions)) call TriggerAddAction(trig, function Trig_Explode_Corpses_Actions) set trig = null endfunction
Писал в Notepad++, так что могут быть ошибки.
Добавлено (23 Сентябрь 2011, 15:45:34) --------------------------------------------- Нужно создать глобальные переменные Hash типа Hashtable и Group типа Unit group.
Я заметил, поэтому и говрою можно было бы при пике юнитов в группу использовать condtion() или я чета не понял, столько много всего вокруг одного простого спелла, зачем две группы?
Добавлено (23 Сентябрь 2011, 15:52:17) --------------------------------------------- ТЫ из одной группы в другую пихаешь юнитов зчем? чет не поняимаю.
Спелл: и так сначала пикаем всех юнитов вокруг 900р с условием что они мертвы.
далее сохраняем в хеш группу.
Таймер...
загружаем из хеша группу создаем лок группу
цикл пока все юниты из загруженной группы == null цикл пикать все юнитов в радиусе 180 около каждого трупа наносить урон Хотя этот цикл можно было выкинуть а создать даммика с простым спеллом на урон
КОНЕЦ!
Nic nie wiem bo mam chuj. редактирую посты! ВСЕ!
Сообщение отредактировал lawson - Пятница, 23 Сентября 2011, 16:02:55
Это настоящий бред, однако. Во-первых, надо юзать Filter - он больше подходит, это filterfunc, которая для группонабора и писалась. Во-вторых, внутри фильтрфункции и надо проводить действия с группой. Это же рекомендуется на Хайве, это же я и на лугу му-ууу Лавсону говорю, и Сэру Николасу. Да, кондишены и фильтры - бульэкспры, поэтому они будут создавать утечку. А её надо убирать.
Ты умный объясни чем boolexpr вызывает утечку? Я спрашивал у фкофа он сказал что при такойм использовании call GroupEnumbUnitInRect(g, r, Condition(#)) утечки не будет
Нужно создать глобальные переменные Hash типа Hashtable и Group типа Unit group.
А возможно без глобальной UnitGroup? Я просто хочу поменьше глобалок и что бы этот спелл был универсальным, то есть что бы разные игроки могли его кастовать хоть одновременно, и ничего не пересекалось. Да и где инициировать хэш? А то у меня уже есть 2 хэша в карте. А когда я инициирую ещё 1 хэш, то он конфликтует с тем триггером где он инициирован + я подозреваю что он вообще не работает там где я им пользуюсь.
Quote (SirNikolas)
loop call TriggerRegisterPlayerUnitEvent(trig, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null) exitwhen i == 11 set i = i + 1
Это типа для всех игроков? Но зачем? Всё равно группа юнитов то одна, глобальная.
Сообщение отредактировал FatalBlade - Пятница, 23 Сентября 2011, 16:22:30
Спелл: и так сначала пикаем всех юнитов вокруг 900р с условием что они мертвы.
далее сохраняем в хеш группу.
Таймер...
загружаем из хеша группу создаем лок группу
цикл пока все юниты из загруженной группы == null цикл пикать все юнитов в радиусе 180 около каждого трупа наносить урон Хотя этот цикл можно было выкинуть а создать даммика с простым спеллом на урон
КОНЕЦ!
Именно так у меня и не работала. Подозреваю что дело в хэше
FatalBlade, сделай, как я сказал, и у тебя все будет работать, даже если два героя одного игрока произнесут заклинание. udg_Group используется для мгновенного перебора юнитов группы.
Quote (lawson)
call GroupEnumbUnitInRect(g, r, Condition(#))//утечки не будет
Это сказал FkoFF?
[DUОS], я знаю, что лучше все делать внутри условий, но
Quote (SirNikolas)
нет JNGP, я не могу обявить глобальный boolexpr, а каждый раз создавать и удалять локальный - лишняя нагрузка.