From 76a2834cedfa4f3916d07e2893fc54121268489e Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Wed, 17 Aug 2022 05:01:16 +0200 Subject: Structure --- src/main/java/kubatech/api/LoaderReference.java | 1 + .../api/network/CustomTileEntityPacket.java | 119 +++++++++++++++++++++ .../kubatech/api/network/LoadConfigPacket.java | 74 +++++++++++++ .../tileentity/CustomTileEntityPacketHandler.java | 7 ++ .../java/kubatech/api/utils/InfernalHelper.java | 1 + src/main/java/kubatech/api/utils/MobUtils.java | 57 ++++++++++ .../java/kubatech/api/utils/ReflectionHelper.java | 9 +- 7 files changed, 262 insertions(+), 6 deletions(-) create mode 100644 src/main/java/kubatech/api/network/CustomTileEntityPacket.java create mode 100644 src/main/java/kubatech/api/network/LoadConfigPacket.java create mode 100644 src/main/java/kubatech/api/tileentity/CustomTileEntityPacketHandler.java create mode 100644 src/main/java/kubatech/api/utils/MobUtils.java (limited to 'src/main/java/kubatech/api') diff --git a/src/main/java/kubatech/api/LoaderReference.java b/src/main/java/kubatech/api/LoaderReference.java index aef8930905..418fe4a7ab 100644 --- a/src/main/java/kubatech/api/LoaderReference.java +++ b/src/main/java/kubatech/api/LoaderReference.java @@ -9,4 +9,5 @@ public class LoaderReference { public static final boolean InfernalMobs = Loader.isModLoaded("InfernalMobs"); public static final boolean Thaumcraft = Loader.isModLoaded("Thaumcraft"); public static final boolean MineTweaker = Loader.isModLoaded("MineTweaker3"); + public static final boolean Bartworks = Loader.isModLoaded("bartworks"); } diff --git a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java new file mode 100644 index 0000000000..9236594647 --- /dev/null +++ b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java @@ -0,0 +1,119 @@ +package kubatech.api.network; + +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import gregtech.api.interfaces.metatileentity.IMetaTileEntity; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.nio.charset.StandardCharsets; +import kubatech.api.tileentity.CustomTileEntityPacketHandler; +import kubatech.api.utils.ModUtils; +import kubatech.kubatech; +import net.minecraft.client.Minecraft; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +public class CustomTileEntityPacket implements IMessage { + public int w, x, y, z; + public ByteBuf customdata = Unpooled.buffer(); + + @SuppressWarnings("unused") + public CustomTileEntityPacket() {} + + public CustomTileEntityPacket(TileEntity te, byte[] customdata) { + this.w = te.getWorldObj().provider.dimensionId; + this.x = te.xCoord; + this.y = te.yCoord; + this.z = te.zCoord; + if (customdata != null && customdata.length > 0) this.customdata.writeBytes(customdata); + } + + public void sendToAllAround(int range) { + kubatech.NETWORK.sendToAllAround(this, new NetworkRegistry.TargetPoint(w, x, y, z, range)); + } + + // Helper methods + + public void resetHelperData() { + customdata.clear(); + } + + public void addData(byte[] data) { + customdata.writeBytes(data); + } + + public void addData(byte data) { + customdata.writeByte(data); + } + + public void addData(int data) { + customdata.writeInt(data); + } + + public void addData(String data) { + byte[] bytes = data.getBytes(StandardCharsets.UTF_8); + addData(bytes.length); + addData(bytes); + } + + public void getData(byte[] bytes) { + customdata.readBytes(bytes); + } + + public byte[] getData(int len) { + byte[] bytes = new byte[len]; + getData(bytes); + return bytes; + } + + public int getDataInt() { + return customdata.readInt(); + } + + public String getDataString() { + return new String(getData(getDataInt()), StandardCharsets.UTF_8); + } + + @Override + public void fromBytes(ByteBuf buf) { + w = buf.readInt(); + x = buf.readInt(); + y = buf.readInt(); + z = buf.readInt(); + customdata.clear(); + buf.readBytes(customdata, buf.readInt()); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(w); + buf.writeInt(x); + buf.writeInt(y); + buf.writeInt(z); + buf.writeInt(customdata.readableBytes()); + buf.writeBytes(customdata); + } + + public static class Handler implements IMessageHandler { + @Override + public IMessage onMessage(CustomTileEntityPacket message, MessageContext ctx) { + if (!ModUtils.isClientSided) return null; + World w = Minecraft.getMinecraft().thePlayer.getEntityWorld(); + if (message.w != w.provider.dimensionId) return null; + TileEntity e = w.getTileEntity(message.x, message.y, message.z); + if (e == null || e.isInvalid()) return null; + if (e instanceof IGregTechTileEntity && !((IGregTechTileEntity) e).isInvalidTileEntity()) { + IMetaTileEntity mte = ((IGregTechTileEntity) e).getMetaTileEntity(); + if (mte == null) return null; + if (!(mte instanceof CustomTileEntityPacketHandler)) return null; + ((CustomTileEntityPacketHandler) mte).HandleCustomPacket(message); + return null; + } else if (!(e instanceof CustomTileEntityPacketHandler)) return null; + ((CustomTileEntityPacketHandler) e).HandleCustomPacket(message); + return null; + } + } +} diff --git a/src/main/java/kubatech/api/network/LoadConfigPacket.java b/src/main/java/kubatech/api/network/LoadConfigPacket.java new file mode 100644 index 0000000000..f38293642e --- /dev/null +++ b/src/main/java/kubatech/api/network/LoadConfigPacket.java @@ -0,0 +1,74 @@ +/* + * KubaTech - Gregtech Addon + * Copyright (C) 2022 kuba6000 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + * + */ + +package kubatech.api.network; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; +import java.nio.charset.StandardCharsets; +import java.util.HashSet; +import kubatech.Config; +import kubatech.kubatech; +import kubatech.loaders.MobRecipeLoader; + +public class LoadConfigPacket implements IMessage { + + public static final LoadConfigPacket instance = new LoadConfigPacket(); + + public final HashSet mobsToLoad = new HashSet<>(); + + @Override + public void fromBytes(ByteBuf buf) { + if (!buf.readBoolean()) mobsToLoad.clear(); + else { + mobsToLoad.clear(); + int mobssize = buf.readInt(); + for (int i = 0; i < mobssize; i++) { + byte[] sbytes = new byte[buf.readInt()]; + buf.readBytes(sbytes); + mobsToLoad.add(new String(sbytes, StandardCharsets.UTF_8)); + } + } + } + + @Override + public void toBytes(ByteBuf buf) { + if (!Config.mobHandlerEnabled) buf.writeBoolean(false); + else { + buf.writeBoolean(true); + buf.writeInt(mobsToLoad.size()); + mobsToLoad.forEach(s -> { + byte[] sbytes = s.getBytes(StandardCharsets.UTF_8); + buf.writeInt(sbytes.length); + buf.writeBytes(sbytes); + }); + } + } + + public static class Handler implements IMessageHandler { + @Override + public IMessage onMessage(LoadConfigPacket message, MessageContext ctx) { + kubatech.info("Received Mob Handler config, parsing"); + MobRecipeLoader.processMobRecipeMap(message.mobsToLoad); + return null; + } + } +} diff --git a/src/main/java/kubatech/api/tileentity/CustomTileEntityPacketHandler.java b/src/main/java/kubatech/api/tileentity/CustomTileEntityPacketHandler.java new file mode 100644 index 0000000000..643ca70d0f --- /dev/null +++ b/src/main/java/kubatech/api/tileentity/CustomTileEntityPacketHandler.java @@ -0,0 +1,7 @@ +package kubatech.api.tileentity; + +import kubatech.api.network.CustomTileEntityPacket; + +public interface CustomTileEntityPacketHandler { + void HandleCustomPacket(CustomTileEntityPacket customdata); +} diff --git a/src/main/java/kubatech/api/utils/InfernalHelper.java b/src/main/java/kubatech/api/utils/InfernalHelper.java index 60263b0a17..4bd48274f3 100644 --- a/src/main/java/kubatech/api/utils/InfernalHelper.java +++ b/src/main/java/kubatech/api/utils/InfernalHelper.java @@ -27,6 +27,7 @@ import java.util.ArrayList; import net.minecraft.entity.EntityLivingBase; import net.minecraft.item.ItemStack; +@SuppressWarnings("unchecked") public class InfernalHelper { private static Method isClassAllowed = null; diff --git a/src/main/java/kubatech/api/utils/MobUtils.java b/src/main/java/kubatech/api/utils/MobUtils.java new file mode 100644 index 0000000000..3e20adac1c --- /dev/null +++ b/src/main/java/kubatech/api/utils/MobUtils.java @@ -0,0 +1,57 @@ +package kubatech.api.utils; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import java.lang.reflect.Field; +import net.minecraft.client.model.ModelBase; +import net.minecraft.client.model.ModelBox; +import net.minecraft.client.model.ModelRenderer; +import net.minecraft.client.renderer.entity.Render; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.entity.RendererLivingEntity; +import net.minecraft.entity.EntityLiving; + +public class MobUtils { + + private static Field mainmodelfield = null; + + @SideOnly(Side.CLIENT) + public static float getDesiredScale(EntityLiving e, float desiredHeight) { + try { + if (mainmodelfield == null) { + mainmodelfield = RendererLivingEntity.class.getDeclaredField( + ModUtils.isDeobfuscatedEnvironment ? "mainModel" : "field_77045_g"); + mainmodelfield.setAccessible(true); + } + float eheight = e.height; + float ewidth = e.width; + Render r = RenderManager.instance.getEntityRenderObject(e); + if (r instanceof RendererLivingEntity && mainmodelfield != null) { + ModelBase mainmodel = (ModelBase) mainmodelfield.get(r); + for (Object box : mainmodel.boxList) { + if (box instanceof ModelRenderer) { + float minY = 999f; + float minX = 999f; + float maxY = -999f; + float maxX = -999f; + for (Object cube : ((ModelRenderer) box).cubeList) { + if (cube instanceof ModelBox) { + if (minY > ((ModelBox) cube).posY1) minY = ((ModelBox) cube).posY1; + if (minX > ((ModelBox) cube).posX1) minX = ((ModelBox) cube).posX1; + if (maxY < ((ModelBox) cube).posY2) maxY = ((ModelBox) cube).posY2; + if (maxX < ((ModelBox) cube).posX2) maxX = ((ModelBox) cube).posX2; + } + } + float cubeheight = (maxY - minY) / 10f; + float cubewidth = (maxX - minX) / 10f; + if (eheight < cubeheight) eheight = cubeheight; + if (ewidth < cubewidth) ewidth = cubewidth; + } + } + } + return desiredHeight / eheight; + } catch (Exception ex) { + return 1f; + } + } +} diff --git a/src/main/java/kubatech/api/utils/ReflectionHelper.java b/src/main/java/kubatech/api/utils/ReflectionHelper.java index 7c7301c1c8..48d07c6eee 100644 --- a/src/main/java/kubatech/api/utils/ReflectionHelper.java +++ b/src/main/java/kubatech/api/utils/ReflectionHelper.java @@ -25,7 +25,8 @@ import java.util.HashMap; public class ReflectionHelper { private static final HashMap> fields = new HashMap<>(); - public static T getField(Object obj, String fieldName, boolean useBasicTypes, T defaultvalue) { + @SuppressWarnings("unchecked") + public static T getField(Object obj, String fieldName, T defaultvalue) { Class cl = obj.getClass(); String clName = cl.getName(); HashMap classmap = fields.computeIfAbsent(clName, s -> new HashMap<>()); @@ -52,11 +53,7 @@ public class ReflectionHelper { } } - public static T getField(Object obj, String fieldName, boolean useBasicTypes) { - return getField(obj, fieldName, useBasicTypes, null); - } - public static T getField(Object obj, String fieldName) { - return getField(obj, fieldName, true, null); + return getField(obj, fieldName, null); } } -- cgit From a78966a1dd5c638cdb27a7bddf009cd4cec51758 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Wed, 17 Aug 2022 20:26:14 +0200 Subject: Glass is optional --- .../api/network/CustomTileEntityPacket.java | 8 ++++ src/main/java/kubatech/api/utils/MobUtils.java | 12 +++++- .../kubatech/client/effect/EntityRenderer.java | 16 ++++++-- src/main/java/kubatech/nei/Mob_Handler.java | 44 +++++----------------- ...MetaTileEntity_ExtremeExterminationChamber.java | 39 +++++++++++++------ 5 files changed, 69 insertions(+), 50 deletions(-) (limited to 'src/main/java/kubatech/api') diff --git a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java index 9236594647..cd7bfd3389 100644 --- a/src/main/java/kubatech/api/network/CustomTileEntityPacket.java +++ b/src/main/java/kubatech/api/network/CustomTileEntityPacket.java @@ -59,6 +59,10 @@ public class CustomTileEntityPacket implements IMessage { addData(bytes); } + public void addData(boolean data) { + customdata.writeBoolean(data); + } + public void getData(byte[] bytes) { customdata.readBytes(bytes); } @@ -77,6 +81,10 @@ public class CustomTileEntityPacket implements IMessage { return new String(getData(getDataInt()), StandardCharsets.UTF_8); } + public boolean getDataBoolean() { + return customdata.readBoolean(); + } + @Override public void fromBytes(ByteBuf buf) { w = buf.readInt(); diff --git a/src/main/java/kubatech/api/utils/MobUtils.java b/src/main/java/kubatech/api/utils/MobUtils.java index 3e20adac1c..0b20364484 100644 --- a/src/main/java/kubatech/api/utils/MobUtils.java +++ b/src/main/java/kubatech/api/utils/MobUtils.java @@ -17,6 +17,16 @@ public class MobUtils { @SideOnly(Side.CLIENT) public static float getDesiredScale(EntityLiving e, float desiredHeight) { + return getDesiredScale(getMobHeight(e), desiredHeight); + } + + @SideOnly(Side.CLIENT) + public static float getDesiredScale(float entityHeight, float desiredHeight) { + return desiredHeight / entityHeight; + } + + @SideOnly(Side.CLIENT) + public static float getMobHeight(EntityLiving e) { try { if (mainmodelfield == null) { mainmodelfield = RendererLivingEntity.class.getDeclaredField( @@ -49,7 +59,7 @@ public class MobUtils { } } } - return desiredHeight / eheight; + return eheight; } catch (Exception ex) { return 1f; } diff --git a/src/main/java/kubatech/client/effect/EntityRenderer.java b/src/main/java/kubatech/client/effect/EntityRenderer.java index 23f1a6e44a..ed545b3cb6 100644 --- a/src/main/java/kubatech/client/effect/EntityRenderer.java +++ b/src/main/java/kubatech/client/effect/EntityRenderer.java @@ -1,6 +1,7 @@ package kubatech.client.effect; import static net.minecraft.client.renderer.entity.RenderManager.*; +import static org.lwjgl.opengl.GL11.GL_MODELVIEW_STACK_DEPTH; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -127,16 +128,25 @@ public class EntityRenderer extends EntityFX { GL11.glColor4f(1f, 1f, 1f, 1F); RenderHelper.enableStandardItemLighting(); GL11.glMatrixMode(GL11.GL_MODELVIEW); + int stackdepth = GL11.glGetInteger(GL_MODELVIEW_STACK_DEPTH); GL11.glPushMatrix(); GL11.glTranslatef( (float) (this.posX - renderPosX), (float) (this.posY - renderPosY), (float) (this.posZ - renderPosZ)); GL11.glEnable(GL12.GL_RESCALE_NORMAL); float desiredScale = MobUtils.getDesiredScale(entityToRender, 2f); if (desiredScale < 1f) GL11.glScalef(desiredScale, desiredScale, desiredScale); + try { + instance.renderEntityWithPosYaw(entityToRender, 0f, 0f, 0f, f1, p_147936_2_); + } catch (Throwable ex) { + Tessellator tes = Tessellator.instance; + try { + tes.draw(); + } catch (Exception ignored) { + } + } - instance.renderEntityWithPosYaw(entityToRender, 0f, 0f, 0f, f1, p_147936_2_); - - GL11.glPopMatrix(); + stackdepth -= GL11.glGetInteger(GL_MODELVIEW_STACK_DEPTH); + if (stackdepth < 0) for (; stackdepth < 0; stackdepth++) GL11.glPopMatrix(); GL11.glDisable(GL11.GL_LIGHTING); GL11.glDisable(GL11.GL_COLOR_MATERIAL); diff --git a/src/main/java/kubatech/nei/Mob_Handler.java b/src/main/java/kubatech/nei/Mob_Handler.java index 78294326c9..5418aa1488 100644 --- a/src/main/java/kubatech/nei/Mob_Handler.java +++ b/src/main/java/kubatech/nei/Mob_Handler.java @@ -38,6 +38,7 @@ import java.util.List; import kubatech.api.LoaderReference; import kubatech.api.utils.FastRandom; import kubatech.api.utils.InfernalHelper; +import kubatech.api.utils.MobUtils; import kubatech.api.utils.ModUtils; import kubatech.kubatech; import kubatech.loaders.MobRecipeLoader; @@ -45,12 +46,7 @@ import kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExtermin import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiInventory; -import net.minecraft.client.model.ModelBase; -import net.minecraft.client.model.ModelBox; -import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.renderer.Tessellator; -import net.minecraft.client.renderer.entity.Render; -import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RendererLivingEntity; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.EntityList; @@ -279,36 +275,9 @@ public class Mob_Handler extends TemplateRecipeHandler { try { EntityLiving e = currentrecipe.mob; - float eheight = e.height; - float ewidth = e.width; - - Render r = RenderManager.instance.getEntityRenderObject(e); - if (r instanceof RendererLivingEntity && mainmodelfield != null) { - ModelBase mainmodel = (ModelBase) mainmodelfield.get(r); - for (Object box : mainmodel.boxList) { - if (box instanceof ModelRenderer) { - float minY = 999f; - float minX = 999f; - float maxY = -999f; - float maxX = -999f; - for (Object cube : ((ModelRenderer) box).cubeList) { - if (cube instanceof ModelBox) { - if (minY > ((ModelBox) cube).posY1) minY = ((ModelBox) cube).posY1; - if (minX > ((ModelBox) cube).posX1) minX = ((ModelBox) cube).posX1; - if (maxY < ((ModelBox) cube).posY2) maxY = ((ModelBox) cube).posY2; - if (maxX < ((ModelBox) cube).posX2) maxX = ((ModelBox) cube).posX2; - } - } - float cubeheight = (maxY - minY) / 10f; - float cubewidth = (maxX - minX) / 10f; - if (eheight < cubeheight) eheight = cubeheight; - if (ewidth < cubewidth) ewidth = cubewidth; - } - } - } - int desiredheight = 27; - int scaled = (int) (desiredheight / eheight); + float eheight = MobUtils.getMobHeight(e); + float scaled = MobUtils.getDesiredScale(eheight, 27); // // int maxwidth = 15; // scaled = (int) Math.min(scaled, maxwidth / ewidth); @@ -317,7 +286,12 @@ public class Mob_Handler extends TemplateRecipeHandler { e.setPosition(mc.thePlayer.posX + 5, mc.thePlayer.posY, mc.thePlayer.posZ); // ARGS: x, y, scale, rot, rot, entity GuiInventory.func_147046_a( - mobx, moby, scaled, (float) (x + mobx) - mouseX, (float) (y + moby - eheight * scaled) - mouseZ, e); + mobx, + moby, + Math.round(scaled), + (float) (x + mobx) - mouseX, + (float) (y + moby - eheight * scaled) - mouseZ, + e); } catch (Throwable ex) { Tessellator tes = Tessellator.instance; try { diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java index b4ed94058b..29104036f5 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -130,9 +130,13 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber 1))) .addElement( 'g', - LoaderReference.Bartworks - ? BorosilicateGlass.ofBoroGlassAnyTier() - : ofBlock(Blocks.glass, 0)) + ofChain( + onElementPass( + t -> t.mGlasDetected = true, + LoaderReference.Bartworks + ? BorosilicateGlass.ofBoroGlassAnyTier() + : ofBlock(Blocks.glass, 0)), + ofBlock(GregTech_API.sBlockCasings2, 0))) .addElement( 's', LoaderReference.ExtraUtilities @@ -144,8 +148,10 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private TileEntity tileAltar = null; private boolean isInRitualMode = false; private int mCasing = 0; + private boolean mGlasDetected = false; private EntityRenderer entityRenderer = null; + private boolean renderEntity = false; @Override public void saveNBTData(NBTTagCompound aNBT) { @@ -266,7 +272,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { super.onPostTick(aBaseMetaTileEntity, aTick); if (aBaseMetaTileEntity.isClientSide()) { - if (aBaseMetaTileEntity.isActive() && aTick % 40 == 0) { + if (renderEntity && aBaseMetaTileEntity.isActive() && aTick % 40 == 0) { setupEntityRenderer(aBaseMetaTileEntity, 40); } } @@ -275,12 +281,21 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber @SideOnly(Side.CLIENT) @Override public void HandleCustomPacket(CustomTileEntityPacket message) { - String mobType = message.getDataString(); - MobRecipeLoader.MobRecipe r = MobNameToRecipeMap.get(mobType); - if (r != null) { - if (entityRenderer == null) setupEntityRenderer(getBaseMetaTileEntity(), 40); - entityRenderer.setEntity(r.entity); - } else entityRenderer.setEntity(null); + if (message.getDataBoolean()) { + renderEntity = true; + String mobType = message.getDataString(); + MobRecipeLoader.MobRecipe r = MobNameToRecipeMap.get(mobType); + if (r != null) { + if (entityRenderer == null) setupEntityRenderer(getBaseMetaTileEntity(), 40); + entityRenderer.setEntity(r.entity); + } else entityRenderer.setEntity(null); + } else { + renderEntity = false; + if (entityRenderer != null) { + entityRenderer.setDead(); + entityRenderer = null; + } + } } @Override @@ -392,7 +407,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (mobPacket == null) mobPacket = new CustomTileEntityPacket((TileEntity) this.getBaseMetaTileEntity(), null); mobPacket.resetHelperData(); - mobPacket.addData(mobType); + mobPacket.addData(mGlasDetected); + if (mGlasDetected) mobPacket.addData(mobType); mobPacket.sendToAllAround(16); return true; @@ -430,6 +446,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber @Override public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + mGlasDetected = false; if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 6, 0)) return false; if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0) return false; if (isInRitualMode) connectToRitual(); -- cgit From 243045a91ef156d83c534ab4f4a7bef1b6029f98 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Wed, 17 Aug 2022 21:00:04 +0200 Subject: Glass is not optional, you can disable animations with soldering iron --- src/main/java/kubatech/api/Variables.java | 4 ++ ...MetaTileEntity_ExtremeExterminationChamber.java | 57 +++++++++++++++------- 2 files changed, 44 insertions(+), 17 deletions(-) (limited to 'src/main/java/kubatech/api') diff --git a/src/main/java/kubatech/api/Variables.java b/src/main/java/kubatech/api/Variables.java index 9dba10f6a6..c8d551a44e 100644 --- a/src/main/java/kubatech/api/Variables.java +++ b/src/main/java/kubatech/api/Variables.java @@ -23,4 +23,8 @@ import net.minecraft.util.EnumChatFormatting; public class Variables { public static final String Author = "Author: " + EnumChatFormatting.GOLD + "kuba6000"; + public static final String StructureHologram = + "To see the structure, use a " + EnumChatFormatting.BLUE + "Tec" + EnumChatFormatting.DARK_BLUE + "Tech" + + EnumChatFormatting.RESET + "" + EnumChatFormatting.GRAY + " Blueprint on the Controller!"; + ; } diff --git a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java index 29104036f5..77f51ddc38 100644 --- a/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -21,8 +21,10 @@ package kubatech.tileentity.gregtech.multiblock; import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; import static gregtech.api.enums.Textures.BlockIcons.*; +import static gregtech.api.util.GT_StructureUtility.ofFrame; import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; import static kubatech.api.Variables.Author; +import static kubatech.api.Variables.StructureHologram; import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; import WayofTime.alchemicalWizardry.api.event.RitualRunEvent; @@ -40,11 +42,13 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import crazypants.enderio.EnderIO; import gregtech.api.GregTech_API; +import gregtech.api.enums.Materials; import gregtech.api.enums.Textures; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_EnhancedMultiBlockBase; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Energy; import gregtech.api.render.TextureFactory; import gregtech.api.util.GT_Multiblock_Tooltip_Builder; import gregtech.api.util.GT_Utility; @@ -104,11 +108,11 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber StructureDefinition.builder() .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] { {"ccccc", "ccccc", "ccccc", "ccccc", "ccccc"}, - {"cgggc", "g---g", "g---g", "g---g", "cgggc"}, - {"cgggc", "g---g", "g---g", "g---g", "cgggc"}, - {"cgggc", "g---g", "g---g", "g---g", "cgggc"}, - {"cgggc", "g---g", "g---g", "g---g", "cgggc"}, - {"cgggc", "gsssg", "gsssg", "gsssg", "cgggc"}, + {"fgggf", "g---g", "g---g", "g---g", "fgggf"}, + {"fgggf", "g---g", "g---g", "g---g", "fgggf"}, + {"fgggf", "g---g", "g---g", "g---g", "fgggf"}, + {"fgggf", "g---g", "g---g", "g---g", "fgggf"}, + {"fgggf", "gsssg", "gsssg", "gsssg", "fgggf"}, {"CC~CC", "CCCCC", "CCCCC", "CCCCC", "CCCCC"}, })) .addElement('c', onElementPass(t -> t.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 0))) @@ -130,13 +134,11 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber 1))) .addElement( 'g', - ofChain( - onElementPass( - t -> t.mGlasDetected = true, - LoaderReference.Bartworks - ? BorosilicateGlass.ofBoroGlassAnyTier() - : ofBlock(Blocks.glass, 0)), - ofBlock(GregTech_API.sBlockCasings2, 0))) + LoaderReference.Bartworks + ? BorosilicateGlass.ofBoroGlass( + (byte) 0, (t, v) -> t.mGlassTier = v, t -> t.mGlassTier) + : onElementPass(t -> t.mGlassTier = 100, ofBlock(Blocks.glass, 0))) + .addElement('f', ofFrame(Materials.Steel)) .addElement( 's', LoaderReference.ExtraUtilities @@ -148,7 +150,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private TileEntity tileAltar = null; private boolean isInRitualMode = false; private int mCasing = 0; - private boolean mGlasDetected = false; + private byte mGlassTier = 0; + private boolean mAnimationEnabled = false; private EntityRenderer entityRenderer = null; private boolean renderEntity = false; @@ -157,12 +160,16 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber public void saveNBTData(NBTTagCompound aNBT) { super.saveNBTData(aNBT); aNBT.setBoolean("isInRitualMode", isInRitualMode); + aNBT.setBoolean("mAnimationEnabled", mAnimationEnabled); + aNBT.setByte("mGlassTier", mGlassTier); } @Override public void loadNBTData(NBTTagCompound aNBT) { super.loadNBTData(aNBT); isInRitualMode = aNBT.getBoolean("isInRitualMode"); + mAnimationEnabled = aNBT.getBoolean("mAnimationEnabled"); + mGlassTier = aNBT.getByte("mGlassTier"); } @Override @@ -175,6 +182,7 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); tt.addMachineType("Powered Spawner") .addInfo("Controller block for Extreme Extermination Chamber") + .addInfo(Author) .addInfo("Spawns and Exterminates monsters for you") .addInfo("Base energy usage: 2,000 EU/t") .addInfo("Recipe time is based on mob health") @@ -184,11 +192,15 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber .addInfo("You can enable ritual mode with a screwdriver") .addInfo("When in ritual mode and Well Of Suffering ritual is built directly on the machine in center") .addInfo("The mobs will start to buffer and die very slowly by a ritual") - .addInfo(Author) + .addInfo("You can disable mob animation with a soldering iron") + .addInfo(StructureHologram) .addSeparator() .beginStructureBlock(5, 7, 5, true) .addController("Front Bottom Center") .addCasingInfo("Solid Steel Machine Casing", 10) + .addOtherStructurePart("Borosilicate Glass", "All walls without corners") + .addStructureInfo("The glass tier limits the Energy Input tier") + .addOtherStructurePart("Steel Frame Box", "All vertical corners (except top and bottom)") .addOutputBus("Any casing", 1) .addOutputHatch("Any casing", 1) .addEnergyHatch("Any casing", 1) @@ -315,6 +327,15 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber } } + @Override + public boolean onSolderingToolRightClick( + byte aSide, byte aWrenchingSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (super.onSolderingToolRightClick(aSide, aWrenchingSide, aPlayer, aX, aY, aZ)) return true; + mAnimationEnabled = !mAnimationEnabled; + GT_Utility.sendChatToPlayer(aPlayer, "Animations are " + (mAnimationEnabled ? "enabled" : "disableds")); + return true; + } + @SuppressWarnings("unused") @SubscribeEvent(priority = EventPriority.LOWEST) public void onRitualPerform(RitualRunEvent event) { @@ -407,8 +428,8 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber if (mobPacket == null) mobPacket = new CustomTileEntityPacket((TileEntity) this.getBaseMetaTileEntity(), null); mobPacket.resetHelperData(); - mobPacket.addData(mGlasDetected); - if (mGlasDetected) mobPacket.addData(mobType); + mobPacket.addData(mAnimationEnabled); + if (mAnimationEnabled) mobPacket.addData(mobType); mobPacket.sendToAllAround(16); return true; @@ -446,9 +467,11 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber @Override public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - mGlasDetected = false; + mGlassTier = 0; if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 6, 0)) return false; if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0) return false; + if (mGlassTier < 8) + for (GT_MetaTileEntity_Hatch_Energy hatch : mEnergyHatches) if (hatch.mTier > mGlassTier) return false; if (isInRitualMode) connectToRitual(); return true; } -- cgit