Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ dependencies {
implementation rfg.deobf("curse.maven:baubles-227083:2518667")
implementation rfg.deobf("curse.maven:shadowfacts-forgelin-248453:2785465")
implementation rfg.deobf("curse.maven:ae-additions-extra-cells-2-fork-493962:3814371")
implementation rfg.deobf("curse.maven:ez-storage2-245425:2530747")

// Soft Dependencies
implementation "CraftTweaker2:CraftTweaker2-MC1120-Main:1.12-4.1.20.687"
Expand All @@ -65,7 +64,13 @@ dependencies {
// Debug Chisel
compileOnly rfg.deobf("curse.maven:chisel-235279:2915375")
if (project.debug_chisel.toBoolean()) {
implementation rfg.deobf("curse.maven:chisel-235279:2915375")
runtimeOnly rfg.deobf("curse.maven:chisel-235279:2915375")
}

// Debug mixins
compileOnly rfg.deobf("curse.maven:ez-storage2-245425:2530747")
if (project.debug_mixins.toBoolean()) {
runtimeOnly rfg.deobf("curse.maven:ez-storage2-245425:2530747")
}

// Boot error fix
Expand Down
3 changes: 2 additions & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ minecraftVersion = 1.12.2
# Debug mod compatibility
debug_de = false
debug_chisel = false
debug_mixins = false

# Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you
# restart Minecraft in development. Choose this dependent on your mod:
Expand Down Expand Up @@ -53,7 +54,7 @@ accessTransformersFile =
# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = true
# Specify the package that contains all of your Mixins. You may only place Mixins in this package or the build will fail!
mixinsPackage = mixins
mixinsPackage = mixins.impl
# Specify the core mod entry class if you use a core mod. This class must implement IFMLLoadingPlugin!
# Example value: coreModClass = asm.FMLPlugin + modGroup = com.myname.mymodid -> com.myname.mymodid.asm.FMLPlugin
coreModClass = GTEMixinPlugin
Expand Down
7 changes: 6 additions & 1 deletion src/main/java/gtexpert/GTEMixinLoader.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package gtexpert;

import net.minecraftforge.fml.common.Loader;

import com.google.common.collect.Lists;
import zone.rong.mixinbooter.ILateMixinLoader;

import java.util.Collections;
import java.util.List;

public class GTEMixinLoader implements ILateMixinLoader {

@Override
public List<String> getMixinConfigs() {
return Lists.newArrayList("mixins.gtexpert.json");
if (Loader.isModLoaded("ezstorage"))
return Lists.newArrayList("mixins.gtexpert.json");
return Collections.emptyList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
package gtexpert.mixins.impl.ezstorage2;

import gtexpert.mixins.interfaces.ezstorage2.IMixinEZInventory;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.*;
import net.minecraft.item.ItemStack;

import com.zerofall.ezstorage.gui.server.ContainerStorageCore;
import com.zerofall.ezstorage.tileentity.TileEntityStorageCore;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import org.jetbrains.annotations.NotNull;

@Mixin(ContainerStorageCore.class)
public abstract class MixinContainerStorageCore extends Container {

@Shadow(remap = false)
private TileEntityStorageCore tileEntity;

@Invoker(value = "rowCount", remap = false)
protected abstract int invokeRowCount();

@Inject(method = "slotClick",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/inventory/Container;slotClick(IILnet/minecraft/inventory/ClickType;Lnet/minecraft/entity/player/EntityPlayer;)Lnet/minecraft/item/ItemStack;"),
remap = false,
locals = LocalCapture.CAPTURE_FAILHARD,
cancellable = true)
private void injectSlotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player,
CallbackInfoReturnable<ItemStack> cir, ItemStack val) {
if (slotId != -999) {
Slot slot = this.getSlot(slotId);
if (!(slot instanceof SlotCrafting) && clickTypeIn == ClickType.QUICK_MOVE && slot.canTakeStack(player)) {
ItemStack itemStack = slot.getStack();
ItemStack result = this.tileEntity.inventory.input(itemStack, true);
slot.onSlotChanged();
super.detectAndSendChanges();
cir.setReturnValue(result.copy());
}
}
}

@Inject(method = "customSlotClick", at = @At(value = "HEAD"), remap = false, cancellable = true)
private void injectCustomSlotClick(int slotId, int clickedButton, int mode, EntityPlayer playerIn,
CallbackInfoReturnable<ItemStack> cir) {
// Always return EMPTY since this return value is never used
cir.setReturnValue(ItemStack.EMPTY);

int type = 0;
if (clickedButton == 1) {
type = (mode == 0) ? 1 : 2;
}

// isShiftLeftClick
if (clickedButton == 0 && mode == 1) {
int playerInventoryStartIndex = this.invokeRowCount() * 9;
int playerInventoryEndIndex = playerInventoryStartIndex + playerIn.inventory.mainInventory.size();

if (playerIn.inventory.getFirstEmptyStack() < 0) {
ItemStack targetStack = ((IMixinEZInventory) (Object) this.tileEntity.inventory)
.getItemWithoutExtractAt(slotId);
int emptyCapacity = this.inventorySlots.subList(playerInventoryStartIndex, playerInventoryEndIndex)
.stream()
.mapToInt(slot -> {
ItemStack slotStack = slot.getStack();
if (slotStack.isItemEqual(targetStack) &&
ItemStack.areItemStackTagsEqual(slotStack, targetStack)) {
return slotStack.getMaxStackSize() - slotStack.getCount();
}
return 0;
}).sum();

ItemStack retrievedStack = this.tileEntity.inventory.getItemsAt(slotId, type,
Math.min(emptyCapacity, targetStack.getMaxStackSize()));
if (!retrievedStack.isEmpty()) {
this.mergeItemStack(retrievedStack, playerInventoryStartIndex, playerInventoryEndIndex, true);
}
} else {
ItemStack retrievedStack = this.tileEntity.inventory.getItemsAt(slotId, type);
if (!retrievedStack.isEmpty()) {
this.mergeItemStack(retrievedStack, playerInventoryStartIndex, playerInventoryEndIndex, true);
}
}
} else {
ItemStack heldStack = playerIn.inventory.getItemStack();
if (heldStack.isEmpty()) {
ItemStack retrievedStack = this.tileEntity.inventory.getItemsAt(slotId, type);
playerIn.inventory.setItemStack(retrievedStack);
} else if (clickedButton == 0) {
playerIn.inventory.setItemStack(this.tileEntity.inventory.input(heldStack));
} else if (clickedButton == 1 && mode != 1) {
playerIn.inventory
.setItemStack(((IMixinEZInventory) (Object) this.tileEntity.inventory).input(heldStack, 1));
}
}
}

@Override
public boolean canDragIntoSlot(@NotNull Slot slotIn) {
return !(slotIn.inventory instanceof InventoryBasic);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package gtexpert.mixins.impl.ezstorage2;

import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.InventoryCrafting;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;

import com.zerofall.ezstorage.gui.server.ContainerStorageCore;
import com.zerofall.ezstorage.gui.server.ContainerStorageCoreCrafting;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.*;

@Mixin(ContainerStorageCoreCrafting.class)
public class MixinContainerStorageCoreCrafting extends ContainerStorageCore {

public MixinContainerStorageCoreCrafting(EntityPlayer player, World world, int x, int y, int z) {
super(player, world, x, y, z);
}

@Redirect(method = "transferStackInSlot",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;isItemEqual(Lnet/minecraft/item/ItemStack;)Z",
ordinal = 0),
remap = false)
private boolean redirectTransferStackInSlotIsItemEqual0(ItemStack stack, ItemStack other) {
return true;
}

@Redirect(method = "transferStackInSlot",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;isItemEqual(Lnet/minecraft/item/ItemStack;)Z",
ordinal = 1),
remap = false)
private boolean redirectTransferStackInSlotIsItemEqual1(ItemStack stack, ItemStack other) {
return false;
}

@Redirect(method = "transferStackInSlot",
at = @At(value = "INVOKE",
target = "Lnet/minecraft/inventory/InventoryCrafting;getStackInSlot(I)Lnet/minecraft/item/ItemStack;",
ordinal = 0),
remap = false)
private ItemStack redirectTransferStackInSlotGetStackInSlot(InventoryCrafting inv, int index) {
return inv.getStackInSlot(index).copy();
}

@ModifyConstant(method = "tryToPopulateCraftingGrid",
constant = @Constant(intValue = 1),
slice = @Slice(from = @At("HEAD"),
to = @At(value = "CONSTANT",
args = "intValue=1",
ordinal = 0)),
remap = false)
private int modifyConstantTryToPopulateCraftingGrid(int original) {
return Integer.MAX_VALUE;
}

@Redirect(method = "tryToPopulateCraftingGrid",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/item/ItemStack;setCount(I)V"),
remap = false)
private void redirectTryToPopulateCraftingGridSetCount(ItemStack itemStack, int count) {
if (itemStack.getCount() > 1) {
itemStack.setCount(itemStack.getCount() - 1);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package gtexpert.mixins.impl.ezstorage2;

import gtexpert.mixins.interfaces.ezstorage2.IMixinEZInventory;

import net.minecraft.item.ItemStack;

import com.zerofall.ezstorage.util.EZInventory;
import com.zerofall.ezstorage.util.ItemGroup;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.gen.Invoker;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;

import java.util.List;

@Mixin(EZInventory.class)
public abstract class MixinEZInventory implements IMixinEZInventory {

@Shadow(remap = false)
private List<ItemGroup> inventory;

@Invoker(value = "extractStack", remap = false)
protected abstract ItemStack invokeExtractStack(ItemGroup group, int size, boolean peek);

@Inject(method = "getItemsAt(IIIZ)Lnet/minecraft/item/ItemStack;",
at = @At(value = "INVOKE",
target = "Lcom/zerofall/ezstorage/util/EZInventory;extractStack(Lcom/zerofall/ezstorage/util/ItemGroup;IZ)Lnet/minecraft/item/ItemStack;",
ordinal = 0),
remap = false,
locals = LocalCapture.CAPTURE_FAILHARD,
cancellable = true)
private void injectGetItemsAtExtractStack(int index, int type, int size, boolean peek,
CallbackInfoReturnable<ItemStack> cir,
ItemGroup group, ItemStack stack) {
if (size == 0) {
cir.setReturnValue(ItemStack.EMPTY);
return;
}

if (size < 1) {
if (type == 1) {
size = (((int) Math.min(stack.getMaxStackSize(), group.count)) + 2 - 1) / 2;
} else if (type == 2) {
size = 1;
}
}

ItemStack result = this.invokeExtractStack(group, size, peek);
cir.setReturnValue(result);
}

@Override
public ItemStack getItemWithoutExtractAt(int index) {
if (index >= this.inventory.size()) {
return ItemStack.EMPTY;
}
return this.inventory.get(index).itemStack;
}

@Override
public ItemStack input(ItemStack itemStack, int quantity, boolean sort) {
int stackCount = itemStack.getCount();
quantity = Math.min(itemStack.getCount(), quantity);

ItemStack inputStack = itemStack.copy();
inputStack.setCount(Math.min(stackCount, quantity));
ItemStack inputResult = ((EZInventory) (Object) this).input(inputStack, sort);
if (inputResult.isEmpty()) {
itemStack.shrink(quantity);
} else {
itemStack.setCount(stackCount - quantity + inputResult.getCount());
}
return itemStack;
}
}
Loading