From 786ced191bc3df9638f8230f9c04268a8b193c98 Mon Sep 17 00:00:00 2001 From: Boblet Date: Wed, 14 Feb 2024 15:38:25 +0100 Subject: [PATCH 1/6] launch pad condensation for LOXY rockets --- changelog | 2 + .../com/hbm/blocks/bomb/BlockVolcano.java | 4 - .../java/com/hbm/blocks/bomb/LaunchPad.java | 145 ++----- .../com/hbm/blocks/bomb/LaunchPadLarge.java | 4 +- .../hbm/handler/guncfg/Gun20GaugeFactory.java | 1 - .../hbm/handler/guncfg/Gun45ACPFactory.java | 1 - .../hbm/handler/guncfg/Gun50BMGFactory.java | 1 - .../hbm/handler/guncfg/Gun556mmFactory.java | 1 - .../hbm/handler/guncfg/Gun75BoltFactory.java | 1 - .../hbm/handler/guncfg/Gun762mmFactory.java | 1 - .../hbm/handler/guncfg/GunGaussFactory.java | 1 - .../hbm/handler/guncfg/GunRocketFactory.java | 1 - .../container/ContainerLaunchPadTier1.java | 65 --- .../hbm/inventory/gui/GUILaunchPadTier1.java | 64 --- .../inventory/recipes/anvil/AnvilRecipes.java | 2 +- .../java/com/hbm/items/tool/ItemBoltgun.java | 1 - .../com/hbm/items/weapon/ItemCoilgun.java | 1 - .../java/com/hbm/items/weapon/ItemGunBio.java | 1 - .../com/hbm/items/weapon/ItemGunCongo.java | 1 - .../java/com/hbm/items/weapon/ItemGunPip.java | 1 - .../java/com/hbm/lib/HbmChestContents.java | 1 - src/main/java/com/hbm/main/ClientProxy.java | 3 + src/main/java/com/hbm/main/MainRegistry.java | 4 +- .../hbm/particle/ParticleCoolingTower.java | 44 +- .../render/tileentity/RenderLaunchPad.java | 12 +- .../tileentity/bomb/TileEntityLaunchPad.java | 394 ++---------------- .../bomb/TileEntityLaunchPadBase.java | 78 +++- .../bomb/TileEntityLaunchPadLarge.java | 57 ++- .../machine/TileEntityFurnaceBrick.java | 2 + 29 files changed, 225 insertions(+), 669 deletions(-) delete mode 100644 src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java delete mode 100644 src/main/java/com/hbm/inventory/gui/GUILaunchPadTier1.java diff --git a/changelog b/changelog index e754f9074..77a41cc8c 100644 --- a/changelog +++ b/changelog @@ -66,6 +66,8 @@ * Retextured the fallout effect, fallout no longer has large snowflakes and the color now matches the crater better * High-yield mini nukes no longer create chunk radiation, since they use the MK5 which already has AoE radiation, this prevents dead grass from spawning that makes the crater look uglier * Balefire spread is now limited to prevent densely vegetated biomes from lagging to hell +* The bricked furnace now makes charcoal twice as fast +* Combination ovens no longer need two welded copper plates and instead only cast plates, therefore no longer being post-arc welder. This should make it more affordable and useful in the initial earlygame where things like automatic wood farms are most important. ## Fixed * Fixed dupe caused by shift-clicking ashes out of the bricked furnace diff --git a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java index 0d586e803..f2a8d73d7 100644 --- a/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java +++ b/src/main/java/com/hbm/blocks/bomb/BlockVolcano.java @@ -198,10 +198,6 @@ public class BlockVolcano extends BlockContainer implements ITooltipProvider, IB } } - /* TODO */ - private boolean doesPyroclastic() { return false; } - private double getPyroclasticRange() { return 0D; } - /** Causes two magma explosions, one from bedrock to the core and one from the core to 15 blocks above. */ private void blastMagmaChannel() { ExplosionNT explosion = new ExplosionNT(worldObj, null, xCoord + 0.5, yCoord + worldObj.rand.nextInt(15) + 1.5, zCoord + 0.5, 7); diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java index 78436a540..ac7910c4a 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPad.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPad.java @@ -1,131 +1,74 @@ package com.hbm.blocks.bomb; -import java.util.Random; - -import com.hbm.blocks.ModBlocks; +import com.hbm.blocks.BlockDummyable; import com.hbm.interfaces.IBomb; -import com.hbm.main.MainRegistry; import com.hbm.tileentity.bomb.TileEntityLaunchPad; -import cpw.mods.fml.common.network.internal.FMLNetworkHandler; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; -import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; -import net.minecraft.entity.item.EntityItem; 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.world.World; -public class LaunchPad extends BlockContainer implements IBomb { +public class LaunchPad extends BlockDummyable implements IBomb { - public static boolean keepInventory = false; - private final static Random field_149933_a = new Random(); - - public LaunchPad(Material p_i45386_1_) { - super(p_i45386_1_); + public LaunchPad(Material mat) { + super(mat); } @Override - public TileEntity createNewTileEntity(World p_149915_1_, int p_149915_2_) { - return new TileEntityLaunchPad(); + public TileEntity createNewTileEntity(World world, int meta) { + if(meta >= 12) return new TileEntityLaunchPad(); + return null; } - - @Override - public void breakBlock(World p_149749_1_, int p_149749_2_, int p_149749_3_, int p_149749_4_, Block p_149749_5_, int p_149749_6_) { - if(!keepInventory) { - TileEntityLaunchPad tileentityfurnace = (TileEntityLaunchPad) p_149749_1_.getTileEntity(p_149749_2_, p_149749_3_, p_149749_4_); - - if(tileentityfurnace != null) { - for(int i1 = 0; i1 < tileentityfurnace.getSizeInventory(); ++i1) { - ItemStack itemstack = tileentityfurnace.getStackInSlot(i1); - - if(itemstack != null) { - float f = LaunchPad.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f1 = LaunchPad.field_149933_a.nextFloat() * 0.8F + 0.1F; - float f2 = LaunchPad.field_149933_a.nextFloat() * 0.8F + 0.1F; - - while(itemstack.stackSize > 0) { - int j1 = LaunchPad.field_149933_a.nextInt(21) + 10; - - if(j1 > itemstack.stackSize) { - j1 = itemstack.stackSize; - } - - itemstack.stackSize -= j1; - EntityItem entityitem = new EntityItem(p_149749_1_, p_149749_2_ + f, p_149749_3_ + f1, p_149749_4_ + f2, new ItemStack(itemstack.getItem(), j1, itemstack.getItemDamage())); - - if(itemstack.hasTagCompound()) { - entityitem.getEntityItem().setTagCompound((NBTTagCompound) itemstack.getTagCompound().copy()); - } - - float f3 = 0.05F; - entityitem.motionX = (float) LaunchPad.field_149933_a.nextGaussian() * f3; - entityitem.motionY = (float) LaunchPad.field_149933_a.nextGaussian() * f3 + 0.2F; - entityitem.motionZ = (float) LaunchPad.field_149933_a.nextGaussian() * f3; - p_149749_1_.spawnEntityInWorld(entityitem); - } - } - } - - p_149749_1_.func_147453_f(p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_); - } - } - - super.breakBlock(p_149749_1_, p_149749_2_, p_149749_3_, p_149749_4_, p_149749_5_, p_149749_6_); - } - + @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) { - if(world.isRemote) { - return true; - } else if(!player.isSneaking()) { - TileEntityLaunchPad entity = (TileEntityLaunchPad) world.getTileEntity(x, y, z); - if(entity != null) { - FMLNetworkHandler.openGui(player, MainRegistry.instance, 0, world, x, y, z); - } - return true; - } else { - return false; - } + return this.standardOpenBehavior(world, x, y, z, player, 0); } @Override - public void onNeighborBlockChange(World p_149695_1_, int x, int y, int z, Block p_149695_5_) { - if(p_149695_1_.isBlockIndirectlyGettingPowered(x, y, z) && !p_149695_1_.isRemote) { - this.explode(p_149695_1_, x, y, z); - } + public int[] getDimensions() { + return new int[] {0, 0, 1, 1, 1, 1}; } @Override - public int getRenderType() { - return -1; - } - - @Override - public boolean isOpaqueCube() { - return false; - } - - @Override - public boolean renderAsNormalBlock() { - return false; - } - - @Override - @SideOnly(Side.CLIENT) - public Item getItem(World p_149694_1_, int p_149694_2_, int p_149694_3_, int p_149694_4_) { - return Item.getItemFromBlock(ModBlocks.launch_pad); + public int getOffset() { + return 1; } @Override public BombReturnCode explode(World world, int x, int y, int z) { - TileEntityLaunchPad entity = (TileEntityLaunchPad) world.getTileEntity(x, y, z); - return entity.launchFromDesignator(); + + if(!world.isRemote) { + + int[] corePos = findCore(world, x, y, z); + if(corePos != null){ + TileEntity core = world.getTileEntity(corePos[0], corePos[1], corePos[2]); + if(core instanceof TileEntityLaunchPad){ + TileEntityLaunchPad entity = (TileEntityLaunchPad)core; + return entity.launchFromDesignator(); + } + } + } + + return BombReturnCode.UNDEFINED; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block blockIn){ + + if(!world.isRemote){ + + int[] corePos = findCore(world, x, y, z); + if(corePos != null){ + TileEntity core = world.getTileEntity(corePos[0], corePos[1], corePos[2]); + if(core instanceof TileEntityLaunchPad){ + TileEntityLaunchPad launchpad = (TileEntityLaunchPad)core; + launchpad.updateRedstonePower(x, y, z); + } + } + } + super.onNeighborBlockChange( world, x, y, z, blockIn); } - } diff --git a/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java b/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java index eb6d9daa8..da9f9bdec 100644 --- a/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java +++ b/src/main/java/com/hbm/blocks/bomb/LaunchPadLarge.java @@ -64,8 +64,8 @@ public class LaunchPadLarge extends BlockDummyable implements IBomb { if(corePos != null){ TileEntity core = world.getTileEntity(corePos[0], corePos[1], corePos[2]); if(core instanceof TileEntityLaunchPadLarge){ - TileEntityLaunchPadLarge door = (TileEntityLaunchPadLarge)core; - door.updateRedstonePower(x, y, z); + TileEntityLaunchPadLarge launchpad = (TileEntityLaunchPadLarge)core; + launchpad.updateRedstonePower(x, y, z); } } } diff --git a/src/main/java/com/hbm/handler/guncfg/Gun20GaugeFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun20GaugeFactory.java index 573e56e84..2bf40a528 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun20GaugeFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun20GaugeFactory.java @@ -13,7 +13,6 @@ import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun45ACPFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun45ACPFactory.java index 0e7916786..d21ebf9c9 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun45ACPFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun45ACPFactory.java @@ -12,7 +12,6 @@ import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java index 6a99a6109..847a3f3ab 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun50BMGFactory.java @@ -20,7 +20,6 @@ import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java index e3f697b5a..4c0f19804 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun556mmFactory.java @@ -18,7 +18,6 @@ import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java index 2f24b5a02..47ae1fb7d 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun75BoltFactory.java @@ -14,7 +14,6 @@ import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.potion.HbmPotion; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/Gun762mmFactory.java b/src/main/java/com/hbm/handler/guncfg/Gun762mmFactory.java index 993751dda..3419a631b 100644 --- a/src/main/java/com/hbm/handler/guncfg/Gun762mmFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/Gun762mmFactory.java @@ -15,7 +15,6 @@ import com.hbm.particle.SpentCasing; import com.hbm.particle.SpentCasing.CasingType; import com.hbm.potion.HbmPotion; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/GunGaussFactory.java b/src/main/java/com/hbm/handler/guncfg/GunGaussFactory.java index 93dfe03b9..905f80321 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunGaussFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunGaussFactory.java @@ -9,7 +9,6 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.items.ModItems; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/handler/guncfg/GunRocketFactory.java b/src/main/java/com/hbm/handler/guncfg/GunRocketFactory.java index 0c9b53a54..1c933ce55 100644 --- a/src/main/java/com/hbm/handler/guncfg/GunRocketFactory.java +++ b/src/main/java/com/hbm/handler/guncfg/GunRocketFactory.java @@ -13,7 +13,6 @@ import com.hbm.items.ModItems; import com.hbm.items.ItemAmmoEnums.AmmoRocket; import com.hbm.lib.HbmCollection.EnumGunManufacturer; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; import com.hbm.render.util.RenderScreenOverlay.Crosshair; diff --git a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java b/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java deleted file mode 100644 index a19e9a385..000000000 --- a/src/main/java/com/hbm/inventory/container/ContainerLaunchPadTier1.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.hbm.inventory.container; - -import com.hbm.tileentity.bomb.TileEntityLaunchPad; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; - -public class ContainerLaunchPadTier1 extends Container { - - private TileEntityLaunchPad diFurnace; - - public ContainerLaunchPadTier1(InventoryPlayer invPlayer, TileEntityLaunchPad tedf) { - - diFurnace = tedf; - - this.addSlotToContainer(new Slot(tedf, 0, 26, 17)); - this.addSlotToContainer(new Slot(tedf, 1, 80, 17)); - this.addSlotToContainer(new Slot(tedf, 2, 134, 17)); - - for(int i = 0; i < 3; i++) { - for(int j = 0; j < 9; j++) { - this.addSlotToContainer(new Slot(invPlayer, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); - } - } - - for(int i = 0; i < 9; i++) { - this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142)); - } - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - ItemStack var3 = null; - Slot var4 = (Slot) this.inventorySlots.get(par2); - - if(var4 != null && var4.getHasStack()) { - ItemStack var5 = var4.getStack(); - var3 = var5.copy(); - - if(par2 <= 2) { - if(!this.mergeItemStack(var5, 3, this.inventorySlots.size(), true)) { - return null; - } - } else { - return null; - } - - if(var5.stackSize == 0) { - var4.putStack((ItemStack) null); - } else { - var4.onSlotChanged(); - } - } - - return var3; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } -} diff --git a/src/main/java/com/hbm/inventory/gui/GUILaunchPadTier1.java b/src/main/java/com/hbm/inventory/gui/GUILaunchPadTier1.java deleted file mode 100644 index e57b35868..000000000 --- a/src/main/java/com/hbm/inventory/gui/GUILaunchPadTier1.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.hbm.inventory.gui; - -import net.minecraft.client.Minecraft; -import net.minecraft.client.resources.I18n; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.util.ResourceLocation; - -import org.lwjgl.opengl.GL11; - -import com.hbm.inventory.container.ContainerLaunchPadTier1; -import com.hbm.lib.RefStrings; -import com.hbm.tileentity.bomb.TileEntityLaunchPad; - -public class GUILaunchPadTier1 extends GuiInfoContainer { - - private static ResourceLocation texture = new ResourceLocation(RefStrings.MODID + ":textures/gui/weapon/gui_launch_pad.png"); - private TileEntityLaunchPad diFurnace; - - public GUILaunchPadTier1(InventoryPlayer invPlayer, TileEntityLaunchPad tedf) { - super(new ContainerLaunchPadTier1(invPlayer, tedf)); - diFurnace = tedf; - - this.xSize = 176; - this.ySize = 166; - } - - @Override - public void drawScreen(int mouseX, int mouseY, float f) { - super.drawScreen(mouseX, mouseY, f); - - this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 8, guiTop + 53, 160, 16, diFurnace.power, diFurnace.maxPower); - - String[] text = new String[] { "First Slot:", - " -Missile (no custom ones!)", - " -Carrier Rocket" }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36, 16, 16, guiLeft - 8, guiTop + 36 + 16, text); - - String[] text1 = new String[] { "Second Slot:", - " -Target designator for missiles", - " -Satellite payload for the carrier rocket" }; - this.drawCustomInfoStat(mouseX, mouseY, guiLeft - 16, guiTop + 36 + 16, 16, 16, guiLeft - 8, guiTop + 36 + 16, text1); - } - - @Override - protected void drawGuiContainerForegroundLayer(int i, int j) { - String name = this.diFurnace.hasCustomInventoryName() ? this.diFurnace.getInventoryName() : I18n.format(this.diFurnace.getInventoryName()); - - this.fontRendererObj.drawString(name, this.xSize / 2 - this.fontRendererObj.getStringWidth(name) / 2, 6, 4210752); - this.fontRendererObj.drawString(I18n.format("container.inventory"), 8, this.ySize - 96 + 2, 4210752); - } - - @Override - protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - Minecraft.getMinecraft().getTextureManager().bindTexture(texture); - drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); - - int j1 = (int)diFurnace.getPowerScaled(160); - drawTexturedModalRect(guiLeft + 8, guiTop + 53, 8, 166, j1, 16); - - this.drawInfoPanel(guiLeft - 16, guiTop + 36, 16, 16, 2); - this.drawInfoPanel(guiLeft - 16, guiTop + 36 + 16, 16, 16, 3); - } -} diff --git a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java index f6a37b64d..794daf237 100644 --- a/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/anvil/AnvilRecipes.java @@ -312,7 +312,7 @@ public class AnvilRecipes { new AStack[] { new ComparableStack(Blocks.stonebrick, 8), new OreDictStack(KEY_LOG, 16), - new OreDictStack(CU.plateWelded(), 2), + new OreDictStack(CU.plateCast(), 2), new OreDictStack(KEY_BRICK, 16) }, new AnvilOutput(new ItemStack(ModBlocks.furnace_combination))).setTier(2)); diff --git a/src/main/java/com/hbm/items/tool/ItemBoltgun.java b/src/main/java/com/hbm/items/tool/ItemBoltgun.java index c4178aa08..0b4ef3dd2 100644 --- a/src/main/java/com/hbm/items/tool/ItemBoltgun.java +++ b/src/main/java/com/hbm/items/tool/ItemBoltgun.java @@ -8,7 +8,6 @@ import com.hbm.main.MainRegistry; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.util.EntityDamageUtil; diff --git a/src/main/java/com/hbm/items/weapon/ItemCoilgun.java b/src/main/java/com/hbm/items/weapon/ItemCoilgun.java index 2cff7857d..af245c5d2 100644 --- a/src/main/java/com/hbm/items/weapon/ItemCoilgun.java +++ b/src/main/java/com/hbm/items/weapon/ItemCoilgun.java @@ -2,7 +2,6 @@ package com.hbm.items.weapon; import com.hbm.handler.GunConfiguration; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunBio.java b/src/main/java/com/hbm/items/weapon/ItemGunBio.java index 77ea4a9f7..1e7184e84 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunBio.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunBio.java @@ -5,7 +5,6 @@ import java.util.List; import com.hbm.handler.GunConfiguration; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunCongo.java b/src/main/java/com/hbm/items/weapon/ItemGunCongo.java index 4e34d889a..a4657cb6e 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunCongo.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunCongo.java @@ -2,7 +2,6 @@ package com.hbm.items.weapon; import com.hbm.handler.GunConfiguration; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; diff --git a/src/main/java/com/hbm/items/weapon/ItemGunPip.java b/src/main/java/com/hbm/items/weapon/ItemGunPip.java index c57e56a70..c6ed8aaf9 100644 --- a/src/main/java/com/hbm/items/weapon/ItemGunPip.java +++ b/src/main/java/com/hbm/items/weapon/ItemGunPip.java @@ -5,7 +5,6 @@ import java.util.List; import com.hbm.handler.GunConfiguration; import com.hbm.render.anim.BusAnimation; -import com.hbm.render.anim.BusAnimationKeyframe; import com.hbm.render.anim.BusAnimationSequence; import com.hbm.render.anim.HbmAnimations.AnimType; diff --git a/src/main/java/com/hbm/lib/HbmChestContents.java b/src/main/java/com/hbm/lib/HbmChestContents.java index c0bda98a8..c1571f47b 100644 --- a/src/main/java/com/hbm/lib/HbmChestContents.java +++ b/src/main/java/com/hbm/lib/HbmChestContents.java @@ -17,7 +17,6 @@ import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.WeightedRandomChestContent; -import net.minecraft.world.ChunkCoordIntPair; public class HbmChestContents { diff --git a/src/main/java/com/hbm/main/ClientProxy.java b/src/main/java/com/hbm/main/ClientProxy.java index a11765e7a..40e1cf518 100644 --- a/src/main/java/com/hbm/main/ClientProxy.java +++ b/src/main/java/com/hbm/main/ClientProxy.java @@ -1715,6 +1715,9 @@ public class ClientProxy extends ServerProxy { fx.setBaseScale(data.getFloat("base")); fx.setMaxScale(data.getFloat("max")); fx.setLife(data.getInteger("life") / (particleSetting + 1)); + if(data.hasKey("noWind")) fx.noWind(); + if(data.hasKey("strafe")) fx.setStrafe(data.getFloat("strafe")); + if(data.hasKey("alpha")) fx.alphaMod(data.getFloat("alpha")); if(data.hasKey("color")) { Color color = new Color(data.getInteger("color")); diff --git a/src/main/java/com/hbm/main/MainRegistry.java b/src/main/java/com/hbm/main/MainRegistry.java index 006d32211..3928f0aa8 100644 --- a/src/main/java/com/hbm/main/MainRegistry.java +++ b/src/main/java/com/hbm/main/MainRegistry.java @@ -41,7 +41,7 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.potion.HbmPotion; import com.hbm.saveddata.satellites.Satellite; import com.hbm.tileentity.TileMappings; -import com.hbm.tileentity.bomb.TileEntityLaunchPad; +import com.hbm.tileentity.bomb.TileEntityLaunchPadBase; import com.hbm.tileentity.bomb.TileEntityNukeCustom; import com.hbm.tileentity.machine.TileEntityNukeFurnace; import com.hbm.tileentity.machine.rbmk.RBMKDials; @@ -332,7 +332,7 @@ public class MainRegistry { TileMappings.writeMappings(); MachineDynConfig.initialize(); - TileEntityLaunchPad.registerLaunchables(); + TileEntityLaunchPadBase.registerLaunchables(); for(Entry, String[]> e : TileMappings.map.entrySet()) { diff --git a/src/main/java/com/hbm/particle/ParticleCoolingTower.java b/src/main/java/com/hbm/particle/ParticleCoolingTower.java index ced14c05f..cf9d39559 100644 --- a/src/main/java/com/hbm/particle/ParticleCoolingTower.java +++ b/src/main/java/com/hbm/particle/ParticleCoolingTower.java @@ -15,6 +15,9 @@ public class ParticleCoolingTower extends EntityFX { private float baseScale = 1.0F; private float maxScale = 1.0F; private float lift = 0.3F; + private float strafe = 0.075F; + private boolean windDir = true; + private float alphaMod = 0.25F; public ParticleCoolingTower(TextureManager texman, World world, double x, double y, double z) { super(world, x, y, z); @@ -23,21 +26,13 @@ public class ParticleCoolingTower extends EntityFX { this.noClip = true; } - public void setBaseScale(float f) { - this.baseScale = f; - } - - public void setMaxScale(float f) { - this.maxScale = f; - } - - public void setLift(float f) { - this.lift = f; - } - - public void setLife(int i) { - this.particleMaxAge = i; - } + public void setBaseScale(float f) { this.baseScale = f; } + public void setMaxScale(float f) { this.maxScale = f; } + public void setLift(float f) { this.lift = f; } + public void setLife(int i) { this.particleMaxAge = i; } + public void setStrafe(float f) { this.strafe = f; } + public void noWind() { this.windDir = false; } + public void alphaMod(float mod) { this.alphaMod = mod; } public void onUpdate() { @@ -47,20 +42,25 @@ public class ParticleCoolingTower extends EntityFX { float ageScale = (float) this.particleAge / (float) this.particleMaxAge; - this.particleAlpha = 0.25F - ageScale * 0.25F; + this.particleAlpha = alphaMod - ageScale * alphaMod; this.particleScale = baseScale + (float)Math.pow((maxScale * ageScale - baseScale), 2); this.particleAge++; - - if(this.motionY < this.lift) { + + if(lift > 0 && this.motionY < this.lift) { this.motionY += 0.01F; } + if(lift < 0 && this.motionY > this.lift) { + this.motionY -= 0.01F; + } - this.motionX += rand.nextGaussian() * 0.075D * ageScale; - this.motionZ += rand.nextGaussian() * 0.075D * ageScale; + this.motionX += rand.nextGaussian() * strafe * ageScale; + this.motionZ += rand.nextGaussian() * strafe * ageScale; - this.motionX += 0.02 * ageScale; - this.motionX -= 0.01 * ageScale; + if(windDir) { + this.motionX += 0.02 * ageScale; + this.motionZ -= 0.01 * ageScale; + } if(this.particleAge == this.particleMaxAge) { this.setDead(); diff --git a/src/main/java/com/hbm/render/tileentity/RenderLaunchPad.java b/src/main/java/com/hbm/render/tileentity/RenderLaunchPad.java index b0f720391..a57b0cce3 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderLaunchPad.java +++ b/src/main/java/com/hbm/render/tileentity/RenderLaunchPad.java @@ -4,6 +4,7 @@ import java.util.function.Consumer; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.BlockDummyable; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderMissileGeneric; @@ -21,13 +22,18 @@ public class RenderLaunchPad extends TileEntitySpecialRenderer { GL11.glPushMatrix(); GL11.glTranslated(x + 0.5D, y, z + 0.5D); GL11.glEnable(GL11.GL_LIGHTING); - GL11.glDisable(GL11.GL_CULL_FACE); + GL11.glEnable(GL11.GL_CULL_FACE); + + switch(tileEntity.getBlockMetadata() - BlockDummyable.offset) { + case 2: GL11.glRotatef(90, 0F, 1F, 0F); break; + case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; + case 3: GL11.glRotatef(270, 0F, 1F, 0F); break; + case 5: GL11.glRotatef(0, 0F, 1F, 0F); break; + } bindTexture(ResourceManager.missile_pad_tex); ResourceManager.missile_pad.renderAll(); - GL11.glDisable(GL11.GL_CULL_FACE); - if(tileEntity instanceof TileEntityLaunchPad) { ItemStack toRender = ((TileEntityLaunchPad) tileEntity).toRender; diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java index 5513e6de1..2b7c53dea 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPad.java @@ -1,230 +1,65 @@ package com.hbm.tileentity.bomb; -import java.util.HashMap; -import java.util.List; - -import org.apache.logging.log4j.Level; - -import com.hbm.blocks.ModBlocks; -import com.hbm.blocks.bomb.LaunchPad; -import com.hbm.config.GeneralConfig; -import com.hbm.entity.missile.EntityCarrier; -import com.hbm.entity.missile.EntityMissileAntiBallistic; -import com.hbm.entity.missile.EntityMissileBaseNT; -import com.hbm.entity.missile.EntityMissileDoomsday; -import com.hbm.entity.missile.EntityMissileShuttle; -import com.hbm.entity.missile.EntityMissileStealth; -import com.hbm.entity.missile.EntityMissileTier0.*; -import com.hbm.entity.missile.EntityMissileTier1.*; -import com.hbm.entity.missile.EntityMissileTier2.*; -import com.hbm.entity.missile.EntityMissileTier3.*; -import com.hbm.entity.missile.EntityMissileTier4.*; -import com.hbm.interfaces.IBomb.BombReturnCode; -import com.hbm.inventory.RecipesCommon.ComparableStack; -import com.hbm.inventory.container.ContainerLaunchPadTier1; -import com.hbm.inventory.gui.GUILaunchPadTier1; -import com.hbm.items.ModItems; -import com.hbm.lib.Library; -import com.hbm.main.MainRegistry; -import com.hbm.tileentity.IGUIProvider; -import com.hbm.tileentity.IRadarCommandReceiver; -import com.hbm.tileentity.TileEntityMachineBase; - import api.hbm.energy.IEnergyUser; -import api.hbm.item.IDesignatorItem; -import cpw.mods.fml.common.Optional; +import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import li.cil.oc.api.machine.Arguments; -import li.cil.oc.api.machine.Callback; -import li.cil.oc.api.machine.Context; -import li.cil.oc.api.network.SimpleComponent; -import net.minecraft.client.gui.GuiScreen; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraft.util.Vec3; -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityLaunchPad extends TileEntityMachineBase implements IEnergyUser, SimpleComponent, IGUIProvider, IRadarCommandReceiver { - - /** Automatic instantiation of generic missiles, i.e. everything that both extends EntityMissileBaseNT and needs a designator */ - public static final HashMap> missiles = new HashMap(); - - public static void registerLaunchables() { +public class TileEntityLaunchPad extends TileEntityLaunchPadBase implements IEnergyUser, IFluidStandardReceiver { - //Tier 0 - missiles.put(new ComparableStack(ModItems.missile_micro), EntityMissileMicro.class); - missiles.put(new ComparableStack(ModItems.missile_schrabidium), EntityMissileSchrabidium.class); - missiles.put(new ComparableStack(ModItems.missile_bhole), EntityMissileBHole.class); - missiles.put(new ComparableStack(ModItems.missile_taint), EntityMissileTaint.class); - missiles.put(new ComparableStack(ModItems.missile_emp), EntityMissileEMP.class); - //Tier 1 - missiles.put(new ComparableStack(ModItems.missile_generic), EntityMissileGeneric.class); - missiles.put(new ComparableStack(ModItems.missile_decoy), EntityMissileDecoy.class); - missiles.put(new ComparableStack(ModItems.missile_incendiary), EntityMissileIncendiary.class); - missiles.put(new ComparableStack(ModItems.missile_cluster), EntityMissileCluster.class); - missiles.put(new ComparableStack(ModItems.missile_buster), EntityMissileBunkerBuster.class); - //Tier 2 - missiles.put(new ComparableStack(ModItems.missile_strong), EntityMissileStrong.class); - missiles.put(new ComparableStack(ModItems.missile_incendiary_strong), EntityMissileIncendiaryStrong.class); - missiles.put(new ComparableStack(ModItems.missile_cluster_strong), EntityMissileClusterStrong.class); - missiles.put(new ComparableStack(ModItems.missile_buster_strong), EntityMissileBusterStrong.class); - missiles.put(new ComparableStack(ModItems.missile_emp_strong), EntityMissileEMPStrong.class); - //Tier 3 - missiles.put(new ComparableStack(ModItems.missile_burst), EntityMissileBurst.class); - missiles.put(new ComparableStack(ModItems.missile_inferno), EntityMissileInferno.class); - missiles.put(new ComparableStack(ModItems.missile_rain), EntityMissileRain.class); - missiles.put(new ComparableStack(ModItems.missile_drill), EntityMissileDrill.class); - missiles.put(new ComparableStack(ModItems.missile_shuttle), EntityMissileShuttle.class); - //Tier 4 - missiles.put(new ComparableStack(ModItems.missile_nuclear), EntityMissileNuclear.class); - missiles.put(new ComparableStack(ModItems.missile_nuclear_cluster), EntityMissileMirv.class); - missiles.put(new ComparableStack(ModItems.missile_volcano), EntityMissileVolcano.class); - - missiles.put(new ComparableStack(ModItems.missile_doomsday), EntityMissileDoomsday.class); - missiles.put(new ComparableStack(ModItems.missile_stealth), EntityMissileStealth.class); - } - - public ItemStack toRender; + @Override public boolean isReadyForLaunch() { return delay <= 0; } + @Override public double getLaunchOffset() { return 2D; } - public long power; - public final long maxPower = 100000; - - private static final int[] slots_bottom = new int[] {0, 1, 2}; - private static final int[] slots_side = new int[] {0}; - - public TileEntityLaunchPad() { - super(3); - } - - @Override - public String getName() { - return "container.launchPad"; - } + public int delay = 0; @Override public void updateEntity() { if(!worldObj.isRemote) { - power = Library.chargeTEFromItems(slots, 2, power, maxPower); - this.updateConnections(); + if(this.delay > 0) delay--; - NBTTagCompound data = new NBTTagCompound(); - data.setLong("power", power); - if(slots[0] != null) { - data.setInteger("id", Item.getIdFromItem(slots[0].getItem())); - data.setShort("meta", (short) slots[0].getItemDamage()); - } - networkPack(data, 250); - } else { - - - List entities = worldObj.getEntitiesWithinAABB(EntityMissileBaseNT.class, AxisAlignedBB.getBoundingBox(xCoord - 0.5, yCoord, zCoord - 0.5, xCoord + 1.5, yCoord + 10, zCoord + 1.5)); - - if(!entities.isEmpty()) { - - for(int i = 0; i < 15; i++) { - - boolean dir = worldObj.rand.nextBoolean(); - float moX = (float) (dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); - float moZ = (float) (!dir ? 0 : worldObj.rand.nextGaussian() * 0.5F); - - MainRegistry.proxy.spawnParticle(xCoord + 0.5, yCoord + 0.25, zCoord + 0.5, "launchsmoke", new float[] { moX, 0, moZ }); - } + if(!this.isMissileValid() || !this.hasFuel()) { + this.delay = 100; } } - } - - @Override - public void networkUnpack(NBTTagCompound nbt) { - this.power = nbt.getLong("power"); - if(nbt.hasKey("id")) { - this.toRender = new ItemStack(Item.getItemById(nbt.getInteger("id")), 1, nbt.getShort("meta")); - } else { - this.toRender = null; - } - } - - private void updateConnections() { - this.trySubscribe(worldObj, xCoord + 1, yCoord, zCoord, Library.POS_X); - this.trySubscribe(worldObj, xCoord - 1, yCoord, zCoord, Library.NEG_X); - this.trySubscribe(worldObj, xCoord, yCoord, zCoord + 1, Library.POS_Z); - this.trySubscribe(worldObj, xCoord, yCoord, zCoord - 1, Library.NEG_Z); - this.trySubscribe(worldObj, xCoord, yCoord - 1, zCoord, Library.NEG_Y); - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemStack) { - return true; + super.updateEntity(); } @Override public void readFromNBT(NBTTagCompound nbt) { super.readFromNBT(nbt); - power = nbt.getLong("power"); - - if(slots == null || slots.length != 3) slots = new ItemStack[3]; + + this.delay = nbt.getInteger("delay"); } @Override public void writeToNBT(NBTTagCompound nbt) { super.writeToNBT(nbt); - nbt.setLong("power", power); + + nbt.setInteger("delay", delay); } - @Override - public int[] getAccessibleSlotsFromSide(int side) { - return side == 0 ? slots_bottom : (side == 1 ? new int[0] : slots_side); - } - - public long getPowerScaled(long i) { - return (power * i) / maxPower; - } + AxisAlignedBB bb = null; @Override public AxisAlignedBB getRenderBoundingBox() { - return TileEntity.INFINITE_EXTENT_AABB; - } - - @Override - public void setPower(long i) { - power = i; - } - - @Override - public long getPower() { - return power; - } - - @Override - public long getMaxPower() { - return maxPower; - } - - @Override - public long transferPower(long power) { - this.power += power; - if(this.power > this.getMaxPower()) { - long overshoot = this.power - this.getMaxPower(); - this.power = this.getMaxPower(); - return overshoot; + + if(bb == null) { + bb = AxisAlignedBB.getBoundingBox( + xCoord - 2, + yCoord, + zCoord - 2, + xCoord + 3, + yCoord + 15, + zCoord + 3 + ); } - return 0; - } - - @Override - public boolean canConnect(ForgeDirection dir) { - return dir != ForgeDirection.UP && dir != ForgeDirection.UNKNOWN; + + return bb; } @Override @@ -232,181 +67,4 @@ public class TileEntityLaunchPad extends TileEntityMachineBase implements IEnerg public double getMaxRenderDistanceSquared() { return 65536.0D; } - - public boolean hasPower() { - return this.power >= 75_000; - } - - @Override - public boolean sendCommandPosition(int x, int y, int z) { - return this.launchToCoordinate(x, z) == BombReturnCode.LAUNCHED; - } - - @Override - public boolean sendCommandEntity(Entity target) { - return this.launchToEntity(target) == BombReturnCode.LAUNCHED; - } - - public BombReturnCode launchFromDesignator() { - if(slots[0] == null) return BombReturnCode.ERROR_MISSING_COMPONENT; - - boolean needsDesignator = missiles.containsKey(new ComparableStack(slots[0]).makeSingular()); - - int targetX = 0; - int targetZ = 0; - - if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { - - IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); - - if(!designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord) && needsDesignator) return BombReturnCode.ERROR_MISSING_COMPONENT; - - Vec3 coords = designator.getCoords(worldObj, slots[1], xCoord, yCoord, zCoord); - targetX = (int) Math.floor(coords.xCoord); - targetZ = (int) Math.floor(coords.zCoord); - - } else { - if(needsDesignator) return BombReturnCode.ERROR_MISSING_COMPONENT; - } - - return this.launchToCoordinate(targetX, targetZ); - } - - public BombReturnCode launchToEntity(Entity entity) { - if(!hasPower()) return BombReturnCode.ERROR_MISSING_COMPONENT; - Entity e = instantiateMissile((int) Math.floor(entity.posX), (int) Math.floor(entity.posZ)); - if(e != null) { - - if(e instanceof EntityMissileAntiBallistic) { - EntityMissileAntiBallistic abm = (EntityMissileAntiBallistic) e; - abm.tracking = entity; - } - - finalizeLaunch(e); - return BombReturnCode.LAUNCHED; - } - return BombReturnCode.ERROR_MISSING_COMPONENT; - } - - public BombReturnCode launchToCoordinate(int targetX, int targetZ) { - if(!hasPower()) return BombReturnCode.ERROR_MISSING_COMPONENT; - Entity e = instantiateMissile(targetX, targetZ); - if(e != null) { - finalizeLaunch(e); - return BombReturnCode.LAUNCHED; - } - return BombReturnCode.ERROR_MISSING_COMPONENT; - } - - public Entity instantiateMissile(int targetX, int targetZ) { - - if(slots[0] == null) return null; - - if(slots[0].getItem() == ModItems.missile_carrier) { - EntityCarrier missile = new EntityCarrier(worldObj); - missile.posX = xCoord + 0.5F; - missile.posY = yCoord + 1F; - missile.posZ = zCoord + 0.5F; - if(slots[1] != null) { - missile.setPayload(slots[1]); - this.slots[1] = null; - } - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:entity.rocketTakeoff", 100.0F, 1.0F); - return missile; - } - - Class clazz = this.missiles.get(new ComparableStack(slots[0]).makeSingular()); - - if(clazz != null) { - try { - EntityMissileBaseNT missile = clazz.getConstructor(World.class, float.class, float.class, float.class, int.class, int.class).newInstance(worldObj, xCoord + 0.5F, yCoord + 1F, zCoord + 0.5F, targetX, targetZ); - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:weapon.missileTakeOff", 2.0F, 1.0F); - if(GeneralConfig.enableExtendedLogging) MainRegistry.logger.log(Level.INFO, "[MISSILE] Tried to launch missile at " + xCoord + " / " + yCoord + " / " + zCoord + " to " + xCoord + " / " + zCoord + "!"); - return missile; - } catch(Exception e) { } - } - - if(slots[0].getItem() == ModItems.missile_anti_ballistic) { - EntityMissileAntiBallistic missile = new EntityMissileAntiBallistic(worldObj); - missile.posX = xCoord + 0.5F; - missile.posY = yCoord + 0.5F; - missile.posZ = zCoord + 0.5F; - worldObj.playSoundEffect(xCoord + 0.5, yCoord, zCoord + 0.5, "hbm:weapon.missileTakeOff", 2.0F, 1.0F); - return missile; - } - - return null; - } - - public void finalizeLaunch(Entity missile) { - this.power -= 75_000; - worldObj.spawnEntityInWorld(missile); - this.decrStackSize(0, 1); - } - - // do some opencomputer stuff - @Override - public String getComponentName() { - return "launch_pad"; - } - - @Callback - @Optional.Method(modid = "OpenComputers") - public Object[] getEnergyInfo(Context context, Arguments args) { - return new Object[] {getPower(), getMaxPower()}; - } - - @Callback - @Optional.Method(modid = "OpenComputers") - public Object[] getCoords(Context context, Arguments args) { - if (slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { - int xCoord2; - int zCoord2; - if (slots[1].stackTagCompound != null) { - xCoord2 = slots[1].stackTagCompound.getInteger("xCoord"); - zCoord2 = slots[1].stackTagCompound.getInteger("zCoord"); - } else - return new Object[] {false}; - - // Not sure if i should have this - /* - if(xCoord2 == xCoord && zCoord2 == zCoord) { - xCoord2 += 1; - } - */ - - return new Object[] {xCoord2, zCoord2}; - } - return new Object[] {false, "Designator not found"}; - } - @Callback - @Optional.Method(modid = "OpenComputers") - public Object[] setCoords(Context context, Arguments args) { - if (slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { - slots[1].stackTagCompound = new NBTTagCompound(); - slots[1].stackTagCompound.setInteger("xCoord", args.checkInteger(0)); - slots[1].stackTagCompound.setInteger("zCoord", args.checkInteger(1)); - - return new Object[] {true}; - } - return new Object[] {false, "Designator not found"}; - } - - @Callback - @Optional.Method(modid = "OpenComputers") - public Object[] launch(Context context, Arguments args) { - ((LaunchPad) ModBlocks.launch_pad).explode(worldObj, xCoord, yCoord, zCoord); - return new Object[] {}; - } - - @Override - public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new ContainerLaunchPadTier1(player.inventory, this); - } - - @Override - @SideOnly(Side.CLIENT) - public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { - return new GUILaunchPadTier1(player.inventory, this); - } } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java index 6cc7d1a4b..b2e746207 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java @@ -1,5 +1,6 @@ package com.hbm.tileentity.bomb; +import java.util.HashMap; import java.util.HashSet; import java.util.Set; @@ -8,6 +9,31 @@ import org.apache.logging.log4j.Level; import com.hbm.config.GeneralConfig; import com.hbm.entity.missile.EntityMissileAntiBallistic; import com.hbm.entity.missile.EntityMissileBaseNT; +import com.hbm.entity.missile.EntityMissileDoomsday; +import com.hbm.entity.missile.EntityMissileShuttle; +import com.hbm.entity.missile.EntityMissileStealth; +import com.hbm.entity.missile.EntityMissileTier0.EntityMissileBHole; +import com.hbm.entity.missile.EntityMissileTier0.EntityMissileEMP; +import com.hbm.entity.missile.EntityMissileTier0.EntityMissileMicro; +import com.hbm.entity.missile.EntityMissileTier0.EntityMissileSchrabidium; +import com.hbm.entity.missile.EntityMissileTier0.EntityMissileTaint; +import com.hbm.entity.missile.EntityMissileTier1.EntityMissileBunkerBuster; +import com.hbm.entity.missile.EntityMissileTier1.EntityMissileCluster; +import com.hbm.entity.missile.EntityMissileTier1.EntityMissileDecoy; +import com.hbm.entity.missile.EntityMissileTier1.EntityMissileGeneric; +import com.hbm.entity.missile.EntityMissileTier1.EntityMissileIncendiary; +import com.hbm.entity.missile.EntityMissileTier2.EntityMissileBusterStrong; +import com.hbm.entity.missile.EntityMissileTier2.EntityMissileClusterStrong; +import com.hbm.entity.missile.EntityMissileTier2.EntityMissileEMPStrong; +import com.hbm.entity.missile.EntityMissileTier2.EntityMissileIncendiaryStrong; +import com.hbm.entity.missile.EntityMissileTier2.EntityMissileStrong; +import com.hbm.entity.missile.EntityMissileTier3.EntityMissileBurst; +import com.hbm.entity.missile.EntityMissileTier3.EntityMissileDrill; +import com.hbm.entity.missile.EntityMissileTier3.EntityMissileInferno; +import com.hbm.entity.missile.EntityMissileTier3.EntityMissileRain; +import com.hbm.entity.missile.EntityMissileTier4.EntityMissileMirv; +import com.hbm.entity.missile.EntityMissileTier4.EntityMissileNuclear; +import com.hbm.entity.missile.EntityMissileTier4.EntityMissileVolcano; import com.hbm.interfaces.IBomb.BombReturnCode; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.container.ContainerLaunchPadLarge; @@ -37,10 +63,49 @@ import net.minecraft.inventory.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IRadarCommandReceiver { + + /** Automatic instantiation of generic missiles, i.e. everything that both extends EntityMissileBaseNT and needs a designator */ + public static final HashMap> missiles = new HashMap(); + + public static void registerLaunchables() { + + //Tier 0 + missiles.put(new ComparableStack(ModItems.missile_micro), EntityMissileMicro.class); + missiles.put(new ComparableStack(ModItems.missile_schrabidium), EntityMissileSchrabidium.class); + missiles.put(new ComparableStack(ModItems.missile_bhole), EntityMissileBHole.class); + missiles.put(new ComparableStack(ModItems.missile_taint), EntityMissileTaint.class); + missiles.put(new ComparableStack(ModItems.missile_emp), EntityMissileEMP.class); + //Tier 1 + missiles.put(new ComparableStack(ModItems.missile_generic), EntityMissileGeneric.class); + missiles.put(new ComparableStack(ModItems.missile_decoy), EntityMissileDecoy.class); + missiles.put(new ComparableStack(ModItems.missile_incendiary), EntityMissileIncendiary.class); + missiles.put(new ComparableStack(ModItems.missile_cluster), EntityMissileCluster.class); + missiles.put(new ComparableStack(ModItems.missile_buster), EntityMissileBunkerBuster.class); + //Tier 2 + missiles.put(new ComparableStack(ModItems.missile_strong), EntityMissileStrong.class); + missiles.put(new ComparableStack(ModItems.missile_incendiary_strong), EntityMissileIncendiaryStrong.class); + missiles.put(new ComparableStack(ModItems.missile_cluster_strong), EntityMissileClusterStrong.class); + missiles.put(new ComparableStack(ModItems.missile_buster_strong), EntityMissileBusterStrong.class); + missiles.put(new ComparableStack(ModItems.missile_emp_strong), EntityMissileEMPStrong.class); + //Tier 3 + missiles.put(new ComparableStack(ModItems.missile_burst), EntityMissileBurst.class); + missiles.put(new ComparableStack(ModItems.missile_inferno), EntityMissileInferno.class); + missiles.put(new ComparableStack(ModItems.missile_rain), EntityMissileRain.class); + missiles.put(new ComparableStack(ModItems.missile_drill), EntityMissileDrill.class); + missiles.put(new ComparableStack(ModItems.missile_shuttle), EntityMissileShuttle.class); + //Tier 4 + missiles.put(new ComparableStack(ModItems.missile_nuclear), EntityMissileNuclear.class); + missiles.put(new ComparableStack(ModItems.missile_nuclear_cluster), EntityMissileMirv.class); + missiles.put(new ComparableStack(ModItems.missile_volcano), EntityMissileVolcano.class); + + missiles.put(new ComparableStack(ModItems.missile_doomsday), EntityMissileDoomsday.class); + missiles.put(new ComparableStack(ModItems.missile_stealth), EntityMissileStealth.class); + } public ItemStack toRender; @@ -233,21 +298,22 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl if(slots[0] == null) return null; - Class clazz = TileEntityLaunchPad.missiles.get(new ComparableStack(slots[0]).makeSingular()); + Class clazz = TileEntityLaunchPadBase.missiles.get(new ComparableStack(slots[0]).makeSingular()); if(clazz != null) { try { - EntityMissileBaseNT missile = clazz.getConstructor(World.class, float.class, float.class, float.class, int.class, int.class).newInstance(worldObj, xCoord + 0.5F, yCoord + 2F, zCoord + 0.5F, targetX, targetZ); + EntityMissileBaseNT missile = clazz.getConstructor(World.class, float.class, float.class, float.class, int.class, int.class).newInstance(worldObj, xCoord + 0.5F, yCoord + (float) getLaunchOffset() /* Position arguments need to be floats, jackass */, zCoord + 0.5F, targetX, targetZ); if(GeneralConfig.enableExtendedLogging) MainRegistry.logger.log(Level.INFO, "[MISSILE] Tried to launch missile at " + xCoord + " / " + yCoord + " / " + zCoord + " to " + xCoord + " / " + zCoord + "!"); + missile.getDataWatcher().updateObject(3, (byte) MathHelper.clamp_int(this.getBlockMetadata() - 10, 2, 5)); return missile; } catch(Exception e) { } } if(slots[0].getItem() == ModItems.missile_anti_ballistic) { EntityMissileAntiBallistic missile = new EntityMissileAntiBallistic(worldObj); - missile.posX = xCoord + 0.5F; - missile.posY = yCoord + 2F; - missile.posZ = zCoord + 0.5F; + missile.posX = xCoord + 0.5D; + missile.posY = yCoord + getLaunchOffset(); + missile.posZ = zCoord + 0.5D; return missile; } @@ -278,7 +344,6 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl int targetZ = 0; if(slots[1] != null && slots[1].getItem() instanceof IDesignatorItem) { - IDesignatorItem designator = (IDesignatorItem) slots[1].getItem(); if(!designator.isReady(worldObj, slots[1], xCoord, yCoord, zCoord) && needsDesignator) return BombReturnCode.ERROR_MISSING_COMPONENT; @@ -365,4 +430,5 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl /** Any extra conditions for launching in addition to the missile being valid and fueled */ public abstract boolean isReadyForLaunch(); + public abstract double getLaunchOffset(); } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index 7b36f7791..2b6622bfe 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -1,6 +1,6 @@ package com.hbm.tileentity.bomb; -import com.hbm.entity.missile.EntityMissileBaseNT; +import com.hbm.inventory.fluid.Fluids; import com.hbm.items.weapon.ItemMissile; import com.hbm.items.weapon.ItemMissile.MissileFormFactor; import com.hbm.main.MainRegistry; @@ -13,7 +13,6 @@ import api.hbm.fluid.IFluidStandardReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import io.netty.buffer.ByteBuf; -import net.minecraft.entity.Entity; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; @@ -43,10 +42,8 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements protected boolean liftMoving = false; protected boolean erectorMoving = false; - @Override - public boolean isReadyForLaunch() { - return this.erected && this.readyToLoad; - } + @Override public boolean isReadyForLaunch() { return this.erected && this.readyToLoad; } + @Override public double getLaunchOffset() { return 2D; } @Override public void updateEntity() { @@ -187,6 +184,43 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements this.audioErector = null; } } + + if(this.erected && this.hasFuel() && this.tanks[1].getTankType() == Fluids.OXYGEN) { + + //maybe too much? + /*if(this.formFactor == MissileFormFactor.ATLAS.ordinal() && worldObj.getTotalWorldTime() % 4 == 0) { + ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); + ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", -5F); + data.setFloat("base", 0.25F); + data.setFloat("max", 0.5F); + data.setInteger("life", 30 + worldObj.rand.nextInt(10)); + data.setDouble("posX", xCoord + 0.5 - (dir.offsetX + rot.offsetX) * 0.5); + data.setDouble("posZ", zCoord + 0.5 - (dir.offsetZ + rot.offsetZ) * 0.5); + data.setDouble("posY", yCoord + 14.625); + data.setBoolean("noWind", true); + data.setFloat("alphaMod", 0.01F); + data.setFloat("strafe", 0.05F); + for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); + }*/ + + NBTTagCompound data = new NBTTagCompound(); + data.setString("type", "tower"); + data.setFloat("lift", 0F); + data.setFloat("base", 0.5F); + data.setFloat("max", 2F); + data.setInteger("life", 60 + worldObj.rand.nextInt(30)); + data.setDouble("posX", xCoord + 0.5); + data.setDouble("posZ", zCoord + 0.5); + data.setDouble("posY", yCoord + 2); + data.setBoolean("noWind", true); + data.setFloat("alphaMod", 2F); + data.setFloat("strafe", 0.05F); + for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); + } } super.updateEntity(); @@ -244,17 +278,6 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements nbt.setInteger("formFactor", formFactor); } - public Entity instantiateMissile(int targetX, int targetZ) { - Entity missile = super.instantiateMissile(targetX, targetZ); - - if(missile instanceof EntityMissileBaseNT) { - EntityMissileBaseNT base = (EntityMissileBaseNT) missile; - base.getDataWatcher().updateObject(3, (byte) (this.getBlockMetadata() - 10)); - } - - return missile; - } - AxisAlignedBB bb = null; @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceBrick.java b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceBrick.java index f31af3b06..be440a25c 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceBrick.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityFurnaceBrick.java @@ -40,6 +40,8 @@ public class TileEntityFurnaceBrick extends TileEntityMachineBase implements IGU burnSpeed.put(Item.getItemFromBlock(Blocks.netherrack), 4); burnSpeed.put(Item.getItemFromBlock(Blocks.cobblestone), 2); burnSpeed.put(Item.getItemFromBlock(Blocks.sand), 2); + burnSpeed.put(Item.getItemFromBlock(Blocks.log), 2); + burnSpeed.put(Item.getItemFromBlock(Blocks.log2), 2); } public int burnTime; From ca2505dad0c8c7f38f2c74abd3909852b4d7b57a Mon Sep 17 00:00:00 2001 From: Bob Date: Wed, 14 Feb 2024 21:29:08 +0100 Subject: [PATCH 2/6] launch pad textures, silo launch pad --- changelog | 1 + src/main/java/com/hbm/blocks/ModBlocks.java | 2 +- .../entity/missile/EntityMissileTier1.java | 5 + .../hbm/entity/projectile/EntityChemical.java | 12 + .../java/com/hbm/main/ResourceManager.java | 4 +- .../java/com/hbm/tileentity/TileMappings.java | 1 + .../bomb/TileEntityLaunchPadBase.java | 7 + .../bomb/TileEntityLaunchPadLarge.java | 31 +-- src/main/resources/assets/hbm/lang/de_DE.lang | 5 +- src/main/resources/assets/hbm/lang/en_US.lang | 5 +- .../hbm/models/weapons/launch_pad_erector.obj | 30 +-- .../hbm/models/weapons/launch_pad_silo.obj | 255 ++++++++++++++++++ .../textures/models/launchpad/erector_abm.png | Bin 1268 -> 1968 bytes .../textures/models/launchpad/erector_v2.png | Bin 1634 -> 2876 bytes .../hbm/textures/models/launchpad/pad.png | Bin 1993 -> 7615 bytes .../hbm/textures/models/launchpad/silo.png | Bin 0 -> 3394 bytes 16 files changed, 309 insertions(+), 49 deletions(-) create mode 100644 src/main/resources/assets/hbm/models/weapons/launch_pad_silo.obj create mode 100644 src/main/resources/assets/hbm/textures/models/launchpad/silo.png diff --git a/changelog b/changelog index 77a41cc8c..80e8902be 100644 --- a/changelog +++ b/changelog @@ -68,6 +68,7 @@ * Balefire spread is now limited to prevent densely vegetated biomes from lagging to hell * The bricked furnace now makes charcoal twice as fast * Combination ovens no longer need two welded copper plates and instead only cast plates, therefore no longer being post-arc welder. This should make it more affordable and useful in the initial earlygame where things like automatic wood farms are most important. +* Any water-like extinguishing fluid shot from the chemical thrower can now wash away fallout layers ## Fixed * Fixed dupe caused by shift-clicking ashes out of the bricked furnace diff --git a/src/main/java/com/hbm/blocks/ModBlocks.java b/src/main/java/com/hbm/blocks/ModBlocks.java index 38a9fd385..21b10b095 100644 --- a/src/main/java/com/hbm/blocks/ModBlocks.java +++ b/src/main/java/com/hbm/blocks/ModBlocks.java @@ -2160,7 +2160,7 @@ public class ModBlocks { tesla = new MachineTesla(Material.iron).setBlockName("tesla").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.blockTab).setBlockTextureName(RefStrings.MODID + ":tesla"); launch_pad = new LaunchPad(Material.iron).setBlockName("launch_pad").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":launch_pad"); - launch_pad_large = new LaunchPadLarge(Material.iron).setBlockName("launch_pad_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":concrete_smooth"); + launch_pad_large = new LaunchPadLarge(Material.iron).setBlockName("launch_pad_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); machine_radar = new MachineRadar(Material.iron).setBlockName("machine_radar").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":machine_radar"); machine_radar_large = new MachineRadarLarge(Material.iron).setBlockName("machine_radar_large").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); radar_screen = new MachineRadarScreen(Material.iron).setBlockName("radar_screen").setHardness(5.0F).setResistance(10.0F).setCreativeTab(MainRegistry.missileTab).setBlockTextureName(RefStrings.MODID + ":block_steel"); diff --git a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java index 3f9b01111..93cd9a875 100644 --- a/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java +++ b/src/main/java/com/hbm/entity/missile/EntityMissileTier1.java @@ -25,6 +25,11 @@ public abstract class EntityMissileTier1 extends EntityMissileBaseNT { return list; } + @Override + protected float getContrailScale() { + return 0.5F; + } + public static class EntityMissileGeneric extends EntityMissileTier1 { public EntityMissileGeneric(World world) { super(world); } public EntityMissileGeneric(World world, float x, float y, float z, int a, int b) { super(world, x, y, z, a, b); } diff --git a/src/main/java/com/hbm/entity/projectile/EntityChemical.java b/src/main/java/com/hbm/entity/projectile/EntityChemical.java index 240d8f9d5..9a6a87c22 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityChemical.java +++ b/src/main/java/com/hbm/entity/projectile/EntityChemical.java @@ -453,6 +453,18 @@ public class EntityChemical extends EntityThrowableNT { if(core instanceof IRepairable) { ((IRepairable) core).tryExtinguish(worldObj, x, y, z, fext); } + + if(fext == EnumExtinguishType.WATER && style == ChemicalStyle.LIQUID) { + for(int i = -2; i <= 2; i++) { + for(int j = 0; j <= 1; j++) { + for(int k = -2; k <= 2; k++) { + if(worldObj.getBlock(x + i, y + j, z + k) == ModBlocks.fallout) { + worldObj.setBlock(x + i, y + j, z + k, Blocks.air); + } + } + } + } + } } Block block = worldObj.getBlock(x, y, z); diff --git a/src/main/java/com/hbm/main/ResourceManager.java b/src/main/java/com/hbm/main/ResourceManager.java index 0d1a9613d..d6d9c7086 100644 --- a/src/main/java/com/hbm/main/ResourceManager.java +++ b/src/main/java/com/hbm/main/ResourceManager.java @@ -1087,7 +1087,7 @@ public class ResourceManager { public static final IModelCustom soyuz_launcher_support = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/launch_table/soyuz_launcher_support.obj"), false).asDisplayList(); //Missile Parts - public static final IModelCustom missile_pad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missilePad.obj")); + public static final IModelCustom missile_pad = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_silo.obj")); public static final IModelCustom missile_erector = new HFRWavefrontObject(new ResourceLocation(RefStrings.MODID, "models/weapons/launch_pad_erector.obj")).asDisplayList(); public static final IModelCustom missile_assembly = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/missile_assembly.obj")); public static final IModelCustom strut = AdvancedModelLoader.loadModel(new ResourceLocation(RefStrings.MODID, "models/strut.obj")); @@ -1288,7 +1288,7 @@ public class ResourceManager { public static final ResourceLocation soyuz_launcher_support_tex = new ResourceLocation(RefStrings.MODID, "textures/models/soyuz_launcher/launcher_support.png"); //Missile Parts - public static final ResourceLocation missile_pad_tex = new ResourceLocation(RefStrings.MODID, "textures/models/missilePad.png"); + public static final ResourceLocation missile_pad_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/silo.png"); public static final ResourceLocation missile_erector_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/pad.png"); public static final ResourceLocation missile_erector_micro_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/erector_micro.png"); public static final ResourceLocation missile_erector_v2_tex = new ResourceLocation(RefStrings.MODID, "textures/models/launchpad/erector_v2.png"); diff --git a/src/main/java/com/hbm/tileentity/TileMappings.java b/src/main/java/com/hbm/tileentity/TileMappings.java index defb5b790..1f99e3dd9 100644 --- a/src/main/java/com/hbm/tileentity/TileMappings.java +++ b/src/main/java/com/hbm/tileentity/TileMappings.java @@ -340,6 +340,7 @@ public class TileMappings { put(TileEntitySpacer.class, "tileentity_fraction_spacer"); put(TileEntityMachineCatalyticCracker.class, "tileentity_catalytic_cracker"); put(TileEntityMachineCatalyticReformer.class, "tileentity_catalytic_reformer"); + put(TileEntityMachineHydrotreater.class, "tileentity_hydrotreater"); put(TileEntityMachineCoker.class, "tileentity_coker"); put(TileEntityChimneyBrick.class, "tileentity_chimney_brick"); put(TileEntityChimneyIndustrial.class, "tileentity_chimney_industrial"); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java index b2e746207..efe1d593e 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadBase.java @@ -144,6 +144,13 @@ public abstract class TileEntityLaunchPadBase extends TileEntityMachineBase impl this.power = Library.chargeTEFromItems(slots, 2, power, maxPower); tanks[0].loadTank(3, 4, slots); tanks[1].loadTank(5, 6, slots); + + if(this.isMissileValid()) { + if(slots[0].getItem() instanceof ItemMissile) { + ItemMissile missile = (ItemMissile) slots[0].getItem(); + setFuel(missile); + } + } this.networkPackNT(250); } diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index 2b6622bfe..cf826d0d4 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -1,6 +1,5 @@ package com.hbm.tileentity.bomb; -import com.hbm.inventory.fluid.Fluids; import com.hbm.items.weapon.ItemMissile; import com.hbm.items.weapon.ItemMissile.MissileFormFactor; import com.hbm.main.MainRegistry; @@ -60,7 +59,6 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements if(slots[0].getItem() instanceof ItemMissile) { ItemMissile missile = (ItemMissile) slots[0].getItem(); this.formFactor = missile.formFactor.ordinal(); - setFuel(missile); if(missile.formFactor == MissileFormFactor.ATLAS || missile.formFactor == MissileFormFactor.HUGE) { erectorSpeed /= 2F; @@ -185,36 +183,15 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements } } - if(this.erected && this.hasFuel() && this.tanks[1].getTankType() == Fluids.OXYGEN) { - - //maybe too much? - /*if(this.formFactor == MissileFormFactor.ATLAS.ordinal() && worldObj.getTotalWorldTime() % 4 == 0) { - ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - 10); - ForgeDirection rot = dir.getRotation(ForgeDirection.DOWN); - - NBTTagCompound data = new NBTTagCompound(); - data.setString("type", "tower"); - data.setFloat("lift", -5F); - data.setFloat("base", 0.25F); - data.setFloat("max", 0.5F); - data.setInteger("life", 30 + worldObj.rand.nextInt(10)); - data.setDouble("posX", xCoord + 0.5 - (dir.offsetX + rot.offsetX) * 0.5); - data.setDouble("posZ", zCoord + 0.5 - (dir.offsetZ + rot.offsetZ) * 0.5); - data.setDouble("posY", yCoord + 14.625); - data.setBoolean("noWind", true); - data.setFloat("alphaMod", 0.01F); - data.setFloat("strafe", 0.05F); - for(int i = 0; i < 3; i++) MainRegistry.proxy.effectNT(data); - }*/ - + if(this.erected && (this.formFactor == MissileFormFactor.HUGE.ordinal() || this.formFactor == MissileFormFactor.ATLAS.ordinal()) && this.tanks[1].getFill() > 0) { NBTTagCompound data = new NBTTagCompound(); data.setString("type", "tower"); data.setFloat("lift", 0F); data.setFloat("base", 0.5F); data.setFloat("max", 2F); - data.setInteger("life", 60 + worldObj.rand.nextInt(30)); - data.setDouble("posX", xCoord + 0.5); - data.setDouble("posZ", zCoord + 0.5); + data.setInteger("life", 70 + worldObj.rand.nextInt(30)); + data.setDouble("posX", xCoord + 0.5 + worldObj.rand.nextGaussian() * 0.5); + data.setDouble("posZ", zCoord + 0.5 + worldObj.rand.nextGaussian() * 0.5); data.setDouble("posY", yCoord + 2); data.setBoolean("noWind", true); data.setFloat("alphaMod", 2F); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index ca43e4679..ca5bae17c 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -346,7 +346,7 @@ container.heaterOven=Heizofen container.hydrotreater=Hydrotreater container.iGenerator=Industrieller Generator container.keyForge=Schlossertisch -container.launchPad=Raketenabschussrampe +container.launchPad=Startrampe container.launchTable=Große Startrampe container.leadBox=Sicherheitsbehälter container.machineArcWelder=Lichtbogenschweißer @@ -4072,7 +4072,8 @@ tile.lamp_tritium_green_off.name=Grüne Tritiumlampe tile.lamp_tritium_green_on.name=Grüne Tritiumlampe tile.lantern.name=Laterne tile.lantern_behemoth.name=Alte Laterne -tile.launch_pad.name=Raketenabschussrampe +tile.launch_pad.name=Silo-Startrampe +tile.launch_pad_large.name=Startrampe tile.launch_table.name=Große Startrampe tile.leaves_layer.name=Totes Laub tile.lox_barrel.name=LOX-Fass diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index b65517cbe..b830664c3 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -705,7 +705,7 @@ container.heaterOven=Heating Oven container.hydrotreater=Hydrotreater container.iGenerator=Industrial Generator container.keyForge=Locksmith Table -container.launchPad=Missile Launch Pad +container.launchPad=Launch Pad container.launchTable=Large Launch Pad container.leadBox=Containment Box container.machineArcWelder=Arc Welder @@ -5077,7 +5077,8 @@ tile.lantern_behemoth.name=Old Lantern tile.spotlight_incandescent.name=Cage Lamp tile.spotlight_fluoro.name=Fluorescent Light tile.spotlight_halogen.name=Halogen Floodlight -tile.launch_pad.name=Missile Launch Pad +tile.launch_pad.name=Silo Launch Pad +tile.launch_pad_large.name=Launch Pad tile.launch_table.name=Large Launch Pad tile.leaves_layer.name=Fallen Leaves tile.lox_barrel.name=LOX Barrel diff --git a/src/main/resources/assets/hbm/models/weapons/launch_pad_erector.obj b/src/main/resources/assets/hbm/models/weapons/launch_pad_erector.obj index 40c90c71d..6e1c08cdd 100644 --- a/src/main/resources/assets/hbm/models/weapons/launch_pad_erector.obj +++ b/src/main/resources/assets/hbm/models/weapons/launch_pad_erector.obj @@ -14124,30 +14124,30 @@ vt 0.975000 0.539474 vt 0.925000 0.750000 vt 1.000000 0.539474 vt 0.975000 0.750000 -vt 0.925000 0.776316 -vt 0.900000 0.776316 -vt 0.900000 0.763158 -vt 0.975000 0.776316 vt 1.000000 0.763158 vt 1.000000 0.776316 -vt 0.925000 0.750000 +vt 0.975000 0.776316 vt 0.900000 0.763158 -vt 0.900000 0.750000 +vt 0.925000 0.776316 +vt 0.900000 0.776316 +vt 1.000000 0.763158 vt 0.975000 0.750000 vt 1.000000 0.750000 -vt 1.000000 0.763158 -vt 0.975000 0.539474 -vt 1.000000 0.526316 -vt 1.000000 0.539474 +vt 0.900000 0.763158 +vt 0.900000 0.750000 +vt 0.925000 0.750000 +vt 0.900000 0.526316 vt 0.925000 0.539474 vt 0.900000 0.539474 -vt 0.900000 0.526316 -vt 0.975000 0.986842 -vt 1.000000 0.986842 -vt 1.000000 1.000000 -vt 0.925000 0.986842 +vt 1.000000 0.526316 +vt 1.000000 0.539474 +vt 0.975000 0.539474 vt 0.900000 1.000000 vt 0.900000 0.986842 +vt 0.925000 0.986842 +vt 1.000000 1.000000 +vt 0.975000 0.986842 +vt 1.000000 0.986842 vt 1.000000 0.776316 vt 0.975000 0.986842 vt 0.975000 0.776316 diff --git a/src/main/resources/assets/hbm/models/weapons/launch_pad_silo.obj b/src/main/resources/assets/hbm/models/weapons/launch_pad_silo.obj new file mode 100644 index 000000000..02249dc56 --- /dev/null +++ b/src/main/resources/assets/hbm/models/weapons/launch_pad_silo.obj @@ -0,0 +1,255 @@ +# Blender v2.79 (sub 0) OBJ File: 'launch_pad_silo.blend' +# www.blender.org +o Plane +v -1.500000 1.000000 1.500000 +v 1.500000 1.000000 1.500000 +v -1.500000 1.000000 -1.500000 +v 1.500000 1.000000 -1.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 1.500000 0.000000 -0.500000 +v 0.500000 0.000000 -1.500000 +v 1.500000 0.000000 -1.500000 +v 0.500000 0.000000 1.500000 +v 1.500000 0.000000 1.500000 +v 0.500000 0.000000 0.500000 +v 1.500000 0.000000 0.500000 +v -1.500000 0.000000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -1.500000 0.000000 -1.500000 +v -0.500000 0.000000 -1.500000 +v -1.500000 0.000000 1.500000 +v -0.500000 0.000000 1.500000 +v -1.500000 0.000000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.500000 0.500000 -1.500000 +v 0.500000 0.500000 -0.500000 +v 1.500000 0.500000 -0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 0.500000 1.500000 +v 1.500000 0.500000 0.500000 +v -1.500000 0.500000 -0.500000 +v -0.500000 0.500000 -0.500000 +v -0.500000 0.500000 -1.500000 +v -0.500000 0.500000 1.500000 +v -0.500000 0.500000 0.500000 +v -1.500000 0.500000 0.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v -0.500000 1.000000 -0.500000 +v 0.500000 1.000000 -0.500000 +vt 0.250000 0.750000 +vt 0.750000 1.000000 +vt -0.000000 1.000000 +vt 0.250000 0.500000 +vt -0.000000 0.250000 +vt 0.500000 0.750000 +vt 0.750000 0.250000 +vt 0.500000 0.500000 +vt 0.250000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.250000 +vt 0.250000 0.125000 +vt 0.500000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.125000 +vt 0.500000 0.250000 +vt 0.250000 0.250000 +vt 0.250000 0.250000 +vt 0.500000 0.125000 +vt 0.500000 0.250000 +vt 1.000000 -0.000000 +vt 0.750000 0.250000 +vt 0.750000 -0.000000 +vt 1.000000 -0.000000 +vt 0.750000 0.250000 +vt 0.750000 -0.000000 +vt 1.000000 -0.000000 +vt 0.750000 0.250000 +vt 0.750000 -0.000000 +vt 1.000000 -0.000000 +vt 0.750000 0.250000 +vt 0.750000 -0.000000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 0.750000 0.250000 +vt 1.000000 0.500000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 0.750000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.500000 +vt 0.750000 0.250000 +vt 1.000000 0.250000 +vt 0.750000 0.250000 +vt 1.000000 0.500000 +vt 0.750000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt -0.000000 -0.000000 +vt 0.250000 0.125000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 1.000000 0.625000 +vt 0.750000 0.500000 +vt 1.000000 0.500000 +vt 0.750000 0.000000 +vt 0.500000 0.125000 +vt 0.500000 0.000000 +vt 0.250000 0.125000 +vt 0.750000 0.250000 +vt 0.000000 0.250000 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.500000 0.125000 +vt 0.500000 0.000000 +vt 0.000000 0.250000 +vt 0.750000 0.250000 +vt 0.250000 0.125000 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.750000 0.000000 +vt 0.500000 0.125000 +vt 0.500000 0.000000 +vt 0.000000 0.250000 +vt 0.750000 0.250000 +vt 0.250000 0.125000 +vt 0.000000 0.000000 +vt 0.250000 0.000000 +vt 0.500000 0.125000 +vt 0.750000 -0.000000 +vt 0.250000 0.750000 +vt 0.500000 0.500000 +vt 0.500000 0.750000 +vt 0.500000 0.500000 +vt 0.250000 0.750000 +vt 0.500000 0.750000 +vt 0.250000 0.125000 +vt 0.500000 0.125000 +vt 0.500000 0.125000 +vt 0.250000 0.125000 +vt 1.000000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.250000 +vt 1.000000 0.250000 +vt 0.750000 0.625000 +vt 0.750000 0.625000 +vt 1.000000 0.250000 +vt 0.750000 0.500000 +vt 0.750000 0.500000 +vt 1.000000 0.250000 +vt 0.750000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.625000 +vt 0.250000 -0.000000 +vt 0.750000 0.625000 +vt 0.750000 0.625000 +vt 0.500000 -0.000000 +vt 0.250000 0.500000 +vt 0.250000 0.500000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +vn 0.0000 -1.0000 0.0000 +s off +f 5/1/1 3/2/1 1/3/1 +f 6/4/1 1/3/1 2/5/1 +f 7/6/1 4/7/1 3/2/1 +f 8/8/1 2/5/1 4/7/1 +f 8/9/2 28/10/2 6/11/2 +f 32/12/3 8/13/3 7/14/3 +f 35/15/4 7/16/4 5/17/4 +f 6/18/5 35/19/5 5/20/5 +f 11/21/6 10/22/6 9/23/6 +f 15/24/6 14/25/6 13/26/6 +f 19/27/6 18/28/6 17/29/6 +f 23/30/6 22/31/6 21/32/6 +f 29/33/2 15/34/2 13/35/2 +f 33/36/4 18/37/4 20/38/4 +f 27/39/6 28/40/6 26/41/6 +f 26/42/6 33/43/6 25/44/6 +f 32/45/6 36/46/6 31/47/6 +f 29/48/6 35/49/6 28/50/6 +f 35/51/4 22/52/4 24/53/4 +f 28/54/5 16/55/5 15/56/5 +f 26/57/2 11/58/2 9/59/2 +f 36/60/5 24/61/5 23/62/5 +f 14/63/4 30/64/4 2/5/4 +f 27/65/3 9/66/3 10/67/3 +f 30/64/4 4/7/4 2/5/4 +f 32/68/3 17/69/3 18/70/3 +f 14/71/3 29/72/3 13/73/3 +f 34/74/3 2/75/3 1/76/3 +f 34/74/3 21/77/3 22/78/3 +f 21/32/2 36/79/2 23/80/2 +f 3/81/2 36/79/2 1/82/2 +f 31/83/2 19/84/2 17/85/2 +f 19/86/5 33/87/5 20/88/5 +f 4/89/5 33/87/5 3/90/5 +f 25/91/5 12/92/5 11/93/5 +f 27/94/4 12/95/4 4/7/4 +f 37/96/1 40/97/1 39/98/1 +f 44/99/6 41/100/6 43/101/6 +f 5/1/1 7/6/1 3/2/1 +f 6/4/1 5/1/1 1/3/1 +f 7/6/1 8/8/1 4/7/1 +f 8/8/1 6/4/1 2/5/1 +f 8/9/2 26/102/2 28/10/2 +f 32/12/3 26/103/3 8/13/3 +f 35/15/4 32/104/4 7/16/4 +f 6/18/5 28/105/5 35/19/5 +f 11/21/6 12/106/6 10/22/6 +f 15/24/6 16/107/6 14/25/6 +f 19/27/6 20/108/6 18/28/6 +f 23/30/6 24/109/6 22/31/6 +f 29/33/2 28/110/2 15/34/2 +f 33/36/4 32/111/4 18/37/4 +f 27/39/6 30/112/6 28/40/6 +f 26/42/6 32/113/6 33/43/6 +f 32/45/6 35/114/6 36/46/6 +f 29/48/6 34/115/6 35/49/6 +f 35/51/4 34/116/4 22/52/4 +f 28/54/5 30/117/5 16/55/5 +f 26/57/2 25/118/2 11/58/2 +f 36/60/5 35/119/5 24/61/5 +f 14/63/4 16/120/4 30/64/4 +f 27/65/3 26/121/3 9/66/3 +f 30/64/4 27/94/4 4/7/4 +f 32/68/3 31/122/3 17/69/3 +f 14/71/3 2/75/3 29/72/3 +f 34/74/3 29/72/3 2/75/3 +f 34/74/3 1/76/3 21/77/3 +f 21/32/2 1/82/2 36/79/2 +f 3/81/2 31/83/2 36/79/2 +f 31/83/2 3/81/2 19/84/2 +f 19/86/5 3/90/5 33/87/5 +f 4/89/5 25/91/5 33/87/5 +f 25/91/5 4/89/5 12/92/5 +f 27/94/4 10/123/4 12/95/4 +f 37/96/1 38/124/1 40/97/1 +f 44/99/6 42/125/6 41/100/6 diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_abm.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_abm.png index c597f87c9697846241d8c5e76e94f0e0439dffe8..4da76e4669055e51e674e1b5414d3396d87a7978 100644 GIT binary patch literal 1968 zcmb_ddo z8<~huE-@1dV-81W64AIvW0Y^c{`l7V*80}>*V*gY@4KG;zW=<>-s{;J?ifc2F(oko z03^^(cAkQKPOzzaLU6 z5a!`pyoKfVaYq^nDtvaa?_LDq>z_9XOZm!9=gd{M37oR`!9y)m)6+sg<){t@gHb}) z!Fa4g4H4!FJ>soG)aTFlGS~GIiLtr5KnVtNoMc(Q+0& zyGOh#s526t$}yMjJx)Hc2(89cNW#*(AJ$DW)Sp-=p)vX{!!t3Yg4mtmOHE@h!{CHQ z>d_ohTd3b8mln?NNZie8OU%Dqom=xcGV@eT>f&NZadGj-*zylo(`##w)JiqBwu%CU zuG&7!jm~ldw?bvik<(|cAC|?_J?{gz0?8N|;seN)&`|rP@7voxEYsA1Rqt{w)oR18 zfs>h3x5-OEQ?eb-!fFyHZ2k6;=6EAP)-a)*e8>dNC07YwJqx07WxOuR5r3X|h>8j| zbmY^%P!=5=yg92eRq-~0?#Hia+}x3OuJpd}n>Y9NUNcmYjM&c^I76+9I#_JXki;=Z zO_RJ1>aldpMi;i;w5iE1YjH63p;GBvqTchHiW%i)ojd}^?nf6b%0D6^LLFsKTFjXg zg-A+K6otPh*RG*fYF)SIu1xfDj*6s!fSK{t#FhB6zlvB&?8aWIDsUjWJX+Og9WPL5 zyzXrGdRsF|achn}*qV*7zOiw>tO?S?4eU1&w?ZJghlaB6f?uZ-jL?Ggv|Bsl?RUc|M|OjK0ZHXG-7A}PJJd=N_qU=q0<5Ma2mIuEAbP6<=RV{?+T&{z$2Kjgn zhtoySTUU~SjfmE$JkYX^e4!}sV0{hkf&MkHS7pcyH!b&KsB>v)X~zVLOb9SEE-VE} z9k47!e!49C8&yty&{CSu-@<)7iYuBQ7B}8mpJV>u@hqm>Z=RmF7)}w)1XlY$aP8h~ zFKyJHe)oL~`~Y~n_*FyMz`(#i9D%;5Z#@;Ze=6*{KjZ{ELunJ#WeEIl7$hJZ>A=Fk)E)l z6i)Ho7x!)DAqXfv7Qc3z=Jo?zleI{H5&RP2BJHAfHGw?pO`U~ytS=SEGH+BUvwJoF|~>_Qg`}$yuK7{!J7De-igG0dZ1RodXlq zLjPuLS~8cn_!+y2J0fXBweBW%DA3q1QXQ@G^C5NLBD1uby8}ejuuLQZp*y7=>}#nSMiF54#0-Eg^x>dk3luO}Y8$ zzJ?4Q-j7kp%k`v7Jt_L)mCD=LfL~Y(I-NBKib6RiW5?e+!_Dw4;cC?GZCaA|U($n* zbSKY1x~>=ETG$co$Ai=Sk2n>k!kq2ds7MXm@Fx7%d-{U=!(y=&lbm>w@pMHLnfTJ= zyvSRfz^mDXpsZpLCH$0f|_qsJuj3bbwu9KL4FP2c4)6PSW7#eH2k8G7*YY|`u{ ze+A&b5L}v`-Frb?1PpZ6adv0;s9pV4+!f}5?r0!pqP^ugr6wwl1iHS%GmQx2=r8`q zmi&PnF4mU;Q2@Smlr#CvOjeZiGI-NL^9v|O5=cvH%yxAACOP9sy<^W8xKI`M*;0Hh zdGzx+K2R0yX9Vu_A^1IWa8;m4%U0HRbS!VhT17thD<+Zj1APV<3`q)wa`nayi?db@ z)yTjndj&#O&f{E81!os7ym;`Y$)(fee3#e7?1=y)^!ronXq_Jr*vtnftD??k!50jm M?J;%~n{&zk0(TUY#sB~S literal 1268 zcmeAS@N?(olHy`uVBq!ia0vp^2|&DogAGW2Se7jgq*#ibJVQ8upoSx*1IS(N>Eakt zG3V{vy3>YcFS%uy=E=jFl0ORy#WH z*_B2ICe3Ecqt_Y_+&j4BgVoK8St%!#-@lGHfBDAajdefd&dy&l(Wv{wy*>R;XU^Qa zK_~lEdzs9N@`M)(4m?apz{Hb{Jv%Lpjiv9`gw?m#bxdpE)?R$~%rcu7Ze>ZXx%Ks> zPs00u+<33O>(s}z-p9RXa@MC_X6tZlkYIrjoqfz@t%ZU2y`^@4dp*PbpSAv1TOF?k ziAv6b>`(tSl_gVmKb<@CuVnQ0nc@A$8jMK-3T%u?PjVaPEIzgM{n5X1ua`khI+^_Z zz5bdl!rC==MK|u&vX!0cYzYJk_^JUKA489k5xCf0y7}*3kYxuilG`NiT8| z&tQgl1MHV8-<$S)*PpXG{*dM7o}G-fh1*$vJnNKP`=5C&2WttZj!@OZ=?%V2T`eio zn1Yx(TU7X}I2DAkX6h4v&k82%-Efon^63VnT8xmSxX8%D1QW zQMsCZQKojphcBm8Bsw}ziu>*5KCD*%_qa|j@8;BMgPA@V+-3^@qfSD*XJE| zpPqVe=Y1xEng>-{xP4_l>eo_YVv?+ck+`y#y=SHDUzoBea${ot~H<;yn&zt`DwaMhL% z$Fx>0&@#i1G|~A>)QX{>-oQa^8Zh2wJ#5+$IJYmy6x{)ri$Zd$`*170aI}H zYK7;s;&gV-yO?prH;Oj^n&T09AHiBoVQM#kVIqr<9E{}%d*5@@7MhNbuzU= gUPu*EV4UIKc_90}Xl0xNuoz?TboFyt=akR{09W80DF6Tf diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_v2.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_v2.png index d57c5b24327702d40fcfb56d797a97d289c3eff8..d494ed9f24bfac383bdcabd6417a94d319678b04 100644 GIT binary patch delta 2854 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 diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/pad.png b/src/main/resources/assets/hbm/textures/models/launchpad/pad.png index 37a1af1c4a5bfedde724386d023024b1b9a62525..6f908dc2c562270a5ca948a21a83a376824ccce4 100644 GIT binary patch literal 7615 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 Z-H+{GWcXm!z!zE24egs+r5d(j{{!$cHbejb literal 1993 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 N4z^ADw{{ez1g(Ls~ literal 0 HcmV?d00001 From 675838eec769c2e74f99c141491c4f2496a2f1d2 Mon Sep 17 00:00:00 2001 From: Boblet Date: Thu, 15 Feb 2024 16:10:53 +0100 Subject: [PATCH 3/6] more energy control compat stuff --- .../java/api/hbm/tile/IInfoProviderEC.java | 85 +-------- .../tileentity/machine/TileEntityChungus.java | 18 +- .../machine/TileEntityDiFurnace.java | 11 +- .../machine/TileEntityDiFurnaceRTG.java | 11 +- .../machine/TileEntityMachineAmgen.java | 29 +++- .../machine/TileEntityMachineArcFurnace.java | 10 +- .../machine/TileEntityMachineCentrifuge.java | 10 +- .../machine/TileEntityMachineDiesel.java | 13 +- .../machine/TileEntityMachineEPress.java | 9 +- .../machine/TileEntityMachineGasCent.java | 10 +- .../TileEntityMachineLargeTurbine.java | 21 ++- .../machine/TileEntityMachineMiniRTG.java | 30 ++-- .../machine/TileEntityMachineRTG.java | 10 +- .../machine/TileEntityMachineSPP.java | 10 +- .../machine/TileEntityMachineTurbine.java | 76 +++----- .../machine/TileEntityMachineWoodBurner.java | 20 ++- .../storage/TileEntityMachineBattery.java | 11 +- .../com/hbm/util/CompatEnergyControl.java | 163 ++++++++++++++++++ 18 files changed, 370 insertions(+), 177 deletions(-) create mode 100644 src/main/java/com/hbm/util/CompatEnergyControl.java diff --git a/src/main/java/api/hbm/tile/IInfoProviderEC.java b/src/main/java/api/hbm/tile/IInfoProviderEC.java index e6a0f7835..ea4995bbd 100644 --- a/src/main/java/api/hbm/tile/IInfoProviderEC.java +++ b/src/main/java/api/hbm/tile/IInfoProviderEC.java @@ -1,9 +1,6 @@ package api.hbm.tile; -import com.hbm.inventory.fluid.tank.FluidTank; - import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.util.StatCollector; /** * Info providers for ENERGY CONTROL @@ -18,84 +15,6 @@ import net.minecraft.util.StatCollector; * */ public interface IInfoProviderEC { - /** The meat of the interface and the only method that should be called from externally, returns - * an NBTTagCompound with all relevant data in EC's accepted format, the implementor takes care of - * collecting and adding the data. */ - public NBTTagCompound provideInfo(); - - - - - /* - * INTERNAL USE ONLY - HELPER METHODS BELOW - */ - - /** Instantiates the NBTTagCompound and adds common identifiers needed for NTM machines (e.g. HE as the energy type) */ - public default NBTTagCompound setup() { - NBTTagCompound data = new NBTTagCompound(); - data.setString(KEY_EUTYPE, "HE"); - return data; - } - - /** Adds the tank to the NBTTagCompound using the supplied String as the key. */ - public default void addTank(String name, NBTTagCompound tag, FluidTank tank) { - if(tank.getFill() == 0) { - tag.setString(name, "N/A"); - } else { - tag.setString(name, String.format("%s: %s mB", StatCollector.translateToLocal(tank.getTankType().getConditionalName()), tank.getFill())); - } - } - - /* - * [DATA TYPE] _ [NAME] _ [UNIT] - */ - - public static final String KEY_EUTYPE = "euType"; - - public static final String L_ENERGY_HE = "energy"; - public static final String L_ENERGY_TU = "energyTU"; - public static final String L_ENERGY_ = "energy_"; // Blast Furnace fuel - - public static final String L_CAPACITY_HE = "capacity"; - public static final String L_CAPACITY_TU = "capacityTU"; - public static final String L_CAPACITY_ = "capacity_"; // Blast Furnace fuel capacity - - public static final String D_CONSUMPTION_HE = "consumptionHE"; - public static final String D_CONSUMPTION_MB = "consumption"; - @Deprecated public static final String S_CONSUMPTION_ = "consumption_"; // FWatz fluid consumption rates - - public static final String D_OUTPUT_HE = "output"; - public static final String D_OUTPUT_MB = "outputmb"; - public static final String D_OUTPUT_TU = "outputTU"; - - public static final String L_DIFF_HE = "diff"; // Battery diff per tick - @Deprecated public static final String I_TEMP_K = "temp"; // Unused? - public static final String D_TURBINE_PERCENT = "turbine"; // CCGT slider - public static final String I_TURBINE_SPEED = "speed"; // CCGT RPM - public static final String L_COREHEAT_C = "core"; // Research Reactor core heat - public static final String L_HULLHEAT_C = "hull"; // Research Reactor hull heat - public static final String S_LEVEL_PERCENT = "level"; // Research Reactor rods - @Deprecated public static final String L_HEATL = "heatL"; // AMS and old Watz heat values - public static final String D_HEAT_C = "heat"; // Research Reactor and RBMK column heat - public static final String L_PRESSURE_BAR = "bar"; // ZIRNOX pressure - public static final String I_FUEL = "fuel"; // RTG Blast Furnace heat - @Deprecated public static final String S_FUELTEXT = "fuelText"; // Large Nuclear Reactor only - @Deprecated public static final String S_DEPLETED = "depleted"; // Large Nuclear Reactor only - public static final String D_DEPLETION_PERCENT = "depletion"; // RBMK Fuel depletion - public static final String D_XENON_PERCENT = "xenon"; // RBMK Fuel xenon poisoning - public static final String D_SKIN_C = "skin"; // RBMK Fuel skin heat - public static final String D_CORE_C = "c_heat"; // RBMK Fuel core heat - public static final String D_MELT_C = "melt"; // RBMK Fuel melting point - public static final String I_PROGRESS = "progress"; - public static final String I_FLUX = "flux"; // Research and Breeding Reactor flux - public static final String I_WATER = "water"; // Research Reactor water gauge - public static final String L_DURABILITY = "durability"; // DFC Stabilizer Lens - public static final String S_TANK = "tank"; - public static final String S_TANK2 = "tank2"; - public static final String S_TANK3 = "tank3"; - public static final String S_TANK4 = "tank4"; - public static final String S_TANK5 = "tank5"; - @Deprecated public static final String I_PISTONS = "pistons"; // Radial Performance Engine piston count - public static final String S_CHUNKRAD = "chunkRad"; // Geiger Counter - public static final String B_ACTIVE = "active"; + /** Adds any custom data that isn't covered by the standard energy and fluid implementations. */ + public void provideExtraInfo(NBTTagCompound data); } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java index e32a41fb8..3ef6a42d2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityChungus.java @@ -20,11 +20,13 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.BlockPos; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -39,7 +41,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent { +public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IEnergyGenerator, INBTPacketReceiver, IFluidStandardTransceiver, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 100000000000L; @@ -51,6 +53,7 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public List list2 = new ArrayList(); public FluidTank[] tanks; + protected double[] info = new double[3]; private AudioWrapper audio; private float audioDesync; @@ -69,6 +72,8 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc if(!worldObj.isRemote) { + this.info = new double[3]; + boolean operational = false; FluidType in = tanks[0].getTankType(); boolean valid = false; @@ -83,6 +88,9 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); this.power += (ops * trait.heatEnergy * eff); + info[0] = ops * trait.amountReq; + info[1] = ops * trait.amountProduced; + info[2] = ops * trait.heatEnergy * eff; valid = true; operational = ops > 0; } @@ -373,4 +381,12 @@ public class TileEntityChungus extends TileEntityLoadedBase implements IFluidAcc public FluidTank[] getAllTanks() { return tanks; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, info[1] > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, info[0]); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, info[1]); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, info[2]); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java index 4e5cf6c3b..c1d3bb893 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnace.java @@ -12,8 +12,10 @@ import com.hbm.items.ModItems; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityMachinePolluting; +import com.hbm.util.CompatEnergyControl; import api.hbm.fluid.IFluidStandardSender; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -27,7 +29,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityDiFurnace extends TileEntityMachinePolluting implements IFluidStandardSender, IGUIProvider { +public class TileEntityDiFurnace extends TileEntityMachinePolluting implements IFluidStandardSender, IGUIProvider, IInfoProviderEC { public int progress; public int fuel; @@ -270,4 +272,11 @@ public class TileEntityDiFurnace extends TileEntityMachinePolluting implements I public FluidTank[] getSendingTanks() { return this.getSmokeTanks(); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setLong(CompatEnergyControl.L_ENERGY_, this.fuel); + data.setLong(CompatEnergyControl.L_CAPACITY_, this.maxFuel); + data.setInteger(CompatEnergyControl.I_PROGRESS, this.progress); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java index 224beb56d..db4d16a27 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityDiFurnaceRTG.java @@ -7,8 +7,10 @@ import com.hbm.inventory.recipes.BlastFurnaceRecipes; import com.hbm.items.machine.ItemRTGPellet; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.RTGUtil; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -18,8 +20,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; -public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGUIProvider -{ +public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGUIProvider, IInfoProviderEC { + public short progress; private short processSpeed = 0; // Edit as needed @@ -219,4 +221,9 @@ public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGU return new GUIMachineDiFurnaceRTG(player.inventory, this); } + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setLong(CompatEnergyControl.L_FUEL, this.getPower()); + data.setInteger(CompatEnergyControl.I_PROGRESS, this.progress); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java index a88a7db69..ec2e10421 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAmgen.java @@ -3,27 +3,33 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.handler.radiation.ChunkRadiationManager; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IEnergyGenerator; +import api.hbm.tile.IInfoProviderEC; import net.minecraft.block.Block; import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEnergyGenerator { +public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { public long power; public long maxPower = 500; + protected long output = 0; @Override public void updateEntity() { if(!worldObj.isRemote) { + + this.output = 0; Block block = worldObj.getBlock(xCoord, yCoord, zCoord); if(block == ModBlocks.machine_amgen) { float rad = ChunkRadiationManager.proxy.getRadiation(worldObj, xCoord, yCoord, zCoord); - power += rad; + this.output += rad; ChunkRadiationManager.proxy.decrementRad(worldObj, xCoord, yCoord, zCoord, 5F); } else if(block == ModBlocks.machine_geo) { @@ -31,6 +37,7 @@ public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEne this.checkGeoInteraction(xCoord, yCoord - 1, zCoord); } + this.power += this.output; if(power > maxPower) power = maxPower; @@ -44,21 +51,21 @@ public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEne Block b = worldObj.getBlock(x, y, z); if(b == ModBlocks.geysir_water) { - power += 75; + this.output += 75; } else if(b == ModBlocks.geysir_chlorine) { - power += 100; + this.output += 100; } else if(b == ModBlocks.geysir_vapor) { - power += 50; + this.output += 50; } else if(b == ModBlocks.geysir_nether) { - power += 500; + this.output += 500; } else if(b == Blocks.lava) { - power += 100; + this.output += 100; if(worldObj.rand.nextInt(6000) == 0) { worldObj.setBlock(xCoord, yCoord - 1, zCoord, Blocks.obsidian); } } else if(b == Blocks.flowing_lava) { - power += 25; + this.output += 25; if(worldObj.rand.nextInt(3000) == 0) { worldObj.setBlock(xCoord, yCoord - 1, zCoord, Blocks.cobblestone); @@ -80,4 +87,10 @@ public class TileEntityMachineAmgen extends TileEntityLoadedBase implements IEne public long getMaxPower() { return this.maxPower; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.output > 0); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java index 195b5f43e..085eb355e 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineArcFurnace.java @@ -11,8 +11,10 @@ import com.hbm.packet.AuxGaugePacket; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IEnergyUser; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -26,7 +28,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; -public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider { +public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements ISidedInventory, IEnergyUser, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; @@ -400,4 +402,10 @@ public class TileEntityMachineArcFurnace extends TileEntityLoadedBase implements public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineArcFurnace(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.hasPower() && this.canProcess()); + data.setInteger(CompatEnergyControl.I_PROGRESS, this.dualCookTime); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java index 73e60b196..247214a14 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCentrifuge.java @@ -15,9 +15,11 @@ import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.BobMathUtil; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import api.hbm.energy.IEnergyUser; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -30,7 +32,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineCentrifuge extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public int progress; public long power; @@ -345,4 +347,10 @@ public class TileEntityMachineCentrifuge extends TileEntityMachineBase implement if(type == UpgradeType.OVERDRIVE) return 3; return 0; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); + data.setInteger(CompatEnergyControl.B_ACTIVE, this.progress); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java index be79c3f6e..6adb43898 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineDiesel.java @@ -24,10 +24,12 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachinePolluting; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -38,7 +40,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IConfigurableMachine, IGUIProvider { +public class TileEntityMachineDiesel extends TileEntityMachinePolluting implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardTransceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC { public long power; public int soundCycle = 0; @@ -326,4 +328,13 @@ public class TileEntityMachineDiesel extends TileEntityMachinePolluting implemen public FluidTank[] getSendingTanks() { return this.getSmokeTanks(); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + long he = getHEFromFuel(tank.getTankType()); + boolean active = tank.getFill() > 0 && he > 0; + data.setBoolean(CompatEnergyControl.B_ACTIVE, active); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, active ? 1D : 0D); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, he); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java index d75431102..b7bd4ec24 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineEPress.java @@ -13,9 +13,11 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import api.hbm.energy.IEnergyUser; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -28,7 +30,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineEPress extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineEPress extends TileEntityMachineBase implements IEnergyUser, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power = 0; public final static long maxPower = 50000; @@ -281,4 +283,9 @@ public class TileEntityMachineEPress extends TileEntityMachineBase implements IE if(type == UpgradeType.SPEED) return 3; return 0; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setInteger(CompatEnergyControl.I_PROGRESS, this.press); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java index dbfc389bd..bc51868ab 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineGasCent.java @@ -15,11 +15,13 @@ import com.hbm.packet.LoopedSoundPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.InventoryUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -34,7 +36,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; //epic! -public class TileEntityMachineGasCent extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider { +public class TileEntityMachineGasCent extends TileEntityMachineBase implements IEnergyUser, IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { public long power; public int progress; @@ -452,4 +454,10 @@ public class TileEntityMachineGasCent extends TileEntityMachineBase implements I public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineGasCent(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); + data.setInteger(CompatEnergyControl.I_PROGRESS, this.progress); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java index 885408284..3041a8a9b 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineLargeTurbine.java @@ -21,10 +21,12 @@ import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -42,13 +44,14 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineLargeTurbine extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent { +public class TileEntityMachineLargeTurbine extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 100000000; public int age = 0; public List list2 = new ArrayList(); public FluidTank[] tanks; + protected double[] info = new double[3]; private boolean shouldTurn; public float rotor; @@ -79,9 +82,10 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme if(!worldObj.isRemote) { + this.info = new double[3]; + age++; - if(age >= 2) - { + if(age >= 2) { age = 0; } @@ -112,6 +116,9 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); this.power += (ops * trait.heatEnergy * eff); + info[0] = ops * trait.amountReq; + info[1] = ops * trait.amountProduced; + info[2] = ops * trait.heatEnergy * eff; valid = true; operational = ops > 0; } @@ -377,4 +384,12 @@ public class TileEntityMachineLargeTurbine extends TileEntityMachineBase impleme public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineLargeTurbine(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, info[1] > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, info[0]); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, info[1]); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, info[2]); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java index e9d41a607..cf6c1372d 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiniRTG.java @@ -2,11 +2,14 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IEnergyGenerator; +import api.hbm.tile.IInfoProviderEC; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator { +public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { public long power; boolean tact = false; @@ -16,10 +19,7 @@ public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IE if(!worldObj.isRemote) { - if(this.getBlockType() == ModBlocks.machine_powerrtg) - power += 2500; - else - power += 700; + power += this.getOutput(); if(power > getMaxPower()) power = getMaxPower(); @@ -28,15 +28,16 @@ public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IE this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); } } - + + public long getOutput() { + if(this.getBlockType() == ModBlocks.machine_powerrtg) return 2_500; + return 700; + } @Override public long getMaxPower() { - - if(this.getBlockType() == ModBlocks.machine_powerrtg) - return 50000; - - return 1400; + if(this.getBlockType() == ModBlocks.machine_powerrtg) return 50_000; + return 1_400; } @Override @@ -48,4 +49,11 @@ public class TileEntityMachineMiniRTG extends TileEntityLoadedBase implements IE public void setPower(long i) { power = i; } + + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, true); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.getOutput()); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java index 4e386f468..255966614 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRTG.java @@ -8,9 +8,11 @@ import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.RTGUtil; import api.hbm.energy.IEnergyGenerator; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -24,7 +26,7 @@ import net.minecraft.nbt.NBTTagList; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISidedInventory, IEnergyGenerator, IGUIProvider { +public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISidedInventory, IEnergyGenerator, IGUIProvider, IInfoProviderEC { private ItemStack slots[]; @@ -249,4 +251,10 @@ public class TileEntityMachineRTG extends TileEntityLoadedBase implements ISided public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineRTG(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.heat > 0); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, heat * 5D); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java index ad3adb63d..9e1a58aa7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineSPP.java @@ -3,11 +3,14 @@ package com.hbm.tileentity.machine; import com.hbm.blocks.ModBlocks; import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IEnergyGenerator; +import api.hbm.tile.IInfoProviderEC; import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; -public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnergyGenerator { +public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnergyGenerator, IInfoProviderEC { public long power; public static final long maxPower = 100000; @@ -86,4 +89,9 @@ public class TileEntityMachineSPP extends TileEntityLoadedBase implements IEnerg return this.maxPower; } + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.gen > 0); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.gen); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java index 1845c5e72..543f471eb 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbine.java @@ -1,12 +1,7 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; -import java.util.List; - import com.hbm.handler.CompatHandler; -import com.hbm.interfaces.IFluidAcceptor; import com.hbm.interfaces.IFluidContainer; -import com.hbm.interfaces.IFluidSource; import com.hbm.inventory.container.ContainerMachineTurbine; import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; @@ -19,10 +14,12 @@ import com.hbm.packet.AuxElectricityPacket; import com.hbm.packet.PacketDispatcher; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IBatteryItem; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; @@ -42,14 +39,13 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineTurbine extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IFluidAcceptor, IFluidSource, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent { +public class TileEntityMachineTurbine extends TileEntityLoadedBase implements ISidedInventory, IFluidContainer, IEnergyGenerator, IFluidStandardTransceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { private ItemStack slots[]; public long power; public static final long maxPower = 1000000; public int age = 0; - public List list2 = new ArrayList(); public FluidTank[] tanks; private static final int[] slots_top = new int[] {4}; @@ -57,6 +53,7 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS private static final int[] slots_side = new int[] {4}; private String customName; + protected double[] info = new double[3]; public TileEntityMachineTurbine() { slots = new ItemStack[7]; @@ -230,16 +227,16 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS @Override public void updateEntity() { - if(!worldObj.isRemote) - { + if(!worldObj.isRemote) { + + this.info = new double[3]; + age++; - if(age >= 2) - { + if(age >= 2) { age = 0; } this.subscribeToAllAround(tanks[0].getTankType(), this); - fillFluidInit(tanks[1].getTankType()); for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) this.sendPower(worldObj, xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, dir); @@ -262,6 +259,9 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[0].setFill(tanks[0].getFill() - ops * trait.amountReq); tanks[1].setFill(tanks[1].getFill() + ops * trait.amountProduced); this.power += (ops * trait.heatEnergy * eff); + info[0] = ops * trait.amountReq; + info[1] = ops * trait.amountProduced; + info[2] = ops * trait.heatEnergy * eff; valid = true; } } @@ -279,32 +279,6 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS } } - @Override - public void fillFluidInit(FluidType type) { - - fillFluid(this.xCoord + 1, this.yCoord, this.zCoord, getTact(), type); - fillFluid(this.xCoord - 1, this.yCoord, this.zCoord, getTact(), type); - fillFluid(this.xCoord, this.yCoord + 1, this.zCoord, getTact(), type); - fillFluid(this.xCoord, this.yCoord - 1, this.zCoord, getTact(), type); - fillFluid(this.xCoord, this.yCoord, this.zCoord + 1, getTact(), type); - fillFluid(this.xCoord, this.yCoord, this.zCoord - 1, getTact(), type); - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - public boolean getTact() { - if(age == 0) - { - return true; - } - - return false; - } - @Override public void setFluidFill(int i, FluidType type) { if(type.name().equals(tanks[0].getTankType().name())) @@ -323,14 +297,6 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS return 0; } - @Override - public int getMaxFluidFill(FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) - return tanks[0].getMaxFill(); - - return 0; - } - @Override public void setFillForSync(int fill, int index) { if(index < 2 && tanks[index] != null) @@ -343,16 +309,6 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS tanks[index].setTankType(type); } - @Override - public List getFluidList(FluidType type) { - return list2; - } - - @Override - public void clearFluidList(FluidType type) { - list2.clear(); - } - @Override public long getPower() { return power; @@ -423,4 +379,12 @@ public class TileEntityMachineTurbine extends TileEntityLoadedBase implements IS public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineTurbine(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, info[1] > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, info[0]); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, info[1]); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, info[2]); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java index e2d9fc11f..7d08f55dc 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineWoodBurner.java @@ -16,10 +16,12 @@ import com.hbm.lib.Library; import com.hbm.module.ModuleBurnTime; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -31,7 +33,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineWoodBurner extends TileEntityMachineBase implements IFluidStandardReceiver, IControlReceiver, IEnergyGenerator, IGUIProvider { +public class TileEntityMachineWoodBurner extends TileEntityMachineBase implements IFluidStandardReceiver, IControlReceiver, IEnergyGenerator, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 100_000; @@ -39,6 +41,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement public int maxBurnTime; public boolean liquidBurn = false; public boolean isOn = false; + protected int powerGen = 0; public FluidTank tank; @@ -63,6 +66,8 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement if(!worldObj.isRemote) { + powerGen = 0; + this.tank.setType(2, slots); this.tank.loadTank(3, 4, slots); this.power = Library.chargeItemsFromTE(slots, 5, power, maxPower); @@ -96,8 +101,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement } else if(this.power < this.maxPower && isOn){ this.burnTime--; - this.power += 100; - if(power > maxPower) this.power = this.maxPower; + this.powerGen += 100; if(worldObj.getTotalWorldTime() % 20 == 0) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND); } @@ -111,7 +115,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement int toBurn = Math.min(tank.getFill(), 2); if(toBurn > 0) { - this.power += trait.getHeatEnergy() * toBurn / 2_000L; + this.powerGen += trait.getHeatEnergy() * toBurn / 2_000L; this.tank.setFill(this.tank.getFill() - toBurn); if(worldObj.getTotalWorldTime() % 20 == 0) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND * toBurn / 2F); } @@ -119,6 +123,7 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement } } + this.power += this.powerGen; if(this.power > this.maxPower) this.power = this.maxPower; NBTTagCompound data = new NBTTagCompound(); @@ -301,4 +306,11 @@ public class TileEntityMachineWoodBurner extends TileEntityMachineBase implement public double getMaxRenderDistanceSquared() { return 65536.0D; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, isOn); + if(this.liquidBurn) data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, 1D); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, power); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java index f20d2f7fb..21b8f7825 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityMachineBattery.java @@ -1,6 +1,8 @@ package com.hbm.tileentity.machine.storage; import api.hbm.energy.*; +import api.hbm.tile.IInfoProviderEC; + import com.hbm.blocks.machine.MachineBattery; import com.hbm.config.GeneralConfig; import com.hbm.inventory.container.ContainerMachineBattery; @@ -9,6 +11,8 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IPersistentNBT; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; + import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -32,7 +36,7 @@ import java.util.List; import java.util.Set; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "opencomputers")}) -public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent, IGUIProvider { +public class TileEntityMachineBattery extends TileEntityMachineBase implements IEnergyUser, IPersistentNBT, SimpleComponent, IGUIProvider, IInfoProviderEC { public long[] log = new long[20]; public long delta = 0; @@ -464,4 +468,9 @@ public class TileEntityMachineBattery extends TileEntityMachineBase implements I public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineBattery(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setLong(CompatEnergyControl.L_DIFF_HE, (log[0] - log[19]) / 20L); + } } diff --git a/src/main/java/com/hbm/util/CompatEnergyControl.java b/src/main/java/com/hbm/util/CompatEnergyControl.java new file mode 100644 index 000000000..e6c4ff387 --- /dev/null +++ b/src/main/java/com/hbm/util/CompatEnergyControl.java @@ -0,0 +1,163 @@ +package com.hbm.util; + +import java.util.ArrayList; +import java.util.List; + +import com.hbm.inventory.fluid.FluidType; +import com.hbm.inventory.fluid.Fluids; +import com.hbm.inventory.fluid.tank.FluidTank; +import com.hbm.tileentity.machine.TileEntityMachineGasCent; +import com.hbm.tileentity.machine.TileEntityMachineGasCent.PseudoFluidTank; +import com.hbm.tileentity.machine.rbmk.TileEntityRBMKBase; + +import api.hbm.energy.IBatteryItem; +import api.hbm.energy.IEnergyUser; +import api.hbm.fluid.IFluidUser; +import api.hbm.tile.IInfoProviderEC; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +/** Provides data specified by EC's CrossModBase */ +public class CompatEnergyControl { + + /** Returns true for stacks with electric items like batteries or powertools (i.e. implements IBatteryItem) */ + public static boolean isElectricItem(ItemStack stack) { + return stack.getItem() instanceof IBatteryItem; + } + + /** Standardized discharge for IBatteryItem, returns the amount that was removed */ + public static double dischargeItem(ItemStack stack, double needed) { + IBatteryItem battery = (IBatteryItem) stack.getItem(); + long toDischarge = Math.min(battery.getDischargeRate(), Math.min(battery.getCharge(stack), (long) needed)); + battery.dischargeBattery(stack, toDischarge); + return toDischarge; + } + + /** Returns the power and maxPower values for IEnergyUser */ + public static void getEnergyData(TileEntity tile, NBTTagCompound data) { + + data.setString(KEY_EUTYPE, "HE"); + + if(tile instanceof IEnergyUser) { + IEnergyUser user = (IEnergyUser) tile; + data.setDouble(L_ENERGY_HE, user.getPower()); + data.setDouble(L_CAPACITY_HE, user.getMaxPower()); + } + } + + /** Returns the heat for RBMKs */ + public static int getHeat(TileEntity tile) { + if(tile instanceof TileEntityRBMKBase) return (int) ((TileEntityRBMKBase) tile).heat; + //original implementation also used the SNR and LNR for some reason, but those no longer exist. neither ZINOX nor research reactor were part of the system. + return -1; + } + + /** Returns a list of Object arrays, one array for each fluid tank where the array contains fluid name, fill state and capacity (STRING, INTEGER, INTEGER) */ + public static List getAllTanks(TileEntity tile) { + + List list = new ArrayList(); + + if(tile instanceof IFluidUser) { + IFluidUser user = (IFluidUser) tile; + + for(FluidTank tank : user.getAllTanks()) { + if(tank.getTankType() == Fluids.SMOKE || tank.getTankType() == Fluids.SMOKE_LEADED || tank.getTankType() == Fluids.SMOKE_POISON) continue; + list.add(toFluidInfo(tank)); + } + } + + if(tile instanceof TileEntityMachineGasCent) { + TileEntityMachineGasCent cent = (TileEntityMachineGasCent) tile; + list.add(toFluidInfo(cent.inputTank)); + list.add(toFluidInfo(cent.outputTank)); + } + + if(!list.isEmpty()) return list; + + return null; + } + + private static Object[] toFluidInfo(FluidTank tank) { + return new Object[] {tank.getTankType().getName(), tank.getFill(), tank.getMaxFill()}; + } + + private static Object[] toFluidInfo(PseudoFluidTank tank) { + return new Object[] {tank.getTankType().getName(), tank.getFill(), tank.getMaxFill()}; + } + + /** Returns any non-standard data like progress, unique stats and so forth. Data comes from the IInfoProviderEC implementation */ + public static void getExtraData(TileEntity tile, NBTTagCompound data) { + + if(tile instanceof IInfoProviderEC) { + IInfoProviderEC provider = (IInfoProviderEC) tile; + provider.provideExtraInfo(data); + } + } + + /** Returns the core tile entity for that position, can resolve the MK1 "IMultiblock" and MK2 "BlockDummyable" systems. */ + public static TileEntity findTileEntity(World world, int x, int y, int z) { + return CompatExternal.getCoreFromPos(world, x, y, z); //CompatExternal you're just standing around, do something for once + } + + /** Returns the ResourceLocation for the given fluid name */ + public static ResourceLocation getFluidTexture(String name) { + FluidType type = Fluids.fromName(name); + return type == null ? null : type.getTexture(); + } + + /* + * [DATA TYPE] _ [NAME] _ [UNIT] + */ + + public static final String KEY_EUTYPE = "euType"; + + public static final String L_ENERGY_HE = "energy"; + public static final String L_ENERGY_TU = "energyTU"; + public static final String L_ENERGY_ = "energy_"; // Blast Furnace fuel + + public static final String L_CAPACITY_HE = "capacity"; + public static final String L_CAPACITY_TU = "capacityTU"; + public static final String L_CAPACITY_ = "capacity_"; // Blast Furnace fuel capacity + + public static final String D_CONSUMPTION_HE = "consumptionHE"; + public static final String D_CONSUMPTION_MB = "consumption"; + @Deprecated public static final String S_CONSUMPTION_ = "consumption_"; // FWatz fluid consumption rates + + public static final String D_OUTPUT_HE = "output"; + public static final String D_OUTPUT_MB = "outputmb"; + public static final String D_OUTPUT_TU = "outputTU"; + + public static final String L_DIFF_HE = "diff"; // Battery diff per tick + @Deprecated public static final String I_TEMP_K = "temp"; // Unused? + public static final String D_TURBINE_PERCENT = "turbine"; // CCGT slider + public static final String I_TURBINE_SPEED = "speed"; // CCGT RPM + public static final String L_COREHEAT_C = "core"; // Research Reactor core heat + public static final String L_HULLHEAT_C = "hull"; // Research Reactor hull heat + public static final String S_LEVEL_PERCENT = "level"; // Research Reactor rods + @Deprecated public static final String L_HEATL = "heatL"; // AMS and old Watz heat values + public static final String D_HEAT_C = "heat"; // Research Reactor and RBMK column heat + public static final String L_PRESSURE_BAR = "bar"; // ZIRNOX pressure + public static final String L_FUEL = "fuel"; // RTG Blast Furnace heat + @Deprecated public static final String S_FUELTEXT = "fuelText"; // Large Nuclear Reactor only + @Deprecated public static final String S_DEPLETED = "depleted"; // Large Nuclear Reactor only + public static final String D_DEPLETION_PERCENT = "depletion"; // RBMK Fuel depletion + public static final String D_XENON_PERCENT = "xenon"; // RBMK Fuel xenon poisoning + public static final String D_SKIN_C = "skin"; // RBMK Fuel skin heat + public static final String D_CORE_C = "c_heat"; // RBMK Fuel core heat + public static final String D_MELT_C = "melt"; // RBMK Fuel melting point + public static final String I_PROGRESS = "progress"; + public static final String I_FLUX = "flux"; // Research and Breeding Reactor flux + public static final String I_WATER = "water"; // Research Reactor water gauge + public static final String L_DURABILITY = "durability"; // DFC Stabilizer Lens + public static final String S_TANK = "tank"; + public static final String S_TANK2 = "tank2"; + public static final String S_TANK3 = "tank3"; + public static final String S_TANK4 = "tank4"; + public static final String S_TANK5 = "tank5"; + @Deprecated public static final String I_PISTONS = "pistons"; // Radial Performance Engine piston count + public static final String S_CHUNKRAD = "chunkRad"; // Geiger Counter + public static final String B_ACTIVE = "active"; +} From c77d10cde448a5876bdb8ea983065d6f959cc7fc Mon Sep 17 00:00:00 2001 From: Bob Date: Thu, 15 Feb 2024 21:44:59 +0100 Subject: [PATCH 4/6] bedrock ores, more launch pad textures --- .../java/api/hbm/energy/IEnergyConnector.java | 6 ++-- src/main/java/com/hbm/config/WorldConfig.java | 4 +++ .../inventory/recipes/CentrifugeRecipes.java | 7 ++++ .../com/hbm/items/special/ItemBedrockOre.java | 3 +- .../com/hbm/world/feature/BedrockOre.java | 33 ++++++++++-------- src/main/resources/assets/hbm/lang/de_DE.lang | 1 + src/main/resources/assets/hbm/lang/en_US.lang | 1 + .../textures/models/launchpad/erector_abm.png | Bin 1968 -> 1969 bytes .../models/launchpad/erector_micro.png | Bin 1163 -> 2566 bytes .../models/launchpad/erector_strong.png | Bin 2544 -> 6695 bytes .../textures/models/launchpad/erector_v2.png | Bin 2876 -> 2984 bytes 11 files changed, 36 insertions(+), 19 deletions(-) diff --git a/src/main/java/api/hbm/energy/IEnergyConnector.java b/src/main/java/api/hbm/energy/IEnergyConnector.java index fc6905758..311a09ff8 100644 --- a/src/main/java/api/hbm/energy/IEnergyConnector.java +++ b/src/main/java/api/hbm/energy/IEnergyConnector.java @@ -2,8 +2,8 @@ package api.hbm.energy; import com.hbm.packet.AuxParticlePacketNT; import com.hbm.packet.PacketDispatcher; +import com.hbm.util.CompatEnergyControl; -import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -112,8 +112,8 @@ public interface IEnergyConnector extends ILoadedTile { /** Shortcut for adding energy data to tiles that implement IInfoProviderEC, should NOT be used externally for compat! Use IInfoProviderEC.provideInfo() instead! */ public default void provideInfoForEC(NBTTagCompound data) { - data.setLong(IInfoProviderEC.L_ENERGY_HE, this.getPower()); - data.setLong(IInfoProviderEC.L_CAPACITY_HE, this.getMaxPower()); + data.setLong(CompatEnergyControl.L_ENERGY_HE, this.getPower()); + data.setLong(CompatEnergyControl.L_CAPACITY_HE, this.getMaxPower()); } public default ConnectionPriority getPriority() { diff --git a/src/main/java/com/hbm/config/WorldConfig.java b/src/main/java/com/hbm/config/WorldConfig.java index 227010114..0b1fa3a55 100644 --- a/src/main/java/com/hbm/config/WorldConfig.java +++ b/src/main/java/com/hbm/config/WorldConfig.java @@ -39,6 +39,7 @@ public class WorldConfig { public static int bedrockChlorocalciteSpawn = 35; public static int bedrockAsbestosSpawn = 50; public static int bedrockNiobiumSpawn = 50; + public static int bedrockNeodymiumSpawn = 50; public static int bedrockTitaniumSpawn = 100; public static int bedrockTungstenSpawn = 100; public static int bedrockGoldSpawn = 50; @@ -48,6 +49,7 @@ public class WorldConfig { public static int bedrockNiterSpawn = 50; public static int bedrockFluoriteSpawn = 50; public static int bedrockRedstoneSpawn = 50; + public static int bedrockRareEarthSpawn = 50; public static int bedrockGlowstoneSpawn = 100; public static int bedrockPhosphorusSpawn = 50; public static int bedrockQuartzSpawn = 100; @@ -166,6 +168,8 @@ public class WorldConfig { bedrockFluoriteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B12_bedrockFluoriteWeight", "Spawn weight for fluorite bedrock ore", 50); bedrockRedstoneSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B13_bedrockRedstoneWeight", "Spawn weight for redstone bedrock ore", 50); bedrockChlorocalciteSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B14_bedrockChlorocalciteWeight", "Spawn weight for chlorocalcite bedrock ore", 35); + bedrockNeodymiumSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B15_bedrockNeodymiumWeight", "Spawn weight for neodymium bedrock ore", 50); + bedrockRareEarthSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.B16_bedrockRareEarthWeight", "Spawn weight for rare earth bedrock ore", 50); bedrockGlowstoneSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN00_bedrockGlowstoneWeight", "Spawn weight for glowstone bedrock ore", 100); bedrockPhosphorusSpawn = CommonConfig.createConfigInt(config, CATEGORY_OREGEN, "2.BN01_bedrockPhosphorusWeight", "Spawn weight for phosphorus bedrock ore", 50); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 5b933fdd3..3085c7e76 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -21,6 +21,7 @@ import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.RecipesCommon.OreDictStack; import com.hbm.inventory.recipes.loader.SerializableRecipe; import com.hbm.items.ItemEnums.EnumAshType; +import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPWRFuel.EnumPWRFuel; import com.hbm.items.machine.ItemWatzPellet.EnumWatzType; @@ -265,6 +266,12 @@ public class CentrifugeRecipes extends SerializableRecipe { new ItemStack(ModItems.nugget_pu_mix, 2), new ItemStack(ModItems.nugget_bismuth, 6), new ItemStack(ModItems.nuclear_waste_tiny, 1) }); + + recipes.put(new ComparableStack(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE)), new ItemStack[] { + new ItemStack(ModItems.powder_cobalt_tiny, 2), + new ItemStack(ModItems.powder_boron_tiny, 2), + new ItemStack(ModItems.powder_niobium_tiny, 2), + new ItemStack(ModItems.nugget_zirconium, 3) }); ArrayList naquadriaNuggets = OreDictionary.getOres("nuggetNaquadria"); if(naquadriaNuggets.size() != 0) { diff --git a/src/main/java/com/hbm/items/special/ItemBedrockOre.java b/src/main/java/com/hbm/items/special/ItemBedrockOre.java index ca2ad4853..2dc6404f0 100644 --- a/src/main/java/com/hbm/items/special/ItemBedrockOre.java +++ b/src/main/java/com/hbm/items/special/ItemBedrockOre.java @@ -98,7 +98,8 @@ public class ItemBedrockOre extends ItemEnumMulti { CHLOROCALCITE("Chlorocalcite", 0xCDE036, B_LITHIUM, B_SILICON, B_SILICON), //i guess? FLUORITE("Fluorite", 0xF6F3E7, B_SILICON, B_LITHIUM, B_ALUMINIUM), //different silicon-bearing gemstones, generic lithium, aluminium from sodium compound trailings HEMATITE("Hematite", 0xA37B72, B_SULFUR, B_TITANIUM, B_TITANIUM), //titanium, sulfur from pyrite - MALACHITE("Malachite", 0x66B48C, B_SULFUR, B_SULFUR, B_SULFUR); //sulfur sulfur sulfur sulfur + MALACHITE("Malachite", 0x66B48C, B_SULFUR, B_SULFUR, B_SULFUR), //sulfur sulfur sulfur sulfur + NEODYMIUM("Neodymium", 0x8F8F5F, B_LITHIUM, B_SILICON, B_BISMUTH); //yeah whatever public String oreName; public int color; diff --git a/src/main/java/com/hbm/world/feature/BedrockOre.java b/src/main/java/com/hbm/world/feature/BedrockOre.java index 98bbd0c48..1b7318610 100644 --- a/src/main/java/com/hbm/world/feature/BedrockOre.java +++ b/src/main/java/com/hbm/world/feature/BedrockOre.java @@ -10,6 +10,7 @@ import com.hbm.config.WorldConfig; import com.hbm.inventory.FluidStack; import com.hbm.inventory.OreDictManager.DictFrame; import com.hbm.inventory.fluid.Fluids; +import com.hbm.items.ItemEnums.EnumChunkType; import com.hbm.items.ModItems; import com.hbm.items.special.ItemBedrockOre.EnumBedrockOre; import com.hbm.util.WeightedRandomGeneric; @@ -28,21 +29,23 @@ public class BedrockOre { public static HashMap replacements = new HashMap(); public static void init() { - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.IRON, 1), WorldConfig.bedrockIronSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.COPPER, 1), WorldConfig.bedrockCopperSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.BORAX, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockBoraxSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.CHLOROCALCITE, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockChlorocalciteSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.ASBESTOS, 2), WorldConfig.bedrockAsbestosSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NIOBIUM, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiobiumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TITANIUM, 2, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockTitaniumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TUNGSTEN, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockTungstenSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.FLUORITE, 1), WorldConfig.bedrockFluoriteSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 8), 1, 0x202020), WorldConfig.bedrockCoalSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); - registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.IRON, 1), WorldConfig.bedrockIronSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.COPPER, 1), WorldConfig.bedrockCopperSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.BORAX, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockBoraxSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.CHLOROCALCITE, 3, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockChlorocalciteSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.ASBESTOS, 2), WorldConfig.bedrockAsbestosSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NIOBIUM, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiobiumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.NEODYMIUM, 3, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNeodymiumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TITANIUM, 2, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockTitaniumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.TUNGSTEN, 2, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockTungstenSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.GOLD, 1), WorldConfig.bedrockGoldSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.URANIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockUraniumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.THORIUM, 4, new FluidStack(Fluids.SULFURIC_ACID, 500)), WorldConfig.bedrockThoriumSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(EnumBedrockOre.FLUORITE, 1), WorldConfig.bedrockFluoriteSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.coal, 8), 1, 0x202020), WorldConfig.bedrockCoalSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(ModItems.niter, 4), 2, 0x808080, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockNiterSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(new ItemStack(Items.redstone, 4), 1, 0xd01010), WorldConfig.bedrockRedstoneSpawn); + registerBedrockOre(weightedOres, new BedrockOreDefinition(DictFrame.fromOne(ModItems.chunk_ore, EnumChunkType.RARE), 2, 0x8F9999, new FluidStack(Fluids.ACID, 500)), WorldConfig.bedrockRedstoneSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(Items.glowstone_dust, 4), 1, 0xF9FF4D), WorldConfig.bedrockGlowstoneSpawn); registerBedrockOre(weightedOresNether, new BedrockOreDefinition(new ItemStack(ModItems.powder_fire, 4), 1, 0xD7341F), WorldConfig.bedrockPhosphorusSpawn); diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index ca5bae17c..fd89e6138 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -2587,6 +2587,7 @@ item.ore.gold=Gold item.ore.hematite=Hematit item.ore.iron=Eisen item.ore.malachite=Malachit +item.ore.neodymium=Neodym item.ore.niobium=Niob item.ore.titanium=Titan item.ore.tungsten=Wolfram diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index b830664c3..0a827d824 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -3351,6 +3351,7 @@ item.ore.gold=Gold item.ore.hematite=Hematite item.ore.iron=Iron item.ore.malachite=Malachite +item.ore.neodymium=Neodymium item.ore.niobium=Niobium item.ore.titanium=Titanium item.ore.tungsten=Tungsten diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_abm.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_abm.png index 4da76e4669055e51e674e1b5414d3396d87a7978..25763b61e65aaa973c4154451226ff558ed5b346 100644 GIT binary patch delta 1697 zcmaKsX;{(;9>@QP%2)*J(J0=fWSd7O>S|GvVjd||+VNx;Rd-?le$mC$gs}iZ%zgK$ky2TJjk40)Lp?zw)>Mc5dRBk zS6?<{Zj?{9xgFDb>5d~pC(8V3E9-&sZ8B32lXd0BGrvqEGC$`SdE@O3 zl*|t$!_j@U6Yt-v0S8!G%=C04A1+b_3$lI{?_$snZBVNb3io8T>eJe$`&T-j9nL3U z`jON7JC4=&oB-yP7EnN{J+VMxfWo7{2HzGtq6J~+G6k|}EO!=JaNf2<#9 zy?T_1symWVEQk#mm)DXun`zq*1hkyLS7mX!Ba$z0Zp&muV>7eapUYbD^t7}+)o@-@ z6AUm&?+jk#`RTn)F^tu5aeE({a7dTV56A~nBH1{d>_?E8m>4W84uk*=vlt*3lQK!v zlO%VfT1Lg2T6xyMkRQK`l$f}?GtS-sN@7ic3_%RmCdgRx{N<#iBs-Rg8iM9kroHj? z1TdwLxL!9K{p25;#vbgfF#${|WfT*KRr*f05pG!9svxHrp_r8pHKZLod2Owf`x??N zkL-4W9zTBkOjUcwwhp-|Iaonqzf48sFg2Q}?Hb*})2YvSPAK<~Na94o)@7{9A zt%-;(zxMmNq5iqiG5~d%^#E+kDgh(@vzoLA)!H9|Ye>%{UG0eZhcL6U8ciUq`G!9k zpIcro%#A?Fz)U7{*RfZA=lWVT7XTT7AKoCI|Z?&Ua0;h@ng450)aqPd=8;KnZ?3= zGwh-C|HmGw;)aM%4OC3Rqtr0m5k`zaAV}$!TjuAhCp3nT8z&k}{9>)5M&o524-PHuHZ>)769(Pv3ZBRRxDvd=OPaArRst89A(Q;)_>h|x# zu-cHHeib!0H01LFlWlZ_5dl z=nsh{7sAgZzfL_ST}9L4<5A1o>623#IuUu4#y$9>W0+y4hnCKr9ba-RD5vE00x2>T zo6W9}(y;!~zyb+r9cpR4f%cP}Fh2q$@b7SVz5)7?z=CsP>qkV%1Z2pQl11HIw-t#* zOUmW&neZRQ=s>L68LKg^@PGhc1t@`4RApaK97^!}{nPzrbO~(EJ440~_L()bFT(7d zqe-0Y<;RkP$evOTMhRP$QxcyleB}1eX&PFnI&5W>(LLNp+woA1UkBctz~nI)jB|+s z@s!~a@LaY-{i$ByXa)3zHj18!GB05g+sV2|!U-5)3B)0#c?$(pF z7WJqXjTyPtbAhB>nK@k*Qn#*ab#ecNcd0!qeca!W-TccdSrKPR8u*~5?#RkD8lq&g zt%w^ctdd(+qic+9p#!s&MQWBMNqZtk;lgO}1i1VV(cE{j+_$Um3H!3J23BNGK zs41q~GeVzDDdx30j94$mdqB28Dk0Bi(twfk59m;2L0>T`HnV^ z>yRay#b{?~lAD}Nwxh9c*uF)OGNv?)89 c6Wge_4bnzTd-wF*cn$1~k0%cM!X2OdFOUy1Jpcdz delta 1692 zcmaKsX;hMl8pq#PX7rAlj>|ZrC~kN&4b7{CprPf43!_fUs8~@_6Q$&ul$Mshy?FP{xvcy5ciz_) zw6%Q)umY^Z76pF#PcIuq>03^Go}JWs3wr(;^NGiCMs}9B-^E$ z0Rq$GOVFp(ir-2kMpA)@ZvvPm-c2-dT%jv(8?QgwyYi@+4PT#;4z}gtJT9yruV_;1 zlT!wqHQjKy-l3tq>#!#h<2=6Fvw&dP#&9+yTu4QZe2C|#(hn$-T*t6!6skvpm&@O`@%A-K<-V&KgCmjK zCRbeX7-CYP?p}7F;_>6h`_d1+ZCi3Z20?hoC*=Xw8U+6oWC+_AIMR{QHvPJ?a(}bE zjo1~SAfB4d3cyPLY`^rLAjazJ{^GUkoCR{+T)*&yo%Ua@oiw8>f|;xLGU}Lc`km(G z9TA_7eCw#!aHr}pvuXm{74Qp_4s&5vz~IW&gHD|3dth)6VI0bM7FMnPd;@zH=u)Pm zXTn0+oUTVn1{HLfOxDA&TQSl_z4(rcD7Ny5?|>V4d&Cfe3Exvhh@m~SDgBP2u7!n# zO=l!NEz-e>RSs&Ky0Y-^PwV}SuWvr+s-sY>)86i)mCTN4I&H4Z41e9&aG7dPJ`Bye zjAZCqX~N9@4*|Vv?d1aW)XP8DVa34n`Og-{_V)JVSRCOb+G8^M$I0mPWVN5ASB=)d z9tYrm<8&!>!2RHEhXyz9nEuN%bJ>jsO?JQ7Lh6Bmq{Khp&&^S5Mcf_Ny)JS%9DkQt zu~;0!5UAVTD`?v3Q&_hBDW$IEZC0be_jfFLG}coR%oGMm3lYJI1p_3TtKcsy5bQ=W9_ogoAv;=;IadYQ|9n@}|zmC7zxirpbC?9%< zg-vxri$zi6W&9OdbhN?8LbIH{vU;HmK=teHnBiK-1gG2Ok8day<5j91l%5;%@?T;| z`L_g(DaF^=WCm7f7WKP$&2@NjU2$~_+EmRfH0y1WMgf8W)w)E4U%rFVFLNYT&ApMT zW~5;}4re=Q4N*g2K}EKqOBSIcGvw?w@G4j{>P#v-SRmXE3u={USPuj8y%p$2W}mc` z7L%675M4vsA~TZT-?Gr9V+V+a%z_Z1c1_9016MXySFtCSPaV#k0TbMP(n;g5{IGlI zl5gtVw{lu8h5n{9c*l0)h+5Bi7Ohnp*ZvbVle`o1WnDq}c}d;lEodWa*za$ml|Lkr zNR<<^RMqh;xI3q?+xfWaa~sOJJQkQ+3W5nF%j%LWI1Z-r!26z|_b?sc>4a;MEDbEb zgx;+58I61o3dP~g1-(V~M?>Vo=5kD%ZbKuHbc2@m4ow)_#w@bRDX;~&%YkVBs$mG2 zL@uO!o;w)z*VFGVz5A7H2>ch+@~k}32~AZP&{Z$nnpU`Pp_gc9hfRAEfuz^%tq*zJ zgcLS-esg1YT(k^5|DPHm1Nm}NxLC~)_|kcISTUR}Nzhq@t$AC11e3IY%uGR^kIxsa zX`eLyH7|v-HfrS$7ETBxA=zLP$vHh@%7a z60nkh8!09VJav9j!T^g%w5_AN7;wdl1tkj!iMKdHe{;Y6Vm{9>O5RbS3-6{54Qh-* z{u@#-5*__}QYKN1l}ClDY>2o!IGB5y(3cL$j-iAGK_wMu8z4m4ODFPzvK5m(q?zrO%3dksO4yj0|sa zQ5L1**or~KrXE}oH|USw;U7au^vI$tV-phmno(QBeR27C{PF&3wrKg@WM8%iZc8y* zQ|{(l6$ZFI8g4-o+YMz)J3;5CnLGMsbbh^Is3eu# zy}PWR8)A`X(c)jSJ2K*R1BryruHKQqI2s<^Ee9Ipku<%{axd1)7_%bZ9?eh7G(RRejA~SxfYy1-4SoiX~tU)JWQavK!Ngc z$SslV?CiR|hl7KIYz1z(X)WJhW7M|7>(kJSuc(7iGpfc9=Cmh z8NMcOiGCfXAx$S{vqlYt7tQ2e9d3%s&cAgH7*Dn$m-;QJx8 zZpQa@n6YGh{Zj#pK2T~Jv#uP1_4?fBetie^d9*&NH0fL}DetXQs!Xf;_G=IcduV2o zvxZ91KmYsQ^701{BXi2Vy@mNJrIw_P>ASx)ipDfMWR0NGf)#Oko~KC(y(W{`(cKnY zne=}(MSkMRFKZ^(7zbHXO4oOW7?V%!`aZ={rAo?P_YPSYN5jS=3#Ohk&o|5`2v^Sf zNJlj~C2m$~LAe$1M8nk+?j5wg$v0%M+j>uRR4Dq@%FLHoM%CP(+ITS9VFy*9RU3fY zJbyaXi~@%oRfWg6!IOug?$5TCxPmUhpTE=Q0 z;fPf}pieI+`%kV5-ns$**#1KC<5>T!a@!$=Gpi9J^{R}jTwCNuz_Kvc=~yq|E!9(& zw_Vu@{FQQM99HUNdP=X(VeReLJmjyemBQ5sCFvw6lypU>HTZ)Sn{<`CSgc2*gK|^F z;6PEFpOA(%x^;0}*KzyY^D^zTYee5@f14nDs#(%x`lXV&SF3ZRs{vjf59i zlJuX5nbW~2z=1Eg5NV>;CmA-a10;{?ZUdv6{NdbazYKL-X;!#!HC)N2cBImC{k4_f z3MffPz*{iQfe?rmqdK4V#)oL6WI_l%?#<5Q30Y3vp!-A~WY+jj(ZEgaz9`txCz9qt z6MZ&v)$ne0m7CrB)jKJNLHfR8C&4D+_^lt`B-a=row8zz1-|F0k9k^n`53 z&ZDUxw2Ft1!&K?BB1Nl#UpBu_BV%IhG&ME91cRcex0ep^t>f}+A;4T!Zgws_1WZ8e zrEa;t^nkH!$rb@c<-zALiU{v2k2dcJufBW*+@4lwvMQ+8%?3N!TDGwMR`kiY@faKvEE8QO@Q=EL~-L00a5H)X%(PopjQ z@7F)dtZwv76kgs}mVhf+rXLVk49|e47DDu|R2N4MsqObUR2u_NmbM9hm!|!eKv$dD znEqH!gA}*RWbbpepvh*$7QTCA8h{aa!zMK85eD${17!dKuFsx???Gf8$230NyGONLs2bJ8%w+dZ`7S zDRZK7I3)Hzre=?3IK5rB`~rXKGpb0E*%#;5p|}SxBzF@0x6lrejMFO?iNL@M2}2~l zAL>!YIYhn66pWt>E=T42-4pjkV4hdCz?{NH_bDA-K{#Cf$s&=VG&%iF8#X6^03>!3`s#tt{@kW>SRkVsuFGZl!^bqs zJ+Q~ug|ViU4RPiI%Md?s_l+C6oOwgd6ru5ZC7N8$n=LAZ&VEz5tXr3wj!iilS{V3} zS8Fa>_Ko&3w7kL~uS6q7u@MGStADywOdirUHP*A^*cOLL_)`<+>q=2;b6Do_b7WjQ z(bXq3aegIW7(?FqHU9NQz_>d(Zm@ZyD|W=fiHpKG;jW|D?H~YaDqWoUvbu*PrV^s$he7^1IqFwOvVk+T|dpt5ZfjRkIF@h zM5mKJm<%l%U2f1KkvzFUVJQXlK9xEdm{WN6InG+`7%k1l6q8|2qql)kX}t)qdUwEx gAWe-R@}}@E;?~=`#SjtT$4vtzWr0rp{iL}Gb10tFlcQ>{z>39*eftl+FU(H@-mx;1IQ%WW@sk$uk_MFJ1 zX)0vBLo-d`ad+~0$=k{2kN@_#cti5PW=+go%bm&TZJyofV%M*4)}Pi}s{8vv!W(Xe zUoHz2TOFKF<-Fm}_`0s+t#oCdc+G8ltL^W9{&~1A%4oT1=??F0_UqQ|-#Tlypi~ft z$r6DK55)@;oWT0H8r!CX*S@%XD5m!QU#X!&1toNg1OVuwngmC+x73{ zroF!^4V|2Uiba@sHP>gqcwl|t&`#TL-dpY)ZvL)cT9WvD>iLMJv8k_bFZ;dzef0D8 zqsPwY+>@FoD7E%g)2_2-yB!v6oVe_OpX!-37Ad~cgL8vsoIR7)8v6U3{G8b1yTAEr zB^B*E^TOLda>MGBzjwa=TPHh3nXSuUaXx!mT5`)QgJceU(=U3?zB3G`c*$3ZW`$3b zpQFx`p7y%5+QVzzn~n|InXirYqlBKk4Sv7pbf8&H=46A#s{?P9l`d2}^Wtzu?TfDg z!f9Vpr#-J+>bA2`?!fNaePQ{55ImbUH*4t{H=GZ4Lg4qwFqnyaN2g($Uw!5&*SE*Tydw4+j`8- zi=H%y00kC8s6;(>x2xZcV>B!kS|>3Fy(n_vQe|Hf0H?aFFPup~HYE@!0Erc#qv3IT zs3yZi>#f$@O#-v;=}%6te=nsBi*}>g=btCXJ1fr%w$M#2+!4c(__azx`*r00`+{F) z+1lFnR@N;DpCW@u9?$^ExSbebSlQ-vzxLIWA3gBo^LgRL7iMA4?dy5YG25K~DB)F9 z1NVNblvJ$@L*(W=Hmmb^R9SKF?_{*r%FnTGF%elkMRz&G)LR^^SS)_GYepEx$Z| z$=cxUzGpXbn3SEDe#Lt@$8CY(G+*bp9GfL;UzGKq+sT%DkM(+bN5Pym_kZ5o{^YM` zB-`d+?=Rllp7*EHz$rOq-bqjC9Pb5&`+S}DCVt>FS+-DfLto&XSm(>`ZQalJ$&{Lw zM$dTZ>@0~Tf@1pmoC?mJ{b6-w>VY1IaU)l19)$L06hEMZV R^nj%cgQu&X%Q~loCIFB<97O;C diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_strong.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_strong.png index 1d71e1efde85c433eaf750f07b8abe66f7250ea4..4b32f21622b09922897a5ace2003bc828d2b5064 100644 GIT binary patch literal 6695 zcmXY$c|26_7stoGlO@U?GL$8cFYu7fIw6b;P*#H zdf8^*LV`+IEscd^ua@zT${A$F>FoSkV@Lg-~bW=?_&9}9YmetU}a*@Ij4MysX&Ok;U zhMKpV#Y_@`ecHK60`Y{dk&{?OiBX2VgpHXa(q}Z0GO!s0t9IGg9LTBJBOcG7hSW+4m9YtTMFbuq8yyC8SlghUy`tGjncMn*uOH>OfI3cOG9nTXfcuYqnfObel8 zP4*Xkt@bwUvICmg;&mg$K;bbC{2)AGvNn@#dVT+o`CPN>h8&;;mL~uDPgnUK}D)Z zy~S8_6rxT&+f~1Ko4J5Vrm4Ce~`O7IIl+Uei0;v3{|;Lo2Hyx z)H}!)%PH7gHkt2;qZJHWnd%RroKZN7jO4!%xt#ufIH~%xvmxHCj$er%d_Cr5kaQg1 zH}BMYOez9w`#L^g*xB{%V9GLwJh;YVS>amDUTMpyj zJO1nb3O~?gb=qTU^~0Bs?Hau=d_(8v=Dra}*p>?CP@zPisR&*NB^$HN4B6S)!w8jvNkm6a54}xmp#QJqM)!%b2)nBEKGhmw+wt0(2@+VhuRklh z_qA78yQc_4_VKbHyKB8h!Y=F}A5t*Cc}rs(REe>A=-@!5K_pxS_Sk!6~#(^ldu)T3f{Ub%B4TqodAC9$B+2RwN~g@1}o z&`~w3mMQ}l+}QBELLD|6Di)lA*>9BpG>#97W052Vwz327)=S&b1>F0z^mGSDN9}&q zQP@@}SEBVwa(w{|H3K&1Fdo%lsi>%^Zfj#7bMt?zEP|eHY-(a2bh$c8Y!Y*#l*z-@ z;I3vKiNxot82FT{GZJ}zW9IW!9wyz2vGBlF;rERST08lxpZk&mc*lU{PhCxX|Hs`L z1a`N)-@bu{mpUOE4T&F0EGx#MD8nb3O@twlpg&>vC>H&sKewKjk6rpNjIld(w(V`x z-VCTi&Z@1pmIegc+1VLBd9*tp-A3iruUlBc(ja&SdG7v4e2%0OZIu=Jk)70t8Oe%7j zk@WDX^nieGwpJMZ?cPa&5l@b98pauiq7{CYqeFcJ~I6Q4vwA zn)`Y5z;cYwZmeQf49$#!+SpJ8b+*$nAgb@cqg~Zus}UBI=dwyrh#VOOMNry`w6nsa z;|~J8o1SlkjyoC_>?y&>>HW@6DWn4`5dP$7$B}dLXy^Bj*(dXK&r-y_yD|#u_Ma*e1NXxtZnnP=0z-8p(BQP<0-%l`jSnW7^!q2jLz+w%}mDZ4#k0!pv0) z?fCD{VxnEhTK)GaLdj<9`6G17i`LjcU#ME0wd~er!?#Bgy8J+Nbb89)?p0^|_-7NH z8@^D+%ySz{K4>NmZ?1RRlSVn_f*vmH5_aSz?GBdv!C>2$B(f_I_w-AKL+Q`L9n4X%|eL!@pfGAT3#?&=jr|t9~NqW z%d1X&T5P2f+=o(!5cV$tmYK>}z&t;2Jg$A0gbQM{$$`WsO%%zapWU(#QINcYu$d)4 z3si)J$6BXRv-|OmaX&Pn(aKfwF=*DsY5dA#MPi9&vcOEwCq_kCNE;f0!ouwNBErI2 zXn|RQ(X;vsU9cp+xGuwqyF5$msUr_0yc6i;KIPG0+C>rnEO{LoMTzaA$d{wudYq|t zPadE6I2C7vuu*O8V=2Eyua6gGwuu33gv`m#(%5G+Ul5xfh_bz<1x_@6EeJJIaGQgN*PpR z_ay`QLG2T<4EJE$_J-}L`ZPZx4YB04#1M5Dc06R4()?xK{~#KR1Az{=LJ!yG*^+xk z3Ef*F=;LUc7w=^L`r3pVWkSPB4n3aBj!d6#Qjg)1<}}MWEVBNx-;XZt+^724Dl8a4 zl&C&XYF`L_-P?WPMK%*k%qF~)A$nGWIbd$s+=M1Ig7hD3C!bF`)7@yA+hO7FEsX+v zz|=Bi^vU=-m52|?Z*wE2nmm+GUc3+8j|)A~bF)4=4MF*k-N{~}f5_H!0jcI3IXY?c z=0w;k=6rQx=Pi?nJ7u(szLPO;V9R~&uk^Rt53QaH8^Fa7g9a|;Dl7YN85tSYyOI-T zl@f-#PLCRbJ?Z{wBMA^p^~aBeLakekyPB63oAb|U#tl0f;t#W%|8TYA zcTyC#BsnbJ_z`MDDDPvi8Rm)F-QU&&qB-j6v3c3;^_22qenCzhf&;PRHdvEGLnK(E zMe;_NqO&}aWa0fS^cT~P;8OtR-GVjkf1J0c zBdDLRCVC~0mY8Ulne%IaK=ct*Jj`@YSIbI3p!bQ~TLActxz+s`THyb_rs^h+i;^)d z-?u`CT6Rg?*BE;F&gwa90LAFBw>Ky{I(m4;FUmbP*O=inZQ$|k$B-n$Uvig1Q?7Pp zXBUWH`HQqxdaHe}F8wh?N3!n5 zEI56c+daU}r2tG&4}n0QZK5e55D!|=vfqDz-=p0h)nj9yo zP#q(q?MtrB+w(X{8XfPz>P40mF>F`mowAqAIfmw1T_(4Y)q6^3FiYqvBl;KkT|DlQ zQH-FxCy)$yFq70kg@9BOH<^Je3Kx9~8>t?tgp6Z$Da*xfd6~3#O(LX#tJJ_%*u%G% zea#ju%gh%pA5Vo>y?FK`*dH@8D#}hEPe*M76Gz6A22_Nd=EaR?a*WM%wiJYXY7R7| zrMZov(LhcLpm=BjmJl?D8ujD`HS}k!E7O9*ZgZ<}$GtcqMqToQV>6r*wU4L)_qr57_4B1!G3ritUXFZF5XMX< zOf0}Q1p=X9VaJC~>gkt%ryA~N{W?8>bvUE_h)ac&RqNja8ELtDFZCs( zG6O2>+atvgVg)Qhe=E5vosPG|RUSydiC(Jdb0etbvQ7A36N~^8kcV*BG-)?;B~`XJ zV9x^PY`v`E&tjLDEKkF+;Ml~~49qeKzl6Rj(0wI*G`BqR5<<*J>v#CuJbFWk`uckO zm(l1Ht+_i0PUKhMofaJ0Uck(QPQ=;*4J?JuI0Feh^=eamwFrNESZ*4a(; z$B$yEKJovy(dTCmTjhLycel=-RuuG-Zh+ZPo_h9V@vJ9DWKTn@$CX_rJzy6L0PZbv zdgABjG?CJ$ef`@#9f|uKw38$AD(fB*?@De8PLQx2Wp_&y)fumS5{KAHIN@pwi&NVO z9{+4*>Od+dwZIBX!iMx1n<=zZc=(Gi)5rAt%~NOL5LP>fEX8+* zS_I|lT`Zse?Bwc z4^%Wfmeig*eKYjl@x8PC?Voai7R7hC4EH|TUQGIp09#zl>KsmSNLD?+E$Jz_hC$j! z?8th`b=TNcfj_`wu?45O{C;0{V`k3;PpVL8GV)J-+qx~6uL%v1{u1L`UI=6dxMUXg z*t$dU8I7eA$MsJJx3{-r^kRT}832cjtnKv(gO0dW=_$?c9_J>xiA8EreOdfyjuiKi zp+(^U@Od^%8P>af)SKO?@bY_vtmJ(^FR9iX=wT;*?GS1&g;r{pXxRsMLbEYLRY%7eD>!Pj4m`0uEz&hJ}srob#x z;K7`QltRdQz<)^`WPT0n(K?3Vs^2asHS^>yqkVP$c-?|Aw|GVYA~FlDuQ2`?NSKkY zQ2f1T3Mpm_U7D^}lCtu1BabF09VB{sEY>M=<9z*0O$$9Sale*j%Ef_Fz}XgJ4SgK-KWqbMYu_+gTc(X!rr8I zD_#hI+*gj|xh?t_Gd5h$Y-jMO(#!iwc=OU3D>GRd7VpsoP-6cm$a=C$`s#88$NCuV zDuJFk{Nx29EuS$0NXB{wbX1^5peZ8?xA{$y4zE3jaae_)0q$dZIMr|i)?h+?*M#Ol z{`yF0T2E3yyevv+#8_}Sq2wZIO86i$t)1#n-s;!1277?+*Hf}-V?HID#o~*x=GOc% z39U>EP_c@}7_h)GDWtG<-6#K1CFY1X{nh%>uY248Q9huQh4+OjP^lWch59UrE7+n^ zX3(Mb{UJU+K7_i5HRq7B+>+BjHBLJb7o!hPI}s^(ornMAndDwu!LCv}o>HZ8^!Cq> z?zjl4BreYG*j(^f%@d!AIogNj>AZWH!Ux^v1<#uEvb~5()w@bDG!YcT(nG1ss~G!E zku+Q#w*A|;Z@ry+jq=4*CpgDW&wTo*JbHcDpZvsMP9Ky#L=->UMeNun8r4m6xBIxO z&6E4(@^EYZjmRArLRQ*SK{rQ7@t^Ziwpx3X&Nx1XlfcQPp-_#FpSM&wgkM&ckPe1I zB$X>?*8T9Bp-25m2gKQ*SZ(60F+;UTy*;H_Gum}Xogq;;gf3B}9>3LDh2Nsoa; z&LK(YwjCk~fX5Q8GV^fX&!;dJPx+_3HD+>u-EIcu2u8c9WM`6mZuXM<-#&$%$Z$(| zP@f!rcEt~zoIm^#?e&AW892Nt-2P;}um<;|=BNB+JV2a9=9ioUt9zw+D9)!ZiaEuW znO)MyabRHJrP{gLA@hQuCBXrWyOAR^`R!$sifW|Y(H^^lzxoZfD*~V@fy{jr_O&oj z>~$V}IqX2wyl{Jh(Z5AxY=o|ea$#SoS1X2W(!pmSOvEl?jQ+ExW`I@YWmOC{ zto)O#Slt=jXNQ4P5FhGQK#ETM-xSAgUG+va0N!)tE)a+Q$>2bQM*A;{#4lhP0^wu- z){52zLZF-CCTBTiB9MRL5OI&}I22K9H1oY~=Pg}{Fkb<1nCgM)WA%!jxW{B^B) zyxi4dP9^WMW_=#L7$BLA^}Zm9#}(i!%6m#dq%rQN+of#LCV|7A2l1`!-o6VL*|UEF zQbSf&mMtixtuoL%Baj~o^l7vb#zM)CT@@x6bcoB+UanAU@mD~~Dhw%C!u`&i3L$J* zLCH<7)9w&v&QH=aQ@i;02S9F5tdF*zZk7yrdewK4SZkP+#^8#wNjG?>xc#d8uK-p2 zOJ4L8c*=!L{YNJQ<9=6}a%5d&%(T|wqAUTF8kl&Z?2wTw;M@++{K!T}L#uz>QoyY` z$Zc;Tz^8vb&J8ugV^vZDlJGXBV;7ytqyKms6bM{IXB#~>1a~-p?R?9<-EPk+>VLfh z?+djL_!%lO$WuuLcrr3KR|o{k$j^^nx>ZEcjZ8NVsaLl93x8)XrGDv^#E{8ky*|{~ z)~ACK>GEjC1p8Om`U-8G;=sjL1a9xkgY=D!cr zya3d9YqVxuTwGaju)oI7jz|`%WBTb1y~3)^Kt%oO=auk(Y>m|#`Bq$1B!1t2Y`)>!TQ7@*Fk4~@WqUK`|13#q2Y~1e zZVfXqz^dc>;?XT{s8Y~&MQk4Z2h0ZL?Tw@yVY}kemP#*FcB!x<^Se{29b6JS@f>O_ z#0BYxt-#MP@KV4enM<)b{1V>m6SK2IFQ938^aVg+*AIirUH?S?JLZ$4;YVyiP#AFP zCeJmo^Dpp%|BwqDS(^L{ssywn{v{zWG9}CuThSf~+oTCGVgb!(SpZq&Sdyk73a1R2 zUs$>;*bQ`^fRSeWB^bvamMb$ox3^l{%%U2 zli~B}<{Mq9|BgS8==3{7Hmj}~Rw;S%3O0Oh2eFnJe0{Jb;3r9=rQQu^%PiT}uz)OS zW3bPhn$?rkkUPdmq0$10D!;qUh<%(gjg z*brNGUpYFOKclCugEV7!PQHk3OFnGM+?navqs$I*P=lSrm{*LM6&D$-hQQ8^Sl2W( zU7=``8A`{)py@7=b&WE*7KI8`9)B7rUn9q z`ts$I3tC-!*7b!a_Tzk9?V`)wS$w#%Bw#Z9ARJ@n<${gxvTQj5!{=H7_UijGp-@wb zGP?6#4)bojB3Exu=EG={Dus6%zxr0P6?}|0R*raTpCWjYul187Z=jgtn-cTh&Oo_p zAaG@@EvF}ad+T?ZJjz#?PM;8-fAoOxKp(^LPRf-~C&iJr59jjn;)7LOtSvK6cs+D3 zYo??TM`kRn^$}Yqq$U01v~fTA6~XOruEb*;-Nxr>p)sZI zighPu6C1@YbBA77sTLaPATwe@e0l@F^V6T?YYsZ_j879Yi+mdjMH{}wo|zIi%g2;M zFAb^{TzmV+Wm9)#l^;|1o|P)kKb4*Iz>ymo8nTnyUYEFaaOs-SUCAzMeTF&>eQb_n zwt1)`$(segy&kG>BT*+?Ms*!|MDHM)5&;m4^fpCMskyzGd4Iiv!1PoyOM#x0q6EoG z9iCp%|Mey3d)4sJgM9pmtS^op-_$H0*W51K>HO@})rEV%GDB-;6=i=^3A-ZKKSOn- z@MR{s)@#`s+Sx-V;+sa52V|p1W%%yc`PV(k6-?=G9usc53#Y7${BPAM=DDoS*zyz? zTq(=HegRd%BoRwyy~SH~-}%!CL~Ro&qJ8`q5_R4Oy0tlMHksuDg(MYoF6Ab-nV*%* z)X@&6u^u+Z0fg78)^b|Dd|c@@|7_fEkwU>NHv04d1qrj93wh5xhhB?)ruh&=4UK5i?9|x!!!wFw9NPK^6V=kB`Eq*haJE*KZffHGS1A{1_c*mv z_c1o>;^qc7!!aACSS-!&2KK5g^T#HCZrrr+d^p{|FkQ3YJqNQIwv9+6Oxe zGd>mS0tS0#vLZRtT$udx=l)*h;Nau&jrYUFT-p5{vm<}3XHUXYn@TB>YTZ9F;;jtO zToadA*<>UxP$}U5p+YJR2o-JL2P=rFV;F3GD@@zp4bijhPtyq_KHoUPcx{2_UDT-G zlz_naCc+56w!Fc1LrPB7Fqjr^bKq9}QHKoe&F?>XDG#BY(7 zzFjVlUmV!@jnESm$hQ3bQ%>1jpPj38%)e_F*#dLA^EgnT3;DrV1uUufVm>pa(WB)D z?MpM0Esz~ll9VkrLv&rzKsfc5&tw_~Co)t#v5nCVJjfm6J}ZeKGDEk8&?7Nqk;gBB zL23hU3?QH6@8fjvzlTfbc@9(Rn`vi`?tUApp1Ch8WY&JvYzS-K+iVX!jjL36OJ zrO7bHGT8o7xw2e9C)7zXYp*KaX@*9IkmDBc7qnuP5O^Ws088R?&V=SJ=@g zpx-jiI<*nydp4B98_c!H?uBk`6QLrL8hAt0A&2UcdVJ->IsVCAf7MoD{%4X^on;Vv zgZPAzXfc@0Jaas7alvTz+9R>@jWk@TY?afmx`fUj$mSDP(p!vn+Su4!uu}sLQZ8%! zZ;x2=lTKV#+p}jE1qJP&BH9zmO*&QW;-!-QV*QesveIRKJMx)IW@!F0r>bRv{?THV zmRn5w@?V~{wGdOn3I(;-=BdpJUUKRJX>oz>*bz&4rcm&?LghQx`P-e-p2MNfog4&I zH-D#-@9lM#HLIYdJV1@?6-}ijSC+dTY*NmQ#nM&T< uNjfyL%SnGZl0i`RAQHB`sP(^qEUFtclhrC-e_cAl0nU!D*eZvBgg*hre6!^M diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_v2.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_v2.png index d494ed9f24bfac383bdcabd6417a94d319678b04..f4cea5f797feb9c5ae7688c5c5c87f2daa70b77b 100644 GIT binary patch delta 2963 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 JPDHLkV1fW@nePAq delta 2854 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 Date: Fri, 16 Feb 2024 15:01:25 +0100 Subject: [PATCH 5/6] life extender rework, more EC compat --- changelog | 9 +- .../com/hbm/crafting/ConsumableRecipes.java | 1 + .../java/com/hbm/extprop/HbmPlayerProps.java | 18 +++- .../com/hbm/handler/EntityEffectHandler.java | 8 +- .../gui/GUIScreenTemplateFolder.java | 3 +- .../inventory/recipes/AssemblerRecipes.java | 1 - src/main/java/com/hbm/items/ModItems.java | 10 +- .../com/hbm/items/armor/ArmorAustralium.java | 78 -------------- .../com/hbm/items/armor/ItemModShield.java | 33 ++++++ .../java/com/hbm/items/food/ItemFlask.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 4 +- .../hbm/render/util/RenderScreenOverlay.java | 2 +- .../machine/TileEntityCondenser.java | 97 +++--------------- .../machine/TileEntityCondenserPowered.java | 2 - .../tileentity/machine/TileEntityITER.java | 12 ++- .../machine/TileEntityMachineCyclotron.java | 10 +- .../machine/TileEntityMachineIGenerator.java | 15 ++- .../machine/TileEntityMachineRadGen.java | 13 ++- .../machine/TileEntityMachineRadiolysis.java | 9 +- .../TileEntityMachineReactorBreeding.java | 9 +- .../machine/TileEntityMachineTurbineGas.java | 15 ++- .../machine/TileEntityReactorResearch.java | 11 +- .../machine/TileEntityReactorZirnox.java | 23 ++++- .../tileentity/machine/TileEntitySILEX.java | 13 ++- .../machine/TileEntityTowerLarge.java | 16 +-- .../machine/TileEntityTowerSmall.java | 14 +-- .../oil/TileEntityMachineLiquefactor.java | 10 +- .../oil/TileEntityMachineSolidifier.java | 10 +- .../machine/rbmk/TileEntityCraneConsole.java | 20 ++-- .../com/hbm/util/CompatEnergyControl.java | 1 + .../hbm/textures/items/australium_iii.png | Bin 282 -> 300 bytes 31 files changed, 234 insertions(+), 235 deletions(-) delete mode 100644 src/main/java/com/hbm/items/armor/ArmorAustralium.java create mode 100644 src/main/java/com/hbm/items/armor/ItemModShield.java diff --git a/changelog b/changelog index 80e8902be..be14b503d 100644 --- a/changelog +++ b/changelog @@ -69,6 +69,11 @@ * The bricked furnace now makes charcoal twice as fast * Combination ovens no longer need two welded copper plates and instead only cast plates, therefore no longer being post-arc welder. This should make it more affordable and useful in the initial earlygame where things like automatic wood farms are most important. * Any water-like extinguishing fluid shot from the chemical thrower can now wash away fallout layers +* Overhauled the Mk.III life extender + * The assembler recipe has been replaced with a simpler but more expensive workbench recipe + * Instead of taking up the chestplate slot, it's now an armor mod worn in the insert slot + * The armor no longer gives absorption, instead it adds 25 points to the shield count + * The +25 bypasses the shield limit of 100, meaning that with enough shield infusions, the total maximum is now 125 ## Fixed * Fixed dupe caused by shift-clicking ashes out of the bricked furnace @@ -84,4 +89,6 @@ * Fixed rampant mode random scout spawns being able to appear inside blocks * Fixed turret rotation sometimes desyncing when out of range, this is especially noticeable with slow-moving arty * Fixed research reactor OC integration allowing the control rods to be set out of bounds -* Fixed fallout falling faster and overlaying if multiple fallout areas intersect \ No newline at end of file +* Fixed fallout falling faster and overlaying if multiple fallout areas intersect +* Fixed template folder 3D models rendering with weird shading +* HUD elements like jetpack charge and the shield bar should now still render even if Tinker's Construct replaces the health bar renderer \ No newline at end of file diff --git a/src/main/java/com/hbm/crafting/ConsumableRecipes.java b/src/main/java/com/hbm/crafting/ConsumableRecipes.java index 3ebdae6c8..1a240f826 100644 --- a/src/main/java/com/hbm/crafting/ConsumableRecipes.java +++ b/src/main/java/com/hbm/crafting/ConsumableRecipes.java @@ -168,6 +168,7 @@ public class ConsumableRecipes { CraftingManager.addRecipeAuto(new ItemStack(ModItems.insert_esapi, 1), new Object[] { "PKP", "DSD", "PKP", 'P', ANY_PLASTIC.ingot(), 'K', ModItems.insert_sapi, 'D', ModItems.ducttape, 'S', BIGMT.plate() }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.insert_xsapi, 1), new Object[] { "PKP", "DSD", "PKP", 'P', ASBESTOS.ingot(), 'K', ModItems.insert_esapi, 'D', ModItems.ducttape, 'S', ModItems.ingot_meteorite_forged }); CraftingManager.addRecipeAuto(new ItemStack(ModItems.insert_yharonite, 1), new Object[] { "YIY", "IYI", "YIY", 'Y', ModItems.billet_yharonite, 'I', ModItems.insert_du }); + CraftingManager.addRecipeAuto(new ItemStack(ModItems.australium_iii, 1), new Object[] { "WSW", "PAP", "SPS", 'S', STEEL.plateWelded(), 'P', ANY_PLASTIC.ingot(), 'A', AUSTRALIUM.ingot(), 'W', GOLD.wireDense() }); //Servos CraftingManager.addRecipeAuto(new ItemStack(ModItems.servo_set, 1), new Object[] { "MBM", "PBP", "MBM", 'M', ModItems.motor, 'B', STEEL.bolt(), 'P', IRON.plate() }); diff --git a/src/main/java/com/hbm/extprop/HbmPlayerProps.java b/src/main/java/com/hbm/extprop/HbmPlayerProps.java index 4f28169c2..b1dfbd74d 100644 --- a/src/main/java/com/hbm/extprop/HbmPlayerProps.java +++ b/src/main/java/com/hbm/extprop/HbmPlayerProps.java @@ -1,13 +1,16 @@ package com.hbm.extprop; import com.hbm.entity.train.EntityRailCarBase; +import com.hbm.handler.ArmorModHandler; import com.hbm.handler.HbmKeybinds.EnumKeybind; +import com.hbm.items.armor.ItemModShield; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; @@ -144,8 +147,19 @@ public class HbmPlayerProps implements IExtendedEntityProperties { } } - public float getMaxShield() { - return this.maxShield; + public float getEffectiveMaxShield() { + + float max = this.maxShield; + + if(player.getCurrentArmor(2) != null) { + ItemStack[] mods = ArmorModHandler.pryMods(player.getCurrentArmor(2)); + if(mods[ArmorModHandler.kevlar] != null && mods[ArmorModHandler.kevlar].getItem() instanceof ItemModShield) { + ItemModShield mod = (ItemModShield) mods[ArmorModHandler.kevlar].getItem(); + max += mod.shield; + } + } + + return max; } @Override diff --git a/src/main/java/com/hbm/handler/EntityEffectHandler.java b/src/main/java/com/hbm/handler/EntityEffectHandler.java index 61e96b2b2..86b640a72 100644 --- a/src/main/java/com/hbm/handler/EntityEffectHandler.java +++ b/src/main/java/com/hbm/handler/EntityEffectHandler.java @@ -77,13 +77,13 @@ public class EntityEffectHandler { HbmPlayerProps pprps = HbmPlayerProps.getData((EntityPlayerMP) entity); NBTTagCompound data = new NBTTagCompound(); - if(pprps.shield < pprps.maxShield && entity.ticksExisted > pprps.lastDamage + 60) { + if(pprps.shield < pprps.getEffectiveMaxShield() && entity.ticksExisted > pprps.lastDamage + 60) { int tsd = entity.ticksExisted - (pprps.lastDamage + 60); - pprps.shield += Math.min(pprps.maxShield - pprps.shield, 0.005F * tsd); + pprps.shield += Math.min(pprps.getEffectiveMaxShield() - pprps.shield, 0.005F * tsd); } - if(pprps.shield > pprps.maxShield) - pprps.shield = pprps.maxShield; + if(pprps.shield > pprps.getEffectiveMaxShield()) + pprps.shield = pprps.getEffectiveMaxShield(); props.saveNBTData(data); pprps.saveNBTData(data); diff --git a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java index 06e2d2e70..aae2a8a45 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java +++ b/src/main/java/com/hbm/inventory/gui/GUIScreenTemplateFolder.java @@ -7,6 +7,7 @@ import java.util.Locale; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; import com.hbm.inventory.RecipesCommon.ComparableStack; import com.hbm.inventory.fluid.FluidType; @@ -313,7 +314,7 @@ public class GUIScreenTemplateFolder extends GuiScreen { public void drawIcon(boolean b) { try { RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) 240 / 1.0F, (float) 240 / 1.0F); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); if(stack != null) { diff --git a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java index 8e135c4fb..51880f151 100644 --- a/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/AssemblerRecipes.java @@ -219,7 +219,6 @@ public class AssemblerRecipes { makeRecipe(new ComparableStack(ModItems.tritium_deuterium_cake, 1), new AStack[] {new ComparableStack(ModItems.cell_deuterium, 6), new ComparableStack(ModItems.cell_tritium, 2), new OreDictStack(LI.ingot(), 4), },150); makeRecipe(new ComparableStack(ModItems.pellet_cluster, 1), new AStack[] {new OreDictStack(STEEL.plate(), 4), new ComparableStack(Blocks.tnt, 1), }, 50); makeRecipe(new ComparableStack(ModItems.pellet_buckshot, 1), new AStack[] {new OreDictStack(PB.nugget(), 6), }, 50); - makeRecipe(new ComparableStack(ModItems.australium_iii, 1), new AStack[] {new ComparableStack(ModItems.nugget_australium, 6), new OreDictStack(STEEL.ingot(), 1), new OreDictStack(STEEL.plate(), 6), new OreDictStack(CU.plate(), 2), new ComparableStack(ModItems.wire_copper, 6), },150); makeRecipe(new ComparableStack(ModItems.magnetron, 1), new AStack[] {new OreDictStack(ALLOY.plate(), 3), new ComparableStack(ModItems.wire_tungsten, 1), new ComparableStack(ModItems.coil_tungsten, 1), },100); makeRecipe(new ComparableStack(ModItems.pellet_schrabidium, 1), new AStack[] {new OreDictStack(SA326.ingot(), 5), new OreDictStack(IRON.plate(), 2), }, 200); makeRecipe(new ComparableStack(ModItems.pellet_hes, 1), new AStack[] {new ComparableStack(ModItems.ingot_hes, 5), new OreDictStack(IRON.plate(), 2), }, 200); diff --git a/src/main/java/com/hbm/items/ModItems.java b/src/main/java/com/hbm/items/ModItems.java index 21588be1a..088ffd540 100644 --- a/src/main/java/com/hbm/items/ModItems.java +++ b/src/main/java/com/hbm/items/ModItems.java @@ -2017,10 +2017,6 @@ public class ModItems { public static Item robes_legs; public static Item robes_boots; - public static Item australium_iii; - public static Item australium_iv; - public static Item australium_v; - public static Item jetpack_boost; public static Item jetpack_break; public static Item jetpack_fly; @@ -2212,6 +2208,7 @@ public class ModItems { public static Item night_vision; public static Item card_aos; public static Item card_qos; + public static Item australium_iii; public static Item hazmat_helmet; public static Item hazmat_plate; @@ -3460,6 +3457,7 @@ public class ModItems { night_vision = new ItemModNightVision().setUnlocalizedName("night_vision").setTextureName(RefStrings.MODID + ":night_vision"); card_aos = new ItemModCard().setUnlocalizedName("card_aos").setTextureName(RefStrings.MODID + ":card_aos"); card_qos = new ItemModCard().setUnlocalizedName("card_qos").setTextureName(RefStrings.MODID + ":card_qos"); + australium_iii = new ItemModShield(25F).setUnlocalizedName("australium_iii").setTextureName(RefStrings.MODID + ":australium_iii"); cap_nuka = new Item().setUnlocalizedName("cap_nuka").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":cap_nuka"); cap_quantum = new Item().setUnlocalizedName("cap_quantum").setCreativeTab(MainRegistry.consumableTab).setTextureName(RefStrings.MODID + ":cap_quantum"); @@ -5371,8 +5369,6 @@ public class ModItems { liquidator_legs = new ArmorLiquidator(aMatLiquidator, 2, RefStrings.MODID + ":textures/armor/liquidator_2.png").cloneStats((ArmorFSB) liquidator_helmet).setUnlocalizedName("liquidator_legs").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":liquidator_legs"); liquidator_boots = new ArmorLiquidator(aMatLiquidator, 3, RefStrings.MODID + ":textures/armor/liquidator_1.png").cloneStats((ArmorFSB) liquidator_helmet).setUnlocalizedName("liquidator_boots").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":liquidator_boots"); - australium_iii = new ArmorAustralium(MainRegistry.aMatAus3, 1).setUnlocalizedName("australium_iii").setMaxStackSize(1).setTextureName(RefStrings.MODID + ":australium_iii"); - jetpack_boost = new JetpackBooster(Fluids.BALEFIRE, 32000).setUnlocalizedName("jetpack_boost").setCreativeTab(CreativeTabs.tabCombat).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":jetpack_boost"); jetpack_break = new JetpackBreak(Fluids.KEROSENE, 12000).setUnlocalizedName("jetpack_break").setCreativeTab(CreativeTabs.tabCombat).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":jetpack_break"); jetpack_fly = new JetpackRegular(Fluids.KEROSENE, 12000).setUnlocalizedName("jetpack_fly").setCreativeTab(CreativeTabs.tabCombat).setMaxStackSize(1).setTextureName(RefStrings.MODID + ":jetpack_fly"); @@ -7580,6 +7576,7 @@ public class ModItems { GameRegistry.registerItem(night_vision, night_vision.getUnlocalizedName()); GameRegistry.registerItem(card_aos, card_aos.getUnlocalizedName()); GameRegistry.registerItem(card_qos, card_qos.getUnlocalizedName()); + GameRegistry.registerItem(australium_iii, australium_iii.getUnlocalizedName()); //Chaos GameRegistry.registerItem(chocolate_milk, chocolate_milk.getUnlocalizedName()); @@ -7863,7 +7860,6 @@ public class ModItems { GameRegistry.registerItem(apple_euphemium, apple_euphemium.getUnlocalizedName()); GameRegistry.registerItem(watch, watch.getUnlocalizedName()); GameRegistry.registerItem(mask_of_infamy, mask_of_infamy.getUnlocalizedName()); - GameRegistry.registerItem(australium_iii, australium_iii.getUnlocalizedName()); GameRegistry.registerItem(jackt, jackt.getUnlocalizedName()); GameRegistry.registerItem(jackt2, jackt2.getUnlocalizedName()); GameRegistry.registerItem(jetpack_fly, jetpack_fly.getUnlocalizedName()); diff --git a/src/main/java/com/hbm/items/armor/ArmorAustralium.java b/src/main/java/com/hbm/items/armor/ArmorAustralium.java deleted file mode 100644 index b5a681561..000000000 --- a/src/main/java/com/hbm/items/armor/ArmorAustralium.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.hbm.items.armor; - -import java.util.List; -import java.util.Random; - -import com.hbm.items.ModItems; -import com.hbm.lib.RefStrings; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemArmor; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public class ArmorAustralium extends ItemArmor { - - Random rand = new Random(); - - public ArmorAustralium(ArmorMaterial armorMaterial, int armorType) { - super(armorMaterial, 0, armorType); - } - - @Override - public void onArmorTick(World world, EntityPlayer player, ItemStack armor) { - if(armor.getItemDamage() < armor.getMaxDamage()) { - if (armor.getItem() == ModItems.australium_iii) { - if(rand.nextInt(3) == 0) { - armor.damageItem(1, player); - } - if(!player.isPotionActive(Potion.field_76444_x.id)) - player.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 80, 2, true)); - } - if (armor.getItem() == ModItems.australium_iv) { - if(rand.nextInt(5) == 0) { - armor.damageItem(1, player); - } - if(!player.isPotionActive(Potion.field_76444_x.id)) - player.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 80, 4, true)); - } - if (armor.getItem() == ModItems.australium_v) { - if(rand.nextInt(7) == 0) { - armor.damageItem(1, player); - } - if(!player.isPotionActive(Potion.field_76444_x.id)) - player.addPotionEffect(new PotionEffect(Potion.field_76444_x.id, 80, 3, true)); - } - } - } - - @Override - public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { - - if (itemstack.getItem() == ModItems.australium_iii) - list.add("Ouch, that hurts."); - if (itemstack.getItem() == ModItems.australium_iv) - list.add("Just do it."); - if (itemstack.getItem() == ModItems.australium_v) - list.add("Gobbles up less australium than Mark IV!"); - } - - @Override - public String getArmorTexture(ItemStack stack, Entity entity, int slot, String layer) { - if(stack.getItem().equals(ModItems.australium_iii)) { - return (RefStrings.MODID + ":textures/armor/australium_iii.png"); - } - if(stack.getItem().equals(ModItems.australium_iv)) { - return (RefStrings.MODID + ":textures/armor/australium_iv.png"); - } - if(stack.getItem().equals(ModItems.australium_v)) { - return (RefStrings.MODID + ":textures/armor/australium_v.png"); - } - - else return null; - } - -} diff --git a/src/main/java/com/hbm/items/armor/ItemModShield.java b/src/main/java/com/hbm/items/armor/ItemModShield.java new file mode 100644 index 000000000..9aa1782e4 --- /dev/null +++ b/src/main/java/com/hbm/items/armor/ItemModShield.java @@ -0,0 +1,33 @@ +package com.hbm.items.armor; + +import java.util.List; + +import com.hbm.handler.ArmorModHandler; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; + +public class ItemModShield extends ItemArmorMod { + + public final float shield; + + public ItemModShield(float shield) { + super(ArmorModHandler.kevlar, false, true, false, false); + this.shield = shield; + } + + @Override + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { + String color = "" + (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD); + list.add(color + "+" + (Math.round(shield * 10) * 0.1) + " shield"); + list.add(""); + super.addInformation(itemstack, player, list, bool); + } + + @Override + public void addDesc(List list, ItemStack stack, ItemStack armor) { + String color = "" + (System.currentTimeMillis() % 1000 < 500 ? EnumChatFormatting.YELLOW : EnumChatFormatting.GOLD); + list.add(color + " " + stack.getDisplayName() + " (+" + (Math.round(shield * 10) * 0.1) + " health)"); + } +} diff --git a/src/main/java/com/hbm/items/food/ItemFlask.java b/src/main/java/com/hbm/items/food/ItemFlask.java index 9ecdb4fc2..13826d3b8 100644 --- a/src/main/java/com/hbm/items/food/ItemFlask.java +++ b/src/main/java/com/hbm/items/food/ItemFlask.java @@ -50,7 +50,7 @@ public class ItemFlask extends ItemEnumMulti { float infusion = 5F; HbmPlayerProps props = HbmPlayerProps.getData(player); props.maxShield = Math.min(props.shieldCap, props.maxShield + infusion); - props.shield = Math.min(props.shield + infusion, props.maxShield); + props.shield = Math.min(props.shield + infusion, props.getEffectiveMaxShield()); } return stack; diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index 592132ad5..c0ec6f220 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -364,7 +364,7 @@ public class ModEventHandlerClient { } } - @SubscribeEvent + @SubscribeEvent(receiveCanceled = true) public void onOverlayRender(RenderGameOverlayEvent.Post event) { /// HANDLE ELECTRIC FSB HUD /// @@ -374,7 +374,7 @@ public class ModEventHandlerClient { if(!event.isCanceled() && event.type == event.type.HEALTH) { HbmPlayerProps props = HbmPlayerProps.getData(player); - if(props.maxShield > 0) { + if(props.getEffectiveMaxShield() > 0) { RenderScreenOverlay.renderShieldBar(event.resolution, Minecraft.getMinecraft().ingameGUI); } } diff --git a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java index 50ef61541..0fd88f3c7 100644 --- a/src/main/java/com/hbm/render/util/RenderScreenOverlay.java +++ b/src/main/java/com/hbm/render/util/RenderScreenOverlay.java @@ -297,7 +297,7 @@ public class RenderScreenOverlay { Minecraft.getMinecraft().renderEngine.bindTexture(misc); gui.drawTexturedModalRect(left, top, 146, 0, 81, 9); - int i = (int) Math.ceil(props.shield * 79 / props.maxShield); + int i = (int) Math.ceil(props.shield * 79 / props.getEffectiveMaxShield()); gui.drawTexturedModalRect(left + 1, top, 147, 9, i, 9); String label = "" + ((int) (props.shield * 10F)) / 10D; diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java index 3e4df7177..2a13a059a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenser.java @@ -1,35 +1,29 @@ package com.hbm.tileentity.machine; -import java.util.ArrayList; -import java.util.List; - -import com.hbm.interfaces.IFluidAcceptor; -import com.hbm.interfaces.IFluidSource; -import com.hbm.inventory.fluid.FluidType; import com.hbm.inventory.fluid.Fluids; import com.hbm.inventory.fluid.tank.FluidTank; -import com.hbm.lib.Library; import com.hbm.saveddata.TomSaveData; import com.hbm.tileentity.INBTPacketReceiver; import com.hbm.tileentity.TileEntityLoadedBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.EnumSkyBlock; -import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, INBTPacketReceiver { +public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IInfoProviderEC { public int age = 0; public FluidTank[] tanks; - public List list = new ArrayList(); public int waterTimer = 0; + protected int throughput; public TileEntityCondenser() { tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 100, 0); - tanks[1] = new FluidTank(Fluids.WATER, 100, 1); + tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 100); + tanks[1] = new FluidTank(Fluids.WATER, 100); } @Override @@ -49,6 +43,8 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidA this.waterTimer--; int convert = Math.min(tanks[0].getFill(), tanks[1].getMaxFill() - tanks[1].getFill()); + this.throughput = convert; + if(extraCondition(convert)) { tanks[0].setFill(tanks[0].getFill() - convert); @@ -71,7 +67,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidA this.subscribeToAllAround(tanks[0].getTankType(), this); this.sendFluidToAll(tanks[1], this); - fillFluidInit(tanks[1].getTankType()); data.setByte("timer", (byte) this.waterTimer); packExtra(data); INBTPacketReceiver.networkPack(this, data, 150); @@ -103,76 +98,6 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidA tanks[1].writeToNBT(nbt, "steam"); } - @Override - public void fillFluidInit(FluidType type) { - - for(ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - fillFluid(xCoord + dir.offsetX, yCoord + dir.offsetY, zCoord + dir.offsetZ, getTact(), type); - } - - @Override - public void fillFluid(int x, int y, int z, boolean newTact, FluidType type) { - Library.transmitFluid(x, y, z, newTact, this, worldObj, type); - } - - @Override - public boolean getTact() { - if(age == 0) - { - return true; - } - - return false; - } - - @Override - public void setFluidFill(int i, FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) - tanks[0].setFill(i); - else if(type.name().equals(tanks[1].getTankType().name())) - tanks[1].setFill(i); - } - - @Override - public int getFluidFill(FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) - return tanks[0].getFill(); - else if(type.name().equals(tanks[1].getTankType().name())) - return tanks[1].getFill(); - - return 0; - } - - @Override - public int getMaxFluidFill(FluidType type) { - if(type.name().equals(tanks[0].getTankType().name())) - return tanks[0].getMaxFill(); - - return 0; - } - - @Override - public void setFillForSync(int fill, int index) { - if(index < 2 && tanks[index] != null) - tanks[index].setFill(fill); - } - - @Override - public void setTypeForSync(FluidType type, int index) { - if(index < 2 && tanks[index] != null) - tanks[index].setTankType(type); - } - - @Override - public List getFluidList(FluidType type) { - return list; - } - - @Override - public void clearFluidList(FluidType type) { - list.clear(); - } - @Override public FluidTank[] getSendingTanks() { return new FluidTank[] {tanks [1]}; @@ -187,4 +112,10 @@ public class TileEntityCondenser extends TileEntityLoadedBase implements IFluidA public FluidTank[] getAllTanks() { return tanks; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, throughput); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, throughput); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java index 7bd58cf0a..8051f40ff 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityCondenserPowered.java @@ -91,8 +91,6 @@ public class TileEntityCondenserPowered extends TileEntityCondenser implements I tanks[1].writeToNBT(nbt, "steam"); } - @Deprecated @Override public void fillFluidInit(FluidType type) { } - @Override public void subscribeToAllAround(FluidType type, TileEntity te) { for(DirPos pos : getConPos()) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java index 4a7e3de46..367fd3b2a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityITER.java @@ -27,10 +27,12 @@ import com.hbm.packet.PacketDispatcher; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -44,7 +46,7 @@ import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IGUIProvider /* TODO: finish fluid API impl */ { +public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidSource, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { public long power; public static final long maxPower = 10000000; @@ -649,4 +651,12 @@ public class TileEntityITER extends TileEntityMachineBase implements IEnergyUser public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIITER(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.isOn && plasma.getFill() > 0); + int output = FusionRecipes.getSteamProduction(plasma.getTankType()); + data.setDouble("consumption", output * 10); + data.setDouble("outputmb", output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java index 618ce4f80..f538dff8a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineCyclotron.java @@ -30,12 +30,14 @@ import com.hbm.tileentity.IConditionalInvAccess; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -50,7 +52,7 @@ import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider { +public class TileEntityMachineCyclotron extends TileEntityMachineBase implements IFluidSource, IFluidAcceptor, IEnergyUser, IFluidStandardTransceiver, IGUIProvider, IConditionalInvAccess, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000000; @@ -613,4 +615,10 @@ public class TileEntityMachineCyclotron extends TileEntityMachineBase implements if(type == UpgradeType.EFFECT) return 3; return 0; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.isOn && this.progress > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_HE, this.progress > 0 ? consumption - 100_000 * getConsumption() : 0); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java index 6d68a4c76..5ef4699b0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineIGenerator.java @@ -18,11 +18,13 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IConfigurableMachine; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.RTGUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -37,7 +39,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineIGenerator extends TileEntityMachineBase implements IFluidAcceptor, IEnergyGenerator, IFluidStandardReceiver, IConfigurableMachine, IGUIProvider { +public class TileEntityMachineIGenerator extends TileEntityMachineBase implements IFluidAcceptor, IEnergyGenerator, IFluidStandardReceiver, IConfigurableMachine, IGUIProvider, IInfoProviderEC { public long power; public int spin; @@ -66,6 +68,8 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public static int waterRate = 10; public static int lubeRate = 1; public static long fluidHeatDiv = 1_000L; + + protected long output; @Override public String getConfigName() { @@ -219,7 +223,8 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement this.tanks[2].setFill(this.tanks[2].getFill() - lubeRate); } - this.power += this.spin * genMult; + this.output = (long) (this.spin * genMult); + this.power += this.output; if(this.power > this.maxPower) this.power = this.maxPower; @@ -385,4 +390,10 @@ public class TileEntityMachineIGenerator extends TileEntityMachineBase implement public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIIGenerator(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.output > 0); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java index e44e62e8a..c3977ba78 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadGen.java @@ -11,9 +11,11 @@ import com.hbm.items.special.ItemWasteLong; import com.hbm.items.special.ItemWasteShort; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.Tuple.Triplet; import api.hbm.energy.IEnergyGenerator; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -28,12 +30,13 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRadGen extends TileEntityMachineBase implements IEnergyGenerator, IGUIProvider { +public class TileEntityMachineRadGen extends TileEntityMachineBase implements IEnergyGenerator, IGUIProvider, IInfoProviderEC { public int[] progress = new int[12]; public int[] maxProgress = new int[12]; public int[] production = new int[12]; public ItemStack[] processing = new ItemStack[12]; + protected int output; public long power; public static final long maxPower = 1000000; @@ -53,6 +56,8 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE public void updateEntity() { if(!worldObj.isRemote) { + + this.output = 0; ForgeDirection dir = ForgeDirection.getOrientation(this.getBlockMetadata() - BlockDummyable.offset); this.sendPower(worldObj, this.xCoord - dir.offsetX * 4, this.yCoord, this.zCoord - dir.offsetZ * 4, dir.getOpposite()); @@ -82,6 +87,7 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE this.isOn = true; this.power += production[i]; + this.output += production[i]; progress[i]++; if(progress[i] >= maxProgress[i]) { @@ -290,4 +296,9 @@ public class TileEntityMachineRadGen extends TileEntityMachineBase implements IE public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineRadGen(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java index 1e63bd80f..cc5210787 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineRadiolysis.java @@ -19,12 +19,14 @@ import com.hbm.items.machine.ItemRTGPelletDepleted; import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.RTGUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -37,7 +39,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityMachineRadiolysis extends TileEntityMachineBase implements IEnergyGenerator, IFluidAcceptor, IFluidSource, IFluidContainer, IFluidStandardTransceiver, IGUIProvider { +public class TileEntityMachineRadiolysis extends TileEntityMachineBase implements IEnergyGenerator, IFluidAcceptor, IFluidSource, IFluidContainer, IFluidStandardTransceiver, IGUIProvider, IInfoProviderEC { public long power; public static final int maxPower = 1000000; @@ -384,4 +386,9 @@ public class TileEntityMachineRadiolysis extends TileEntityMachineBase implement public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIRadiolysis(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.heat * 10); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java index 42ac92f71..b565d8358 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineReactorBreeding.java @@ -8,7 +8,9 @@ import com.hbm.inventory.recipes.BreederRecipes; import com.hbm.inventory.recipes.BreederRecipes.BreederRecipe; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -28,7 +30,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineReactorBreeding extends TileEntityMachineBase implements SimpleComponent, IGUIProvider { +public class TileEntityMachineReactorBreeding extends TileEntityMachineBase implements SimpleComponent, IGUIProvider, IInfoProviderEC { public int flux; public float progress; @@ -251,4 +253,9 @@ public class TileEntityMachineReactorBreeding extends TileEntityMachineBase impl public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineReactorBreeding(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setInteger(CompatEnergyControl.I_FLUX, flux); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java index 9a92c3db8..6e784e6e7 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineTurbineGas.java @@ -19,9 +19,11 @@ import com.hbm.main.MainRegistry; import com.hbm.sound.AudioWrapper; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import api.hbm.energy.IEnergyGenerator; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -39,7 +41,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityMachineTurbineGas extends TileEntityMachineBase implements IFluidStandardTransceiver, IEnergyGenerator, IControlReceiver, IGUIProvider, SimpleComponent { +public class TileEntityMachineTurbineGas extends TileEntityMachineBase implements IFluidStandardTransceiver, IEnergyGenerator, IControlReceiver, IGUIProvider, SimpleComponent, IInfoProviderEC { public long power; public static final long maxPower = 1000000L; @@ -649,4 +651,15 @@ public class TileEntityMachineTurbineGas extends TileEntityMachineBase implement public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIMachineTurbineGas(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.state == 1); + data.setDouble(CompatEnergyControl.D_HEAT_C, Math.max(20D, this.temp)); + data.setDouble(CompatEnergyControl.D_TURBINE_PERCENT, this.powerSliderPos * 100D / 60D); + data.setInteger(CompatEnergyControl.I_TURBINE_SPEED, this.rpm); + data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.instantPowerOutput); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, this.waterToBoil); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, this.waterToBoil * 10); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java index 35f116b72..fb5b31782 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorResearch.java @@ -14,7 +14,9 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemPlateFuel; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -39,7 +41,7 @@ import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) //TODO: fix reactor control; -public class TileEntityReactorResearch extends TileEntityMachineBase implements IControlReceiver, SimpleComponent, IGUIProvider { +public class TileEntityReactorResearch extends TileEntityMachineBase implements IControlReceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { @SideOnly(Side.CLIENT) public double lastLevel; @@ -446,4 +448,11 @@ public class TileEntityReactorResearch extends TileEntityMachineBase implements public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIReactorResearch(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setDouble(CompatEnergyControl.D_HEAT_C, Math.round(heat * 2.0E-5D * 980.0D + 20.0D)); + data.setInteger(CompatEnergyControl.I_FLUX, totalFlux); + data.setInteger(CompatEnergyControl.I_WATER, water); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java index 2064b13f9..91286049a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityReactorZirnox.java @@ -28,10 +28,12 @@ import com.hbm.lib.Library; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.EnumUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.fluid.IFluidStandardTransceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.common.Optional; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -50,7 +52,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; @Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")}) -public class TileEntityReactorZirnox extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IControlReceiver, IFluidStandardTransceiver, SimpleComponent, IGUIProvider { +public class TileEntityReactorZirnox extends TileEntityMachineBase implements IFluidContainer, IFluidAcceptor, IFluidSource, IControlReceiver, IFluidStandardTransceiver, SimpleComponent, IGUIProvider, IInfoProviderEC { public int heat; public static final int maxHeat = 100000; @@ -64,6 +66,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF public FluidTank steam; public FluidTank carbonDioxide; public FluidTank water; + protected int output; private static final int[] slots_io = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23 }; @@ -188,6 +191,7 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF if(!worldObj.isRemote) { + this.output = 0; age++; if (age >= 20) { @@ -254,11 +258,11 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF // function of SHS produced per tick // (heat - 10256)/100000 * steamFill (max efficiency at 14b) * 25 * 5 (should get rid of any rounding errors) if(this.heat > 10256) { - int Water = (int)((((float)heat - 10256F) / (float)maxHeat) * Math.min(((float)carbonDioxide.getFill() / 14000F), 1F) * 25F * 5F); - int Steam = Water * 1; + int cycle = (int)((((float)heat - 10256F) / (float)maxHeat) * Math.min(((float)carbonDioxide.getFill() / 14000F), 1F) * 25F * 5F); + this.output = cycle; - water.setFill(water.getFill() - Water); - steam.setFill(steam.getFill() + Steam); + water.setFill(water.getFill() - cycle); + steam.setFill(steam.getFill() + cycle); if(water.getFill() < 0) water.setFill(0); @@ -606,4 +610,13 @@ public class TileEntityReactorZirnox extends TileEntityMachineBase implements IF public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUIReactorZirnox(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setDouble(CompatEnergyControl.D_HEAT_C, Math.round(heat * 1.0E-5D * 780.0D + 20.0D)); + data.setDouble(CompatEnergyControl.D_MAXHEAT_C, Math.round(maxHeat * 1.0E-5D * 780.0D + 20.0D)); + data.setLong(CompatEnergyControl.L_PRESSURE_BAR, Math.round(pressure * 1.0E-5D * 30.0D)); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, output); + data.setDouble(CompatEnergyControl.D_OUTPUT_MB, output); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java index 7148b06b1..ffaf2871f 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntitySILEX.java @@ -15,10 +15,12 @@ import com.hbm.items.ModItems; import com.hbm.items.machine.ItemFELCrystal.EnumWavelengths; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.InventoryUtil; import com.hbm.util.WeightedRandomObject; import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -32,7 +34,7 @@ import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntitySILEX extends TileEntityMachineBase implements IFluidAcceptor, IFluidStandardReceiver, IGUIProvider { +public class TileEntitySILEX extends TileEntityMachineBase implements IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, IInfoProviderEC { public EnumWavelengths mode = EnumWavelengths.NULL; public boolean hasLaser; @@ -373,4 +375,13 @@ public class TileEntitySILEX extends TileEntityMachineBase implements IFluidAcce public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) { return new GUISILEX(player.inventory, this); } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); + if(current == null) + data.setString("tank2", "N/A"); + else + data.setString("tank2", String.format("%s: %s mB", current.toStack().getDisplayName(), currentFill)); + } } \ No newline at end of file diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java index 03b16cf88..a68c62ae0 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerLarge.java @@ -16,8 +16,8 @@ public class TileEntityTowerLarge extends TileEntityCondenser { public TileEntityTowerLarge() { tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 10000, 0); - tanks[1] = new FluidTank(Fluids.WATER, 10000, 1); + tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 10000); + tanks[1] = new FluidTank(Fluids.WATER, 10000); } @Override @@ -43,18 +43,6 @@ public class TileEntityTowerLarge extends TileEntityCondenser { } } - @Override - public void fillFluidInit(FluidType type) { - - for(int i = 2; i < 6; i++) { - ForgeDirection dir = ForgeDirection.getOrientation(i); - ForgeDirection rot = dir.getRotation(ForgeDirection.UP); - fillFluid(xCoord + dir.offsetX * 5, yCoord, zCoord + dir.offsetZ * 5, getTact(), type); - fillFluid(xCoord + dir.offsetX * 5 + rot.offsetX * 3, yCoord, zCoord + dir.offsetZ * 5 + rot.offsetZ * 3, getTact(), type); - fillFluid(xCoord + dir.offsetX * 5 + rot.offsetX * -3, yCoord, zCoord + dir.offsetZ * 5 + rot.offsetZ * -3, getTact(), type); - } - } - @Override public void subscribeToAllAround(FluidType type, TileEntity te) { diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java index 7dbb010bb..248edec3a 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityTowerSmall.java @@ -11,14 +11,13 @@ import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; -import net.minecraftforge.common.util.ForgeDirection; public class TileEntityTowerSmall extends TileEntityCondenser { public TileEntityTowerSmall() { tanks = new FluidTank[2]; - tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 1000, 0); - tanks[1] = new FluidTank(Fluids.WATER, 1000, 1); + tanks[0] = new FluidTank(Fluids.SPENTSTEAM, 1000); + tanks[1] = new FluidTank(Fluids.WATER, 1000); } @Override @@ -59,15 +58,6 @@ public class TileEntityTowerSmall extends TileEntityCondenser { this.sendFluid(this.tanks[1], worldObj, xCoord, yCoord, zCoord + 3, Library.POS_Z); this.sendFluid(this.tanks[1], worldObj, xCoord, yCoord, zCoord - 3, Library.NEG_Z); } - - @Override - public void fillFluidInit(FluidType type) { - - for(int i = 2; i <= 6; i++) { - ForgeDirection dir = ForgeDirection.getOrientation(i); - fillFluid(xCoord + dir.offsetX * 3, yCoord, zCoord + dir.offsetZ * 3, getTact(), type); - } - } AxisAlignedBB bb = null; diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java index 2cd37bd61..f02c1f4b4 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineLiquefactor.java @@ -19,11 +19,13 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardSender; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -35,7 +37,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineLiquefactor extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineLiquefactor extends TileEntityMachineBase implements IEnergyUser, IFluidSource, IFluidStandardSender, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000; @@ -326,4 +328,10 @@ public class TileEntityMachineLiquefactor extends TileEntityMachineBase implemen if(type == UpgradeType.POWER) return 3; return 0; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_HE, this.usage); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java index 1f900c83b..cf7cb6319 100644 --- a/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java +++ b/src/main/java/com/hbm/tileentity/machine/oil/TileEntityMachineSolidifier.java @@ -16,12 +16,14 @@ import com.hbm.lib.Library; import com.hbm.tileentity.IGUIProvider; import com.hbm.tileentity.IUpgradeInfoProvider; import com.hbm.tileentity.TileEntityMachineBase; +import com.hbm.util.CompatEnergyControl; import com.hbm.util.I18nUtil; import com.hbm.util.Tuple.Pair; import com.hbm.util.fauxpointtwelve.DirPos; import api.hbm.energy.IEnergyUser; import api.hbm.fluid.IFluidStandardReceiver; +import api.hbm.tile.IInfoProviderEC; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.client.gui.GuiScreen; @@ -33,7 +35,7 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.EnumChatFormatting; import net.minecraft.world.World; -public class TileEntityMachineSolidifier extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider { +public class TileEntityMachineSolidifier extends TileEntityMachineBase implements IEnergyUser, IFluidAcceptor, IFluidStandardReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC { public long power; public static final long maxPower = 100000; @@ -302,4 +304,10 @@ public class TileEntityMachineSolidifier extends TileEntityMachineBase implement if(type == UpgradeType.POWER) return 3; return 0; } + + @Override + public void provideExtraInfo(NBTTagCompound data) { + data.setBoolean(CompatEnergyControl.B_ACTIVE, this.progress > 0); + data.setDouble(CompatEnergyControl.D_CONSUMPTION_HE, this.usage); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java index 823259e3d..37e97639f 100644 --- a/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java +++ b/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityCraneConsole.java @@ -80,16 +80,18 @@ public class TileEntityCraneConsole extends TileEntity implements INBTPacketRece goesDown = false; if(!worldObj.isRemote && this.canTargetInteract()) { - if(this.loadedItem != null) { - getColumnAtPos().load(this.loadedItem); - this.loadedItem = null; - } else { - IRBMKLoadable column = getColumnAtPos(); - this.loadedItem = column.provideNext(); - column.unload(); + IRBMKLoadable column = getColumnAtPos(); + if(column != null) { // canTargetInteract already assumes this, but there seems to be some freak race conditions that cause the column to be null anyway + if(this.loadedItem != null) { + column.load(this.loadedItem); + this.loadedItem = null; + } else { + this.loadedItem = column.provideNext(); + column.unload(); + } + + this.markDirty(); } - - this.markDirty(); } } diff --git a/src/main/java/com/hbm/util/CompatEnergyControl.java b/src/main/java/com/hbm/util/CompatEnergyControl.java index e6c4ff387..7f60115fa 100644 --- a/src/main/java/com/hbm/util/CompatEnergyControl.java +++ b/src/main/java/com/hbm/util/CompatEnergyControl.java @@ -139,6 +139,7 @@ public class CompatEnergyControl { public static final String S_LEVEL_PERCENT = "level"; // Research Reactor rods @Deprecated public static final String L_HEATL = "heatL"; // AMS and old Watz heat values public static final String D_HEAT_C = "heat"; // Research Reactor and RBMK column heat + public static final String D_MAXHEAT_C = "maxHeat"; // ZIRNOX melting temp public static final String L_PRESSURE_BAR = "bar"; // ZIRNOX pressure public static final String L_FUEL = "fuel"; // RTG Blast Furnace heat @Deprecated public static final String S_FUELTEXT = "fuelText"; // Large Nuclear Reactor only diff --git a/src/main/resources/assets/hbm/textures/items/australium_iii.png b/src/main/resources/assets/hbm/textures/items/australium_iii.png index 5a876c2b6676bc8808c68dda718810c8ade144a9..04cef8027883fa0f6429e517260a122bdde9ce7b 100644 GIT binary patch delta 256 zcmV+b0ssD*0;~d%G=JksL_t(IjjfVBZo@DPMxTNX&XS=6b%ab@3-koJP;S&EH|YU1 zc}quXXaP^&*g;n6G?v?-eSiQ_B0v5}@JB-HLREckr<4|b1AxEc>>)fBTUFi6t{h{G z7ZHEQ=^;E59+onj8E-F{ZdcC60iKQ#5%HY!RVAD1KtCx@ba^{qUse^GXCH@|!1h3> zB0n+(Zx5y2OAGZt6>r5t>3eS9%%Cz3(Dh&Y7EJ;BfH>RVg{r!U`1ypNPk6PLd^dM$ z-|(xSXl8tW|4MTP04XIzWVM3T7DR-c^QyoqBGMe*zwrq-o>j{Do{Y-?0000l`Pt6Abpq!c oh-fir(SV5HoLe+lL!a?KUd$3t2`%1Q761SM07*qoM6N<$f(qPii2wiq From 65cda2b65b6fc6a5f843964b4895f8930fb8d277 Mon Sep 17 00:00:00 2001 From: Bob Date: Fri, 16 Feb 2024 22:07:17 +0100 Subject: [PATCH 6/6] almost forgot about this one --- .../hbm/handler/nei/BoilerRecipeHandler.java | 121 +++++++++--------- .../hbm/handler/nei/HydrotreatingHandler.java | 16 +++ .../hbm/inventory/gui/GUILaunchPadLarge.java | 4 +- .../recipes/HydrotreatingRecipes.java | 2 +- .../com/hbm/items/weapon/ItemMissile.java | 1 + src/main/java/com/hbm/main/NEIConfig.java | 1 + .../bomb/TileEntityLaunchPadLarge.java | 104 +++++++-------- .../models/launchpad/erector_atlas.png | Bin 3599 -> 14476 bytes .../models/launchpad/erector_huge.png | Bin 2310 -> 10488 bytes 9 files changed, 132 insertions(+), 117 deletions(-) create mode 100644 src/main/java/com/hbm/handler/nei/HydrotreatingHandler.java diff --git a/src/main/java/com/hbm/handler/nei/BoilerRecipeHandler.java b/src/main/java/com/hbm/handler/nei/BoilerRecipeHandler.java index 5d966c2b8..776261ac4 100644 --- a/src/main/java/com/hbm/handler/nei/BoilerRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/BoilerRecipeHandler.java @@ -17,34 +17,33 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; public class BoilerRecipeHandler extends TemplateRecipeHandler { - - public LinkedList transferRectsRec = new LinkedList(); - public LinkedList transferRectsGui = new LinkedList(); - public LinkedList> guiRec = new LinkedList>(); - public LinkedList> guiGui = new LinkedList>(); - public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe - { - PositionedStack input; - PositionedStack result; - - public SmeltingSet(ItemStack input, ItemStack result) { - input.stackSize = 1; - this.input = new PositionedStack(input, 21 + 9, 6 + 18); - this.result = new PositionedStack(result, 120, 24); - } + public LinkedList transferRectsRec = new LinkedList(); + public LinkedList transferRectsGui = new LinkedList(); + public LinkedList> guiRec = new LinkedList>(); + public LinkedList> guiGui = new LinkedList>(); - @Override + public class SmeltingSet extends TemplateRecipeHandler.CachedRecipe { + PositionedStack input; + PositionedStack result; + + public SmeltingSet(ItemStack input, ItemStack result) { + input.stackSize = 1; + this.input = new PositionedStack(input, 21 + 9, 6 + 18); + this.result = new PositionedStack(result, 120, 24); + } + + @Override public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] {input})); - } + return getCycledIngredients(cycleticks / 48, Arrays.asList(new PositionedStack[] { input })); + } - @Override + @Override public PositionedStack getResult() { - return result; - } - } - + return result; + } + } + @Override public String getRecipeName() { return "Boiler"; @@ -55,23 +54,22 @@ public class BoilerRecipeHandler extends TemplateRecipeHandler { return RefStrings.MODID + ":textures/gui/nei/gui_nei_boiler.png"; } - @Override - public Class getGuiClass() { - return null; - } + @Override + public Class getGuiClass() { + return null; + } + + @Override + public TemplateRecipeHandler newInstance() { + return super.newInstance(); + } - @Override - public TemplateRecipeHandler newInstance() { - return super.newInstance(); - } - @Override public void loadCraftingRecipes(String outputId, Object... results) { - if ((outputId.equals("ntmboiler")) && getClass() == BoilerRecipeHandler.class) { + if((outputId.equals("ntmboiler")) && getClass() == BoilerRecipeHandler.class) { Map recipes = MachineRecipes.instance().getBoilerRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey(), - (ItemStack)recipe.getValue())); + for(Map.Entry recipe : recipes.entrySet()) { + this.arecipes.add(new SmeltingSet((ItemStack) recipe.getKey(), (ItemStack) recipe.getValue())); } } else { super.loadCraftingRecipes(outputId, results); @@ -81,17 +79,15 @@ public class BoilerRecipeHandler extends TemplateRecipeHandler { @Override public void loadCraftingRecipes(ItemStack result) { Map recipes = MachineRecipes.instance().getBoilerRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (compareFluidStacks((ItemStack)recipe.getValue(), result) || - compareFluidStacks((ItemStack)recipe.getValue(), result)) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey(), - (ItemStack)recipe.getValue())); + for(Map.Entry recipe : recipes.entrySet()) { + if(compareFluidStacks((ItemStack) recipe.getValue(), result) || compareFluidStacks((ItemStack) recipe.getValue(), result)) + this.arecipes.add(new SmeltingSet((ItemStack) recipe.getKey(), (ItemStack) recipe.getValue())); } } @Override public void loadUsageRecipes(String inputId, Object... ingredients) { - if ((inputId.equals("ntmboiler")) && getClass() == BoilerRecipeHandler.class) { + if((inputId.equals("ntmboiler")) && getClass() == BoilerRecipeHandler.class) { loadCraftingRecipes("ntmboiler", new Object[0]); } else { super.loadUsageRecipes(inputId, ingredients); @@ -101,32 +97,31 @@ public class BoilerRecipeHandler extends TemplateRecipeHandler { @Override public void loadUsageRecipes(ItemStack ingredient) { Map recipes = MachineRecipes.instance().getBoilerRecipes(); - for (Map.Entry recipe : recipes.entrySet()) { - if (compareFluidStacks(ingredient, (ItemStack)recipe.getKey())) - this.arecipes.add(new SmeltingSet((ItemStack)recipe.getKey(), - (ItemStack)recipe.getValue())); + for(Map.Entry recipe : recipes.entrySet()) { + if(compareFluidStacks(ingredient, (ItemStack) recipe.getKey())) + this.arecipes.add(new SmeltingSet((ItemStack) recipe.getKey(), (ItemStack) recipe.getValue())); } } - + private boolean compareFluidStacks(ItemStack sta1, ItemStack sta2) { return sta1.getItem() == sta2.getItem() && sta1.getItemDamage() == sta2.getItemDamage(); } - @Override - public void drawExtras(int recipe) { - drawProgressBar(80, 23, 0, 85, 6, 17, 240, 3); - } - - @Override - public void loadTransferRects() { - transferRectsGui = new LinkedList(); - guiGui = new LinkedList>(); + @Override + public void drawExtras(int recipe) { + drawProgressBar(80, 23, 0, 85, 6, 17, 240, 3); + } - transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 36 - 27 - 9, 23, 36, 18), "ntmboiler")); - transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2 + 36, 89 - 29 - 18 - 18, 18, 18 * 2), "ntmboiler")); - guiGui.add(GUIMachineBoiler.class); - guiGui.add(GUIMachineBoilerElectric.class); - RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); - RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); - } + @Override + public void loadTransferRects() { + transferRectsGui = new LinkedList(); + guiGui = new LinkedList>(); + + transferRects.add(new RecipeTransferRect(new Rectangle(138 - 1 - 36 - 27 - 9, 23, 36, 18), "ntmboiler")); + transferRectsGui.add(new RecipeTransferRect(new Rectangle(18 * 2 + 2 + 36, 89 - 29 - 18 - 18, 18, 18 * 2), "ntmboiler")); + guiGui.add(GUIMachineBoiler.class); + guiGui.add(GUIMachineBoilerElectric.class); + RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); + RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); + } } diff --git a/src/main/java/com/hbm/handler/nei/HydrotreatingHandler.java b/src/main/java/com/hbm/handler/nei/HydrotreatingHandler.java new file mode 100644 index 000000000..81a932ddb --- /dev/null +++ b/src/main/java/com/hbm/handler/nei/HydrotreatingHandler.java @@ -0,0 +1,16 @@ +package com.hbm.handler.nei; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.recipes.HydrotreatingRecipes; + +public class HydrotreatingHandler extends NEIUniversalHandler { + + public HydrotreatingHandler() { + super("Hydrotreating", ModBlocks.machine_hydrotreater, HydrotreatingRecipes.getRecipes()); + } + + @Override + public String getKey() { + return "ntmHydrotreating"; + } +} diff --git a/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java b/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java index e144595e2..713ff71d7 100644 --- a/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java +++ b/src/main/java/com/hbm/inventory/gui/GUILaunchPadLarge.java @@ -38,8 +38,8 @@ public class GUILaunchPadLarge extends GuiInfoContainer { super.drawScreen(mouseX, mouseY, f); this.drawElectricityInfo(this, mouseX, mouseY, guiLeft + 107, guiTop + 88 - 52, 16, 52, launchpad.power, launchpad.maxPower); - launchpad.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 70 - 52, 16, 52); - launchpad.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 70 - 52, 16, 52); + launchpad.tanks[0].renderTankInfo(this, mouseX, mouseY, guiLeft + 125, guiTop + 88 - 52, 16, 52); + launchpad.tanks[1].renderTankInfo(this, mouseX, mouseY, guiLeft + 143, guiTop + 88 - 52, 16, 52); } @Override diff --git a/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java index 5836457a5..620d5b490 100644 --- a/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/HydrotreatingRecipes.java @@ -71,7 +71,7 @@ public class HydrotreatingRecipes extends SerializableRecipe { for(Entry> recipe : recipes.entrySet()) { map.put(new ItemStack[] { ItemFluidIcon.make(recipe.getKey(), 1000), - ItemFluidIcon.make(recipe.getValue().getX().type, recipe.getValue().getX().fill * 10) }, + ItemFluidIcon.make(recipe.getValue().getX().type, recipe.getValue().getX().fill * 10, 1) }, new ItemStack[] { ItemFluidIcon.make(recipe.getValue().getY().type, recipe.getValue().getY().fill * 10), ItemFluidIcon.make(recipe.getValue().getZ().type, recipe.getValue().getZ().fill * 10) }); diff --git a/src/main/java/com/hbm/items/weapon/ItemMissile.java b/src/main/java/com/hbm/items/weapon/ItemMissile.java index 1f2023494..74ac62c42 100644 --- a/src/main/java/com/hbm/items/weapon/ItemMissile.java +++ b/src/main/java/com/hbm/items/weapon/ItemMissile.java @@ -35,6 +35,7 @@ public class ItemMissile extends ItemCustomLore { public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean bool) { list.add(EnumChatFormatting.ITALIC + this.tier.display); list.add("Fuel: " + this.fuel.display); + if(this.fuelCap > 0) list.add("Fuel capacity: " + this.fuelCap + "mB"); super.addInformation(itemstack, player, list, bool); } diff --git a/src/main/java/com/hbm/main/NEIConfig.java b/src/main/java/com/hbm/main/NEIConfig.java index 8ee671107..d97c3e50f 100644 --- a/src/main/java/com/hbm/main/NEIConfig.java +++ b/src/main/java/com/hbm/main/NEIConfig.java @@ -42,6 +42,7 @@ public class NEIConfig implements IConfigureNEI { registerHandler(new VacuumRecipeHandler()); registerHandler(new CrackingHandler()); registerHandler(new ReformingHandler()); + registerHandler(new HydrotreatingHandler()); registerHandler(new BoilerRecipeHandler()); registerHandler(new ChemplantRecipeHandler()); registerHandler(new CrystallizerRecipeHandler()); diff --git a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java index cf826d0d4..32cbc093b 100644 --- a/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java +++ b/src/main/java/com/hbm/tileentity/bomb/TileEntityLaunchPadLarge.java @@ -75,60 +75,62 @@ public class TileEntityLaunchPadLarge extends TileEntityLaunchPadBase implements delay = 20; } - if(delay > 0) { - delay--; - - if(delay < 10 && scheduleErect) { - this.erected = true; - this.scheduleErect = false; - } - - // if there is no missile or the missile isn't ready (i.e. the erector hasn't returned to zero position yet), retract - if(slots[0] == null || !readyToLoad) { - //fold back erector - if(erector < 90F) { - erector = Math.min(erector + erectorSpeed, 90F); - if(erector == 90F) delay = 20; - //extend lift - } else if(lift < 1F) { - lift = Math.min(lift + liftSpeed, 1F); - if(erector == 1F) { - //if the lift is fully extended, the loading can begin - readyToLoad = true; - delay = 20; - } - } - } - - } else { - - //only extend if the erector isn't up yet and the missile can be loaded - if(!erected && readyToLoad) { - //first, rotate the erector - if(erector != 0F) { - erector = Math.max(erector - erectorSpeed, 0F); - if(erector == 0F) delay = 20; - //then retract the lift - } else if(lift > 0) { - lift = Math.max(lift - liftSpeed, 0F); - if(lift == 0F) { - //once the lift is at the bottom, the missile is deployed - scheduleErect = true; - delay = 20; + if(this.power >= 75_000) { + if(delay > 0) { + delay--; + + if(delay < 10 && scheduleErect) { + this.erected = true; + this.scheduleErect = false; + } + + // if there is no missile or the missile isn't ready (i.e. the erector hasn't returned to zero position yet), retract + if(slots[0] == null || !readyToLoad) { + //fold back erector + if(erector < 90F) { + erector = Math.min(erector + erectorSpeed, 90F); + if(erector == 90F) delay = 20; + //extend lift + } else if(lift < 1F) { + lift = Math.min(lift + liftSpeed, 1F); + if(erector == 1F) { + //if the lift is fully extended, the loading can begin + readyToLoad = true; + delay = 20; + } } } + } else { - //first, fold back the erector - if(erector < 90F) { - erector = Math.min(erector + erectorSpeed, 90F); - if(erector == 90F) delay = 20; - //then extend the lift again - } else if(lift < 1F) { - lift = Math.min(lift + liftSpeed, 1F); - if(erector == 1F) { - //if the lift is fully extended, the loading can begin - readyToLoad = true; - delay = 20; + + //only extend if the erector isn't up yet and the missile can be loaded + if(!erected && readyToLoad) { + //first, rotate the erector + if(erector != 0F) { + erector = Math.max(erector - erectorSpeed, 0F); + if(erector == 0F) delay = 20; + //then retract the lift + } else if(lift > 0) { + lift = Math.max(lift - liftSpeed, 0F); + if(lift == 0F) { + //once the lift is at the bottom, the missile is deployed + scheduleErect = true; + delay = 20; + } + } + } else { + //first, fold back the erector + if(erector < 90F) { + erector = Math.min(erector + erectorSpeed, 90F); + if(erector == 90F) delay = 20; + //then extend the lift again + } else if(lift < 1F) { + lift = Math.min(lift + liftSpeed, 1F); + if(erector == 1F) { + //if the lift is fully extended, the loading can begin + readyToLoad = true; + delay = 20; + } } } } diff --git a/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png b/src/main/resources/assets/hbm/textures/models/launchpad/erector_atlas.png index 279b1a92de02f7d5a29dd44cc0b0f7f5f6151f03..0513ab1247ff7c8ed8b5c28a4b7305646ca32f65 100644 GIT binary patch literal 14476 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 literal 2310 zcma)8e>~Is8lUE#Mme11R69(a+f8!(=q4RaHspwmW6_Qgu`7$DbjVgSu8b6J$Bkml z5(=|w=Eueg$B!dpVHpdZtC?RjjP1;fv&uQQ+qtj%y5B#(-|y@7d_K?fexCQ|{XC!R z-+H;}>4J3u0DzwRv7<-;K+9J1{|xkr=AFJo*{%6#UvhT$1!zp(Yc$OHwm@dcV1EQQnC$5+^Yo4>Z|4z}WDH zH)weQ#A_YQ<6=&4?by^|@H7!H^_p#*wdXI$l?pdXPpFCOt*6;EIwf`GR_B&vbV)T0 zT{uuV8i%Vv^BaoBjiPeH{ZBHceJXofIu+4Y3yX8zJurmS+xCargrMcz1=l>eH2R#P z6as(;Yl96)aA0$M^pqCB5MM)c{6=}7f{E5Y8J)EY)^P$~V9F^NnC{0q?6cjuIq8#Y zyLgE<#x9sLNf}=@k=I#x2r75-)L*D2a=N2UP5-sT8pOX{X#^%esc69Ch6j6COQ!s< zOzYt&s#eGYUSiX$t|QZj^=alt?;{&v;oCE*TFJPAkr6swHqVF}!8+d8)dLmBrqm$T zD(ZpLeY3^x=Ay}aF}R$BGi~;dvNcwhBCQb6zad5R#8maVN(Q@P@rMOF+GAS>d;M5~ zml@(@u5~Kd!h&FsB_h z){-&ThVC@!7(eyOb)@yS#yyZT5O<>N@+E<$z_H1z$kS>2$|ZJU9y-E41m8#&%^c{j zzWa=dt|i9~pvQq5UsOf9u3LAFQ@K=Te@yeDvo;v+;dFlP>(rOX=Q@3xeE!3L_Odk7 z-g3`5-zD;)=-Olo$Tsnx)nv36X!p?+yY(HPVFBi6?U`hQV`;ikpVCTl3`#_vXyGiw%PJ% z(eK3=GDaV_G>fH$8MdZZRT)__b7)&FSRFL17|!;@i56H4O6;_CL=H4S*VbsgE)EDp z=53~5QhR-1Jr>dZ*r0#<{^vm`$5 z2|a=qzgZGPU^o19m%C@y*yV~XSMrRsA$5`ODMR+Z5ukIAQ__u4!;hIAGVYWyp-93;^puxL;T>O8<(9D5(w2u{ zErQEC*JQBS1T|&VUvM%(Rrk}5F4pzB)}2LzdPW6akR!6)oaP9QgF1hFISKYvhJUa8clBirLYNnul zDXJEVva$X^*z3*Utt2%Li)9YgENS04l{!CmdX1z0N1|bgGq8Ex`jG(T-7ZilRH$rB zAs#oCTve-83hBy&du*^d}(h%)E8Hv3gj>* zL2)42-bd3SJ`nW>a2RVr-I!W0zN`*R447a@YWT~CR(%*NZps2vSVD|icG#MZi(+1a zgr101G+C^Mj&6ex$>q7kU_p2I!Dx@+1@FQ`!JK2b<;x*Tx^9nAZrSa#_)GVG%O_*- z0b5T+Hg4JOeHUKLbnTqZx^6PDXD*q`1d*A{HQS6@i^6t!Jc=4^)M9YwiDuSO6Aye^0{CGdPQO4_39EhAAPY6vtELXcd zvM~PKq=Ld42#Wi9_TZ24DT5ckrM@`k2U_H}-EIke0Q@EOCaMA#s11hd`Q6>jZ_^`$ zCgBXRGfcY2}R z(b<9Ikv+B?XL=4YEl-^|i!#F3ypbF4l(IRDjnvr*wM1_EeVB z5&_1<2w^sm4`$QoK8=61vI#+&%XU|c5Z3xQS1zD^-^=NbdAD`ruqa`* zN#sr+OJoit%p4jI?5Sy4H3<|YpNF*h22gbvtMS$$#7#T3Av28_ xO9Mf1174Y3In1|2O;3p`_zzP3{s?cLXf#!azvZsltGU*MoZSMd8