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

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

Закрытая тема
 
Темак
jass for everyone
offline
Опыт: 7,200
Активность:
не срабатывает хеш
Смысл триггера:
у здания 3 грейда, после каждого апгрейда ему добавляется 2 слота.
По окончании улучшения все предметы, что были у здания выпадали и, чтобы этого не происходило, за 0.01 секунду до этого предметы записываются в хеш и по окончании улучшения добавляются ему.
Но хеш почему-то не срабатывает. Приму любые замечания, в частности по оптимизации или возможности сделать это по другим способом.
((кат код
function Trig_penguin_remove_items_Conditions takes nothing returns boolean
    return (GetUnitTypeId(GetTriggerUnit()) == 'h002' or GetUnitTypeId(GetTriggerUnit()) == 'h000' )
endfunction

function Trig_penguin_remove_items_timer2 takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local integer h = GetHandleId(t)
    local unit u = LoadUnitHandle(udg_hash, h, 0)
    local item item0 = LoadItemHandle(udg_hash, h, 1)
    local item item1 = LoadItemHandle(udg_hash, h, 2)
    local item item2 = LoadItemHandle(udg_hash, h, 3)
    local item item3 = LoadItemHandle(udg_hash, h, 4)
    if GetUnitState(GetTriggerUnit(), UNIT_STATE_LIFE) > 0 then
        call IncUnitAbilityLevel (u, 'A001')
        call UnitAddItemToSlotById (u, GetItemTypeId(item0), 0)
        call UnitAddItemToSlotById (u, GetItemTypeId(item1), 1)
        call UnitAddItemToSlotById (u, GetItemTypeId(item2), 2)
        call UnitAddItemToSlotById (u, GetItemTypeId(item3), 3)
        call RemoveItem(item0)
        call RemoveItem(item1)
        call RemoveItem(item2)
        call RemoveItem(item3)
    endif
    call FlushChildHashtable(udg_hash,h)
    call DestroyTimer(t)
    set t = null
    set item0 = null
    set item1 = null
    set item2 = null
    set item3 = null
endfunction

function Trig_penguin_remove_items_timer takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    local unit u = GetTriggerUnit()
    call SaveUnitHandle(udg_hash, h, 0, u)
    call SaveItemHandle(udg_hash, h, 1, UnitItemInSlot(u, 0))
    call SaveItemHandle(udg_hash, h, 2, UnitItemInSlot(u, 1))
    call SaveItemHandle(udg_hash, h, 3, UnitItemInSlot(u, 2))
    call SaveItemHandle(udg_hash, h, 4, UnitItemInSlot(u, 3))
    call TimerStart(t, 0.01, false, function Trig_penguin_remove_items_timer2)
    call DestroyTimer(t)
    set t = null
    set u = null
endfunction

function Trig_penguin_remove_items_Actions takes nothing returns nothing
    local real r = (I2S(GetUnitTypeId(GetTriggerUnit()) - 'h000') + 1) * 5 - 0.01
    local timer t = CreateTimer()
    call DisplayTextToPlayer(Player(0), 0, 0, "r = " + R2S(r))
    call TimerStart(CreateTimer(), r, false, function Trig_penguin_remove_items_timer)
    call DestroyTimer(t)
    set t = null
endfunction

function InitTrig_penguin_remove_items takes nothing returns nothing
    set gg_trg_penguin_remove_items = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_penguin_remove_items, EVENT_PLAYER_UNIT_UPGRADE_START )
    call TriggerAddCondition( gg_trg_penguin_remove_items, Condition( function Trig_penguin_remove_items_Conditions ) )
    call TriggerAddAction( gg_trg_penguin_remove_items, function Trig_penguin_remove_items_Actions )
    set udg_hash = InitHashtable()
endfunction
))

Отредактировано Temak1, 03.07.2012 в 15:42.
Старый 03.07.2012, 14:59
Faion
Noblesse Oblige
offline
Опыт: 30,395
Активность:
хт инициализирована?
Старый 03.07.2012, 15:01
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Faion, в самом низу кода же
function Trig_penguin_remove_items_timer takes nothing returns nothing
    local timer t = CreateTimer()
    local integer h = GetHandleId(t)
    local unit u = GetTriggerUnit()
    call SaveUnitHandle(udg_hash, h, unit00, u)
    call SaveItemHandle(udg_hash, h, item00, UnitItemInSlot(u, 0))
    call SaveItemHandle(udg_hash, h, item01, UnitItemInSlot(u, 1))
    call SaveItemHandle(udg_hash, h, item02, UnitItemInSlot(u, 2))
    call SaveItemHandle(udg_hash, h, item03, UnitItemInSlot(u, 3))
    call TimerStart(t, 0.01, false, function Trig_penguin_remove_items_timer2)
    set t = null
    set item0 = null
    set item1 = null
    set item2 = null
    set item3 = null
endfunction
Откуда эти итем0\1\2\3 ? они даже не объявлены здесь - должна вылетать ошибка
....
причем сохраняются итем00\01\02\03 - это все глобалки?
Старый 03.07.2012, 15:04
Темак
jass for everyone
offline
Опыт: 7,200
Активность:
Nerevar, это предметы первых четырех слотов.
Исправил (обновил первый пост), но у меня осталась ошибка: триггер не может вычесть из рав-кода юнита 'h000'
кстати, этот код будет работать если я одновременно улучшу 10 таких зданий?
Старый 03.07.2012, 15:44
prog

offline
Опыт: 32,865
Активность:
как на счет этого?
Прикрепленные файлы
Тип файла: w3x upgradeanditems.w3x (16.9 Кбайт, 5 просмотров )
Старый 03.07.2012, 16:05
Темак
jass for everyone
offline
Опыт: 7,200
Активность:
prog, раньше при таком способе предметы всё равно выпадали. оО
Спасибо.
Старый 03.07.2012, 16:35
Закрытая тема

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

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

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

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



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