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

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

Ответ
 
velmir

offline
Опыт: 8,257
Активность:
баг, с пополнением итемов на рынке
Опшем суть в чем, была создана система добавления предметов на рынок, она работает как часики, ну суть системы добавлять в определеный магазин определеные предметы в определеном количестве., саму систему можна спростить до 1й стандартной строчки, которыя не вызывает быгов.
call AddItemToStock(C, udg_ItemPostavkiTip[y0], udg_IttemZariadInTreid[y0],  udg_IttemZariadInTreid[y0])
где
udg_ItemPostavkiTip[y0] - в масиве забиты типы итемов
udg_IttemZariadInTreid[y0] - в масиве забитj количество итемов что поступает в даный магазин,
напомню здесь в се работает стабильно, все послупает, и все видно....
ЗЫ. данный пример это не сама система, но она рабочья =)
Строчка выше дала в магазин, C итем А, в зарядом. 5, но стоит нам купить этот итем, хотябы 1н раз и он пропадает с рынка, нам же поступает в инвентарь аналогичный итем с зарядом 1.
Может решение я и нубское придумал но всеже есть что есть..
дальше создал тригер который ловит ету продажу, и онимает от переменой, заряда -1, тобиш выходит что с магазина мы постоянно покупаем по 1му заряду(екземпляру ) предмета, а в магазине их ище остается (ну в нашем примере 4)
Итак в чем же проблема?
Тестируя данную ерунду самител баг, которых просто хз как прававить, в слечае если при покупке числ зарядов покупаймого предмета менше числа зарядов 1итема в магазине, то удаляется не продаваймый а 1й итем в магазине, к томуже заряды на продаваймого ставятся как в 1го, таким образом портится рыночная модель.
Помогите плз исправить данный баг
Высылаю код трига которым я вертаю в магазин итемы и даю им лвл...
ЗЫ Баг Не в системе описаной выше в коде что ниже!
((код jass
function Trig_TreidZariadItem_Actions takes nothing returns nothing
integer i=0,L
loop цикл для сравниния продаваймый итемов,udg_ItIntG[0] максим кол всех итемов,
i++
exitwhen i>=udg_ItIntG[0] or udg_IttemZariadInTreid[i]==0 or udg_ItP1[i]==0 or udg_ItP[i]==null
if GetItemTypeId(GetSoldItem()) == udg_ItP1[i] and GetSellingUnit()==udg_ItP[i]{ проверка на то находится нужный итем в нужном магазине
udg_IttemZariadInTreid[i]-- уменшаем заряд
L=udg_IttemZariadInTreid[i] в принцепе можна и без этой строчки,..
if L>=1{
call AddItemToStock(GetSellingUnit(), udg_ItP1[i], L, L) добавляем предмет на вынок, если переменая с его зарядами больше 1
}elseif L<=0{
call RemoveItemFromStock(GetSellingUnit() ,udg_ItP1[i]) удаляем итем если менше, чистим все переменые
udg_IttemZariadInTreid[i]=0
udg_ItP1[i]=0
udg_ItP[i]=null
}
i=udg_ItIntG[0]
}
endloop
i=0
L=0
endfunction
function InitTrig_TreidZariadItem takes nothing returns nothing
set gg_trg_TreidZariadItem = CreateTrigger( )
local integer index
set index = 0
loop
call TriggerRegisterPlayerUnitEvent(gg_trg_TreidZariadItem, Player(index), EVENT_PLAYER_UNIT_SELL_ITEM, null)
set index = index + 1
exitwhen index == bj_MAX_PLAYER_SLOTS
endloop
call TriggerAddAction( gg_trg_TreidZariadItem, function Trig_TreidZariadItem_Actions )
endfunction
))
[+] 1 пункт от Кет: 1.2.1

Отредактировано velmir, 22.02.2015 в 13:14.
Старый 19.02.2015, 22:24
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
Нужно хранить массив всех продаваемых предметов в магазине с количеством каждого из них, и при покупке удалять все и заного наполнять из этого массива.
Старый 20.02.2015, 11:28
velmir

offline
Опыт: 8,257
Активность:
JaBeN_Симфер:
Нужно хранить массив всех продаваемых предметов в магазине с количеством каждого из них, и при покупке удалять все и заного наполнять из этого массива
наверно ты невнимательно прочитал, я так и сделал, даже код етого выставил, но именно в этом баг есть(
Старый 20.02.2015, 11:38
Киря

offline
Опыт: 769
Активность:
velmir:
JaBeN_Симфер:
Нужно хранить массив всех продаваемых предметов в магазине с количеством каждого из них, и при покупке удалять все и заного наполнять из этого массива
наверно ты невнимательно прочитал, я так и сделал, даже код етого выставил, но именно в этом баг есть(
Он абсолютно правильно сказал. Лови событием покупки предмета и храни все предметы и их заряды для конкретного магазина. После покупки определяй магазин, отнимай заряд, количество которых также хранится для каждого конкретного предмета в конкретном магазине, а затем очищай полностью магазин.и обновляй список предметов и их зарядов.
С редактором давно не работал, да и с такими функциями тоже, но непонятно почему она удаляет предмет из лавки.
Совет: учись оформлять код красиво, правильно и точно называть переменные. Читать невозможно. Не в обиду.
Старый 21.02.2015, 22:11
velmir

offline
Опыт: 8,257
Активность:
да.. или наверно я нетак что то написал в самом вопросе..
я рашил етот проблему, именно таким путем, как вы все мне придлагаете, но в решение возник баг и именно этот баг я и спрашиваю как править
Старый 22.02.2015, 00:12
Киря

offline
Опыт: 769
Активность:
Откомментируй или опиши построчно код выше, так как очень тяжело что-либо понять.
Старый 22.02.2015, 03:08
velmir

offline
Опыт: 8,257
Активность:
Киря:
Откомментируй или опиши построчно код выше, так как очень тяжело что-либо понять
как я уже говорил, я сразу понял что проблему с пропаданием итемов с ранков нада решать так как и я и все предлагали, даный код это моя реализация, того что мы все предлагали, но в нем проблема, при продаже любого предмета, происходит не правельное переписивание зарядов, при условие продажи и что число зарядов предмета что мы продаём менше числа зарядов 1го впидмета в магазине, с магазина удаляется не продаваймый предмет а 1й, болие того число зарядов продаваймого стает как число зарядов 1..
теперь о коментах кода я в 1й пост сча добавлю
Старый 22.02.2015, 13:06
Киря

offline
Опыт: 769
Активность:
Задача не слишком сложная. Не понимаю зачем лишние ветвления с переменной L?
вынеси все в 3 отдельные функции: обработка покупки, очистка магазина, и обновление его предметов.
Для конкретного магазина уменьшить заряд предмета, количество которых также хранишь в отдельном массиве. Если зарядов осталось 0 - присвой переменной предмета значение "нет предмета" или как там в варике.
Далее очисси магазин от всех предметов, не конкретного, а циклом от всех.
передобавь все предметы циклом пропуская те, у которых нет зарядов.
то, что у тебя не работает, указывает на две возможные проблемы: ошибки в коде (90%) или есть еще вариант выставить всем предметам в ро нулевые значения позиций х и у, чтоб предметы добавлялись по порядку. Но я не уверен
Старый 22.02.2015, 14:00
DioD

offline
Опыт: 45,134
Активность:
моя религия запрещает отладочные сообщения
сенсей сказал что отладка это грех, в 3.14 раз хуже рукоблудия, так что я лучше 3 раза чем добавлять отладку
а лучше 3 раза и запосчу тему на хгм, там добрые доноры которые за меня сделают всё.
Старый 22.02.2015, 15:16
JaBeN_Симфер

offline
Опыт: 20,050
Активность:
выставить всем предметам в ро нулевые значения позиций х и у, чтоб предметы добавлялись по порядку
Для динамического магазина не нужно, оно не используется. Предметы получают порядок при первом появлении в магазине.
Старый 22.02.2015, 15:17
velmir

offline
Опыт: 8,257
Активность:
Киря:
Не понимаю зачем лишние ветвления с переменной L?
я в коментах написал что ее не нада, систему не оптимизировал..
Киря:
вынеси все в 3 отдельные функции: обработка покупки, очистка магазина, и обновление его предметов.
да я понял твою идею, нада будет попробывать,
в моэм случае я сначала, икал предмет а тогда выяснял проблемы с ним, но можна и по твоему.
velmir добавил:
Киря:
ошибки в коде (90%)
это однозначно она, но используя отладку, с выведением номера масива итема все работает, как нада, но моменда пока заряды продаваймого не <=зарядам 1го.
Старый 22.02.2015, 16:01
Ответ

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

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

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

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



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