function TreeDestroyerSystemFilter takes nothing returns boolean
local destructable d=GetFilterDestructable()
local real x=GetDestructableX(d)-udg_TreeDestr_X
local real y=GetDestructableY(d)-udg_TreeDestr_Y
local real r=SquareRoot(x*x+y*y)
if(GetWidgetLife(d)>.405 and r<=udg_TreeDestr_R and IssueTargetOrderById(udg_TreeDestr_DUMMY,852018,d) and IssueImmediateOrderById(udg_TreeDestr_DUMMY, 851972))then//852018=="harvest" 851972=="stop"
call KillDestructable(d)
set udg_TreeDestr_N=udg_TreeDestr_N+1
endif
set d=null
return false
endfunction
function TreeDestroyerSystem takes real x,real y,real r returns integer
local rect rt=Rect(x-r,y-r,x+r,y+r)
local boolexpr b=Filter(function TreeDestroyerSystemFilter)
set udg_TreeDestr_R=r
set udg_TreeDestr_X=x
set udg_TreeDestr_Y=y
set udg_TreeDestr_N=0
call EnumDestructablesInRect(rt,b,null)
call DestroyBoolExpr(b)
call RemoveRect(rt)
set b=null
set rt=null
return udg_TreeDestr_N
endfunction
function InitTrig_TreeDestrSystem takes nothing returns nothing
//set gg_trg_TreeDestrSystem=CreateTrigger( )
//call TriggerAddAction( gg_trg_TreeDestrSystem, function Trig_TreeDestrSystem_Actions)
set udg_TreeDestr_DUMMY=CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),'uloc',.0,.0,.0)
call UnitAddAbility(udg_TreeDestr_DUMMY,'Ahar')
call ShowUnit(udg_TreeDestr_DUMMY,false)
endfunction
library TreeDestroyerSystem initializer Init
globals
private constant integer DummyID='dumy'
private constant integer AbilityID='Ahar'
private constant integer OrderID=852018
private unit Dummy=null
private real AoE=.0
private real X=.0
private real Y=.0
endglobals
private function Filtering takes nothing returns boolean
local destructable d=GetFilterDestructable()
local real x=GetDestructableX(d)-X
local real y=GetDestructableY(d)-Y
local real r=SquareRoot(x*x+y*y)
if(GetWidgetLife(d)>.405 and r<=AoE and IssueTargetOrderById(Dummy,OrderID,d) and IssueImmediateOrderById(Dummy, 851972))then// and GetUnitCurrentOrder(Dummy)==OrderID
call KillDestructable(d)
endif
set d=null
return false
endfunction
function TreeDestroyerSystem takes real x,real y,real a returns boolean
local rect r=Rect(x-a,y-a,x+a,y+a)
local boolexpr b=Filter(function Filtering)
set AoE=a
set X=x
set Y=y
call EnumDestructablesInRect(r,b,null)
call DestroyBoolExpr(b)
call RemoveRect(r)
set b=null
set r=null
set AoE=.0
set X=.0
set Y=.0
return false
endfunction
private function Init takes nothing returns nothing
set Dummy=CreateUnit(Player(15),DummyID,.0,.0,.0)
call UnitAddAbility(Dummy,'Aloc')
call UnitAddAbility(Dummy,AbilityID)
call ShowUnit(Dummy,false)
endfunction
endlibrary
Делаем триггер на него вешаем бойцов и смерть бойцов по хэндлу триггера.
Один из них умер - убиваем второго (или двоих). Ну, и не забываем очищать всё. Дабы утечек небыло.
Профит
Правильно, но один раз на всю игру и скрыть. Можно его дать нейтралам (открыта карта). Нам самое главное отслеживать им приказ. Я бы создал москита ('uloc') для нейтрала, добавил способность добычи и скрыл. Место создания не нужно(X=.0, Y=.0). Передвигать к месту проверки так же не нужно.
...приказ не срабатывает то продолжать перебор?
Не совсем... Допустим приказ сработал, то этот даммик будет пытаться добывать дерево. Следовательно нужно его будет как-то остановить.
Установить способности 2 уровня. На первом уровне - все значения в 0. На втором - необходимые значения.
Сделать по аналогии с "Мастерство скелетов (Skeletal Mastery)" улучшение. То бишь улучшение должно увеличить уровень выбранной способности (Ability Level Bonus).
При данном способе:
нет нужды в триггерах (+);
способность всегда видна (как и эффект атаки в данном случае) и нет указания о необходимости улучшения (-).
rsfghd, спасибо, но подобная система перебора уже имеется.
Разные суммируются, однако я подразумевал(аю) только от одной ауры и одного и того же типа боевой единицы.
Если не затруднит могли бы попробовать играться с Buff или с самой способностью(ями)? На данный момент не имею доступа к редактору в ближайшую неделю.
NilasAran_39, ledoed, для боевых единиц (не героев) не составит труда реализовать через GUI, ибо 30 прибавок это еще мало, однако для героев - это дикая проблема.
Первый момент, который придётся учесть - это изначальное* кол-во: здоровья, брони, урона, регенерации маны и здоровья (далее характеристик) героя. Исходя из значений последних добавлять некий процент.
Второй момент - броню основную (белую) не выйдет добавлять, а только дополнительную (зелёную). Предметов, что добавляют основную броню - нет, исходя из той информации, которой обладаю.
Регенерацию можно реализовать через таймер и увеличивать её до предела переменной real.
Если здоровье является основным параметром, что нужно добавить, а остальные не важны и возможно их убрать из наработки, то реализация данной способности проста. Используем работу GF RaiseD. Смотрим тут.
*Примечание: под изначальным принимается значение характеристик героя исключая добавленное с помощью наработки. В ином случае герой будет непобедимым безумцем, с каждым убитым, увеличивая не только процент характеристик, но и самого процента.
А так-же можно ли убрать эту цифру и какой урон наносит смертельный удар.
Можно попробовать использовать способность "Укрыться за щитом". На сколько мне известно подобная способность позволяет помножить как входящий, так и исходящий урон, но необходимо задействовать способность. Так же позволительно и обратное - уменьшать. Alexey103
Можно ли использовать его как аналог способности бронебойность?
Насколько мне известно - нет. Только кодом наносить урон или установкой здоровья.
Дополню - баги сто пудов будут с орб эффектами и любыми способностями (эффектами) с ежесекундным уроном. Поэтому любой урон приходится делать кодом. Мне подобная "фича" известна.
За упоминание отдельное спасибо. В самой карте никак не проинформировал. Мой косяк...
ну и для дальнего боя приказы не применимы, в среднем 0.25-0.40 сек. задержка между замахом и вылетом снаряда.
Никогда не любил дальний бой за его успешное извивание от отлова урона ;)
Очень муторно искать решение проблемы и я не утруждал себя поиском решений. Думаю, в ближайшее время этим не буду заниматься.
Есть готовое решение отлова урона, которое обладает GUI помощью от автора Bribe. Он "ошивается" на сайте, да простят меня модераторы, hiveworkshop. Как раз у него отлов срабатывает через способность рунных браслетов. Признаться честно, я использовал его работу уже в своих работах давно, но, что не своё, то не радует глаз, поэтому решился и на свои наработки.
Сия карту можно использовать как для начала кодирования на vJass и Jass в целом... Хоть подобных ресурсов море, но лишним не будет подобная информация.
Вот тебе моя системка на JASS для пользования нужен JNGP. Не нравится - ищи, иначе - пользуйся.
Stun System - JASS
// Stun System v2.0
globals
constant integer StunSystem_DummyID='u000' //боевая единица пустышка
constant integer StunSystem_DummyAbility='A000' //способность на основе Громовой поступи
constant integer StunSystem_Buff='BSTN' //смотрим какой бафф добавили способности и суда вписываем
constant integer StunSystem_OrderID=852127 //OrderId("stomp")
constant real StunSystem_X=-3035.0 //координата Х безопасной точки для использования Громовой поступи
constant real StunSystem_Y=2762. //координата Y безопасной точки для использования Громовой поступи
unit StunSystem_Dummy=null
real StunSystem_TIME=.0
unit StunSystem_TARGET=null
endglobals
function StunSystem takes nothing returns boolean
local real x=GetUnitX(StunSystem_TARGET)
local real y=GetUnitY(StunSystem_TARGET)
if GetUnitAbilityLevel(StunSystem_TARGET, StunSystem_Buff)==0 then
if GetUnitX(StunSystem_Dummy)!=StunSystem_X and GetUnitY(StunSystem_Dummy)!=StunSystem_Y then
call SetUnitPosition(StunSystem_Dummy,StunSystem_X,StunSystem_Y)
endif
call SetUnitX(StunSystem_TARGET,StunSystem_X)
call SetUnitY(StunSystem_TARGET,StunSystem_Y)
call IssueImmediateOrderById(StunSystem_Dummy, StunSystem_OrderID)
call SetUnitX(StunSystem_TARGET,x)
call SetUnitY(StunSystem_TARGET,y)
endif
set BuffSystem_TARGET=StunSystem_TARGET
set BuffSystem_ID_Buff=StunSystem_Buff
set BuffSystem_TIME=StunSystem_TIME
call TriggerEvaluate(gg_trg_BuffSystem) //вызов бафф системы
set StunSystem_TIME=.0
set StunSystem_TARGET=null
return true
endfunction
function StunSystem_Func_Init takes nothing returns nothing
set gg_trg_StunSystem=CreateTrigger()
set StunSystem_Dummy=CreateUnit(Player(15),StunSystem_DummyID,StunSystem_X,StunSystem_Y,0)
call UnitAddAbility(StunSystem_Dummy,StunSystem_DummyAbility)
call UnitAddAbility(StunSystem_Dummy,'Aloc')
call ShowUnit(StunSystem_Dummy,false)
call TriggerAddCondition(gg_trg_StunSystem, Condition(function StunSystem))
endfunction
BuffSystem - JASS
// Bufff System v1.1
globals
constant real BuffSystem_Interval=.03125
timer BuffSystem_Timer=CreateTimer()
integer BuffSystem_MAX=0
unit array BuffSystem_Unit
integer array BuffSystem_AbilId
integer array BuffSystem_BuffId
real array BuffSystem_Time
unit BuffSystem_TARGET=null
real BuffSystem_TIME=.0
integer BuffSystem_ID_Ability=0
integer BuffSystem_ID_Buff=0
endglobals
function BuffSystem_Periodic takes nothing returns nothing
local integer i = 0
loop
exitwhen i == BuffSystem_MAX
if BuffSystem_Time[i]>0.0 and BuffSystem_Unit[i]!=null and (not IsUnitType(BuffSystem_Unit[i],UNIT_TYPE_DEAD)) then
set BuffSystem_Time[i]=BuffSystem_Time[i]-BuffSystem_Interval
else
if BuffSystem_AbilId[i]!=0 then
call UnitMakeAbilityPermanent(BuffSystem_Unit[i],false,BuffSystem_AbilId[i])
call UnitRemoveAbility(BuffSystem_Unit[i],BuffSystem_AbilId[i])
endif
call UnitRemoveAbility(BuffSystem_Unit[i],BuffSystem_BuffId[i])
set BuffSystem_MAX=BuffSystem_MAX-1
set BuffSystem_Unit[i]=BuffSystem_Unit[BuffSystem_MAX]
set BuffSystem_Time[i]=BuffSystem_Time[BuffSystem_MAX]
set BuffSystem_AbilId[i]=BuffSystem_AbilId[BuffSystem_MAX]
set BuffSystem_BuffId[i]=BuffSystem_BuffId[BuffSystem_MAX]
set BuffSystem_Unit[BuffSystem_MAX]=null
set BuffSystem_Time[BuffSystem_MAX]=0.
set BuffSystem_AbilId[BuffSystem_MAX]=0
set BuffSystem_BuffId[BuffSystem_MAX]=0
set i = i - 1
if (0 == BuffSystem_MAX) then
call PauseTimer(BuffSystem_Timer)
endif
endif
set i = i + 1
endloop
endfunction
function BuffSystem_Checker takes nothing returns boolean
local integer i=0
loop
exitwhen i==BuffSystem_MAX
if BuffSystem_TARGET==BuffSystem_Unit[i] and BuffSystem_ID_Ability==BuffSystem_AbilId[i] and BuffSystem_ID_Buff==BuffSystem_BuffId[i] then
if BuffSystem_TIME>BuffSystem_Time[i] then
set BuffSystem_Time[i]=BuffSystem_TIME
endif
return false
endif
set i=i+1
endloop
return true
endfunction
function BuffSystem takes nothing returns boolean
if BuffSystem_Checker() then
if BuffSystem_MAX==0 then
call TimerStart(BuffSystem_Timer,BuffSystem_Interval, true, function BuffSystem_Periodic)
endif
if BuffSystem_ID_Ability!=0 then
call UnitAddAbility(BuffSystem_TARGET, BuffSystem_ID_Ability)
call UnitMakeAbilityPermanent(BuffSystem_TARGET,true,BuffSystem_ID_Ability)
endif
set BuffSystem_Unit[BuffSystem_MAX]=BuffSystem_TARGET
set BuffSystem_Time[BuffSystem_MAX]=BuffSystem_TIME
set BuffSystem_AbilId[BuffSystem_MAX]=BuffSystem_ID_Ability
set BuffSystem_BuffId[BuffSystem_MAX]=BuffSystem_ID_Buff
set BuffSystem_MAX=BuffSystem_MAX+1
endif
set BuffSystem_TARGET=null
set BuffSystem_TIME=.0
set BuffSystem_ID_Ability=0
set BuffSystem_ID_Buff=0
return false
endfunction
function BuffSystem_Func_Init takes nothing returns nothing
set gg_trg_BuffSystem=CreateTrigger()
call TriggerAddCondition(gg_trg_BuffSystem, Condition(function BuffSystem))
endfunction
достаточно 1 триггера на карту для отлова всех триггерных кастов а потом просто через экзекьют нужные функции вызываем(имя функции берём из хэша/массива по равкоду спела)
тоже верно, ибо за каждое использование сразу варчик пытается запустить N-ое количество триггеров с сия отловом. От чего происходят лаги на старых машинах или\и какой триггер может не запуститься. nvc123, я лично делаю только тестовые карты способностей, поэтому разницы не вижу. Однако играл как-то раз в карту The Blood Way, использовав любую способность на основе "Громовая поступь" у меня происходили лаги (от 0.5 до 4 сек.) на моей старой машинке 2001 года. А на основе сия способности очень много других способностей, в силу этого я очень долго плакал, когда какой Маг или Паладин использует такие способности. К чему это я... у меня нет желания прям до 0 оптимизировать способности, ибо скачавшие мною воплощенную идею должны что-нибудь додумывать сами, те же дебаги. Иначе когда же они научаться хоть чему-то?
что бы занести типы юнитов необходим же отдельный триггер:
а1 = товер1
а2 = товер2
и т.д.
Да, так и есть. Так потом легче будет удалять\добавлять ограничения боевых единиц у игроков.
В твоем триггере игрокам (1-9) устанавливаются ограничения как 0, ибо ты ставишь значение переменной после действий. Нужно поменять порядок. О чем толково пояснил товарищ SomeFire и снова повторил ранее написанное. как минимум уже двое за такой способ.
занести группу игроков в переменную и работать с ней
В дальнейшем, может быть, пригодится, если это группа будет использоваться помимо сия триггера.
В данном триггере (если порядок поменять) в массиве целочисленной не вижу смысла, ибо всем игрокам (1-9) дается ограничение одно и тоже равное четырем. Можно было просто вместо массива целочисленной вписать 4 и радоваться оптимизации. Тоже самое касается целочисленной i_Towers, в ней тоже мы не нуждаемся, ибо можно было вместо
Игрок(i_Towers+1)
Игрок(Число В)
Тот же результат (даже более правильный и оптимизированный). Так еще ты берешь игрока (i_Towers+1) то есть 1+1=2
Игрок(2) = синий игрок, а ты явно хотел красного игрока. В мною предложенном способе такой оплошности нет.
Тебе нужно сделать триггер инициализацию где содержится:
массив типов юнитов - боевая единица которую хотим ограничить игрокам
массив целочисленной - кол-во этой боевой единицы
целочисленная - порядковый номер
Далее здесь же добавляем цикл.
Цикл начинаем с 0 до порядкового номера.
Сюда добавляем действия с группой игроков.
Ограничить подготовку (Массив Типа Юнита[Число B]) до (Массив Количества[Число В]) для (GetEnumPlayer())
GetEnumPlayer() - Взятый Игрок из группы игроков. Ибо не знаю как наши товарищи русские перевели сия функцию пишу ее на английском.
И усё.
DazzleFirst, возможно ли как то создать локальный триггер при применении способности и уничтожить обратно?
ведь обычно локальные триггеры как правило при применении способности создаются в инициализации карты...
нет нужды выделять еще один триггер (помимо отлова) на заклинание, если оно не слишком громоздкое в плане исполнения.
Как сообщает товарищ nvc123:
Zeuz, лучше не использовать много триггеров
вообще нету такой ситуации в которой надо много триггеров
стоит обратить на это внимание. Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
Локальные триггеры хороши тем, что их можно будет бескорыстия и совести удалить, а потом если нужно создать по новой. Тем самым уменьшить нагрузку на варчик в определенных условиях.
Icebow, способ исполнения нужно писать, а так же MUI да\нет. И узнать бы более подробно про выключение. Сделать наподобие "Жар Преисподней" или давать способность отключения давая возможность удерживать более одного портала на одного мага (при условии что MUI имеется).
» WarCraft 3 / Способность исчезает при использовании
» WarCraft 3 / Разрушение деревьев
Ред. DazzleFirst
» WarCraft 3 / Разрушение деревьев
Ред. DazzleFirst
» WarCraft 3 / Связанные юниты
Один из них умер - убиваем второго (или двоих). Ну, и не забываем очищать всё. Дабы утечек небыло.
Профит
» WarCraft 3 / Связанные юниты
» WarCraft 3 / Как отделить деревья от разрушаемого?
» WarCraft 3 / Как отделить деревья от разрушаемого?
Даммик со способностью Добыча ресурсов
» WarCraft 3 / Как не выбирать строения?
native IsUnitType takes unit whichUnit, unittype whichUnitType
» WarCraft 3 / Добавление способности юниту тригерно
Сделать по аналогии с "Мастерство скелетов (Skeletal Mastery)" улучшение. То бишь улучшение должно увеличить уровень выбранной способности (Ability Level Bonus).
нет нужды в триггерах (+);
способность всегда видна (как и эффект атаки в данном случае) и нет указания о необходимости улучшения (-).
» WarCraft 3 / Помоги найти карту детства
Ред. DazzleFirst
» WarCraft 3 / Суммирующиеся ауры
» WarCraft 3 / Суммирующиеся ауры
Разные суммируются, однако я подразумевал(аю) только от одной ауры и одного и того же типа боевой единицы.
Если не затруднит могли бы попробовать играться с Buff или с самой способностью(ями)? На данный момент не имею доступа к редактору в ближайшую неделю.
» WarCraft 3 / Способности и алгоритмы на заказ
Первый момент, который придётся учесть - это изначальное* кол-во: здоровья, брони, урона, регенерации маны и здоровья (далее характеристик) героя. Исходя из значений последних добавлять некий процент.
Второй момент - броню основную (белую) не выйдет добавлять, а только дополнительную (зелёную). Предметов, что добавляют основную броню - нет, исходя из той информации, которой обладаю.
Регенерацию можно реализовать через таймер и увеличивать её до предела переменной real.
» WarCraft 3 / Смертельный удар игнорирует броню?
Ред. DazzleFirst
» WarCraft 3 / Смертельный удар игнорирует броню?
Alexey103 Насколько мне известно - нет. Только кодом наносить урон или установкой здоровья.
» WarCraft 3 / В чём ошибка с локальными переменными?
Как пишет г-н Maniac_91, нет нужды в сохранении texttag, ибо при строчке
Правда есть один нюанс... Если Вы добавили строчку
» WarCraft 3 / Fervor, Critical, Evade (способности)
quq_CCCP:
За упоминание отдельное спасибо. В самой карте никак не проинформировал. Мой косяк...
Очень муторно искать решение проблемы и я не утруждал себя поиском решений. Думаю, в ближайшее время этим не буду заниматься.
» WarCraft 3 / Мгновенный стан
» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?
» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?
nvc123, я лично делаю только тестовые карты способностей, поэтому разницы не вижу. Однако играл как-то раз в карту The Blood Way, использовав любую способность на основе "Громовая поступь" у меня происходили лаги (от 0.5 до 4 сек.) на моей старой машинке 2001 года. А на основе сия способности очень много других способностей, в силу этого я очень долго плакал, когда какой Маг или Паладин использует такие способности.
К чему это я... у меня нет желания прям до 0 оптимизировать способности, ибо скачавшие мною воплощенную идею должны что-нибудь додумывать сами, те же дебаги. Иначе когда же они научаться хоть чему-то?
» WarCraft 3 / Рациональный триггер
naxim:
Цикл начинаем с 0 до порядкового номера.
Сюда добавляем действия с группой игроков.
И усё.
» WarCraft 3 / Разные снаряды при атаки!
» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?
Как сообщает товарищ nvc123: стоит обратить на это внимание.
Везде и всюду есть свои нюансы которые нужно учитывать. Если не выполнить задуманное с помощью одного триггера, то делаем два.
» WarCraft 3 / Какой триггер нагружает карту глобальный или локальный?
» WarCraft 3 / Способности и алгоритмы на заказ