Еще как вариант, назвать спелы по названию функции вызова
Соб: кастует спел
Дей: call TriggerExecute(GetSpellTriggerName()) ))
Если пользуешся ГУИ
Дей: сall TriggerExecute("trg_"+GetSpellTriggerName()+"Action")
может писатся по другому, написал из памяти
Сохраняй разные версии
Например: mymap_0(версия на продакшн).02(законченные системы,скилы).32(сохранения по завершению работы)
Mymap_0_02_23.w3x
Mymap_0_02_24.w3x
Еще есть способность "Тёмный", можно попробовать с ней. С ней знаю только один баг, когда способность меняет одинаковый тип юнитов, она сумирует их здоровье
jasonrus96, Одна анимация прервет другую. Для движения можно делать через смещение юнитов по Х, У и воспроизводить анимацию ходьбы, но две анимации не сработают одновременно
function onDamage takes nothing returns nothing
local spellBleeding spb
local unit source = GetEventDamageSource()
local unit target = GetTriggerUnit()
if GetUnitAbilityLevel(source, SOURCE_BLEEDING_BUFF_ID) > 0 and isTypeTarget(target) then
set spb = spellBleeding.create()
call spb.addBleeding(source,target,GetEventDamage())
endif
set source = null
set target = null
endfunction
Название: Кровавая баня
Метод: GUI/Jass/cJass/vJass
MUI: Обязательно
Цель: Другой юнит
Количество уровней: 1
Описание: В течение 10 сек, ваши атаки и способности вызывают у цели кровотечение, наносящее 40% дополнительного урона в течение 6 сек.
Технические характеристики: Нужны параметры для указания от каких способностей наносить урон.
Код
library SpellBleeding
//----------------------- OPTION ------------------------------------------
globals
private real DURATION = 6.0 // длительность кровотечения
private real DAMAGE_AMOUNT = 0.40 // нанесенный урон за всю длительность, в %
private constant integer SOURCE_BLEEDING_BUFF_ID = 'BHds' // ид баффа под которым будет наносится урон кровотечением
private constant integer TARGET_BLEEDING_ABILITY_ID = 'Aasl' // ид способности у цели под кровотечением. Для создания эффекта на цели
private constant integer SPELL_FOR_BLEEDING_IMMUNE = 0 // ид способности которая добавит иммунитет к кровотечению
private constant attacktype ATTACK_TYPE = ATTACK_TYPE_NORMAL // тип аттаки
private constant damagetype DAMAGE_TYPE = DAMAGE_TYPE_NORMAL // тип урона
private constant real TIME_FREQUENCY = 1.0 // частота срабативания кровотечения
endglobals
// функция фильтр для целей
private function isTypeTarget takes unit target returns boolean
return GetWidgetLife(target) > 0 and not IsUnitType(target, UNIT_TYPE_MECHANICAL)
endfunction
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
globals
private trigger damageEvent = CreateTrigger()
private timer tickBleeding = CreateTimer()
endglobals
private struct spellBleeding
static spellBleeding array spB
static integer stash = 0
real getDamage
unit getSource
unit getTarget
real remainingTime
private method clone takes spellBleeding dest returns nothing
set getDamage = dest.getDamage
set getSource = dest.getSource
set getTarget = dest.getTarget
set remainingTime = dest.remainingTime
endmethod
static method checkRemainingTime takes nothing returns nothing
local integer i = 1
local real bleedDamage = 0.
loop
exitwhen i > stash
if spB[i].remainingTime <= 0.0 or GetWidgetLife(spB[i].getTarget) <= 0.0 then
call UnitRemoveAbility(spB[i].getTarget, TARGET_BLEEDING_ABILITY_ID)
call spB[i].clone(spB[stash])
call spB[stash].destroy()
set stash = stash - 1
else
set bleedDamage = spB[i].getDamage / DURATION * DAMAGE_AMOUNT * TIME_FREQUENCY
if isTypeTarget(spB[i].getTarget) and GetUnitAbilityLevel(spB[i].getTarget, SPELL_FOR_BLEEDING_IMMUNE) < 1 then
call DisableTrigger(damageEvent)
call UnitDamageTarget(spB[i].getSource, spB[i].getTarget, bleedDamage, true, true, ATTACK_TYPE, DAMAGE_TYPE, WEAPON_TYPE_WHOKNOWS)
call EnableTrigger(damageEvent)
endif
set spB[i].remainingTime = spB[i].remainingTime - TIME_FREQUENCY
endif
set i = i + 1
endloop
endmethod
method addBleeding takes unit source, unit target, real damage returns nothing
set stash = stash + 1
set spB[stash] = this
set getSource = source
set getTarget = target
set getDamage = damage
set remainingTime = 6.0
if GetUnitAbilityLevel(getTarget, TARGET_BLEEDING_ABILITY_ID) <= 0 then
call UnitAddAbility(getTarget, TARGET_BLEEDING_ABILITY_ID)
endif
endmethod
endstruct
function everyTickBleeding takes nothing returns nothing
call spellBleeding.checkRemainingTime()
endfunction
function onDamage takes nothing returns nothing
local spellBleeding spb
local unit source = GetEventDamageSource()
local unit target = GetTriggerUnit()
if GetUnitAbilityLevel(source, SOURCE_BLEEDING_BUFF_ID) > 0 and isTypeTarget(target) then
set spb = spellBleeding.create()
call spb.addBleeding(source,target,GetEventDamage())
endif
set source = null
set target = null
endfunction
//===========================================================================
function Trig_Bleeding_Actions takes nothing returns nothing
call TriggerRegisterUnitEvent(damageEvent, GetTriggerUnit(), EVENT_UNIT_DAMAGED )
endfunction
function InitTrig_Bleeding takes nothing returns nothing
local group g = CreateGroup()
local unit e
set gg_trg_Bleeding = CreateTrigger()
call TriggerRegisterEnterRectSimple(gg_trg_Bleeding, GetPlayableMapRect())
call TriggerAddAction( gg_trg_Bleeding, function Trig_Bleeding_Actions)
call TriggerAddAction(damageEvent, function onDamage)
call GroupEnumUnitsInRange(g, 0., 0., 99999., null)
loop
set e = FirstOfGroup(g)
exitwhen e == null
call TriggerRegisterUnitEvent(damageEvent, e, EVENT_UNIT_DAMAGED )
call GroupRemoveUnit(g,e)
endloop
call GroupClear(g)
call DestroyGroup(g)
call TimerStart(tickBleeding, TIME_FREQUENCY, true, function everyTickBleeding)
set g = null
set e = null
endfunction
endlibrary
Komkozavr, Используй переменные у которых тип - целочислинные
Триггер на завершение тренировки юнита с условием что юнит "Автодобыча"
Увеличиваеш переменую на 1ед.
Создаешь переменные для каждого ресурса
В триггере с периодическим срабативанием
Ресурс = Ресурс + (Количество с автодобычи * кол "Автодобычи")
СОздать таблицу лидеров и подставить туда свои переменные
Название: Cyclop Grab and Throw
Метод: GUI/Jass
MUI: Да
Цель: Нет
Количество уровней: 1
Описание: Циклоп хватает цель и бросает в случайную точку вокруг себя (от 600 до 1200 дальности) нанося цели урон при столкновении в размере 80% от текущего здоровья и замедляет на 25%. (Если перед целью есть клиф нужно его ударить об клиф и замедлить на 50% при ударе)
Если метод на Jass , хотелось бы возможность настроить переменные на GUI при нужном мне действии , в карте есть некоторые юниты на которых не должна работать данная способность
Настройки вверху триггера. Если понадобится ГУИ,вместо значения после присваивания дописать udg_название переменной
Есть еще способ, функция call ExecuteFunc( конвертация имени способности в строку). А все способности назвать по вызываемой функции.
Плюс - удобно, просто
Минусы - вроде как, немного медленей. С другими минусами не знаком
Отредактирован Borodach
» WarCraft 3 / Игнор приказов игрока
Отредактирован Borodach
» WarCraft 3 / Много триггерных абилок
Соб: кастует спел
Дей: call TriggerExecute(GetSpellTriggerName()) ))
Если пользуешся ГУИ
Дей:
сall TriggerExecute("trg_"+GetSpellTriggerName()+"Action")
может писатся по другому, написал из памяти
» WarCraft 3 / Не добавляются юниты в массив [2 и более] отряда
» WarCraft 3 / Эффекты
» WarCraft 3 / Как сохранить удобно jass код или lua?
Например: mymap_0(версия на продакшн).02(законченные системы,скилы).32(сохранения по завершению работы)
Mymap_0_02_23.w3x
Mymap_0_02_24.w3x
» WarCraft 3 / Нюансы улучшения "Берсерк" - как поставить базовый блок юнита?
» WarCraft 3 / Вопрос по триггеру, который добавляет +1 маны
Если тебе текущее значение поменять
Отредактирован Borodach
» WarCraft 3 / Как указать герою покупать предметы с помощью триггеров?
Герой трал входит в область "магазин"
Если у игрока золота больше стоимости свитка
создать герою предмет свиток
Отнять у игрока золото
» WarCraft 3 / Голда в % за килл крипа в зависимости от кол-ва игроков
Установить игроку N количество ресурсов как текущее кол. + переменная
» WarCraft 3 / Скорость поворота юнита
» WarCraft 3 / Какой лучший вариант для системы эволюций в карте?
» WarCraft 3 / Как сделать так чтобы способность ушла в кд от действия?
» WarCraft 3 / АОЕ хил
» WarCraft 3 / Оптимизация: поредактировал jass триггер, но он начал фаталить.
» WarCraft 3 / Оптимизация: поредактировал jass триггер, но он начал фаталить.
» WarCraft 3 / Анимация во время движения.
» WarCraft 3 / Анимация во время движения.
» WarCraft 3 / Анимация во время движения.
» WarCraft 3 / Заклинания на заказ
Отредактирован rsfghd
» WarCraft 3 / Заклинания на заказ
» WarCraft 3 / Дополнительные ресурсы
Триггер на завершение тренировки юнита с условием что юнит "Автодобыча"
Увеличиваеш переменую на 1ед.
Создаешь переменные для каждого ресурса
В триггере с периодическим срабативанием
Ресурс = Ресурс + (Количество с автодобычи * кол "Автодобычи")
СОздать таблицу лидеров и подставить туда свои переменные
» WarCraft 3 / Заклинания на заказ
» WarCraft 3 / Триггерное применение способности "Разведать"
» Программирование / 1-но событие для функций или несколько событий для каж.функции?
Плюс - удобно, просто
Минусы - вроде как, немного медленей. С другими минусами не знаком
» WarCraft 3 / Как выключить способность на основе Магической защиты