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:
parent
7ae16f8358
commit
a34abcb1e7
@ -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)
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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")) {
|
||||
|
Loading…
Reference in New Issue
Block a user