XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Барахолка
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Библиотека заклинаний

Если вы хотите поделиться своими триггерными и JASS-заклинаниями, то можете оставлять их здесь.
Желательно иметь, в карте, небольшое руководство для новичков, по установке вашего творения на другую карту.
» Шаблон выкладывания способностей:
Название: название заклинания
Метод исполнения: GUI, Jass (v*, c*)
Нужен ли JNGP: да или нет
Тип цели: юнит, точка, область, без цели
Результат применения: целое описание
Количество уровней: 0-255
Вызов заклинания на цель: buff, если есть
Наличие глобальных переменных: да или нет
Дополнительные аргументы(такие, как вызов новых юнитов, предметов, требования, и прочее)
**Название:**
**Метод исполнения:**
**Нужен ли JNGP:** 
**Тип цели:**
**Результат применения:**
**Количество уровней:**
**Вызов заклинания на цель:**
**Наличие глобальных переменных:** 
Шаблон можно просто скопировать здесь, вставить в свое сообщение, и заполнить
Выполняется для каждой способности, независимо от количества карт.

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

Ответ
 
nvc123
new status
offline
Опыт: 59,284
Активность:
скилы готовые
а не идеи
Старый 19.05.2013, 17:08
эскалибур

offline
Опыт: 547
Активность:
nvc123, так это библиотека заклинаний! Вот и скилы готовые выкладывают. Идеи - твоя задача. Осуществить - можно попросить в Заклинаниях на заказ.
Старый 19.05.2013, 17:20
Vadik29
Choice Battle 1.6а
offline
Опыт: 15,845
Активность:
эскалибур,
так это библиотека заклинаний! Вот и скилы готовые выкладывают. Идеи - твоя задача. Осуществить - можно
попросить в Заклинаниях на заказ.
Вообще-то нет.
Старый 19.05.2013, 17:55
nvc123
new status
offline
Опыт: 59,284
Активность:
так ты сам скил не залил, только описание
Старый 19.05.2013, 18:38
эскалибур

offline
Опыт: 547
Активность:
nvc123, забыл вставить в текст... Щас, отредактирую.
Старый 19.05.2013, 18:53
nvc123
new status
offline
Опыт: 59,284
Активность:
я могу залить пару скилов только их придётся отредактировать
nvc123 добавил:
то-есть добавить коменты и прочее
Старый 19.05.2013, 19:01
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Название: Второе дыхание.
Метод исполнения: vJass, хоть сколько юнитов могут юзать способность.
Нужен ли JNGP: +
Тип цели: Пассивное.
Результат применения: Юнит излечивается на определённое количество здоровья.
Количество уровней: сколько влезет.
Вызов заклинания на цель: баффа нету.
Наличие глобальных переменных: Чтобы спелл работал, у вас должна быть инициализированная хэш-таблица с названием hash( у меня она записана в глобалку, поэтому в коде используется udg_hash)
Простенький, легко настраиваемый код. Спелл - Аналог варовского Второго дыхания из WOW, когда юнит атакован( у меня событие именно атакован, а не получает урон) и у него менее x% хп, то запускается процесс лечения. Все настройки внутри кода с помощью глобалок.
» код

library restlife initializer init

globals 
   private boolean current = false 
//Настройка способности:
   private constant integer abilitycode = 'A00E' // Вместо A00e поставьте равкод вашей способности-пустышки, без которой юнит не получит лечение
   private constant real lifepercent = 35// значение, при котором начнется восстановление здоровья, например: 35 значит, что если юнит атакован и у него меньше 35% здоровья, то начнется лечение.
   private constant real cooldown = 30 //перезарядка способности в секундах
   private constant real healpercent = 10 //сколько процентов здоровья будет восстанавливать способность от максимального здоровья юнита за уровень способности
   private constant integer healtime = 15 // время, за которое юнит восстановит здоровье
   private constant string eff = "Abilities\\Spells\\NightElf\\Rejuvenation\\RejuvenationTarget.mdl" // спецэффект, который будет сопровождать лечение
endglobals

private function RestCondition takes nothing returns boolean
   return GetUnitState(GetTriggerUnit(),UNIT_STATE_LIFE)<0.01*lifepercent*GetUnitState(GetTriggerUnit(),UNI​T_STATE_MAX_LIFE) and GetUnitAbilityLevel(GetTriggerUnit(), abilitycode)>0 and not (current==true)
endfunction

private function Cooldown takes nothing returns nothing
   set current = false
   call DestroyTimer(GetExpiredTimer())
endfunction

private function Healing takes nothing returns nothing
   local timer t = GetExpiredTimer()
   local integer h = GetHandleId(t)
   local unit un = LoadUnitHandle(udg_hash, h, 0)
   local real maxlife = LoadReal(udg_hash, h, 1)
   local integer count = LoadInteger(udg_hash, h, 2)
   local integer level = LoadInteger(udg_hash, h, 3)
   local real currenthp = GetUnitState(un,UNIT_STATE_LIFE)
   call SetUnitState(un, UNIT_STATE_LIFE, currenthp+(maxlife*0.01*(level*healpercent))/healtime)
   count++
   call SaveInteger(udg_hash,h,2,count)
   if count==0 then
      set un=null
      call DestroyEffect(LoadEffectHandle(udg_hash,h,4))
      call DestroyTimer(t)
      call FlushChildHashtable(udg_hash,h)
      set t = null
   endif
endfunction   

private function RestStart takes nothing returns nothing
   local unit un = GetTriggerUnit()
   local timer t = CreateTimer()
   local timer cd = CreateTimer()
   local integer h =  GetHandleId(t)
   local real maxlife = GetUnitState(un, UNIT_STATE_MAX_LIFE)
   local integer count = healtime
   local integer level = GetUnitAbilityLevel(un, abilitycode)
   set current = true
   call SaveUnitHandle(udg_hash, h, 0, un)
   call SaveReal(udg_hash, h, 1, maxlife)
   call SaveInteger(udg_hash, h, 2, count)
   call SaveInteger(udg_hash, h, 3, level)
   call SaveEffectHandle(udg_hash,h,4,AddSpecialEffectTarget(eff, un,"chest"))
   call TimerStart(t,1.,true, function Healing)
   call TimerStart(cd, cooldown, false, function Cooldown)
   set un = null
   set t = null 
   set cd = null
endfunction

//===========================================================================
function init takes nothing returns nothing
    local trigger tr = CreateTrigger()
    local integer i = 0
    loop
        call TriggerRegisterPlayerUnitEvent(tr, Player(i), EVENT_PLAYER_UNIT_ATTACKED, null)
         i++
        exitwhen i == bj_MAX_PLAYER_SLOTS
    endloop
    call TriggerAddCondition( tr, Condition( function RestCondition ) )
    call TriggerAddAction( tr, function RestStart )
endfunction

endlibrary

Отредактировано Амбидекстрия, 11.06.2013 в 11:36.
Старый 10.06.2013, 15:16
Goodie

offline
Опыт: 2,825
Активность:
Амбидекстрия, Код не оптимизирован, советую почитать статьи по оптимизации
Goodie добавил:
Старый 10.06.2013, 19:07
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Goodie:
Амбидекстрия, Код не оптимизирован, советую почитать статьи по оптимизации
Goodie добавил:
Lol, если не обнуление пары переменных это уже у тебя считается не оптимизированным кодом, то это странно, в любом случае, все исправил, код максимально безутечный.
Старый 10.06.2013, 20:25
Goodie

offline
Опыт: 2,825
Активность:
Goodie, Спасибо за понимание)
Кстати некоторые переменные можно переделать в дефайны
Goodie добавил:
((код jass
set count=count--
может быть так?
set count-=1
или так
set count--
или так
set count = count - 1
))
Старый 11.06.2013, 08:41
Амбидекстрия
Silenced by ScorpioT1000
offline
Опыт: 8,237
Активность:
Goodie:
Goodie, Спасибо за понимание)
Кстати некоторые переменные можно переделать в дефайны
можно, но хотел не прибегать к использованию макросов, т.к. cJass многим непонятен, а глобалки - привычное дело. Можно даже все переписать под cJass, что сократит количество символов в полтора раза)
Goodie добавил:
((код jass
set count=count--
может быть так?
set count-=1
или так
set count--
или так
set count = count - 1
))
да, точно, но правда все эти варианты равнозначны, так что можно юзать любой, переделаю в count--

Отредактировано Амбидекстрия, 11.06.2013 в 11:13.
Старый 11.06.2013, 11:04
Ice_Arrow

offline
Опыт: 12
Активность:
Land Mine
Установка "мины" в центре указанной области которая срабатывает если вражеский юнит [или группа юнитов] перемещается неподалеку от неё. Если мина не зарегистрировала достаточное количество "перемещений" то она не детонирует . Насколько"мина" близка к детонации можно судить по её цвету [ Зелёный-Красный]. Если враги не двигаются, то и мина не реагирует.
Способность создана на основе спелла "Канал" и имеет 1 уровень, но это исправимо.
Выполнен на Jass'e без использования всяких нано технологий.
Комменты, подсказки и инструкция по копированию внутри мапы.
Прикрепленные файлы
Тип файла: w3x LandMine [by Ice_Arrow].w3x (30.7 Кбайт, 21 просмотров )
Старый 23.07.2013, 14:36
Buulichkaa
Делаю спеллы за еду
offline
Опыт: 20,146
Активность:
Ice_Arrow, Не оптимизировано, есть ненужные действия, есть утечки + не обнуляются локальные хендлы + таблицы хуже глобалок
Sargaraser добавил:
ещё и вейт DX + запись в переменную путем записи последнего юнита из переменной в свою переменную - бред придуманный гуями, потренируйся ещё в создании скилов + почитай статьи по оптимизу, потому глядишь мб че норм выйдет
Старый 23.07.2013, 15:27
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Герой:Иглогрив
Метод исполнения:jass
Нужен ли JNGP: нет
Тип цели:враги,точка, сам воин
Вызов заклинания на цель:да
Наличие глобальных переменных:нет
Прикрепленные файлы
Тип файла: w3x Иглогрив.w3x (429.9 Кбайт, 50 просмотров )

Отредактировано Cosonic5, 26.08.2013 в 11:22.
Старый 24.08.2013, 20:42
Cosonic5
Моймозггоритогнем
offline
Опыт: 13,584
Активность:
Герой Мев
Метод исполнения:jass
Нужен ли JNGP: нет
Тип цели:враги,точка, сам воин
Вызов заклинания на цель:да
Наличие глобальных переменных:нет
Прикрепленные файлы
Тип файла: w3x Новый герой Мэв.w3x (403.5 Кбайт, 57 просмотров )
Старый 26.08.2013, 11:21
LordSerga

offline
Опыт: 3,809
Активность:
Название: Смертельный скачок
Метод исполнения: jass
Нужен ли JNGP: нет
Тип цели: область
Результат применения: Телепортация на небольшое расстояние, позволяющая мгновенно приблизиться к противникам или выйти из боя. На месте отправления и приземления создаются энергетические заряды, наносящие урон противникам.
Количество уровней: 1 и более (не ограничено)
Наличие глобальных переменных: нет
Телепортация на короткое расстояние не позволит нанести урон одному воину дважды. Область нанесения урона - 325 и может быть изменена, как и урон.
» код здесь (кликабельно)
function Trig_Uses_Actions takes nothing returns nothing
    local integer idspell= GetSpellAbilityId()
    local unit u= GetTriggerUnit()
    local integer lvl= GetUnitAbilityLevel(u, idspell)
    if idspell== 'AEbl' then
        set bj_lastCreatedGroup= CreateGroup()
        call GroupEnumUnitsInRange(bj_lastCreatedGroup, GetUnitX(u), GetUnitY(u), 325., null)
        set bj_groupAddGroupDest= CreateGroup()
        call GroupEnumUnitsInRange(bj_groupAddGroupDest, GetSpellTargetX(), GetSpellTargetY(), 325., null)
        loop
            set bj_lastCreatedUnit= FirstOfGroup(bj_groupAddGroupDest)
        exitwhen bj_lastCreatedUnit== null
            if IsPlayerEnemy(GetOwningPlayer(u), GetOwningPlayer(bj_lastCreatedUnit)) and IsUnitType(bj_lastCreatedUnit, UNIT_TYPE_STRUCTURE)== false and GetUnitState(bj_lastCreatedUnit, UNIT_STATE_LIFE)>=.405 then
                call GroupAddUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
            endif
            call GroupRemoveUnit(bj_groupAddGroupDest, bj_lastCreatedUnit)
        endloop
        call DestroyGroup(bj_groupAddGroupDest)
        loop
            set bj_lastCreatedUnit= FirstOfGroup(bj_lastCreatedGroup)
        exitwhen bj_lastCreatedUnit== null
            if GetPlayerId(GetOwningPlayer(bj_lastCreatedUnit))== 5 then
                call UnitDamageTarget(u, bj_lastCreatedUnit, 90.+ lvl*40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
            endif
            call GroupRemoveUnit(bj_lastCreatedGroup, bj_lastCreatedUnit)
        endloop
        call DestroyGroup(bj_lastCreatedGroup)
    endif
    set u= null
endfunction

Отредактировано LordSerga, 03.09.2013 в 22:46.
Старый 03.09.2013, 19:35
DualShock

offline
Опыт: 5,023
Активность:
LordSerga, твой код плохо читается + некоторые юниты не фильтруются, предлагаю более крутой вариант:
function cond takes nothing returns boolean
    return GetSpellAbilityId() == 'AEbl'
endfunction

function act takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit first
    local group g = CreateGroup()
    local integer lvl = GetUnitAbilityLevel(u, 'AEbl')

    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
    call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
    
    loop
        set first = FirstOfGroup(g)
        exitwhen first == null
        if длинные фильтры then
            call UnitDamageTarget(u, first , 90. + lvl * 40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        endif
        call GroupRemoveUnit(g, first)
    endloop
    
    call DestroyGroup(g)

    set u = null
    set g = null
    set first = null
endfunction
в идеале еще нужны глобалки
Старый 03.09.2013, 21:43
LordSerga

offline
Опыт: 3,809
Активность:
DualShock:
LordSerga, твой код плохо читается + некоторые юниты не фильтруются, предлагаю более крутой вариант:
» код скрыт под катом (кликабельно)
function cond takes nothing returns boolean
    return GetSpellAbilityId() == 'AEbl'
endfunction

function act takes nothing returns nothing
    local unit u = GetTriggerUnit()
    local unit first
    local group g = CreateGroup()
    local integer lvl = GetUnitAbilityLevel(u, 'AEbl')

    call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
    call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
    
    loop
        set first = FirstOfGroup(g)
        exitwhen first == null
        if длинные фильтры then
            call UnitDamageTarget(u, first , 90. + lvl * 40., true, true, ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL, WEAPON_TYPE_WHOKNOWS)
        endif
        call GroupRemoveUnit(g, first)
    endloop
    
    call DestroyGroup(g)

    set u = null
    set g = null
    set first = null
endfunction
в идеале еще нужны глобалки
Зачем это еще?
Я от глобалок уходил, чтобы в одном триггере делать множество действий с разными способностями. Вот пример:
PS: Отдельный Condition для триггера (как и boolexpr для группы) тратит больше ресурсов процессора и ОЗУ (работает намного медленнее, чем простое условие), нежели приведенная ниже система.
if idspell== 'AEbl' then
	run AEbl
elseif idspell== 'A000' then
	run A000
elseif idspell== 'A001' then
	set bj_lastStartedTimer= CreateTimer()
	call SaveUnitHandle(...)
	call TimerStart(.., function A001)
endif
А на счет этого
	call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
	call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
Нет гарантии, что при двойном вызове GroupEnum...() данные о первом вызове функции не затрутся.
Я использовал 2 группы, с помощью цикла проверял отсутствие юнита из Group2 в Group1. Если юнит отсутствует - я его добавляю в Group1. Таким образом нет утерянных юнитов, которые должны получить урон.
твой код плохо читается
На хабре постоянно выкладывают статьи с примерами оформления кода, увидел некоторые примеры именно в таком оформлении, стал оформлять так же.
Усложнять фильтр нужно, только если есть какие особенности на карте. К прмеру, катапальта, которая должна получать меньше урона (хотя это можно реализовать через таблицу получения урона в зависимости от типа защиты [в игровых константах], с учетом, разумеется, типа брони и атаки)
if IsPlayerEnemy(GetOwningPlayer(u), GetOwningPlayer(bj_lastCreatedUnit)) and IsUnitType(bj_lastCreatedUnit, UNIT_TYPE_STRUCTURE)== false and GetUnitState(bj_lastCreatedUnit, UNIT_STATE_LIFE)>=.405 then

Отредактировано LordSerga, 03.09.2013 в 22:42.
Старый 03.09.2013, 22:22
DualShock

offline
Опыт: 5,023
Активность:
LordSerga:
call GroupEnumUnitsInRange(g, GetUnitX(u), GetUnitY(u), 325., null)
call GroupEnumUnitsInRange(g, GetSpellTargetX(), GetSpellTargetY(), 325., null)
ну тут да, я дно D:
LordSerga:
Я от глобалок уходил, чтобы в одном триггере делать множество действий с разными способностями. Вот пример:
PS: Отдельный Condition для триггера (как и boolexpr для группы) тратит больше ресурсов процессора и ОЗУ (работает намного медленнее, чем простое условие), нежели приведенная ниже система.
if idspell== 'AEbl' then
	run AEbl
elseif idspell== 'A000' then
	run A000
elseif idspell== 'A001' then
	set bj_lastStartedTimer= CreateTimer()
	call SaveUnitHandle(...)
	call TimerStart(.., function A001)
endif
Это не критично, лишние байты ничего не решат и бегать за ними глупо. У любого современного компьютера достаточно производительности что бы справиться с этим, будь их хоть 500, есть более важные вещи на которые нужно обращать внимание. Глобалки нужны для того что бы удобно настраивать способности. А вот этот код который выше вообще бред, это будет все разбито на кучу частей, в таком коде быстро разобраться сможет только тот кто его написал.
DualShock добавил:
if GetPlayerId(GetOwningPlayer(bj_lastCreatedUnit))== 5 then
вот я еще не понял для чего это
Старый 04.09.2013, 00:21
Extremator

offline
Опыт: 39,428
Активность:
Кое-что придумал
сделал, и решил выложить тут! ^^
По-мойму в кой-то веки сделал нечто необычное! хД

Bounty Greed

Тип применения: Точка (эффект задевает всех вокруг точки / курсор имеет вид области)
Цели заклинания: Враги в указанной области (в радиусе до 400/600/800 AoE от точки применения)
Описание: Делает всех подверженных заклинанию врагов личной добычей героя.
Это означает что убийство любого из них будет засчитываться этому самому герою!
Результат применения: Делает так, что любой умирающий юнит приносит золото/опыт тому кто применил это заклинание.
Вешает на всех врагов (не героев и не здания) в области 400/600/800 АоЕ от точки применения заклинания бафф,
который длится 10/20/30 секунд. Любой умирающий юнит (не естественной смертью) становится добычей героя
(получает золото и опыт как-будто он сам его убил, при этом опыт может быть не получен,
если герой был слишком далеко от этого юнита - это стандарт распределения опыта в варкрафте).
Для героя: Да
Количество уровней: 3 уровня
Тип исполнения: GUI (MUI)
Вызов заклинания на цель (buff): Да, особый триггерный бафф на основе ауры (на себя). Не перебивается другими стандартными баффами.
Прикрепленные файлы
Тип файла: w3x Bounty Greed.w3x (13.5 Кбайт, 37 просмотров )

Отредактировано Extremator, 02.10.2013 в 02:41.
Старый 02.10.2013, 02:29
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 10:42.