基础物品的功能是有限的——你还是需要个能在使用时与世界交互的物品。
有些关键的类你必须理解,然后才能看看原版的物品事件。
InteractionResult
InteractionResult 告诉游戏事件的状态,即事件是否被通过/忽略、失败或成功。
一次成功的交互也可以用来改变手中的堆叠。
java
ItemStack heldStack = user.getStackInHand(hand);
heldStack.decrement(1);
InteractionResult.SUCCESS.heldItemTransformedTo().success(heldStack);1
2
3
2
3
可重写事件
Item 类有许多方法可以被重写,从而为物品添加额外的功能。
INFO
播放声音事件 这里有一个比较好的例子,它通过重写 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
6
2
3
4
5
6
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
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
同样的,你需要注册物品,并添加模型和纹理。
正如你所见,闪电应该在你(玩家)面前 10 个方块远处产生。

