<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AAverage_drop_value</id>
	<title>Module:Average drop value - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AAverage_drop_value"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value&amp;action=history"/>
	<updated>2026-04-30T20:50:48Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Average_drop_value&amp;diff=34238&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;local curr = require(&#039;Module:Currency&#039;)._amount local dpl = require(&#039;Module:DPLlua&#039;) local geprices = mw.loadJsonData(&#039;Module:GEPrices/data.json&#039;)  local p = {}  function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, alchonly, options) 	local avgqty = (tonumber(lowqty) + tonumber(highqty)) / 2 	local rar_good, price 	-- parse price 	local i_lo = item:lower() 	if i_lo == &#039;brimstone key&#039; and options.brimstone ~= nil then 		if alchonly then 			price = tonumber(...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Average_drop_value&amp;diff=34238&amp;oldid=prev"/>
		<updated>2024-10-15T23:51:31Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local curr = require(&amp;#039;Module:Currency&amp;#039;)._amount local dpl = require(&amp;#039;Module:DPLlua&amp;#039;) local geprices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)  local p = {}  function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, alchonly, options) 	local avgqty = (tonumber(lowqty) + tonumber(highqty)) / 2 	local rar_good, price 	-- parse price 	local i_lo = item:lower() 	if i_lo == &amp;#039;brimstone key&amp;#039; and options.brimstone ~= nil then 		if alchonly then 			price = tonumber(...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local curr = require(&amp;#039;Module:Currency&amp;#039;)._amount&lt;br /&gt;
local dpl = require(&amp;#039;Module:DPLlua&amp;#039;)&lt;br /&gt;
local geprices = mw.loadJsonData(&amp;#039;Module:GEPrices/data.json&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function calcValue(item, lowqty, highqty, rarity, rolls, alchprice, alchonly, options)&lt;br /&gt;
	local avgqty = (tonumber(lowqty) + tonumber(highqty)) / 2&lt;br /&gt;
	local rar_good, price&lt;br /&gt;
	-- parse price&lt;br /&gt;
	local i_lo = item:lower()&lt;br /&gt;
	if i_lo == &amp;#039;brimstone key&amp;#039; and options.brimstone ~= nil then&lt;br /&gt;
		if alchonly then&lt;br /&gt;
			price = tonumber(mw.getCurrentFrame():preprocess(&amp;#039;{{KDTAlchValue}}&amp;#039;))&lt;br /&gt;
		else&lt;br /&gt;
			price = tonumber(mw.getCurrentFrame():preprocess(&amp;#039;{{KDTValue}}&amp;#039;))&lt;br /&gt;
		end&lt;br /&gt;
    elseif (i_lo == &amp;#039;larran\&amp;#039;s key&amp;#039; or i_lo == &amp;#039;slayer\&amp;#039;s enchantment&amp;#039;) and options.wildernessslayer == nil then&lt;br /&gt;
        price = 0&lt;br /&gt;
	elseif i_lo == &amp;#039;ecumenical key&amp;#039; then&lt;br /&gt;
			price = 0&lt;br /&gt;
	elseif alchonly then&lt;br /&gt;
		price = alchprice or 0&lt;br /&gt;
	else&lt;br /&gt;
		-- strip &amp;#039;#&amp;#039; or replace w/ a space for lookup&lt;br /&gt;
		-- &amp;#039;Prayer potion#(4)&amp;#039; to &amp;#039;Prayer potion(4)&amp;#039;&lt;br /&gt;
		-- &amp;#039;Iron dart#(p)&amp;#039; to &amp;#039;Iron dart (p)&amp;#039;&lt;br /&gt;
		price = geprices[item:gsub(&amp;#039;#&amp;#039;,&amp;#039;&amp;#039;)] or geprices[item:gsub(&amp;#039;#&amp;#039;,&amp;#039; &amp;#039;)] or alchprice or 0&lt;br /&gt;
	end&lt;br /&gt;
	if not price then&lt;br /&gt;
		--mw.log(&amp;#039;0 price for &amp;#039;..item)&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
	-- parse rarity&lt;br /&gt;
	if rarity:lower() == &amp;#039;always&amp;#039; then&lt;br /&gt;
		rarity = 1&lt;br /&gt;
	else&lt;br /&gt;
		rarity = rarity:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
		rar_good, rarity= pcall(mw.ext.ParserFunctions.expr, rarity)&lt;br /&gt;
		if not rar_good then&lt;br /&gt;
		--mw.log(&amp;#039;0 rarity for &amp;#039;..item)&lt;br /&gt;
			return 0&lt;br /&gt;
		end&lt;br /&gt;
		rarity = tonumber(rarity)&lt;br /&gt;
		if not rarity then&lt;br /&gt;
		--mw.log(&amp;#039;0 rarity for &amp;#039;..item)&lt;br /&gt;
			return 0&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local val = price * avgqty * rarity * rolls&lt;br /&gt;
	--mw.log(string.format(&amp;#039;item %s: %s * %s * %s * %s = %s&amp;#039;, item, price, lowqty, rarity, rolls, val))&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function _DPLcontains(arr,s)&lt;br /&gt;
	for k, v in ipairs(arr) do&lt;br /&gt;
		if v == s then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getDropData(mob)&lt;br /&gt;
	--modified from loadData in [[Module:Bestiary]]&lt;br /&gt;
	query = function(x) --anonymous function to generate query for mob x&lt;br /&gt;
		return{&lt;br /&gt;
			&amp;#039;[[Dropped from::&amp;#039;..x..&amp;#039;]]&amp;#039;,&lt;br /&gt;
			&amp;#039;?Drop JSON&amp;#039;,&lt;br /&gt;
			limit = 500&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	local smw = {}&lt;br /&gt;
	smw = mw.smw.ask(query(mob))&lt;br /&gt;
	if smw and smw ~= {} and smw ~=&amp;#039;&amp;#039; then&lt;br /&gt;
		return smw --drops were successfully retrieved for the mob&lt;br /&gt;
	end&lt;br /&gt;
	--failed to retrieve drops for mob, fall back to mobroot (e.g. &amp;#039;Barbarian&amp;#039; rather than &amp;#039;Barbarian#level 8&amp;#039;)&lt;br /&gt;
	mobroot, _ = mob:match(&amp;#039;([^#]*)#?(.*)&amp;#039;) -- not ideal that this is repeat code however it removes the need for the mobs table&lt;br /&gt;
	if mobroot ~= mob then&lt;br /&gt;
		smw = mw.smw.ask(query(mobroot))&lt;br /&gt;
		if smw and smw ~= {} and smw ~=&amp;#039;&amp;#039; then&lt;br /&gt;
			return smw --data was successfully retrieved for the mobroot&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	--failed to retrieve drops for mob log error&lt;br /&gt;
	local errorstring = string.format(&amp;quot;Failed to retrieve drops for %s%s&amp;quot;,mob,mobroot~=mob and &amp;#039; or &amp;#039; .. mobroot or &amp;#039;&amp;#039;)&lt;br /&gt;
	mw.log(errorstring)&lt;br /&gt;
	return smw&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.totalvalfromdata(data,itemOptions,category, categoryFilter, exclude, excludeFilter, alchonly)&lt;br /&gt;
	--used in [[Module:Bestiary]] too&lt;br /&gt;
	if (not data) or data == {} or data ==&amp;#039;&amp;#039; then &lt;br /&gt;
		return &amp;#039;?&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local totalval = 0&lt;br /&gt;
	local options = itemOptions or {}&lt;br /&gt;
	for i,v in ipairs(data) do&lt;br /&gt;
		local j = mw.text.jsonDecode(v[&amp;#039;Drop JSON&amp;#039;] or &amp;#039;{}&amp;#039;)&lt;br /&gt;
		if (not category) or _DPLcontains(categoryFilter,j[&amp;#039;Dropped item&amp;#039;]) then&lt;br /&gt;
			if (not exclude) or (not _DPLcontains(excludeFilter,j[&amp;#039;Dropped item&amp;#039;])) then&lt;br /&gt;
				totalval = totalval + calcValue(j[&amp;#039;Dropped item&amp;#039;], j[&amp;#039;Quantity Low&amp;#039;], j[&amp;#039;Quantity High&amp;#039;], j[&amp;#039;Rarity&amp;#039;], j[&amp;#039;Rolls&amp;#039;], j[&amp;#039;Drop Value&amp;#039;], alchonly, options)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return totalval&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.totalval(mob, itemOptions, category, categoryFilter, exclude, excludeFilter, alchonly)&lt;br /&gt;
	local data = p.getDropData(mob)&lt;br /&gt;
	return p.totalvalfromdata(data,itemOptions,category, categoryFilter, exclude, excludeFilter, alchonly)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	return p._main(frame, frame:getParent().args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(frame, args)&lt;br /&gt;
	local pageName = mw.title.getCurrentTitle().text&lt;br /&gt;
	local mob = &amp;#039;&amp;#039;&lt;br /&gt;
	&lt;br /&gt;
	if args.mob or args[1] then &lt;br /&gt;
		mob = args.mob or args[1]&lt;br /&gt;
	else&lt;br /&gt;
		mob = pageName&lt;br /&gt;
	end&lt;br /&gt;
	local mobname = mob&lt;br /&gt;
	&lt;br /&gt;
	local mobroot, moblevel = mob:match(&amp;#039;([^#]*)#?(.*)&amp;#039;)&lt;br /&gt;
	if args.mobname then&lt;br /&gt;
		mobname = args.mobname&lt;br /&gt;
	elseif moblevel ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		mobname = string.format(&amp;#039;%s (%s)&amp;#039;,mobroot, moblevel)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if mobroot ~= pageName then --link to the mob if it&amp;#039;s from a different page &lt;br /&gt;
		mobname = string.format(&amp;#039;[[%s|%s]]&amp;#039;,mobroot,mobname) &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local alchstr = &amp;#039;&amp;#039;&lt;br /&gt;
	local worthstr = &amp;#039;&amp;#039;&lt;br /&gt;
	if args.alch then&lt;br /&gt;
		alchstr = &amp;#039;high alch value of a&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		worthstr = &amp;#039;worth &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local killname = args.killname or &amp;#039;kill&amp;#039;&lt;br /&gt;
	local itemOptions = {&lt;br /&gt;
		brimstone = args.brimstone,&lt;br /&gt;
		wildernessslayer = args.wildernessslayer&lt;br /&gt;
	}&lt;br /&gt;
	local categoryFilter = {}&lt;br /&gt;
	local excludeFilter = {}&lt;br /&gt;
	local catReportString = &amp;quot;&amp;quot;&lt;br /&gt;
	filter = function(cat)&lt;br /&gt;
		return  dpl.ask({&lt;br /&gt;
				namespace = &amp;#039;&amp;#039;,&lt;br /&gt;
				ignorecase = &amp;#039;true&amp;#039;,&lt;br /&gt;
				category = cat,&lt;br /&gt;
				allowcachedresults = &amp;#039;true&amp;#039;&lt;br /&gt;
			})&lt;br /&gt;
	end&lt;br /&gt;
	if args.category then&lt;br /&gt;
		categoryFilter = filter(args.category)&lt;br /&gt;
		catReportString = &amp;#039;counting only &amp;#039;..(args.category:lower())..&amp;#039; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if args.exclude then&lt;br /&gt;
		excludeFilter = filter(args.exclude)&lt;br /&gt;
		catReportString = catReportString..&amp;#039;excluding all &amp;#039;..(args.exclude:lower())..&amp;#039; &amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local totalval = p.totalval(mob, itemOptions, args.category, &lt;br /&gt;
		categoryFilter, args.exclude, excludeFilter, args.alch)&lt;br /&gt;
&lt;br /&gt;
	if totalval == &amp;#039;?&amp;#039; then --failed&lt;br /&gt;
		return &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.round then&lt;br /&gt;
		totalval = math.floor(totalval)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.raw then&lt;br /&gt;
		return totalval&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local brimString = args.brimstone ~= nil and &amp;#039; while on a [[Konar]] task&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
	local wildyString = args.wildernessslayer ~= nil and &amp;#039; while on a [[Krystilia]] task&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
	local coinString = curr(totalval, &amp;#039;coins&amp;#039;)&lt;br /&gt;
	return string.format(&amp;#039;The average %s %s %s%s%s %sis %s%s.&amp;#039;, &lt;br /&gt;
		alchstr, mobname, killname, brimString, wildyString, catReportString, worthstr, coinString)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>