From 007a4c6f83ac8b6da499fe5be2788b5c1612043c Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 4 Apr 2020 15:16:11 +0200 Subject: [PATCH] [CI skip] More refactoring and documentation [javadocs] --- CHANGELOG.md | 3 +- .../slimefun4/api/items/HashedArmorpiece.java | 47 +++++++++++- .../slimefun4/api/network/Network.java | 5 ++ .../items/electric/gadgets/MultiTool.java | 71 ++++++------------- .../items/electric/gadgets/MultiToolMode.java | 25 +++++++ .../implementation/items/tools/GoldPan.java | 15 +++- .../Objects/SlimefunItem/ChargableItem.java | 5 -- .../Objects/SlimefunItem/SlimefunItem.java | 11 --- .../api/inventory/BlockMenuPreset.java | 4 +- 9 files changed, 116 insertions(+), 70 deletions(-) create mode 100644 src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiToolMode.java diff --git a/CHANGELOG.md b/CHANGELOG.md index b6b7a95bc..8b8acaa53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,7 +50,8 @@ #### Additions * Added GEOResourceGenerationEvent * Added SlimefunGuide-Options API -* Added 1.13 backwards compatibility +* Added ItemSettings API +* Added experimental 1.13 backwards compatibility #### Changes diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/HashedArmorpiece.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/HashedArmorpiece.java index 4bf32b0d5..afb0cd4be 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/HashedArmorpiece.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/items/HashedArmorpiece.java @@ -2,25 +2,54 @@ package io.github.thebusybiscuit.slimefun4.api.items; import java.util.Optional; +import org.bukkit.Material; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.slimefun4.implementation.items.armor.SlimefunArmorPiece; +import io.github.thebusybiscuit.slimefun4.implementation.tasks.ArmorTask; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; +/** + * This class serves as a way of checking whether a {@link Player} has changed their armor + * between ticks. We do that by storing the hash of their armor and a reference to the + * corresponding {@link SlimefunArmorPiece} if such a correlation exists. + * + * This gives us a significant performance improvement as we only need to check for a + * {@link SlimefunArmorPiece} if the item diverged in the first place. + * + * @author TheBusyBiscuit + * + * @see SlimefunArmorPiece + * @see ArmorTask + */ public final class HashedArmorpiece { private int hash; private Optional item; + /** + * This initializes a new {@link HashedArmorpiece} with no {@link SlimefunArmorPiece} + * and a zero hash. + */ public HashedArmorpiece() { this.hash = 0; this.item = Optional.empty(); } + /** + * This will update this {@link HashedArmorpiece} with the given {@link ItemStack} + * and the corresponding {@link SlimefunItem} + * + * @param stack + * The new armorpiece to be stored in this {@link HashedArmorpiece} + * @param item + * The {@link SlimefunItem} corresponding to the provided {@link ItemStack}, may be null + */ public void update(ItemStack stack, SlimefunItem item) { - if (stack == null) { + if (stack == null || stack.getType() == Material.AIR) { this.hash = 0; } else { @@ -39,8 +68,16 @@ public final class HashedArmorpiece { } } + /** + * This method checks whether the given {@link ItemStack} is no longer similar to the + * one represented by this {@link HashedArmorpiece}. + * + * @param stack + * The {@link ItemStack} to compare + * @return Whether the {@link HashedArmorpiece} and the given {@link ItemStack} mismatch + */ public boolean hasDiverged(ItemStack stack) { - if (stack == null) { + if (stack == null || stack.getType() == Material.AIR) { return hash == 0; } else { @@ -52,6 +89,12 @@ public final class HashedArmorpiece { } } + /** + * Returns the {@link SlimefunArmorPiece} that corresponds to this {@link HashedArmorpiece}, + * or an empty {@link Optional} + * + * @return An {@link Optional} describing the result + */ public Optional getItem() { return item; } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/Network.java b/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/Network.java index 13546e56e..3292df9e3 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/Network.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/api/network/Network.java @@ -149,6 +149,7 @@ public abstract class Network { onClassificationChange(l, currentAssignment, classification); } + steps += 1; if (steps >= maxSteps) { @@ -173,6 +174,10 @@ public abstract class Network { discoverNeighbors(l, 0.0, 0.0, -1.0); } + /** + * This method runs the network visualizer which displays a {@link Particle} on + * every {@link Location} that this {@link Network} can connect to. + */ public void display() { Slimefun.runSync(() -> { DustOptions options = new DustOptions(Color.BLUE, 2F); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java index 7659093bd..ef55bb775 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiTool.java @@ -17,42 +17,22 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.ChargableItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.BlockBreakHandler; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; -import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; import me.mrCookieSlime.Slimefun.api.energy.ItemEnergy; public class MultiTool extends ChargableItem { - private static final String PREFIX = "mode."; private static final float COST = 0.3F; - private Map selectedMode = new HashMap<>(); - private List modes; + private final Map selectedMode = new HashMap<>(); + private final List modes = new ArrayList<>(); public MultiTool(SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, String... items) { - super(Categories.TECH, item, recipeType, recipe, getKeys(items), getValues(items)); - } - - private static String[] getKeys(String... items) { - String[] keys = new String[items.length * 2]; + super(Categories.TECH, item, recipeType, recipe); for (int i = 0; i < items.length; i++) { - keys[i * 2] = PREFIX + i + ".enabled"; - keys[i * 2 + 1] = PREFIX + i + ".item"; + modes.add(new MultiToolMode(this, i, items[i])); } - - return keys; - } - - private static Object[] getValues(String... items) { - Object[] values = new Object[items.length * 2]; - - for (int i = 0; i < items.length; i++) { - values[i * 2] = true; - values[i * 2 + 1] = items[i]; - } - - return values; } protected ItemUseHandler getItemUseHandler() { @@ -69,8 +49,7 @@ public class MultiTool extends ChargableItem { if (charge >= COST) { ItemEnergy.chargeItem(item, -COST); - String itemID = (String) Slimefun.getItemValue(getID(), "mode." + modes.get(index) + ".item"); - SlimefunItem sfItem = SlimefunItem.getByID(itemID); + SlimefunItem sfItem = modes.get(index).getItem(); if (sfItem != null) { sfItem.callItemHandler(ItemUseHandler.class, handler -> handler.onRightClick(e)); @@ -78,10 +57,9 @@ public class MultiTool extends ChargableItem { } } else { - index++; - if (index == modes.size()) index = 0; + index = nextIndex(index); - SlimefunItem selectedItem = SlimefunItem.getByID((String) Slimefun.getItemValue(getID(), "mode." + modes.get(index) + ".item")); + SlimefunItem selectedItem = modes.get(index).getItem(); String itemName = selectedItem != null ? selectedItem.getItemName() : "Unknown"; SlimefunPlugin.getLocal().sendMessage(p, "messages.mode-change", true, msg -> msg.replace("%device%", "Multi Tool").replace("%mode%", ChatColor.stripColor(itemName))); selectedMode.put(p.getUniqueId(), index); @@ -89,6 +67,21 @@ public class MultiTool extends ChargableItem { }; } + private int nextIndex(int i) { + int index = i; + + do { + index++; + + if (index >= modes.size()) { + index = 0; + } + } + while (index != i && !modes.get(index).isEnabled()); + + return index; + } + private BlockBreakHandler getBlockBreakHandler() { return (e, item, fortune, drops) -> { if (isItem(item)) { @@ -108,24 +101,4 @@ public class MultiTool extends ChargableItem { addItemHandler(getBlockBreakHandler()); } - @Override - public void postRegister() { - List list = new ArrayList<>(); - - int i = 0; - - while (Slimefun.getItemValue(this.getID(), PREFIX + i + ".enabled") != null) { - if ((boolean) Slimefun.getItemValue(this.getID(), PREFIX + i + ".enabled")) { - list.add(i); - } - i++; - } - - this.modes = list; - } - - public List getModes() { - return this.modes; - } - } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiToolMode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiToolMode.java new file mode 100644 index 000000000..c3a16b706 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/electric/gadgets/MultiToolMode.java @@ -0,0 +1,25 @@ +package io.github.thebusybiscuit.slimefun4.implementation.items.electric.gadgets; + +import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; + +class MultiToolMode { + + private final ItemSetting item; + private final ItemSetting enabled; + + MultiToolMode(MultiTool multiTool, int id, String itemId) { + this.item = new ItemSetting<>("mode." + id + ".item", itemId); + this.enabled = new ItemSetting<>("mode." + id + ".enabled", true); + + multiTool.addItemSetting(item, enabled); + } + + public SlimefunItem getItem() { + return SlimefunItem.getByID(item.getValue()); + } + + public boolean isEnabled() { + return enabled.getValue(); + } +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/tools/GoldPan.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/tools/GoldPan.java index 751d1ee5d..5791d4d13 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/tools/GoldPan.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/tools/GoldPan.java @@ -15,6 +15,8 @@ import io.github.thebusybiscuit.cscorelib2.collections.RandomizedSet; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; import io.github.thebusybiscuit.slimefun4.core.attributes.RecipeDisplayItem; +import io.github.thebusybiscuit.slimefun4.implementation.items.electric.machines.ElectricGoldPan; +import io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks.AutomatedPanningMachine; import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; @@ -23,6 +25,17 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemUseHandler; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; +/** + * A {@link GoldPan} is a {@link SlimefunItem} which allows you to obtain various + * resources from Gravel. + * + * @author TheBusyBiscuit + * + * @see NetherGoldPan + * @see AutomatedPanningMachine + * @see ElectricGoldPan + * + */ public class GoldPan extends SimpleSlimefunItem implements RecipeDisplayItem { private final RandomizedSet randomizer = new RandomizedSet<>(); @@ -109,7 +122,7 @@ public class GoldPan extends SimpleSlimefunItem implements Recip return recipes; } - protected class GoldPanDrop extends ItemSetting { + class GoldPanDrop extends ItemSetting { private final ItemStack output; diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java index aeab9cd7c..a97759a3b 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/ChargableItem.java @@ -14,9 +14,4 @@ public class ChargableItem extends SlimefunItem { super(category, item, recipeType, recipe); } - @Deprecated - public ChargableItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { - super(category, item, recipeType, recipe, null, keys, values); - } - } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index 05bbd9a2f..5be156b7a 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -114,17 +114,6 @@ public class SlimefunItem implements Placeable { this.recipeOutput = recipeOutput; } - @Deprecated - public SlimefunItem(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput, String[] keys, Object[] values) { - this(category, item, recipeType, recipe, recipeOutput); - - if (keys != null && values != null && keys.length == values.length) { - for (int i = 0; i < keys.length; i++) { - itemSettings.add(new ItemSetting<>(keys[i], values[i])); - } - } - } - // Previously deprecated constructor, now only for internal purposes protected SlimefunItem(Category category, ItemStack item, String id, RecipeType recipeType, ItemStack[] recipe) { this.category = category; diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java index f636d6a4d..018bd0e42 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java @@ -130,7 +130,9 @@ public abstract class BlockMenuPreset extends ChestMenu { } for (int slot = 0; slot < 54; slot++) { - if (getMenuClickHandler(slot) != null) menu.addMenuClickHandler(slot, getMenuClickHandler(slot)); + if (getMenuClickHandler(slot) != null) { + menu.addMenuClickHandler(slot, getMenuClickHandler(slot)); + } } menu.addMenuOpeningHandler(getMenuOpeningHandler());