diff --git a/CHANGELOG.md b/CHANGELOG.md index da936262b..fb84785df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -59,6 +59,7 @@ * Fixed #1933 * Fixed random errors because of Mojang's new player heads backend (Why... Mojang... why?) * Fixed Butcher Androids doing incorrect amounts of damage +* Fixed #1935 ## Release Candidate 11 (25 Apr 2020) diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AbstractSmeltery.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AbstractSmeltery.java new file mode 100644 index 000000000..0661d8fc7 --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/AbstractSmeltery.java @@ -0,0 +1,91 @@ +package io.github.thebusybiscuit.slimefun4.implementation.items.multiblocks; + +import java.util.List; + +import org.bukkit.Effect; +import org.bukkit.Sound; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.Dispenser; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; +import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.MultiBlockMachine; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; + +/** + * An abstract super class for the {@link Smeltery} and {@link MakeshiftSmeltery}. + * + * @author TheBusyBiscuit + * + */ +abstract class AbstractSmeltery extends MultiBlockMachine { + + public AbstractSmeltery(Category category, SlimefunItemStack item, ItemStack[] recipe, ItemStack[] machineRecipes, BlockFace trigger) { + super(category, item, recipe, machineRecipes, trigger); + } + + @Override + public void onInteract(Player p, Block b) { + Block dispBlock = b.getRelative(BlockFace.DOWN); + Dispenser disp = (Dispenser) dispBlock.getState(); + Inventory inv = disp.getInventory(); + List inputs = RecipeType.getRecipeInputList(this); + + for (int i = 0; i < inputs.size(); i++) { + if (canCraft(inv, inputs, i)) { + ItemStack output = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); + + if (Slimefun.hasUnlocked(p, output, true)) { + Inventory outputInv = findOutputInventory(output, dispBlock, inv); + + if (outputInv != null) { + craft(p, b, inv, inputs.get(i), output, outputInv); + } + else SlimefunPlugin.getLocal().sendMessage(p, "machines.full-inventory", true); + } + + return; + } + } + + SlimefunPlugin.getLocal().sendMessage(p, "machines.unknown-material", true); + } + + private boolean canCraft(Inventory inv, List inputs, int i) { + for (ItemStack expectedInput : inputs.get(i)) { + if (expectedInput != null) { + for (int j = 0; j < inv.getContents().length; j++) { + if (j == (inv.getContents().length - 1) && !SlimefunUtils.isItemSimilar(inv.getContents()[j], expectedInput, true)) { + return false; + } + else if (SlimefunUtils.isItemSimilar(inv.getContents()[j], expectedInput, true)) { + break; + } + } + } + } + + return true; + } + + protected void craft(Player p, Block b, Inventory inv, ItemStack[] recipe, ItemStack output, Inventory outputInv) { + for (ItemStack removing : recipe) { + if (removing != null) { + InvUtils.removeItem(inv, removing.getAmount(), true, stack -> SlimefunUtils.isItemSimilar(stack, removing, true)); + } + } + + outputInv.addItem(output); + p.getWorld().playSound(p.getLocation(), Sound.BLOCK_LAVA_POP, 1, 1); + p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + } + +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/MakeshiftSmeltery.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/MakeshiftSmeltery.java index a091437b2..59cdd52e4 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/MakeshiftSmeltery.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/MakeshiftSmeltery.java @@ -5,32 +5,20 @@ import java.util.List; import org.bukkit.Effect; import org.bukkit.Material; -import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.Dispenser; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; -import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; -import me.mrCookieSlime.Slimefun.SlimefunPlugin; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.MultiBlockMachine; -import me.mrCookieSlime.Slimefun.api.Slimefun; -public class MakeshiftSmeltery extends MultiBlockMachine { +public class MakeshiftSmeltery extends AbstractSmeltery { public MakeshiftSmeltery(Category category) { - super(category, SlimefunItems.MAKESHIFT_SMELTERY, new ItemStack[] { - null, new ItemStack(Material.OAK_FENCE), null, - new ItemStack(Material.BRICKS), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.BRICKS), - null, new ItemStack(Material.FLINT_AND_STEEL), null - }, new ItemStack[0], BlockFace.DOWN); + super(category, SlimefunItems.MAKESHIFT_SMELTERY, new ItemStack[] { null, new ItemStack(Material.OAK_FENCE), null, new ItemStack(Material.BRICKS), new CustomItem(Material.DISPENSER, "Dispenser (Facing up)"), new ItemStack(Material.BRICKS), null, new ItemStack(Material.FLINT_AND_STEEL), null }, new ItemStack[0], BlockFace.DOWN); } @Override @@ -46,61 +34,12 @@ public class MakeshiftSmeltery extends MultiBlockMachine { } @Override - public void onInteract(Player p, Block b) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - List inputs = RecipeType.getRecipeInputList(this); - - for (int i = 0; i < inputs.size(); i++) { - if (canCraft(inv, inputs, i)) { - ItemStack output = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); - - if (Slimefun.hasUnlocked(p, output, true)) { - Inventory outputInv = findOutputInventory(output, dispBlock, inv); - - if (outputInv != null) { - craft(p, b, inv, inputs.get(i), output, outputInv); - } - else SlimefunPlugin.getLocal().sendMessage(p, "machines.full-inventory", true); - } - - return; - } - } - - SlimefunPlugin.getLocal().sendMessage(p, "machines.unknown-material", true); - } - - private void craft(Player p, Block b, Inventory inv, ItemStack[] recipe, ItemStack output, Inventory outputInv) { - for (ItemStack removing : recipe) { - if (removing != null) { - InvUtils.removeItem(inv, removing.getAmount(), true, stack -> SlimefunUtils.isItemSimilar(stack, removing, true)); - } - } - - outputInv.addItem(output); - p.getWorld().playSound(p.getLocation(), Sound.BLOCK_LAVA_POP, 1, 1); - p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + protected void craft(Player p, Block b, Inventory inv, ItemStack[] recipe, ItemStack output, Inventory outputInv) { + super.craft(p, b, inv, recipe, output, outputInv); Block fire = b.getRelative(BlockFace.DOWN).getRelative(BlockFace.DOWN); fire.getWorld().playEffect(fire.getLocation(), Effect.STEP_SOUND, fire.getType()); fire.setType(Material.AIR); } - private boolean canCraft(Inventory inv, List inputs, int i) { - for (ItemStack converting : inputs.get(i)) { - if (converting != null) { - for (int j = 0; j < inv.getContents().length; j++) { - if (j == (inv.getContents().length - 1) && !SlimefunUtils.isItemSimilar(converting, inv.getContents()[j], true)) { - return false; - } - else if (SlimefunUtils.isItemSimilar(inv.getContents()[j], converting, true)) break; - } - } - } - - return true; - } - } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Smeltery.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Smeltery.java index 56d8764ea..0274f8e19 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Smeltery.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/multiblocks/Smeltery.java @@ -11,7 +11,6 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.block.Dispenser; import org.bukkit.block.Dropper; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -19,19 +18,14 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.Damageable; import org.bukkit.inventory.meta.ItemMeta; -import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.slimefun4.api.items.ItemSetting; -import io.github.thebusybiscuit.slimefun4.utils.SlimefunUtils; import me.mrCookieSlime.Slimefun.SlimefunPlugin; -import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.SlimefunItems; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks.MultiBlockMachine; import me.mrCookieSlime.Slimefun.api.BlockStorage; -import me.mrCookieSlime.Slimefun.api.Slimefun; -public class Smeltery extends MultiBlockMachine { +public class Smeltery extends AbstractSmeltery { private final BlockFace[] faces = { BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST }; private final ItemSetting fireBreakingChance = new ItemSetting<>("fire-breaking-chance", 34); @@ -59,47 +53,11 @@ public class Smeltery extends MultiBlockMachine { } @Override - public void onInteract(Player p, Block b) { - Block dispBlock = b.getRelative(BlockFace.DOWN); - Dispenser disp = (Dispenser) dispBlock.getState(); - Inventory inv = disp.getInventory(); - List inputs = RecipeType.getRecipeInputList(this); - - for (int i = 0; i < inputs.size(); i++) { - if (canCraft(inv, inputs, i)) { - ItemStack output = RecipeType.getRecipeOutputList(this, inputs.get(i)).clone(); - - if (Slimefun.hasUnlocked(p, output, true)) { - Inventory outputInv = findOutputInventory(output, dispBlock, inv); - - if (outputInv != null) { - craft(p, dispBlock, b, inv, inputs.get(i), output, outputInv); - } - else { - SlimefunPlugin.getLocal().sendMessage(p, "machines.full-inventory", true); - } - } - - return; - } - } - - SlimefunPlugin.getLocal().sendMessage(p, "machines.pattern-not-found", true); - } - - private void craft(Player p, Block dispenser, Block b, Inventory inv, ItemStack[] recipe, ItemStack output, Inventory outputInv) { - for (ItemStack removing : recipe) { - if (removing != null) { - InvUtils.removeItem(inv, removing.getAmount(), true, stack -> SlimefunUtils.isItemSimilar(stack, removing, true)); - } - } - - outputInv.addItem(output); - p.getWorld().playSound(p.getLocation(), Sound.BLOCK_LAVA_POP, 1, 1); - p.getWorld().playEffect(b.getLocation(), Effect.MOBSPAWNER_FLAMES, 1); + protected void craft(Player p, Block b, Inventory inv, ItemStack[] recipe, ItemStack output, Inventory outputInv) { + super.craft(p, b, inv, recipe, output, outputInv); if (ThreadLocalRandom.current().nextInt(100) < fireBreakingChance.getValue()) { - consumeFire(p, dispenser, b); + consumeFire(p, b.getRelative(BlockFace.DOWN), b); } } @@ -135,21 +93,6 @@ public class Smeltery extends MultiBlockMachine { } } - private boolean canCraft(Inventory inv, List inputs, int i) { - for (ItemStack converting : inputs.get(i)) { - if (converting != null) { - for (int j = 0; j < inv.getContents().length; j++) { - if (j == (inv.getContents().length - 1) && !SlimefunUtils.isItemSimilar(converting, inv.getContents()[j], true)) { - return false; - } - else if (SlimefunUtils.isItemSimilar(inv.getContents()[j], converting, true)) break; - } - } - } - - return true; - } - private Inventory findIgnitionChamber(Block b) { for (BlockFace face : faces) { if (b.getRelative(face).getType() == Material.DROPPER && BlockStorage.check(b.getRelative(face), "IGNITION_CHAMBER")) {