У меня в карте очень криво работает система, просто замучила и не знаю в чем причина.
Есть пустой магазин. В него можно заложить на продажу кучу предметов (до 12 слотов на каждый тип итема). Когда продаешь два предмета с одинаковым типом, то складываются в стэк, и их становится два. Но когда покупаешь, то в стэке становится меньше на 1. Когда становится в стэке 0, то удаляешь нафиг.
ребят у меня варкрафт что-то криво работает. Делаю на гуи или на jass все верно по логике, а потом запускаю и что-то не работает так как надо.
основные фишки и ошибки:
  1. когда покупаешь вещь, то в магазине запускается кулдаун (интервал пополнения). Если его в РО поставить на ноль, то работает нормально. Но я использовал хитрость, перед каждой продажей или покупки триггерной коммандой изменяю это. То есть каждый раз добавляю в магазин итем с изменными стэками. (текущий стэк == максимальному стэку), и работает нормально. Однако не все итемы так работают, короче не всегда так работает что-то.
  1. Когда занятых слотов становится 11, то удаляется абилки. И закладывать в лавку больше нельзя, короче нельзя продать. но если купить итем, то освободится слот. Но бывало, что обратно не добавлялась эта абилка. Все дело в коде. Не знаю по каким-причинам но работает не очень. - баг варкрафта. При добавлении итема в магазин, он может заменить другой итем. Короче продает один итем в слотах магазина, и еще кое-что должно быть 4 итема, когда продаешь, по идее заменяет итем. Но получается так, заменяет не только итем, но итемов становится меньше, становится 3. Короче говоря появляется 1 пустой слот. Чтобы решиить эту проблему нужно запомнить все итемы которые есть в магазине. И самому выдавать. Раньше так делал, но потом возникла кое-какая ошибка и не помог понять. Короче удалил так, а зря
Не смогу объяснить своими словами, потому что что-то не так. Не понимаю, у меня кучу дебагов, а хрень какая-то. Помогите пожалуйста. Три недели кажись не могу норм сделать
Если вначале потыкать, то ничего не заметишь. Но если интенсивно потыкать, то получаются ошибки. Это происходит из-за бага варкрафта, когда закладываешь итем 1, он подменяет итем 2. Итем 2 походу пропадает.

Принятый ответ

Тестил, тестил. Думал найду ошибку. Короче не знаю в чем дело, видимо и в правду баг. Решил по-другому. Ловить поставку, и ловить продажу. То есть ловить то, что пришло, и то, что ушло.
событием - "юнит закладывает в лавку" (EVENT_PLAYER_UNIT_PAWN_ITEM) ловим продажу итемов.
GetSellingUnit() =продающий торговец (типа всякие предметы закладывает в магазин и получает деньги)
GetBuyingUnit()=GetTriggerUnit() = покупающий торговец (это обычно магазин)

событием - "юнит закладывает из лавки (продает артефакт)" (EVENT_PLAYER_UNIT_SELL_ITEM) ловим покупку итемов
GetSellingUnit()=GetTriggerUnit()=продающий торговец (обычно это магазин)
GetBuyingUnit() = покупающий торговец (наш герой получает артефакты)
Решил, я по-своему. Короче, видимо, итем в магазине исчезает при добавлении. Попробовал запоминать все добавленные итемы, и при добавлении я сначала удалю всё в магазине, а потом заново добавлю. Пришлось, еще порядок (номер слотов) запоминать, а то строятся ключи хэша на строгом порядке. Если возьму и заберу итем посередине, придется заново выстраивать порядок.
Не знаю, пока тестил много времени, пока без косяков. Главное, что работает. Меня это радует. Но пока не буду спешить. Мне бы хотелось затестить норм.
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
27
7 лет назад
Отредактирован MpW
0
инициализация
закладывает в лавку
function Trig_PawnItem_Actions takes nothing returns nothing
    local unit market = gg_unit_nmrk_0009 //магазин
    local integer IdMarket = GetHandleId(market) //ид-хэндл магазина
    local item it = GetSoldItem() //итем
    local integer id = GetItemTypeId(it) //основной тип итема
    local integer ID //подменяющий тип итема, нужен для работ с рунами
    local integer count = LoadInteger(udg_Hash, IdMarket, udg_CountOfSlots) //кол-во занятых слотов
    local boolean busy_slot //занимает ли данный тип итема какую-нибудь ячейку итема
    local boolean sell_item = LoadBoolean(udg_Hash, IdMarket, udg_sell_item) //можно ли продавать в магазин
    local integer charges
    local integer count_charges
    local integer stock
    local integer max_stock
    local integer id1
    local integer MaxIT
    local boolean can_set = false
    local integer i
    local integer k = 0
    local boolean BBB
    local boolean XXX = true
    // Если является обычным предметов, связующий с руной. То можно заранее создать руну
    if ( id == 'wild' )then //амулет леса
        set ID = 'I007'
    elseif ( id == 'I001' )then //боевые когти
        set ID = 'I005'
    elseif ( id == 'I002' )then //туфли ловкости
        set ID = 'I006'
    elseif ( id == 'I000' )then //рецепт когти воина
        set ID = 'I004'
    else
        set ID = id
    endif
    set charges = GetItemCharges(it)
    set id1 = ( ID + udg_CountOfSlots ) //подзагружает или сохраняет логическую busy_slot
    set busy_slot = LoadBoolean(udg_Hash, IdMarket, id1) // занимает ли данный тип предмета магазин
    call BJDebugMsg( "|cFFFF5800закладываемый предмет в рынок |cFFFFDC00" + GetItemName(it) + "|r" ) 
    
    if (not busy_slot) then
        call BJDebugMsg( "данный предмет НЕ занимает место в магазине" )
    else
        call BJDebugMsg( "данный предмет занимает место в магазине" )
    endif
    
    
    
    if (count >= 0 and count <= 11) then // ЕСЛИ у магазина есть свободные ячейки, то ...
         
        if ( charges == 0 ) then // обычные итемы не имеют зарядов (равен нулю).
            set count_charges = 1 //Поэтому приравниваем к единице
        else
            set count_charges = charges // остальные итемы, имеющие заряды. у них приравнивают к зарядам
        endif
        call BJDebugMsg( "|cFFFFA500" + I2S(count_charges) + " - кол-во зарядов в предмете" + "|r" )
        
        
        // проверяем, данный тип у предмета есть в магазине или нет.
        if ( busy_slot ) then // Если есть, то выгружаем из хэша и складываем все
            // загружаем стэки из хэша (стэк - кол-во штук итемов в магазине)
            set stock = LoadInteger(udg_Hash, IdMarket, ID)
            call BJDebugMsg( "|cFF12FC40" + I2S(stock) + " - кол-во стэков из хэша" + "|r" )
            // складываем заряды и стэки в переменную max_stock
            set max_stock = ( count_charges + stock )
            call BJDebugMsg( "|cFFFFA500" + I2S(count_charges) + " кол-во зарядов Sold Item|r " + "+ " + "|cFF12FC40" + I2S(stock) + " кол-во стэков у предмета в магазине (из хэша)|r " + "= " + I2S(max_stock) )
            
            
            // сохраняем стэк в хэш
            call SaveInteger( udg_Hash, IdMarket, ID, max_stock)
            set MaxIT = max_stock
            set can_set = true
            
        elseif ( (not busy_slot) and (count < 11) ) then //Иначе, если нет в магазине, то создаем новый (ничего не выгружая).
        
                // кол-во занятых ячеек в магазине стало больше на одну
                set count = ( count + 1 )
                // сохраняем кол-во занятых ячеек
                call SaveInteger( udg_Hash, IdMarket, udg_CountOfSlots, count )

                set i = 1
                call BJDebugMsg("начало цЫкла ")
                loop
                    exitwhen i > 12
                    set udg_ITEM[i] = LoadInteger(udg_Hash, IdMarket, udg_XXX + i )
                    set BBB = LoadBoolean(udg_Hash, IdMarket, udg_CountOfSlots + udg_ITEM[i])
                    if udg_ITEM[i] != id and udg_ITEM[i]>= 0 and (not BBB) and XXX then
                        set XXX = false
                        call SaveInteger( udg_Hash, IdMarket, udg_XXX + i, ID )
                        call BJDebugMsg("сохранка ")
                        
                    endif
                    set i = i + 1
                endloop
                
                
                call BJDebugMsg("|cFF00FFFF" + "Кол-во занятых слотов стало больше, теперь их всего " + I2S(count) + "|r")
                // сохранить кол-во стэков предмета в магазине
                call SaveInteger( udg_Hash, IdMarket, ID, count_charges )
                set MaxIT = count_charges
                set can_set = true
                call BJDebugMsg( "|cFFFFA500" + I2S(count_charges) + " кол-во зарядов Sold Item|r ")
                // сохраняем то, что юнит обладает данным типом
                call SaveBoolean( udg_Hash, IdMarket, id1, true )
                
                
                
                set i = 1
                set k = 0
                loop
                    exitwhen i > 12
                    set udg_ITEM[i] = LoadInteger(udg_Hash, IdMarket, udg_XXX + i )
                    set BBB = LoadBoolean(udg_Hash, IdMarket, udg_CountOfSlots + udg_ITEM[i])
                    if BBB then//
                        set k = k + 1
                    endif
                    set i = i + 1
                endloop
                call BJDebugMsg("КОЛ_ВО ПРЕДМЕТОВ " + I2S(k))
                //сохраняем какой-тип сохраняем
                
                
                
                
                // идет еще следующая проверка. Проверяет, стало ли занятых ячеек равно 11. Если да. то нужно ограничить
                if ( count == 11 ) then
                    // если все ячейки заполнены. то удаляем способность продажа предметов, и никто больше не сможет продавать
                    call BJDebugMsg( "способность удалена, теперь нельзя продавать предметы" )
                    call UnitRemoveAbility( market, 'Apit')
                    // запоминаем, что способность удалена
                    call SaveBoolean( udg_Hash, IdMarket, udg_sell_item, true )
                endif
                
        
                
        endif
        

        
        if (can_set) then
            // Продажа=Появление
            call BJDebugMsg( "может продавать" )
            call AddItemToStock( market, ID, MaxIT, MaxIT )
        endif
    
    
    
    elseif (count == 11 and (not busy_slot)) then
        //call UnitRemoveAbility( market, 'Apit')
        //call UnitAddAbility( market, 'Apit')
    endif
    set market = null
    set it = null
endfunction

//===========================================================================
function InitTrig_PawnItem takes nothing returns nothing
    set gg_trg_PawnItem = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_PawnItem, EVENT_PLAYER_UNIT_PAWN_ITEM )
    call TriggerAddAction( gg_trg_PawnItem, function Trig_PawnItem_Actions )
endfunction
при инициализации устанавливаем кол-во зарядов
function Trig_data_Actions takes nothing returns nothing
    local unit market = gg_unit_nmrk_0009 //магазин
    call TriggerSleepAction( 2 )
    call SaveInteger(udg_Hash, udg_kkk, 'I007', 1) //амулет леса (руна)
    call SaveInteger(udg_Hash, udg_kkk, 'I001', 1) //Боевые когти (руна)
    call SaveInteger(udg_Hash, udg_kkk, 'I002', 1) //Туфли логкости (руна)
    call SaveInteger(udg_Hash, udg_kkk, 'I003', 1) //когти воина (руна)
    call SaveInteger(udg_Hash, udg_kkk, 'I000', 1) //рецепт когти воина (руна)
    call SaveInteger(udg_Hash, udg_kkk, 'pghe', 1) //целебное зелье
    call SaveInteger(udg_Hash, udg_kkk, 'rde3', 1) //кольцо защиты (+4)
    call SaveInteger(udg_Hash, udg_kkk, 'afac', 1) //флейта меткости
    call SaveInteger(udg_Hash, udg_kkk, 'kpin', 1) //флейта прозрения
    call SaveInteger(udg_Hash, udg_kkk, 'odef', 1) //сфера тьмы
    call SaveInteger(udg_Hash, udg_kkk, 'evtl', 1) //талисман защиты
    call SaveInteger(udg_Hash, udg_kkk, 'bspd', 1) //сапоги - сккороходы
    call SaveInteger(udg_Hash, udg_kkk, 'bgst', 1) //пос богатыря
    call SaveInteger(udg_Hash, udg_kkk, 'gcel', 1) //перчатки скорости
    call SaveInteger(udg_Hash, udg_kkk, 'lhst', 1) //рог ветров
    call SaveInteger(udg_Hash, udg_kkk, 'rst1', 1) //руковица огра
    call SaveInteger(udg_Hash, udg_kkk, 'brac', 1) //рунные браслеты
    call SaveInteger(udg_Hash, udg_kkk, 'prvt', 1) //талисман здоровья
    call SaveInteger(udg_Hash, udg_kkk, 'clfm', 1) //огненный плащ
    call SaveInteger(udg_Hash, udg_kkk, 'ciri', 1) //одеяние мага
    
    
    
    
    set market = null
endfunction

//===========================================================================
function InitTrig_data takes nothing returns nothing
    set gg_trg_data = CreateTrigger(  )
    call TriggerAddAction( gg_trg_data, function Trig_data_Actions )
endfunction
продает из лавки
function Trig_SellItem_Actions takes nothing returns nothing
    local unit market = gg_unit_nmrk_0009
    local integer Id = GetHandleId(market) // номер хэндла магазина
    local item it = GetSoldItem() //итем
    local integer id = GetItemTypeId(it) //тип итема
    local integer count = LoadInteger(udg_Hash, Id, udg_CountOfSlots) //кол-во занятых слотов
    local integer id1 = (id + udg_CountOfSlots)
    local boolean busy_slot = LoadBoolean(udg_Hash, Id, id1) // занимает ли данный тип предмета магазин
    local integer charges_item = LoadInteger(udg_Hash, udg_kkk, id)
    local integer stock = LoadInteger(udg_Hash, Id, id)
    local integer min_stock
    local boolean sell_item = LoadBoolean(udg_Hash, Id, udg_sell_item) //можно ли продавать в магазин
    local integer min_count
    local integer i = 1
    local integer o
    local integer s
    
    local integer ID
    local integer jd
    local boolean bb =false
    call BJDebugMsg( "|cFFFF5800Купленный предмет в магазине |cFFFFDC00" + GetItemName(it) + "|r" ) 
    call BJDebugMsg( "|cFF12FC40" + I2S(stock) + " - кол-во стэков из хэша" )
    call BJDebugMsg( "|cFFFFA500" + I2S(charges_item) + " - кол-во отнимаемых зарядов у итема (загружается из базы данных типа итема)" + "|r" )
    // вычитаем, тут еще проверку надо что если зарядов больше стэков
    set min_stock = stock - charges_item
    call BJDebugMsg( "|cFF12FC40" + I2S(stock) + " кол-во стэков у предмета в магазине|r" + " - " + "|cFFFFA500" + I2S(charges_item) + " кол-во отнимаемых зарядов Sold Item (указывается в базе данных)|r " +  " = " + I2S(min_stock))


    if ( busy_slot and count > 0 and count <= 11 ) then
    // сохраняем кол-во стэков
    call SaveInteger( udg_Hash, Id, id, min_stock )
    
        if (min_stock==0) then //если кол-во стэков стало равно ноль, то удаляем итем
            //ВНИЗУ ИДЕТ ПОЛНОЕ вычищение ИТЕМА из магазина, перерасчет кол-во занимаемых слотов
            set min_count = count - 1
            set bb = true
            call BJDebugMsg( "стэков стало ноль" )
            
            
            
            
            
            
            
            
            call BJDebugMsg( "|cFF00FFFF" + "поубавилось, было " + I2S(count) + ", но стало" + I2S(min_count)+"кол-во занятых ячеек в магазине|r" )
            // сохраняем кол-во занимаемых ячеек
            call SaveInteger( udg_Hash, Id, udg_CountOfSlots, min_count )
            

            // удаляем итем из магазина
            call RemoveItemFromStock( market, id )
            // запоминаем в хэш что данного типа предмета больше нет
            call SaveBoolean( udg_Hash, Id, id1, false )
            
            
            
            
            
            
            
            
            
            // проверяем ячейки магазина
            if ( count == 11 and min_count == 10 ) then // если ячейка освободилась, то добавляем способность
            
                call BJDebugMsg( "Свободных слотов в магазине было 11, стало 10. Ячейка освободилась" )
                if ( sell_item ) then
                    call UnitAddAbility( market,'Apit' )
                    //call TriggerSleepAction( 0.00 )
                    call BJDebugMsg( "НЕЛЬЗЯ БЫЛО ПРОДАВАТЬ - теперь МОЖНО" )
                    // запоминаем, что способность больше не удалена
                    call SaveBoolean( udg_Hash, Id, udg_sell_item, false )
                    
                endif
            endif
        elseif (min_stock > 0) then

            // сохраняем кол-во занимаемых ячеек
            call BJDebugMsg( "итог " + I2S(min_stock) )

            call AddItemToStock( market, id, min_stock, min_stock )
        endif
    endif
    
    loop
        exitwhen i>12
        set o = udg_XXX + i //подключ хэш-таблицы
        set udg_ITEM[i] = LoadInteger( udg_Hash, Id, o ) //загружаем тип итема в глобалку
        set jd = udg_ITEM[i]
        
        if (udg_ITEM[i] == id and bb) or (udg_ITEM[i] == 0) then //проверяем тип итема (загружаемый тип итема не равно пустому слоту == 0) или тип итема не равно купленному типу
            call SaveInteger( udg_Hash, Id, o, 0 ) //сохраняем тип итема в данной ячейке (ячейка нумеруется номером)
            set udg_ITEM[i] = 0
        elseif (udg_ITEM[i] > 0) then

            set s = LoadInteger( udg_Hash, Id, udg_ITEM[i] ) //кол-во стэков
            call AddItemToStock( market, udg_ITEM[i], s, s )
        endif
        
        
        
        set i = i + 1
    endloop
    
    
    set market = null
    set it = null
endfunction

//===========================================================================
function InitTrig_SellItem takes nothing returns nothing
    set gg_trg_SellItem = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( gg_trg_SellItem, EVENT_PLAYER_UNIT_SELL_ITEM )
    call TriggerAddAction( gg_trg_SellItem, function Trig_SellItem_Actions )
endfunction
Загруженные файлы
0
26
7 лет назад
Отредактирован Hate
0
форматирование... плес
0
27
7 лет назад
0
отформатировал
0
27
7 лет назад
0
кто-нибудь в чем ошибка?
0
16
7 лет назад
0
вообще не понял, о чем речь во второй проблеме. нормализуй "абилки", "итемы" и т.п., а то кажется, что речь об одном, потом - о другом.
не встречался с багами при использовании динамических продаж юнитов. если слотов в магазе нет, а ты пытаешься добавить еще кого-то в продажу, то хз что там произойдет
0
27
7 лет назад
Отредактирован MpW
0
всмысле нормализуй "абилки", "итемы"?
ну в этом то и хитрость, когда в лавке 5 стэков, покупаешь и становится 4 стэка и 1 еще в кулдауне. Чтобы этого кулдауна не было, я ему добавлял повторно этот же тип (текущий стэк == максимальный стэк == 4). Никогда проблем не было, но иногда что-то итемы пропадают.
Ну и на том и проверки у меня. Если кол-во слотов больше 11, то значит больше не давать.

короче не знаю в чем проблема. была до этого предыдущая версия. Это будет замечено в этой старой версии Item v8 (ссылка), я подобрал 6 итемов с земли и заложил в лавку. потом подобрал еще 6 итемов, 5 заложил также в лавку. один уже не мог (так и должно, ибо мест нет).
потом купил в лавке (дебаг показывает что в лавке стало снова 10, теперь могу снова заложить итем в лавку), я заложил (дебаг говорит что там 11, но на самом деле там стало 9, просто проданный/заложенный занял место другого, а тот исчез видимо). исправил это дело с помощью интервала (в РО всем итемам выставил интервал пополнения (кулдауна) на ноль и все заработало, и немного в коде подправил (хотя ничего критичного, скорее косметический характер), но больше не знаю что. в новой версии бывают баги, но редко
Загруженные файлы
0
30
7 лет назад
0
дебаг говорит что там 11, но на самом деле там стало 9
Возможно, есть какая-то проблема в том, как считает дебаг, перепроверь.
0
27
7 лет назад
0
Clamp, нет, не в этом.
0
24
6 лет назад
0
Steal nerves, Сделай с нуля или возьми готовую на хайве.
0
27
6 лет назад
Отредактирован MpW
0
Решил добить эту систему, но что-то не понимаю, почему так происходит (логически все верно). Мне кажется дело в варе, а не в коде.
пример
Вот, допустим, у вас есть пустой магазин, и кучу валяющих айтемов.
Вы забиваете полностью магазин предметами. У вас ограничение максимум 11 слотов, больше не может занять. Дебаг пишет, что максимум 11. Там своего рода счетчик. Короче удаляется у магазина абилка 'Apit' (Лавка: Продать предмет), вы не сможете ничего продавать в этот магазин, так как удалена абилка.
Далее покупаем "талисман здоровья", счетчик становится 10. Абилка 'Apit' (Лавка: Продать предмет) добавляется обратно
Далее покупаем "пояс богатыря", счетчик становится 9.
Следом - прикупим "перчатки скорости". счетчик становится 8
покупаем "флейту меткости". счетчик становится 7.
покупаем "одеяние мага". счетчик становится 6.
не хватило места, поэтому будем продавать. часто багуется тогда, когда итемы закладываешь в магазин. Короче может быть так что пропадает из магазина какой-то итем. В этом и баг. Например, продажа произошла, а в магазине новый итем заменил слот со старым, а старый пропал. Или просто пропадает. Увидите ниже. Не знаю, в чем дело. Очень бесит.
Продаю "сапоги скорости", счетчик становится +7
продаю "талисман здоровья", счетчик становится +8. А вот на самом деле в магазине предметов всего 7. Пропало кольцо защиты из магазина.
продаю "пояс богатыря", счетчик становится +9. !!А на самом деле в магазине предметов по прежнему становится 7. Пропал "Огненный плащ".
продаю "перчатки скорости", счетчик становится +10. Конечно изменилось немного +8 стало
продаю "флейту меткости", счетчик показывает +11 (все, я больше не могу продавать/закладывать в этот магазин, так как абилку 'Apit' (Лавка: Продать предмет) удалил). Кол-во итемов в магазине +9
Хотел бы по-другому:
если было бы известно какому магазину ты продаешь, а так сложно узнать. регулировать поставки итемов в магазин и их продажу.
0
16
6 лет назад
0
ну, очевидно, хардкодный баг, я не шарю
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.