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

Правила темы

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

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

Необходимо, используя форму составить сообщение в данной теме, где указать:
  • Желаемое название заклинания
  • Желаемый метод исполнения (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
23
3 года назад
Отредактирован Obelick
0

Заказ

Название: Притягивание
Метод: Jass
MUI: Обязательно
Цель: Юнит
Количество уровней: 1
Описание:
Нужна простая наработка притягивания юнита к себе, ака хук. Эффект "молнии" делать не надо. Действует таргетно на юнита. Упарываться с переменными типа уровня, скорости, дальности, урона и т.д. - не надо. Нужна просто притягивалка. Кастер в это время может двигаться, а цель паузится и притягивается к текущей поз кастера. Остальное сам настрою.
Желательно сделать конечно через индексацию по игроку (больше 1 раза одновременно игрок применить не может), без хэш таблицы, я им в рефе не доверяю, десинкают постоянно.
0
28
3 года назад
Отредактирован Roy Mustang
0

Заказ 1

Название: Прыжок
Метод: Любой (было бы не плохо иметь переменные на ГУИ для оптимальной настройки)
MUI: Желательно
Цель: Юнит
Количество уровней: 1
Описание:
Дальность применения : 800
Герой (ИИ) прыгает на цель , наносит урон и замедляет всех рядом с целю (включая саму цель)
(способность нужна исключительно для ИИ боса героя)
Перезарядка 30 секунд.

Заказ 2

Название: Дикий Рывок
Метод: Любой (было бы не плохо иметь переменные на ГУИ для оптимальной настройки)
MUI: Желательно
Цель: Юнит
Количество уровней: 1
Описание:
Дальность применения : 1000
Герой (ИИ) начинает двигается набирая скорость к определенному герою - (нанося урон и отталкивая всех по пути) при достижение цели - отталкивает цель на 400 дальности и обездвиживает ее на пару секунд.
Перезарядка 50 секунд.
(не должно отталкивать юнитов через клифы)
3
27
3 года назад
Отредактирован rsfghd
3

Заказ принят

Заказчик: Roy Mustang
Способность: Прыжок
Примерный срок выполнения: Спелл закину сегодня ближе к вечеру

Заказ принят

Заказчик: Roy Mustang
Способность: Дикий Рывок
Примерный срок выполнения: Либо вместе с предыдущей абилкой, либо на следующий день
3
27
3 года назад
Отредактирован rsfghd
3

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

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

Инструкция по импорту:
Просто импортируешь либу mylib в свою карту (можно прямо в шапку)
Дальность применения и перезарядка могут быть любыми, спелл муи
Копируй все созданные на гуи переменные
Сам спелл юзается через функцию
function Jump takes unit caster, unit target, real dmg, real speed, real height, real tmper, boolexpr b, real radius, real dbtm returns nothing
Ты увидишь её на кастомскрипте, всё что тебе там в принципе можно поменять это периодичность таймера и названия переменных на свои
Замедление реализовано через ауру, чтобы с другими твоими замедлениями не конфликтовать
Ты можешь использовать свою хэш-таблицу, не создавая новой (их лимит 255 по моему), но учти, ради ауры мне пришлось взять одну ячейку юнита, то бишь если ты там что-то записываешь в юнита и не помнишь последнюю свободную ячейку, то лучше новую хэш-таблицу создать, чтобы спелл тебе ничего там не сломал. Ах да, использовать свою хэш-таблицу нужно через дефайн, я оставил там комментарии, но опять же, дефайн может вызвать какие-то непонятки и конфликтовать с кодом других людей. Если название твоей хэш-таблицы соответствует моей и ты хочешь её подставить, то просто удали private hashtable H = InitHashtable()
По коду лишь пару переменных тебе нужно изменить:
private constant attacktype AttackType = ATTACK_TYPE_MAGIC // Тип атаки
private constant damagetype DamageType = DAMAGE_TYPE_NORMAL // Тип урона
private constant integer AbilityID = 'A001' // Равкод ауры замедления
private constant integer AbilityID1 = 'Basl' // Равкод заклинания из ауры замедления
private constant integer UnitH = 0 // Свободная ячейка юнита для ауры
private constant integer ItemID = 'I000' // Получение предмета после завершения прыжка для своих действий
Я добавил показательный триггер пример, где юнит после приземления создаёт кратер, там можешь делать свои действия на гуи. Например выбрать всех юнитов вокруг юнита и повесить спецэффект. Ах да, если тебе не нужно замедление именно с ауры и ты предпочтёшь какой-нибудь даммикаст, то можешь в коде указать равкод ауры 0.
Всё в либе приватное и не должно конфликтовать с чужим кодом, исключение сама функция Jump.
Если нужно что-то переделать или доделать, то пиши
Код
library mylib initializer init
private hashtable H = InitHashtable()
//define private H = udg_Hash // если у тебя уже есть хэш-таблица, разкомменти эту строку вписав вместо udg_Hash название своей хэш-таблицы и удали предыдущую строку
//Внимание! Используется ячейка юнита в хэш-таблице, чтобы не сбивались ауры, если ты записывал какие-то значения в юнита и не помнишь ячейку, лучше создать ещё одну хэш-таблицу
private constant attacktype AttackType = ATTACK_TYPE_MAGIC // Тип атаки
private constant damagetype DamageType = DAMAGE_TYPE_NORMAL // Тип урона
private constant integer AbilityID = 'A001' // Равкод ауры замедления
private constant integer AbilityID1 = 'Basl' // Равкод заклинания из ауры замедления
private constant integer UnitH = 0 // Свободная ячейка юнита для ауры
private constant integer ItemID = 'I000' // Получение предмета после завершения прыжка для своих действий

private location LFZ = Location(0,0)
private group TempG = CreateGroup()
private group DebuffG = CreateGroup()
private real TempR = 0.
private real TempR1 = 0.
private timer DebuffT = CreateTimer()

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

private function ParabolaZ takes real h, real d, real x returns real
    return (4 * h / d) * (d - x) * (x / d)
endfunction

private function GetLocZ takes real x, real y returns real
    call MoveLocation(LFZ,x,y)
    return GetLocationZ(LFZ)
endfunction

private function RemoveF takes nothing returns nothing
    local unit u = GetEnumUnit()
    local integer i = GetHandleId(u)
    local real r = LoadReal(H,i,UnitH)-.01
    if r <= 0. then
        call RemoveSavedReal(H,i,UnitH)
        call GroupRemoveUnit(DebuffG,u)
        call UnitRemoveAbility(u,AbilityID)
        call UnitRemoveAbility(u,AbilityID1)
    else
        call SaveReal(H,i,UnitH,r)
    endif
    set u = null
endfunction
private function Remove takes nothing returns nothing
    call ForGroup(DebuffG,function RemoveF)
endfunction

private function Dmg takes nothing returns nothing
    local unit u = GetEnumUnit()
    call UnitDamageTarget(bj_lastCreatedUnit,GetEnumUnit(),TempR,false,false,AttackType,DamageType,null)
    if not IsUnitType(u,UNIT_TYPE_DEAD) then
        if LoadReal(H,GetHandleId(u),UnitH) <= 0. and AbilityID != 0 then
            set bj_groupCountUnits = 0
            call ForGroup(DebuffG,function CountUnitsInGroupEnum)
            call GroupAddUnit(DebuffG,u)
            call UnitAddAbility(u,AbilityID)
            if bj_groupCountUnits == 0 then
                call TimerStart(DebuffT,.01,true,function Remove)
            endif
        endif
        call SaveReal(H,GetHandleId(u),UnitH,TempR1)
    endif
    set u = null
endfunction

private function Move takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real s = LoadReal(H,i,2)
    local real a = LoadReal(H,i,4)
    local real x = GetUnitX(u)+s*Cos(a)
    local real y = GetUnitY(u)+s*Sin(a)
    local real d = LoadReal(H,i,5)-s
    local real d1 = LoadReal(H,i,9)+s
    local real d2 = LoadReal(H,i,7)
    
    call SetUnitX(u,x)
    call SetUnitY(u,y)
    call SetUnitFlyHeight(u,LoadReal(H,i,12)+ParabolaZ(LoadReal(H,i,6),d2,d)+(LoadReal(H,i,8)-GetLocZ(x,y)),0)
    
    if d2-d1 < s then
        set s = d2-d1
        set x = GetUnitX(u)+s*Cos(a)
        set y = GetUnitY(u)+s*Sin(a)
        call SetUnitX(u,x)
        call SetUnitY(u,y)
        call SetUnitFlyHeight(u,LoadReal(H,i,12),0)
        call PauseUnit(u,false)
        call SetUnitPathing(u,true)
        call UnitRemoveAbility(u,'Arav')
        set bj_lastCreatedUnit = u
        set TempR = LoadReal(H,i,1)
        set TempR1 = LoadReal(H,i,13)
        call GroupEnumUnitsInRange(TempG,x,y,LoadReal(H,i,10),LoadBooleanExprHandle(H,i,11))
        call ForGroup(TempG,function Dmg)
        call GroupClear(TempG)
        call DestroyBoolExpr(LoadBooleanExprHandle(H,i,11))
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
        call UnitAddItem(u,CreateItem(ItemID,0,0))
    else
        call SaveReal(H,i,5,d)
        call SaveReal(H,i,9,d1)
    endif
    
    set u = null
    set t = null
endfunction

function Jump takes unit caster, unit target, real dmg, real speed, real height, real tmper, boolexpr b, real radius, real dbtm returns nothing
    local timer t = CreateTimer()
    local integer i = GetHandleId(t)
    local real d = DBC(GetUnitX(caster),GetUnitY(caster),GetUnitX(target),GetUnitY(target))
    call SaveUnitHandle(H,i,0,caster)
    call SaveReal(H,i,1,dmg)
    call SaveReal(H,i,2,speed)
    call SaveReal(H,i,3,tmper)
    call SaveReal(H,i,4,Atan2(GetUnitY(target)-GetUnitY(caster),GetUnitX(target)-GetUnitX(caster)))
    call SaveReal(H,i,5,d)
    call SaveReal(H,i,6,height)
    call SaveReal(H,i,7,d)
    call SaveReal(H,i,8,GetLocZ(GetUnitX(caster),GetUnitY(caster)))
    call SaveReal(H,i,10,radius)
    call SaveBooleanExprHandle(H,i,11,b)
    call SaveReal(H,i,12,GetUnitFlyHeight(caster))
    call SaveReal(H,i,13,dbtm)
    call TimerStart(t,tmper,true,function Move)
    call UnitAddAbility(caster,'Arav')
    call SetUnitPathing(caster,false)
    call PauseUnit(caster,true)
    
    set t = null
endfunction

private function Res takes nothing returns nothing
    set bj_groupCountUnits = 0
    call ForGroup(DebuffG,function CountUnitsInGroupEnum)
    if bj_groupCountUnits == 0 then
        call PauseTimer(DebuffT)
    endif
endfunction

private function init takes nothing returns nothing
    call TimerStart(CreateTimer(),1,true,function Res)
endfunction

endlibrary
Загруженные файлы
3
27
3 года назад
Отредактирован rsfghd
3

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

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

Инструкция по импорту
Либо счётчик прикалывался, либо я просто не смог найти что у меня там утекает
Копируешь либу mylib в свою карту, если у тебя уже есть библиотека с таким названием - то переименовываешь мою
Дальность применения и перезарядка могут быть любыми, спелл муи, но может произойти перезапись переменной последнего кастера для гуи (ты поймёшь о чем я, когда глянешь как на гуи урон наносится в канал4)
Всё в библиотеке приватное за исключением функции WildDash
Первый раз пролагивает из-за абилок и эффектов, поэтому советую использовать прелоад
Если какие-то абилки тебе не нужны, то можешь выставить 0 и не создавать абилку
Большая часть настроек на гуи, остальные вверху библиотеки
Я так же сделал отдельную переменную где записывается достижение максимальной скорости кастера, ты можешь использовать её, например, для дополнительного урона (я оставил пример)
Если у тебя уже используется название этой переменной, то можешь воспользоваться дефайном и закинуть туда название (я оставил пример)
С последним кастером так же
Расскажу коротко о том, как работает переменная LastCaster. Перед любым нанесением урона, а так же при дамми-касте абилок для гуишных действий, эта переменная выставляется на кастера. Перезапись очень вероятна для гуишных действий (потому что даммикаст с задержкой), поэтому советую пользоваться с осторожностью. На моём примере с гуи уроном толкать юнитов может один кастер, а дамажить в итоге другой, но по коду с ней всё нормально и там есть специальная переменная для настройки урона при расталкивании, стоит на 0.00, если перенесёшь урон туда, то каждый кастер будет именно свои цели дамажить
Если что-то нужно доделать или переделать - пиши
Код
library mylib
private hashtable H = InitHashtable()
//define private H = udg_Hash // если у тебя уже есть хэш-таблица, разкомменти эту строку вписав вместо udg_Hash название своей хэш-таблицы и удали предыдущую строку, если названия совпадают - удали обе строки
//define private udg_CasterSpeed = название твоей переменной
//define private udg_LastCaster = название твоей переменной
private constant attacktype AttackType = ATTACK_TYPE_MAGIC // Тип атаки
private constant damagetype DamageType = DAMAGE_TYPE_NORMAL // Тип урона
private constant integer DummyID = 'u000' // Дамми-юнит для каста способностей
private constant integer ItemID = 'I000' // Предмет для проверки проходимости местности
private constant integer AbilityID = 'A001' // Способность при завершении разбега (для своих действий)
private constant integer AbilityID1 = 'A002' // Способность при столкновении кастера с препятствием
private constant integer AbilityID2 = 'A003' // Способность при столкновении цели с препятствием
private constant integer AbilityID3 = 'A004' // Способность при расталкивании юнитов
private constant integer AbilityID4 = 'A005' // Способность при завершении разбега если был задет таргет, применяемая на кастера
private constant integer AbilityID5 = 'A006' // Способность при завершении разбега если был задет таргет, применяемая на таргета
// Приказ каждой способности должен быть "channel"
//=============================================================================================
private group TempG = CreateGroup()
private real TempR = 0.
private real TempR1 = 0.
private real TempR2 = 0.
private real TempX = 0.
private real TempY = 0.
private timer TempT = null

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

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

private function SetUnitPositionEx takes unit u, real x, real y returns nothing
    local item i = CreateItem(ItemID,x,y)
    set TempR = DBC(GetItemX(i),GetItemY(i),x,y)
    if TempR > 10 then
        call SetUnitX(u,GetItemX(i))
        call SetUnitY(u,GetItemY(i))
    else
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endif
    call RemoveItem(i)
    set i = null
endfunction

private function SetAnim takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    call SetUnitAnimationByIndex(LoadUnitHandle(H,i,0),LoadInteger(H,i,1))
    call DestroyTimer(t)
    call FlushChildHashtable(H,i)
    set t = null
endfunction

private function CastAbil takes unit u, integer i returns nothing
    local unit u1 = CreateUnit(Player(15),DummyID,GetUnitX(u),GetUnitY(u),GetUnitFacing(u))
    if i != 0 then
        call UnitAddAbility(u1,i)
        call IssueTargetOrder(u1,"channel",u)
    endif
    call UnitApplyTimedLife(u1,'BTLF',1.)
    set u1 = null
endfunction

private function Dmg takes nothing returns nothing
    local unit u = GetEnumUnit()
    local real x = GetUnitX(u)
    local real y = GetUnitY(u)
    local real a = Atan2(y-TempY,x-TempX)
    call SetUnitPositionEx(u,x+TempR1*Cos(a),y+TempR1*Sin(a))
    call CastAbil(u,AbilityID3)
    if TempR2 != 0. then
        call UnitDamageTarget(udg_LastCaster,GetEnumUnit(),TempR2,false,false,AttackType,DamageType,null)
    endif
    set u = null
endfunction

private function Discarding takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local real s = LoadReal(H,i,1)
    local real d = LoadReal(H,i,2)
    local real a = LoadReal(H,i,4)
    local real x = GetUnitX(u)+s*Cos(a)
    local real y = GetUnitY(u)+s*Sin(a)
    local real dd = LoadReal(H,i,6)+s
    
    call SetUnitPositionEx(u,x,y)
    if TempR > 10 then
        set udg_LastCaster = LoadUnitHandle(H,i,5)
        call CastAbil(u,AbilityID2)
        call UnitDamageTarget(udg_LastCaster,u,LoadReal(H,i,3),false,false,AttackType,DamageType,null)
    endif
    if dd >= d or TempR > 10 or GetUnitTypeId(u) < 1 then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
    else
        call SaveReal(H,i,6,dd)
    endif
    
    set t = null
    set u = null
endfunction

private function Move takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer i = GetHandleId(t)
    local unit u = LoadUnitHandle(H,i,0)
    local unit u1 = LoadUnitHandle(H,i,1)
    local real r = LoadReal(H,i,4)
    local real a = Atan2(GetUnitY(u1)-GetUnitY(u),GetUnitX(u1)-GetUnitX(u))
    local real a1 = Atan2(GetUnitY(u)-GetUnitY(u1),GetUnitX(u)-GetUnitX(u1))
    local real ss = LoadReal(H,i,16)
    local real s = LoadReal(H,i,6)+ss
    local real x = GetUnitX(u)+s*Cos(a)
    local real y = GetUnitY(u)+s*Sin(a)
    local real x1 = GetUnitX(u1)+r*Cos(a1)
    local real y1 = GetUnitY(u1)+r*Sin(a1)
    local integer i2 = 0
    local integer i1
    set udg_LastCaster = u
    call SetUnitFacing(u,a*bj_RADTODEG)
    if DBC(x,y,x1,y1)-(r/2) < s then
        call SetUnitPositionEx(u,x1,y1)
        call UnitDamageTarget(u,u1,LoadReal(H,i,2),false,false,AttackType,DamageType,null)
        set TempT = CreateTimer()
        set i1 = GetHandleId(TempT)
        call SaveUnitHandle(H,i1,0,u1)
        call SaveReal(H,i1,1,LoadReal(H,i,11))
        call SaveReal(H,i1,2,LoadReal(H,i,12))
        call SaveReal(H,i1,3,LoadReal(H,i,2))
        call SaveReal(H,i1,4,Atan2(GetUnitY(u1)-GetUnitY(u),GetUnitX(u1)-GetUnitX(u)))
        call SaveUnitHandle(H,i1,5,u)
        call TimerStart(TempT,LoadReal(H,i,10),true,function Discarding)
        set TempT = null
        set i2 = 2
    else
        call SetUnitPositionEx(u,x,y)
        if TempR > 10 then
            call CastAbil(u,AbilityID1)
            set i2 = 1
        endif
    endif
    set TempR2 = LoadReal(H,i,3)
    set TempR1 = LoadReal(H,i,14)
    set TempX = GetUnitX(u)
    set TempY = GetUnitY(u)
    call GroupEnumUnitsInRange(TempG,TempX,TempY,r,LoadBooleanExprHandle(H,i,13))
    call ForGroup(TempG,function Dmg)
    call GroupClear(TempG)
    
    if i2 == 1 then
        set udg_LastCaster = u
        set TempR2 = LoadReal(H,i,7)
        call GroupEnumUnitsInRange(TempG,TempX,TempY,LoadReal(H,i,8),LoadBooleanExprHandle(H,i,13))
        call ForGroup(TempG,function Dmg)
        call GroupClear(TempG)
    endif
    
    if i2 == 1 or i2 == 2 or IsUnitDead(u) or IsUnitDead(u1) then
        call PauseTimer(t)
        call DestroyTimer(t)
        call FlushChildHashtable(H,i)
        call CastAbil(u,AbilityID)
        if i2 == 2 then
            call CastAbil(u,AbilityID4)
            call CastAbil(u1,AbilityID5)
        endif
        set udg_CasterSpeed = s
    else
        call SaveReal(H,i,16,ss+LoadReal(H,i,5))
    endif
    
    set u = null
    set u1 = null
    set t = null
endfunction

function WildDash takes unit caster, unit target, integer animation, real dmg, real dmg1, real radius, real sspeed, real speed, real dmg2, real radius1, real tmper, real dcper, real dc, real dd, real dc1, boolexpr b returns nothing
    local timer t = CreateTimer()
    local integer i = GetHandleId(t)
    
    call SaveUnitHandle(H,i,0,caster)
    call SaveUnitHandle(H,i,1,target)
    call SaveReal(H,i,2,dmg)
    call SaveReal(H,i,3,dmg1)
    call SaveReal(H,i,4,radius)
    call SaveReal(H,i,5,sspeed)
    call SaveReal(H,i,6,speed)
    call SaveReal(H,i,7,dmg2)
    call SaveReal(H,i,8,radius1)
    call SaveReal(H,i,9,tmper)
    call SaveReal(H,i,10,dcper)
    call SaveReal(H,i,11,dc)
    call SaveReal(H,i,12,dd)
    call SaveBooleanExprHandle(H,i,13,b)
    call SaveReal(H,i,14,dc1)
    call TimerStart(t,tmper,true,function Move)
    
    set t = CreateTimer()
    call SaveUnitHandle(H,GetHandleId(t),0,caster)
    call SaveInteger(H,GetHandleId(t),1,animation)
    call TimerStart(t,0.00,false,function SetAnim)
    
    set t = null
endfunction

endlibrary

так же поправил прыжок, теперь вместо предмета там тоже даммикаст и убрал удаление условия кому наносить урон, сорян за это))
Загруженные файлы
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
Простите за абилки, я переделаю под получение юнитом урона, урон можно будет самому настраивать непосредственно при получении нулевого урона, перед нанесением будет выставлено определенное число глобальной переменной, никакого даммикаста, проверять нужно будет только эту целочисленную
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.