Словарь руд#
Словарь руд предназначен в первую очередь для обеспечения лучшей совместимости между модами, решая проблему дублирующихся руд и других предметов. Чуть ли не каждый технический мод считает своим долгом добавить в игру оловянную и медную руду, в результате в сборке появляется с десяток видов одной и той же руды. Словарь руд решает эту проблему, делая руды из различных модификаций взаимозаменяемыми.
Предметы, зарегистрированные в OreDictionary
, становятся эквивалентны другим предметам, входящим в ту же группу словаря, что и зарегистрированный.
Это позволяет использовать в рецептах словаря любой предмет из группы, указав её имя, для получения одного и того же результата.
Несмотря на свое название, OreDictionary
используется не только для руд. Любой предмет, похожий на другой предмет (например, красители),
может быть зарегистрирован в OreDictionary
.
Именование групп#
Примечание
Старайтесь использовать имена существующих групп словаря, прежде чем придумывать свою, иначе смысл от использования словаря стремится к нулю.
Forge явно не требует, чтобы имена были в каком-либо определенном формате, но следующее стало популярным стандартом для имен OreDictionary:
- Имя группы должно использовать camelCase и должно начинаться со строчной буквы (пример:
oreHello
). - Первое слово указывает на тип элемента.
ore
– руды (блок)wood
– древесина (блок)gem
– драгоценные камни (предмет)ingot
– слитки (предмет)block
– Различные блокиdust
– Пыль (предмет)wires
– Проводаnuggets
– Самородки (предмет)crops
– Семена и растения без семян (предмет)material
– Предметы из определённого вида материала
- Второе указывает материал предмета. Для уникальных предметов (таких, как
record
,dirt
,egg
иvine
) материал не требуется. - Третьим указывается цвет блока/предмета, если предметы имеют разновидности по цвету (пример:
blockGlassLightGray
).
Когда два слова недостаточно конкретны, можно добавить третье слово. Например, кирпич зарегистрировано как ingotBrick
, в то время как адский кирпич зарегистрировано как ingotBrickNether
.
Регистрация предметов в словаре руд#
Доступно три метода для регистрации предмета в словаре руд. Первым параметром идёт имя группы, вторым - предмет, который мы хотим добавить в группу. При отсутствии группы с указанным именем, она будет создана автоматически.
OreDictionary#registerOre(String, Item)
- регистрация предмета, когда damage неважен.OreDictionary#registerOre(String, Block)
- регистрация блока, когда meta неважна.OreDictionary#registerOre(String, ItemStack)
- регистрирует предмет/блок с конкретным значением damage.
Совет
Для ItemStack
можно задать магическое значение damage WILDCARD_VALUE
, для указания на то, что damage предмета не важен.
Методы регистрации Item
и Block
используют данный подход.
Зарегистрируем рубин, рубиновый блок и воздушные шарики в словаре руд.
package ru.mcmodding.tutorial.common.handler;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
public class ModRecipes {
public static void registerRecipes() {
// ...
}
public static void registerOres() {
OreDictionary.registerOre("blockRuby", ModBlocks.RUBY);
OreDictionary.registerOre("gemRuby", ModItems.RUBY);
OreDictionary.registerOre("balloon", new ItemStack(ModItems.BALLOON, 1, OreDictionary.WILDCARD_VALUE));
}
}
Затем необходимо вызвать метод ModRecipes#registerOres
в CommonProxy#postInit
, до регистрации основных рецептов.
package ru.mcmodding.tutorial.common;
import cpw.mods.fml.common.event.FMLPostInitializationEvent;
import ru.mcmodding.tutorial.common.handler.*;
public class CommonProxy implements IGuiHandler {
public void postInit(FMLPostInitializationEvent event) {
ModRecipes.registerOres();
ModRecipes.registerRecipes();
}
}
API OreDictionary#
В классе OreDictionary
существуют вспомогательные методы:
getOreID(String)
- возвращает ID указанной группы. Если группы не существует, будет создана новая и возвращён её ID.getOreName(int)
- возвращает имя группы по ID.getOreID(ItemStack)
- Возвращает первое имя группы в которую входит предмет. Данный метод объявлен устаревшим так как возвращает всего одно имя группы, в то время как предмет может входить сразу в несколько групп. Используйте следующий метод.getOreIDs(ItemStack)
- Возвращает список имён групп словаря в которые входит предмет. Если предмет нигде не числится, вернёт пустой список.getOres(Integer)
- Возвращает список предметов, входящих в указанную группу (по ID). При отсутствии будет создана новая группа.getOres(String)
- Эквивалент предыдущего метода, принимающий имя группы вместо её ID.getOres(String, boolean)
- Эквивалент двух предыдущих методов, с возможностью отключить автоматическое создание группы при её отсутствии. Опция должна использоваться разработчиками модификаций, которые выполняют полное сканирование вpostInit
. Это значительно уменьшает беспорядок в словаре руд и является правильным способом использования словаря в большинстве случаев.doesOreNameExist(String)
- Проверяет существование группы с указанным именем. Может быть использован для безопасного запроса словаря руд без добавления ненужного беспорядка в базовую структуру карты. Пожалуйста, используйте этот метод, когда это возможно и уместно.getOreNames()
- Возвращает массив всех имён групп, зарегистрированных в словаре.itemMatches(ItemStack, ItemStack, boolean)
- Проверяет совпадение входящего предмета с целевым по item и damage. Имеет параметр strict, который отвечает за строгую проверкуitemDamage
предмета без использованияWILDCARD_VALUE
.