shuraken007 345 Report post Posted January 7, 2015 (edited) Представляю вашему вниманию небольшой аддон, который позволяет, используя команду .additem на тестовом сервере узнать набор и ранжировку рандом бонусов интересующей вас вещи. Я говорю про вещи вроде https://db.valkyrie-wow.org/?item=6568. ID вещи - последняя циферка в адресе странички с этой вещью - т.е. для предыдущей ссылки эт 6568. аддон вот https://elysium-project.org/forum/index.php?app=downloads&showfile=117 . Команда /script RandomBonus.TestItem(item_id, number_of_crafting)например /script RandomBonus.TestItem(6568, 100) 15 тыщ раз обсчитывает за пару минут, это /script RandomBonus.TestItem(6568, 15000) Запоминает все строки из описания, где встречаются циферки. На реальном сервере лучше не включать - всё таки аддон создает, и удаляет вещи, хоть я и делал, дабы удалялись только созданные вещи, но кто его знает. Советую прописать себе сумки .additem 31035 4 чтобы быстрее пошло. Если встретятся баги, или появятся идеи по улучшению - пишите. P.s. Увидите красную строку - пишите сюда номер бонуса. Edited November 7, 2015 by shuraken007 5 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 И да.. на всякий случай - если чего заглючит - вот макрос для удаления всех вещей из сумок /script for i = 0, 4 do for j = 1, GetContainerNumSlots(i) do PickupContainerItem(i,j) DeleteCursorItem() end end 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 Вдруг пригодится, таблица random bonus'es с их idтыц 2 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 (edited) Да, забавная штука, но я к ней не привязывался, обработка текста с тултипа - главное чтоб в строке циферка встретилась. Я думаю по таблице ранжировку геморойно будет определять, и ещё надо сразу несколько строк смотреть - и определять - а к какому бонусу таблицы принадлежат - там же по 2-3 бонуса бывают сразу - в таблице, хотя через итемлинк наверное норм. Edited January 7, 2015 by shuraken007 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 В ItemLink одним из параметров идёт EnchantSuffix, т.е. значительно ускорить работу парсера можно за счёт выделения EnchantSuffix'a, а затем обращения к таблице выше: local suffixText = Enchant_Suffix_Table[enchant_suffix]; После чего можно парсить suffixText на предмет уже конкретных бонусов. Просто вариант маленькой оптимизации которая не требует возни с тултипом и даёт более конкретное представление именно о бонусе, а то судя по скрину он в принципе все данные извлекает из тултипа, в.т.ч. не рандомные p.s. но это дело вкуса 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 (edited) У всех вещей с рандом бонусом статы - одна строка из той таблицы? Комбинаций быть не может с чем-либо ещё? Не бывает основных статов + рандом, или несколько рандомных. Edited January 7, 2015 by shuraken007 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 1. Да, любой бонус - однозначен. Возможно в таблице чего-то не хватает, при пользовании мне такое встречалось, пришлось чуть дописывать, но просто в случае такой ситуации (когда suffixText == nil) выводи ошибку в чат или в лог-файл, просто добавишь руками.2. Комбинаций нескольких рандомов быть не может. Но могут быть основные статы + рандом вот например.3. (От себя) Для полной крутости можно попросить точную базу рандомных чантов у админов, отпарсить и сделать бд-файл. Да, аддон значительно потолстеет в весе, но зато не нужно ничего никому парсить - всё уже сделано. Просто кидаешь /itemtest itemId - он мгновенно выдаёт все варианты. 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 Дай какую-нить вещь - где эта гадость встречается, т.е. в таблице отсутсвует. Совмещу 2 метода) 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 Я обновлял таблицу если находил отсутствие записи, но именно что не исключаю вероятность того, что что-то пропустил. Поэтому пример привести не могу, извини Лучше делай проверку на nil, если suffixText == nil - то используй метод парсинга тултипа и пиши куда-либо ошибку что бы добавить в таблицу новый suffixId (пойдёт как обновление аддона, почему бы и нет) 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 (edited) Update, переделал малость - сделал то, что обсуждалось выше. Теперь видно набор всевозможных названий, к каждому прилагается ранжировка параметров. Увидите красную строку - пишите сюда номер бонуса. Ещё аддон работает даже с хреновым пингом, ждет удаления/добавления вещей. Edited January 7, 2015 by shuraken007 1 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 Вот и выяснилось, что кинжала на +6 огнем нету в природе, только 4. И брасов на 6 фроста тож нету, +4 максимум, на 19 лвл всё это. А я их год с лишним не мог найти) 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 Молодчага, хорошая работа Но к слову подумай о том, что бы отпарсить в дальнейшем базу сервера и просто сделать таблицу itemId -> chantId { }, это значительно ускорит работу аддона и гарантировано будет выдавать список чантов для любой вещи. p.s. потом получившуюся базу можно интегрировать просто куда угодно, в тот же аукционер, атлас, etc. Правда это уже выходит за рамки предложенного Успехов! 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 (edited) Хм.. первый вопрос - если вещь без рандом бонусов - то суффикс 0 в итемлинке? Второй вопрос - аддон писать и читать в файлы может? Ну или в память по адресу. Edited January 7, 2015 by shuraken007 0 Share this post Link to post Share on other sites
Muu 96 Report post Posted January 7, 2015 Один вопрос- как лоу лвл вещи, рэндом бонусы и твой аддон могут помочь улучшить работоспособность сервера? 0 Share this post Link to post Share on other sites
Grigio 457 Report post Posted January 7, 2015 (edited) 1. Да, кажется 0, но лучше проверить 2. Да, но это скорее чтениесохранение переменной в естественном для .lua формате. Для этого в .toc файле нужно объявить директиву: ## SavedVariables: variableName Для хранения переменной в файле wow/wtf/account/SavedVariables/addonName.lua Сюда пишу данные общие для одного аккаунта. ## SavedVariablesPerCharacter: valiableName Для хранения переменной в файле wow/wtf/account/ServerName/CharacterName/SavedVariables/addonName.lua Обычно сюда пишут индивидуальные настройки для каждого персонажа. Других способов увы, но не знаю. Один вопрос- как лоу лвл вещи, рэндом бонусы и твой аддон могут помочь улучшить работоспособность сервера? Помогут находить баги в таблице случайных чантов И тестировать способности персонажей в эквипе с одинаковыми статами которые зачастую рандомны. Edited January 7, 2015 by Grigio 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 7, 2015 Один вопрос- как лоу лвл вещи, рэндом бонусы и твой аддон могут помочь улучшить работоспособность сервера? Я написал для себя эту штуку, решил поделиться этим с остальными - чего в этом плохого? У нас не узнать рандом бонус, разве что просить у админов базу данных, или читать мангос, и уповать на то, что у нас не меняли. 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 11, 2015 (edited) Да - вот пытаюсь сделать две таблицы - одну список рандом бонусов полную, другую - ид вещи - бонус. Точнее сгенерировать. Функция одна создает вещь, если есть рандом бонус - вперед парсить текст или бонус, а если систем месседж что вещи нет - то дальше. Вроде работает, работает - а потом срывается(вызывается где-то ещё раз) - и лавинооразно вызываться начинает, с неправильными параметрами. Бьюсь, бьюсь - и через таймеры её - с задержками, и через ивент обработку перевызываю, и чекаю в ивент обработке - а не работает ли она. Но сам корень зла так и не нахожу, подобрать пока не вышло. Может из аддонкрафтеров подскажет кто модель вызова корректную, или способ блокировки, всмысле отработанный корректоспособный способ. Я блокировку пытался делать - просто переменную завожу - в начале функции тру, в конце фолс. Если тру - то не вызываем. Но как показала практика - оно не пашет.(К вопросу - а можно ли код организовать так, дабы можно было пользоваться в общем случае штукой типа - wait(time) То бишь сваливание идёт, через опр время вызов в точку остановки. Т.е. в цикле подожди секунду, потом проверь что-нить. Ну или хоть в каком-то более частном решении, но удобном.) Прога должна подождать, пока скрафтится/ удалится вещь(я использую BAG_UPDATE) - и вызываться ещё раз. Либо просто перевызваться в связи с компактностью кода(перейти на следующую итерацию). (вручную посылаю bag_update из ф-ии, а в другом месте из-за забития стека вызовов - через таймеры сделал.) Вот - новая неработающая версия, гляньте кто опытным глазом, запуск /script RandomBonus.CreateTable(0, 2000) генерить id от и до, на тестовом смотрите. p.s. 2443 строку раскомментить можно, там вывод тестовый сделал вместо нее. И остановка поставлена - чтобы лавины не было. Это в обработке конкретной вещи - если суффикс 0. RandomBonus.zip Edited January 11, 2015 by shuraken007 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 11, 2015 (edited) да не в этом суть. Я наоборот этот $random = array генерирую. Даже если вырубить анализ шмотки (анализ тултипа или работа с таблицей бонусов)- функция которая выбирает шмотку - срывается в какой -то момент. Она берет ID и тестит вещь - пытается создать, смотрит получилось ли, есть ли suffix у шмотки, и удаляет его. А потом в зависимости от отправляет - на анализ - т.е аддон который ща выложен в загрузках. Edited January 12, 2015 by shuraken007 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted January 16, 2015 (edited) Разобрался я. Проблема была в момент появления новой вещи для клиента. Он её в кэш сохраняет, на сервер мб обращается за доп инфой - ещё вопросик висит короткое время. Но пока разбирался - создал некий общий интерфейс:вызови функцию через столько-то времени с такимито параметрами.Кому интересно - вот. RandomBonus={}function RandomBonus.Message(msg, chat, lang) if not lang then lang = "COMMON" end if not chat then DEFAULT_CHAT_FRAME:AddMessage(msg) else local j, fg = 1, 0 local chat_type={"SAY", "EMOTE", "YELL", "PARTY", "GUILD", "OFFICER", "RAID", "RAID_WARNING", "BATTLEGROUND"} for j=1, getn(chat_type) do if chat==chat_type[j] then fg = 1 SendChatMessage(msg, chat, lang) break end end if fg==0 then SendChatMessage(msg, "WHISPER", lang, chat) end endend--Timers-----------------------------------------------------------------------------RandomBonus.Timers={}function RandomBonus.NewTimer(shuraken_pack_timer, shuraken_pack_time) RandomBonus.Timers[shuraken_pack_timer] = {[1]=GetTime(), [2]=shuraken_pack_time}endfunction RandomBonus.GetTimer(shuraken_pack_timer) local return_value if not RandomBonus.Timers[shuraken_pack_timer] then return_value = nil else return_value = RandomBonus.Timers[shuraken_pack_timer][2] - (GetTime() - RandomBonus.Timers[shuraken_pack_timer][1]) if return_value<0 then return_value = nil tremove(RandomBonus.Timers[shuraken_pack_timer]) tremove(RandomBonus.Timers[shuraken_pack_timer]) RandomBonus.Timers[shuraken_pack_timer] = nil end end return return_valueendfunction RandomBonus.PrintTimers() for key, value in pairs(RandomBonus.Timers) do if RandomBonus.GetTimer(key) then DEFAULT_CHAT_FRAME:AddMessage(key..": "..RandomBonus.GetTimer(key)) end endendRandomBonus.Stopwatchs = {}function RandomBonus.Stopwatch(stopwatch, start_or_stop) if start_or_stop and start_or_stop == "start" then if not RandomBonus.Stopwatchs[stopwatch] then RandomBonus.Stopwatchs[stopwatch] = {[1] = 0, [2] = GetTime(), [3] = 1} else if RandomBonus.Stopwatchs[stopwatch][3] == 0 then RandomBonus.Stopwatchs[stopwatch][2] = GetTime() RandomBonus.Stopwatchs[stopwatch][3] = 1 end end elseif start_or_stop and start_or_stop == "stop" then if RandomBonus.Stopwatchs[stopwatch] then RandomBonus.Stopwatchs[stopwatch][1] = RandomBonus.Stopwatchs[stopwatch][1] + RandomBonus.Stopwatchs[stopwatch][3]*(GetTime() - RandomBonus.Stopwatchs[stopwatch][2]) RandomBonus.Stopwatchs[stopwatch][3] = 0 end endendfunction RandomBonus.GetStopwatch(stopwatch) local return_value if not RandomBonus.Stopwatchs[stopwatch] then return_value = nil else return_value = RandomBonus.Stopwatchs[stopwatch][1] + RandomBonus.Stopwatchs[stopwatch][3]*(GetTime() - RandomBonus.Stopwatchs[stopwatch][2]) end return return_valueendfunction RandomBonus.DelStopwatch(stopwatch) if RandomBonus.Stopwatchs[stopwatch] then RandomBonus.Stopwatchs[stopwatch][1] = nil RandomBonus.Stopwatchs[stopwatch][2] = nil RandomBonus.Stopwatchs[stopwatch][3] = nil RandomBonus.Stopwatchs[stopwatch] = nil endendfunction RandomBonus.PrintStopwatchs() for key, value in pairs(RandomBonus.Stopwatchs) do if RandomBonus.GetStopwatch(key) then DEFAULT_CHAT_FRAME:AddMessage(key..": "..RandomBonus.GetStopwatch(key)) end endendRandomBonus.CallStack = {}RandomBonus.CallStack.Init = function() if type(RandomBonus.CallStack.Funcs) ~= "table" then RandomBonus.CallStack.Funcs = {} end if type(RandomBonus.CallStack.Params) ~= "table" then RandomBonus.CallStack.Params = {} end if type(RandomBonus.CallStack.Stopwatches) ~= "table" then RandomBonus.CallStack.Stopwatches = {} end RandomBonus.CallStack.Work = trueend RandomBonus.CallStack.NewCall = function(func, time, ...) RandomBonus.CallStack.Funcs[func] = time if getn(arg) > 0 then if RandomBonus.CallStack.Params[func] and type(RandomBonus.CallStack.Params[func]) == "table" then for i = 0, getn(RandomBonus.CallStack.Params[func]) do RandomBonus.CallStack.Params[func][i] = nil end end RandomBonus.CallStack.Params[func] = nil RandomBonus.CallStack.Params[func] = {} for i = 0, getn(arg) do RandomBonus.CallStack.Params[func][i] = arg[i] end end RandomBonus.Stopwatch(func, "start")endRandomBonus.CallStack.Call = function() if RandomBonus.CallStack.Work then for key, value in pairs(RandomBonus.CallStack.Funcs) do if RandomBonus.GetStopwatch(key) >= value then RandomBonus.DelStopwatch(key) if RandomBonus.CallStack.Params[key] then RandomBonus.CallStack.Funcs[key] = nil key(unpack(RandomBonus.CallStack.Params[key])) else RandomBonus.CallStack.Funcs[key] = nil key() end break end end endendfunction RandomBonus.OnLoad() RandomBonus.CallStack.Init() RandomBonus.UpdateTime = 0.001endfunction RandomBonus.OnUpdate() if not RandomBonus.GetTimer("UpdateTime") then RandomBonus.NewTimer("UpdateTime", RandomBonus.UpdateTime) RandomBonus.CallStack.Call() endendНапример следующая ф-ия принимает произвольное количество параметров, выдаёт их в чат, и подписывается на вызов через секунду - т.е. будет спамить каждую секунду:function RandomBonus.Test1(...) DEFAULT_CHAT_FRAME:AddMessage("------>Test1<--------") for i = 0, getn(arg) do DEFAULT_CHAT_FRAME:AddMessage(arg[i]) end RandomBonus.CallStack.NewCall(RandomBonus.Test1, 1, unpack(arg))endРазумеется массив RandomBonus можно убрать везде.Ну и ясно, что если фиксированные параметры у ф-ии a, b например - и вызов через полсеки к примеру - то вызов выглядит какRandomBonus.CallStack.NewCall(SomeFunc, 0.5, a, Запустил аддон на скан по всем вещам, с ид от 0 до 30000. Работал он 3 дня и 3 ночи, и нашёл аж 1688 рандом вещей. Каждая создавалась по 10к раз, и найдены шансы - типа RB_ITEM_ID = { ["15393"] = { ["1323"] = 0.2900000000000001, ["957"] = 1.060000000000001, ["1620"] = 7.399999999999887, ["617"] = 5.329999999999931, ["700"] = 0.7900000000000005, ["532"] = 0.9000000000000006, ["2043"] = 2.649999999999988, ["1042"] = 2.479999999999991, ["616"] = 5.489999999999927, ["955"] = 0.8800000000000006, ["411"] = 5.239999999999933, ["871"] = 3.629999999999967, ["615"] = 5.769999999999921, ["872"] = 3.45999999999997, ["530"] = 0.9000000000000006, ["956"] = 1.070000000000001, ["1209"] = 1.530000000000001, ["614"] = 5.519999999999927, ["787"] = 3.659999999999966, ["446"] = 1.150000000000001, ["699"] = 0.7300000000000004, ["1039"] = 2.06, ["954"] = 0.9700000000000006, ["447"] = 1.200000000000001, ["1041"] = 2.309999999999995, ["1369"] = 0.3600000000000002, ["1415"] = 0.4600000000000002, ["448"] = 1.160000000000001, ["531"] = 1.130000000000001, ["1815"] = 2.010000000000001, ["870"] = 3.439999999999971, ["1040"] = 2.259999999999996, ["1210"] = 1.400000000000001, ["449"] = 1.460000000000001, ["702"] = 0.8000000000000005, ["1211"] = 1.470000000000001, ["529"] = 0.9200000000000006, ["785"] = 3.279999999999974, ["786"] = 3.319999999999973, ["1507"] = 0.2400000000000001, ["784"] = 3.439999999999971, ["1461"] = 0.3300000000000001, ["1212"] = 1.410000000000001, ["701"] = 0.8700000000000006, ["869"] = 3.769999999999964, }, ......} Прикладываю аддон - если кому интересно глянуть, как генерилось (там таблицу в начале забыл удалить - не использовал и файл view нигде не используется) и луа файл с 3-мя таблицами сгенерированными вещи с суффиксами и процентами - это RB_ITEM_ID полная таблица всех встреченных на этих вещах суффиксов - RB_SUFFIX и сделал из интересу таблицу не используемых в игре суффиксов (видимо по принципу жирно будет) - RB_UNUSED_SUFFIX ну там вроде "Dagger Skill +7" "Critical Hit +4%" "+43 Nature Resistance" "+54 Frost Spell Damage" и тому подобное p.s. таблицы по ключам не сортируемые в принципе - если нужен визуально нормальный вид - то это на делать типо RB_ITEM_ID = { {["15393"] = { ["1323"] = 0.2900000000000001, ...} } { }, ....... } Но тогда для аддонов не удобно очень. Будет время - попилю облочку, чтоб с игры просматривать удобно эту бд было. Поиск разнообразный там, может с графической оболочкой аддонов наконец-то немного разберусь. RandomBonus.zip Edited January 18, 2015 by shuraken007 3 Share this post Link to post Share on other sites