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:
parent
41327d637c
commit
ae74412fac
@ -1,15 +1,13 @@
|
||||
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.collections.RandomizedSet;
|
||||
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
@ -24,11 +22,8 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||
public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem {
|
||||
|
||||
private final List<ItemStack> recipes;
|
||||
|
||||
private int chanceSiftedOre;
|
||||
private int chanceFlint;
|
||||
private int chanceClay;
|
||||
private int chanceIronNuggets;
|
||||
private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
|
||||
private int weights;
|
||||
|
||||
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});
|
||||
@ -43,10 +38,19 @@ public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implemen
|
||||
|
||||
@Override
|
||||
public void postRegister() {
|
||||
chanceSiftedOre = (int) Slimefun.getItemValue(getID(), "chance.SIFTED_ORE");
|
||||
chanceClay = (int) Slimefun.getItemValue(getID(), "chance.CLAY");
|
||||
chanceFlint = (int) Slimefun.getItemValue(getID(), "chance.FLINT");
|
||||
chanceIronNuggets = (int) Slimefun.getItemValue(getID(), "chance.IRON_NUGGET");
|
||||
add(SlimefunItems.SIFTED_ORE, (int) Slimefun.getItemValue(getID(), "chance.SIFTED_ORE"));
|
||||
add(new ItemStack(Material.CLAY_BALL), (int) Slimefun.getItemValue(getID(), "chance.CLAY"));
|
||||
add(new ItemStack(Material.FLINT), (int) Slimefun.getItemValue(getID(), "chance.FLINT"));
|
||||
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
|
||||
@ -54,19 +58,13 @@ public class GoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implemen
|
||||
return (e, p, item) -> {
|
||||
if (isItem(item)) {
|
||||
if (e.getClickedBlock() != null && e.getClickedBlock().getType() == Material.GRAVEL && SlimefunPlugin.getProtectionManager().hasPermission(p, e.getClickedBlock().getLocation(), ProtectableAction.BREAK_BLOCK)) {
|
||||
List<ItemStack> 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));
|
||||
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));
|
||||
ItemStack output = randomizer.getRandom();
|
||||
|
||||
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);
|
||||
if (output.getType() != Material.AIR) {
|
||||
e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), output.clone());
|
||||
}
|
||||
}
|
||||
e.setCancelled(true);
|
||||
|
@ -1,15 +1,13 @@
|
||||
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.collections.RandomizedSet;
|
||||
import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
import me.mrCookieSlime.Slimefun.Lists.RecipeType;
|
||||
@ -23,13 +21,8 @@ import me.mrCookieSlime.Slimefun.api.SlimefunItemStack;
|
||||
public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> implements RecipeDisplayItem {
|
||||
|
||||
private final List<ItemStack> recipes;
|
||||
|
||||
private int chanceQuartz;
|
||||
private int chanceGoldNuggets;
|
||||
private int chanceNetherWart;
|
||||
private int chanceBlazePowder;
|
||||
private int chanceGlowstoneDust;
|
||||
private int chanceGhastTear;
|
||||
private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
|
||||
private int weights;
|
||||
|
||||
public NetherGoldPan(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe) {
|
||||
super(category, item, recipeType, recipe,
|
||||
@ -49,12 +42,21 @@ public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> im
|
||||
|
||||
@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");
|
||||
add(new ItemStack(Material.QUARTZ), (int) Slimefun.getItemValue(getID(), "chance.QUARTZ"));
|
||||
add(new ItemStack(Material.GOLD_NUGGET), (int) Slimefun.getItemValue(getID(), "chance.GOLD_NUGGET"));
|
||||
add(new ItemStack(Material.NETHER_WART), (int) Slimefun.getItemValue(getID(), "chance.NETHER_WART"));
|
||||
add(new ItemStack(Material.BLAZE_POWDER), (int) Slimefun.getItemValue(getID(), "chance.BLAZE_POWDER"));
|
||||
add(new ItemStack(Material.GLOWSTONE_DUST), (int) Slimefun.getItemValue(getID(), "chance.GLOWSTONE_DUST"));
|
||||
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
|
||||
@ -62,21 +64,13 @@ public class NetherGoldPan extends SimpleSlimefunItem<ItemInteractionHandler> im
|
||||
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<ItemStack> 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));
|
||||
ItemStack output = randomizer.getRandom();
|
||||
|
||||
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);
|
||||
if (output.getType() != Material.AIR) {
|
||||
e.getClickedBlock().getWorld().dropItemNaturally(e.getClickedBlock().getLocation(), output.clone());
|
||||
}
|
||||
}
|
||||
e.setCancelled(true);
|
||||
|
@ -1,8 +1,5 @@
|
||||
package me.mrCookieSlime.Slimefun.Objects.SlimefunItem.multiblocks;
|
||||
|
||||
import java.util.Random;
|
||||
import java.util.concurrent.ThreadLocalRandom;
|
||||
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Material;
|
||||
@ -13,6 +10,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
import io.github.thebusybiscuit.cscorelib2.collections.RandomizedSet;
|
||||
import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils;
|
||||
import io.github.thebusybiscuit.cscorelib2.scheduling.TaskQueue;
|
||||
import me.mrCookieSlime.Slimefun.SlimefunPlugin;
|
||||
@ -23,19 +21,11 @@ import me.mrCookieSlime.Slimefun.api.Slimefun;
|
||||
|
||||
public class AutomatedPanningMachine extends MultiBlockMachine {
|
||||
|
||||
// Gold Pan
|
||||
private int chanceSiftedOre;
|
||||
private int chanceFlint;
|
||||
private int chanceClay;
|
||||
private int chanceIronNuggets;
|
||||
private final RandomizedSet<ItemStack> randomizer = new RandomizedSet<>();
|
||||
private int weights;
|
||||
|
||||
// Nether Gold Pan
|
||||
private int chanceQuartz;
|
||||
private int chanceGoldNuggets;
|
||||
private int chanceNetherWart;
|
||||
private int chanceBlazePowder;
|
||||
private int chanceGlowstoneDust;
|
||||
private int chanceGhastTear;
|
||||
private final RandomizedSet<ItemStack> randomizerNether = new RandomizedSet<>();
|
||||
private int weightsNether;
|
||||
|
||||
public AutomatedPanningMachine() {
|
||||
super(
|
||||
@ -66,17 +56,37 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
|
||||
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");
|
||||
chanceIronNuggets = (int) Slimefun.getItemValue(goldPan, "chance.IRON_NUGGET");
|
||||
add(false, SlimefunItems.SIFTED_ORE, (int) Slimefun.getItemValue(goldPan, "chance.SIFTED_ORE"));
|
||||
add(false, new ItemStack(Material.CLAY_BALL), (int) Slimefun.getItemValue(goldPan, "chance.CLAY"));
|
||||
add(false, new ItemStack(Material.FLINT), (int) Slimefun.getItemValue(goldPan, "chance.FLINT"));
|
||||
add(false, new ItemStack(Material.IRON_NUGGET), (int) Slimefun.getItemValue(goldPan, "chance.IRON_NUGGET"));
|
||||
|
||||
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");
|
||||
if (weights < 100) {
|
||||
add(false, new ItemStack(Material.AIR), 100 - weights);
|
||||
}
|
||||
|
||||
add(true, new ItemStack(Material.QUARTZ), (int) Slimefun.getItemValue(netherGoldPan, "chance.QUARTZ"));
|
||||
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
|
||||
@ -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)) {
|
||||
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();
|
||||
|
||||
queue.thenRepeatEvery(20, 5, () ->
|
||||
@ -96,14 +108,14 @@ public class AutomatedPanningMachine extends MultiBlockMachine {
|
||||
);
|
||||
|
||||
queue.thenRun(20, () -> {
|
||||
if (output != null) {
|
||||
if (output.getType() != Material.AIR) {
|
||||
Inventory outputChest = findOutputChest(b.getRelative(BlockFace.DOWN), output);
|
||||
|
||||
if (outputChest != null) {
|
||||
outputChest.addItem(output);
|
||||
outputChest.addItem(output.clone());
|
||||
}
|
||||
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);
|
||||
@ -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 (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) < chanceIronNuggets) {
|
||||
return new ItemStack(Material.IRON_NUGGET);
|
||||
}
|
||||
return randomizer.getRandom();
|
||||
}
|
||||
else if (input == Material.SOUL_SAND) {
|
||||
if (random.nextInt(100) < chanceQuartz) {
|
||||
return new ItemStack(Material.QUARTZ);
|
||||
return randomizerNether.getRandom();
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user