Добавлен , опубликован
Существует специальная тема Способности и алгоритмы на заказ, где любой желающий может помочь с вашими фантазиями и где я тоже иногда зависаю. Кроме того, есть платные заказы, например, можете обратиться к 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
Заказ на работу
Пассивный спелл для определённой модели
Нашёл я на просторах Хайва такую модель, и у неё есть анимация Spell Slam.
Он стреляет перед собой лазерами вот так
Так вот, спелл такой: есть 20% что при каждом выстреле проиграется такая анимация и этот зелёный лазер нанесёт 150 ед урона всем наземным врагам! Именно что бы лазер попал по врагу, как в анимации. Если это возможно, т.е. под кораблём он никого не должен задамажить, а только там где лазер пройдёт (ну или примерно). Притом сама атака тоже должна пройти (помимо этого спелла).
Ну или это будет вместо атаки, если так не получится норм сделать!
Ну или примерно сделать как получится для этой анимации Spell Slam, но спелл должен быть пассивный, а не активный т.к. таких кораблей может быть много
Модельку и картинку прилагаю!
Загруженные файлы
Ответы (11)
28
Выполнение заказа

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

я немного не понял нужен ли учёт сферических координат, если корабль только по наземным должен дамажить, поэтому просто пихнул проверку, что юнит не летающий
на видосе 100% шанс срабатывания, пассивка срабатывает после получения урона противником, могу переделать под старт вылета снаряда либо при замахе
инструкция по импорту
скопировать папку Initialization и вставить в свою карту
в триггере DamageEvent:
78 строка - указать абилку и шанс такой атаки (абилку выдать юнитам, что должны проводить эту атаку)
85 строка - начальный оффсет угла от взгляда атакующего
86 строка - скорость вращения лазеров
93 строка - через сколько секунд появляются лазеры после начала проигрывания анимки Spell Slam
21-24 строки - оффсеты для лазеров
30 строка - радиус вокруг атакующего
38 строка - ширина лазера (32.00)
47, 49-52 строки - шаг лазера (чем больше тем менее точно, но более оптимизировано, лучше не ставить больше радиуса лазера)
48 строка - дальность лазера
54-55 - эффекты, использовал по сути как дебаг для ориентации скорости, оффсета и угла лазеров, можно удалить строки
58 - максимальный угол лазеров
71 - периодичность таймера (чем больше, тем оптимизированнее и менее точно, при изменении этой строки на 86 строке (0.05) тоже изменить периодичность)
делал на южапи

Код

AllGlobals
library AllGlobalsLib
globals
    constant hashtable H = InitHashtable( )
    constant real UNIT_MAX_COLLISION = 200.00
endglobals

native UnitAlive takes unit id returns boolean

//===========================================================================
//function InitTrig_AllGlobals takes nothing returns nothing
    //set gg_trg_AllGlobals = CreateTrigger(  )
//endfunction
endlibrary

DamageEvent
library DamageEventLib
globals
    private constant group TempGroup = CreateGroup( )
endglobals

private struct SpellS
    timer t
    unit caster
    player p
    group g
    real angle
    real speed
endstruct

private function Damage takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real d = 0.00 
    local real a = GetUnitFacing( A.caster ) * bj_DEGTORAD
    local real x = GetUnitX( A.caster )
    local real y = GetUnitY( A.caster )
    local real x1 = x + 125.00 * Cos( a + bj_PI * 0.30 )
    local real y1 = y + 125.00 * Sin( a + bj_PI * 0.30 )
    local real x2 = x + 125.00 * Cos( a - bj_PI * 0.30 )
    local real y2 = y + 125.00 * Sin( a - bj_PI * 0.30 )
    local unit u
    
    call GroupEnumUnitsInRange( TempGroup, x, y, 400.00 + UNIT_MAX_COLLISION, null )
    
    set A.angle = A.angle + A.speed
    
    loop
        loop
            set u = GroupForEachUnit( TempGroup )
            exitwhen u == null
            
            if not IsUnitInGroup( u, A.g ) then
                if IsUnitInRangeXY( u, x1, y1, 32.00 ) or IsUnitInRangeXY( u, x2, y2, 32.00 )then
                    if UnitAlive( u ) and IsUnitEnemy( u, A.p ) and not IsUnitType( u, UNIT_TYPE_FLYING ) then
                        call GroupAddUnit( A.g, u )
                        call UnitDamageTarget( A.caster, u, 150.00, false, false, null, null, null )
                    endif
                endif
            endif
        endloop
        
        set d = d + 32.00
        exitwhen d >= 200.00
        set x1 = x1 + 32.00 * Cos( a + A.angle )
        set y1 = y1 + 32.00 * Sin( a + A.angle )
        set x2 = x2 + 32.00 * Cos( a - A.angle )
        set y2 = y2 + 32.00 * Sin( a - A.angle )
        
        call DestroyEffect( AddSpecialEffect( "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", x1, y1 ) )
        call DestroyEffect( AddSpecialEffect( "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", x2, y2 ) )
    endloop
    
    call GroupClear( TempGroup )
    
    if A.angle * bj_RADTODEG >= 120.00 or not UnitAlive( A.caster ) then
        call PauseTimer( A.t )
        call DestroyTimer( A.t )
        call FlushChildHashtable( H, GetHandleId( A.t ) )
        
        call SetUnitStunned( A.caster, false )
        call DestroyGroup( A.g )
        
        set A.t = null
        set A.g = null
        set A.caster = null
        call A.destroy( )
    else
        call TimerStart( A.t, 0.05, false, function Damage )
    endif
endfunction

private function DamageEvent_Actions takes nothing returns nothing
    local SpellS A
    
    if GetUnitAbilityLevel( GetEventDamageSource( ), 'A000' ) > 0 and GetEventIsAttack( ) and GetRandomInt( 1, 100 ) <= 20 then
        set A = SpellS.create( )
        
        set A.t = CreateTimer( )
        set A.caster = GetEventDamageSource( )
        set A.p = GetOwningPlayer( A.caster )
        set A.g = CreateGroup( )
        set A.angle = 60.00 * bj_DEGTORAD
        set A.speed = 60.00 / 0.75 * 0.05 * bj_DEGTORAD
        
        call SetUnitStunned( A.caster, true )
        call SetUnitAnimation( A.caster, "spell slam" )
        call QueueUnitAnimation( A.caster, "stand" )
        
        call SaveInteger( H, GetHandleId( A.t ), 0, A )
        call TimerStart( A.t, 0.25, false, function Damage )
    endif
endfunction

//===========================================================================
function InitTrig_DamageEvent takes nothing returns nothing
    set gg_trg_DamageEvent = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_DamageEvent, EVENT_PLAYER_UNIT_DAMAGED )
    call TriggerAddAction( gg_trg_DamageEvent, function DamageEvent_Actions )
endfunction
endlibrary

Загруженные файлы
12
rsfghd, крутой спелл... А можно его для Reforget версии? А то он на ней не работает (ошибку выписывает)
28
FIRERANGER, скрин ошибки нужен, я просто названия функций не знаю на рефе, но скорее будет жаловаться только на GetEventIsAttack( ) где нужно добавить Blz вначале названия функции
12
rsfghd, вот такие ошибки... Какие-то непонятные! Хотелось бы этот спелл в свою карту в рефоржете
Загруженные файлы
12
rsfghd, да точно... Забыл что эта галочка в каждой новой карте слетает.
Только теперь такая ошибка! Можешь плз пофиксить для рефа?
Загруженные файлы
28
FIRERANGER, добавь приставки Blz к каждой из функций, что показывает тебе ошибка. То есть не SetUnitStunned а BlzSetUnitStunned и всё заработает (если эти функции там есть конечно, иначе действительно придется переписывать некоторые моменты и добавить систему стана)
12
rsfghd, к сожалению нет... Эти 3 ошибки остались... Можешь под реф переделать спелл плз?
А то получается что любая карта с этим спелом на рефе не пойдёт. Хотя большинство старых карт идут хорошо
28
Вышла новая версия! Прокрутить к ресурсу
FIRERANGER, убрал GroupForEachUnit и воспользовался обычным FirstOfGroup, заменил SetUnitStunned на BlzPauseUnitEx
DamageEvent
library DamageEventLib
globals
    private constant group TempGroup = CreateGroup( )
endglobals

private struct SpellS
    timer t
    unit caster
    player p
    group g
    real angle
    real speed
endstruct

private function Damage takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real d = 0.00 
    local real a = GetUnitFacing( A.caster ) * bj_DEGTORAD
    local real x = GetUnitX( A.caster )
    local real y = GetUnitY( A.caster )
    local real x1 = x + 125.00 * Cos( a + bj_PI * 0.30 )
    local real y1 = y + 125.00 * Sin( a + bj_PI * 0.30 )
    local real x2 = x + 125.00 * Cos( a - bj_PI * 0.30 )
    local real y2 = y + 125.00 * Sin( a - bj_PI * 0.30 )
    local unit u
    
    set A.angle = A.angle + A.speed
    
    loop
        call GroupEnumUnitsInRange( TempGroup, x, y, 400.00 + UNIT_MAX_COLLISION, null )
        
        loop
            set u = FirstOfGroup( TempGroup )
            exitwhen u == null
            call GroupRemoveUnit( TempGroup, u )
            
            if not IsUnitInGroup( u, A.g ) then
                if IsUnitInRangeXY( u, x1, y1, 32.00 ) or IsUnitInRangeXY( u, x2, y2, 32.00 )then
                    if UnitAlive( u ) and IsUnitEnemy( u, A.p ) and not IsUnitType( u, UNIT_TYPE_FLYING ) then
                        call GroupAddUnit( A.g, u )
                        call UnitDamageTarget( A.caster, u, 150.00, false, false, null, null, null )
                    endif
                endif
            endif
        endloop
        
        set d = d + 32.00
        exitwhen d >= 200.00
        set x1 = x1 + 32.00 * Cos( a + A.angle )
        set y1 = y1 + 32.00 * Sin( a + A.angle )
        set x2 = x2 + 32.00 * Cos( a - A.angle )
        set y2 = y2 + 32.00 * Sin( a - A.angle )
        
        call DestroyEffect( AddSpecialEffect( "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", x1, y1 ) )
        call DestroyEffect( AddSpecialEffect( "Abilities\\Weapons\\IllidanMissile\\IllidanMissile.mdl", x2, y2 ) )
    endloop
    
    if A.angle * bj_RADTODEG >= 120.00 or not UnitAlive( A.caster ) then
        call PauseTimer( A.t )
        call DestroyTimer( A.t )
        call FlushChildHashtable( H, GetHandleId( A.t ) )
        
        call BlzPauseUnitEx( A.caster, false )
        call DestroyGroup( A.g )
        
        set A.t = null
        set A.g = null
        set A.caster = null
        call A.destroy( )
    else
        call TimerStart( A.t, 0.05, false, function Damage )
    endif
endfunction

private function DamageEvent_Actions takes nothing returns nothing
    local SpellS A
    
    if GetUnitAbilityLevel( GetEventDamageSource( ), 'A000' ) > 0 and BlzGetEventIsAttack( ) and GetRandomInt( 1, 100 ) <= 100 then
        set A = SpellS.create( )
        
        set A.t = CreateTimer( )
        set A.caster = GetEventDamageSource( )
        set A.p = GetOwningPlayer( A.caster )
        set A.g = CreateGroup( )
        set A.angle = 60.00 * bj_DEGTORAD
        set A.speed = 60.00 / 0.75 * 0.05 * bj_DEGTORAD
        
        call BlzPauseUnitEx( A.caster, true )
        call SetUnitAnimation( A.caster, "spell slam" )
        call QueueUnitAnimation( A.caster, "stand" )
        
        call SaveInteger( H, GetHandleId( A.t ), 0, A )
        call TimerStart( A.t, 0.25, false, function Damage )
    endif
endfunction

//===========================================================================
function InitTrig_DamageEvent takes nothing returns nothing
    set gg_trg_DamageEvent = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_DamageEvent, EVENT_PLAYER_UNIT_DAMAGED )
    call TriggerAddAction( gg_trg_DamageEvent, function DamageEvent_Actions )
endfunction
endlibrary


стоит 100% шанс, как изменить я уже описывал выше
Загруженные файлы
1

Заказ

Название: Название способности (опционально, если заказ один)
Метод: JASS/vJASS
Версия Warcraft III: Любая версия
Загруженные файлы
Ответы (6)
28
UndeadFisher, на стандартных эффектах это будет менее эффектно выглядеть, но попробую что-нибудь придумать
28
Выполнение заказа

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

инструкция по импорту
удалить триггеры ниже триггера Spell
скопировать папку Initialization и вставить в свою карту
указать равкод абилки на 367 строке триггера Spell
изменить строки 340-344 на свой вкус
всё остальное требует минимальных знаний джасса
сделано на южапи

Код

AllGlobals
library AllGlobalsLib
globals
    constant hashtable H = InitHashtable( )
    constant real UNIT_MAX_COLLISION = 200.00
endglobals

native UnitAlive takes unit id returns boolean

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
endlibrary

//===========================================================================
//function InitTrig_AllGlobals takes nothing returns nothing
    //set gg_trg_AllGlobals = CreateTrigger(  )
//endfunction

Spell
library SpellLib
globals
    private constant group TempGroup = CreateGroup( )
endglobals

private struct SpellS
    timer t
    unit caster
    effect e
    player p
    vector v
    vector l
    integer i
    group g
    
    real damage
    real speed
    real distance
    real time
    real radius
    handlelist effectList
    
    attacktype attackType
    damagetype damageType
    weapontype weaponType
endstruct

private function Move takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    
    if A.speed > A.distance then
        set A.speed = A.distance
    endif
    
    set A.distance = A.distance - A.speed
    
    set A.l.x = A.l.x + A.speed * A.v.x
    set A.l.y = A.l.y + A.speed * A.v.y
    set A.l.z = A.l.z + A.speed * A.v.z
    
    call SetSpecialEffectPositionWithZ( A.e, A.l.x, A.l.y, A.l.z )
    
    if A.distance <= 0.00 or A.l.z <= GetAxisZ( A.l.x, A.l.y ) + 32.00 then
        call PauseTimer( A.t )
        call FlushChildHashtable( H, GetHandleId( A.t ) )
        call DestroyTimer( A.t )
        
        call DestroyEffect( A.e )
        
        if A.i == 1 then
            call SetSpecialEffectVisible( A.e, false )
            
            set A.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", A.l.x, A.l.y )
            call SetSpecialEffectZ( A.e, A.l.z )
            call SetSpecialEffectOrientation( A.e, Atan2( A.v.y, A.v.x ) * bj_RADTODEG, 45.00, 0.00 )
            call SetSpecialEffectTimeScale( A.e, 2.00 )
            call DestroyEffect( A.e )
        endif
        
        set A.e = null
        set A.t = null
        call A.l.destroy( )
        call A.v.destroy( )
        call A.destroy( )
    endif
endfunction

private function Damage takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local unit u
    
    loop
        set u = FirstOfGroup( A.g )
        exitwhen u == null
        call GroupRemoveUnit( A.g, u )
        
        call SetUnitStunned( u, false )
        call SetUnitTimeScale( u, 1.00 )
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl", u, "chest" ) )
        
        call UnitDamageTarget( A.caster, u, A.damage, false, false, A.attackType, A.damageType, A.weaponType )
    endloop
    
    call PauseUnit( A.caster, false )
    
    set A.l.z = GetUnitFacing( A.caster ) * bj_DEGTORAD
    set A.l.x = A.l.x + 100.00 * Cos( A.l.z )
    set A.l.y = A.l.y + 100.00 * Sin( A.l.z )
    
    call DestroyEffect( A.e )
    
    set A.e = AddSpecialEffect( "Objects\\Spawnmodels\\Other\\NeutralBuildingExplosion\\NeutralBuildingExplosion.mdl", A.l.x, A.l.y )
    call DestroyEffect( A.e )
    
    loop
        call DestroyEffect( HandleListGetEffectByIndex( A.effectList, A.i ) )
        
        set A.i = A.i - 1
        exitwhen A.i < 0
    endloop
    
    call HandleListDestroy( A.effectList )
    
    call PauseTimer( A.t )
    call FlushChildHashtable( H, GetHandleId( A.t ) )
    call DestroyTimer( A.t )
    
    call DestroyGroup( A.g )
    
    set A.g = null
    set A.t = null
    set A.e = null
    set A.caster = null
    call A.l.destroy( )
    call A.destroy( )
endfunction

private function AddHitEffect takes nothing returns nothing
    local integer i = GetRandomInt( 0, 5 )
    
    if i == 0 then
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "chest" ) )
    elseif i == 1 then
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "head" ) )
    elseif i == 2 then
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "left hand" ) )
    elseif i == 3 then
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "right hand" ) )
    elseif i == 4 then
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "left foot" ) )
    else
        call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\LavaSpawnMissile\\LavaSpawnMissile.mdl", GetEnumUnit( ), "right foot" ) )
    endif
endfunction

private function SpawnEffects takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local SpellS B = SpellS.create( )
    local real a = GetRandomReal( -bj_PI, bj_PI )
    local integer i
    
    call ForGroup( A.g, function AddHitEffect )
    
    set B.t = CreateTimer( )
    
    set B.i = 0
    set B.l = vector.create( A.l.x + GetRandomReal( A.radius * 0.80, A.radius ) * Cos( a ), A.l.y + GetRandomReal( A.radius * 0.80, A.radius ) * Sin( a ), A.l.z + GetRandomReal( -900.00, 0.00 ) )
    set a = a + bj_PI + GetRandomReal( -bj_PI, bj_PI ) * 0.25
    set B.v = vector.create( A.l.x + GetRandomReal( A.radius * 0.80, A.radius ) * Cos( a ), A.l.y + GetRandomReal( A.radius * 0.80, A.radius ) * Sin( a ), 0.00 )
    set B.v.z = GetAxisZ( B.v.x, B.v.y ) + B.l.z + GetRandomReal( -400.00, 100.00 )
    set B.v.x = B.v.x - B.l.x
    set B.v.y = B.v.y - B.l.y
    set B.v.z = B.v.z - B.l.z
    
    set B.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", B.l.x, B.l.y )
    call SetSpecialEffectZ( B.e, B.l.z )
    call SetSpecialEffectOrientation( B.e, Atan2( B.v.y, B.v.x ) * bj_RADTODEG, Atan2( B.v.z, SquareRoot( B.v.x * B.v.x + B.v.y * B.v.y ) ) * bj_RADTODEG, 0.00 )
    call SetSpecialEffectTimeScale( B.e, 2.00 )
    call DestroyEffect( B.e )
    
    set B.e = AddSpecialEffect( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl", B.l.x, B.l.y )
    call SetSpecialEffectZ( B.e, B.l.z )
    call SetSpecialEffectOrientation( B.e, Atan2( B.v.y, B.v.x ) * bj_RADTODEG, Atan2( B.v.z, SquareRoot( B.v.x * B.v.x + B.v.y * B.v.y ) ) * bj_RADTODEG, 0.00 )
    call SetSpecialEffectAnimation( B.e, "stand" )
    call SetSpecialEffectScale( B.e, 0.50 )
    
    set B.distance = B.v.length( )
    call B.v.normalize( )
    
    set B.speed = B.distance / 0.15 * 0.01
    
    call SaveInteger( H, GetHandleId( B.t ), 0, B )
    call TimerStart( B.t, 0.01, true, function Move )
    
    set A.time = A.time - 0.05
    
    if A.time <= 0.00 then
        call SetUnitFlyHeight( A.caster, 0.00, 0.00 )
        call ShowUnit( A.caster, true )
        call SetUnitAnimation( A.caster, "stand ready" )
        call QueueUnitAnimationByIndex( A.caster, 3 )
        call QueueUnitAnimation( A.caster, "stand" )
        
        set i = 6
    
        loop
            set B = SpellS.create( )
            set B.t = CreateTimer( )
            
            set B.i = 0
            set B.l = vector.create( A.l.x + A.radius * Cos( a ), A.l.y + A.radius * Sin( a ), A.l.z )
            set B.v = vector.create( A.l.x, A.l.y, 0.00 )
            set B.v.z = GetAxisZ( B.v.x, B.v.y ) + 100.00
            set B.v.x = B.v.x - B.l.x
            set B.v.y = B.v.y - B.l.y
            set B.v.z = B.v.z - B.l.z
            
            set B.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", B.l.x, B.l.y )
            call SetSpecialEffectZ( B.e, B.l.z )
            call SetSpecialEffectOrientation( B.e, Atan2( B.v.y, B.v.x ) * bj_RADTODEG, Atan2( B.v.z, SquareRoot( B.v.x * B.v.x + B.v.y * B.v.y ) ) * bj_RADTODEG, 0.00 )
            call SetSpecialEffectTimeScale( B.e, 2.00 )
            call DestroyEffect( B.e )
            
            set B.e = AddSpecialEffect( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile_mini.mdl", B.l.x, B.l.y )
            call SetSpecialEffectZ( B.e, B.l.z )
            call SetSpecialEffectOrientation( B.e, Atan2( B.v.y, B.v.x ) * bj_RADTODEG, Atan2( B.v.z, SquareRoot( B.v.x * B.v.x + B.v.y * B.v.y ) ) * bj_RADTODEG, 0.00 )
            call SetSpecialEffectAnimation( B.e, "stand" )
            call SetSpecialEffectScale( B.e, 0.50 )
            
            set B.distance = B.v.length( )
            call B.v.normalize( )
            
            set B.speed = B.distance / 0.20 * 0.01
            
            call SaveInteger( H, GetHandleId( B.t ), 0, B )
            call TimerStart( B.t, 0.01, true, function Move )
            
            set i = i - 1
            exitwhen i <= 0
            set a = a - bj_PI / 6.00 * 2.00
        endloop
        
        call DestroyEffect( A.e )
        
        set A.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", A.l.x, A.l.y )
        call SetSpecialEffectYaw( A.e, GetUnitFacing( A.caster ) )
        call DestroyEffect( A.e )
        
        set A.e = AddSpecialEffectTarget( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl", A.caster, "weapon" )
        
        if GetLocalPlayer( ) == A.p then
            call ClearSelection( )
            call SelectUnit( A.caster, true )
        endif
        
        call TimerStart( A.t, 2.10, false, function Damage )
    endif
endfunction

private function JumpClones takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local SpellS B
    local integer i = 6
    local real a = -bj_PI
    local unit u
    
    call GroupEnumUnitsInRange( TempGroup, A.l.x, A.l.y, A.radius, null )
    
    loop
        set u = FirstOfGroup( TempGroup )
        exitwhen u == null
        call GroupRemoveUnit( TempGroup, u )
        
        if IsUnitInRangeXY( u, A.l.x, A.l.y, A.radius + UNIT_MAX_COLLISION ) then
            if UnitAlive( u ) and IsUnitEnemy( u, A.p ) then
                call GroupAddUnit( A.g, u )
                call SetUnitStunned( u, true )
                call SetUnitTimeScale( u, 0.00 )
            endif
        endif
    endloop
    
    call PauseUnit( A.caster, true )
    call ShowUnit( A.caster, false )
    
    set A.l.z = GetAxisZ( A.l.x, A.l.y ) + GetUnitFlyHeight( A.caster )
    
    set A.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", A.l.x, A.l.y )
    call SetSpecialEffectZ( A.e, A.l.z )
    call SetSpecialEffectYaw( A.e, GetUnitFacing( A.caster ) )
    call DestroyEffect( A.e )
    
    set A.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\Bloodlust\\BloodlustTarget.mdl", A.l.x, A.l.y )
    call SetSpecialEffectZ( A.e, A.l.z / 2.00 )
    call SetSpecialEffectTimeScale( A.e, 0.10 )
    call SetSpecialEffectScale( A.e, 50.00 )
    call SetSpecialEffectAlpha( A.e, 175 )
    
    loop
        set B = SpellS.create( )
        
        set B.t = CreateTimer( )
        
        set B.l = vector.create( A.l.x, A.l.y, A.l.z )
        set B.v = vector.create( Cos( a ), Sin( a ), Cos( bj_PI * 0.50 ) )
        
        set B.i = 1
        set B.speed = 40.00
        set B.distance = A.radius
        
        set B.e = AddSpecialEffect( "Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageMissile.mdl", B.l.x, B.l.y )
        call SetSpecialEffectZ( B.e, B.l.z )
        call SetSpecialEffectOrientation( B.e, a * bj_RADTODEG, 45.00, 0.00 )
        
        call SaveInteger( H, GetHandleId( B.t ), 0, B )
        call TimerStart( B.t, 0.01, true, function Move )
        
        set i = i - 1
        exitwhen i <= 0
        set a = a - bj_PI / 5.00
    endloop
    
    set A.radius = A.radius * 1.50
    set A.time = 2.00
    call TimerStart( A.t, 0.05, true, function SpawnEffects )
endfunction

private function Jump takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    
    if UnitAddAbility( A.caster, 'Arav' ) then
        call UnitRemoveAbility( A.caster, 'Arav' )
    endif
    
    call SetUnitFlyHeight( A.caster, 800.00, 800.00 / 0.20 )
    
    call DestroyEffect( A.e )
    
    set A.e = AddSpecialEffect( "Units\\NightElf\\Wisp\\WispExplode.mdl", A.l.x, A.l.y )
    call SetSpecialEffectAnimationOffsetPercent( A.e, 0.20 )
    call SetSpecialEffectTimeScale( A.e, 3.00 )
    call DestroyEffect( A.e )
    
    call TimerStart( A.t, 0.20, false, function JumpClones )
endfunction

private function Spell_Actions takes nothing returns nothing
    local SpellS A = SpellS.create( )
    local integer i
    local real a = GetRandomReal( -bj_PI, bj_PI )
    
    set A.t = CreateTimer( )
    set A.caster = GetTriggerUnit( )
    set A.p = GetOwningPlayer( A.caster )
    set A.l = vector.create( GetUnitX( A.caster ), GetUnitY( A.caster ), 0.00 )
    set A.g = CreateGroup( )
    set A.e = AddSpecialEffect( "Abilities\\Spells\\Undead\\DarkRitual\\DarkRitualTarget.mdl", A.l.x, A.l.y )
    call SetSpecialEffectScale( A.e, 2.00 )
    
    set A.damage = 200.00 // урон
    set A.radius = 600.00 // радиус
    set A.attackType = ATTACK_TYPE_CHAOS // тип атаки
    set A.damageType = DAMAGE_TYPE_SONIC // тип урона
    set A.weaponType = null
    
    set A.effectList = HandleListCreate( )
    
    set A.i = 60 // количество эффектов отображения радиуса
    set i = A.i
    
    loop
        set bj_lastCreatedEffect = AddSpecialEffect( "Abilities\\Spells\\Orc\\Bloodlust\\BloodlustTarget.mdl", A.l.x + A.radius * Cos( a ), A.l.y + A.radius * Sin( a ) )
        call SetSpecialEffectZ( bj_lastCreatedEffect, GetSpecialEffectZ( bj_lastCreatedEffect ) + 50.00 )
        call HandleListAddHandle( A.effectList, bj_lastCreatedEffect )
        
        set i = i - 1
        exitwhen i <= 0
        set a = a + bj_PI / A.i * 2.00
    endloop
    
    call SaveInteger( H, GetHandleId( A.t ), 0, A )
    call TimerStart( A.t, 1.50, false, function Jump )
endfunction

//===========================================================================
private function 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 Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Spell_Actions )
endfunction
endlibrary

Загруженные файлы
28
UndeadFisher, странно, только сейчас заметил на видосе, что при втором касте не заспавнились эффекты, но я не первый раз встречаю такую проблему, возможно дело в компе либо в самом варе, он не отображает порой эффекты, я из-за этой проблемы даже к даммикам возвращался когда-то, с ними всегда всё корректно было
1
rsfghd, Да, встроенные функции спецэффектов имеют свои проблемы, которые остаются нерешёнными. "Фальшивые" юниты не устарели и по-прежнему остаются актуальными.
28
UndeadFisher, мне кажется дело не в самих функциях, эффекты то создаются, но не отображаются
Этот комментарий удален
15
Заказ на работу
Название: Понижение защиты
Метод: Jass
Версия Warcraft III: 1.26
Техническое описание: При атаке у атакованного юнита отнимается защита в зависимости от уровня атакера, например если атакер 10 уровня, то с каждой атаки минусуется по 1 единице защиты за стак, если 20 уровень, то минусуется 2 единицы за стак и так до 100 уровня.
Максимум стаков - 7, когда достигает максимального стака, накидывается сайленс на 2 секунды, и через 5 секунд защита добавляется обратно.
Ответы (10)
28
Выполнение заказа

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

Понижение защиты

инструкция по импорту
скопировать папку Initialization и вставить в свою карту, перекопировать редактор объектов и вставить в свою карту, в триггере Melee Initialization настроить бд в соответствии с редактором объектов
в триггере EventDamage на 81 строке указать даммика, что будет кастовать таргетный сайленс
на 70 строке можно изменить время спадения дебаффа на броню
на 61 строке можешь настроить формулу уменьшения брони
на 54 строке аура торнадо для отображения дебаффа на юните + статус бар (на 24-25 то же самое)
советую сделать прелоад ауры, чтобы при первом получении не происходил пролаг

Код

EventDamage
function SetBonusArmorNegative takes unit u, integer value returns nothing
    local integer i = udg_BDMax
    
    loop
        exitwhen i <= 0
        
        if udg_BDValue[i] <= value then
            call UnitAddAbility( u, udg_BDAbil[i] )
        
            set value = value - udg_BDValue[i]
        else
            call UnitRemoveAbility( u, udg_BDAbil[i] )
        endif
        
        set i = i - 1
    endloop
endfunction

function RemoveDebuff takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local unit u = LoadUnitHandle( udg_H, i, 0 )
    
    call UnitRemoveAbility( u, 'A009' )
    call UnitRemoveAbility( u, 'B000' )
    call SetBonusArmorNegative( u, 0 )
        
    call RemoveSavedInteger( udg_H, GetHandleId( u ), 0 )
    
    call FlushChildHashtable( udg_H, i )
    call DestroyTimer( t )
    
    set u = null
    set t = null
endfunction

function Trig_EventDamage_Actions takes nothing returns nothing
    local unit damaged
    local timer t
    local integer i
    local integer stack
    
    if GetUnitAbilityLevel( GetTriggerUnit( ), 'Bspo' ) > 0 then
        set damaged = GetTriggerUnit( )
        call UnitRemoveAbility( damaged, 'Bspo' )
        
        set t = LoadTimerHandle( udg_H, GetHandleId( damaged ), 0 )
        
        if t == null then
            set t = CreateTimer( )
            
            call SaveTimerHandle( udg_H, GetHandleId( damaged ), 0, t )
            call UnitAddAbility( damaged, 'A009' )
            call SaveUnitHandle( udg_H, GetHandleId( t ), 0, damaged )
        endif
        
        set i = GetHandleId( t )
        set stack = LoadInteger( udg_H, i, 1 ) + 1
        
        call SetUnitAbilityLevel( damaged, 'A009', stack )
        call SetBonusArmorNegative( damaged, IMaxBJ( 1, R2I( GetHeroLevel( GetEventDamageSource( ) ) * 0.10 ) ) * stack )
        
        if stack < udg_BDMax then
            call SaveInteger( udg_H, i, 1, stack )
        else
            call IssueTargetOrder( udg_TempUnit, "soulburn", damaged )
        endif
        
        call TimerStart( t, 5.00, false, function RemoveDebuff )
        
        set t = null
        set damaged = null
    endif
endfunction

//===========================================================================
function InitTrig_EventDamage takes nothing returns nothing
    set gg_trg_EventDamage = CreateTrigger(  )
    call TriggerAddAction( gg_trg_EventDamage, function Trig_EventDamage_Actions )
    set udg_TempUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u000', 0.00, 0.00, 0.00 )
endfunction
28
LastUchiha, если ты захочешь отнимать больше защиты или добавить больше стаков, что превысит 123 единицы (1+2+4+8+16+32+64), то добавь просто новые значения в бд (х2 предыдущего числа, т.е. 128/256/512/1024...), и не забудь указать новое количество индексов для BDMax
28
LastUchiha, стаки на 63 строке триггера EventDamage, но я пихнул туда udg_BDMax, поскольку подходило под тз, лучше просто указать макс кол-во стаков
28
LastUchiha, ахахаха, блин, извиняюсь, перед сном делал спелл, вытащи из лупа в первом триггере всё, кроме добавления события, поставь чуть ниже/выше пика юнитов, а то там хэштаблица создаётся на каждого выбранного юнита
15
rsfghd, если продолжать бить юнита когда у него максимальный дебафф, то начнутся лаги, а именно фпс будет всё ниже и ниже садится.
28
Вышла новая версия! Прокрутить к ресурсу
LastUchiha, я сначала подумал, что может в цикле накосячил из-за недосыпа, но нет, это сайленс прикалывается. Когда обнулял значения сайленса, поставил периодичность урона на 0.00, в итоге, оно, похоже, каждые 0.00 секунд дамажило с 0 урона, вызывая триггер получения урона, решилось просто - выставил периодичность урона на 99999999999999, ну и приколы..

вот обновлённая карта с исправлением предыдущего косяка
15
rsfghd, защита возобновляться должна просто через 5 секунд, а тут если юнит за эти 5 секунд был атакован, то нужно опять ждать 5 секунд и так по кругу.
28
LastUchiha, напиши просто, что через 5 секунд после получения последнего стака - все стаки должны сброситься, так будет понятнее, перенеси строку call TimerStart( t, 5.00, false, function RemoveDebuff ) рядом к строке call SaveInteger( udg_H, i, 1, stack )
должно выйти так
        if stack < udg_BDMax then
            call SaveInteger( udg_H, i, 1, stack )
        	call TimerStart( t, 5.00, false, function RemoveDebuff )
        else
            call IssueTargetOrder( udg_TempUnit, "soulburn", damaged )
        endif
время таймера будет обновляться каждый раз, когда юнит получает автоатаку, за исключением наличия последнего стака
15

Заказ

Название: Божественная призма
Метод: Jass
Версия Warcraft III: 1.26а
Техническое описание: Если цель – противник, он получает 400 ед. урона от светлой магии и отражает энергию, которая восполняет 300 ед. здоровья 5 вашим союзникам в радиусе 30 м.
Если цель – союзник, он восстанавливает 600 ед. здоровья и отражает энергию, которая наносит 190 ед. урона от светлой магии 5 противникам в радиусе 30 м.
Ответы (6)
28
Desgul, светлая магия и отражение энергии это снаряд, молния или мгновенное?
28
Выполнение заказа

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

Божественная призма

инструкция по импорту
скопировать папку Initialization и вставить в свою карту
скопировать даммика и абилку из ро и вставить в свою карту
в триггере Spell:
153 строка - указать равкод абилки
30-32 строки - указать скорость полёта снаряда
60 строка - количество целей для урона/хила после основной
54 строка - хил основной цели
57 строка - урон основной цели
62 строка - радиус с максимальной коллизией у юнита (+200)
71 строка - радиус
103 строка - хил второстепенных целей
105 строка - урон второстепенных целей
заменить 'u000' в коде на своего даммика

Код

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

function Move takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local integer k
    local player p
    local unit caster
    local unit target = LoadUnitHandle( udg_H, i, 1 )
    local unit dummy = LoadUnitHandle( udg_H, i, 2 )
    local unit u
    local real x = GetUnitX( dummy )
    local real y = GetUnitY( dummy )
    local real z = LoadReal( udg_H, i, 3 )
    local real x1 = GetUnitX( target )
    local real y1 = GetUnitY( target )
    local real z1 = GetLocZ( x1, y1 ) + GetUnitFlyHeight( target ) + 50.00
    local real ax = x1 - x
    local real ay = y1 - y
    local real az = z1 - z
    local real d = RMaxBJ( 1.00, SquareRoot( ax * ax + ay * ay + az * az ) )
    
    set ax = ax / d
    set ay = ay / d
    set az = az / d
    
    set x = x + 20.00 * ax
    set y = y + 20.00 * ay
    set z = z + 20.00 * az
    
    call SetUnitX( dummy, x )
    call SetUnitY( dummy, y )
    call SetUnitFlyHeight( dummy, z - GetLocZ( x, y ), 0.00 )
    
    if IsUnitInRange( dummy, target, 0.00 ) and SquareRoot( ( z1 - z ) * ( z1 - z ) ) <= 100.00 then
        call SetUnitAnimation( dummy, "death" )
        call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
        
        set caster = LoadUnitHandle( udg_H, i, 0 )
        set p = GetOwningPlayer( caster )
        
        set k = LoadInteger( udg_H, i, 4 )
        
        call PauseTimer( t )
        call FlushChildHashtable( udg_H, GetHandleId( t ) )
        call DestroyTimer( t )
        
        if k == 1 then
            if IsUnitAlly( target, p ) then
                if not IsUnitType( target, UNIT_TYPE_DEAD ) then
                    call SetWidgetLife( target, GetWidgetLife( target ) + 600.00 )
                endif
            else
                call UnitDamageTarget( caster, target, 400.00, false, false, null, null, null )
            endif
            
            set k = 5
            
            call GroupEnumUnitsInRange( udg_TempGroup, x, y, 700.00, null )
            
            call GroupRemoveUnit( udg_TempGroup, target )
            
            loop
                set u = FirstOfGroup( udg_TempGroup )
                exitwhen u == null
                call GroupRemoveUnit( udg_TempGroup, u )
                
                if IsUnitInRangeXY( u, x, y, 500.00 ) then
                    if not IsUnitType( u, UNIT_TYPE_DEAD ) then
                        if ( IsUnitAlly( target, p ) and not IsUnitAlly( u, p ) ) or ( IsUnitAlly( u, p ) and not IsUnitAlly( target, p ) ) then
                            set t = CreateTimer( )
                            set i = GetHandleId( t )
                            
                            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( caster ), 'u000', x, y, Atan2( GetUnitY( u ) - y, GetUnitX( u ) - x ) * bj_RADTODEG )
                            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
                            call SetUnitX( bj_lastCreatedUnit, x )
                            call SetUnitY( bj_lastCreatedUnit, y )
                            call SetUnitFlyHeight( bj_lastCreatedUnit, z - GetLocZ( x, y ), 0.00 )
                            call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
                            call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
                            
                            call SaveUnitHandle( udg_H, i, 0, caster )
                            call SaveUnitHandle( udg_H, i, 1, u )
                            call SaveUnitHandle( udg_H, i, 2, bj_lastCreatedUnit )
                            call SaveReal( udg_H, i, 3, z )
                            call SaveInteger( udg_H, i, 4, 0 )
                            call TimerStart( t, 0.01, true, function Move )
                            
                            set i = i - 1
                            
                            if i <= 0 then
                                call GroupClear( udg_TempGroup )
                            endif
                        endif
                    endif
                endif
            endloop
        else
            if IsUnitAlly( target, GetOwningPlayer( caster ) ) then
                call SetWidgetLife( target, GetWidgetLife( target ) + 300.00 )
            else
                call UnitDamageTarget( caster, target, 190.00, false, false, null, null, null )
            endif
        endif
        
        set caster = null
    else
        call SaveReal( udg_H, i, 3, z )
    endif
    
    set t = null
    set dummy = null
    set target = null
endfunction

function Trig_Spell_Actions takes nothing returns nothing
    local timer t = CreateTimer( )
    local integer i = GetHandleId( t )
    local unit caster = GetTriggerUnit( )
    local unit target = GetSpellTargetUnit( )
    local real x = GetUnitX( caster )
    local real y = GetUnitY( caster )
    local real z = GetUnitFlyHeight( caster ) + 50.00
    
    set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( caster ), 'u000', x, y, Atan2( GetUnitY( target ) - y, GetUnitX( target ) - x ) * bj_RADTODEG )
    call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
    call SetUnitX( bj_lastCreatedUnit, x )
    call SetUnitY( bj_lastCreatedUnit, y )
    call SetUnitFlyHeight( bj_lastCreatedUnit, z, 0.00 )
    call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
    call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
    
    set z = z + GetLocZ( x, y )
    
    call SaveUnitHandle( udg_H, i, 0, caster )
    call SaveUnitHandle( udg_H, i, 1, target )
    call SaveUnitHandle( udg_H, i, 2, bj_lastCreatedUnit )
    call SaveReal( udg_H, i, 3, z )
    call SaveInteger( udg_H, i, 4, 1 )
    call TimerStart( t, 0.01, true, function Move )
    
    set t = null
    set caster = null
    set target = 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
Загруженные файлы
30

Заказ

Метод: UjAPI
Версия Warcraft III: Версия варкрафта для этого заказа
Техническое описание: Две способности в синергии

Водный элементаль

Почти обычный призыв элементаля, но...
Если призвать элементаля на воде, то он получит 10% за уровень способности здоровья и урона.
Если призвать элементаля с целью в другого водного элементаля, то цель взорвётся нанеся всем вокруг урон в размере 10% за уровень способности от оставшегося хп. Призванный элементаль получит добавку к урону в размере 10% за уровень способности.

Цепная молния

Её нельзя напрямую кастануть в водного элементаля. Но если при прыжке в радиусе доступности будет водный элементаль, то она перепрыгнет на него, вылечит ему столько хп сколько должна была нанести урона и раздвоившись продолжит прыгать. Одна и та же цепная молния не может два раза попасть в одного и того же водяного элементаля.
Ответы (1)
28
nazarpunk, проверка на наличие воды в точке на южапи некорректно работает, поэтому заказ выполнять не буду
1

Заказ

Метод: JASS/vJASS
Версия Warcraft III: Любая версия
Техническое описание:
Загруженные файлы
Ответы (3)
28
Gosick3000, АХАХАХАХ, рад видеть любителя работ blink'a, всегда мечтал научиться делать такие же спеллы, и даже попробовал что-то придумать: xgm.guru/p/wc3/UjAPI-Bahisa-Spellpack-qQU
Следующим спеллпаком хотел лучницу сделать, но нет идей для оригинальной ульты и одного обычного скилла. Мб возьму опалесценцию из отчаяния
Без должных моделек с анимациями и эффектами будет убого выглядеть. В следующий раз лучше предоставлять материалы для работы, чтобы мог более корректно выполнить тз
Попробую на стандарте что-то придумать с этим
1
rsfghd,
У меня есть модели пыли, но, к сожалению, другие модели я предоставить не могу.
Загруженные файлы
28
Выполнение заказа

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

Подобрать эффекты, модельки, немного подогнать под это дело код и в принципе будет сносно. Но у блинка так-то сделана иначе сама система кастов, типа нет таргетных абилок (ими нужно попадать) и в зависимости от того есть ли в радиусе поражения юнит, какая разница высот, какая дистанция между ними - происходят соответствующие действия, вроде прыжка/телепорта вверх, сокращение дистанции телепортами и т.д. и т.п.
инструкция по импорту
убрать триггер Untitled Trigger 001 и скопировать папку Initialization в свою карту
в триггере Spell на 232 строке указать равкод абилки
на 177 строке указать урон от первого удара
на 87 строке урон от второго удара
на 65 урон от серии ударов
на 142 урон при окончании серии ударов
всё остальное требует минимальных знаний джасса

Код

AllGlobals
library AllGlobalsLib
globals
    constant hashtable H = InitHashtable( )
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

function ParabolaZ takes real h, real d, real x returns real
    return (4 * h / d) * (d - x) * (x / d)
endfunction

private function AlphaTeleportPeriodic takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local real r = LoadReal( H, i, 1 ) + 0.01
    local real k = LoadReal( H, i, 2 )
    
    call SetUnitVertexColor( LoadUnitHandle( H, i, 0 ), 255, 255, 255, R2I( 255.00 - ParabolaZ( 255.00, k, r ) ) )
    
    if r >= k then
        call PauseTimer( t )
        call DestroyTimer( t )
        call FlushChildHashtable( H, i )
    else
        call SaveReal( H, i, 1, r )
    endif
    
    set t = null
endfunction

function AlphaTeleport takes unit u, real time returns nothing
    local timer t = CreateTimer( )
    local integer i = GetHandleId( t )
    
    call SaveUnitHandle( H, i, 0, u )
    call SaveReal( H, i, 1, 0.00 )
    call SaveReal( H, i, 2, time )
    call TimerStart( t, 0.01, true, function AlphaTeleportPeriodic )
    
    set t = null
endfunction

private function Falling takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local integer i = GetHandleId( t )
    local unit u = LoadUnitHandle( H, i, 0 )
    local real s = LoadReal( H, i, 1 ) - 0.25
    local real f = GetUnitFlyHeight( u ) + s
    
    call SetUnitFlyHeight( u, f, 0.00 )
    
    if f <= 0.00 then
        call PauseTimer( t )
        call FlushChildHashtable( H, i )
        call DestroyTimer( t )
        
        call RemoveSavedHandle( H, GetHandleId( u ), UnitFallingKey )
    else
        call SaveReal( H, i, 1, s )
    endif
    
    set t = null
    set u = null
endfunction

function UnitStartFalling takes unit u, real speed returns nothing
    local timer t = LoadTimerHandle( H, GetHandleId( u ), UnitFallingKey )
    
    if t == null then
        set t = CreateTimer( )
        
        call SaveTimerHandle( H, GetHandleId( u ), UnitFallingKey, t )
        call SaveUnitHandle( H, GetHandleId( t ), 0, u )
        
        call TimerStart( t, 0.01, true, function Falling )
    endif
    
    call SaveReal( H, GetHandleId( t ), 1, speed )
    
    set t = null
endfunction
endlibrary

//===========================================================================
//function InitTrig_AllGlobals takes nothing returns nothing
    //set gg_trg_AllGlobals = CreateTrigger(  )
//endfunction

Spell
library SpellLib
globals
    constant key UnitFallingKey
endglobals

private struct SpellS
    timer t
    unit caster
    unit target
    real time
    real speed
    integer action
    boolean localPlayer
    vector v
endstruct

private function Move takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real x
    local real y
    
    if A.action < 4 then
        set x = GetUnitX( A.target ) + A.speed * A.v.x
        set y = GetUnitY( A.target ) + A.speed * A.v.y
    
        call SetUnitX( A.target, x )
        call SetUnitY( A.target, y )
        
        set A.time = A.time - 0.01
    else
        set x = GetUnitX( A.caster ) - A.speed * A.v.x
        set y = GetUnitY( A.caster ) - A.speed * A.v.y
    
        call SetUnitX( A.caster, x )
        call SetUnitY( A.caster, y )
    endif
    
    if A.localPlayer then
        call SetCameraField( CAMERA_FIELD_ZOFFSET, GetUnitFlyHeight( A.caster ), 0.25 )
    endif
    
    if A.action == 0 then
        if A.time <= 0.10 then
            call SetUnitFlyHeight( A.caster, GetUnitFlyHeight( A.caster ) + 60.00, 0.00 )
        endif
    elseif A.action == 1 or A.action == 2 then
        if A.action == 2 then
            if A.time == 0.20 then
                call SetUnitTimeScale( A.caster, 2.00 )
                call SetUnitAnimation( A.caster, "attack slam" )
                call QueueUnitAnimation( A.caster, "stand" )
            elseif A.time == 0.10 then
                call SetUnitTimeScale( A.caster, 1.00 )
            endif
        endif
        
        if A.time == 0.10 then
            call AlphaTeleport( A.caster, 0.20 )
        endif
    elseif A.action == 3 then
        call SetUnitFlyHeight( A.target, GetUnitFlyHeight( A.target ) - 0.25, 0.00 )
        call SetUnitFlyHeight( A.caster, GetUnitFlyHeight( A.target ) + 50.00, 0.00 )
        call UnitStartFalling( A.target, 0.00 )
        
        call UnitDamageTarget( A.caster, A.target, 1.00, false, false, null, null, null )
        
        if GetRandomInt( 0, 1 ) == 0 then
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\VengeanceMissile\\VengeanceMissile.mdl", A.target, "overhead" ) )
        else
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\VengeanceMissile\\VengeanceMissile.mdl", A.caster, "weapon" ) )
        endif
    endif
    
    if A.time <= 0.00 or ( A.action == 4 and GetUnitFlyHeight( A.caster ) <= 0.11 ) then
        if A.action == 0 then
            call SetUnitTimeScale( A.caster, 2.00 )
            
            call SetUnitAnimationByIndex( A.caster, 5 )
            call QueueUnitAnimation( A.caster, "stand" )
            
            set A.time = 0.25
            set A.action = 1
        elseif A.action == 1 then
            set A.action = 2
            set A.speed = 12.00
            
            call UnitDamageTarget( A.caster, A.target, 50.00, false, false, null, null, null )
            
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl", A.target, "chest" ) )
            
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( A.caster ), 'u000', GetUnitX( A.caster ), GetUnitY( A.caster ), GetUnitFacing( A.caster ) )
            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( A.caster ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( A.caster ) )
            call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( A.caster ), 0.00 )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            
            call SetUnitX( A.caster, x - 128.00 * A.v.x )
            call SetUnitY( A.caster, y - 128.00 * A.v.y )
            call SetUnitFlyHeight( A.caster, GetUnitFlyHeight( A.target ), 0.00 )
            
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( A.caster ), 'u000', GetUnitX( A.caster ), GetUnitY( A.caster ), GetUnitFacing( A.caster ) )
            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( A.caster ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( A.caster ) )
            call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( A.caster ), 0.00 )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            
            call UnitStartFalling( A.caster, 0.00 )
            set A.time = 0.30
        elseif A.action == 2 then
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( A.caster ), 'u000', GetUnitX( A.caster ), GetUnitY( A.caster ), GetUnitFacing( A.caster ) )
            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( A.caster ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( A.caster ) )
            call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( A.caster ), 0.00 )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            
            call SetUnitX( A.caster, x - 96.00 * A.v.x )
            call SetUnitY( A.caster, y - 96.00 * A.v.y )
            call SetUnitFlyHeight( A.caster, GetUnitFlyHeight( A.target ), 0.00 )
            
            set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( A.caster ), 'u000', GetUnitX( A.caster ), GetUnitY( A.caster ), GetUnitFacing( A.caster ) )
            call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
            call SetUnitX( bj_lastCreatedUnit, GetUnitX( A.caster ) )
            call SetUnitY( bj_lastCreatedUnit, GetUnitY( A.caster ) )
            call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( A.caster ), 0.00 )
            call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
            
            set A.speed = 0.00
            
            call UnitStartFalling( A.caster, 0.00 )
            call UnitStartFalling( A.target, 0.00 )
            
            set A.time = 0.50
            set A.action = 3
        elseif A.action == 3 then
            set A.action = 4
            set A.time = 0.01
            set A.speed = 2.50
            
            call UnitDamageTarget( A.caster, A.target, 10.00, false, false, null, null, null )
            
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Weapons\\PhoenixMissile\\Phoenix_Missile.mdl", A.target, "overhead" ) )
            
            call UnitStartFalling( A.caster, 10.00 )
            call UnitStartFalling( A.target, -20.00 )
        elseif A.action == 4 then
            call PauseTimer( A.t )
            call FlushChildHashtable( H, GetHandleId( A.t ) )
            call DestroyTimer( A.t )
            
            call PauseUnit( A.caster, false )
            call PauseUnit( A.target, false )
            
            set A.t = null
            set A.caster = null
            set A.target = null
            call A.v.destroy( )
            call A.destroy( )
        endif
    endif
endfunction

private function Slam takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real x = GetUnitX( A.target )
    local real y = GetUnitY( A.target )
    
    if UnitAddAbility( A.target, 'Arav' ) then
        call UnitRemoveAbility( A.target, 'Arav' )
    endif
    
    if UnitAddAbility( A.caster, 'Arav' ) then
        call UnitRemoveAbility( A.caster, 'Arav' )
    endif
    
    call UnitDamageTarget( A.caster, A.target, 40.00, false, false, null, null, null )
    
    call DestroyEffect( AddSpecialEffect( "Abilities\\Spells\\Other\\Volcano\\VolcanoDeath.mdl", GetUnitX( A.caster ), GetUnitY( A.caster ) ) )
    
    set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( A.caster ), 'u001', x, y, GetUnitFacing( A.caster ) )
    call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
    call SetUnitX( bj_lastCreatedUnit, x )
    call SetUnitY( bj_lastCreatedUnit, y )
    call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( A.caster ), 0.00 )
    call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 2.00 )
    call SetUnitTimeScale( bj_lastCreatedUnit, 1.50 )
    
    call UnitStartFalling( A.target, 17.50 )
    
    call SetUnitTimeScale( A.caster, 1.00 )
    call SetUnitAnimation( A.caster, "attack slam" )
    call QueueUnitAnimation( A.caster, "stand" )
    
    set A.action = 0
    set A.speed = 3.00
    set A.time = 0.30
    
    call TimerStart( A.t, 0.01, true, function Move )
endfunction

private function SetAnim takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    
    call PauseUnit( A.caster, true )
    call SetUnitTimeScale( A.caster, 2.00 )
    call SetUnitAnimation( A.caster, "spell slam" )
    call QueueUnitAnimation( A.caster, "stand" )
    
    call TimerStart( A.t, 0.30, false, function Slam )
endfunction

private function Spell_Actions takes nothing returns nothing
    local SpellS A = SpellS.create( )
    
    set A.t = CreateTimer( )
    set A.caster = GetTriggerUnit( )
    set A.target = GetSpellTargetUnit( )
    set A.v = vector.create( GetUnitX( A.target ) - GetUnitX( A.caster ), GetUnitY( A.target ) - GetUnitY( A.caster ), 0.00 )
    call A.v.normalize( )
    
    set A.localPlayer = GetLocalPlayer( ) == GetOwningPlayer( A.caster )
    
    call PauseUnit( A.target, true )
    
    call SaveInteger( H, GetHandleId( A.t ), 0, A )
    call TimerStart( A.t, 0.00, false, function SetAnim )
endfunction

//===========================================================================
private function 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 Spell_Conditions ) )
    call TriggerAddAction( gg_trg_Spell, function Spell_Actions )
endfunction
endlibrary

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

Заказ

Название: Ярость Синдрагосы
Метод: Jass
Версия Warcraft III: 1.26a
Техническое описание: как на видео только что бы начинала лететь за спиной катера
Призывает Синдрагосу, которая дышит холодом на противников перед вами на расстоянии до 40 м, нанося 400 урона и (снижая скорость передвижения на 50%) на 10 сек.
Загруженные файлы
Ответы (2)
28
Выполнение заказа

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

Ярость Синдрагосы

инструкция по импорту
скопировать папку Initialization и вставить в свою карту
перекопировать редактор объектов и вставить в свою карту
в триггере Spell на строках:
272 - указать равкод даммика который кастует замедление
261 - указать абилку призыва дракона
235-236 - смещение проявления дракона за спину кастера
238 - равкод дракона
244 - стартовая высота дракона (400)
245 - высота дракона во время полёта (300 - какую высоту установить, 100 - с какой скоростью установить эту высоту, т.е. с учётом стартовой высоты, дракон достигнет этой высоты за одну секунду)
246 - раскрас дракона (последний аргумент должен быть на 0)
251 - максимальное расстояние всего полёта с учётом проявления и исчезновения
140 - скорость полёта дракона
154 - при какой оставшейся дистанции начать выпускать ледяные волны
156 - индекс анимки полёта дракона
160 - при какой оставшейся дистанции начать исчезновение дракона
161 - формула исчезновения дракона ( 255.00 / ( указать параметр на 160 строке / speed ) )
162 - раскрас дракона, последний параметр не нужно трогать
164 - формула взлёта дракона ( скорость взлёта * ( 1.00 - d / указать параметр на 160 строке ) )
167 - другой индекс анимки полёта дракона (взмах крыльями)
170 - указать параметр на 160 строке + параметр на 173 строке
173 - периодичность спавна ледяных волн в зависимости от пройденной дистанции (т.е. каждые 35 единиц)
177-178 - смещение начала волны поближе к морде дракона
180 - равкод ледяной волны
186 - стартовая высота волны (на 75 единиц ниже высоты дракона)
192 - указать параметр на 170 строке
204 - дистанция до которой дракон должен проявиться
205 - формула проявления дракона ( 255.00 / ( ( максимальная дистанция - параметр на 204 строке ) / speed ) )
206 - то же самое, что и 162
32-33 - скорость полёта волны
37 - скорость полёта волны по Z
43 - радиус урона (300 + макс коллизия)
53 - радиус урона
57 - приказ замедления
58 - урон
64-110 - визуальные кPаКаЗяБрЫ

Код

Spell
function GetCorX takes real x returns real
if x > udg_MapRectXY[0] then
return udg_MapRectXY[0]
elseif x < udg_MapRectXY[1] then
return udg_MapRectXY[1]
endif

return x
endfunction
function GetCorY takes real y returns real
if y > udg_MapRectXY[2] then
return udg_MapRectXY[2]
elseif y < udg_MapRectXY[3] then
return udg_MapRectXY[3]
endif

return y
endfunction
function MoveEffect takes nothing returns nothing
local timer t = GetExpiredTimer( )
local integer i = GetHandleId( t )
local unit u
local unit caster
local unit dummy = LoadUnitHandle( udg_H, i, 0 )
local real x = GetUnitX( dummy )
local real y = GetUnitY( dummy )
local real a = GetUnitFacing( dummy ) * bj_DEGTORAD
local group g

set x = GetCorX( x + 10.00 * Cos( a ) )
set y = GetCorY( y + 10.00 * Sin( a ) )

call SetUnitX( dummy, x )
call SetUnitY( dummy, y )
call SetUnitFlyHeight( dummy, GetUnitFlyHeight( dummy ) - 5.00, 0.00 )

if GetUnitFlyHeight( dummy ) <= 0.11 then
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 1.00 )

call GroupEnumUnitsInRange( udg_TempGroup, x, y, 500.00, null )
set caster = LoadUnitHandle( udg_H, i, 1 )
set g = LoadGroupHandle( udg_H, i, 2 )
set bj_groupEnumOwningPlayer = GetOwningPlayer( caster )

loop
set u = FirstOfGroup( udg_TempGroup )
exitwhen u == null
call GroupRemoveUnit( udg_TempGroup, u )

if IsUnitInRangeXY( u, x, y, 300.00 ) then
if not IsUnitInGroup( u, g ) then
if IsUnitEnemy( u, bj_groupEnumOwningPlayer ) and not IsUnitType( u, UNIT_TYPE_DEAD ) then
call GroupAddUnit( g, u )
call IssueTargetOrder( udg_TempUnit, "frostnova", u )
call UnitDamageTarget( caster, u, 100.00, false, false, null, null, null )
endif
endif
endif
endloop

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u003', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u004', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u005', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u006', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u007', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

set dummy = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u008', x, y, GetRandomReal( 0.00, 360.00 ) )
call SetUnitAnimation( dummy, "death" )
call UnitApplyTimedLife( dummy, 'BTLF', 2.00 )
call UnitAddAbility( dummy, 'Arav' )
call SetUnitX( dummy, x + GetRandomReal( -200.00, 200.00 ) )
call SetUnitY( dummy, y + GetRandomReal( -200.00, 200.00 ) )
call SetUnitFlyHeight( dummy, GetRandomReal( 32.00, 150.00 ), 0.00 )

if LoadInteger( udg_H, i, 3 ) == 1 then
call DestroyGroup( g )
endif

call PauseTimer( t )
call FlushChildHashtable( udg_H, i )
call DestroyTimer( t )

set g = null
set caster = null
endif

set t = null
set dummy = null
endfunction
function Move takes nothing returns nothing
local timer t = GetExpiredTimer( )
local timer n
local integer i = GetHandleId( t )
local integer j
local unit caster = LoadUnitHandle( udg_H, i, 0 )
local unit dummy = LoadUnitHandle( udg_H, i, 1 )
local real x = GetUnitX( dummy )
local real y = GetUnitY( dummy )
local real a = GetUnitFacing( dummy ) * bj_DEGTORAD
local real d = LoadReal( udg_H, i, 3 )
local real r
local real speed = 5.00

if speed > d then
set speed = d
endif

set x = GetCorX( x + speed * Cos( a ) )
set y = GetCorY( y + speed * Sin( a ) )

call SetUnitX( dummy, x )
call SetUnitY( dummy, y )

set d = d - speed

if d <= 2300 then
if LoadInteger( udg_H, i, 4 ) == 0 then
call SetUnitAnimationByIndex( dummy, 4 )
call SaveInteger( udg_H, i, 4, 1 )
endif

if d <= 400.00 then
set r = LoadReal( udg_H, i, 5 ) - 255.00 / ( 400.00 / speed )
call SetUnitVertexColor( dummy, 175, 175, 175, R2I( r ) )
call SaveReal( udg_H, i, 5, r )
call SetUnitFlyHeight( dummy, GetUnitFlyHeight( dummy ) + 5.00 * ( 1.00 - d / 400.00 ), 0.00 )

if LoadInteger( udg_H, i, 4 ) == 1 then
call SetUnitAnimationByIndex( dummy, 3 )
call SaveInteger( udg_H, i, 4, 2 )
endif
elseif d > 435.00 then
set r = LoadReal( udg_H, i, 6 ) + speed

if r >= 35.00 then
set r = 0.00
set n = CreateTimer( )
set j = GetHandleId( n )
set x = GetCorX( x + 275.00 * Cos( a ) )
set y = GetCorY( y + 275.00 * Sin( a ) )

set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( caster ), 'u002', x, y, a * bj_RADTODEG )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitX( bj_lastCreatedUnit, x )
call SetUnitY( bj_lastCreatedUnit, y )
call SetUnitFlyHeight( bj_lastCreatedUnit, GetUnitFlyHeight( dummy ) - 75.00, 0.00 )

call SaveUnitHandle( udg_H, j, 0, bj_lastCreatedUnit )
call SaveUnitHandle( udg_H, j, 1, caster )
call SaveGroupHandle( udg_H, j, 2, LoadGroupHandle( udg_H, i, 2 ) )

if d - speed <= 435.00 then
call SaveInteger( udg_H, j, 3, 1 )
endif

call TimerStart( n, 0.01, true, function MoveEffect )
set n = null
endif

call SaveReal( udg_H, i, 6, r )
endif
endif

if d > 2000.00 then
set r = LoadReal( udg_H, i, 5 ) + 255.00 / ( ( 2500.00 - 2000.00 ) / speed )
call SetUnitVertexColor( dummy, 175, 175, 175, R2I( r ) )
call SaveReal( udg_H, i, 5, r )
endif

if d <= 0.00 then
call PauseTimer( t )
call FlushChildHashtable( udg_H, i )
call DestroyTimer( t )

call SetUnitVertexColor( dummy, 0, 0, 0, 0 )
call KillUnit( dummy )
else
call SaveReal( udg_H, i, 3, d )
endif

set t = null
set dummy = null
set caster = null
endfunction
function Trig_Spell_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 a = Atan2( GetSpellTargetY( ) - y, GetSpellTargetX( ) - x )

set x = GetCorX( x - 800.00 * Cos( a ) )
set y = GetCorY( y - 800.00 * Sin( a ) )

set bj_lastCreatedUnit = CreateUnit( GetOwningPlayer( caster ), 'u001', x, y, a * bj_RADTODEG )
call SetUnitAnimation( bj_lastCreatedUnit, "birth" )
call QueueUnitAnimation( bj_lastCreatedUnit, "stand" )
call UnitAddAbility( bj_lastCreatedUnit, 'Arav' )
call SetUnitX( bj_lastCreatedUnit, x )
call SetUnitY( bj_lastCreatedUnit, y )
call SetUnitFlyHeight( bj_lastCreatedUnit, 400.00, 0.00 )
call SetUnitFlyHeight( bj_lastCreatedUnit, 300.00, 100.00 )
call SetUnitVertexColor( bj_lastCreatedUnit, 175, 175, 175, 0 )

call SaveUnitHandle( udg_H, i, 0, caster )
call SaveUnitHandle( udg_H, i, 1, bj_lastCreatedUnit )
call SaveGroupHandle( udg_H, i, 2, CreateGroup( ) )
call SaveReal( udg_H, i, 3, 2500.00 )

call TimerStart( t, 0.01, true, function Move )

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
local rect r = GetWorldBounds( )

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 )

set udg_TempUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'u009', 0.00, 0.00, 0.00 )

set udg_MapRectXY[0] = GetRectMaxX( r )
set udg_MapRectXY[1] = GetRectMinX( r )
set udg_MapRectXY[2] = GetRectMaxY( r )
set udg_MapRectXY[3] = GetRectMinY( r )

call RemoveRect( r )

set r = null
endfunction
""
Загруженные файлы
28
Desgul, бле, код в кавычки забыл обернуть и отредактировать уже нельзя, офигенно 👍
4
Заказ на работу
ДЫМОВАЯ ГРАНАТА
Герой бросает дымовую гранату, которая взрывается в указанной точке и окутывает область дымом на несколько сек (размер области и время действия зависит от лвл способности)!
В выбранной области у всех врагов: понижается броня, они получают % шанс на промах от каждой атаки, а также они не могут кастовать способности (безмолвие) всё это пока они стоят в этой области дыма!
А все союзники и юниты игрока в этой области получают: + к броне, а сам герой, который скастовал, получает невидимость стоя в это облаке (при атаке невидимость не спадает, или спадает, но на 1 сек)
P.S. Желательно что бы на рефоржете работало тоже, для всех версий
Загруженные файлы
3
Название: Несгибаемая ярость (F)
Метод: Jass
Версия Warcraft III: Главное что бы на рефе работала :)
Описание: Пассивно повышает силу героя на 3/6/9/12 ед. Каждая обычная атака героя восстанавливает ему 2/3/4/5 ед. маны за удар.
Когда здоровье героя падает до нуля, он не умирает а получает полную невосприимчивость к любому виду урона в течении следующих 3 сек., и получает бонусный вампиризм в размере 25%/50%/75%/100% от нанесенного урона (как от атак так и от способностей героя).
Перезарядка способности: 65/55/45/35 сек.
  1. Важно! что бы работала с сделанным спеллом "Молот Древних" (Rolling Slam). Что бы во время анимации атак он тоже становился невосприимчивым у урону а не погибал.
  2. Когда навык находиться на перезарядке после возможной смерти, бонус к силе не сбивается и атаки все так же накапливают ману за удары.
Название: Угрожающий клич (D)
"Не героическая способность" Будет с самого начала уже у варвара.
Метод: Jass
Версия Warcraft III: Главное что бы на рефе работала :)
Описание: Герой издает боевой крик (волна от героя во все стороны) радиусом 1000 АоЕ, который вгоняет противников с 1 по 24 уровень в состояние "Страха", от чего они теряют возможность атаковать, замедляются в скорости передвижения на 25% и бегут прочь в течении 6 сек.
Перезарядка: 50 сек.
"Зов битвы" Предмет усиления способности:
Снижает перезарядку способности "Угрожающий клич" до 35 сек. и когда герой использует её, он повышает свою силу на 5 ед. + 1 ед. за каждый уровень персонажа на 6 сек. Противники погибшие под действием эффекта способности взрываются, нанося по 25 ед. + 300% от силы магического урона всем врагам в радиусе 250 АоЕ.
4
Видимо это тема всё уже... А может и нет.
Но всё же: Спелл. Нужно что бы при атаке с 20% шанс герой (дальнего боя) выпускал 10 ракет (каждая из которых наносит 50 ед урона). Туда, куда он атакует (ну или приблизительно). И чтобы ракеты задевали все цели, на которые они попадут, кроме воздушных (т.е. если по пути стоит юнит и одна из ракет его заденет не долетев до точки, то взорвётся и нанесёт ему урон).
И что бы можно было настраивать, то 10 ракет вылетает, то 1 и тд.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.