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/FMLEventHandler.java | 2 +- 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 +- .../kubatech/client/effect/EntityRenderer.java | 144 +++++++ src/main/java/kubatech/commands/CommandConfig.java | 2 +- .../java/kubatech/commands/CommandHandler.java | 1 + src/main/java/kubatech/commands/CommandHelp.java | 7 +- ...MetaTileEntity_ExtremeExterminationChamber.java | 394 ------------------ src/main/java/kubatech/kubatech.java | 7 +- .../java/kubatech/loaders/MobRecipeLoader.java | 22 +- src/main/java/kubatech/loaders/RecipeLoader.java | 2 +- src/main/java/kubatech/nei/Mob_Handler.java | 3 +- .../java/kubatech/network/LoadConfigHandler.java | 36 -- .../java/kubatech/network/LoadConfigPacket.java | 61 --- ...MetaTileEntity_ExtremeExterminationChamber.java | 454 +++++++++++++++++++++ 20 files changed, 888 insertions(+), 515 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 create mode 100644 src/main/java/kubatech/client/effect/EntityRenderer.java delete mode 100644 src/main/java/kubatech/common/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java delete mode 100644 src/main/java/kubatech/network/LoadConfigHandler.java delete mode 100644 src/main/java/kubatech/network/LoadConfigPacket.java create mode 100644 src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java (limited to 'src/main/java') diff --git a/src/main/java/kubatech/FMLEventHandler.java b/src/main/java/kubatech/FMLEventHandler.java index 6e4bfad541..e74e7eeee0 100644 --- a/src/main/java/kubatech/FMLEventHandler.java +++ b/src/main/java/kubatech/FMLEventHandler.java @@ -21,7 +21,7 @@ package kubatech; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.PlayerEvent; -import kubatech.network.LoadConfigPacket; +import kubatech.api.network.LoadConfigPacket; import net.minecraft.entity.player.EntityPlayerMP; public class FMLEventHandler { 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); } } diff --git a/src/main/java/kubatech/client/effect/EntityRenderer.java b/src/main/java/kubatech/client/effect/EntityRenderer.java new file mode 100644 index 0000000000..23f1a6e44a --- /dev/null +++ b/src/main/java/kubatech/client/effect/EntityRenderer.java @@ -0,0 +1,144 @@ +package kubatech.client.effect; + +import static net.minecraft.client.renderer.entity.RenderManager.*; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import kubatech.api.utils.MobUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.particle.EntityFX; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.entity.EntityLiving; +import net.minecraft.world.World; +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +@SideOnly(Side.CLIENT) +public class EntityRenderer extends EntityFX { + private EntityLiving entityToRender = null; + + public EntityRenderer(World p_i1218_1_, double x, double y, double z, int age) { + super(p_i1218_1_, x + 0.5d, y, z + 0.5d); + this.particleMaxAge = age; + this.particleAge = 0; + } + + public EntityRenderer(EntityRenderer r, int age) { + super(r.worldObj, r.posX, r.posY, r.posZ); + this.particleMaxAge = age; + this.particleAge = 0; + this.ticksExisted = r.ticksExisted; + this.entityToRender = r.entityToRender; + } + + @Override + protected void entityInit() {} + + @Override + public void onUpdate() { + if (this.entityToRender == null) return; + this.ticksExisted++; + if (ticksExisted % 20 == 0) entityToRender.hurtTime = 10; + else if (entityToRender.hurtTime > 0) entityToRender.hurtTime--; + if (this.particleAge++ == this.particleMaxAge) { + this.setDead(); + } + } + + @Override + public boolean shouldRenderInPass(int pass) { + return pass == 3; + } + + @Override + public int getFXLayer() { + return 3; + } + + public void setEntity(EntityLiving entity) { + this.entityToRender = entity; + } + + @Override + public void renderParticle( + Tessellator p_70539_1_, + float p_70539_2_, + float p_70539_3_, + float p_70539_4_, + float p_70539_5_, + float p_70539_6_, + float p_70539_7_) { + if (entityToRender == null) return; + + GL11.glEnable(GL11.GL_LIGHTING); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + + entityToRender.worldObj = this.worldObj; + entityToRender.setPosition(this.posX, this.posY, this.posZ); + + double rotation; + // double headrotation; + { + double x1 = this.posX; + double x2 = Minecraft.getMinecraft().thePlayer.posX; + double y1 = this.posZ; + double y2 = Minecraft.getMinecraft().thePlayer.posZ; + double k = Math.toDegrees(Math.atan2(x2 - x1, y1 - y2)); + if (k < 0d) k += 360d; + k -= 180d; + rotation = k; + } + /* + { + double y1 = this.posY; + double y2 = Minecraft.getMinecraft().thePlayer.posY; + double d = Minecraft.getMinecraft() + .thePlayer + .getDistance(this.posX, Minecraft.getMinecraft().thePlayer.posY, this.posZ); + double k = Math.toDegrees(Math.atan2(y1 - y2, d)); + if (k < 0d) k += 360d; + headrotation = k; + } + + */ + + entityToRender.prevRotationYawHead = entityToRender.rotationYawHead; + entityToRender.prevRenderYawOffset = entityToRender.renderYawOffset; + // entityToRender.prevRotationPitch = entityToRender.rotationPitch; + entityToRender.renderYawOffset = (float) rotation; + entityToRender.rotationYawHead = (float) rotation; + // entityToRender.rotationPitch = (float)headrotation; + + float p_147936_2_ = 0.5f; + + float f1 = entityToRender.prevRotationYaw + + (entityToRender.rotationYaw - entityToRender.prevRotationYaw) * p_147936_2_; + int i = entityToRender.getBrightnessForRender(p_147936_2_); + + if (entityToRender.isBurning()) { + i = 15728880; + } + + int j = i % 65536; + int k = i / 65536; + OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j, (float) k); + GL11.glColor4f(1f, 1f, 1f, 1F); + RenderHelper.enableStandardItemLighting(); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + 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); + + instance.renderEntityWithPosYaw(entityToRender, 0f, 0f, 0f, f1, p_147936_2_); + + GL11.glPopMatrix(); + + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glDisable(GL11.GL_COLOR_MATERIAL); + } +} diff --git a/src/main/java/kubatech/commands/CommandConfig.java b/src/main/java/kubatech/commands/CommandConfig.java index e892ac885b..a1c3659165 100644 --- a/src/main/java/kubatech/commands/CommandConfig.java +++ b/src/main/java/kubatech/commands/CommandConfig.java @@ -22,9 +22,9 @@ package kubatech.commands; import static kubatech.commands.CommandConfig.Translations.*; import kubatech.Config; +import kubatech.api.network.LoadConfigPacket; import kubatech.kubatech; import kubatech.loaders.MobRecipeLoader; -import kubatech.network.LoadConfigPacket; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.entity.player.EntityPlayerMP; diff --git a/src/main/java/kubatech/commands/CommandHandler.java b/src/main/java/kubatech/commands/CommandHandler.java index 3bcfb352b2..d1822a1ff8 100644 --- a/src/main/java/kubatech/commands/CommandHandler.java +++ b/src/main/java/kubatech/commands/CommandHandler.java @@ -74,6 +74,7 @@ public class CommandHandler extends CommandBase { return "kubatech " + USAGE.get(); } + @SuppressWarnings("rawtypes") @Override public List getCommandAliases() { return aliases; diff --git a/src/main/java/kubatech/commands/CommandHelp.java b/src/main/java/kubatech/commands/CommandHelp.java index 2ea9b00d76..dba8ab622d 100644 --- a/src/main/java/kubatech/commands/CommandHelp.java +++ b/src/main/java/kubatech/commands/CommandHelp.java @@ -73,8 +73,9 @@ public class CommandHelp extends CommandBase { @Override public void processCommand(ICommandSender p_71515_1_, String[] p_71515_2_) { p_71515_1_.addChatMessage(new ChatComponentText(POSSIBLE_COMMANDS.get())); - CommandHandler.commands.values().forEach(c -> { - p_71515_1_.addChatMessage(new ChatComponentText("/kubatech " + c.getCommandUsage(p_71515_1_))); - }); + CommandHandler.commands + .values() + .forEach(c -> + p_71515_1_.addChatMessage(new ChatComponentText("/kubatech " + c.getCommandUsage(p_71515_1_)))); } } diff --git a/src/main/java/kubatech/common/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java b/src/main/java/kubatech/common/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java deleted file mode 100644 index ff6ed02363..0000000000 --- a/src/main/java/kubatech/common/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java +++ /dev/null @@ -1,394 +0,0 @@ -/* - * 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.common.tileentity.gregtech.multiblock; - -import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; -import static gregtech.api.enums.Textures.BlockIcons.*; -import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; -import static kubatech.api.Variables.Author; - -import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; -import WayofTime.alchemicalWizardry.api.event.RitualRunEvent; -import WayofTime.alchemicalWizardry.api.rituals.Rituals; -import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; -import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; -import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWellOfSuffering; -import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; -import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import cpw.mods.fml.common.eventhandler.EventPriority; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import crazypants.enderio.EnderIO; -import gregtech.api.GregTech_API; -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.render.TextureFactory; -import gregtech.api.util.GT_Multiblock_Tooltip_Builder; -import gregtech.api.util.GT_Utility; -import java.util.HashMap; -import java.util.Random; -import kubatech.Tags; -import kubatech.api.LoaderReference; -import kubatech.api.utils.FastRandom; -import kubatech.api.utils.ReflectionHelper; -import kubatech.loaders.MobRecipeLoader; -import net.minecraft.block.Block; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.EnumDifficulty; -import net.minecraft.world.World; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.FluidRegistry; -import net.minecraftforge.fluids.FluidStack; - -public class GT_MetaTileEntity_ExtremeExterminationChamber - extends GT_MetaTileEntity_EnhancedMultiBlockBase { - - public static final HashMap MobNameToRecipeMap = new HashMap<>(); - public final Random rand = new FastRandom(); - - public GT_MetaTileEntity_ExtremeExterminationChamber(int aID, String aName, String aNameRegional) { - super(aID, aName, aNameRegional); - } - - public GT_MetaTileEntity_ExtremeExterminationChamber(String aName) { - super(aName); - if (LoaderReference.BloodMagic) MinecraftForge.EVENT_BUS.register(this); - } - - @Override - public void onRemoval() { - if (LoaderReference.BloodMagic) MinecraftForge.EVENT_BUS.unregister(this); - } - - private static final String WellOfSufferingRitualName = "AW013Suffering"; - - private static final Item poweredSpawnerItem = Item.getItemFromBlock(EnderIO.blockPoweredSpawner); - private static final int CASING_INDEX = 16; - private static final String STRUCTURE_PIECE_MAIN = "main"; - private static final IStructureDefinition STRUCTURE_DEFINITION = - StructureDefinition.builder() - .addShape(STRUCTURE_PIECE_MAIN, transpose(new String[][] { - {"ccccc", "ccccc", "ccccc", "ccccc", "ccccc"}, - {"ccccc", "c---c", "c---c", "c---c", "ccccc"}, - {"ccccc", "c---c", "c---c", "c---c", "ccccc"}, - {"ccccc", "c---c", "c---c", "c---c", "ccccc"}, - {"ccccc", "c---c", "c---c", "c---c", "ccccc"}, - {"ccccc", "csssc", "csssc", "csssc", "ccccc"}, - {"CC~CC", "CCCCC", "CCCCC", "CCCCC", "CCCCC"}, - })) - .addElement('c', onElementPass(t -> t.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 0))) - .addElement( - 'C', - ofChain( - onElementPass(t -> t.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 0)), - ofHatchAdder( - GT_MetaTileEntity_ExtremeExterminationChamber::addOutputToMachineList, - CASING_INDEX, - 1), - ofHatchAdder( - GT_MetaTileEntity_ExtremeExterminationChamber::addEnergyInputToMachineList, - CASING_INDEX, - 1), - ofHatchAdder( - GT_MetaTileEntity_ExtremeExterminationChamber::addMaintenanceToMachineList, - CASING_INDEX, - 1))) - .addElement( - 's', - LoaderReference.ExtraUtilities - ? ofBlock(Block.getBlockFromName("ExtraUtilities:spike_base_diamond"), 0) - : isAir()) - .build(); - - private TileEntity masterStoneRitual = null; - private TileEntity tileAltar = null; - private boolean isInRitualMode = false; - private int mCasing = 0; - - @Override - public void saveNBTData(NBTTagCompound aNBT) { - super.saveNBTData(aNBT); - aNBT.setBoolean("isInRitualMode", isInRitualMode); - } - - @Override - public void loadNBTData(NBTTagCompound aNBT) { - super.loadNBTData(aNBT); - isInRitualMode = aNBT.getBoolean("isInRitualMode"); - } - - @Override - public IStructureDefinition getStructureDefinition() { - return STRUCTURE_DEFINITION; - } - - @Override - protected GT_Multiblock_Tooltip_Builder createTooltip() { - GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); - tt.addMachineType("Powered Spawner") - .addInfo("Controller block for Extreme Extermination Chamber") - .addInfo("Spawns and Exterminates monsters for you") - .addInfo("Base energy usage: 2,000 EU/t") - .addInfo("Recipe time is based on mob health") - .addInfo("Also produces 120 Liquid XP per operation") - .addInfo("If the mob spawns infernal") - .addInfo("it will drain 8 times more power") - .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) - .addSeparator() - .beginStructureBlock(5, 7, 5, true) - .addController("Front Bottom Center") - .addCasingInfo("Solid Steel Machine Casing", 10) - .addOutputBus("Any casing", 1) - .addOutputHatch("Any casing", 1) - .addEnergyHatch("Any casing", 1) - .addMaintenanceHatch("Any casing", 1) - .toolTipFinisher(Tags.MODNAME); - return tt; - } - - @Override - public void construct(ItemStack itemStack, boolean b) { - buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 2, 6, 0); - } - - @Override - public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { - return new GT_MetaTileEntity_ExtremeExterminationChamber(this.mName); - } - - @Override - public ITexture[] getTexture( - IGregTechTileEntity aBaseMetaTileEntity, - byte aSide, - byte aFacing, - byte aColorIndex, - boolean aActive, - boolean aRedstone) { - if (aSide == aFacing) { - if (aActive) - return new ITexture[] { - Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW) - .extFacing() - .glow() - .build() - }; - return new ITexture[] { - Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER) - .extFacing() - .build(), - TextureFactory.builder() - .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_GLOW) - .extFacing() - .glow() - .build() - }; - } - return new ITexture[] {Textures.BlockIcons.getCasingTextureForId(CASING_INDEX)}; - } - - @Override - public boolean isCorrectMachinePart(ItemStack aStack) { - return true; - } - - @Override - public void onFirstTick(IGregTechTileEntity aBaseMetaTileEntity) { - super.onFirstTick(aBaseMetaTileEntity); - } - - @Override - public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { - if (!LoaderReference.BloodMagic) return; - if (this.mMaxProgresstime > 0) { - GT_Utility.sendChatToPlayer(aPlayer, "Can't change mode when running !"); - return; - } - isInRitualMode = !isInRitualMode; - if (!isInRitualMode) { - GT_Utility.sendChatToPlayer(aPlayer, "Ritual mode disabled"); - } else { - GT_Utility.sendChatToPlayer(aPlayer, "Ritual mode enabled"); - if (connectToRitual()) GT_Utility.sendChatToPlayer(aPlayer, "Successfully connected to the ritual"); - else GT_Utility.sendChatToPlayer(aPlayer, "Can't connect to the ritual"); - } - } - - @SuppressWarnings("unused") - @SubscribeEvent(priority = EventPriority.LOWEST) - public void onRitualPerform(RitualRunEvent event) { - if (!isInRitualMode) return; - if (masterStoneRitual == null) return; - if (this.mMaxProgresstime == 0) return; - if (event.mrs.equals(masterStoneRitual) && event.ritualKey.equals(WellOfSufferingRitualName)) { - Rituals ritual = Rituals.ritualMap.get(WellOfSufferingRitualName); - if (ritual != null && ritual.effect instanceof RitualEffectWellOfSuffering) { - RitualEffectWellOfSuffering effect = (RitualEffectWellOfSuffering) ritual.effect; - event.setCanceled(true); // we will handle that - String owner = event.mrs.getOwner(); - int currentEssence = SoulNetworkHandler.getCurrentEssence(owner); - World world = event.mrs.getWorld(); - int x = event.mrs.getXCoord(); - int y = event.mrs.getYCoord(); - int z = event.mrs.getZCoord(); - - if (world.getWorldTime() % RitualEffectWellOfSuffering.timeDelay != 0) return; - - if (tileAltar == null || tileAltar.isInvalid()) { - tileAltar = null; - for (int i = -5; i <= 5; i++) - for (int j = -5; j <= 5; j++) - for (int k = -10; k <= 10; k++) - if (world.getTileEntity(x + i, y + k, z + j) instanceof IBloodAltar) - tileAltar = world.getTileEntity(x + i, y + k, z + j); - } - if (tileAltar == null) return; - - if (currentEssence < effect.getCostPerRefresh() * 100) SoulNetworkHandler.causeNauseaToPlayer(owner); - - ((IBloodAltar) tileAltar) - .sacrificialDaggerCall( - 100 - * RitualEffectWellOfSuffering.amount - * (effect.canDrainReagent( - event.mrs, - ReagentRegistry.offensaReagent, - ReflectionHelper.getField(effect, "offensaDrain", true, 3), - true) - ? 2 - : 1) - * (effect.canDrainReagent( - event.mrs, - ReagentRegistry.tenebraeReagent, - ReflectionHelper.getField(effect, "tennebraeDrain", true, 5), - true) - ? 2 - : 1), - true); - - SoulNetworkHandler.syphonFromNetwork(owner, effect.getCostPerRefresh() * 100); - } - } - } - - @Override - public boolean checkRecipe(ItemStack aStack) { - if (aStack == null) return false; - - if (aStack.getItem() != poweredSpawnerItem) return false; - - if (aStack.getTagCompound() == null) return false; - String mobType = aStack.getTagCompound().getString("mobType"); - if (mobType.isEmpty()) return false; - - MobRecipeLoader.MobRecipe recipe = MobNameToRecipeMap.get(mobType); - - if (recipe == null) return false; - if (!recipe.isPeacefulAllowed - && this.getBaseMetaTileEntity().getWorld().difficultySetting == EnumDifficulty.PEACEFUL) return false; - - this.mOutputItems = recipe.generateOutputs(rand, this); - - if (isInRitualMode && isRitualValid()) { - this.mMaxProgresstime = 400; - this.mEUt /= 4; - this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; - } else { - calculateOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); - this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; - } - if (this.mEUt > 0) this.mEUt = -this.mEUt; - this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); - this.mEfficiencyIncrease = 10000; - - return true; - } - - private boolean isRitualValid() { - if (!isInRitualMode) return false; - if (masterStoneRitual == null) return false; - if (masterStoneRitual.isInvalid() - || !(((TEMasterStone) masterStoneRitual).getCurrentRitual().equals(WellOfSufferingRitualName))) { - masterStoneRitual = null; - return false; - } - return true; - } - - private boolean connectToRitual() { - if (!LoaderReference.BloodMagic) return false; - ChunkCoordinates coords = this.getBaseMetaTileEntity().getCoords(); - int[] abc = new int[] {0, -8, 2}; - int[] xyz = new int[] {0, 0, 0}; - this.getExtendedFacing().getWorldOffset(abc, xyz); - xyz[0] += coords.posX; - xyz[1] += coords.posY; - xyz[2] += coords.posZ; - TileEntity te = this.getBaseMetaTileEntity().getTileEntity(xyz[0], xyz[1], xyz[2]); - if (te instanceof TEMasterStone) { - if (((TEMasterStone) te).getCurrentRitual().equals(WellOfSufferingRitualName)) { - masterStoneRitual = te; - return true; - } - } - return false; - } - - @Override - public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 6, 0)) return false; - if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0) return false; - if (isInRitualMode) connectToRitual(); - return true; - } - - @Override - public int getMaxEfficiency(ItemStack aStack) { - return 10000; - } - - @Override - public int getDamageToComponent(ItemStack aStack) { - return 0; - } - - @Override - public boolean explodesOnComponentBreak(ItemStack aStack) { - return false; - } -} diff --git a/src/main/java/kubatech/kubatech.java b/src/main/java/kubatech/kubatech.java index d5407ff357..6973c281b4 100644 --- a/src/main/java/kubatech/kubatech.java +++ b/src/main/java/kubatech/kubatech.java @@ -24,8 +24,8 @@ import cpw.mods.fml.common.SidedProxy; import cpw.mods.fml.common.event.*; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; -import kubatech.network.LoadConfigHandler; -import kubatech.network.LoadConfigPacket; +import kubatech.api.network.CustomTileEntityPacket; +import kubatech.api.network.LoadConfigPacket; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -44,7 +44,8 @@ public class kubatech { public static final SimpleNetworkWrapper NETWORK = new SimpleNetworkWrapper(Tags.MODID); static { - NETWORK.registerMessage(new LoadConfigHandler(), LoadConfigPacket.class, 0, Side.CLIENT); + NETWORK.registerMessage(new LoadConfigPacket.Handler(), LoadConfigPacket.class, 0, Side.CLIENT); + NETWORK.registerMessage(new CustomTileEntityPacket.Handler(), CustomTileEntityPacket.class, 1, Side.CLIENT); } private static final Logger LOG = LogManager.getLogger(Tags.MODID); diff --git a/src/main/java/kubatech/loaders/MobRecipeLoader.java b/src/main/java/kubatech/loaders/MobRecipeLoader.java index 3c087961d9..21c18897f4 100644 --- a/src/main/java/kubatech/loaders/MobRecipeLoader.java +++ b/src/main/java/kubatech/loaders/MobRecipeLoader.java @@ -21,7 +21,7 @@ package kubatech.loaders; import static kubatech.api.utils.ModUtils.isClientSided; import static kubatech.api.utils.ModUtils.isDeobfuscatedEnvironment; -import static kubatech.common.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber.MobNameToRecipeMap; +import static kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber.MobNameToRecipeMap; import atomicstryker.infernalmobs.common.InfernalMobsCore; import atomicstryker.infernalmobs.common.MobModifier; @@ -39,10 +39,10 @@ import java.util.stream.Collectors; import kubatech.Config; import kubatech.Tags; import kubatech.api.LoaderReference; +import kubatech.api.network.LoadConfigPacket; import kubatech.api.utils.InfernalHelper; -import kubatech.common.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; import kubatech.nei.Mob_Handler; -import kubatech.network.LoadConfigPacket; +import kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; import minetweaker.MineTweakerAPI; import minetweaker.api.entity.IEntityDefinition; import minetweaker.api.item.IItemStack; @@ -102,6 +102,7 @@ public class MobRecipeLoader { public final boolean alwaysinfernal; public static droplist infernaldrops; public final boolean isPeacefulAllowed; + public final EntityLiving entity; @SuppressWarnings("unchecked") public MobRecipe copy() { @@ -111,7 +112,8 @@ public class MobRecipeLoader { mMaxDamageChance, infernalityAllowed, alwaysinfernal, - isPeacefulAllowed); + isPeacefulAllowed, + entity); } private MobRecipe( @@ -120,13 +122,15 @@ public class MobRecipeLoader { int mMaxDamageChance, boolean infernalityAllowed, boolean alwaysinfernal, - boolean isPeacefulAllowed) { + boolean isPeacefulAllowed, + EntityLiving entity) { this.mOutputs = mOutputs; this.mDuration = mDuration; this.mMaxDamageChance = mMaxDamageChance; this.infernalityAllowed = infernalityAllowed; this.alwaysinfernal = alwaysinfernal; this.isPeacefulAllowed = isPeacefulAllowed; + this.entity = entity; } @SuppressWarnings("unchecked") @@ -185,6 +189,7 @@ public class MobRecipeLoader { mMaxDamageChance = maxdamagechance; // Powered spawner with octadic capacitor spawns ~22/min ~= 0.366/sec ~= 2.72s/spawn ~= 54.54t/spawn mDuration = 55 + 10 + (((int) e.getMaxHealth() / 5) * 10); + entity = e; } public ItemStack[] generateOutputs(Random rnd, GT_MetaTileEntity_ExtremeExterminationChamber MTE) { @@ -460,7 +465,7 @@ public class MobRecipeLoader { } private static class dropCollector { - HashMap damagableChecker = new HashMap<>(); + final HashMap damagableChecker = new HashMap<>(); private boolean booksAlwaysRandomlyEnchanted = false; public void addDrop(droplist fdrops, ArrayList listToParse, double chance) { @@ -552,6 +557,7 @@ public class MobRecipeLoader { return false; } + @SuppressWarnings("rawtypes") @Override public List getEntitiesWithinAABB(Class p_72872_1_, AxisAlignedBB p_72872_2_) { return new ArrayList(); @@ -727,7 +733,7 @@ public class MobRecipeLoader { try { Class cl = e.getClass(); - boolean detectedException = false; + boolean detectedException; do { detectedException = false; try { @@ -894,6 +900,7 @@ public class MobRecipeLoader { MobRecipe recipe = v.recipe; if (recipe != null) recipe = recipe.copy(); + @SuppressWarnings("unchecked") ArrayList drops = (ArrayList) v.drops.clone(); // MT Scripts should already be loaded here @@ -922,6 +929,7 @@ public class MobRecipeLoader { GeneralMappedMob v = GeneralMobList.get(k); MobRecipe recipe = v.recipe; if (recipe != null) recipe = recipe.copy(); + @SuppressWarnings("unchecked") ArrayList drops = (ArrayList) v.drops.clone(); // MT Scripts should already be loaded here diff --git a/src/main/java/kubatech/loaders/RecipeLoader.java b/src/main/java/kubatech/loaders/RecipeLoader.java index ba6cbb7a1f..84c3603225 100644 --- a/src/main/java/kubatech/loaders/RecipeLoader.java +++ b/src/main/java/kubatech/loaders/RecipeLoader.java @@ -25,7 +25,7 @@ import gregtech.api.util.GT_ModHandler; import kubatech.Tags; import kubatech.api.LoaderReference; import kubatech.api.enums.ItemList; -import kubatech.common.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; +import kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import org.apache.logging.log4j.LogManager; diff --git a/src/main/java/kubatech/nei/Mob_Handler.java b/src/main/java/kubatech/nei/Mob_Handler.java index a231eceffc..78294326c9 100644 --- a/src/main/java/kubatech/nei/Mob_Handler.java +++ b/src/main/java/kubatech/nei/Mob_Handler.java @@ -39,9 +39,9 @@ import kubatech.api.LoaderReference; import kubatech.api.utils.FastRandom; import kubatech.api.utils.InfernalHelper; import kubatech.api.utils.ModUtils; -import kubatech.common.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; import kubatech.kubatech; import kubatech.loaders.MobRecipeLoader; +import kubatech.tileentity.gregtech.multiblock.GT_MetaTileEntity_ExtremeExterminationChamber; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.gui.inventory.GuiInventory; @@ -277,7 +277,6 @@ public class Mob_Handler extends TemplateRecipeHandler { GL11.glPushMatrix(); - ItemStack s = getIngredientStacks(recipe).get(0).item; try { EntityLiving e = currentrecipe.mob; float eheight = e.height; diff --git a/src/main/java/kubatech/network/LoadConfigHandler.java b/src/main/java/kubatech/network/LoadConfigHandler.java deleted file mode 100644 index 7bf8bd9756..0000000000 --- a/src/main/java/kubatech/network/LoadConfigHandler.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.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 kubatech.kubatech; -import kubatech.loaders.MobRecipeLoader; - -public class LoadConfigHandler 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/network/LoadConfigPacket.java b/src/main/java/kubatech/network/LoadConfigPacket.java deleted file mode 100644 index 48f3342486..0000000000 --- a/src/main/java/kubatech/network/LoadConfigPacket.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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.network; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import io.netty.buffer.ByteBuf; -import java.nio.charset.StandardCharsets; -import java.util.HashSet; -import kubatech.Config; - -public class LoadConfigPacket implements IMessage { - - public static LoadConfigPacket instance = new LoadConfigPacket(); - - public 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); - }); - } - } -} 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 new file mode 100644 index 0000000000..5971731fdd --- /dev/null +++ b/src/main/java/kubatech/tileentity/gregtech/multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java @@ -0,0 +1,454 @@ +/* + * 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.tileentity.gregtech.multiblock; + +import static com.gtnewhorizon.structurelib.structure.StructureUtility.*; +import static gregtech.api.enums.Textures.BlockIcons.*; +import static gregtech.api.util.GT_StructureUtility.ofHatchAdder; +import static kubatech.api.Variables.Author; + +import WayofTime.alchemicalWizardry.api.alchemy.energy.ReagentRegistry; +import WayofTime.alchemicalWizardry.api.event.RitualRunEvent; +import WayofTime.alchemicalWizardry.api.rituals.Rituals; +import WayofTime.alchemicalWizardry.api.soulNetwork.SoulNetworkHandler; +import WayofTime.alchemicalWizardry.api.tile.IBloodAltar; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWellOfSuffering; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import com.github.bartimaeusnek.bartworks.API.BorosilicateGlass; +import com.gtnewhorizon.structurelib.structure.IStructureDefinition; +import com.gtnewhorizon.structurelib.structure.StructureDefinition; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +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.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.render.TextureFactory; +import gregtech.api.util.GT_Multiblock_Tooltip_Builder; +import gregtech.api.util.GT_Utility; +import java.util.HashMap; +import java.util.Random; +import kubatech.Tags; +import kubatech.api.LoaderReference; +import kubatech.api.network.CustomTileEntityPacket; +import kubatech.api.tileentity.CustomTileEntityPacketHandler; +import kubatech.api.utils.FastRandom; +import kubatech.api.utils.ReflectionHelper; +import kubatech.client.effect.EntityRenderer; +import kubatech.loaders.MobRecipeLoader; +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.EnumDifficulty; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +public class GT_MetaTileEntity_ExtremeExterminationChamber + extends GT_MetaTileEntity_EnhancedMultiBlockBase + implements CustomTileEntityPacketHandler { + + public static final HashMap MobNameToRecipeMap = new HashMap<>(); + public final Random rand = new FastRandom(); + + public GT_MetaTileEntity_ExtremeExterminationChamber(int aID, String aName, String aNameRegional) { + super(aID, aName, aNameRegional); + } + + public GT_MetaTileEntity_ExtremeExterminationChamber(String aName) { + super(aName); + if (LoaderReference.BloodMagic) MinecraftForge.EVENT_BUS.register(this); + } + + @Override + public void onRemoval() { + if (LoaderReference.BloodMagic) MinecraftForge.EVENT_BUS.unregister(this); + if (getBaseMetaTileEntity().isClientSide()) entityRenderer.setDead(); + } + + private static final String WellOfSufferingRitualName = "AW013Suffering"; + + private static final Item poweredSpawnerItem = Item.getItemFromBlock(EnderIO.blockPoweredSpawner); + private static final int CASING_INDEX = 16; + private static final String STRUCTURE_PIECE_MAIN = "main"; + private static final IStructureDefinition STRUCTURE_DEFINITION = + 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"}, + {"CC~CC", "CCCCC", "CCCCC", "CCCCC", "CCCCC"}, + })) + .addElement('c', onElementPass(t -> t.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 0))) + .addElement( + 'C', + ofChain( + onElementPass(t -> t.mCasing++, ofBlock(GregTech_API.sBlockCasings2, 0)), + ofHatchAdder( + GT_MetaTileEntity_ExtremeExterminationChamber::addOutputToMachineList, + CASING_INDEX, + 1), + ofHatchAdder( + GT_MetaTileEntity_ExtremeExterminationChamber::addEnergyInputToMachineList, + CASING_INDEX, + 1), + ofHatchAdder( + GT_MetaTileEntity_ExtremeExterminationChamber::addMaintenanceToMachineList, + CASING_INDEX, + 1))) + .addElement( + 'g', + LoaderReference.Bartworks + ? BorosilicateGlass.ofBoroGlassAnyTier() + : ofBlock(Blocks.glass, 0)) + .addElement( + 's', + LoaderReference.ExtraUtilities + ? ofBlock(Block.getBlockFromName("ExtraUtilities:spike_base_diamond"), 0) + : isAir()) + .build(); + + private TileEntity masterStoneRitual = null; + private TileEntity tileAltar = null; + private boolean isInRitualMode = false; + private int mCasing = 0; + + @SideOnly(Side.CLIENT) + private EntityRenderer entityRenderer = null; + + @Override + public void saveNBTData(NBTTagCompound aNBT) { + super.saveNBTData(aNBT); + aNBT.setBoolean("isInRitualMode", isInRitualMode); + } + + @Override + public void loadNBTData(NBTTagCompound aNBT) { + super.loadNBTData(aNBT); + isInRitualMode = aNBT.getBoolean("isInRitualMode"); + } + + @Override + public IStructureDefinition getStructureDefinition() { + return STRUCTURE_DEFINITION; + } + + @Override + protected GT_Multiblock_Tooltip_Builder createTooltip() { + GT_Multiblock_Tooltip_Builder tt = new GT_Multiblock_Tooltip_Builder(); + tt.addMachineType("Powered Spawner") + .addInfo("Controller block for Extreme Extermination Chamber") + .addInfo("Spawns and Exterminates monsters for you") + .addInfo("Base energy usage: 2,000 EU/t") + .addInfo("Recipe time is based on mob health") + .addInfo("Also produces 120 Liquid XP per operation") + .addInfo("If the mob spawns infernal") + .addInfo("it will drain 8 times more power") + .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) + .addSeparator() + .beginStructureBlock(5, 7, 5, true) + .addController("Front Bottom Center") + .addCasingInfo("Solid Steel Machine Casing", 10) + .addOutputBus("Any casing", 1) + .addOutputHatch("Any casing", 1) + .addEnergyHatch("Any casing", 1) + .addMaintenanceHatch("Any casing", 1) + .toolTipFinisher(Tags.MODNAME); + return tt; + } + + @Override + public void construct(ItemStack itemStack, boolean b) { + buildPiece(STRUCTURE_PIECE_MAIN, itemStack, b, 2, 6, 0); + } + + @Override + public IMetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { + return new GT_MetaTileEntity_ExtremeExterminationChamber(this.mName); + } + + @Override + public ITexture[] getTexture( + IGregTechTileEntity aBaseMetaTileEntity, + byte aSide, + byte aFacing, + byte aColorIndex, + boolean aActive, + boolean aRedstone) { + if (aSide == aFacing) { + if (aActive) + return new ITexture[] { + Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_ACTIVE_GLOW) + .extFacing() + .glow() + .build() + }; + return new ITexture[] { + Textures.BlockIcons.getCasingTextureForId(CASING_INDEX), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER) + .extFacing() + .build(), + TextureFactory.builder() + .addIcon(OVERLAY_FRONT_DISTILLATION_TOWER_GLOW) + .extFacing() + .glow() + .build() + }; + } + return new ITexture[] {Textures.BlockIcons.getCasingTextureForId(CASING_INDEX)}; + } + + @Override + public boolean isCorrectMachinePart(ItemStack aStack) { + return true; + } + + @SideOnly(Side.CLIENT) + private void setupEntityRenderer(IGregTechTileEntity aBaseMetaTileEntity, int time) { + if (entityRenderer == null) { + ChunkCoordinates coords = this.getBaseMetaTileEntity().getCoords(); + int[] abc = new int[] {0, -2, 2}; + int[] xyz = new int[] {0, 0, 0}; + this.getExtendedFacing().getWorldOffset(abc, xyz); + xyz[0] += coords.posX; + xyz[1] += coords.posY; + xyz[2] += coords.posZ; + entityRenderer = new EntityRenderer(aBaseMetaTileEntity.getWorld(), xyz[0], xyz[1], xyz[2], time); + } else { + entityRenderer.setDead(); + entityRenderer = new EntityRenderer(entityRenderer, time); + } + Minecraft.getMinecraft().effectRenderer.addEffect(entityRenderer); + } + + @Override + public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) { + super.onPostTick(aBaseMetaTileEntity, aTick); + if (aBaseMetaTileEntity.isClientSide()) { + if (aBaseMetaTileEntity.isActive() && aTick % 40 == 0) { + setupEntityRenderer(aBaseMetaTileEntity, 40); + } + } + } + + @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); + } + + @Override + public void onScrewdriverRightClick(byte aSide, EntityPlayer aPlayer, float aX, float aY, float aZ) { + if (!LoaderReference.BloodMagic) return; + if (this.mMaxProgresstime > 0) { + GT_Utility.sendChatToPlayer(aPlayer, "Can't change mode when running !"); + return; + } + isInRitualMode = !isInRitualMode; + if (!isInRitualMode) { + GT_Utility.sendChatToPlayer(aPlayer, "Ritual mode disabled"); + } else { + GT_Utility.sendChatToPlayer(aPlayer, "Ritual mode enabled"); + if (connectToRitual()) GT_Utility.sendChatToPlayer(aPlayer, "Successfully connected to the ritual"); + else GT_Utility.sendChatToPlayer(aPlayer, "Can't connect to the ritual"); + } + } + + @SuppressWarnings("unused") + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onRitualPerform(RitualRunEvent event) { + if (!isInRitualMode) return; + if (masterStoneRitual == null) return; + if (this.mMaxProgresstime == 0) return; + if (event.mrs.equals(masterStoneRitual) && event.ritualKey.equals(WellOfSufferingRitualName)) { + Rituals ritual = Rituals.ritualMap.get(WellOfSufferingRitualName); + if (ritual != null && ritual.effect instanceof RitualEffectWellOfSuffering) { + RitualEffectWellOfSuffering effect = (RitualEffectWellOfSuffering) ritual.effect; + event.setCanceled(true); // we will handle that + String owner = event.mrs.getOwner(); + int currentEssence = SoulNetworkHandler.getCurrentEssence(owner); + World world = event.mrs.getWorld(); + int x = event.mrs.getXCoord(); + int y = event.mrs.getYCoord(); + int z = event.mrs.getZCoord(); + + if (world.getWorldTime() % RitualEffectWellOfSuffering.timeDelay != 0) return; + + if (tileAltar == null || tileAltar.isInvalid()) { + tileAltar = null; + for (int i = -5; i <= 5; i++) + for (int j = -5; j <= 5; j++) + for (int k = -10; k <= 10; k++) + if (world.getTileEntity(x + i, y + k, z + j) instanceof IBloodAltar) + tileAltar = world.getTileEntity(x + i, y + k, z + j); + } + if (tileAltar == null) return; + + if (currentEssence < effect.getCostPerRefresh() * 100) SoulNetworkHandler.causeNauseaToPlayer(owner); + + ((IBloodAltar) tileAltar) + .sacrificialDaggerCall( + 100 + * RitualEffectWellOfSuffering.amount + * (effect.canDrainReagent( + event.mrs, + ReagentRegistry.offensaReagent, + ReflectionHelper.getField(effect, "offensaDrain", 3), + true) + ? 2 + : 1) + * (effect.canDrainReagent( + event.mrs, + ReagentRegistry.tenebraeReagent, + ReflectionHelper.getField(effect, "tennebraeDrain", 5), + true) + ? 2 + : 1), + true); + + SoulNetworkHandler.syphonFromNetwork(owner, effect.getCostPerRefresh() * 100); + } + } + } + + private CustomTileEntityPacket mobPacket = null; + + @Override + public boolean checkRecipe(ItemStack aStack) { + if (getBaseMetaTileEntity().isClientSide()) return false; + if (aStack == null) return false; + + if (aStack.getItem() != poweredSpawnerItem) return false; + + if (aStack.getTagCompound() == null) return false; + String mobType = aStack.getTagCompound().getString("mobType"); + if (mobType.isEmpty()) return false; + + MobRecipeLoader.MobRecipe recipe = MobNameToRecipeMap.get(mobType); + + if (recipe == null) return false; + if (!recipe.isPeacefulAllowed + && this.getBaseMetaTileEntity().getWorld().difficultySetting == EnumDifficulty.PEACEFUL) return false; + + this.mOutputItems = recipe.generateOutputs(rand, this); + + if (isInRitualMode && isRitualValid()) { + this.mMaxProgresstime = 400; + this.mEUt /= 4; + this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 5000)}; + } else { + calculateOverclockedNessMulti(this.mEUt, this.mMaxProgresstime, 2, getMaxInputVoltage()); + this.mOutputFluids = new FluidStack[] {FluidRegistry.getFluidStack("xpjuice", 120)}; + } + if (this.mEUt > 0) this.mEUt = -this.mEUt; + this.mEfficiency = (10000 - (getIdealStatus() - getRepairStatus()) * 1000); + this.mEfficiencyIncrease = 10000; + + if (mobPacket == null) mobPacket = new CustomTileEntityPacket((TileEntity) this.getBaseMetaTileEntity(), null); + mobPacket.resetHelperData(); + mobPacket.addData(mobType); + mobPacket.sendToAllAround(16); + + return true; + } + + private boolean isRitualValid() { + if (!isInRitualMode) return false; + if (masterStoneRitual == null) return false; + if (masterStoneRitual.isInvalid() + || !(((TEMasterStone) masterStoneRitual).getCurrentRitual().equals(WellOfSufferingRitualName))) { + masterStoneRitual = null; + return false; + } + return true; + } + + private boolean connectToRitual() { + if (!LoaderReference.BloodMagic) return false; + ChunkCoordinates coords = this.getBaseMetaTileEntity().getCoords(); + int[] abc = new int[] {0, -8, 2}; + int[] xyz = new int[] {0, 0, 0}; + this.getExtendedFacing().getWorldOffset(abc, xyz); + xyz[0] += coords.posX; + xyz[1] += coords.posY; + xyz[2] += coords.posZ; + TileEntity te = this.getBaseMetaTileEntity().getTileEntity(xyz[0], xyz[1], xyz[2]); + if (te instanceof TEMasterStone) { + if (((TEMasterStone) te).getCurrentRitual().equals(WellOfSufferingRitualName)) { + masterStoneRitual = te; + return true; + } + } + return false; + } + + @Override + public boolean checkMachine(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { + if (!checkPiece(STRUCTURE_PIECE_MAIN, 2, 6, 0)) return false; + if (mCasing < 10 || mMaintenanceHatches.size() != 1 || mEnergyHatches.size() == 0) return false; + if (isInRitualMode) connectToRitual(); + return true; + } + + @Override + public int getMaxEfficiency(ItemStack aStack) { + return 10000; + } + + @Override + public int getDamageToComponent(ItemStack aStack) { + return 0; + } + + @Override + public boolean explodesOnComponentBreak(ItemStack aStack) { + return false; + } +} -- cgit From 74ad76f94bace7cedf0b6c357402ab7854d55e31 Mon Sep 17 00:00:00 2001 From: kuba6000 Date: Wed, 17 Aug 2022 05:12:24 +0200 Subject: Fix server --- .../multiblock/GT_MetaTileEntity_ExtremeExterminationChamber.java | 1 - 1 file changed, 1 deletion(-) (limited to 'src/main/java') 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 5971731fdd..b4ed94058b 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 @@ -145,7 +145,6 @@ public class GT_MetaTileEntity_ExtremeExterminationChamber private boolean isInRitualMode = false; private int mCasing = 0; - @SideOnly(Side.CLIENT) private EntityRenderer entityRenderer = null; @Override -- 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') 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') 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