Гуванч, а, понял. Я не страдал такими проблемами ибо все скиллы делаю на джассе и это даёт мне возможность полностью контролировать всё что происходит касательно урона. В твоём случае, если делать триггерные аналоги не подходит, нужно использовать мемхак. Он позволяет понять с руки урон или нет, а так же тип урона
Нужно зарегистрировать на всех юнитов на карте событие "получает урон", а в другом триггере, где юнит получил урон - делать действия. Если ты имел ввиду именно после замаха, когда вылетает снаряд - то тут только костылить с таймингом либо воспользоваться мемхаком)
Ах да, ну можно и свою собственную атаку сделать)
Вот тут я пытался сделать собственную атаку, сейчас конечно мог бы сделать получше и немного по-другому, с очень классной либой, но что-то не интересует)
Вджасс это дополнение к обычному джассу, у себя ты можешь видеть строки объявления библиотеки, продвинутые комментарии и статические константные переменные
Nikolay36, я сказал практически)
всё что тебе нужно по факту это угол с координатами и насколько сдвинуть юнита, знать математику и думать тут вообще не надо, нужно лишь знать принцип работы)
library mylib initializer InitTrig_fd
globals
constant hashtable H = InitHashtable()
private group TempG
private group TempG1 = CreateGroup()
private real TempX
private real TempY
endglobals
native UnitAlive takes unit id returns boolean
private function DBC takes real x, real y, real x1, real y1 returns real
return SquareRoot((x-x1)*(x-x1)+(y-y1)*(y-y1))
endfunction
private function mycond takes nothing returns boolean
set bj_lastReplacedUnit = GetFilterUnit()
return UnitAlive(bj_lastReplacedUnit) and IsUnitEnemy(bj_lastReplacedUnit,GetOwningPlayer(bj_lastCreatedUnit))
endfunction
private function move1 takes nothing returns nothing
local unit u = GetEnumUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real a = Atan2(TempY-y,TempX-x)
set x = x+20.*Cos(a)
set y = y+20.*Sin(a)
call SetUnitX(u,x)
call SetUnitY(u,y)
if DBC(TempX,TempY,x,y) <= 100. then
call SetUnitPosition(u,x,y)
call UnitDamageTarget(bj_lastCreatedUnit,u,100.,false,false,ATTACK_TYPE_NORMAL,DAMAGE_TYPE_NORMAL,null)
call GroupRemoveUnit(TempG,u)
endif
set u = null
endfunction
private function move takes nothing returns nothing
local timer t = GetExpiredTimer()
set TempG = LoadGroupHandle(H,GetHandleId(t),1)
set bj_lastCreatedUnit = LoadUnitHandle(H,GetHandleId(t),0)
set TempX = GetUnitX(bj_lastCreatedUnit)
set TempY = GetUnitY(bj_lastCreatedUnit)
call ForGroup(TempG,function move1)
if FirstOfGroup(TempG) == null then
call DestroyGroup(TempG)
call FlushChildHashtable(H,GetHandleId(t))
call PauseTimer(t)
call DestroyTimer(t)
endif
set t = null
set TempG = null
set bj_lastCreatedUnit = null
endfunction
private function Trig_fd_Actions takes nothing returns nothing
local timer t = CreateTimer()
local boolexpr b = Condition(function mycond)
set TempG = CreateGroup()
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),1000.,b)
call SaveUnitHandle(H,GetHandleId(t),0,bj_lastCreatedUnit)
call SaveGroupHandle(H,GetHandleId(t),1,TempG)
call TimerStart(t,.02,true,function move)
set b = null
set t = null
set TempG = null
set bj_lastCreatedUnit = null
endfunction
//===========================================================================
private function cancel takes nothing returns nothing
local timer t = GetExpiredTimer()
call IssueImmediateOrder(LoadUnitHandle(H,GetHandleId(t),0),"stop")
call FlushChildHashtable(H,GetHandleId(t))
call DestroyTimer(t)
set t = null
call BJDebugMsg("Рядом никого нет")
endfunction
private function Trig_fd_Conditions takes nothing returns boolean
if GetSpellAbilityId() == 'A000' then
call Trig_fd_Actions()
endif
return false
endfunction
private function Trig_fd_Conditions1 takes nothing returns boolean
local timer t
if GetSpellAbilityId() == 'A000' then
set bj_lastCreatedUnit = GetTriggerUnit()
call GroupEnumUnitsInRange(TempG1,GetUnitX(bj_lastCreatedUnit),GetUnitY(bj_lastCreatedUnit),1000.,Condition(function mycond))
if FirstOfGroup(TempG1) == null then
set t = CreateTimer()
call SaveUnitHandle(H,GetHandleId(t),0,bj_lastCreatedUnit)
call TimerStart(t,0.,false,function cancel)
set t = null
else
call GroupClear(TempG1)
endif
set bj_lastCreatedUnit = null
endif
return false
endfunction
private function InitTrig_fd takes nothing returns nothing
local trigger t = CreateTrigger()
local integer i = 0
set gg_trg_fd = CreateTrigger( )
loop
call TriggerRegisterPlayerUnitEvent(gg_trg_fd, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
set i = i+1
exitwhen i == 16
endloop
call TriggerAddCondition( gg_trg_fd, Condition( function Trig_fd_Conditions ) )
call TriggerAddCondition( t, Condition( function Trig_fd_Conditions1 ) )
set t = null
endfunction
endlibrary
Komkozavr, не, ланд очень трудоёмкая и кропотливая работа, позабрасывал такие крутые идеи из-за лени делать ланд, карты ведь не маленькие и те же деревья нужно аккуратно и разумно тыкать, ведь это игровое поле
mistwood, арифметикой)
Если отнять 200 от текущего здоровья меньше 1, то 200 отнять текущее здоровье и от текущего здоровья отнять полученный результат-1
Pasha115, контроль над процессом полностью принадлежит тебе, меняй что хочешь и как хочешь. Максимум что я изменил бы там, чтобы они в рандомную сторону начали кружиться, а не только по часовой, а если ответить на вопрос, то да, добавь туда тип юнита который кружится на месте
Да, у меня было такое, что я жалел об удаленных картах. У меня средние познания редактора (даже ниже среднего), но я не могу выпустить ни одну карту из-за слишком высокой планки идеала и огромных масштаб работ. Я обожаю делать спеллы, но ненавижу возиться с ландом, и из-за отсутствия ланда не могу ничего сделать по карте толком
» WarCraft 3 / Триггерная волна силы
» WarCraft 3 / Триггерный урон на ровне с атакой
извиняюсь, из головы вылетела эта фишечка)
» WarCraft 3 / Триггерный урон на ровне с атакой
Ред. rsfghd
» WarCraft 3 / Триггерный урон на ровне с атакой
Ах да, ну можно и свою собственную атаку сделать)
» WarCraft 3 / Триггерная волна силы
Ред. rsfghd
» WarCraft 3 / Ошибки при запуске WE и нерабочий JASS
» WarCraft 3 / Эффект выстрела остаётся
Ред. rsfghd
» WarCraft 3 / Двигать юнита(ов) к юниту?
всё что тебе нужно по факту это угол с координатами и насколько сдвинуть юнита, знать математику и думать тут вообще не надо, нужно лишь знать принцип работы)
» WarCraft 3 / Двигать юнита(ов) к юниту?
Но тут уже дело не в математике, на самом деле она даже практически не нужна тут))
» WarCraft 3 / Двигать юнита(ов) к юниту?
» WarCraft 3 / Двигать юнита(ов) к юниту?
» WarCraft 3 / Путь эффекта невидимости
» WarCraft 3 / Двигать юнита(ов) к юниту?
Такое можно и на гуи спокойно сделать
» Блог Keparis9 / Ввод в блог Keparis9
» WarCraft 3 / Полезная информация
» WarCraft 3 / Полезная информация
» WarCraft 3 / Предмет меняющий здоровье на ману. проблема самоубийства им
Если отнять 200 от текущего здоровья меньше 1, то 200 отнять текущее здоровье и от текущего здоровья отнять полученный результат-1
Ред. rsfghd
» WarCraft 3 / Предмет меняющий здоровье на ману. проблема самоубийства им
Ред. rsfghd
» WarCraft 3 / Как сделать фильтр для разных игроков?
Ред. rsfghd
» WarCraft 3 / Бездействие самолётов как в генералах
Ред. rsfghd
» WarCraft 3 / Бездействие самолётов как в генералах
» WarCraft 3 / Бездействие самолётов как в генералах
» WarCraft 3 / Бездействие самолётов как в генералах
» WarCraft 3 / Есть ли способ сделать дисконнект игроку из карты?
» Блог Keparis9 / Ввод в блог Keparis9