Добавлен , опубликован
Существует специальная тема Способности и алгоритмы на заказ, где любой желающий может помочь с вашими фантазиями и где я тоже иногда зависаю. Кроме того, есть платные заказы, например, можете обратиться к 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
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
15

Заказ

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