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

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

Закрытая тема
 
SRes
1110101000
offline
Опыт: 9,997
Активность:
Проверка на неуязвимость
Есть ли функция которая проверяет юнита - неуязвим ли он ? Я ее не нашол.
P.S. Я то и сам ее уже написал, но все таки "родная" варовская,думаю, лучше.
P.S.2 Поиск юзал, вроде, нечего нету
Старый 08.01.2009, 13:10
NETRAT

offline
Опыт: 83,712
Активность:
JassCraft предлагает такие проверки
Код:
function IsUnitImmuneToPhisical takes unit u returns boolean
    return (GetDamageFactor(u,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_DEMOLITION)==0)
endfunction

Код:
function IsUnitInvulnerable takes unit u returns boolean
    return (GetDamageFactor(u,ATTACK_TYPE_CHAOS,DAMAGE_TYPE_UNIVERSAL)==0)
endfunction

Код:
function IsUnitSpellImmune takes unit u returns boolean
    return IsUnitType(u,UNIT_TYPE_MAGIC_IMMUNE)
endfunction
Старый 08.01.2009, 13:27
agentex

offline
Опыт: 34,834
Активность:
Цитата:
GetDamageFactor

эт что за неизвестный науке зверь?
Старый 08.01.2009, 13:33
SRes
1110101000
offline
Опыт: 9,997
Активность:
Спасиб. Это конечно лучше чем мой примитивный код .
P.S. Еще не пробовал предложенные мне функции...
» Мой код
Код:
function IsUnitInvulnerable takes unit u returns boolean
    local real hp_d
    local real hp_p
    set hp_d = GetUnitState(u, UNIT_STATE_LIFE)
    call UnitDamageTarget(u,u,1,true,false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_UNIVERSAL,WEAPON_TYPE_WHOKNOWS )
    set hp_p = GetUnitState(u, UNIT_STATE_LIFE)
    if hp_d == hp_p  then
        return true
    else
        call SetUnitState(u, UNIT_STATE_LIFE,GetUnitState(u, UNIT_STATE_LIFE) + 1)
        return false
    endif
    set hp_d = 0.00
    set hp_p = 0.00
endfunction
Старый 08.01.2009, 13:38
adic3x

offline
Опыт: 108,439
Активность:
Код:
function GetDamageFactor takes unit u,attacktype a, damagetype d returns real
 local real hp=GetWidgetLife(u)
 local real r
 local unit caster=GetACaster()

 call UnitRemoveAbility(caster,'Aloc') //Otherwise the units would flee like crazy
 call CS_MoveUnit(caster,GetUnitX(u),GetUnitY(u))
 call SetUnitOwner(caster,GetOwningPlayer(u),false)
 set r=hp
 if (hp<1) then
  call SetWidgetLife(u,1)
  set r=1
 endif
 call UnitDamageTarget(caster,u,0.01,true,false,a,d,null)
 call RecicleCaster(caster)
 set r= (r-GetWidgetLife(u))*100
 call SetWidgetLife(u,hp)
 set caster=null
 return r
endfunction


SRes, real обнулять ненадо!
Старый 08.01.2009, 13:44
SRes
1110101000
offline
Опыт: 9,997
Активность:
ADOLF, Выходит что моя функция - не хуже ?
Старый 08.01.2009, 13:49
agentex

offline
Опыт: 34,834
Активность:
SRes
Цитата:
DAMAGE_TYPE_UNIVERSAL

нужно не юниверсал а анноун, DAMAGE_TYPE_UNKNOWN а то может и не нанестись дамаг

agentex добавил:
а не, чето я не в теме. UNIVERSAL наооборот кажись по неуязвимым долбает (инфа от свдн)
Старый 08.01.2009, 14:05
SRes
1110101000
offline
Опыт: 9,997
Активность:
agentex, Я проверял... не долбанет =)
Старый 08.01.2009, 14:15
alexkill

offline
Опыт: 18,872
Активность:
не забывайте о том, что здесь некоторые функции из caster system vexorian'a. (CS_MoveUnit, GetDamageFactor)
Старый 08.01.2009, 14:44
alexkill

offline
Опыт: 18,872
Активность:
SRes, думаю, так лучше будет.

Код:
function IsUnitInvulnerable takes unit d returns boolean // d - юнит, проверяемый на неуязвимость
   local unit u = CreateUnit(Player(15), 'nubw', GetUnitX(d), GetUnitY(d), 0)
   local boolean result = false
   call UnitAddAbility(u, 'Aloc')
   set result = IssueTargetOrder(u, "unholyfrenzy", d)
   call RemoveUnit(u)
   set u  = null
   return not result
endfunction
Старый 10.01.2009, 13:13
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Могу посоветовать функцию DioD'a (взято с http://wc3campaigns.net/showthread.php?t=103955):
Код:
function IsUnitInvulnerable takes unit Unit returns boolean
    
    local real    Health_Current = GetWidgetLife(Unit)
    local real    Mana_Current   = GetUnitState(Unit,UNIT_STATE_MANA)
    local boolean Check_Health
    
    call SetWidgetLife(Unit,Health_Current + 0.001)    
    if Health_Current != GetWidgetLife(Unit) then
        call UnitDamageTarget(Unit,Unit,0.001,false,true,null,null,null)
        set Check_Health = (GetWidgetLife(Unit) == Health_Current + 0.001)
    else
        call UnitDamageTarget(Unit,Unit,0.001,false,true,null,null,null)
        set Check_Health = (GetWidgetLife(Unit) == Health_Current)
        call SetWidgetLife(Unit,Health_Current)
    endif
    
    if Check_Health then
        return not (GetUnitState(Unit,UNIT_STATE_MANA) != Mana_Current)
    endif
    return Check_Health
    
endfunction


Она работает для всех видов неуязвимости (а не только при SetUnitInvulnerable).
Хмм, думаю, стоит добавить ее в библиотеку функций. (угу, в категорию "Наследие DioD'а") © NT

Отредактировано NETRAT, 10.01.2009 в 17:11.
Старый 10.01.2009, 16:57
SRes
1110101000
offline
Опыт: 9,997
Активность:
Не пойму - почему моя функция не подходит...
Старый 10.01.2009, 18:10
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
SRes, есть такой примечательный спелл, как "Магический щит", который поглощает полученный урон за счет маны. При активированном магическом щите у юнита твоя функция выдаст true, что не есть true.

Плюс, вполне возможно, что с модификацией способности "Каменные доспехи" функция тоже будет выдавать некорректный ответ. К сожалению, не имею сейчас времени проверить это.
Старый 10.01.2009, 18:39
SRes
1110101000
offline
Опыт: 9,997
Активность:
Хм... Не уверен что это так существенно, т.е. функцию всегда можно переписать.
Старый 10.01.2009, 19:13
Закрытая тема

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

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

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

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



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