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

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

Закрытая тема
 
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
нерабочий код
Есть код, сделанный из триггера для впихивания локалки.
» code
function Trig_Bash_Conditions takes nothing returns boolean
    if ( not ( GetUnitTypeId(GetAttacker()) == 'hhes' ) ) then
        return false
    endif
    return true
endfunction

function Trig_Bash_Func003C takes nothing returns boolean
    local real bashchance = GetRandomReal(1.00, 100.00)
    if ( not ( bashchance <= ( udg_stat1[6] * 0.25 ) ) ) then
        return false
    endif
    return true
endfunction

function Trig_Bash_Actions takes nothing returns nothing
    if ( Trig_Bash_Func003C() ) then
        call CreateNUnitsAtLoc( 1, 'u000', GetOwningPlayer(GetAttacker()), GetUnitLoc(GetAttacker()), GetUnitFacing(GetAttacker()) )
        call IssueTargetOrderBJ( GetLastCreatedUnit(), "thunderbolt", GetAttackedUnitBJ() )
        call UnitApplyTimedLifeBJ( 0.80, 'BTLF', GetLastCreatedUnit() )
        call RemoveUnit( GetLastCreatedUnit() )
        call TriggerSleepAction( ( udg_stat1[2] * 0.10 ) )
        call UnitRemoveBuffBJ( 'BPSE', GetAttackedUnitBJ() )
    else
    endif
endfunction

//===========================================================================
function InitTrig_Bash takes nothing returns nothing
    set gg_trg_Bash = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_Bash, EVENT_PLAYER_UNIT_ATTACKED )
    call TriggerAddCondition( gg_trg_Bash, Condition( function Trig_Bash_Conditions ) )
    call TriggerAddAction( gg_trg_Bash, function Trig_Bash_Actions )
endfunction
суть триггера в том, чтобы при ударе определённым юнитом с динамичным шансом (переменная "udg_stat1[6]") создавался дамми и кастовал на цель атаки штормболт (эдакий крит). Проблема в том, что ничего не работает, то есть никакого эффекта при 100% шансе не наблюдается... В чём проблема? И, если не слишком тяжело, сделайте сюда,пожалуйста ,отслеживание не факта отдачи приказа, а факта нанесения урона. заранее спасибо!
//тапками за bj и прочее не кидаться, ибо в джассе я нуб полный))
// <- и да, эту идею спёр у энейна)
Старый 21.02.2010, 17:13
DioD

offline
Опыт: 45,134
Активность:
где отладочные сообщения?
Старый 21.02.2010, 17:22
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
DioD, -__-
Clamp:
тапками за bj и прочее не кидаться, ибо в джассе я нуб полный))
Старый 21.02.2010, 17:26
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
Clamp, отладочные сообщения и бж не одно и то же... Отладочные сообщения, это когда ты выводишь информацию о том, что у тебя происходит в триггере, и сам пытаешься разобраться в проблеме.
Старый 21.02.2010, 17:33
bee
vjass.optimizer
offline
Опыт: 16,615
Активность:
в данной ситуации мы имеем право сомневаться насчет этого значения "udg_stat1[6] * 0.25"
выведи на следующей строке:
Код:
call BJDebugMsg("lol == "+R2S(udg_stat1[6] * 0.25))

могу обаться в названии функции
Старый 21.02.2010, 17:36
FellGuard
Losyash
offline
Опыт: 39,547
Активность:
Цитата:
суть триггера в том, чтобы при ударе определённым юнитом с динамичным шансом (переменная "udg_stat1[6]") создавался дамми и кастовал на цель атаки штормболт (эдакий крит)
А чем не угодил "сильный удар" в невидимом спеллбуке с шансом 100%, добавляемый без всяких дамми на некоторое время на тех же условиях атакуюшему юниту? Не надо искать сложностей где можно упростить задачу.

FellGuard добавил:
Факт нанесения урона - на юнита которого атакуют по событию "Юнит атакован" вешается триггер с событие "конкретный данный юнит получил урон". После срабатывания или по истечении некоторого времени триггер уничтожается. По подробностям динамически создаваемых триггеров юзать это по разделу Jass.
Старый 21.02.2010, 18:40
Mr_ILYAS
Kicked by XimikS
offline
Опыт: 492
Активность:
function Trig_Bash_Conditions takes nothing returns boolean
local unit u=GetAttacker()
return GetUnitTypeId(u)=='hhes'
set u=null
endfunction

function Damage_Source_Conditions takes nothing returns boolean
local trigger trg=GetTriggeringTrigger()
local unit u=LoadUnitHandle(udg_Hash,GetHandleId(trg),1)
local unit c=GetTriggerUnit()
local unit attacker=GetEventDamageSource()
return attacker==u
call FlushChildHashtable(udg_Hash,GetHandleId(trg))
set u=null
set c=null
set attacker=null
set trg=null
endfunction

function Bash takes nothing returns nothing
local unit u=GetEventDamageSourse()
local unit c=GetTriggerUnit()
local unit d
local location p=Location(0,0)
if(GetRandomReal(0.0,100.0)<=udg_stat1[6]*0.25)then
    set d=CreateUnit(GetOwningPlayer(u),'u000',p,GetUnitFacing(u))
    call SetUnitX(d,GetUnitX(u))
    call SetUnitY(d,GetUnitY(u))
    call IssueTargetOrder(d,"thunderbolt",c)
    call UnitApplyTimedLife(d,'BTLF',2.)
endif
call RemoveLocation(p)
set p=null
set u=null
set c=null
set d=null
endfunction

function Trig_Bash_Actions takes nothing returns nothing
local trigger trg=CreateTrigger()
local unit u=GetAttacker()
local unit c=GetTriggerUnit()
call SaveUnitHandle(udg_Hash,GetHandleId(trg),1,u)
call TriggerRegisterUnitEvent(trg,c,EVENT_UNIT_DAMAGED)
call TriggerAddCondition(trg,Condition(function Damage_Source_Conditions))
call TriggerAddAction(trg,function Bash)
set u=null
set c=null
set trg=null
endfunction

function InitTrig_Bash takes nothing returns nothing
set gg_trg_Bash=CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(gg_trg_Bash,EVENT_PLAYER_UNIT_ATTACKED)
call TriggerAddCondition(gg_trg_Bash,Condition(function Attack_Sourse_Conditions))
call TriggerAddAction(gg_trg_Bash,function Trig_Bash_Actions)
endfunction
Сначала идёт проверка что атакер равен твоему юниту, и вторая проверка идёт что атакованный действительно получил урон, и только тогда мы совершаем действия
Для кое-каких проверок мне пришлось создать хеш-таблицу (глобальная переменная Hash)
чтобы сохранить в ней кое-что для передачи в другую функцию и потом там сравнить.
А проблема у тебя заключалась в том, что юнит сразу удалялся после того как его создавали, тоесть он даже не успевал thunderbolt кинуть.
Кстати, если ты поставил таймер жизни юниту call UnitApplyTimedLife(d,'BTLF',2.), то его не нужно удалять, после смерти (я поставил 2 сек) и разложения трупа он удалится сам (это время зависит от параметров редактора и игровых констант)

Отредактировано Mr_ILYAS, 21.02.2010 в 21:30.
Старый 21.02.2010, 19:33
Clamp
Lost in space
offline
Опыт: 71,158
Активность:
Mr_ILYAS, какой ужас... Мне страшно) Но спасибо большое
Старый 21.02.2010, 21:21
Закрытая тема

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

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

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

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



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