!===============================================================================================================================
Ability01
!===============================================================================================================================
Описание способности:
Выбирает всех союзных юнитов (кроме здания) в радиусе 900 от кастера
и добавляет способность которая удаляется спустя 6 секунд от всех выбранных юнитов
function Ability01_Filter takes nothing returns boolean
    return GetUnitAbilityLevel(GetFilterUnit(), 'B413') == 0 and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(GetSpellAbilityUnit())) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD) == false and IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) == false
endfunction

function Ability01_Timer takes nothing returns nothing
    local timer t = GetExpiredTimer() 
    local integer h = GetHandleId(t) 
    local unit u = LoadUnitHandle(H,h,0)
    local real time = LoadReal(H,h,1)
    local real proverka = LoadReal(H,h,2)
    if GetWidgetLife(u) < .405 and proverka == 0 then
    call UnitRemoveAbility( u, LoadInteger(H, h, 3 ))
    call UnitRemoveAbility( u, LoadInteger(H, h, 4 ))
    set proverka = proverka+1
    call SaveReal(H,h,2,proverka)
    endif
    if time < 0 then
    call UnitRemoveAbility( u, LoadInteger(H, h, 3 ))
    call UnitRemoveAbility( u, LoadInteger(H, h, 4 ))
    call FlushChildHashtable(H, h)
    call PauseTimer(t)
    call DestroyTimer(t)
    else
    call SaveReal(H, h, 1, time - .025)
    endif
    set u = null
    set t = null
endfunction

function Ability01Group takes nothing returns nothing
local timer t = CreateTimer()
local integer h = GetHandleId(t)
local unit u = GetEnumUnit()
local real proverka = 0
local real time = 6
call UnitAddAbility(u,'A535') 
call SetPlayerAbilityAvailable(GetOwningPlayer(u),'A535',false)
call SaveUnitHandle(H,h,0,u)
call SaveReal(H,h,1,time)
call SaveReal(H,h,2,proverka)
call SaveInteger(H,h,3,'A535')
call SaveInteger(H,h,4,'B413')
call TimerStart(t,.025,true,function Ability01_Timer)
set t=null
set u=null
endfunction

function Ability01 takes unit a returns nothing
local group g = CreateGroup()
local boolexpr b = Condition(function Ability01_Filter)
call GroupEnumUnitsInRange(g,GetUnitX(a),GetUnitX(a),900.00,b)
call ForGroup(g,function Ability01Group)
call DestroyBoolExpr(b)
call DestroyGroup(g)
set g=null
set b=null
set a=null
endfunction
//Условие
function AbilityCondition takes nothing returns boolean
local unit u = GetSpellAbilityUnit()
if GetSpellAbilityId() == 'A1ZW' then
call Ability01(u)
endif
set u = null
return false
endfunction

Zeuz, в доте нету такого количества таймеров
во многих нормальных картах сделано так как в статьях
Zeuz:
покажи пример в обычном jass
скопируй в карту а потом вытащи из неё j файл или напиши в коде букву на отдельной строке (тогда тебе выдаст ошибку и будет показан исходный код)
но на обычном джассе этот код больше и писать/читать его неудобно так что держи
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
33
Zeuz, в форматировании есть тег «код». Используй его, пожалуйста. Так легче читать.
17
Кет, окей) и забыл спросить, эта функция по идее должен был быть муй но тупит и тупит
задолбался уже весь день сижу и никак не пойму где здесь ошибка?
иногда функция работает,но это только временно,
потом снова не берет забывает что ли? forgoup тупит по пойму...
28
Zeuz, ошибка в том что ты написал кучу лишнего кода когда систему можно было сделать намного проще и оптимальнее
но видимо у современных мапмейкеров использование мозга считается дурным тоном
ошибка во всём
начиная с неправильного использования условий триггера (вроде же задавал вопрос уже) и ненужны переменных
и заканчивая кучей параллельных таймеров
17
nvc123, а как тогда сделать?
и у меня только один таймер
а про условие у меня там просто много проверяющих if GetSpellAbilityId() endif это просто я укоротил
13
Не проще выбрать определенных юнитов, без форгроуп и циклом использовать FirstOfGroup?
17
NekoriDes, пожалуйста свой вариант исполнения
Описание способности:
Выбирает всех союзных юнитов (кроме здания) в радиусе
900 от кастера
и добавляет способность которая удаляется спустя 6
секунд от всех выбранных юнитов
13
call GroupEnumUnitsInRange(Группа,X,Y,900,твое условие)
Далее цикл, в нем просто
set u = FirstOfGroup(g)
Твои действия
Удаляешь юнита u из группы. И так до тех пор, пока не истечет таймер.
Весь триггер за тебя здесь вряд ли кто-то намерен писать.
17
NekoriDes, покажи пример добавления циклом чтоб я мог понять как оно работает
просто я в нынешнем уровне не могу создать способность которая временно добавляет абилиту к группе юнитов и спустя некоторое время потом обратно их удаляет
вроде спелл очень легок в исполнении
жаль что я умею работать только одним targetom ) могу спокойно добавить способность одному конкретному юниту и спустя некоторое время удалить
но с группой такое не прокатишь разве что могу добавить способность и оставить т.е не удалять хаха
28
Zeuz, какой один
количество таймеров равно количесту юнитов которые попали под спелл
если 10 юнитов кастанут способность и вокруг каждого из них будет по 10 разных юнитов то вар вылетит нафиг
17
nvc123, как тогда создать спелл? ведь все так создают
без таймера никак,
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.