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

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

Ответ
 
sleepw

offline
Опыт: 8,449
Активность:
Портал
вод настрочил тут ацки..
тыкните на ошибки если они есть:)
» spell

Код:
globals
    unit array gtu
    timer array gtt
    location array gtl
endglobals

function Trig_Gtravel_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A020'
endfunction

function moveone takes nothing returns nothing
    call SetUnitPositionLoc(GetEnumUnit(),gtl[2])
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Human\\Banish\\BanishTarget.mdl",GetEnumUnit(),"chest"))
endfunction

function Gtravel_g takes nothing returns boolean
    return  IsUnitAliveBJ(GetFilterUnit()) == true  and GetFilterUnit()!=gtu[1] and GetFilterUnit()!=gtu[2] and IsUnitAlly(GetFilterUnit(), GetOwningPlayer(gtu[3]))
endfunction

function Gtravel_gDamage takes nothing returns boolean
    return  IsUnitAliveBJ(GetFilterUnit()) == true  and GetFilterUnit()!=gtu[1] and GetFilterUnit()!=gtu[2] and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(gtu[3]))
endfunction

function enterTact takes nothing returns nothing
  if TimerGetRemaining(gtt[1]) > 0.00 then
    call ForGroupBJ(GetUnitsInRangeOfLocMatching(100, gtl[1], Condition(function Gtravel_g)),function moveone)
  else
    call DestroyTimer(gtt[1])
    call DestroyTimer(gtt[2])
    call RemoveUnit(gtu[1])
    call RemoveUnit(gtu[2])
    set gtu[1]=null
    set gtu[2]=null
    set gtu[3]=null
    call RemoveLocation(gtl[1])
    call RemoveLocation(gtl[2])
    set gtl[1]=null
    set gtl[2]=null
  endif
    endfunction

function Trig_Gtravel_Actions takes nothing returns nothing
    local real time = 5.00*GetUnitAbilityLevel(GetTriggerUnit(),'A020') //gt duration
    local real gtdmg = 100*GetUnitAbilityLevel(gtu[3],'A020') //blow damage
    local location loc = GetSpellTargetLoc()
    local group g
    local unit u
  if DistanceBetweenPoints(GetUnitLoc(GetTriggerUnit()),loc)<=400 then
    call DisplayTextToForce(GetForceOfPlayer(GetOwningPlayer(GetTriggerUnit())),"|cffffcc00It's too close for placing portals.|r")
    call IssueImmediateOrderBJ( GetTriggerUnit(), "stop" )
  else
    set gtu[1] = CreateUnit(GetOwningPlayer(GetTriggerUnit()),'h00H',GetUnitX(GetTriggerUnit()),G  etUnitY(GetTriggerUnit()),GetRandomDirectionDeg())
    set gtu[2] = CreateUnit(GetOwningPlayer(GetTriggerUnit()),'h00H',GetLocationX(loc),GetLocatio  nY(loc),GetRandomDirectionDeg())
    set gtu[3] = GetTriggerUnit()
    set gtl[1] = GetUnitLoc(gtu[1])
    set gtl[2] = GetUnitLoc(gtu[2])
    set gtt[1] = CreateTimer()
    set gtt[2] = CreateTimer()
    call KillUnit(CreateUnit(GetOwningPlayer(GetTriggerUnit()),'h00H',GetUnitX(gtu[2]),GetUnitY(gtu[2]),GetRandomDirectionDeg()))
    set g = GetUnitsInRangeOfLocMatching(400, gtl[2], Condition(function Gtravel_gDamage))
    loop
    set u = FirstOfGroup(g)
      exitwhen u == null
        call UnitDamageTargetBJ(gtu[3],u,gtdmg,ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL)
        call GroupRemoveUnit(g,u)
    endloop
    call StartTimerBJ(gtt[1],false,time)
    call TimerStart(gtt[2],0.25,true,function enterTact)
    call RemoveLocation(loc)
    set loc = null
    call DestroyGroup(g)
    set g = null
  endif
endfunction

//===========================================================================
function InitTrig_Gtravel takes nothing returns nothing
    set gg_trg_Gtravel = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Gtravel, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_Gtravel, Condition( function Trig_Gtravel_Conditions ) )
    call TriggerAddAction( gg_trg_Gtravel, function Trig_Gtravel_Actions )
endfunction



и исчо
както по дебильному пашет вот это:
Код:
loop
    set u = FirstOfGroup(g)
      exitwhen u == null
        call UnitDamageTargetBJ(gtu[3],u,gtdmg,ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL)
        call GroupRemoveUnit(g,u)
    endloop

через раз грубо говоря О_о
Старый 14.03.2008, 16:27
J
expert
offline
Опыт: 48,447
Активность:
нафиг тебе локейшены?

Jon добавил:
Код:
local real gtdmg = 100*GetUnitAbilityLevel(gtu[3],'A020')
это спецально так сделано? или надо заменить на норм кастера?

Jon добавил:
Код:
call KillUnit(CreateUnit(GetOwningPlayer(GetTriggerUnit()),'h00H',GetUnitX(gtu[2]),GetUnitY(gtu[2]),GetRandomDirectionDeg()))
а это зачем? анимацию смерти что ли надо проиграть?
Старый 14.03.2008, 16:45
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Тут ошибка:
Код:
local real gtdmg = 100*GetUnitAbilityLevel(gtu[3],'A020') //blow damage

gtu[3] не задан => уровень абилки 0 => урон 0.

Кстати, не понял, зачем первый таймер, если, вероятно, лучше было бы применить интегерную переменную.
В функции Gtravel_gDamage лишние проверки. Если юнит - враг по отношению к кастеру, то он по определению не может быть порталом, созданным в триггере и принадлежащем кастеру. Т.е.:
Код:
function Gtravel_gDamage takes nothing returns boolean
    return  IsUnitAliveBJ(GetFilterUnit()) == true and GetFilterUnit()!=gtu[1] and GetFilterUnit()!=gtu[2] and IsUnitEnemy(GetFilterUnit(), GetOwningPlayer(gtu[3]))
endfunction


Про оптимизацию, думаю, говорить не нужно.
Старый 14.03.2008, 16:54
sleepw

offline
Опыт: 8,449
Активность:
тьху блин.. точно..)) запуталсо.. всё в голове держал думаю вот щас закончу и поменяю))

уго.. проиграть:)

ммм.. х3х3.. писать так легче .. да надо бы убрать)

sleepw добавил:
ShadoW DaemoN
эх.. скопировал просто.. рассеяный я) шо делать ><

sleepw добавил:
зы. ещё такое.. можно ли както симитировать ошибку каста?..
ну навроде "Предмет - не подходящая цель"... тоесть что бы нельзя было клацнуть именно..)
Старый 14.03.2008, 17:10
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Старый 14.03.2008, 17:11
J
expert
offline
Опыт: 48,447
Активность:
ну, сделать очень похожое сообщение об ошибке это еще ладно, а вот чтобы клацануть нельзя было это нет... делается только через ро
Старый 14.03.2008, 17:11
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Jon, кстати не помню, а если убирать предметную абилу у юнита, когда он подберет предмет? Т.е. можно же левелить многоуровневые предметные абилы для юнита - только уровни сбрасываются при выкидывании предмета.

FellGuard добавил:
Цитата:
"Предмет - не подходящая цель"
требует отлова "начинает направлять способность"
Старый 14.03.2008, 17:16
sleepw

offline
Опыт: 8,449
Активность:
FellGuard
сенко палезно:)

sleepw добавил:
каг можно в лупе вейт нормально зоделать?..
слип и поллед его закупоривают вообще =\
Старый 14.03.2008, 18:06
J
expert
offline
Опыт: 48,447
Активность:
нинадо делать в лупе вейт, или покрайне мере скажи зачем...
Старый 14.03.2008, 18:10
sleepw

offline
Опыт: 8,449
Активность:
Jon
ну 10 раз с промежутком в 0.20 изменить высоту юнита..
или тут опять привет таймер?

sleepw добавил:
просто странно мего..
раньше юзал вейт в лупе и ничё такого не замечал..
Старый 14.03.2008, 18:20
J
expert
offline
Опыт: 48,447
Активность:
Цитата:
просто странно мего..
раньше юзал вейт в лупе и ничё такого не замечал..

представь, и никто не замечал, а вот ктото заметил^^
Старый 14.03.2008, 18:23
sleepw

offline
Опыт: 8,449
Активность:
Jon
ну дык каг решить?:)
токо таймером снова?..
Старый 14.03.2008, 18:25
J
expert
offline
Опыт: 48,447
Активность:
конешно если я скажу тебе используй ваит, в твоем случае хуже не станет, то на меня начнут корабкоца какието говно юзеры... такчто говорить не буду

Jon добавил:
короче, сам выбери, просто или лучше?
Старый 14.03.2008, 18:26
sleepw

offline
Опыт: 8,449
Активность:
хатя нед имхо не кадед)

sleepw добавил:
ёпт.. ну подскажи тогда самый нормальный способ которым можно 10 раз с задержкой проделать действия..
Старый 14.03.2008, 18:30
J
expert
offline
Опыт: 48,447
Активность:
если я скажу ваит, я уже говорил что будет...
если я скажу таймер, то ты наверняка зделаеш его динамически создающимся, и опять начнут говорить про глобальные таймеры группы, про какуюто фигню...
Старый 14.03.2008, 18:34
sleepw

offline
Опыт: 8,449
Активность:
Jon
окок.. каг ещё можно сделать?=\
какая разница кто там что скажет.. я ж тебя спрашиваю а не их;)
Старый 14.03.2008, 18:36
J
expert
offline
Опыт: 48,447
Активность:
скинь карту с этим спелом, чтобы я прям на основе тебе его подбправил
я там и решу как лучше, т.к. в каждой ситуации по разному...
Старый 14.03.2008, 18:40
sleepw

offline
Опыт: 8,449
Активность:
тицтиц
Прикрепленные файлы
Тип файла: w3x gt.w3x (14.8 Кбайт, 7 просмотров )
Старый 14.03.2008, 18:48
J
expert
offline
Опыт: 48,447
Активность:
вотЪ

Для справки: юниту нельзя задать отрицательную высоту, потому я просто вырезал это
+ Есть некоторые способности в настройках которых можно сразу указать минимальный радиус атаки

Jon добавил:
я не стал делать универсальность, т.е. оставил все как есть, т.е. если 2 раза кастануть то уже будет работать не корректно
Прикрепленные файлы
Тип файла: w3x gt.w3x (15.1 Кбайт, 7 просмотров )
Старый 14.03.2008, 19:47
sleepw

offline
Опыт: 8,449
Активность:
Jon
сенки:)
токо вот понять не могу чем тебе не понравилось дистанс битвин поинтс?:)
Старый 14.03.2008, 21:02
Ответ

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

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

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

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



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