Суть триггера - складывать заряды "усиливающих" предметов вместе. Но иногда предметы категории "постоянные" так же получают заряд. И, кроме того что не красиво выглядит, это мешает их работе, а именно когда предмет активный, он может перестать работать. Может кто увидит ошибку "логики" в триггере? Или же, возможно, у вас есть безупречная наработка без багов.
Вот сам триггер:
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 и почитать слабо?
там есть система стака зарядов
0
23
7 лет назад
0
сначало научись локально создавать а то везде одни функции пвторяет да и смысл нет чтобы длину не превышало чтобы удобно читать
и зачем удаляете и снова даете, если есть стандартный функция установить количество зарядов
0
8
7 лет назад
0
pro100master:
сначало научись локально создавать а то везде одни функции пвторяет да и смысл нет чтобы длину не превышало чтобы удобно читать
и зачем удаляете и снова даете, если есть стандартный функция установить количество зарядов
Не знаю что ты имел ввиду под словами "сначала научись локально создавать". Не важно.
Суть моего вопроса - найти ошибку в триггере, а не найти утечки, или повторяющиеся функции!
Это наработка с ГУИ, которую я скачал, и немного переделал на JASS. Не хочется самому писать код, если есть готовая функция. Если есть готовая наработка - буду рад, а если нет - то помоги найти ошибку в логике.
2
23
7 лет назад
2
Altf40160, Тут советую прочитать и освоиш основа xgm.guru/p/wc3/gui-examples-creating-items
0
26
7 лет назад
0
2
27
7 лет назад
Отредактирован MpW
2
Altf40160, лучше циклом прогонять.
раскрыть
Во-первых, гуишная проверка UnitHasItemOfTypeBJ - цикл, и он утечен (не обнуляется локальная переменная).
во-вторых, эта проверка мб ничего не дать (например, у героя в инвентаре лежит GetManipulatedItem(), а проверка скажет, что такой итем (мб он вот проверил, что есть GetManipulatedItem() ). А как узнать, что есть другой такой же?) нужно сверять циклом, сделай свой цикл. Когда циклом будешь прогонять сравнивай не одинаковы ли типы, и что итем не равен GetManipulatedItem(). Можно переменную целочисленную в качестве счетчика юзать. В условии сравниваешь, что счетчик больше 0
Надо раскрыть и посмотреть что в GetItemOfTypeFromUnitBJ. Там тоже цикл кажись. Мб первый попавшийся выберет итем. А нам нужно, чтобы не выбрали GetManipulatedItem()
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Дебагом выводи
0
8
7 лет назад
0
Steal nerves:
Ну и условие например ITEM_TYPE_CHARGED - имеющие заряды, а ты говоришь про усиливающие.
Да, я сделал оговорку, имел ввиду "имеющие заряды".
Спасибо тебе, многое ты написал, старался. Я это знаю, я юзаю JassCraft, там с легкостью можно посмотреть все -BJ функции, и выйти на нативки. Я не парился над этим триггером потому что у меня в сумме 5 предметов типа "имеющие заряды". И лагать игра из-за этого триггера не станет. Я б переделал его, но у меня есть триггеры с более серьезными утечками, начну я с них, пожалуй. Но рас все так переживают через утечки, будет время, я переделаю. Но просто главный мой вопрос все обходят мимо. Даже если я сделаю триггер идеальным и без утечек, мой баг то останется ! Прошу больше внимания все-таки этому вопросу посвятить.
Пожалуй не надо чужими наработки пользоваться, наверное все сам сделаю.
0
23
7 лет назад
0
Altf40160, тогда построй арифметику структур... все знают что есть такой волшебные воображении...
Построил что хотел на рисунки и так и пишем Jass чтобы снаряд складивали без ограничении то циклом как и выше описали лучшим вариантом подбирать сравнивать тип предмета и количеств после чего удалить полученый предмет если таково есть... и увеличить предмет текущего слота и остановить цикл... Если конечно не хотите делать каждый предмет лимит стака
сначало если события получает предмет заносим 2 локальные переменные тип предмета и количество
после чего циклом от 0 до 5 слота проверить тип предмета если предмет равен то удаляем полученый предмет и увеличим у слота предмета на сколько количеств текушего и полученного, и остановить цикл, а если цикл прошел всех типов то игнорируем и предмет так и получит как новый предмет
Если для вас это сложно то можете посмотреть jass пример стак предмет www.hiveworkshop.com/threads/inventory-v2-1a.252002 там конечно не для слабаков
2
28
7 лет назад
2
а открыть FAQ и почитать слабо?
там есть система стака зарядов
Принятый ответ
0
23
7 лет назад
0
nvc123, ведь для них поиск это новинка =)
0
8
7 лет назад
0
nvc123:
а открыть FAQ и почитать слабо?
там есть система стака зарядов
Именно это мне и надо было. Спасибо
Чтобы оставить комментарий, пожалуйста, войдите на сайт.