Реплейсер
Надоело ли Вам постоянно удалять рецепт, когда нужно изменить значение всего 1 предмета? Если да, то это разработано специально для Вас!
Перед объяснением работы Replacer, Вам стоит знать следующее, чтобы избежать возможных проблем с производительностью: Старайтесь использовать как можно меньше Replacer и объединять все Replacer в один!
В начале Вам стоит правильным образом портировать crafttweaker.api.recipe.replacement.Replacer.
После чего создайте Replacer.create()
.
import crafttweaker.api.recipe.replacement.Replacer;
Replacer.create();
filter
Теперь разберём ряд методов. Первым будет filter
Он отвечает, при каких условиях будет происходить замена предмета. Список того, какие условия есть на момент написания статьи:
ComponentFilteringRule
CustomFilteringRule
ManagerFilteringRule
ModsFilteringRule
NameFilteringRule
NotFilteringRule
В качестве примера мы разберём ManagerFilteringRule
, ModsFilteringRule
и NameFilteringRule
.
ManagerFilteringRule
Начнём с ManagerFilteringRule
. Он отвечает за то, в каком <recypestype:
будет происходить замена.
Для того, чтобы получить список всех recypesType
нужно написать команду /ct dump recipetype
.
Допустим, мы хотим изменить рецепты только в верстаке. Для этого нужно написать следующее:
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.ManagerFilteringRule;
Replacer.create().filter(ManagerFilteringRule.of([<recipetype:minecraft:crafting>]));
В таком случае Replacer
будет работать только с верстаком.
ModsFilteringRule
Также существует фильтр ModsFilteringRule
, который работает с рецептами из определённого мода.
Для примера изменим рецепты только из Divine RPG
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.ModsFilteringRule;
Replacer.create().filter(ModsFilteringRule.of(["divinerpg"]));
Теперь Replacer будет работать только ко всем предметам из Divine RPG.
NameFilteringRule
Фильтр, который работает в ситуации, когда у предмета есть что-то в названии, например hoe
или axe
, тогда он будет производить замену.
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;
Replacer.create().filter(NameFilteringRule.anyOf(["stone_axe", "wodden_hoe", "iron_block"]));
Здесь фильтр работает в соответствии с перечисленными наименованиями, не отклоняясь от этой траектории.
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;
Replacer.create().filter(NameFilteringRule.containing("axe"));
Функционирует с предметами, в названии которых есть вышеперечисленное слово pump == minecraft:pumpkin_pie
. Не учитывает регистр.
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;
Replacer.create().filter(NameFilteringRule.regex("\\D{3}"));
Фильтр на основе заданного регулярного выражения. Для лучшего понимания этого прочитайте Регулярные выражения в Java replace.
Данный метод выполняет всю логику нашего Replacer. У него есть ряд параметров, рассмотрим же их.
Replacer.replace<T : Object>(component as IRecipeComponent<T>, toReplace as T, with as T) as Replacer
replace<T : Object>
- нужна чтобы сказать Replacer
какой тип нужно изменять. Всегда это IIngredient
, кроме случаев когда заменяем рецепт в модовом recipeType
component as IRecipeComponent<T>
- отвечает к какому предмету в рецепте он будет применять изменение. Чтобы узнать все IRecipeComponent
пропишите команду /ct dump recipecomponent
.
toReplace
- предмет который необходимо заменить. with
- на что необходимо заменить.
execute
Заключительный метод, который обозначает конец нашего Replacer
Replacer.
Теперь, для примера, создадим простой Replacer
. Заменим все палки в рецептах из мода Divine RPG на огненные стержни.
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.ManagerFilteringRule;
import crafttweaker.api.recipe.replacement.type.ModsFilteringRule;
import crafttweaker.api.ingredient.IIngredient;
Replacer.create().filter(ModsFilteringRule.of(["divinerpg"])).filter(ManagerFilteringRule.of([<recipetype:minecraft:crafting>])).replace<IIngredient>(<recipecomponent:crafttweaker:output/items>, <item:minecraft:stick>, <item:minecraft:blaze_rod>).execute();
Last updated