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

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

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

offline
Опыт: 49,995
Активность:
Полностью удаление триггера
Я так понимаю что событие вообще удалить никак (( есть вообще способ как обойтись с событием юнит получил урон? я хотел бы чтоб на юнита один раз повесить событие и все, и работало на всю оставшуюся игру. Мне надо минимальное количество утечек чтоб было
Старый 31.12.2011, 22:10
MyRtZ

offline
Опыт: 6,530
Активность:
Steal_nerves:
Я так понимаю что событие вообще удалить никак (( есть вообще способ как обойтись с событием юнит получил урон? я хотел бы чтоб на юнита один раз повесить событие и все, и работало на всю оставшуюся игру. Мне надо минимальное количество утечек чтоб было
Событие не так существенно влияет на память как Вы считаете.
Старый 31.12.2011, 22:19
Doc

offline
Опыт: 63,163
Активность:
Ну как бы один триггер создаешь, событие вешаешь, профит, что еще надо?
Зачем уничтожение вообще?
Старый 31.12.2011, 22:20
MpW

offline
Опыт: 49,995
Активность:
~MyRtZ, ~Doc, я просто люблю этим заниматься ))
~Doc, профит?

похоже сам придумаю алгоритм
у меня как бы так

Код:
function Trig_Impetus_Conditions takes nothing returns boolean
    return GetLearnedSkill() == 'A07P'
endfunction

function VC2 takes real x1,real y1,real x2,real y2 returns real
    return SquareRoot(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)))
endfunction

function JRI takes string JSI,real GRI,unit JTI,real JPI,integer r,integer g,integer b,integer a returns nothing
    local texttag tt=CreateTextTag()
    call SetTextTagText(tt,JSI,JPI)
    call SetTextTagPosUnit(tt,JTI,64)
    call SetTextTagColor(tt,r,g,b,a)
    call SetTextTagVelocity(tt,0,0.0355)
    call SetTextTagFadepoint(tt,2)
    call SetTextTagPermanent(tt,false)
    call SetTextTagLifespan(tt,GRI)
    if IsUnitVisible(JTI,GetLocalPlayer())then
        call SetTextTagVisibility(tt,true)
    else
        call SetTextTagVisibility(tt,false)
    endif
    set tt=null
endfunction

function VE2 takes nothing returns boolean
    local real d
    local real VF2
    if GetUnitAbilityLevel(GetTriggerUnit(),'B01B')>0 and LoadUnitHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),2)==GetEventDamageSo  urce()then
        call UnitRemoveAbility(GetTriggerUnit(),'B01B')
        set VF2=RMinBJ(VC2(GetUnitX(GetTriggerUnit()),GetUnitY(GetTriggerUnit()),GetUnitX(Ge  tEventDamageSource()),GetUnitY(GetEventDamageSource())),2500)
        set d=(0.10+0.05*I2R(GetUnitAbilityLevel(GetEventDamageSource(),'A07P')))*VF2
        call JRI("+"+I2S(R2I(d)),1,GetTriggerUnit(),0.023,3,216,216,216)
        call UnitDamageTarget(GetEventDamageSource(),GetTriggerUnit(),d,true,true,ATTACK_TYPE  _HERO,DAMAGE_TYPE_MAGIC,WEAPON_TYPE_WHOKNOWS)
        call TriggerRemoveCondition(GetTriggeringTrigger(),LoadTriggerConditionHandle(udg_Has  h,GetHandleId(GetTriggeringTrigger()),3))
        call FlushChildHashtable(udg_Hash,GetHandleId(GetTriggeringTrigger()))
        call DisableTrigger(GetTriggeringTrigger())
        call DestroyTrigger(GetTriggeringTrigger())
   endif
   return false
endfunction

function VG2 takes nothing returns nothing
    local unit XWI
    local unit XVI
    local triggercondition TC
    if GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT then
        set XWI=GetSpellTargetUnit()
        set XVI=GetTriggerUnit()
    elseif GetTriggerEventId()==EVENT_PLAYER_UNIT_ATTACKED then
        set XWI=GetTriggerUnit()
        set XVI=GetAttacker()
    endif
    if IsUnitIllusion(XVI)==false then
        set udg_trigger = CreateTrigger( )
        call GroupAddUnit(LoadGroupHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),2), XWI)
        call TriggerRegisterUnitEvent(udg_trigger,XWI,EVENT_UNIT_DAMAGED)
        set TC = TriggerAddCondition(udg_trigger,Condition(function VE2))
        call SaveUnitHandle(udg_Hash,GetHandleId(udg_trigger),2,XVI)
        call SaveTriggerConditionHandle(udg_Hash,GetHandleId(udg_trigger),3,TC)  
    endif
    set TC = null
    set XWI=null
    set XVI=null
endfunction

function VH2 takes nothing returns boolean
    if GetTriggerEventId()==EVENT_PLAYER_UNIT_ATTACKED and GetAttacker() == LoadUnitHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),1) then
        if GetUnitAbilityLevel(GetAttacker(), 'A07P') > 0 and LoadBoolean(udg_Hash,GetHandleId(GetTriggeringTrigger()),2) == true and IsUnitType(GetTriggerUnit(),UNIT_TYPE_STRUCTURE)==false and GetAttacker()== LoadUnitHandle(udg_Hash,GetHandleId(GetTriggeringTrigger()),1)then
            call VG2()
        endif
    elseif GetTriggerEventId()==EVENT_UNIT_ISSUED_ORDER then
        if(GetIssuedOrderId()==OrderId("poisonarrows"))then
            call RemoveSavedBoolean(udg_Hash,GetHandleId(GetTriggeringTrigger()),2)
            call SaveBoolean(udg_Hash,GetHandleId(GetTriggeringTrigger()),2,true)
        elseif(GetIssuedOrderId()==OrderId("unpoisonarrows"))then
            call RemoveSavedBoolean(udg_Hash,GetHandleId(GetTriggeringTrigger()),2)
            call SaveBoolean(udg_Hash, GetHandleId(GetTriggeringTrigger()),2,false)
        endif
    elseif GetTriggerEventId()==EVENT_UNIT_SPELL_EFFECT and GetSpellAbilityId()=='A07P' then
        call VG2()
    endif
    return false
endfunction

function Trig_Impetus_Actions takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ATTACKED) 
    call TriggerRegisterUnitEvent(t,GetLearningUnit(),EVENT_UNIT_SPELL_EFFECT)
    call TriggerRegisterUnitEvent(t,GetLearningUnit(),EVENT_UNIT_ISSUED_ORDER)
    call TriggerAddCondition( t, Condition( function VH2 ) )
    call SaveUnitHandle(udg_Hash,GetHandleId(t),1,GetLearningUnit())
    call DisableTrigger(GetTriggeringTrigger())
    call DestroyTrigger(GetTriggeringTrigger())
    set t = null
endfunction

//===========================================================================
function InitTrig_Impetus takes nothing returns nothing
    set gg_trg_Impetus = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Impetus, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( gg_trg_Impetus, Condition( function Trig_Impetus_Conditions ) )
    call TriggerAddAction( gg_trg_Impetus, function Trig_Impetus_Actions )
endfunction

Отредактировано Steal nerves, 31.12.2011 в 23:54.
Старый 31.12.2011, 22:31
Doc

offline
Опыт: 63,163
Активность:
Локальные триггеры зло, ну зачем, скажи мне, ЗАЧЕМ? Если можно использовать один триггер.
Старый 31.12.2011, 22:35
MpW

offline
Опыт: 49,995
Активность:
Doc, в смысле зло? мне ссылка на триггер нужна, и как можно один использовать?

Steal nerves добавил:
я просто думал что если удалить триггер то удалишь вместе с событием триггер
Старый 31.12.2011, 22:46
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Триггеры полностью не удаляются, и это нетривиальное действие, надо ещё удалять условия и действия предварительно.
Кстати, вот мне тоже всегда было интересно, чем так плохи локальные триггеры, Doc?
Старый 31.12.2011, 23:00
Doc

offline
Опыт: 63,163
Активность:
FellGuard, ну вот тем и плохи, что не удаляются полностью + с ними геморрой, когда можно использовать один расовый триггер.
Steal nerves, да омфг создаешь глобальный триггер и в него добавляешь события, действия добавляются через AddCondition.
Старый 31.12.2011, 23:03
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
почему именно AddCondition?
FellGuard добавил:
AddAction же есть, -1 boolexpr в карте
Старый 31.12.2011, 23:08
Hanabishi
COOL STATUS
offline
Опыт: отключен
FellGuard, типа через условие на 0.000001 секунду быстрее будет срабатывать=)
И вообще, все кто в этом деле не верят Doc'у - еретики =D
Старый 31.12.2011, 23:09
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
хех, надо же, учту >_<
я не не доверяю, я просто хочу знать почему
Старый 31.12.2011, 23:10
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Раньше а не быстрее.
И использование 1 общего трига на урон,с добавлением всех юнитов в событие получения урона является лучшим вариантом.
Если же надо создавать и потом уничтожать локальный триггер то попутно сохранять triggercondition\triggeraction,потом при удалении сначала удалять событие\действие сохраненное а потом уже дестроить триггер.
Старый 31.12.2011, 23:12
MpW

offline
Опыт: 49,995
Активность:
Doc, покажи пример ))
Старый 31.12.2011, 23:25
Doc

offline
Опыт: 63,163
Активность:
Кондишн раньше получения урона срабатывает, да.
Единственная тут фишка в том, что во всех кондишнах нужно return true ставить, return false приведет к обрыву последующих действий, хотя это тоже можно использовать, конечно.

Doc добавил:
Мне лениво, можешь взломать новую slash arena и посмотреть, там немного кода в целом.
Старый 31.12.2011, 23:28
MpW

offline
Опыт: 49,995
Активность:
а то я даже не понял ничего )) я локальный триг создаю и все - он мне нужен, и я не буду его удалять его он сам будет запускать то что надо, у меня примере все то есть, и вы снова чем то недовольны.

Steal nerves добавил:
ладно я понял что условие нужно использовать вместо действия спасибо )) тему клоуз

Отредактировано Steal nerves, 01.01.2012 в 00:11.
Старый 31.12.2011, 23:52
MyRtZ

offline
Опыт: 6,530
Активность:
Единственная тут фишка в том, что во всех кондишнах нужно return true ставить
Почему-то во всех триггерах которых я видел в картах имеющие только кондишн он возвращает отрицательный булин
А вообще, если ты так интерисуешься такого рода утечками, то немешало бы(если ты работаешь на Jass2, vJass, cJass) модифицировать InitBlizzard(полная замена через дэфайны) и добавить следующее:
      DestroyTimer(bj_volumeGroupsTimer)
      bj_volumeGroupsTimer = null
         
      DestroyTimer(bj_queuedExecTimeoutTimer)
      bj_queuedExecTimeoutTimer = null
         
         
      DestroyGroup(bj_lastCreatedGroup)
      bj_lastCreatedGroup = null
         
      DestroyTimer(bj_lastStartedTimer)
      bj_lastStartedTimer = null
Это чистка стандартных переменных
Старый 01.01.2012, 00:21
Doc

offline
Опыт: 63,163
Активность:
да и как в доте лучше делать
//!inject config
//!endinject

//!inject main
//!dovjassinit

//!endinject
А внутри код стандартной инициализации.
Старый 01.01.2012, 00:31
MyRtZ

offline
Опыт: 6,530
Активность:
Doc:
да и как в доте лучше делать
//!inject config
//!endinject

//!inject main
//!dovjassinit

//!endinject
А внутри код стандартной инициализации.
Есть статья про такие фичи?
гугл не дружит с подобными запросами
Старый 01.01.2012, 00:32
Doc

offline
Опыт: 63,163
Активность:
vjassmanual, так статей нет, но там в целом все просто, достаточно поглядеть стандартный код и выцепить оттуда жизненно важные функции.
Можно закрывать?
Старый 01.01.2012, 00:35
MpW

offline
Опыт: 49,995
Активность:
но вджазом и сджазом не пользуюсь к сожалению, у меня не работает что-то редактор, и еще сохранять так каждый раз надоедает. Да закрывай. Может быть видео прислать то что неправильно делаю?
Старый 01.01.2012, 00:54
Закрытая тема

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

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

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

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



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