<?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%3AMmgtable%2Fdisplay</id>
	<title>Module:Mmgtable/display - 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%3AMmgtable%2Fdisplay"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Mmgtable/display&amp;action=history"/>
	<updated>2026-04-30T07:54:52Z</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:Mmgtable/display&amp;diff=34060&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-- &lt;nowiki&gt; local arr = require(&#039;Module:Array&#039;) local timefunc = require(&#039;Module:Time&#039;) local exg = require(&#039;Module:Exchange&#039;)._price local p = {} local lang = mw.getContentLanguage()  function gep(x) 	return exg(x, 1, nil, nil, 0) end  local MEMBERS_ICON = { 	[false] = &quot;alt=Free-to-play&quot;, 	[true]  = &quot;alt=Members&quot; }  local TAX_EXEMPT = arr{ 	unpack( 		arr.map( 			mw.smw.a...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Mmgtable/display&amp;diff=34060&amp;oldid=prev"/>
		<updated>2024-10-15T21:14:33Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local arr = require(&amp;#039;Module:Array&amp;#039;) local timefunc = require(&amp;#039;Module:Time&amp;#039;) local exg = require(&amp;#039;Module:Exchange&amp;#039;)._price local p = {} local lang = mw.getContentLanguage()  function gep(x) 	return exg(x, 1, nil, nil, 0) end  local MEMBERS_ICON = { 	[false] = &amp;quot;&lt;a href=&quot;/w/File:Free-to-play_icon.png&quot; title=&quot;File:Free-to-play icon.png&quot;&gt;center|link=Free-to-play|alt=Free-to-play&lt;/a&gt;&amp;quot;, 	[true]  = &amp;quot;&lt;a href=&quot;/w/File:Member_icon.png&quot; title=&quot;File:Member icon.png&quot;&gt;center|link=Members|alt=Members&lt;/a&gt;&amp;quot; }  local TAX_EXEMPT = arr{ 	unpack( 		arr.map( 			mw.smw.a...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local arr = require(&amp;#039;Module:Array&amp;#039;)&lt;br /&gt;
local timefunc = require(&amp;#039;Module:Time&amp;#039;)&lt;br /&gt;
local exg = require(&amp;#039;Module:Exchange&amp;#039;)._price&lt;br /&gt;
local p = {}&lt;br /&gt;
local lang = mw.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
function gep(x)&lt;br /&gt;
	return exg(x, 1, nil, nil, 0)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local MEMBERS_ICON = {&lt;br /&gt;
	[false] = &amp;quot;[[File:Free-to-play icon.png|center|link=Free-to-play|alt=Free-to-play]]&amp;quot;,&lt;br /&gt;
	[true]  = &amp;quot;[[File:Member icon.png|center|link=Members|alt=Members]]&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local TAX_EXEMPT = arr{&lt;br /&gt;
	unpack(&lt;br /&gt;
		arr.map(&lt;br /&gt;
			mw.smw.ask{&amp;#039;[[Category:Items exempt from Grand Exchange tax]]&amp;#039;, &amp;#039;?#-&amp;#039;},&lt;br /&gt;
			function(x) return x[1] end&lt;br /&gt;
		)&lt;br /&gt;
	)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function round1k(x, f)&lt;br /&gt;
	if not tonumber(x) then&lt;br /&gt;
		return x&lt;br /&gt;
	end&lt;br /&gt;
	local _x = math.abs(x)&lt;br /&gt;
	_x = 1000 * math.floor(_x / 1000 + 0.5)&lt;br /&gt;
	if x &amp;lt; 0 then&lt;br /&gt;
		_x = _x * -1&lt;br /&gt;
	end&lt;br /&gt;
	if f then&lt;br /&gt;
		return lang:formatNum(_x)&lt;br /&gt;
	end&lt;br /&gt;
	return _x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function round1dp(x, f)&lt;br /&gt;
	if not tonumber(x) then&lt;br /&gt;
		return x&lt;br /&gt;
	end&lt;br /&gt;
	local _x = math.abs(x)&lt;br /&gt;
	_x = math.floor(_x * 10 + 0.5) / 10&lt;br /&gt;
	if x &amp;lt; 0 then&lt;br /&gt;
		_x = _x * -1&lt;br /&gt;
	end&lt;br /&gt;
	if f then&lt;br /&gt;
		return lang:formatNum(_x)&lt;br /&gt;
	end&lt;br /&gt;
	return _x&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function calc_value(args, kph, deduct_tax)&lt;br /&gt;
	local total = 0&lt;br /&gt;
	for i,v in ipairs(args) do&lt;br /&gt;
		local val&lt;br /&gt;
		if v.pricetype == &amp;#039;value&amp;#039; then&lt;br /&gt;
			val = v.qty * v.value&lt;br /&gt;
		elseif v.pricetype == &amp;#039;gemw&amp;#039; then&lt;br /&gt;
			local _v = gep(v.name)&lt;br /&gt;
			if deduct_tax and _v &amp;gt; 99 and not TAX_EXEMPT:contains(v.name) then&lt;br /&gt;
				_v = _v - math.min(math.floor(_v * 0.01), 5000000)&lt;br /&gt;
			end&lt;br /&gt;
			val = _v * v.qty&lt;br /&gt;
		end&lt;br /&gt;
		if kph&amp;gt;0 and not v.isph then&lt;br /&gt;
			val = val * kph&lt;br /&gt;
		end&lt;br /&gt;
		total = total + val&lt;br /&gt;
	end&lt;br /&gt;
	return total&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function make_row(fullpagename, raw_data, ismulti)&lt;br /&gt;
	local data = mw.text.jsonDecode(mw.text.decode(raw_data))&lt;br /&gt;
	local tr = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	local pagename, pagelink&lt;br /&gt;
	pagelink = fullpagename..&amp;#039;|&amp;#039;..string.match(fullpagename, &amp;#039;/(.*)&amp;#039;)&lt;br /&gt;
	if ismulti and data.version then&lt;br /&gt;
		pagename = &amp;#039;[[&amp;#039;..pagelink..&amp;#039; (&amp;#039;..data.version..&amp;#039;)]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		pagename = &amp;#039;[[&amp;#039;..pagelink..&amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local rowcat = data.category&lt;br /&gt;
	if data.skillcategory then&lt;br /&gt;
		rowcat = rowcat .. &amp;#039;/&amp;#039; .. data.skillcategory&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local val, c_class&lt;br /&gt;
	local inputval = calc_value(data.inputs, data.prices.default_kph or 0, false)&lt;br /&gt;
	local outputval = calc_value(data.outputs, data.prices.default_kph or 0, true)&lt;br /&gt;
	val = outputval - inputval&lt;br /&gt;
	if val &amp;gt; 0 then&lt;br /&gt;
		c_class = &amp;#039;coins-pos&amp;#039;&lt;br /&gt;
	elseif val &amp;lt; 0 then&lt;br /&gt;
		c_class = &amp;#039;coins-neg&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		c_class = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local intensity = (data.intensity == &amp;#039;High&amp;#039;) and 3 or (data.intensity == &amp;#039;Moderate&amp;#039;) and 2 or (data.intensity == &amp;#039;Low&amp;#039;) and 1 or 0&lt;br /&gt;
&lt;br /&gt;
	tr	:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(pagename)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, val)&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;coins&amp;#039;)&lt;br /&gt;
				:addClass(c_class)&lt;br /&gt;
				:wikitext(round1k(val, true))&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;plainlist&amp;#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(data.skill)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(rowcat)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(data.intensity)&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, intensity)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(MEMBERS_ICON[data.members])&lt;br /&gt;
		:done()&lt;br /&gt;
	return val, data.category, tr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local query = {&amp;#039;[[Category:Worthwhile money making guides]]&amp;#039;, &amp;#039;[[MMG JSON::+]]&amp;#039;, &amp;#039;?MMG JSON&amp;#039;, &amp;#039;?=#&amp;#039;, limit=10000}&lt;br /&gt;
	if args[1] then&lt;br /&gt;
		table.insert(query, 2, &amp;#039;[[Category:&amp;#039;..args[1]..&amp;#039;]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local data = mw.smw.ask(query)&lt;br /&gt;
	&lt;br /&gt;
	local t = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	t	:addClass(&amp;#039;wikitable sortable sticky-header align-right-2 align-center-4 align-center-5 align-center-6&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;caption&amp;#039;)&lt;br /&gt;
			:wikitext(&amp;#039;[[Money making guide|All guides]] &amp;amp;bull; [[Money making guide/Collecting|Collecting]] &amp;amp;bull; [[Money making guide/Combat|Combat]] &amp;amp;bull; [[Money making guide/Processing|Processing]] &amp;amp;bull; [[Money making guide/Skilling|Skilling]] &amp;amp;bull; [[Money making guide/Recurring|Recurring]] &amp;amp;bull; [[Money making guide/Free-to-play|Free-to-play]] &amp;#039;)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Method&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Hourly profit&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Skills&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Category&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Intensity&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;65px&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Members&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;65px&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			&lt;br /&gt;
	local methods = {}&lt;br /&gt;
	for i,v in ipairs(data) do&lt;br /&gt;
		if(string.find(v[1], &amp;#039;Money making guide/&amp;#039;)) then&lt;br /&gt;
			if type(v[&amp;#039;MMG JSON&amp;#039;]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
				for j,u in ipairs(v[&amp;#039;MMG JSON&amp;#039;]) do&lt;br /&gt;
					table.insert(methods, { make_row(v[1], u, true) })&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				table.insert(methods, { make_row(v[1], v[&amp;#039;MMG JSON&amp;#039;], false) })&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(methods, function(a,b) return a[1]&amp;gt;b[1] end)&lt;br /&gt;
	for i,v in ipairs(methods) do&lt;br /&gt;
		if v[1] &amp;gt; 0 then&lt;br /&gt;
			t:newline():node(v[3])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function make_rec_row(fullpagename, raw_data, ismulti)&lt;br /&gt;
	local data = mw.text.jsonDecode(mw.text.decode(raw_data))&lt;br /&gt;
	local tr = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	local pagename, pagelink&lt;br /&gt;
	pagelink = fullpagename..&amp;#039;|&amp;#039;..string.match(fullpagename, &amp;#039;/(.*)&amp;#039;)&lt;br /&gt;
	if ismulti and data.version then&lt;br /&gt;
		pagename = &amp;#039;[[&amp;#039;..pagelink..&amp;#039; (&amp;#039;..data.version..&amp;#039;)]]&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		pagename = &amp;#039;[[&amp;#039;..pagelink..&amp;#039;]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local val = calc_value(data.outputs, 0, true) - calc_value(data.inputs, 0, false)&lt;br /&gt;
	local c_class&lt;br /&gt;
	if val &amp;gt; 0 then&lt;br /&gt;
		c_class = &amp;#039;coins-pos&amp;#039;&lt;br /&gt;
	elseif val &amp;lt; 0 then&lt;br /&gt;
		c_class = &amp;#039;coins-neg&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		c_class = &amp;#039;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	tr	:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(pagename)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, val)&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;coins&amp;#039;)&lt;br /&gt;
				:addClass(c_class)&lt;br /&gt;
				:wikitext(round1k(val, true))&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(timefunc._m_to_c(tostring(data.time)))&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, val*60/data.time)&lt;br /&gt;
			:tag(&amp;#039;span&amp;#039;)&lt;br /&gt;
				:addClass(&amp;#039;coins&amp;#039;)&lt;br /&gt;
				:addClass(c_class)&lt;br /&gt;
				:wikitext(round1k(val*60/data.time, true))&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:attr(&amp;#039;data-sort-value&amp;#039;, timefunc._w_to_c(tostring(data.recurrence)))&lt;br /&gt;
			:wikitext(timefunc._w_to_c(tostring(data.recurrence)))&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:addClass(&amp;#039;plainlist&amp;#039;)&lt;br /&gt;
			:newline()&lt;br /&gt;
			:wikitext(data.skill)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(data.category)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
			:wikitext(MEMBERS_ICON[data.members])&lt;br /&gt;
		:done()&lt;br /&gt;
	return val, tr&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.rec(frame)&lt;br /&gt;
	local data = mw.smw.ask({&amp;#039;[[MMG recurring JSON::+]]&amp;#039;, &amp;#039;[[MMG value::+]]&amp;#039;, &amp;#039;?MMG recurring JSON&amp;#039;, &amp;#039;?=#&amp;#039;, limit=10000})&lt;br /&gt;
	&lt;br /&gt;
	local t = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	t	:addClass(&amp;#039;wikitable sortable sticky-header align-right-2 align-right-3 align-right-4 align-right-5 align-center-7 align-center-8&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;caption&amp;#039;)&lt;br /&gt;
			:wikitext(&amp;#039;[[Money making guide|All guides]] &amp;amp;bull; [[Money making guide/Collecting|Collecting]] &amp;amp;bull; [[Money making guide/Combat|Combat]] &amp;amp;bull; [[Money making guide/Processing|Processing]] &amp;amp;bull; [[Money making guide/Skilling|Skilling]] &amp;amp;bull; [[Money making guide/Recurring|Recurring]] &amp;amp;bull; [[Money making guide/Free-to-play|Free-to-play]]&amp;#039;)&lt;br /&gt;
		:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Method&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Profit&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Time&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Effective&amp;lt;br&amp;gt;profit&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Recurrence&amp;lt;br&amp;gt;time&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Skills&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Category&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:wikitext(&amp;#039;Members&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;width&amp;#039;, &amp;#039;65px&amp;#039;)&lt;br /&gt;
			:done()&lt;br /&gt;
			&lt;br /&gt;
	local methods = {}&lt;br /&gt;
	for i,v in ipairs(data) do&lt;br /&gt;
		if type(v[&amp;#039;MMG recurring JSON&amp;#039;]) == &amp;#039;table&amp;#039; then&lt;br /&gt;
			for j,u in ipairs(v[&amp;#039;MMG recurring JSON&amp;#039;]) do&lt;br /&gt;
				table.insert(methods, { make_rec_row(v[1], u, true) })&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(methods, { make_rec_row(v[1], v[&amp;#039;MMG recurring JSON&amp;#039;], false) })&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(methods, function(a,b) return a[1]&amp;gt;b[1] end)&lt;br /&gt;
	for i,v in ipairs(methods) do&lt;br /&gt;
		t:newline()&lt;br /&gt;
		t:node(v[2])&lt;br /&gt;
	end&lt;br /&gt;
	t:newline()&lt;br /&gt;
	return t&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>