Join The Fan Lab, a private Fandom research community for users in the US and UK where you will be asked to share your opinions on all things gaming and entertainment! Click here to see if you qualify

Модуль:Инвентарный слот

Материал из Minecraft Wiki
Перейти к: навигация, поиск

Этот модуль используется для изображения инвентарных слотов с изображениями блоков и предметов. Эти слоты по виду подобны тем, что имеются в игре Minecraft (при стандартном пакете ресурсов). Изображение каждого предмета достаётся из таблицы спрайтов, а если оно там отсутствует — из файла с полным названием в формате Файл:Grid Название предмета [(Модификация игры, если указана)].png[1]

Модуль рекомендуется использовать в других модулях напрямую (через require("Модуль:Инвентарный слот")), а вне их — через шаблон {{Инвентарный слот}}.

Использование

Внутри других модулей этот модуль включается через функцию Lua require: require("Модуль:Инвентарный слот"), которая возвращает ассоциативный массив (таблицу) с функциями и параметрами. Основной функцией является slot, именно её и следует вызывать, чтобы отобразить слот.

В других страницах модуль (а конкретно её функция slot) используется преимущественно через шаблон {{Инвентарный слот}}, который вызывает программу через конструкцию {{#invoke: Инвентарный слот|slot}} (при этом параметры шаблона передаются модулю неявно). Именно эту конструкцию необходимо использовать, если модуль нужно вызвать из обычной страницы напрямую (вот только зачем?).

Параметры

Модуль поддерживает следующие параметры:

Название Описание Значение по умолчанию
Основные параметры
1[2] Указывает название блока или предмета (или псевдоним). Можно указывать несколько предметов (до 16), отделяя их точкой с запятой. После названия через запятую можно указывать число предметов в стопке. Перед же названием можно указать в [квадратных скобках] иной всплывающий текст (по умолчанию он такой же, как и название предмета, если только не переопределён псевдонимом), а также модификацию игры, которую добавляет данный предмет (она отделяется от собственно названия двоеточием и следует после квадратных скобок, если они есть; вместо полного названия можно также указывать краткий псевдоним). Пустое (тогда слот создаётся пустым)
назв Переопределяет всплывающий текст для предметов. Следует обратить внимание, что он имеет более низкий приоритет, чем переопределение с помощью квадратных скобок, а значит, если используются оба метода сразу, отображён будет текст из скобок. Пустое (тогда всплывающие тексты остаются нетронутыми)
ссылка Определяет, на какую страницу ссылаются изображения. Пустое (тогда изображения ссылаются на одноимённые с ними страницы)

Зависимости

Примечания

  1. Курсивом выделен текст, который заменяется на соответствующее значение. В [квадратных скобках] указан фрагмент, который не всегда присутствует.
  2. Параметры с числовыми названиями являются порядковыми и обычно указываются без названия, которое тогда соответствует порядковому номеру среди таких аргументов.
-------------------------------------------------------------------
--- Модуль для отображения инвентарных слотов в Minecraft Wiki.
-------------------------------------------------------------------

local p = {}

-- Список приставок к названиям, обрабатываемых другими модулями.
-- Так будет легче, например, убирать их из целей ссылок.
-- ВНИМАНИЕ: указывайте все варианты склонения по родам и числам.
p.prefixes = {
	'Любой', 'Любая', 'Любое', 'Любые',
	'Повреждённый', 'Повреждённая', 'Повреждённое', 'Повреждённые' -- использование Ё обязательно
}

p.modAliases = mw.loadData("Модуль:Модификации")

--- Создание слота
function p.slot(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 '')
	
	--- Псевдонимы оригинальной игры
	local aliases = mw.loadData('Модуль:Инвентарный слот/Псевдонимы')

    --- Проверка и замена всех фреймов на псевдонимы

    local frames = {}
	for frame in mw.text.gsplit( args[1], '%s*;%s*' ) do

		local frameParts = p.getParts( frame, args["мод"] )
		local id = frameParts.name
        -- if frameParts.mod then
		--	id = frameParts.mod .. ':' .. id
		-- end

        --- Загрузка списка псевдонимов к модам
        local modAliases
        if frameParts.mod then
            if mw.title.new('Модуль:ИнвСпрайт/' .. frameParts.mod).exists then
                modAliases = mw.loadData('Модуль:ИнвСпрайт/' .. frameParts.mod)["настройки"]["модпсевдонимы"]
                if modAliases and mw.title.new('Модуль:' .. modAliases).exists then
                    modAliases = mw.loadData('Модуль:' .. modAliases)
                end
            end
        end

        local alias = nil
		if frameParts.mod then
            if modAliases and modAliases[id] then

            --- псевдонимы следует прописывать в модуле в формате ['имя'] = '[титл]:имя[доп. текст]',  титл и доп.текст необязательно указывать

                local title = mw.ustring.match ( modAliases[id], '^%[([^%]]+)%]' )
                if title then
                    local aaa = mw.ustring.match ( modAliases[id], '^%[[^%]]+%](.+)$' )
                    if aaa then
                        alias = '[' .. title .. ']' .. frameParts.mod .. ':' .. aaa
                    else
                        alias = '[' .. title .. ']' .. frameParts.mod .. ':' .. frameParts.name
                    end
                else 
                    alias = frameParts.mod .. ':' .. modAliases[id]
                end
            end
		elseif aliases and aliases[id] then
			alias = aliases[id]
		end

		if alias then
			table.insert( frames, p.expandAlias( frameParts, alias ) )
		else
			table.insert( frames, frame )
		end
	end
    args[1] = table.concat( frames, ';' )

    --- Проверка и замена всех фреймов на псевдонимы (конец)
	
	--- Построение спрайта
	
	-- Параметры
	local sprite
	local ids = mw.loadData([[Модуль:ИнвСпрайт]])["IDы"]
	local modIds = {}
	local back_modData = {}
	local param
	local animated = mw.ustring.find(args[1], ';')
	local pageName = mw.title.getCurrentTitle().text
	local imgClass = args["классизобр"]
	local imgStyle = args["стильизобр"]
	local numStyle = args["стильцифр"]
	local scale = args["масштаб"] or '1'
	local imgSize = 32 * scale
	local valign
	

	local body = mw.html.create('span'):css{['vertical-align'] = args["выравн"]}
	
	if scale == '0.5' then
		body:css('top','-1px')
	end

	if animated then
		body:addClass('animated')
	end
	if args["класс"] then
		body:addClass(args["класс"])
	end
		body:addClass('invslot')
	if scale == '1' then
		body:css('width', 32 .. 'px')
		body:css('height', 32 .. 'px')
	else
		body:css('width', scale*32 .. 'px')
		body:css('height', scale*32 .. 'px')
	end
	if args["стиль"] then
		body:cssText(args["стиль"])
	end
	
	if (args["умолчание"] or '') ~= '' then
		body:css('background-image', '{{FileUrl|' .. args["умолчание"] .. '.png}}')
	end

    ---спрайты для фона
	local n = args["умолчаниеCSS"]
	local Back_ID = args["Фон ИД"]
	local mod = args["мод"]
	if (n or Back_ID) and mod then
		if not Back_ID then
			if mw.title.new('Модуль:ФоновыйСпрайт/' .. mod).exists then
				back_modData = mw.loadData('Модуль:ФоновыйСпрайт/' .. mod .. '/ID')
				param = mw.loadData('Модуль:ФоновыйСпрайт/' .. mod)
				size = param["разм"]
				sheet_size = param["формат"]
				Back_ID = back_modData[n]
				body:css('background-image','{{FileUrl|' .. mod .. 'bkgrdCSS')
			end
		else
			body:addClass('gt-invslot')
			size = 16
			sheet_size = 160
		end
		if Back_ID then
			local pos = Back_ID - 1
			local back_scale = 32 / size
			local tiles = sheet_size / size
			local left = pos % tiles * 32
			local top = math.floor( pos / tiles ) * 32
			body:css('background-size', sheet_size * back_scale ..'px')
			body:css('background-position', '-' .. left .. 'px -' .. top ..'px')
		end
	end
	
	--- Обработка фреймов
	local first = true
	for frame in mw.text.gsplit(args[1], '%s*;%s*') do
		local item
		if frame ~= '' or frame == '' and animated then
			item = body:tag('span'):addClass('invslot-item')
			if imgClass then
				item:addClass(imgClass)
			end
			if imgStyle then
				item:cssText(imgStyle)
			end
		end
		
		if frame == '' then
			(item or body):tag('br')
		else
			local category
			local parts = p.getParts(frame, args["мод"])
			local title = parts.title or mw.text.trim(args["назв"] or '')
			local mod = parts.mod
            local name = parts.name
			local num = parts.num
			local description = parts.text
            
            --- Добавляем к доп тексту название мода
			local img, idData, en_name
			if mod then
				local modData = modIds[mod]
				if not modData and mw.title.new('Модуль:ИнвСпрайт/' .. mod).exists then
					local modDataModule = mw.loadData('Модуль:ИнвСпрайт/' .. mod)
					local idListOverride = modDataModule['настройки']['списокID']
					if idListOverride then
						modData = mw.loadData('Модуль:' .. idListOverride)['IDы']
					else
						modData = modDataModule['IDы']
					end
					modIds[mod] = modData
				end
				if modData and modData[name] then
					idData = modData[name]
                    en_name = idData["en"]
				else
					img = name .. ' (' .. mod .. ')'
				end
			elseif ids[name] then
				idData = ids[name]
			else
				img = name
			end
			
			local link = args["ссылка"] or ''
			if link == '' then
				if mod then
					link = mod .. '/' .. name
				else
					link = mw.ustring.gsub(name, '^Повреждённ[ыао][йяе] ', '')
				end
			elseif mw.ustring.lower(link) == 'нет' then
				link = nil
			end
			if link == pageName then
				link = nil
			end
			
			local formattedTitle
			local plainTitle
			if title == '' then
				plainTitle = name
			elseif mw.ustring.lower(title) ~= 'нет' then
				plainTitle = mw.ustring.gsub(mw.ustring.gsub(title, '\\\\', '\'), '\\&', '&')
				
				local formatPattern = '&[0-9a-fk-or]'
				if mw.ustring.match(plainTitle, formatPattern) then
					formattedTitle = title
					plainTitle = mw.ustring.gsub(plainTitle, formatPattern, '')
				end
				
				if plainTitle == '' then
					plainTitle = name
				else
					plainTitle =  mw.ustring.gsub(mw.ustring.gsub(plainTitle, '\', '\\'), '&', '&')
				end
			elseif link then
				if img then
					formattedTitle = ''
				else
					plainTitle = ''
				end
			end
			
			if mod and mod == 'GregTech' and idData and idData["страница"] and mw.title.new('Модуль:GregTechProc/Материалы/' .. idData["страница"]).exists then
				local mat_info = mw.loadData('Модуль:GregTechProc/Материалы/' .. idData["страница"])
				if mat_info then
					local formula = mat_info["Формула"]
					local melt = mat_info["Плавление"]
					local boil = mat_info["Испарение"]
					if not description then
						description = ''
					end
					description = description .. '/&7Формула: &e' .. formula .. '/&6t° плавления: ' .. melt .. 'K/&ct° испарения: ' .. boil .. 'K'
				end
			end
			
			item:attr{
				['data-minetip-title'] = formattedTitle,
				['data-minetip-text'] = description,
				['data-modinfo-text'] = mod,
                ['data-minetip-lowtitle'] = en_name
			}
						
			
			if img then
				-- & is re-escaped because mw.html treats attributes
				-- as plain text, but MediaWiki doesn't
				local escapedTitle = ( plainTitle or '' ):gsub( '&', '&' )
				item:addClass('invslot-item-image')
					:wikitext('[[Файл:Grid ', img, '.png|' .. imgSize .. 'x' .. imgSize .. 'px|link=', link or '', '|', escapedTitle, ']]')
					:css('width', scale * 32 .. 'px')
					:css('height', scale * 32 .. 'px')
			else
				if not sprite then
					sprite = require([[Модуль:Спрайт]]).sprite
				end
				local image
				if mod then
					image = (args["таблспрайтов"] or mod or "Inv") .. 'CSS.png'
				end
				if link then
					item:wikitext('[[', link, '|')
				end

				local image, spriteCat;
				if not mod then
				    image, spriteCat = sprite{
					    ["масштаб"] = scale, ["данныеID"] = idData, ["назв"] = plainTitle,
					    ["изобр"] = image, ["данные"] = 'ИнвСпрайт'
					    }
				else
				    image, spriteCat = sprite{
					    ["масштаб"] = scale, ["данныеID"] = idData, ["назв"] = plainTitle,
					    ["изобр"] = image, ["данные"] = 'ИнвСпрайт/' .. mod
					    }
				end
				item:node(image)
				category = spriteCat
			end
			
			if num and num > 1 and num < 1000 then
				if img and link then
					item:wikitext('[[', link, '|')
				end
				local number = item
					:tag('span')
						:addClass('invslot-stacksize')
						:attr{title = plainTitle}
						:wikitext(num)
				if numStyle then
					number:cssText(numStyle)
				end
				if img and link then
					item:wikitext(']]')
				end
			end
			
			if idData and link then
				item:wikitext(']]')
			end
			
			item:wikitext(category)
		end
		
		if first then
			if animated and item then
				item:addClass('active')
			end
			first = false
		end
	end
	
	return tostring( body )
end

function p.expandAlias( frameParts, alias )
	-- If the frame has no parts, we can just return the alias as-is
	--[[if not frameParts.title and not frameParts.mod and not frameParts.num and not frameParts.text then
		return alias
	end--]]
	
	local expandedFrames = {}
	for aliasFrame in mw.text.gsplit(alias, '%s*;%s*') do
		local aliasParts = p.getParts(aliasFrame)
		aliasParts.title = frameParts.title or aliasParts.title or ''
		aliasParts.mod = frameParts.mod or aliasParts.mod or 'Minecraft'
		aliasParts.num = frameParts.num or aliasParts.num or ''
		aliasParts.text = frameParts.text or aliasParts.text or ''
		
		table.insert(expandedFrames, mw.ustring.format(
			'[%s]%s:%s,%s[%s]',
			aliasParts.title, aliasParts.mod, aliasParts.name, aliasParts.num, aliasParts.text
		))
	end
	
	return table.concat(expandedFrames, ';')
end


function p.getParts(frame, mod)
----Функция получает название предмета в формате "[титл]мод:имя[доп.текст],число"
----parts.title = титл, название предмета при наведении
----parts.mod = мод
----parts.name = имя
----parts.text = текст, дополнительный текст при наведении на предмет
----parts.num = число

	local parts = {}
	parts.title = mw.ustring.match(frame, '^%[%s*([^%]]+)%s*%]')
	
    local modPattern
    if mw.ustring.match(frame, '^%[.*%]([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):') then
    modPattern = '^%[.*%]([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):'
    else
    modPattern = '^([a-zA-Zа-яА-Я0-9ёЁé _%-\']+):'
    end

	parts.mod = mw.text.trim(mw.ustring.match(frame, modPattern) or mod or '') ---- Получаем название мода

	local vanilla = {v = 1, vanilla = 1, mc = 1, minecraft = 1}
	if parts.mod == '' or vanilla[mw.ustring.lower(parts.mod)] then
		parts.mod = nil
	else
	    if p.modAliases[parts.mod] then
		    parts.mod = p.modAliases[parts.mod]
        end
        parts.mod = mw.ustring.gsub(parts.mod,'_',' ')
    end

	local _, nameStartV = mw.ustring.find( frame, '^%[[^%]]*%]' )
	local nameStart = ( ({mw.ustring.find( frame, modPattern )})[2] or nameStartV or 0 ) + 1
	if nameStart - 1 == #frame then
		nameStart = 1
	end
	parts.name = mw.text.trim( mw.ustring.sub( frame, nameStart, ( mw.ustring.find( frame, '[,%[]', nameStart ) or 0 ) - 1 ) )
	
	parts.num = math.floor(mw.ustring.match(frame, ',%s*(%d+)') or 0)
	if parts.num == 0 then
		parts.num = nil
	end
	
	parts.text = mw.ustring.match(frame, '%[%s*([^%]]+)%s*%]$')
    
	return parts
end
 
return p