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 Кривая... там больше и фаталить нечему...
32

» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?

biridius, сударь дайте мне обычного героя, с нормальной анимацией, Который сделает хотя бы 2 тычки как вивер в доте, сразу же (орб оф слоу не юзать).
Увы только на мемхаке есть функции сброса кд абилки и функции для эмуляции атаки.
32

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

Насколько помню, записть листа абилок была нестабильна, норм работает только чтение...
 function GetHeroAbilityFromList takes unit uHero, integer list returns integer
        set LastConvertedHandle = ConvertHandle( uHero )
    
        if IsUnitType( uHero, UNIT_TYPE_HERO ) and LastConvertedHandle > 1 and list > 0 then
            return ReadMemory( ReadMemory( LastConvertedHandle + 496 ) + 240 + 4 * list )
        endif

        return 0
    endfunction
LastConvertedHandle - адресс героя, 496 адрес абилки 'Aher' -герой, в её полях лежат способности для изучения, ну а 240 + каждые 4 байта это адреса абилок. т.е 244 это первая абилка в списке, 248 вторая и так далее....
32

» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?

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

» WarCraft 3 / Сглаз

Ну морф руной блин, правда вы запаритесь делать альтернативных юнитов...
32

» WarCraft 3 / Как сделать 3-ой, 4-ой (n-ой) удар?

PrincePhoenix:
ClotPh, А что делать, если я отстал от жизни и не знаю, что такое мемхак?)
Никак, считать это невозможным...
32

» WarCraft 3 / Критические ошибки

PT153, ну обычно этим страдают гуишники, туча точек и групп....
Мб код карты в студию (или карту).
32

» WarCraft 3 / Почему в этом коде даммик не кидает сетку

ClotPh, потому что рак мозга...
call CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLifeBJ( 2.00, 'BTLF', GetLastCreatedUnit() )
call UnitAddAbilityBJ( 'A303', GetLastCreatedUnit() )
call IssueTargetOrderBJ( GetLastCreatedUnit(), "ensnare", u5 )
Вот это равносильно, взять продукты выспать на землю после покупки в магазине и принести домой пустой пакет, пытатся найти продукты в пакете...
set bj_lastCreatedUnit =  CreateUnit(GetOwningPlayer(u5),'n021',x,y, bj_UNIT_FACING)
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
call UnitAddAbility( bj_lastCreatedUnit, 'A303' )\
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), true )
if  not IssueTargetOrder(bj_lastCreatedUnit, "ensnare", u5 )  then
call BJDebugMsg("Ошибка - юнит не может применить ensnare")
endif
call UnitShareVision( u, GetOwningPlayer(bj_lastCreatedUnit), false )
Всегда давай вижен дамми юниту или создавай за игрока который гарантированно будет видеть цель, у цели может быть инвиз, цель может быть в тумане войны (только что созданный юнит, если его корды не равны корды цели увидит цель лиш спустя 0.4 сек.)
Проверяй может ли дамми выполнить приказ, могут быть ошибки в настройки способности, в фильтре допустимых для спелла целей...
Вот пример того как я создаю дамми юнита для каста некой абилки:
   set TempAX = GetUnitX( st.attacked )
    set TempAY = GetUnitY( st.attacked )
    
    set bj_lastCreatedUnit = CreateUnit( st.pl, 'hdum', TempAX, TempAY, GetUnitFacing( st.attacked ) )
    call SetUnitPathing( bj_lastCreatedUnit, false )
    call SetUnitX( bj_lastCreatedUnit, TempAX )
    call SetUnitY( bj_lastCreatedUnit, TempAY )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.50 )
    call UnitAddAbility( bj_lastCreatedUnit, 'A051' )
    
    if not IssueTargetOrderById( bj_lastCreatedUnit, 852132, st.attacked ) then
        call BJDebugMsg( DEBUG + I2Sx( 'A05M', 3 ) )
        call BJDebugMsg( INFO )
        call TriggerExecute( st.trg )
    endif
32

» WarCraft 3 / Процент повышения брони

8gabriel8, как вы собрались проверять кол-во брони, это только в мемхаке есть функция узнать текущую белую и зеленую броню, другие способы из области фантастики, пили базу данных всех баффов, дебафов, юнитов,предметов...
Есть вещи которые вот так просто в 1 клик, как вы делайте в гуи не сделать... И хоть ты тресни, либо не делай ничего либо делай как говорят, третьего не дано.
32

» WarCraft 3 / Как узнать тип урона

avuremybe, xgm.guru/p/wc3/damagedetect
Вот и детект типов урона, атаки, проверки является ли урон атакой ближнего\дальнего боя, уроном от модификатора (к примеру ракеты паравого танка).