32

» WarCraft 3 / Утечки в системе динамических триггеров

nvc123, нельзя, исключено. Тебе нужно снять эффект (допустим кастом стана), но не после смерти а до смерти, иначе будет баг (юнита больше не смогут застанить если это герой). А с баффами аур, когда им рисуешь псевдо длительность и прочее, тоже нужно избавляться вовремя...
Есть только одно событие которое срабатывает до смерти юнита (даже с крестом перерождения) - TriggerRegisterDeathEvent - это событие на конкретный виджет. Так же в триггер подвешиваем событие на каст диспелов, если юнит кастанул одну из диспелящих абилок в себя, или на него то рассеять бафф и утилизировать триггер.
32

» WarCraft 3 / Утечки в системе динамических триггеров

Принятый ответ
Kind Ram, еще внезапно есть - это
Там изи детект всех видов урона и есть даже пример как это сделать....
32

» WarCraft 3 / Утечки в системе динамических триггеров

Единственная необходимость плодить динамические триггеры - это мемхак и кастом баффы, там просто необходимо знать что хп упало до нуля (event widget death) а так же другие события...
32

» WarCraft 3 / Аура которая сбрасывается сразу после покидания зоны действия

Мне одному непонятно? Зачем это могло понадобится? Зачем вам удалять бафф ауры сразу? На то и сделана задержка обновления ауры 2 сек. Чтобы она не мерцала и не нагружать движок бесполезными действиями, пусть она висит без героя, эти пару секунд уж точно нечего не решит.
Занимайтесь более важными вещами, то все как один пишут на гуи, все спеллы в 3 строчки вроде кинуть дамми спелл на юнитов в аое, но блин ауру им надо переделать, со своей карты начните...
32

» WarCraft 3 / Утечки в системе динамических триггеров

Kind Ram, а тебе нужно понимать, а нужно скопировать и вставить...
Если в краце, это самый производительный алгоритм, на одном таймере.
32

» WarCraft 3 / Проверьте, пожалуйста, триггеры!

16GB, не ты их удалил, лол событие висит на обьекте - мобы сдохли = равно нету событий...
я про то что одно и тоже событие 10 раз повешать
на одного юнита....
32

» WarCraft 3 / Проверьте, пожалуйста, триггеры!

8gabriel8,есть ограничение памяти, когда оно будет исчерпано будет фатал, когда событие срабатывает вызывается поток триггера, и так много много раз, каждый поток требует пямять...
32

» WarCraft 3 / Проверьте, пожалуйста, триггеры!

8gabriel8, нет, вам хватит юнитов 40+, и потом фатал, когда событий нациклится с тысячу.
quq_CCCP, Ненужно делать на гуи все что требует работу с созданием триггеров, таймеров, групп...
32

» WarCraft 3 / Редактирование кода

Принятый ответ
Нет, нету однлкноплчных прог, которые защитят вам карту. Зезула читает все. Пох ему на спазлерры, прочие методы защиты мпк будут взломаны очень быстро - вышлют карту ладиславу зезуле, Там чувак написал либу по чтению мпк архивов, у него явно есть полные познание устройства мпк архивов и ваша защита там 5 мин не продержится..
Отошли времена, небудет больше спазлоров. Меняем свой код, делая нечитаемым ( перевод в байт код) данные о юнитах и итемах снимаем уакойнить тулой. После благодарямемхаку извлекаем в игре все эти данные... Там читеры будут очень долго ломать голову, с такой защитой небудет универсального и быстрого метода вшить Читы...
32

» WarCraft 3 / Редактирование кода

PogromINC59, могу, будет непросто - переписать весь код на jass...
Конвертор кода есть у драколича, ну и мемхак внедряем в свою карту.
Лучше использовать вторую версию из наработки детекта урона
не говоря о том что должно быть все готово, оптимизировано и особым образом написано...
32

» WarCraft 3 / Редактирование кода

NekoriDes, не факт, не продвинутые вроде абсо с алл читс или драколича, хер что сделают если карта на байткодах...
32

» WarCraft 3 / Редактирование кода

Ну это не запретит редактирование кода, а ограничит...
Собственно ретурн баг на Code
I2C(integer) C2I(code)...
При изменении кода, изменится и число получаемое c помощью I2C...
Ну там еще много способов, но все это несколько геморойно для практического применения...
Вроде собственной dll или написания кода карты байткодами...
32

» WarCraft 3 / Таргетные способности с таймером

Принятый ответ
Только дебаффы ядовитых стрел могут стакатся, но даммик обязан иметь дальнюю атаку (при условии что у разных абилок ядовитых стрел будут разные баффы в настройках).
Так же можно юзать таймер и ауру торнадо как написали выше, ну если уж совсем нужен сложный бафф как дефолтный - то тут триггер и немного гемора с мемхаком, зато полный комплект параметров (мигает иконка в статусе перед завершением время действия, бафф спадает с цели после диспела, смерти (у цели крест перерождения или аналог), складывается или не складывается в зависимости от кода).
Пример не рекомендуемый к повторению
function FormatAirportTrainingBar takes integer fp_n returns string
    local string str = ""

    if ( fp_n <= 0 ) then
        return str
    endif

    loop
        exitwhen fp_n < 10
        if ( udg__TempBarStyle == 0 ) then
            set str = str + "''''''''''"
        else
            set str = str + "||||||||||||||||||||"
        endif
        set fp_n = fp_n - 10
    endloop

    loop
        exitwhen fp_n <= 0
        if ( udg__TempBarStyle == 0 ) then
            set str = str + "'"
        else
            set str = str + "||"
        endif
        set fp_n = fp_n - 1
    endloop

    return str
endfunction

function UpdateAirportTrainingBar takes texttag tt, integer fp_nTick, integer fp_nTickMax returns nothing
    local integer nProgress
    local integer nLen
    local string strTT1
    local string strTT2

    if ( tt == null ) then
        call BJDebugMsg( "text tag hDZzRwuZxFQcXqaMPnML null" )
        return
    endif

    set nLen = R2I( I2R( fp_nTickMax ) / 300 * 100 )
    set nProgress = R2I( I2R( nLen ) / fp_nTickMax * fp_nTick )
    set strTT1 = "" + FormatAirportTrainingBar( nProgress )
    set strTT2 = FormatAirportTrainingBar( nLen - nProgress ) + ""
    call SetTextTagText( tt, "|cff0080c0" + strTT1 + "|r|cffff0000" + strTT2 + "|r", 0.023 )
endfunction

function Get_Staff_of_Purification takes unit runner returns item
    set bj_forLoopAIndex = 0
    set bj_lastCreatedItem = null
    
    if GetUnitAbilityLevel( runner, 'Arun' ) == 0 then
        return null
    endif
    
    loop
        exitwhen bj_forLoopAIndex > 5

        set bj_lastCreatedItem = UnitItemInSlot( runner, bj_forLoopAIndex )
        if GetItemTypeId( bj_lastCreatedItem ) == 'I01A' then
            return bj_lastCreatedItem
        endif

        set bj_forLoopAIndex = bj_forLoopAIndex + 1
    endloop

    return bj_lastCreatedItem
endfunction

function Trig_RunnerDamageDetect_Conditions takes nothing returns boolean
    if GetTriggerEventId( ) == EVENT_UNIT_DAMAGED then
        return GetEventDamage( ) > 0.00 and GetEventDamageSource( ) != GetTriggerUnit( ) and GetEventDamageSource( ) != DummyAttacker
    endif
    return true
endfunction

function HealRunner takes nothing returns nothing
    local DamageData dd = GetDataBX( GetExpiredTimer( ) )
    
    call UnitRemoveAbility( dd.attacked, 'AMhp' )
    call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp )
    
    call RemoveDataBX( dd.trix )
    call DestroyTimer( dd.trix )
    call dd.clear( )
    call dd.destroy( )
endfunction

function Trig_RunnerDamageLock_Actions takes nothing returns nothing
    local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
    local DamageData dd
    local eventid id = GetTriggerEventId( )
    
    if id == EVENT_GAME_TIMER_EXPIRED and st.id < st.time and st.attacked != null then
        set st.id = st.id + 1
        if GetUnitAbilityLevel( st.attacked, 'Bcyc' ) > 0  or GetUnitAbilityLevel( st.attacked, 'Bcy2' ) > 0 then
            call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 585.00 )
        else
            call SetTextTagPos( st.tt, GetUnitX( st.attacked ) - 60.00, GetUnitY( st.attacked ) - 60.00, 80.00 + GetUnitFlyHeight( st.attacked ) )
        endif
        call UpdateAirportTrainingBar( st.tt, 100 - R2I( st.dmg / st.hp * 100.00 ), 100 )
        
    elseif id == EVENT_UNIT_DAMAGED and st.dmg < st.hp then
        set dd = DamageData.create( )
        set dd.trix = CreateTimer( )
        set dd.attacked = st.attacked
        set dd.dmg = GetEventDamage( )
        set dd.hp = GetUnitState( dd.attacked, UNIT_STATE_LIFE )
        
        call SetDataBX( dd.trix, dd )
        call UnitAddAbility( dd.attacked, 'AMhp' )
        call SetUnitState( dd.attacked, UNIT_STATE_LIFE, dd.hp + dd.dmg )
        
        call TimerStart( dd.trix, 0.00, false, function HealRunner )
        
        set st.dmg = st.dmg + dd.dmg
    else
        call UnitRemoveAbility( st.attacked, 'A08L' )
        call UnitMakeAbilityPermanent( st.attacked, false, 'A08L' )
        call DisableTrigger( st.trg )
        call SetTextTagVisibility( st.tt, false )
        
        if not IsUnitDead( st.attacked ) then
            call UnitRemoveAbility( st.attacked, 'B00A' )
        endif
        
        call RemoveSavedInteger( gg_htb_HashData, ExKeySoPRunner, GetHandleId( st.attacked ) )
        
        call st.RemoveTrigger( )
        call st.destroy( )
    endif
    
    set id = null
endfunction

function Trig_Staff_of_Purification_Actions takes nothing returns nothing
    local TriggerData dd
    local unit Runner = GetSpellAbilityUnit( )
    local integer RunnerId = GetHandleId( Runner )
    local item Staff = LoadItemHandle( gg_htb_HashData, RunnerId, ExKeySoP )
    local integer ChargesCount = 0
    local trigger trig = LoadTriggerHandle ( gg_htb_HashData, ExAtomShield, RunnerId )
    local integer pBuff
    
    if Staff == null then
        set Staff = Get_Staff_of_Purification( Runner )
         
        if Staff == null then
            //call DisplayTextToPlayer( Player( CrashPlayerNumber ), 0.00, 0.00, I2Sx( 'A01Q', CrashPlayerNumber ) )
            call BJDebugMsg( DEBUG + I2Sx( 'A02O', 0 ) + INFO )
            return
        endif
        
        call SaveBoolean( gg_htb_HashData, RunnerId, ExKeyHasStaff, true )
        call SaveItemHandle( gg_htb_HashData, RunnerId, ExKeySoP, Staff )
    endif
    
    set ChargesCount = GetItemCharges( Staff )
    
    if ChargesCount < 1 then
        set Runner = null
        set Staff = null
        set trig = null
        return
    endif
    
    call SetItemCharges( Staff, 0 )
    
    if trig != null then // блокирующие урон способности не складываются.
        call TriggerExecute( trig )
        set trig = null
    endif
    
    set dd = TriggerData.create( )
    set dd.attacked = Runner
    set dd.pl = GetOwningPlayer( Runner )
    set dd.trg = CreateTrigger( )
    set dd.trc = TriggerAddCondition( dd.trg, Condition( function Trig_RunnerDamageDetect_Conditions ) )
    set dd.tra = TriggerAddAction ( dd.trg, function Trig_RunnerDamageLock_Actions )
    set dd.tt = CreateTextTag( )
    set dd.hp = 1000.00 * ChargesCount
    set dd.dmg = 1.00
    set dd.id = 0
    set dd.time = 480
    set dd.c = 0.03125
    
    call UnitAddAbility( Runner, 'A07E' )
    call UnitRemoveAbility( Runner, 'A07E' )
    call UnitAddAbility( Runner, 'A08L' )
    call UnitMakeAbilityPermanent( Runner, true, 'A08L' )
    
    call SetDataBX( dd.trg, dd )
    call SaveInteger( gg_htb_HashData, ExKeySoPRunner, RunnerId, dd )
    
    call TriggerRegisterPlayerEvent( dd.trg, dd.pl, EVENT_PLAYER_LEAVE )
    call TriggerRegisterDeathEvent( dd.trg, Runner )
    call TriggerRegisterUnitEvent( dd.trg, Runner, EVENT_UNIT_DAMAGED )
    
    call TriggerRegisterTimerEvent( dd.trg, 0.03125, true )
    
    if GetLocalPlayer( ) == dd.pl or IsPlayerAlly( GetLocalPlayer( ), dd.pl ) then
        call SetTextTagVisibility( dd.tt, true )
    else
        call SetTextTagVisibility( dd.tt, false )
    endif
    
    set pBuff = GetUnitAbility( dd.attacked, 'B00A' ) + 0x90
    set dd.c = TimerGetElapsed( DispTimer )
    call WMem( RMem( pBuff ) + 0x4, mR2I( dd.c + 15.10 ) )
    call WMem( RMem( pBuff ) + 0x8, mR2I( dd.c + 10.408 ) )
    call SetBuffLevel( pBuff - 0x90, ChargesCount )
    call UpdateAirportTrainingBar( dd.tt, 100, 100 )
    
    set Runner = null
endfunction
    
//===========================================================================
function InitTrig_Staff_of_Purification takes nothing returns nothing
    set udg__TempBarStyle = 0
endfunction
Выше пример баффа для предмета, который образует щит блокирующий урон, кол-во заблокированного урона и сколько еще заблокирует щит отображается над головой героя, в виде полоски здоровья (только цвет сине-красный). Так же в статуе есть бафф, один в 1 как бафф дефектных способностей вара, не складывается - новый, перебивает старый. И так далее...
32

» WarCraft 3 / Как создать пожар и тушение?

DarkHammer, Ядовитая атака - с моделью огня, или что там вам нравится.
Тушить через диспел (или триггерную абилку, удаляя бафф).
32

» WarCraft 3 / Стандартная способность

Все способности предметных хилок, там их уйма, могут восстанавливать ману.
32

» RenderEdge / [RenderEdge] Memory Hack

ADOLF, а рили будет апдейт cjass? То он много с чем не дружит, так же приходится спасать от его автоудаления ненужного кода глобалки и функции мемхака, которые нужны чтобы обойти защиту от возвращения не того типа...
32

» WarCraft 3 / Хак на память Warcraft3

ClotPh, ро код и есть много цифр на экране
Чтобы был ро код как в редакторе - Id2String()
32

» WarCraft 3 / Хак на память Warcraft3

Еще одно но, адреса абилок в оригинале записываются как F8/FC/100/104
32

» WarCraft 3 / Хак на память Warcraft3

ClotPh, Еще можно проверить ReadRealMemory вместо ReadMemory
Ну а фатал при выборе негероя - навреное ConvertHandle Кривая... там больше и фаталить нечему...