LootGenerateEvent
LootGenerateEvent
=> org.bukkit.event.Event
=> org.bukkit.event.world.WorldEvent
=> org.bukkit.event.world.LootGenerateEvent
Called when a {@link LootTable} is generated in the world for an{@link InventoryHolder}.This event is NOT currently called when an entity's loot table has beengenerated (use {@link EntityDeathEvent#getDrops()}, but WILL be called byplugins invoking{@link LootTable#fillInventory(org.bukkit.inventory.Inventory, java.util.Random, LootContext)}.当一个LootTable
被用于在某个世界中填充一个InventoryHolder
时触发。目前,当实体死亡时,虽然也要通过LootTable
生成掉落物,但这个事件不会被触发。实体死亡时的掉落物可以使用EntityDeathEvent#getDrops()
方法获取。当有插件调用LootTable#fillInventory(org.bukkit.inventory.Inventory, java.util.Random, LootContext)
方法时,本事件会被触发。译注:LootTable
是战利品表。战利品表用于生成宝箱中的物品、用于生成钓鱼时钓上岸的物品堆、用于确定树叶自然腐烂时掉下苹果的概率……总之,许多与概率相关的地方都有战利品表的身影。所谓“填充一个InventoryHolder
”,主要指的是填充宝箱。InventoryHolder
不等同于Inventory
,前者是物品栏的拥有者,后者是物品栏本身。比如玩家是玩家背包的拥有者,箱子方块是箱子物品栏的拥有者。此事件偏重于宝箱被填充时触发,树叶腐烂等情况是不会触发本事件的。
方法声明: public Entity getEntity()
方法签名: ()Lorg/bukkit/entity/Entity;
Get the entity used as context for loot generation (if applicable).For inventories where entities are not required to generate loot, such ashoppers, null will be returned.This is a convenience method for{@code getLootContext().getLootedEntity()}.@return the entity该方法用于获取战利品生成上下文中的实体(如果能获取到)。对于那些生成战利品时无需考虑实体因素的物品栏,比如漏斗,该方法会返回null
。本方法是getLootContext().getLootedEntity()
方法的简写。@return 相关实体。译注:实体是可以影响战利品生成的。在Minecraft Wiki
中的Luck
页面( https://minecraft.fandom.com/wiki/Luck ),存在关于实体幸运属性的论述。实体获取战利品时,其generic.luck
属性也会参与计算,如果实体的generic.luck
属性值更高,则战利品表中quality
值高的结果更可能出现。因此根据战利品表生成战利品时,实体也是参与计算的一环。
方法声明: public InventoryHolder getInventoryHolder()
方法签名: ()Lorg/bukkit/inventory/InventoryHolder;
Get the inventory holder in which the loot was generated.If the loot was generated as a result of the block being broken, theinventory holder will be null as this event is called post block break.@return the inventory holder该方法用于获取将要被填充的InventoryHolder
。如果战利品是因为某个方块被破坏而生成,那么该方法就会返回null
,因为本事件是在方块被破坏以后被触发的。@return 物品栏的拥有者。译注:InventoryHolder
名词解释见上。所谓“因为某个方块被破 坏而生成”,是指不打开宝箱,直接将其破坏。此时也会掉落战利品。但是方块已经被破坏了,这个物品栏的持有者自然就是空。
方法声明: public LootTable getLootTable()
方法签名: ()Lorg/bukkit/loot/LootTable;
Get the loot table used to generate loot.@return the loot table该方法用于获取生成战利品时所使用的战利品表。@return 战利品表。
方法声明: public LootContext getLootContext()
方法签名: ()Lorg/bukkit/loot/LootContext;
Get the loot context used to provide context to the loot table's lootgeneration.@return the loot context该方法用于获取战利品表的上下文。在根据战利品表生成战利品的过程中,需要上下文来提供信息。@return 战利品表上下文。译注:所谓“上下文”,指的是生成战利品时所需要的所有信息,比如有关实体(钓鱼时读取玩家的generic.luck
属性)、比如生成的位置(宝箱的位置)等等,此处未列全。有了这些信息,就可以完成战利品的生成。Context
一词,在程序设计中指的是开发者完成一项任务所需要的全部信息,或者程序运行所需要的一些基本信息的集合。比如线程有ContextClassLoader
等。Context
就像是程序运行所需要的环境。
方法声明: public void setLoot(@Nullable Collection loot)
方法签名: (Ljava/util/Collection;)V
Set the loot to be generated. Null items will be treated as air.Note: the set collection is not the one which will be returned by{@link #getLoot()}.@param loot the loot to generate, null to clear all loot该方法用于设置将要被填充进宝箱的物品堆列表。该列表中所有为null
的项都将按照空气物品堆处理。注意,该方法的参数不可以是getLoot()
方法的返回值。@param loot 将要被填充进宝箱的物品堆列表。如果传入null
将清空所有物品堆,不会有任何战利品生成。译注:getLoot()
和setLoot(Collection<ItemStack>)
两个方法维护的是同一个集合,名为loot
,类型为List<ItemStack>
。此处的loot
不是方法参数里的loot
,尽管二者名字相同。为了作出区别,按照Java
写法,以下所有this.loot
表示事件类中的集合,而loot
表示用户传入的参数。setLoot(Collection<ItemStack>)
的实现是将this.loot
集合清空,再调用this.loot.addAll
方法,把用户传入的参数loot
列表中所包含的物品堆全部加入this.loot
列表。getLoot()
的实现是直接返回this.loot
,没有进行列表的复制,直接提供了引用。用户操作getLoot()
方法返回的列表,就相当于直接对LootGenerateEvent
类里的this.loot
作了修改。如果将getLoot()
得到的列表作为参数,那么在setLoot(Collection<ItemStack>)
方法中,首先会清空this.loot
,这样,getLoot()
方法的返回值直接变为空列表。用户传入的参数是this.loot
的引用,就相当于引用了空列表,再之后this.loot
会将自己的全部内容添加到自己的末尾,由于其内容为空,因此最终的结果是this.loot
变为空列表,不会有任何战利品被生成。对源代码节选如下:private final List<ItemStack> loot;public List<ItemStack> getLoot() {return this.loot;}public void setLoot(Collection<ItemStack> loot) {this.loot.clear();if (loot != null)this.loot.addAll(loot);}
方法声明: public List getLoot()
方法签名: ()Ljava/util/List;
Get a mutable list of all loot to be generated.Any items added or removed from the returned list will be reflected inthe loot generation. Null items will be treated as air.@return the loot to generate该方法用于获取将要被填充进宝箱的物品堆列表。该列表是可以被修改的。向本方法返回的列表中添加或删除物品堆以后,操作结果将会直接反映在生成的宝箱中的内容物上。该列表中所有为null
的元素都将按空气物品堆处理。@return 将要被填充进宝箱的物品堆列表。译注:见上setLoot(Collection<ItemStack>)
方法。
方法声明: public boolean isPlugin()
方法签名: ()Z
Check whether or not this event was called as a result of a plugininvoking{@link LootTable#fillInventory(org.bukkit.inventory.Inventory, java.util.Random, LootContext)}.@return true if plugin caused, false otherwise该方法用于检测本事件 是否系由于插件行为而触发。当插件调用LootTable#fillInventory(org.bukkit.inventory.Inventory, java.util.Random, LootContext)
方法时,会触发本事件。@return 如果是由插件行为触发,返回true
,否则返回false
。译注:插件可以利用上述方法来为任意一个自定义的物品栏生成内容,自制宝箱。
方法声明: public void setCancelled(boolean cancel)
方法签名: (Z)V
方法声明: public boolean isCancelled()
方法签名: ()Z
方法声明: public HandlerList getHandlers()
方法签名: ()Lorg/bukkit/event/HandlerList;
方法声明: public static HandlerList getHandlerList()
方法签名: ()Lorg/bukkit/event/HandlerList;ist;
Last modified 1mo ago