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

Правила темы

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

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

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заклинания
  • Желаемый метод исполнения (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
11
2 года назад
0
Непредвиденные обстоятельства, сегодня-завтра
2
11
2 года назад
2
Daro, готово
Загруженные файлы
0
28
2 года назад
0
Название: Advanced Defend
Метод: Jass/vJass (Переменные на gui хотелось бы + возможность добавлять доп действия при срабатывании способности)
MUI: Да
Цель: Переключаемое (на основе Defend Пехотница)
Количество уровней: 9
Описание :
Когда у героя поднят щит , есть шанс в 75% заблокировать 2% + (1.5% за каждый след уровень способности) урона когда атака происходит спереди
Если героя атакуют со сторон то количество заблокированного урона уменьшается до 50% от изначального блока (то есть 1% + 0.75% за уровень)
Загруженные файлы
1
27
2 года назад
1
Roy Mustang, а со спины фул урон?
2
28
2 года назад
Отредактирован Roy Mustang
2
Roy Mustang, а со спины фул урон?
Да, если атака со спины то способность просто не должна срабатывать.
2
22
2 года назад
2
rsfghd:
Если не сможешь, то могу подсказать, как на векторах сделать
1
27
2 года назад
Отредактирован rsfghd
1
ofeerist, тю, да я ж не балбес (наверное), это делается на изи
3
27
2 года назад
Отредактирован rsfghd
3

Заказ принят

Заказчик: Roy Mustang
Способность: Advanced Defend
Спелл будет завершен к: мб сегодня
3
27
2 года назад
Отредактирован rsfghd
3

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

Заказчик: Roy Mustang
Способность: Advanced Defend
Выполнено: Да

инструкция по импорту
копирнуть папку/триггеры и вставить в свою карту
т.к. я на патче 1.26 у меня нет нужных функций чтобы блочить урон, поэтому юзал NegateDamageLib от Прометея
по коду тебе нужно изменить в триггере DamageEvent несколько переменных
  • AbilityID - равкод переключаемой абилки, которая должна блочить урон
  • OrderIDUp - целочисленный приказ каста абилки (поднятия щита)
  • OrderIDDown - целочисленный приказ каста абилки (опускания щита)
  • MaxLifeBonusAbility - абилка, дающая хп
  • MaxLifeBonus - сколько хп даёт абилка выше
если ты умеешь менять урон самостоятельно (т.к. у тебя реф), то можешь избавиться от этой либы и от соответствующих функций в триггере Negate
если у тебя уже есть триггер отвечающий за получение юнитом урона, то возможно тебе понадобится дополнительная помощь с импортом, дабы не засорять лишними событиями игру, это уже по твоему желанию, можешь отписаться в лс
всё в принципе запривачено так что конфликтов быть не должно (искл если у тебя уже есть NegateDamageLib или похожие названия глобалок, в таком случае придётся создавать новые и по коду в DamageEvent_Actions заменить названия переменных на свои
если что-то работает не так, то опять же, пиши, разберёмся
код
library DamageEventLib
globals
    private constant group OrderGroup = CreateGroup( )
    private constant group TempG = CreateGroup( )
    private trigger trg  = null
    private unit bj_lastFilterUnit = null
    
    // specified
    private constant integer AbilityID   = 'Adef'
    private constant integer OrderIDUp   = 852055
    private constant integer OrderIDDown = 852056
endglobals

private function DamageEvent_Actions takes nothing returns nothing
    local real orientation
    local real lenght
    local real x
    local real y
    local real x1
    local real y1
    
    if IsUnitInGroup( GetTriggerUnit( ), OrderGroup ) then
        set udg_Damaged  = GetTriggerUnit( )
        set udg_Attacker = GetEventDamageSource( )
        set udg_Damage   = GetEventDamage( )
    
        set x1 = GetUnitX( udg_Damaged )
        set y1 = GetUnitY( udg_Damaged )
        set x  = GetUnitX( udg_Attacker )
        set y  = GetUnitY( udg_Attacker )
        set orientation = GetUnitFacing( udg_Damaged ) * bj_DEGTORAD 
        set lenght      = SquareRoot( ( x - x1 ) * ( x - x1 ) + ( y - y1 ) * ( y - y1 ) ) 
        set udg_Angle   = Acos( Cos( orientation ) * ( x - x1 ) / lenght + Sin( orientation ) * ( y - y1 ) / lenght ) * bj_RADTODEG
        
        call TriggerExecute( gg_trg_Negate )
    endif
endfunction

//===========================================================================

private function Order_Actions takes nothing returns nothing
    if GetUnitAbilityLevel( GetTriggerUnit( ), AbilityID ) > 0 then
        if GetIssuedOrderId( ) == OrderIDUp then
            call GroupAddUnit( OrderGroup, GetTriggerUnit( ) )
        elseif GetIssuedOrderId( ) == OrderIDDown then
            call GroupRemoveUnit( OrderGroup, GetTriggerUnit( ) )
        endif
    endif
endfunction

private function Death_Actions takes nothing returns nothing
    call GroupRemoveUnit( OrderGroup, GetTriggerUnit( ) )
endfunction

//===========================================================================
private function RegistEvent_2 takes nothing returns boolean
    set bj_lastFilterUnit = GetTriggerUnit( )
    if GetUnitAbilityLevel( bj_lastFilterUnit, 'Aloc' ) == 0 then
        call TriggerRegisterUnitEvent( trg, bj_lastFilterUnit, EVENT_UNIT_DAMAGED )
    endif
    return false
endfunction
private function RegistEvent_1 takes nothing returns boolean
    set bj_lastFilterUnit = GetFilterUnit( )
    if GetUnitAbilityLevel( bj_lastFilterUnit, 'Aloc' ) == 0 then
        call TriggerRegisterUnitEvent( trg, bj_lastFilterUnit, EVENT_UNIT_DAMAGED )
    endif
    return false
endfunction
private function RegistEvent takes nothing returns nothing
    if trg != null then
        call DestroyTrigger( trg )
    endif
    
    set trg = CreateTrigger( )
    call GroupEnumUnitsInRect( TempG, bj_mapInitialPlayableArea, Condition( function RegistEvent_1 ) )
    call TriggerAddCondition( trg, Condition( function DamageEvent_Actions ) )
    call TimerStart( GetExpiredTimer( ), 600.00, true, function RegistEvent )
endfunction

function InitTrig_DamageEvent takes nothing returns nothing
    local region rectRegion = CreateRegion( )
    local trigger t
    set gg_trg_DamageEvent  = CreateTrigger( )
    
    call RegionAddRect( rectRegion, bj_mapInitialPlayableArea )
    call TriggerRegisterEnterRegion( gg_trg_DamageEvent, rectRegion, null )
    call TriggerAddCondition( gg_trg_DamageEvent, Condition( function RegistEvent_2 ) )
    call TimerStart( CreateTimer( ), 0.00, false, function RegistEvent )
    
    set rectRegion = null
    
    set t = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_ORDER )
    call TriggerAddAction( t, function Order_Actions )
    
    set t = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_DEATH )
    call TriggerAddAction( t, function Death_Actions )
    
    set t = null
endfunction
endlibrary

//===========================================================================
// https://xgm.guru/p/wc3/negate-damage-lib
library NegateDamageLib
globals
    private constant group Group = CreateGroup()
    private constant timer Timer = CreateTimer()
    
    // MUST BE SPECIFIED
    public constant integer MaxLifeBonusAbility = 'A000'
    public constant integer MaxLifeBonus = 1000000
endglobals

native UnitAlive takes unit id returns boolean

private function ProcessUnits takes nothing returns nothing
    local unit u
    local real life2set
    
    loop
        set u = FirstOfGroup(Group)
        exitwhen u == null
        call GroupRemoveUnit(Group, u)
        
        if UnitAlive(u) then
            set life2set = GetWidgetLife(u)
            call UnitRemoveAbility(u, MaxLifeBonusAbility)
            call SetWidgetLife(u, life2set)
        else
            call UnitRemoveAbility(u, MaxLifeBonusAbility)
        endif
    endloop
endfunction

function NegateDamage takes unit u, real negated returns nothing
    local real life = GetWidgetLife(u)
    call GroupAddUnit(Group, u)
    call UnitAddAbility(u, MaxLifeBonusAbility)
    call SetWidgetLife(u, life + negated)
    
    call TimerStart(Timer, 0., false, function ProcessUnits)
endfunction

function GetUnitMaxHealth takes unit u returns real
    return GetUnitState(u, UNIT_STATE_MAX_LIFE) - MaxLifeBonus * GetUnitAbilityLevel(u, MaxLifeBonusAbility)
endfunction

endlibrary
Загруженные файлы
0
12
2 года назад
0
Daro, готово
Благодарю, уже не ждал, тыкнул плюс. А не будет ли проблем в том , что динамический триггер создается каждый раз при касте, не будет ли наслоений?
0
27
2 года назад
0
Daro, мб разве что цикл с бесконечным уроном может выпасть, который виснет вар, но вряд ли
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.