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

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

Ответ
 
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Проблема с удалением бафа по таймеру
Далее приведен участок кода, если нужно, дам весь код, вместе с описаниями...
Код:
local real r
local timer t
set r=I2R((GetHeroAgi(u,true)-GetHeroAgi(u2,true))/50)
if r<=0. then
set r=0.01
endif
set t=CreateTimer()
call TimerStart(t,r,false,function Afae3)
call SaveUnitHandle(Hash,0,GetHandleId(t),u)

function Afae3 takes nothing returns nothing
local timer t=GetExpiredTimer()
call DestroyTimer(t)
call UnitRemoveAbility(LoadUnitHandle(Hash,GetHandleId(t),0),'BPSE')
call FlushChildHashtable(Hash,GetHandleId(t))
call DestroyTimer(t)
set t=null
endfunction

Естественно в коде функция афае3 стоит выше)) но тут не суть)
Проблема что баф стана должен ремувиться в зависимости от разници между Аги героев, если разность в минусе, министан само-собой. Но проблема, что баф просто не ремувится... Я уже даже не знаю что предпринять...



Раз уж пошло, а вообще стоит ли после уничтожения чего-либо обнулять его локалку? Я думаю да, но в работе нативок на этот счет не силен.
И 2е, скил весьма громоздский, на юнита создается 2 триггера, и еще раз если бафа скила нет... Оба ремувятся при получении физических повреждений. Стоит ли заносить их в хэш и делать проверку на их существование, или же хватит и того что ремув произойдет при любой атаке если баф отсутствует или же при атаке скастовавшего в случае остатка бафа...

Многозначительное название +дырка.
[+] 1 пункт от Enein: название темы не отражает сути вопроса

Отредактировано DioD, 20.01.2011 в 16:03.
Старый 20.01.2011, 14:36
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Diaboliko,Точно не знаю,но call UnitRemoveAbility не удалят баффы. ИМХО
Старый 20.01.2011, 15:22
16GB
GhostOne User
offline
Опыт: 59,317
Активность:
удалят как раз таки
Старый 20.01.2011, 15:27
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
16GB, ммм щяс затестю

Dreii добавил:
Цитата:
Сообщение от Diaboliko
call SaveUnitHandle(Hash,0,GetHandleId(t),u)

выше call TimerStart поставь
Цитата:
Сообщение от Diaboliko
call DestroyTimer(t)
call UnitRemoveAbility(LoadUnitHandle(Hash,GetHandleId(t),0),'BPSE')
call FlushChildHashtable(Hash,GetHandleId(t))
call DestroyTimer(t)


Зачем два call DestroyTimer(t)
и еще
Цитата:
Сообщение от Diaboliko
GetHandleId(t)

Думаю лучше впеременную

Dreii добавил:
16GB, ух ты и вправду удаляет)
Старый 20.01.2011, 15:35
Master_chan
Полуночный командир
offline
Опыт: 15,660
Активность:
в Afae3 первый DestroyTimer либо убрать либо поменять на PauseTimer
Старый 20.01.2011, 15:36
DioD

offline
Опыт: 45,184
Активность:
настоятельно рекомендую использовать отладочные сообщения плана
BJDebug("Afae3 EXEC")
BJDebug("Afae3 DONE")
BJDebug(R2S(r))
и иные, для того чтобы понять в чём проблема САМОМУ, а не спамить форум однотипными вопросами.
проверка в начале функции и её конце позволяет выяснить факт запуска(не запуска) и обрыва потока самостоятельно и мгновенно
Старый 20.01.2011, 16:09
Ninbous
Jass progress >>>>>35/100
offline
Опыт: 5,674
Активность:
DioD, эти операторы писать прямо в функции?
Старый 20.01.2011, 16:34
DioD

offline
Опыт: 45,184
Активность:
это вызовы функции, а не операторы.
Старый 20.01.2011, 16:36
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Dreii:
Зачем два call DestroyTimer(t)
оп)) но сути не изменило...
Dreii:
Думаю лучше впеременную
А что с MUI?
DioD:
BJDebug("Afae3 EXEC")
BJDebug("Afae3 DONE")
BJDebug(R2S(r))
Рад бы получить ссылочку на то, что такое бж дебаг))
P.S. как правило мои посты отнюдь не забивают, ибо я задаю только >< вопросы на которые редко получаю ответ... Лучше скажи че по делу.
Dreii:
выше call TimerStart поставь
Ничего не изменилось...
Старый 20.01.2011, 16:53
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Diaboliko, создание таймера под иф засунь
Старый 20.01.2011, 16:57
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
В код(и побочные триггеры) все функции и настройки добавляются после покупки персонажа...
Рассматривается функция афае2
После какого, спрашивается ифа?)

» КОД
Код:
function Afae3 takes nothing returns nothing
local timer t=GetExpiredTimer()
call UnitRemoveAbility(LoadUnitHandle(Hash,GetHandleId(t),0),'BPSE')
call FlushChildHashtable(Hash,GetHandleId(t))
call DestroyTimer(t)
set t=null
endfunction

function Afae2 takes nothing returns nothing
local unit u
local unit u2
local real r
local timer t
if GetEventDamage()>0. then
set u=GetEventDamageSource()
set u2=GetTriggerUnit()
set r=I2R((GetHeroAgi(u,true)-GetHeroAgi(u2,true))/50)
if r<=0. then
set r=0.01
endif
if GetUnitAbilityLevel(u,'Afae')>0 and GetUnitAbilityLevel(u2,'Bfae')>0 then
call UnitRemoveAbility(u2,'Bfae')
call SetPlayerAbilityAvailable(GetOwningPlayer(u),'AHbh',false)
set t=CreateTimer()
call SaveUnitHandle(Hash,0,GetHandleId(t),u)
call TimerStart(t,r,false,function Afae3)
set r=0
set u=null
set u2=null
set t=null
call DisableTrigger(GetTriggeringTrigger())
call TriggerSleepAction(.1)
if GetUnitAbilityLevel(GetTriggerUnit(),'Afae')<1 then
call DestroyTrigger(GetTriggeringTrigger())
else
call EnableTrigger(GetTriggeringTrigger())
endif
endif
set r=0
set u=null
set u2=null
endif
endfunction

function Afae1 takes nothing returns nothing
local unit u=GetAttacker()
local unit u2=GetTriggerUnit()
local trigger t=GetTriggeringTrigger()
if GetUnitAbilityLevel(u,'Afae')>0 then
if GetUnitAbilityLevel(u2,'Bfae')>0 then
call SetPlayerAbilityAvailable(GetOwningPlayer(u),'AHbh',true)
call SetUnitAbilityLevel(u,'AHbh',GetRandomInt(1,(2+GetUnitAbilityLevel(u,'Afae'))))
call PauseUnit(u,true)
call PauseUnit(u,false)
call IssueTargetOrder(u,"attack",u2)
call DisableTrigger(t)
call TriggerSleepAction(.1)
if GetUnitAbilityLevel(u2,'Bfae')<1 then
call DestroyTrigger(t)
endif
else
set u=null
call DisableTrigger(t)
call TriggerSleepAction(.1)
call DestroyTrigger(t)
endif
endif
set u=null
set u2=null
endfunction

function CHmkg takes nothing returns nothing
local trigger t
local unit u=GetSpellTargetUnit()
if GetSpellAbilityId()=='Afae' then
if GetUnitAbilityLevel(u,'Bfae')<1 then
set t=CreateTrigger()
call TriggerAddAction(t,function Afae2)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_DAMAGED)
set t=CreateTrigger()
call TriggerAddAction(t,function Afae1)
call TriggerRegisterUnitEvent(t,u,EVENT_UNIT_ATTACKED)
set t=null
endif
else
if GetSpellAbilityId()=='AUls' then
set I=2+GetUnitAbilityLevel(u,'AUls')

else
endif
endif
set t=null
endfunction

//===========================================================================
function InitTrig_CHmkg takes nothing returns nothing
    set gg_trg_CHmkg=CreateTrigger()
    call TriggerAddAction(gg_trg_CHmkg,function CHmkg)
endfunction
Старый 20.01.2011, 16:59
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Код:
local real r
local timer t
set r=I2R((GetHeroAgi(u,true)-GetHeroAgi(u2,true))/50)
if r<=0. then
set r=0.01
set t=CreateTimer()
call TimerStart(t,r,false,function Afae3)
call SaveUnitHandle(Hash,0,GetHandleId(t),u)
set t=null
endif
Старый 20.01.2011, 17:00
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Недокопирование)) Я вырывал отрывок кода спешно. Основной код приведен. В нем все как надо...
Старый 20.01.2011, 17:05
DioD

offline
Опыт: 45,184
Активность:
Diaboliko
Эти функции такие же как все остальные, я даже ЛЮБЕЗНО, вставил нужные параметры, будьте так добры и выполните эту простую работу САМИ, прямо сейчас, а после сообщите о результате выполнения, нам всем интересно, выполняется ли колбек таймера ВООБЩЕ, может он не запускается вовсе.
Старый 20.01.2011, 17:06
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Просил же объяснить работу....
Если просто вставляю, синтакс ерор, что объяснимо,
если ствлю call то андеклеред функшн...
Старый 20.01.2011, 17:12
DioD

offline
Опыт: 45,184
Активность:
БЖ открой ёптить
function BJDebugMsg takes string msg returns nothing
    local integer i = 0
    loop
        call DisplayTimedTextToPlayer(Player(i),0,0,60,msg)
        set i = i + 1
        exitwhen i == bj_MAX_PLAYERS
    endloop
endfunction
вообще ты должен знать что эта за функция и как она работает, потому что она работает КАК ЛЮБАЯ ДРУГАЯ ФУНКЦИЯ ТОЧНО ТАКЖЕ.
Старый 20.01.2011, 17:30
Hanabishi
COOL STATUS
offline
Опыт: отключен
БЖ открой ёптить
хаха
что делает функция DisplayTextToPlayer? натив открой ёптить!
Diaboliko
call SaveUnitHandle(Hash,0,GetHandleId(t),u)
call UnitRemoveAbility(LoadUnitHandle(Hash,GetHandleId(t),0),'BPSE')
имхо в одной функции 0,GetHandleId(t), а в другой GetHandleId(t),0
поменяй гденить местами=)
Hanabishi добавил:
ты сохраняешь в один ключ, а достать пытаешься из другого, неудивительно что не пашет
Старый 20.01.2011, 21:53
Klop
Папа римский
offline
Опыт: 13,006
Активность:
обьясняю проблему в первом посте
call DestroyTimer(t)
call UnitRemoveAbility(LoadUnitHandle(Hash,GetHandleId(t),0),'BPSE')
call FlushChildHashtable(Hash,GetHandleId(t))
call DestroyTimer(t)
после первого DestroyTimer у тебя удалился таймер и ты не можешь получить GetHandleId его
Старый 20.01.2011, 22:08
Diaboliko
Silenced by Diaboliko
offline
Опыт: 16,108
Активность:
Мм терь понял что за бж)) Хотя странно что она у меня шла как андеклеред функшн....
Klop, Этот проблем уже давненько устранен)), спасибо Dreii'ю. Но сути не сменило)

Diaboliko добавил:
Цитата:
Сообщение от Hanabishi
имхо в одной функции 0,GetHandleId(t), а в другой GetHandleId(t),0

И правда что... Исправил, всей-равно не пашет Т_Т
Старый 21.01.2011, 09:44
Dreii
define{name=Dreii age=17}
offline
Опыт: 5,246
Активность:
Цитата:
Сообщение от Diaboliko
function InitTrig_CHmkg takes nothing returns nothing
set gg_trg_CHmkg=CreateTrigger()
call TriggerAddAction(gg_trg_CHmkg,function CHmkg)
endfunction

Мб ты событие забыл?,или добавляешь получает урон:?
Старый 21.01.2011, 12:24
Ответ

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

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

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

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



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