!===============================================================================================================================
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 файл или напиши в коде букву на отдельной строке (тогда тебе выдаст ошибку и будет показан исходный код)
но на обычном джассе этот код больше и писать/читать его неудобно так что держи
`
ОЖИДАНИЕ РЕКЛАМЫ...
1
32
8 лет назад
1
Мб юнный IseFrog решит оформить код нормально и описать что именно не срабатывает и когда?
0
17
8 лет назад
0
quq_CCCP, функцию создал я с нуля, просто спелл тупит, вроде первый раз используешь работает на нормально) а во второй раз и дальше уже не ловит GetEnumUnit() некоторых юнитов, и еще иногда вообще не берет никого
наверно сам вар тупит
0
33
8 лет назад
0
Zeuz, в форматировании есть тег «код». Используй его, пожалуйста. Так легче читать.
0
17
8 лет назад
0
Кет, окей) и забыл спросить, эта функция по идее должен был быть муй но тупит и тупит
задолбался уже весь день сижу и никак не пойму где здесь ошибка?
иногда функция работает,но это только временно,
потом снова не берет забывает что ли? forgoup тупит по пойму...
0
28
8 лет назад
0
Zeuz, ошибка в том что ты написал кучу лишнего кода когда систему можно было сделать намного проще и оптимальнее
но видимо у современных мапмейкеров использование мозга считается дурным тоном
ошибка во всём
начиная с неправильного использования условий триггера (вроде же задавал вопрос уже) и ненужны переменных
и заканчивая кучей параллельных таймеров
0
17
8 лет назад
0
nvc123, а как тогда сделать?
и у меня только один таймер
а про условие у меня там просто много проверяющих if GetSpellAbilityId() endif это просто я укоротил
0
13
8 лет назад
0
Не проще выбрать определенных юнитов, без форгроуп и циклом использовать FirstOfGroup?
0
17
8 лет назад
0
NekoriDes, пожалуйста свой вариант исполнения
Описание способности:
Выбирает всех союзных юнитов (кроме здания) в радиусе
900 от кастера
и добавляет способность которая удаляется спустя 6
секунд от всех выбранных юнитов
0
13
8 лет назад
Отредактирован NekoriDes
0
call GroupEnumUnitsInRange(Группа,X,Y,900,твое условие)
Далее цикл, в нем просто
set u = FirstOfGroup(g)
Твои действия
Удаляешь юнита u из группы. И так до тех пор, пока не истечет таймер.
Весь триггер за тебя здесь вряд ли кто-то намерен писать.
0
17
8 лет назад
0
NekoriDes, покажи пример добавления циклом чтоб я мог понять как оно работает
просто я в нынешнем уровне не могу создать способность которая временно добавляет абилиту к группе юнитов и спустя некоторое время потом обратно их удаляет
вроде спелл очень легок в исполнении
жаль что я умею работать только одним targetom ) могу спокойно добавить способность одному конкретному юниту и спустя некоторое время удалить
но с группой такое не прокатишь разве что могу добавить способность и оставить т.е не удалять хаха
0
28
8 лет назад
0
Zeuz, какой один
количество таймеров равно количесту юнитов которые попали под спелл
если 10 юнитов кастанут способность и вокруг каждого из них будет по 10 разных юнитов то вар вылетит нафиг
0
17
8 лет назад
0
nvc123, как тогда создать спелл? ведь все так создают
без таймера никак,
0
28
8 лет назад
0
Zeuz, используя 1 таймер
вот статьи в тему
0
17
8 лет назад
0
nvc123, я vjass не знаю, покажи пример в обычном jass
и еще вопрос почему тогда в доте и в других картах вар не вылетает?
ведь они создают примерно так же
т.е крепят юнита хэндлу таймера..,
0
13
8 лет назад
0
Zeuz, потому что они делают это десятки раз одновременно. Если я правильно понял nvc123.
1
28
8 лет назад
Отредактирован nvc123
1
Zeuz, в доте нету такого количества таймеров
во многих нормальных картах сделано так как в статьях
Zeuz:
покажи пример в обычном jass
скопируй в карту а потом вытащи из неё j файл или напиши в коде букву на отдельной строке (тогда тебе выдаст ошибку и будет показан исходный код)
но на обычном джассе этот код больше и писать/читать его неудобно так что держи
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.