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

Правила темы

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

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

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

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

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

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

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

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

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

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

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

Заказ

Название: Блуждающая звезда
Метод: GUI
MUI: Не обязательно
Цель: Область
Количество уровней: 2
Описание: От кастера к юниту-цели движется даммик, потом когда до юнита-цели остается "X" расстояние - даммик начинает вокруг юнита-цель двигаться случайным образом в "X" радиусе и раз в "Х" секунд он резко двигался и проходил сквозь юнита-цель. Потом через "Х" секунд заклинание кончается и даммик - умирает.
Технические характеристики: Желательно что бы скорость перемещения даммика так или иначе можно было редактировать. И маленькая приписка что и где.
Знаю заказ достаточно сложный тем более на GUI; прошу сделать то что получится.
23
Zahanc, ладно можешь попробовать, только подпиши что там и как до мелочей.
22
Araders:

Заказ

Название: Блуждающая звезда
Метод: GUI
MUI: Не обязательно
Цель: Область
Количество уровней: 2
Описание: От кастера к юниту-цели движется даммик, потом когда до юнита-цели остается "X" расстояние - даммик начинает вокруг юнита-цель двигаться случайным образом в "X" радиусе и раз в "Х" секунд он резко двигался и проходил сквозь юнита-цель. Потом через "Х" секунд заклинание кончается и даммик - умирает.
Технические характеристики: Желательно что бы скорость перемещения даммика так или иначе можно было редактировать. И маленькая приписка что и где.
Знаю заказ достаточно сложный тем более на GUI; прошу сделать то что получится.
// By Zahanc. Version 1. 2017-01-25.
library WanderingStarSpell initializer WanderingStarSpellInit

  globals
    // Meta settings
    public constant integer WANDERING_STAR_SPELL_ID = 'A000'
    public constant integer WANDERING_STAR_DUMMY_ID = 'n000'
    public constant string WANDERING_STAR_MISSILE_EFFECT_NAME = "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl"
    public constant string WANDERING_STAR_IMPACT_EFFECT_NAME = "Abilities\\Weapons\\DragonHawkMissile\\DragonHawkMissile.mdl"
    // End meta settings
    
    // Spell parameters
    private constant real missileSpeed = 1000.0
    private constant real missileSpeedWhenBouncing = missileSpeed * 3
    private constant real bouncingRange = 50.0
    private constant real bounceOffDistance = 500.0
    private constant real baseDurationSeconds = 5.0
    private constant real durationIncreasePerSpellLevel = 1.0
    private constant real baseDamagePerBounce = 20.0
    private constant real damageIncreasePerSpellLevel = 20.0
    private constant integer baseBouncesNumber = 3
    private constant integer bouncesNumberIncreasePerSpellLevel = 2
    // End spell parameters
    
    // Core variables
    private constant real UPDATE_LOOP_TIMER_TIMEOUT = 0.02
    private SpellEffect array spellEffects
    private integer spellEffectsAmount = 0
    
    
    // End core variables
  endglobals
  
  struct SpellEffect    
    public unit caster = null
    public unit target = null
    public integer spellLevel = 1
    
    private static constant integer MODE_FOLLOW = 1
    private static constant integer MODE_BOUNCE = 2
    
    private integer mode = SpellEffect.MODE_FOLLOW
    public effect missileEffect = null
    public unit missile = null
    private integer bounces = 0
    private location bounceOffLoc = null
    
    public method update takes nothing returns nothing
      local real x0 = GetUnitX(this.missile)
      local real y0 = GetUnitY(this.missile)
      local real z0 = GetUnitFlyHeight(this.missile)
      local real x1 = 0.0
      local real y1 = 0.0
      local real z1 = 0.0
      local real x = 0.0
      local real y = 0.0
      local real z = 0.0
      local real vectorMagnitude = 0.0
      local real f = 0.0
      local real damage = 0.0
      
      if IsUnitDeadBJ(this.target) then
        call this.destroy()
        return
      endif
      
      if SpellEffect.MODE_FOLLOW == this.mode then
        set x1 = GetUnitX(this.target)
        set y1 = GetUnitY(this.target)
        set z1 = GetUnitFlyHeight(this.target)
      elseif SpellEffect.MODE_BOUNCE == this.mode then
        set x1 = GetLocationX(this.bounceOffLoc)
        set y1 = GetLocationY(this.bounceOffLoc)
        set z1 = GetLocationZ(this.bounceOffLoc)
      endif
      
      set vectorMagnitude = SquareRoot((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)+(z1-z0)*(z1-z0))
      set x = x0 + ((x1 - x0) / vectorMagnitude) * missileSpeed * UPDATE_LOOP_TIMER_TIMEOUT
      set y = y0 + ((y1 - y0) / vectorMagnitude) * missileSpeed * UPDATE_LOOP_TIMER_TIMEOUT
      set z = z0 + ((z1 - z0) / vectorMagnitude) * missileSpeed * UPDATE_LOOP_TIMER_TIMEOUT
      set f = bj_RADTODEG * Atan2(y1 - y0, x1 - x0)
      
      call SetUnitX(this.missile, x)
      call SetUnitY(this.missile, y)
      call SetUnitFlyHeight(this.missile, z, 0.0)
      call SetUnitFacing(this.missile, f)
      
      // Do not count height when calculating collision.
      if SquareRoot((x1-x)*(x1-x)+(y1-y)*(y1-y)) <= bouncingRange and SpellEffect.MODE_FOLLOW == this.mode then
        set this.mode = SpellEffect.MODE_BOUNCE
        // FORMULA FOR DAMAGE CALCULATION
        set damage = baseDamagePerBounce + damageIncreasePerSpellLevel * I2R(this.spellLevel)
        call UnitDamageTarget(this.caster, this.target, damage, true, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        call DestroyEffect(AddSpecialEffect(WANDERING_STAR_IMPACT_EFFECT_NAME, x1, y1))
        
        call RemoveLocation(this.bounceOffLoc)
        // Use `location` to ensure the result is in game map bounds.
        set this.bounceOffLoc = Location(GetRandomReal(x1 - bounceOffDistance, x1 + bounceOffDistance), GetRandomReal(y1 - bounceOffDistance, y1 + bounceOffDistance))
        set this.bounces = this.bounces + 1
      elseif SquareRoot((x1-x)*(x1-x)+(y1-y)*(y1-y)) <= bouncingRange and SpellEffect.MODE_BOUNCE == this.mode then
        set this.mode = SpellEffect.MODE_FOLLOW
        call RemoveLocation(this.bounceOffLoc)
        set this.bounceOffLoc = null
      endif
      
      // FORMULA FOR BOUNCES AMOUNT CALCULATION
      if this.bounces >= baseBouncesNumber + bouncesNumberIncreasePerSpellLevel * this.spellLevel then
        call this.destroy()
      endif
    endmethod
    
    method onDestroy takes nothing returns nothing
      local integer i = 0
      
      set this.caster = null
      set this.target = null
      call DestroyEffect(this.missileEffect)
      set this.missileEffect = null
      call RemoveUnit(this.missile)
      set this.missile = null
      call RemoveLocation(this.bounceOffLoc)
      set this.bounceOffLoc = null
      
      loop
        exitwhen i >= spellEffectsAmount
        if this == spellEffects[i] then
          set spellEffectsAmount = spellEffectsAmount - 1
          set spellEffects[i] = spellEffects[spellEffectsAmount]
          set spellEffects[spellEffectsAmount] = 0
          return
        endif
        set i = i + 1
      endloop
    endmethod
  endstruct
  
  function CreateWanderingStarSpellEffect takes unit caster, unit target, integer spellLevel returns nothing
    local SpellEffect spellEffect = SpellEffect.create()
    set spellEffect.caster = caster
    set spellEffect.target = target
    set spellEffect.missile = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE), WANDERING_STAR_DUMMY_ID, GetUnitX(caster), GetUnitY(caster), GetUnitFacing(caster))
    call UnitAddAbility(spellEffect.missile, 'Avul')
    call UnitAddAbility(spellEffect.missile, 'Aloc')
    call UnitAddAbility(spellEffect.missile, 'Amrf')
    set spellEffect.missileEffect = AddSpecialEffectTarget(WANDERING_STAR_MISSILE_EFFECT_NAME, spellEffect.missile, "origin")
    
    set spellEffects[spellEffectsAmount] = spellEffect
    set spellEffectsAmount = spellEffectsAmount + 1
  endfunction
  
  function SpellUpdateLoopCallback takes nothing returns nothing
    local integer i = 0
    local SpellEffect next = 0
    
    loop
      exitwhen i >= spellEffectsAmount
      set next = spellEffects[i]
      call next.update()
      set i = i + 1
    endloop
  endfunction
  
  function OnSpellEffectPredicate takes nothing returns boolean
    return WANDERING_STAR_SPELL_ID == GetSpellAbilityId()
  endfunction

  function OnSpellEffect takes nothing returns nothing
    call CreateWanderingStarSpellEffect(GetSpellAbilityUnit(), GetSpellTargetUnit(), GetUnitAbilityLevel(GetSpellAbilityUnit(), WANDERING_STAR_SPELL_ID))
  endfunction

  function WanderingStarSpellInit takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    
    call TimerStart(CreateTimer(), UPDATE_LOOP_TIMER_TIMEOUT, true, function SpellUpdateLoopCallback)
    
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition( function OnSpellEffectPredicate))
    call TriggerAddAction(t, function OnSpellEffect)
    
    set t = null
  endfunction

endlibrary
MUI. Все настройки находятся в блоке глобальных переменных. Назначение каждого параметра должно быть понятно по названию.
Снаряд отскакивает только по горизонтали. Из-за того что расстояние на которое снаряд отскакивает случайное, количество урона на еденицу времени различается между применениями.
Я использую импортную модель подставного юнита, чтобы менять модель эффекта в коде а не в РО. Это позволяет иметь лишь один тип подставного юнита на все заклинания.
Загруженные файлы
22
Нужен JNGP, разумеется. Я делал на версии игры 1.26.
23
Zahanc, ну JNGP у меня установлен я через него открывал да и версия игры та же.
23
Zahanc, никакая, через редактор JNGP когда нажимаю проверку то вылезает меню игры.
22
Это ошибка в JNGP. Зависит от способа установки. Попробуйте пересохранить карту и протестировать после этого. Если не поможет, разместите файл карты в папке Maps, запустите игру, найдите карту в списке и проверьте так.
23

Заказ

Название: Блокирование
Метод: GUI
MUI: Обязательно, не знаю будут ли с этим проблемы?
Цель: Сам юнит
Количество уровней: 1
Описание: Юнит имеет возможность заблокировать 75% урона от любого типа атаки кроме типа атаки - хаос, но шанс на блокирование урона зависит от уровня цели от которой юнит получает урон.
1 уровень - 90%
2 уровень - 80%
3 уровень - 70%
4 уровень - 60%
5 уровень - 50%
Технические характеристики: хочется что бы работало как с нейтралами у которых есть свой уровень так и с героями которые могут его прокачивать.
22
Я думаю что выполнить это с помощью скриптов почти невозможно. Разве что с мемхаком. Возможно существуют похожие способности в РО, вроде пассивной способности лучниц ночных эльфов.
23
Zahanc, а что именно тяжело реализовать проверку уровня атакующего или защиту от типов урона?
24

Заказ

Название: Фростморн Жаждет Крови [Рунный Клинок Рыцаря Смерти]
Метод: GUI
MUI: Без разницы.
Цель: Юнит противника [Пассивка]
Описание: Рыцарь смерти убивает противника, и получает постоянную прибавку к ХП, атаке, регенерации маны, регенерации ХП и защите в размере 4\8\12% за убитого юнита, в плоть до бесконечности.
Примечание: Отдельно схожую способность для юнита, в ней "Пехотинец Смерти" получает прибавку в виде +2 атаки и защиты и 25 ХП за убитого, до 30 юнитов.
23
NilasAran_39, на GUI если честно запарно такое склеивать но например все эффекты кроме хп можно получить из стандартных аур но их нужно настроить на бонусы только для владельца ауры запихнуть в спелбук и тригерно повышать уровень аур за каждого убитого юнита.
24
Araders, Так я это и написал для тех кто может в ГУИ. И мне нужны не значаения через бафы, а значения которые плюсуются, к основным, как например апгрейды.

Araders, да и вообще ХП является приоритетом.
17
Araders:
NilasAran_39, ну тогда только через мемхак.
немного уже надоел этот мемхак,это делаеться через абилки
5
NilasAran_39, ledoed, для боевых единиц (не героев) не составит труда реализовать через GUI, ибо 30 прибавок это еще мало, однако для героев - это дикая проблема.
Первый момент, который придётся учесть - это изначальное* кол-во: здоровья, брони, урона, регенерации маны и здоровья (далее характеристик) героя. Исходя из значений последних добавлять некий процент.
Второй момент - броню основную (белую) не выйдет добавлять, а только дополнительную (зелёную). Предметов, что добавляют основную броню - нет, исходя из той информации, которой обладаю.
Регенерацию можно реализовать через таймер и увеличивать её до предела переменной real.
Если здоровье является основным параметром, что нужно добавить, а остальные не важны и возможно их убрать из наработки, то реализация данной способности проста. Используем работу GF RaiseD. Смотрим тут.
*Примечание: под изначальным принимается значение характеристик героя исключая добавленное с помощью наработки. В ином случае герой будет непобедимым безумцем, с каждым убитым, увеличивая не только процент характеристик, но и самого процента.
23
DazzleFirst, мне вот всегда было интересно почему некоторым индивидам необходимо что бы прибавка шла именно в основной стат вместо показа его как дополнительного. Мне вот кажется что просчитывать игру героем видя точные значения прибавок вместо увеличения изначальных намного удобнее.
DazzleFirst, если та наработка что ты прикрепил на JASS то плохая новость в том что: NilasAran_39 заказывает способность на GUI потому что хоть убей но JASS не знает.
24
Araders, Ты отчасти прав. Но по большому я не заказываю на JASS потому что он плохо переносится в мою карту и крешит её. А по скольку работа и так занял около 4-5 лет, 7 раз крешилась, дважды меняла свой вид, и делаю я её в одиночку, то не хотелось бы чтобы она нагнулась.
23
NilasAran_39, ну так если идут краши по поводу JASS смотри правильно ли ты перенес систему в карту иногда бывает что значения в полях кода необходимо заменить на свои в своей карте. Тем более кто тебе запрещает сделать резервную копию кампании и проверять там?
NilasAran_39, Но меня все же мучает вопрос: почему бонусы не должны отображаться в качестве бонусных статов, а добавляться к изначальному значению?
Чтобы оставить комментарий, пожалуйста, войдите на сайт.