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

Правила темы

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

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

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

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
5
27
3 года назад
Отредактирован rsfghd
5

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

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

Код
function Trig_huk_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A000' and udg_Int[GetPlayerId(GetOwningPlayer(GetTriggerUnit()))] == 0
endfunction

function DBC takes real x, real y, real x1, real y1 returns real
   return SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1)) 
endfunction 

function IsUnitDead takes unit u returns boolean
    return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) < 1
endfunction

function Move takes nothing returns nothing
    local integer ForLoop = 1
    local integer i = 0
    local real speed = 10
    local real radius = 50
    local real a
    local real x
    local real y
    local real x1
    local real y1
    loop
        exitwhen ForLoop > udg_Count
        if not IsUnitDead(udg_Target[ForLoop]) and not IsUnitDead(udg_Caster[ForLoop]) then
            set x = GetUnitX(udg_Target[ForLoop])
            set y = GetUnitY(udg_Target[ForLoop])
            set x1 = GetUnitX(udg_Caster[ForLoop])
            set y1 = GetUnitY(udg_Caster[ForLoop])
            set a = Atan2(y1-y,x1-x)
            call SetUnitX(udg_Target[ForLoop],x+speed*Cos(a))
            call SetUnitY(udg_Target[ForLoop],y+speed*Sin(a))
            if DBC(x1,y1,x+speed*Cos(a),y+speed*Sin(a)) < radius then
                set i = 1
            endif
        else
            set i = 1
        endif
        if i == 1 then
            set udg_Int[GetPlayerId(GetOwningPlayer(udg_Caster[ForLoop]))] = 0
            if udg_Count > 1 then
                set udg_Caster[ForLoop] = udg_Caster[udg_Count]
                set udg_Target[ForLoop] = udg_Target[udg_Count]
                set ForLoop = ForLoop - 1
            else
                call PauseTimer(udg_Timer)
            endif
            call PauseUnit(udg_Target[udg_Count],false)
            set udg_Caster[udg_Count] = null
            set udg_Target[udg_Count] = null
            set udg_Count = udg_Count - 1
            set i = 0
        endif
        set ForLoop = ForLoop + 1
    endloop
endfunction

function Trig_huk_Actions takes nothing returns nothing
    if udg_Count == 0 then
        call TimerStart(udg_Timer,0.03,true,function Move)
    endif
    set udg_Count = udg_Count + 1
    set udg_Caster[udg_Count] = GetTriggerUnit()
    set udg_Target[udg_Count] = GetSpellTargetUnit()
    call PauseUnit(udg_Target[udg_Count],true)
    set udg_Int[GetPlayerId(GetOwningPlayer(udg_Caster[udg_Count]))] = 1
endfunction

//===========================================================================
function InitTrig_huk takes nothing returns nothing
    set gg_trg_huk = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_huk, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_huk, Condition( function Trig_huk_Conditions ) )
    call TriggerAddAction( gg_trg_huk, function Trig_huk_Actions )
endfunction
Загруженные файлы
3
27
3 года назад
Отредактирован rsfghd
3

Заказ принят

Заказчик: Roy Mustang
Способность: Captain's pressence
Примерные сроки исполнения: завтра (16.05.21)
5
27
3 года назад
Отредактирован rsfghd
5

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

Заказчик: Roy Mustang
Способность: Captain's pressence
Выполнено: Да

Может есть какие-то баги или недоработки у системы, но я не обнаружил
Инструкция по импорту:
Просто копируешь либу mylib, можно прямо в шапку карты. Если есть библиотека с таким названием, то можешь переименовать мою
Скопируй способности и установи нужные уровни. Тебе нужно Благословение Элуны и Предмет: повышение защиты с нужным количеством уровней (пользуйся автозаполнением)
Поместить эти абилки в книгу заклинаний, с остальным я думаю сам разберёшься. Я не тестировал эту систему при большом кол-ве юнитов, так что возможны подлаги, снизить их периодичность можно будет таймером. Если рядом 2 юнита с аурой и у одного бафф будет более высокого уровня, то предпочтение отдастся ему
Если нужно что-то переделать или доделать - пиши
Код
library mylib initializer init
private constant integer DummyID = 'hfoo' // Юнит для прелоада способностей
private constant integer AbilityID = 'A000' // Благословение Элуны
private constant integer AbilityID1 = 'A002' // Способность предмета на защиту
private constant integer AbilityID2 = 'A001' // Спеллбук со способностями выше
private constant integer AbilityID3 = 'A003' // Аура
private constant integer AbilityID4 = 'BOae' // Заклинание ауры
private constant integer DefenseLvl = 1 // Фактор константы повышения уровня защиты (+1 защита за уровень)
private constant integer AbilityIDMaxLvl = 10 // Максимальный уровень ауры
private constant integer AbilityID1MaxLvl = 100 // Максимальный уровень способности предмета на защиту
private constant real Radius = 725 // Максимальный радиус для поиска ауры
private constant real AuraPeriodic = 0.25 // Периодичность проверки аур

private integer TempI = 0
private group TempG = CreateGroup()
private group TempG1 = CreateGroup()

private function AuraCond2 takes nothing returns boolean
    set bj_lastReplacedUnit = GetFilterUnit()
    return not (IsUnitType(bj_lastReplacedUnit,UNIT_TYPE_DEAD) or GetUnitTypeId(bj_lastReplacedUnit) < 1) and GetUnitAbilityLevel(bj_lastReplacedUnit,AbilityID3) > 0 and IsUnitAlly(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit))
endfunction
private function AuraCond takes nothing returns boolean
    return GetUnitAbilityLevel(GetFilterUnit(),AbilityID4) > 0
endfunction
private function SetMaxUnitAura takes nothing returns nothing
    if GetUnitAbilityLevel(GetEnumUnit(),AbilityID3) > TempI then
        set TempI = GetUnitAbilityLevel(GetEnumUnit(),AbilityID3)
    endif
endfunction
private function AddSetBuffs takes nothing returns nothing
    set bj_lastCreatedUnit = GetEnumUnit()
    call GroupEnumUnitsInRange(TempG1,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),Radius,Condition(function AuraCond2))
    call ForGroup(TempG1,function SetMaxUnitAura)
    call GroupClear(TempG1)
    if GetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID2) < 1 then
        call UnitAddAbility(bj_lastCreatedUnit,AbilityID2)
    endif
    if TempI == 0 or GetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID) > TempI then
        call UnitRemoveAbility(bj_lastCreatedUnit,AbilityID2)
        call UnitRemoveAbility(bj_lastCreatedUnit,AbilityID4)
    else
        call SetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID,TempI)
        call SetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID1,TempI*DefenseLvl)
    endif
    set TempI = 0
endfunction
private function Aura takes nothing returns nothing
    call GroupEnumUnitsInRect(TempG,bj_mapInitialPlayableArea,Condition(function AuraCond))
    call ForGroup(TempG,function AddSetBuffs)
    call GroupClear(TempG)
endfunction

private function CloseAbility takes nothing returns nothing
    call SetPlayerAbilityAvailable(GetEnumPlayer(),AbilityID2,false)
endfunction
private function init takes nothing returns nothing
    set bj_lastCreatedUnit = CreateUnit(Player(15),DummyID,0,0,0)
    call UnitAddAbility(bj_lastCreatedUnit,AbilityID2)
    call SetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID1,AbilityID1MaxLvl)
    call SetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID,AbilityIDMaxLvl)
    call UnitAddAbility(bj_lastCreatedUnit,AbilityID3)
    call SetUnitAbilityLevel(bj_lastCreatedUnit,AbilityID3,AbilityIDMaxLvl)
    call ForForce(bj_FORCE_ALL_PLAYERS,function CloseAbility)
    call RemoveUnit(bj_lastCreatedUnit)
    set bj_lastCreatedUnit = null
    call TimerStart(CreateTimer(),AuraPeriodic,true,function Aura)
endfunction

endlibrary
Загруженные файлы
2
28
3 года назад
2
rsfghd:
Огромное спасибо за проделанную работу!
0
27
3 года назад
Отредактирован rsfghd
0
я ожидал что меня тут на куски разорвут за распространение говнокода)
5
27
3 года назад
Отредактирован rsfghd
5
Простите за абилки, я переделаю под получение юнитом урона, урон можно будет самому настраивать непосредственно при получении нулевого урона, перед нанесением будет выставлено определенное число глобальной переменной, никакого даммикаста, проверять нужно будет только эту целочисленную
5
27
3 года назад
Отредактирован rsfghd
5
Вот, вместо переменной LastCaster можно использовать юнита триггера, а в качестве целей - источник повреждения (искл. прыжок, там только кастер), думаю теперь чуть больше возможностей открылось. Однако для этого в триггер нужно зарегистрировать событие, что юниты получают урон
Загруженные файлы
2
28
3 года назад
Отредактирован Roy Mustang
2
rsfghd:
Вот, вместо переменной LastCaster можно использовать юнита триггера, а в качестве целей - источник повреждения (искл. прыжок, там только кастер), думаю теперь чуть больше возможностей открылось. Однако для этого в триггер нужно зарегистрировать событие, что юниты получают урон
Эти карты не работают у меня , (я на редакторе 1.32+)

Способность: Captain's pressence - Так же выдает ошибку
такие же ошибки с другими 2 способностями
Загруженные файлы
1
27
3 года назад
1
Вероятно это из-за использование сджасса, для дефайнов. У меня нет рефа (
Попробую убрать сейчас

Вот, убрал всё связанное с сджассом, надеюсь заработает
Загруженные файлы
2
28
3 года назад
Отредактирован Roy Mustang
2
rsfghd:
Вероятно это из-за использование сджасса, для дефайнов. У меня нет рефа (
Попробую убрать сейчас

Вот, убрал всё связанное с сджассом, надеюсь заработает
Теперь и вовсе карту не октрывает
Загруженные файлы
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.