LootTable API and replenishable lootables

Provides an API to control the loot table for an object.
Also provides a feature that any Lootable Inventory (Chests in Structures)
can automatically replenish after a given time.

This feature is good for long term worlds so that newer players
do not suffer with "Every chest has been looted"

== AT ==
public org.bukkit.craftbukkit.block.CraftBlockEntityState getTileEntity()Lnet/minecraft/world/level/block/entity/BlockEntity;
public org.bukkit.craftbukkit.block.CraftLootable setLootTable(Lorg/bukkit/loot/LootTable;J)V
public org.bukkit.craftbukkit.entity.CraftMinecartContainer setLootTable(Lorg/bukkit/loot/LootTable;J)V
This commit is contained in:
Aikar
2016-05-01 21:19:14 -04:00
parent b8d05bbc27
commit 07c767b6f4
19 changed files with 718 additions and 74 deletions

View File

@@ -58,7 +58,8 @@ public class CraftBrushableBlock extends CraftBlockEntityState<BrushableBlockEnt
this.setLootTable(this.getLootTable(), seed);
}
private void setLootTable(LootTable table, long seed) {
@Override // Paper - this is now an override
public void setLootTable(LootTable table, long seed) { // Paper - make public since it overrides a public method
this.getSnapshot().setLootTable(CraftLootTable.bukkitToMinecraft(table), seed);
}

View File

@@ -8,7 +8,7 @@ import org.bukkit.craftbukkit.CraftLootTable;
import org.bukkit.loot.LootTable;
import org.bukkit.loot.Lootable;
public abstract class CraftLootable<T extends RandomizableContainerBlockEntity> extends CraftContainer<T> implements Nameable, Lootable {
public abstract class CraftLootable<T extends RandomizableContainerBlockEntity> extends CraftContainer<T> implements Nameable, Lootable, com.destroystokyo.paper.loottable.PaperLootableBlockInventory { // Paper
public CraftLootable(World world, T tileEntity) {
super(world, tileEntity);
@@ -27,29 +27,17 @@ public abstract class CraftLootable<T extends RandomizableContainerBlockEntity>
}
}
// Paper start - move to PaperLootableBlockInventory
@Override
public LootTable getLootTable() {
return CraftLootTable.minecraftToBukkit(this.getSnapshot().lootTable);
public net.minecraft.world.level.Level getNMSWorld() {
return ((org.bukkit.craftbukkit.CraftWorld) this.getWorld()).getHandle();
}
@Override
public void setLootTable(LootTable table) {
this.setLootTable(table, this.getSeed());
}
@Override
public long getSeed() {
return this.getSnapshot().lootTableSeed;
}
@Override
public void setSeed(long seed) {
this.setLootTable(this.getLootTable(), seed);
}
public void setLootTable(LootTable table, long seed) {
this.getSnapshot().setLootTable(CraftLootTable.bukkitToMinecraft(table), seed);
public net.minecraft.world.RandomizableContainer getRandomizableContainer() {
return this.getSnapshot();
}
// Paper end - move to PaperLootableBlockInventory
@Override
public abstract CraftLootable<T> copy();

View File

@@ -7,8 +7,7 @@ import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.inventory.Inventory;
import org.bukkit.loot.LootTable;
public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat {
public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.entity.ChestBoat, com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
private final Inventory inventory;
public CraftChestBoat(CraftServer server, AbstractChestBoat entity) {
@@ -31,28 +30,6 @@ public abstract class CraftChestBoat extends CraftBoat implements org.bukkit.ent
return this.inventory;
}
@Override
public void setLootTable(LootTable table) {
this.setLootTable(table, this.getSeed());
}
// Paper - moved loot table logic to PaperLootableEntityInventory
@Override
public LootTable getLootTable() {
return CraftLootTable.minecraftToBukkit(this.getHandle().getContainerLootTable());
}
@Override
public void setSeed(long seed) {
this.setLootTable(this.getLootTable(), seed);
}
@Override
public long getSeed() {
return this.getHandle().getContainerLootTableSeed();
}
private void setLootTable(LootTable table, long seed) {
this.getHandle().setContainerLootTable(CraftLootTable.bukkitToMinecraft(table));
this.getHandle().setContainerLootTableSeed(seed);
}
}

View File

@@ -7,7 +7,7 @@ import org.bukkit.entity.minecart.StorageMinecart;
import org.bukkit.inventory.Inventory;
@SuppressWarnings("deprecation")
public class CraftMinecartChest extends CraftMinecartContainer implements StorageMinecart {
public class CraftMinecartChest extends CraftMinecartContainer implements StorageMinecart, com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
private final CraftInventory inventory;
public CraftMinecartChest(CraftServer server, MinecartChest entity) {

View File

@@ -7,7 +7,7 @@ import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.loot.LootTable;
import org.bukkit.loot.Lootable;
public abstract class CraftMinecartContainer extends CraftMinecart implements Lootable {
public abstract class CraftMinecartContainer extends CraftMinecart implements com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
public CraftMinecartContainer(CraftServer server, AbstractMinecart entity) {
super(server, entity);
@@ -18,27 +18,5 @@ public abstract class CraftMinecartContainer extends CraftMinecart implements Lo
return (AbstractMinecartContainer) this.entity;
}
@Override
public void setLootTable(LootTable table) {
this.setLootTable(table, this.getSeed());
}
@Override
public LootTable getLootTable() {
return CraftLootTable.minecraftToBukkit(this.getHandle().lootTable);
}
@Override
public void setSeed(long seed) {
this.setLootTable(this.getLootTable(), seed);
}
@Override
public long getSeed() {
return this.getHandle().lootTableSeed;
}
public void setLootTable(LootTable table, long seed) {
this.getHandle().setLootTable(CraftLootTable.bukkitToMinecraft(table), seed);
}
// Paper - moved loot table logic to PaperLootableEntityInventory
}

View File

@@ -6,7 +6,7 @@ import org.bukkit.craftbukkit.inventory.CraftInventory;
import org.bukkit.entity.minecart.HopperMinecart;
import org.bukkit.inventory.Inventory;
public final class CraftMinecartHopper extends CraftMinecartContainer implements HopperMinecart {
public final class CraftMinecartHopper extends CraftMinecartContainer implements HopperMinecart, com.destroystokyo.paper.loottable.PaperLootableEntityInventory { // Paper
private final CraftInventory inventory;
public CraftMinecartHopper(CraftServer server, MinecartHopper entity) {