Добавлен , опубликован
Если вы хотели бы использовать в своей карте нестандартное, оригинальное заклинание, но у вас не хватает знаний для его реализации, то эта тема специально для вас. В данной теме вы можете, в определённом правилами формате, оставить заявку на создание необходимого вам заклинания или системы.
Если вы считаете, что у вас есть возможность выполнить какую-либо из имеющихся заявок, то вы можете оставить сообщение в определённом правилами формате, в котором указать какую из заявок собираетесь исполнить.

Правила темы

  • Запрещается дублирование заявок.
  • Любая заявка, написанная непонятным языком (обилие орфографических ошибок, орфоарт, отсутствие знаков препинания, использование рядов восклицательных и вопросительных знаков) будет удалена.
  • Обсуждение технических нюансов исполнения спелла или багов просьба вести через систему личных сообщений.
  • Для составления заявок используйте формы.
Заявки, не удовлетворяющие правилам, будут удалены !

Как составить заявку

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заклинания
  • Желаемый метод исполнения (GUI/Jass/cJass/vJass)
  • Требуется ли возможность использовать спелл несколькими юнитами одновременно (MUI)
  • Цель применения способности
  • Количество уровней
  • Описание (Смысловое, а не художественное)
  • Технические характеристики (кол-во маны, параметры урона, перезарядки, время действия и т.п.) для каждого из уровней
Форма для составления заявки
Заказ
=
**Название:** Название способности (или системы)
**Метод:** GUI/Jass/cJass/vJass
**MUI:** Обязательно/Не обязательно
**Цель:** Другой юнит / Сам юнит / Точка/ Область/Нет цели/Прочее (указать что именно)
**Количество уровней:** Целое число
**Описание:** Ваше описание. Можно слить со следующим.
**Технические характеристики:** Ваше описание. Можно слить с предыдущим.

Как принимать заказ

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Никнейм заказчика
  • Название выбранного вами заклинания
  • Примерные сроки исполнения (конечно, их соблюдение не критично, но желательно)
Форма для принятия заявки
Заказ принят
=
**Заказчик:** Никнейм заказчика
**Способность:** Название способности
((центр
**Спелл будет завершен к [дата в формате дд.мм.гггг. без скобок]**
))
[ дата принятия заявки в формате дд.мм.гггг / дата, к которой спелл предположительно будет готов в формате дд.мм.гггг ]

Как сообщить о не/выполнении заказа

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Никнейм заказчика
  • Название выбранного вами заклинания
  • Выполнен ли заказ
  • В случае, если заказ невыполним/не выполнен полностью, рекомендуется описать, что именно вам удалось/не удалось сделать.

  • Предоставить карту
Форма для не/выполненного заказа
Заклинание готово! [Если заказ выполнен успешно] / Не удалось выполнить заклинание [Если по каким-либо причинам вы не способны его выполнить] (1 из 2)
=
**Заказчик:** Никнейм заказчика
**Способность:** Название способности
**Выполнено:** Да/Нет
-
[Сюда добавить инструкцию по импорту, или описать что у вас не/получилось, если не удалось выполнить заказ]
За качественно выполненный заказ вы получите дополнительно 200 единиц опыта.

Дополнительно: как приобрести спелл, не прибегая к этой теме

0. Пройдитесь по базе способностей xgm.guru/p/wc3/tag/ability
A. Для начала загляните в Архив готовых спеллов. Возможно, спелл, аналогичный вашему, уже был сделан.
B. Проверьте, нет-ли нужного спелла в Библиотеке заклинаний. Проверенные спелл-мейкеры изготавливали заклинания специально для общественного использования.
C. Поищите общедоступные для открытия карты - там тоже бывают полезные вещи.
D. Если ничего не помогает, пройдитесь поиском по Академии - вероятно, что такие спеллы уже пытались делать и спрашивали как.
E. Если поиски не помогли, попробуй сделать его сам:
  • Осваиваем триггеры в Базе статей, F.A.Q., если не имеем понятия о них.
  • Существуют специальные статьи по созданию спеллов и баффов: 1, 2, 3, 4, 5
  • Поскольку ваши спеллы будут неоптимизированы, и более того, с кучей утечек - настоятельно рекомендуется читать статьи\темы про JASS. Тяжело читать? Легко делать!
  • Если ну никак не выходит сделать то что требуется, заходим в Академию и используем ее по основному назначению - задаем вопросы.

Разумные поиски и тщательное изучение помогут вам добиться результата.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Этот комментарий удален
0
24
2 года назад
Отредактирован NilasAran_39
0

Заказ

Название: Лесная Стена
Метод: Любой, лишь бы был оптимизирован и не лагал
Цель: AOE (Стана\Линия\Вектор\По направляющей)
Уровни: 1
Описание: Создание лесного массива, в указанной точке. Заклинание попадает в указанную точку, например визуальный эффект в виде выстрела зелёной энергией (энергией природы), и на этом месте вырастает лес, вырастает сразу и навсегда, до тех пор, пока его не срубят.

Кто возьмется за исполнение оповестите в личку, добавлю в соавторы проекта.
2
27
2 года назад
2
NilasAran_39, лесная стена по направлению к точке каста или перпендикулярно кастующему?
3
27
2 года назад
3

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

Заказчик: NilasAran_39
Способность: Лесная Стена
Выполнено: Да

короче подробностей было очень мало поэтому остальное я сделал на своё усмотрение, все настройки в коде, я добавил комменты что можешь изменять
код
library SpellCastLib
globals
    private constant timer TempTimer = CreateTimer( )
    private constant real timerPeriodic = 0.01
    
    private integer max = 0

    private unit array dummy
    
    private real array startx
    private real array starty
    private real array startz
    private real array midx
    private real array midy
    private real array midz
    private real array endx
    private real array endy
    private real array endz
    private real array lastx
    private real array lasty
    
    private real array time
    private real array maxTime
    
    private location LFZ = Location( 0.00, 0.00 )
endglobals

private function GetLocZ takes real x, real y returns real
    call MoveLocation( LFZ, x, y )
    return GetLocationZ( LFZ )
endfunction

private function move takes nothing returns nothing
    local real x
    local real y
    local real z
    local integer i
    
    set i = 1
    loop
        set x = startx[i] + ( ( 2.00 * ( midx[i] - startx[i] ) ) + ( startx[i] - 2.00 * midx[i] + endx[i] ) * time[i] ) * time[i]
        set y = starty[i] + ( ( 2.00 * ( midy[i] - starty[i] ) ) + ( starty[i] - 2.00 * midy[i] + endy[i] ) * time[i] ) * time[i]
        set z = startz[i] + ( ( 2.00 * ( midz[i] - startz[i] ) ) + ( startz[i] - 2.00 * midz[i] + endz[i] ) * time[i] ) * time[i]
        
        call SetUnitX( dummy[i], x )
        call SetUnitY( dummy[i], y )
        call SetUnitFlyHeight( dummy[i], z - GetLocZ( x, y ), 0.00 )
        call SetUnitFacing( dummy[i], Atan2( y - lasty[i], x - lastx[i] ) * bj_RADTODEG )
        
        set lastx[i] = x
        set lasty[i] = y
        
        set time[i] = time[i] + timerPeriodic / maxTime[i]
        
        if time[i] >= 1.00 then
            call KillUnit( dummy[i] )
            call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\NightElf\\EntBirthTarget\\EntBirthTarget.mdl", x, y ) )
            call CreateDestructable( 'ATtr', x, y, 270.00, 1.00, GetRandomInt( 0, 4 ) )
            
            if i != max then
                set dummy[i] = dummy[max]
                
                set startx[i] = startx[max]
                set starty[i] = starty[max]
                set startz[i] = startz[max]
                
                set lastx[i] = lastx[max]
                set lasty[i] = lasty[max]
                
                set endx[i] = endx[max]
                set endy[i] = endy[max]
                set endz[i] = endz[max]
                
                set midx[i] = midx[max]
                set midy[i] = midy[max]
                set midz[i] = midz[max]
                
                set time[i] = time[max]
                set maxTime[i] = maxTime[max]
            endif
            
            set dummy[max] = null
            
            set i = i - 1
            set max = max - 1
            
            if max <= 0 then
                call PauseTimer( TempTimer )
            endif
        endif
        
        set i = i + 1
        exitwhen i > max
    endloop
endfunction

function Trig_SpellCast_Actions takes nothing returns nothing
    local unit caster = GetTriggerUnit( )
    local real x = GetSpellTargetX( )
    local real y = GetSpellTargetY( )
    local real angle
    local real angle1
    local real angle2
    local real distance
    local integer i
    local integer count = 10 // кол-во деревьев
    local boolean b 
    local real d
    
    set b = count / 2 * 2 == count
    
    if b then
        set d = 32.00 // начальная дистанция между деревьями
        set angle2 = 5.00 // начальный угол полёта
    else
        set d = 0.00
        set angle2 = 0.00
    endif
    
    set angle1 = Atan2( y - GetUnitY( caster ), x - GetUnitX( caster ) )
    
    set i = 1
    loop
        set max = max + 1
        
        set startx[max] = GetUnitX( caster )
        set starty[max] = GetUnitY( caster )
        set startz[max] = GetLocZ( startx[max], starty[max] ) + 50.00 + GetUnitFlyHeight( caster )
        
        set lastx[max] = startx[max]
        set lasty[max] = starty[max]
        
        set dummy[max] = CreateUnit( GetOwningPlayer( caster ), 'u000', startx[max], starty[max], angle1 * bj_RADTODEG )
        
        call UnitAddAbility( dummy[max], 'Arav' )
        call UnitRemoveAbility( dummy[max], 'Arav' )
        call SetUnitPathing( dummy[max], false )
        call SetUnitX( dummy[max], startx[max] )
        call SetUnitY( dummy[max], starty[max] )
        call SetUnitFlyHeight( dummy[max], startz[max], 0.00 )
        
        if b then
            set endx[max] = x + d * Cos( angle1 + 90.00 * bj_DEGTORAD )
            set endy[max] = y + d * Sin( angle1 + 90.00 * bj_DEGTORAD )
        else
            set endx[max] = x + d * Cos( angle1 - 90.00 * bj_DEGTORAD )
            set endy[max] = y + d * Sin( angle1 - 90.00 * bj_DEGTORAD )
        endif
        
        set endz[max] = GetLocZ( endx[max], endy[max] )
        set angle     = Atan2( endy[max] - starty[max], endx[max] - startx[max] )
        set distance  = SquareRoot( ( endx[max] - startx[max] ) * ( endx[max] - startx[max] ) + ( endy[max] - starty[max] ) * ( endy[max] - starty[max] ) )
        
        if b then
            set midx[max] = startx[max] + distance / 2.00 * Cos( angle + angle2 * bj_DEGTORAD )
            set midy[max] = starty[max] + distance / 2.00 * Sin( angle + angle2 * bj_DEGTORAD )
            set midz[max] = GetLocZ( midx[max], midy[max] )
            
            set b = false
        else
            set midx[max] = startx[max] + distance / 2.00 * Cos( angle - angle2 * bj_DEGTORAD )
            set midy[max] = starty[max] + distance / 2.00 * Sin( angle - angle2 * bj_DEGTORAD )
            set midz[max] = GetLocZ( midx[max], midy[max] )
            
            set angle2 = angle2 + 10.00 // доп угол
            set d = d + 64.00 // расстояние между деревьями
            set b = true
        endif
        
        if startz[max] < endz[max] then
            set midz[max] = midz[max] + endz[max]
        else
            set midz[max] = midz[max] + startz[max]
        endif
        
        set midz[max] = midz[max] + 50.00
        
        set time[max] = 0.00
        set maxTime[max] = distance * timerPeriodic * 0.20 // скорость полёта
        
        if max == 1 then
            call TimerStart( TempTimer, timerPeriodic, true, function move )
        endif
        
        set i = i + 1
        exitwhen i > count
    endloop
    
    set caster = null
endfunction
endlibrary

function Trig_SpellCast_Conditions takes nothing returns boolean
    return GetSpellAbilityId( ) == 'A000' // равкод абилки
endfunction

//===========================================================================
function InitTrig_SpellCast takes nothing returns nothing
    set gg_trg_SpellCast = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SpellCast, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_SpellCast, Condition( function Trig_SpellCast_Conditions ) )
    call TriggerAddAction( gg_trg_SpellCast, function Trig_SpellCast_Actions )
endfunction


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

NilasAran_39, лесная стена по направлению к точке каста или перпендикулярно кастующему?
Шикарно! просто 10\10 Ты просто красавчек!
0
24
2 года назад
Отредактирован NilasAran_39
0

Заказ

Название: Система тоннелей\Подземный переход
Метод: Любой но желательно Jass (лишь бы не лагал и был прост в переносе)
Уровни: 1 (способность для здания)
Описание: В подземный переход который может построить игрок входят юниты и остаются там как внутри дирижабля, проход связывается с сетью тоннелей и юниты можно выпустить из любого такого же проход, где угодно, а именно там где игрок его построит. Важно чтобы связывались все точки перехода, а не два тоннеля по отдельности. Так же важно чтобы вошедшие и вышедшие юниты были одними и теме же а не другими, то есть если в здание вошёл юнит с маркировкой (А), то он же должен выйти из тоннеля а не юнит такого же типа с маркировкой (Б).
0
4
2 года назад
0

Заказ

Название: Отточенная стрельба
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 30
Описание: Принцип тот же, что и у пассивки Повелителя Огня, но погибшие юниты должны не взрываться с нанесением урона, а просто умирать, оставляя труп. С каждым уровнем способности накопительный урон равен 1/2/3/4...30 ед.

Сама способность пассивная
0
3
2 года назад
0
Название: Отравленная сетка (способность предмета)
Метод: любой, лишь бы в WC Reforged работало)
MUI: Должна быть возможность использования предмета несколькими героями параллельно🙄
Цель: Другой юнит
Количество уровней: 1
Описание: Нужна способность как стандартная сетка (опутывание), но чтобы помимо самой сетки был наложен эффект отравленного оружия, время действия сетки - 10 сек., яда - 20 сек., 2 ед. урона/сек. длительность на героев 5 и 10 сек соответственно.
П.С. стыдно немного по таким пустякам обращаться, но на самостоятельное обучение свободного времени нет. За старания готов скинуть на пивко😉
0
27
2 года назад
Отредактирован rsfghd
0
Яшка, стандартную сетку/яд можно при этом брать?
0
27
2 года назад
0

Заказ принят

Заказчик: MaxIKor
Способность: Отточенная стрельба
Спелл будет завершен к: возможно сегодня
1
27
2 года назад
1

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

Заказчик: MaxIKor
Способность: Отточенная стрельба
Выполнено: Да

инструкция по импорту
скопируй папку к себе в карту, на основе яда создай абилку для героя (можешь просто скопировать из карты), в триггере DamageEventGUI указываешь эту абилку и в коде триггера DamageEvent заклинания от этого яда, так же в коде есть время, через которое нужно удалять стаки с юнита (там стоит 3 сек), в принципе там больше нечего изменять
не уверен есть ли какие-то баги и в принципе если будут трудности с импортом, можешь написать, я попробую исправить/помочь
код
делал на вджассе
library DamageEventLib
globals
    private constant hashtable H     = InitHashtable( )
    private constant timer TempTimer = CreateTimer( )
    private constant group TempGroup = CreateGroup( )
endglobals

private struct UnitStruct
    integer attacker
    integer damaged
    integer count
    timer t
endstruct

private function RemoveStacks takes nothing returns nothing
    local timer t = GetExpiredTimer( )
    local UnitStruct A = LoadInteger( H, GetHandleId( t ), 0 )
    
    call RemoveSavedInteger( H, A.attacker, A.damaged )
    call FlushChildHashtable( H, GetHandleId( t ) )
    call DestroyTimer( t )
    
    set A.t = null
    set A.count    = 0
    set A.attacker = 0
    set A.damaged  = 0
    call A.destroy( )
    
    set t = null
endfunction

private function DamageEvent_Actions takes nothing returns nothing
    local UnitStruct A
    
    set udg_damaged = GetTriggerUnit( )
    
    if GetUnitAbilityLevel( udg_damaged, 'Bssd' ) > 0 then // заклинания яда
        call UnitRemoveAbility( udg_damaged, 'Bssd' )
        
        set udg_damage = GetEventDamage( )
        set udg_attacker = GetEventDamageSource( )
        set A = LoadInteger( H, GetHandleId( udg_attacker ), GetHandleId( udg_damaged ) )
        
        if A == 0 then
            set A = UnitStruct.create( )
            set A.t = CreateTimer( )
            set A.attacker = GetHandleId( udg_attacker )
            set A.damaged = GetHandleId( udg_damaged )
            
            call SaveInteger( H, A.attacker, A.damaged, A )
            call SaveInteger( H, GetHandleId( A.t ), 0, A )
        endif
            
        call TimerStart( A.t, 3.00, false, function RemoveStacks ) // через какое время удалить стаки ( 3.00 сек )
        
        set A.count = A.count + 1
        set udg_count = A.count
        
        call TriggerExecute( gg_trg_DamageEventGUI )
        
        set A.count = udg_count
    endif
endfunction

//===========================================================================
private function Regist_2 takes nothing returns boolean
    call TriggerRegisterUnitEvent( gg_trg_DamageEvent, GetTriggerUnit( ), EVENT_UNIT_DAMAGED )
    
    return false
endfunction

private function Regist_1 takes nothing returns boolean
    call TriggerRegisterUnitEvent( gg_trg_DamageEvent, GetFilterUnit( ), EVENT_UNIT_DAMAGED )
    
    return false
endfunction

private function Regist takes nothing returns nothing
    if gg_trg_DamageEvent != null then
        call DestroyTrigger( gg_trg_DamageEvent )
    endif
    
    set gg_trg_DamageEvent = CreateTrigger(  )
    
    call GroupEnumUnitsInRect( TempGroup, bj_mapInitialPlayableArea, Condition( function Regist_1 ) )
    call TriggerAddAction( gg_trg_DamageEvent, function DamageEvent_Actions )
    
    call TimerStart( TempTimer, 600.00, false, function Regist )
endfunction

function InitTrig_DamageEvent takes nothing returns nothing
    local region rectRegion = CreateRegion( )
    local trigger trg = CreateTrigger( )
    
    call RegionAddRect( rectRegion, bj_mapInitialPlayableArea )
    call TriggerRegisterEnterRegion( trg, rectRegion, null )
    call TriggerAddCondition( trg, Condition( function Regist_2 ) )
    call TimerStart( TempTimer, 0.00, false, function Regist )
    
    set trg = null
    set rectRegion = null
endfunction
endlibrary
Загруженные файлы
0
3
2 года назад
Отредактирован Яшка
0
rsfghd:стандартную сетку/яд можно при этом брать?
Мне эту абилку уже создали😅
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.