aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/tileentities/debug
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/common/tileentities/debug')
-rw-r--r--src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java439
1 files changed, 439 insertions, 0 deletions
diff --git a/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java b/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java
new file mode 100644
index 0000000000..f143ec556e
--- /dev/null
+++ b/src/main/java/gregtech/common/tileentities/debug/GT_MetaTileEntity_AdvDebugStructureWriter.java
@@ -0,0 +1,439 @@
+package gregtech.common.tileentities.debug;
+
+import static gregtech.GT_Mod.GT_FML_LOGGER;
+import static net.minecraft.util.StatCollector.translateToLocal;
+
+import java.util.HashMap;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
+import net.minecraftforge.client.event.RenderWorldLastEvent;
+import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.common.util.ForgeDirection;
+
+import org.lwjgl.opengl.GL11;
+
+import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
+import com.gtnewhorizon.structurelib.structure.StructureUtility;
+import com.gtnewhorizon.structurelib.util.Vec3Impl;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
+import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
+import gregtech.api.metatileentity.MetaTileEntity;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_TieredMachineBlock;
+import gregtech.api.render.TextureFactory;
+
+public class GT_MetaTileEntity_AdvDebugStructureWriter extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddGregtechLogo, IAddUIWidgets {
+
+ private static final HashMap<GT_MetaTileEntity_AdvDebugStructureWriter, BoundHighlighter> bondingBoxes = new HashMap<>(
+ 1);
+ private final BoundHighlighter boundingBox = new BoundHighlighter();
+ private final short[] numbers = new short[6];
+ private boolean transpose = false;
+ private boolean showHighlightBox = true;
+ private String[] result = new String[] { "Undefined" };
+
+ public GT_MetaTileEntity_AdvDebugStructureWriter(int aID, String aName, String aNameRegional, int aTier) {
+ super(aID, aName, aNameRegional, aTier, 0, "");
+ }
+
+ public GT_MetaTileEntity_AdvDebugStructureWriter(String aName, int aTier, String aDescription,
+ ITexture[][][] aTextures) {
+ super(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ @Override
+ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
+ return new GT_MetaTileEntity_AdvDebugStructureWriter(mName, mTier, "", mTextures);
+ }
+
+ @Override
+ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirection sideDirection,
+ ForgeDirection facingDirection, int colorIndex, boolean active, boolean redstoneLevel) {
+ return new ITexture[] {
+ Textures.BlockIcons.MACHINE_CASINGS[mTier][colorIndex + 1], sideDirection != facingDirection
+ ? TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.OVERLAY_TELEPORTER_ACTIVE)
+ .glow()
+ .build())
+ : TextureFactory.of(
+ TextureFactory.builder()
+ .addIcon(Textures.BlockIcons.STRUCTURE_MARK)
+ .glow()
+ .build()) };
+ }
+
+ @Override
+ public ITexture[][][] getTextureSet(ITexture[] aTextures) {
+ return null;
+ }
+
+ @Override
+ public boolean allowPutStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public boolean allowPullStack(IGregTechTileEntity iGregTechTileEntity, int i, ForgeDirection b,
+ ItemStack itemStack) {
+ return false;
+ }
+
+ @Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ aNBT.setShort("eData" + i, numbers[i]);
+ }
+ aNBT.setBoolean("Transpose", transpose);
+ aNBT.setBoolean("HighlightBox", showHighlightBox);
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ for (int i = 0; i < numbers.length; i++) {
+ numbers[i] = aNBT.getShort("eData" + i);
+ }
+ transpose = aNBT.getBoolean("Transpose");
+ showHighlightBox = aNBT.getBoolean("HighlightBox");
+ }
+
+ @Override
+ public boolean isSimpleMachine() {
+ return false;
+ }
+
+ @Override
+ public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) {
+ super.onFirstTick(aBaseMetaTileEntity);
+ bondingBoxes.put(this, boundingBox);
+ }
+
+ @Override
+ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
+ if (aBaseMetaTileEntity.isServerSide()) {
+ ExtendedFacing writerFacing = ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing());
+ double[] abc = new double[3];
+ double[] xyz = new double[3];
+ boundingBox.dim = aBaseMetaTileEntity.getWorld().provider.dimensionId;
+ boundingBox.showHighlightBox = showHighlightBox;
+ abc[0] = -numbers[0] - 0.5;
+ abc[1] = -numbers[1] - 0.5;
+ abc[2] = -numbers[2] - 0.5;
+ writerFacing.getWorldOffset(abc, xyz);
+ boundingBox.pos1 = new Vec3Impl(
+ aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5),
+ aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5),
+ aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5));
+ abc[0] = -numbers[0] + numbers[3] - 0.5;
+ abc[1] = -numbers[1] + numbers[4] - 0.5;
+ abc[2] = -numbers[2] + numbers[5] - 0.5;
+ writerFacing.getWorldOffset(abc, xyz);
+ boundingBox.pos2 = new Vec3Impl(
+ aBaseMetaTileEntity.getXCoord() + (int) (xyz[0] + 0.5),
+ aBaseMetaTileEntity.getYCoord() + (int) (xyz[1] + 0.5),
+ aBaseMetaTileEntity.getZCoord() + (int) (xyz[2] + 0.5));
+ }
+ }
+
+ @Override
+ public void onRemoval() {
+ bondingBoxes.remove(this);
+ }
+
+ @Override
+ public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity();
+ printStructure(aPlayer);
+ aBaseMetaTileEntity.disableWorking();
+ }
+
+ public void printStructure(EntityPlayer aPlayer) {
+ IGregTechTileEntity aBaseMetaTileEntity = getBaseMetaTileEntity();
+ String pseudoJavaCode = StructureUtility.getPseudoJavaCode(
+ aBaseMetaTileEntity.getWorld(),
+ ExtendedFacing.of(aBaseMetaTileEntity.getFrontFacing()),
+ aBaseMetaTileEntity.getXCoord(),
+ aBaseMetaTileEntity.getYCoord(),
+ aBaseMetaTileEntity.getZCoord(),
+ numbers[0],
+ numbers[1],
+ numbers[2],
+ te -> te.getClass()
+ .getCanonicalName(),
+ numbers[3],
+ numbers[4],
+ numbers[5],
+ transpose);
+ GT_FML_LOGGER.info(pseudoJavaCode);
+ result = pseudoJavaCode.split("\\n");
+ aPlayer.addChatMessage(
+ new ChatComponentTranslation(translateToLocal("GT5U.machines.advdebugstructurewriter.printed")));
+ }
+
+ @Override
+ public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return true;
+ }
+
+ @Override
+ public boolean isFacingValid(ForgeDirection facing) {
+ return true;
+ }
+
+ @Override
+ public boolean isElectric() {
+ return false;
+ }
+
+ @Override
+ public boolean isAccessAllowed(EntityPlayer aPlayer) {
+ return true;
+ }
+
+ @Override
+ public String[] getDescription() {
+ return new String[] { translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip"), // Scans Blocks Around
+ translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.1"), // Prints Multiblock NonTE
+ // structure check code
+ translateToLocal("GT5U.machines.advdebugstructurewriter.tooltip.2") // ABC axes aligned to machine front
+ };
+ }
+
+ @Override
+ public boolean isGivingInformation() {
+ return true;
+ }
+
+ @Override
+ public String[] getInfoData() {
+ return result;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setSize(90, 112)
+ .setPos(43, 4))
+ .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (getBaseMetaTileEntity().isServerSide()) {
+ printStructure(
+ widget.getContext()
+ .getPlayer());
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_PRINT)
+ .setSize(18, 18)
+ .setPos(11, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.print.tooltip")))
+ .widget(
+ new CycleButtonWidget().setToggle(() -> transpose, aBoolean -> transpose = aBoolean)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_TRANSPOSE)
+ .setSize(18, 18)
+ .setPos(32, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.transpose.tooltip")))
+ .widget(
+ new CycleButtonWidget().setToggle(() -> showHighlightBox, aBoolean -> showHighlightBox = aBoolean)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_BOUNDING_BOX)
+ .setSize(18, 18)
+ .setPos(53, 128)
+ .addTooltip(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.highlight.tooltip")))
+ .widget(
+ new MultiChildWidget()
+ .addChild(
+ new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.origin"))
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 0))
+ .addChild(
+ TextWidget.dynamicString(() -> "A: " + numbers[0])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 10))
+ .addChild(
+ TextWidget.dynamicString(() -> "B: " + numbers[1])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 18))
+ .addChild(
+ TextWidget.dynamicString(() -> "C: " + numbers[2])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 26))
+ .addChild(
+ new TextWidget(translateToLocal("GT5U.machines.advdebugstructurewriter.gui.size"))
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 52))
+ .addChild(
+ TextWidget.dynamicString(() -> "A: " + numbers[3])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 62))
+ .addChild(
+ TextWidget.dynamicString(() -> "B: " + numbers[4])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 70))
+ .addChild(
+ TextWidget.dynamicString(() -> "C: " + numbers[5])
+ .setDefaultColor(0xf0f0ff)
+ .setPos(0, 78))
+ .setPos(46, 8));
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_LARGE, -512, -64, 7);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_MINUS_SMALL, -16, -1, 25);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_SMALL, 16, 1, 133);
+ addChangeNumberButtons(builder, GT_UITextures.OVERLAY_BUTTON_PLUS_LARGE, 512, 64, 151);
+ }
+
+ private void addChangeNumberButtons(ModularWindow.Builder builder, IDrawable overlay, int addNumberShift,
+ int addNumber, int xPos) {
+ int[] yPos = new int[] { 4, 22, 40, 62, 80, 98 };
+ for (int i = 0; i < yPos.length; i++) {
+ final int index = i; // needed for lambda
+ builder.widget(
+ new ButtonWidget()
+ .setOnClick((clickData, widget) -> numbers[index] += clickData.shift ? addNumberShift : addNumber)
+ .setBackground(GT_UITextures.BUTTON_STANDARD, overlay)
+ .setSize(18, 18)
+ .setPos(xPos, yPos[index]));
+ }
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return new GUITextureSet().setGregTechLogo(GT_UITextures.PICTURE_GT_LOGO_17x17_TRANSPARENT_GRAY);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(
+ new DrawableWidget().setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(113, 96));
+ }
+
+ @Override
+ public boolean doesBindPlayerInventory() {
+ return false;
+ }
+
+ public static class ForgeEventHandler {
+
+ public ForgeEventHandler() {
+ MinecraftForge.EVENT_BUS.register(this);
+ }
+
+ @SuppressWarnings("unused")
+ @SideOnly(Side.CLIENT)
+ @SubscribeEvent
+ public void onRenderWorldLast(RenderWorldLastEvent e) {
+ for (BoundHighlighter boundingBox : bondingBoxes.values()) {
+ boundingBox.renderHighlightedBlock(e);
+ }
+ }
+ }
+
+ private static class BoundHighlighter {
+
+ public Vec3Impl pos1;
+ public Vec3Impl pos2;
+ public boolean showHighlightBox;
+ public int dim;
+
+ @SideOnly(Side.CLIENT)
+ private void renderHighlightedBlock(RenderWorldLastEvent event) {
+ if (pos1 == null || pos2 == null || !showHighlightBox) {
+ return;
+ }
+ Minecraft mc = Minecraft.getMinecraft();
+ int dimension = mc.theWorld.provider.dimensionId;
+
+ if (dimension != dim) {
+ pos1 = null;
+ pos2 = null;
+ return;
+ }
+
+ EntityPlayerSP p = mc.thePlayer;
+ double doubleX = p.lastTickPosX + (p.posX - p.lastTickPosX) * event.partialTicks;
+ double doubleY = p.lastTickPosY + (p.posY - p.lastTickPosY) * event.partialTicks;
+ double doubleZ = p.lastTickPosZ + (p.posZ - p.lastTickPosZ) * event.partialTicks;
+
+ GL11.glPushMatrix();
+ GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
+ GL11.glLineWidth(3);
+ GL11.glTranslated(-doubleX, -doubleY, -doubleZ);
+
+ GL11.glDisable(GL11.GL_DEPTH_TEST);
+ GL11.glDisable(GL11.GL_TEXTURE_2D);
+
+ GL11.glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
+ renderHighLightedArenaOutline(pos1.get0(), pos1.get1(), pos1.get2(), pos2.get0(), pos2.get1(), pos2.get2());
+
+ GL11.glPopAttrib();
+ GL11.glPopMatrix();
+ }
+
+ @SideOnly(Side.CLIENT)
+ static void renderHighLightedArenaOutline(double x1, double y1, double z1, double x2, double y2, double z2) {
+ GL11.glBegin(GL11.GL_LINE_STRIP);
+
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x1, y2, z1);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x1, y1, z2);
+ GL11.glVertex3d(x1, y1, z1);
+
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x2, y1, z1);
+
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x1, y1, z2);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x1, y1, z1);
+ GL11.glVertex3d(x2, y1, z1);
+ GL11.glVertex3d(x2, y2, z1);
+ GL11.glVertex3d(x1, y2, z1);
+ GL11.glVertex3d(x1, y2, z2);
+ GL11.glVertex3d(x2, y2, z2);
+ GL11.glVertex3d(x2, y1, z2);
+ GL11.glVertex3d(x1, y1, z2);
+
+ GL11.glEnd();
+ }
+ }
+}