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

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

Закрытая тема
 
Zahanc

offline
Опыт: 22,977
Активность:
Hatsume_Hate:
тьфу, зачем в хэш его сохранять, XD
function GivePathing takes unit u, boolean A returns nothing
call SetUnitPathing(u, A)
endfunction
...
call GivePathing(unit, false)
...
Попробую.
кстати! Я решил проблему со станом - оказывается он просто дается с задержкой (а фильтр работает), ибо период таймера 0.04, даммик просто не успевает его наложить! Вопрос - что делать? Стан нужен обязательно.
Старый 30.04.2012, 12:32
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
скорость стана сделай максимум, создавай даммика прямо на цели, либо сделай таймер с 0.04 задержкой
Старый 30.04.2012, 12:38
Zahanc

offline
Опыт: 22,977
Активность:
Hatsume_Hate:
скорость стана сделай максимум
Это как? Всмысле скорость полета снаряда?
Я слышал что можна триггерно отдать юниту приказ-стан, только не пойму как:
851973 (stunned): Этот приказ отдается боевым единицам, подвергшимся оглушающим способностям, таким как ‘AOws’ (Громовая поступь), лишая их возможности двигаться и атаковать.
bladget добавил:
хех, а может просто в глобальную группу юнитов заносить, типа застаненные они или нет?
Старый 30.04.2012, 12:54
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
ну да, скорость полета, а так же такие параметры для даммика как как анимация точки обратного хода и анимация точки повреждения на 0.0001 , скорость поворота на 0.10 , скорость полета снаряда в абилке 9999999999
насчет приказа незнаю, не пробовал
Hatsume_Hate добавил:
можно впринципе и в группу, будут как "типа" застаненные)
Старый 30.04.2012, 12:58
Zahanc

offline
Опыт: 22,977
Активность:
ценно.
Что касается пафинга: я так понял что на самом деле он дается корректно в любом случае, но ИИ других юнитов все-равно полагает, что юнит не проходим, хотя последний вполне может проходить сквозь других.
Старый 30.04.2012, 13:00
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
ии он такой ии) если давать приказы идти туда то, то должны проигнорировать препятствия, вроде бы)
Старый 30.04.2012, 13:04
Zahanc

offline
Опыт: 22,977
Активность:
Хм, наверное, но если я двигаю юнита триггерно через SetUnitPosition то пафинг все-равно проверяется. А SetUnitX/Y во-первых, даеют юниту возможность застревать в ящиках/грибочках/камушках, а во-вторых все-равно прийдется делать условие на проходимость.
Старый 30.04.2012, 13:06
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
а если понаставить блокираторов воздушного пути, и проверять триггерно пафинг воздуха, двигая при этом SetUnitX/Y?
Hatsume_Hate добавил:
да и вообще, зачем так надо убрать проходимость у юнита?
Старый 30.04.2012, 13:10
Zahanc

offline
Опыт: 22,977
Активность:
Hatsume_Hate:
а если понаставить блокираторов воздушного пути, и проверять триггерно пафинг воздуха, двигая при этом SetUnitX/Y?
Не понимаю что это дает. Мне вот что нужно: я двигаю героя к точке, все враги вокруг него станятся и "падают", т. е. по ним можна пройти. (для этого я и удаляю у юнитов пафинг, пытаюсь т.е.) Впринципе можна попробовать удалить пафинг у героя, но тогда можна будет проходить сквозь дестрактеблы и некоторые другие декорации.
Старый 30.04.2012, 13:13
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
ну так убери пафинг у героя, сделай воздушные блокираторы, проверяй на воздушную проходимость. сквозь юнитов он будет пролетать, а через декор нет
Старый 30.04.2012, 13:21
Zahanc

offline
Опыт: 22,977
Активность:
Я решил отказаться от первоначальной идеи. Теперь герой не сбивает противников с ног, а расталкивает их в разные стороны от себя.
» Код
function Trig_Charge_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AAnp'
endfunction

function Charge_Stun_Check takes nothing returns boolean
    if GetUnitState(GetFilterUnit(), UNIT_STATE_LIFE) > 0.425 and IsUnitType(GetFilterUnit(), UNIT_TYPE_GROUND) == true and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) and not IsUnitIdType(GetUnitTypeId(GetTriggerUnit()), UNIT_TYPE_STUNNED) and not IsUnitType(GetFilterUnit(), UNIT_TYPE_STUNNED) and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') <= 0 then
        return true
    else
        return false
    endif
endfunction

function Charge_Move takes nothing returns nothing
        //Объявление локальных переменных.
    local timer t = GetExpiredTimer()
    local integer id = GetHandleId(t)
    local unit a = LoadUnitHandle(udg_hash, id, StringHash("ChargeCaster"))
    local real speed = 20.
            //Данные для движения.
    local real x
    local real y
    local real dist = LoadReal(udg_hash, id, StringHash("ChargeDistance"))
    local real tx
    local real ty
    local real angle
            //Остальное.
    local group g = CreateGroup()
    local unit f
    
    
        // Расталкивание юнитов, попавшихся на пути.
    call GroupEnumUnitsInRange(g,GetUnitX(a),GetUnitY(a),200.,function Charge_Stun_Check)
    call GroupRemoveUnit(g, a)
    loop
        set f = FirstOfGroup(g)
        exitwhen f == null
        set x = GetUnitX(a)
        set y = GetUnitY(a)
        set tx = GetUnitX(f)
        set ty = GetUnitY(f)
        set angle = Atan2(ty-y, tx-x)
        call SetUnitPosition(f, tx+15.*Cos(angle), ty+15.*Sin(angle))
        if IsUnitEnemy(f, GetOwningPlayer(a)) == true then
            call UnitDamageTargetBJ( a, f, 10.0+5.0*GetUnitAbilityLevel(a, GetSpellAbilityId()), ATTACK_TYPE_HERO, DAMAGE_TYPE_NORMAL )
        endif
        call GroupRemoveUnit(g, f)
    endloop
        
        //Непосредственно движение.
        set x = LoadReal(udg_hash, id, StringHash("ChargeCenterX"))
        set y = LoadReal(udg_hash, id, StringHash("ChargeCenterY"))
        set tx = GetUnitX(a)
        set ty = GetUnitY(a)
        set angle = Atan2(ty-y, tx-x)
    if dist > 0.0 and GetUnitState(a, UNIT_STATE_LIFE) > 0.425 and not IsTerrainPathable(tx-speed*Cos(angle), ty-speed*Sin(angle),PATHING_TYPE_WALKABILITY) then 
        call SetUnitPosition(a, tx-speed*Cos(angle), ty-speed*Sin(angle))
        call SaveReal(udg_hash, id, StringHash("ChargeDistance"), dist-speed)
    else
            //Если движение окончено, очищаем не нужные данные и приводим кастера в нормальное состояние.
        call PauseUnit(a, false)
        call SetUnitAnimation(a, "stand")
        call FlushChildHashtable(udg_hash, id)
        call DestroyTimer(t)
    endif 
    
    call DestroyGroup(g)
    set t = null
    set a = null
    set f = null
    set g = null
endfunction

function Trig_Charge_Actions takes nothing returns nothing
    local unit a = GetSpellAbilityUnit()
    local timer t = CreateTimer()
    local integer id = GetHandleId(t)
    local real x = GetLocationX(GetSpellTargetLoc())
    local real y = GetLocationY(GetSpellTargetLoc())
    local real dx = GetUnitX(a) - x
    local real dy = GetUnitY(a) - y
    local real dist = SquareRoot(dx * dx + dy * dy)
    if dist > 400.0+100.0*GetUnitAbilityLevel(a, GetSpellAbilityId()) then
        set dist = 400.0+200.0*GetUnitAbilityLevel(a, GetSpellAbilityId())
    endif
        //Занесение необходимых для движения данных в хэщ и запуск таймера.
    call SaveReal(udg_hash, id, StringHash("ChargeCenterX"), x)
    call SaveReal(udg_hash, id, StringHash("ChargeCenterY"), y)
    call SaveUnitHandle(udg_hash, id, StringHash("ChargeCaster"), a)
    call SaveReal(udg_hash, id, StringHash("ChargeDistance"), dist)
    
    call IssueImmediateOrder(a, "stop")
    call PauseUnit(a, true)
    call SetUnitAnimationByIndex(a, 3)
    call TimerStart(t, 0.03, true, function Charge_Move) 
    
    set a = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Charge takes nothing returns nothing
    set gg_trg_Charge = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Charge, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Charge, Condition( function Trig_Charge_Conditions ) )
    call TriggerAddAction( gg_trg_Charge, function Trig_Charge_Actions )
endfunction
Однако, не смотря на проверку проходимости, герой всё ещё застревает в стенах и деревьях! Правда, в зданиях не увязает и за границы карты не выпадает. WTH? Мне это нужно, чтобы двигать героя через координаты, а то SetPosition дерганый.
Старый 25.06.2012, 09:51
prog

offline
Опыт: 32,865
Активность:
Проверяешь через isTerrainPathable (или как ее там)? если да - учитывай что она игнорирует пути разрушаемых объектов как таковых.
Старый 25.06.2012, 11:31
Zahanc

offline
Опыт: 22,977
Активность:
Да, я так проверяю. Но ведь есть заклинания, которые сделаны с учетом дестрактеблов. Неужели они все сделаны через SetUnitPosition? Есть другие варианты проверять проходимость на земле?
Старый 25.06.2012, 14:00
prog

offline
Опыт: 32,865
Активность:
bladget, другие простые варианты мне не известны. Обычно я добавляю либо проверку на карту высот либо заменяю разрушаемые объекты декорациями либо и то и другое по мере необходимости.
Можно еще пикать деструктаблы в радиусе на каждом такте перемещения героя, но мне не нравится такое решение.
Старый 25.06.2012, 21:20
Hate
конь вакуумный
offline
Опыт: 43,117
Активность:
я сделал прозрачную декорацию с непроходимостью по земле и воздуху. Тоесть это как блокиратор, только он не в разрушаемых, а в декоре, и он учитывается пафингом
Старый 25.06.2012, 21:34
Zahanc

offline
Опыт: 22,977
Активность:
Хорошо, я понял. Спасибо всем, думаю на этом можно закрыть тему.
Старый 25.06.2012, 23:07
Закрытая тема

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

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

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

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



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