diff --git a/src/main/java/techreborn/api/recipe/RecyclerRecipeCrafter.java b/src/main/java/techreborn/api/recipe/RecyclerRecipeCrafter.java new file mode 100644 index 000000000..105bd1a26 --- /dev/null +++ b/src/main/java/techreborn/api/recipe/RecyclerRecipeCrafter.java @@ -0,0 +1,68 @@ +package techreborn.api.recipe; + +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.item.ItemStack; +import reborncore.common.crafting.RebornRecipe; +import reborncore.common.recipes.RecipeCrafter; +import reborncore.common.util.RebornInventory; +import techreborn.config.TechRebornConfig; +import techreborn.init.ModRecipes; + +import java.util.List; +import java.util.Objects; + +public class RecyclerRecipeCrafter extends RecipeCrafter { + + public RecyclerRecipeCrafter(BlockEntity blockEntity, RebornInventory inventory, int[] inputSlots, int[] outputSlots) { + super(ModRecipes.RECYCLER, blockEntity, 1, 1, inventory, inputSlots, outputSlots); + } + + @Override + public void updateCurrentRecipe() { + currentTickTime = 0; + List recipeList = ModRecipes.RECYCLER.getRecipes(blockEntity.getWorld()); + if (recipeList.isEmpty() || !hasAllInputs()) { + setCurrentRecipe(null); + currentNeededTicks = 0; + setIsActive(); + return; + } + setCurrentRecipe(recipeList.get(0)); + currentNeededTicks = Math.max((int) (currentRecipe.getTime() * (1.0 - getSpeedMultiplier())), 1); + setIsActive(); + } + + @Override + public boolean hasAllInputs() { + boolean hasItem = false; + // Check if we have at least something in input slots. Foreach input slot in case of several input slots + for (int inputSlot : inputSlots) { + if (inventory.getStack(inputSlot).isEmpty()) continue; + hasItem = true; + break; + } + return hasItem; + } + + @Override + public void useAllInputs() { + if (currentRecipe == null) { + return; + } + // Uses input. Foreach input slot in case of several input slots + for (int inputSlot : inputSlots) { + if (inventory.getStack(inputSlot).isEmpty()) continue; + inventory.shrinkSlot(inputSlot, 1); + break; + } + } + + @Override + public void fitStack(ItemStack stack, int slot) { + // Dirty hack for chance based crafting + final int randomChance = Objects.requireNonNull(blockEntity.getWorld()).random.nextInt(TechRebornConfig.recyclerChance); + if (randomChance == 1) { + super.fitStack(stack, slot); + } + } +} diff --git a/src/main/java/techreborn/blockentity/machine/tier1/RecyclerBlockEntity.java b/src/main/java/techreborn/blockentity/machine/tier1/RecyclerBlockEntity.java index efb81aa81..7377fab7f 100644 --- a/src/main/java/techreborn/blockentity/machine/tier1/RecyclerBlockEntity.java +++ b/src/main/java/techreborn/blockentity/machine/tier1/RecyclerBlockEntity.java @@ -24,176 +24,29 @@ package techreborn.blockentity.machine.tier1; -import net.minecraft.block.BlockState; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.registry.Registry; -import reborncore.api.IToolDrop; import reborncore.api.blockentity.IUpgrade; -import reborncore.api.blockentity.InventoryProvider; import reborncore.client.screen.BuiltScreenHandlerProvider; import reborncore.client.screen.builder.BuiltScreenHandler; import reborncore.client.screen.builder.ScreenHandlerBuilder; -import reborncore.common.blockentity.SlotConfiguration; -import reborncore.common.blocks.BlockMachineBase; -import reborncore.common.powerSystem.PowerAcceptorBlockEntity; import reborncore.common.util.RebornInventory; -import team.reborn.energy.EnergySide; +import techreborn.api.recipe.RecyclerRecipeCrafter; +import techreborn.blockentity.machine.GenericMachineBlockEntity; import techreborn.config.TechRebornConfig; import techreborn.init.TRBlockEntities; import techreborn.init.TRContent; -public class RecyclerBlockEntity extends PowerAcceptorBlockEntity - implements IToolDrop, InventoryProvider, BuiltScreenHandlerProvider, SlotConfiguration.SlotFilter { - - private final RebornInventory inventory = new RebornInventory<>(3, "RecyclerBlockEntity", 64, this); - private final int cost = 2; - private final int time = 15; - private final int chance = 6; - private boolean isBurning; - private int progress; +public class RecyclerBlockEntity extends GenericMachineBlockEntity implements BuiltScreenHandlerProvider { public RecyclerBlockEntity() { - super(TRBlockEntities.RECYCLER); - } - - public int gaugeProgressScaled(int scale) { - return progress * scale / time; - } - - public int getProgress() { - return progress; - } - - public void setProgress(int progress) { - this.progress = progress; - } - - public void recycleItems() { - ItemStack itemstack = TRContent.Parts.SCRAP.getStack(); - final int randomchance = this.world.random.nextInt(chance); - - if (randomchance == 1) { - if (inventory.getStack(1).isEmpty()) { - inventory.setStack(1, itemstack.copy()); - } else { - inventory.getStack(1).increment(itemstack.getCount()); - } - } - inventory.shrinkSlot(0, 1); - } - - public boolean canRecycle() { - return !inventory.getStack(0).isEmpty() && hasSlotGotSpace(1); - } - - public boolean hasSlotGotSpace(int slot) { - if (inventory.getStack(slot).isEmpty()) { - return true; - } else return inventory.getStack(slot).getCount() < inventory.getStack(slot).getMaxCount(); - } - - public boolean isBurning() { - return isBurning; - } - - public void setBurning(boolean burning) { - this.isBurning = burning; - } - - public void updateState() { - final BlockState BlockStateContainer = world.getBlockState(pos); - if (BlockStateContainer.getBlock() instanceof BlockMachineBase) { - final BlockMachineBase blockMachineBase = (BlockMachineBase) BlockStateContainer.getBlock(); - boolean shouldBurn = isBurning || (canRecycle() && (getStored(EnergySide.UNKNOWN) > getEuPerTick(cost))); - if (BlockStateContainer.get(BlockMachineBase.ACTIVE) != shouldBurn) { - blockMachineBase.setActive(isBurning, world, pos); - } - } - } - - // TilePowerAcceptor - @Override - public void tick() { - super.tick(); - if (world.isClient) { - return; - } - charge(2); - - boolean updateInventory = false; - if (canRecycle() && !isBurning() && getEnergy() != 0) { - setBurning(true); - } else if (isBurning()) { - if (getStored(EnergySide.UNKNOWN) < getEuPerTick(cost)) { - this.setBurning(false); - } - progress++; - if (progress >= Math.max((int) (time * (1.0 - getSpeedMultiplier())), 1)) { - progress = 0; - recycleItems(); - updateInventory = true; - setBurning(false); - } - } - - updateState(); - - if (updateInventory) { - markDirty(); - } - } - - @Override - public double getBaseMaxPower() { - return TechRebornConfig.recyclerMaxEnergy; - } - - @Override - public boolean canProvideEnergy(EnergySide side) { - return false; - } - - @Override - public double getBaseMaxOutput() { - return 0; - } - - @Override - public double getBaseMaxInput() { - return TechRebornConfig.recyclerMaxInput; - } - - // TileMachineBase - @Override - public boolean canBeUpgraded() { - return true; - } - - // IToolDrop - @Override - public ItemStack getToolDrop(PlayerEntity entityPlayer) { - return TRContent.Machine.RECYCLER.getStack(); - } - - @Override - public boolean isStackValid(int slotID, ItemStack stack) { - if (slotID == 0) { - return canRecycle(stack); - } - return false; - } - - @Override - public int[] getInputSlots() { - return new int[]{0}; - } - - // ItemHandlerProvider - @Override - public RebornInventory getInventory() { - return this.inventory; + super(TRBlockEntities.RECYCLER, "Recycler", TechRebornConfig.recyclerMaxInput, TechRebornConfig.recyclerMaxEnergy, TRContent.Machine.RECYCLER.block, 2); + final int[] inputs = new int[]{0}; + final int[] outputs = new int[]{1}; + this.inventory = new RebornInventory<>(3, "RecyclerBlockEntity", 64, this); + this.crafter = new RecyclerRecipeCrafter(this, this.inventory, inputs, outputs); } public static boolean canRecycle(ItemStack stack) { @@ -204,13 +57,12 @@ public class RecyclerBlockEntity extends PowerAcceptorBlockEntity return !TechRebornConfig.recyclerBlackList.contains(Registry.ITEM.getId(item).toString()); } - // IContainerProvider + // BuiltScreenHandlerProvider @Override public BuiltScreenHandler createScreenHandler(int syncID, PlayerEntity player) { return new ScreenHandlerBuilder("recycler").player(player.inventory).inventory().hotbar().addInventory() .blockEntity(this).slot(0, 55, 45, RecyclerBlockEntity::canRecycle) .outputSlot(1, 101, 45).energySlot(2, 8, 72).syncEnergyValue() - .sync(this::getProgress, this::setProgress).addInventory().create(this, syncID); + .addInventory().create(this, syncID); } - } diff --git a/src/main/java/techreborn/client/gui/GuiRecycler.java b/src/main/java/techreborn/client/gui/GuiRecycler.java index 998b1228f..1dc191c0d 100644 --- a/src/main/java/techreborn/client/gui/GuiRecycler.java +++ b/src/main/java/techreborn/client/gui/GuiRecycler.java @@ -45,9 +45,11 @@ public class GuiRecycler extends GuiBase { super.drawBackground(matrixStack, f, mouseX, mouseY); final GuiBase.Layer layer = GuiBase.Layer.BACKGROUND; + // Battery slot drawSlot(matrixStack, 8, 72, layer); - + // Input drawSlot(matrixStack, 55, 45, layer); + // Output drawOutputSlot(matrixStack, 101, 45, layer); } @@ -56,7 +58,7 @@ public class GuiRecycler extends GuiBase { super.drawForeground(matrixStack, mouseX, mouseY); final GuiBase.Layer layer = GuiBase.Layer.FOREGROUND; - builder.drawProgressBar(matrixStack, this, blockEntity.gaugeProgressScaled(100), 100, 76, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer); + builder.drawProgressBar(matrixStack, this, blockEntity.getProgressScaled(100), 100, 76, 48, mouseX, mouseY, GuiBuilder.ProgressDirection.RIGHT, layer); builder.drawMultiEnergyBar(matrixStack, this, 9, 19, (int) blockEntity.getEnergy(), (int) blockEntity.getMaxStoredPower(), mouseX, mouseY, 0, layer); } } diff --git a/src/main/java/techreborn/config/TechRebornConfig.java b/src/main/java/techreborn/config/TechRebornConfig.java index 5d5a7abd4..8b0754359 100644 --- a/src/main/java/techreborn/config/TechRebornConfig.java +++ b/src/main/java/techreborn/config/TechRebornConfig.java @@ -501,12 +501,15 @@ public class TechRebornConfig { @Config(config = "machines", category = "fusion_reactor", key = "FusionReactorMaxCoilSize", comment = "Fusion Reactor Max Coil size (Radius)") public static int fusionControlComputerMaxCoilSize = 50; - @Config(config = "machines", category = "recycler", key = "RecyclerInput", comment = "Recycler Max Input (Value in EU)") + @Config(config = "machines", category = "recycler", key = "RecyclerInput", comment = "Recycler Max Input") public static int recyclerMaxInput = 32; - @Config(config = "machines", category = "recycler", key = "RecyclerMaxEnergy", comment = "Recycler Max Energy (Value in EU)") + @Config(config = "machines", category = "recycler", key = "RecyclerMaxEnergy", comment = "Recycler Max Energy") public static int recyclerMaxEnergy = 1000; + @Config(config = "machines", category = "recycler", key = "RecyclerChance", comment = "Recycler Chance to produce scrap (1 out of chance)") + public static int recyclerChance = 6; + @Config(config = "machines", category = "recycler", key = "RecyclerBlacklist", comment = "Recycler blacklist") public static List recyclerBlackList = Arrays.asList("techreborn:scrap_box", "techreborn:scrap"); diff --git a/src/main/resources/data/techreborn/recipes/recycler.json b/src/main/resources/data/techreborn/recipes/recycler.json new file mode 100644 index 000000000..2d3d334a5 --- /dev/null +++ b/src/main/resources/data/techreborn/recipes/recycler.json @@ -0,0 +1,15 @@ +{ + "type": "techreborn:recycler", + "power": 2, + "time": 25, + "ingredients": [ + { + "item": "minecraft:air" + } + ], + "results": [ + { + "item": "techreborn:scrap" + } + ] +} \ No newline at end of file