Заклинания на заказ

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

Правила темы

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

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

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

Разумные поиски и тщательное изучение помогут вам добиться результата.


Views: 252 034

» Лучшие комментарии


biridius #2103 - 3 months ago (изм. ) 0
Голосов: +0 / -0
mistwood, должно быть баг редактора тк у меня все сохранилось
что у тебя в файле AdicHelper\lib\cj_types.j в папке с жнгп? там вроде проблемная линия была которую удалить надо, что то сязанное с циклом for или while
mistwood #2104 - 3 months ago (изм. ) 0
Голосов: +0 / -0
AdicHelper\lib\cj_types.j
как-то так. пересохранил твою карту, такая же беда.
щас сек...
Прикрепленные файлы
biridius #2105 - 3 months ago (изм. ) 0
Голосов: +0 / -0
mistwood, удали строку с while(cond) и попробуй еще раз сохранить
mistwood #2106 - 3 months ago 0
Голосов: +0 / -0
biridius:
mistwood, удали строку с while(cond) и попробуй еще раз сохранить
Удалил 18 строку сохранил, та же фигня.... странно блин.
biridius #2107 - 3 months ago (изм. ) 0
Голосов: +0 / -0
mistwood, Adic Parser включен у тебя? щас снял галку и вышла такая же фигня как на твоем скрине, поставь галку туда
Прикрепленные файлы
mistwood #2108 - 3 months ago 0
Голосов: +0 / -0
biridius:
mistwood, Adic Parser включен у тебя? щас снял галку и вышла такая же фигня как на твоем скрине, поставь галку туда
да включен. все галки как у тебя. какой у тебя jngp? откуда качал? дай ссыль попробую снести.
Obelick #2109 - 3 months ago (изм. ) 0
Голосов: +0 / -0

Заказ

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

Заказ 1

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

Заказ 2

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

Заказ принят

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

Заказ принят

Заказчик: Roy Mustang
Способность: Дикий Рывок
Примерный срок выполнения: Либо вместе с предыдущей абилкой, либо на следующий день
rsfghd #2112 - 3 months ago (изм. ) 3
Голосов: +3 / -0

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

Заказчик: 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
Прикрепленные файлы
rsfghd #2113 - 3 months ago (изм. ) 3
Голосов: +3 / -0

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

Заказчик: 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

так же поправил прыжок, теперь вместо предмета там тоже даммикаст и убрал удаление условия кому наносить урон, сорян за это))
Прикрепленные файлы
rsfghd #2114 - 3 months ago (изм. ) 5
Голосов: +5 / -0

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

Заказчик: 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
Прикрепленные файлы
rsfghd #2115 - 3 months ago (изм. ) 3
Голосов: +3 / -0

Заказ принят

Заказчик: Roy Mustang
Способность: Captain's pressence
Примерные сроки исполнения: завтра (16.05.21)
rsfghd #2116 - 3 months ago (изм. ) 5
Голосов: +5 / -0

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

Заказчик: 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,Condit​ion(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
Прикрепленные файлы
Roy Mustang #2117 - 3 months ago 2
Голосов: +2 / -0
rsfghd:
Огромное спасибо за проделанную работу!
rsfghd #2118 - 3 months ago (изм. ) 0
Голосов: +0 / -0
я ожидал что меня тут на куски разорвут за распространение говнокода)
rsfghd #2119 - 2 months ago (изм. ) 5
Голосов: +5 / -0
Простите за абилки, я переделаю под получение юнитом урона, урон можно будет самому настраивать непосредственно при получении нулевого урона, перед нанесением будет выставлено определенное число глобальной переменной, никакого даммикаста, проверять нужно будет только эту целочисленную
rsfghd #2120 - 2 months ago (изм. ) 5
Голосов: +5 / -0
Вот, вместо переменной LastCaster можно использовать юнита триггера, а в качестве целей - источник повреждения (искл. прыжок, там только кастер), думаю теперь чуть больше возможностей открылось. Однако для этого в триггер нужно зарегистрировать событие, что юниты получают урон
Прикрепленные файлы
Roy Mustang #2121 - 2 months ago (изм. ) 2
Голосов: +2 / -0
rsfghd:
Вот, вместо переменной LastCaster можно использовать юнита триггера, а в качестве целей - источник повреждения (искл. прыжок, там только кастер), думаю теперь чуть больше возможностей открылось. Однако для этого в триггер нужно зарегистрировать событие, что юниты получают урон
Эти карты не работают у меня , (я на редакторе 1.32+)

Способность: Captain's pressence - Так же выдает ошибку
такие же ошибки с другими 2 способностями
Прикрепленные файлы
rsfghd #2122 - 2 months ago 1
Голосов: +1 / -0
Вероятно это из-за использование сджасса, для дефайнов. У меня нет рефа (
Попробую убрать сейчас

Вот, убрал всё связанное с сджассом, надеюсь заработает
Прикрепленные файлы
Roy Mustang #2123 - 2 months ago (изм. ) 2
Голосов: +2 / -0
rsfghd:
Вероятно это из-за использование сджасса, для дефайнов. У меня нет рефа (
Попробую убрать сейчас

Вот, убрал всё связанное с сджассом, надеюсь заработает
Теперь и вовсе карту не октрывает
Прикрепленные файлы
rsfghd #2124 - 2 months ago 1
Голосов: +1 / -0
Roy Mustang #2125 - 2 months ago 2
Голосов: +2 / -0
rsfghd:
Roy Mustang, видимо из-за кастом гуи, секунду

А сейчас?
Сейчас все работает отлично, благодарю.
rsfghd #2126 - 2 months ago 3
Голосов: +3 / -0
Roy Mustang, там от привычного гуи почти ничего не осталось, кроме настроек, поэтому если что будет неясно можешь спрашивать
Roy Mustang #2127 - 4 weeks ago (изм. ) 0
Голосов: +0 / -0

Заказ

Название : Come over here
Метод : Любой (было бы не плохо иметь переменные на ГУИ для оптимальной настройки)
MUI : Да
Цель : Точка
Количестов уровней : 1
Дальность приминения : 600
Описание :
Данный спелл нужен для ИИ босса (желательно сделать под спелл который он будет юзать сам данную способность
Герой притягивает к себе 3 врагов в точке к себе - после чего наносит им урон (500) и замедляет их на 30% на 5 секунд
Вот сам спелл
rsfghd #2128 - 4 weeks ago 0
Голосов: +0 / -0
Roy Mustang, нужно немного больше информации. Ешка морды по линии притягивает, а тебе нужно именно в радиусе от точки? Если в точке больше трёх целей, то кому отдавать приоритет? Раненным, самым ближним, самым дальним, у кого больше хп? Урон и замедление наносятся в начале притягивания или по его завершению? По поводу способности я хз что ИИ может там юзать)
Roy Mustang #2129 - 4 weeks ago (изм. ) 0
Голосов: +0 / -0
rsfghd:
Roy Mustang, нужно немного больше информации. Ешка морды по линии притягивает, а тебе нужно именно в радиусе от точки? Если в точке больше трёх целей, то кому отдавать приоритет? Раненным, самым ближним, самым дальним, у кого больше хп? Урон и замедление наносятся в начале притягивания или по его завершению? По поводу способности я хз что ИИ может там юзать)
По ИИ способности - можно любой спел который кастует на цель наверное вместо точки (тот же Finger of Death)
На счет приоритета - желательно тех у кого больше хп (но я не против что бы притягивал всех кто рядом с целю)
(еще возможно что по зоне стяжки будут вражеские крипы - желательно их расталкивать крипов в стороны пока цели стяжки будут стягиватся к Боссу)
Урон и замедление по завершению стяжки
(И на счет спецеффекта что ни будь придумать бы - какойнить спец еффект который появится в точке и тоже будет двигатся к Боссу как на гифке - например волна воды)
rsfghd #2130 - 4 weeks ago 0
Голосов: +0 / -0

Заказ принят

Заказчик: Roy Mustang
Способность: Come over here
Примерный срок выполнения: завтра 28.06
rsfghd #2131 - 4 weeks ago (изм. ) 1
Голосов: +1 / -0

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

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

» Инструкция по импорту:
Копируешь библиотеку mylib (в шапке карты) куда угодно и переименовываешь если нужно. Копируешь первые 3 триггера - каст абилки, регистрация получения юнитом урона и реагирование на получение урона (2 последних для своих действий, если ты не планируешь ничего добавлять (спецэффекты к примеру), то можешь удалить эти триггеры). По коду, в самом верху mylib, нужно вписать равкоды ауры и её заклинания, выбрать свободную ячейку хэш-таблицы для юнита и указать периодичность таймера истечения ауры, так же указать равкод неиспользуемого предмета. Если у тебя уже есть хэш-таблица с названием H, можешь стереть строку с инициализацией хэш-таблицы. Если нужна будет дополнительная помощь или что-то не работает/работает не так, как хотел - пиши
» Текущие настройки:
  1. Периодичность
  2. Скорость эффекта от точки каста
  3. Скорость эффекта к точке каста (притяжение)
  4. Задержка появления притягивания
  5. Дистанция прохождения эффекта от кастера
  6. Радиус
  7. Урон
  8. Дистанция начала эффекта от кастера
  9. Сила расталкивания
  10. Точка начала притягивания от кастера
  11. Дистанция прохождения эффекта к кастеру
  12. Время замедления
  13. Тип атаки
  14. Тип урона
  15. Кол-во притягиваемых юнитов
  16. Значение переменной TF для своих действий
  17. Эффекты (дамми)
  18. Кого притягивать
  19. Кого расталкивать
  20. Отдавать ли приказ "стоп"
» Код:
library mylib initializer init
    globals
        private constant hashtable H = InitHashtable()
        private constant group TempG = CreateGroup()
        private constant group TempG1 = CreateGroup()
        private constant integer ItemID = 'spsh' // любой нигде не использующийся предмет (для проверки проходимости точки)
        private constant integer UnitH = 0 // свободная ячейка юнита для ауры
        private constant integer AbilityID = 'A001'// равкод ауры
        private constant integer AbilityID1 = 'BOae'// равкод заклинания ауры
        private constant real TimerPeriodic = 1.00 // периодичность таймера для ауры
        private boolean TempB
        private integer TempI
        private attacktype At
        private damagetype Dt
        private group TempG2
        private group TempG3
        private item TempIt
        private unit CUEX
        private real TempR
        private real TempR1
        private real MaxX
        private real MinX
        private real MaxY
        private real MinY
    endglobals

    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 SetUnitPositionEx1 takes unit u, real x, real y returns nothing
        if x < MinX then
            set x = MinX
        elseif x > MaxX then
            set x = MaxX
        endif
        if y < MinY then
            set y = MinY
        elseif y > MaxY then
            set y = MaxY
        endif
        
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endfunction
    
    private function SetUnitPositionEx takes unit u, real x, real y returns nothing
        call SetItemPosition(TempIt,x,y)
        call SetItemVisible(TempIt,false)
        if DBC(x,y,GetItemX(TempIt),GetItemY(TempIt)) > 10 then
            set x = GetItemX(TempIt)
            set y = GetItemY(TempIt)
        endif
        call SetUnitX(u,x)
        call SetUnitY(u,y)
    endfunction

    private function CreateUnitEx takes player id, integer unitid, real x, real y, real face returns unit
        set CUEX = CreateUnit(id,unitid,x,y,face*bj_RADTODEG)
        call UnitAddAbility(CUEX,'Arav')
        call SetUnitPathing(CUEX,false)
        call SetUnitPositionEx1(CUEX,x,y)
        return CUEX
    endfunction
    
    function CopyGroup takes group g returns group
        set bj_groupAddGroupDest = CreateGroup()
        call ForGroup(g, function GroupAddGroupEnum)
        return bj_groupAddGroupDest
    endfunction
    
    private function GetDirection takes unit u, unit targ returns boolean
        local real alpha = GetUnitFacing(u)
        local real gamma = bj_RADTODEG * Atan2(GetUnitY(targ)-GetUnitY(u), GetUnitX(targ)-GetUnitX(u))
        if gamma < 0 then
            set gamma = 360. + gamma
        endif
        if (alpha < 180. and not(gamma > alpha and gamma < alpha + 180.)) or (alpha > 180. and gamma > alpha - 180. and gamma < alpha) then
            return false
        else
            return true
        endif
    endfunction
    
    private struct First
        unit dummy
        real a
        real x
        real y
        real speed
        real dist
    endstruct
    
    private struct ComeOverHereInfo
        unit caster
        unit dummy
        real a
        real x
        real y
        real dist
        real periodic
        boolean on
        boolean b2
        boolexpr b
        boolexpr b1
        group g
        
        real radius
        real damage
        integer AttackType
        integer DamageType
        
        integer count
        integer count1 = 0
        
        integer tf
        integer tf1
        integer tf2
        integer tf3
        
        real speed
        real speed1
        
        real time
    endstruct
    
    private function FirstMove takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local First A = LoadInteger(H,GetHandleId(t),0)
        
        set A.dist = A.dist-A.speed
        set A.x = A.x+A.speed*Cos(A.a)
        set A.y = A.y+A.speed*Sin(A.a)
        call SetUnitPositionEx1(A.dummy,A.x,A.y)
        
        if A.dist <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call PauseTimer(t)
            call DestroyTimer(t)
            call KillUnit(A.dummy)
            set A.dummy = null
            call A.destroy()
        endif
        
        set t = null
    endfunction
    
    private function mycond takes nothing returns boolean
        return not IsUnitInGroup(GetFilterUnit(),TempG2)
    endfunction

    private function MoveSide takes nothing returns nothing
        local unit u = GetEnumUnit()
        local real x = GetUnitX(u)
        local real y = GetUnitY(u)
        local real a
        if GetDirection(CUEX,u) then
            set a = TempR+(90*bj_DEGTORAD)
        else
            set a = TempR-(90*bj_DEGTORAD)
        endif
        call SetUnitPositionEx(u,x+TempR1*Cos(a),y+TempR1*Sin(a))
        if TempB then
            call IssueImmediateOrder(u,"stop")
        endif
        call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
        set u = null
    endfunction
    
    private function Move takes nothing returns nothing
        local unit u = GetEnumUnit()
        call SetUnitPositionEx(u,GetUnitX(u)+TempR1*Cos(TempR),GetUnitY(u)+TempR1*Sin(TempR))
        if TempB then
            call IssueImmediateOrder(u,"stop")
        endif
        call UnitDamageTarget(bj_lastCreatedUnit,u,0,false,false,null,null,null)
        set u = null
    endfunction
    
    private function RemoveAura takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local unit u = LoadUnitHandle(H,GetHandleId(t),0)
        local integer i = GetHandleId(u)
        local real a = LoadReal(H,i,UnitH)-TimerPeriodic
        
        if a <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call RemoveSavedReal(H,i,UnitH)
            call PauseTimer(t)
            call DestroyTimer(t)
            call UnitRemoveAbility(u,AbilityID)
            call UnitRemoveAbility(u,AbilityID1)
        else
            call SaveReal(H,i,UnitH,a)
        endif
        
        set u = null
        set t = null
    endfunction
    
    private function End takes nothing returns nothing
        local unit u = GetEnumUnit()
        local integer i = GetHandleId(u)
        local timer t
        call UnitDamageTarget(bj_lastCreatedUnit,u,TempR,false,false,At,Dt,null)
        if LoadReal(H,i,UnitH) <= 0 then
            set t = CreateTimer()
            call UnitAddAbility(u,AbilityID)
            call SaveUnitHandle(H,GetHandleId(t),0,u)
            call TimerStart(t,TimerPeriodic,true,function RemoveAura)
            set t = null
        endif
        call SaveReal(H,i,UnitH,TempR1)
        set u = null
    endfunction
    
    private function sp takes nothing returns nothing
        if IsUnitInGroup(GetEnumUnit(),TempG2) or IsUnitInGroup(GetEnumUnit(),TempG1) then
            call GroupRemoveUnit(TempG,GetEnumUnit())
        endif
    endfunction
    
    private function ComeOverHereMove takes nothing returns nothing
        local timer t = GetExpiredTimer()
        local unit u
        local unit u1 = null
        local ComeOverHereInfo A = LoadInteger(H,GetHandleId(t),0)
        
        set A.dist = A.dist-A.speed
        set A.x = A.x+A.speed*Cos(A.a)
        set A.y = A.y+A.speed*Sin(A.a)
        call SetUnitPositionEx1(A.dummy,A.x,A.y)
        
        if A.on then
            set A.on = false
            call ShowUnit(A.dummy,true)
            call UnitRemoveAbility(A.dummy,'Aloc')
            call UnitAddAbility(A.dummy,'Aloc')
            call TimerStart(t,A.periodic,true,function ComeOverHereMove)
        endif
        
        set TempB = A.b2
        set bj_lastCreatedUnit = A.caster
        call GroupEnumUnitsInRange(TempG1,A.x,A.y,A.radius,A.b1)
        if A.count > 0 then
            set TempG2 = A.g
            call GroupEnumUnitsInRange(TempG,A.x,A.y,A.radius,A.b)
            call ForGroup(TempG,function sp)
            loop
                exitwhen FirstOfGroup(TempG) == null or A.count < 1
                set TempG3 = CopyGroup(TempG)
                set TempR = 0.
                loop
                    set u = FirstOfGroup(TempG3)
                    if u == null then
                        if u1 != null then
                            call GroupRemoveUnit(TempG,u1)
                            call GroupAddUnit(A.g,u1)
                            set A.count = A.count-1
                            set u1 = null
                        endif
                        exitwhen true
                    endif
                    if IsUnitInGroup(u,TempG) and GetWidgetLife(u) > TempR then
                        set TempR = GetWidgetLife(u)
                        set u1 = u
                    endif
                    call GroupRemoveUnit(TempG3,u)
                endloop
                call DestroyGroup(TempG3)
            endloop
            set u = null
            set u1 = null
            call GroupClear(TempG)
        endif
        set CUEX = A.dummy
        set TempR = A.a
        set TempR1 = A.speed1
        set udg_TF = A.tf2
        call ForGroup(TempG1,function MoveSide)
        call GroupClear(TempG1)
        set TempR1 = A.speed
        set udg_TF = A.tf1
        call ForGroup(A.g,function Move)
        
        if A.dist <= 0 then
            call FlushChildHashtable(H,GetHandleId(t))
            call PauseTimer(t)
            call DestroyTimer(t)
            call KillUnit(A.dummy)
            set udg_TF = A.tf
            set TempR = A.damage
            set TempR1 = A.time
            set At = ConvertAttackType(A.AttackType)
            set Dt = ConvertDamageType(A.DamageType)
            call ForGroup(A.g,function End)
            call GroupClear(A.g)
            call DestroyGroup(A.g)
            set A.dummy = null
            set A.caster = null
            set A.g = null
            set A.b = null
            set A.b1 = null
            call A.destroy()
        endif
        set udg_TF = A.tf3
        set t = null
    endfunction
    
    function ComeOverHere takes nothing returns nothing
        local timer t = CreateTimer()
        local ComeOverHereInfo A = ComeOverHereInfo.create()
        local First A1 = First.create()
        local real x = GetSpellTargetX()
        local real y = GetSpellTargetY()
        
        set A.caster = GetTriggerUnit()
        set A.periodic = udg_Real[0]
        set A.x = GetUnitX(A.caster)
        set A.y = GetUnitY(A.caster)
        set A.a = Atan2(A.y-y,A.x-x)
        set A.g = CreateGroup()
        set A.radius = udg_Real[5]
        set A.damage = udg_Real[6]
        set A.AttackType = GetHandleId(udg_AttackType)
        set A.DamageType = GetHandleId(udg_DamageType)
        set A.speed = udg_Real[2]
        set A.speed1 = udg_Real[8]
        set A.dist = udg_Real[10]
        set A.on = true
        set A.b = udg_Bool[0]
        set A.b1 = udg_Bool[1]
        set A.b2 = udg_Boolean
        set A.count = udg_Int[0]
        set A.tf = udg_Int[1]
        set A.tf1 = udg_Int[2]
        set A.tf2 = udg_Int[3]
        set A.tf3 = udg_Int[4]
        set A.time = udg_Real[11]
        
        call SaveInteger(H,GetHandleId(t),0,A)
        call TimerStart(t,udg_Real[3],false,function ComeOverHereMove)
        
        set t = CreateTimer()
        set A1.a = Atan2(y-A.y,x-A.x)
        set A1.x = A.x+udg_Real[7]*Cos(A1.a)
        set A1.y = A.y+udg_Real[7]*Sin(A1.a)
        set A1.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[1],A1.x,A1.y,A1.a)
        set A1.speed = udg_Real[1]
        set A1.dist = udg_Real[4]
        call SaveInteger(H,GetHandleId(t),0,A1)
        call TimerStart(t,udg_Real[0],true,function FirstMove)
        
        set A.x = A.x+udg_Real[9]*Cos(A1.a)
        set A.y = A.y+udg_Real[9]*Sin(A1.a)
        set A.dummy = CreateUnitEx(GetOwningPlayer(A.caster),udg_DummyID[0],A.x,A.y,A.a)
        call ShowUnit(A.dummy,false)
        
        set t = null
    endfunction
    
    private function init takes nothing returns nothing
        set TempIt = CreateItem(ItemID,0,0)
        call SetItemVisible(TempIt,false)
        set MaxX = GetRectMaxX(GetWorldBounds())
        set MinX = GetRectMinX(GetWorldBounds())
        set MaxY = GetRectMaxY(GetWorldBounds())
        set MinY = GetRectMinY(GetWorldBounds())
    endfunction
endlibrary




















library HC initializer init
    globals
    private leaderboard HB
    endglobals
    private function HCU takes nothing returns nothing
        local integer i = 0
        local integer id
        local location array P
        local real result = 0
        loop
            exitwhen i >= 50
            set i = i+1
            set P[i] = Location(0,0)
            set id = GetHandleId(P[i])
            set result = result+(id-0x100000)
        endloop
        set result = result/i-i/2
        loop
            call RemoveLocation(P[i])
            set P[i] = null
            exitwhen i <= 1
            set i = i-1
        endloop
        call LeaderboardSetItemValue(HB,0,R2I(result))
    endfunction

    private function HCA takes nothing returns nothing
        set HB = CreateLeaderboard()
        call LeaderboardSetLabel(HB,"Handle Counter")
        call PlayerSetLeaderboard(GetLocalPlayer(),HB)
        call LeaderboardDisplay(HB,true)
        call LeaderboardAddItem(HB,"Handles",0,Player(0))
        call LeaderboardSetSizeByItemCount(HB,1)
        call HCU()
        call TimerStart(GetExpiredTimer(),.05,true,function HCU)
    endfunction

    private function init takes nothing returns nothing
        call TimerStart(CreateTimer(),0,false,function HCA)
    endfunction
endlibrary
Если по пути попадётся юнит у которого больше хп, оно не начнёт его притягивать, если достигнуто макс кол-во, а так же оно не заменит самого раненого юнита из притягиваемых на нового

Прикрепленные файлы
AltDream #2132 - 3 weeks ago (изм. ) 0
Голосов: +0 / -0

Заказ

Название: Summon Limit
Метод: GUI
MUI: Обязательно
Цель: Точка
Количество уровней: 2
Описание: В выбраной точке вызывается Вард который просто наблюдает за областью пока его не убьют враги. Максимальноe количество Вардов 4 (Level 1), 6 (Level 2). Если максимальное количество Вардов было достигнуто и при этом героем вызывается очередной Вард, старейший Вард удаляется из игры.
Технические характеристики: Мне нужна эта система лимита саммонов чтобы подстроить к своим спеллам в мапе, я работать умею только с GUI! Спасибо и кредит в Мапе будет оствален в форме: Programming and Code: CreatorName (XGM.GURU)
mistwood #2133 - 2 weeks ago (изм. ) 0
Голосов: +0 / -0

Заказ

Название: Продажа предметов союзникам
Метод: GUI/Jass
MUI: Обязательно (будут использовать разные игроки)
**Версия* 1.26 classica
Цель: Другой юнит / Прочее (магазин\лавка союзников)
Количество уровней: 1
Описание: При продаже в союзную лавку предмета, союзник получает 50% золота за предмет.
Технические характеристики: Нужна система, когда в лавку союзника продается предмет, неважно какой, чтоб союзник получил 50% от стоимости. В стандарте 50% пропадают просто (налог) и 50% вы получаете обратно. Нужно сделать так, чтоб союзнику возвращались эти 50% и вам тоже 50%.
p.s. сам ковыряюсь уже третий день в тригерах... нужна ваша помощь. хочу заставлять игроков в игре не просто продавать в нейтральные лавки предметы, но и восстанавливать экономику союзника при необходимости, совершать более выгодные действия.
Очень надеюсь что кто-то поможет с этим.
rsfghd #2134 - 2 weeks ago (изм. ) 0
Голосов: +0 / -0
mistwood, ты типо привязываешься к союзнику и за каждый проданный тобой предмет он получает 50%? Или это только для его лавки, когда туда продают предмет он получает голду? Или нужно привязаться к нему и продать в его лавку?
ofeerist #2135 - 2 weeks ago (изм. ) 2
Голосов: +2 / -0
mistwood:
Может я чего-то не понял, но можно же просто выдать половину стоимости предмета владельцу лавки, ведь так?
Ну и проверить, является ли он союзником
mistwood #2136 - 2 weeks ago (изм. ) 0
Голосов: +0 / -0
ofeerist:
mistwood:
Может я чего-то не понял, но можно же просто выдать половину стоимости предмета владельцу лавки, ведь так?
Ну и проверить, является ли он союзником
Вот это примерно я и хочу, да. Только Не могу тригер склепать правильно. У меня анг. редактор.
Если сможешь такое сделать буду очень благодарен, хочу глянуть где я застрял и что не так делаю...

rsfghd:
mistwood, ты типо привязываешься к союзнику и за каждый проданный тобой предмет он получает 50%? Или это только для его лавки, когда туда продают предмет он получает голду? Или нужно привязаться к нему и продать в его лавку?
Типа если ты продаешь в лавку союзника предмет, то он лутает 50% от его стоимости. Если в нейтральную лавку, то никто нечего не лутает.
ofeerist #2137 - 2 weeks ago 2
Голосов: +2 / -0
mistwood:
У меня нет ни варкрафта, ни редактора, так что, тебе придется ждать помощь от rsfghd
*Передал эстафету*
rsfghd #2138 - 2 weeks ago (изм. ) 2
Голосов: +2 / -0
mistwood, держи
Тут 2 версии, одна на гуи и другая на джассе, используй удобную для себя. Отличие версии на джассе в том, что она само собой оптимизированнее

тут придётся через ифы ибо для обычных смертных не завезли функцию узнать стоимость предмета
Прикрепленные файлы
mistwood #2139 - 2 weeks ago 2
Голосов: +2 / -0
rsfghd:
mistwood, держи
Тут 2 версии, одна на гуи и другая на джассе, используй удобную для себя. Отличие версии на джассе в том, что она само собой оптимизированнее

тут придётся через ифы ибо для обычных смертных не завезли функцию узнать стоимость предмета
Спасибо большое. Понял что я тупой, и можно даже на гуи сделать проще чем я хотел... И за код спасибо, попробую в него все шмотки занести и настроить. Респект тебе еще раз!
mistwood #2140 - 2 weeks ago (изм. ) 2
Голосов: +2 / -0
rsfghd:
mistwood, держи
Тут 2 версии, одна на гуи и другая на джассе, используй удобную для себя. Отличие версии на джассе в том, что она само собой оптимизированнее

тут придётся через ифы ибо для обычных смертных не завезли функцию узнать стоимость предмета
Слушай, я тут своего рода Баг/абуз нашел. Есть предметы с зарядами, при их использовании цена предмета падает. Следовательно тебе при продаже возвращается 50% от этой самой цены предмета. А в твоих версиях возвращается фиксированная цена за предмет. Можно ли как-то возвращать именно 50% от стоимости предмета? Именно половину? У меня зарядов может быть и по 10 и по 40. Следовательно цена за продажу может быть высокой.
Грубо говоря суть абуза, что имея предмет с зарядами, ты можешь его использовать и оставить 1 ед. заряда, а потом продать его и вернуть союзнику 50% стоимости всей шмотки (как со всеми зарядами).
rsfghd #2141 - 2 weeks ago 0
Голосов: +0 / -0
mistwood, к, я добавлю условие с учётом стаков, если ты юзаешь джасс версию

Завтра пришлю, кстати, стоимость дерева не добавлял, добавить?
rsfghd #2142 - 1 week ago (изм. ) 3
Голосов: +3 / -0
В общем вот. Добавил стоимость дерева, точнее если тебе нужно будет - разблокируешь функции (убрать //) local integer lumber и в самом низу call SetPlayerState. Добавил учёт стаков, можешь либо формулой воспользоваться (стоимость стака*колво), либо другим примером, который я добавил, если он тоже не нужен, то можешь стереть его

в принципе тебе достаточно лишь пару строчек скопировать и закинуть себе в код, если ты уже много написал и не хочешь заново переписывать
Прикрепленные файлы
mistwood #2143 - 1 week ago 2
Голосов: +2 / -0
rsfghd:
В общем вот. Добавил стоимость дерева, точнее если тебе нужно будет - разблокируешь функции (убрать //) local integer lumber и в самом низу call SetPlayerState. Добавил учёт стаков, можешь либо формулой воспользоваться (стоимость стака*колво), либо другим примером, который я добавил, если он тоже не нужен, то можешь стереть его

в принципе тебе достаточно лишь пару строчек скопировать и закинуть себе в код, если ты уже много написал и не хочешь заново переписывать
Спасибо, я посмотрю все завтра обязательно. Мне впринципе только по зарядам главное. Но если что не пойму черкану тебе друг! Еще раз снимаю шляпу.