1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-20 03:35:51 +00:00

Enhanced randomizer algorithm for Gold Pans

This commit is contained in:
TheBusyBiscuit 2019-11-30 00:58:35 +01:00
parent 41327d637c
commit ae74412fac
3 changed files with 88 additions and 111 deletions

View File

@ -1,15 +1,13 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Effect; import org.bukkit.Effect;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.collections.RandomizedSet;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
@ -24,11 +22,8 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem { public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem {
private final List<ItemStack> recipes; private final List<ItemStack> recipes;
private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
private int chanceSiftedOre; private int weights;
private int chanceFlint;
private int chanceClay;
private int chanceIronNuggets;
public GoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) { public GoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, recipeType, recipe, new String[] {"chance.FLINT", "chance.CLAY", "chance.SIFTED_ORE", "chance.IRON_NUGGET"}, new Integer[] {40, 20, 35, 5}); super(category, item, recipeType, recipe, new String[] {"chance.FLINT", "chance.CLAY", "chance.SIFTED_ORE", "chance.IRON_NUGGET"}, new Integer[] {40, 20, 35, 5});
@ -43,30 +38,33 @@ public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implemen
@Override @Override
public void postRegister() { public void postRegister() {
chanceSiftedOre = (int) Slimefun.getItemValue(getID(), "chance.SIFTED_ORE"); add(SlimefunItems.SIFTED_ORE, (int) Slimefun.getItemValue(getID(), "chance.SIFTED_ORE"));
chanceClay = (int) Slimefun.getItemValue(getID(), "chance.CLAY"); add(new ItemStack(Material.CLAY_BALL), (int) Slimefun.getItemValue(getID(), "chance.CLAY"));
chanceFlint = (int) Slimefun.getItemValue(getID(), "chance.FLINT"); add(new ItemStack(Material.FLINT), (int) Slimefun.getItemValue(getID(), "chance.FLINT"));
chanceIronNuggets = (int) Slimefun.getItemValue(getID(), "chance.IRON_NUGGET"); add(new ItemStack(Material.IRON_NUGGET), (int) Slimefun.getItemValue(getID(), "chance.IRON_NUGGET"));
if (weights < 100) {
add(new ItemStack(Material.AIR), 100 - weights);
}
} }
private void add(ItemStack item, int chance) {
randomizer.add(item, chance);
weights += chance;
}
@Override @Override
public ItemInteractionHandler getItemHandler() { public ItemInteractionHandler getItemHandler() {
return (e, p, item) -> { return (e, p, item) -> {
if (isItem(item)) { if (isItem(item)) {
if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) { if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) {
List<ItemStack> drops = new ArrayList<>(); ItemStack output = randomizer.getRandom();
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));
else if (random.nextInt(100) < chanceFlint) drops.add(new ItemStack(Material.FLINT));
else if (random.nextInt(100) < chanceIronNuggets) drops.add(new ItemStack(Material.IRON_NUGGET));
e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType()); e.getClickedBlock().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType());
e.getClickedBlock().setType(Material.AIR); e.getClickedBlock().setType(Material.AIR);
for (ItemStack drop: drops) { if (output.getType() != Material.AIR) {
e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop); e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), output.clone());
} }
} }
e.setCancelled(true); e.setCancelled(true);

View File

@ -1,15 +1,13 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.items;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Effect; import org.bukkit.Effect;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.collections.RandomizedSet;
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Lists.RecipeType;
@ -23,13 +21,8 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem { public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem {
private final List<ItemStack> recipes; private final List<ItemStack> recipes;
private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
private int chanceQuartz; private int weights;
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) { public NetherGoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
super(category, item, recipeType, recipe, super(category, item, recipeType, recipe,
@ -49,12 +42,21 @@ public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> im
@Override @Override
public void postRegister() { public void postRegister() {
chanceQuartz = (int) Slimefun.getItemValue(getID(), "chance.QUARTZ"); add(new ItemStack(Material.QUARTZ), (int) Slimefun.getItemValue(getID(), "chance.QUARTZ"));
chanceGoldNuggets = (int) Slimefun.getItemValue(getID(), "chance.GOLD_NUGGET"); add(new ItemStack(Material.GOLD_NUGGET), (int) Slimefun.getItemValue(getID(), "chance.GOLD_NUGGET"));
chanceNetherWart = (int) Slimefun.getItemValue(getID(), "chance.NETHER_WART"); add(new ItemStack(Material.NETHER_WART), (int) Slimefun.getItemValue(getID(), "chance.NETHER_WART"));
chanceBlazePowder = (int) Slimefun.getItemValue(getID(), "chance.BLAZE_POWDER"); add(new ItemStack(Material.BLAZE_POWDER), (int) Slimefun.getItemValue(getID(), "chance.BLAZE_POWDER"));
chanceGlowstoneDust = (int) Slimefun.getItemValue(getID(), "chance.GLOWSTONE_DUST"); add(new ItemStack(Material.GLOWSTONE_DUST), (int) Slimefun.getItemValue(getID(), "chance.GLOWSTONE_DUST"));
chanceGhastTear = (int) Slimefun.getItemValue(getID(), "chance.GHAST_TEAR"); add(new ItemStack(Material.GHAST_TEAR), (int) Slimefun.getItemValue(getID(), "chance.GHAST_TEAR"));
if (weights < 100) {
add(new ItemStack(Material.AIR), 100 - weights);
}
}
private void add(ItemStack item, int chance) {
randomizer.add(item, chance);
weights += chance;
} }
@Override @Override
@ -62,21 +64,13 @@ public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> im
return (e, p, item) -> { return (e, p, item) -> {
if (isItem(item)) { if (isItem(item)) {
if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.SOUL_SAND && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) { if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.SOUL_SAND && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) {
List<ItemStack> drops = new ArrayList<>(); ItemStack output = randomizer.getRandom();
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().getWorld().playEffect(e.getClickedBlock().getLocation(), Effect.STEP_SOUND, e.getClickedBlock().getType());
e.getClickedBlock().setType(Material.AIR); e.getClickedBlock().setType(Material.AIR);
for (ItemStack drop: drops) { if (output.getType() != Material.AIR) {
e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), drop); e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), output.clone());
} }
} }
e.setCancelled(true); e.setCancelled(true);

View File

@ -1,8 +1,5 @@
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks; package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.Effect; import org.bukkit.Effect;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Material; import org.bukkit.Material;
@ -13,6 +10,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory; import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import io.github.thebusybiscuit.cscorelib2.collections.RandomizedSet;
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue; import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue;
import me.mrCookieSlime.Slimefun.SlimefunPlugin; import me.mrCookieSlime.Slimefun.SlimefunPlugin;
@ -23,19 +21,11 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
public class AutomatedPanningMachine extends MultiBlockMachine { public class AutomatedPanningMachine extends MultiBlockMachine {
// Gold Pan private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
private int chanceSiftedOre; private int weights;
private int chanceFlint;
private int chanceClay;
private int chanceIronNuggets;
// Nether Gold Pan private final RandomizedSet<ItemStack> randomizerNether = new RandomizedSet<>();
private int chanceQuartz; private int weightsNether;
private int chanceGoldNuggets;
private int chanceNetherWart;
private int chanceBlazePowder;
private int chanceGlowstoneDust;
private int chanceGhastTear;
public AutomatedPanningMachine() { public AutomatedPanningMachine() {
super( super(
@ -66,17 +56,37 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
String goldPan = "GOLD_PAN"; String goldPan = "GOLD_PAN";
String netherGoldPan = "NETHER_GOLD_PAN"; String netherGoldPan = "NETHER_GOLD_PAN";
chanceSiftedOre = (int) Slimefun.getItemValue(goldPan, "chance.SIFTED_ORE"); add(false, SlimefunItems.SIFTED_ORE, (int) Slimefun.getItemValue(goldPan, "chance.SIFTED_ORE"));
chanceClay = (int) Slimefun.getItemValue(goldPan, "chance.CLAY"); add(false, new ItemStack(Material.CLAY_BALL), (int) Slimefun.getItemValue(goldPan, "chance.CLAY"));
chanceFlint = (int) Slimefun.getItemValue(goldPan, "chance.FLINT"); add(false, new ItemStack(Material.FLINT), (int) Slimefun.getItemValue(goldPan, "chance.FLINT"));
chanceIronNuggets = (int) Slimefun.getItemValue(goldPan, "chance.IRON_NUGGET"); add(false, new ItemStack(Material.IRON_NUGGET), (int) Slimefun.getItemValue(goldPan, "chance.IRON_NUGGET"));
chanceQuartz = (int) Slimefun.getItemValue(netherGoldPan, "chance.QUARTZ"); if (weights < 100) {
chanceGoldNuggets = (int) Slimefun.getItemValue(netherGoldPan, "chance.GOLD_NUGGET"); add(false, new ItemStack(Material.AIR), 100 - weights);
chanceNetherWart = (int) Slimefun.getItemValue(netherGoldPan, "chance.NETHER_WART"); }
chanceBlazePowder = (int) Slimefun.getItemValue(netherGoldPan, "chance.BLAZE_POWDER");
chanceGlowstoneDust = (int) Slimefun.getItemValue(netherGoldPan, "chance.GLOWSTONE_DUST"); add(true, new ItemStack(Material.QUARTZ), (int) Slimefun.getItemValue(netherGoldPan, "chance.QUARTZ"));
chanceGhastTear = (int) Slimefun.getItemValue(netherGoldPan, "chance.GHAST_TEAR"); add(true, new ItemStack(Material.GOLD_NUGGET), (int) Slimefun.getItemValue(netherGoldPan, "chance.GOLD_NUGGET"));
add(true, new ItemStack(Material.NETHER_WART), (int) Slimefun.getItemValue(netherGoldPan, "chance.NETHER_WART"));
add(true, new ItemStack(Material.BLAZE_POWDER), (int) Slimefun.getItemValue(netherGoldPan, "chance.BLAZE_POWDER"));
add(true, new ItemStack(Material.GLOWSTONE_DUST), (int) Slimefun.getItemValue(netherGoldPan, "chance.GLOWSTONE_DUST"));
add(true, new ItemStack(Material.GHAST_TEAR), (int) Slimefun.getItemValue(netherGoldPan, "chance.GHAST_TEAR"));
if (weightsNether < 100) {
add(true, new ItemStack(Material.AIR), 100 - weightsNether);
}
}
private void add(boolean nether, ItemStack item, int chance) {
if (nether) {
randomizerNether.add(item, chance);
weightsNether += chance;
}
else {
randomizer.add(item, chance);
weights += chance;
}
} }
@Override @Override
@ -86,9 +96,11 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
if (SlimefunManager.isItemSimiliar(input, new ItemStack(Material.GRAVEL), true) || SlimefunManager.isItemSimiliar(input, new ItemStack(Material.SOUL_SAND), true)) { if (SlimefunManager.isItemSimiliar(input, new ItemStack(Material.GRAVEL), true) || SlimefunManager.isItemSimiliar(input, new ItemStack(Material.SOUL_SAND), true)) {
final Material block = input.getType(); final Material block = input.getType();
if (p.getGameMode() != GameMode.CREATIVE) ItemUtils.consumeItem(input, false); if (p.getGameMode() != GameMode.CREATIVE) {
ItemUtils.consumeItem(input, false);
}
ItemStack output = getRandomDrop(ThreadLocalRandom.current(), block); ItemStack output = getRandomDrop(block);
TaskQueue queue = new TaskQueue(); TaskQueue queue = new TaskQueue();
queue.thenRepeatEvery(20, 5, () -> queue.thenRepeatEvery(20, 5, () ->
@ -96,14 +108,14 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
); );
queue.thenRun(20, () -> { queue.thenRun(20, () -> {
if (output != null) { if (output.getType() != Material.AIR) {
Inventory outputChest = findOutputChest(b.getRelative(BlockFace.DOWN), output); Inventory outputChest = findOutputChest(b.getRelative(BlockFace.DOWN), output);
if (outputChest != null) { if (outputChest != null) {
outputChest.addItem(output); outputChest.addItem(output.clone());
} }
else { else {
b.getWorld().dropItemNaturally(b.getLocation(), output); b.getWorld().dropItemNaturally(b.getLocation(), output.clone());
} }
p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F); p.getWorld().playSound(p.getLocation(), Sound.ENTITY_ARROW_HIT_PLAYER, 1F, 1F);
@ -120,42 +132,15 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
} }
} }
private ItemStack getRandomDrop(Random random, Material input) { private ItemStack getRandomDrop(Material input) {
if (input == Material.GRAVEL) { if (input == Material.GRAVEL) {
if (random.nextInt(100) < chanceSiftedOre) { return randomizer.getRandom();
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) < chanceIronNuggets) {
return new ItemStack(Material.IRON_NUGGET);
}
} }
else if (input == Material.SOUL_SAND) { else if (input == Material.SOUL_SAND) {
if (random.nextInt(100) < chanceQuartz) { return randomizerNether.getRandom();
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);
}
} }
return null;
return new ItemStack(Material.AIR);
} }
} }