Talk:Games/Minetest Game/Smelting

From Luanti Wiki
Jump to navigation Jump to search

Semi-automatic generation of fuel table

Since updating the fuel table is a tedious and error-prone task, I have written a Lua script to semi-automatically generate the table. Put the following code into a mod called “wikifuel”, enable it in Minetest Game with no other mods enabled and use the /wikifuel command. The mod will then output a wiki table into fuel_recipes.txt in the world directory. This wiki table can be pasted into the the article.

The wiki table you get will still need manual updates:

  • Links need to be corrected
  • Images need to be corrected
  • Replacements must be added by hand (e.g. Lava Bucket turning into Empty Bucket)
  • Groups must be added by hand
-- TODO: Add support for replacements
-- TODO: Add support for groups
-- TODO: Make item count sortable

local function do_out(playername, param)

	local outstring = ""

	outstring = 
[=[
{| class="wikitable collapsible sortable"
! scope="row" class="unsortable" |
! scope="row" | Block
! scope="row" | Burning time in seconds
! scope="row" class="unsortable" | Items smelted per fuel<ref>Assuming a smelting time of 3 seconds</ref>
! scope="row" class="unsortable" |
! scope="row" | Remainder
|-
]=]

	local fuelitems = {}
	for k,v in pairs(minetest.registered_items) do
		local f = minetest.get_craft_result({method="fuel", items = {k}})
		if f~=nil and f.time > 0 then table.insert(fuelitems, {burntime=f.time, item=k}) end
	end

	table.sort(fuelitems, function(a,b)
		return a.burntime > b.burntime
	end)

	for i=1,#fuelitems do

		local itemname = minetest.registered_items[fuelitems[i].item].description
		if itemname == nil then itemname = "UNKNOWN ITEM" end
		local burntime = fuelitems[i].burntime
		local iwhole = math.floor(burntime/3)
		local iremainder = math.fmod(burntime, 3)
		local itemcount = ""
		if iremainder == 0 then
			itemcount = tostring(iwhole)
		else
			if iwhole >= 1 then
				itemcount = tostring(iwhole)
				itemcount = itemcount .. '​'
			end
			if iremainder == 2 then
				itemcount = itemcount .. "⅔"
			elseif iremainder == 1 then
				itemcount = itemcount .. "⅓"
			end
		end

		outstring = outstring ..
		string.format(
[=[
| [[File:%s.png|link=%s|32px]]
| [[%s]]
| %d
| %s
|
| ''Nothing''
|-
]=], itemname, itemname, itemname, burntime, itemcount)


end

	outstring = outstring .. "|}\n<references/>"

	local filename = minetest.get_worldpath().."/fuel_recipes.txt"
	local file = io.open(filename, "w")
	file:write(outstring)
	file:close()
	minetest.chat_send_player(playername, "Fuel items written to: "..filename)
	minetest.log("action", "[wikifuel] Fuel items were written into file: "..filename)
end

minetest.register_chatcommand("wikifuel", {
	description = "Writes a list of all available fuels in MediaWiki syntax",
	params = "",
	privs = {server=true},
	func = do_out,
})