Добавлен , опубликован
Существует специальная тема Способности и алгоритмы на заказ, где любой желающий может помочь с вашими фантазиями и где я тоже иногда зависаю. Кроме того, есть платные заказы, например, можете обратиться к Hate - Заклинания на заказ для Warcraft 3 (Платные) или поискать ещё темы на сайте
Я хочу развивать своё резюме, поэтому можете оставлять заявки и там, и тут. Имейте ввиду, заказы я выполняю бесплатно, на чистом энтузиазме, трачу на это своё свободное время, поскольку воспринимаю это как хобби, всё выполняю при возможности и желании
раскрыть
Я не буду вливаться в ваши проекты и не принимаю деньги, для этого есть платные темы. Авторство или упоминания меня в карте делать не нужно, ибо я буду менять ник. Если появится желание отблагодарить - лайка достаточно
Могу сделать анонимно заклинание, для этого можно обратиться ко мне в личку, но меня расстроит невозможность поделиться им, если оно интересное
Отдаю приоритет именно способностям, алгоритмы/системы, вроде 3д камеры/физики, меня особо не интересуют, да и не всё умею, и не за все заказы возьмусь, не стоит ожидать от меня движущихся птиц и чайники на молниях, матрицу не изучал и с математикой не дру
Работаю на 1.26, могу воспользоваться UjAPI, при создании спелла для рефа
Для меня предпочтительнее пользоваться вджассом, но могу сделать заклинание на чистом джассе и даже гуи, однако имейте ввиду, гуи может многократно усложнить работу, ибо на нём может не хватать функционала для создания вашего спелла. Есть вариант скрестить джасс с гуи, пользуясь TriggerEvaluate

Форма составления заявки

При создании заявки не забудьте указать тип комментария Заказ на работу
# Заказ
**Название:** Название способности (опционально, если заказ один)
**Метод:** GUI/Jass/cJass/vJass/Zinc
**Версия Warcraft III:** Версия варкрафта для этого заказа
**Техническое описание:** Распишите механику способности в деталях
Заявки оставлять в комментариях под этим ресурсом
раскрыть
Название - можно любое указать, вплоть до символа, это поможет в навигации по мере сдачи работ. Не нужно указывать, если в заказе только одна способность, работа сдаётся в ответах под заказом
Метод - выберите для себя комфортный метод, на котором будет выполнена способность. При методе кодом, я укажу комментариями где нужно будет что-то отредактировать. Комфортные для меня методы в порядке убывания: vJass > Jass > cJass > Zinc > GUI
Версия Warcraft III - на определённых версиях не доступен мемхак и сджасс. Чтобы взять ориентир на рефорджед, могу воспользоваться UjAPI. Это необходимо для специфических заказов, к примеру, повышение бонусной силы атаки, где на старых версиях требуется мемхак/южапи/костыли/база данных, а на более новых для этого присутствуют нативки
Техническое описание - укажите что должна делать ваша способность, например:
1 уровень: выпускается волна в точку каста
2 уровень: 2 волны в точку каста с разницей в 20 градусов по бокам
3 уровень: 5 волн, одна посередине и по 2 по бокам с разницей в 10 градусов
Каждая волна движется со скоростью 2000 и дальностью 1000. Радиус поражения 200 и с каждым уровнем увеличивается на 50 вместе с размером волны. Я хочу наносить урон юнитам самостоятельно, на гуи, с помощью TriggerEvaluate, мне нужны будут переменные применяющего юнита и уровень его способности на момент каста абилки, оставь пример нанесения урона с использованием этих переменных
Красивое форматирование приветствуется

Примеры работ

Всё у меня в ресурсах: xgm.guru/u/rsfghd
`
ОЖИДАНИЕ РЕКЛАМЫ...
4
Видимо это тема всё уже... А может и нет.
Но всё же: Спелл. Нужно что бы при атаке с 20% шанс герой (дальнего боя) выпускал 10 ракет (каждая из которых наносит 50 ед урона). Туда, куда он атакует (ну или приблизительно). И чтобы ракеты задевали все цели, на которые они попадут, кроме воздушных (т.е. если по пути стоит юнит и одна из ракет его заденет не долетев до точки, то взорвётся и нанесёт ему урон).
И что бы можно было настраивать, то 10 ракет вылетает, то 1 и тд.
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
Этот комментарий удален
17
Заказ на работу
Название: Chidori Eiso
Метод: Jass
Версия Warcraft III: 1.26
Техническое описание: При применении способности появляется лазер, если сталкивается с целью - останавливается, если цель покинула область соприкосновения так сказать - продолжает лететь, пока длина лазера на достигнет 1000. Длительность 4 секунды, полную длину должен набирать за 0.5 секунды, т.е. остальные 3.5 сек просто на месте висит, никуда не летит, дамажит если кто-то его касается, урон и прочая инфа - без разницы, всё равно потом менять.
Должен быть сделан не через эффект молнии, а через даммиков, тут кнш проблемка, нету даммика с анимкой расстяжение, по этому прикреплю обычный лазер.
Загруженные файлы
12
LastUchiha, автор больше не выполняет заказы, он ничего никому в последнее время не отвечает. Так что с лазером тебе придётся в другое место идти)
28
FIRERANGER, лол, у меня уведомления не приходили либо затерялись в куче остальных, ну и что грешить, я в лоле зависал с новым компом. Заскучал за этой игрой. Завтра начну потихоньку выполнять заказы
28
LastUchiha, список создавать и по индексу проводить манипуляции. Сегодня, возможно, уже доделаю
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

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