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

Правила темы

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

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

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

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

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

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

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

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

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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
15
2 года назад
0
Гуванч, under11, Да у меня так сделано на GUI, это же легко
2
27
2 года назад
Отредактирован rsfghd
2

Заказ принят

Заказчик: mistwood
Способность: Призрачная стена
Спелл будет завершен к: без понятия
4
27
2 года назад
Отредактирован rsfghd
4

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

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

утечек нет, можешь не волноваться, закинул счётчик хэндлов как показатель, он растёт разово только потому что идёт присвоение глобалкам в первый раз, в общем-то, можно не ориентироваться на него
инструкция по импорту
триггер Spell это сам спелл (кэп), там редачить нечего в принципе, только переменная хэш-таблицы (об этом ниже)
триггер SpellCast включает в себя настройки и прочую пургу, ты разберёшься, я везде комменты расставил что можно редачить
триггер OnDamage вызывается после нанесения урона юниту, там ты можешь свои действия пихать, я оставил там пример с созданием эффекта на юните
триггер отделенный комментарием тебе не нужен
если у тебя есть переменная с названием H, то пройдись по коду триггера Spell автозаменой по этой букве, если у тебя уже есть хэш-таблица, то можешь закомментить третью строку и опять же, пройтись автозаменой с указанием своей хэш-таблицы, если всё это делать лень, добавь приставку private, тогда никаких несостыковок не будет, но имей ввиду, макс колво объявлений хэш-таблиц 255 вроде
если что-то не работает или работает не так, как ты хотел, или же нужна помощь с импортом - пиши в лс
код
library SpellLib
globals
    constant hashtable H           = InitHashtable( )
    private constant group TempG   = CreateGroup( )
    private constant group TempG_1 = CreateGroup( )
    private attacktype AttackType  = null
    private damagetype DamageType  = null
    private boolexpr TempBoolexpr  = null
    private real TempReal
endglobals

private struct SpellS
    unit caster
    real damage
    real radius
    real damagePeriodic
    real time
    group g
    attacktype AttackType
    damagetype DamageType
    boolexpr b
endstruct

private function Damage_2 takes nothing returns nothing
    set udg_TempUnit = GetEnumUnit( )
    if not IsUnitInGroup( udg_TempUnit, TempG_1 ) then
        call GroupAddUnit( TempG_1, udg_TempUnit )
        call UnitDamageTarget( udg_LastCaster, udg_TempUnit, TempReal, false, false, AttackType, DamageType, null )
        call TriggerExecute( gg_trg_OnDamage )
    endif
endfunction

private function Damage_1 takes nothing returns nothing
    call GroupEnumUnitsInRange( TempG, GetUnitX( GetEnumUnit( ) ), GetUnitY( GetEnumUnit( ) ), TempReal, TempBoolexpr )
    call ForGroup( TempG, function Damage_2 )
    call GroupClear( TempG )
endfunction

private function Damage takes nothing returns nothing
    local timer t  = GetExpiredTimer( )
    local SpellS A = LoadInteger( H, GetHandleId( t ), 0 )
    local unit u
    
    set A.time = A.time - A.damagePeriodic
    
    set AttackType     = A.AttackType
    set DamageType     = A.DamageType
    set TempBoolexpr   = A.b
    set udg_LastCaster = A.caster
    set TempReal       = A.radius
    call ForGroup( A.g, function Damage_1 )
    call GroupClear( TempG_1 )
    
    if A.time <= 0.00 then
        call FlushChildHashtable( H, GetHandleId( t ) )
        call DestroyTimer( t )
        
        loop
            set u = FirstOfGroup( A.g )
            exitwhen u == null
            call KillUnit( u )
            call GroupRemoveUnit( A.g, u )
        endloop
        
        call DestroyGroup( A.g )
        set A.g      = null
        set A.caster = null
        call A.destroy( )
    else
        call TimerStart( t, A.damagePeriodic, false, function Damage )
    endif
    
    set t = null
endfunction

function Spell_Actions takes unit caster, integer id, attacktype at, damagetype dt, real damage, real x, real y, real weight, real radius, real distance, real damagePeriodic, real time, boolexpr blxpr returns nothing
    local timer t   = CreateTimer( )
    local SpellS A  = SpellS.create( )
    local boolean b = true
    local real d    = distance / 2
    local real a    = Atan2( y - GetUnitY( caster ), x - GetUnitX( caster ) )
    local real xl   = Cos( a + ( 90 * bj_DEGTORAD ) )
    local real yl   = Sin( a + ( 90 * bj_DEGTORAD ) )
    local unit u
    
    set A.damage = damage
    set A.caster = caster
    set A.radius = radius
    set A.time   = time
    set A.b      = blxpr
    set A.AttackType     = at
    set A.DamageType     = dt
    set A.damagePeriodic = damagePeriodic
    
    set A.g    = CreateGroup( )
    set weight = weight / 2
    set bj_groupEnumOwningPlayer = GetOwningPlayer( A.caster )
    loop
        if b then
            set u = CreateUnit( bj_groupEnumOwningPlayer, id, x + d * xl, y + d * yl, 0.00 )
            set b = false
        else
            set u = CreateUnit( bj_groupEnumOwningPlayer, id, x - d * xl, y - d * yl, 0.00 )
            set b = true
            set d = d + distance
        endif
        call GroupAddUnit( A.g, u )
        exitwhen d >= weight
    endloop
    
    call SaveInteger( H, GetHandleId( t ), 0, A )
    call TimerStart( t, 0.00, false, function Damage )
    
    set u = null
    set t = null
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    //set gg_trg_Spell = CreateTrigger(  )
endfunction
endlibrary
Загруженные файлы
0
27
2 года назад
0

Заказ принят

Заказчик: Desgul
Способность: Рывок урсока
Спелл будет завершен к: примерно через час

подозреваю раз уж ты не просишь никаких взаимодействий с гуи, то сможешь настроить что нужно по коду, я оставлю комментарии
2
15
2 года назад
2
rsfghd, я избавляюсь от гуи потихоньку в карте=)
2
27
2 года назад
2

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

Заказчик: Desgul
Способность: Рывок урсока
Выполнено: Да

инструкция по иморту
копируешь триггер Spell и смотришь на код, там всего 100 строк, а основное, что нужно отредактировать имеет комментарии
ты не просил, но я накинул рандомные эффекты, можешь их удалить, они находятся в функции Move и имеют начало call DestroyEffect( ...
код
library SpellLib
globals
    constant hashtable H = InitHashtable( )
    private constant integer SpellID = 'A000' // спелл прыжка
    private constant integer SpellCD = 'A000' // спелл которому сбросить кд
endglobals

private struct SpellS
    unit caster
    unit target
    real speed
    real damage
    real range
    attacktype AttackType
    damagetype DamageType
endstruct

native UnitAlive takes unit id returns boolean

// само движение
private function Move takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    local real x   = GetUnitX( A.caster )
    local real y   = GetUnitY( A.caster )
    local real x1  = GetUnitX( A.target )
    local real y1  = GetUnitY( A.target )
    local real d   = SquareRoot( ( x - x1 ) * ( x - x1 ) + ( y - y1 ) * ( y - y1 ) )
    local integer i
    
    set x = x + A.speed * ( ( x1 - x ) / d )
    set y = y + A.speed * ( ( y1 - y ) / d )
    
    call SetUnitX( A.caster, x )
    call SetUnitY( A.caster, y )
    call IssueImmediateOrder( A.caster, "stop" )
    
    if SquareRoot( ( x - x1 ) * ( x - x1 ) + ( y - y1 ) * ( y - y1 ) ) <= A.range + A.speed or GetUnitTypeId( A.target ) == 0 or not UnitAlive( A.caster ) then
        if UnitAlive( A.caster ) and GetRandomInt( 0, 100 ) <= 15 then // восстановить хп юниту с 15% шансом
            call SetWidgetLife( A.caster, GetWidgetLife( A.caster ) + GetUnitState( A.caster, UNIT_STATE_MAX_LIFE ) * 0.15 )
            call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\VampiricAura\\VampiricAuraTarget.mdl", A.caster, "origin" ) )
        endif
        
        if GetRandomInt( 0, 100 ) <= 15 then // ресетнуть абилку с 15% шансом
            set i = GetUnitAbilityLevel( A.caster, SpellCD )
            call UnitRemoveAbility( A.caster, SpellCD )
            call UnitAddAbility( A.caster, SpellCD )
            call SetUnitAbilityLevel( A.caster, SpellCD, i )
        endif
        
        call UnitDamageTarget( A.caster, A.target, A.damage, false, false, A.AttackType, A.DamageType, null )
        call DestroyEffect( AddSpecialEffect( "Objects\\Spawnmodels\\Human\\HumanLargeDeathExplode\\HumanLargeDeathExplode.mdl", x1, y1 ) )
        
        call SetUnitPathing( A.caster, true )
        call FlushChildHashtable( H, GetHandleId( GetExpiredTimer( ) ) )
        call PauseTimer( GetExpiredTimer( ) )
        call DestroyTimer( GetExpiredTimer( ) )
        set A.caster = null
        set A.target = null
        call A.destroy( )
    endif
endfunction

private function SetAnim takes nothing returns nothing
    local SpellS A = LoadInteger( H, GetHandleId( GetExpiredTimer( ) ), 0 )
    
    // выставление анимок кастеру
    call SetUnitAnimation( A.caster, "attack slam" )
    call QueueUnitAnimation( A.caster, "stand" )

    call TimerStart( GetExpiredTimer( ), 0.01, true, function Move ) // периодичность полёта
endfunction

function Spell_Actions takes nothing returns boolean
    local timer t
    local SpellS A
    
    if GetSpellAbilityId( ) == SpellID then
        set t = CreateTimer( )
        set A = SpellS.create( )
        
        set A.caster = GetTriggerUnit( )     // тот, кто полетит
        set A.target = GetSpellTargetUnit( ) // тот, в кого полетят
        set A.range  = 100.00 // дистанция столкновения
        set A.speed  = ( SquareRoot( ( GetUnitX( A.caster ) - GetUnitX( A.target ) ) * ( GetUnitX( A.caster ) - GetUnitX( A.target ) ) + ( GetUnitY( A.caster ) - GetUnitY( A.target ) ) * ( GetUnitY( A.caster ) - GetUnitY( A.target ) ) ) - A.range ) * 0.015 // скорость
        set A.damage = GetHeroAgi( A.caster, true ) * ( 2.25 * GetUnitAbilityLevel( A.caster, SpellID ) ) // урон
        set A.AttackType = ATTACK_TYPE_NORMAL // тип атаки
        set A.DamageType = DAMAGE_TYPE_NORMAL // тип урона
        
        call SetUnitPathing( A.caster, false )
        call SaveInteger( H, GetHandleId( t ), 0, A )
        call TimerStart( t, 0.00, false, function SetAnim )
        
        set t = null
    endif
    
    return false
endfunction

//===========================================================================
function InitTrig_Spell takes nothing returns nothing
    local integer index = 0
    set gg_trg_Spell    = CreateTrigger(  )
    
    loop
        call TriggerRegisterPlayerUnitEvent( gg_trg_Spell, Player( index ), EVENT_PLAYER_UNIT_SPELL_EFFECT, null )
        set index = index + 1
        exitwhen index >= 16
    endloop
    call TriggerAddCondition( gg_trg_Spell, Condition( function Spell_Actions ) )
endfunction

endlibrary


Загруженные файлы
0
15
2 года назад
0

Заказ

Название: Кровавая баня
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1
Описание: В течение 10 сек, ваши атаки и способности вызывают у цели кровотечение, наносящее 40% дополнительного урона в течение 6 сек.
Технические характеристики: Нужны параметры для указания от каких способностей наносить урон.
1
14
2 года назад
Отредактирован Гуванч
1
Desgul:

Заказ

Название: Кровавая баня
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1
Описание: В течение 10 сек, ваши атаки и способности вызывают у цели кровотечение, наносящее 40% дополнительного урона в течение 6 сек.
Технические характеристики: Нужны параметры для указания от каких способностей наносить урон.
это нужно детектить получение урона ну или если способности триггерные то добавлять условие что у цели есть бафф этого спела, если твои способности триггерные могу сделать
и как это понимать? в начале 10 сек. в конце 6 сек.
1
27
2 года назад
Отредактирован rsfghd
1
Гуванч, что непонятного?)
10 секунд висит бафф который позволяет накладывать кровотечение с атак и умений длиной 6 сек, сам спелл упирается либо в мемхак либо наличие триггерных спеллов у данного героя, потому что там не все источники урона от юнита, а с указанием конкретных спеллов
0
15
2 года назад
0
rsfghd, Ну можно сказать что от всех источников урона от юнита
2
27
2 года назад
Отредактирован rsfghd
2
Desgul, если не принципиально, то бишь не включая тех. хар-ки, то это без проблем делается
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.