🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
🇷🇺 Русский (Russian)
🇷🇺 Русский (Russian)
Внешний вид
This page is written for:
1.21
This page is written for:
1.21
Базовые предметы могут зайти так далеко, что вы можете добавить предмет, который имеет интерактивность с миром при использовании.
Есть несколько ключевых классов которые вы должны понять, прежде чем будете рассматривать события с ванильными предметами.
Для предметов более распространённым TypedActionResult
является ItemStacks
- этот класс говорит игре, что нужно заменять (или не заменять) после того, как событие произошло.
Если в событие ничего не произошло, вам нужно будет использовать метод TypedActionResult#pass(stack)
, где stack
это текущий стек предметов.
Вы можете получить текущий стек предметов, получая стек из руки игрока. Обычно события, требующие TypedActionResult
, передают эту функцию методу события.
TypedActionResult.pass(user.getStackInHand(hand))
Если вы передадите текущий стек, тогда ничего не изменится, независимо от того, объявите ли вы событие неудавшимся, прошедшим/проигнорируемым или успехом.
Если вы хотите удалить текущий стек, вам следует передать пустой. То же самое сказать про уменьшение, вы извлекаете текущий стек и уменьшаете его на количество которое вы хотите:
ItemStack heldStack = user.getStackInHand(hand);
heldStack.decrement(1);
TypedActionResult.success(heldStack);
Аналогичным образом, ActionResult
говорит игре статус события, не смотря было ли оно пройдено/проигнорированно, неудачно или успешно.
К счастью, класс предмета имеет множество методам, которые можно переопределить, чтобы добавить дополнительную функциональность вашим предметам.
INFO
Отличный пример использование этих событие вы можете найти на странице Воспроизведение SoundEvents, где событие useOnBlock
воспроизводит звук когда игрок кликает правой кнопкой мыши по блоку.
Метод | Информация |
---|---|
postHit | Вызывается когда игрок, ударяет сущность. |
postMine | Вызывается когда игрок, ломает блок. |
inventoryTick | Вызывается каждый тик когда предмет находится в инвентаре. |
onCraft | Вызывается когда предмет, создаётся. |
useOnBlock | Вызывается когда игрок кликает правой кнопкой мыши предметом на блок. |
use | Вызывается когда игрок кликает правой кнопкой мыши предметом. |
use()
Допустим, что вы хотите сделать предмет, который вызывает молнию перед игроком, вам нужно будет создать отдельный класс.
public class LightningStick extends Item {
public LightningStick(Settings settings) {
super(settings);
}
}
Событие use
, вероятно, самое полезное из всех, вы можете использовать это событие, чтобы призвать молнию, вы должны создать её перед игроками в 10 блоков от направления.
@Override
public TypedActionResult<ItemStack> use(World world, PlayerEntity user, Hand hand) {
// Ensure we don't spawn the lightning only on the client.
// This is to prevent desync.
if (world.isClient) {
return TypedActionResult.pass(user.getStackInHand(hand));
}
BlockPos frontOfPlayer = user.getBlockPos().offset(user.getHorizontalFacing(), 10);
// Spawn the lightning bolt.
LightningEntity lightningBolt = new LightningEntity(EntityType.LIGHTNING_BOLT, world);
lightningBolt.setPosition(frontOfPlayer.toCenterPos());
world.spawnEntity(lightningBolt);
// Nothing has changed to the item stack,
// so we just return it how it was.
return TypedActionResult.success(user.getStackInHand(hand));
}
Как обычно, вам необходимо зарегистрировать свой предмет, добавьте модель и текстуру.
Как видите, молния должна появиться в 10 блоках перед вами, игроком.