XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
Boychaos

offline
Опыт: 35
Активность:
Люди помогите реализовать скил
Я вот Jass'a начитался и попёрло:)
Я хочу чтобы был созданл 4юнита и чтобы они атаковали врага Двигаясь к нему мгновенно. Но у меня там до 1к юнитов создаются. И я пытаюсь обнулить переменные а они не обнуляются.... За основу я взял Omni Slash отсюда из наработок а вот и сам код
Код:
//Условия
//========================================================================
function Trig_Kataclysm_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction
//Действия
//========================================================================
function Trig_Kataclysm_Func002001003 takes nothing returns boolean
    return ( GetOwningPlayer(GetFilterUnit()) != Player(0) )
endfunction

function Trig_Kataclysm_Func002002 takes nothing returns nothing
    call GroupAddUnitSimple( GetEnumUnit(), udg_UnitGroup )
endfunction

function Trig_Kataclysm_Actions takes nothing returns nothing
    local unit u
    local unit ut
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = CountUnitsInGroup(udg_UnitGroup)
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set ut = GroupPickRandomUnit(udg_UnitGroup)
        call TriggerSleepAction( 0.10 )
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), GetUnitLoc(ut), bj_UNIT_FACING )
        set u = GetLastCreatedUnit()
        call SetUnitAnimation( u, "Attack Slam" )
        call SetUnitPositionLoc( u, GetUnitLoc(ut) )
        call SetUnitFacingToFaceUnitTimed( u, ut, 0 )
        call TriggerSleepAction( 0.20 )
        call GroupRemoveUnitSimple( ut, udg_UnitGroup )
        call PolledWait( 0.40) 
        call RemoveUnit(u)
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
endfunction
//События
//===========================================================================
function InitTrig_Kataclysm takes nothing returns nothing
    set gg_trg_Kataclysm = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Kataclysm, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Kataclysm, Condition( function Trig_Kataclysm_Conditions ) )
    call TriggerAddAction( gg_trg_Kataclysm, function Trig_Kataclysm_Actions )
endfunction


Сори малямс ошибся не 1ого а 4и юнита я скил пересмотрел

Отредактировано Boychaos, 20.08.2010 в 10:04.
Старый 20.08.2010, 09:00
Arty3ooo
...
offline
Опыт: 3,125
Активность:
Оо т.е тебе нужен только один юнит? Избавься от loop
Старый 20.08.2010, 09:22
Boychaos

offline
Опыт: 35
Активность:
Ну мне нужно чтобы было 4 юнита и они как бы к врагам тп делал но без loop exitwhen endloop они не чего не делают а по скилу они мгновенно двигаются к случайному юниту и ещё воспроизводится анимация атаки Attack Slam а они как стояли на одном месте так и стоят. тоесть ut это случайный юнит из группы UnitGroup. Мне нужен цикл но такой чтобы их было всего 4 но как я хз. Тоесть 4и юнита создаются и чтобы когда триг создал 4и юнита он выключился мне это надо а там триг создаёт до 1к юнитов. Как это исправить. Я переменную Integer пробывал но как-то криво я не могу найти условие выхода из цикла. Не могу понять как Хелп Плиз.
Старый 20.08.2010, 10:01
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
udg_UnitGroup наверно не пустая, перед каждым вызовом скилла очищай GroupClear(udg_UnitGroup)
тоесть перед строкой
call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 

Отредактировано Alex_Hell, 20.08.2010 в 15:52.
Старый 20.08.2010, 15:38
Boychaos

offline
Опыт: 35
Активность:
Эм а как сделать чтобы после 5ти секунд все созданные юниты были удалены из игры меня ето утечка уже бесит...
Старый 20.08.2010, 18:45
JassMan
свободен
offline
Опыт: 4,193
Активность:
их не надо удалять достаточно поставить их на таймер BTLF и они сами умрут а затем удаляться из игры через 88 сек (в зависимости от констант)
Старый 20.08.2010, 21:06
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
По-идее в цикле у тебя воин создается и сразу же удаляется, хотя тут у тя задержка, и не красиво будет, лучше создать всех юнитов, а вот из группы udg_UnitGroup не удалять никого. Запустить таймер на 5 сек, чтобы по окончанию все юниты из udg_UnitGroup удалились, но нужно обязательно чтобы перезарядка способности была больше этих 5 сек, чтобы в udg_UnitGroup новых юнитов не добавилось, и к тому же для каждого игрока нужна своя группа udg_UnitGroup..
// дополнительные глобалки
globals
    timer	udg_MyTimer
endglobals

// действие таймера - все юниты удаляются и очищается группа
function MyTimerAction takes nothing returns nothing
    local unit u
    loop
        set u = FirstOfGroup(udg_UnitGroup)
        exitwhen u == null
        call GroupRemoveUnit(udg_UnitGroup, u)
        call RemoveUnit(u)
        set u = null
    endloop
endfunction

function Trig_Kataclysm_Actions takes nothing returns nothing
    local unit u
    local unit ut
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = CountUnitsInGroup(udg_UnitGroup)
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set ut = GroupPickRandomUnit(udg_UnitGroup)
        call TriggerSleepAction( 0.10 )
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), GetUnitLoc(ut), bj_UNIT_FACING )
        set u = GetLastCreatedUnit()
        call SetUnitAnimation( u, "Attack Slam" )
        call SetUnitPositionLoc( u, GetUnitLoc(ut) )
        call SetUnitFacingToFaceUnitTimed( u, ut, 0 )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    call TimerStart(udg_MyTimer, 5.0, false, function MyTimerAction)
endfunction
Старый 20.08.2010, 23:24
Boychaos

offline
Опыт: 35
Активность:
Тоесть весь код
Код:
//TESH.scrollpos=-1
//TESH.alwaysfold=0
//========================================================================
function Trig_Kataclysm_Conditions takes nothing returns boolean
    if ( not ( GetSpellAbilityId() == 'A000' ) ) then
        return false
    endif
    return true
endfunction
//========================================================================
function Trig_Kataclysm_Func002001003 takes nothing returns boolean
    return ( GetOwningPlayer(GetFilterUnit()) != Player(0) )
endfunction

function Trig_Kataclysm_Func002002 takes nothing returns nothing
    call GroupAddUnitSimple( GetEnumUnit(), udg_UnitGroup )
endfunction


function MyTimerAction takes nothing returns nothing
    local unit u
    loop
        set u = FirstOfGroup(udg_UnitGroup)
        exitwhen u == null
        call GroupRemoveUnit(udg_UnitGroup, u)
        call RemoveUnit(u)
        set u = null
    endloop
endfunction

function Trig_Kataclysm_Actions takes nothing returns nothing
    local unit u
    local unit ut
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = CountUnitsInGroup(udg_UnitGroup)
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set ut = GroupPickRandomUnit(udg_UnitGroup)
        call TriggerSleepAction( 0.10 )
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), GetUnitLoc(ut), bj_UNIT_FACING )
        set u = GetLastCreatedUnit()
        call SetUnitAnimation( u, "Attack Slam" )
        call SetUnitPositionLoc( u, GetUnitLoc(ut) )
        call SetUnitFacingToFaceUnitTimed( u, ut, 0 )
        call TriggerSleepAction( 0.20 )
        call GroupRemoveUnitSimple( ut, udg_UnitGroup )
        call PolledWait( 5.0) 
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
call TimerStart(udg_MyTimer, 5.0, false, function MyTimerAction)
endfunction
//===========================================================================
function InitTrig_Kataclysm takes nothing returns nothing
    set gg_trg_Kataclysm = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Kataclysm, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Kataclysm, Condition( function Trig_Kataclysm_Conditions ) )
    call TriggerAddAction( gg_trg_Kataclysm, function Trig_Kataclysm_Actions )
endfunction


Мля не работает и всё как спаунилось больше 10 юнитов и продолжает спаунится я хочу убить всех наспауниных юнитов которые создал тригер. Чтобы они из игры удалились и только в следующем запуске спела они появились я уже 4 дня ломаю голову над этим спелом.... Я уже и таймеры все перепробывал. Я и таймер истечения жизни пришивал к юнитам а они сволочи не хотят дохнуть как выйти из цикла спауна юнитов чтобы цикл их больше не создовал. Вот где-то в этом участке собака зарыта.
________________________________________________________________________________ _________________
Код:
function Trig_Kataclysm_Actions takes nothing returns nothing
    local unit u
    local unit ut
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = CountUnitsInGroup(udg_UnitGroup)
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set ut = GroupPickRandomUnit(udg_UnitGroup)
        call TriggerSleepAction( 0.10 )
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), GetUnitLoc(ut), bj_UNIT_FACING )
        set u = GetLastCreatedUnit()
        call SetUnitAnimation( u, "Attack Slam" )
        call SetUnitPositionLoc( u, GetUnitLoc(ut) )
        call SetUnitFacingToFaceUnitTimed( u, ut, 0 )
        call TriggerSleepAction( 0.20 )
        call GroupRemoveUnitSimple( ut, udg_UnitGroup )
        call PolledWait( 5.0) 
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
call TimerStart(udg_MyTimer, 5.0, false, function MyTimerAction)
endfunction

А кстати куда это вставить?
//Допалнительные глобалки
timer udg_MyTimer
endglobals
P.S вот карта где сам спел на 53% создан

Boychaos добавил:
Мб сам тригер некорректен он в Omni Slash расчитан на 1ого юнита и то на кастера

Boychaos добавил:
Спел уг буду спецэффектами а не дами юнитами делать сие непонятное...

Boychaos добавил:
Как сделать чтобы когда спекэффект попадает на юнита ему был урон?!

Boychaos добавил:
Кроче спел с иллюзиями некоректен так как там выход из цикла будет только когда все юниты юнит груп будут мертвы а так как группа не локальная переменная то в неё пытаются засунуть всех стоящих юнитов в радиусе 512 от кастера и к тому же если будет ещё один гер с этим скилом то ... будет вообще..Спел вообщем одна сплошная утечка.
Прикрепленные файлы
Тип файла: w3x WorldEditTestMap.w3x (38.3 Кбайт, 19 просмотров )

Отредактировано Boychaos, 21.08.2010 в 10:54.
Старый 21.08.2010, 10:43
Boychaos

offline
Опыт: 35
Активность:
аУ ВЫ где?
Старый 22.08.2010, 17:07
Alex_Hell
Mapmaker 'N' Programmer
offline
Опыт: 6,885
Активность:
Я же показал как нужно сделать функцию:
function Trig_Kataclysm_Actions takes nothing returns nothing
    local unit u
    local unit ut
    call ForGroupBJ( GetUnitsInRangeOfLocMatching(500.00, GetUnitLoc(gg_unit_E000_0001), Condition(function Trig_Kataclysm_Func002001003)), function Trig_Kataclysm_Func002002 )
    set bj_forLoopAIndex = 1
    set bj_forLoopAIndexEnd = CountUnitsInGroup(udg_UnitGroup)
    loop
        exitwhen bj_forLoopAIndex > bj_forLoopAIndexEnd
        set ut = GroupPickRandomUnit(udg_UnitGroup)
        call TriggerSleepAction( 0.10 )
        call CreateNUnitsAtLoc( 1, 'h000', Player(0), GetUnitLoc(ut), bj_UNIT_FACING )
        set u = GetLastCreatedUnit()
        call SetUnitAnimation( u, "Attack Slam" )
        call SetUnitPositionLoc( u, GetUnitLoc(ut) )
        call SetUnitFacingToFaceUnitTimed( u, ut, 0 )
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
          // здесь ниче больше не надо, никаких TriggerSleepAction
    endloop
    call TimerStart(udg_MyTimer, 5.0, false, function MyTimerAction)
endfunction
udg_MyTimer - если будешь объявлять в редакторе переменных GUI - назови MyTimer, тип - таймер
А то, что на 1 игрока расчитан - это да, делай массив групп udg_UnitGroup чтобы для всех игроков своя группа, индекс в массиве - индекс игрока..
Но перед этим хотябы для 1 игрока проверь - работает или нет?
Про выход из цикла - тут я вижу что выдет когда закончится счетчик, а он равен кол-ву воинов в радиусе 500 + с условием что это не игрок(0)
Старый 22.08.2010, 23:04
Boychaos

offline
Опыт: 35
Активность:
Boychaos:
Слыш а чё тебя в аське не видно.
Тоесть тут в jass'e тригеры походу игры создаются кул:)

Отредактировано Boychaos, 23.08.2010 в 07:44.
Старый 23.08.2010, 07:38
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:49.