Модуль: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

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