quq_CCCP, я бы пикал в неком ректе (где твоя стена является диагональю)
а потом через координаты проверял прошёл ли юнит через стену или нет
Тут понадобится 1200 \ 32 регионов, вошел в регион из массива, тут же надо записывать в группу и проверять что юнит вышел и региона не войдя в другой...
Так же я пока не придумал как реализовать защиту от того что юнит залез сразу в 2 региона или 3...
Я вот и решил послушать, то что то у меня голова кругом от казалось бы пустяковой скиллки...
А не проще вдоль стены создать надцать дамиков, потом таймером перебирать юнитов вокруг них, тупо запихивать в группу и делать с юнитами все что твоей душе угодно?
Простите нахрена мне даммики когда я знаю координаты точек вокруг которых можно пикать юнитов, шило на мыло...
Но там туча переборов, чтобы не пикнуть одного юнита 10 раз, а так же понадобится паразитная група чтобы отсеять тех кто прошел через стену, а потом спустя некоторое время побежал обратно, этого недостатка решены ивенты, но там триггеры и туча условий...
Фрог юзает у себя EventUnitsInRange ( огромная стая даммиков, с радиусом пика 17, как дота не зависат )
Код Wall of replica by icefrog
function C54 takes nothing returns boolean
local trigger t = GetTriggeringTrigger()
local integer OZ3 = GetHandleId(t)
local trigger C64 = LoadTriggerHandle(XY, OZ3, 255)
local integer WSO = GetHandleId(C64)
local trigger C74 = LoadTriggerHandle(XY, WSO, 256)
local group C84 = LoadGroupHandle(XY, WSO, 257)
local group C94 = LoadGroupHandle(XY, WSO, 258)
local unit BU4 = LoadUnitHandle(XY, WSO, 259)
local integer CA4 = GetHandleId(BU4)
local integer C34 = LoadInteger(XY, CA4, 260)
local integer CB4
local integer i
local unit u
call ForGroup(C94, function C44)
set i = 1
loop
exitwhen i > C34
set CB4 = LoadInteger(XY, CA4, (2800 + i))
set u = LPI(CB4)
call FlushChildHashtable(XY, GetHandleId(LoadTriggerHandle(XY, CA4, (2900 + i))))
call M7I(LoadTriggerHandle(XY, CA4, (2900 + i)))
if IsUnitIllusion(u) then
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\Orc\\MirrorImage\\MirrorImageCaster.mdl", GetUnitX(u), GetUnitY(u)))
call RemoveUnit(u)
call LRI(CB4)
endif
set i = i + 1
endloop
call FlushChildHashtable(XY, OZ3)
call FlushChildHashtable(XY, WSO)
call FlushChildHashtable(XY, CA4)
call RemoveUnit(BU4)
call MOI(C84)
call MOI(C94)
call M7I(C64)
call M7I(C74)
call M7I(t)
set t = null
set C64 = null
set C74 = null
set C84 = null
set C94 = null
set BU4 = null
set u = null
return false
endfunction
//Calls:
// M2I
// Q7I
//Functions as argument:
// L9I
// C14
// CI4
// C24
// C54
function CC4 takes nothing returns nothing
local unit MJI = GetTriggerUnit()
local location l = GetSpellTargetLoc()
local real x = GetLocationX(l)
local real y = GetLocationY(l)
local real CD4 = GetUnitFacing(MJI) - 45
local unit BU4 = CreateUnit(GetOwningPlayer(MJI), 'h00O', x, y, CD4)
local unit u
local real TU2
local real R02
local integer i
local real BT1
local trigger t = CreateTrigger()
local group g1 = M2I()
local integer MDI = GetHandleId(t)
local group g2 = M2I()
local trigger C64 = t
local integer N5I = GetUnitAbilityLevel(MJI, 'A0QK')
local boolean IL3 = false
if N5I == 0 then
set IL3 = true
set N5I = GetUnitAbilityLevel(MJI, 'A21Q')
endif
call SetUnitAbilityLevel(BU4, 'A0QL', N5I)
call Q7I(GE, x, y)
call SaveGroupHandle(XY, MDI, 257, g1)
call SaveGroupHandle(XY, GetHandleId(BU4), 257, g1)
call SaveGroupHandle(XY, MDI, 258, g2)
call SaveUnitHandle(XY, MDI, 259, BU4)
call SaveInteger(XY, GetHandleId(BU4), 260, 0)
set i = 0
loop
exitwhen i > 39
set TU2 = x + (500 - 25 * i) * Cos((CD4 - 45) * bj_DEGTORAD)
set R02 = y + (500 - 25 * i) * Sin((CD4 - 45) * bj_DEGTORAD)
set u = CreateUnit(GetOwningPlayer(MJI), 'h00P', TU2, R02, CD4)
call SetUnitPathing(u, false)
call SetUnitX(u, TU2)
call SetUnitY(u, R02)
call GroupAddUnit(g2, u)
call TriggerRegisterUnitInRange(t, u, 17, Condition(function L9I))
set i = i + 1
endloop
if IL3 then
call TriggerAddCondition(t, Condition(function C14))
else
call TriggerAddCondition(t, Condition(function CI4))
endif
set t = CreateTrigger()
call TriggerRegisterUnitEvent(t, BU4, EVENT_UNIT_SUMMON)
call TriggerAddCondition(t, Condition(function C24))
call SaveTriggerHandle(XY, MDI, 256, t)
set t = CreateTrigger()
call TriggerRegisterTimerEvent(t, 15 * N5I, false)
call TriggerAddCondition(t, Condition(function C54))
call SaveTriggerHandle(XY, GetHandleId(t), 255, C64)
call RemoveLocation(l)
set MJI = null
set l = null
set u = null
set t = null
set C64 = null
set g1 = null
set g2 = null
set BU4 = null
endfunction
//Calls:
// CC4
function CE4 takes nothing returns boolean
if GetSpellAbilityId() == 'A0QK' or GetSpellAbilityId() == 'A21Q' then
call CC4()
endif
return false
endfunction
//Calls:
// Q0I
//Functions as argument:
// CE4
function LM1 takes nothing returns nothing
local trigger t = CreateTrigger()
call Q0I(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
call TriggerAddCondition(t, Condition(function CE4))
set t = null
endfunction
Пламенем феникса дамажить проходящих. Правда придётся несколько дамиков делать по длине стены.
Если тип источника урона - дамми - то делаем копию повреждённого.
Ну вобще то я собрался пуржить и сжигать мп, а про сира ляпнул для примера
Дамми с пламенем феникса куча ивентов на дмг, всем на крате + по несколько раз, ибо бафф дает дамаг пока висит раз в сек
Нафига такое?
Когда игрок вводит -info просто делает EnumUnitsSelectedOfPlayer и там уже проверяем FirstofGroup() == null если да то ниче не делаем, если нет то выдаем инфу....
Melissa, не не не, есть другое действие с локом, там не отдалиш не сдвинешь и угол не меняется. В конфетные войны зайди, там пока героя не пикнул никуда низя посмотреть...
Особо можешь нестаратся, их уже как грязи вот на хайве видел забавную систему определания типа урона там все на 1 триггер, сделано + проверки чтобы 1 и тому же юниту 100500 ивентов не напихать, через скока то ивентов триггеру удаляют и создают новый добовляя в него ивенты на всех живых, при дамаге цели добовляют скилл на отрец маг резист, и проверяют дмг больше или меньше 0.00, с помощью дамиков так же отлавливаю сплеш атаки с чистым дмг.
Триггерам можно добавлять 100500 событий и постоянно менять условия и действия, но это муторно, годится для навороченой системы отлова физ урона 1 на всю карту и тому подобное где триггерные баши и криты будут у 100500 юнитов.
Просто удаляем и усе.
LockCameraOnTarget в гуях вроде, закрепляет камеру за юнитом не давая ниче делать.
Так же можно периодически проверять расстояние до цели, область видимости камеры и так далее и если они вышли за некие пределы, выставлять камере нужные параметры ( x,y,z, )
Нет, ну движок SC2 всё-таки в чём-то основывался на варике, а там выделять можно сколько угодно.
Ну сравнил божий дар с яичницей, внешне игры похожи ибо обе одного жанра и разработчика. Темболее в 8 году явно не было таких ограничений как в 1-2 не говоря что движку под стар взяли уже готовую а не пилили с нуля упорно затачивая под пк.
эм Xin из доты, там если ты про его удары по аое то их лучше делать из дамми, морфы не сбивают кулдаун атаки, если ты нанес удар потом юзнул скилл, перой тычки не последует, баг который так и не поправил фрог, делаем 2 героя, один обычный второй для прыжков.
я про оформление в отдельную функцию а не про не юзай буль...
эмм а зачем? Ты же про оптимизацию спросил, лишние действия...
ты не на содержание а на оформление смотри, тут фильтр даже близко на твой не похож - как определять жив ли дело 25, тут 2 типа проверок хп и IsUnitType(GetFilterUnit(),UNIT_TYPE_DEAD)) or GetUnitTypeId() < 1, особо не важно, тебя не смутило насколько фильтр короче + не создается никаких переменных.
Ну вручи им способность мина (взрывается) 'Amin' - которую нужно отредактировать, задержка запуска 0.00, ну от инвиза можно избавится временем перехода в невидимость на бесконечное.
SetUnitPosition довольно тяжелая операци, юзайте SetUnitX\Y в конце полета юзай SetUnitPosition для того чтобы юнит не залетел в непроходимое место.
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
function EnemyFilter takes nothing returns boolean
set bj_lastFilterUnit = GetFilterUnit( )
return GetUnitState( bj_lastFilterUnit, UNIT_STATE_LIFE ) > 0.405 and IsUnitEnemy( bj_lastFilterUnit, bj_groupEnumOwningPlayer ) and not( IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MAGIC_IMMUNE ) or IsUnitType( bj_lastFilterUnit, UNIT_TYPE_MECHANICAL ) or IsUnitInvulnerable( bj_lastFilterUnit ) )
endfunction
UnitDamageTargetEx - красиво но нафиг ненужно обводить в отдельную функцию с тучей аргументов + жутко неудобно, 100500 аргументов у функции и фиг знает за что какой от вечает, прямо так UnitDamageTarget, без отдельной функции.
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
Так же можно создавать юнитов с тем же хендлом при помощи вейта
Это как?
Был такой баг, что после вейта с каким то периодом создается обьект с тем же хендлом ..
local timer t = CreateTimer()
call BJDebugMsg( I2S(GetHandleId(t)) )
call DestroyTimer()
call TriggerSleepAction( 0.00 ) // хз скока там надо
set t = CreateTimer()
call BJDebugMsg( I2S(GetHandleId(t)) )
этот код выдаст нам 2 одинаковых дебага, первое сообщение с хендлом первого таймера будет равно хендлу второго таймера, если вейта не будет то у таймеров будут разные хендлы...
А нафига его удалять, если есть он уже создан, смотрите всякие кофетные войны от близзард, там в центре карты сидит один дамми юнит который угощает всех и стунами и фрост новами....
Так же можно создавать юнитов с тем же хендлом при помощи вейта, но это слишком говенная идея для применения в своей карте.
Мне нравится делать такое дамми аттакерами, создаем N дамми с атакой (настроенной по области) и приказываем им выстрелить 1 раз в случайную точку в пределах нужной области, вот вам и урон, правда он какой попало в центре области цель может как и не получить урона так и сдохнуть с 1 залпа.
Ну записывать на ид региона, ид ректа в хт и после в потоке триггера брать ид региона GetTriggerRegion или как то так ну и выгружать ид ректа, того самого в который залез юнит ну далее уже делать что хочется...
Эмм а че вам мешает написать её самому, так же гугл в помощь.
Делаем по 1 таймеру для игрока а так же массив целочисленных, и при убийстве игроком проверяем истек или нет таймер, если истек то запускаем на N сек, если нет - то в первый раз дабл килл, запускаем снова на N сек и записываем в переменную текущий стрик игрока, на каждый таймер делаем событие в отдельном триггере что таймер истек, действие обнулить переменную со стриком.
зажимаешь ctrl и лкм на функцию
откроется её содержимое
и там смотри
утекает она или нет
Storm_dll:
bj_LastCreatedUnit, bj_ForLoopAIndex
если используются одновременно в нескольких триггерах то можно словить кучу багов
Можно, если руки растут не из того места...
Это темповые глобалки, в них можно записывать данные с которыми вы будите работать сразу же, без вейтов и таймеров а в том же потоке где им присвоено значение, тогда никаких багов не будет.
bj_lastCreatedUnit - годится для создания дамми юнита и добавления ему абилок, свойств, времени жизни и приказа.
Я ставил опыты на разных морфах с разными настройками и зависимостями:
Превратится в ворона 'Amrf'' с такими параметрами и морфом в летающего дамми юнита, гарантированно дают такой эффект.
Чтобы сбить этот эффект, юнит должен пройти полный морф (подходит метаморфоза или превратися в сфинкса) с удаленными параметрами, начальная и конечная форма наземный дамми герой (какой неважно, его параметры не важны, главное чтобы земной и все, так же для юнитов для летунов летуны, для наземных земные )
С рунами добится этого эффекта не получилось, потому мы останавливаем юнита и вручаем ему морф сфинкса и отдаем приказ кастануть его, морф сфинкса не сбивает приказы и не блочится сайленсом, главное чтобы в момент добавления у юнита не было никаких приказов.
Это грубый пример для рассмотрения бага мофров, для юза в своей карте надо писать свой код с 0, думая о всех если и как бы это по оптимальнее..
Как как, я уже выкладывал наработку...
Суть в баге некоторых морфов, после чего боевая единица выполняет первый отданный приказ до талого, никакие действия игрока на это не повлияют но панель приказов не скрывается, кнопки нажимаются но ничего не происходит.
» WarCraft 3 / Триггеная способность типа "Стена"
Так же я пока не придумал как реализовать защиту от того что юнит залез сразу в 2 региона или 3...
Я вот и решил послушать, то что то у меня голова кругом от казалось бы пустяковой скиллки...
» WarCraft 3 / Триггеная способность типа "Стена"
Ну народ, предложит че нить дельное?
Ред. quq_CCCP
» WarCraft 3 / Триггеная способность типа "Стена"
Но там туча переборов, чтобы не пикнуть одного юнита 10 раз, а так же понадобится паразитная група чтобы отсеять тех кто прошел через стену, а потом спустя некоторое время побежал обратно, этого недостатка решены ивенты, но там триггеры и туча условий...
Фрог юзает у себя EventUnitsInRange ( огромная стая даммиков, с радиусом пика 17, как дота не зависат )
» WarCraft 3 / Триггеная способность типа "Стена"
Дамми с пламенем феникса куча ивентов на дмг, всем на крате + по несколько раз, ибо бафф дает дамаг пока висит раз в сек
Ред. quq_CCCP
» WarCraft 3 / В чем моя ошибка?
Когда игрок вводит -info просто делает EnumUnitsSelectedOfPlayer и там уже проверяем FirstofGroup() == null если да то ниче не делаем, если нет то выдаем инфу....
» WarCraft 3 / По поводу триггера
» WarCraft 3 / [JASS] Оптимизация
» WarCraft 3 / [JASS] Оптимизация
Просто удаляем и усе.
Ред. quq_CCCP
» WarCraft 3 / По поводу триггера
Так же можно периодически проверять расстояние до цели, область видимости камеры и так далее и если они вышли за некие пределы, выставлять камере нужные параметры ( x,y,z, )
» WarCraft 3 / Выделение неограниченного количества юнитов
» WarCraft 3 / [JASS] Оптимизация
Ред. quq_CCCP
» WarCraft 3 / [JASS] Оптимизация
» WarCraft 3 / Как сделать столкновение?
» WarCraft 3 / [JASS] Оптимизация
Фильтр просто ужас, ну кто так фильтры делает?
Проверка на 'Aloc', я в ужасе на кой черт проверять на дамми если GropEnumUnitsInRange\Rect не выделяет москитов, тока EnumOfPlayer может пикнуть москитов, остальное не пикает их, на то они и москиты...
Вот как выглядит нормальный фильтр без локалок и прочего
Туча констант, тоже хорошо тока длят наработок, на деле ставь конкретные значения или юзай Difine vjass'a.
» WarCraft 3 / как создать один то же handle дамми?
» WarCraft 3 / как создать один то же handle дамми?
Так же можно создавать юнитов с тем же хендлом при помощи вейта, но это слишком говенная идея для применения в своей карте.
» WarCraft 3 / Артиллерийская установка
» WarCraft 3 / TriggerRegisterEnterRectSimple, альтерантива есть?
» WarCraft 3 / Gui система двойных и тройных убийств
Делаем по 1 таймеру для игрока а так же массив целочисленных, и при убийстве игроком проверяем истек или нет таймер, если истек то запускаем на N сек, если нет - то в первый раз дабл килл, запускаем снова на N сек и записываем в переменную текущий стрик игрока, на каждый таймер делаем событие в отдельном триггере что таймер истек, действие обнулить переменную со стриком.
» WarCraft 3 / Все ли красные тексты и bj jass триггере утечны?
Это темповые глобалки, в них можно записывать данные с которыми вы будите работать сразу же, без вейтов и таймеров а в том же потоке где им присвоено значение, тогда никаких багов не будет.
bj_lastCreatedUnit - годится для создания дамми юнита и добавления ему абилок, свойств, времени жизни и приказа.
» WarCraft 3 / Вопрос: приказ боевой единице от игрока?
- Превратится в ворона 'Amrf'' с такими параметрами и морфом в летающего дамми юнита, гарантированно дают такой эффект.
- Чтобы сбить этот эффект, юнит должен пройти полный морф (подходит метаморфоза или превратися в сфинкса) с удаленными параметрами, начальная и конечная форма наземный дамми герой (какой неважно, его параметры не важны, главное чтобы земной и все, так же для юнитов для летунов летуны, для наземных земные )
- С рунами добится этого эффекта не получилось, потому мы останавливаем юнита и вручаем ему морф сфинкса и отдаем приказ кастануть его, морф сфинкса не сбивает приказы и не блочится сайленсом, главное чтобы в момент добавления у юнита не было никаких приказов.
Это грубый пример для рассмотрения бага мофров, для юза в своей карте надо писать свой код с 0, думая о всех если и как бы это по оптимальнее..» WarCraft 3 / Вопрос: приказ боевой единице от игрока?
Суть в баге некоторых морфов, после чего боевая единица выполняет первый отданный приказ до талого, никакие действия игрока на это не повлияют но панель приказов не скрывается, кнопки нажимаются но ничего не происходит.
» WarCraft 3 / Как отследить попадание заклинания?
» WarCraft 3 / Новый Bloodrage из DotA