Search in sources :

Example 1 with RoutingFocusPosAndFacing

use of WayofTime.alchemicalWizardry.api.RoutingFocusPosAndFacing in project BloodMagic by WayofTime.

the class RitualEffectItemRouting method performEffect.

@Override
public void performEffect(IMasterRitualStone ritualStone) {
    String owner = ritualStone.getOwner();
    int currentEssence = SoulNetworkHandler.getCurrentEssence(owner);
    World world = ritualStone.getWorld();
    int x = ritualStone.getXCoord();
    int y = ritualStone.getYCoord();
    int z = ritualStone.getZCoord();
    if (world.getWorldTime() % 20 != 0) {
        return;
    }
    Map<Int3, IInventory> tileMap = new HashMap();
    List<IInventory> outputList = new ArrayList();
    for (// Check output foci chests, return if none available
    int i = 0; // Check output foci chests, return if none available
    i < 4; // Check output foci chests, return if none available
    i++) {
        Int3 outputFocusChest = this.getOutputBufferChestLocation(i);
        TileEntity outputFocusInv = world.getTileEntity(x + outputFocusChest.xCoord, y + outputFocusChest.yCoord, z + outputFocusChest.zCoord);
        if (outputFocusInv instanceof IInventory) {
            outputList.add((IInventory) outputFocusInv);
        }
    }
    if (outputList.isEmpty()) {
        return;
    }
    for (IInventory outputFocusInventory : outputList) {
        {
            OutputRoutingFocus outputFocus;
            ;
            RoutingFocusParadigm parad = new RoutingFocusParadigm();
            // Destination
            TileEntity outputChest = null;
            ForgeDirection inputDirection;
            {
                IInventory outputChestInventory = null;
                boolean lastItemWasFocus = true;
                for (int j = 0; j < outputFocusInventory.getSizeInventory(); j++) {
                    ItemStack keyStack = outputFocusInventory.getStackInSlot(j);
                    if (keyStack == null) {
                        continue;
                    }
                    if (keyStack.getItem() instanceof OutputRoutingFocus) {
                        if (!lastItemWasFocus) {
                            parad.clear();
                        }
                        outputFocus = (OutputRoutingFocus) keyStack.getItem();
                        parad.addRoutingFocusPosAndFacing(outputFocus.getPosAndFacing(keyStack));
                        parad.addLogic(outputFocus.getLogic(keyStack));
                        lastItemWasFocus = true;
                        continue;
                    } else {
                        lastItemWasFocus = false;
                    }
                    for (RoutingFocusPosAndFacing posAndFacing : parad.locationList) {
                        if (posAndFacing == null) {
                            continue;
                        }
                        inputDirection = posAndFacing.facing;
                        if (outputChest == null || !posAndFacing.location.equals(new Int3(outputChest.xCoord, outputChest.yCoord, outputChest.zCoord))) {
                            outputChest = world.getTileEntity(posAndFacing.location.xCoord, posAndFacing.location.yCoord, posAndFacing.location.zCoord);
                            if (outputChest instanceof IInventory) {
                                outputChestInventory = (IInventory) outputChest;
                            } else {
                                continue;
                            }
                        }
                        for (int i = 0; i < 4; i++) {
                            Int3 inputFocusChest = this.getInputBufferChestLocation(i);
                            TileEntity inputFocusInv = world.getTileEntity(x + inputFocusChest.xCoord, y + inputFocusChest.yCoord, z + inputFocusChest.zCoord);
                            if (inputFocusInv instanceof IInventory) {
                                for (// Iterate through foci inventory
                                int ji = 0; // Iterate through foci inventory
                                ji < ((IInventory) inputFocusInv).getSizeInventory(); // Iterate through foci inventory
                                ji++) {
                                    ItemStack inputFocusStack = ((IInventory) inputFocusInv).getStackInSlot(ji);
                                    if (inputFocusStack != null && inputFocusStack.getItem() instanceof InputRoutingFocus) {
                                        InputRoutingFocus inputFocus = (InputRoutingFocus) inputFocusStack.getItem();
                                        TileEntity inputChest = world.getTileEntity(inputFocus.xCoord(inputFocusStack), inputFocus.yCoord(inputFocusStack), inputFocus.zCoord(inputFocusStack));
                                        if (inputChest instanceof IInventory) {
                                            IInventory inputChestInventory = (IInventory) inputChest;
                                            ForgeDirection syphonDirection = inputFocus.getSetDirection(inputFocusStack);
                                            boolean[] canSyphonList = new boolean[inputChestInventory.getSizeInventory()];
                                            if (inputChest instanceof ISidedInventory) {
                                                int[] validSlots = ((ISidedInventory) inputChest).getAccessibleSlotsFromSide(syphonDirection.ordinal());
                                                for (int in : validSlots) {
                                                    canSyphonList[in] = true;
                                                }
                                            } else {
                                                for (int ni = 0; ni < inputChestInventory.getSizeInventory(); ni++) {
                                                    canSyphonList[ni] = true;
                                                }
                                            }
                                            for (int ni = 0; ni < inputChestInventory.getSizeInventory(); ni++) {
                                                if (canSyphonList[ni]) {
                                                    // Has a syphoned item linked, next need to find a destination
                                                    ItemStack syphonedStack = inputChestInventory.getStackInSlot(ni);
                                                    if (syphonedStack == null || (inputChestInventory instanceof ISidedInventory && !((ISidedInventory) inputChestInventory).canExtractItem(ni, syphonedStack, syphonDirection.ordinal()))) {
                                                        continue;
                                                    }
                                                    int size = syphonedStack.stackSize;
                                                    if (parad.doesItemMatch(keyStack, syphonedStack)) {
                                                        ItemStack newStack = null;
                                                        if (parad.maximumAmount <= 0) {
                                                            newStack = SpellHelper.insertStackIntoInventory(syphonedStack, outputChestInventory, inputDirection);
                                                        } else {
                                                            newStack = SpellHelper.insertStackIntoInventory(syphonedStack, outputChestInventory, inputDirection, parad.maximumAmount);
                                                        }
                                                        if (size == newStack.stackSize) {
                                                            continue;
                                                        }
                                                        int numberSyphoned = size - newStack.stackSize;
                                                        if (newStack != null && newStack.stackSize <= 0) {
                                                            size = newStack.stackSize;
                                                            newStack = null;
                                                        }
                                                        inputChestInventory.setInventorySlotContents(ni, newStack);
                                                    // break;
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
Also used : IInventory(net.minecraft.inventory.IInventory) HashMap(java.util.HashMap) Int3(WayofTime.alchemicalWizardry.api.Int3) ArrayList(java.util.ArrayList) InputRoutingFocus(WayofTime.alchemicalWizardry.common.items.routing.InputRoutingFocus) OutputRoutingFocus(WayofTime.alchemicalWizardry.common.items.routing.OutputRoutingFocus) RoutingFocusParadigm(WayofTime.alchemicalWizardry.api.RoutingFocusParadigm) World(net.minecraft.world.World) TileEntity(net.minecraft.tileentity.TileEntity) ISidedInventory(net.minecraft.inventory.ISidedInventory) ForgeDirection(net.minecraftforge.common.util.ForgeDirection) ItemStack(net.minecraft.item.ItemStack) RoutingFocusPosAndFacing(WayofTime.alchemicalWizardry.api.RoutingFocusPosAndFacing)

Aggregations

Int3 (WayofTime.alchemicalWizardry.api.Int3)1 RoutingFocusParadigm (WayofTime.alchemicalWizardry.api.RoutingFocusParadigm)1 RoutingFocusPosAndFacing (WayofTime.alchemicalWizardry.api.RoutingFocusPosAndFacing)1 InputRoutingFocus (WayofTime.alchemicalWizardry.common.items.routing.InputRoutingFocus)1 OutputRoutingFocus (WayofTime.alchemicalWizardry.common.items.routing.OutputRoutingFocus)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 IInventory (net.minecraft.inventory.IInventory)1 ISidedInventory (net.minecraft.inventory.ISidedInventory)1 ItemStack (net.minecraft.item.ItemStack)1 TileEntity (net.minecraft.tileentity.TileEntity)1 World (net.minecraft.world.World)1 ForgeDirection (net.minecraftforge.common.util.ForgeDirection)1