Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix rftools, xnet, and bds&m using mixin #278

Merged
merged 4 commits into from
Aug 2, 2024
Merged
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: 9 additions & 0 deletions dependencies.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,13 @@ dependencies {
implementation rfg.deobf("curse.maven:ctm-267602:2915363") // CTM 1.0.2.31
implementation rfg.deobf("curse.maven:groovyscript-687577:5507936") // GRS 1.1.1
implementation rfg.deobf("curse.maven:modularui-624243:5153413")

compileOnly rfg.deobf("curse.maven:ynet-an-xnet-fork-999559:5243319") // XNet-1.8.3-ynet
implementation rfg.deobf("curse.maven:rftools-224641:2861573") // RFTools 7.73
implementation rfg.deobf("curse.maven:mcjtylib-233105:2745846")
compileOnly rfg.deobf("curse.maven:redstone-flux-270789:2920436")
compileOnly rfg.deobf("curse.maven:tesla-244651:2487959")
compileOnly rfg.deobf("curse.maven:hwyla-253449:2568751")

implementation rfg.deobf("curse.maven:barrels-drums-storage-more-319404:2708193")
}
4 changes: 2 additions & 2 deletions gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,9 @@ apiPackage =
accessTransformersFile =

# Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled!
usesMixins = false
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 =
mixinsPackage =mixins
# 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 = asm.SusyLoadingPlugin
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/supersymmetry/Supersymmetry.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package supersymmetry;

import gregtech.GTInternalTags;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.SidedProxy;
import net.minecraftforge.fml.common.event.FMLConstructionEvent;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import org.jetbrains.annotations.NotNull;
import supersymmetry.api.event.MobHordeEvent;
import supersymmetry.api.sound.SusySounds;
import supersymmetry.common.CommonProxy;
import supersymmetry.common.SusyMetaEntities;
Expand All @@ -22,6 +20,7 @@
import supersymmetry.common.covers.SuSyCoverBehaviors;
import supersymmetry.common.item.SuSyMetaItems;
import supersymmetry.common.metatileentities.SuSyMetaTileEntities;
import supersymmetry.integration.bdsandm.BDSAndMModule;
import supersymmetry.loaders.SuSyIRLoader;

@Mod(name = Supersymmetry.NAME, modid = Supersymmetry.MODID, version = Tags.VERSION, dependencies = GTInternalTags.DEP_VERSION_STRING + ";required-after:gcym;after:immersiverailroading")
Expand Down Expand Up @@ -63,6 +62,8 @@ public void onPreInit(@NotNull FMLPreInitializationEvent event) {
public void onInit(@NotNull FMLInitializationEvent event) {
proxy.load();
SuSyCoverBehaviors.init();

BDSAndMModule.init();
}

@Mod.EventHandler
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/supersymmetry/api/bugfixes/IItemStackInfo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package supersymmetry.api.bugfixes;

import net.minecraft.item.ItemStack;

public interface IItemStackInfo {

ItemStack getStack();

void setStack(ItemStack stack);

}
37 changes: 37 additions & 0 deletions src/main/java/supersymmetry/integration/bdsandm/BDSAndMModule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package supersymmetry.integration.bdsandm;

import funwayguy.bdsandm.blocks.tiles.TileEntityBarrel;
import funwayguy.bdsandm.core.BDSM;
import gregtech.api.cover.CoverRayTracer;
import gregtech.common.items.tool.rotation.CustomBlockRotations;
import gregtech.common.items.tool.rotation.ICustomRotationBehavior;
import net.minecraft.block.BlockDirectional;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumFacing;

import java.util.Objects;

public class BDSAndMModule {

public static final ICustomRotationBehavior BDSAndM_BARREL_BEHAVIOR = (state, world, pos, hitResult) -> {
EnumFacing gridSide = CoverRayTracer.determineGridSideHit(hitResult);
if (gridSide == null) return false;
gridSide = gridSide.getOpposite(); // idk what's happening here, blame the original author
if (gridSide != state.getValue(BlockDirectional.FACING)) {
TileEntityBarrel barrel = ((TileEntityBarrel) world.getTileEntity(pos));
if (barrel != null) {
state = state.withProperty(BlockDirectional.FACING, gridSide);
NBTTagCompound tagCompound = barrel.writeToNBT(new NBTTagCompound());
world.setBlockState(pos, state);
Objects.requireNonNull(world.getTileEntity(pos)).readFromNBT(tagCompound);
return true;
}
}
return false;
};

public static void init() {
CustomBlockRotations.registerCustomRotation(BDSM.blockMetalBarrel, BDSAndM_BARREL_BEHAVIOR);
CustomBlockRotations.registerCustomRotation(BDSM.blockWoodBarrel, BDSAndM_BARREL_BEHAVIOR);
}
}
16 changes: 16 additions & 0 deletions src/main/java/supersymmetry/mixins/SuSyLateMixinLoader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package supersymmetry.mixins;

import zone.rong.mixinbooter.ILateMixinLoader;

import java.util.Arrays;
import java.util.List;

@SuppressWarnings("unused")
public class SuSyLateMixinLoader implements ILateMixinLoader {

@Override
public List<String> getMixinConfigs() {
String[] configs = {"mixins.susy.late.json"};
return Arrays.asList(configs);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package supersymmetry.mixins.bdsandm;

import funwayguy.bdsandm.blocks.BlockBarrelBase;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;

@Mixin(BlockBarrelBase.class)
public class BlockBarrelBaseMixin {

@Redirect(method = "withdrawItem",
remap = false,
at = @At(value = "INVOKE",
target = "Ljava/lang/Math;min(II)I",
ordinal = 0))
private int redirectMin(int a, int b) {
return b;
}

}
36 changes: 36 additions & 0 deletions src/main/java/supersymmetry/mixins/gregtech/BlockMachineMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package supersymmetry.mixins.gregtech;

import gregtech.api.block.BlockCustomParticle;
import gregtech.api.block.machines.BlockMachine;
import gregtech.api.metatileentity.MetaTileEntity;
import net.minecraft.block.material.MapColor;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import org.jetbrains.annotations.ApiStatus.ScheduledForRemoval;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin;

import static gregtech.api.util.GTUtility.getMetaTileEntity;

@Deprecated
@ScheduledForRemoval(inVersion = "Next CEu update")
@Mixin(BlockMachine.class)
public abstract class BlockMachineMixin extends BlockCustomParticle {

public BlockMachineMixin(Material blockMaterialIn, MapColor blockMapColorIn) {
super(blockMaterialIn, blockMapColorIn);
}

@NotNull
@Override
@SuppressWarnings("deprecation")
public ItemStack getItem(@NotNull World world, @NotNull BlockPos pos, @NotNull IBlockState state) {
MetaTileEntity metaTileEntity = getMetaTileEntity(world, pos);
if (metaTileEntity == null)
return ItemStack.EMPTY;
return metaTileEntity.getStackForm();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package supersymmetry.mixins.rftools;

import com.llamalad7.mixinextras.sugar.Local;
import mcjty.lib.gui.widgets.BlockRender;
import mcjty.rftools.blocks.storagemonitor.GuiStorageScanner;
import mcjty.rftools.blocks.storagemonitor.PacketReturnInventoryInfo;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import supersymmetry.api.bugfixes.IItemStackInfo;

@Mixin(GuiStorageScanner.class)
public class GuiStorageScannerMixin {

@Redirect(method = "addStorageLine",
remap = false,
at = @At(value = "INVOKE",
target = "Lmcjty/lib/gui/widgets/BlockRender;setRenderItem(Ljava/lang/Object;)Lmcjty/lib/gui/widgets/BlockRender;",
ordinal = 0))
private BlockRender setRenderItemCorrectly(BlockRender renderer, Object object, @Local(argsOnly = true) PacketReturnInventoryInfo.InventoryInfo info) {
return renderer.setRenderItem(((IItemStackInfo) info).getStack());
}
}
24 changes: 24 additions & 0 deletions src/main/java/supersymmetry/mixins/rftools/InventoryInfoMixin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package supersymmetry.mixins.rftools;

import mcjty.rftools.blocks.storagemonitor.PacketReturnInventoryInfo;
import net.minecraft.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique;
import supersymmetry.api.bugfixes.IItemStackInfo;

@Mixin(PacketReturnInventoryInfo.InventoryInfo.class)
public class InventoryInfoMixin implements IItemStackInfo {

@Unique
private ItemStack stack;

@Override
public ItemStack getStack() {
return stack;
}

@Override
public void setStack(ItemStack stack) {
this.stack = stack;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package supersymmetry.mixins.rftools;

import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.util.GTUtility;
import gregtech.api.util.GregFakePlayer;
import gregtech.integration.jei.multiblock.MultiblockInfoRecipeWrapper;
import mcjty.lib.varia.WorldTools;
import mcjty.rftools.blocks.storage.ModularStorageContainer;
import mcjty.rftools.blocks.storage.ModularStorageTileEntity;
import mcjty.rftools.blocks.storagemonitor.PacketGetInventoryInfo;
import mcjty.rftools.blocks.storagemonitor.PacketReturnInventoryInfo;
import mcjty.rftools.blocks.storagemonitor.StorageScannerTileEntity;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Overwrite;
import org.spongepowered.asm.mixin.Unique;
import supersymmetry.api.bugfixes.IItemStackInfo;

import java.util.Map;
import java.util.Set;

@Mixin(PacketGetInventoryInfo.class)
public class PacketGetInventoryInfoMixin {

/**
* @author Tian_mi
* @reason Ask mcjty
*/
@Overwrite(remap = false)
private static PacketReturnInventoryInfo.InventoryInfo toInventoryInfo(World world, BlockPos pos, StorageScannerTileEntity te) {

ItemStack stack = ItemStack.EMPTY;
String displayName;

if (!WorldTools.chunkLoaded(world, pos)) {
displayName = "[UNLOADED]";
} else if (world.isAirBlock(pos)) {
displayName = "[REMOVED]";
} else {

stack = supersymmetry$getItemProperly(world, pos);
displayName = stack.getDisplayName();

TileEntity storageTe = world.getTileEntity(pos);
if (storageTe instanceof ModularStorageTileEntity) {
ModularStorageTileEntity storageTileEntity = (ModularStorageTileEntity) storageTe;
ItemStack storageModule = storageTileEntity.getStackInSlot(ModularStorageContainer.SLOT_STORAGE_MODULE);
if (!storageModule.isEmpty()) {
if (storageModule.getTagCompound().hasKey("display")) {
displayName = storageModule.getDisplayName();
}
}
}
}

var info = new PacketReturnInventoryInfo.InventoryInfo(pos, displayName, te.isRoutable(pos), Blocks.AIR);
((IItemStackInfo) info).setStack(stack);
return info;
}

/**
* To make XNet happy with ceu machines.
* Copied From {@link MultiblockInfoRecipeWrapper#gatherStructureBlocks(World, Map, Set)}.
*/
@Unique
private static ItemStack supersymmetry$getItemProperly(World world, BlockPos pos) {
IBlockState state = world.getBlockState(pos);

ItemStack stack = ItemStack.EMPTY;

// first check if the block is a GT machine
TileEntity tileEntity = world.getTileEntity(pos);
if (tileEntity instanceof IGregTechTileEntity) {
stack = ((IGregTechTileEntity) tileEntity).getMetaTileEntity().getStackForm();
}
if (stack.isEmpty()) {
// first, see what the block has to say for itself before forcing it to use a particular meta value
stack = state.getBlock().getPickBlock(state, new RayTraceResult(Vec3d.ZERO, EnumFacing.UP, pos), world, pos,
new GregFakePlayer(world));
}
if (stack.isEmpty()) {
// try the default itemstack constructor if we're not a GT machine
stack = GTUtility.toItem(state);
}
if (stack.isEmpty()) {
// add the first of the block's drops if the others didn't work
NonNullList<ItemStack> list = NonNullList.create();
state.getBlock().getDrops(list, world, pos, state, 0);
if (!list.isEmpty()) {
ItemStack is = list.get(0);
if (!is.isEmpty()) {
stack = is;
}
}
}
return stack;
}
}
Loading