Модуль:Iteminfo

Материал из Terraria Wiki
Перейти к навигации Перейти к поиску
Lua.svg Документация Документация, указанная ниже, находится на странице «Модуль:Iteminfo/док». (править | история)
См. также этот модуль на английском языке: Module:Iteminfo. В нём может содержаться более полная или подробная информация.

Этот модуль используется для получения динамических и достоверных характеристик предметов. Он берёт данные напрямую из исходного кода, упрощая отображение характеристик без необходимости их изменения при последующих обновлениях игры.

Он также используется для работы шаблона {{iteminfo}}. Как правило, в статьях вместо модуля должен использоваться именно этот шаблон. В нём содержатся дополнительные утилиты, такие как форматирование вывода и алиасов параметров.

Код модуля на данный момент синхронизирован с версией Terraria 1.4.4.9(Издания для ПК, консолей и мобильных устройств).

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

Все характеристики

{{#invoke:iteminfo|getInfo| id = <id предмета> | prefix = <префикс имён переменных для вывода> }}

или

{{#invoke:iteminfo|getInfo| <id предмета> | <префикс имён переменных для вывода> }}

id

ID предмета, должно быть в диапазоне от 1 до 5455. Обратите внимание, что следующие ID устарели и, следовательно, недействительны: от 2772 до 2775, от 2777 до 2780, от 2782 до 2785, 2881, 3273, от 3340 до 3346, от 3462 до 3465, 3750, от 3847 до 3851, 3861 и 3862.

prefix (необязательный)

Префикс для выходной переменной, по умолчанию это _iteminfo_. Например, имя переменной значения по умолчанию это _iteminfo_value. Если используете prefix=my_, то имя переменной должно быть my_value. При использовании этого метода модуль задаёт количество переменных DPL, которые затем, например, можно будет получить при помощи {{#dplvar:_iteminfo_value}}. Этот метод предпочтительно использовать для Lua-скриптов в силу быстроты DPL.

Одна характеристика

{{#invoke:iteminfo|getStat| id = <id предмета> | stat = <название характеристики> }}

или

{{#invoke:iteminfo|getStat| <id предмета> | <название характеристики> }}

id

ID предмета, должно быть в диапазоне от 1 до 5455. Обратите внимание, что следующие ID устарели и, следовательно, недействительны: от 2772 до 2775, от 2777 до 2780, от 2782 до 2785, 2881, 3273, от 3340 до 3346, от 3462 до 3465, 3750, от 3847 до 3851, 3861 и 3862.

stat (необязательный)

Название характеристики, см. таблицу ниже для возможных значений.


Если вы не уверены, что указанный вами ID корректен, проверьте его через {{#dplvar:_iteminfo_type}}. ID отобразится, если оно корректно, иначе значение будет пустым.

Все поля вывода перечислены ниже. Обратите внимание, что не все из них используются; см. примечание к каждой строке. И, пожалуйста, также обращайтесь к документациям по tModLoader и tConfig.

Примечание: Вы можете получить название предмета из идентификатора при помощи {{ItemNameFromId}}.

dplvar
(без префикса)
Значение по умолчанию Пример
(здесь: ID = 757)
Примечание
type 0 757 ID предмета. Если ID как аргумент задан корректно, то значение будет выведено числом. Иначе значение будет пустым.
internalName TerraBlade Внутреннее название предмета.
name Terra Blade Название предмета на английском языке.
lname Переведённое название предмета.
DD2Summon Если имеется, то это значит, что это призывающее стражей оружие от трактирщика(Издания для ПК, консолей и мобильных устройств).
ToolTip На данный момент всегда пусто. Сохранено для использования в будущем. Можете использовать {{itemTooltip}} для вывода подсказок.
material 1 Если имеется, то этот предмет — материал. Вы также можете использовать {{#invoke:Recipes|exist|ingredient=<название предмета>}}, чтобы отобразить эту информацию.
accessory Если имеется, то этот предмет — аксессуар.
alpha 0 0
ammo 0 0 ID боеприпаса (используется в поле useAmmo) и не только, например 353, 154
autoReuse 1 Если имеется, то у этого предмета есть автовзмах.
axe 0 0 Мощность топора. 1 ≙ 5%, например, axe = 23 означает, что мощность топора у этого предмета равна 115%.
backSlot -1 -1 ID ячейки со спины. См. «Идентификаторы брони» § «Аксессуары».
bait 0 0 Качество наживки (в процентах), например, bait = 50 означает, что качество наживки у этого предмета равно 50%.
balloonSlot -1 -1 ID ячейки шарика. См. «Идентификаторы брони» § «Аксессуары».
bodySlot -1 -1 ID ячейки тела (груди). См. «Идентификаторы брони».
buffTime 0 0 Время действия бафа, который дает этот предмет, в тиках (1 тик = 1/60 секунды и 1/3600 минуты). Например, если buffTime = 14400, то это означает, что баф будет действовать в течение 240 секунд (14400/60 = 240), что равняется четырём минутам (14400/3600 = 4).
buffType 0 0 ID бафа, накладываемого этим предметом.
canBePlacedInVanityRegardlessOfConditions
cartTrack Задаётся для рельс.
channel Если имеется, то это означает, что предмет можно/нужно использовать постоянно (здесь имеется в виду не автовзмах, а именно возможность удерживания предмета!). Задаётся для кистеней и йо-йо, бензопил и буров, волшебной ракеты и её аналогов, жезла земли, пираньевой пушки, хлорофитового отбойного молотка, лазерного пулемёта, заряжаемой бластер-пушки, летающего ножа, головы Медузы, Архалиса, портальной пушки, «Вихревого загонщика», «Фантома», «Высшего замысла», последней призмы, сонного осьмижезла, жуткой глефы, «Призрачного феникса», «Ярости небесного дракона». Также задаётся для некоторых предметов, призывающих питомцев/освещающих питомцев/средства передвижения, так как они действуют постоянно.
consumable Задаётся для предметов, которые расходуются (все они перечислены в категории «Расходуемые предметы»). Обратите внимание, что они отличаются от внутриигрового понятия слова «расходуемые»! См. для ясности категорию «Расходуемые предметы» . Если данный атрибут имеет значение True, то один предмет из стопки будет удалён при использовании.
craftable 1 Если имеется, то этот предмет может быть создан. Вы также можете использовать {{#invoke:Recipes|exist|result=<название предмета>}}, чтобы отобразить эту информацию.
createTile -1 -1 ID тайла этого предмета, который создаётся при размещении. placeStyle — это подкатегория ID тайла.
placeStyle 0 0
createWall -1 -1 ID стены этого предмета, который создаётся при размещении.
crit 0 0 Шанс критического удара (в процентах), который добавляется к основному шансу в 4%, например, crit = 2 означает, что шанс критического удара этого предмета равен 6%; crit = 4 означает, что шанс критического удара этого предмета равен 8%.
damage -1 85 Базовый урон предмета.
defense 0 0 Уровень защиты, который даёт этот предмет.
dye 0 0 Если значение не равно нулю, то этот предмет — краситель.
expert Если имеется, то этот предмет будет отображаться с уровнем редкости Класс редкости: Радужный.
faceSlot -1 -1 ID ячейки на лице. См. «Идентификаторы брони» § «Аксессуары».
fishingPole 0 0 Навык рыбной ловли предмета (в процентах), например, fishingPole = 27 означает, что навык рыбной ловли этого предмета равен 27%.
flame Задаётся для каждого вида факела, а также для водяной, мирной, платиновой и обычной свечи. Что интересно, оно также задаётся для адского меча.
frontSlot -1 -1 ID ячейки спереди. См. «Идентификаторы брони» § «Аксессуары».
glowMask -1 -1
hairDye -1 -1 Значение равное нулю задаётся для смывателя краски для волос, а положительные числа — для красок для волос.
hammer 0 0 Мощность молота (в процентах), например, hammer = 90 означает, что мощность молота предмета равна 90%.
handOffSlot -1 -1 ID ячейки свободной руки. См. «Идентификаторы брони» § «Аксессуары».
handOnSlot -1 -1 ID ячейки занятой руки. См. «Идентификаторы брони» § «Аксессуары».
headSlot -1 -1 ID ячейки головы. См. Идентификаторы брони.
healLife 0 0 Количество очков здоровья, которое восстанавливает предмет при использовании.
healMana 0 0 Количество очков маны, которое восстанавливает предмет при использовании.
holdStyle 0 0 Может быть только в виде значения от 0 до 3. Значение 1 задаётся для каждого вида факела, а также для водяной, мирной, платиновой и обычной свечи, липкой светящейся палочки, прыгучей светящейся палочки, светящейся палочки спелеолога и обычной светящейся палочки, эля, единорога на палке, сигнальной ракетницы, зефира на палочке, таинства туманности. Значение 2 задаётся для дыхательной трубки, зонтика. Значение 3 задаётся для магической арфы.
knockBack 0 6.5 Значение отбрасывания предмета.
legSlot -1 -1 ID ячейки ноги. См. Идентификаторы брони.
lifeRegen 0 0 Может быть только в виде 0 или 1. Значение 1 задаётся для браслета восстановления и амулета мифов.
makeNPC 0 0 Если значение не равно нулю, то это означает, что предмет используется для призыва существ (NPC). Значение соответствует ID существа, которое призывается.
mana 0 0 Количество маны, которое предмет потребляет при использовании.
maxStack 1 1 Максимальное количество в стопке.
mech Если имеется, то этот предмет является механизмом, что также означает, что он отображает провода и актуаторы, если находится в руке.
melee 1 Если имеется, то этот предмет наносит урон в ближнем бою.
magic Если имеется, то этот предмет наносит магический урон.
ranged Если имеется, то этот предмет наносит урон в дальнем бою.
summon Если имеется, то этот предмет наносит урон от призванного существа.
thrown Если имеется, то этот предмет наносит урон при броске.
mountType -1 -1 ID средства передвижения, которое призывает этот предмет при использовании.
netID 0 757
neckSlot -1 -1 ID ячейки на шее. См. «Идентификаторы брони» § «Аксессуары».
noMelee 1 Разрешено ли этому предмету наносить урон своим спрайтом. Обычно ставится значение true для оружия дальнего боя, которое вместо этого будет полагаться на свои снаряды для нанесения урона.
noUseGraphic Отрисовывается ли спрайт этого элемента, когда он используется. Используется в таком метательном оружии, как динамит, потому что его тут же бросают на землю, чтобы создать иллюзию того, что его используют.
noWet Если имеется, то предмет нельзя держать в руках/размещать под водой: единорог на палке, каждый вид свечи и каждый вид факела (кроме проклятого и ихорного). Тем не менее, он также задаётся для таймеров, которые могут размещаться под водой.
notAmmo Задаётся только для монет, эля, проводов. Помимо проводов, их объединяет ещё то, что их нельзя размещать в ячейку боеприпасов инвентаря, даже если они используются как боеприпасы. Однако в эту ячейку можно разместить провода.
paint 0 0 Если значение не равно нулю, то этот предмет — краска. Это значение является чем-то вроде «ID краски», которое находится в диапазоне от 1 (красная краска) до 30 (негативная краска).
pick 0 0 Мощность кирки (в процентах), например, pick = 150 означает, что мощность кирки предмета равна 150%.
potion Если имеется, никакие другие предметы с этим атрибутом нельзя использовать до тех пор, пока не истечёт время восстановления. Оно используется для лечащих предметов и грибов.
rare 0 8 Редкость предмета. Значение будет некорректно, если задано expert, поскольку это означает, что предмет имеет редкость уровня Класс редкости: Радужный.
reuseDelay 0 0 Время в тиках (1 тик = 1/60 секунды и 1/3600 минуты) до тех пор, пока предмет можно будет использовать снова, обычно называемое «задержкой использования». На данный момент задаётся только для заводной штурмовой винтовки, головы Медузы, последней призмы, «Рассекателя небес» и проклятия Бетси.
sacrifices 0 1 Необходимое количество предметов для исследования.
scale 1 1
sentry Если имеется, то этот предмет является призывающим стражей.
shieldSlot -1 -1 ID ячейки щита. См. «Идентификаторы брони» § «Аксессуары».
shoeSlot -1 -1 ID ячейки обуви. См. «Идентификаторы брони» § «Аксессуары».
shopCustomPrice -1 Стоимость предметов армии Древних(Издания для ПК, консолей и мобильных устройств), в медалях защитника.
shoot 0 985 Если значение не равно нулю, то это ID снаряда, выпускаемого предметом.
shootSpeed 0 12 Скорость снаряда, выпускаемого предметом.
stringColor Цвет верёвочки.
tileBoost 0 0 Бонус дальности, например, tileBoost = 4 означает, что дальность этого предмета увеличена до 4. Также упоминается в подсказках предмета как, например, «+4 к дальности».
tileWand -1 -1 ID предмета блока, который размещает палочка.
questItem Задаётся только для квестовых рыб.
uniqueStack Задаётся только для квестовых рыб. См. Рыбалка#Задания рыбака для более подробной информации о качестве этих предметов.
useAmmo 0 0 Тип боеприпасов, которые используются этим предметом. 23 для геля, 40 для стрелы, 71 для монеты, 75 для упавшей звезды, 97 для пули, 169 для песка, 283 для дротика, 771 для ракеты, 780 для раствора, 931 для сигнальной ракеты, 949 для снежка, 1261 для болта «Стингера», 1783 для кэнди-корна, 1785 для светильника Джека, 1836 для кола, 3108 для гвоздя.
useAnimation 100 18 Как долго проигрывается анимация предмета, в тиках (1 тик = 1/60 секунды и 1/3600 минуты). Интересная особенность заключается в том, что если значение useTime ниже, чем у useAnimation, то она будет проигрываться один или несколько раз за использование (как, например, «Золотой дождь»). Если предмет является мечом с автовзмахом, то время использования предмета (которое отображается в игре и на вики) будет задано как useAnimation = -1.
UseSound Item_1 Название файла (без расширения файла, чем обычно является .wav) звукового эффекта, который воспроизводится этим предметом при использовании. Обратите внимание, что указанный звук является только основным; он может быть проигран с изменённой высотой тона и громкостью в игре.
useStyle 0 1 1 = общий взмах/бросок, 2 = поедание/использование, 3 = колотый удар, 4 = держание, 5 = убирание. Также см. список tConfig.
useTime 100 18 Скорость инструмента, (внутреннее) время использования для других. Сколько времени нужно для использования предмета, в кадрах. Пока предмет находится в состоянии использования, вы не можете выполнять другие действия.
useTurn Будет ли игрок поворачиваться лицом в направлении своего движения при использовании предмета. Например, меч поворачивает вас лицом влево или вправо, а вот копьё — нет. Если задать значение как useTurn = false, то это позволит игроку не поворачиваться в сторону своего движения при использовании.
value 0 1000000 Значение стоимости, в медных монетах. Стоимость продажи = стоимость покупки / 5. Шаблон {{Coin}} помогает с форматированием этого значения для корректного отображения.
vanity Если имеется, то этот предмет — предмет стиля.
waistSlot -1 -1 ID ячейки туловища. См. «Идентификаторы брони» § «Аксессуары».
wingSlot -1 -1 ID ячейки крыльев. См. «Идентификаторы брони» § «Аксессуары».

---Item info database
---luacache.get() is relative slow, therefore we load data from luacache only once per page.
local data = mw.loadData('Module:Iteminfo/loaddata')

local trim = mw.text.trim
local idSets = require('Module:Iteminfo/idSets')

local info = {
	version = data['_terrariaversion'],
	IDs = { -- min and max are both inclusive
		min = 1,
		max = 5455,
	},
}
info.IDs.isValidWithUnused = function(id)
	-- IDs marked as "unused" are still considered valid by this function
	return id ~= nil and type(id) == 'number' and id >= info.IDs.min and id <= info.IDs.max
end
info.IDs.isValid = function(id)
	-- IDs marked as "unused" are considered invalid by this function
	return info.IDs.isValidWithUnused(id) and idSets.getValue('Unused', id) ~= true
end

-- cache
local currentFrame

-- helper function
local getArg = function(key)
	local value = currentFrame.args[key]
	if not value then
		return nil
	end
	value = trim(value)
	if value == '' then
		return nil
	else
		return value
	end
end

-- credit: http://richard.warburton.it
-- this version is with trim.
local function explode(div,str) 
	if (div=='') then return false end
	local pos,arr = 0,{}
	-- for each divider found
	for st,sp in function() return string.find(str,div,pos,true) end do
		arr[#arr + 1] = trim(string.sub(str,pos,st-1)) -- Attach chars left of current divider
		pos = sp + 1 -- Jump past current divider
	end
	arr[#arr + 1] = trim(string.sub(str,pos)) -- Attach chars right of last divider
	return arr
end

local getStat = function(itemid, stat)
	return data[itemid][stat] or data[0][stat] or nil -- "or nil" will convert "false" to "nil"
end

local statname = {
	["acc"] = "accessory",
	["autoreuse"] = "autoReuse",
	["autoswing"] = "autoReuse",
	["auto"] = "autoReuse",
	["axe power"] = "axe",
	["axepower"] = "axe",
	["bait power"] = "bait",
	["baitpower"] = "bait",
	["body slot"] = "bodySlot",
	["bodyslot"] = "bodySlot",
	["buff duration"] = "buffTime",
	["buff id"] = "buffType",
	["buffduration"] = "buffTime",
	["buffid"] = "buffType",
	["bufftime"] = "buffTime",
	["bufftype"] = "buffType",
	["carttrack"] = "cartTrack",
	["createtile"] = "createTile",
	["createwall"] = "createWall",
	["critical"] = "crit",
	["dd2summon"] = "DD2Summon",
	["dmg"] = "damage",
	["fishing power"] = "fishingPole",
	["fishingpole"] = "fishingPole",
	["fishingpower"] = "fishingPole",
	["fishing"] = "fishingPole",
	["hair dye"] = "hairDye",
	["hairdye"] = "hairDye",
	["hammer power"] = "hammer",
	["hammerpower"] = "hammer",
	["head slot"] = "headSlot",
	["headslot"] = "headSlot",
	["heallife"] = "healLife",
	["healmana"] = "healMana",
	["holdstyle"] = "holdStyle",
	["id"] = "type",
	["internal name"] = "internalName",
	["internalname"] = "internalName",
	["item id"] = "type",
	["itemid"] = "type",
	["kb"] = "knockBack",
	["knockback"] = "knockBack",
	["leg slot"] = "legSlot",
	["legslot"] = "legSlot",
	["liferegen"] = "lifeRegen",
	["makenpc"] = "makeNPC",
	["maxstack"] = "maxStack",
	["mount id"] = "mountType",
	["mountid"] = "mountType",
	["mounttype"] = "mountType",
	["mount"] = "mountType",
	["nomelee"] = "noMelee",
	["notammo"] = "notAmmo",
	["nousegraphic"] = "noUseGraphic",
	["nowet"] = "noWet",
	["pick power"] = "pick",
	["pickpower"] = "pick",
	["pickaxe power"] = "pick",
	["pickaxepower"] = "pick",
	["pickaxe"] = "pick",
	["placestyle"] = "placeStyle",
	["projectileid"] = "shoot",
	["projectile id"] = "shoot",
	["questitem"] = "questItem",
	["range bonus"] = "tileBoost",
	["rangebonus"] = "tileBoost",
	["rarity"] = "rare",
	["reusedelay"] = "reuseDelay",
	["shootspeed"] = "shootSpeed",
	["sound"] = "UseSound",
	["sounduse"] = "UseSound",
	["stack"] = "maxStack",
	["stringcolor"] = "stringColor",
	["tile id"] = "createTile",
	["tile sub id"] = "placeStyle",
	["tile subid"] = "placeStyle",
	["tilesubid"] = "placeStyle",
	["tile wand"] = "tileWand",
	["tileboost"] = "tileBoost",
	["tileid"] = "createTile",
	["tilewand"] = "tileWand",
	["tile"] = "createTile",
	["tool speed"] = "useTime",
	["toolspeed"] = "useTime",
	["tooltip"] = "ToolTip",
	["uniquestack"] = "uniqueStack",
	["use delay"] = "reuseDelay",
	["use sound"] = "UseSound",
	["use style"] = "useStyle",
	["use time"] = "useAnimation",
	["useammo"] = "useAmmo",
	["useanimation"] = "useAnimation",
	["usedelay"] = "reuseDelay",
	["usesound"] = "UseSound",
	["usestyle"] = "useStyle",
	["usetime"] = "useAnimation",
	["useturn"] = "useTurn",
	["use"] = "useAnimation",
	["velocity"] = "shootSpeed",
	["wall id"] = "createWall",
	["wallid"] = "createWall",
	["wall"] = "createWall",
	["sell"] = "value",
	--non-native stats:
	["buy"] = "buyValue",
	["price"] = "buyValue",
	["buffname"] = "buffName",
	["buff name"] = "buffName",
	["buff"] = "buffName",
	["research"] = "sacrifices"
}

local proc = {}
proc.axe = function(value)
	return currentFrame:expandTemplate{ title = 'percent', args = { tostring((value or 0) * 5) .. '%' } }
end
proc.bodySlot = function(value)
	return (value == -1) and "" or value
end
proc.createTile = proc.bodySlot
proc.createWall = proc.bodySlot
proc.damage = proc.bodySlot
proc.hairDye = proc.bodySlot
proc.headSlot = proc.bodySlot
proc.legSlot = proc.bodySlot
proc.mountType = proc.bodySlot
proc.tileWand = proc.bodySlot
proc.bait = function(value)
	return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } }
end
proc.fishingPole = proc.bait
proc.hammer = proc.bait
proc.pick = proc.bait
proc.buffTime = function(value)
	return currentFrame:expandTemplate{ title = 'duration', args = { (value or 0)/60 } }
end
proc.buffName = function(value, id)
	return currentFrame:expandTemplate{ title = 'GetBuffInfo', args = { getStat(id, 'buffType'), 'ename' } }
end
proc.crit = function(value, id)
	if getStat(id, 'damage') == -1 then
		return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value) .. '%' } } -- no damage value
	else
		return currentFrame:expandTemplate{ title = 'percent', args = { tostring(value+4) .. '%' } }  -- has damage value
	end
end
proc.damagetype = function(value, id)
	if getStat(id, 'melee') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_melee' } }
	end
	if getStat(id, 'ranged') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_ranged' } }
	end
	if getStat(id, 'magic') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_magic' } }
	end
	if getStat(id, 'summon') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_summon' } }
	end
	if getStat(id, 'thrown') then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'damagetype_thrown' } }
	end
end
proc.rare = function(value)
	return currentFrame:expandTemplate{ title = 'rare', args = { (value or 0), cate=getArg('cate') or getArg('category') or getArg('cat') or 'no' } }
end
proc.tileBoost= function(value)
	if value ~= 0 then
		if value > 0 then
			value = '+' .. tostring(value)
		else
			value = tostring(value)
		end
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'tileBoost', ['$tiles$'] = value } }
	end
end
proc.useAmmo = function(value)
	if value == 40 or value == 71 or value == 97 or value == 283 or value == 771 or value == 931 then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'ammo'..tostring(value) } }
	end
	return currentFrame:expandTemplate{ title = 'itemNameFromId', args = { value } }
end
proc.UseSound = function(value)
	local str = ''
	for _,v in pairs(explode(',', value)) do
		str = str .. currentFrame:expandTemplate{ title = 'sound', args = { '', v..'.wav' } }
	end
	return str
end
proc.useStyle = function(value)
	if value == 0 then
		return
	end
	if value >= 1 and value <= 5 then
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'usestyle'..tostring(value) } }
	end
	return value
end
proc.buyValue = function(value, id)
	local t=getStat(id, 'shopCustomPrice')
	if t then
		return currentFrame:expandTemplate{ title = 'dm', args = { t } }
	else
		return currentFrame:expandTemplate{ title = 'coin', args = { tostring(getStat(id, 'value'))..'cc' } }
	end
end
proc.value = function(value)
	value = tonumber(value or 0)
	if value > 0 then
		if value < 5 then
			-- items with value<5 have a sell value of 1, not 0 (contrary to regular rounding)
			return currentFrame:expandTemplate{ title = 'coin', args = { '1cc' } }  
		else
			return currentFrame:expandTemplate{ title = 'coin', args = { tostring(math.floor(value/5))..'cc' } }  
		end
	else
		return currentFrame:expandTemplate{ title = 'l10n', args = { 'GetItemInfo', 'noValue' } }
	end
end


---------------------------

local p = {
	-- info table for other modules
	info = info,
	
	-- info table data for templates
	v = function(frame)
		return info.version
	end,
	maxId = function(frame)
		return info.IDs.max
	end,
	isValidId = function(frame)
		currentFrame = frame -- cache
		if getArg('includeUnused') then
			return info.IDs.isValidWithUnused(tonumber(getArg(1)) or 0) and 1 or 0
		end
		return info.IDs.isValid(tonumber(getArg(1)) or 0) and 1 or 0
	end,

	-- for other modules: get all stats, return them as a table
	getItemInfo = function(itemid)
		if not data[itemid] then
			itemid = 0
		end
		local result = {['type'] = itemid}
		for k,v in pairs(data[0]) do
			result[k] = v
		end
		for k,v in pairs(data[itemid]) do
			result[k] = v
		end
		return result
	end,

	-- for templates: get all stats, set them in dplvars
	getInfo = function(frame)
		currentFrame = frame -- cache

		local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0
		local prefix = getArg('prefix') or getArg(2) or '_iteminfo_'

		if not data[itemid] then
			itemid = 0
		end
		
		local result = {['type'] = itemid}
		for k,v in pairs(data[0]) do
			result[k] = v
		end
		for k,v in pairs(data[itemid]) do
			result[k] = v
		end

		local args = {}
		local fields = {}
		for k,v in pairs(result) do
			args[#args + 1] = prefix .. k
			args[#args + 1] = v
			fields[#fields + 1] = k
		end
		
		args[#args + 1] = prefix .. '_fields'
		args[#args + 1] = table.concat(fields, '/')

		frame:callParserFunction{ name = '#dplvar:set', args = args }
	end,

	-- for other modules: get a single stat, return it directly
	getItemStat = function(itemid, stat)
		if stat == 'count' then
			-- this is deprecated, p.info.IDs.max should be used directly
			return info.IDs.max
		end
		if not data[itemid] then
			itemid = 0
		end
		if stat == 'type' then
			return itemid
		end
		return data[itemid][stat] or data[0][stat]
	end,

	-- for templates: get a single stat, return it directly
	getStat = function(frame)
		currentFrame = frame -- cache

		local itemid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0
		local stat = getArg('stat') or getArg(2)
		stat = statname[stat] or stat

		if not stat then
			return
		end

		if not data[itemid] then
			itemid = 0
		end

		local result
		if stat == 'type' then
			return itemid
		end
		if stat == 'count' then
			-- this is deprecated, {{iteminfo/maxId}} should be used
			return info.IDs.max
		end
		result = getStat(itemid, stat) 
		if not getArg('raw') and proc[stat] then
			result = proc[stat](result, itemid)
		end

		if getArg('format') then
			result = frame:callParserFunction('formatnum', result)
		end

		return result
	end,
}

--alias
p.getinfo = p.getInfo
p.GetInfo = p.getInfo
p.getstat = p.getStat
p.GetStat = p.getStat

return p