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

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

Ответ
 
ARHUI

offline
Опыт: 3,341
Активность:
Помогите с заклинанием
Подскажите в общем виде как сделать такое заклинание: башня стреляет по крипам, но есть шанс что при выстреле, одного из крипов, в зоне её поражения, она поставит в корни(Гнев Деревьев), при этом игрок может и сам кастануть на крипа. Моя проблема видимо в том что я не знаю какая функция в jass кастует абилку от имени юнита... Может можно сделать такое вообще без триггеров, в редакторе объектов?
Старый 03.01.2011, 22:28
Wortecs

offline
Опыт: 3,146
Активность:
Я знаю что с помощи Сфера Замедления можно давать шанс на каст всему чему пожелается
Старый 03.01.2011, 22:54
Doc

offline
Опыт: 63,163
Активность:
Wortecs, да ты что, а ты в курсе, что она работает только при прямом приказе со стороны игрока?
Старый 03.01.2011, 22:57
Icy
Это Я!
offline
Опыт: 1,785
Активность:
ARHUI, вот вариант сделать почти без триггеров:
Кароче, создаёшь пустой спеллбук, создаёшь спсобность сферу молний(помоему, ну или какая там сфера может жахнуть с каким то шансом при атаке), пихаешь в неё свои корни, потом пихаешь эту сферу в спеллбук, патом даёшь башни твои корни, а потом создаешь триг с событием "юнит приобретает способность", в её действиях даёшь башне готовый спеллбук и запрещаешь для игрока-владельца спеллбук(пункт Игрок - Enable\Disable Ability) - ставишь заблокировать и вуоля мегосуперуберпуперкакаспелл готов, окакмногабукф!
А вот второй вариант:
Создаёшь триггер с событием "юнит атакован", ставишь в условиях, что атакер это тот кто тебе нужен, так же в условиях ставишь, что случайное число от нуля до 100 меньше или равно нужному шансу(а так же можешь поставить условие наличия веток на атакованном юните),
а в действиях создаёшь невидимого дамика, даёшь ему время жизни на полсекунды, даёшь способность твоих веток(ну и чтоб у дамика было полтыщи маны, а то на каст не хватит) ну и сопсно кастуешь их на атакованного юнита.
Тужился пять минут, вродь по русски объяснил, надеюсь поможет!
Старый 04.01.2011, 00:49
Wortecs

offline
Опыт: 3,146
Активность:
Doc, Да я что, оно работает когда етот шанс наступает при атаке
Старый 04.01.2011, 01:02
BesitzeRuf

offline
Опыт: 560
Активность:
Я тебе скажу проще ... Сделай унита, который не сможет двигаться и ему поменяй модельку.. и дай этот спел.... потом тригерами отлавливай когда этот юнит атакует кого-то и при таком-то шансе функцией изай спел на того крипа, которого атакует ).. Единственное я не знаю.. как решить проблемму чтоб он не крутился, но мог стрелять на 360 градусов ((
Старый 04.01.2011, 01:09
Icy
Это Я!
offline
Опыт: 1,785
Активность:
BesitzeRuf:
Единственное я не знаю.. как решить проблемму чтоб он не крутился, но мог стрелять на 360 градусов ((
May be поставить скорость поворота на 0? Помоему стрелять сможет
Старый 04.01.2011, 01:14
Klop
Папа римский
offline
Опыт: 13,006
Активность:
читаем статью xgm.ru/forum/showthread.php?t=34216
задаём шанс при получении урона if GetRandomInt(1,100) < chance then
создаёш даммика ,даём время жизни даммику,кастуем корни
Старый 04.01.2011, 05:38
Doc

offline
Опыт: 63,163
Активность:
Wortecs, ой извини! карту глянь и учись слушать мнение других и обосновывать свое.
Прикрепленные файлы
Тип файла: w3x Nps.w3x (11.9 Кбайт, 15 просмотров )
Старый 04.01.2011, 10:40
Ajaccio

offline
Опыт: 1,007
Активность:
Моя проблема видимо в том что я не знаю какая функция в jass кастует абилку от имени юнита...
call IssueTargetOrder(unit caster, string order, unit target)
Старый 04.01.2011, 10:41
ARHUI

offline
Опыт: 3,341
Активность:
Ещё один вопрос - надо сделать заклинание:
при атаке у башни шанс всех врагов в радиусе самой башни поразить заклинанием корни
После всего выше написаного я вижу решение вопроса таким:
у башни есть абила крит. удара(A001)
есть триггер который срабатывает при EVENT_PLAYER_UNIT_SPELL_EFFECT
проверяю чтобы абила была крит.удар(A001)
потом создаю группу g в которую войдут все враги в радиусе N от юнита применившего абилу(от башни)
для каждого члена группы ставлю функцию в которой рядом с крипом создаётся дамик которому добавляю способность корней и заставляю дамика кастовать корни на крипа потом удаляю дамика
в триггере уничтожаю группу.
Как считаете ничего не упустил в плане утечек и вообще все ли верно?
ARHUI добавил:
Есть разница какой каст тайм у корней или когда делаешь call IssueTargetOrder(unit caster, string order, unit target) то каст будет мгновенным?
Старый 05.01.2011, 20:13
Icy
Это Я!
offline
Опыт: 1,785
Активность:
ARHUI:
Есть разница какой каст тайм у корней или когда делаешь call IssueTargetOrder(unit caster, string order, unit target) то каст будет мгновенным?
Каст будет такой же как и при ручном применении
ARHUI:
у башни есть абила крит. удара(A001)
есть триггер который срабатывает при EVENT_PLAYER_UNIT_SPELL_EFFECT
проверяю чтобы абила была крит.удар(A001)
Бред! На крит триггеры не сработают! Это пассивка!
Юзай мой способ:
Icy:
Создаёшь триггер с событием "юнит атакован", ставишь в условиях, что атакер это тот кто тебе нужен, так же в условиях ставишь, что случайное число от нуля до 100 меньше или равно нужному шансу(а так же можешь поставить условие наличия веток на атакованном юните),
а в действиях создаёшь невидимого дамика, даёшь ему время жизни на полсекунды, даёшь способность твоих веток(ну и чтоб у дамика было полтыщи маны, а то на каст не хватит) ну и сопсно кастуешь их на атакованного юнита.
Остальное всё тру! Утечек не будет, если всё правильно сделаешь.
Старый 05.01.2011, 20:33
ARHUI

offline
Опыт: 3,341
Активность:
невидимого дамика - как его невидимым сделать?
Старый 05.01.2011, 20:34
Banzay89

offline
Опыт: 11,155
Активность:
ARHUI:
невидимого дамика - как его невидимым сделать?
напиши в троке "файл модели" какой то бред. например dsfwetedgr
Старый 05.01.2011, 20:44
ARHUI

offline
Опыт: 3,341
Активность:
спс
ARHUI добавил:
call IssueTargetOrder(unit caster, string order, unit target)
string order - как вместо этого свою нестандартную абилку написать?
ARHUI добавил:
просто у башни несколько уровней соответственно абилок тоже несколько... Неужели дамаг самому делать придётся?
Старый 05.01.2011, 21:30
Icy
Это Я!
offline
Опыт: 1,785
Активность:
ARHUI:
string order
Это "Порядок строк" у способности в РО
Старый 05.01.2011, 21:35
ARHUI

offline
Опыт: 3,341
Активность:
Так ведь там нельзя свой написать! как заставить именно свою абилу кастовать?
Старый 05.01.2011, 21:37
Icy
Это Я!
offline
Опыт: 1,785
Активность:
Зачем писать? Устанавливать свой ид приказа можно только каналу, а тут просто подставь в функцию
Старый 05.01.2011, 21:53
ARHUI

offline
Опыт: 3,341
Активность:
в общем и целом убрал порядок строк от оригинальных корней и сделал такой вот триггер
function IsUnitUndead takes nothing returns boolean
    return (GetOwningPlayer(GetFilterUnit()) == Player(11))
endfunction

function IsUnitTowerOfEarth takes nothing returns boolean
    return ( GetUnitTypeId(GetAttacker()) == 'h02X' )
endfunction

function MegaRoootsGroupAction takes nothing returns nothing
    local unit u = CreateUnitAtLoc(GetOwningPlayer(GetAttacker()), 'u00J', GetUnitLoc(GetEnumUnit()), 0.0 )
    call UnitAddAbility( u, 'A00P' )
    call IssueTargetOrder( u, "entanglingroots", GetEnumUnit() )
    call UnitApplyTimedLife( u, 'BTLF', 0.01 )
endfunction

function MegaRootsActions takes nothing returns nothing
    if ( GetRandomInt(1, 100) < 10 ) then
        local group g = CreateGroup()
        call GroupEnumUnitsInRangeOfLoc(g, GetUnitLoc(GetAttacker()), 800.0, Condition(function IsUnitUndead))
        call ForGroup( g, function MegaRoootsGroupAction )
        call DestroyGroup(g)
    endif
endfunction

//===========================================================================
function InitTrig_MegaRoots takes nothing returns nothing
    set gg_trg_MegaRoots = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MegaRoots, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_MegaRoots, Condition( function IsUnitTowerOfEarth ) )
    call TriggerAddAction( gg_trg_MegaRoots, function MegaRootsActions )
endfunction
кто что может сказать по-поводу утечек и вообще корректности подхода к такому спелу?
Старый 05.01.2011, 22:04
Icy
Это Я!
offline
Опыт: 1,785
Активность:
> function IsUnitUndead takes nothing returns boolean
>     return (GetOwningPlayer(GetFilterUnit()) == Player(11))
> endfunction
> 
> function IsUnitTowerOfEarth takes nothing returns boolean
>     return ( GetUnitTypeId(GetAttacker()) == 'h02X' )
> endfunction
> 
> function MegaRoootsGroupAction takes nothing returns nothing
>     local unit u = CreateUnitAtLoc(GetOwningPlayer(GetAttacker()), 'u00J', GetUnitLoc(GetEnumUnit())<< Таже фигня!, 0.0 )
>     call UnitAddAbility( u, 'A00P' )
>     call IssueTargetOrder( u, "entanglingroots", GetEnumUnit() )
>     call UnitApplyTimedLife( u, 'BTLF', 0.01 )
>        // Утечка не обнулённая переменная u
> endfunction
> 
> function MegaRootsActions takes nothing returns nothing
>     if ( GetRandomInt(1, 100) < 10 ) then
>         local group g = CreateGroup()
>         call GroupEnumUnitsInRangeOfLoc(g, GetUnitLoc(GetAttacker())<< Утечка! Не удалённая локация, 800.0, Condition(function IsUnitUndead))
>         call ForGroup( g, function MegaRoootsGroupAction )
>         call DestroyGroup(g)
>        // Утечка не обнулённая переменная g
>     endif
> endfunction
> 
> //===========================================================================
> function InitTrig_MegaRoots takes nothing returns nothing
>     set gg_trg_MegaRoots = CreateTrigger(  )
>     call TriggerRegisterAnyUnitEventBJ( gg_trg_MegaRoots, EVENT_PLAYER_UNIT_ATTACKED )
>     call TriggerAddCondition( gg_trg_MegaRoots, Condition( function IsUnitTowerOfEarth ) )
>     call TriggerAddAction( gg_trg_MegaRoots, function MegaRootsActions )
> endfunction
Код так себе!
» Я бы сделал так:
function IsUnitTowerOfEarth takes nothing returns boolean
    return ( GetUnitTypeId(GetAttacker()) == 'h02X' )
endfunction

function MegaRootsActions takes nothing returns nothing
  local unit pu
  local unit du
  local group g

  if ( GetRandomInt(1, 100) < 10 ) then
    set g = CreateGroup()
    call GroupEnumUnitsInRange(g, GetUnitX(GetAttacker()), GetUnitY(GetAttacker()), 800.0, null)

    // Это вместо ForGroup
    loop
      set pu = FirstOfGroup(g)
      exitwhen (pu == null)

      if (GetOwningPlayer(pu) == Player(11)) then// IsUnitUndead
        set du = CreateUnitAtLoc(GetOwningPlayer(GetAttacker()), 'u00J', GetUnitX(pu), GetUnitY(pu), 0.0)
        call UnitAddAbility(du, 'A00P')
    	call IssueTargetOrder(du, "entanglingroots", pu)
    	call UnitApplyTimedLife(du, 'BTLF', 0.01)
      endif

      call GroupRemoveUnit(g, pu)
    endloop

    call DestroyGroup(g)
    set g = null
    set pu = null
    set du = null
  endif

endfunction

//===========================================================================
function InitTrig_MegaRoots takes nothing returns nothing
    set gg_trg_MegaRoots = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_MegaRoots, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_MegaRoots, Condition( function IsUnitTowerOfEarth ) )
    call TriggerAddAction( gg_trg_MegaRoots, function MegaRootsActions )
endfunction
Старый 05.01.2011, 22:21
Ответ

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

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

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

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



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