aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMary <33456283+FourIsTheNumber@users.noreply.github.com>2024-09-07 09:16:14 -0400
committerGitHub <noreply@github.com>2024-09-07 13:16:14 +0000
commitf2c0a4fc6b65749871b60580a6f65374f589b994 (patch)
tree47d7ffeb0f74eb49fb707b6dfd001c6052c4ebeb /src/main
parent67607edb5343c892e46767db782da3b7da0f4c5a (diff)
downloadGT5-Unofficial-f2c0a4fc6b65749871b60580a6f65374f589b994.tar.gz
GT5-Unofficial-f2c0a4fc6b65749871b60580a6f65374f589b994.tar.bz2
GT5-Unofficial-f2c0a4fc6b65749871b60580a6f65374f589b994.zip
Finishing touches on black hole compressor (#3060)
Co-authored-by: Martin Robertz <dream-master@gmx.net> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: BucketBrigade <138534411+CookieBrigade@users.noreply.github.com>
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/gregtech/api/GregTechAPI.java1
-rw-r--r--src/main/java/gregtech/api/enums/Textures.java18
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/MTEBasicMachine.java3
-rw-r--r--src/main/java/gregtech/common/GTClient.java2
-rw-r--r--src/main/java/gregtech/common/blocks/BlockBlackholeRenderer.java74
-rw-r--r--src/main/java/gregtech/common/items/MetaGeneratedItem01.java4
-rw-r--r--src/main/java/gregtech/common/render/BlackholeRenderer.java222
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEBlackHoleCompressor.java382
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHIPCompressor.java15
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEHeatSensor.java4
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTEIndustrialCompressor.java17
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/multi/compressor/MTENeutroniumCompressor.java16
-rw-r--r--src/main/java/gregtech/common/tileentities/render/TileEntityBlackhole.java99
-rw-r--r--src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java2
-rw-r--r--src/main/java/gregtech/loaders/preload/LoaderGTBlockFluid.java6
-rw-r--r--src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/processing/steam/MTESteamCompressor.java3
-rw-r--r--src/main/resources/assets/gregtech/shaders/blackhole.frag.glsl42
-rw-r--r--src/main/resources/assets/gregtech/shaders/blackhole.vert.glsl81
-rw-r--r--src/main/resources/assets/gregtech/shaders/laser.frag.glsl25
-rw-r--r--src/main/resources/assets/gregtech/shaders/laser.vert.glsl47
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR.png (renamed from src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE.png)bin1711 -> 1711 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_HEAT_SENSOR_GLOW.png (renamed from src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_HATCH_BLACKHOLE_GLOW.png)bin1702 -> 1702 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE.pngbin0 -> 217 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.pngbin0 -> 394 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.pngbin0 -> 316 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_GLOW.pngbin0 -> 131 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.pngbin0 -> 391 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.pngbin0 -> 315 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM.pngbin0 -> 228 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.pngbin0 -> 444 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.pngbin0 -> 375 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_GLOW.pngbin0 -> 176 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.pngbin164 -> 553 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/418.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.pngbin164 -> 550 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/items/gt.metaitem.01/419.png.mcmeta1
-rw-r--r--src/main/resources/assets/gregtech/textures/model/blackhole.obj1364
-rw-r--r--src/main/resources/assets/gregtech/textures/model/blackhole.pngbin0 -> 81661 bytes
-rw-r--r--src/main/resources/assets/gregtech/textures/model/laser.pngbin0 -> 155 bytes
45 files changed, 2296 insertions, 139 deletions
diff --git a/src/main/java/gregtech/api/GregTechAPI.java b/src/main/java/gregtech/api/GregTechAPI.java
index e10c773579..e9cfe16237 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 bd90cfe8ab..4eace204e6 100644
--- a/src/main/java/gregtech/api/enums/Textures.java
+++ b/src/main/java/gregtech/api/enums/Textures.java
@@ -346,6 +346,21 @@ public class Textures {
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 class Textures {
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 ee83857953..0bfff97895 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_STUTTERING_TOOL
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 abstract class MTEBasicMachine extends MTEBasicTank implements RecipeMapW
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 127c801b40..276bc7a78a 100644
--- a/src/main/java/gregtech/common/GTClient.java
+++ b/src/main/java/gregtech/common/GTClient.java
@@ -91,6 +91,7 @@ import gregtech.api.util.WorldSpawnedEventBuilder;
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 class GTClient extends GTProxy implements Runnable {
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 0000000000..84d61172c3
--- /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<ItemStack> 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 ab9917435c..5fcb02b657 100644
--- a/src/main/java/gregtech/common/items/MetaGeneratedItem01.java
+++ b/src/main/java/gregtech/common/items/MetaGeneratedItem01.java
@@ -3203,14 +3203,14 @@ public class MetaGeneratedItem01 extends MetaGeneratedItemX32 {
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 0000000000..733bd3aa9e
--- /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 ba893e045d..367b529bc3 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 javax.annotation.Nonnull;
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.Materials;
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.render.TextureFactory;
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<MTEBl
.addElement('A', ofBlock(GregTechAPI.sBlockGlass1, 4))
.addElement(
'B',
- buildHatchAdder(MTEBlackHoleCompressor.class).atLeast(Maintenance, Energy)
+ buildHatchAdder(MTEBlackHoleCompressor.class)
+ .atLeast(Energy.or(ExoticEnergy), InputBus, OutputBus, InputHatch)
.casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(12))
.dot(2)
.buildAndChain(
@@ -120,17 +130,23 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
.addElement('D', ofFrame(Materials.NaquadahAlloy))
.addElement(
'E',
- buildHatchAdder(MTEBlackHoleCompressor.class).atLeast(InputBus, OutputBus, InputHatch)
+ buildHatchAdder(MTEBlackHoleCompressor.class).atLeast(InputHatch)
+ .adder(MTEBlackHoleCompressor::addSpacetimeInput)
.casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(11))
.dot(1)
- .buildAndChain(
- onElementPass(MTEBlackHoleCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 11))))
-
+ .buildAndChain(ofBlock(GregTechAPI.sBlockCasings10, 11)))
.build();
- private boolean blackholeOn = false;
private int catalyzingCounter = 0;
private float blackHoleStability = 100;
+ private final ArrayList<MTEHatchInput> 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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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<MTEBlackHoleCompressor> getStructureDefinition() {
return STRUCTURE_DEFINITION;
@@ -171,15 +203,39 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
@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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
@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 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
} else currentTip.add(EnumChatFormatting.DARK_PURPLE + "Black Hole Offline");
}
+ byte energyHatchTier = 0;
+
@Override
protected ProcessingLogic createProcessingLogic() {
return new ProcessingLogic() {
@@ -394,15 +468,18 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
// 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;
}
}
@@ -412,19 +489,32 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
@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 @@ public class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
@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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 class MTEBlackHoleCompressor extends MTEExtendedPowerMultiBlockBase<MTEBl
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 2491dcff38..aeda7d0cd6 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.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;
@@ -74,10 +75,10 @@ public class MTEHIPCompressor extends MTEExtendedPowerMultiBlockBase<MTEHIPCompr
{" BBB "," BBBBB "," BBBBBBB "," C BBBBBBB D "," BBBBBBB "," BBBBB "," BBB "},
{" HHH "," B B "," BF FB "," C BF FB D "," BF FB "," B B "," HHH "},
{" HAH "," B B "," GF FG "," C GF FG D "," GF FG "," B B "," HAH "},
- {" HAH "," B B "," E GF FG E ","EEE GF FG EEE"," E GF FG E "," B B "," HAH "},
+ {" HAH "," B B "," B GF FG B ","BBB GF FG BBB"," B GF FG B "," B B "," HAH "},
{" HAH "," B B "," A GF FG A ","A A GF FG A A"," A GF FG A "," B B "," HAH "},
{" HHH "," B B "," A BF FB A ","A A BF FB A A"," A BF FB A "," B B "," HHH "},
- {" B~B "," BBBBB "," E BBBBBBB E ","EEE BBBBBBB EEE"," E BBBBBBB E "," BBBBB "," BBB "}
+ {" B~B "," BBBBB "," B BBBBBBB B ","BBB BBBBBBB BBB"," B BBBBBBB B "," BBBBB "," BBB "}
}))
//spotless:on
.addElement('A', Glasses.chainAllGlasses())
@@ -89,13 +90,12 @@ public class MTEHIPCompressor extends MTEExtendedPowerMultiBlockBase<MTEHIPCompr
.buildAndChain(onElementPass(MTEHIPCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 4))))
.addElement('C', ofBlock(GregTechAPI.sBlockCasings10, 9))
.addElement('D', ofBlock(GregTechAPI.sBlockCasings10, 10))
- .addElement('E', ofBlock(GregTechAPI.sBlockCasings4, 1))
.addElement('F', ofCoil(MTEHIPCompressor::setCoilLevel, MTEHIPCompressor::getCoilLevel))
.addElement(
'G',
buildHatchAdder(MTEHIPCompressor.class).atLeast(InputBus, OutputBus)
.casingIndex(((BlockCasings10) GregTechAPI.sBlockCasings10).getTextureIndex(5))
- .dot(1)
+ .dot(2)
.buildAndChain(onElementPass(MTEHIPCompressor::onCasingAdded, ofBlock(GregTechAPI.sBlockCasings10, 5))))
.addElement('H', ofBlock(GregTechAPI.sBlockCasings10, 5))
.build();
@@ -376,7 +376,12 @@ public class MTEHIPCompressor extends MTEExtendedPowerMultiBlockBase<MTEHIPCompr
setEuModifier(1.1F);
}
- if (recipe.getMetadataOrDefault(CompressionTierKey.INSTANCE, 1) > 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 8ea57bc1cf..82f9d43506 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 e21da1856f..c887d1cf03 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.item.ItemStack;
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.metatileentity.implementations.MTEExtendedPowerMultiBlockBas
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 @@ public class MTEIndustrialCompressor extends MTEExtendedPowerMultiBlockBase<MTEI
@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 323e09f61b..f5326e284e 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.Energy;
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 class MTENeutroniumCompressor extends MTEExtendedPowerMultiBlockBase<MTEN
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 class MTENeutroniumCompressor extends MTEExtendedPowerMultiBlockBase<MTEN
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 0000000000..5cd59d2cf4
--- /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 9c1c4904db..619ff7a7ed 100644
--- a/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
+++ b/src/main/java/gregtech/loaders/oreprocessing/ProcessingPlate.java
@@ -441,7 +441,7 @@ public class ProcessingPlate implements gregtech.api.interfaces.IOreRecipeRegist
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 0072a8148c..c3bf4d5031 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.GTLog;
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.MetaGeneratedItem03;
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 class LoaderGTBlockFluid implements Runnable {
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 class LoaderGTBlockFluid implements Runnable {
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 6db6175896..a4ecc3f3e8 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.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.util.GTRecipe;
import gregtech.api.util.MultiblockTooltipBuilder;
import gregtech.api.util.OverclockCalculator;
@@ -246,6 +247,8 @@ public class MTESteamCompressor extends MTESteamMultiBase<MTESteamCompressor> im
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 0000000000..4334dde59e
--- /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 0000000000..57cea0b81c
--- /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 0000000000..45656e8767
--- /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 0000000000..9acecf5da9
--- /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
index e849b26703..e849b26703 100644
--- 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
Binary files differ
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
index 36dd0187dd..36dd0187dd 100644
--- 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
Binary files differ
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 0000000000..082971beaf
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE.png
Binary files 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 0000000000..a59e5ff444
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..0e6ec1e1bb
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_ACTIVE_GLOW.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..b73ee2bea6
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_GLOW.png
Binary files 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 0000000000..78e274f090
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..09212f35b5
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_BLACKHOLE_UNSTABLE_GLOW.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..2a83255485
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM.png
Binary files 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 0000000000..b3dc6c72fa
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..c4ca221c51
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_ACTIVE_GLOW.png
Binary files 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 0000000000..14578b550b
--- /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 0000000000..5ce6544e39
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/blocks/iconsets/OVERLAY_MULTI_NEUTRONIUM_GLOW.png
Binary files 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 79b2881931..9fb3c704c9 100644
--- 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
Binary files 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 0000000000..14578b550b
--- /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 95eae6ea59..f29c8748f2 100644
--- 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
Binary files 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 0000000000..14578b550b
--- /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 0000000000..2ae4ff064e
--- /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 0000000000..887e0bdf1e
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/model/blackhole.png
Binary files 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 0000000000..8ca8f8e057
--- /dev/null
+++ b/src/main/resources/assets/gregtech/textures/model/laser.png
Binary files differ