Что в твоем понимании "стандартная инициализация"? Если что в редакторе карт у тебя нет заботы о об этом, все триггеры созданые в редакторе триггеров автоматически будут инициализированы вызовом из функции InitCustomTriggers(), редактор сам генерирует InitCustomTriggers() и добавляет туда вызовы всех InitTrig_функций, оптимизаторы сливают в функцию main сразу содержимое InitCuntomTriggers и InitTrig функций.
Тебе один путь - добавлять в маин свои триггеры, если там как говна гуи и начинается обрыв потока при лимите операций - таймер который через 0.00 сек будет запускать функцию для инициализации всех твоих триггеров.
Так же норм люди уже давно не плодят по каждому триггеру на 1 спелл, а юзают 1 триггер для всех спеллов сразу, в разы уменьшается кол-во кода а так же число лишних телодвижений.
Интересно зачем все это, регены и так вычисляются вектроно а не ровно N в сек, чем выше хп реген тем чаще добавляется здоровье - неверите, вручите ауру смерти с % регенерации 1х и попробуйте подраться с нейтралами, в итоге вы увидите что хп у вас вовсе не отнимается.
Для триггерного регена достаточно одного таймера в 0.25 сек, и добавлять юниту хп. Реализация достаточно простая, группа юнитов + запись в кастом-вал кол-во хп в сек, при смерти или каком-нить вредном эффекта удаляем юнита из группы, а при создании или возрождение добавляем снова.
Тут скорее всего еще проблема с кодом карты, деоптимизаторы не восстанавливают данные на 100% и ошибки будут почти всегда, 100% рабочий способ - создавать объекты с нуля в карте руками, с теми же id и параметрами что в карте которую вы хотели восстановить...
Ну это счетчик срабатывания триггера, иногда в динамических триггерах юзается в качестве заменителя еще 1 переменной, к примеру тебе нужно двигать юнита на расстояние N и прекратить его двигать когда он сдохнет или когда-триггер сработает N раз, активно юзается в доте фрога. Можно найти и другое применение.
Как сделать - очень просто, это классический спел по типу волна, представляет из себя векторное движение дамми юнита с помощью таймера, примеры есть в статьях и наработках. Вычисляешь угол между применившим заклинание и точкой применения заклинния, если в качестве цели указан юнит, то угол ищем между применившим и целью, создаем даммика и с помощью таймера в 0.03125 (32 раза в сек более чем достаточно) двигаем дамми юнита в ранее найденном нами направлении, по истечению определенного кол-ва тиков таймера, ну 32х30 это примерно 0.9 секунды и 960 ед расстояния (если двигать цель по 30 ед. за каждый тик), ну так же если нужно наносить урон врагам, для этого используются две группы и фильтр.
Пример кода
function Group_Frost_Wave_Actions takes nothing returns nothing
local DamageData dd = bj_forLoopAIndexEnd
local unit Enemy = GetEnumUnit( )
call GroupAddUnit( dd.grp, Enemy )
set bj_lastCreatedUnit = CreateUnit( Player( PLAYER_NEUTRAL_PASSIVE ), 'hatk', GetUnitX( Enemy ), GetUnitY( Enemy ), GetUnitFacing( Enemy ) )
call SetUnitPathing( bj_lastCreatedUnit, false )
call UnitApplyTimedLife( bj_lastCreatedUnit, 'BTLF', 0.50 )
call UnitAddAbility( bj_lastCreatedUnit, 'A06Z' )
call SetUnitAbilityLevel( bj_lastCreatedUnit, 'A06Z', dd.id )
call SetUnitX( bj_lastCreatedUnit, GetUnitX( Enemy ) )
call SetUnitY( bj_lastCreatedUnit, GetUnitY( Enemy ) )
if IssueTargetOrderById( bj_lastCreatedUnit, 852243, Enemy ) then
call UnitDamageTarget( dd.attacker, Enemy, dd.dmg, false, false, ATTACK_TYPE_NORMAL, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS )
call DestroyEffect( AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", Enemy, "origin" ) )
endif
set bj_lastCreatedUnit = null
set Enemy = null
endfunction
function Timer_Frost_Wave_Expires takes nothing returns nothing
local timer t = GetExpiredTimer( )
local DamageData dd = GetDataBX( t )
set dd.time = dd.time + 1
if dd.time > 25 then //25 * 32 = 800
call DestroyEffect( dd.fx )
call KillUnit( dd.attacked )
call GroupClear( dd.grp )
call ReleaseGroup( dd.grp )
call PauseTimer( t )
call RemoveDataBX( t )
call DestroyTimer( t )
call dd.clear( )
call dd.destroy( )
else
set dd.rx = dd.rx + 32.00 * Cos( dd.hp )
set dd.ry = dd.ry + 32.00 * Sin( dd.hp )
call SetUnitX( dd.attacked, CheckX( dd.rx ) )
call SetUnitY( dd.attacked, CheckY( dd.ry ) )
call GroupClear( gg_grp_TempGroup )
set bj_groupEnumOwningPlayer = dd.pl
set bj_forLoopAIndexEnd = dd
set bj_lastReplacedUnit = dd.attacker
call GroupEnumUnitsInRange( gg_grp_TempGroup, dd.rx, dd.ry, 128.00 + 4.00 * dd.time, OnlyWavedEnemy )
call ForGroup( gg_grp_TempGroup, function Group_Frost_Wave_Actions )
set bj_lastReplacedUnit = null
endif
set t = null
endfunction
//===========================================================================
function startTrig_Frost_Wave takes nothing returns nothing
local timer t = CreateTimer( )
local DamageData dd = DamageData.create( )
set dd.attacker = GetSpellAbilityUnit( )
set dd.id = GetUnitAbilityLevel( dd.attacker, 'A060' )
set dd.dmg = dd.id * 125.00
set dd.pl = GetOwningPlayer( dd.attacker )
set dd.hp = Atan2( GetSpellTargetY( ) - GetUnitY( dd.attacker ), GetSpellTargetX( ) - GetUnitX( dd.attacker ) )
set dd.rx = GetUnitX( dd.attacker ) + 32.00 * Cos( dd.hp )
set dd.ry = GetUnitY( dd.attacker ) + 32.00 * Sin( dd.hp )
set dd.attacked = CreateUnit( dd.pl, 'hdum', dd.rx, dd.ry, bj_RADTODEG * dd.hp )
set dd.fx = AddSpecialEffectTarget( "Abilities\\Spells\\Other\\WindWave\\PrismaticWave.mdx", dd.attacked, "origin" )
set dd.grp = NewGroup( )
set dd.time = 0
call SetDataBX( t, dd )
call SetUnitFlyHeight( dd.attacked, 0.00, 0.00 )
call SetUnitScale( dd.attacked, 1.25, 1.25, 1.25 )
call TimerStart( t, 0.03125, true, function Timer_Frost_Wave_Expires )
set t = null
endfunction
Вот так выглядит аналог того что на твоих картинках в коде, кода минимум, да и ничего заумного нет.
PT153, ну я пока ниче не делал, пока обдумываю че к чему, т.к довольно много кода копипастить и переделывать нехотелось бы, если интересна подробная реализация в моей карте текущей системы - могу скинуть .
PT153, насчет станов и почему негодится таймер - когда мы вешаем на юнита стан с помощью мемхака мы обязаны убедится что он жив и не сдохнет, прежде чем мы снимем с него оглушение, иначе начнется трешь и угар. В краце - есть событие - виджет помер, оно же и юзается стандартными бафами чтобы снять свой эффект ровно на фрейм раньше того как юнит реально умрет, это важно для многих эффектов, даже смерть с крестом перерождения снимает все баффы с цели (от дефолтных абилок варкравта).
Есть другие вещи - псевдоконтроль, помните мою статью про руны и как сделать дуель легион команнедра, в от личии от всяких пауз, скрытия карт команд и прочего говна которое городят картоделы, реализация с помощью мемхака выше не на одну голову. Т.к работает по механике стандартных дизейблов варкрафта, т.е карта команд не скрывается, вы неможите управлять юнитов но его очередь приказов не сбивается и приказы добавленные во время дизейбла будут выполнены после его окончания, если это конечно возможно, это чертовски удобно и правильно. Вспомните доту айсфрога, герой Axe заставляет атаковать себя с помощью одной абилки а при ваших приказах атаки у него прокает пассивка хотите вы в него зарядить спелл чтобы отталкнуть его от себя или застанить а неможите, его агр таймер который тупо приказывает атаковать его много раз в сек, когда агр закончится - вы стоите и ниче не делайте, нужно отдавать приказ чето делать, а жмакать кнопки во время агра себе дороже - чаще прокает пассивка!
Мемхаком же возможно сделать все похожие способности по человечески, выдаем флаг стана и следим за то что юнит получил приказ цель-обьект, юнит умер, время вышло, спелл рассеяли. Приказ нужно ослеживать обязательно, иначе на юнита под флагом стана перестанут действовать станы и все что основано на оглушении (все стандартные дизейблы не дающие двигаться + триггерная пауза), поэтому нам нужно узнать что юниту суют приказ стана, тут же убрать флаг стана, тогда стандартный дизейбл на него подействует и он будет в нем до его окончания, а как отследить его конец ! - правильно, по урону в 0 ед. и текущему приказу, триггер еще и урон должен отслеживать, какая туча событий на 1 юнита. Тут именнно и нужны динамические триггеры а таймеры не подходят по ряду причин.
Надеюсь я объяснил почему именно триггеры, поверь отравление наносящие только урон или какую-нибудь фрост нову я на триггерах бы не делал.
NazarPunk, идея сделать это удобно и гибко, а то что это можно сделать с помощью цикла + хт или структур я знаю.
Про unit indexer что такое?
Я думал о примерно таком коде:
код
struct BuffData
trigger array buffs[50]
boolean array flags[50]
integer count
method Dispel takes boolean flag returns boolean
local integer nIndex = 1
if flag then
loop
exitwhen nIndex > this.count
call TriggerExecute( this.buffs[nIndex] )
set nIndex = nIndex + 1
endloop
else
loop
exitwhen nIndex > .count
if not this.flags[nIndex] then
call TriggerExecute( this.buffs[nIndex] )
endif
set nIndex = nIndex + 1
endloop
endif
return true
endmethod
method AddBuff takes trigger trg, boolean flag returns boolean
set this.count = this.count + 1
if this.count > 50 then
return false
endif
set this.buffs[this.count] = trg
set this.flags[this.count] = flag
return true
endmethod
method RemoveBuff takes trigger trg returns boolean
local integer nIndex = 1
local boolean NotFound = true
loop
exitwhen nIndex > this.count
if trg == this.buffs[nIndex] then
set this.buffs[nIndex] = null
set this.flags[nIndex] = false
set NotFound = false
exitwhen true
endif
set nIndex = nIndex + 1
endloop
if NotFound then
return false
endif
loop
exitwhen nIndex > this.count
set this.buffs[nIndex] = this.buffs[nIndex+1]
set this.flags[nIndex] = this.flags[nIndex+1]
set nIndex = nIndex + 1
endloop
set this.count = this.count - 1
return true
endmethod
endstruct
Пока банальное ветвление ифами, ибо сначала было таких триггеров немного и я не заваривался над реализацией.
PT153, ну это у тебя, тут несколько другая реализация, т.к всеравно нужны триггеры, то использовать их хочтися по максимуму.
Ну есть идея аттачить как либо к юниту все эти триггеры и при диспеле экзекутить их, в кадом триггере есть функция утилизации и обнуления эффекта.
Ну вот и решил послушать людей о реализации подобного, нам нужно добавлять, удалять триггеры из списка который прикреплен к юниту, а так же хранить на юните весь этот массив триггеров.
PT153, тебе точно нужно отследить EVENT_WIDGET_DEATH, и ни фреймом раньше, иначе бага. Так же получение других приказов на основе стана для взаимодействия с морфами.
Неуязвимость проверяют через даммика с атакой, через приказ, сможет ли атаковать или нет, просто проверка выполнения приказа. Так же пытаются нанести урон и смотрят сколько он отнял здоровья, так можно и определить неуязвимость и вычислить резист юнита к конкретному типу урона.
Событие юнит отдал приказ и тип приказа, проверяешь какой тип приказа и номер приказа, легко и просто, все необходимое в jass есть, список функций можно посмотреть в JASS_API
Для корректной работы многих фишек мемхака нам нужно следить за юнитом особенно тщательно, нужно отслеживать смерть, порой урон, приказы и многое другое, ну а раз уж есть триггер то и в нем есть функция утилизации при экзекуте, так реализован диспел. Примерно так же сделаны стандарные баффы близзардов, это внутриигровые триггеры которые крепятся за юнитом и следят за ним.
Для того же стана - не годятся таймеры, не говоря про псевдоконтроль. Идея хранить все эти триггеры-баффы в одном месте и удобно взаимодействовать с ними.
Да работа с динамическими триггерами, но условия события и действия добавлять им ненужно, нужно сделать их экзекут (всех) по нужному событию, или невсех в зависимости от параметра, на одном юните может висеть сразу несколько триггеров, а их нужно экзекутнуть.
Есть в краце - есть много, баффов\дебафов реазизованных на мемхаке, и требуется единая бд для работы с ними, чтобы реализовать сложение\подавление\рассеивание эффектов. До пока их было мало я просто делал ифами, но щяс их стало уже довольно много, и я решил привести все это дело в порядок, предварительно я решил посоветоваться с людьми, мб кто то уже делал что то подобное и реализовал это как-нибудь иначе?
NazarPunk, веер ножей, рев медведа, рев демона - остальные способности сбивают приказ идти куда либо, версия кровожадности и ледяной брони на себя онли с автокастом тоже не сбивает приказ идти куда либо но заставляет героя проигрывтаь спелл анимацию и стоять полчаса на месте...
» WarCraft 3 / Реально вернуть инициализацию в нормальный вид
Тебе один путь - добавлять в маин свои триггеры, если там как говна гуи и начинается обрыв потока при лимите операций - таймер который через 0.00 сек будет запускать функцию для инициализации всех твоих триггеров.
Так же норм люди уже давно не плодят по каждому триггеру на 1 спелл, а юзают 1 триггер для всех спеллов сразу, в разы уменьшается кол-во кода а так же число лишних телодвижений.
» WarCraft 3 / Частота смены показателей здоровья и маны
Для триггерного регена достаточно одного таймера в 0.25 сек, и добавлять юниту хп. Реализация достаточно простая, группа юнитов + запись в кастом-вал кол-во хп в сек, при смерти или каком-нить вредном эффекта удаляем юнита из группы, а при создании или возрождение добавляем снова.
» WarCraft 3 / После слк оптимизации ошибка
» XGM Конкурсы / Warcraft III Mini-Game Contest-2018
» WarCraft 3 / missing return
» WarCraft 3 / Слишком агрессивные крипы
» WarCraft 3 / Функция ResetTrigger()
» WarCraft 3 / Движение, jass
» WarCraft 3 / Динамический триггер ?!
» WarCraft 3 / Динамический триггер ?!
» WarCraft 3 / Аттач группы триггеров
» WarCraft 3 / Аттач группы триггеров
Есть другие вещи - псевдоконтроль, помните мою статью про руны и как сделать дуель легион команнедра, в от личии от всяких пауз, скрытия карт команд и прочего говна которое городят картоделы, реализация с помощью мемхака выше не на одну голову. Т.к работает по механике стандартных дизейблов варкрафта, т.е карта команд не скрывается, вы неможите управлять юнитов но его очередь приказов не сбивается и приказы добавленные во время дизейбла будут выполнены после его окончания, если это конечно возможно, это чертовски удобно и правильно. Вспомните доту айсфрога, герой Axe заставляет атаковать себя с помощью одной абилки а при ваших приказах атаки у него прокает пассивка хотите вы в него зарядить спелл чтобы отталкнуть его от себя или застанить а неможите, его агр таймер который тупо приказывает атаковать его много раз в сек, когда агр закончится - вы стоите и ниче не делайте, нужно отдавать приказ чето делать, а жмакать кнопки во время агра себе дороже - чаще прокает пассивка!
Мемхаком же возможно сделать все похожие способности по человечески, выдаем флаг стана и следим за то что юнит получил приказ цель-обьект, юнит умер, время вышло, спелл рассеяли. Приказ нужно ослеживать обязательно, иначе на юнита под флагом стана перестанут действовать станы и все что основано на оглушении (все стандартные дизейблы не дающие двигаться + триггерная пауза), поэтому нам нужно узнать что юниту суют приказ стана, тут же убрать флаг стана, тогда стандартный дизейбл на него подействует и он будет в нем до его окончания, а как отследить его конец ! - правильно, по урону в 0 ед. и текущему приказу, триггер еще и урон должен отслеживать, какая туча событий на 1 юнита. Тут именнно и нужны динамические триггеры а таймеры не подходят по ряду причин.
Надеюсь я объяснил почему именно триггеры, поверь отравление наносящие только урон или какую-нибудь фрост нову я на триггерах бы не делал.
» WarCraft 3 / Аттач группы триггеров
Про unit indexer что такое?
Я думал о примерно таком коде:
» WarCraft 3 / Аттач группы триггеров
Ну есть идея аттачить как либо к юниту все эти триггеры и при диспеле экзекутить их, в кадом триггере есть функция утилизации и обнуления эффекта.
Ну вот и решил послушать людей о реализации подобного, нам нужно добавлять, удалять триггеры из списка который прикреплен к юниту, а так же хранить на юните весь этот массив триггеров.
» WarCraft 3 / Отрицательный реген
» WarCraft 3 / Аттач группы триггеров
» WarCraft 3 / Есть у кого наработка смены имени юнита триггерно?
» WarCraft 3 / Вопрос по механике вампиризма (триггерного) и отложению урона
» WarCraft 3 / Отслеживание приказов
» WarCraft 3 / Аттач группы триггеров
Для того же стана - не годятся таймеры, не говоря про псевдоконтроль. Идея хранить все эти триггеры-баффы в одном месте и удобно взаимодействовать с ними.
» WarCraft 3 / Аттач группы триггеров
Есть в краце - есть много, баффов\дебафов реазизованных на мемхаке, и требуется единая бд для работы с ними, чтобы реализовать сложение\подавление\рассеивание эффектов. До пока их было мало я просто делал ифами, но щяс их стало уже довольно много, и я решил привести все это дело в порядок, предварительно я решил посоветоваться с людьми, мб кто то уже делал что то подобное и реализовал это как-нибудь иначе?
» WarCraft 3 / Возможно ли отловить пересечение моделей во время их анимации?
» WarCraft 3 / Способности, отдающие приказ всей группе
» WarCraft 3 / Про способности не сбивающие приказ
8gabriel8: а причем тут это? Вопрос как сделать 4 абилки без цели не сбивающие приказы, что уже описано, так же был вопрос про манащит и аналоги.
» WarCraft 3 / Про способности не сбивающие приказ