1
mirror of https://github.com/StarWishsama/Slimefun4.git synced 2024-09-19 19:25:48 +00:00

Some refactoring, also fixes #1935

This commit is contained in:
TheBusyBiscuit 2020-05-24 20:19:22 +02:00
parent 7ae16f8358
commit a34abcb1e7
4 changed files with 100 additions and 126 deletions

View File

@ -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)

View File

@ -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<ItemStack[]> 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<ItemStack[]> 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);
}
}

View File

@ -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<ItemStack[]> 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<ItemStack[]> 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;
}
}

View File

@ -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<Integer> 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<ItemStack[]> 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<ItemStack[]> 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")) {