User Tools

Site Tools


zh_cn:tutorial:inventory

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
zh_cn:tutorial:inventory [2021/09/25 14:10] – [实施补充内容物] solidblockzh_cn:tutorial:inventory [2023/08/28 10:14] – [从物品栏(或任何物品栏)中提取和放入] wjz_p
Line 1: Line 1:
-====== 将物品放容器中 ====== +====== 在方块存储物品 ====== 
-阅读本教程之前,请确保[[tutorial:blockentity |方块实体]]制作完成+阅读本教程之前,请确保已经做好了[[zh_cn:tutorial:blockentity|方块实体]]。
  
-将物品存储在BlockEntity中的标准方法是使其成为''Inventory'' +将物品存储在 BlockEntity(方块实体)中的标准方法是使其成为''Inventory''。这使得漏斗(或其他模组)无需任何额外的工作即可从您的 BlockEntity 放入和提取物品。  
-这使得漏斗(或其他mods)无需任何额外的工作即可从您的BlockEntity放入和提取物品。  +===== 实现 Inventory 接口 ===== 
-===== 实现Inventory接口 ===== +''Inventory'' 只是一个接口,这意味着实际的 ''ItemStack'' 状态将需要存储在您的''BlockEntity''上。可以使用''DefaultedList <ItemStack>''作为存储这些''ItemStacks''的简便方法,可以将其默认设置为''ItemStack.Empty''用来表示物品堆没有任何物品。实现 ''Inventory''非常简单,但乏味且容易出错,因此,我们将使用默认实现,该实现只需要给它一个''DefaultList <ItemStack>''(将其复制为新文件):
-''Inventory''只是一个接口,这意味着实际的''ItemStack''状态将需要存储在您的''BlockEntity''上。 +
-可以使用''DefaultedList <ItemStack>''作为存储这些''ItemStacks''的简便方法, +
-因为可以将其默认设置为''ItemStack.Empty''这是表示插槽中没有项目的正确方法 +
-实现''Inventory''非常简单,但乏味且容易出错, +
-因此,我们将使用它的默认实现,该实现只需要给它一个''DefaultList <ItemStack>''(将其复制为新文件):+
 <code java ImplementedInventory.java> <code java ImplementedInventory.java>
 /** /**
- A simple {@code Inventory} implementation with only default methods + an item list getter.+ 一个简单的 {@code Inventory} 实现,仅有默认的方法和物品列表获取器。
  *  *
  * Originally by Juuz  * Originally by Juuz
Line 19: Line 14:
  
     /**     /**
-     Retrieves the item list of this inventory. +     从此物品栏中检索物品。 
-     Must return the same instance every time it's called.+     每次被调用时必须返回相同实例。
      */      */
     DefaultedList<ItemStack> getItems();     DefaultedList<ItemStack> getItems();
          
     /**     /**
-     Creates an inventory from the item list.+     从物品列表创建物品栏。
      */      */
     static ImplementedInventory of(DefaultedList<ItemStack> items) {     static ImplementedInventory of(DefaultedList<ItemStack> items) {
Line 32: Line 27:
          
     /**     /**
-     Creates a new inventory with the specified size.+     根据指定的尺寸创建新的物品栏。
      */      */
     static ImplementedInventory ofSize(int size) {     static ImplementedInventory ofSize(int size) {
Line 39: Line 34:
          
     /**     /**
-     Returns the inventory size.+     返回物品栏的大小。
      */      */
     @Override     @Override
Line 47: Line 42:
          
     /**     /**
-     Checks if the inventory is empty. +     检查物品栏是否为空。 
-     * @return true if this inventory has only empty stacks, false otherwise.+     * @return true,如果物品栏仅有一个空堆,否则为true。
      */      */
     @Override     @Override
Line 62: Line 57:
          
     /**     /**
-     Retrieves the item in the slot.+     检索槽位中的物品。
      */      */
     @Override     @Override
Line 70: Line 65:
          
     /**     /**
-     Removes items from an inventory slot. +     从物品栏槽位移除物品。 
-     * @param slot  The slot to remove from. +     * @param slot  从该槽位移除。 
-     * @param count How many items to remove. If there are less items in the slot than what are requested, +     * @param count 需要移除的物品个数。如果槽位中的物品少于需要的,则将其全部取出。
-                  takes all items in that slot.+
      */      */
     @Override     @Override
Line 85: Line 79:
          
     /**     /**
-     Removes all items from an inventory slot. +     从物品栏槽位移除所有物品。 
-     * @param slot The slot to remove from.+     * @param slot 从该槽位移除。
      */      */
     @Override     @Override
Line 94: Line 88:
          
     /**     /**
-     Replaces the current stack in an inventory slot with the provided stack. +     将物品栏槽位中的当前物品堆替换为提供的物品堆。 
-     * @param slot  The inventory slot of which to replace the itemstack. +     * @param slot  替换该槽位的物品堆。 
-     * @param stack The replacing itemstack. If the stack is too big for +     * @param stack 替换后新的物品堆。如果堆对于此物品栏过大({@link Inventory#getMaxCountPerStack()}),则压缩为物品栏的最大数量。
-                  this inventory ({@link Inventory#getMaxCountPerStack()}), +
-                  it gets resized to this inventory's maximum amount.+
      */      */
     @Override     @Override
Line 109: Line 101:
          
     /**     /**
-     Clears the inventory.+     清除物品栏。
      */      */
     @Override     @Override
Line 117: Line 109:
          
     /**     /**
-     Marks the state as dirty. +     将方块状态标记为脏。 
-     Must be called after changes in the inventory, so that the game can properly save +     更改物品栏之后必须调用,所以游戏正确地储存物品栏内容并提取邻近方块物品栏改变。
-     * the inventory contents and notify neighboring blocks of inventory changes.+
      */       */ 
     @Override     @Override
     default void markDirty() {     default void markDirty() {
-        // Override if you want behavior.+        // 需要行为时,覆盖此方法。
     }     }
          
     /**     /**
-     * @return true if the player can use the inventory, false otherwise.+     * @return true 如果玩家可以使用物品栏,否则为 false。i
      */       */ 
     @Override     @Override
Line 136: Line 127:
 </code> </code>
  
-现在在您的''BlockEntity''中实''ImplementedInventory''+现在在您的 ''BlockEntity'' 中实''ImplementedInventory''并为其提供存储该物品的 ''DefaultedList <ItemStack> items'' 实例。对于此例,我们将在物品栏中最多存储2件物品:
-并为其提供存储该项目的''DefaultedList <ItemStack>项目''实例。 +
-对于此例,我们将在库存中最多存储2件物品:+
 <code java> <code java>
 public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { public class DemoBlockEntity extends BlockEntity implements ImplementedInventory {
Line 152: Line 141:
  
 </code> </code>
-我们还需要保存容器以并从那里加载。 +我们还需要将物品栏保存并从那里加载。''Inventories'' 具有帮助方法,可以使得这个非常轻松:
-''Inventories''具有帮助方法,可以非常轻松地完成此任务+
 <code java> <code java>
 public class DemoBlockEntity extends BlockEntity implements ImplementedInventory { public class DemoBlockEntity extends BlockEntity implements ImplementedInventory {
Line 170: Line 158:
 } }
 </code> </code>
-===== 从容器(或任何容器)中提取和放入 ===== +===== 从物品栏(或任何物品栏)中提取和放入 ===== 
-我们块类中,我们将覆盖''activate''行为以从库存入和提取物品。 +我们覆盖方块类中的 `onUse` 行为以从我们的物品栏入和提取物品。注意这也可以对任何 ''Inventory'' 实例完成,不仅是我们自己的(例如,也因此可以对箱子方块做同的事)。首先我们处理第一个槽位,如果是空的。玩家如果拿着物品,拿着的物品放入物品进入第一个槽位,如果或者进入第二个槽位,如果第一个是空的,或者如果第二个,我们则会输出与物品栏有关的信息。注意我们将 ''ItemStack'' 入物品栏调用 ''copy()'',这样不会随着玩家的 ''ItemStack'' 被破坏。
-注意可以对任何''''实例执行此操作仅是我们自己的(例如,可以对箱子做同的事)。 +
-首先我们处理放入内容物。 如果玩家拿着一个物品,放入他拿着的物品。 +
-如果为空,它将进入第一个如果第一个为空,它将进入第二个槽, +
-或者如果第二个也为空,我们将打印有关库存一些信息。 +
-注意将''ItemStack''内容物时,我们将其称为''copy()'',这样它就不会玩家的''ItemStack''旁边被破坏。+
 <code java> <code java>
 public class ExampleBlock extends Block implements BlockEntityProvider { public class ExampleBlock extends Block implements BlockEntityProvider {
     [...]     [...]
     @Override     @Override
-    public boolean activate(BlockState blockState, World world, BlockPos blockPos, PlayerEntity player, Hand hand, BlockHitResult blockHitResult) { +    public ActionResult onUse(BlockState blockState, World world, BlockPos blockPos, PlayerEntity player, Hand hand, BlockHitResult blockHitResult) { 
-        if (world.isClient) return true;+        if (world.isClient) return ActionResult.SUCCESS;
         Inventory blockEntity = (Inventory) world.getBlockEntity(blockPos);         Inventory blockEntity = (Inventory) world.getBlockEntity(blockPos);
- +  
 + 
         if (!player.getStackInHand(hand).isEmpty()) {         if (!player.getStackInHand(hand).isEmpty()) {
             // Check what is the first open slot and put an item from the player's hand there             // Check what is the first open slot and put an item from the player's hand there
-            if (blockEntity.getInvStack(0).isEmpty()) {+            if (blockEntity.getStack(0).isEmpty()) {
                 // Put the stack the player is holding into the inventory                 // Put the stack the player is holding into the inventory
-                blockEntity.setInvStack(0, player.getStackInHand(hand).copy());+                blockEntity.setStack(0, player.getStackInHand(hand).copy());
                 // Remove the stack from the player's hand                 // Remove the stack from the player's hand
                 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 {
                 // If the inventory is full we'll print it's contents                 // If the inventory is full we'll print it's contents
                 System.out.println("The first slot holds "                 System.out.println("The first slot holds "
-                        + blockEntity.getInvStack(0) + " and the second slot holds " + blockEntity.getInvStack(1));+                        + blockEntity.getStack(0) + " and the second slot holds " + blockEntity.getStack(1));
             }             }
         }          } 
-        return true;+        return ActionResult.SUCCESS;
     }     }
 } }
 </code> </code>
  
- +当玩家不持有物品时,我们将采取相反的行为。我们将从第二个槽中取出项目,然后第二个中的第一个为空。如果第一个也是空的,我们将不做任何事情。
-当玩家不持有物品时,我们将采取相反的行为。 我们将从第二个槽中取出项目,然后第二个中的第一个为空。 +
-如果第一个也是空的,我们将不做任何事情。+
  
 <code java> <code java>
Line 220: Line 201:
             ...             ...
         } else {         } else {
-            // If the player is not holding anything we'll get give him the items in the block entity one by one+            // 如果玩家没有持有任何东西,我们依次将方块实体中的物品给予玩家
  
-             // Find the first slot that has an item and give it to the player+             // 查找第一个有物品的槽位,并给予玩家
             if (!blockEntity.getInvStack(1).isEmpty()) {             if (!blockEntity.getInvStack(1).isEmpty()) {
-                // Give the player the stack in the inventory+                // 给予玩家物品栏中的物品堆
                 player.inventory.offerOrDrop(world, blockEntity.getInvStack(1));                 player.inventory.offerOrDrop(world, blockEntity.getInvStack(1));
                 // Remove the stack from the inventory                 // Remove the stack from the inventory
zh_cn/tutorial/inventory.txt · Last modified: 2023/08/28 10:14 by wjz_p