Классика, Melee, игра на развитие, 1v1 .
Карта
5 2.1K
Существует специальная тема Способности и алгоритмы на заказ, где любой желающий может помочь с вашими фантазиями и где я тоже иногда зависаю. Кроме того, есть платные заказы, например, можете обратиться к Hate - Заклинания на заказ для Warcraft 3 (Платные) или поискать ещё темы на сайте
Я хочу развивать своё резюме, поэтому можете оставлять заявки и там, и тут. Имейте ввиду, заказы я выполняю бесплатно, на чистом энтузиазме, трачу на это своё свободное время, поскольку воспринимаю это как хобби, всё выполняю при возможности и желании
142 1.4K
28
Заказ выполнен

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

Способность выполнена на 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
ShadowNinja, единственная сложность для меня это математические подсчёты, костыли тут вообще не при чём и их не будет, просто при ивенте получения урона проверить наличие абилки у атакующего и дальше pure mathematic, с которой я не дружу и потому трачу несколько часов на выдумывание формулы. хотя сейчас с наличием нейронок думаю это быстро должно решаться, просто спелл не самый интересный)0)09
28
я если что понимаю что большинство заказов могут быть уже не актуальны и кто-то вообще варкрафт забросил, но мне всё равно)0))
28
Заказ выполнен

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

ОТВЕЧАЮ СПУСТЯ ГОД УРААААААААААААААААА
(просто по компику в архивах копался, увидел карту и решил доделать-переделать, там фигня в принципе)
инструкция по импорту
скопировать папку 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

пока центор модели не засветить камера модели не появица мне надо это убрать
Вопрос
9 109
28
я тоже с этим сталкивался и с этим походу ничего не сделать неважно как там перерассчитать границы, хоть на всю карту тыкни, если центр модели за пределами обзора, то модель не отображается, но судя по коммам, можно попробовать дать декорации (doodad) эту модельку и будет норм
Огромный пак лесных троллей, из которых можно сделать целую игровую расу. В архиве 15 моделей, а на каждую модель есть еще три вариации.
__Обновлено__: добавил по три вариации двух моделей героев троллей.
Модель
19 5.5K
2
Жаль, что не все модели с картинок здесь. Очень хотелось тролля с нетопырём и героев, но их нету, жаль, однако(
Пожалуйста помогите. Сегодня во время того, когда я делал на своей карте кастомные расы у меня в один миг перестали работать модели зданий одной из раз из одного поста. Раньше помогало, когда я просто скачивал те же модели с поста, как бы меняя их ID на новый и всё чинилось. Сейчас же даже на новой и чистой карте…
Вопрос
8 91
2
konvan5, А, понял. Просто например когда скачиваю модель для юнита, то достаточно скачать лишь модель, ну и по желанию .blp для иконки. Я так понимаю т.к. там используют оригинальные текстуры из игры перемешанные.

Слева направо: Обычная атака, Стрелковая атака, Магическая атака, Осадная атака, Атака героя, Сила тьмы.
2D Арт
2 10K
14
Я думаю тут не нужен улучшенный вариант, я помню как-то пытался найти иконку тяжёлой брони так и не нашёл,что на хайве, что на хгме. Люто повезло что вовремя Stormrage123 залил большое спасибо.