diff --git a/src/main/java/gregtech/api/GregTechAPI.java b/src/main/java/gregtech/api/GregTechAPI.java index e10c7735798..e9cfe16237b 100644 --- a/src/main/java/gregtech/api/GregTechAPI.java +++ b/src/main/java/gregtech/api/GregTechAPI.java @@ -246,6 +246,7 @@ public class GregTechAPI { public static Block sBlockTintedGlass; public static Block sLaserRender; public static Block sWormholeRender; + public static Block sBlackholeRender; /** * Getting assigned by the Config */ diff --git a/src/main/java/gregtech/api/enums/Textures.java b/src/main/java/gregtech/api/enums/Textures.java index bd90cfe8aba..4eace204e6e 100644 --- a/src/main/java/gregtech/api/enums/Textures.java +++ b/src/main/java/gregtech/api/enums/Textures.java @@ -346,6 +346,21 @@ public enum BlockIcons implements IIconContainer, Runnable { OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING, OVERLAY_FRONT_MULTI_COMPRESSOR_COOLING_GLOW, + OVERLAY_HATCH_HEAT_SENSOR, + OVERLAY_HATCH_HEAT_SENSOR_GLOW, + + OVERLAY_MULTI_NEUTRONIUM, + OVERLAY_MULTI_NEUTRONIUM_GLOW, + OVERLAY_MULTI_NEUTRONIUM_ACTIVE, + OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW, + + OVERLAY_MULTI_BLACKHOLE, + OVERLAY_MULTI_BLACKHOLE_GLOW, + OVERLAY_MULTI_BLACKHOLE_ACTIVE, + OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW, + OVERLAY_MULTI_BLACKHOLE_UNSTABLE, + OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW, + OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR, OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE, OVERLAY_FRONT_INDUSTRIAL_EXTRACTOR_ACTIVE_GLOW, @@ -1343,9 +1358,6 @@ public enum BlockIcons implements IIconContainer, Runnable { OVERLAY_HATCH_PH_SENSOR, OVERLAY_HATCH_PH_SENSOR_GLOW, - OVERLAY_HATCH_BLACKHOLE, - OVERLAY_HATCH_BLACKHOLE_GLOW, - STRUCTURE_MARK, MV_TOP_CYCLOTRON_SOLENOID, diff --git a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java index ee83857953f..0bfff978954 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java @@ -14,6 +14,7 @@ import static gregtech.api.metatileentity.BaseTileEntity.STALLED_VENT_TOOLTIP; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import static gregtech.api.metatileentity.BaseTileEntity.UNUSED_SLOT_TOOLTIP; +import static gregtech.api.util.GTRecipeConstants.COMPRESSION_TIER; import static gregtech.api.util.GTRecipeConstants.EXPLODE; import static gregtech.api.util.GTRecipeConstants.ON_FIRE; import static gregtech.api.util.GTUtility.moveMultipleItemStacks; @@ -1078,7 +1079,7 @@ public int checkRecipe(boolean skipOC) { getBaseMetaTileEntity().setOnFire(); return DID_NOT_FIND_RECIPE; } - + if (tRecipe.getMetadataOrDefault(COMPRESSION_TIER, 0) > 0) return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; if (GTMod.gregtechproxy.mLowGravProcessing && (tRecipe.mSpecialValue == -100 || tRecipe.mSpecialValue == -300) && !isValidForLowGravity(tRecipe, getBaseMetaTileEntity().getWorld().provider.dimensionId)) return FOUND_RECIPE_BUT_DID_NOT_MEET_REQUIREMENTS; diff --git a/src/main/java/gregtech/common/GTClient.java b/src/main/java/gregtech/common/GTClient.java index 127c801b406..276bc7a78a9 100644 --- a/src/main/java/gregtech/common/GTClient.java +++ b/src/main/java/gregtech/common/GTClient.java @@ -91,6 +91,7 @@ import gregtech.client.SeekingOggCodec; import gregtech.common.blocks.BlockFrameBox; import gregtech.common.blocks.ItemMachines; +import gregtech.common.render.BlackholeRenderer; import gregtech.common.render.DroneRender; import gregtech.common.render.FlaskRenderer; import gregtech.common.render.FluidDisplayStackRenderer; @@ -631,6 +632,7 @@ public void onLoad() { new DroneRender(); new LaserRenderer(); new WormholeRenderer(); + new BlackholeRenderer(); metaGeneratedItemRenderer = new MetaGeneratedItemRenderer(); for (MetaGeneratedItem item : MetaGeneratedItem.sInstances.values()) { diff --git a/src/main/java/gregtech/common/blocks/BlockBlackholeRenderer.java b/src/main/java/gregtech/common/blocks/BlockBlackholeRenderer.java new file mode 100644 index 00000000000..84d61172c3f --- /dev/null +++ b/src/main/java/gregtech/common/blocks/BlockBlackholeRenderer.java @@ -0,0 +1,74 @@ +package gregtech.common.blocks; + +import java.util.ArrayList; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtech.common.tileentities.render.TileEntityBlackhole; + +public class BlockBlackholeRenderer extends Block { + + public BlockBlackholeRenderer() { + super(Material.iron); + this.setResistance(20f); + this.setHardness(-1.0f); + this.setBlockName("BlackHoleRenderer"); + this.setLightLevel(100.0f); + GameRegistry.registerBlock(this, getUnlocalizedName()); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconRegister) { + blockIcon = iconRegister.registerIcon("gregtech:iconsets/TRANSPARENT"); + } + + @Override + public String getUnlocalizedName() { + return "gt.blackholerenderer"; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean canRenderInPass(int a) { + return true; + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean hasTileEntity(int metadata) { + return true; + } + + @Override + public TileEntity createTileEntity(World world, int metadata) { + return new TileEntityBlackhole(); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int meta, int fortune) { + return new ArrayList<>(); + } + + @Override + public boolean isCollidable() { + return true; + } + +} diff --git a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java index ab9917435cc..5fcb02b6579 100644 --- a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java +++ b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java @@ -3203,14 +3203,14 @@ public MetaGeneratedItem01() { ItemList.Black_Hole_Opener.set( addItem( Black_Hole_Opener.ID, - "Black Hole Activation Catalyst", + "Black Hole Seed", "Opens a semi-stable black hole", new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 32), new TCAspects.TC_AspectStack(TCAspects.ORDO, 64))); ItemList.Black_Hole_Closer.set( addItem( Black_Hole_Closer.ID, - "Black Hole Deactivation Catalyst", + "Black Hole Collapser", "Safely closes a semi-stable black hole", new TCAspects.TC_AspectStack(TCAspects.ALIENIS, 32), new TCAspects.TC_AspectStack(TCAspects.PERDITIO, 64))); diff --git a/src/main/java/gregtech/common/render/BlackholeRenderer.java b/src/main/java/gregtech/common/render/BlackholeRenderer.java new file mode 100644 index 00000000000..733bd3aa9ea --- /dev/null +++ b/src/main/java/gregtech/common/render/BlackholeRenderer.java @@ -0,0 +1,222 @@ +package gregtech.common.render; + +import static gregtech.api.enums.Mods.GregTech; + +import java.nio.FloatBuffer; + +import net.minecraft.client.renderer.ActiveRenderInfo; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.model.AdvancedModelLoader; + +import org.joml.Matrix4fStack; +import org.joml.Vector4f; +import org.lwjgl.BufferUtils; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL20; + +import com.gtnewhorizon.gtnhlib.client.renderer.CapturingTessellator; +import com.gtnewhorizon.gtnhlib.client.renderer.TessellatorManager; +import com.gtnewhorizon.gtnhlib.client.renderer.shader.ShaderProgram; +import com.gtnewhorizon.gtnhlib.client.renderer.vbo.IModelCustomExt; +import com.gtnewhorizon.gtnhlib.client.renderer.vbo.VertexBuffer; +import com.gtnewhorizon.gtnhlib.client.renderer.vertex.DefaultVertexFormat; + +import cpw.mods.fml.client.registry.ClientRegistry; +import gregtech.common.tileentities.render.TileEntityBlackhole; + +public class BlackholeRenderer extends TileEntitySpecialRenderer { + + private boolean initialized = false; + + private ShaderProgram blackholeProgram; + private static int u_CameraPosition = -1, u_Scale = -1, u_Time = -1, u_Stability = -1; + private static final Matrix4fStack modelMatrixStack = new Matrix4fStack(4); + + private static IModelCustomExt blackholeModel; + private static ResourceLocation blackholeTexture; + private static float modelScale = .5f; + + private ShaderProgram laserProgram; + private static int u_LaserCameraPosition = -1, u_LaserColor = -1, u_LaserModelMatrix = -1; + private static VertexBuffer laserVBO; + private static ResourceLocation laserTexture; + + private static final Matrix4fStack modelMatrix = new Matrix4fStack(2); + + private static final float WIDTH = .1f; + private static final float EXCLUSION = 1f; + + public BlackholeRenderer() { + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityBlackhole.class, this); + } + + private void init() { + try { + blackholeProgram = new ShaderProgram( + GregTech.resourceDomain, + "shaders/blackhole.vert.glsl", + "shaders/blackhole.frag.glsl"); + + u_CameraPosition = blackholeProgram.getUniformLocation("u_CameraPosition"); + + u_Scale = blackholeProgram.getUniformLocation("u_Scale"); + u_Time = blackholeProgram.getUniformLocation("u_Time"); + u_Stability = blackholeProgram.getUniformLocation("u_Stability"); + + } catch (Exception e) { + System.out.println(e.getMessage()); + return; + } + + blackholeModel = (IModelCustomExt) AdvancedModelLoader + .loadModel(new ResourceLocation(GregTech.resourceDomain, "textures/model/blackhole.obj")); + blackholeTexture = new ResourceLocation(GregTech.resourceDomain, "textures/model/blackhole.png"); + + blackholeProgram.use(); + GL20.glUniform1f(u_Scale, modelScale); + GL20.glUniform1f(u_Stability, .1f); + ShaderProgram.clear(); + + try { + laserProgram = new ShaderProgram( + GregTech.resourceDomain, + "shaders/laser.vert.glsl", + "shaders/laser.frag.glsl"); + u_LaserCameraPosition = laserProgram.getUniformLocation("u_CameraPosition"); + u_LaserColor = laserProgram.getUniformLocation("u_Color"); + u_LaserModelMatrix = laserProgram.getUniformLocation("u_ModelMatrix"); + + } catch (Exception e) { + System.out.println(e.getMessage()); + return; + } + + laserTexture = new ResourceLocation(GregTech.resourceDomain, "textures/model/laser.png"); + + TessellatorManager.startCapturing(); + CapturingTessellator tess = (CapturingTessellator) TessellatorManager.get(); + + tess.startDrawingQuads(); + + tess.addVertexWithUV(.5 + 8, 0, -WIDTH, 0, 0); + tess.addVertexWithUV(.5 + 8, 0, WIDTH, 0, 1); + tess.addVertexWithUV(EXCLUSION, 0, WIDTH / 5, 1, 1); + tess.addVertexWithUV(EXCLUSION, 0, -WIDTH / 5, 1, 0); + + tess.addVertexWithUV(-.5 - 8, 0, -WIDTH, 0, 0); + tess.addVertexWithUV(-.5 - 8, 0, WIDTH, 0, 1); + tess.addVertexWithUV(-EXCLUSION, 0, WIDTH / 5, 1, 1); + tess.addVertexWithUV(-EXCLUSION, 0, -WIDTH / 5, 1, 0); + + tess.draw(); + + laserVBO = TessellatorManager.stopCapturingToVBO(DefaultVertexFormat.POSITION_TEXTURE_NORMAL); + + initialized = true; + } + + private void renderBlackHole(TileEntityBlackhole tile, double x, double y, double z, float timer) { + + blackholeProgram.use(); + bindTexture(blackholeTexture); + GL20.glUniform1f(u_Stability, tile.getStability()); + modelMatrixStack.clear(); + + float xLocal = ((float) x + .5f); + float yLocal = ((float) y + .5f); + float zLocal = ((float) z + .5f); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glPushMatrix(); + GL20.glUniform3f( + u_CameraPosition, + ActiveRenderInfo.objectX - xLocal, + ActiveRenderInfo.objectY - yLocal, + ActiveRenderInfo.objectZ - zLocal); + + GL20.glUniform1f(u_Time, timer); + GL11.glTranslated(x + .5f, y + .5f, z + .5f); + blackholeModel.renderAllVBO(); + + GL11.glPopMatrix(); + GL11.glPopAttrib(); + ShaderProgram.clear(); + } + + private void renderLasers(TileEntityBlackhole tile, double x, double y, double z, float timer) { + laserProgram.use(); + bindTexture(laserTexture); + + float cx = ((float) x + .5f); + float cy = ((float) y + .5f); + float cz = ((float) z + .5f); + GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS); + GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glPushMatrix(); + GL20.glUniform3f(u_LaserColor, tile.getLaserR(), tile.getLaserG(), tile.getLaserB()); + + modelMatrix.clear(); + modelMatrix.translate(cx, cy, cz); + + // First set + FloatBuffer matrixBuffer = BufferUtils.createFloatBuffer(16); + GL20.glUniformMatrix4(u_LaserModelMatrix, false, modelMatrix.get(matrixBuffer)); + modelMatrix.pushMatrix(); + modelMatrix.invert(); + Vector4f cameraPosition = new Vector4f( + ActiveRenderInfo.objectX, + ActiveRenderInfo.objectY, + ActiveRenderInfo.objectZ, + 1); + cameraPosition = modelMatrix.transform(cameraPosition); + GL20.glUniform3f(u_LaserCameraPosition, cameraPosition.x, cameraPosition.y, cameraPosition.z); + laserVBO.render(); + + // Second set + + modelMatrix.popMatrix(); + matrixBuffer.clear(); + modelMatrix.rotate((float) Math.PI / 2, 0, 1, 0); + + GL20.glUniformMatrix4(u_LaserModelMatrix, false, modelMatrix.get(matrixBuffer)); + + modelMatrix.invert(); + cameraPosition.set(ActiveRenderInfo.objectX, ActiveRenderInfo.objectY, ActiveRenderInfo.objectZ, 1); + cameraPosition = modelMatrix.transform(cameraPosition); + GL20.glUniform3f(u_LaserCameraPosition, cameraPosition.x, cameraPosition.y, cameraPosition.z); + laserVBO.render(); + + GL11.glPopMatrix(); + GL11.glPopAttrib(); + ShaderProgram.clear(); + } + + public void renderTileEntityAt(TileEntity tile, double x, double y, double z, float timeSinceLastTick) { + if (!(tile instanceof TileEntityBlackhole blackhole)) return; + + if (!initialized) { + init(); + if (!initialized) return; + } + if (((TileEntityBlackhole) tile).getLaserRender()) { + renderLasers( + blackhole, + x, + y, + z, + tile.getWorldObj() + .getWorldTime() + timeSinceLastTick); + } + + renderBlackHole( + blackhole, + x, + y, + z, + tile.getWorldObj() + .getWorldTime() + timeSinceLastTick); + + } + +} diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java index ba893e045d5..367b529bc3e 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java @@ -1,16 +1,20 @@ package gregtech.common.tileentities.machines.multi.compressor; +import static bartworks.util.BWTooltipReference.TT; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.enums.GTValues.AuthorFourIsTheNumber; import static gregtech.api.enums.GTValues.Ollie; import static gregtech.api.enums.HatchElement.*; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE_UNSTABLE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW; import static gregtech.api.util.GTStructureUtility.buildHatchAdder; import static gregtech.api.util.GTStructureUtility.ofFrame; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -20,6 +24,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -42,11 +47,13 @@ import gregtech.api.enums.MaterialsUEVplus; import gregtech.api.enums.Textures; import gregtech.api.gui.modularui.GTUITextures; +import gregtech.api.interfaces.IIconContainer; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.logic.ProcessingLogic; import gregtech.api.metatileentity.implementations.MTEExtendedPowerMultiBlockBase; +import gregtech.api.metatileentity.implementations.MTEHatchEnergy; import gregtech.api.metatileentity.implementations.MTEHatchInput; import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.RecipeMaps; @@ -57,8 +64,10 @@ import gregtech.api.util.GTRecipe; import gregtech.api.util.GTUtility; import gregtech.api.util.MultiblockTooltipBuilder; +import gregtech.api.util.OverclockCalculator; import gregtech.common.blocks.BlockCasings10; import gregtech.common.items.MetaGeneratedItem01; +import gregtech.common.tileentities.render.TileEntityBlackhole; import gtPlusPlus.core.util.minecraft.PlayerUtils; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -111,7 +120,8 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase spacetimeHatches = new ArrayList<>(); + + /** + * 1: Off + * 2: On, stable + * 3: On, unstable + */ + private byte blackHoleStatus = 1; private final FluidStack blackholeCatalyzingCost = (MaterialsUEVplus.SpaceTime).getMolten(1); private int catalyzingCostModifier = 1; @@ -143,6 +159,22 @@ public MTEBlackHoleCompressor(String aName) { super(aName); } + private boolean addSpacetimeInput(IGregTechTileEntity aTileEntity, int aBaseCasingIndex) { + if (aTileEntity != null) { + if (aTileEntity.getMetaTileEntity() instanceof MTEHatchInput hatch) { + hatch.updateTexture(aBaseCasingIndex); + spacetimeHatches.add(hatch); + return true; + } + } + return false; + } + + @Override + protected boolean filtersFluid() { + return false; + } + @Override public IStructureDefinition getStructureDefinition() { return STRUCTURE_DEFINITION; @@ -171,15 +203,39 @@ public void setMachineModeIcons() { @Override public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) { - setMachineMode(nextMachineMode()); - PlayerUtils.messagePlayer( - aPlayer, - String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); + if (aPlayer.isSneaking()) { + shouldRender = !shouldRender; + if (!shouldRender) { + PlayerUtils.messagePlayer(aPlayer, "Rendering off"); + rendererTileEntity = null; + destroyRenderBlock(); + } else { + if (blackHoleStatus != 1) createRenderBlock(); + PlayerUtils.messagePlayer(aPlayer, "Rendering on"); + } + } else { + setMachineMode(nextMachineMode()); + PlayerUtils.messagePlayer( + aPlayer, + String.format(StatCollector.translateToLocal("GT5U.MULTI_MACHINE_CHANGE"), getMachineModeName())); + } } @Override public String getMachineModeName() { - return StatCollector.translateToLocal("GT5U.COMPRESSION_TIER.mode." + machineMode); + return StatCollector.translateToLocal("GT5U.BLACKHOLE.mode." + machineMode); + } + + @Override + public void onValueUpdate(byte aValue) { + byte oBlackHoleStatus = blackHoleStatus; + blackHoleStatus = aValue; + if (oBlackHoleStatus != blackHoleStatus) getBaseMetaTileEntity().issueTextureUpdate(); + } + + @Override + public byte getUpdateData() { + return blackHoleStatus; } @Override @@ -187,33 +243,36 @@ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirect int colorIndex, boolean aActive, boolean redstoneLevel) { ITexture[] rTexture; if (side == aFacing) { - if (aActive) { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) - .extFacing() - .glow() - .build() }; - } else { - rTexture = new ITexture[] { - Textures.BlockIcons - .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) - .extFacing() - .glow() - .build() }; + IIconContainer MAIN_OVERLAY; + IIconContainer GLOW_OVERLAY; + switch (blackHoleStatus) { + default -> { + MAIN_OVERLAY = OVERLAY_MULTI_BLACKHOLE; + GLOW_OVERLAY = OVERLAY_MULTI_BLACKHOLE_GLOW; + } + case 2 -> { + MAIN_OVERLAY = OVERLAY_MULTI_BLACKHOLE_ACTIVE; + GLOW_OVERLAY = OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW; + } + case 3 -> { + MAIN_OVERLAY = OVERLAY_MULTI_BLACKHOLE_UNSTABLE; + GLOW_OVERLAY = OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW; + } } + + rTexture = new ITexture[] { + Textures.BlockIcons + .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)), + TextureFactory.builder() + .addIcon(MAIN_OVERLAY) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(GLOW_OVERLAY) + .extFacing() + .glow() + .build() }; + } else { rTexture = new ITexture[] { Textures.BlockIcons .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 11)) }; @@ -227,78 +286,78 @@ protected MultiblockTooltipBuilder createTooltip() { tt.addMachineType("Compressor/Advanced Neutronium Compressor") .addInfo("Controller Block for the Semi-Stable Black Hole Containment Field") .addInfo(EnumChatFormatting.LIGHT_PURPLE + "Uses the immense power of the event horizon to compress things") - .addInfo("No longer requires heat management to perform perfect compression") + .addInfo("No longer requires heat management to perform superdense compression") .addInfo("Can create advanced singularities!") .addSeparator() .addInfo( "Insert a " + EnumChatFormatting.WHITE - + "Black Hole Activation Catalyst" + + "Black Hole Seed" + EnumChatFormatting.GRAY + " to open a black hole") .addInfo( "The black hole will begin its life at " + EnumChatFormatting.RED - + "100%" + + "100" + EnumChatFormatting.GRAY + " stability and slowly decay") + .addInfo( + "Stability decays by " + EnumChatFormatting.RED + + "1/s" + + EnumChatFormatting.GRAY + + " until it reaches 0") + .addInfo("At 0 stability, the black hole is " + EnumChatFormatting.DARK_RED + "UNSTABLE") + .addInfo("Once the black hole becomes unstable, it will void all inputs for recipes which require it") .addSeparator() - .addInfo("Natural decay takes " + EnumChatFormatting.RED + "100" + EnumChatFormatting.GRAY + " seconds") - .addInfo("Running recipes in the machine will slow the decay by " + EnumChatFormatting.RED + "25%") + .addInfo("Running recipes in the machine will slow the decay rate by " + EnumChatFormatting.RED + "25%") .addInfo( "The decay can be " + EnumChatFormatting.BOLD + "halted" + EnumChatFormatting.RESET + EnumChatFormatting.GRAY - + " by inserting spacetime") + + " by inserting 1 L/s of spacetime") .addInfo( "Every " + EnumChatFormatting.RED + "30" + EnumChatFormatting.GRAY - + " seconds saved by spacetime insertion will " + + " total seconds saved by spacetime insertion will " + EnumChatFormatting.RED + "double" + EnumChatFormatting.GRAY + " the cost per second!") - .addInfo("Once the black hole becomes unstable, it will void all inputs for recipes which require it") .addInfo( "Insert a " + EnumChatFormatting.WHITE - + "Black Hole Deactivation Catalyst" + + "Black Hole Collapser" + EnumChatFormatting.GRAY + " to close the black hole") + .addInfo("To restore stability and reset spacetime costs, close the black hole and open a new one") .addSeparator() .addInfo( "Recipes not utilizing the black hole have their lengths " + EnumChatFormatting.RED + "doubled" + EnumChatFormatting.GRAY + " if it becomes unstable") - .addInfo("400% faster than singleblock machines of the same voltage when black hole is open") - .addInfo("Only uses 70% of the EU/t normally required") + .addInfo("400% faster than singleblock machines of the same voltage") + .addInfo("Only uses 70% of the EU/t normally required - does not overclock above energy hatch tier") .addInfo("Gains 8 parallels per voltage tier") .addInfo( - "Parallels are " + EnumChatFormatting.RED - + "doubled" + EnumChatFormatting.RED + "2x/4x" + EnumChatFormatting.GRAY - + " when stability is BELOW " + + " parallels when stability is BELOW " + EnumChatFormatting.RED - + "50%") - .addInfo( - "Parallels are " + EnumChatFormatting.RED - + "quadrupled" - + EnumChatFormatting.GRAY - + " when stability is BELOW " - + EnumChatFormatting.RED - + "20%") + + "50/20") + .addInfo("Accepts one " + TT + " energy hatch") .addInfo(AuthorFourIsTheNumber + EnumChatFormatting.RESET + " & " + Ollie) + .addInfo("Rendering by: " + EnumChatFormatting.WHITE + "BucketBrigade") .addSeparator() .beginStructureBlock(35, 33, 35, false) - .addCasingInfoMin("Background Radiation Absorbent Casing", 985, false) + .addCasingInfoMin("Background Radiation Absorbent Casing", 950, false) .addCasingInfoExactly("Extreme Density Space-Bending Casing", 3667, false) .addCasingInfoExactly("Hawking Radiation Realignment Focus", 64, false) .addCasingInfoExactly("Naquadah Alloy Frame Box", 144, false) - .addInputBus("Behind Laser", 1) - .addOutputBus("Behind Laser", 1) - .addInputHatch("Behind Laser", 1) - .addEnergyHatch("Any Radiation Absorbent Casing", 2) - .addMaintenanceHatch("Any Radiation Absorbent Casing", 2) + .addInputHatch("Spacetime Insertion, Behind Laser", 2) + .addInputBus("Any Radiation Absorbent Casing", 1) + .addOutputBus("Any Radiation Absorbent Casing", 1) + .addInputHatch("Any Radiation Absorbent Casing", 1) + .addEnergyHatch("Any Radiation Absorbent Casing", 1) .toolTipFinisher("GregTech"); return tt; } @@ -324,9 +383,20 @@ private void onCasingAdded() { public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { mCasingAmount = 0; mEnergyHatches.clear(); + mExoticEnergyHatches.clear(); + spacetimeHatches.clear(); if (!checkPiece(STRUCTURE_PIECE_MAIN, 17, 27, 10)) return false; - if (mCasingAmount < 0) return false; + if (mCasingAmount < 950) return false; + + if (!mExoticEnergyHatches.isEmpty()) { + if (mExoticEnergyHatches.size() > 1) return false; + energyHatchTier = mExoticEnergyHatches.get(0).mTier; + } else if (!mEnergyHatches.isEmpty()) { + byte tier = mEnergyHatches.get(0).mTier; + for (MTEHatchEnergy hatch : mEnergyHatches) if (hatch.mTier < tier) tier = hatch.mTier; + energyHatchTier = tier; + } return true; } @@ -334,19 +404,21 @@ public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack a @Override public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); - aNBT.setInteger("catalyzingCostModifier", catalyzingCostModifier); - aNBT.setInteger("catalyzingCounter", catalyzingCounter); - aNBT.setBoolean("blackholeOn", blackholeOn); - aNBT.setFloat("blackholeStability", blackHoleStability); + if (aNBT.hasKey("catalyzingCounter")) catalyzingCounter = aNBT.getInteger("catalyzingCounter"); + if (aNBT.hasKey("catalyzingCostModifier")) catalyzingCostModifier = aNBT.getInteger("catalyzingCostModifier"); + if (aNBT.hasKey("blackHoleStatus")) blackHoleStatus = aNBT.getByte("blackHoleStatus"); + if (aNBT.hasKey("blackHoleStability")) blackHoleStability = aNBT.getFloat("blackHoleStability"); + if (aNBT.hasKey("shouldRender")) shouldRender = aNBT.getBoolean("shouldRender"); } @Override public void saveNBTData(NBTTagCompound aNBT) { super.saveNBTData(aNBT); - if (aNBT.hasKey("catalyzingCounter")) catalyzingCostModifier = aNBT.getInteger("catalyzingCounter"); - if (aNBT.hasKey("catalyzingCostModifier")) catalyzingCostModifier = aNBT.getInteger("catalyzingCostModifier"); - if (aNBT.hasKey("blackholeOn")) blackholeOn = aNBT.getBoolean("blackholeOn"); - if (aNBT.hasKey("blackholeStability")) blackHoleStability = aNBT.getFloat("blackholeStability"); + aNBT.setInteger("catalyzingCounter", catalyzingCounter); + aNBT.setInteger("catalyzingCostModifier", catalyzingCostModifier); + aNBT.setByte("blackHoleStatus", blackHoleStatus); + aNBT.setFloat("blackHoleStability", blackHoleStability); + aNBT.setBoolean("shouldRender", shouldRender); } @Override @@ -359,7 +431,7 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y, int z) { super.getWailaNBTData(player, tile, tag, world, x, y, z); - tag.setBoolean("blackholeOn", blackholeOn); + tag.setByte("blackHoleStatus", blackHoleStatus); tag.setFloat("blackHoleStability", blackHoleStability); } @@ -368,7 +440,7 @@ public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDat IWailaConfigHandler config) { super.getWailaBody(itemStack, currentTip, accessor, config); final NBTTagCompound tag = accessor.getNBTData(); - if (tag.getBoolean("blackholeOn")) { + if (tag.getByte("blackHoleStatus") != 1) { if (tag.getFloat("blackHoleStability") > 0) { currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Active"); currentTip.add( @@ -382,6 +454,8 @@ public void getWailaBody(ItemStack itemStack, List currentTip, IWailaDat } else currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Offline"); } + byte energyHatchTier = 0; + @Override protected ProcessingLogic createProcessingLogic() { return new ProcessingLogic() { @@ -394,15 +468,18 @@ protected Stream findRecipeMatches(@Nullable RecipeMap map) { // Deactivation resets stability to 100 and catalyzing cost to 1 for (ItemStack inputItem : inputItems) { if (inputItem.getItem() instanceof MetaGeneratedItem01) { - if (inputItem.getItemDamage() == 32418 && !blackholeOn) { + if (inputItem.getItemDamage() == 32418 && (blackHoleStatus == 1)) { inputItem.stackSize -= 1; - blackholeOn = true; + blackHoleStatus = 2; + createRenderBlock(); break; - } else if (inputItem.getItemDamage() == 32419 && blackholeOn) { + } else if (inputItem.getItemDamage() == 32419 && !(blackHoleStatus == 1)) { inputItem.stackSize -= 1; - blackholeOn = false; + blackHoleStatus = 1; blackHoleStability = 100; catalyzingCostModifier = 1; + rendererTileEntity = null; + destroyRenderBlock(); break; } } @@ -410,21 +487,34 @@ protected Stream findRecipeMatches(@Nullable RecipeMap map) { return super.findRecipeMatches(map); } + @NotNull + @Override + protected OverclockCalculator createOverclockCalculator(@NotNull GTRecipe recipe) { + int ocs = energyHatchTier - GTUtility.getTier(recipe.mEUt); + if (ocs < 0) ocs = 0; + return new OverclockCalculator().setRecipeEUt(recipe.mEUt) + .setAmperage(availableAmperage) + .setEUt(availableVoltage) + .setDuration(recipe.mDuration) + .setSpeedBoost(speedBoost) + .setEUtDiscount(euModifier) + .setAmperageOC(amperageOC) + .setDurationDecreasePerOC(overClockTimeReduction) + .setEUtIncreasePerOC(overClockPowerIncrease) + .limitOverclockCount(ocs); + } + @NotNull @Override protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { // Default speed bonus - setSpeedBonus(1F); - - // If recipe needs a black hole and one is not open, just wait - // If the recipe doesn't require black hole, incur a 0.5x speed penalty - // If recipe doesn't require black hole but one is open, give 5x speed bonus - if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { - if (!blackholeOn) return CheckRecipeResultRegistry.NO_BLACK_HOLE; - } else { - if (blackHoleStability <= 0) setSpeedBonus(5F); - else if (blackholeOn) setSpeedBonus(0.2F); + setSpeedBonus(0.2F); + if (blackHoleStatus == 1) return CheckRecipeResultRegistry.NO_BLACK_HOLE; + + // If the recipe doesn't require black hole, but it is unstable, incur a 0.5x speed penalty + if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0) == 0 && (blackHoleStatus == 3)) { + setSpeedBonus(5F); } return super.validateRecipe(recipe); } @@ -432,7 +522,7 @@ protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { @Nonnull protected CheckRecipeResult onRecipeStart(@Nonnull GTRecipe recipe) { // If recipe needs a black hole and one is active but unstable, continuously void items - if (blackHoleStability <= 0 && recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 0) { + if ((blackHoleStatus == 3) && recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0) > 0) { return CheckRecipeResultRegistry.UNSTABLE_BLACK_HOLE; } return CheckRecipeResultRegistry.SUCCESSFUL; @@ -446,29 +536,40 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); if (aTick % 20 == 0) { - if (blackholeOn && blackHoleStability >= 0) { - float stabilityDecrease = 1F; - // If the machine is running, reduce stability loss by 25% - if (this.maxProgresstime() != 0) { - stabilityDecrease = 0.75F; - } - // Search all hatches for catalyst fluid - // If found enough, drain it and reduce stability loss to 0 - // Every 30 drains, double the cost - FluidStack totalCost = new FluidStack(blackholeCatalyzingCost, catalyzingCostModifier); - for (MTEHatchInput hatch : mInputHatches) { - if (drain(hatch, totalCost, false)) { - drain(hatch, totalCost, true); - catalyzingCounter += 1; - stabilityDecrease = 0; - if (catalyzingCounter >= 30) { - catalyzingCostModifier *= 2; - catalyzingCounter = 0; + if (blackHoleStatus == 2) { + if (blackHoleStability >= 0) { + if (rendererTileEntity == null) createRenderBlock(); + rendererTileEntity.setStability(blackHoleStability / 100F); + float stabilityDecrease = 1F; + // If the machine is running, reduce stability loss by 25% + if (this.maxProgresstime() != 0) { + stabilityDecrease = 0.75F; + } + + // Search all hatches for catalyst fluid + // If found enough, drain it and reduce stability loss to 0 + // Every 30 drains, double the cost + FluidStack totalCost = new FluidStack(blackholeCatalyzingCost, catalyzingCostModifier); + + boolean didDrain = false; + for (MTEHatchInput hatch : spacetimeHatches) { + if (drain(hatch, totalCost, false)) { + drain(hatch, totalCost, true); + catalyzingCounter += 1; + stabilityDecrease = 0; + if (catalyzingCounter >= 30) { + catalyzingCostModifier *= 2; + catalyzingCounter = 0; + } + didDrain = true; + break; } } - } - if (blackHoleStability >= 0) blackHoleStability -= stabilityDecrease; - else blackHoleStability = 0; + if (rendererTileEntity == null) createRenderBlock(); + rendererTileEntity.toggleLaser(didDrain); + if (blackHoleStability >= 0) blackHoleStability -= stabilityDecrease; + else blackHoleStability = 0; + } else blackHoleStatus = 3; } } } @@ -531,4 +632,53 @@ public boolean supportsInputSeparation() { public boolean supportsSingleRecipeLocking() { return true; } + + @Override + public void onBlockDestroyed() { + destroyRenderBlock(); + super.onBlockDestroyed(); + } + + @Override + public boolean isRotationChangeAllowed() { + return false; + } + + private boolean shouldRender = true; + private TileEntityBlackhole rendererTileEntity = null; + + private void createRenderBlock() { + if (!shouldRender) return; + IGregTechTileEntity base = this.getBaseMetaTileEntity(); + ForgeDirection opposite = getDirection().getOpposite(); + int x = 7 * opposite.offsetX; + int z = 7 * opposite.offsetZ; + int y = 11; + + base.getWorld() + .setBlock(base.getXCoord() + x, base.getYCoord() + y, base.getZCoord() + z, Blocks.air); + base.getWorld() + .setBlock(base.getXCoord() + x, base.getYCoord() + y, base.getZCoord() + z, GregTechAPI.sBlackholeRender); + rendererTileEntity = (TileEntityBlackhole) base.getWorld() + .getTileEntity(base.getXCoord() + x, base.getYCoord() + y, base.getZCoord() + z); + + rendererTileEntity.setStability(blackHoleStability / 100F); + } + + private void destroyRenderBlock() { + IGregTechTileEntity base = this.getBaseMetaTileEntity(); + ForgeDirection opposite = getDirection().getOpposite(); + int x = 7 * opposite.offsetX; + int z = 7 * opposite.offsetZ; + int y = 11; + + this.getBaseMetaTileEntity() + .getWorld() + .setBlock(base.getXCoord() + x, base.getYCoord() + y, base.getZCoord() + z, Blocks.air); + } + + @Override + public boolean getDefaultHasMaintenanceChecks() { + return false; + } } diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java index 2491dcff388..aeda7d0cd68 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java @@ -47,6 +47,7 @@ import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.RecipeMaps; import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; import gregtech.api.recipe.metadata.CompressionTierKey; import gregtech.api.render.TextureFactory; import gregtech.api.util.GTRecipe; @@ -74,10 +75,10 @@ public class MTEHIPCompressor extends MTEExtendedPowerMultiBlockBase 0) doingHIP = true; + int recipeReq = recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0); + if (recipeReq == 1) { + doingHIP = true; + } else if (recipeReq == 2) { + return CheckRecipeResultRegistry.NO_RECIPE; + } return super.validateRecipe(recipe); } }.setMaxParallelSupplier(this::getMaxParallelRecipes); diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java index 8ea57bc1cf2..82f9d43506b 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java @@ -31,8 +31,8 @@ public class MTEHeatSensor extends MTEHatch { protected boolean inverted = false; private boolean isOn = false; - private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE; - private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_BLACKHOLE_GLOW; + private static final IIconContainer textureFont = Textures.BlockIcons.OVERLAY_HATCH_HEAT_SENSOR; + private static final IIconContainer textureFont_Glow = Textures.BlockIcons.OVERLAY_HATCH_HEAT_SENSOR_GLOW; public MTEHeatSensor(int aID, String aName, String aNameRegional, int aTier) { super(aID, aName, aNameRegional, aTier, 0, "Reads heat from HIP Unit."); diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java index e21da1856f0..c887d1cf03f 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java @@ -14,6 +14,8 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.common.util.ForgeDirection; +import org.jetbrains.annotations.NotNull; + import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; @@ -29,7 +31,11 @@ import gregtech.api.multitileentity.multiblock.casing.Glasses; import gregtech.api.recipe.RecipeMap; import gregtech.api.recipe.RecipeMaps; +import gregtech.api.recipe.check.CheckRecipeResult; +import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.metadata.CompressionTierKey; import gregtech.api.render.TextureFactory; +import gregtech.api.util.GTRecipe; import gregtech.api.util.GTUtility; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.common.blocks.BlockCasings10; @@ -188,7 +194,16 @@ protected void setProcessingLogicPower(ProcessingLogic logic) { @Override protected ProcessingLogic createProcessingLogic() { - return new ProcessingLogic().setSpeedBonus(1F / 2F) + return new ProcessingLogic() { + + @NotNull + @Override + protected CheckRecipeResult validateRecipe(@NotNull GTRecipe recipe) { + if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0) > 0) + return CheckRecipeResultRegistry.NO_RECIPE; + return super.validateRecipe(recipe); + } + }.setSpeedBonus(1F / 2F) .setMaxParallelSupplier(this::getMaxParallelRecipes) .setEuModifier(0.9F); } diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java index 323e09f61b0..f5326e284e2 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java @@ -9,10 +9,10 @@ import static gregtech.api.enums.HatchElement.InputBus; import static gregtech.api.enums.HatchElement.Maintenance; import static gregtech.api.enums.HatchElement.OutputBus; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW; -import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_NEUTRONIUM; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_NEUTRONIUM_ACTIVE; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW; +import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MULTI_NEUTRONIUM_GLOW; import static gregtech.api.util.GTStructureUtility.buildHatchAdder; import static gregtech.api.util.GTStructureUtility.ofFrame; @@ -115,11 +115,11 @@ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirect Textures.BlockIcons .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 6)), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE) + .addIcon(OVERLAY_MULTI_NEUTRONIUM_ACTIVE) .extFacing() .build(), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_ACTIVE_GLOW) + .addIcon(OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW) .extFacing() .glow() .build() }; @@ -128,11 +128,11 @@ public ITexture[] getTexture(IGregTechTileEntity baseMetaTileEntity, ForgeDirect Textures.BlockIcons .getCasingTextureForId(GTUtility.getCasingTextureIndex(GregTechAPI.sBlockCasings10, 6)), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR) + .addIcon(OVERLAY_MULTI_NEUTRONIUM) .extFacing() .build(), TextureFactory.builder() - .addIcon(OVERLAY_FRONT_MULTI_COMPRESSOR_GLOW) + .addIcon(OVERLAY_MULTI_NEUTRONIUM_GLOW) .extFacing() .glow() .build() }; diff --git a/src/main/java/gregtech/common/tileentities/render/TileEntityBlackhole.java b/src/main/java/gregtech/common/tileentities/render/TileEntityBlackhole.java new file mode 100644 index 00000000000..5cd59d2cf49 --- /dev/null +++ b/src/main/java/gregtech/common/tileentities/render/TileEntityBlackhole.java @@ -0,0 +1,99 @@ +package gregtech.common.tileentities.render; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; +import net.minecraft.tileentity.TileEntity; + +public class TileEntityBlackhole extends TileEntity { + + // Should run from 0 to 1, >.5 starts showing changes + private float stability = 1; + private float laserR = 0.318f, laserG = 0.157f, laserB = 0.533f; + private boolean laserRender = false; + + private static final String NBT_TAG = "BLACKHOLE"; + + private static final String STABILITY_NBT_TAG = NBT_TAG + "STABILITY"; + private static final String COLOR_RED_NBT_TAG = NBT_TAG + "COLOR_RED"; + private static final String COLOR_GREEN_NBT_TAG = NBT_TAG + "COLOR_GREEN"; + private static final String COLOR_BLUE_NBT_TAG = NBT_TAG + "COLOR_BLUE"; + private static final String RENDER_NBT_TAG = NBT_TAG + "LASER_RENDER"; + + public void setLaserColor(float r, float g, float b) { + laserR = r; + laserG = g; + laserB = b; + updateToClient(); + } + + public void toggleLaser(boolean toggle) { + laserRender = toggle; + updateToClient(); + } + + public float getLaserR() { + return laserR; + } + + public float getLaserG() { + return laserG; + } + + public float getLaserB() { + return laserB; + } + + public boolean getLaserRender() { + return laserRender; + } + + public void setStability(float stability) { + // Can probably be simplified, maps stability > .5 as 1, and stability <.5 from 0 to 1 + this.stability = ((float) Math.min(stability + .5, 1f) - .5f) * 2f; + updateToClient(); + } + + public float getStability() { + return stability; + } + + public void writeToNBT(NBTTagCompound compound) { + super.writeToNBT(compound); + compound.setFloat(STABILITY_NBT_TAG, stability); + compound.setFloat(COLOR_RED_NBT_TAG, laserR); + compound.setFloat(COLOR_GREEN_NBT_TAG, laserG); + compound.setFloat(COLOR_BLUE_NBT_TAG, laserB); + compound.setBoolean(RENDER_NBT_TAG, laserRender); + } + + @Override + public void readFromNBT(NBTTagCompound compound) { + stability = compound.getFloat(STABILITY_NBT_TAG); + laserR = compound.getFloat(COLOR_RED_NBT_TAG); + laserG = compound.getFloat(COLOR_GREEN_NBT_TAG); + laserB = compound.getFloat(COLOR_BLUE_NBT_TAG); + laserRender = compound.getBoolean(RENDER_NBT_TAG); + super.readFromNBT(compound); + + } + + @Override + public Packet getDescriptionPacket() { + NBTTagCompound nbttagcompound = new NBTTagCompound(); + writeToNBT(nbttagcompound); + + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, nbttagcompound); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt) { + readFromNBT(pkt.func_148857_g()); + } + + public void updateToClient() { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + +} diff --git a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java index 9c1c4904dbb..619ff7a7edc 100644 --- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java +++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java @@ -441,7 +441,7 @@ private void registerPlateSuperdense(final Materials aMaterial, final ItemStack GTModHandler.removeRecipeByOutputDelayed(aStack); if (!aNoSmashing || aMaterial.contains(SubTag.STRETCHY)) { - int compression_tier = (aMaterial.processingMaterialTierEU >= TierEU.RECIPE_UIV + int compression_tier = (aMaterial.processingMaterialTierEU >= TierEU.RECIPE_UEV || aMaterial.contains(SubTag.BLACK_HOLE)) ? 2 : 1; GTValues.RA.stdBuilder() .itemInputs(GTOreDictUnificator.get(OrePrefixes.plate, aMaterial, 64)) diff --git a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java index 0072a8148cf..c3bf4d50312 100644 --- a/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java +++ b/src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java @@ -53,6 +53,7 @@ import gregtech.api.util.GTModHandler; import gregtech.api.util.GTOreDictUnificator; import gregtech.api.util.GTUtility; +import gregtech.common.blocks.BlockBlackholeRenderer; import gregtech.common.blocks.BlockCasings1; import gregtech.common.blocks.BlockCasings10; import gregtech.common.blocks.BlockCasings11; @@ -91,6 +92,7 @@ import gregtech.common.items.MetaGeneratedItem98; import gregtech.common.items.MetaGeneratedItem99; import gregtech.common.items.MetaGeneratedTool01; +import gregtech.common.tileentities.render.TileEntityBlackhole; import gregtech.common.tileentities.render.TileEntityDrone; import gregtech.common.tileentities.render.TileEntityLaser; import gregtech.common.tileentities.render.TileEntityWormhole; @@ -558,6 +560,7 @@ public void run() { GregTechAPI.sBlockTintedGlass = new BlockTintedIndustrialGlass(); GregTechAPI.sLaserRender = new BlockLaser(); GregTechAPI.sWormholeRender = new BlockWormholeRender(); + GregTechAPI.sBlackholeRender = new BlockBlackholeRenderer(); // meta ID order, DO NOT CHANGE ORDER @@ -691,6 +694,9 @@ public void run() { GTLog.out.println("GTMod: Registering the WormholeRender."); GameRegistry.registerTileEntity(TileEntityWormhole.class, "WormholeRender"); + GTLog.out.println("GTMod: Registering the BlackholeRender."); + GameRegistry.registerTileEntity(TileEntityBlackhole.class, "BlackholeRender"); + GTLog.out.println("GTMod: Registering the BaseMetaPipeEntity."); GameRegistry.registerTileEntity(BaseMetaPipeEntity.class, "BaseMetaPipeEntity"); FMLInterModComms.sendMessage(AppliedEnergistics2.ID, "whitelist-spatial", BaseMetaPipeEntity.class.getName()); diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/MTESteamCompressor.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/MTESteamCompressor.java index 6db6175896a..a4ecc3f3e83 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/MTESteamCompressor.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/MTESteamCompressor.java @@ -48,6 +48,7 @@ import gregtech.api.recipe.RecipeMaps; import gregtech.api.recipe.check.CheckRecipeResult; import gregtech.api.recipe.check.CheckRecipeResultRegistry; +import gregtech.api.recipe.metadata.CompressionTierKey; import gregtech.api.util.GTRecipe; import gregtech.api.util.MultiblockTooltipBuilder; import gregtech.api.util.OverclockCalculator; @@ -246,6 +247,8 @@ protected CheckRecipeResult validateRecipe(@Nonnull GTRecipe recipe) { if (availableVoltage < recipe.mEUt) { return CheckRecipeResultRegistry.insufficientPower(recipe.mEUt); } + if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 0) > 0) + return CheckRecipeResultRegistry.NO_RECIPE; return CheckRecipeResultRegistry.SUCCESSFUL; } diff --git a/src/main/resources/assets/gregtech/shaders/blackhole.frag.glsl b/src/main/resources/assets/gregtech/shaders/blackhole.frag.glsl new file mode 100644 index 00000000000..4334dde59e7 --- /dev/null +++ b/src/main/resources/assets/gregtech/shaders/blackhole.frag.glsl @@ -0,0 +1,42 @@ +#version 120 + +uniform float u_Time; +uniform float u_Stability; +uniform sampler2D u_Texture; +varying vec2 v_TexCoord; + +const vec3 STABLE_COLOR = vec3(1,0.85,0.043); +const vec3 UNSTABLE_COLOR = vec3(.4,0,0); + +vec3 toYIQ(vec3 rgb){ + return mat3( 0.299, 1.0, 0.40462981, 0.587, -0.46081557, -1.0, 0.114, -0.53918443, 0.59537019 ) * rgb; +} + +vec3 toRGB(vec3 yiq){ + return mat3( 1.0, 1.0, 1.0, 0.5696804, -0.1620848, -0.6590654, 0.3235513, -0.3381869, 0.8901581 ) * yiq; +} + + +void main() { + //Extremely fragile system to deteriminte if isolate parts of the blackhole + //Would break with any uv remaping or atlas stiching + bool isDisk = (abs(v_TexCoord.y-.5f)>.245); + bool isBack = (abs(v_TexCoord.x-.5f)>.245) && isDisk; + bool isTinyRing = (v_TexCoord.y > .66) && !isDisk; + + vec2 texCoord = v_TexCoord; + if (isDisk || isTinyRing){ + texCoord.x = mod(texCoord.x+u_Time/30,1); + } + + vec4 texture = texture2D(u_Texture, texCoord); + if (isDisk || isTinyRing){ + vec3 targetYIQ = toYIQ(STABLE_COLOR); + vec3 originalYIQ = toYIQ(texture.xyz); + vec3 yiqColor = vec3(originalYIQ.x,normalize(targetYIQ.yz)*length(originalYIQ.yz)); + vec3 finalrgb = toRGB(yiqColor); + texture = vec4(mix(UNSTABLE_COLOR,finalrgb,pow(u_Stability,.5)),1); + } + + gl_FragColor = texture; +} diff --git a/src/main/resources/assets/gregtech/shaders/blackhole.vert.glsl b/src/main/resources/assets/gregtech/shaders/blackhole.vert.glsl new file mode 100644 index 00000000000..57cea0b81c3 --- /dev/null +++ b/src/main/resources/assets/gregtech/shaders/blackhole.vert.glsl @@ -0,0 +1,81 @@ +#version 120 + +uniform float u_Time; +uniform float u_Stability; +uniform float u_Scale; +uniform vec3 u_CameraPosition; + +varying vec2 v_TexCoord; + +const float PI = 3.14159265358979323846; + +const float HORIZON_EDGE = 2.6; + +mat4 rotateMatrix(float angle, vec3 axis){ + float x = axis.x; + float y = axis.y; + float z = axis.z; + + float c = cos(angle); + float s = sin(angle); + float t = 1.0 - c; + + return mat4( + c+x*x*t, t*x*y - s*z, t*x*z + s*y, 0.0, + t*x*y + s*z, t*y*y + c, t*y*z - s*x, 0.0, + t*x*z - s*y, t*y*z + s*x, t*z*z + c, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); +} + + + + + +void main() { + + v_TexCoord = gl_MultiTexCoord0.xy; + + //Extremely fragile system to deteriminte if isolate parts of the blackhole + //Would break with any uv remaping or atlas stiching + bool isDisk = (abs(v_TexCoord.y-.5f)>.245); + bool isBack = (abs(v_TexCoord.x-.5f)>.245) && isDisk; + bool isFront = (abs(v_TexCoord.x-.5f)<.255) && isDisk; + bool isBot = (v_TexCoord.y < .5) && isBack; + + float yAngle = atan(u_CameraPosition.z,u_CameraPosition.x) - PI/2; + float c = cos(yAngle); + float s = sin(yAngle); + mat4 yRotate = mat4( + vec4(c, 0.0, s, 0.0), // First column + vec4(0.0, 1.0, 0.0, 0.0), // Second column + vec4(-s, 0.0, c, 0.0), // Third column + vec4(0.0, 0.0, 0.0, 1.0) // Fourth column + ); + + + float base = length(gl_Vertex.xyz); + float stab = (base>HORIZON_EDGE)?u_Stability:1; + + float scale = ((base-HORIZON_EDGE)*stab+HORIZON_EDGE)/base; + scale = max(scale, .1); + scale*=u_Scale; + + + vec4 rotated = yRotate * vec4((gl_Vertex.xyz*scale),1); + + vec3 cameraDirection = normalize(u_CameraPosition); + cameraDirection = !isBot?cameraDirection:-cameraDirection; + vec3 rotateAxis = cross(cameraDirection,vec3(0,1,0)); + float angle = acos(dot(cameraDirection,vec3(0,1,0))); + if (isFront) angle = 0; + + float instabilityRotation =(u_Stability<=0)?u_Time/10:0; + + mat4 rotate = rotateMatrix(angle,normalize(rotateAxis)); + + + mat4 rotateB = rotateMatrix(instabilityRotation,normalize(u_CameraPosition)); + + gl_Position = gl_ModelViewProjectionMatrix * (rotateB* (rotate * (rotated))); +} diff --git a/src/main/resources/assets/gregtech/shaders/laser.frag.glsl b/src/main/resources/assets/gregtech/shaders/laser.frag.glsl new file mode 100644 index 00000000000..45656e8767f --- /dev/null +++ b/src/main/resources/assets/gregtech/shaders/laser.frag.glsl @@ -0,0 +1,25 @@ +#version 120 + +uniform sampler2D u_Texture; +uniform vec3 u_Color; + +varying vec2 v_TexCoord; + +vec3 toYIQ(vec3 rgb){ + return mat3( 0.299, 1.0, 0.40462981, 0.587, -0.46081557, -1.0, 0.114, -0.53918443, 0.59537019 ) * rgb; +} + +vec3 toRGB(vec3 yiq){ + return mat3( 1.0, 1.0, 1.0, 0.5696804, -0.1620848, -0.6590654, 0.3235513, -0.3381869, 0.8901581 ) * yiq; +} + +void main() { + vec4 texture = texture2D(u_Texture, v_TexCoord); + + vec3 targetYIQ = toYIQ(u_Color); + vec3 originalYIQ = toYIQ(texture.xyz); + vec3 yiqColor = vec3(originalYIQ.x,normalize(targetYIQ.yz)*length(originalYIQ.yz)); + vec3 finalrgb = toRGB(yiqColor); + + gl_FragColor = vec4(finalrgb,1); +} diff --git a/src/main/resources/assets/gregtech/shaders/laser.vert.glsl b/src/main/resources/assets/gregtech/shaders/laser.vert.glsl new file mode 100644 index 00000000000..9acecf5da99 --- /dev/null +++ b/src/main/resources/assets/gregtech/shaders/laser.vert.glsl @@ -0,0 +1,47 @@ +#version 120 + +uniform vec3 u_CameraPosition; +uniform mat4 u_ModelMatrix; + +varying vec2 v_TexCoord; + +const float PI = 3.14159265358979323846; + + + +mat4 rotateMatrix(float angle, vec3 axis){ + float x = axis.x; + float y = axis.y; + float z = axis.z; + + float c = cos(angle); + float s = sin(angle); + float t = 1.0 - c; + + return mat4( + c+x*x*t, t*x*y - s*z, t*x*z + s*y, 0.0, + t*x*y + s*z, t*y*y + c, t*y*z - s*x, 0.0, + t*x*z - s*y, t*y*z + s*x, t*z*z + c, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); +} + + +void main() { + + v_TexCoord = gl_MultiTexCoord0.xy; + + float xAngle = atan(u_CameraPosition.y,u_CameraPosition.z) - PI/2; + float c = cos(xAngle); + float s = sin(xAngle); + mat4 xRotate = mat4( + 1.0, 0.0, 0.0, 0.0, + 0.0, c, -s, 0.0, + 0.0, s, c, 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + + + gl_Position = gl_ModelViewProjectionMatrix * (u_ModelMatrix*(xRotate*gl_Vertex)); +} + diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE.png rename to src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR.png diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR_GLOW.png similarity index 100% rename from src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE_GLOW.png rename to src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR_GLOW.png diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE.png new file mode 100644 index 00000000000..082971beaf2 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png new file mode 100644 index 00000000000..a59e5ff4445 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png new file mode 100644 index 00000000000..0e6ec1e1bbb Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_GLOW.png new file mode 100644 index 00000000000..b73ee2bea6b Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_GLOW.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png new file mode 100644 index 00000000000..78e274f0907 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png new file mode 100644 index 00000000000..09212f35b53 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM.png new file mode 100644 index 00000000000..2a832554857 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png new file mode 100644 index 00000000000..b3dc6c72fa7 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png new file mode 100644 index 00000000000..c4ca221c513 Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png differ diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png.mcmeta b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_GLOW.png b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_GLOW.png new file mode 100644 index 00000000000..5ce6544e39c Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_GLOW.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png index 79b28819314..9fb3c704c9b 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png and b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png index 95eae6ea59a..f29c8748f29 100644 Binary files a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png and b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png differ diff --git a/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png.mcmeta b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png.mcmeta new file mode 100644 index 00000000000..14578b550bf --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png.mcmeta @@ -0,0 +1 @@ +{"animation": {"frametime": 4}} \ No newline at end of file diff --git a/src/main/resources/assets/gregtech/textures/model/blackhole.obj b/src/main/resources/assets/gregtech/textures/model/blackhole.obj new file mode 100644 index 00000000000..2ae4ff064ed --- /dev/null +++ b/src/main/resources/assets/gregtech/textures/model/blackhole.obj @@ -0,0 +1,1364 @@ +# Blender 4.2.0 +# www.blender.org +mtllib blackhole.mtl +o Circle +v 0.000000 0.000000 -3.000000 +v -0.294051 0.000000 -2.985554 +v -0.585271 0.000000 -2.942356 +v -0.870854 0.000000 -2.870821 +v -1.148050 0.000000 -2.771638 +v -1.414190 0.000000 -2.645764 +v -1.666711 0.000000 -2.494409 +v -1.903180 0.000000 -2.319031 +v -2.121320 0.000000 -2.121320 +v -2.319031 0.000000 -1.903180 +v -2.494409 0.000000 -1.666711 +v -2.645764 0.000000 -1.414190 +v -2.771638 0.000000 -1.148050 +v -2.870821 0.000000 -0.870854 +v -2.942356 0.000000 -0.585271 +v -2.985554 0.000000 -0.294051 +v -3.000000 0.000000 -0.000000 +v -2.985554 0.000000 0.294051 +v -2.942356 0.000000 0.585271 +v -2.870821 0.000000 0.870854 +v -2.771638 0.000000 1.148050 +v -2.645764 0.000000 1.414190 +v -2.494409 0.000000 1.666711 +v -2.319031 0.000000 1.903180 +v -2.121320 0.000000 2.121320 +v -1.903180 0.000000 2.319031 +v -1.666711 0.000000 2.494409 +v -1.414190 0.000000 2.645764 +v -1.148050 0.000000 2.771638 +v -0.870854 0.000000 2.870821 +v -0.585271 0.000000 2.942356 +v -0.294051 0.000000 2.985554 +v 0.000000 0.000000 3.000000 +v 0.294051 0.000000 2.985554 +v 0.585271 0.000000 2.942356 +v 0.870854 0.000000 2.870821 +v 1.148050 0.000000 2.771638 +v 1.414190 0.000000 2.645764 +v 1.666711 0.000000 2.494409 +v 1.903180 0.000000 2.319031 +v 2.121320 0.000000 2.121320 +v 2.319031 0.000000 1.903180 +v 2.494409 0.000000 1.666711 +v 2.645764 0.000000 1.414190 +v 2.771638 0.000000 1.148050 +v 2.870821 0.000000 0.870854 +v 2.942356 0.000000 0.585271 +v 2.985554 0.000000 0.294051 +v 3.000000 0.000000 -0.000000 +v 2.985554 0.000000 -0.294051 +v 2.942356 0.000000 -0.585271 +v 2.870821 0.000000 -0.870854 +v 2.771638 0.000000 -1.148050 +v 2.645764 0.000000 -1.414190 +v 2.494409 0.000000 -1.666711 +v 2.319031 0.000000 -1.903180 +v 2.121320 0.000000 -2.121320 +v 1.903180 0.000000 -2.319031 +v 1.666711 0.000000 -2.494409 +v 1.414190 0.000000 -2.645764 +v 1.148050 0.000000 -2.771638 +v 0.870854 0.000000 -2.870821 +v 0.585271 0.000000 -2.942356 +v 0.294051 0.000000 -2.985554 +v -0.000000 0.000000 -4.153742 +v -0.407138 0.000000 -4.133741 +v -0.810355 0.000000 -4.073929 +v -1.205768 0.000000 -3.974884 +v -1.589568 0.000000 -3.837557 +v -1.958061 0.000000 -3.663273 +v -2.307696 0.000000 -3.453710 +v -2.635107 0.000000 -3.210886 +v -2.937139 0.000000 -2.937139 +v -3.210886 0.000000 -2.635107 +v -3.453710 0.000000 -2.307696 +v -3.663273 0.000000 -1.958061 +v -3.837557 0.000000 -1.589568 +v -3.974884 0.000000 -1.205768 +v -4.073929 0.000000 -0.810355 +v -4.133741 0.000000 -0.407138 +v -4.153742 0.000000 -0.000000 +v -4.133741 0.000000 0.407138 +v -4.073929 0.000000 0.810355 +v -3.974884 0.000000 1.205768 +v -3.837557 0.000000 1.589568 +v -3.663273 0.000000 1.958061 +v -3.453710 0.000000 2.307695 +v -3.210886 0.000000 2.635106 +v -2.937139 0.000000 2.937139 +v -2.635107 0.000000 3.210886 +v -2.307696 0.000000 3.453710 +v -1.958061 0.000000 3.663273 +v -1.589568 0.000000 3.837557 +v -1.205768 0.000000 3.974884 +v -0.810355 0.000000 4.073929 +v -0.407138 0.000000 4.133741 +v -0.000000 0.000000 4.153742 +v 0.407138 0.000000 4.133741 +v 0.810355 0.000000 4.073929 +v 1.205768 0.000000 3.974884 +v 1.589568 0.000000 3.837557 +v 1.958061 0.000000 3.663273 +v 2.307695 0.000000 3.453710 +v 2.635106 0.000000 3.210886 +v 2.937139 0.000000 2.937139 +v 3.210886 0.000000 2.635106 +v 3.453710 0.000000 2.307695 +v 3.663273 0.000000 1.958061 +v 3.837557 0.000000 1.589568 +v 3.974884 0.000000 1.205768 +v 4.073929 0.000000 0.810355 +v 4.133741 0.000000 0.407138 +v 4.153742 0.000000 -0.000000 +v 4.133741 0.000000 -0.407138 +v 4.073929 0.000000 -0.810355 +v 3.974884 0.000000 -1.205768 +v 3.837557 0.000000 -1.589568 +v 3.663273 0.000000 -1.958061 +v 3.453710 0.000000 -2.307696 +v 3.210886 0.000000 -2.635107 +v 2.937139 0.000000 -2.937139 +v 2.635106 0.000000 -3.210886 +v 2.307695 0.000000 -3.453710 +v 1.958061 0.000000 -3.663273 +v 1.589568 0.000000 -3.837557 +v 1.205768 0.000000 -3.974884 +v 0.810355 0.000000 -4.073929 +v 0.407138 0.000000 -4.133741 +v 3.453710 0.000000 2.307695 +v 3.453710 0.000000 2.307695 +v 3.453710 0.000000 2.307695 +v 0.000000 0.000000 -3.000000 +v -0.294051 0.000000 -2.985554 +v -0.585271 0.000000 -2.942356 +v -0.870854 0.000000 -2.870821 +v -1.148050 0.000000 -2.771638 +v -1.414190 0.000000 -2.645764 +v -1.666711 0.000000 -2.494409 +v -1.903180 0.000000 -2.319031 +v -2.121320 0.000000 -2.121320 +v -2.319031 0.000000 -1.903180 +v -2.494409 0.000000 -1.666711 +v -2.645764 0.000000 -1.414190 +v -2.771638 0.000000 -1.148050 +v -2.870821 0.000000 -0.870854 +v -2.942356 0.000000 -0.585271 +v -2.985554 0.000000 -0.294051 +v -3.000000 0.000000 -0.000000 +v -2.985554 0.000000 0.294051 +v -2.942356 0.000000 0.585271 +v -2.870821 0.000000 0.870854 +v -2.771638 0.000000 1.148050 +v -2.645764 0.000000 1.414190 +v -2.494409 0.000000 1.666711 +v -2.319031 0.000000 1.903180 +v -2.121320 0.000000 2.121320 +v -1.903180 0.000000 2.319031 +v -1.666711 0.000000 2.494409 +v -1.414190 0.000000 2.645764 +v -1.148050 0.000000 2.771638 +v -0.870854 0.000000 2.870821 +v -0.585271 0.000000 2.942356 +v -0.294051 0.000000 2.985554 +v 0.000000 0.000000 3.000000 +v 0.294051 0.000000 2.985554 +v 0.585271 0.000000 2.942356 +v 0.870854 0.000000 2.870821 +v 1.148050 0.000000 2.771638 +v 1.414190 0.000000 2.645764 +v 1.666711 0.000000 2.494409 +v 1.903180 0.000000 2.319031 +v 2.121320 0.000000 2.121320 +v 2.319031 0.000000 1.903180 +v 2.494409 0.000000 1.666711 +v 2.645764 0.000000 1.414190 +v 2.771638 0.000000 1.148050 +v 2.870821 0.000000 0.870854 +v 2.942356 0.000000 0.585271 +v 2.985554 0.000000 0.294051 +v 3.000000 0.000000 -0.000000 +v 2.985554 0.000000 -0.294051 +v 2.942356 0.000000 -0.585271 +v 2.870821 0.000000 -0.870854 +v 2.771638 0.000000 -1.148050 +v 2.645764 0.000000 -1.414190 +v 2.494409 0.000000 -1.666711 +v 2.319031 0.000000 -1.903180 +v 2.121320 0.000000 -2.121320 +v 1.903180 0.000000 -2.319031 +v 1.666711 0.000000 -2.494409 +v 1.414190 0.000000 -2.645764 +v 1.148050 0.000000 -2.771638 +v 0.870854 0.000000 -2.870821 +v 0.585271 0.000000 -2.942356 +v 0.294051 0.000000 -2.985554 +v -0.000000 0.000000 -4.153742 +v -0.407138 0.000000 -4.133741 +v -0.810355 0.000000 -4.073929 +v -1.205768 0.000000 -3.974884 +v -1.589568 0.000000 -3.837557 +v -1.958061 0.000000 -3.663273 +v -2.307696 0.000000 -3.453710 +v -2.635107 0.000000 -3.210886 +v -2.937139 0.000000 -2.937139 +v -3.210886 0.000000 -2.635107 +v -3.453710 0.000000 -2.307696 +v -3.663273 0.000000 -1.958061 +v -3.837557 0.000000 -1.589568 +v -3.974884 0.000000 -1.205768 +v -4.073929 0.000000 -0.810355 +v -4.133741 0.000000 -0.407138 +v -4.153742 0.000000 -0.000000 +v -4.133741 0.000000 0.407138 +v -4.073929 0.000000 0.810355 +v -3.974884 0.000000 1.205768 +v -3.837557 0.000000 1.589568 +v -3.663273 0.000000 1.958061 +v -3.453710 0.000000 2.307695 +v -3.210886 0.000000 2.635106 +v -2.937139 0.000000 2.937139 +v -2.635107 0.000000 3.210886 +v -2.307696 0.000000 3.453710 +v -1.958061 0.000000 3.663273 +v -1.589568 0.000000 3.837557 +v -1.205768 0.000000 3.974884 +v -0.810355 0.000000 4.073929 +v -0.407138 0.000000 4.133741 +v -0.000000 0.000000 4.153742 +v 0.407138 0.000000 4.133741 +v 0.810355 0.000000 4.073929 +v 1.205768 0.000000 3.974884 +v 1.589568 0.000000 3.837557 +v 1.958061 0.000000 3.663273 +v 2.307695 0.000000 3.453710 +v 2.635106 0.000000 3.210886 +v 2.937139 0.000000 2.937139 +v 3.210886 0.000000 2.635106 +v 3.453710 0.000000 2.307695 +v 3.663273 0.000000 1.958061 +v 3.837557 0.000000 1.589568 +v 3.974884 0.000000 1.205768 +v 4.073929 0.000000 0.810355 +v 4.133741 0.000000 0.407138 +v 4.153742 0.000000 -0.000000 +v 4.133741 0.000000 -0.407138 +v 4.073929 0.000000 -0.810355 +v 3.974884 0.000000 -1.205768 +v 3.837557 0.000000 -1.589568 +v 3.663273 0.000000 -1.958061 +v 3.453710 0.000000 -2.307696 +v 3.210886 0.000000 -2.635107 +v 2.937139 0.000000 -2.937139 +v 2.635106 0.000000 -3.210886 +v 2.307695 0.000000 -3.453710 +v 1.958061 0.000000 -3.663273 +v 1.589568 0.000000 -3.837557 +v 1.205768 0.000000 -3.974884 +v 0.810355 0.000000 -4.073929 +v 0.407138 0.000000 -4.133741 +v 3.453710 0.000000 2.307695 +v 0.254845 0.000000 -2.587480 +v 0.507235 0.000000 -2.550042 +v 0.754740 0.000000 -2.488045 +v 0.994977 0.000000 -2.402087 +v 1.225631 0.000000 -2.292995 +v 1.444483 0.000000 -2.161821 +v 1.649423 0.000000 -2.009827 +v 1.838478 0.000000 -1.838478 +v 2.009827 0.000000 -1.649423 +v 2.161821 0.000000 -1.444483 +v 2.292995 0.000000 -1.225631 +v 2.402087 0.000000 -0.994977 +v 2.488045 0.000000 -0.754740 +v 2.550042 0.000000 -0.507235 +v 2.587480 0.000000 -0.254845 +v 2.600000 0.000000 0.000000 +v 2.587480 0.000000 0.254845 +v 2.550042 0.000000 0.507235 +v 2.488045 0.000000 0.754740 +v 2.402087 0.000000 0.994977 +v 2.292995 0.000000 1.225631 +v 2.161821 0.000000 1.444483 +v 2.009827 0.000000 1.649423 +v 1.838478 0.000000 1.838478 +v 1.649423 0.000000 2.009827 +v 1.444483 0.000000 2.161821 +v 1.225631 0.000000 2.292995 +v 0.994977 0.000000 2.402087 +v 0.754740 0.000000 2.488045 +v 0.507235 0.000000 2.550042 +v 0.254845 0.000000 2.587480 +v -0.000000 0.000000 2.600000 +v -0.254845 0.000000 2.587480 +v -0.507235 0.000000 2.550042 +v -0.754740 0.000000 2.488045 +v -0.994977 0.000000 2.402087 +v -1.225631 0.000000 2.292995 +v -1.444483 0.000000 2.161821 +v -1.649423 0.000000 2.009827 +v -1.838478 0.000000 1.838478 +v -2.009827 0.000000 1.649423 +v -2.161821 0.000000 1.444483 +v -2.292995 0.000000 1.225631 +v -2.402087 0.000000 0.994977 +v -2.488045 0.000000 0.754740 +v -2.550042 0.000000 0.507235 +v -2.587480 0.000000 0.254845 +v -2.600000 0.000000 0.000000 +v -2.587480 0.000000 -0.254845 +v -2.550042 0.000000 -0.507235 +v -2.488045 0.000000 -0.754740 +v -2.402087 0.000000 -0.994977 +v -2.292995 0.000000 -1.225631 +v -2.161821 0.000000 -1.444483 +v -2.009827 0.000000 -1.649423 +v -1.838478 0.000000 -1.838478 +v -1.649423 0.000000 -2.009827 +v -1.444483 0.000000 -2.161821 +v -1.225631 0.000000 -2.292995 +v -0.994977 0.000000 -2.402087 +v -0.754740 0.000000 -2.488045 +v -0.507235 0.000000 -2.550042 +v -0.254845 0.000000 -2.587480 +v -0.000000 0.000000 -2.600000 +v 0.000000 0.000000 -2.600000 +v -0.254845 0.000000 -2.587480 +v -0.507235 0.000000 -2.550042 +v -0.754740 0.000000 -2.488045 +v -0.994977 0.000000 -2.402087 +v -1.225631 0.000000 -2.292995 +v -1.444483 0.000000 -2.161821 +v -1.649423 0.000000 -2.009827 +v -1.838478 0.000000 -1.838478 +v -2.009827 0.000000 -1.649423 +v -2.161821 0.000000 -1.444483 +v -2.292995 0.000000 -1.225631 +v -2.402087 0.000000 -0.994977 +v -2.488045 0.000000 -0.754740 +v -2.550042 0.000000 -0.507235 +v -2.587480 0.000000 -0.254845 +v -2.600000 0.000000 -0.000000 +v -2.587480 0.000000 0.254845 +v -2.550042 0.000000 0.507235 +v -2.488045 0.000000 0.754740 +v -2.402087 0.000000 0.994977 +v -2.292995 0.000000 1.225631 +v -2.161821 0.000000 1.444483 +v -2.009827 0.000000 1.649423 +v -1.838478 0.000000 1.838478 +v -1.649423 0.000000 2.009827 +v -1.444483 0.000000 2.161821 +v -1.225631 0.000000 2.292995 +v -0.994977 0.000000 2.402087 +v -0.754740 0.000000 2.488045 +v -0.507235 0.000000 2.550042 +v -0.254845 0.000000 2.587480 +v 0.000000 0.000000 2.600000 +v 0.254845 0.000000 2.587480 +v 0.507235 0.000000 2.550042 +v 0.754740 0.000000 2.488045 +v 0.994977 0.000000 2.402087 +v 1.225631 0.000000 2.292995 +v 1.444483 0.000000 2.161821 +v 1.649423 0.000000 2.009827 +v 1.838478 0.000000 1.838478 +v 2.009827 0.000000 1.649423 +v 2.161821 0.000000 1.444483 +v 2.292995 0.000000 1.225631 +v 2.402087 0.000000 0.994977 +v 2.488045 0.000000 0.754740 +v 2.550042 0.000000 0.507235 +v 2.587480 0.000000 0.254845 +v 2.600000 0.000000 -0.000000 +v 2.587480 0.000000 -0.254845 +v 2.550042 0.000000 -0.507235 +v 2.488045 0.000000 -0.754740 +v 2.402087 0.000000 -0.994977 +v 2.292995 0.000000 -1.225631 +v 2.161821 0.000000 -1.444483 +v 2.009827 0.000000 -1.649423 +v 1.838478 0.000000 -1.838478 +v 1.649423 0.000000 -2.009827 +v 1.444483 0.000000 -2.161821 +v 1.225631 0.000000 -2.292995 +v 0.994977 0.000000 -2.402087 +v 0.754740 0.000000 -2.488045 +v 0.507235 0.000000 -2.550042 +v 0.254845 0.000000 -2.587480 +v 0.000000 0.000000 -2.795478 +v -0.274005 0.000000 -2.782017 +v -0.545371 0.000000 -2.741764 +v -0.811484 0.000000 -2.675106 +v -1.069783 0.000000 -2.582685 +v -1.317779 0.000000 -2.465391 +v -1.553084 0.000000 -2.324355 +v -1.773433 0.000000 -2.160934 +v -1.976701 0.000000 -1.976701 +v -2.160934 0.000000 -1.773433 +v -2.324355 0.000000 -1.553084 +v -2.465391 0.000000 -1.317779 +v -2.582685 0.000000 -1.069783 +v -2.675106 0.000000 -0.811484 +v -2.741764 0.000000 -0.545371 +v -2.782017 0.000000 -0.274005 +v -2.795478 0.000000 -0.000000 +v -2.782017 0.000000 0.274005 +v -2.741764 0.000000 0.545371 +v -2.675106 0.000000 0.811484 +v -2.582685 0.000000 1.069783 +v -2.465391 0.000000 1.317779 +v -2.324355 0.000000 1.553084 +v -2.160934 0.000000 1.773433 +v -1.976701 0.000000 1.976701 +v -1.773433 0.000000 2.160934 +v -1.553084 0.000000 2.324355 +v -1.317779 0.000000 2.465391 +v -1.069783 0.000000 2.582685 +v -0.811484 0.000000 2.675106 +v -0.545371 0.000000 2.741764 +v -0.274005 0.000000 2.782017 +v 0.000000 0.000000 2.795478 +v 0.274005 0.000000 2.782017 +v 0.545371 0.000000 2.741764 +v 0.811484 0.000000 2.675106 +v 1.069783 0.000000 2.582685 +v 1.317779 0.000000 2.465391 +v 1.553084 0.000000 2.324355 +v 1.773433 0.000000 2.160934 +v 1.976701 0.000000 1.976701 +v 2.160934 0.000000 1.773433 +v 2.324355 0.000000 1.553084 +v 2.465391 0.000000 1.317779 +v 2.582685 0.000000 1.069783 +v 2.675106 0.000000 0.811484 +v 2.741764 0.000000 0.545371 +v 2.782017 0.000000 0.274005 +v 2.795478 0.000000 -0.000000 +v 2.782017 0.000000 -0.274005 +v 2.741764 0.000000 -0.545371 +v 2.675106 0.000000 -0.811484 +v 2.582685 0.000000 -1.069783 +v 2.465391 0.000000 -1.317779 +v 2.324355 0.000000 -1.553084 +v 2.160934 0.000000 -1.773433 +v 1.976701 0.000000 -1.976701 +v 1.773433 0.000000 -2.160934 +v 1.553084 0.000000 -2.324355 +v 1.317779 0.000000 -2.465391 +v 1.069783 0.000000 -2.582685 +v 0.811484 0.000000 -2.675106 +v 0.545371 0.000000 -2.741764 +v 0.274005 0.000000 -2.782017 +vn -0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.312504 1.000012 +vt 0.328129 0.875013 +vt 0.312504 0.875013 +vt 0.718744 1.000012 +vt 0.734369 0.875013 +vt 0.718744 0.875013 +vt 0.296879 0.875013 +vt 0.703120 0.875013 +vt 0.281255 1.000012 +vt 0.281255 0.875013 +vt 0.687495 1.000012 +vt 0.687495 0.875013 +vt 0.265630 0.875013 +vt 0.671870 0.875013 +vt 0.250006 0.875013 +vt 0.265630 1.000012 +vt 0.656246 1.000012 +vt 0.656246 0.875013 +vt 0.234381 0.875013 +vt 0.250006 1.000012 +vt 0.640621 0.875013 +vt 0.218757 1.000012 +vt 0.218757 0.875013 +vt 0.624997 1.000012 +vt 0.624997 0.875013 +vt 0.203132 0.875013 +vt 0.609372 0.875013 +vt 0.187507 1.000012 +vt 0.187507 0.875013 +vt 0.593747 1.000012 +vt 0.593747 0.875013 +vt 0.171883 0.875013 +vt 0.578123 1.000012 +vt 0.578123 0.875013 +vt 0.984363 1.000012 +vt 0.999988 0.875013 +vt 0.984363 0.875013 +vt 0.156258 1.000012 +vt 0.156258 0.875013 +vt 0.562498 1.000012 +vt 0.562498 0.875013 +vt 0.968738 1.000012 +vt 0.968738 0.875013 +vt 0.140634 0.875013 +vt 0.546873 0.875013 +vt 0.953114 0.875013 +vt 0.125009 1.000012 +vt 0.125009 0.875013 +vt 0.531249 1.000012 +vt 0.531249 0.875013 +vt 0.937489 1.000012 +vt 0.937489 0.875013 +vt 0.109384 0.875013 +vt 0.515624 0.875013 +vt 0.921865 0.875013 +vt 0.093760 1.000012 +vt 0.093760 0.875013 +vt 0.500000 0.875013 +vt 0.515624 1.000012 +vt 0.906240 0.875013 +vt 0.921865 1.000012 +vt 0.078135 1.000012 +vt 0.078135 0.875013 +vt 0.484375 0.875013 +vt 0.500000 1.000012 +vt 0.890615 0.875013 +vt 0.906240 1.000012 +vt 0.062511 1.000012 +vt 0.062511 0.875013 +vt 0.468750 1.000012 +vt 0.468750 0.875013 +vt 0.874991 1.000012 +vt 0.874991 0.875013 +vt 0.046886 0.875013 +vt 0.453126 0.875013 +vt 0.859366 0.875013 +vt 0.031262 1.000012 +vt 0.031262 0.875013 +vt 0.437501 1.000012 +vt 0.437501 0.875013 +vt 0.843741 1.000012 +vt 0.843741 0.875013 +vt 0.015637 0.875013 +vt 0.421876 0.875013 +vt 0.828117 1.000012 +vt 0.828117 0.875013 +vt 0.000013 1.000012 +vt 0.000013 0.875013 +vt 0.406252 1.000012 +vt 0.406252 0.875013 +vt 0.812492 1.000012 +vt 0.812492 0.875013 +vt 0.390627 0.875013 +vt 0.796867 0.875013 +vt 0.375002 1.000012 +vt 0.375002 0.875013 +vt 0.781243 1.000012 +vt 0.781243 0.875013 +vt 0.359378 0.875013 +vt 0.765618 0.875013 +vt 0.343753 1.000012 +vt 0.343753 0.875013 +vt 0.749994 1.000012 +vt 0.749994 0.875013 +vt 0.328129 1.000012 +vt 0.734369 1.000012 +vt 0.328129 0.000013 +vt 0.312504 0.125012 +vt 0.312504 0.000013 +vt 0.734369 0.000013 +vt 0.718744 0.125012 +vt 0.718744 0.000013 +vt 0.296879 0.000013 +vt 0.296879 0.125012 +vt 0.703120 0.000013 +vt 0.703120 0.125012 +vt 0.281255 0.125012 +vt 0.281255 0.000013 +vt 0.687495 0.125012 +vt 0.687495 0.000013 +vt 0.265630 0.000012 +vt 0.265630 0.125012 +vt 0.671870 0.000013 +vt 0.671870 0.125012 +vt 0.250006 0.125012 +vt 0.250006 0.000012 +vt 0.656246 0.125012 +vt 0.656246 0.000013 +vt 0.234381 0.125012 +vt 0.234381 0.000012 +vt 0.640621 0.000013 +vt 0.640621 0.125012 +vt 0.218757 0.125012 +vt 0.218757 0.000012 +vt 0.624997 0.125012 +vt 0.624997 0.000013 +vt 0.203132 0.000012 +vt 0.203132 0.125012 +vt 0.609372 0.000013 +vt 0.609372 0.125012 +vt 0.187507 0.125012 +vt 0.187507 0.000012 +vt 0.593747 0.125012 +vt 0.593747 0.000013 +vt 0.171883 0.000012 +vt 0.171883 0.125012 +vt 0.578123 0.125012 +vt 0.578123 0.000013 +vt 0.999988 0.000013 +vt 0.984363 0.125012 +vt 0.984363 0.000013 +vt 0.156258 0.000012 +vt 0.156258 0.125012 +vt 0.562498 0.125012 +vt 0.562498 0.000013 +vt 0.968738 0.125012 +vt 0.968738 0.000013 +vt 0.140634 0.125012 +vt 0.140634 0.000012 +vt 0.546873 0.000013 +vt 0.546873 0.125012 +vt 0.953114 0.000013 +vt 0.953114 0.125012 +vt 0.125009 0.125012 +vt 0.125009 0.000012 +vt 0.531249 0.125012 +vt 0.531249 0.000013 +vt 0.937489 0.125012 +vt 0.937489 0.000013 +vt 0.109384 0.000012 +vt 0.109384 0.125012 +vt 0.515624 0.000013 +vt 0.515624 0.125012 +vt 0.921865 0.000013 +vt 0.921865 0.125012 +vt 0.093760 0.125012 +vt 0.093760 0.000012 +vt 0.500000 0.000013 +vt 0.500000 0.125012 +vt 0.906240 0.000013 +vt 0.906240 0.125012 +vt 0.078135 0.125012 +vt 0.078135 0.000012 +vt 0.484375 0.125012 +vt 0.484375 0.000013 +vt 0.890615 0.125012 +vt 0.890615 0.000013 +vt 0.062511 0.125012 +vt 0.062511 0.000012 +vt 0.468750 0.125012 +vt 0.468750 0.000013 +vt 0.874991 0.125012 +vt 0.874991 0.000013 +vt 0.046886 0.000012 +vt 0.046886 0.125012 +vt 0.453126 0.000013 +vt 0.453126 0.125012 +vt 0.859366 0.000013 +vt 0.859366 0.125012 +vt 0.031262 0.125012 +vt 0.031262 0.000012 +vt 0.437501 0.125012 +vt 0.437501 0.000013 +vt 0.843741 0.125012 +vt 0.843741 0.000013 +vt 0.015637 0.000013 +vt 0.015637 0.125012 +vt 0.421876 0.000013 +vt 0.421876 0.125012 +vt 0.828117 0.125012 +vt 0.828117 0.000013 +vt 0.000013 0.125012 +vt 0.000013 0.000012 +vt 0.406252 0.125012 +vt 0.406252 0.000013 +vt 0.812492 0.125012 +vt 0.812492 0.000013 +vt 0.390627 0.000013 +vt 0.390627 0.125012 +vt 0.796867 0.000013 +vt 0.796867 0.125012 +vt 0.375002 0.125012 +vt 0.375002 0.000013 +vt 0.781243 0.125012 +vt 0.781243 0.000013 +vt 0.359378 0.000013 +vt 0.359378 0.125012 +vt 0.765618 0.000013 +vt 0.765618 0.125012 +vt 0.343753 0.125012 +vt 0.343753 0.000013 +vt 0.749994 0.125012 +vt 0.749994 0.000013 +vt 0.328129 0.125012 +vt 0.734369 0.125012 +vt 0.868503 0.390619 +vt 0.863139 0.426778 +vt 0.870296 0.354109 +vt 0.854257 0.462236 +vt 0.841942 0.496654 +vt 0.826313 0.529698 +vt 0.807521 0.561052 +vt 0.785746 0.590413 +vt 0.761197 0.617497 +vt 0.734112 0.642046 +vt 0.704751 0.663821 +vt 0.673398 0.682614 +vt 0.640354 0.698243 +vt 0.605936 0.710558 +vt 0.570477 0.719439 +vt 0.534319 0.724803 +vt 0.497808 0.726597 +vt 0.461298 0.724803 +vt 0.425140 0.719439 +vt 0.389681 0.710558 +vt 0.355264 0.698243 +vt 0.322219 0.682614 +vt 0.290865 0.663821 +vt 0.261505 0.642046 +vt 0.234420 0.617498 +vt 0.209872 0.590413 +vt 0.188096 0.561052 +vt 0.169304 0.529699 +vt 0.153675 0.496654 +vt 0.141360 0.462237 +vt 0.132478 0.426778 +vt 0.127114 0.390619 +vt 0.125321 0.354109 +vt 0.868503 0.390619 +vt 0.863139 0.426778 +vt 0.870296 0.354109 +vt 0.854257 0.462237 +vt 0.841942 0.496654 +vt 0.826313 0.529699 +vt 0.807521 0.561052 +vt 0.785746 0.590413 +vt 0.761197 0.617498 +vt 0.734112 0.642046 +vt 0.704751 0.663821 +vt 0.673398 0.682614 +vt 0.640353 0.698243 +vt 0.605936 0.710558 +vt 0.570477 0.719440 +vt 0.534319 0.724803 +vt 0.497809 0.726597 +vt 0.461298 0.724803 +vt 0.425140 0.719440 +vt 0.389681 0.710558 +vt 0.355264 0.698243 +vt 0.322219 0.682614 +vt 0.290866 0.663821 +vt 0.261505 0.642046 +vt 0.234420 0.617498 +vt 0.209872 0.590413 +vt 0.188096 0.561052 +vt 0.169304 0.529699 +vt 0.153675 0.496654 +vt 0.141360 0.462237 +vt 0.132478 0.426778 +vt 0.125321 0.354109 +vt 0.390627 0.298860 +vt 0.375003 0.326578 +vt 0.390627 0.326578 +vt 0.812493 0.298860 +vt 0.796869 0.326578 +vt 0.812493 0.326578 +vt 0.406252 0.326578 +vt 0.406252 0.298860 +vt 0.828118 0.326578 +vt 0.828118 0.298860 +vt 0.421877 0.326578 +vt 0.421877 0.298860 +vt 0.000011 0.298860 +vt 0.015635 0.326578 +vt 0.015635 0.298860 +vt 0.843743 0.326578 +vt 0.843743 0.298860 +vt 0.437501 0.298860 +vt 0.437501 0.326578 +vt 0.031260 0.298860 +vt 0.031260 0.326578 +vt 0.859367 0.298860 +vt 0.859367 0.326578 +vt 0.453126 0.326578 +vt 0.453126 0.298860 +vt 0.046885 0.326578 +vt 0.046885 0.298860 +vt 0.874992 0.326578 +vt 0.874992 0.298860 +vt 0.468751 0.326578 +vt 0.468751 0.298860 +vt 0.062509 0.326578 +vt 0.062509 0.298860 +vt 0.890617 0.298860 +vt 0.890617 0.326578 +vt 0.484375 0.326578 +vt 0.484375 0.298860 +vt 0.078134 0.326578 +vt 0.078134 0.298860 +vt 0.906241 0.326578 +vt 0.906241 0.298860 +vt 0.500000 0.298860 +vt 0.500000 0.326578 +vt 0.093759 0.326578 +vt 0.093759 0.298860 +vt 0.921866 0.326578 +vt 0.921866 0.298860 +vt 0.515625 0.326578 +vt 0.515625 0.298860 +vt 0.109383 0.298860 +vt 0.109383 0.326578 +vt 0.937491 0.298860 +vt 0.937491 0.326578 +vt 0.531249 0.298860 +vt 0.531249 0.326578 +vt 0.125008 0.326578 +vt 0.125008 0.298860 +vt 0.953115 0.326578 +vt 0.953115 0.298860 +vt 0.546874 0.326578 +vt 0.546874 0.298860 +vt 0.140633 0.298860 +vt 0.140633 0.326578 +vt 0.968740 0.326578 +vt 0.968740 0.298860 +vt 0.562499 0.298860 +vt 0.562499 0.326578 +vt 0.156257 0.326578 +vt 0.156257 0.298860 +vt 0.984365 0.326578 +vt 0.984365 0.298860 +vt 0.578123 0.326578 +vt 0.578123 0.298860 +vt 0.171882 0.326578 +vt 0.171882 0.298860 +vt 0.999989 0.298860 +vt 0.999989 0.326578 +vt 0.593748 0.326578 +vt 0.593748 0.298860 +vt 0.187507 0.298860 +vt 0.187507 0.326578 +vt 0.609373 0.298860 +vt 0.609373 0.326578 +vt 0.203131 0.326578 +vt 0.203131 0.298860 +vt 0.624997 0.326578 +vt 0.624997 0.298860 +vt 0.218756 0.326578 +vt 0.218756 0.298860 +vt 0.640622 0.298860 +vt 0.640622 0.326578 +vt 0.234381 0.326578 +vt 0.234381 0.298860 +vt 0.656247 0.326578 +vt 0.656247 0.298860 +vt 0.250005 0.298860 +vt 0.250005 0.326578 +vt 0.671871 0.326578 +vt 0.671871 0.298860 +vt 0.265630 0.326578 +vt 0.265630 0.298860 +vt 0.687496 0.298860 +vt 0.687496 0.326578 +vt 0.281255 0.298860 +vt 0.281255 0.326578 +vt 0.703121 0.326578 +vt 0.703121 0.298860 +vt 0.296879 0.326578 +vt 0.296879 0.298860 +vt 0.718745 0.326578 +vt 0.718745 0.298860 +vt 0.312504 0.298860 +vt 0.312504 0.326578 +vt 0.734370 0.326578 +vt 0.734370 0.298860 +vt 0.328129 0.326578 +vt 0.328129 0.298860 +vt 0.749995 0.298860 +vt 0.749995 0.326578 +vt 0.343753 0.326578 +vt 0.343753 0.298860 +vt 0.765619 0.326578 +vt 0.765619 0.298860 +vt 0.359378 0.298860 +vt 0.359378 0.326578 +vt 0.781244 0.298860 +vt 0.781244 0.326578 +vt 0.375003 0.298860 +vt 0.796869 0.298860 +vt 0.296879 1.000012 +vt 0.703120 1.000012 +vt 0.671870 1.000012 +vt 0.234381 1.000012 +vt 0.640621 1.000012 +vt 0.203132 1.000012 +vt 0.609372 1.000012 +vt 0.171883 1.000012 +vt 0.999988 1.000012 +vt 0.140634 1.000012 +vt 0.546873 1.000012 +vt 0.953114 1.000012 +vt 0.109384 1.000012 +vt 0.484375 1.000012 +vt 0.890615 1.000012 +vt 0.046886 1.000012 +vt 0.453126 1.000012 +vt 0.859366 1.000012 +vt 0.015637 1.000012 +vt 0.421876 1.000012 +vt 0.390627 1.000012 +vt 0.796867 1.000012 +vt 0.359378 1.000012 +vt 0.765618 1.000012 +vt 0.999988 0.125012 +vt 0.000011 0.326578 +s 0 +usemtl Material.001 +f 109/1/1 44/2/1 45/3/1 +f 83/4/1 18/5/1 19/6/1 +f 46/7/1 109/1/1 45/3/1 +f 20/8/1 83/4/1 19/6/1 +f 111/9/1 46/7/1 47/10/1 +f 85/11/1 20/8/1 21/12/1 +f 48/13/1 111/9/1 47/10/1 +f 22/14/1 85/11/1 21/12/1 +f 49/15/1 112/16/1 48/13/1 +f 87/17/1 22/14/1 23/18/1 +f 50/19/1 113/20/1 49/15/1 +f 24/21/1 87/17/1 23/18/1 +f 115/22/1 50/19/1 51/23/1 +f 89/24/1 24/21/1 25/25/1 +f 52/26/1 115/22/1 51/23/1 +f 26/27/1 89/24/1 25/25/1 +f 117/28/1 52/26/1 53/29/1 +f 91/30/1 26/27/1 27/31/1 +f 54/32/1 117/28/1 53/29/1 +f 92/33/1 27/31/1 28/34/1 +f 66/35/1 1/36/1 2/37/1 +f 119/38/1 54/32/1 55/39/1 +f 93/40/1 28/34/1 29/41/1 +f 67/42/1 2/37/1 3/43/1 +f 56/44/1 119/38/1 55/39/1 +f 30/45/1 93/40/1 29/41/1 +f 4/46/1 67/42/1 3/43/1 +f 121/47/1 56/44/1 57/48/1 +f 95/49/1 30/45/1 31/50/1 +f 69/51/1 4/46/1 5/52/1 +f 58/53/1 121/47/1 57/48/1 +f 32/54/1 95/49/1 31/50/1 +f 6/55/1 69/51/1 5/52/1 +f 123/56/1 58/53/1 59/57/1 +f 33/58/1 96/59/1 32/54/1 +f 7/60/1 70/61/1 6/55/1 +f 124/62/1 59/57/1 60/63/1 +f 34/64/1 97/65/1 33/58/1 +f 8/66/1 71/67/1 7/60/1 +f 125/68/1 60/63/1 61/69/1 +f 99/70/1 34/64/1 35/71/1 +f 73/72/1 8/66/1 9/73/1 +f 62/74/1 125/68/1 61/69/1 +f 36/75/1 99/70/1 35/71/1 +f 10/76/1 73/72/1 9/73/1 +f 127/77/1 62/74/1 63/78/1 +f 101/79/1 36/75/1 37/80/1 +f 75/81/1 10/76/1 11/82/1 +f 64/83/1 127/77/1 63/78/1 +f 38/84/1 101/79/1 37/80/1 +f 76/85/1 11/82/1 12/86/1 +f 65/87/1 64/83/1 1/88/1 +f 103/89/1 38/84/1 39/90/1 +f 77/91/1 12/86/1 13/92/1 +f 40/93/1 103/89/1 39/90/1 +f 14/94/1 77/91/1 13/92/1 +f 105/95/1 40/93/1 41/96/1 +f 79/97/1 14/94/1 15/98/1 +f 42/99/1 105/95/1 41/96/1 +f 16/100/1 79/97/1 15/98/1 +f 107/101/1 42/99/1 43/102/1 +f 81/103/1 16/100/1 17/104/1 +f 108/105/1 43/102/1 44/2/1 +f 82/106/1 17/104/1 18/5/1 +f 175/107/2 240/108/2 176/109/2 +f 149/110/2 214/111/2 150/112/2 +f 177/113/2 240/108/2 241/114/2 +f 151/115/2 214/111/2 215/116/2 +f 177/113/2 242/117/2 178/118/2 +f 151/115/2 216/119/2 152/120/2 +f 179/121/2 242/117/2 243/122/2 +f 153/123/2 216/119/2 217/124/2 +f 179/121/2 244/125/2 180/126/2 +f 153/123/2 218/127/2 154/128/2 +f 180/126/2 245/129/2 181/130/2 +f 155/131/2 218/127/2 219/132/2 +f 181/130/2 246/133/2 182/134/2 +f 155/131/2 220/135/2 156/136/2 +f 183/137/2 246/133/2 247/138/2 +f 157/139/2 220/135/2 221/140/2 +f 183/137/2 248/141/2 184/142/2 +f 157/139/2 222/143/2 158/144/2 +f 185/145/2 248/141/2 249/146/2 +f 158/144/2 223/147/2 159/148/2 +f 132/149/2 197/150/2 133/151/2 +f 186/152/2 249/146/2 250/153/2 +f 159/148/2 224/154/2 160/155/2 +f 133/151/2 198/156/2 134/157/2 +f 186/152/2 251/158/2 187/159/2 +f 161/160/2 224/154/2 225/161/2 +f 135/162/2 198/156/2 199/163/2 +f 187/159/2 252/164/2 188/165/2 +f 161/160/2 226/166/2 162/167/2 +f 135/162/2 200/168/2 136/169/2 +f 189/170/2 252/164/2 253/171/2 +f 163/172/2 226/166/2 227/173/2 +f 137/174/2 200/168/2 201/175/2 +f 189/170/2 254/176/2 190/177/2 +f 164/178/2 227/173/2 228/179/2 +f 138/180/2 201/175/2 202/181/2 +f 190/177/2 255/182/2 191/183/2 +f 164/178/2 229/184/2 165/185/2 +f 138/180/2 203/186/2 139/187/2 +f 191/183/2 256/188/2 192/189/2 +f 165/185/2 230/190/2 166/191/2 +f 139/187/2 204/192/2 140/193/2 +f 193/194/2 256/188/2 257/195/2 +f 167/196/2 230/190/2 231/197/2 +f 141/198/2 204/192/2 205/199/2 +f 193/194/2 258/200/2 194/201/2 +f 167/196/2 232/202/2 168/203/2 +f 141/198/2 206/204/2 142/205/2 +f 195/206/2 258/200/2 259/207/2 +f 169/208/2 232/202/2 233/209/2 +f 142/205/2 207/210/2 143/211/2 +f 195/206/2 196/212/2 132/213/2 +f 169/208/2 234/214/2 170/215/2 +f 143/211/2 208/216/2 144/217/2 +f 171/218/2 234/214/2 235/219/2 +f 145/220/2 208/216/2 209/221/2 +f 171/218/2 236/222/2 172/223/2 +f 145/220/2 210/224/2 146/225/2 +f 173/226/2 236/222/2 237/227/2 +f 147/228/2 210/224/2 211/229/2 +f 173/226/2 238/230/2 174/231/2 +f 147/228/2 212/232/2 148/233/2 +f 174/231/2 239/234/2 175/107/2 +f 148/233/2 213/235/2 149/110/2 +f 323/236/2 322/237/2 324/238/2 +f 321/239/2 320/240/2 322/237/2 +f 319/241/2 318/242/2 320/240/2 +f 317/243/2 316/244/2 318/242/2 +f 315/245/2 314/246/2 316/244/2 +f 313/247/2 312/248/2 314/246/2 +f 311/249/2 310/250/2 312/248/2 +f 309/251/2 308/252/2 310/250/2 +f 307/253/2 306/254/2 308/252/2 +f 305/255/2 304/256/2 306/254/2 +f 303/257/2 302/258/2 304/256/2 +f 301/259/2 300/260/2 302/258/2 +f 299/261/2 298/262/2 300/260/2 +f 297/263/2 296/264/2 298/262/2 +f 295/265/2 294/266/2 296/264/2 +f 293/267/2 292/268/2 294/266/2 +f 291/269/2 290/270/2 292/271/2 +f 289/272/2 288/273/2 290/270/2 +f 287/274/2 286/275/2 288/273/2 +f 285/276/2 284/277/2 286/275/2 +f 283/278/2 282/279/2 284/277/2 +f 281/280/2 280/281/2 282/279/2 +f 279/282/2 278/283/2 280/281/2 +f 277/284/2 276/285/2 278/283/2 +f 275/286/2 274/287/2 276/285/2 +f 273/288/2 272/289/2 274/287/2 +f 271/290/2 270/291/2 272/289/2 +f 269/292/2 268/293/2 270/291/2 +f 267/294/2 266/295/2 268/293/2 +f 265/296/2 264/297/2 266/295/2 +f 263/298/2 262/299/2 264/297/2 +f 261/267/2 324/300/2 262/299/2 +f 322/237/2 320/240/2 324/238/2 +f 318/242/2 316/244/2 320/240/2 +f 314/246/2 312/248/2 316/244/2 +f 310/250/2 308/252/2 312/248/2 +f 306/254/2 304/256/2 308/252/2 +f 302/258/2 300/260/2 304/256/2 +f 298/262/2 296/264/2 300/260/2 +f 294/266/2 292/268/2 296/264/2 +f 290/270/2 288/273/2 292/271/2 +f 286/275/2 284/277/2 288/273/2 +f 282/279/2 280/281/2 284/277/2 +f 278/283/2 276/285/2 280/281/2 +f 274/287/2 272/289/2 276/285/2 +f 270/291/2 268/293/2 272/289/2 +f 266/295/2 264/297/2 268/293/2 +f 262/299/2 324/300/2 264/297/2 +f 320/240/2 316/244/2 324/238/2 +f 312/248/2 308/252/2 316/244/2 +f 304/256/2 300/260/2 308/252/2 +f 296/264/2 292/268/2 300/260/2 +f 288/273/2 284/277/2 292/271/2 +f 280/281/2 276/285/2 284/277/2 +f 272/289/2 268/293/2 276/285/2 +f 264/297/2 324/300/2 268/293/2 +f 316/244/2 308/252/2 324/238/2 +f 300/260/2 292/268/2 308/252/2 +f 284/277/2 276/285/2 292/271/2 +f 268/293/2 324/300/2 276/285/2 +f 308/252/2 292/268/2 324/238/2 +f 292/271/2 276/285/2 324/300/2 +f 350/301/2 413/302/2 414/303/2 +f 377/304/2 440/305/2 441/306/2 +f 350/301/2 415/307/2 351/308/2 +f 377/304/2 442/309/2 378/310/2 +f 351/308/2 416/311/2 352/312/2 +f 325/313/2 390/314/2 326/315/2 +f 378/310/2 443/316/2 379/317/2 +f 353/318/2 416/311/2 417/319/2 +f 327/320/2 390/314/2 391/321/2 +f 380/322/2 443/316/2 444/323/2 +f 353/318/2 418/324/2 354/325/2 +f 327/320/2 392/326/2 328/327/2 +f 380/322/2 445/328/2 381/329/2 +f 354/325/2 419/330/2 355/331/2 +f 328/327/2 393/332/2 329/333/2 +f 382/334/2 445/328/2 446/335/2 +f 355/331/2 420/336/2 356/337/2 +f 329/333/2 394/338/2 330/339/2 +f 382/334/2 447/340/2 383/341/2 +f 357/342/2 420/336/2 421/343/2 +f 330/339/2 395/344/2 331/345/2 +f 383/341/2 448/346/2 384/347/2 +f 357/342/2 422/348/2 358/349/2 +f 332/350/2 395/344/2 396/351/2 +f 385/352/2 448/346/2 449/353/2 +f 359/354/2 422/348/2 423/355/2 +f 332/350/2 397/356/2 333/357/2 +f 385/352/2 450/358/2 386/359/2 +f 359/354/2 424/360/2 360/361/2 +f 334/362/2 397/356/2 398/363/2 +f 386/359/2 451/364/2 387/365/2 +f 361/366/2 424/360/2 425/367/2 +f 334/362/2 399/368/2 335/369/2 +f 387/365/2 452/370/2 388/371/2 +f 361/366/2 426/372/2 362/373/2 +f 335/369/2 400/374/2 336/375/2 +f 325/376/2 452/370/2 389/377/2 +f 362/373/2 427/378/2 363/379/2 +f 337/380/2 400/374/2 401/381/2 +f 364/382/2 427/378/2 428/383/2 +f 337/380/2 402/384/2 338/385/2 +f 364/382/2 429/386/2 365/387/2 +f 338/385/2 403/388/2 339/389/2 +f 366/390/2 429/386/2 430/391/2 +f 339/389/2 404/392/2 340/393/2 +f 366/390/2 431/394/2 367/395/2 +f 341/396/2 404/392/2 405/397/2 +f 367/395/2 432/398/2 368/399/2 +f 341/396/2 406/400/2 342/401/2 +f 369/402/2 432/398/2 433/403/2 +f 343/404/2 406/400/2 407/405/2 +f 369/402/2 434/406/2 370/407/2 +f 343/404/2 408/408/2 344/409/2 +f 370/407/2 435/410/2 371/411/2 +f 345/412/2 408/408/2 409/413/2 +f 371/411/2 436/414/2 372/415/2 +f 345/412/2 410/416/2 346/417/2 +f 373/418/2 436/414/2 437/419/2 +f 346/417/2 411/420/2 347/421/2 +f 373/418/2 438/422/2 374/423/2 +f 348/424/2 411/420/2 412/425/2 +f 375/426/2 438/422/2 439/427/2 +f 348/424/2 413/302/2 349/428/2 +f 375/426/2 440/305/2 376/429/2 +f 109/1/1 108/105/1 44/2/1 +f 83/4/1 82/106/1 18/5/1 +f 46/7/1 110/430/1 109/1/1 +f 20/8/1 84/431/1 83/4/1 +f 111/9/1 110/430/1 46/7/1 +f 85/11/1 84/431/1 20/8/1 +f 48/13/1 112/16/1 111/9/1 +f 22/14/1 86/432/1 85/11/1 +f 49/15/1 113/20/1 112/16/1 +f 87/17/1 86/432/1 22/14/1 +f 50/19/1 114/433/1 113/20/1 +f 24/21/1 88/434/1 87/17/1 +f 115/22/1 114/433/1 50/19/1 +f 89/24/1 88/434/1 24/21/1 +f 52/26/1 116/435/1 115/22/1 +f 26/27/1 90/436/1 89/24/1 +f 117/28/1 116/435/1 52/26/1 +f 91/30/1 90/436/1 26/27/1 +f 54/32/1 118/437/1 117/28/1 +f 92/33/1 91/30/1 27/31/1 +f 66/35/1 65/438/1 1/36/1 +f 119/38/1 118/437/1 54/32/1 +f 93/40/1 92/33/1 28/34/1 +f 67/42/1 66/35/1 2/37/1 +f 56/44/1 120/439/1 119/38/1 +f 30/45/1 94/440/1 93/40/1 +f 4/46/1 68/441/1 67/42/1 +f 121/47/1 120/439/1 56/44/1 +f 95/49/1 94/440/1 30/45/1 +f 69/51/1 68/441/1 4/46/1 +f 58/53/1 122/442/1 121/47/1 +f 32/54/1 96/59/1 95/49/1 +f 6/55/1 70/61/1 69/51/1 +f 123/56/1 122/442/1 58/53/1 +f 33/58/1 97/65/1 96/59/1 +f 7/60/1 71/67/1 70/61/1 +f 124/62/1 123/56/1 59/57/1 +f 34/64/1 98/443/1 97/65/1 +f 8/66/1 72/444/1 71/67/1 +f 125/68/1 124/62/1 60/63/1 +f 99/70/1 98/443/1 34/64/1 +f 73/72/1 72/444/1 8/66/1 +f 62/74/1 126/445/1 125/68/1 +f 36/75/1 100/446/1 99/70/1 +f 10/76/1 74/447/1 73/72/1 +f 127/77/1 126/445/1 62/74/1 +f 101/79/1 100/446/1 36/75/1 +f 75/81/1 74/447/1 10/76/1 +f 64/83/1 128/448/1 127/77/1 +f 38/84/1 102/449/1 101/79/1 +f 76/85/1 75/81/1 11/82/1 +f 65/87/1 128/448/1 64/83/1 +f 103/89/1 102/449/1 38/84/1 +f 77/91/1 76/85/1 12/86/1 +f 40/93/1 104/450/1 103/89/1 +f 14/94/1 78/451/1 77/91/1 +f 105/95/1 104/450/1 40/93/1 +f 79/97/1 78/451/1 14/94/1 +f 42/99/1 106/452/1 105/95/1 +f 16/100/1 80/453/1 79/97/1 +f 107/101/1 106/452/1 42/99/1 +f 81/103/1 80/453/1 16/100/1 +f 108/105/1 107/101/1 43/102/1 +f 82/106/1 81/103/1 17/104/1 +f 175/107/2 239/234/2 240/108/2 +f 149/110/2 213/235/2 214/111/2 +f 177/113/2 176/109/2 240/108/2 +f 151/115/2 150/112/2 214/111/2 +f 177/113/2 241/114/2 242/117/2 +f 151/115/2 215/116/2 216/119/2 +f 179/121/2 178/118/2 242/117/2 +f 153/123/2 152/120/2 216/119/2 +f 179/121/2 243/122/2 244/125/2 +f 153/123/2 217/124/2 218/127/2 +f 180/126/2 244/125/2 245/129/2 +f 155/131/2 154/128/2 218/127/2 +f 181/130/2 245/129/2 246/133/2 +f 155/131/2 219/132/2 220/135/2 +f 183/137/2 182/134/2 246/133/2 +f 157/139/2 156/136/2 220/135/2 +f 183/137/2 247/138/2 248/141/2 +f 157/139/2 221/140/2 222/143/2 +f 185/145/2 184/142/2 248/141/2 +f 158/144/2 222/143/2 223/147/2 +f 132/149/2 196/454/2 197/150/2 +f 186/152/2 185/145/2 249/146/2 +f 159/148/2 223/147/2 224/154/2 +f 133/151/2 197/150/2 198/156/2 +f 186/152/2 250/153/2 251/158/2 +f 161/160/2 160/155/2 224/154/2 +f 135/162/2 134/157/2 198/156/2 +f 187/159/2 251/158/2 252/164/2 +f 161/160/2 225/161/2 226/166/2 +f 135/162/2 199/163/2 200/168/2 +f 189/170/2 188/165/2 252/164/2 +f 163/172/2 162/167/2 226/166/2 +f 137/174/2 136/169/2 200/168/2 +f 189/170/2 253/171/2 254/176/2 +f 164/178/2 163/172/2 227/173/2 +f 138/180/2 137/174/2 201/175/2 +f 190/177/2 254/176/2 255/182/2 +f 164/178/2 228/179/2 229/184/2 +f 138/180/2 202/181/2 203/186/2 +f 191/183/2 255/182/2 256/188/2 +f 165/185/2 229/184/2 230/190/2 +f 139/187/2 203/186/2 204/192/2 +f 193/194/2 192/189/2 256/188/2 +f 167/196/2 166/191/2 230/190/2 +f 141/198/2 140/193/2 204/192/2 +f 193/194/2 257/195/2 258/200/2 +f 167/196/2 231/197/2 232/202/2 +f 141/198/2 205/199/2 206/204/2 +f 195/206/2 194/201/2 258/200/2 +f 169/208/2 168/203/2 232/202/2 +f 142/205/2 206/204/2 207/210/2 +f 195/206/2 259/207/2 196/212/2 +f 169/208/2 233/209/2 234/214/2 +f 143/211/2 207/210/2 208/216/2 +f 171/218/2 170/215/2 234/214/2 +f 145/220/2 144/217/2 208/216/2 +f 171/218/2 235/219/2 236/222/2 +f 145/220/2 209/221/2 210/224/2 +f 173/226/2 172/223/2 236/222/2 +f 147/228/2 146/225/2 210/224/2 +f 173/226/2 237/227/2 238/230/2 +f 147/228/2 211/229/2 212/232/2 +f 174/231/2 238/230/2 239/234/2 +f 148/233/2 212/232/2 213/235/2 +f 350/301/2 349/428/2 413/302/2 +f 377/304/2 376/429/2 440/305/2 +f 350/301/2 414/303/2 415/307/2 +f 377/304/2 441/306/2 442/309/2 +f 351/308/2 415/307/2 416/311/2 +f 325/313/2 389/455/2 390/314/2 +f 378/310/2 442/309/2 443/316/2 +f 353/318/2 352/312/2 416/311/2 +f 327/320/2 326/315/2 390/314/2 +f 380/322/2 379/317/2 443/316/2 +f 353/318/2 417/319/2 418/324/2 +f 327/320/2 391/321/2 392/326/2 +f 380/322/2 444/323/2 445/328/2 +f 354/325/2 418/324/2 419/330/2 +f 328/327/2 392/326/2 393/332/2 +f 382/334/2 381/329/2 445/328/2 +f 355/331/2 419/330/2 420/336/2 +f 329/333/2 393/332/2 394/338/2 +f 382/334/2 446/335/2 447/340/2 +f 357/342/2 356/337/2 420/336/2 +f 330/339/2 394/338/2 395/344/2 +f 383/341/2 447/340/2 448/346/2 +f 357/342/2 421/343/2 422/348/2 +f 332/350/2 331/345/2 395/344/2 +f 385/352/2 384/347/2 448/346/2 +f 359/354/2 358/349/2 422/348/2 +f 332/350/2 396/351/2 397/356/2 +f 385/352/2 449/353/2 450/358/2 +f 359/354/2 423/355/2 424/360/2 +f 334/362/2 333/357/2 397/356/2 +f 386/359/2 450/358/2 451/364/2 +f 361/366/2 360/361/2 424/360/2 +f 334/362/2 398/363/2 399/368/2 +f 387/365/2 451/364/2 452/370/2 +f 361/366/2 425/367/2 426/372/2 +f 335/369/2 399/368/2 400/374/2 +f 325/376/2 388/371/2 452/370/2 +f 362/373/2 426/372/2 427/378/2 +f 337/380/2 336/375/2 400/374/2 +f 364/382/2 363/379/2 427/378/2 +f 337/380/2 401/381/2 402/384/2 +f 364/382/2 428/383/2 429/386/2 +f 338/385/2 402/384/2 403/388/2 +f 366/390/2 365/387/2 429/386/2 +f 339/389/2 403/388/2 404/392/2 +f 366/390/2 430/391/2 431/394/2 +f 341/396/2 340/393/2 404/392/2 +f 367/395/2 431/394/2 432/398/2 +f 341/396/2 405/397/2 406/400/2 +f 369/402/2 368/399/2 432/398/2 +f 343/404/2 342/401/2 406/400/2 +f 369/402/2 433/403/2 434/406/2 +f 343/404/2 407/405/2 408/408/2 +f 370/407/2 434/406/2 435/410/2 +f 345/412/2 344/409/2 408/408/2 +f 371/411/2 435/410/2 436/414/2 +f 345/412/2 409/413/2 410/416/2 +f 373/418/2 372/415/2 436/414/2 +f 346/417/2 410/416/2 411/420/2 +f 373/418/2 437/419/2 438/422/2 +f 348/424/2 347/421/2 411/420/2 +f 375/426/2 374/423/2 438/422/2 +f 348/424/2 412/425/2 413/302/2 +f 375/426/2 439/427/2 440/305/2 +l 107 129 +l 130 131 +l 238 260 diff --git a/src/main/resources/assets/gregtech/textures/model/blackhole.png b/src/main/resources/assets/gregtech/textures/model/blackhole.png new file mode 100644 index 00000000000..887e0bdf1eb Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/model/blackhole.png differ diff --git a/src/main/resources/assets/gregtech/textures/model/laser.png b/src/main/resources/assets/gregtech/textures/model/laser.png new file mode 100644 index 00000000000..8ca8f8e057c Binary files /dev/null and b/src/main/resources/assets/gregtech/textures/model/laser.png differ