Jump to content
Sign in to follow this  
shuraken007

Рандом Бонусы

Recommended Posts

Представляю вашему вниманию небольшой аддон, который позволяет, используя команду .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 by shuraken007

Share this post


Link to post
Share on other sites

И да.. на всякий случай - если чего заглючит - вот макрос для удаления всех вещей из сумок

/script for i = 0, 4 do for j = 1, GetContainerNumSlots(i) do PickupContainerItem(i,j) DeleteCursorItem() end end

Share this post


Link to post
Share on other sites

Да, забавная штука, но я к ней не привязывался, обработка текста с тултипа - главное чтоб в строке циферка встретилась.

Я думаю по таблице ранжировку геморойно будет определять, и ещё надо сразу несколько строк смотреть - и определять - а к какому бонусу таблицы принадлежат - там же по 2-3 бонуса бывают сразу - в таблице, хотя через итемлинк наверное норм.

Edited by shuraken007

Share this post


Link to post
Share on other sites

В ItemLink одним из параметров идёт EnchantSuffix, т.е. значительно ускорить работу парсера можно за счёт выделения EnchantSuffix'a, а затем обращения к таблице выше: local suffixText = Enchant_Suffix_Table[enchant_suffix];

После чего можно парсить suffixText на предмет уже конкретных бонусов.

Просто вариант маленькой оптимизации которая не требует возни с тултипом и даёт более конкретное представление именно о бонусе, а то судя по скрину он в принципе все данные извлекает из тултипа, в.т.ч. не рандомные :)

 

p.s. но это дело вкуса

Share this post


Link to post
Share on other sites

У всех вещей с рандом бонусом статы - одна строка из той таблицы? Комбинаций быть не может с чем-либо ещё? Не бывает основных статов + рандом, или несколько рандомных.

Edited by shuraken007

Share this post


Link to post
Share on other sites

1. Да, любой бонус - однозначен. Возможно в таблице чего-то не хватает, при пользовании мне такое встречалось, пришлось чуть дописывать, но просто в случае такой ситуации (когда suffixText == nil) выводи ошибку в чат или в лог-файл, просто добавишь руками.2. Комбинаций нескольких рандомов быть не может. Но могут быть основные статы + рандом вот например.3. (От себя) Для полной крутости можно попросить точную базу рандомных чантов у админов, отпарсить и сделать бд-файл. Да, аддон значительно потолстеет в весе, но зато не нужно ничего никому парсить - всё уже сделано. Просто кидаешь /itemtest itemId - он мгновенно выдаёт все варианты.

Share this post


Link to post
Share on other sites

Дай какую-нить вещь - где эта гадость встречается, т.е. в таблице отсутсвует. Совмещу 2 метода)

Share this post


Link to post
Share on other sites

Я обновлял таблицу если находил отсутствие записи, но именно что не исключаю вероятность того, что что-то пропустил. Поэтому пример привести не могу, извини :)

Лучше делай проверку на nil, если suffixText == nil - то используй метод парсинга тултипа и пиши куда-либо ошибку что бы добавить в таблицу новый suffixId (пойдёт как обновление аддона, почему бы и нет)

Share this post


Link to post
Share on other sites

Update, переделал малость - сделал то, что обсуждалось выше. Теперь видно набор всевозможных названий, к каждому прилагается ранжировка параметров. Увидите красную строку - пишите сюда номер бонуса. Ещё аддон работает даже с хреновым пингом, ждет удаления/добавления вещей.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Вот и выяснилось, что кинжала на +6 огнем нету в природе, только 4. И брасов на 6 фроста тож нету, +4 максимум, на 19 лвл всё это. А я их год с лишним не мог найти)

Share this post


Link to post
Share on other sites

:vo: Молодчага, хорошая работа

Но к слову подумай о том, что бы отпарсить в дальнейшем базу сервера и просто сделать таблицу itemId -> chantId { }, это значительно ускорит работу аддона и гарантировано будет выдавать список чантов для любой вещи.

 

p.s. потом получившуюся базу можно интегрировать просто куда угодно, в тот же аукционер, атлас, etc.

Правда это уже выходит за рамки предложенного :)

 

Успехов! :)

Share this post


Link to post
Share on other sites

Хм.. первый вопрос - если вещь без рандом бонусов - то суффикс 0 в итемлинке?

Второй вопрос - аддон писать и читать в файлы может? Ну или в память по адресу.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Один вопрос- как лоу лвл вещи, рэндом бонусы  и твой аддон могут помочь улучшить работоспособность сервера?

Share this post


Link to post
Share on other sites

1. Да, кажется 0, но лучше проверить

 

2. Да, но это скорее чтениесохранение переменной в естественном для .lua формате.

Для этого в .toc файле нужно объявить директиву:

## SavedVariables: variableName

Для хранения переменной в файле wow/wtf/account/SavedVariables/addonName.lua

Сюда пишу данные общие для одного аккаунта.

## SavedVariablesPerCharacter: valiableName

Для хранения переменной в файле wow/wtf/account/ServerName/CharacterName/SavedVariables/addonName.lua

Обычно сюда пишут индивидуальные настройки для каждого персонажа.

 

Других способов увы, но не знаю.

 

 

Один вопрос- как лоу лвл вещи, рэндом бонусы  и твой аддон могут помочь улучшить работоспособность сервера?

 

Помогут находить баги в таблице случайных чантов  :happy_tired:

И тестировать способности персонажей в эквипе с одинаковыми статами которые зачастую рандомны.

Edited by Grigio

Share this post


Link to post
Share on other sites

Один вопрос- как лоу лвл вещи, рэндом бонусы  и твой аддон могут помочь улучшить работоспособность сервера?

Я написал для себя эту штуку, решил поделиться этим с остальными - чего в этом плохого?

У нас не узнать рандом бонус, разве что просить у админов базу данных, или читать мангос, и уповать на то, что у нас не меняли.

Share this post


Link to post
Share on other sites

Да - вот пытаюсь сделать две таблицы - одну список рандом бонусов полную, другую - ид вещи - бонус. Точнее сгенерировать.

Функция одна создает вещь, если есть рандом бонус - вперед парсить текст или бонус, а если систем месседж что вещи нет - то дальше.

Вроде работает, работает - а потом срывается(вызывается где-то ещё раз) - и лавинооразно вызываться начинает, с неправильными параметрами.

Бьюсь, бьюсь - и через таймеры её - с задержками, и через ивент обработку перевызываю, и чекаю в ивент обработке - а не работает ли она. Но сам корень зла так и не нахожу, подобрать пока не вышло.

 

Может из аддонкрафтеров подскажет кто модель вызова корректную, или способ блокировки, всмысле отработанный корректоспособный способ. Я блокировку пытался делать - просто переменную завожу - в начале функции тру, в конце фолс. Если тру - то не вызываем. Но как показала практика - оно не пашет.(К вопросу - а можно ли код организовать так, дабы можно было пользоваться в общем случае штукой типа - wait(time) То бишь сваливание идёт, через опр время вызов в точку остановки. Т.е. в цикле подожди секунду, потом проверь что-нить. Ну или хоть в каком-то более частном решении, но удобном.)

 

Прога должна подождать, пока скрафтится/ удалится вещь(я использую BAG_UPDATE)  - и вызываться ещё раз. Либо просто перевызваться в связи с компактностью кода(перейти на следующую итерацию). (вручную посылаю bag_update из ф-ии, а в другом месте из-за забития стека вызовов - через таймеры сделал.)

 

Вот - новая неработающая версия, гляньте кто опытным глазом, запуск /script RandomBonus.CreateTable(0, 2000)  генерить id от и до, на тестовом смотрите.

 

 

p.s. 2443 строку раскомментить можно, там вывод тестовый сделал вместо нее. И остановка поставлена - чтобы лавины не было. Это в обработке конкретной вещи - если суффикс 0.

RandomBonus.zip

Edited by shuraken007

Share this post


Link to post
Share on other sites

да не в этом суть. Я наоборот этот $random = array генерирую. Даже если вырубить анализ шмотки (анализ тултипа или работа с таблицей бонусов)- функция которая выбирает шмотку - срывается в какой -то момент. Она берет ID и тестит вещь - пытается создать, смотрит получилось ли, есть ли suffix у шмотки, и удаляет его. А потом в зависимости от отправляет - на анализ - т.е аддон который ща выложен в загрузках.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Разобрался я. Проблема была в момент появления новой вещи для клиента. Он её в кэш сохраняет, на сервер мб обращается за доп инфой - ещё вопросик висит короткое время. Но пока разбирался - создал некий общий интерфейс:вызови функцию через столько-то времени с такимито параметрами.Кому интересно - вот.

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 by shuraken007

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×