Суть триггера - складывать заряды "усиливающих" предметов вместе. Но иногда предметы категории "постоянные" так же получают заряд. И, кроме того что не красиво выглядит, это мешает их работе, а именно когда предмет активный, он может перестать работать. Может кто увидит ошибку "логики" в триггере? Или же, возможно, у вас есть безупречная наработка без багов.
Вот сам триггер:
Вот сам триггер:
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
и зачем удаляете и снова даете, если есть стандартный функция установить количество зарядов
Суть моего вопроса - найти ошибку в триггере, а не найти утечки, или повторяющиеся функции!
Это наработка с ГУИ, которую я скачал, и немного переделал на JASS. Не хочется самому писать код, если есть готовая функция. Если есть готовая наработка - буду рад, а если нет - то помоги найти ошибку в логике.
Ред. MpW
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Спасибо тебе, многое ты написал, старался. Я это знаю, я юзаю JassCraft, там с легкостью можно посмотреть все -BJ функции, и выйти на нативки. Я не парился над этим триггером потому что у меня в сумме 5 предметов типа "имеющие заряды". И лагать игра из-за этого триггера не станет. Я б переделал его, но у меня есть триггеры с более серьезными утечками, начну я с них, пожалуй. Но рас все так переживают через утечки, будет время, я переделаю. Но просто главный мой вопрос все обходят мимо. Даже если я сделаю триггер идеальным и без утечек, мой баг то останется ! Прошу больше внимания все-таки этому вопросу посвятить.
Пожалуй не надо чужими наработки пользоваться, наверное все сам сделаю.
Построил что хотел на рисунки и так и пишем Jass чтобы снаряд складивали без ограничении то циклом как и выше описали лучшим вариантом подбирать сравнивать тип предмета и количеств после чего удалить полученый предмет если таково есть... и увеличить предмет текущего слота и остановить цикл... Если конечно не хотите делать каждый предмет лимит стака
сначало если события получает предмет заносим 2 локальные переменные тип предмета и количество
после чего циклом от 0 до 5 слота проверить тип предмета если предмет равен то удаляем полученый предмет и увеличим у слота предмета на сколько количеств текушего и полученного, и остановить цикл, а если цикл прошел всех типов то игнорируем и предмет так и получит как новый предмет
Если для вас это сложно то можете посмотреть jass пример стак предмет www.hiveworkshop.com/threads/inventory-v2-1a.252002 там конечно не для слабаков