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

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

Закрытая тема
 
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
Баги в коде
Этот код должен делать следующие герою в 1 секунду не должно войти урона больше чем его 25/20/15% макс здоровья, но почему то код работает не корректно и получается овер хил
function WildStrengthCon takes nothing returns boolean
return GetUnitAbilityLevel(GetLearningUnit(),'A0EK') == 1
endfunction

function WildStrengthConDmg takes nothing returns boolean
local unit u = GetTriggerUnit()
local real dmg = GetEventDamage()
local integer id = GetHandleId(u)
local real dmgbox = LoadReal(udg_AssassinHash,id,StringHash("DmgBox"))+dmg
local real ml = GetUnitState(u,UNIT_STATE_MAX_LIFE)*(.30-(.05*GetUnitAbilityLevel(u,'A0EK')))
local real col = 255*(1-(dmgbox/ml))
local boolean b = LoadBoolean(udg_AssassinHash,id,StringHash("WSL"))
if GetEventDamage() > 0 and GetUnitState(GetTriggerUnit(),UNIT_STATE_MAX_LIFE) > GetEventDamage() then
if ml > dmgbox and b == false then 
call SaveReal(udg_AssassinHash,id,StringHash("DmgBox"),dmgbox)
call SetUnitVertexColor(u,255,R2I(col),R2I(col),255)
endif
if b then
call SetWidgetLife(u,GetWidgetLife(u)+dmg)
endif
if dmg >= ml and b == false then
call SetWidgetLife(u,GetWidgetLife(u)+(dmg-ml))
call SaveBoolean(udg_AssassinHash,id,StringHash("WSL"),true)
call DisplayTextToForce(GetPlayersAll(),"yes")
call SetUnitVertexColor(u,255,0,0,255)
endif
if dmgbox >= ml and b == false then
call SetWidgetLife(u,GetWidgetLife(u)+(dmgbox-ml))
call SaveBoolean(udg_AssassinHash,id,StringHash("WSL"),true)
call DisplayTextToForce(GetPlayersAll(),"yes")
call SetUnitVertexColor(u,255,0,0,255)
endif
set u = null
else
return false
endif
endfunction



function WildStrengthRefresh takes nothing returns nothing
local timer t = GetExpiredTimer()
local unit u = LoadUnitHandle(udg_AssassinHash,GetHandleId(t),1)
call SaveReal(udg_AssassinHash,GetHandleId(u),StringHash("DmgBox"),0)
call SaveBoolean(udg_AssassinHash,GetHandleId(u),StringHash("WSL"),false)
call DisplayTextToForce( GetPlayersAll(), "no")
call SetUnitVertexColor(u,255,255,255,255)
set t = null
set u = null
endfunction

function WildStrengthLearn takes nothing returns nothing
local trigger tt = CreateTrigger()
local timer t = CreateTimer()
local unit u = GetLearningUnit()
local integer id = GetHandleId(t)
call TriggerRegisterUnitEvent(tt,u,EVENT_UNIT_DAMAGED)
call TriggerAddCondition(tt,Condition(function WildStrengthConDmg))
call SaveUnitHandle(udg_AssassinHash,id,1,u)
call TimerStart(t,1,true,function WildStrengthRefresh)
set t = null
set u = null
set tt = null
endfunction

//===========================================================================
function InitTrig_Wild_Strength takes nothing returns nothing
    set gg_trg_Wild_Strength = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Wild_Strength, EVENT_PLAYER_HERO_SKILL )
    call TriggerAddCondition( gg_trg_Wild_Strength, Condition( function WildStrengthCon))
    call TriggerAddAction( gg_trg_Wild_Strength, function WildStrengthLearn)
endfunction
Старый 01.12.2010, 17:28
JassMan
свободен
offline
Опыт: 4,193
Активность:
рекомендую использовать этот алгоритм
function WildStrengthCon takes nothing returns boolean
return GetLearnedSkill()=='A0EK'
endfunction

//Прочие функции

function WildStrengthLearn takes nothing returns nothing
local trigger trg
if(GetUnitAbilityLevel(GetTriggerUnit(),'A0EK')==1)then
    set trg=CreateTrigger()
    call TriggerRegisterUnitEvent(trg,GetTriggerUnit(),EVENT_UNIT_DAMAGED)
    call TriggerAddCondition(tt,Condition(function WildStrengthConDmg))
    call TriggerAddAction(trg,function имя функции) //Почему этого нету?
    set trg=null
endif
endfunction

function InitTrig_Wild_Strength takes nothing returns nothing
set gg_trg_Wild_Strength=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Wild_Strength,EVENT_PLAYER_HERO_SKILL)
call TriggerAddCondition(gg_trg_Wild_Strength,Condition( function WildStrengthCon))
call TriggerAddAction(gg_trg_Wild_Strength,function WildStrengthLearn)
endfunction
Ибо если 'A0EK' уже первого лвл, и еще изучить другую (постороннюю) способность то как бе триггер снова срабатывает.

Отредактировано JassMan, 01.12.2010 в 17:58.
Старый 01.12.2010, 17:50
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
я проверил тригер создаётся 1 раз ошибки именно тута нету
при создании выводил сообщение оно выдавалось 1 раз при изучении в самом начале 1 лвл потом нет
Старый 01.12.2010, 17:53
JassMan
свободен
offline
Опыт: 4,193
Активность:
А теперь прочти то что я внизу там написал
Старый 01.12.2010, 17:55
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
а всё точно
16GB добавил:
JassMan:
call TriggerAddAction(trg,function имя функции) Почему этого нету?
потому что все действия в условии делаю
Старый 01.12.2010, 18:02
JassMan
свободен
offline
Опыт: 4,193
Активность:
а мне кажется еще причина в том, что я уже говорил.
Триггер работает так:
При событии "юнит изучает способность" мы проверяем уровень способности 'A0EK', но не проверяем, какая же способность была изучена.
То есть если мы изучим к примеру "Благодать" и 'A0EK' будет первого левела, то триггер сработает.
А это значит что создастся еще локальный триггер с регистрацией получения урона, то бишь лечить будет дважды.
Старый 01.12.2010, 18:07
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
да понял я понял
Старый 01.12.2010, 18:09
JassMan
свободен
offline
Опыт: 4,193
Активность:
У самого такое было.
Ты наверно видел мою наработку TimeWalker'а ?
Старый 01.12.2010, 18:16
16GB
GhostOne User
offline
Опыт: 60,317
Активность:
да видел
Старый 01.12.2010, 18:21
Klop
Папа римский
offline
Опыт: 13,006
Активность:
GetLearnedSkill == 'A0EK'
или я не в теме,та и вообще почему условие только на изучение первого уровня способности на остльные ненадо?
Старый 01.12.2010, 22:13
JassMan
свободен
offline
Опыт: 4,193
Активность:
А ты логически поразмысли почему только первый уровень нужен.
Старый 01.12.2010, 22:31
Klop
Папа римский
offline
Опыт: 13,006
Активность:
JassMan, что б создавался таймер только один раз))
Старый 01.12.2010, 22:36
JassMan
свободен
offline
Опыт: 4,193
Активность:
В #6 посте , последняя строка.
Старый 01.12.2010, 22:46
Закрытая тема

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

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

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

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



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