<?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%3ASpawn_table</id>
	<title>Module:Spawn table - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://modded.wiki/index.php?action=history&amp;feed=atom&amp;title=Module%3ASpawn_table"/>
	<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:Spawn_table&amp;action=history"/>
	<updated>2026-05-13T00:02:51Z</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:Spawn_table&amp;diff=12354&amp;oldid=prev</id>
		<title>Patbox: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:Spawn_table&amp;diff=12354&amp;oldid=prev"/>
		<updated>2025-05-19T21:35:24Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&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 21:35, 19 May 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key modded_wiki:diff:1.41:old-12353:rev-12354 --&gt;
&lt;/table&gt;</summary>
		<author><name>Patbox</name></author>
	</entry>
	<entry>
		<id>https://modded.wiki/index.php?title=Module:Spawn_table&amp;diff=12353&amp;oldid=prev</id>
		<title>Minecraft&gt;MetroKopUA at 02:53, 30 March 2025</title>
		<link rel="alternate" type="text/html" href="https://modded.wiki/index.php?title=Module:Spawn_table&amp;diff=12353&amp;oldid=prev"/>
		<updated>2025-03-30T02:53:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local pageTitle = mw.title.getCurrentTitle()&lt;br /&gt;
local pageTitleString = pageTitle.fullText&lt;br /&gt;
local namespace = pageTitle.nsText&lt;br /&gt;
&lt;br /&gt;
local function tooltip(text, title)&lt;br /&gt;
	return tostring(mw.html.create(&amp;#039;span&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;explain&amp;#039;)&lt;br /&gt;
		:attr(&amp;#039;title&amp;#039;, title)&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
	:allDone())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local i18n = {&lt;br /&gt;
	processArgsModule = &amp;#039;Module:ProcessArgs&amp;#039;,&lt;br /&gt;
	mobColumn = &amp;#039;Mob&amp;#039;,&lt;br /&gt;
	chanceColumn = tooltip(&amp;#039;Spawn weight&amp;#039;, &amp;#039;Weight relative to other spawn entries in the category&amp;#039;),&lt;br /&gt;
	groupSizeColumn = tooltip(&amp;#039;Group size&amp;#039;, &amp;#039;Number of mobs the game tries to spawn per attempt&amp;#039;),&lt;br /&gt;
	chargeColumn = tooltip(&amp;#039;Charge&amp;#039;, &amp;#039;Charge generated by the mob&amp;#039;),&lt;br /&gt;
	budgetColumn = tooltip(&amp;#039;Budget&amp;#039;, &amp;#039;Maximum charge potential allowing spawning&amp;#039;),&lt;br /&gt;
	spawnCostNote = &amp;#039;When spawning a mob with a budget, take the sum of the charge of each existing mob divided by the distance to that mob. If the total times the new mob\&amp;#039;s charge is greater than the new mob\&amp;#039;s budget, the spawn fails. See [[Mob spawning#Spawn costs|Mob spawning&amp;amp;nbsp;§&amp;amp;nbsp;Spawn costs]] for details.&amp;#039;,&lt;br /&gt;
	&lt;br /&gt;
	-- SMW properties&lt;br /&gt;
	smwSubnamePrefix = &amp;quot;SPAWN&amp;quot;,&lt;br /&gt;
	smwSpawnedMob = &amp;quot;Spawned mob&amp;quot;,&lt;br /&gt;
	smwSpawnedIn = &amp;quot;Spawned in&amp;quot;,&lt;br /&gt;
	smwEdition = &amp;quot;Edition&amp;quot;,&lt;br /&gt;
	smwCategory = &amp;quot;Category&amp;quot;,&lt;br /&gt;
	smwWeight = &amp;quot;Weight&amp;quot;,&lt;br /&gt;
	smwTotalWeight = &amp;quot;Total weight&amp;quot;,&lt;br /&gt;
	smwSize = &amp;quot;Size&amp;quot;,&lt;br /&gt;
	smwNote = &amp;quot;Note&amp;quot;,&lt;br /&gt;
	smwNoteName = &amp;quot;Note name&amp;quot;,&lt;br /&gt;
	smwSpawnJSON = &amp;quot;Spawn JSON&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local groupArgs = {&lt;br /&gt;
	[&amp;#039;creature&amp;#039;] = &amp;#039;Creature category&amp;#039;,&lt;br /&gt;
	[&amp;#039;passive&amp;#039;] = &amp;#039;Creature category&amp;#039;, --Deprecated&lt;br /&gt;
	[&amp;#039;monster&amp;#039;] = &amp;#039;Monster category&amp;#039;,&lt;br /&gt;
	[&amp;#039;hostile&amp;#039;] = &amp;#039;Monster category&amp;#039;, --Deprecated&lt;br /&gt;
	[&amp;#039;ambient&amp;#039;] = &amp;#039;Ambient category&amp;#039;,&lt;br /&gt;
	[&amp;#039;axolotl&amp;#039;] = &amp;#039;Axolotl category&amp;#039;,&lt;br /&gt;
	[&amp;#039;watercreature&amp;#039;] = &amp;#039;Water creature category&amp;#039;,&lt;br /&gt;
	[&amp;#039;underground&amp;#039;] = &amp;#039;Underground water creature category&amp;#039;,&lt;br /&gt;
	[&amp;#039;waterambient&amp;#039;] = &amp;#039;Water ambient category&amp;#039;,&lt;br /&gt;
	[&amp;#039;misc&amp;#039;] = &amp;#039;Misc category&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- [[Template:Spawn row]]&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		args = require(i18n.processArgsModule).merge( true )&lt;br /&gt;
	else&lt;br /&gt;
		frame = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local data = {&lt;br /&gt;
		mob = args.name or args[1],&lt;br /&gt;
		weight = args.weight,&lt;br /&gt;
		size = args.size,&lt;br /&gt;
		charge = args.charge,&lt;br /&gt;
		budget = args.budget,&lt;br /&gt;
		note = args.note,&lt;br /&gt;
		notename = args.notename&lt;br /&gt;
	}&lt;br /&gt;
		&lt;br /&gt;
	return mw.text.jsonEncode(data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- parses input arguments into spawnData table&lt;br /&gt;
local function parseInput(args)&lt;br /&gt;
	local spawnData = {}&lt;br /&gt;
	spawnData.notes = {}&lt;br /&gt;
	&lt;br /&gt;
	for argName in pairs(groupArgs) do&lt;br /&gt;
		if args[argName] and args[argName] ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			local group = {}&lt;br /&gt;
			group.category = argName&lt;br /&gt;
			group.mobs = {}&lt;br /&gt;
			group.totalWeight = 0&lt;br /&gt;
			&lt;br /&gt;
			-- parse input of group parameter&lt;br /&gt;
			for line in mw.text.gsplit(args[argName], &amp;#039;\n&amp;#039;) do  -- split on newline&lt;br /&gt;
				local parsed = mw.text.jsonDecode(line)&lt;br /&gt;
				&lt;br /&gt;
				if parsed.weight and tonumber(parsed.weight) then&lt;br /&gt;
					parsed.weight = tonumber(parsed.weight)&lt;br /&gt;
					group.totalWeight = group.totalWeight + parsed.weight&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				if parsed.charge or parsed.budget then&lt;br /&gt;
					spawnData.hasSpawnCost = true&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if parsed.note or parsed.notename then&lt;br /&gt;
					spawnData.hasNotes = true&lt;br /&gt;
					&lt;br /&gt;
					if not parsed.notename then&lt;br /&gt;
						parsed.notename = parsed.mob&lt;br /&gt;
					end&lt;br /&gt;
					&lt;br /&gt;
					if parsed.note and parsed.notename then&lt;br /&gt;
						spawnData.notes[parsed.notename] = parsed.note&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				&lt;br /&gt;
				if parsed.mob then&lt;br /&gt;
					table.insert(group.mobs, parsed)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(spawnData, group)&lt;br /&gt;
			&lt;br /&gt;
			-- Put data into SMW&lt;br /&gt;
			local onMain = false&lt;br /&gt;
			if (namespace == &amp;#039;&amp;#039; or namespace == mw.site.namespaces[4].name) then&lt;br /&gt;
				onMain = true&lt;br /&gt;
			end&lt;br /&gt;
			if onMain and not args.ignoreusage then&lt;br /&gt;
				for _, data in ipairs(group.mobs) do&lt;br /&gt;
					local origMob = data.mob&lt;br /&gt;
						:gsub(&amp;quot;Warm &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Cold &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Ashen &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Black &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Chestnut &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Pale &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Rusty &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Snowy &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Spotted &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Striped &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
						:gsub(&amp;quot;Woods &amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
					&lt;br /&gt;
					local smw_sub = {}&lt;br /&gt;
					local smwSpawnedIn = pageTitleString&lt;br /&gt;
					&lt;br /&gt;
					local subname = i18n.smwSubnamePrefix .. &amp;#039;_&amp;#039; .. origMob&lt;br /&gt;
					local smw_json = {&lt;br /&gt;
						[i18n.smwSpawnedMob] = data.mob,&lt;br /&gt;
						[i18n.smwSpawnedIn] = smwSpawnedIn,&lt;br /&gt;
						[i18n.smwEdition] = (args.edition or &amp;#039;java&amp;#039;):lower(),&lt;br /&gt;
						[i18n.smwCategory] = groupArgs[argName]:gsub(&amp;#039; category&amp;#039;, &amp;#039;&amp;#039;),&lt;br /&gt;
						[i18n.smwWeight] = data.weight,&lt;br /&gt;
						[i18n.smwTotalWeight] = group.totalWeight,&lt;br /&gt;
						[i18n.smwSize] = data.size,&lt;br /&gt;
						[i18n.smwNote] = data.note or spawnData.notes[data.notename],&lt;br /&gt;
						[i18n.smwNoteName] = data.notename&lt;br /&gt;
					}&lt;br /&gt;
					&lt;br /&gt;
					local smw_sub = { -- the actual SMW sub-object&lt;br /&gt;
						[i18n.smwSpawnedMob] = origMob,&lt;br /&gt;
						[i18n.smwSpawnedIn] = smwSpawnedIn,&lt;br /&gt;
						[i18n.smwSpawnJSON] = mw.text.jsonEncode(smw_json)&lt;br /&gt;
					}&lt;br /&gt;
					mw.smw.subobject(smw_sub, subname)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return spawnData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addTableBody(spawnData, colspan)&lt;br /&gt;
	local ret = mw.html.create()&lt;br /&gt;
	for _, groupTable in ipairs(spawnData) do&lt;br /&gt;
		ret:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:attr(&amp;#039;colspan&amp;#039;, colspan)&lt;br /&gt;
				:wikitext(groupArgs[groupTable.category])&lt;br /&gt;
			:done()&lt;br /&gt;
		:done()&lt;br /&gt;
		&lt;br /&gt;
		for _, mobData in ipairs(groupTable.mobs) do&lt;br /&gt;
			ret:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
			&lt;br /&gt;
			local mobCellText = require(&amp;#039;Module:SpriteFile&amp;#039;).link{name = &amp;#039;EntitySprite&amp;#039;, mobData.mob}&lt;br /&gt;
			&lt;br /&gt;
			if mobData.note or mobData.notename then &lt;br /&gt;
				mobCellText = mobCellText .. mw.getCurrentFrame():extensionTag{name=&amp;#039;ref&amp;#039;, content=mobData.note, args={name=mobData.notename or mobData.mob, group=&amp;#039;note&amp;#039;}}&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			ret:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;left&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;font-weight&amp;#039;, &amp;#039;normal&amp;#039;)&lt;br /&gt;
				:wikitext(mobCellText)&lt;br /&gt;
			:done()&lt;br /&gt;
			&lt;br /&gt;
			-- Simplify weights for pools with single entries to avoid confusion from e.g. 10/10 and 25/25&lt;br /&gt;
			local weightText = &amp;#039;1&amp;#039;&lt;br /&gt;
			if mobData.weight ~= groupTable.totalWeight then&lt;br /&gt;
				weightText = &amp;#039;&amp;lt;sup&amp;gt;&amp;#039; .. mobData.weight .. &amp;#039;&amp;lt;/sup&amp;gt;&amp;amp;frasl;&amp;lt;sub&amp;gt;&amp;#039; .. groupTable.totalWeight .. &amp;#039;&amp;lt;/sub&amp;gt;&amp;#039;&lt;br /&gt;
		    end&lt;br /&gt;
			&lt;br /&gt;
			ret:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
				:wikitext(weightText)&lt;br /&gt;
			:done()&lt;br /&gt;
			:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
				:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
				:wikitext((mobData.size:gsub(&amp;#039;-&amp;#039;, &amp;#039;&amp;amp;ndash;&amp;#039;)))&lt;br /&gt;
			:done()&lt;br /&gt;
&lt;br /&gt;
			if spawnData.hasSpawnCost then&lt;br /&gt;
				ret:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
					:wikitext(mobData.charge)&lt;br /&gt;
				:done()&lt;br /&gt;
				:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
					:css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;)&lt;br /&gt;
					:wikitext(mobData.budget)&lt;br /&gt;
				:done()&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			ret:done()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- [[Template:Spawn table]]&lt;br /&gt;
function p.mobSpawnTable(frame)&lt;br /&gt;
	local args = frame&lt;br /&gt;
	if frame == mw.getCurrentFrame() then&lt;br /&gt;
		args = require(i18n.processArgsModule).merge( true )&lt;br /&gt;
	else&lt;br /&gt;
		frame = mw.getCurrentFrame()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local spawnData = parseInput(args)&lt;br /&gt;
&lt;br /&gt;
	local columns = {i18n.mobColumn, i18n.chanceColumn, i18n.groupSizeColumn}&lt;br /&gt;
	&lt;br /&gt;
	local tableRoot = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
		:addClass(&amp;#039;wikitable&amp;#039;)&lt;br /&gt;
	&lt;br /&gt;
	if spawnData.hasSpawnCost then&lt;br /&gt;
		spawnData.hasNotes = true&lt;br /&gt;
		table.insert( columns, i18n.chargeColumn .. frame:extensionTag{name=&amp;#039;ref&amp;#039;, content=i18n.spawnCostNote, args={name=&amp;#039;spawn-cost&amp;#039;, group=&amp;#039;note&amp;#039;}} )&lt;br /&gt;
		table.insert( columns, i18n.budgetColumn .. frame:extensionTag{name=&amp;#039;ref&amp;#039;, args={name=&amp;#039;spawn-cost&amp;#039;, group=&amp;#039;note&amp;#039;}} )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local titleStr = args.title&lt;br /&gt;
	if args.edition then&lt;br /&gt;
		local editionStr = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;[[%s Edition]]&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, (args.edition or &amp;#039;&amp;#039;):lower() == &amp;#039;bedrock&amp;#039; and &amp;#039;Bedrock&amp;#039; or &amp;#039;Java&amp;#039;)&lt;br /&gt;
		if titleStr then&lt;br /&gt;
			titleStr = titleStr .. &amp;#039; in &amp;#039; .. editionStr&lt;br /&gt;
		else&lt;br /&gt;
			titleStr = &amp;#039;In &amp;#039; .. editionStr&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if titleStr then&lt;br /&gt;
		tableRoot:tag(&amp;#039;caption&amp;#039;)&lt;br /&gt;
			:wikitext(titleStr)&lt;br /&gt;
		:done()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	tableRoot:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
	for _, value in ipairs(columns) do&lt;br /&gt;
		tableRoot:tag(&amp;#039;th&amp;#039;)&lt;br /&gt;
			:wikitext(value)&lt;br /&gt;
		:done()&lt;br /&gt;
	end&lt;br /&gt;
	tableRoot:done()&lt;br /&gt;
		:node(addTableBody(spawnData, #columns))&lt;br /&gt;
	:allDone()&lt;br /&gt;
	&lt;br /&gt;
	local refs = &amp;#039;&amp;#039;&lt;br /&gt;
	if spawnData.hasNotes then&lt;br /&gt;
		refs = &amp;#039;\n\n&amp;#039; .. frame:extensionTag{name=&amp;#039;references&amp;#039;, args={group=&amp;#039;note&amp;#039;}}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return tostring(tableRoot) .. refs .. require(&amp;#039;Module:NiceJSON&amp;#039;).wrap(spawnData, &amp;#039;pre&amp;#039;, &amp;#039;spawntable-json&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Minecraft&gt;MetroKopUA</name></author>
	</entry>
</feed>