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

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

Закрытая тема
 
SRes
1110101000
offline
Опыт: 9,997
Активность:
Заклинание Defend, аналог на Jass
Вообщем, из названия темы ясно, что я делаю. У меня пока-что пара вопросов,
  • Как удалить Event из триггера ? Начинаются сильные лаги, после атаки этого много раз. (Вариант с кастом валуе я,впринципе, знаю, но хотел бы узнать более безгеморойный способ)
    Код:
    call TriggerRegisterUnitEvent( gg_trg_Defend_Jass, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
  • С какого перепугу этот кусочек кода возращает UNIT_STATE_MAX_LIFE, т.е. 420 ?
    Код:
    GetUnitState(defender,UNIT_STATE_LIFE)
» Весь код

Код:
function Trig_Defend_Jass_Actions takes nothing returns nothing
local unit attacker
local unit defender 
local real dmg
local real angle
local real face
local real tmp
local real life
if GetUnitAbilityLevel(GetTriggerUnit(),'DefA') > 0 then
    call ClearTextMessages()
    set attacker = GetEventDamageSource()
    set defender = GetTriggerUnit()
    set dmg = GetEventDamage()
    set angle = AngleBetween(GetUnitX(defender),GetUnitY(defender),GetUnitX(attacker),GetUnitY(a  ttacker))
    set face = GetUnitFacing(defender)
    if angle >= 0 then
        set tmp = angle-face
    else
        set tmp = 360+angle-face
    endif
    call DebugMsg("angle  : "+R2S(angle))
    call DebugMsg("face : "+R2S(face))
    call DebugMsg("tmp : "+R2S(tmp))

        if tmp<45 and tmp>-45 then
            
            set life = GetUnitState(defender,UNIT_STATE_LIFE)
            call DebugMsg(R2S(life))
            if (life+dmg) > GetUnitState(defender,UNIT_STATE_MAX_LIFE) then
                call SetUnitState( defender, UNIT_STATE_LIFE, GetUnitState(defender,UNIT_STATE_MAX_LIFE))
            else
                call SetUnitState( defender, UNIT_STATE_LIFE, GetUnitState(defender,UNIT_STATE_LIFE)+dmg)
            endif
            
            call DebugMsg(R2S(dmg))
        
        endif
endif
set attacker = null
set defender = null
endfunction

//===========================================================================
function InitTrig_Defend_Jass takes nothing returns nothing
    set gg_trg_Defend_Jass = CreateTrigger(  )
    call TriggerAddAction( gg_trg_Defend_Jass, function Trig_Defend_Jass_Actions )
endfunction


P.S. Проверку - больше ли хп+дмг чем макс хп я добавил для проверки, она не помогла.
Старый 24.03.2009, 19:59
PlayerDark
Coraline
offline
Опыт: 10,569
Активность:
1 эта функция возвращает тип event. Его можно запоминать а потом удалять.
2 это возможно только если кол-во жизней у юнита в данный момент максимальное.
Старый 24.03.2009, 20:23
SRes
1110101000
offline
Опыт: 9,997
Активность:
1)Насчет евент спасибо, щас попробую.
2)Нет, оно возвращает именно 420... Когда "дефенс", т.е. в нужном angle возвращается 420. И ставятся жизни на 420-дмг, а не на current_hp + dmg ! =\
Старый 24.03.2009, 21:06
ZLOBICH
Kicked by XimikS
offline
Опыт: 4,727
Активность:
SRes
у тебя в коде же нет евента, как следствие, не существует defender'а. т.е. ты используешь GetUnitState(null, UNIT_STATE_HP)
Старый 25.03.2009, 04:34
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
PlayerDark, дезинформация, нет такой функции, чтобы удалять объекты типа event.

ZLOBICH, читай код лучше, перед этим он задает set defender = GetTriggerUnit(), а регистрация событий на этот триггер происходит в другой функции.

SRes, используй группу:
Код:
globals
  group dmggroup = CreateGroup()
endglobals

// . . .
function AddOnAttack takes nothing returns nothing
  if not IsUnitInGroup(GetTriggerUnit(), dmggroup) then
    call GroupAddUnit(dmggroup, GetTriggerUnit())
    call TriggerRegisterUnitEvent(gg_trg_Defend_Jass, GetTriggerUnit(), EVENT_UNIT_DAMAGED)
  endif
endfunction
// . . .
Старый 25.03.2009, 06:50
SRes
1110101000
offline
Опыт: 9,997
Активность:
Хорошая идея насчет группы, щас попробуем. =)
Я вчера и не тестил вариант PlayerDark, и усердно пытался найти функцию удаления евентов еще до этого...

Added :
Thx, Получилось и второй баг сразу пропал.
» Как я сделал?

Код:
globals
    group DamageEventGroup = CreateGroup()
endglobals

function Trig_DefendUnitAdd_Actions takes nothing returns nothing
    if IsUnitInGroup(GetTriggerUnit(),DamageEventGroup) == false and GetUnitAbilityLevel(GetTriggerUnit(),'DefA') > 0 then
        call TriggerRegisterUnitEvent( gg_trg_Defend_Jass, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
        call GroupAddUnit(DamageEventGroup,GetTriggerUnit())
    endif
endfunction

//===========================================================================
function InitTrig_DefendUnitAdd takes nothing returns nothing
    set gg_trg_DefendUnitAdd = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_DefendUnitAdd, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddAction( gg_trg_DefendUnitAdd, function Trig_DefendUnitAdd_Actions )
endfunction


Хотя, как вариант делать евент при отслеживании включения Defend, тогда и еще одного глюка (1 удар пропускается) избавлюсь, щас так лучше сделаю.

Отредактировано SRes, 25.03.2009 в 12:52.
Старый 25.03.2009, 12:35
Закрытая тема

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

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

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

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



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