Maniac_91, не может же быть 1x1 один фиг нет такого юнита, да и сетка кратна 4 насколько я помню. При рассчете пути используется система приближенного расчета размеров юнитов, т.е юнит всегда будет 4-8-16 ну и так далее.
У нас на сайте была система кастом бонусов для юнитов, там и броня и атака и скорость и многое другое, копируйте а вместо исследования делайте постройку юнита, как только даммик постройился (в его описании пишем описание апгрейда) удаляем его и выдаем нужным юнитам игрока бонусы и отдельным триггером следим что юниты игрока вошли в игровую зону и добавляем им апргейды ну и когда нужно удаляем, т.е делаем полностью свою систему апгрейдов, это вполне реализуемо и достаточно просто.
Написать свой ии, ты опупел со скриншотом? Совсем чтоли попоошай?
Так чисто для справки - р редакторе ии можно только описывать что и когда строить и когда нападать, а когда занимать новую базу, карта монолит в помощь.
Ну смотря что вы считаете ИИ, тактику или микро контроль? Экономика и тактика описана в ai скриптах, там обычный jass а микро и применение абилок в движке игры, это ни скопировать - только воссоздать на jass основываясь на данных о поведении ИИ.
Автокасты вроде ядовитых стрел отлавливаются только детектом урона по цели + проверка дебаффа, примеры есть в опен доте. Если знакомы с 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
Первый вариант - когда юнит сам кастует спелл, второй когда спелл кастует даммик.
Хз, зависит от поставленных задач, но какая у вас будет работать норм а какая нет - никто не знает, все методом проб и ошибок, последние билды были сделаны для работы с мемхаком, но они у многих отказываются работать стабильно, (поэтому в теме с мх есть ссылка на еще одну версию), читайте список изменений и скачивайте и проверяйте, так сложно?
» WarCraft 3 / Не работает понижение уровня исследования
Наработки этого типа очень распространены, учитесь гуглить сударь.
» WarCraft 3 / Идеальный дамми скил для вызова триггероно заклинания
» WarCraft 3 / Магазин из Юнита.
Карта путей здания и прочие параметры настраивайте по вкусу, там все поля подписаны на русском языке, меняйте и смотрите что будет.
» WarCraft 3 / Блокираторы пути (расширенные возможности)
» WarCraft 3 / Не работает понижение уровня исследования
» WarCraft 3 / Как заставить ИИ строить нестардартный объект вроде ратуши
Так чисто для справки - р редакторе ии можно только описывать что и когда строить и когда нападать, а когда занимать новую базу, карта монолит в помощь.
» RenderEdge / [RenderEdge] Экспериментальная версия
» WarCraft 3 / Использование способностей не у своих юнитов
» WarCraft 3 / По поводу AI - World Editor
» WarCraft 3 / Запуск перезарядки способности (не мемхак)
» WarCraft 3 / Timer expired условия
» WarCraft 3 / Использование способностей не у своих юнитов
» WarCraft 3 / Запуск перезарядки способности (не мемхак)
» 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 лучше использовать?