zh_cn:tutorial:inventory
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
zh_cn:tutorial:inventory [2021/09/25 14:37] – [实现Inventory接口] solidblock | zh_cn:tutorial:inventory [2024/08/27 03:03] (current) – solidblock | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== | + | ====== 在方块中存储物品 |
- | 阅读本教程之前,请确保您已将[[tutorial: | + | 阅读本教程之前,请确保已经做好了[[zh_cn:tutorial: |
+ | |||
+ | 将物品存储在 BlockEntity(方块实体)中的标准方法是使其成为 '' | ||
+ | |||
+ | 这个教程是用于 1.21 的,对于旧版本,一些方法可能改变。 | ||
+ | |||
+ | ===== 实现 Inventory 接口 ===== | ||
- | 将物品存储在BlockEntity中的标准方法是使其成为'' | ||
- | 这使得漏斗(或其他mods)无需任何额外的工作即可从您的BlockEntity放入和提取物品。 | ||
- | ===== 实现Inventory接口 ===== | ||
'' | '' | ||
+ | |||
<code java ImplementedInventory.java> | <code java ImplementedInventory.java> | ||
/** | /** | ||
- | * 一个简单的 {@code Inventory} 实现,仅有默认的方法和物品列表获取器。 | + | * 一个简单的 {@code Inventory} 实现,仅有默认的方法和物品列表的 getter。 |
* | * | ||
* Originally by Juuz | * Originally by Juuz | ||
Line 128: | Line 132: | ||
</ | </ | ||
- | 现在在您的 '' | + | 现在在你的 '' |
- | <code java> | + | < |
public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { | public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { | ||
private final DefaultedList< | private final DefaultedList< | ||
Line 142: | Line 146: | ||
</ | </ | ||
- | 我们还需要将物品栏保存到标签并从那里加载。'' | + | 我们还需要将物品栏保存到 |
- | <code java> | + | < |
public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { | public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { | ||
[...] | [...] | ||
@Override | @Override | ||
- | public void readNbt(NbtCompound nbt) { | + | public void readNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { |
- | super.readNbt(nbt); | + | super.readNbt(nbt, registryLookup); |
- | Inventories.readNbt(nbt, | + | Inventories.readNbt(nbt, |
} | } | ||
@Override | @Override | ||
- | public NbtCompound writeNbt(NbtCompound nbt) { | + | public NbtCompound writeNbt(NbtCompound nbt, RegistryWrapper.WrapperLookup registryLookup) { |
- | Inventories.writeNbt(nbt, | + | Inventories.writeNbt(nbt, |
- | return super.writeNbt(nbt); | + | return super.writeNbt(nbt, registryLookup); |
} | } | ||
} | } | ||
</ | </ | ||
+ | |||
===== 从物品栏(或任何物品栏)中提取和放入 ===== | ===== 从物品栏(或任何物品栏)中提取和放入 ===== | ||
- | 我们覆盖方块类中的 | + | |
- | <code java> | + | 我们覆盖方块类中的 |
- | public class ExampleBlock | + | |
+ | 首先我们处理第一个槽位,如果是空的。玩家如果拿着物品,则会将拿着的物品放入。物品进入第一个槽位,如果是空的,或者进入第二个槽位,如果第一个是空的,或者如果第二个是空的,我们则会输出与物品栏有关的信息。 | ||
+ | |||
+ | 注意我们将 '' | ||
+ | < | ||
+ | public class DemoBlock | ||
[...] | [...] | ||
@Override | @Override | ||
- | | + | |
- | if (world.isClient) return | + | if (world.isClient) return |
- | | + | |
+ | if (!(world.getBlockEntity(pos) instanceof DemoBlockEntity blockEntity)) { | ||
+ | return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; | ||
+ | } | ||
if (!player.getStackInHand(hand).isEmpty()) { | if (!player.getStackInHand(hand).isEmpty()) { | ||
- | // 检查第一个打开的槽位是什么,并从玩家手中放入物品 | + | // 检查第一个开放槽位是什么,并从玩家手中将物品放入 |
- | if (blockEntity.getInvStack(0).isEmpty()) { | + | if (blockEntity.getStack(0).isEmpty()) { |
- | // 将玩家手中的物品堆放入物品栏中 | + | // 将玩家持有的物品堆放入物品栏 |
- | blockEntity.setInvStack(0, player.getStackInHand(hand).copy()); | + | blockEntity.setStack(0, player.getStackInHand(hand).copy()); |
// 从玩家手中移除物品堆 | // 从玩家手中移除物品堆 | ||
player.getStackInHand(hand).setCount(0); | player.getStackInHand(hand).setCount(0); | ||
- | } else if (blockEntity.getInvStack(1).isEmpty()) { | + | } else if (blockEntity.getStack(1).isEmpty()) { |
- | blockEntity.setInvStack(1, player.getStackInHand(hand).copy()); | + | blockEntity.setStack(1, player.getStackInHand(hand).copy()); |
player.getStackInHand(hand).setCount(0); | player.getStackInHand(hand).setCount(0); | ||
} else { | } else { | ||
- | // 如果物品栏是满的,我们输出其内容 | + | // 如果物品栏满,提醒玩家 |
- | | + | |
- | | + | |
+ | .append(",第二个槽位是") | ||
+ | .append(blockEntity.getStack(1).getName())); | ||
} | } | ||
} | } | ||
- | return | + | return |
} | } | ||
} | } | ||
</ | </ | ||
- | 当玩家不持有物品时,我们将采取相反的行为。我们将从第二个槽位中取出项目,然后第二个中的第一个为空。如果第一个也是空的,我们将不做任何事情。 | + | 玩家不持有物品时,我们将采取相反的行为。我们将从第二个槽位中取出物品,如果第二个是空的就第一个。如果第一个也是空的,就不做任何事情。 |
- | <code java> | + | < |
- | public class ExampleBlock | + | public class DemoBlock |
[...] | [...] | ||
@Override | @Override | ||
- | | + | |
... | ... | ||
if (!player.getStackInHand(hand).isEmpty()) { | if (!player.getStackInHand(hand).isEmpty()) { | ||
... | ... | ||
} else { | } else { | ||
- | // 如果玩家没有持有任何东西,我们依次将方块实体中的物品给予玩家 | + | // 如果玩家手中没有东西,就依次给玩家方块实体中的物品 |
- | // 查找第一个有物品的槽位,并给予玩家 | + | |
- | if (!blockEntity.getInvStack(1).isEmpty()) { | + | if (!blockEntity.getStack(1).isEmpty()) { |
- | // 给予玩家物品栏中的物品堆 | + | // 给玩家物品栏中的物品堆 |
- | player.inventory.offerOrDrop(world, | + | player.getInventory().offerOrDrop(blockEntity.getStack(1)); |
- | // Remove the stack from the inventory | + | // 从物品栏移除物品堆 |
- | blockEntity.removeInvStack(1); | + | blockEntity.removeStack(1); |
- | } else if (!blockEntity.getInvStack(0).isEmpty()) { | + | } else if (!blockEntity.getStack(0).isEmpty()) { |
- | player.inventory.offerOrDrop(world, | + | player.getInventory().offerOrDrop(blockEntity.getStack(0)); |
- | blockEntity.removeInvStack(0); | + | blockEntity.removeStack(0); |
+ | } else { | ||
+ | return ItemActionResult.PASS_TO_DEFAULT_BLOCK_INTERACTION; | ||
} | } | ||
} | } | ||
| | ||
- | return | + | return |
} | } | ||
} | } | ||
Line 223: | Line 239: | ||
===== 实现 SidedInventory 接口 ===== | ===== 实现 SidedInventory 接口 ===== | ||
如果你希望有基于与方块不同的面(漏斗或者其他模组)进行交互的不同逻辑,你可以实现 SidedInventory 接口。如果说你想使得方块不能从上侧插入,可以这样做: | 如果你希望有基于与方块不同的面(漏斗或者其他模组)进行交互的不同逻辑,你可以实现 SidedInventory 接口。如果说你想使得方块不能从上侧插入,可以这样做: | ||
- | <code java> | + | |
+ | < | ||
public class DemoBlockEntity extends BlockEntity implements ImplementedInventory, | public class DemoBlockEntity extends BlockEntity implements ImplementedInventory, | ||
[...] | [...] | ||
@Override | @Override | ||
- | public int[] getInvAvailableSlots(Direction | + | public int[] getInvAvailableSlots(Direction |
// Just return an array of all slots | // Just return an array of all slots | ||
- | | + | |
- | for (int i = 0; i < result.length; i++) { | + | |
- | result[i] = i; | + | |
- | } | + | |
- | + | ||
- | return result; | + | |
} | } | ||
Line 247: | Line 259: | ||
} | } | ||
} | } | ||
- | |||
</ | </ |
zh_cn/tutorial/inventory.1632580637.txt.gz · Last modified: 2021/09/25 14:37 by solidblock