From da1dd294f62e5968db447f80224ff17ff8f11db2 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 4 Dec 2019 00:04:34 +0100 Subject: [PATCH] Fixed Output Chest --- .../slimefun4/api/JsonDataHolder.java | 6 +- .../slimefun4/api/SlimefunAPI.java | 13 ++++ .../slimefun4/api/blocks/BlockLocation.java | 59 +++++++++++++++++ .../slimefun4/api/blocks/SlimefunBlock.java | 25 ++++++++ .../slimefun4/core/SlimefunWorld.java | 64 +++++++++++++++++++ .../Slimefun/api/BlockStorage.java | 15 ++++- 6 files changed, 178 insertions(+), 4 deletions(-) create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/BlockLocation.java create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/SlimefunBlock.java create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunWorld.java diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/JsonDataHolder.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/JsonDataHolder.java index 10b1f5026..55778ab81 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/JsonDataHolder.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/JsonDataHolder.java @@ -14,8 +14,12 @@ public abstract class JsonDataHolder { protected JsonObject data; private boolean dirty; + public JsonDataHolder() { + this(null); + } + public JsonDataHolder(JsonObject data) { - this.data = data; + this.data = data != null ? data: new JsonObject(); this.dirty = false; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAPI.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAPI.java index 9ba8b3b1d..931ff50b0 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAPI.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/SlimefunAPI.java @@ -1,12 +1,17 @@ package io.github.thebusybiscuit.slimefun4.api; +import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.slimefun4.api.blocks.SlimefunBlock; import io.github.thebusybiscuit.slimefun4.api.items.ItemRestriction; +import io.github.thebusybiscuit.slimefun4.core.SlimefunWorld; import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.PlayerProfile; @@ -84,4 +89,12 @@ public interface SlimefunAPI { return getCategories().stream().flatMap(cat -> cat.getItems().stream()).collect(Collectors.toSet()); } + Optional fromItemStack(ItemStack item); + + Optional fromBlock(); + + SlimefunWorld fromWorld(World world); + + PlayerProfile fromPlayer(OfflinePlayer player); + } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/BlockLocation.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/BlockLocation.java new file mode 100644 index 000000000..eeb4e286b --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/BlockLocation.java @@ -0,0 +1,59 @@ +package io.github.thebusybiscuit.slimefun4.api.blocks; + +import java.util.Objects; + +import org.bukkit.Location; +import org.bukkit.block.Block; + +public final class BlockLocation { + + private final int x; + private final int y; + private final int z; + + public BlockLocation(Block b) { + this(b.getX(), b.getY(), b.getZ()); + } + + public BlockLocation(Location l) { + this(l.getBlockX(), l.getBlockY(), l.getBlockZ()); + } + + public BlockLocation(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getZ() { + return z; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof BlockLocation) { + BlockLocation l = (BlockLocation) obj; + return l.getX() == x && l.getY() == y && l.getZ() == z; + } + else return false; + } + + @Override + public int hashCode() { + return Objects.hash(x, y, z); + } + + @Override + public String toString() { + return "[" + x + " | " + y + " | " + z + "]"; + } + +} \ No newline at end of file diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/SlimefunBlock.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/SlimefunBlock.java new file mode 100644 index 000000000..bf2b29ded --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/blocks/SlimefunBlock.java @@ -0,0 +1,25 @@ +package io.github.thebusybiscuit.slimefun4.api.blocks; + +import com.google.gson.JsonObject; + +import io.github.thebusybiscuit.slimefun4.api.JsonDataHolder; + +public class SlimefunBlock extends JsonDataHolder { + + private String id; + + public SlimefunBlock(String id) { + this(id, null); + } + + public SlimefunBlock(String id, JsonObject data) { + super(data); + + this.id = id; + } + + public String getID() { + return id; + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunWorld.java b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunWorld.java new file mode 100644 index 000000000..772933992 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/core/SlimefunWorld.java @@ -0,0 +1,64 @@ +package io.github.thebusybiscuit.slimefun4.core; + +import java.util.HashMap; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.TileState; + +import io.github.thebusybiscuit.cscorelib2.collections.OptionalMap; +import io.github.thebusybiscuit.slimefun4.api.blocks.BlockLocation; +import io.github.thebusybiscuit.slimefun4.api.blocks.SlimefunBlock; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; + +public class SlimefunWorld { + + private final UUID uuid; + private final OptionalMap blocks = new OptionalMap<>(HashMap::new); + + public SlimefunWorld(UUID uuid) { + this.uuid = uuid; + } + + /** + * This method will return the {@link UUID} of this instance. + * The {@link UUID} will be the same for {@link SlimefunWorld} and the corresponding instance + * of {@link World}. + * + * @return This world's {@link UUID} + */ + public UUID getUUID() { + return uuid; + } + + /** + * This method will reliably get the instance of {@link SlimefunBlock} associated with the given + * {@link Block}. + * + * @param b The {@link Block} to query + * @return An {@link Optional} of the requested {@link SlimefunBlock}, empty if none was found + */ + public Optional getBlock(Block b) { + if (b.getState() instanceof TileState) { + Optional blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) b.getState()); + + if (blockData.isPresent()) { + return Optional.of(new SlimefunBlock(blockData.get())); + } + } + + return blocks.get(new BlockLocation(b)); + } + + public boolean isBlock(Block b, String id) { + if (id == null) { + throw new IllegalArgumentException("Cannot check blocks for id: null"); + } + + Optional block = getBlock(b); + + return block.isPresent() && block.get().getID().equals(id); + } +} diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java index 30a590777..b4a62081c 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -17,6 +18,7 @@ import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; +import org.bukkit.block.TileState; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.HumanEntity; @@ -561,12 +563,19 @@ public class BlockStorage { return SlimefunItem.getByID(getLocationInfo(l, "id")); } - public static String checkID(Block block) { - return checkID(block.getLocation()); + public static String checkID(Block b) { + if (b.getState() instanceof TileState) { + Optional blockData = SlimefunPlugin.getBlockDataService().getBlockData((TileState) b.getState()); + + if (blockData.isPresent()) return blockData.get(); + } + + return checkID(b.getLocation()); } public static boolean check(Block block, String slimefunItem) { - return check(block.getLocation(), slimefunItem); + String id = checkID(block); + return id != null && id.equals(slimefunItem); } public static String checkID(Location l) {