From c9bd5840e0d8343b84578a52de45ddd2cd69dd16 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 26 Nov 2019 00:39:54 +0100 Subject: [PATCH] Added Nether Gold Pan --- .../Slimefun/Lists/SlimefunItems.java | 3 +- .../Objects/SlimefunItem/items/GoldPan.java | 10 +- .../SlimefunItem/items/NetherGoldPan.java | 94 +++++++++++++++++++ .../multiblocks/AutomatedPanningMachine.java | 67 ++++++++++--- .../Slimefun/Setup/ResearchSetup.java | 3 +- .../Slimefun/Setup/SlimefunSetup.java | 8 +- 6 files changed, 162 insertions(+), 23 deletions(-) create mode 100644 src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/NetherGoldPan.java diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java b/src/main/java/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java index f4c201bc3..d6f614db2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java @@ -43,6 +43,7 @@ public final class SlimefunItems { /* Gadgets */ public static final ItemStack GOLD_PAN = new SlimefunItemStack("GOLD_PAN", Material.BOWL, "&6Gold Pan", "&a&oCan get you all kinds of Goodies...", "", "&7&eRight Click&7 to pan various Stuff out of Gravel"); + public static final ItemStack NETHER_GOLD_PAN = new SlimefunItemStack("NETHER_GOLD_PAN", Material.BOWL, "&4Nether Gold Pan", "", "&7&eRight Click&7 to pan various stuff out of Soul Sand"); public static final ItemStack PARACHUTE = new SlimefunItemStack("PARACHUTE", Material.LEATHER_CHESTPLATE, Color.WHITE, "&r&lParachute", "", "&7Hold &eShift&7 to use"); public static final ItemStack GRAPPLING_HOOK = new SlimefunItemStack("GRAPPLING_HOOK", Material.LEAD, "&6Grappling Hook", "", "&7&eRight Click&7 to use"); public static final ItemStack SOLAR_HELMET = new SlimefunItemStack("SOLAR_HELMET", Material.IRON_HELMET, "&bSolar Helmet", "", "&a&oCharges held Items and Armor"); @@ -514,7 +515,7 @@ public final class SlimefunItems { @Deprecated public static final ItemStack ADVANCED_DIGITAL_MINER = new CustomItem(Material.DIAMOND_PICKAXE, "&6Advanced Digital Miner", "", "&4DEPRECATED", "&cThis machine will soon be removed!"); - public static final ItemStack AUTOMATED_PANNING_MACHINE = new SlimefunItemStack("AUTOMATED_PANNING_MACHINE", Material.BOWL, "&aAutomated Panning Machine", "", "&aA MultiBlock Version of the Gold Pan"); + public static final ItemStack AUTOMATED_PANNING_MACHINE = new SlimefunItemStack("AUTOMATED_PANNING_MACHINE", Material.BOWL, "&eAutomated Panning Machine", "", "&rA MultiBlock Version of the Gold Pan", "&rand Nether Gold Pan combined in one machine."); public static final ItemStack OUTPUT_CHEST = new SlimefunItemStack("OUTPUT_CHEST", Material.CHEST, "&4Output Chest", "", "&c&oA basic machine will try to put", "&c&oitems in this chest if it's placed", "&c&oadjacent to the dispenser."); public static final ItemStack HOLOGRAM_PROJECTOR = new SlimefunItemStack("HOLOGRAM_PROJECTOR", Material.QUARTZ_SLAB, "&bHologram Projector", "", "&rProjects an Editable Hologram"); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java index c050d2fb9..2aab6334b 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/GoldPan.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.bukkit.Effect; import org.bukkit.Material; @@ -17,21 +18,19 @@ import me.mrCookieSlime.Slimefun.Objects.Category; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; -import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; public class GoldPan extends SimpleSlimefunItem implements RecipeDisplayItem { - private final Random random = new Random(); private final List recipes; private int chanceSiftedOre; private int chanceFlint; private int chanceClay; - public GoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, String[] keys, Object[] values) { - super(category, item, recipeType, recipe, keys, values); + public GoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, recipeType, recipe, new String[] {"chance.FLINT", "chance.CLAY", "chance.SIFTED_ORE"}, new Integer[] {40, 25, 35}); recipes = Arrays.asList( new ItemStack(Material.GRAVEL), new ItemStack(Material.FLINT), @@ -50,9 +49,10 @@ public class GoldPan extends SimpleSlimefunItem implemen @Override public ItemInteractionHandler getItemHandler() { return (e, p, item) -> { - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.GOLD_PAN, true)) { + if (isItem(item)) { if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) { List drops = new ArrayList<>(); + Random random = ThreadLocalRandom.current(); if (random.nextInt(100) < chanceSiftedOre) drops.add(SlimefunItems.SIFTED_ORE); else if (random.nextInt(100) < chanceClay) drops.add(new ItemStack(Material.CLAY_BALL)); diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/NetherGoldPan.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/NetherGoldPan.java new file mode 100644 index 000000000..85a4ce3cb --- /dev/null +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/items/NetherGoldPan.java @@ -0,0 +1,94 @@ +package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +import org.bukkit.Effect; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; +import me.mrCookieSlime.Slimefun.SlimefunPlugin; +import me.mrCookieSlime.Slimefun.Lists.RecipeType; +import me.mrCookieSlime.Slimefun.Objects.Category; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SimpleSlimefunItem; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.interfaces.RecipeDisplayItem; +import me.mrCookieSlime.Slimefun.Objects.handlers.ItemInteractionHandler; +import me.mrCookieSlime.Slimefun.api.Slimefun; +import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; + +public class NetherGoldPan extends SimpleSlimefunItem implements RecipeDisplayItem { + + private final List recipes; + + private int chanceQuartz; + private int chanceGoldNuggets; + private int chanceNetherWart; + private int chanceBlazePowder; + private int chanceGlowstoneDust; + private int chanceGhastTear; + + public NetherGoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { + super(category, item, recipeType, recipe, + new String[] {"chance.QUARTZ", "chance.GOLD_NUGGET", "chance.NETHER_WART", "chance.BLAZE_POWDER", "chance.GLOWSTONE_DUST", "chance.GHAST_TEAR"}, + new Integer[] {50, 25, 10, 8, 5, 2} + ); + + recipes = Arrays.asList( + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.QUARTZ), + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.GOLD_NUGGET), + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.NETHER_WART), + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.BLAZE_POWDER), + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.GLOWSTONE_DUST), + new ItemStack(Material.SOUL_SAND), new ItemStack(Material.GHAST_TEAR) + ); + } + + @Override + public void postRegister() { + chanceQuartz = (int) Slimefun.getItemValue(getID(), "chance.QUARTZ"); + chanceGoldNuggets = (int) Slimefun.getItemValue(getID(), "chance.GOLD_NUGGET"); + chanceNetherWart = (int) Slimefun.getItemValue(getID(), "chance.NETHER_WART"); + chanceBlazePowder = (int) Slimefun.getItemValue(getID(), "chance.BLAZE_POWDER"); + chanceGlowstoneDust = (int) Slimefun.getItemValue(getID(), "chance.GLOWSTONE_DUST"); + chanceGhastTear = (int) Slimefun.getItemValue(getID(), "chance.GHAST_TEAR"); + } + + @Override + public ItemInteractionHandler getItemHandler() { + return (e, p, item) -> { + if (isItem(item)) { + if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.SOUL_SAND && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) { + List drops = new ArrayList<>(); + Random random = ThreadLocalRandom.current(); + + if (random.nextInt(100) < chanceQuartz) drops.add(new ItemStack(Material.QUARTZ)); + else if (random.nextInt(100) < chanceGoldNuggets) drops.add(new ItemStack(Material.GOLD_NUGGET)); + else if (random.nextInt(100) < chanceNetherWart) drops.add(new ItemStack(Material.NETHER_WART)); + else if (random.nextInt(100) < chanceBlazePowder) drops.add(new ItemStack(Material.BLAZE_POWDER)); + else if (random.nextInt(100) < chanceGlowstoneDust) drops.add(new ItemStack(Material.GLOWSTONE_DUST)); + else if (random.nextInt(100) < chanceGhastTear) drops.add(new ItemStack(Material.GHAST_TEAR)); + + e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType()); + e.getClickedBlock().setType(Material.AIR); + + for (ItemStack drop: drops) { + e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop); + } + } + e.setCancelled(true); + return true; + } + else return false; + }; + } + + @Override + public List getDisplayRecipes() { + return recipes; + } + +} diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java index 82d6ab2a8..2448744b2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/multiblocks/AutomatedPanningMachine.java @@ -1,6 +1,7 @@ package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; import org.bukkit.Effect; import org.bukkit.GameMode; @@ -21,12 +22,19 @@ import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.Slimefun; public class AutomatedPanningMachine extends MultiBlockMachine { - - private final Random random = new Random(); + // Gold Pan private int chanceSiftedOre; private int chanceFlint; private int chanceClay; + + // Nether Gold Pan + private int chanceQuartz; + private int chanceGoldNuggets; + private int chanceNetherWart; + private int chanceBlazePowder; + private int chanceGlowstoneDust; + private int chanceGhastTear; public AutomatedPanningMachine() { super( @@ -48,24 +56,34 @@ public class AutomatedPanningMachine extends MultiBlockMachine { super.postRegister(); String goldPan = "GOLD_PAN"; + String netherGoldPan = "NETHER_GOLD_PAN"; chanceSiftedOre = (int) Slimefun.getItemValue(goldPan, "chance.SIFTED_ORE"); chanceClay = (int) Slimefun.getItemValue(goldPan, "chance.CLAY"); chanceFlint = (int) Slimefun.getItemValue(goldPan, "chance.FLINT"); + + chanceQuartz = (int) Slimefun.getItemValue(netherGoldPan, "chance.QUARTZ"); + chanceGoldNuggets = (int) Slimefun.getItemValue(netherGoldPan, "chance.GOLD_NUGGET"); + chanceNetherWart = (int) Slimefun.getItemValue(netherGoldPan, "chance.NETHER_WART"); + chanceBlazePowder = (int) Slimefun.getItemValue(netherGoldPan, "chance.BLAZE_POWDER"); + chanceGlowstoneDust = (int) Slimefun.getItemValue(netherGoldPan, "chance.GLOWSTONE_DUST"); + chanceGhastTear = (int) Slimefun.getItemValue(netherGoldPan, "chance.GHAST_TEAR"); } @Override public void onInteract(Player p, Block b) { final ItemStack input = p.getInventory().getItemInMainHand(); - if (SlimefunManager.isItemSimiliar(input, new ItemStack(Material.GRAVEL), true)) { + if (SlimefunManager.isItemSimiliar(input, new ItemStack(Material.GRAVEL), true) || SlimefunManager.isItemSimiliar(input, new ItemStack(Material.SOUL_SAND), true)) { + final Material block = input.getType(); + if (p.getGameMode() != GameMode.CREATIVE) ItemUtils.consumeItem(input, false); - ItemStack output = getRandomDrop(); + ItemStack output = getRandomDrop(ThreadLocalRandom.current(), block); TaskQueue queue = new TaskQueue(); queue.thenRepeatEvery(20, 5, () -> - b.getWorld().playEffect(b.getRelative(BlockFace.DOWN).getLocation(), Effect.STEP_SOUND, Material.GRAVEL) + b.getWorld().playEffect(b.getRelative(BlockFace.DOWN).getLocation(), Effect.STEP_SOUND, block) ); queue.thenRun(20, () -> { @@ -93,17 +111,38 @@ public class AutomatedPanningMachine extends MultiBlockMachine { } } - private ItemStack getRandomDrop() { - if (random.nextInt(100) < chanceSiftedOre) { - return SlimefunItems.SIFTED_ORE; + private ItemStack getRandomDrop(Random random, Material input) { + if (input == Material.GRAVEL) { + if (random.nextInt(100) < chanceSiftedOre) { + return SlimefunItems.SIFTED_ORE; + } + else if (random.nextInt(100) < chanceClay) { + return new ItemStack(Material.CLAY_BALL); + } + else if (random.nextInt(100) < chanceFlint) { + return new ItemStack(Material.FLINT); + } } - else if (random.nextInt(100) < chanceClay) { - return new ItemStack(Material.CLAY_BALL); + else if (input == Material.SOUL_SAND) { + if (random.nextInt(100) < chanceQuartz) { + return new ItemStack(Material.QUARTZ); + } + else if (random.nextInt(100) < chanceGoldNuggets) { + return new ItemStack(Material.GOLD_NUGGET); + } + else if (random.nextInt(100) < chanceNetherWart) { + return new ItemStack(Material.NETHER_WART); + } + else if (random.nextInt(100) < chanceBlazePowder) { + return new ItemStack(Material.BLAZE_POWDER); + } + else if (random.nextInt(100) < chanceGlowstoneDust) { + return new ItemStack(Material.GLOWSTONE_DUST); + } + else if (random.nextInt(100) < chanceGhastTear) { + return new ItemStack(Material.GHAST_TEAR); + } } - else if (random.nextInt(100) < chanceFlint) { - return new ItemStack(Material.FLINT); - } - return null; } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java b/src/main/java/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java index 1dc13f80e..865f16dda 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Setup/ResearchSetup.java @@ -245,6 +245,7 @@ public final class ResearchSetup { Slimefun.registerResearch(new Research(247, "GEO-Miner", 24), SlimefunItems.GEO_MINER); Slimefun.registerResearch(new Research(248, "Lightning Rune", 24), SlimefunItems.RUNE_LIGHTNING); Slimefun.registerResearch(new Research(249, "Totem of Undying", 36), SlimefunItems.TOTEM_OF_UNDYING); - Slimefun.registerResearch(new Research(250, "Charging Bench", 8), SlimefunItems.CHARGING_BENCH); + Slimefun.registerResearch(new Research(250, "Charging Bench", 8), SlimefunItems.CHARGING_BENCH); + Slimefun.registerResearch(new Research(251, "Nether Gold Pan", 8), SlimefunItems.NETHER_GOLD_PAN); } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java index a453d38c0..d0eac54c2 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/Setup/SlimefunSetup.java @@ -91,6 +91,7 @@ import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MagicSugar; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MeatJerky; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.MonsterJerky; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.Multimeter; +import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.NetherGoldPan; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfContainment; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfTheSeeker; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items.PickaxeOfVeinMining; @@ -333,8 +334,11 @@ public final class SlimefunSetup { .register(true); new GoldPan(Categories.TOOLS, (SlimefunItemStack) SlimefunItems.GOLD_PAN, RecipeType.ENHANCED_CRAFTING_TABLE, - new ItemStack[] {null, null, null, new ItemStack(Material.STONE), new ItemStack(Material.BOWL), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE)}, - new String[] {"chance.FLINT", "chance.CLAY", "chance.SIFTED_ORE"}, new Integer[] {40, 25, 35}) + new ItemStack[] {null, null, null, new ItemStack(Material.STONE), new ItemStack(Material.BOWL), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE), new ItemStack(Material.STONE)}) + .register(true); + + new NetherGoldPan(Categories.TOOLS, (SlimefunItemStack) SlimefunItems.NETHER_GOLD_PAN, RecipeType.ENHANCED_CRAFTING_TABLE, + new ItemStack[] {null, null, null, new ItemStack(Material.NETHER_BRICK), SlimefunItems.GOLD_PAN, new ItemStack(Material.NETHER_BRICK), new ItemStack(Material.NETHER_BRICK), new ItemStack(Material.NETHER_BRICK), new ItemStack(Material.NETHER_BRICK)}) .register(true); new SlimefunItem(Categories.MISC, (SlimefunItemStack) SlimefunItems.SIFTED_ORE, RecipeType.GOLD_PAN,