28

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

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

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

FDG89K, при получении цели бегают за ней до самого конца
хочешь чтобы я ещё испытал если разделить на каждого юнита ночных эльфов по одному мечнику, а всех остальных натравить на великана?
Загруженные файлы
28

» WarCraft 3 / Вопрос про то, как "вставлять" анимацию постройки в модель.…

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

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

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

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

FDG89K, я фиксировал цель при получении приказа у мечника, результат тот же)
Только я могу доработать ии, что пока за юнитом бегает толпа мечников, он будет бегать по карте гоняя за собой, пока юниты, которых не фокусят, будут продолжать их добивать. Мне перезаписать вечером?
28

» WarCraft 3 / Пак способностей - Corpse Collector

OVOgenez, ты мне уже как родной (просто потому что я не вижу других спеллмецкеров)
28

» WarCraft 3 / Пак способностей - Corpse Collector

Огонь, жаль код сразу не приложил, хотелось бы полюбоваться как сделано
28

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

FDG89K, главное суть. Ты не реализуешь преимущество дальнего боя, если не будешь разрывать дистанцию
28

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

Алсо, попробуй поставить 999999 магов против дриады и расскажи почему люди в миллион пищи проиграли ночным эльфам. Ты не задумывался а как люди выживали в Азероте против демонов, орков м нежити? Каждый раз, когла нежить подходила к базам людей, те не воевали, они просто отправляли вперёд одного палладина с божественным щитом, который пол минуты крутил пальцем у виска, а потом прожимал свиток возвращения. Враги умирали не от мечей, как на видосиках, а от ожидания и фейспалма
28

» WarCraft 3 / Почему эльфы в Т3 слабее людей в Т1?

Я могу написать ии где эльфы заставят твоих пехотинцев сделать сосо огромному дубу горного великана и удобрить почву плодородных тайлов Калимдора)
Если ты реализуешь полный потенциал обеих стенок, то пехотинцы даже одного юнита не убьют, а сюда входит: кайт, распределение фокуса атаки, использование абилок рев омоложение таунт*, дриады накладывают сразу на всех яд по одной автоатаке, смещая потом фокус в одну цель, периодически обновляя яд. При кайте укрыться за щитом не позволит даже добежать до лучниц
28

» WarCraft 3 / Частицы/Particles

за 6 лет до сих пор код не выложил ну как так можна..
пойду сам теперь делать открытый аналог
28

» WarCraft 3 / Заклинания на заказ

Заказ выполнен

Заклинание готово!

Способность выполнена на UjAPI
на видео демонстрация с 100% шансом
инструкция по импорту
скопировать папку Initialization и вставить в свою карту, перекопировать нестандартное ро и вставить в свою карту
в триггере Melee Initialization настроить всё, что помечено комментарием, на своё усмотрение. остальное требует минимальных знаний джасса

код

Melee Initialization
library mylib
globals
    constant hashtable H = InitHashtable( )
    private constant group TempGroup = CreateGroup( )
endglobals

struct vector
    real x
    real y
    real z
    
    method length takes nothing returns real
        return SquareRoot( x * x + y * y + z * z )
    endmethod
    
    method normalize takes nothing returns nothing
        local real l = length( )
        
        if l == 0.00 then
            set l = 1.00
        endif
        
        set x = x / l
        set y = y / l
        set z = z / l
    endmethod
    
    static method create takes real x, real y, real z returns thistype
        local thistype this = thistype.allocate( )
        
        set this.x = x
        set this.y = y
        set this.z = z
        
        return this
    endmethod
endstruct

private struct mystruct
    timer t
    unit attacker
    effect eff
    effect eff1
    real time
    real timeMax
    real lastYaw
    
    vector array l[5]
    vector last
endstruct

private function Move takes nothing returns nothing
    local mystruct A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local integer i = 0
    local integer k = 0
    local real array x
    local real array y
    local real array z
    local real yaw
    local unit u
    
    set A.time = A.time + 0.03125 / A.timeMax
    
    if A.time > 1.00 then
        set A.time = 1.00
    endif
    
    loop
        set x[k] = A.l[k].x
        set y[k] = A.l[k].y
        set z[k] = A.l[k].z
        
        set k = k + 1
        exitwhen k >= 5
    endloop
    
    set k = 0
    
    loop
        set i = 0
        
        loop
            set x[i] = ( 1.00 - A.time ) * x[i] + A.time * x[i + 1]
            set y[i] = ( 1.00 - A.time ) * y[i] + A.time * y[i + 1]
            set z[i] = ( 1.00 - A.time ) * z[i] + A.time * z[i + 1]
            
            set i = i + 1
            exitwhen i > 5 - k
        endloop
        
        set k = k + 1
        exitwhen k >= 5 - 1
    endloop
    
    set yaw = Atan2( y[0] - A.last.y, x[0] - A.last.x )
    call SetSpecialEffectPositionWithZ( A.eff, x[0], y[0], z[0] )
    call SetSpecialEffectPositionWithZ( A.eff1, x[0], y[0], z[0] )
    call SetSpecialEffectOrientation( A.eff, yaw * bj_RADTODEG, Atan2( z[0] - A.last.z, SquareRoot( ( x[0] - A.last.x ) * ( x[0] - A.last.x ) + ( y[0] - A.last.y ) * ( y[0] - A.last.y ) ) ) * bj_RADTODEG, ( yaw - A.lastYaw ) * bj_RADTODEG * 10.00 )
    call SetSpecialEffectOrientation( A.eff1, yaw * bj_RADTODEG, Atan2( z[0] - A.last.z, SquareRoot( ( x[0] - A.last.x ) * ( x[0] - A.last.x ) + ( y[0] - A.last.y ) * ( y[0] - A.last.y ) ) ) * bj_RADTODEG, ( yaw - A.lastYaw ) * bj_RADTODEG * 10.00 )
    
    call GroupEnumUnitsInRange( TempGroup, x[0], y[0], 250.00, null ) // радиус + макс коллизия юнитов (200)
    
    loop
        set u = FirstOfGroup( TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( TempGroup, u )
        
        if IsUnitInRangeXY( u, x[0], y[0], 50.00 ) then // радиус
            if IsUnitAlive( u ) and IsUnitEnemy( u, GetOwningPlayer( A.attacker ) ) and not IsUnitType( u, UNIT_TYPE_FLYING ) then
                set z[1] = GetUnitFlyHeight( u ) + GetAxisZ( GetUnitX( u ), GetUnitY( u ) )
                
                if z[0] <= z[1] + 120.00 and z[0] >= z[1] - 120.00 then // ловля разницы по высоте между снарядом и потенциальной целью
                    call UnitDamageTarget( A.attacker, u, 20.00, false, false, null, null, null ) // урон
                    set A.time = 1.00
                    call GroupClear( TempGroup )
                endif
            endif
        endif
    endloop
    
    if A.time >= 1.00 then
        call PauseTimer( A.t )
        call FlushChildHashtable( H, GetHandleId( A.t ) )
        call DestroyTimer( A.t )
        
        // эффект при уничтожении снаряда
        set bj_lastCreatedEffect = AddSpecialEffect( "Abilities\\Spells\\Undead\\OrbOfDeath\\AnnihilationMissile.mdl", x[0], y[0] )
        call SetSpecialEffectZ( bj_lastCreatedEffect, z[0] )
        call DestroyEffect( bj_lastCreatedEffect )
        //====
        
        call DestroyEffect( A.eff )
        call DestroyEffect( A.eff1 )
        
        set i = 0
        
        loop
            call A.l[i].destroy( )
            
            set i = i + 1
            exitwhen i >= 5
        endloop
        
        call A.last.destroy( )
        
        set A.t = null
        set A.attacker = null
        set A.eff = null
        set A.eff1 = null
        call A.destroy( )
    else
        set A.last.x = x[0]
        set A.last.y = y[0]
        set A.last.z = z[0]
        set A.lastYaw = yaw
    endif
endfunction

function Trig_Melee_Initialization_Actions takes nothing returns nothing
    local mystruct A
    local real x
    local real y
    local real xx
    local real yy
    local real d
    local real a
    local integer i
    
    if GetRandomInt( 0, 100 ) <= 100 then // шанс
        set x = GetUnitX( GetTriggerProjectileSource(  ) )
        set y = GetUnitY( GetTriggerProjectileSource( ) )
        set xx = GetProjectileTargetX( GetTriggerProjectile( ) )
        set yy = GetProjectileTargetY( GetTriggerProjectile( ) )
        set d = SquareRoot( ( x - xx ) * ( x - xx ) + ( y - yy ) * ( y - yy ) )
        set a = Atan2( yy - y, xx - x )
        set i = 10 // количество снарядов
        
        loop
            exitwhen i <= 0
            set i = i - 1
            
            set A = mystruct.create( )
            set A.t = CreateTimer( )
            set A.attacker = GetTriggerProjectileSource( )
            set A.l[0] = vector.create( x, y, GetAxisZ( x, y ) + GetUnitFlyHeight( A.attacker ) )
            
            set A.l[4] = vector.create( xx + GetRandomReal( -50.00 - d * 0.10, 50.00 + d * 0.10 ), yy + GetRandomReal( -50.00 - d * 0.10, 50.00 + d * 0.10 ), 0.00 ) // разброс у конечной точки (50 минимум оффсет + дистанция * 0.10)
            set A.l[4].z = GetAxisZ( A.l[4].x, A.l[4].y ) + GetRandomReal( 10.00, 30.00 )
            
            // точки нестабильного полёта снарядов
            set A.l[1] = vector.create( x + d * 0.25 * Cos( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), y + d * 0.25 * Sin( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), d * GetRandomReal( 0.05, 0.10 ) )
            set A.l[1].z = A.l[1].z + ( A.l[4].z - A.l[0].z ) * 0.50
            
            set A.l[2] = vector.create( x + d * 0.50 * Cos( a ) + GetRandomReal( -d * 0.50, d * 0.50 ), y + d * 0.40 * Sin( a ) + GetRandomReal( -d * 0.50, d * 0.50 ), d * GetRandomReal( 0.10, 0.20 ) )
            set A.l[2].z = A.l[2].z + ( A.l[4].z - A.l[0].z ) * 0.50
            
            set A.l[3] = vector.create( x + d * 0.75 * Cos( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), y + d * 0.50 * Sin( a ) + GetRandomReal( -d * 0.25, d * 0.25 ), d * GetRandomReal( 0.02, 0.5 ) )
            set A.l[3].z = A.l[3].z + ( A.l[4].z - A.l[0].z ) * 0.50
            //======
            
            set A.last = vector.create( x, y, A.l[0].z )
            set A.lastYaw = a
            
            set A.eff = AddSpecialEffect( "Abilities\\Weapons\\SentinelMissile\\SentinelMissile.mdl", A.l[0].x, A.l[0].y ) // модели снарядов
            set A.eff1 = AddSpecialEffect( "Abilities\\Spells\\Undead\\DevourMagic\\DevourMagicBirthMissile.mdl", A.l[0].x, A.l[0].y )
            
            call SetSpecialEffectAnimation( A.eff, "birth" )
            call QueueSpecialEffectAnimation( A.eff, "stand" )
            call SetSpecialEffectAnimation( A.eff1, "birth" )
            call QueueSpecialEffectAnimation( A.eff1, "stand" )
            
            set A.time = 0.00
            set A.timeMax = d / GetRandomReal( 900.00, 1100.00 ) // скорость полёта снарядов (рандомная от 900 до 1100 )
            call SaveInteger( H, GetHandleId( A.t ), 0, A )
            
            call TimerStart( A.t, 0.03125, true, function Move )
        endloop
    endif
endfunction

//===========================================================================
function cond takes nothing returns boolean
    return GetUnitAbilityLevel( GetTriggerProjectileSource( ), 'A000' ) > 0 // абилка пустышка у атакующего
endfunction

function InitTrig_Melee_Initialization takes nothing returns nothing
    set gg_trg_Melee_Initialization = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Melee_Initialization, EVENT_PLAYER_UNIT_PROJECTILE_LAUNCH )
    call TriggerAddCondition( gg_trg_Melee_Initialization, Condition( function cond ) )
    call TriggerAddAction( gg_trg_Melee_Initialization, function Trig_Melee_Initialization_Actions )
endfunction
endlibrary
28

» WarCraft 3 / Заклинания на заказ

ShadowNinja, единственная сложность для меня это математические подсчёты, костыли тут вообще не при чём и их не будет, просто при ивенте получения урона проверить наличие абилки у атакующего и дальше pure mathematic, с которой я не дружу и потому трачу несколько часов на выдумывание формулы. хотя сейчас с наличием нейронок думаю это быстро должно решаться, просто спелл не самый интересный)0)09
28

» WarCraft 3 / у меня есть моделика распира барагана почему то когда игрок…

я тоже с этим сталкивался и с этим походу ничего не сделать неважно как там перерассчитать границы, хоть на всю карту тыкни, если центр модели за пределами обзора, то модель не отображается, но судя по коммам, можно попробовать дать декорации (doodad) эту модельку и будет норм
28

» WarCraft 3 / Заклинания на заказ

я если что понимаю что большинство заказов могут быть уже не актуальны и кто-то вообще варкрафт забросил, но мне всё равно)0))
28

» WarCraft 3 / Заклинания на заказ

Заказ выполнен

Заклинание готово!

ОТВЕЧАЮ СПУСТЯ ГОД УРААААААААААААААААА
(просто по компику в архивах копался, увидел карту и решил доделать-переделать, там фигня в принципе)
инструкция по импорту
скопировать папку Initialization и вставить в свою карту, перекопировать нестандартное ро и вставить в свою карту
в триггере Untitled Trigger 001 настроить всё, что помечено комментарием, на своё усмотрение, остальное требует минимальных знаний джасса

код

Untitled Trigger 001
function Create takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local real time = LoadReal( udg_H, i, 4 ) - 0.01
    local real d = LoadReal( udg_H, i, 2 )
    local real dm = LoadReal( udg_H, i, 3 )
    local real a = LoadReal( udg_H, i, 1 )
    local real s = LoadReal( udg_H, i, 7 )
    local real x = LoadReal( udg_H, i, 5 )
    local real y = LoadReal( udg_H, i, 6 )
    local real xx = x
    local real yy = y
    local real dd = 0.00
    local unit u
    local group g = LoadGroupHandle( udg_H, i, 9 )
    local player p = LoadPlayerHandle( udg_H, i, 8 )
    
    
    if d <= dm then
        // создание луча
        set bj_lastCreatedUnit = CreateUnit( p, 'u000', x + d * Cos( a ), y + d * Sin( a ), a * bj_RADTODEG )
        call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
        call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
        call GroupAddUnit( g, bj_lastCreatedUnit )
        call SaveReal( udg_H, GetHandleId( bj_lastCreatedUnit ), 0, d )
        call SetUnitScale( bj_lastCreatedUnit, 0.20, 0.20, 0.20 )
        //=======
        
        call SaveReal( udg_H, i, 2, d + s )
    endif
    
    loop
        exitwhen dd >= d
        set dd = dd + s
        
        set xx = xx + s * Cos( a )
        set yy = yy + s * Sin( a )
        
        call GroupEnumUnitsInRange( udg_TempGroup, xx, yy, 250.00, null ) // радиус с учётом макс коллизии (+200.00)
        
        loop
            set u = FirstOfGroup( udg_TempGroup )
            exitwhen u == null
            call GroupRemoveUnit( udg_TempGroup, u )
            
            if IsUnitInRangeXY( u, xx, yy, 50.00 ) then // радиус
                if not IsUnitType( u, UNIT_TYPE_DEAD ) and IsUnitEnemy( u, p ) then
                    call UnitDamageTarget( LoadUnitHandle( udg_H, i, 0 ), u, 5.00, false, false, null, null, null ) // урон
                    call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Orc\\Purge\\PurgeBuffTarget.mdl", u, "origin" ) ) // эффект при попадании
                    
                    set d = dd
                    call SaveReal( udg_H, i, 2, d )
                    call GroupClear( udg_TempGroup )
                    
                    set bj_groupAddGroupDest = udg_TempGroup_1
                    call ForGroup( g, function GroupAddGroupEnum )
                    
                    loop
                        set u = FirstOfGroup( udg_TempGroup_1 )
                        exitwhen u == null
                        call GroupRemoveUnit( udg_TempGroup_1, u )
                        
                        if LoadReal( udg_H, GetHandleId( u ), 0 ) >= d then
                            call KillUnit( u )
                            call RemoveSavedReal( udg_H, GetHandleId( u ), 0 )
                            call GroupRemoveUnit( g, u )
                            
                            // эффект уничтожения луча если кто-то попался по пути
                            set bj_lastCreatedUnit = CreateUnit( p, 'u002', GetUnitX( u ), GetUnitY( u ), GetRandomReal( 0.00, 360.00 ) )
                            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
                            call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
                            call SetUnitScale( bj_lastCreatedUnit, 0.50, 0.50, 0.50 )
                            call SetUnitAnimation( bj_lastCreatedUnit, "death" )
                            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 1.00 )
                            //============
                        endif
                    endloop
                endif
            endif
        endloop
    endloop
    
    if time <= 0.00 then
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( udg_H, i )
        
        loop
            set u = FirstOfGroup( g )
            exitwhen u == null
            call GroupRemoveUnit( g, u )
            
            call KillUnit( u )
            
            // эффект при уничтожении луча
            set bj_lastCreatedUnit = CreateUnit( p, 'u001', GetUnitX( u ), GetUnitY( u ), GetRandomReal( 0.00, 360.00 ) )
            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
            call SetUnitFlyHeight( bj_lastCreatedUnit, 50.00, 0.00 )
            call SetUnitScale( bj_lastCreatedUnit, 0.50, 0.50, 0.50 )
            call SetUnitAnimation( bj_lastCreatedUnit, "death" )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            //=====
        endloop
        
        call DestroyGroup( g )
    else
        call SaveReal( udg_H, i, 4, time )
    endif
    
    set t = null
    set g = null
endfunction

function Trig_Untitled_Trigger_001_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local integer i = GetHandleId( t )
    local unit caster = GetTriggerUnit( )
    local real x = GetUnitX( caster )
    local real y = GetUnitY( caster )
    local real xx = GetSpellTargetX( )
    local real yy = GetSpellTargetY( )
    local real a = Atan2( yy - y, xx - x )
    
    call SaveUnitHandle( udg_H, i, 0, caster )
    call SaveReal( udg_H, i, 1, a )
    call SaveReal( udg_H, i, 2, 100.00 ) // дистанция от кастера
    call SaveReal( udg_H, i, 3, 1100.00 ) // макс дистанция + дистанция от кастера
    call SaveReal( udg_H, i, 4, 4.00 ) // время существования
    call SaveReal( udg_H, i, 5, x )
    call SaveReal( udg_H, i, 6, y )
    call SaveReal( udg_H, i, 7, 20.00 ) // скорость полёта (время до макс длины = 1000.00 / 2000.00 (т.е. 20.00 / периодичность таймера) = 0.50 сек)
    call SavePlayerHandle( udg_H, i, 8, GetOwningPlayer( caster ) )
    call SaveGroupHandle( udg_H, i, 9, CreateGroup( ) )
    
    call TimerStart( t, 0.01, true, function Create )
    
    set t = null
    set caster = null
endfunction

//===========================================================================

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

function InitTrig_Untitled_Trigger_001 takes nothing returns nothing
    set gg_trg_Untitled_Trigger_001 = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Untitled_Trigger_001, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_Untitled_Trigger_001, Condition( function Trig_Untitled_Trigger_001_Conditions ) )
    call TriggerAddAction( gg_trg_Untitled_Trigger_001, function Trig_Untitled_Trigger_001_Actions )
endfunction

28

» WarCraft 3 / Метеор

makkad, эффектами я занимался. С Драгонлором было бы ещё круче, потому что при взрыве видно низкополигональные мэши из-за огромного масштабирования + использования стандартных эффектов вара. И насчёт песни ты прав, она мало кому зайдёт, но я был именно ей вдохновлён и именно под неё у меня всё крутилось в голове ещё до того, как я попросил у Драгонлора сделать ландшафт с динозавриками)
по хорошему надо было бы просто заново поработать с камерами и спрятать много варкрафтовских проблем а-ля кривого освещения, внезапного пропадания/появление объектов в камере и резкого дергания юнитов при повороте во время бега, но я это понял уже на половину законченном эдите, когда уже не готов был заново всё переписывать и переснимать, ведь там в придачу не с первой съёмки все звуки и эффекты проигрывались и я сильно психовал с этого, пока не понял, что нужно просто несколько раз мапу перезапустить. Обожаю варкрафт, мня </3
28

» Блог им. rsfghd / Новый мусор, ура!

AnimoMori, хы, это было 5 лет назад думаешь я бы не переделал это с нуля если бы захотел?)
но впрочем спасибо что увлёкся, я поржал <3
28

» WarCraft 3 / Заклинания на заказ

LastUchiha, список создавать и по индексу проводить манипуляции. Сегодня, возможно, уже доделаю