28

» WarCraft 3 / [UjAPI] Chest Puzzle

rsfghd, я первый раз что-то делал на южапи, закинул по привычке необходимости, потом увидел возможность создания фреймов без ток файла, просто забыл убрать этот огрызок, но ты прав, мне нужно вскры
28

» WarCraft 3 / [UjAPI] Chest Puzzle

EugeAl, этот замочек из Обливиона вроде, и если не ошибаюсь там тоже можно мышкой ковыряться. Первобытная моя задумка тоже включала манипуляции с мышкой, но я так не удобно реализовал это на месхаке, что решил на стрелочках сделать
28

» WarCraft 3 / [UjAPI] Chest Puzzle

нафиг тебе .toc файл в карте если ты не юзаешь его в коде? в чём прикол?
28

» WarCraft 3 / бесконечная молния

nazarpunk, подставь пол слово мемхак южапи и смысл сообщения не поменяется
28

» WarCraft 3 / [UjAPI] Frame builder

Полезное, но энивей новичкам будет трудно даже с таким инструментарием осваивать фреймы. Думаю найдётся более годное применение подобному, но это уже фантазия юзеров
28

» WarCraft 3 / Нужно ли брать сапог скорости герою у которого скоросыть передвежения и так очень высокая

в дополнение к ответу выше, максимальный лимит скорости в варе 522, в константах стандартно указан лимит 400 для юнитов
28

» Администрация XGM / Не соответствует предпросмотр

о, что интересно, при создании вопроса всё корректно отображается и картинка не сжимается, нужно было ставить <>
28

» WarCraft 3 / Путь фильтров снижения яркости в MPQ

ScorpioT1000, в гуи и джассе это называется фильтрами, поэтому он всё правильно написал
Загруженные файлы
28

» WarCraft 3 / Можно ли отменить действие предмета "лунное затмение"?

Тебе же нужно ещё сохранять исходное время для возвращения. Сложность в том, что при лунном затмении интерфейс времени изменяется соответствующе, такое из коробки только на южапи и рефе доступно
28

» WarCraft 3 / Способности и алгоритмы на заказ

Meddin, сор что долго, у меня проблемы со светом и жизнью в целом, лучше бы сдох
28

» WarCraft 3 / Способности и алгоритмы на заказ

Выполнение заказа
Meddin, всё что нужно изменить при импорте в коде помечено комментариями, достаточно скопировать папку Initialization и вставить в свою карту
если что-то не понятно или нужно переделать - пиши
код
function GetDirection takes real alpha, real gamma returns integer
    if ( alpha < bj_PI and not( gamma > alpha and gamma < alpha + bj_PI ) ) or ( alpha > bj_PI and gamma > alpha - bj_PI and gamma < alpha ) then
        return 2
    else
        return 1
    endif
endfunction

function ParabolaZ2 takes real y0, real y1, real h, real d, real x returns real
    return ( 2.00 * ( y0 + y1 - 2.00 * h ) * ( x / d - 1.00 ) + ( y1 - y0 ) ) * ( x / d ) + y0
endfunction

function GetLocZ takes real x, real y returns real
    call MoveLocation( udg_LFZ, x, y )
    return GetLocationZ( udg_LFZ )
endfunction

function IsUnitDead takes unit u returns boolean
    return IsUnitType( u, UNIT_TYPE_DEAD ) or GetUnitTypeId( u ) == 0
endfunction

function MoveCollision takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local timer t1
    local integer i = GetHandleId( t )
    local integer i1
    local unit target = LoadUnitHandle( udg_H, i, 0 )
    local unit caster = LoadUnitHandle( udg_H, i, 1 )
    local unit u
    local real a = LoadReal( udg_H, i, 2 )
    local real d = LoadReal( udg_H, i, 3 )
    local real s = LoadReal( udg_H, i, 5 )
    local real x
    local real y
    local real x1
    local real y1
    local group g = LoadGroupHandle( udg_H, i, 6 )
    local group g1
    local player p = GetOwningPlayer( caster )
    
    if s > d then
        set s = d
    endif
    
    set d = d - s
    
    set x = GetUnitX( target ) + s * Cos( a )
    set y = GetUnitY( target ) + s * Sin( a )
    
    call SetItemPosition( udg_TempItem, x, y )
    call SetItemVisible( udg_TempItem, false )
    
    set x1 = GetItemX( udg_TempItem )
    set y1 = GetItemY( udg_TempItem )
    
    if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
        set x = x - s * Cos( a )
        set y = y - s * Sin( a )
        set d = 0.00
        
        call UnitDamageTarget( caster, target, 25.00, false, false, null, null, null )
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", target, "chest" ) )
    endif
    
    call SetUnitX( target, x )
    call SetUnitY( target, y )
    
    call GroupEnumUnitsInRange( udg_TempGroup, x, y, 416.00, null )
    
    loop
        set u = FirstOfGroup( udg_TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( udg_TempGroup, u )
        
        if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, target, 16.00 ) then
            call GroupAddUnit( g, u )
            
            set t1 = CreateTimer( )
            set i1 = GetHandleId( t1 )
            set x1 = GetUnitX( u )
            set y1 = GetUnitY( u )
            
            call SaveUnitHandle( udg_H, i1, 0, u )
            call SaveUnitHandle( udg_H, i1, 1, caster )
            
            call SaveReal( udg_H, i1, 2, Atan2( y1 - y, x1 - x ) )
            call SaveReal( udg_H, i1, 3, LoadReal( udg_H, i, 4 ) * 0.50 )
            call SaveReal( udg_H, i1, 4, LoadReal( udg_H, i, 4 ) * 0.50 )
            call SaveReal( udg_H, i1, 5, LoadReal( udg_H, i, 5 ) * 0.50 )
            
            set g1 = CreateGroup( )
            set bj_groupAddGroupDest = g1
            call ForGroup( g, function GroupAddGroupEnum )
            
            call SaveGroupHandle( udg_H, i1, 6, g1 )
            
            call TimerStart( t1, 0.01, true, function MoveCollision )
            
            set g1 = null
            set t1 = null
        endif
    endloop
    
    if d <= 0.00 then
        call DestroyGroup( g )
        
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( udg_H, i )
    else
        call SaveReal( udg_H, i, 3, d )
    endif
    
    set t = null
    set g = null
    set target = null
    set caster = null
endfunction

function Move takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local timer t1
    local integer i = GetHandleId( t )
    local integer i1
    local unit caster = LoadUnitHandle( udg_H, i, 0 )
    local unit u
    local real a = LoadReal( udg_H, i, 1 )
    local real d = LoadReal( udg_H, i, 2 )
    local real s = LoadReal( udg_H, i, 4 )
    local real x
    local real y
    local real x1
    local real y1
    local player p = GetOwningPlayer( caster )
    local group g = LoadGroupHandle( udg_H, i, 8 )
    local group g1
    
    if s > d then
        set s = d
    endif
    
    set d = d - s
    
    set x = GetUnitX( caster ) + s * Cos( a )
    set y = GetUnitY( caster ) + s * Sin( a )
    
    call SetItemPosition( udg_TempItem, x, y )
    call SetItemVisible( udg_TempItem, false )
    
    set x1 = GetItemX( udg_TempItem )
    set y1 = GetItemY( udg_TempItem )
    
    // check pathing
    if ( x + 1.00 < x1 or x - 1.00 > x1 ) or ( y + 1.00 < y1 or y - 1.00 > y1 ) then
        set x = x - s * Cos( a )
        set y = y - s * Sin( a )
    endif
    
    call SetUnitX( caster, x )
    call SetUnitY( caster, y )
    call SetUnitFlyHeight( caster, ParabolaZ2( LoadReal( udg_H, i, 6 ), LoadReal( udg_H, i, 5 ), LoadReal( udg_H, i, 7 ), LoadReal( udg_H, i, 3 ), d ) - GetLocZ( x, y ), 0.00 )
    
    call GroupEnumUnitsInRange( udg_TempGroup, x, y, 464.00, null ) // radius with collision ( caster + target max collisions (200.00 + 200.00) )
    
    loop
        set u = FirstOfGroup( udg_TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( udg_TempGroup, u )
        
        if not IsUnitDead( u ) and IsUnitEnemy( u, p ) and not IsUnitInGroup( u, g ) and IsUnitInRange( u, caster, 64.00 ) then // 64.00 - radius with unit collision
            call GroupAddUnit( g, u )
            
            call UnitDamageTarget( caster, u, LoadReal( udg_H, i, 9 ), false, false, null, null, null ) // damage
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\AncientProtectorMissile\\AncientProtectorMissile.mdl", u, "chest" ) )
            
            set t1 = CreateTimer( )
            set i1 = GetHandleId( t1 )
            set x1 = GetUnitX( u )
            set y1 = GetUnitY( u )
            
            call SaveUnitHandle( udg_H, i1, 0, u )
            call SaveUnitHandle( udg_H, i1, 1, caster )
            
            if GetDirection( a, Atan2( y1 - y, x1 - x ) ) == 1 then // left or right move
                call SaveReal( udg_H, i1, 2, a + bj_PI * 0.50 )
            else
                call SaveReal( udg_H, i1, 2, a - bj_PI * 0.50 )
            endif
            
            call SaveReal( udg_H, i1, 3, 416.00 ) // distance for discarding
            call SaveReal( udg_H, i1, 4, 416.00 )
            call SaveReal( udg_H, i1, 5, 7.00 ) // speed of discarding
            call SaveReal( udg_H, i1, 7, LoadReal( udg_H, i, 10 ) ) // wall damage
            
            // save group of all units thats already got damage from spell
            set g1 = CreateGroup( )
            set bj_groupAddGroupDest = g1
            call ForGroup( g, function GroupAddGroupEnum )
            
            call SaveGroupHandle( udg_H, i1, 6, g1 )
            
            call TimerStart( t1, 0.01, true, function MoveCollision )
            
            set g1 = null
            set t1 = null
        endif
    endloop
    
    if d <= 0.00 then
        call PauseUnit( caster, false )
        call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Human\\ThunderClap\\ThunderClapCaster.mdl", x + 64.00 * Cos( a ), y + 64.00 * Sin( a ) ) )
        
        call DestroyGroup( g )
        
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( udg_H, i )
    else
        call SaveReal( udg_H, i, 2, d )
    endif
    
    set t = null
    set g = null
    set caster = null
endfunction

function SetAnim takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local unit caster = LoadUnitHandle( udg_H, GetHandleId( t ), 0 )
    
    call PauseUnit( caster, true )
    call SetUnitAnimation( caster, "attack slam" )
    call QueueUnitAnimation( caster, "stand" )
    
    call TimerStart( t, 0.01, true, function Move )
    
    set t = null
    set caster = null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local integer i = GetHandleId( t )
    local integer lvl
    local unit caster = GetTriggerUnit( )
    local real x = GetUnitX( caster )
    local real y = GetUnitY( caster )
    local real x1 = GetSpellTargetX( )
    local real y1 = GetSpellTargetY( )
    local real d
    
    if UnitAddAbility( caster, 'Arav' ) then
        call UnitRemoveAbility( caster, 'Arav' )
    endif
    
    call SaveReal( udg_H, i, 5, GetLocZ( x, y ) ) // start height
    call SaveReal( udg_H, i, 6, GetLocZ( x1, y1 ) ) // end height
    
    set x = x1 - x
    set y = y1 - y
    set d = SquareRoot( x * x + y * y )
    
    call SaveUnitHandle( udg_H, i, 0, caster )
    call SaveReal( udg_H, i, 1, Atan2( y, x ) ) // angle
    call SaveReal( udg_H, i, 2, d ) // distance
    call SaveReal( udg_H, i, 3, d ) // distance max
    call SaveReal( udg_H, i, 4, d * 0.018 ) // speed
    call SaveReal( udg_H, i, 7, 75.00 + ( 750.00 - d ) * 0.15 ) // parabola height
    call SaveGroupHandle( udg_H, i, 8, CreateGroup( ) )
    
    set lvl = GetUnitAbilityLevel( caster, GetSpellAbilityId( ) )
    if lvl == 1 then // ability level
        call SaveReal( udg_H, i, 9, 175.00 ) // start damage
        call SaveReal( udg_H, i, 10, 50.00 ) // wall damage
    elseif lvl == 2 then
        call SaveReal( udg_H, i, 9, 275.00 )
        call SaveReal( udg_H, i, 10, 70.00 )
    else
        call SaveReal( udg_H, i, 9, 375.00 )
        call SaveReal( udg_H, i, 10, 100.00 )
    endif
    
    call TimerStart( t, 0.00, false, function SetAnim )
    
    set t = null
    set caster = null
endfunction

//===========================================================================
function Trig_Spell_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000'
endfunction

function InitTrig_Spell takes nothing returns nothing
    set gg_trg_Spell = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Spell, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Spell, Condition( function Trig_Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Trig_Spell_Actions )
endfunction

Загруженные файлы
28

» WarCraft 3 / Городские жители

IzobretatelBoom, долгами только не набирайся. Лучше научи пользоваться удочкой
28

» WarCraft 3 / Ошмбка

При сейве карты редактор был принудительно закрыт, архив карты повреждён, ищи бэкапы
28

» WarCraft 3 / Отслеживание юнитов

выбери всех юнитов вокруг нужного тебе юнита избегая утечек, вот и всё
утечки вызовут точки и выбор юнитов в группу, чтобы избежать этого - нужно пользоваться кастомскриптом:
call RemoveLocation( udg_точка )
и
call GroupEnumUnitsInRange( udg_группа, GetUnitX( udg_юнит ), GetUnitY( udg_юнит ), 512.00 (радиус), null )
потом в гуи в цикле отсеиваешь через если тогда иначе тип юнита
28

» WarCraft 3 / S.T.A.L.K.E.R. Marked (One)

Я поиграю чтобы оставить гневный комментарий когда будет свет