Суть триггера - складывать заряды "усиливающих" предметов вместе. Но иногда предметы категории "постоянные" так же получают заряд. И, кроме того что не красиво выглядит, это мешает их работе, а именно когда предмет активный, он может перестать работать. Может кто увидит ошибку "логики" в триггере? Или же, возможно, у вас есть безупречная наработка без багов.
Вот сам триггер:
function Trig_ChargesConnect_Conditions takes nothing returns boolean
return GetItemCharges(GetManipulatedItem()) > 0 and GetItemType(GetManipulatedItem()) == ITEM_TYPE_CHARGED  
endfunction

function Trig_ChargesConnect_Actions takes nothing returns nothing
local item it = GetManipulatedItem()
local unit u = GetManipulatingUnit()
call UnitRemoveItemSwapped( it, u )
if UnitHasItemOfTypeBJ(u, GetItemTypeId(it)) == false then
    call DisableTrigger( GetTriggeringTrigger() )
    call UnitAddItemSwapped( GetLastRemovedItem(), u )
    call EnableTrigger( GetTriggeringTrigger() )
    call SetItemCharges( GetLastCreatedItem(), GetItemCharges(it) )
else
    call SetItemCharges( GetItemOfTypeFromUnitBJ(u, GetItemTypeId(it)), ( GetItemCharges(GetItemOfTypeFromUnitBJ(u, GetItemTypeId(it))) + GetItemCharges(it) ) )
    call RemoveItem( it )
endif
set it = null
set u = null
endfunction

//===========================================================================
function InitTrig_ChargesConnect takes nothing returns nothing
    set gg_trg_ChargesConnect = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_ChargesConnect, EVENT_PLAYER_UNIT_PICKUP_ITEM )
    call TriggerAddCondition( gg_trg_ChargesConnect, Condition( function Trig_ChargesConnect_Conditions ) )
    call TriggerAddAction( gg_trg_ChargesConnect, function Trig_ChargesConnect_Actions )
endfunction

а открыть FAQ и почитать слабо?
там есть система стака зарядов
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
27
Altf40160, лучше циклом прогонять.
раскрыть
Во-первых, гуишная проверка UnitHasItemOfTypeBJ - цикл, и он утечен (не обнуляется локальная переменная).
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Дебагом выводи
8
Steal nerves:
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Да, я сделал оговорку, имел ввиду "имеющие заряды".
Спасибо тебе, многое ты написал, старался. Я это знаю, я юзаю JassCraft, там с легкостью можно посмотреть все -BJ функции, и выйти на нативки. Я не парился над этим триггером потому что у меня в сумме 5 предметов типа "имеющие заряды". И лагать игра из-за этого триггера не станет. Я б переделал его, но у меня есть триггеры с более серьезными утечками, начну я с них, пожалуй. Но рас все так переживают через утечки, будет время, я переделаю. Но просто главный мой вопрос все обходят мимо. Даже если я сделаю триггер идеальным и без утечек, мой баг то останется ! Прошу больше внимания все-таки этому вопросу посвятить.
Пожалуй не надо чужими наработки пользоваться, наверное все сам сделаю.
23
Altf40160, тогда построй арифметику структур... все знают что есть такой волшебные воображении...
Построил что хотел на рисунки и так и пишем Jass чтобы снаряд складивали без ограничении то циклом как и выше описали лучшим вариантом подбирать сравнивать тип предмета и количеств после чего удалить полученый предмет если таково есть... и увеличить предмет текущего слота и остановить цикл... Если конечно не хотите делать каждый предмет лимит стака
сначало если события получает предмет заносим 2 локальные переменные тип предмета и количество
после чего циклом от 0 до 5 слота проверить тип предмета если предмет равен то удаляем полученый предмет и увеличим у слота предмета на сколько количеств текушего и полученного, и остановить цикл, а если цикл прошел всех типов то игнорируем и предмет так и получит как новый предмет
Если для вас это сложно то можете посмотреть jass пример стак предмет www.hiveworkshop.com/threads/inventory-v2-1a.252002 там конечно не для слабаков
28
а открыть FAQ и почитать слабо?
там есть система стака зарядов
Принятый ответ
8
nvc123:
а открыть FAQ и почитать слабо?
там есть система стака зарядов
Именно это мне и надо было. Спасибо
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.