From 978306a053469f39570e72a873a144ebb9c3e1fc Mon Sep 17 00:00:00 2001 From: BlueWeabo Date: Wed, 17 Apr 2024 11:33:46 +0300 Subject: [PATCH] Implement first logic hosts --- .../api/host/FluidInventoryLogicHost.java | 72 +++++++++++ .../api/host/ItemInventoryLogicHost.java | 119 ++++++++++++++++++ .../mutecore/api/host/PowerLogicHost.java | 14 +++ .../api/logic/FluidInventoryLogic.java | 8 +- 4 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/blueweabo/mutecore/api/host/FluidInventoryLogicHost.java create mode 100644 src/main/java/com/blueweabo/mutecore/api/host/ItemInventoryLogicHost.java create mode 100644 src/main/java/com/blueweabo/mutecore/api/host/PowerLogicHost.java diff --git a/src/main/java/com/blueweabo/mutecore/api/host/FluidInventoryLogicHost.java b/src/main/java/com/blueweabo/mutecore/api/host/FluidInventoryLogicHost.java new file mode 100644 index 0000000..7c440c0 --- /dev/null +++ b/src/main/java/com/blueweabo/mutecore/api/host/FluidInventoryLogicHost.java @@ -0,0 +1,72 @@ +package com.blueweabo.mutecore.api.host; + +import com.blueweabo.mutecore.api.logic.FluidInventoryLogic; +import com.cleanroommc.modularui.api.IFluidTankLong; +import com.cleanroommc.modularui.utils.fluid.FluidTankLong; + +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; + +public interface FluidInventoryLogicHost extends IFluidHandler { + + default FluidInventoryLogic getFluidLogic() { + return getFluidLogic(ForgeDirection.UNKNOWN); + } + + FluidInventoryLogic getFluidLogic(ForgeDirection side); + + @Override + default boolean canDrain(ForgeDirection from, Fluid fluid) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return false; + return logic.extract(new FluidTankLong(fluid), 1, false) != null; + } + + @Override + default boolean canFill(ForgeDirection from, Fluid fluid) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return false; + return logic.insert(new FluidTankLong(fluid), 1, false) != null; + } + + @Override + default FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return null; + IFluidTankLong toDrain = new FluidTankLong(resource.getFluid()); + IFluidTankLong drainTry = logic.extract(toDrain, resource.amount, doDrain); + return drainTry == null ? null : drainTry.getFluid(); + } + + @Override + default FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return null; + IFluidTankLong drainTry = logic.extract(null, maxDrain, doDrain); + return drainTry == null ? null : drainTry.getFluid(); + } + + @Override + default int fill(ForgeDirection from, FluidStack resource, boolean doFill) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return 0; + IFluidTankLong toFill = new FluidTankLong(resource.getFluid()); + IFluidTankLong fillTry = logic.insert(toFill, resource.amount, doFill); + return fillTry == null ? 0 : fillTry.getFluidAmount(); + } + + @Override + default FluidTankInfo[] getTankInfo(ForgeDirection from) { + FluidInventoryLogic logic = getFluidLogic(from); + if (logic == null) return new FluidTankInfo[0]; + FluidTankInfo[] infos = new FluidTankInfo[logic.getSlots()]; + for (int i = 0; i < infos.length; i++) { + + } + return infos; + } +} diff --git a/src/main/java/com/blueweabo/mutecore/api/host/ItemInventoryLogicHost.java b/src/main/java/com/blueweabo/mutecore/api/host/ItemInventoryLogicHost.java new file mode 100644 index 0000000..a87a6a5 --- /dev/null +++ b/src/main/java/com/blueweabo/mutecore/api/host/ItemInventoryLogicHost.java @@ -0,0 +1,119 @@ +package com.blueweabo.mutecore.api.host; + +import com.blueweabo.mutecore.api.logic.ItemInventoryLogic; +import com.cleanroommc.modularui.api.IItemStackLong; +import com.cleanroommc.modularui.utils.item.ItemStackLongDelegate; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +public interface ItemInventoryLogicHost extends ISidedInventory { + + default ItemInventoryLogic getItemLogic() { + return getItemLogic(ForgeDirection.UNKNOWN); + } + + ItemInventoryLogic getItemLogic(ForgeDirection side); + + @Override + default boolean canExtractItem(int slot, ItemStack item, int side) { + ItemInventoryLogic logic = getItemLogic(ForgeDirection.getOrientation(side)); + return logic != null && logic.extract(new ItemStackLongDelegate(item), item.stackSize, false) != null; + } + + @Override + default boolean canInsertItem(int slot, ItemStack item, int side) { + ItemInventoryLogic logic = getItemLogic(ForgeDirection.getOrientation(side)); + return logic != null && logic.extract(new ItemStackLongDelegate(item), item.stackSize, false) != null; + } + + @Override + default int[] getAccessibleSlotsFromSide(int side) { + ItemInventoryLogic logic = getItemLogic(ForgeDirection.getOrientation(side)); + if (logic == null) { + return new int[0]; + } + int arr[] = new int[logic.getSlots()]; + for (int i = 0; i < arr.length; i++) { + arr[i] = i; + } + return arr; + } + + @Override + default void closeInventory() {} + + @Override + default ItemStack decrStackSize(int index, int count) { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return null; + IItemStackLong stack = logic.get(index); + if (stack == null) return null; + IItemStackLong extractTry = logic.extract(stack, count, false); + if (extractTry == null || extractTry.getStackSize() < count) return null; + IItemStackLong extract = logic.extract(stack, count, true); + return extract.getAsItemStack(); + } + + @Override + default String getInventoryName() { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return ""; + return logic.getName(); + } + + @Override + default int getInventoryStackLimit() { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return 0; + return Integer.MAX_VALUE; + } + + @Override + default int getSizeInventory() { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return 0; + return logic.getSlots(); + } + + @Override + default ItemStack getStackInSlot(int slotIn) { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return null; + return logic.get(slotIn) == null ? null : logic.get(slotIn).getAsItemStack(); + } + + @Override + default ItemStack getStackInSlotOnClosing(int index) { + ItemInventoryLogic logic = getItemLogic(); + if (logic == null) return null; + return logic.get(index) == null ? null : logic.get(index).getAsItemStack(); + } + + @Override + default boolean hasCustomInventoryName() { + return true; + } + + @Override + default boolean isItemValidForSlot(int index, ItemStack stack) { + return true; + } + + @Override + default boolean isUseableByPlayer(EntityPlayer player) { + return true; + } + + @Override + default void markDirty() {} + + @Override + default void openInventory() {} + + @Override + default void setInventorySlotContents(int index, ItemStack stack) {} + +} diff --git a/src/main/java/com/blueweabo/mutecore/api/host/PowerLogicHost.java b/src/main/java/com/blueweabo/mutecore/api/host/PowerLogicHost.java new file mode 100644 index 0000000..35d8859 --- /dev/null +++ b/src/main/java/com/blueweabo/mutecore/api/host/PowerLogicHost.java @@ -0,0 +1,14 @@ +package com.blueweabo.mutecore.api.host; + +import com.blueweabo.mutecore.api.logic.interfaces.PowerLogic; + +import net.minecraftforge.common.util.ForgeDirection; + +public interface PowerLogicHost { + + default PowerLogic getPowerLogic() { + return getPowerLogic(ForgeDirection.UNKNOWN); + } + + PowerLogic getPowerLogic(ForgeDirection side); +} diff --git a/src/main/java/com/blueweabo/mutecore/api/logic/FluidInventoryLogic.java b/src/main/java/com/blueweabo/mutecore/api/logic/FluidInventoryLogic.java index 5fc7c7f..11e0601 100644 --- a/src/main/java/com/blueweabo/mutecore/api/logic/FluidInventoryLogic.java +++ b/src/main/java/com/blueweabo/mutecore/api/logic/FluidInventoryLogic.java @@ -30,7 +30,7 @@ public UUID getId() { } @Override - public @Nullable IFluidTankLong extract(IFluidTankLong request, long amount, boolean doExtract) { + public @Nullable IFluidTankLong extract(@Nullable IFluidTankLong request, long amount, boolean doExtract) { int slot = (int) quickAccess.getLong(request); if (slot >= 0 && request.getRealFluid() == handler.getFluidInTank(slot)) { long drained = handler.getTank(slot).drainLong(amount, doExtract); @@ -39,8 +39,12 @@ public UUID getId() { return drainedTank; } slot = findSlotFromFluidTank(request); - if (slot < 0) + if (request == null) { + slot = 0; + } + if (slot < 0) { return null; + } long drained = handler.getTank(slot).drainLong(amount, doExtract); IFluidTankLong drainedTank = request.copy(); drainedTank.setFluid(drainedTank.getRealFluid(), drained);