Пользовательские интерактивные предметы 26.1.2
Вы научитесь создавать предметы, которые используют ванильные события.
Базовые предметы могут зайти так далеко, что вы можете добавить предмет, который имеет интерактивность с миром при использовании.
Есть несколько ключевых классов которые вы должны понять, прежде чем будете рассматривать события с ванильными предметами.
Класс InteractionResult
InteractionResult сообщает игре о статусе события: было ли оно пройдено/пропущено, завершилось ли оно неудачей или успехом.
Успешное взаимодействие (InteractionResult.SUCCESS) также можно использовать для изменения использованного предмета.
java
ItemStack heldStack = user.getStackInHand(hand);
heldStack.decrement(1);
InteractionResult.SUCCESS.heldItemTransformedTo().success(heldStack);1
2
3
2
3
Переопределяемые события
К счастью, класс предмета имеет множество методов, которые можно переопределить, чтобы добавить дополнительную функциональность вашим предметам.
INFO
Отличный пример есть в статье Воспроизведение SoundEvents. Там метод useOn переопределяется, чтобы проигрывать звук при клике ПКМ по блоку.
| Метод | Информация |
|---|---|
hurtEnemy | Вызывается когда игрок, ударяет сущность. |
mineBlock | Вызывается когда игрок, ломает блок. |
inventoryTick | Вызывается каждый тик когда предмет находится в инвентаре. |
onCraftedPostProcess | Вызывается когда предмет, создаётся. |
useOn | Вызывается когда игрок кликает правой кнопкой мыши предметом на блок. |
use | Вызывается когда игрок кликает правой кнопкой мыши предметом. |
Событие use()
Допустим, вы хотите создать предмет, который вызывает молнию перед игроком - вам нужно будет создать собственный класс.
java
public class LightningStick extends Item {
public LightningStick(Properties properties) {
super(properties);
}
}1
2
3
4
5
2
3
4
5
Событие use, вероятно, самое полезное из всех, вы можете использовать это событие, чтобы призвать молнию, вы должны создать её перед игроками в 10 блоков от направления.
java
@Override
public InteractionResult use(Level level, Player user, InteractionHand hand) {
// Ensure we don't spawn the lightning only on the client.
// This is to prevent desync.
if (level.isClientSide()) {
return InteractionResult.PASS;
}
BlockPos frontOfPlayer = user.blockPosition().relative(user.getDirection(), 10);
// Spawn the lightning bolt.
LightningBolt lightningBolt = new LightningBolt(EntityType.LIGHTNING_BOLT, level);
lightningBolt.setPos(frontOfPlayer.getCenter());
level.addFreshEntity(lightningBolt);
return InteractionResult.SUCCESS;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Как обычно, вам необходимо зарегистрировать свой предмет, добавьте модель и текстуру.
Как вы можете видеть, молния должна появиться в 10 блоках перед вами - игроком.

