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

Правила темы

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

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

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заклинания
  • Желаемый метод исполнения (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
22
6 лет назад
Отредактирован Zahanc
0
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. Все настройки находятся в блоке глобальных переменных. Назначение каждого параметра должно быть понятно по названию.
Снаряд отскакивает только по горизонтали. Из-за того что расстояние на которое снаряд отскакивает случайное, количество урона на еденицу времени различается между применениями.
Я использую импортную модель подставного юнита, чтобы менять модель эффекта в коде а не в РО. Это позволяет иметь лишь один тип подставного юнита на все заклинания.
Загруженные файлы
0
23
6 лет назад
0
Zahanc, не запускается.
0
22
6 лет назад
0
Нужен JNGP, разумеется. Я делал на версии игры 1.26.
0
23
6 лет назад
0
Zahanc, ну JNGP у меня установлен я через него открывал да и версия игры та же.
0
22
6 лет назад
0
Какая ошибка возникает?
0
23
6 лет назад
Отредактирован Araders
0
Zahanc, никакая, через редактор JNGP когда нажимаю проверку то вылезает меню игры.
0
22
6 лет назад
0
Это ошибка в JNGP. Зависит от способа установки. Попробуйте пересохранить карту и протестировать после этого. Если не поможет, разместите файл карты в папке Maps, запустите игру, найдите карту в списке и проверьте так.
0
23
6 лет назад
0
Zahanc, пересохранил роботает.
0
23
6 лет назад
Отредактирован Araders
0

Заказ

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