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

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

Ответ
 
JugHead

offline
Опыт: 1,612
Активность:
Вопрос по таймеру, не удаляются юниты.
В общем столкнулся с проблемой, делал скилл, при касте которого создаются 2 круга юнитов, связываются между собой созданными молниями, наносят урон и тд.
Проблема состоит в том что не удаляются молнии и объекты.
Собственно код:
((код jass
globals
unit uc
endglobals
function Trig_penta_Conditions takes nothing returns boolean
return GetSpellAbilityId() == 'A00G'
endfunction
function Destroy_penta takes nothing returns nothing
local integer i = 1
local integer int = GetHandleId(GetExpiredTimer())
local unit array u
local lightning array l
loop
exitwhen i > 16
set u[i] = LoadUnitHandle(udg_h, int, 15+i)
set l[i] = LoadLightningHandle(udg_h, int, 31+i)
endloop
loop
exitwhen i>16
call RemoveUnit(u[i])
call DestroyLightning(l[i])
set u[i] = null
set l[i] = null
set i = i+1
endloop
endfunction
function Filter_g takes nothing returns boolean
return IsPlayerEnemy(GetOwningPlayer(uc) ,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 Damage_penta takes nothing returns nothing
local integer lvl = GetUnitAbilityLevel(uc, 'A00G')
call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Demon\\DarkConversion\\ZombifyTarget.m​dl" , GetEnumUnit(), "overhead"))
call UnitDamageTargetBJ( uc, GetEnumUnit(), (20*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_ACID )
endfunction
function Timer_penta takes nothing returns nothing
local integer int = GetHandleId(GetExpiredTimer())
local real x = LoadReal(udg_h, int, 14)
local real y = LoadReal(udg_h, int, 15)
local group gb = CreateGroup()
local group gs = CreateGroup()
call GroupEnumUnitsInRange(gb, x, y, 480, Condition(function Filter_g))
call GroupEnumUnitsInRange(gs, x, y, 240, Condition(function Filter_g))
call ForGroup(gs, function Damage_penta)
call ForGroup(gb, function Damage_penta)
endfunction
function Trig_penta_Actions takes nothing returns nothing
local real array x
local real array y
local unit u = GetSpellAbilityUnit()
local integer i = 1
local timer t = CreateTimer()
local integer int = GetHandleId(t)
set x[0] = GetUnitX(u)
set y[0] = GetUnitY(u)
loop
exitwhen i>8
set x[i] = x[0]+480*Cos(45*i*bj_DEGTORAD)
set y[i] = y[0]+480*Sin(45*i*bj_DEGTORAD)
call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i], 0))
set i = i+1
endloop
loop
exitwhen i>16
set x[i] = x[0]+240*Cos(45*i*bj_DEGTORAD)
set y[i] = y[0]+240*Sin(45*i*bj_DEGTORAD)
call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i], 0))
set i = i+1
endloop
set i = 2
loop
exitwhen i>8
call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1]))
set i = i+1
endloop
call SaveLightningHandle(udg_h, int, 32, AddLightning("DRAB" , false, x[1], y[1], x[8], y[8]))
set i = 10
loop
exitwhen i>16
call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1]))
set i = i+1
endloop
call SaveLightningHandle(udg_h, int, 40, AddLightning("DRAB" , false, x[9], y[9], x[16], y[16]))
call SaveReal(udg_h, int , 14, x[0])
call SaveReal(udg_h, int , 15, y[0])
set uc = u
call TimerStart(t, 0.03125, true, function Timer_penta)
set u = null
endfunction
function InitTrig_penta takes nothing returns nothing
local timer t = CreateTimer()
set gg_trg_penta = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( gg_trg_penta, EVENT_PLAYER_UNIT_SPELL_CAST )
call TriggerAddCondition( gg_trg_penta, Condition( function Trig_penta_Conditions ) )
call TriggerAddAction( gg_trg_penta, function Trig_penta_Actions )
call TimerStart(t, 10.00, true, function Destroy_penta)
endfunction
))
Старый 09.05.2012, 18:51
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
» где экспайред таймер?
function Destroy_penta takes nothing returns nothing
   local timer t = GetExpiredTimer()
 local integer i = 1
    local integer int = GetHandleId(t)
    local unit array u
    local lightning array l
    loop
        exitwhen i > 16
        set u[i] = LoadUnitHandle(udg_h, int, 15+i)
        set l[i] = LoadLightningHandle(udg_h, int, 31+i)
    endloop
    loop
       exitwhen i>16
        call RemoveUnit(u[i])
        call DestroyLightning(l[i])
        set u[i] = null
        set l[i] = null
        set i = i+1
    endloop
call DestroyTimer(t)
set t = null
endfunction
Hatsume_Hate добавил:
» и тут должно быть так
	call TimerStart(t, 0.03125, true, function Timer_penta)
        set t = null
        set u = null
Hatsume_Hate добавил:
да я вообще не увидел где ты запускаешь таймер на уничтожение
Hatsume_Hate добавил:
и вообще сообщения пробовал ставить?
Hatsume_Hate добавил:
вопсчем.
ты делаешь так.
создаешь таймер 1, запускаешь его на 10 секунд, для убиения юнитов и молний.
создаешь таймер 2, сохраняешь на его хэндл молнии и юнитов
при завершении 10 секунд таймера 1, ты извлекаешь молнии и юнитов из его хэндла на который ты ничего не сохранял
Hatsume_Hate добавил:
таймеры надо удалять по истечению, хеш таблицу надо тоже очищать после использования, например
function zomg takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer h = GetHandleId(t)
...
call FlushChildHashtable(udg_hash,h)
call DestroyTimer(t)
set t = null
endfunction
Старый 09.05.2012, 19:36
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hatsume_Hate:
создаешь таймер 1, запускаешь его на 10 секунд, для убиения юнитов и молний.
создаешь таймер 2, сохраняешь на его хэндл молнии и юнитов
а может создадим отдельно для молнии и отдельно для юнитов?
JugHead,
у тебя во первых таймер не удаляется
во вторых у тебя цикл вот этот
((кат Код
~JugHead:
>     loop
>         exitwhen i > 16
>         set u[i] = LoadUnitHandle(udg_h, int, 15+i)
>         set l[i] = LoadLightningHandle(udg_h, int, 31+i)
>     endloop
>     loop
>        exitwhen i>16
>         call RemoveUnit(u[i])
>         call DestroyLightning(l[i])
>         set u[i] = null
>         set l[i] = null
>         set i = i+1
>     endloop
))
сделан криво
((кат Попробуй так
function Destroy_penta takes nothing returns nothing
    local integer i = 1
    local timer t = GetExpiredTimer()
    local integer int = GetHandleId(t)
    local unit array u
    local lightning array l
    loop
        exitwhen i > 16
        set u[i] = LoadUnitHandle(udg_h, int, 15+i)
        set l[i] = LoadLightningHandle(udg_h, int, 31+i)
        call RemoveUnit(u[i])
        call DestroyLightning(l[i])
        set u[i] = null
        set l[i] = null
        set i = i+1
    endloop
    call FlushChildHastable(udg_h,int)
    call DestroyTimer(t)
    set t = null
endfunction
))
Старый 09.05.2012, 19:37
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
у него проблема в том что он извлекает данные из таймера на который ничего не вешал, все что он вешал ушло в другом направлении
Старый 09.05.2012, 19:39
Klop
Папа римский
offline
Опыт: 13,006
Активность:
Hatsume_Hate, именно поэтому надо всё делать на 1 таймер
запускаем таймер с периодом 0.04 и делаем целочисленную на количество секунд
1.00 / 0.04 = 25 это 1 секунда
когда переменная будет равна 250 удаляем))
((кат Код
globals
unit uc 
endglobals

function Trig_penta_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'A00G'
endfunction

function Filter_g takes nothing returns boolean
    return IsPlayerEnemy(GetOwningPlayer(uc) ,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 Damage_penta takes nothing returns nothing
    local integer lvl = GetUnitAbilityLevel(uc, 'A00G')
    call DestroyEffect(AddSpecialEffectTarget("Abilities\\Spells\\Demon\\DarkConversion\\ZombifyTarget.m​​dl" , GetEnumUnit(), "overhead"))
    call UnitDamageTargetBJ( uc, GetEnumUnit(), (20*I2R(lvl)), ATTACK_TYPE_MAGIC, DAMAGE_TYPE_ACID )
endfunction

function Destroy_penta takes nothing returns nothing
    local integer i = 1
    local timer t = GetExpiredTimer()
    local integer int = GetHandleId(t)
    local unit array u
    local lightning array l
    local real x = LoadReal(udg_h, int, 14)
    local real y = LoadReal(udg_h, int, 15)
    local group gb = CreateGroup()
    local group gs = CreateGroup()
    local integer num = LoadInteger(udg_h,int,0)
    if num == 250 then
    loop
        exitwhen i > 16
        set u[i] = LoadUnitHandle(udg_h, int, 15+i)
        set l[i] = LoadLightningHandle(udg_h, int, 31+i)
        call RemoveUnit(u[i])
        call DestroyLightning(l[i])
        set u[i] = null
        set l[i] = null
        set i = i+1
    endloop
    call FlushChildHastable(udg_h,int)
    call DestroyTimer(t)
    else
    call GroupEnumUnitsInRange(gb, x, y, 480, Condition(function Filter_g))
    call GroupEnumUnitsInRange(gs, x, y, 240, Condition(function Filter_g))   
    call ForGroup(gs, function Damage_penta)
    call ForGroup(gb, function Damage_penta)
    set num = num + 1
    call SaveInteger(udg_h,int,0,num)
    endif
    set t = null
endfunction

function Trig_penta_Actions takes nothing returns nothing
    local real array x
    local real array y
    local unit u = GetSpellAbilityUnit()
    local integer i = 1
    local timer t = CreateTimer()
    local integer int = GetHandleId(t)
    set x[0] = GetUnitX(u)  
    set y[0] = GetUnitY(u)  
    loop 
        exitwhen i>8
        set x[i] = x[0]+480*Cos(45*i*bj_DEGTORAD)
        set y[i] = y[0]+480*Sin(45*i*bj_DEGTORAD)
        call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i],  0))   
        set i = i+1
    endloop
    loop 
        exitwhen i>16
        set x[i] = x[0]+240*Cos(45*i*bj_DEGTORAD)
        set y[i] = y[0]+240*Sin(45*i*bj_DEGTORAD)
       call SaveUnitHandle(udg_h, int, 15+i, CreateUnit(GetOwningPlayer(u), 'h000', x[i] , y[i],  0))   
        set i = i+1
    endloop
    set i = 2
    loop 
        exitwhen i>8
        call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1]))
        set i = i+1
    endloop
        call SaveLightningHandle(udg_h, int, 32, AddLightning("DRAB" , false, x[1], y[1], x[8], y[8]))
        set i = 10
    loop 
        exitwhen i>16
        call SaveLightningHandle(udg_h, int, 31+i, AddLightning("DRAB" , false, x[i], y[i], x[i-1], y[i-1]))
        set i = i+1
    endloop
        call SaveLightningHandle(udg_h, int, 40, AddLightning("DRAB" , false, x[9], y[9], x[16], y[16]))
        call SaveReal(udg_h, int , 14, x[0])   
        call SaveReal(udg_h, int , 15, y[0])   
    set uc = u
    call SaveInteger(udg_h,int,0,0)
    call TimerStart(t, 0.04, true, function Destroy_penta)
    set u = null
    set t = null
endfunction

function InitTrig_penta takes nothing returns nothing
    local timer t = CreateTimer()
    set gg_trg_penta = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_penta, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( gg_trg_penta, Condition( function Trig_penta_Conditions ) )
    call TriggerAddAction( gg_trg_penta, function Trig_penta_Actions )
endfunction
))
пробуй от руки исправлял
Старый 09.05.2012, 19:47
JugHead

offline
Опыт: 1,612
Активность:
Всем спасибо:)
тему можно закрыть

Отредактировано JugHead, 12.05.2012 в 16:27.
Старый 09.05.2012, 20:42
Ответ

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

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

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

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



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