PT153, у меня только кастом гуи этой функции, может у автора её нет, поэтому я сразу кастом скрипт скинул, некоторые анимки вроде attack 1, attack 2 можно юзануть только по индексу (вроде), поэтому я подумал, что со спеллом такие же проблемы + версии могут отличаться
Есть такое условие, как проверка находится ли юнит в области (логическая). Когда открою редактор, то скину скриншот, но у меня русские триггеры. - Ставишь любое нужное тебе событие - если юнит в области, то - действия
upd функция и скрин
RectContainsUnit takes rect r, unit whichUnit returns boolean
upd хотя в твоём случае достаточно просто выбрать всех юнитов в области через проверку типа юнита и дать им приказ
В варике блокираторы пути 2х2 и 4х4 (маленький и большой). Воздух блочит путь для воздуха, суша для суши, двусторонний для суши и воздуха. Если в одной точке стоят 4 маленьких блокиратора, лучше заменить на один большой блокиратор. А вообще, лучше использовать вариант, который указал quq_CCCP. Там типо с фотошопом надо как-то работать, сетку желательно создать на которой будешь рисовать свой блокиратор пути... Короче на хгм есть где-то статейка, возможно найду
quq_CCCP, ну.. хорошая в плане не сильно замудренная, легка в реализации. Событие только висит, но оно вроде не много занимает. Да и вероятно с кодом можно поправить этот недостаточек
upd: хотя если говорить про урон с автоатак, то дико извиняюсь
Обнова (кому она нужна в принципе)
+ Переменные в дефайны (это типо оптимизация)
+ Исправлена ошибка с отталкиванием при росте барьера
+ Максимальная высота барьера (для сферического (и то, я не уверен, что у меня правильная формула))
+ Барьер может быть теперь земноводным, полёт настраивается в самом триггере
+ "Исправлена" ошибка с двойным уроном, таймер увеличен и добавлены настройки с дополнительным отталкиванием (юниты всё равно могут получить двойной урон, если оттолкнутся один в другого)
+ Юнитов не отталкивает в непроходимые зоны
+ Юниты, которых нельзя выкинуть с барьера, не получают кучу урона, вместо этого обновляется время дебаффа
- Специальный эффект (дамми) может криво спавнится на горах
- Очень сложно настроить барьер до оптимального значения, всё делается на ощупь (из-за плохого кода)
- Я не проверял все настройки, поэтому что-то может не работать (оч извиняюсь, но это рили много времени жрёт (исправлю, если кто-то напишет))
- Нет возможности добавить собственные условия без малейшего знания джасса (постараюсь что-нибудь придумать с этим в будущем)
- Некоторые значения лучше не ставить ниже единицы
- Минусовое значение урона не будет хилять (в будущем добавлю)
- Минусов больше, чем плюсов, я забыл остальные)
scope MySc
globals
define private H = udg_Hash // Название твоей хэш-таблицы
define private AbilityID = 'A000' // ID способности
define private DummyID = 'u000' // ID дамми-юнита
define private Discarding = 5.00 // Сила отбрасывания
define private DiscardingTime = 1.00 // Время отбрасывания
endglobals
//==========================================================================
private function IsUnitDead takes unit u returns boolean
return IsUnitType(u,UNIT_TYPE_DEAD) or GetUnitTypeId(u) == 0
endfunction
private function move1 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local unit u = LoadUnitHandle(H,i,0)
local real a = LoadReal(H,i,1)
local real d = LoadReal(H,i,2)
local real tm = LoadReal(H,i,3)+0.01
if tm > DiscardingTime or IsUnitDead(u) then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(H,i)
else
call SetUnitX(u,GetUnitX(u)+d*Cos(a))
call SetUnitY(u,GetUnitY(u)+d*Sin(a))
call SaveReal(H,i,2,d-(Discarding/DiscardingTime*0.01))
call SaveReal(H,i,3,tm)
endif
set t = null
set u = null
endfunction
private function Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer i = GetHandleId(t)
local unit u = GetSpellTargetUnit()
local unit uu = GetSpellAbilityUnit()
//Создание дамми-щита
set bj_lastCreatedUnit = CreateUnit(Player(PLAYER_NEUTRAL_PASSIVE),DummyID,GetUnitX(u),GetUnitY(u),Atan2(GetUnitY(uu)-GetUnitY(u),GetUnitX(uu)-GetUnitX(u))*bj_RADTODEG)
call UnitApplyTimedLife(bj_lastCreatedUnit,'BTLF',1.)
set bj_lastCreatedUnit = null
//===================
call SaveUnitHandle(H,i,0,u)
call SaveReal(H,i,1,Atan2(GetUnitY(u)-GetUnitY(uu),GetUnitX(u)-GetUnitX(uu)))
call SaveReal(H,i,2,Discarding)
call TimerStart(t,0.01,true,function move1)
set t = null
set u = null
set uu = null
endfunction
//===========================================================================
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == AbilityID
endfunction
function InitTrig_Phoenix takes nothing returns nothing
local trigger t = CreateTrigger()
local integer index = 0
loop
call TriggerRegisterPlayerUnitEvent(t,Player(index),EVENT_PLAYER_UNIT_SPELL_EFFECT,null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddCondition(t,Condition(function Conditions))
call TriggerAddAction(t,function Actions)
set t = null
endfunction
endscope
О, недавно делал помойные волны, там такой же принцип отталкивания работает
Вот и сама функция
private function move1 takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer i = GetHandleId(t)
local unit u = LoadUnitHandle(H,i,0)
local real a = LoadReal(H,i,1)
local real d = LoadReal(H,i,2)
local real tm = LoadReal(H,i,3)+0.03
if tm > WaveDiscardingTime then
call PauseTimer(t)
call DestroyTimer(t)
call FlushChildHashtable(H,i)
else
call SetUnitX(u,GetUnitX(u)+d*Cos(a))
call SetUnitY(u,GetUnitY(u)+d*Sin(a))
call SaveReal(H,i,2,d-(WaveDiscarding/WaveDiscardingTime*0.03))
call SaveReal(H,i,3,tm)
endif
set t = null
set u = null
endfunction
В ячейке 0 - юнит, 1 - угол куда отталкивать, 2 - сила отталкивания (WaveDiscarding), 3 (+0.03) - периодичность истекаемого таймера, чтобы через время остановить отталкивание
Вот формула d-(WaveDiscarding/WaveDiscardingTime*0.03)
WaveDiscarding и WaveDiscardingTime это глобалки, можешь просто сохранить в другие ячейки локальные значения
Upd: но некоторые моменты нужно учесть, у меня этого пока что нет и в итоге юнита может вытолкнуть за границы карты или в непроходимую местность
Нашел много недоработок, например то, что барьер откидывает вне радиуса юнитов
Так же планирую сделать особенность для летающих юнитов, барьер всё-таки сферический, а не цилиндрический
Отредактирован rsfghd
» WarCraft 3 / [lua] Как узнать название переменной для объекта на карте?
» WarCraft 3 / [lua] Как узнать название переменной для объекта на карте?
hdhw - равкод юнита
0001 - его номер
Номер можешь посмотреть в менеджере объектов
» WarCraft 3 / Как при атаке юзануть спелл для крипа
Как приказать юниту выгрузить всех, кто внутри сидит?
Отредактирован rsfghd
» Блог им. rsfghd / Подлый пинок
» Администрация XGM / Из-за апострофа сломался профиль пользователя
» WarCraft 3 / Вылет из лобби
» WarCraft 3 / Вылет из лобби
» WarCraft 3 / Как сделать абсолютный туман войны
» WarCraft 3 / Трансформация здания
» WarCraft 3 / Как задействовать анимацию при касте скила
» Администрация XGM / Из-за апострофа сломался профиль пользователя
» WarCraft 3 / Как задействовать анимацию при касте скила
» WarCraft 3 / Текстуры.
Отредактирован rsfghd
» WarCraft 3 / Как нанести урон 1 раз, дамми юнитом который летит
Отредактирован rsfghd
» WarCraft 3 / Событие отряд вошёл в зону
Отредактирован rsfghd
» WarCraft 3 / Какие блокираторы пути лучше использовать
WarCraft 3 Reforged: Альтернативный способ наложения карты путей
Отредактирован rsfghd
» Блог им. rsfghd / Волны помойных волн
Не ожидал после стольких лет увидеть тебя снова на хгм, видимо природа в 2021 очистилась
» Блог им. rsfghd / Барьер со свалки
» WarCraft 3 / отлов автоатак при событии "юнит получает урон"
» WarCraft 3 / отлов автоатак при событии "юнит получает урон"
WarCraft 3 Reforged: Отображение Урона\Система атаки
Тебе такое не подходит?
» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике
Отредактирован rsfghd
» Блог им. rsfghd / Барьер со свалки
+ Переменные в дефайны (это типо оптимизация)
+ Исправлена ошибка с отталкиванием при росте барьера
+ Максимальная высота барьера (для сферического (и то, я не уверен, что у меня правильная формула))
+ Барьер может быть теперь земноводным, полёт настраивается в самом триггере
+ "Исправлена" ошибка с двойным уроном, таймер увеличен и добавлены настройки с дополнительным отталкиванием (юниты всё равно могут получить двойной урон, если оттолкнутся один в другого)
+ Юнитов не отталкивает в непроходимые зоны
+ Юниты, которых нельзя выкинуть с барьера, не получают кучу урона, вместо этого обновляется время дебаффа
- Очень сложно настроить барьер до оптимального значения, всё делается на ощупь (из-за плохого кода)
- Я не проверял все настройки, поэтому что-то может не работать (оч извиняюсь, но это рили много времени жрёт (исправлю, если кто-то напишет))
- Нет возможности добавить собственные условия без малейшего знания джасса (постараюсь что-нибудь придумать с этим в будущем)
- Некоторые значения лучше не ставить ниже единицы
- Минусовое значение урона не будет хилять (в будущем добавлю)
- Минусов больше, чем плюсов, я забыл остальные)
Отредактирован rsfghd
» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике
Отредактирован rsfghd
» WarCraft 3 / Как заставить юнита отлететь/оттолкнуться в синематике
Вот формула d-(WaveDiscarding/WaveDiscardingTime*0.03)
WaveDiscarding и WaveDiscardingTime это глобалки, можешь просто сохранить в другие ячейки локальные значения
Отредактирован rsfghd
» Блог им. rsfghd / Барьер со свалки
Так же планирую сделать особенность для летающих юнитов, барьер всё-таки сферический, а не цилиндрический