Загрузка данных


package com.nerzul.blueprintfixer.mixin;

import blusunrize.immersiveengineering.api.crafting.BlueprintCraftingRecipe;
import blusunrize.immersiveengineering.common.gui.ContainerModWorkbench;
import blusunrize.immersiveengineering.common.gui.IESlot;
import blusunrize.immersiveengineering.common.gui.InventoryBlueprint;
import com.nerzul.blueprintfixer.Registry.BlueprintGroup;
import com.nerzul.blueprintfixer.Registry.BlueprintGroupRegistry;
import com.nerzul.blueprintfixer.gui.BlueprintBackSlot;
import com.nerzul.blueprintfixer.gui.BlueprintGroupSlot;
import com.nerzul.blueprintfixer.gui.BlueprintGuiState;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraft.init.Items;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ClickType;

import java.util.List;

@Mixin(ContainerModWorkbench.class)
public abstract class MixinContainerModWorkbench {

    @Shadow
    private InventoryBlueprint inventoryBPoutput;

    @Inject(
            method = "rebindSlots",
            at = @At("TAIL"),
            remap = false
    )
    private void addBlueprintGroups(CallbackInfo ci) {

        ContainerModWorkbench container =
                (ContainerModWorkbench)(Object)this;

        if (inventoryBPoutput == null)
            return;

        List<BlueprintGroup> groups =
                BlueprintGroupRegistry.getAll();

        int index = 0;

        for (BlueprintGroup group : groups) {

            int x = 118 + (index % 3) * 18;
            int y = 21 + (index / 3) * 18;

            container.field_75151_b.add(
                    new BlueprintGroupSlot(
                            inventoryBPoutput,
                            inventoryBPoutput.getSizeInventory() + index,
                            x,
                            y,
                            group.getIcon(),
                            group.getId()
                    )
            );

            index++;
        }

        if (BlueprintGuiState.isGroupOpen(container)) {

            container.field_75151_b.add(
                    new BlueprintBackSlot(
                            inventoryBPoutput,
                            inventoryBPoutput.getSizeInventory() + index,
                            100,
                            3,
                            new ItemStack(Items.ARROW)
                    )
            );
        }
    }

    @Inject(
            method = "func_184996_a",
            at = @At("HEAD"),
            cancellable = true,
            remap = false
    )
    private void handleBlueprintGroups(
            int id,
            int button,
            ClickType clickType,
            EntityPlayer player,
            CallbackInfoReturnable<ItemStack> cir
    ) {

        ContainerModWorkbench container =
                (ContainerModWorkbench)(Object)this;

        if (id < 0 || id >= container.field_75151_b.size())
            return;

        Slot slot =
                container.field_75151_b.get(id);

        if (slot instanceof BlueprintGroupSlot) {

            BlueprintGroupSlot groupSlot =
                    (BlueprintGroupSlot)slot;

            BlueprintGuiState.open(
                    container,
                    groupSlot.getGroupId()
            );

            container.rebindSlots();

            cir.setReturnValue(ItemStack.field_190927_a);
            return;
        }

        if (slot instanceof BlueprintBackSlot) {

            BlueprintGuiState.close(container);

            container.rebindSlots();

            cir.setReturnValue(ItemStack.field_190927_a);
        }
    }

    @Inject(
            method = "func_82846_b",
            at = @At("HEAD"),
            cancellable = true,
            remap = false
    )
    private void preventGroupShiftClick(
            EntityPlayer player,
            int slot,
            CallbackInfoReturnable<ItemStack> cir
    ) {

        ContainerModWorkbench container =
                (ContainerModWorkbench)(Object)this;

        if (slot < 0 || slot >= container.field_75151_b.size())
            return;

        Slot slotObject =
                container.field_75151_b.get(slot);

        if (slotObject instanceof BlueprintGroupSlot ||
                slotObject instanceof BlueprintBackSlot) {

            cir.setReturnValue(ItemStack.field_190927_a);
        }
    }
}