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

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

Закрытая тема
 
Lawliet

offline
Опыт: 6,322
Активность:
Как удалить конретный предмет из которого используется способность
Доброе утро. Подскажите, как конкретный предмет находящийся в инвентаре, способность которого применяется на другой конкретный предмет находящийся в инвентаре удалить из инвентаря.
То есть предмет А применяется на предмет Б. Для получения нужного мне эффекта я отлавливаю событие применения способности предмета А на предмет Б, и изменяю свойства предмета Б. Предмет А удаляется. Но так как в событиях отлавливается способность предмета, а не используемый предмет я не могу удалить конкретно использованный предмет. Получается, что если удалять тип предмета, а предметов несколько то удаляется не тот который использован, а случайный такой же по порядку. Если сделать предмет в РО используемым один раз, то есть самоудаляющимся, то он будет использоваться на любой предмет, хоть на такой же и удаляться, такой вариант не подходит. Удаление должно происходить после использования способности предмета А на предмет Б.
ЗЫ: если сложно изложил проблему, могу скинуть наглядный пример.
scope enchantweapon initializer init

private function conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AENC'
endfunction

private function actions takes nothing returns nothing
local item weapon = GetSpellTargetItem()
local unit u = GetTriggerUnit()
    if weapon == gifu(u, 'IS00') then
        call RemoveItem( gifu(u, 'IENC') )      // удаляет любой предмет типа используемого но не конкретный
        if GetRandomInt(1, 10) > 3 then
            call SetItemCharges( gifu(u, 'IS00'), ( GetItemCharges(gifu(u, 'IS00')) + 1 ) )
            call SetUnitAbilityLevel( u, 'AIt6', GetItemCharges(gifu(u, 'IS00')) )
        else
            if GetItemCharges(gifu(u, 'IS00')) > 1 then
                call SetItemCharges( gifu(u, 'IS00'), ( GetItemCharges(gifu(u, 'IS00')) - 1 ) )
                call SetUnitAbilityLevel( u, 'AIt6', GetItemCharges(gifu(u, 'IS00')) )
            endif
        endif
    endif
endfunction

private function init takes nothing returns nothing
    local trigger enchantweapon = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( enchantweapon, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( enchantweapon, Condition( function conditions ) )
    call TriggerAddAction( enchantweapon, function actions )
    set enchantweapon = null
endfunction
endscope
Старый 04.05.2013, 05:58
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
сделайте второй триггер, который будет заносить в переменную предмет который был заюзан. А теперь мы тут можем узнать какой предмет последний использовался. Профит?
Старый 04.05.2013, 06:20
Lawliet

offline
Опыт: 6,322
Активность:
Нет не профит. Со вторым триггером и глобалкой получается задержка в 1 нажатие предмета на предмет. То есть удаляется после второго применения.
Старый 04.05.2013, 06:24
adic3x

offline
Опыт: 108,439
Активность:
Если совсем туго - можно делать дубликаты предметов, отлавливать их поднятие/перемещение/выкидывание. Т. е. что бы равкод предмета в слоте 1 был 'IS00'+0, в слоте 2 - 'IS00'+1 и т. д.
Старый 04.05.2013, 11:43
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
единственное неадекватное что мне пришло в голову - так это использовать мой метод, однако добавить задержку таймером на 0.001 сек после использования способности).
зато работает)
» тут
function Trig_ItemReg_Actions takes nothing returns nothing
    set udg_ITEM = GetManipulatedItem()
endfunction


//===========================================================================
function InitTrig_ItemReg takes nothing returns nothing
    set gg_trg_ItemReg = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ItemReg, EVENT_PLAYER_UNIT_USE_ITEM )
    call TriggerAddAction( gg_trg_ItemReg, function Trig_ItemReg_Actions )
endfunction


//globals
    item TargetItem
    unit UsedUnit

function Trig_ItemUse_jass_Conditions takes nothing returns boolean
    return (GetSpellAbilityId() == 'A000' and (GetItemTypeId(GetSpellTargetItem()) == 'I002' or GetItemTypeId(GetSpellTargetItem()) == 'I001'))
endfunction

function Trig_ItemUse_jass_Actions2 takes nothing returns nothing
    UnitRemoveItem( UsedUnit,udg_ITEM )
    if GetItemTypeId(TargetItem) == 'I002' then
        call UnitAddItemById( UsedUnit, 'I001' )
    elseif GetItemTypeId(TargetItem) == 'I001' then
        call UnitAddItemById( UsedUnit, 'I000' )
    endif
    UnitRemoveItem( UsedUnit, TargetItem )
DestroyTimer(GetExpiredTimer())
endfunction

void Trig_ItemUse_jass_Actions(){
    UsedUnit = GetTriggerUnit()
    TargetItem = GetSpellTargetItem()
    TimerStart(CreateTimer(), 0.001, false, function Trig_ItemUse_jass_Actions2 ) 
}

//===========================================================================
function InitTrig_ItemUse_jass takes nothing returns nothing
    set gg_trg_ItemUse_jass = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ItemUse_jass, EVENT_PLAYER_UNIT_SPELL_EFFECT )
    call TriggerAddCondition( gg_trg_ItemUse_jass, Condition( function Trig_ItemUse_jass_Conditions ) )
    call TriggerAddAction( gg_trg_ItemUse_jass, function Trig_ItemUse_jass_Actions )
endfunction
Старый 04.05.2013, 18:41
Lawliet

offline
Опыт: 6,322
Активность:
Получилось, нужно было просто в начале кода вызывать call TriggerSleepAction(0.001).
Спасибо за помощь.
Старый 05.05.2013, 19:16
Bornikkeny
Silenced by Bornikkeny
offline
Опыт: 24,410
Активность:
Hate, выходит твою систему победил вейт, сочувствую. Автор, удачи тебе :)
Старый 05.05.2013, 19:18
Hate
конь вакуумный
offline
Опыт: 43,033
Активность:
берегись путник, вейт это плохо, и минимальное значение его это 0.15 насколько я помню
а так же он идет если открыть меню через ф10 в сингле, и дает неточное время
Старый 05.05.2013, 21:18
Lawliet

offline
Опыт: 6,322
Активность:
А если таймер вот так сделать, тогда тру стори для 10 игроков?
scope enchantweapon initializer init

private function conditions takes nothing returns boolean
    return GetSpellAbilityId() == 'AENW'
endfunction

private function actions takes nothing returns nothing
local timer t = GetExpiredTimer()
local integer id = GetHandleId(t)
local unit u = LoadUnitHandle(udg_H,id,0)
local item weapon = LoadItemHandle(udg_H,id,1)
local integer i = LoadInteger(udg_H,id,2)
local integer index = 0
    loop
    //1ht or 2ht
    if GetItemTypeId(weapon) == udg_ite_type_1ht[index] or GetItemTypeId(weapon) == udg_ite_type_2ht[index] and GetItemCharges(weapon) < 16 then
        call RemoveItem( udg_ite[i] )
        if GetRandomInt(1, 10) > 3 then
            call SetItemCharges(weapon, (GetItemCharges(weapon) + 1) )
            call SetUnitAbilityLevel(u, 'AIEW', (GetItemCharges(weapon) + 1))
        else
            call SetItemCharges(weapon, (GetItemCharges(weapon) - 1) ) 
            call SetUnitAbilityLevel(u, 'AIEW', (GetItemCharges(weapon) + 1))
        endif
    endif
    set index = index + 1
    exitwhen index >= 10
    endloop
call FlushChildHashtable(udg_H,id)
call DestroyTimer(t)
set u = null
set weapon = null
set t = null
endfunction

function hash takes nothing returns nothing
local item weapon = GetSpellTargetItem()
local unit u = GetTriggerUnit()
local integer i = GetPlayerId(GetOwningPlayer(GetSpellAbilityUnit()))
local timer t = CreateTimer()
local integer id = GetHandleId(t)
call SaveUnitHandle(udg_H,id,0,u)
call SaveItemHandle(udg_H,id,1,weapon)
call SaveInteger(udg_H,id,2,i)
call TimerStart(t,0.01,false,function actions)
set u = null
set weapon = null
set t = null
endfunction

private function init takes nothing returns nothing
    local trigger enchantweapon = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( enchantweapon, EVENT_PLAYER_UNIT_SPELL_CAST )
    call TriggerAddCondition( enchantweapon, Condition( function conditions ) )
    call TriggerAddAction( enchantweapon, function hash )
    set enchantweapon = null
endfunction
endscope
Lawliet добавил:
Так то call TriggerSleepAction(0.15) по проще выглядел.
Lawliet добавил:
Есть ли вообще в данном случае смысл в таймере с hashtable? Если проще использовать call TriggerSleepAction(0.15)?
Старый 06.05.2013, 07:48
Nerevar
I'll be back!
offline
Опыт: 18,352
Активность:
Lawliet:
Есть ли вообще в данном случае смысл в таймере с hashtable? Если проще использовать call TriggerSleepAction(0.15)?
используйте вейт,это не тот случай когда нужно изголяться с таймерами
Старый 06.05.2013, 11:12
Закрытая тема

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

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

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

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



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