Модуль:Npcinfo

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

Этот модуль используется для вывода основных характеристик существ (NPC). Он должен использоваться только через шаблоны; в статьях используйте шаблон {{getNpcInfo}}.

Он может подсчитать статистику NPC для различных состояний/режимов игры (классического / режима эксперта в простом режиме / режима эксперта в сложном режиме / режима эксперта после победы над Плантерой / режима мастера в простом режиме / режима мастера в сложном режиме / режима мастера после победы над Плантерой).

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

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

{{#invoke:Npcinfo | getInfo | id = ''<ID NPC>'' | prefix = ''<префикс для значений> ('''необязательный''')'' }}

id

ID существа (NPC). Может быть в диапазоне от -1 до -65 или от 1 до 662. (76/146/408 не используются)

prefix

Префикс для выводимых значений. По умолчанию — _npcinfo_. Например, значение по умолчанию для урона — _npcinfo_damage. Если $prefix будет задан как my_, название значения будет выглядеть как my_damage.

Характеристики

Вызов этого модуля задаёт число значений DPL, по одному для каждого. Их можно получить через {{#dplvar:<префикс><характеристика>}}, т.е. {{#dplvar:_npcinfo_defense}} будет характеристикой для защиты со значением $prefix по умолчанию. Таблица, указанная ниже, содержит самые важные значения характеристик:

dplvar
(без префикса)
Содержимое
aiStyle ID ИИ, присущее NPC.
banner ID предмета знамени противника, который выпадает с NPC.
boss Внутренний флаг, который определяет, является ли NPC боссом. (<пусто> = false, 1 = true)
buffImmune Список (де-)бафов через запятую, к которому NPC иммунен.
buffImmuneAll Иммунен ли NPC ко всем (де-)бафам. (<пусто> = false, 1 = true)
buffImmuneAllNotWhips Иммунен ли NPC ко всем (де-)бафам, кроме дебафов от хлыста. (<пусто> = false, 1 = true)
coldDamage Подвергается ли NPC эффекту бафа «Тепло». (<пусто> = false, 1 = true)
friendly Является ли NPC дружелюбным NPC (т.е. поселенцем или живностью). (<пусто> = false, 1 = true)
housingCategory 1, если NPC — городской питомец, 0 — наоборот.
internalName Внутреннее название NPC.
lavaImmune Получает ли NPC урон от лавы. (<пусто> = false, 1 = true)
netID ID NPC, значение параметра $id.
noGravity Невосприимчив ли NPC к гравитации. (<пусто> = false, 1 = true)
noTileCollide Может ли NPC свободно перемещаться сквозь тайлы. (<пусто> = false, 1 = true)
npcSlots Количество ячеек NPC, которое сам NPC занимает. Для более подробной информации см. Появление NPC.
rarity Уровень редкости NPC для анализатора форм жизни.
townNPC Является ли NPC городским NPC. (<пусто> = false, 1 = true)
trapImmune Является ли NPC полностью невосприимчивым ко всем ловушкам. (<пусто> = false, 1 = true)
type «Тип ID» NPC. Для положительных ID NPC, это значение равно netID. Для отрицательных значений ID NPC, это значение является ID соответствующего варианта режима мастера (т.е. 1 (синий слизень) для -3 (зелёный слизень)).
HitSound Название файла (без расширения файла, но обычно это .wav) звукового эффекта, который воспроизводится этим NPC при получении урона (или от отражающегося снаряда). Обратите внимание, что прослушиваемый звук — это основной звук; он может быть проигран с изменённым тоном и громкостью в игре.
DeathSound Название файла (без расширения файла, но обычно это .wav) звукового эффекта, который воспроизводится этим NPC при смерти. Обратите внимание, что прослушиваемый звук — это основной звук; он может быть проигран с изменённым тоном и громкостью в игре.
damage
damage_e
damage_e_hm
damage_e_pp
damage_m
damage_m_hm
damage_m_pp
Значение урона, защиты, сопротивляемости отбрасыванию и максимальному запасу здоровья для классического режима, режима эксперта в простом режиме, режима эксперта в сложном режиме, режиме эксперта после победы над Плантерой, режима мастера в простом режиме, режима мастера в сложном режиме и режима мастера после победы над Плантерой, соответственно.
Значения knockBackResist — это изначальные значения в том виде, в каком они даны в исходном коде игры; значение, показываемое в шаблонах {{npc infobox}} на вики — это (1 - knockBackResist).
defense
defense_e
defense_e_hm
defense_e_pp
defense_m
defense_m_hm
defense_m_pp
knockBackResist
knockBackResist_e
knockBackResist_e_hm
knockBackResist_e_pp
knockBackResist_m
knockBackResist_m_hm
knockBackResist_m_pp
lifeMax
lifeMax_e
lifeMax_e_hm
lifeMax_e_pp
lifeMax_m
lifeMax_m_hm
lifeMax_m_pp
value
value_e
value_e_hm
value_e_pp
value_m
value_m_hm
value_m_pp
Монеты, выпадаемые в классическом режиме, режиме эксперта в простом режиме, режиме эксперта в сложном режиме и режиме эксперта после победы над Плантерой, соответственно. Считается в медных монетах.

Помимо этого, также может задаваться переменная со значением _fields. В ней содержатся названия всех доступных характеристик.

Примеры

Характеристика
{{#dplvar:_<названия значения>}}
Результат
{{#invoke:Npcinfo|getInfo|id=<id>|prefix=_}}
Green Slime
id = -3
Eye of Cthulhu
id = 4
Clothier
id = 54
aiStyle147
alpha17500
banner292800
behindTiles
boss1
buffImmune203131
buffImmuneAll
buffImmuneAllNotWhips
catchItem000
coldDamage
damage61510
damage_e123010
damage_e_hm863010
damage_e_pp1183010
damage_m184510
damage_m_hm1294510
damage_m_pp1774510
DeathSoundNPC_Killed_1NPC_Killed_1NPC_Killed_1
defense01215
defense_e01215
defense_e_hm01215
defense_e_pp01215
defense_m01215
defense_m_hm01215
defense_m_pp01215
dontCountMe
dontTakeDamage
friendly1
height1711040
HitSoundNPC_Hit_1NPC_Hit_1NPC_Hit_1
housingCategory000
internalNameGreenSlimeEyeofCthulhuClothier
knockBackResist1.200.5
knockBackResist_e1.0800.5
knockBackResist_e_hm1.0800.5
knockBackResist_e_pp1.0800.5
knockBackResist_m0.9600.5
knockBackResist_m_hm0.9600.5
knockBackResist_m_pp0.9600.5
lavaImmune
lifeMax142800250
lifeMax_e283640250
lifeMax_e_hm2463640250
lifeMax_e_pp3383640250
lifeMax_m424641250
lifeMax_m_hm3694641250
lifeMax_m_pp5074641250
nameGreen SlimeEye of CthulhuClothier
netAlways
netID-3454
noGravity1
noTileCollide1
npcSlots151
Opacity
rarity000
scale0.911
timeLeft75022500750
townNPC1
trapImmune
type1454
value3300000
value_e7750000
value_e_hm47750000
value_e_pp65750000
value_m7750000
value_m_hm47750000
value_m_pp65750000
width2110018

local data = mw.loadData('Module:Npcinfo/data') -- loading data table.

local info = {
	version = data['_terrariaversion'],
	IDs = { -- min and max are both inclusive
		min = -65,
		max = 687,
	}
}
info.IDs.isValid = function(id)
	-- 76/146/408/547 are unused
	return id ~= nil and type(id) == 'number' and id >= info.IDs.min and id ~= 0 and id <= info.IDs.max
end

local getArg = function(frame, key)
	local value = frame.args[key]
	if not value then
		return nil
	end
	value = mw.text.trim(value)
	if value == '' then
		return nil
	else
		return value
	end
end

local fields = {
    'DeathSound',
    'HitSound',
    'Opacity',
    'aiStyle',
    'alpha',
    'behindTiles',
    'banner',
    'boss',
    'buffImmune',
    'buffImmuneAll',
    'buffImmuneAllNotWhips',
    'catchItem',
    'coldDamage',
    'damage',
    'damage_e',
    'damage_e_hm',
    'damage_e_pp',
    'damage_m',
    'damage_m_hm',
    'damage_m_pp',
    'defense',
    'defense_e',
    'defense_e_hm',
    'defense_e_pp',
    'defense_m',
    'defense_m_hm',
    'defense_m_pp',
    'dontCountMe',
    'dontTakeDamage',
    'friendly',
    'height',
    'housingCategory',
    'internalName',
    'knockBackResist',
    'knockBackResist_e',
    'knockBackResist_e_hm',
    'knockBackResist_e_pp',
    'knockBackResist_m',
    'knockBackResist_m_hm',
    'knockBackResist_m_pp',
    'lavaImmune',
    'lifeMax',
    'lifeMax_e',
    'lifeMax_e_hm',
    'lifeMax_e_pp',
    'lifeMax_m',
    'lifeMax_m_hm',
    'lifeMax_m_pp',
    'name',
    'netAlways',
    'netID',
    'noGravity',
    'noTileCollide',
    'npcSlots',
    'rarity',
    'scale',
    'timeLeft',
    'townNPC',
    'trapImmune',
    'type',
    'value',
    'value_e',
    'value_e_hm',
    'value_e_pp',
    'value_m',
    'value_m_hm',
    'value_m_pp',
    'width',
}

local statname = {}

local clear = function(frame)
	local prefix = getArg(frame, 'prefix') or '_npcinfo_'

	local args = {}
	for i,v in ipairs(fields) do
		table.insert(args, prefix .. v)
		table.insert(args, '')
	end

	frame:callParserFunction{ name = '#dplvar:set', args = args }
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,
	minId = function(frame)
		return info.IDs.min
	end,
	isValidId = function(frame)
		return info.IDs.isValid(tonumber(getArg(frame, 1)) or 0) and 1 or 0
	end,

	-- for templates: get all stats, set them in dplvars
	getInfo = function(frame)
		local npcid = tonumber(getArg(frame, 'id') or 0)
		local prefix = getArg(frame, 'prefix') or '_npcinfo_'
		local count = tonumber(getArg(frame, 'players') or 1)
		
		if not npcid then
			return
		end

		if not info.IDs.isValid(npcid) then
			clear(frame) -- reset all dpl vars
			return
		end
		
		local result
		if count > 1 then
			local getinfo = require('Module:Npcinfo/datagen').getInfo
			result = getinfo(npcid, count)
			local buffImmune = nil
			for k, v in pairs(result.buffImmune) do
				if v then
					if buffImmune then
						buffImmune = buffImmune .. ', ' .. k
					else
						buffImmune = k
					end
				end
			end
			result.buffImmune = buffImmune			
		else
			result = {}
			for k,v in pairs(data[0]) do
				result[k] = v
			end
			for k,v in pairs(data[npcid]) do
				result[k] = v
			end
		end
		
		local args = {}
		for k,v in pairs(result) do
			args[#args + 1] = prefix .. k
			args[#args + 1] = v
		end
		
		args[#args + 1] = prefix .. '_fields'
		args[#args + 1] = table.concat(fields, ',')
		
		args[#args + 1] = prefix
		args[#args + 1] = 'InvalidNpcinfoStatName'

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

	end,

	clear = clear,

	-- for templates: get a specific stat of a specific NPC
	getStat = function(frame)
		local npcid = tonumber(getArg('id')) or tonumber(getArg(1)) or 0
		local stat = getArg('stat') or getArg(2)
		stat = statname[stat] or stat

		if not info.IDs.isValid(npcid) then
			return 
		end

		if not stat then
			return
		end

		return data[npcid][stat] or data[0][stat]

	end,

	-- for other modules: get a specific stat of a specific NPC
	stat = function(npcid, stat)
		stat = statname[stat] or stat

		if not info.IDs.isValid(npcid) then
			return 
		end

		if not stat then
			return
		end

		return data[npcid][stat] or data[0][stat]

	end,
}

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

return p