XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
JugHead

offline
Опыт: 1,612
Активность:
не удаляет юнита.
Создал скилл, в котором ставится ловушка, если на нее наступит враждебный юнит, создается дамми который кидает на него корни и наносится дамаг.
Если в течении 10 секунд на ловушку никто не наступил она должна уничтожаться, собственно чего не происходит ;(
ловушка занесена в переменную u .
код:
((код jass
globals
unit IT_c
endglobals
function IceTrap_Cond takes nothing returns boolean
return GetSpellAbilityId() == 'A00H'
endfunction
function IceTrap_Filter takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(IT_c) ,GetOwningPlayer(GetFilterUnit())) and GetWidgetLife(GetFilterUnit())>=0.405 and not IsUnitType(GetFilterUnit(),UNIT_TYPE_STRUCTURE) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_MAGIC_IMMUNE)and not IsUnitType(GetFilterUnit(),UNIT_TYPE_FLYING)
endfunction
function IceTrap_Group takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local unit c = LoadUnitHandle(udg_h, int, 50)
local unit u = LoadUnitHandle(udg_h, int, 51)
local integer lvl = LoadInteger(udg_h, int, 52)
local integer num = LoadInteger(udg_h, int, 53)
local unit f = GetEnumUnit()
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local real x2 = GetUnitX(f)
local real y2 = GetUnitY(f)
local real dist = SquareRoot((x2-x)*(x2-x)+(y2-y)*(y2-y))
local unit d
if dist <= 150 and num < 250 then
call RemoveUnit(u)
call DestroyEffect(AddSpecialEffect("Abilities\\Spells\\NightElf\\Blink\\BlinkTarget.mdl" , x, y))
set d = CreateUnit(GetOwningPlayer(c), 'h007', x, y, 0)
call SaveUnitHandle(udg_h, int, 55, f)
call UnitApplyTimedLife(d, 'BTLF', 5.0)
call ShowUnitHide(d)
call SetUnitAbilityLevel(d, 'A00l', lvl)
call IssueTargetOrder(d, "entanglingroots", f)
endif
set f = null
set c = null
set t = null
set u = null
set d = null
endfunction
function IceTrap_timer takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer int = GetHandleId(t)
local unit c = LoadUnitHandle(udg_h, int, 50)
local unit u = LoadUnitHandle(udg_h, int, 51)
local integer lvl = LoadInteger(udg_h, int, 52)
local integer num = LoadInteger(udg_h, int, 53)
local real x = GetUnitX(u)
local real y = GetUnitY(u)
local group g = CreateGroup()
local boolexpr b = Condition(function IceTrap_Filter)
local unit f
set num = num +1
set IT_c = c
call GroupEnumUnitsInRange(g, x, y, 500, b)
if num != 250 then
call ForGroup(g, function IceTrap_Group)
call SaveInteger(udg_h,int,53,num)
call DestroyBoolExpr(b)
set b = null
endif
if num == 50+25*lvl then
call PauseTimer(t)
set f = LoadUnitHandle(udg_h, int, 55)
call DestroyEffect(AddSpecialEffectTarget( "Abilities\\Spells\\Undead\\FrostNova\\FrostNovaTarget.mdl", f, "origin"))
call UnitDamageTarget(c, f, 100*lvl, false, false, ATTACK_TYPE_MAGIC, DAMAGE_TYPE_COLD, WEAPON_TYPE_WHOKNOWS)
call FlushChildHashtable( udg_h, int )
call DestroyTimer(t)
elseif num == 250 then
call RemoveUnit(u)
call FlushChildHashtable( udg_h, int )
call DestroyTimer(t)
endif
call DestroyGroup(g)
set f = null
set t = null
set c = null
set u = null
set g = null
endfunction
function IceTrap_Actions takes nothing returns nothing
local timer t = CreateTimer()
local integer int = GetHandleId(t)
local unit c = GetSpellAbilityUnit()
local unit u = CreateUnit(GetOwningPlayer(c), 'h006', GetUnitX(c), GetUnitY(c), 0)
local integer lvl = GetUnitAbilityLevel(c, 'A00H')
call SaveUnitHandle(udg_h, int, 50, c)
call SaveUnitHandle(udg_h, int, 51, u)
call SaveInteger(udg_h, int, 52, lvl)
call SaveInteger(udg_h, int, 53, 0)
call TimerStart(t, 0.04, true, function IceTrap_timer )
set u = null
set t = null
set c = null
endfunction
function InitTrig_IceTrap takes nothing returns nothing
set gg_trg_IceTrap = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ(gg_trg_IceTrap, EVENT_PLAYER_UNIT_SPELL_CAST)
call TriggerAddCondition(gg_trg_IceTrap, Condition(function IceTrap_Cond))
call TriggerAddAction(gg_trg_IceTrap, function IceTrap_Actions)
endfunction
))

Отредактировано JugHead, 13.05.2012 в 16:28.
Старый 13.05.2012, 16:22
quq_CCCP
Я белый и пушистый!
offline
Опыт: 93,279
Активность:
JugHead, хеш инициализирован?
Старый 13.05.2012, 16:51
prog

offline
Опыт: 32,865
Активность:
JugHead, используй время жизни или отрицательную регенерацию, меньше нагрузка будет. Также я бы советовал уйти от такого извращенного способа определения попадания в ловушку - каждые 0.04 секунды пикать всех в радиусе 500 это немного накладно, лучше уж динамически создавать и удалять триггер под каждую ловушку, отслеживающий вход юнита в радиус.
Старый 13.05.2012, 17:38
JugHead

offline
Опыт: 1,612
Активность:
quq_CCCP, да, иначе бы другие действия не работали(
prog, можно пример про триггер с отслеживанием юнита входящего в радиус, немного не понимаю как именно -_-
Через рект чтоль?

Отредактировано JugHead, 13.05.2012 в 18:58.
Старый 13.05.2012, 18:50
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
можно вообще отлавливать без интервалов. Дай ловушке атаку, обычную атаку с уроном 1-1, перезарядкой большой, и триггер - юнит атакован - атакующий это ловушка - взорвать ловушку
Старый 13.05.2012, 19:01
JugHead

offline
Опыт: 1,612
Активность:
Ладно всем спасибо, разобрался)
тему можно закрывать.
Старый 13.05.2012, 19:07
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 20:01.