<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://modded.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ADropTable</id>
	<title>Module:DropTable - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://modded.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ADropTable"/>
	<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:DropTable&amp;action=history"/>
	<updated>2026-06-02T15:26:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14096&amp;oldid=prev</id>
		<title>Carter57: Undo revision 14095 by Carter57 (talk)</title>
		<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14096&amp;oldid=prev"/>
		<updated>2026-06-02T02:49:19Z</updated>

		<summary type="html">&lt;p&gt;Undo revision &lt;a href=&quot;/w/Special:Diff/14095&quot; title=&quot;Special:Diff/14095&quot;&gt;14095&lt;/a&gt; by &lt;a href=&quot;/w/Special:Contributions/Carter57&quot; title=&quot;Special:Contributions/Carter57&quot;&gt;Carter57&lt;/a&gt; (&lt;a href=&quot;/index.php?title=User_talk:Carter57&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User talk:Carter57 (page does not exist)&quot;&gt;talk&lt;/a&gt;)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:49, 2 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l755&quot;&gt;Line 755:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 755:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			args = { group = i18n.refgroup }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			args = { group = i18n.refgroup }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local function setBucketData(datas, args)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	args.name = args.name or mw.title.getCurrentTitle().text&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	local image, link = getImageAndLink(args, &#039;mob&#039;)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	for _, data in ipairs(datas) do&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local jsonData = mw.text.jsonEncode({&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			name = args.name,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			image = image,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			linktext = link,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			java = data.java,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			bedrock = data.bedrock,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			notes = data.notes&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		}, mw.text.JSON_PRESERVE_KEYS)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local bucketObject = {&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			item = data.name,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			json = jsonData&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		bucket(i18n.bucket).put(bucketObject)&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	end&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key modded_wiki:diff:1.41:old-14095:rev-14096:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Carter57</name></author>
	</entry>
	<entry>
		<id>https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14095&amp;oldid=prev</id>
		<title>Carter57: Attempted fix</title>
		<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14095&amp;oldid=prev"/>
		<updated>2026-06-02T02:48:13Z</updated>

		<summary type="html">&lt;p&gt;Attempted fix&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:48, 2 June 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l755&quot;&gt;Line 755:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 755:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			args = { group = i18n.refgroup }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;			args = { group = i18n.refgroup }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}))&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;		}))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;end&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;local function setBucketData(datas, args)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	args.name = args.name or mw.title.getCurrentTitle().text&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	local image, link = getImageAndLink(args, &#039;mob&#039;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	for _, data in ipairs(datas) do&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local jsonData = mw.text.jsonEncode({&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			name = args.name,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			image = image,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			linktext = link,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			java = data.java,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			bedrock = data.bedrock,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			notes = data.notes&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		}, mw.text.JSON_PRESERVE_KEYS)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		local bucketObject = {&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			item = data.name,&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;			json = jsonData&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		}&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;		bucket(i18n.bucket).put(bucketObject)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;	end&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;end&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key modded_wiki:diff:1.41:old-14093:rev-14095:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Carter57</name></author>
	</entry>
	<entry>
		<id>https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14093&amp;oldid=prev</id>
		<title>Carter57: Created page with &quot;local i18n = { 	imageSprite = { 		item = &#039;Invicon&#039;, 		mob = &#039;EntitySprite&#039; 	}, 	headerThing = { 		item = &#039;Item&#039;, 		mob = &#039;Mob&#039; 	}, 	headerWithoutLooting = &#039;Default&#039;, 	headerLooting1 = &#039;Looting I&#039;, 	headerLooting2 = &#039;Looting II&#039;, 	headerLooting3 = &#039;Looting III&#039;, 	headerOverview = &#039;Quantity / Chance / Average&#039;, 	headerDropAmount = &#039;Amount&#039;, 	headerDistribution = &#039;Probability&#039;, 	headerAverage = &#039;Average&#039;, 	headerTotal = { 		item = &#039;Killed&#039;, 		mob = &#039;Drops&#039; 	}, 	headerExpect...&quot;</title>
		<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:DropTable&amp;diff=14093&amp;oldid=prev"/>
		<updated>2026-06-02T02:45:11Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local i18n = { 	imageSprite = { 		item = &amp;#039;Invicon&amp;#039;, 		mob = &amp;#039;EntitySprite&amp;#039; 	}, 	headerThing = { 		item = &amp;#039;Item&amp;#039;, 		mob = &amp;#039;Mob&amp;#039; 	}, 	headerWithoutLooting = &amp;#039;Default&amp;#039;, 	headerLooting1 = &amp;#039;Looting I&amp;#039;, 	headerLooting2 = &amp;#039;Looting II&amp;#039;, 	headerLooting3 = &amp;#039;Looting III&amp;#039;, 	headerOverview = &amp;#039;Quantity / Chance / Average&amp;#039;, 	headerDropAmount = &amp;#039;Amount&amp;#039;, 	headerDistribution = &amp;#039;Probability&amp;#039;, 	headerAverage = &amp;#039;Average&amp;#039;, 	headerTotal = { 		item = &amp;#039;Killed&amp;#039;, 		mob = &amp;#039;Drops&amp;#039; 	}, 	headerExpect...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local i18n = {&lt;br /&gt;
	imageSprite = {&lt;br /&gt;
		item = &amp;#039;Invicon&amp;#039;,&lt;br /&gt;
		mob = &amp;#039;EntitySprite&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	headerThing = {&lt;br /&gt;
		item = &amp;#039;Item&amp;#039;,&lt;br /&gt;
		mob = &amp;#039;Mob&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	headerWithoutLooting = &amp;#039;Default&amp;#039;,&lt;br /&gt;
	headerLooting1 = &amp;#039;Looting I&amp;#039;,&lt;br /&gt;
	headerLooting2 = &amp;#039;Looting II&amp;#039;,&lt;br /&gt;
	headerLooting3 = &amp;#039;Looting III&amp;#039;,&lt;br /&gt;
	headerOverview = &amp;#039;Quantity / Chance / Average&amp;#039;,&lt;br /&gt;
	headerDropAmount = &amp;#039;Amount&amp;#039;,&lt;br /&gt;
	headerDistribution = &amp;#039;Probability&amp;#039;,&lt;br /&gt;
	headerAverage = &amp;#039;Average&amp;#039;,&lt;br /&gt;
	headerTotal = {&lt;br /&gt;
		item = &amp;#039;Killed&amp;#039;,&lt;br /&gt;
		mob = &amp;#039;Drops&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	headerExpectation = {&lt;br /&gt;
		item = &amp;#039;Expected Drops&amp;#039;,&lt;br /&gt;
		mob = &amp;#039;Expected Number of Kills&amp;#039;&lt;br /&gt;
	},&lt;br /&gt;
	tabOverviewDecimal = &amp;#039;Decimal&amp;#039;,&lt;br /&gt;
	tabOverviewFraction = &amp;#039;Fraction&amp;#039;,&lt;br /&gt;
	tabDistribution = &amp;#039;Distribution&amp;#039;,&lt;br /&gt;
	tabCalculator = &amp;#039;Expectation&amp;#039;,&lt;br /&gt;
	titlejava = &amp;quot;&amp;#039;&amp;#039;[[Java Edition]]&amp;#039;&amp;#039;:&amp;quot;,&lt;br /&gt;
	titlebedrock = &amp;quot;&amp;#039;&amp;#039;[[Bedrock Edition]]&amp;#039;&amp;#039;:&amp;quot;,&lt;br /&gt;
	notePlayerOrPet = &amp;#039;Only when killed by a [[player]] or a tamed [[wolf]].&amp;#039;,&lt;br /&gt;
	notePlayerOnly = &amp;#039;Only when killed by a [[player]].&amp;#039;,&lt;br /&gt;
	noteBurnOrFireAspect = &amp;#039;Only when on fire or killed with a weapon enchanted with [[Fire Aspect]].&amp;#039;,&lt;br /&gt;
	noteBurnOnly = &amp;#039;Only when on fire.&amp;#039;,&lt;br /&gt;
	noteNotBurnOrFireAspect = &amp;quot;Only when &amp;#039;&amp;#039;not&amp;#039;&amp;#039; on fire and &amp;#039;&amp;#039;not&amp;#039;&amp;#039; killed with a weapon enchanted with [[Fire Aspect]].&amp;quot;,&lt;br /&gt;
	noteNotBurnOnly = &amp;quot;Only when &amp;#039;&amp;#039;not&amp;#039;&amp;#039; on fire.&amp;quot;,&lt;br /&gt;
	refgroup = &amp;#039;FN&amp;#039;, -- [[MediaWiki:Cite link label group-FN]]&lt;br /&gt;
	style = &amp;#039;DropTable/styles.css&amp;#039;, -- [[Template:DropTable/styles.css]]&lt;br /&gt;
	bucket = &amp;#039;droptable&amp;#039;, -- [[Bucket:droptable]]&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
local Frac = {}&lt;br /&gt;
&lt;br /&gt;
-- Defined types:&lt;br /&gt;
-- * frac: { numerator = numerator, denominator = denominator }, used on Frac.*( ..., fraction, ... )&lt;br /&gt;
&lt;br /&gt;
local function GCD( x, y )	-- get Greatest Common Divisor (GCD)&lt;br /&gt;
	-- Test&lt;br /&gt;
	-- gcd( 0, 0 ) = undef&lt;br /&gt;
	if type( x ) ~= &amp;#039;number&amp;#039; or type( y ) ~= &amp;#039;number&amp;#039; or ( x == 0 and y == 0 ) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	x = math.abs( x )&lt;br /&gt;
	y = math.abs( y )&lt;br /&gt;
&lt;br /&gt;
	-- Improve precision&lt;br /&gt;
	local multiplier = 1&lt;br /&gt;
	while x % 1 ~= 0 or y % 1 ~= 0 do&lt;br /&gt;
		x = x * 10&lt;br /&gt;
		y = y * 10&lt;br /&gt;
		multiplier = multiplier * 10&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function euclidean( x, y )&lt;br /&gt;
		return y == 0 and x or euclidean( y, x % y )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return euclidean( x, y ) / multiplier&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function LCM( x, y )	-- get Least Common Multiple (LCM)&lt;br /&gt;
	-- Test&lt;br /&gt;
	local GCD = GCD( x, y )&lt;br /&gt;
	if not GCD then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return x * y / GCD&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Start of Frac: Fraction Library&lt;br /&gt;
local fracMetatable = {&lt;br /&gt;
	__index    = Frac,&lt;br /&gt;
	__add      = function ( fraction1, fraction2 ) return Frac.add( fraction1, fraction2 )      end,&lt;br /&gt;
	__sub      = function ( fraction1, fraction2 ) return Frac.sub( fraction1, fraction2 )      end,&lt;br /&gt;
	__mul      = function ( fraction1, fraction2 ) return Frac.mul( fraction1, fraction2 )      end,&lt;br /&gt;
	__div      = function ( fraction1, fraction2 ) return Frac.div( fraction1, fraction2 )      end,&lt;br /&gt;
	__pow      = function ( fraction, n )          return Frac.pow( fraction, n )               end,&lt;br /&gt;
	__unm      = function ( fraction )             return Frac.neg( fraction )                  end,&lt;br /&gt;
	__eq       = function ( fraction1, fraction2 ) return Frac.cmp( fraction1, fraction2 ) == 0 end,&lt;br /&gt;
	__lt       = function ( fraction1, fraction2 ) return Frac.cmp( fraction1, fraction2 ) &amp;lt; 0  end,&lt;br /&gt;
	__le       = function ( fraction1, fraction2 ) return Frac.cmp( fraction1, fraction2 ) &amp;lt;= 0 end,&lt;br /&gt;
	__tostring = function ( fraction )             return Frac.display( fraction )              end,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Tests&lt;br /&gt;
function Frac.isFrac( fraction )	-- Check if it is a valid fraction&lt;br /&gt;
	return not ( type( fraction ) ~= &amp;#039;table&amp;#039; or not fraction.numerator or not fraction.denominator or fraction.denominator &amp;lt;= 0 or fraction.numerator % 1 ~= 0 or fraction.denominator % 1 ~= 0 )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Create a fraction directly&lt;br /&gt;
function Frac.new( numerator, denominator )&lt;br /&gt;
	if type( numerator ) ~= &amp;#039;number&amp;#039; or denominator and ( type( denominator ) ~= &amp;#039;number&amp;#039; or denominator == 0 ) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local fraction = denominator and ( denominator &amp;lt; 0 and { numerator = - numerator, denominator = - denominator } or { numerator = numerator, denominator = denominator } ) or Frac.fromDec( numerator )&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	setmetatable( fraction, fracMetatable )&lt;br /&gt;
	return fraction&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.fromDec( decimal )	-- Convert decimal to fraction&lt;br /&gt;
	if type( decimal ) ~= &amp;#039;number&amp;#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local numerator = decimal&lt;br /&gt;
	local denominator = 1&lt;br /&gt;
	while #tostring(numerator % 1) ~= 1 do&lt;br /&gt;
		numerator = numerator * 10&lt;br /&gt;
		denominator = denominator * 10&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Frac.reduce( Frac.new( math.floor(numerator + 0.5), denominator ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.toDec( fraction )	-- Convert fraction to decimal&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return fraction.numerator / fraction.denominator&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Basic calculations&lt;br /&gt;
function Frac.neg( fraction )	-- Take the negative fraction&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Frac.new( - fraction.numerator, fraction.denominator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.inv( fraction )	-- Take the inversed fraction&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if fraction.numerator == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ( fraction.numerator &amp;lt; 0 ) and Frac.new( - fraction.denominator, - fraction.numerator ) or Frac.new( fraction.denominator, fraction.numerator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.mul( fraction1, fraction2 )	-- Fractions multiplication&lt;br /&gt;
	fraction1 = Frac.isFrac( fraction1 ) and fraction1 or Frac.new( fraction1 )&lt;br /&gt;
	fraction2 = Frac.isFrac( fraction2 ) and fraction2 or Frac.new( fraction2 )&lt;br /&gt;
	if Frac.isFrac( fraction1 ) == false or Frac.isFrac( fraction2 ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Frac.new( fraction1.numerator * fraction2.numerator, fraction1.denominator * fraction2.denominator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.div( fraction1, fraction2 )	-- Fractions division&lt;br /&gt;
	fraction2 = Frac.isFrac( fraction2 ) and fraction2 or Frac.new( fraction2 )&lt;br /&gt;
	return Frac.mul( fraction1, Frac.inv( fraction2 ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.pow( fraction, n )	-- Fractions exponentiation&lt;br /&gt;
	if Frac.isFrac( fraction ) == false or n % 1 ~= 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ( n &amp;lt; 0 ) and Frac.new( fraction.denominator ^ ( - n ), fraction.numerator ^ ( -n ) ) or Frac.new( fraction.numerator ^ n, fraction.denominator ^ n )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Advanced calculation&lt;br /&gt;
function Frac.expand( fraction, newDenominator )	-- Fractions expansion&lt;br /&gt;
	if Frac.isFrac( fraction ) == false or type( newDenominator ) ~= &amp;#039;number&amp;#039; or ( type( newDenominator ) == &amp;#039;number&amp;#039; and newDenominator % 1 ~= 0 ) or newDenominator &amp;lt;= 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local newNumerator = fraction.numerator * newDenominator / fraction.denominator&lt;br /&gt;
	if newNumerator % 1 ~= 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Frac.new( newNumerator, newDenominator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.reduce( fraction )	-- Fractions reduction (to simplest)&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Frac.expand( fraction, fraction.denominator / GCD( fraction.denominator, fraction.numerator ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.common( fractionList )	-- Get fractions with the common denominator&lt;br /&gt;
	if type( fractionList ) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local candidates = {}&lt;br /&gt;
	local denominators = {}&lt;br /&gt;
	for _, fraction in pairs( fractionList ) do&lt;br /&gt;
		if Frac.isFrac( fraction ) == false then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			table.insert( candidates, fraction )&lt;br /&gt;
			table.insert( denominators, fraction.denominator )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if #candidates == 1 then&lt;br /&gt;
		return candidates&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local lcm = 1&lt;br /&gt;
	for _, denominator in pairs( denominators ) do&lt;br /&gt;
		lcm = LCM( denominator, lcm )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for _, fraction in pairs( candidates ) do&lt;br /&gt;
		table.insert( results, Frac.expand( fraction, lcm ) )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return results&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Basic calculations, with dependencies&lt;br /&gt;
function Frac.add( fraction1, fraction2 )	-- Fractions addition&lt;br /&gt;
	fraction1 = Frac.isFrac( fraction1 ) and fraction1 or Frac.new( fraction1 )&lt;br /&gt;
	fraction2 = Frac.isFrac( fraction2 ) and fraction2 or Frac.new( fraction2 )&lt;br /&gt;
	if Frac.isFrac( fraction1 ) == false or Frac.isFrac( fraction2 ) == false then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local fractions = Frac.common{ fraction1, fraction2 }&lt;br /&gt;
	return Frac.new( fractions[ 1 ].numerator + fractions[ 2 ].numerator, fractions[ 1 ].denominator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.sub( fraction1, fraction2 )	-- Fractions subtraction&lt;br /&gt;
	fraction2 = Frac.isFrac( fraction2 ) and fraction2 or Frac.new( fraction2 )&lt;br /&gt;
	return Frac.add( fraction1, Frac.neg( fraction2 ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Frac.cmp( fraction1, fraction2 )	-- Compare fractions&lt;br /&gt;
	return Frac.sub( fraction1, fraction2 ).numerator&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Formattings to human readable&lt;br /&gt;
function Frac.display( fraction, isReduced, isMixed )	-- Convert fractions to human-readable style&lt;br /&gt;
	if Frac.isFrac( fraction ) == false then&lt;br /&gt;
		return &amp;#039;&amp;#039; &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if fraction.numerator == 0 then&lt;br /&gt;
		return &amp;#039;0&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix = &amp;#039;&amp;#039;&lt;br /&gt;
	if fraction.numerator &amp;lt; 0 then&lt;br /&gt;
		prefix = prefix .. &amp;#039;-&amp;#039;&lt;br /&gt;
		fraction = Frac.neg( fraction )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if isReduced then&lt;br /&gt;
		fraction = Frac.reduce( fraction )&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local numerator = fraction.numerator&lt;br /&gt;
	local denominator = fraction.denominator&lt;br /&gt;
	if denominator == 1 then&lt;br /&gt;
		return prefix .. tostring( numerator )&lt;br /&gt;
	end&lt;br /&gt;
	if numerator == denominator then&lt;br /&gt;
		return prefix .. &amp;#039;1&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	if isMixed and numerator &amp;gt; denominator then&lt;br /&gt;
		prefix = prefix .. math.floor( numerator / denominator )&lt;br /&gt;
		numerator = numerator % denominator&lt;br /&gt;
		if numerator == 0 then&lt;br /&gt;
			return prefix&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return string.format( &amp;#039;%s&amp;lt;sup&amp;gt;%s&amp;lt;/sup&amp;gt;&amp;amp;frasl;&amp;lt;sub&amp;gt;%s&amp;lt;/sub&amp;gt;&amp;#039;, prefix, numerator, denominator )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
local Distr = {}&lt;br /&gt;
Distr.mt = {}&lt;br /&gt;
function Distr.mt.__index( t, k )&lt;br /&gt;
	if type( k ) == &amp;#039;number&amp;#039; then return Frac.new( 0 ) end&lt;br /&gt;
	return Distr[ k ]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.mt.__newindex( t, k, v )&lt;br /&gt;
	v = Frac.isFrac( v ) and v or Frac.new( v )&lt;br /&gt;
	if type( k ) ~= &amp;#039;number&amp;#039; or v == nil then error() end&lt;br /&gt;
	if v == Frac.new( 0 ) then return end&lt;br /&gt;
	return rawset( t, k, v )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.new( t )&lt;br /&gt;
	t = t or {}&lt;br /&gt;
	local distribution = {}&lt;br /&gt;
	setmetatable( distribution, Distr.mt )&lt;br /&gt;
	for k, v in pairs( t ) do&lt;br /&gt;
		distribution[ k ] = v&lt;br /&gt;
	end&lt;br /&gt;
	return distribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.shift( distribution, s )&lt;br /&gt;
	local newDistribution = Distr.new()&lt;br /&gt;
	for i, v in pairs( distribution ) do&lt;br /&gt;
		newDistribution[ i + s ] = v&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.limitRange( distribution, min, max )&lt;br /&gt;
	local newDistribution = Distr.new()&lt;br /&gt;
	for i, v in pairs( distribution ) do&lt;br /&gt;
		if max and i &amp;gt;= max then&lt;br /&gt;
			newDistribution[ max ] = newDistribution[ max ] + v&lt;br /&gt;
		elseif min and i &amp;lt;= min then&lt;br /&gt;
			newDistribution[ min ] = newDistribution[ min ] + v&lt;br /&gt;
		else&lt;br /&gt;
			newDistribution[ i ] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.add( distribution1, distribution2 )&lt;br /&gt;
	local newDistribution = distribution1:new()&lt;br /&gt;
	for i, v in pairs( distribution2 ) do&lt;br /&gt;
		newDistribution[ i ] = newDistribution[ i ] + v&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.multiply( distribution, x )&lt;br /&gt;
	local newDistribution = Distr.new()&lt;br /&gt;
	for i, v in pairs( distribution ) do&lt;br /&gt;
		newDistribution[ i ] = v * x&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Distr.expectation( distribution )&lt;br /&gt;
	local expectation = Frac.new( 0 )&lt;br /&gt;
	for i, v in pairs( distribution ) do&lt;br /&gt;
		expectation = expectation + v * i&lt;br /&gt;
	end&lt;br /&gt;
	return expectation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function Distr.times( distribution, n )&lt;br /&gt;
	local newDistribution = Distr.new({[0] = 1})&lt;br /&gt;
	for i = 1, n do&lt;br /&gt;
		newDistribution = newDistribution:addIncrease( distribution )&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.addIncrease( distribution1, distribution2 )&lt;br /&gt;
	local newDistribution = Distr.new()&lt;br /&gt;
	for i, v in pairs( distribution2 ) do&lt;br /&gt;
		newDistribution = newDistribution:add( distribution1:shift( i ):multiply( v ) )&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.rolls( distribution1, distribution2 )&lt;br /&gt;
	local newDistribution = Distr.new()&lt;br /&gt;
	for i, v in pairs( distribution2 ) do&lt;br /&gt;
		newDistribution = newDistribution:add( distribution1:times( i ):multiply( v ) )&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.getUniform( min, max )&lt;br /&gt;
	local value = Frac.new( 1, max - min + 1 )&lt;br /&gt;
	local distribution = Distr.new()&lt;br /&gt;
	for i = min, max do&lt;br /&gt;
		distribution[ i ] = value&lt;br /&gt;
	end&lt;br /&gt;
	return distribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.getLootingIncrease( level, min, max )&lt;br /&gt;
	min = min or 0&lt;br /&gt;
	max = max or min + 1&lt;br /&gt;
	min = min * level&lt;br /&gt;
	max = max * level&lt;br /&gt;
	if max - min &amp;lt; 2 then&lt;br /&gt;
		return Distr.getUniform( min, max )&lt;br /&gt;
	end&lt;br /&gt;
	local distribution = Distr.new()&lt;br /&gt;
	local value = Frac.new( 1, max - min )&lt;br /&gt;
	for i = min, max do&lt;br /&gt;
		distribution[ i ] = value&lt;br /&gt;
	end&lt;br /&gt;
	distribution[ min ] = value / 2&lt;br /&gt;
	distribution[ max ] = value / 2&lt;br /&gt;
	return distribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function Distr.addLootingIncrease( distribution1, distribution2, edition )&lt;br /&gt;
	local base = distribution1:limitRange(0, nil)&lt;br /&gt;
	local backup = base[ 0 ]&lt;br /&gt;
	if edition == &amp;#039;bedrock&amp;#039; then&lt;br /&gt;
		base[ 0 ] = 0 -- MCPE-35307: Looting doesn&amp;#039;t work when the mob drops nothing&lt;br /&gt;
	end&lt;br /&gt;
	local newDistribution = base:addIncrease(distribution2)&lt;br /&gt;
	if edition == &amp;#039;bedrock&amp;#039; then&lt;br /&gt;
		newDistribution[ 0 ] = newDistribution[ 0 ] + backup&lt;br /&gt;
	end&lt;br /&gt;
	return newDistribution&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local function calculateDistributions( args, edition )&lt;br /&gt;
	local function parseRange(str)&lt;br /&gt;
		local n = tonumber(str)&lt;br /&gt;
		if n then return {min = n, max = n} end&lt;br /&gt;
		local min, max = str:match(&amp;#039;^%s*(%-?%d+)%s*%-%s*(%-?%d+)%s*$&amp;#039;)&lt;br /&gt;
		min = tonumber(min)&lt;br /&gt;
		max = tonumber(max)&lt;br /&gt;
		if min and max and min &amp;lt;= max then return {min = min, max = max} end&lt;br /&gt;
		error(string.format(&amp;quot;&amp;#039;%s&amp;#039; isn&amp;#039;t a range!&amp;quot;, str))&lt;br /&gt;
	end&lt;br /&gt;
	local function parseProbability(str)&lt;br /&gt;
		local n = Frac.fromDec(tonumber(str)) or Frac.div(tonumber(str:match(&amp;#039;(.*)%%%s*$&amp;#039;)), 100)&lt;br /&gt;
		if n then return n end&lt;br /&gt;
		local numerator, denominator = str:match(&amp;#039;^%s*(%-?%d+)%s*/%s*(%-?%d+)%s*$&amp;#039;)&lt;br /&gt;
		numerator = tonumber(numerator)&lt;br /&gt;
		denominator = tonumber(denominator)&lt;br /&gt;
		local frac = Frac.new(numerator, denominator)&lt;br /&gt;
		if frac then return frac end&lt;br /&gt;
		error(string.format(&amp;quot;&amp;#039;%s&amp;#039; isn&amp;#039;t a probability!&amp;quot;, str))&lt;br /&gt;
	end&lt;br /&gt;
	local quantity = parseRange(args.quantity or 1)&lt;br /&gt;
	local lootingquantity = parseRange(args.lootingquantity or 0)&lt;br /&gt;
	local dropchance = parseProbability(args.dropchance or 1)&lt;br /&gt;
	local lootingchance = parseProbability(args.lootingchance or 0)&lt;br /&gt;
	local multiplychance = parseProbability(args.multiplychance or 1)&lt;br /&gt;
	local rolls = parseRange(args.rolls or 1)&lt;br /&gt;
	local limit = tonumber(args.limit)&lt;br /&gt;
&lt;br /&gt;
	if edition == &amp;#039;bedrock&amp;#039; then&lt;br /&gt;
		limit = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local independent = {}&lt;br /&gt;
	for _, sub in ipairs(args.independent or {}) do&lt;br /&gt;
		table.insert(independent, calculateDistributions(sub, edition))&lt;br /&gt;
	end&lt;br /&gt;
	local mutuallyexclusive = {}&lt;br /&gt;
	for _, sub in ipairs(args.mutuallyexclusive or {}) do&lt;br /&gt;
		table.insert(mutuallyexclusive, calculateDistributions(sub, edition))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local distributions = {}&lt;br /&gt;
	for level = 0, 3 do&lt;br /&gt;
		local lootingIncrease = Distr.getLootingIncrease(level, lootingquantity.min, lootingquantity.max)&lt;br /&gt;
		local chance = (dropchance + lootingchance * level) * multiplychance&lt;br /&gt;
		local distribution = Distr.getUniform(quantity.min, quantity.max)&lt;br /&gt;
			:addLootingIncrease(lootingIncrease, edition)&lt;br /&gt;
			:rolls(Distr.new{[0] = 1 - chance, [1] = chance})&lt;br /&gt;
			:limitRange(0, limit)&lt;br /&gt;
			:rolls(Distr.getUniform(rolls.min, rolls.max))&lt;br /&gt;
		for _, sub in ipairs(independent) do&lt;br /&gt;
			distribution = distribution:addIncrease(sub[level])&lt;br /&gt;
		end&lt;br /&gt;
		for _, sub in ipairs(mutuallyexclusive) do&lt;br /&gt;
			local nodropchance1 = distribution[0]&lt;br /&gt;
			local nodropchance2 = sub[level][0]&lt;br /&gt;
			distribution = distribution:add(sub[level])&lt;br /&gt;
			distribution[0] = nodropchance1 + nodropchance2 - Frac.new(1)&lt;br /&gt;
		end&lt;br /&gt;
		distributions[level] = distribution&lt;br /&gt;
	end&lt;br /&gt;
	return distributions&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getImageAndLink(args, mode)&lt;br /&gt;
	local link = args.link or args.name&lt;br /&gt;
	local image = require([[Module:SpriteFile]]).sprite{&lt;br /&gt;
		args.image or args.name,&lt;br /&gt;
		name = args.spritetype or i18n.imageSprite[mode],&lt;br /&gt;
		link = link,&lt;br /&gt;
		size = 32,&lt;br /&gt;
		align = &amp;#039;middle&amp;#039;,&lt;br /&gt;
		keepcase = mode == &amp;#039;item&amp;#039;&lt;br /&gt;
	}&lt;br /&gt;
	local displayname = args.displayname or args.name&lt;br /&gt;
	local linktext = string.format(&amp;#039;[[%s|%s]]&amp;#039;, link, displayname)&lt;br /&gt;
	return image, linktext&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getDropData(args, edition)&lt;br /&gt;
	local data = {}&lt;br /&gt;
	for level, distribution in pairs(calculateDistributions(args, edition)) do&lt;br /&gt;
		local quantity = {}&lt;br /&gt;
		for k, v in pairs(distribution) do&lt;br /&gt;
			if v ~= Frac.new(0) then table.insert(quantity, k) end&lt;br /&gt;
		end&lt;br /&gt;
		table.sort(quantity)&lt;br /&gt;
		local min = quantity[1]&lt;br /&gt;
		local max = quantity[#quantity]&lt;br /&gt;
		local from = min&lt;br /&gt;
		local to&lt;br /&gt;
		local quantitytext = &amp;#039;&amp;#039;&lt;br /&gt;
		local function range()&lt;br /&gt;
			quantitytext = quantitytext .. (from == min and &amp;#039;&amp;#039; or &amp;#039; / &amp;#039;)&lt;br /&gt;
				.. (from == to and to or (from .. &amp;#039;&amp;amp;ndash;&amp;#039; .. to))&lt;br /&gt;
		end&lt;br /&gt;
		for _, num in ipairs(quantity) do&lt;br /&gt;
			if to and to ~= num - 1 then&lt;br /&gt;
				range()&lt;br /&gt;
				from = num&lt;br /&gt;
			end&lt;br /&gt;
			to = num&lt;br /&gt;
		end&lt;br /&gt;
		range()&lt;br /&gt;
		data[level] = {&lt;br /&gt;
			distribution = distribution,&lt;br /&gt;
			average = distribution:expectation():reduce(),&lt;br /&gt;
			dropchance = (1 - distribution[0]):reduce(),&lt;br /&gt;
			min = min,&lt;br /&gt;
			max = max,&lt;br /&gt;
			quantitytext = quantitytext&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function linesToDatas(lines, notes, edition)&lt;br /&gt;
	local datas = {}&lt;br /&gt;
	for _, line in ipairs(lines) do&lt;br /&gt;
		local args = mw.text.jsonDecode(line)&lt;br /&gt;
		local data = { name = args.name }&lt;br /&gt;
		data.image, data.linktext = getImageAndLink(args, &amp;#039;item&amp;#039;)&lt;br /&gt;
		if edition ~= &amp;#039;bedrock&amp;#039; and args.edition ~= &amp;#039;bedrock&amp;#039; then&lt;br /&gt;
			data.java = getDropData(args, &amp;#039;java&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if edition ~= &amp;#039;java&amp;#039; and args.edition ~= &amp;#039;java&amp;#039; then&lt;br /&gt;
			data.bedrock = getDropData(args, &amp;#039;bedrock&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local notenames = args.notes and mw.text.split(args.notes, &amp;#039;,&amp;#039;) or {}&lt;br /&gt;
		data.notes = {}&lt;br /&gt;
		for _, name in ipairs(notenames) do&lt;br /&gt;
			table.insert(data.notes, notes[name])&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(datas, data)&lt;br /&gt;
	end&lt;br /&gt;
	return datas&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createOverviewTable(format, datas, noteTexts, mode, edition)&lt;br /&gt;
	local wikitable = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(i18n.headerThing[mode]):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;12&amp;#039;):wikitext(i18n.headerOverview):done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;3&amp;#039;):wikitext(i18n.headerWithoutLooting):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;3&amp;#039;):wikitext(i18n.headerLooting1):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;3&amp;#039;):wikitext(i18n.headerLooting2):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;3&amp;#039;):wikitext(i18n.headerLooting3):done()&lt;br /&gt;
			:done()&lt;br /&gt;
&lt;br /&gt;
	for i, data in ipairs(datas) do&lt;br /&gt;
		if data[edition] then&lt;br /&gt;
			local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(data.image):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(data.linktext .. noteTexts[i]):done()&lt;br /&gt;
&lt;br /&gt;
			for level = 0, 3 do&lt;br /&gt;
				local info = data[edition][level]&lt;br /&gt;
				row:tag(&amp;#039;td&amp;#039;):css(&amp;#039;text-wrap-mode&amp;#039;, &amp;#039;nowrap&amp;#039;):wikitext(info.quantitytext):done()&lt;br /&gt;
				if format == &amp;#039;decimal&amp;#039; then&lt;br /&gt;
					row:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;#039;%.2f%%&amp;#039;, Frac.toDec(info.dropchance) * 100)):done()&lt;br /&gt;
					row:tag(&amp;#039;td&amp;#039;):wikitext(string.format(&amp;#039;%.2f&amp;#039;, Frac.toDec(info.average))):done()&lt;br /&gt;
				else&lt;br /&gt;
					row:tag(&amp;#039;td&amp;#039;):wikitext(Frac.display(info.dropchance)):done()&lt;br /&gt;
					row:tag(&amp;#039;td&amp;#039;):wikitext(Frac.display(info.average)):done()&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			wikitable:node(row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(wikitable)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createDistributionsTable(datas, noteTexts, mode, edition)&lt;br /&gt;
	local wikitable = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(i18n.headerThing[mode]):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(i18n.headerDropAmount):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;4&amp;#039;):wikitext(i18n.headerDistribution):done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerWithoutLooting):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting1):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting2):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting3):done()&lt;br /&gt;
			:done()&lt;br /&gt;
	for i, data in ipairs(datas) do&lt;br /&gt;
		if data[edition] then&lt;br /&gt;
			local min = math.huge&lt;br /&gt;
			local max = -math.huge&lt;br /&gt;
			for level = 0, 3 do&lt;br /&gt;
				min = math.min(min, data[edition][level].min)&lt;br /&gt;
				max = math.max(max, data[edition][level].max)&lt;br /&gt;
			end&lt;br /&gt;
			local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, max - min + 2):wikitext(data.image):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, max - min + 2):wikitext(data.linktext .. noteTexts[i]):done()&lt;br /&gt;
&lt;br /&gt;
			for drops = min, max do&lt;br /&gt;
				row:tag(&amp;#039;td&amp;#039;):wikitext(tostring(drops)):done()&lt;br /&gt;
				for level = 0, 3 do&lt;br /&gt;
					local probability = data[edition][level].distribution[drops] or Frac.new(0)&lt;br /&gt;
					row:tag(&amp;#039;td&amp;#039;):wikitext(&lt;br /&gt;
						probability == Frac.new(0) and &amp;#039;0&amp;#039; or&lt;br /&gt;
						string.format(&amp;#039;%s (%.2f%%)&amp;#039;, Frac.display(probability, true), Frac.toDec(probability) * 100)&lt;br /&gt;
					):done()&lt;br /&gt;
				end&lt;br /&gt;
				wikitable:node(row)&lt;br /&gt;
				row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
			row:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerAverage):done()&lt;br /&gt;
			for level = 0, 3 do&lt;br /&gt;
				local average = data[edition][level].average&lt;br /&gt;
				row:tag(&amp;#039;th&amp;#039;):wikitext(string.format(&amp;#039;%s (%.2f)&amp;#039;, Frac.display(average), Frac.toDec(average))):done()&lt;br /&gt;
			end&lt;br /&gt;
			wikitable:node(row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(wikitable)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createCalculatorTable(datas, noteTexts, mode, edition)&lt;br /&gt;
	local wikitable = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable&amp;#039;):addClass(&amp;#039;calculator-container&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;)&lt;br /&gt;
				:wikitext(mw.getCurrentFrame():expandTemplate{ title = &amp;#039;Simplecalc label&amp;#039;, args = {&lt;br /&gt;
					label = i18n.headerTotal[mode],&lt;br /&gt;
					[&amp;#039;for&amp;#039;] = &amp;#039;count&amp;#039;&lt;br /&gt;
				}})&lt;br /&gt;
				:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, &amp;#039;4&amp;#039;)&lt;br /&gt;
				:wikitext(mw.getCurrentFrame():expandTemplate{ title = &amp;#039;simplecalc&amp;#039;, args = {&lt;br /&gt;
					type = &amp;#039;number&amp;#039;,&lt;br /&gt;
					id = &amp;#039;count&amp;#039;,&lt;br /&gt;
					min = 0,&lt;br /&gt;
					step = 1,&lt;br /&gt;
					default = 1&lt;br /&gt;
				}})&lt;br /&gt;
				:done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(i18n.headerThing[mode]):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;4&amp;#039;):wikitext(i18n.headerExpectation[mode]):done()&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerWithoutLooting):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting1):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting2):done()&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;):wikitext(i18n.headerLooting3):done()&lt;br /&gt;
			:done()&lt;br /&gt;
&lt;br /&gt;
	for i, data in ipairs(datas) do&lt;br /&gt;
		if data[edition] then&lt;br /&gt;
			local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(data.image):done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;):wikitext(data.linktext .. noteTexts[i]):done()&lt;br /&gt;
&lt;br /&gt;
			for level = 0, 3 do&lt;br /&gt;
				local average = data[edition][level].average&lt;br /&gt;
				if mode == &amp;#039;mob&amp;#039; then&lt;br /&gt;
					average = Frac.inv(average)&lt;br /&gt;
				end&lt;br /&gt;
				row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:wikitext(mw.getCurrentFrame():expandTemplate{ title = &amp;#039;simplecalc&amp;#039;, args = {&lt;br /&gt;
						type = &amp;#039;plain&amp;#039;,&lt;br /&gt;
						formula = string.format(&amp;#039;count*(%s/%s)&amp;#039;, average.numerator, average.denominator),&lt;br /&gt;
						decimals = 2,&lt;br /&gt;
						default = string.format(&amp;#039;%.2f&amp;#039;, Frac.toDec(average))&lt;br /&gt;
					}})&lt;br /&gt;
					:done()&lt;br /&gt;
			end&lt;br /&gt;
			wikitable:node(row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(wikitable)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createTabs (datas, mode, edition)&lt;br /&gt;
	local f = mw.getCurrentFrame()&lt;br /&gt;
	local noteTexts = {}&lt;br /&gt;
	for i, data in pairs(datas) do&lt;br /&gt;
		local noteText = &amp;#039;&amp;#039;&lt;br /&gt;
		if data[edition] then&lt;br /&gt;
			for _, note in ipairs(data.notes) do&lt;br /&gt;
				local ref = note.name and note or note[edition]&lt;br /&gt;
				if ref then&lt;br /&gt;
					noteText = noteText .. f:extensionTag{&lt;br /&gt;
						name = &amp;#039;ref&amp;#039;,&lt;br /&gt;
						content = ref.content,&lt;br /&gt;
						args = { name = ref.name, group = i18n.refgroup }&lt;br /&gt;
					}&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		noteTexts[i] = noteText&lt;br /&gt;
	end&lt;br /&gt;
	local tabber = f:extensionTag(&amp;#039;tabber&amp;#039;, string.format(&lt;br /&gt;
		&amp;#039;%s=%s|-|%s=%s|-|%s=%s|-|%s=%s&amp;#039;,&lt;br /&gt;
		i18n.tabOverviewDecimal,&lt;br /&gt;
		createOverviewTable(&amp;#039;decimal&amp;#039;, datas, noteTexts, mode, edition),&lt;br /&gt;
		i18n.tabOverviewFraction,&lt;br /&gt;
		createOverviewTable(&amp;#039;fraction&amp;#039;, datas, noteTexts, mode, edition),&lt;br /&gt;
		i18n.tabDistribution,&lt;br /&gt;
		createDistributionsTable(datas, noteTexts, mode, edition),&lt;br /&gt;
		i18n.tabCalculator,&lt;br /&gt;
		createCalculatorTable(datas, noteTexts, mode, edition)&lt;br /&gt;
	)) &lt;br /&gt;
	return require(&amp;#039;Module:TSLoader&amp;#039;).call(i18n.style)&lt;br /&gt;
		.. tostring(mw.html.create(&amp;#039;div&amp;#039;):addClass(&amp;#039;droptable-tabber&amp;#039;):wikitext(tabber))&lt;br /&gt;
		.. tostring(mw.html.create(&amp;#039;div&amp;#039;):addClass(&amp;#039;droptable-references&amp;#039;):wikitext(f:extensionTag{&lt;br /&gt;
			name = &amp;#039;references&amp;#039;,&lt;br /&gt;
			args = { group = i18n.refgroup }&lt;br /&gt;
		}))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function setBucketData(datas, args)&lt;br /&gt;
	args.name = args.name or mw.title.getCurrentTitle().text&lt;br /&gt;
	local image, link = getImageAndLink(args, &amp;#039;mob&amp;#039;)&lt;br /&gt;
	for _, data in ipairs(datas) do&lt;br /&gt;
		local jsonData = mw.text.jsonEncode({&lt;br /&gt;
			name = args.name,&lt;br /&gt;
			image = image,&lt;br /&gt;
			linktext = link,&lt;br /&gt;
			java = data.java,&lt;br /&gt;
			bedrock = data.bedrock,&lt;br /&gt;
			notes = data.notes&lt;br /&gt;
		}, mw.text.JSON_PRESERVE_KEYS)&lt;br /&gt;
&lt;br /&gt;
		local bucketObject = {&lt;br /&gt;
			item = data.name,&lt;br /&gt;
			json = jsonData&lt;br /&gt;
		}&lt;br /&gt;
		bucket(i18n.bucket).put(bucketObject)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getBucketData(args)&lt;br /&gt;
	local name = args.name or args[1] or mw.title.getCurrentTitle().text&lt;br /&gt;
	local data = bucket(i18n.bucket)&lt;br /&gt;
		.select(&amp;#039;json&amp;#039;)&lt;br /&gt;
		.where(&amp;#039;item&amp;#039;, name)&lt;br /&gt;
		.run()&lt;br /&gt;
	local jsons = {}&lt;br /&gt;
	for _, object in ipairs(data) do&lt;br /&gt;
		local jsondata = object[&amp;#039;json&amp;#039;]&lt;br /&gt;
		table.insert(jsons, mw.text.jsonDecode(jsondata, mw.text.JSON_PRESERVE_KEYS))&lt;br /&gt;
	end&lt;br /&gt;
	return jsons&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseNotes(defines)&lt;br /&gt;
	local notes = {&lt;br /&gt;
		burn_only = { name = &amp;#039;burn_only&amp;#039;, content = i18n.noteBurnOnly },&lt;br /&gt;
		burn_or_fire_aspect = { name = &amp;#039;burn_or_fire_aspect&amp;#039;, content = i18n.noteBurnOrFireAspect },&lt;br /&gt;
		not_burn_only = { name = &amp;#039;not_burn_only&amp;#039;, content = i18n.noteNotBurnOnly },&lt;br /&gt;
		not_burn_or_fire_aspect = { name = &amp;#039;not_burn_or_fire_aspect&amp;#039;, content = i18n.noteNotBurnOrFireAspect },&lt;br /&gt;
		player_only = { name = &amp;#039;player_only&amp;#039;, content = i18n.notePlayerOnly },&lt;br /&gt;
		player_or_pet = { name = &amp;#039;player_or_pet&amp;#039;, content = i18n.notePlayerOrPet }&lt;br /&gt;
	}&lt;br /&gt;
	notes.player = { java = notes.player_or_pet, bedrock = notes.player_only }&lt;br /&gt;
	notes.burn = { java = notes.burn_or_fire_aspect, bedrock = notes.burn_only }&lt;br /&gt;
	notes.not_burn = { java = notes.not_burn_or_fire_aspect, bedrock = notes.not_burn_only }&lt;br /&gt;
&lt;br /&gt;
	for _, str in ipairs(defines and mw.text.split(defines, &amp;#039;\n&amp;#039;) or {}) do&lt;br /&gt;
		local key, text = str:match(&amp;#039;^%s*([^=]-)%s*=%s*(.-)%s*$&amp;#039;)&lt;br /&gt;
		if key and text then&lt;br /&gt;
			local name, edition = key:match(&amp;#039;^(.-)%.(.*)$&amp;#039;)&lt;br /&gt;
			if edition then&lt;br /&gt;
				notes[name] = notes[name] or {}&lt;br /&gt;
				local redirect = text:match(&amp;#039;^&amp;gt;%s*(.-)$&amp;#039;)&lt;br /&gt;
				if redirect and notes[redirect].name then&lt;br /&gt;
					notes[name][edition] = notes[redirect]&lt;br /&gt;
				else&lt;br /&gt;
					notes[name][edition] = { name = name, content = text }&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				notes[key] = { name = key, content = text }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return notes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.line( frame )&lt;br /&gt;
	local args = require( &amp;#039;Module:ProcessArgs&amp;#039; ).norm( frame:getParent().args )&lt;br /&gt;
	for _, name in pairs({&amp;#039;independent&amp;#039;, &amp;#039;mutuallyexclusive&amp;#039;}) do&lt;br /&gt;
		if args[name] then&lt;br /&gt;
			args[name] = mw.text.jsonDecode(&amp;#039;[&amp;#039; .. args[name] .. &amp;#039;]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return mw.text.jsonEncode(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
	return p._main( frame:getParent().args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main( args )&lt;br /&gt;
	local notes = parseNotes(args.notes)&lt;br /&gt;
	local edition = args.edition and mw.text.trim(args.edition)&lt;br /&gt;
	local datas = linesToDatas(args, notes, edition)&lt;br /&gt;
	if not args.nosource and mw.title.getCurrentTitle().isContentPage then&lt;br /&gt;
		setBucketData(datas, args)&lt;br /&gt;
	end&lt;br /&gt;
	if edition then&lt;br /&gt;
		return createTabs(datas, &amp;#039;item&amp;#039;, edition)&lt;br /&gt;
	end&lt;br /&gt;
	return i18n.titlejava .. createTabs(datas, &amp;#039;item&amp;#039;, &amp;#039;java&amp;#039;)&lt;br /&gt;
		.. i18n.titlebedrock .. createTabs(datas, &amp;#039;item&amp;#039;, &amp;#039;bedrock&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.source( frame )&lt;br /&gt;
	return p._source( frame:getParent().args )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._source( args )&lt;br /&gt;
	local datas = getBucketData( args )&lt;br /&gt;
	local edition = args.edition and mw.text.trim(args.edition)&lt;br /&gt;
	if edition then&lt;br /&gt;
		return createTabs(datas, &amp;#039;mob&amp;#039;, edition)&lt;br /&gt;
	end&lt;br /&gt;
	return i18n.titlejava .. createTabs(datas, &amp;#039;mob&amp;#039;, &amp;#039;java&amp;#039;)&lt;br /&gt;
		.. i18n.titlebedrock .. createTabs(datas, &amp;#039;mob&amp;#039;, &amp;#039;bedrock&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Carter57</name></author>
	</entry>
</feed>