Добавлен , не публикуется
Хотел сделать питомец который можно выделять и нельзя контроль приказы отдавать, а черех AI тригеры выполняет скилы... Но проблема том что как это делать. Был раньше делал но не помню.
PS Яркий пример Gaias RPG волк у героя лук или помошник от нпц..
Спасибо...
Страж не подходит так как его не могут через триггер вызвать способность у питомца
0
19
7 лет назад
0
Похожие вопросы:

ответ
Сделай проверку на приказы. если допустим ты его заставляешь бежать куда то отменяешь приказ и делаешь ему другой приказ стоять или бежать) или что он там у тебя делает
ответ
UniverseRuler, в доте 6-6 использованы игроки 13 и 14
тебе нужно просто сохранять приказ отданный триггерно(ты ведь ими будешь юнитами управлять)
и восстанавливать его при получение приказа для игрока
для этого нужна буленовская переменная для определения триггерный это приказ или нет
и структура/хэш/юзердата для сохранения приказа
UniverseRuler:
еще остались асы картостроения, но а сейчас начинаю думать, что их все таки нету
если ас картостроения это человек который воплощает все ваши фантазии в жизнь то тут таких нету и не было
ещё можно создавать всех юнитов за 1 резервного игрока
а автоатаку делать триггерно
этот вариант самый лучший но то просто не сможешь его сделать
ибо нужны джасс+алгоритмы+структуры/хэш
а ты судя по всему ничего из этого не знаешь

0
32
7 лет назад
0
pro100master, могу предложить - код спектры из доты, там как запрет контроля, кривоват но работает.
Так же мемхаком можно отрубить полностью возможность даже подстапливать юнита.
0
23
7 лет назад
0
quq_CCCP, ну выложи... А насчет мемхак провал, но не ловит приказ для способность скрытого иконка
0
32
7 лет назад
0
pro100master, могу дать код из моей карты - там блинк страйк, пока юнит летит к цели и не ударит её им нельзя управлять, панель приказов не заблокирована. Но отдача приказов ничего не дает, либо код ульта спектры из доты - основа ода и та же с технической точки зрения.
Что вам ближе?
0
23
7 лет назад
0
quq_CCCP, Ну смотря если питомец вечно бегает вокруг с героями это уже сделал, если во время сражении то он помогает владельцу уже сделал.. Осталось лишь скрыть кнопки приказы и способность у юнита и возможно через триггер вызывать способность у юнита...
PS А так выложи я там разберусь jass мой конек но не нашел с фичи что я хотел уж.....
quq_CCCP, Хотя нашел карту что искал...
Делаем юнит как нетральный но являет юнит игрока то есть при выбора круга будет желтый но приказ работает внутри канала как smart вот и сработал и способность кастует норм не видя кнопок
И не сбивает приказы
//This calls will block standart command cart buttorns for player 0
    call SetPlayerAlliance(Player(0), Player(0), ALLIANCE_SHARED_ADVANCED_CONTROL, false)
    call SetPlayerAlliance(Player(0), Player(0), ALLIANCE_SHARED_CONTROL, false)

    //this calls will disable attack notifications

    call SetPlayerAlliance(Player(0), Player(0), ALLIANCE_HELP_REQUEST, true)
    call SetPlayerAlliance(Player(0), Player(0), ALLIANCE_HELP_RESPONSE, true)
Вот это норм но надо определенных юнитов убрать контролль
0
32
7 лет назад
0
function SetUnitWardFlag takes unit u, boolean flag  returns boolean
    local integer pUnit = ConvertHandle( u ) / 4
    local integer flags = Memory[pUnit + 146]
        
    if flag then
        if not IsFlagBitSet( flags, 512 ) then
            set Memory[pUnit + 146] = flags + 512
        endif
        return IsFlagBitSet( flags, 512 )
    endif
    
    if IsFlagBitSet( flags, 512 ) then
        set Memory[pUnit + 146] = flags - 512
    endif
    return not IsFlagBitSet( flags, 512 ) 
endfunction

function Trig_Blink_Strike_Order_Conditions takes nothing returns boolean
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    return st.IsCheck
endfunction

function Trig_Blink_Strike_Order_Actions takes nothing returns nothing
    local TriggerData st = GetDataBX( GetTriggeringTrigger())
    local eventid id = GetTriggerEventId()
    
    if id ==  EVENT_WIDGET_DEATH or ( id == EVENT_GAME_TIMER_EXPIRED and GetUnitAbilityLevel( st.attacker, 'BEwk' ) < 1 ) or IsUnitType( st.attacker, UNIT_TYPE_POLYMORPHED ) then
        call DisableTrigger(st.trg)
        call SetUnitPathing( st.attacker, true )
        call SetUnitWardFlag( st.attacker, false )
        call MuteUnitAbility( st.attacker, 'Amov', false )
        call DisableUnitAbilityById( st.attacker, 'AInv', false )
        
        if not IsUnitDead( st.attacker ) then
            call UnitRemoveAbility( st.attacker, 'BEwk' )
        endif
        
        call RemoveDataBX( st.trg )
        call st.RemoveTrigger( )
        call st.destroy( )
        
    elseif id == EVENT_UNIT_ISSUED_TARGET_ORDER or id == EVENT_UNIT_ISSUED_POINT_ORDER then
        set st.IsCheck = false
        call UnitShareVision( st.attacked, st.pl, true )
        call IssueTargetOrderById( st.attacker, 851983,st.attacked )
        call UnitShareVision( st.attacked, st.pl, false )
        set st.IsCheck = true
    endif
    
    set id = null
endfunction

function Timer_Blink_Strike_Expires takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local DamageData dd = GetDataBX( t )
    local real BX = 0
    local real BY = 0
    local real ang = 0.00
    local TriggerData st
    
    if IsUnitDead( dd.attacked ) then // проверка не сдох ли юнит, чтобы не улететь в центр карты.
        set BX = GetUnitX( dd.attacker )
        set BY = GetUnitY( dd.attacker )
    else
        set BX = GetUnitX( dd.attacked )
        set BY = GetUnitY( dd.attacked )
        set dd.IsCheck = true
    endif
    
    set bj_forLoopAIndex = 0
    
    loop
        exitwhen bj_forLoopAIndex > 20
        
        set ang = GetRandomReal( 0.00, 360.00 )
        set BX = BX + 64.00 * Cos( ang * bj_DEGTORAD )
        set BY = BY + 64.00 * Sin( ang * bj_DEGTORAD )
        
        exitwhen IsTerrainWalkable( BX, BY )
        
        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop
    
    if not IsUnitDead( dd.attacker ) then
    
        if bj_forLoopAIndex < 20 then // допустимые координаты так и не найдены вокруг цели?
            call SetUnitX( dd.attacker, CheckX( BX ) )
            call SetUnitY( dd.attacker, CheckY( BY ) )
        else
            call SetUnitPosition( dd.attacker, dd.rx, dd.ry )
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        // дебаг
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, DEBUG + " " + GetAbilityEffectById( dd.time, EFFECT_TYPE_EFFECT, 0 ) )
            call DisplayTimedTextToPlayer( dd.pl, 0.00, 0.00, 10.00, INFO )
        endif
    
        call ShowUnit( dd.attacker, true )
        call SetUnitInvulnerable( dd.attacker, false )
    
        call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl", BX, BY ) ) // анимация блинка
    
        if GetLocalPlayer( ) == dd.pl then
            call ClearSelection( )
            call SelectUnit( dd.attacker, true )
        endif
    
        if IsUnitEnemy( dd.attacked, dd.pl ) and dd.IsCheck then
            call UnitRemoveAbility( dd.attacker, 'Bweb' )
            call UnitRemoveAbility( dd.attacker, 'Beng' )
            call UnitRemoveAbility( dd.attacker, 'Bens' )
            call UnitRemoveAbility( dd.attacker, 'BEer' )
        
            set st = TriggerData.create()
            set st.trg = CreateTrigger()
            set st.trc = TriggerAddCondition( st.trg, Condition(function Trig_Blink_Strike_Order_Conditions ) )
            set st.tra = TriggerAddAction( st.trg, function Trig_Blink_Strike_Order_Actions )
            set st.attacker = dd.attacker 
            set st.attacked = dd.attacked
            set st.pl = dd.pl
            set st.IsCheck = true
        
            call SetDataBX( st.trg, st )
            
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_TARGET_ORDER )
            call TriggerRegisterUnitEvent( st.trg, st.attacker, EVENT_UNIT_ISSUED_POINT_ORDER )
            call TriggerRegisterDeathEvent( st.trg, st.attacker )
            call TriggerRegisterDeathEvent( st.trg, st.attacked )
            call TriggerRegisterTimerEvent( st.trg, 0.15, true )
        
            set bj_lastCreatedUnit = CreateUnit( dd.pl, 'hvis', GetUnitX( dd.attacked ), GetUnitY( dd.attacked ), GetUnitFacing( dd.attacked ) )
            call SetUnitPathing( bj_lastCreatedUnit, false )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( dd.attacked ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( dd.attacked ) )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
            call UnitAddAbility( bj_lastCreatedUnit, 'A06S' )
            
            call UnitShareVision( dd.attacked, dd.pl, true )
            if IssueTargetOrderById( bj_lastCreatedUnit, 852252, dd.attacked ) then
                call SetUnitPathing( st.attacker, false )
                call PauseUnit( dd.attacker, true )
                call IssueTargetOrderById( dd.attacker, 851983, dd.attacked ) // attack
                call PauseUnit( dd.attacker, false )
            endif
            call UnitShareVision( dd.attacked, dd.pl, false )
            
            call SetUnitWardFlag( st.attacker, true )
            call MuteUnitAbility( st.attacker, 'Amov', true )
            call DisableUnitAbilityById( st.attacker, 'AInv', true )
        else
            call UnitRemoveAbility( dd.attacker, 'BEwk' )
        endif
    endif
    
    call RemoveDataBX( t )
    call DestroyTimer( t )
    call dd.clear( )
    call dd.destroy( )
    
    set t = null
endfunction

//===========================================================================
function startTrig_Blink_Strike takes nothing returns nothing
    local timer t = CreateTimer( )
    local DamageData dd = DamageData.create( )

    set dd.attacker = GetSpellAbilityUnit( )
    set dd.time = GetSpellAbilityId( )
    set dd.id = GetUnitAbilityLevel( dd.attacker, dd.time )
    set dd.attacked = GetSpellTargetUnit( )
    set dd.pl = GetOwningPlayer( dd.attacker )
    set dd.rx = GetUnitX( dd.attacker )
    set dd.ry = GetUnitY( dd.attacker )
    set dd.IsCheck = false

    set bj_lastCreatedItem = CreateItem( 'Iwk0' + dd.id, dd.rx, dd.ry )
    call UnitAddItem( dd.attacker, bj_lastCreatedItem )
    call RemoveItem( bj_lastCreatedItem )
    set bj_lastCreatedItem = null
    
    
    if IsPlayerEnemy( GetLocalPlayer( ), dd.pl ) then
        call SelectUnit( dd.attacker , false )
    endif
    
    call ShowUnit( dd.attacker, false )
    call SetUnitInvulnerable( dd.attacker, true )
    
    call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\Invisibility\\InvisibilityTarget.mdl", dd.rx, dd.ry ) )

    call SetDataBX( t, dd )
    
    call TimerStart( t, 0.12, false, function Timer_Blink_Strike_Expires )
    
    set t = null
endfunction
Вот код из моей карты...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.