Ребята, как отследить неуязвимого юнита? А то такого условия не нашел, а баги вызывает.

Принятый ответ

Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
0
21
7 лет назад
0
Если условия нет, то имхо проще всех делать неуязвимыми через давание Avul и просто проверять наличие абилки.
Только лучше еще call UnitMakeAbilityPermanent использовать, а то морфы всякие удалят Avul.
1
32
7 лет назад
1
Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
Принятый ответ
0
8
7 лет назад
0
quq_CCCP:
Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
А как сделать проверку, что дамми не сможет нанести урон?
0
32
7 лет назад
0
Danil30:
quq_CCCP:
Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
А как сделать проверку, что дамми не сможет нанести урон?
Ну как как, элементарно.
Нанести урон и посмотреть осталось ли у уюнита столько же здоровья и маны или нет? Если нет то уюнит уязвим, иначе неуязвим.
Чтобы не прибить юнита уроном, добавляем ему хп, а даммика заносим в глобальную переменную и во всех триггерах реагирующих на урон делаем проверку что источник урона не является этим самым даммиком, чтобы исключить срабатывания триггеров на эти проверки.
0
8
7 лет назад
0
quq_CCCP:
Danil30:
quq_CCCP:
Проверкой на неуязвимость есть 2 версии проверки, одна требует мемхак а друга нет.
Там проверка на то что дамми юнит сможет нанести урон юниту или нет, если не сможет - юнит неуязвим.
А как сделать проверку, что дамми не сможет нанести урон?
Ну как как, элементарно.
Нанести урон и посмотреть осталось ли у уюнита столько же здоровья и маны или нет? Если нет то уюнит уязвим, иначе неуязвим.
Чтобы не прибить юнита уроном, добавляем ему хп, а даммика заносим в глобальную переменную и во всех триггерах реагирующих на урон делаем проверку что источник урона не является этим самым даммиком, чтобы исключить срабатывания триггеров на эти проверки.
Все, уже сделал, спасибо!
0
32
7 лет назад
Отредактирован quq_CCCP
0
Danil30, вот держи типа правильный образец проверки:
library IsUnitInvulnerableCheck initializer Init

globals
    unit DummyAttacker
    trigger gg_trg_Damage_Blocker
    group gg_grp_CheckedGroup
    hashtable GameData = InitHashtable( )
    boolean IsInvul = false
endglobals

function Trig_Damage_Blocker_Conditions takes nothing returns boolean
    return GetEventDamage() > 0.00 and GetEventDamageSource( ) == DummyAttacker
endfunction

function Timer_Heal_Unit_Expires takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer id = GetHandleId(t)
    local unit Damaged = LoadUnitHandle( GameData, id, 0 )
    
    call UnitRemoveAbility( Damaged, 'AMHP' )
    call SetUnitState( Damaged, UNIT_STATE_LIFE, LoadReal( GameData, id, 1 ) )
    call SetUnitState( Damaged, UNIT_STATE_MANA, LoadReal( GameData, id, 2 ) )
   
    call DestroyTimer(t)
    call FlushChildHashtable( GameData, id )
    
    set Damaged = null
    set t = null
endfunction 

function Trig_Damage_Blocker_Actions takes nothing returns nothing
    local unit Damaged = GetTriggerUnit( )
    local timer t = CreateTimer()
    local integer id = GetHandleId( t )

    call SaveUnitHandle( GameData, id, 0, Damaged )
    call SaveReal( GameData, id, 1, GetUnitState( Damaged, UNIT_STATE_LIFE ) )
    call SaveReal( GameData, id, 2, GetUnitState( Damaged, UNIT_STATE_MANA ) )
    
    call TimerStart( t, 0.00, false, function Timer_Heal_Unit_Expires )
    
    call UnitAddAbility( Damaged, 'AMHP' )
    call SetUnitState( Damaged, UNIT_STATE_LIFE, GetUnitState( Damaged, UNIT_STATE_MAX_LIFE ) )
    
    set IsInvul = true
    
    set Damaged = null
    set t = null
endfunction


function IsUnitInvul takes unit enemy returns boolean
    local real hp = GetUnitState( enemy, UNIT_STATE_LIFE )
    local real mp = GetUnitState( enemy, UNIT_STATE_MANA )
    
	set IsInvul = false

    if hp < 0.405 or GetUnitTypeId(enemy) < 1 then
        return true
    elseif GetUnitAbilityLevel( enemy, 'Avul' ) > 0 then
        return true
    endif
        
    if not IsUnitInGroup( enemy, gg_grp_CheckedGroup ) then
        call TriggerRegisterUnitEvent( gg_trg_Damage_Blocker, enemy, EVENT_UNIT_DAMAGED )
        call GroupAddUnit( gg_grp_CheckedGroup, enemy )
    endif

    call EnableTrigger( gg_trg_Damage_Blocker )
    call UnitDamageTarget( DummyAttacker, enemy, 100.00, false, false, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_UNKNOWN, WEAPON_TYPE_WHOKNOWS )
    call DisableTrigger( gg_trg_Damage_Blocker )
    
    return IsInvul
endfunction 

private function Init takes nothing returns nothing
    set DummyAttacker = CreateUnit( Player(12), 'hpea', 0.00,0.00, 270.00 )
    
    call SetUnitPathing( DummyAttacker, true )
    call PauseUnit( DummyAttacker, true )
    call SetUnitInvulnerable( DummyAttacker, true )
    call ShowUnit( DummyAttacker, false )
    
    
    set gg_grp_CheckedGroup = CreateGroup( )
    set gg_trg_Damage_Blocker = CreateTrigger( )

    call TriggerAddCondition( gg_trg_Damage_Blocker, Condition( function Trig_Damage_Blocker_Conditions ) )
    call TriggerAddAction( gg_trg_Damage_Blocker, function Trig_Damage_Blocker_Actions )
    call DisableTrigger( gg_trg_Damage_Blocker )
endfunction

endlibrary
Со всеми защитами, чтобы не прибить юнита...
Таким же способом можно проверять магические резисты и прочее.
0
26
7 лет назад
0
А ещё есть проверка через выдачу абилки (нет, не выдача инвула).
0
20
7 лет назад
Отредактирован DemonoiD
0
А ещё можно забирать у моба неуязвимость, когда она не нужна и выдавать назад, когда хочется, чтобы ничего не проверять.
0
20
7 лет назад
0
а еще можно записывать юнитов, которым дается неуяз в группу, а также записывать туда всех с абилкой неуяза и москитов
0
32
7 лет назад
0
DemonoiD:
А ещё можно забирать у моба неуязвимость, когда она не нужна и выдавать назад, когда хочется, чтобы ничего не проверять.
Слишком тупо, да и как ты отличишь магазины от остальных зданий? Будешь базу данных писать?
Extremator:
А ещё есть проверка через выдачу абилки (нет, не выдача инвула).
Есть специфические неуязвимости, которые не юзают абилку 'Avul', чаще всего это неуязы от дефольных способностей, вроде иллюзии мастера клинка, ульта панды пивовара и так далее - там нету никаких абилок инвула, но юнит не получает урона и все!
0
20
7 лет назад
0
quq_CCCP, по количеству здоровья. По типу юнита. Таких условий возможны сотни. Или ты не знал, что можно сортировать предметы по ПРОЧНОСТИ?
0
27
7 лет назад
Отредактирован MpW
0
что-то находил функцию, только не знаю будет ли работать. Но если это не рааботет, наверное лучше мемкак
0
32
7 лет назад
0
DemonoiD:
quq_CCCP, по количеству здоровья. По типу юнита. Таких условий возможны сотни. Или ты не знал, что можно сортировать предметы по ПРОЧНОСТИ?
Можно но но в данном случаи ненужно, темболее есть "особые" виды неуязвимостей.
0
26
7 лет назад
0
Есть специфические неуязвимости, которые не юзают абилку 'Avul', чаще всего это неуязы от дефольных способностей, вроде иллюзии мастера клинка, ульта панды пивовара и так далее - там нету никаких абилок инвула, но юнит не получает урона и все!
и такой инвул можно чекнуть
любой в общем
Чтобы оставить комментарий, пожалуйста, войдите на сайт.