diff --git a/dependencies.gradle b/dependencies.gradle index 7951731..88e7f12 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -30,9 +30,9 @@ */ dependencies { api('com.github.GTNewHorizons:Galaxy-Space-GTNH:1.1.121-GTNH:dev') - api('com.github.GTNewHorizons:GT5-Unofficial:5.09.51.459:dev') + api('com.github.GTNewHorizons:GT5-Unofficial:5.09.51.470:dev') api('com.github.GTNewHorizons:CodeChickenCore:1.4.7:dev') - implementation('com.github.GTNewHorizons:NewHorizonsCoreMod:2.7.256:dev') + implementation('com.github.GTNewHorizons:NewHorizonsCoreMod:2.7.260:dev') implementation('com.github.GTNewHorizons:Avaritia:1.75:dev') runtimeOnlyNonPublishable('com.github.GTNewHorizons:ServerUtilities:2.1.61:dev') runtimeOnlyNonPublishable('com.github.GTNewHorizons:BlockRenderer6343:1.3.16:dev') diff --git a/gradle.properties b/gradle.properties index 6796975..435f185 100644 --- a/gradle.properties +++ b/gradle.properties @@ -83,7 +83,7 @@ apiPackage = accessTransformersFile = # Provides setup for Mixins if enabled. If you don't know what mixins are: Keep it disabled! -usesMixins = false +usesMixins = true # Set to a non-empty string to configure mixins in a separate source set under src/VALUE, instead of src/main. # This can speed up compile times thanks to not running the mixin annotation processor on all input sources. @@ -97,7 +97,7 @@ usesMixinDebug = true mixinPlugin = # 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! # This parameter is for legacy compatibility only diff --git a/src/main/java/com/silvermoon/boxplusplus/client/BoxNEIHandler.java b/src/main/java/com/silvermoon/boxplusplus/client/BoxNEIHandler.java index 09a2812..7eb4c83 100644 --- a/src/main/java/com/silvermoon/boxplusplus/client/BoxNEIHandler.java +++ b/src/main/java/com/silvermoon/boxplusplus/client/BoxNEIHandler.java @@ -1,23 +1,21 @@ package com.silvermoon.boxplusplus.client; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.*; import net.minecraft.client.gui.GuiButton; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraftforge.client.event.GuiScreenEvent; import com.gtnewhorizons.modularui.common.internal.wrapper.ModularGui; import com.silvermoon.boxplusplus.common.tileentities.GTMachineBox; +import com.silvermoon.boxplusplus.mixins.AccessorGuiContainer; +import com.silvermoon.boxplusplus.mixins.AccessorGuiRecipe; +import com.silvermoon.boxplusplus.mixins.AccessorGuiScreen; import com.silvermoon.boxplusplus.util.BoxRoutings; import com.silvermoon.boxplusplus.util.Util; import codechicken.nei.GuiNEIButton; import codechicken.nei.recipe.*; -import cpw.mods.fml.common.ObfuscationReflectionHelper; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import gregtech.nei.GTNEIDefaultHandler; @@ -29,32 +27,25 @@ public class BoxNEIHandler { @SubscribeEvent public void onDrawScreen(GuiScreenEvent.DrawScreenEvent.Post event) { - if (event.gui instanceof GuiRecipe gui && gui.firstGui instanceof ModularGui mui + if (event.gui instanceof GuiRecipegui && gui.firstGui instanceof ModularGui mui && mui.getContext() .isWindowOpen(10)) { - EntityPlayer player = ((ModularGui) gui.firstGui).getContext() + EntityPlayer player = mui.getContext() .getPlayer(); GTMachineBox box = Util.boxMap.get(player); if (box == null || box.getBaseMetaTileEntity() .isDead() || box.recipe.islocked) return; - List buttonList = ObfuscationReflectionHelper - .getPrivateValue(GuiScreen.class, gui, "field_146292_n", "buttonList"); + List buttonList = ((AccessorGuiScreen) gui).getButtonList(); if (buttons != null) { buttonList.removeIf(Arrays.asList(buttons)::contains); } - Method getRecipesPerPage; - try { - getRecipesPerPage = GuiRecipe.class.getDeclaredMethod("getRecipesPerPage"); - getRecipesPerPage.setAccessible(true); - recipesPerPage = (int) getRecipesPerPage.invoke(gui); - } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException ignored) {} + recipesPerPage = ((AccessorGuiRecipe) gui).invokeGetRecipesPerPage(); buttons = new GuiButton[recipesPerPage]; int OVERLAY_BUTTON_ID_START = 4; - int guiTop = ObfuscationReflectionHelper - .getPrivateValue(GuiContainer.class, gui, "field_147009_r", "guiTop"); - int buttonWidth = ObfuscationReflectionHelper.getPrivateValue(GuiRecipe.class, gui, "buttonWidth"); - int buttonHeight = ObfuscationReflectionHelper.getPrivateValue(GuiRecipe.class, gui, "buttonHeight"); - HandlerInfo handlerInfo = ObfuscationReflectionHelper.getPrivateValue(GuiRecipe.class, gui, "handlerInfo"); + int guiTop = ((AccessorGuiContainer) gui).getGuiTop(); + int buttonWidth = ((AccessorGuiRecipe) gui).getButtonWidth(); + int buttonHeight = ((AccessorGuiRecipe) gui).getButtonHeight(); + HandlerInfo handlerInfo = ((AccessorGuiRecipe) gui).getHandlerInfo(); for (int i = 0; i < recipesPerPage; i++) { buttons[i] = new GuiNEIButton( OVERLAY_BUTTON_ID_START + i, @@ -81,17 +72,17 @@ public void onDrawScreen(GuiScreenEvent.DrawScreenEvent.Post event) { @SubscribeEvent public void onActionPerformedEventPre(GuiScreenEvent.ActionPerformedEvent.Pre event) { - if (event.gui instanceof GuiRecipe gui && gui.firstGui instanceof ModularGui mui + if (event.gui instanceof GuiRecipegui && gui.firstGui instanceof ModularGui mui && mui.getContext() .isWindowOpen(10)) { - EntityPlayer player = ((ModularGui) gui.firstGui).getContext() + EntityPlayer player = mui.getContext() .getPlayer(); List overlayButtons = new ArrayList<>( - Arrays.asList(ObfuscationReflectionHelper.getPrivateValue(GuiRecipe.class, gui, "overlayButtons"))); + Arrays.asList(((AccessorGuiRecipe) gui).getOverlayButtons())); int OVERLAY_BUTTON_ID_START = 4; if (event.button.id >= OVERLAY_BUTTON_ID_START && event.button.id < OVERLAY_BUTTON_ID_START + overlayButtons.size()) { - IRecipeHandler handler = (IRecipeHandler) gui.currenthandlers.get(gui.recipetype); + IRecipeHandler handler = gui.currenthandlers.get(gui.recipetype); if (recipesPerPage >= 0 && handler != null) { int recipe = gui.page * recipesPerPage + event.button.id - OVERLAY_BUTTON_ID_START; BoxRoutings diff --git a/src/main/java/com/silvermoon/boxplusplus/common/render/RenderBoxRing.java b/src/main/java/com/silvermoon/boxplusplus/common/render/RenderBoxRing.java index afacbe2..0675bf5 100644 --- a/src/main/java/com/silvermoon/boxplusplus/common/render/RenderBoxRing.java +++ b/src/main/java/com/silvermoon/boxplusplus/common/render/RenderBoxRing.java @@ -26,21 +26,26 @@ public class RenderBoxRing extends TileEntitySpecialRenderer { public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float partialTicks) { if (!(tile instanceof TEBoxRing ring)) return; + float rotation = ring.getInterpolatedRotation(partialTicks); + GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); - double rotation = ring.getInterpolatedRotation(partialTicks); - if (ring.teRingSwitch && ring.renderStatus) { - GL11.glRotated(rotation, 1, 1, 1); - renderRing((float) (1.1f * ring.scale)); - GL11.glRotated(rotation, 0, 0, 1); - renderRing((float) (1.4f * ring.scale)); + GL11.glRotatef(rotation, 1, 1, 1); + renderRing(1.1f * ring.scale); + if (ring.count > 1) { + GL11.glRotatef(rotation, 0, 0, 1); + renderRing(1.4f * ring.scale); + } + if (ring.count > 2) { + GL11.glRotatef(rotation, 1, 0, 0); + renderRing(1.8f * ring.scale); + } } - GL11.glRotated(rotation, 0, -1, 1); + GL11.glRotatef(rotation, 0, -1, 1); renderRing(0.0118f); - GL11.glPopMatrix(); } diff --git a/src/main/java/com/silvermoon/boxplusplus/common/tileentities/GTMachineBox.java b/src/main/java/com/silvermoon/boxplusplus/common/tileentities/GTMachineBox.java index 9c7a0f5..5374f95 100644 --- a/src/main/java/com/silvermoon/boxplusplus/common/tileentities/GTMachineBox.java +++ b/src/main/java/com/silvermoon/boxplusplus/common/tileentities/GTMachineBox.java @@ -1297,7 +1297,10 @@ && checkPiece(STRUCTURE_PIECE_Final, 23, 5, 20)) { return false; } } - if (teBoxRing != null && ringCount == 3) teBoxRing.renderStatus = true; + if (teBoxRing != null) { + teBoxRing.renderStatus = true; + teBoxRing.count = ringCount; + } return true; } diff --git a/src/main/java/com/silvermoon/boxplusplus/common/tileentities/TEBoxRing.java b/src/main/java/com/silvermoon/boxplusplus/common/tileentities/TEBoxRing.java index 1582539..17aeff9 100644 --- a/src/main/java/com/silvermoon/boxplusplus/common/tileentities/TEBoxRing.java +++ b/src/main/java/com/silvermoon/boxplusplus/common/tileentities/TEBoxRing.java @@ -2,6 +2,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.MathHelper; import cpw.mods.fml.relauncher.Side; import micdoodle8.mods.galacticraft.core.tile.TileEntityAdvanced; @@ -10,13 +11,13 @@ public class TEBoxRing extends TileEntityAdvanced { @Annotations.NetworkedField(targetSide = Side.CLIENT) - public double scale = 1; + public float scale = 1; @Annotations.NetworkedField(targetSide = Side.CLIENT) - public double rotation = 0; + public float rotation = 0; @Annotations.NetworkedField(targetSide = Side.CLIENT) - public double prevRotation = 0; + public float prevRotation = 0; @Annotations.NetworkedField(targetSide = Side.CLIENT) public boolean renderStatus = false; @@ -24,7 +25,10 @@ public class TEBoxRing extends TileEntityAdvanced { @Annotations.NetworkedField(targetSide = Side.CLIENT) public boolean teRingSwitch = true; - private static final double ROTATION_SPEED = 1.2; + @Annotations.NetworkedField(targetSide = Side.CLIENT) + public int count = 1; + + private static float ROTATION_SPEED = 1.2f; @Override public AxisAlignedBB getRenderBoundingBox() { @@ -40,18 +44,20 @@ public double getMaxRenderDistanceSquared() { public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); nbt.setBoolean("renderStatus", renderStatus); - nbt.setDouble("scale", scale); - nbt.setDouble("rotation", rotation); + nbt.setFloat("scale", scale); + nbt.setFloat("rotation", rotation); nbt.setBoolean("switch", teRingSwitch); + nbt.setInteger("count", count); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); renderStatus = nbt.getBoolean("renderStatus"); - rotation = nbt.getDouble("rotation"); - scale = nbt.getDouble("scale"); + rotation = nbt.getFloat("rotation"); + scale = nbt.getFloat("scale"); teRingSwitch = nbt.getBoolean("switch"); + count = nbt.getInteger("count"); } @Override @@ -73,15 +79,12 @@ public boolean isNetworkedTile() { public void updateEntity() { super.updateEntity(); prevRotation = rotation; - rotation = (rotation + ROTATION_SPEED) % 360d; + rotation = (rotation + ROTATION_SPEED) % 360f; } - public double getInterpolatedRotation(float partialTicks) { - double delta = rotation - prevRotation; - - if (delta < -180.0) delta += 360.0; - if (delta > 180.0) delta -= 360.0; - - return (prevRotation + delta * partialTicks) % 360.0; + public float getInterpolatedRotation(float partialTicks) { + float delta = MathHelper.wrapAngleTo180_float(rotation - prevRotation); + return prevRotation + delta * partialTicks; } + } diff --git a/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiContainer.java b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiContainer.java new file mode 100644 index 0000000..76cf690 --- /dev/null +++ b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiContainer.java @@ -0,0 +1,13 @@ +package com.silvermoon.boxplusplus.mixins; + +import net.minecraft.client.gui.inventory.GuiContainer; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = GuiContainer.class) +public interface AccessorGuiContainer { + + @Accessor("guiTop") + int getGuiTop(); +} diff --git a/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiRecipe.java b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiRecipe.java new file mode 100644 index 0000000..23eb8c8 --- /dev/null +++ b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiRecipe.java @@ -0,0 +1,28 @@ +package com.silvermoon.boxplusplus.mixins; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; +import org.spongepowered.asm.mixin.gen.Invoker; + +import codechicken.nei.recipe.GuiOverlayButton; +import codechicken.nei.recipe.GuiRecipe; +import codechicken.nei.recipe.HandlerInfo; + +@Mixin(value = GuiRecipe.class, remap = false) +public interface AccessorGuiRecipe { + + @Invoker("getRecipesPerPage") + int invokeGetRecipesPerPage(); + + @Accessor("BUTTON_HEIGHT") + int getButtonHeight(); + + @Accessor("BUTTON_WIDTH") + int getButtonWidth(); + + @Accessor("handlerInfo") + HandlerInfo getHandlerInfo(); + + @Accessor("overlayButtons") + GuiOverlayButton[] getOverlayButtons(); +} diff --git a/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiScreen.java b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiScreen.java new file mode 100644 index 0000000..8b68f5b --- /dev/null +++ b/src/main/java/com/silvermoon/boxplusplus/mixins/AccessorGuiScreen.java @@ -0,0 +1,16 @@ +package com.silvermoon.boxplusplus.mixins; + +import java.util.List; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(value = GuiScreen.class) +public interface AccessorGuiScreen { + + @Accessor("buttonList") + List getButtonList(); +} diff --git a/src/main/resources/mixins.boxplusplus.json b/src/main/resources/mixins.boxplusplus.json new file mode 100644 index 0000000..7249d2b --- /dev/null +++ b/src/main/resources/mixins.boxplusplus.json @@ -0,0 +1,15 @@ +{ + "required": true, + "minVersion": "0.8.5-GTNH", + "package": "com.silvermoon.boxplusplus.mixins", + "refmap": "mixins.boxplusplus.refmap.json", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_8", + "mixins": [], + "client": [ + "AccessorGuiContainer", + "AccessorGuiRecipe", + "AccessorGuiScreen" + ], + "server": [] +}