# Реплейсер

Перед объяснением работы <mark style="color:blue;">**Replacer**</mark>, Вам стоит знать следующее, чтобы избежать возможных проблем с производительностью: Старайтесь использовать как можно меньше <mark style="color:blue;">**Replacer**</mark> и объединять все <mark style="color:blue;">**Replacer**</mark> в один!

В начале Вам стоит правильным образом портировать <mark style="color:blue;">**crafttweaker.api.recipe.replacement.Replacer**</mark>.

После чего создайте `Replacer.create()`.

```java
import crafttweaker.api.recipe.replacement.Replacer;
Replacer.create();
```

***

## <mark style="color:blue;">filter</mark>

Теперь разберём ряд методов. Первым будет `filter` Он отвечает, при каких условиях будет происходить замена предмета. Список того, какие условия есть на момент написания статьи:

* ComponentFilteringRule
* CustomFilteringRule
* ManagerFilteringRule
* ModsFilteringRule
* NameFilteringRule
* NotFilteringRule

В качестве примера мы разберём `ManagerFilteringRule`, `ModsFilteringRule` и `NameFilteringRule`.

***

## <mark style="color:blue;">**ManagerFilteringRule**</mark>

Начнём с `ManagerFilteringRule`. Он отвечает за то, в каком `<recypestype:` будет происходить замена.

Для того, чтобы получить список всех `recypesType` нужно написать команду `/ct dump recipetype`.

Допустим, мы хотим изменить рецепты только в верстаке. Для этого нужно написать следующее:

```java
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.ManagerFilteringRule;

Replacer.create().filter(ManagerFilteringRule.of([<recipetype:minecraft:crafting>]));
```

В таком случае `Replacer` будет работать только с верстаком.

***

## <mark style="color:blue;">**ModsFilteringRule**</mark>

Также существует фильтр `ModsFilteringRule`, который работает с рецептами из определённого мода.

Для примера изменим рецепты только из <mark style="color:blue;">**Divine RPG**</mark>

```java
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.ModsFilteringRule;

Replacer.create().filter(ModsFilteringRule.of(["divinerpg"]));
```

Теперь Replacer будет работать только ко всем предметам из Divine RPG.

***

## <mark style="color:blue;">**NameFilteringRule**</mark>

Фильтр, который работает в ситуации, когда у предмета есть что-то в названии, например `hoe` или `axe`, тогда он будет производить замену.

```java
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;

Replacer.create().filter(NameFilteringRule.anyOf(["stone_axe", "wodden_hoe", "iron_block"]));
```

Здесь фильтр работает в соответствии с перечисленными наименованиями, не отклоняясь от этой траектории.

```java
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;

Replacer.create().filter(NameFilteringRule.containing("axe"));
```

Функционирует с предметами, в названии которых есть вышеперечисленное слово `pump == minecraft:pumpkin_pie`. Не учитывает регистр.

```java
import crafttweaker.api.recipe.replacement.Replacer;
import crafttweaker.api.recipe.replacement.type.NameFilteringRule;

Replacer.create().filter(NameFilteringRule.regex("\\D{3}"));
```

Фильтр на основе заданного регулярного выражения. Для лучшего понимания этого прочитайте Регулярные выражения в Java replace.

Данный метод выполняет всю логику нашего Replacer. У него есть ряд параметров, рассмотрим же их.

```java
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` - на что необходимо заменить.

***

## <mark style="color:blue;">execute</mark>

Заключительный метод, который обозначает конец нашего `Replacer` Replacer.

Теперь, для примера, создадим простой `Replacer`. Заменим все палки в рецептах из мода <mark style="color:blue;">**Divine RPG**</mark> на огненные стержни.

```java
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();
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wiki.aegis-mine.ru/modifications/sozdanie-kontenta/crafttweaker/minecraft-1.19.2/repleiser.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
