Das offizielle Minecraft Wiki twittert hier: Wiki-Twitter  –  Chatte im Wiki-Discord  – Noch keinen Server gefunden? Es gibt einen Wiki-Server

Modul:Grid

Aus Minecraft Wiki
Wechseln zu: Navigation, Suche
[Lesen | Bearbeiten | Versionen | Aktualisieren]Buch und Feder.png DokumentationSpringe zum Quelltext ↴Lua logo.svg Zum Gebrauch von Lua-Modulen siehe die Modul-Hilfe.

Das Modul Grid stellt Funktionen zur Verfügung, die zur Darstellung von Crafting-Inventaren dienen:

  • cell: Darstellung einer einzelnen Zelle eines Crafting-Inventars
  • craftingTable: Werkbank-Inventar
  • furnace: Ofen-Inventar
  • furnace_rp2: Ofen-Inventar für die Mod/RedPower2
  • brewingStand: Braustand-Inventar
  • amboss: Amboss-Inventar

Die Funktionen für Amboss, Braustand, Ofen und Werkbank verwenden die Funktion cell, die wiederum die interne Funktion getParts zum Festlegen der Attribute eines einzelnen Gridbildes (Name, Tooltip etc.) verwendet.

Außerdem wird das Untermodul Grid/Aliases verwendet, in dem für Itemnamen eine spezielle Darstellung hinterlegt werden kann.

Aufruf

Die Parameter des Aufrufers werden automatisch übergeben. Das sind:

für {{#invoke: Grid|cell}} siehe Vorlage:Grid

für {{#invoke: Grid|craftingTable}} siehe Vorlage:Grid/Werkbank

für {{#invoke: Grid|furnace}} siehe Vorlage:Grid/Ofen

für {{#invoke: Grid|furnace_rp2}} siehe Vorlage:Grid/Ofen (RP2)

für {{#invoke: Grid|brewingStand}} siehe Vorlage:Grid/Braustand

für {{#invoke: Grid|amboss}} siehe Vorlage:Grid/Amboss

Anwendung

Liste der Vorlagen, die dieses Modul verwenden


local p = {}

-- Individual cell
function p.cell( f )
	local args = f.args or f
	if f == mw.getCurrentFrame() and args[1] == nil then
		args = f:getParent().args
	end
	
	args[1] = mw.text.trim( args[1] or '' )

	-- Comment this next line out if you're not using aliases
	local aliases = mw.loadData( 'Modul:Grid/Aliases' )
	if aliases then
		local frames = {}
		for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
			local frameParts = p.getParts( frame )
			if aliases[frameParts.name] then
				local aliasFrames = {}
				for aliasFrame in mw.text.gsplit( aliases[frameParts.name], '%s*;%s*' ) do
					local aliasParts = p.getParts( aliasFrame )
					aliasParts.title = frameParts.title or aliasParts.title or ''
					aliasParts.mod = frameParts.mod or aliasParts.mod or 'vanilla'
					aliasParts.num = frameParts.num or aliasParts.num or ''
					aliasParts.text = frameParts.text or aliasParts.text or ''
					aliasParts.damage = ( frameParts.damage >= 0 and tostring( frameParts.damage ) ) or ( aliasParts.damage >= 0 and tostring( aliasParts.damage ) ) or ''
					aliasParts.enchanted = frameParts.enchanted and 'e' or aliasParts.enchanted and 'e' or ''
					
					aliasFrames[#aliasFrames + 1] = string.format( '[%s]%s:%s,%s#%s%s[%s]', aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.damage, aliasParts.enchanted, aliasParts.text )
				end
				
				frames[#frames + 1] = table.concat( aliasFrames, ';' )
			else
				frames[#frames + 1] = frame
			end
		end
		
		args[1] = table.concat( frames, ';' )
	end
	
	local animated = args[1]:find( ';' )
	local pageName = mw.title.getCurrentTitle().subpageText
	local class = args.class or ''
	local imgClass = args.imgclass or ''
	local align = args.align or ''
	local cell = {}
	
	for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do
		if frame == '' then
			if animated then
				table.insert( cell, '<span class="item"><br></span>' )
			else
				table.insert( cell, '<br>' )
			end
		else
			local parts = p.getParts( frame, args.mod )
			local tooltipTitle = parts.title
			local mod = parts.mod
			local name = parts.name
			local num = parts.num
			local tooltipDesc = parts.text
			local damage = args.damage or parts.damage
			local enchanted = ( args.enchanted == nil and parts.enchanted ) or args.enchanted
			
			local img
			if mod then
				img = name .. ' (' .. mod .. ')'
			else
				img = name
			end
			
			local link = args.link or ''
			if link == '' then
				if name == pageName then
					link = 'none'
				elseif mod then
					link = 'Modifikation/' .. mod 
				else
					link = name
				end
			end
			
			if not tooltipTitle and enchanted then
				tooltipTitle = '&b' .. name:gsub( '%s%(.*', '' )
			end
			
			local title = args.title or ''
			if title == '' then
				if tooltipTitle then
					title = tooltipTitle:gsub( '&[0-9a-fk-or]', '' )
				elseif link:lower() == 'none' or link ~= name:gsub( '%s%(.*', '' ) then
					title = name:gsub( '%s%(.*', '' )
				end
			end
			
			local tooltip = ''
			if not tooltipTitle and title:lower() == 'none' then
				tooltipTitle = 0
			end
			
			local alt = img
			if title:lower() ~= 'none' then
				alt = title
			end
			if mod then
				alt = mod .. ':' .. alt
			end
			
			if link:lower() == 'none' then
				link = ''
			end
			if title:lower() == 'none' then
				title = ''
			end
			if mod then
				title = mod .. ':' .. title
			end
			
			if tooltipTitle then
				tooltip = ' data-minetip-title="' .. tooltipTitle .. '"'
			end
			
			if tooltipDesc then
				tooltip = tooltip .. ' data-minetip-text="' .. tooltipDesc .. '"'
			end
			
			local amount = ''
			if num and num > 1 and num < 1000 then
				if link ~= '' then
					num = '[[' .. link .. '|' .. num .. ']]'
				end
				amount = '<span class="number">' .. num .. '</span>'
			end
			
			local pClass = ''
			if tonumber( damage ) >= 0 then
				pClass = 'damaged damage-' .. tostring( damage ) .. ' '
			end
			
			if enchanted then
				pClass = pClass .. 'enchanted '
			end
			
			local image = {
				'<span class="item ' .. pClass .. imgClass .. '" title="' .. title .. '"' .. tooltip .. '>',
					'[[Datei:Grid ' .. img .. '.png|32x32px|link=' .. link .. '|alt=' .. alt .. ']]',
					amount,
				'</span>'
			}
			image[1] = image[1]:gsub( ' title=""', '' )
			image[2] = image[2]:gsub( '||', '|' )
			
			table.insert( cell, table.concat( image, '' ) )
		end
	end
	
	if animated then
		cell[1] = cell[1]:gsub( 'class="item', 'class="item active' )
		class = 'animated ' .. class
	end
	
	if align ~= '' then
		align = ' style="vertical-align:' .. align .. '"'
	end

	local html = {
		'<span class="grid ' .. class .. '"' .. align .. '>',
			table.concat( cell, '' ),
		'</span>'
	}
	
	if ( args.default or '' ) ~= '' then
		local defaultClass = ''
		if animated then
			defaultClass = ' skip'
		end
		table.insert( html, 2, '<span class="default-item' .. defaultClass .. '">[[Datei:Grid ' .. args.default .. '.png|32x32px|alt=|link=]]</span>' )
	end
	
	html = table.concat( html, '' ):gsub( ' "', '"' )
	return html
end

function p.getParts( frame, mod )
	local parts = {}
	parts.title = frame:match( '^%[%s*([^%]]+)%s*%]' )
	
	parts.mod = mw.text.trim( frame:match( '([^:%]]+):' ) or mod or '' )
	
	local vanilla = { v = 1, vanilla = 1, mc = 1, minecraft = 1 }
	if parts.mod == '' or vanilla[parts.mod:lower()] then
		parts.mod = nil
	end
	
	local nameStart = ( frame:find( ':' ) or frame:find( '%]' ) or 0 ) + 1
	if nameStart - 1 == #frame then
		nameStart = 1
	end
	parts.name = mw.text.trim( frame:sub( nameStart, ( frame:find( '[,%[#]', nameStart ) or 0 ) - 1 ) )
	
	parts.num = math.floor( frame:match( ',%s*(%d+)' ) or 0 )
	if parts.num == 0 then
		parts.num = nil
	end
	
	local parameters = { frame:match( '#%s*(%d?)%s*(e?)' ) }

	parts.damage = -1
	if ( parameters[1] ~= nil and parameters[1] ~= '' ) then
		parts.damage = tonumber( parameters[1] )
	end
	
	parts.enchanted = parameters[2] == 'e'
	
	parts.text = frame:match( '%[%s*([^%]]+)%s*%]$' )
	
	return parts
end

function p.serialize( parts )
	local frame = ''
	
	if ( parts.title ~= nil and parts.title ~= parts.name and parts.title ~= '' ) then
		frame = frame .. '[' .. parts.title .. ']'
	end
	
	if ( parts.mod ~= nil and parts.mod ~= '' ) then
		frame = frame .. parts.mod .. ':'
	end
	
	if parts.name ~= nil then
		frame = frame .. parts.name
	end
	
	if ( parts.num ~= nil and parts.num ~= 0 ) then
		frame = frame .. ',' .. tostring( parts.num )
	end
	
	if ( parts.damage ~= nil and parts.damage >= 0 ) or ( parts.enchanted ~= nil and parts.enchanted ) then
		frame = frame .. '#'
	end
	
	if ( parts.damage ~= nil and parts.damage >= 0 ) then
		frame = frame .. tostring( parts.damage )
	end
	
	if ( parts.enchanted ~= nil and parts.enchanted ) then
		frame = frame .. 'e'
	end
	
	if ( parts.text ~= nil and parts.text ~= '' ) then
		frame = frame .. '[' .. parts.text .. ']'
	end
	
	return frame
end

--- GUI variants; called directly to avoid the overhead of a bunch of #invoke calls per GUI
-- Crafting table
function p.craftingTable( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	
	local arrow = 'Pfeil (klein)'
	local shapeless = ''
	local mirror = '' 
	
	if args.arrow or '' ~= '' then
		arrow = args.arrow .. ' (' .. args.Mod .. ')'
	end
	if args.shapeless or '' ~= '' then
		shapeless = '<span title="Die Zutaten können in beliebiger Anordnung in den Craftingfeldern platziert werden.">[[Datei:Grid_Layout_Formlos.png|link=]]</span>'
	end
	if args.mirror or '' ~= '' then
		shapeless = '<span title="Die Zutaten können auch vertikal gespiegelt in den Craftingfeldern platziert werden.">[[Datei:Grid_Layout_Spiegelung.png|link=]]</span>'
	end
	
	local html = {
		'{| class="grid-Crafting_Table" cellpadding="0" cellspacing="0"',
		'| ' .. p.cell{ args.A1, mod = args.Mod, link = args.A1link, title = args.A1title },
		'| ' .. p.cell{ args.B1, mod = args.Mod, link = args.B1link, title = args.B1title },
		'| ' .. p.cell{ args.C1, mod = args.Mod, link = args.C1link, title = args.C1title },
		'| rowspan="2" class="arrow" | [[Datei:Grid Layout ' .. arrow .. '.png|link=]]',
		'| rowspan="3" | ' .. p.cell{ args.Output, mod = args.Mod, link = args.Olink, title = args.Otitle, class = 'output' },
		'|-',
		'| ' .. p.cell{ args.A2, mod = args.Mod, link = args.A2link, title = args.A2title },
		'| ' .. p.cell{ args.B2, mod = args.Mod, link = args.B2link, title = args.B2title },
		'| ' .. p.cell{ args.C2, mod = args.Mod, link = args.C2link, title = args.C2title },
		'|-',
		'| ' .. p.cell{ args.A3, mod = args.Mod, link = args.A3link, title = args.A3title },
		'| ' .. p.cell{ args.B3, mod = args.Mod, link = args.B3link, title = args.B3title },
		'| ' .. p.cell{ args.C3, mod = args.Mod, link = args.C3link, title = args.C3title },
		'| class="shapeless" | ' .. shapeless,
		'|}'
	}
	
	return table.concat( html, '\n' );
end

-- Furnace
function p.furnace( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Modul:ParameterUmwandeln' ).norm( args )
	
	local progress = 'Ofenfortschritt'
	local burning = ' (inaktiv)'
	local smelting = burning
	local fuelUsage = 'Feuer'
	
	if args.Progress then
		progress = args.Progress .. ' Progress'
		if args.Mod then
			progress = progress .. ' (' .. args.Mod .. ')'
		end
	end

	if args.Input and args.Fuel then
		burning = ''
		if args.Output then
			smelting = ''
		end
	end
	
	if args.FuelUsage then
		fuelUsage = args.FuelUsage
		if args.Mod then
			fuelUsage = fuelUsage .. ' (' .. args.Mod .. ')'
		end
	end
	
	local html = {
		'{| class="grid-Furnace" cellpadding="0" cellspacing="0"',
		'| ' .. p.cell{ args.Input, mod = args.Mod, link = args.Ilink, title = args.Ititle },
		'| rowspan="3" class="arrow" | [[Datei:Grid Layout ' .. progress .. smelting .. '.png|link=]]',
		'| rowspan="3" class="output" | ' .. p.cell{ args.Output, mod = args.Mod, link = args.Olink, title = args.Otitle, class = 'output' },
		'|-',
		'| [[Datei:Grid Layout ' .. fuelUsage .. burning .. '.png|link=]]',
		'|-',
		'| ' .. p.cell{ args.Fuel, mod = args.Mod, link = args.Flink, title = args.Ftitle },
		'|}'
	}
	
	return table.concat( html, '\n' );
end

-- Furnace (RedPower2)
function p.furnace_rp2( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Modul:ParameterUmwandeln' ).norm( args )
	
	local progress = 'Ofenfortschritt'
	local burning = ' (inaktiv)'
	local smelting = burning
	local fuelUsage = 'Feuer'
	local shapeless = ''
	
	if args.Progress then
		progress = args.Progress .. ' Progress'
		if args.Mod then
			progress = progress .. ' (' .. args.Mod .. ')'
		end
	end

	if args.Input and args.Fuel then
		burning = ''
		if args.Output then
			smelting = ''
		end
	end
	
	if args.FuelUsage then
		fuelUsage = args.FuelUsage
		if args.Mod then
			fuelUsage = fuelUsage .. ' (' .. args.Mod .. ')'
		end
	end
	
	if args.shapeless or '' ~= '' then
		shapeless = '<span title="Die Zutaten können in beliebiger Anordnung in den Craftingfeldern platziert werden.">[[Datei:Grid_Layout_Formlos.png|link=]]</span>'
	end

	local html = {
		'{| class="grid-Furnace" cellpadding="0" cellspacing="0"',
		'| ',
		'| style="width:16px;" |',
		'| ' .. p.cell{ args.A1, mod = args.Mod, link = args.A1link, title = args.A1title },
		'| ' .. p.cell{ args.B1, mod = args.Mod, link = args.B1link, title = args.B1title },
		'| ' .. p.cell{ args.C1, mod = args.Mod, link = args.C1link, title = args.C1title },
		'| rowspan="3" class="arrow" | [[Datei:Grid Layout ' .. progress .. smelting .. '.png|link=]]',
		'| rowspan="3" class="output" | ' .. p.cell{ args.Output, mod = args.Mod, link = args.Olink, title = args.Otitle, class = 'output' },
		'|-',
		'| [[Datei:Grid Layout ' .. fuelUsage .. burning .. '.png|link=]]',
		'| ',
		'| ' .. p.cell{ args.A2, mod = args.Mod, link = args.A2link, title = args.A2title },
		'| ' .. p.cell{ args.B2, mod = args.Mod, link = args.B2link, title = args.B2title },
		'| ' .. p.cell{ args.C2, mod = args.Mod, link = args.C2link, title = args.C2title },
		'|-',
		'| ' .. p.cell{ args.Fuel, mod = args.Mod, link = args.Flink, title = args.Ftitle },
		'| ',
		'| ' .. p.cell{ args.A3, mod = args.Mod, link = args.A3link, title = args.A3title },
		'| ' .. p.cell{ args.B3, mod = args.Mod, link = args.B3link, title = args.B3title },
		'| ' .. p.cell{ args.C3, mod = args.Mod, link = args.C3link, title = args.C3title },
		'| class="shapeless" | ' .. shapeless,
		'|}'
	}
	
	return table.concat( html, '\n' );
end

-- Brewing Stand
function p.brewingStand( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Modul:ParameterUmwandeln' ).norm( args )
	
	local inactive = ' (inaktiv)'
	if args.Input and ( args.Output1 or args.Output2 or args.Output3 ) then
		inactive = ''
	end
	
	local html = {
		'<div class="grid-Brewing_Stand">',
			'{| cellpadding="0" cellspacing="0"',
			'| class="fuel" | ' .. p.cell{ ';Lohenstaub', link='',default='Layout Lohenstaub leer' },
			'| class="coil" | [[Datei:Grid Layout Brauleitung.png|link=]]',
			'| class="bubbles" | [[Datei:Grid Layout Braublasen.gif|link=]]<br />[[Datei:Grid Layout Lohenstaub-Vorrat.png|link=]]',
			'| class="input" | ' .. p.cell{ args.Input, mod = args.Mod, link = args.Ilink, title = args.Ititle },
			'| [[Datei:Grid Layout Braupfeil' .. inactive .. '.png|link=]]',
			'|-',
			'| ',
			'| ',
			'| class="output1" | ' .. p.cell{ args.Output1, mod = args.Mod, link = args.O1link, title = args.O1title, default = 'Layout Brauen (leer)' },
			'| class="output2" | ' .. p.cell{ args.Output2, mod = args.Mod, link = args.O2link, title = args.O2title, default = 'Layout Brauen (leer)' },
			'| class="output3" | ' .. p.cell{ args.Output3, mod = args.Mod, link = args.O3link, title = args.O3title, default = 'Layout Brauen (leer)' },
			'|-',
			'| ',
			'| ',
			'| class="paths" colspan="3" | [[Datei:Grid Layout Brauwege.png|link=]]',
			'|}',
		'</div>'
	}
	
	return table.concat( html, '\n' );
end

function p.anvil( f )
	local args = f
	if f == mw.getCurrentFrame() then
		args = f:getParent().args
	end
	args = require( 'Modul:ParameterUmwandeln' ).norm( args )
	
	local working = '(erlaubt)'
	local xp = '&nbsp;'
	local color = 'limegreen'
	local dark = ' (dunkel)'
	
	local aliases = mw.loadData( 'Modul:Grid/Aliases' )
	
	local inputFrames = {}
	if args.input ~= nil then inputFrames = mw.text.split( args.input, '%s*;%s*' ) end
	
	local titleFrames = {}
	if args.title ~= nil then titleFrames = mw.text.split( args.title, '%s*;%s*' ) end
	
	local levelFrames = {}
	if args.level ~= nil then levelFrames = mw.text.split( args.level, '%s*;%s*' ) end
	
	local victimFrames = {}
	if args.victim ~= nil then victimFrames = mw.text.split( args.victim, '%s*;%s*' ) end
	
	local outputFrames = {}
	if args.output ~= nil then outputFrames = mw.text.split( args.output, '%s*;%s*' ) end
	
	if args.input then
		dark = '' -- Heller Balken mit Itemname sobald ein Item im ersten Slot ist
		
		function smod( a, b )
			return ( a - 1 ) % b + 1
		end
		
		if args.debug then
			-- Expand aliases
			local newInputFrames, newTitleFrames, newLevelFrames, newVictimFrames, newOutputFrames = {}, {}, {}, {}, {}
			
			for i = 1, #inputFrames do
				local inputParts = p.getParts( inputFrames[i] )
				local inputFrame = ( aliases and aliases[inputParts.name] ) or inputFrames[i]
				local inputAliasFrames = mw.text.split( inputFrame, '%s*;%s*' )
				
				local victimParts, victimFrame, victimAliasFrames
				if victimFrames[smod( i, #victimFrames )] ~= nil then
					victimParts = p.getParts( victimFrames[smod( i, #victimFrames )] )
					victimFrame = ( aliases and aliases[victimParts.name] ) or victimFrames[smod( i, #victimFrames )]
					victimAliasFrames = mw.text.split( victimFrame, '%s*;%s*' )
				end
				
				local outputParts, outputFrame, outputAliasFrames
				if outputFrames[smod( i, #outputFrames )] ~= nil then
					outputParts = p.getParts( outputFrames[smod( i, #outputFrames )] )
					outputFrame = ( aliases and aliases[outputParts.name] ) or outputFrames[smod( i, #outputFrames )]
					outputAliasFrames = mw.text.split( outputFrame, '%s*;%s*' )
				end
				
				local inputStr, titleStr, levelStr, victimStr, outputStr = '', '', '', '', ''
				
				for j = 1, #inputAliasFrames do
					local k1
					if victimAliasFrames ~= nil then k1 = ( j - 1 ) % #victimAliasFrames + 1 end
					
					local k2
					if outputAliasFrames ~= nil then k2 = ( j - 1 ) % #outputAliasFrames + 1 end
					
					local tempInputParts = inputParts
					tempInputParts.name = inputAliasFrames[j]
					if inputStr ~= '' then inputStr = inputStr .. ';' end
					inputStr = inputStr .. p.serialize( tempInputParts )
					
					if ( victimAliasFrames ~= nil and victimAliasFrames[k1] ~= nil ) then
						local tempVictimParts = victimParts
						tempVictimParts.name = victimAliasFrames[k1]
						if victimStr ~= '' then victimStr = victimStr .. ';' end
						victimStr = victimStr .. p.serialize( tempVictimParts )
					end
					
					if ( outputAliasFrames ~= nil and outputAliasFrames[k2] ~= nil ) then
						local tempOutputParts = outputParts
						tempOutputParts.name = outputAliasFrames[k2]
						if outputStr ~= '' then outputStr = outputStr .. ';' end
						outputStr = outputStr .. p.serialize( tempOutputParts )
					end
					
					if titleFrames[( i - 1 ) % #titleFrames + 1] ~= nil then
						if titleStr ~= '' then titleStr = titleStr .. ';' end
						titleStr = titleStr .. titleFrames[( i - 1 ) % #titleFrames + 1]
					end
					
					if levelFrames[( i - 1 ) % #levelFrames + 1] ~= nil then
						if levelStr ~= '' then levelStr = levelStr .. ';' end
						levelStr = levelStr .. levelFrames[( i - 1 ) % #levelFrames + 1]
					end
				end
				
				newInputFrames[i] = inputStr
				newTitleFrames[i] = titleStr
				newLevelFrames[i] = levelStr
				newVictimFrames[i] = victimStr
				newOutputFrames[i] = outputStr
			end
			
			inputFrames = newInputFrames
			titleFrames = newTitleFrames
			levelFrames = newLevelFrames
			victimrames = newVictimrames
			outputFrames = newOutputFrames
			
			inputFrames = mw.text.split( table.concat( inputFrames, ';' ), '%s*;%s*' )
			if #victimFrames > 0 then titleFrames = mw.text.split( table.concat( titleFrames, ';' ), '%s*;%s*' ) end
			if #victimFrames > 0 then levelFrames = mw.text.split( table.concat( levelFrames, ';' ), '%s*;%s*' ) end
			if #victimFrames > 0 then victimFrames = mw.text.split( table.concat( victimFrames, ';' ), '%s*;%s*' ) end
			if #outputFrames > 0 then outputFrames = mw.text.split( table.concat( outputFrames, ';' ), '%s*;%s*' ) end
			
			if args.debug == 'return' then return ';input\n* ' .. table.concat( inputFrames, '\n* ' )
				.. '\n;title\n* ' .. table.concat( titleFrames, '\n* ' )
				.. '\n;level\n* ' .. table.concat( levelFrames, '\n* ' )
				.. '\n;victim\n* ' .. table.concat( victimFrames, '\n* ' )
				.. '\n;output\n* ' .. table.concat( outputFrames, '\n* ' ) end
		end
		
		for i = 1, #inputFrames do
			local frame = inputFrames[i]
			local inputParts = p.getParts( frame )
			
			local frameTitle = inputParts.name			
			if ( not args.debug and aliases and aliases[frameTitle] ~= nil ) then
				local aliasParts = p.getParts( aliases[frameTitle] )
				
				if aliasParts.title ~= nil then
					frameTitle = aliasParts.title
				elseif aliasParts.name ~= nil then
					frameTitle = aliasParts.name
				end
			end
			
			if ( args.title == nil and titleFrames[i] == nil ) then
				titleFrames[i] = frameTitle:gsub( '&[0-9a-fk-or]', '' )
			elseif ( titleFrames[i] == nil ) then
				titleFrames[i] = titleFrames[1]
			end
			
			if levelFrames[i] == nil then
				levelFrames[i] = levelFrames[( i - 1 ) % #levelFrames + 1]
			end
			
			if victimFrames[i] == nil then
				victimFrames[i] = victimFrames[( i - 1 ) % #victimFrames + 1]
			end
			
			local outputParts = inputParts
			if outputFrames[i] ~= nil then outputParts = p.getParts( outputFrames[i] ) end
			if titleFrames[i] ~= nil then outputParts.title = titleFrames[i] end
			
			if victimFrames[i] ~= nil then
				if ( outputFrames[i] == nil or ( outputFrames[i] ~= nil and p.getParts( outputFrames[i] ).damage == nil ) ) then
					outputParts.damage = -1
				end
				
				local victimParts = p.getParts( victimFrames[i] )
				
				if victimParts.enchanted ~= nil then
					outputParts.enchanted = outputParts.enchanted or victimParts.enchanted
					if ( outputParts.title ~= nil and outputParts.enchanted ) then
						outputParts.title = '&b' .. outputParts.title:gsub( '^(&b)+', '' )
					end
				end
				if victimParts.text ~= nil then
					outputParts.text = outputParts.text or victimParts.text
				end
				
				if ( not args.debug and aliases and aliases[victimParts.name] ~= nil ) then
					local aliasParts = p.getParts( aliases[victimParts.name] )
					
					if aliasParts.enchanted ~= nil then
						outputParts.enchanted = outputParts.enchanted or aliasParts.enchanted
						if outputParts.title ~= nil then outputParts.title = '&b' .. outputParts.title end
					end
					if aliasParts.text ~= nil then
						outputParts.text = outputParts.text or aliasParts.text
					end
				end
			end
			
			outputFrames[i] = p.serialize( outputParts )
		end
		
		if #titleFrames > #inputFrames then
			for i = #inputFrames + 1, #titleFrames do titleFrames[i] = nil end
		end
		if #levelFrames > #inputFrames then
			for i = #inputFrames + 1, #levelFrames do levelFrames[i] = nil end
		end
		if #victimFrames > #inputFrames then
			for i = #inputFrames + 1, #victimFrames do victimFrames[i] = nil end
		end
		if #outputFrames > #inputFrames then
			for i = #inputFrames + 1, #outputFrames do outputFrames[i] = nil end
		end
	else
		titleFrames = {}
		victimFrames = {}
		outputFrames = {}
	end
	
	if args.locked ~= nil then
		outputFrames = {}
	end
	
	local input = table.concat( inputFrames, ';' )
	local victim = table.concat( victimFrames, ';' )
	local output = table.concat( outputFrames, ';' )
	
	if args.debug ~= nil then
		return '\n;Input\n* <code>' .. table.concat( inputFrames, '</code>\n* <code>' ) .. '</code>'
			.. '\n;Title\n* <code>' .. table.concat( titleFrames, '</code>\n* <code>' ) .. '</code>'
			.. '\n;Level\n* <code>' .. table.concat( levelFrames, '</code>\n* <code>' ) .. '</code>'
			.. '\n;Victim\n* <code>' .. table.concat( victimFrames, '</code>\n* <code>' ) .. '</code>'
			.. '\n;Output\n* <code>' .. table.concat( outputFrames, '</code>\n* <code>' ) .. '</code>'
	end
	
	-- Schriftfarbe der Erfahrungskosten auf Rot, wenn bei rot irgendwas angegeben
	if args.red then
		color = 'red'
	end
	
	--Animation für den Namen
	local title = {}
	if #titleFrames > 0 then
		for i,t in pairs( titleFrames ) do
			if t == '' then
				table.insert( title, '<span><br></span>' )
			else
				table.insert( title, '<span>' .. t .. '</span>' )
			end
		end
		title[1] = title[1]:gsub( '^<span>', '<span class="item active">' )
	end
	
	--Animation für mehrere Level
	local level = {}
	
	-- Wenn bei gesperrt teuer angegeben ist, ist die Reparatur zu teuer
	if args.locked == 'expensive' then
		color = 'red'
		xp = 'Zu teuer!'
		working = '(gesperrt)'
		level = {}
	elseif args.locked then	-- wenn irgendwas (außer expensive) bei locked angegeben ist, ist der Vorgang nicht möglich
		color = ''
		xp = '&nbsp;'
		working = '(gesperrt)'
		level = {}
	elseif #levelFrames > 0 then -- Anzeige der Erfahrungskosten, wenn level angegeben
		xp = 'Erfahrungskosten: '
		
		for i,l in pairs( levelFrames ) do
			if l == '' then
				table.insert( level, '<span><br></span>' )
			else
				table.insert( level, '<span>' .. l .. '</span>' )
			end
		end
		level[1] = level[1]:gsub( '^<span>', '<span class="item active">' )
	end
	
	--Die Tabelle
	local html = {
		'{| class="grid-Furnace" cellpadding="0" cellspacing="0" style="width:370px"',
		'| [[Datei:Grid Layout Hammer.png|64px|link=]]<br><br>',
		'| align="right" colspan="5" | <br><div style="position:relative; top:29px; width:212px; font-size:16px; text-align:left; font-family:Minecraft"><span class="animated" style="color:white">' .. table.concat( title ) .. '</span></div>[[Datei:Grid Layout Name' .. dark .. '.png|220x32px|link=]]<br>&nbsp;',
		'|-',
		'| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;' .. p.cell{ input },
		'| &nbsp;&nbsp;&nbsp;[[Datei:Grid Layout Plus.png|30px|link=]]&nbsp;&nbsp;&nbsp;',
		'| &nbsp;&nbsp;&nbsp;' .. p.cell{ victim },
		'| &nbsp;&nbsp;&nbsp;[[Datei:Grid Layout Amboss ' .. working .. '.png|56x42px|link=]]',
		'| &nbsp;&nbsp;&nbsp;' .. p.cell{ output },
		'| &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;',
		'|-',
		'| align="right" colspan="6" | <div style="font-family:Minecraft; font-size:16px;"><span class="animated" style="color:' .. color .. '">' .. xp .. table.concat( level ) .. '</span></div>',
		'|}'
	}
	
	return table.concat( html, '\n' );
end
 
return p
Promotional Content