Автокасты вроде ядовитых стрел отлавливаются только детектом урона по цели + проверка дебаффа, примеры есть в опен доте. Если знакомы с Jass то проблем не будет вовсе.
Просите какая то ерунда, вы пытаетесь сделать стандартный снаряд?
Есть метод проще, да еще одно но, при касте негативной абилки - сначала 0.00 урона в цель, потом после попадания 0.00 урона + дебафф если он есть. Проверили бы все обьекты, да и откуда GetTriggeringTrigger() в потоке вызванном таймером?
Я юзаю примерно следующий код:
Dummy Missile
scope DummyMissile
function AddTimedAnimation takes nothing returns nothing
local timer t = GetExpiredTimer( )
call SetUnitAnimation( LoadUnitHandle( gg_htb_HashData, GetHandleId(t), 0 ), "spell" )
call FlushChildHashtable( gg_htb_HashData, GetHandleId(t) )
call DestroyTimer(t)
set t = null
endfunction
struct DMD
trigger trg
triggercondition trc
triggeraction tra
triggeraction extra
unit cast
unit targ
unit ex
integer id
timer trix
boolean del
method FlushData takes nothing returns nothing
call DisableTrigger( .trg )
call TriggerRemoveCondition( .trg, .trc )
call TriggerRemoveAction( .trg, .tra )
call TriggerRemoveAction( .trg, .extra )
call TriggerClearActions( .trg )
call TriggerClearConditions( .trg )
call RemoveDataBX( .trg )
call RemoveDataBX( .trix )
call DestroyTrigger( .trg )
call DestroyTimer( .trix )
set this.trg = null
set this.trc = null
set this.tra = null
set this.extra = null
set this.cast = null
set this.targ = null
set this.ex = null
set this.trix = null
set this.id = 0
set this.del = false
endmethod
endstruct
function IsTargetHasBuff takes nothing returns boolean
local DMD st = GetDataBX( GetTriggeringTrigger( ) )
set bj_lastEventId = GetTriggerEventId( )
if bj_lastEventId == EVENT_WIDGET_DEATH then
call TriggerRemoveAction( st.trg, st.tra )
return true
endif
if bj_lastEventId == EVENT_UNIT_DAMAGED then
if GetEventDamageSource( ) == DummyAttacker then
return false
elseif GetEventDamage( ) == 0.00 and GetEventDamageSource( ) == st.cast and GetUnitAbilityLevel( st.targ, 'BNss' ) > 0 then
call TriggerRemoveAction( st.trg, st.tra )
return true
endif
endif
return GetEventDamage( ) == 0.00 and GetUnitAbilityLevel( st.targ, st.id ) > 0 and GetEventDamageSource( ) == st.cast
endfunction
function Destroy_DMD takes nothing returns nothing
local DMD st = GetDataBX( GetExpiredTimer( ) )
call st.FlushData( )
call st.destroy( )
endfunction
function RemoveDMDBuff takes nothing returns nothing
local DMD st = GetDataBX( GetTriggeringTrigger( ) )
if st.del then
call UnitRemoveAbility( st.targ, st.id )
endif
call PauseTimer( st.trix )
call DisableTrigger( st.trg )
call TimerStart( st.trix, 10.00, false, function Destroy_DMD )
return
endfunction
function DummyMissile takes unit target, unit caster, integer buffid, real time, boolean del, code actions returns nothing
local DMD st = DMD.create( )
set st.cast = caster
set st.targ = target
set st.id = buffid
set st.del = del
set st.trix = CreateTimer( )
set st.trg = CreateTrigger( )
set st.trc = TriggerAddCondition( st.trg, Condition( function IsTargetHasBuff ) )
set st.tra = TriggerAddAction( st.trg, actions )
set st.extra = TriggerAddAction( st.trg, function RemoveDMDBuff )
call TriggerRegisterUnitEvent( st.trg, target, EVENT_UNIT_DAMAGED )
//call TriggerRegisterUnitEvent( st.trg, target, EVENT_UNIT_SPELL_EFFECT)
call TriggerRegisterDeathEvent( st.trg, target )
call TimerStart( st.trix, time, false, function Destroy_DMD )
call SetDataBX( st.trg, st )
call SetDataBX( st.trix, st )
endfunction
function Timer_DummyMovement_Expires takes nothing returns nothing
local TriggerData dd = GetDataBX( GetExpiredTimer( ) )
set dd.time = dd.time + 1
if not IsUnitDead( dd.attacker ) then
call SetUnitX( dd.dummy, GetUnitX( dd.attacker ) )
call SetUnitY( dd.dummy, GetUnitY( dd.attacker ) )
endif
if dd.time > 64 then
call PauseTimer( dd.trix )
call RemoveDataBX( dd.trix )
call DestroyTimer( dd.trix)
endif
endfunction
function DummyMissileEx_Check_Buff_Codnditions takes nothing returns boolean
local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
set bj_lastEventId = GetTriggerEventId( )
if bj_lastEventId == EVENT_WIDGET_DEATH or bj_lastEventId == EVENT_GAME_TIMER_EXPIRED then
call TriggerRemoveAction( st.trg, st.tra )
return true
endif
if bj_lastEventId == EVENT_UNIT_DAMAGED then
if GetEventDamageSource( ) != st.dummy then
return false
elseif GetEventDamage( ) == 0.00 and GetEventDamageSource( ) == st.dummy and GetUnitAbilityLevel( st.attacked, 'BNss' ) > 0 then
call TriggerRemoveAction( st.trg, st.tra )
return true
endif
endif
return GetEventDamage( ) >= 0.00 and GetUnitAbilityLevel( st.attacked, st.id ) > 0 and GetEventDamageSource( ) == st.dummy
return false
endfunction
function DummyMissileEx_ExtraActions takes nothing returns nothing
local TriggerData st = GetDataBX( GetTriggeringTrigger( ) )
call DisableTrigger( st.trg )
if st.trix != null then
call PauseTimer(st.trix)
call RemoveDataBX( st.trix )
call DestroyTimer(st.trix)
endif
if not IsUnitDead( st.attacked ) then
if GetUnitAbilityLevel( st.attacked, st.id ) > 0 then
call UnitRemoveAbility( st.attacked, st.id )
endif
endif
call RemoveUnit( st.dummy )
call st.RemoveTrigger()
call st.destroy()
endfunction
function DummyMissileEx takes unit target, unit caster, boolean spell, integer missileid, integer order, integer buffid, code actions returns boolean
local TriggerData st = TriggerData.create()
local timer t
local boolean b = false
if spell then
set t= CreateTimer( )
call SaveUnitHandle( gg_htb_HashData, GetHandleId(t),0, caster )
call TimerStart( t, 0.10, false, function AddTimedAnimation )
set t = null
endif
set st.attacker = caster
set st.attacked = target
set st.id = buffid
set st.pl = GetOwningPlayer( st.attacker )
set TempAX = GetUnitX( st.attacker )
set TempAY = GetUnitY( st.attacker )
set st.dummy = CreateUnit( st.pl, 'hatk',TempAX,TempAY,GetUnitFacing(st.attacked))
set st.trg = CreateTrigger( )
set st.trc = TriggerAddCondition( st.trg, Condition( function DummyMissileEx_Check_Buff_Codnditions ) )
set st.tra = TriggerAddAction( st.trg, actions )
set st.extra = TriggerAddAction( st.trg, function DummyMissileEx_ExtraActions )
set st.trix = CreateTimer()
call SetUnitPathing(st.dummy, false)
call SetUnitX(st.dummy,TempAX)
call SetUnitY(st.dummy,TempAY)
call UnitApplyTimedLife(st.dummy, 'BTLF', 10.00 )
call UnitAddAbility( st.dummy, missileid )
call UnitShareVision( st.attacked, st.pl, true )
set b = IssueTargetOrderById( st.dummy, order, st.attacked ) // incenerate arrow
call UnitShareVision( st.attacked, st.pl, false )
call TriggerRegisterDeathEvent( st.trg, st.attacked )
call TriggerRegisterUnitEvent( st.trg, st.attacked, EVENT_UNIT_DAMAGED )
call TriggerRegisterTimerEvent( st.trg, 10.00, false )
call SetDataBX( st.trg, st )
if b then
call SetDataBX( st.trix, st )
set st.time = 1
call TimerStart( st.trix, 0.03125, true, function Timer_DummyMovement_Expires )
endif
return b
endfunction
endscope
Первый вариант - когда юнит сам кастует спелл, второй когда спелл кастует даммик.
Хз, зависит от поставленных задач, но какая у вас будет работать норм а какая нет - никто не знает, все методом проб и ошибок, последние билды были сделаны для работы с мемхаком, но они у многих отказываются работать стабильно, (поэтому в теме с мх есть ссылка на еще одну версию), читайте список изменений и скачивайте и проверяйте, так сложно?
Тут стоит помнить что некоторые лимиты были придуманы не просто так, и пользоваться этими отключениями лимитов нужно с осторожностью, понимая что за этим следует.
Старайтесь не делать супер гиганстких карт заваленных деревьями, ограничитесь ландшафтом поменьше и более тщательно прорабатывайте рельеф, быть может вам не потребуется столько деревьев? Некоторые вещи решаются без разрушаемых обьектов.
Попахивает фейком, это похоже на конверт моделей, граффика даже по меркам ск2 слабая, да и где то я уже это видел.
Эт конверт моделей вк3 для старкравта? Или чето в этом духе, новая игра на новом движке в 2019? Чет тут нето. Я уже ожидал граффоний кризиса, трава которая шевелится от ветра, елки похожие на настоящие елки а не на китайские искусственные сосны для новогодних праздников.
Ну поживем, увидим.
Ну оптимизаторы убирают самые тупые и типичные проблемы, остальное - можно только руками. На гуи делать динамичные карты в 2018 - себя не уважать, учите jass сразу попадут и лаги и долгие загрузки и в игре добавится куча фишек и интересных деталей, ранее вам недоступных как и 90% картоделов прошлого.
Hanuman, разумеется нам не интересно делать ваши карты за вас, у нас есть свои в отличии от вас. Ну и вам хоть бы уровень 2006 года освоить. Если ты еще не понял, тут тебе не делаю ничего не потому что не могут или не хотят, а пытаются донести до тебя что это путь в никуда, никах изменений карт без познаний сделать нельзя, сам ты никто пока за тебя будут делать, этому за 5 минут не научится.
PT153, насколько помню с этим была какая то проблема, в доте почему не юзнули, точнее юзнули и отказались, вренулись к абилкам молотка бурь с временем на все случаи жизни.
Как бы флаг стана используют 100500 стандартных дисейблов в варе, смерчь, огненная сетка, и многое другое.
Отказаться от всех этих абилок - порой недоступная роскошь.
Кстати чет я забыл про мемхак описать, автору интересно? То про кастом станы мемхака практически нигде нету инфы...
code не может быть ни массивом ни сохранен или передан как то еще кроме как 1 переменной, так что не удивительно, поэтому там юзают екзекут, без ретурн бага сделать массив code никак не получится, увы но этот тип мягко говоря не предназначен для таких манипуляций.
» WarCraft 3 / Запуск перезарядки способности (не мемхак)
» WarCraft 3 / Запуск перезарядки способности (не мемхак)
» WarCraft 3 / Timer expired условия
GetEexpiredTimer() ищи в гуях, или кастом скриптом юзай.
» WarCraft 3 / Событие ПРИВОДИТ СПОСОБНОСТЬ В ДЕЙСТВИЕ
» WarCraft 3 / WE WARCRAFT3
» WarCraft 3 / Голосовалка: Купите ли вы ремастер или нет?
» WarCraft 3 / Два события в триггер
Есть метод проще, да еще одно но, при касте негативной абилки - сначала 0.00 урона в цель, потом после попадания 0.00 урона + дебафф если он есть. Проверили бы все обьекты, да и откуда GetTriggeringTrigger() в потоке вызванном таймером?
Я юзаю примерно следующий код:
» WarCraft 3 / Работает ли функция GetLocalPlayer с SetAbilityTooltip?
» WarCraft 3 / "Люди" испорчущие тебе рейтинг просто так...
Какой рейтинг, где, кто тебе его испортил? Чувак если ты будешь продолжать в том же духе то рейтинг тебе буду портить уже я.
» WarCraft 3 / Как сменить модель выпадающего предмета?
» WarCraft 3 / Лимиты без джнгп
» WarCraft 3 / Какую версию jasshelper лучше использовать?
» WarCraft 3 / Лимиты без джнгп
Старайтесь не делать супер гиганстких карт заваленных деревьями, ограничитесь ландшафтом поменьше и более тщательно прорабатывайте рельеф, быть может вам не потребуется столько деревьев? Некоторые вещи решаются без разрушаемых обьектов.
» WarCraft 3 / Blizzcon: Анонсирован WarCraft III Reforged (remaster)
Эт конверт моделей вк3 для старкравта? Или чето в этом духе, новая игра на новом движке в 2019? Чет тут нето. Я уже ожидал граффоний кризиса, трава которая шевелится от ветра, елки похожие на настоящие елки а не на китайские искусственные сосны для новогодних праздников.
Ну поживем, увидим.
» WarCraft 3 / Прокачка героя
» WarCraft 3 / Как оптимизировать карту?
» WarCraft 3 / Jass тригеры
Если ты еще не понял, тут тебе не делаю ничего не потому что не могут или не хотят, а пытаются донести до тебя что это путь в никуда, никах изменений карт без познаний сделать нельзя, сам ты никто пока за тебя будут делать, этому за 5 минут не научится.
» WarCraft 3 / Jass тригеры
» WarCraft 3 / Нагрузка: ХТ vs Массивы
» WarCraft 3 / Способность: повышение атаки при каждом ударе
» WarCraft 3 / Система стана
» WarCraft 3 / Система стана
Отказаться от всех этих абилок - порой недоступная роскошь.
Кстати чет я забыл про мемхак описать, автору интересно? То про кастом станы мемхака практически нигде нету инфы...
» WarCraft 3 / Как скрыть характеристики врагов ?
» WarCraft 3 / Система стана
» WarCraft 3 / Почему нельзя вызвать через code переменная?