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

Правила темы

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

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

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заклинания
  • Желаемый метод исполнения (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. Тяжело читать? Легко делать!
  • Если ну никак не выходит сделать то что требуется, заходим в Академию и используем ее по основному назначению - задаем вопросы.

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
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, если не принципиально, то бишь не включая тех. хар-ки, то это без проблем делается
3
13
2 года назад
Отредактирован rsfghd
3
Название: Кровавая баня
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1
Описание: В течение 10 сек, ваши атаки и способности вызывают у цели кровотечение, наносящее 40% дополнительного урона в течение 6 сек.
Технические характеристики: Нужны параметры для указания от каких способностей наносить урон.
Код
library SpellBleeding
//-----------------------     OPTION     ------------------------------------------
globals
    private real DURATION                                   = 6.0 // длительность кровотечения
    private real DAMAGE_AMOUNT                              = 0.40 // нанесенный урон за всю длительность, в %
    
    private constant integer SOURCE_BLEEDING_BUFF_ID        = 'BHds' // ид баффа под которым будет наносится урон кровотечением
    private constant integer TARGET_BLEEDING_ABILITY_ID     = 'Aasl' // ид способности у цели под кровотечением. Для создания эффекта на цели
    private constant integer SPELL_FOR_BLEEDING_IMMUNE      = 0 // ид способности которая добавит иммунитет к кровотечению
    private constant attacktype ATTACK_TYPE                 = ATTACK_TYPE_NORMAL // тип аттаки
    private constant damagetype DAMAGE_TYPE                 = DAMAGE_TYPE_NORMAL // тип урона
    private constant real TIME_FREQUENCY                       = 1.0 // частота срабативания кровотечения
endglobals

// функция фильтр для целей

private function isTypeTarget takes unit target returns boolean
    return GetWidgetLife(target) > 0 and not IsUnitType(target, UNIT_TYPE_MECHANICAL)
endfunction
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
globals
    private trigger damageEvent = CreateTrigger()
    private timer tickBleeding = CreateTimer()
endglobals

private struct spellBleeding
    static spellBleeding array spB
    static integer stash = 0
    real getDamage
    unit getSource
    unit getTarget
    real remainingTime
    
        private method clone takes spellBleeding dest returns nothing
            set getDamage = dest.getDamage
            set getSource = dest.getSource
            set getTarget = dest.getTarget
            set remainingTime = dest.remainingTime
        endmethod
    
        static method checkRemainingTime takes nothing returns nothing
            local integer i = 1
            local real bleedDamage = 0.
                loop
                    exitwhen i > stash
                        if spB[i].remainingTime <= 0.0 or GetWidgetLife(spB[i].getTarget) <= 0.0 then 
                            call UnitRemoveAbility(spB[i].getTarget, TARGET_BLEEDING_ABILITY_ID)
                            call spB[i].clone(spB[stash])
                            call spB[stash].destroy()
                            set stash = stash - 1
                        else
                            set bleedDamage = spB[i].getDamage / DURATION * DAMAGE_AMOUNT * TIME_FREQUENCY
                            if isTypeTarget(spB[i].getTarget) and GetUnitAbilityLevel(spB[i].getTarget, SPELL_FOR_BLEEDING_IMMUNE) < 1 then
                                call DisableTrigger(damageEvent)
                                call UnitDamageTarget(spB[i].getSource, spB[i].getTarget, bleedDamage, true, true, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE_WHOKNOWS)
                                call EnableTrigger(damageEvent)
                            endif
                            set spB[i].remainingTime = spB[i].remainingTime - TIME_FREQUENCY
                        endif
                    set i = i + 1
                endloop
            
        endmethod
        
        method addBleeding takes unit source, unit target, real damage returns nothing
            set stash = stash + 1
            set spB[stash] = this
            set getSource = source
            set getTarget = target
            set getDamage = damage
            set remainingTime = 6.0
            
            if GetUnitAbilityLevel(getTarget, TARGET_BLEEDING_ABILITY_ID) <= 0 then
                call UnitAddAbility(getTarget, TARGET_BLEEDING_ABILITY_ID)
            endif
        endmethod
endstruct

function everyTickBleeding takes nothing returns nothing
    call spellBleeding.checkRemainingTime()
endfunction

function onDamage takes nothing returns nothing
    local spellBleeding spb
    local unit source = GetEventDamageSource()
	local unit target = GetTriggerUnit()
    
        if GetUnitAbilityLevel(source, SOURCE_BLEEDING_BUFF_ID) > 0 and isTypeTarget(target) then
			set spb = spellBleeding.create()
            call spb.addBleeding(source,target,GetEventDamage())
        endif
    
    set source = null
	set target = null
endfunction
//===========================================================================
function Trig_Bleeding_Actions takes nothing returns nothing
    call TriggerRegisterUnitEvent(damageEvent, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
endfunction

function InitTrig_Bleeding takes nothing returns nothing
    local group g = CreateGroup()
    local unit e
    set gg_trg_Bleeding = CreateTrigger()
    
    call TriggerRegisterEnterRectSimple(gg_trg_Bleeding, GetPlayableMapRect())
    call TriggerAddAction( gg_trg_Bleeding, function Trig_Bleeding_Actions)
    call TriggerAddAction(damageEvent, function onDamage)
    
    call GroupEnumUnitsInRange(g, 0., 0., 99999., null)
        loop
            set e = FirstOfGroup(g)
            exitwhen e == null
                call TriggerRegisterUnitEvent(damageEvent, e, EVENT_UNIT_DAMAGED )
                call GroupRemoveUnit(g,e)
        endloop
        
        call GroupClear(g)
        call DestroyGroup(g)
        call TimerStart(tickBleeding, TIME_FREQUENCY, true, function everyTickBleeding)
    set g = null
    set e = null
endfunction

endlibrary
Загруженные файлы
1
27
2 года назад
1
Borodach, если на карте будет больше 700-800~ юнитов, то система накроется для остальных
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.