From ccd460fe9e0bc3ad9ef6db8845be3e166ff79e36 Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 6 Nov 2022 18:50:22 +0100 Subject: [PATCH] more jar worlds, fixed centrifuge NEI handler, custom block highlighting --- .../java/com/hbm/blocks/BlockDummyable.java | 37 ++- .../com/hbm/blocks/ICustomBlockHighlight.java | 32 +++ .../hbm/blocks/machine/MachineCentrifuge.java | 6 +- .../hbm/blocks/machine/MachineCrucible.java | 39 +++ .../projectile/EntityArtilleryRocket.java | 2 +- .../handler/nei/CentrifugeRecipeHandler.java | 161 +------------ .../hbm/handler/nei/NEIUniversalHandler.java | 11 +- .../java/com/hbm/inventory/material/Mats.java | 2 +- .../inventory/recipes/CentrifugeRecipes.java | 7 +- .../java/com/hbm/items/machine/ItemMold.java | 2 +- .../com/hbm/items/weapon/ItemAmmoArty.java | 10 +- src/main/java/com/hbm/lib/RefStrings.java | 2 +- .../com/hbm/main/ModEventHandlerClient.java | 2 +- .../com/hbm/main/ModEventHandlerRenderer.java | 28 ++- .../hbm/render/tileentity/RenderCrucible.java | 20 +- .../hbm/render/tileentity/RenderFENSU.java | 3 +- .../hbm/render/tileentity/RenderFoundry.java | 20 +- .../hbm/render/tileentity/RenderStirling.java | 3 +- .../machine/TileEntityMachineMiningLaser.java | 2 +- .../java/com/hbm/wiaj/GuiWorldInAJar.java | 40 +++- .../com/hbm/wiaj/actors/ActorBasicPanel.java | 3 +- .../com/hbm/wiaj/actors/ActorFancyPanel.java | 4 +- .../com/hbm/wiaj/actors/ActorTileEntity.java | 5 +- .../com/hbm/wiaj/actors/ActorVillager.java | 3 +- .../com/hbm/wiaj/actors/ISpecialActor.java | 5 +- .../hbm/wiaj/actors/ITileActorRenderer.java | 4 +- .../com/hbm/wiaj/cannery/CanneryBase.java | 2 +- .../hbm/wiaj/cannery/CanneryCentrifuge.java | 2 +- .../com/hbm/wiaj/cannery/CanneryCrucible.java | 226 ++++++++++++++++++ .../com/hbm/wiaj/cannery/CanneryFirebox.java | 2 +- .../wiaj/cannery/CanneryFoundryChannel.java | 185 ++++++++++++++ .../com/hbm/wiaj/cannery/CannerySILEX.java | 4 +- .../com/hbm/wiaj/cannery/CanneryStirling.java | 2 +- src/main/java/com/hbm/wiaj/cannery/Jars.java | 2 + src/main/resources/assets/hbm/lang/en_US.lang | 21 ++ .../textures/gui/processing/gui_crucible.png | Bin 11451 -> 11428 bytes .../textures/models/machines/heating_oven.png | Bin 6993 -> 7405 bytes src/main/resources/mcmod.info | 2 +- 38 files changed, 700 insertions(+), 201 deletions(-) create mode 100644 src/main/java/com/hbm/blocks/ICustomBlockHighlight.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryCrucible.java create mode 100644 src/main/java/com/hbm/wiaj/cannery/CanneryFoundryChannel.java diff --git a/src/main/java/com/hbm/blocks/BlockDummyable.java b/src/main/java/com/hbm/blocks/BlockDummyable.java index 908c9316a..2cacd54f1 100644 --- a/src/main/java/com/hbm/blocks/BlockDummyable.java +++ b/src/main/java/com/hbm/blocks/BlockDummyable.java @@ -8,8 +8,11 @@ import com.hbm.handler.MultiblockHandlerXR; import com.hbm.handler.ThreeInts; import com.hbm.main.MainRegistry; import com.hbm.tileentity.IPersistentNBT; +import com.hbm.tileentity.machine.TileEntityCrucible; 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; @@ -27,9 +30,10 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.common.util.ForgeDirection; -public abstract class BlockDummyable extends BlockContainer { +public abstract class BlockDummyable extends BlockContainer implements ICustomBlockHighlight { public BlockDummyable(Material mat) { super(mat); @@ -473,4 +477,35 @@ public abstract class BlockDummyable extends BlockContainer { this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.999F, 1.0F); //for some fucking reason setting maxY to something that isn't 1 magically fixes item collisions } } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldDrawHighlight(World world, int x, int y, int z) { + return !this.bounding.isEmpty(); + } + + @Override + @SideOnly(Side.CLIENT) + public void drawHighlight(DrawBlockHighlightEvent event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(tile == null) return; + + x = tile.xCoord; + y = tile.yCoord; + z = tile.zCoord; + + EntityPlayer player = event.player; + float interp = event.partialTicks; + double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) interp; + double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) interp; + double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; + float exp = 0.002F; + + ICustomBlockHighlight.setup(); + for(AxisAlignedBB aabb : this.bounding) event.context.drawOutlinedBoundingBox(aabb.expand(exp, exp, exp).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1); + ICustomBlockHighlight.cleanup(); + } } diff --git a/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java b/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java new file mode 100644 index 000000000..509ddab95 --- /dev/null +++ b/src/main/java/com/hbm/blocks/ICustomBlockHighlight.java @@ -0,0 +1,32 @@ +package com.hbm.blocks; + +import org.lwjgl.opengl.GL11; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.client.renderer.OpenGlHelper; +import net.minecraft.world.World; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; + +public interface ICustomBlockHighlight { + + @SideOnly(Side.CLIENT) public boolean shouldDrawHighlight(World world, int x, int y, int z); + @SideOnly(Side.CLIENT) public void drawHighlight(DrawBlockHighlightEvent event, World world, int x, int y, int z); + + @SideOnly(Side.CLIENT) + public static void setup() { + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glColor4f(0.0F, 0.0F, 0.0F, 0.4F); + GL11.glLineWidth(2.0F); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glDepthMask(false); + } + + @SideOnly(Side.CLIENT) + public static void cleanup() { + GL11.glDepthMask(true); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + } +} diff --git a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java index 026c67bfc..38584888d 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCentrifuge.java @@ -2,7 +2,6 @@ package com.hbm.blocks.machine; import com.hbm.blocks.BlockDummyable; import com.hbm.blocks.ModBlocks; -import com.hbm.interfaces.IMultiblock; import com.hbm.main.MainRegistry; import com.hbm.tileentity.TileEntityProxyCombo; import com.hbm.tileentity.machine.TileEntityMachineCentrifuge; @@ -11,13 +10,16 @@ import cpw.mods.fml.common.network.internal.FMLNetworkHandler; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -public class MachineCentrifuge extends BlockDummyable implements IMultiblock { +public class MachineCentrifuge extends BlockDummyable { public MachineCentrifuge(Material mat) { super(mat); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.5D, 0D, -0.5D, 0.5D, 1D, 0.5D)); + this.bounding.add(AxisAlignedBB.getBoundingBox(-0.375D, 1D, -0.375D, 0.375D, 4D, 0.375D)); } @Override diff --git a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java index 702ca3195..e69d9ef41 100644 --- a/src/main/java/com/hbm/blocks/machine/MachineCrucible.java +++ b/src/main/java/com/hbm/blocks/machine/MachineCrucible.java @@ -4,12 +4,15 @@ import java.util.ArrayList; import java.util.List; import com.hbm.blocks.BlockDummyable; +import com.hbm.blocks.ICustomBlockHighlight; import com.hbm.inventory.material.Mats.MaterialStack; import com.hbm.items.machine.ItemScraps; import com.hbm.main.MainRegistry; import com.hbm.tileentity.machine.TileEntityCrucible; 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.material.Material; import net.minecraft.entity.item.EntityItem; @@ -19,6 +22,7 @@ import net.minecraft.item.ItemTool; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.World; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; public class MachineCrucible extends BlockDummyable { @@ -113,4 +117,39 @@ public class MachineCrucible extends BlockDummyable { super.breakBlock(world, x, y, z, b, i); } + + @Override + @SideOnly(Side.CLIENT) + public boolean shouldDrawHighlight(World world, int x, int y, int z) { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void drawHighlight(DrawBlockHighlightEvent event, World world, int x, int y, int z) { + + int[] pos = this.findCore(world, x, y, z); + if(pos == null) return; + TileEntity tile = world.getTileEntity(pos[0], pos[1], pos[2]); + if(!(tile instanceof TileEntityCrucible)) return; + TileEntityCrucible crucible = (TileEntityCrucible) tile; + + x = crucible.xCoord; + y = crucible.yCoord; + z = crucible.zCoord; + + EntityPlayer player = event.player; + float interp = event.partialTicks; + double dX = player.lastTickPosX + (player.posX - player.lastTickPosX) * (double) interp; + double dY = player.lastTickPosY + (player.posY - player.lastTickPosY) * (double) interp; + double dZ = player.lastTickPosZ + (player.posZ - player.lastTickPosZ) * (double)interp; + float exp = 0.002F; + + ICustomBlockHighlight.setup(); + /*event.context.drawOutlinedBoundingBox(AxisAlignedBB.getBoundingBox(x - 1, y, z - 1, x + 2, y + 0.5, z + 2).expand(exp, exp, exp).getOffsetBoundingBox(-dX, -dY, -dZ), -1); + event.context.drawOutlinedBoundingBox(AxisAlignedBB.getBoundingBox(x - 0.75, y + 0.5, z - 0.75, x + 1.75, y + 1.5, z + 1.75).expand(exp, exp, exp).getOffsetBoundingBox(-dX, -dY, -dZ), -1); + event.context.drawOutlinedBoundingBox(AxisAlignedBB.getBoundingBox(x - 0.5, y + 0.75, z - 0.5, x + 1.5, y + 1.5, z + 1.5).expand(exp, exp, exp).getOffsetBoundingBox(-dX, -dY, -dZ), -1);*/ + for(AxisAlignedBB aabb : this.bounding) event.context.drawOutlinedBoundingBox(aabb.expand(exp, exp, exp).getOffsetBoundingBox(x - dX + 0.5, y - dY, z - dZ + 0.5), -1); + ICustomBlockHighlight.cleanup(); + } } diff --git a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java index e88879b95..16ae47552 100644 --- a/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java +++ b/src/main/java/com/hbm/entity/projectile/EntityArtilleryRocket.java @@ -152,7 +152,7 @@ public class EntityArtilleryRocket extends EntityThrowableInterp implements IChu int minX = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); int maxX = Math.max(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); - int minZ = Math.min(newChunkX, newChunkX + (int) Math.ceil((this.posX + this.motionX) / 16D)); + int minZ = Math.min(newChunkZ, newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D)); int maxZ = Math.max(newChunkZ, newChunkZ + (int) Math.ceil((this.posZ + this.motionZ) / 16D)); for(int x = minX; x <= maxX; x++) { diff --git a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java index 599049cca..1acd56e2a 100644 --- a/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java +++ b/src/main/java/com/hbm/handler/nei/CentrifugeRecipeHandler.java @@ -1,166 +1,27 @@ package com.hbm.handler.nei; import java.awt.Rectangle; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import com.hbm.inventory.RecipesCommon; +import com.hbm.blocks.ModBlocks; import com.hbm.inventory.gui.GUIMachineCentrifuge; import com.hbm.inventory.recipes.CentrifugeRecipes; -import com.hbm.inventory.recipes.MachineRecipes; -import codechicken.nei.NEIServerUtils; -import codechicken.nei.PositionedStack; -import codechicken.nei.recipe.TemplateRecipeHandler; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.item.ItemStack; +public class CentrifugeRecipeHandler extends NEIUniversalHandler { -public class CentrifugeRecipeHandler extends TemplateRecipeHandler { - - public static ArrayList fuels; - - public class RecipeSet extends TemplateRecipeHandler.CachedRecipe { - PositionedStack input; - PositionedStack result1; - PositionedStack result2; - PositionedStack result3; - PositionedStack result4; - - public RecipeSet(Object input, ItemStack[] results) { - this.input = new PositionedStack(input, 21, 6); - this.result1 = new PositionedStack(results[0], 129, 6); - this.result2 = new PositionedStack(results[1], 147, 6); - this.result3 = new PositionedStack(results[2], 129, 42); - this.result4 = new PositionedStack(results[3], 147, 42); - } - - @Override - public List getIngredients() { - return getCycledIngredients(cycleticks / 48, Arrays.asList(input)); - } - - @Override - public List getOtherStacks() { - List stacks = new ArrayList(); - stacks.add(fuels.get((cycleticks / 48) % fuels.size()).stack); - stacks.add(result2); - stacks.add(result3); - stacks.add(result4); - return stacks; - } - - @Override - public PositionedStack getResult() { - return result1; - } - } - - public static class Fuel { - public Fuel(ItemStack ingred) { - - this.stack = new PositionedStack(ingred, 21, 42, false); - } - - public PositionedStack stack; + public CentrifugeRecipeHandler() { + super("Centrifuge", ModBlocks.machine_centrifuge, CentrifugeRecipes.getRecipes()); } @Override - public String getRecipeName() { - return "Centrifuge"; + public String getKey() { + return "ntmCentrifuge"; } - - @Override - public String getGuiTexture() { - return GUIMachineCentrifuge.texture.toString(); - } - - @Override - public Class getGuiClass() { - return GUIMachineCentrifuge.class; - } - - @Override - public TemplateRecipeHandler newInstance() { - if(fuels == null || fuels.isEmpty()) - fuels = new ArrayList(); - for(ItemStack i : MachineRecipes.instance().getBatteries()) { - fuels.add(new Fuel(i)); - } - return super.newInstance(); - } - - @Override - public void loadCraftingRecipes(String outputId, Object... results) { - - if((outputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { - - Map recipes = CentrifugeRecipes.getRecipes(); - - for(Map.Entry recipe : recipes.entrySet()) { - this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); - } - - } else { - super.loadCraftingRecipes(outputId, results); - } - } - - @Override - public void loadCraftingRecipes(ItemStack result) { - - Map recipes = CentrifugeRecipes.getRecipes(); - - for(Map.Entry recipe : recipes.entrySet()) { - - if(NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[0], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[1], result) - || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[2], result) || NEIServerUtils.areStacksSameType((ItemStack) recipe.getValue()[3], result)) - this.arecipes.add(new RecipeSet(recipe.getKey(), RecipesCommon.objectToStackArray(recipe.getValue()))); - } - } - - @Override - public void loadUsageRecipes(String inputId, Object... ingredients) { - - if((inputId.equals("centrifugeprocessing")) && getClass() == CentrifugeRecipeHandler.class) { - - loadCraftingRecipes("centrifugeprocessing", new Object[0]); - - } else { - super.loadUsageRecipes(inputId, ingredients); - } - } - - @Override - public void loadUsageRecipes(ItemStack ingredient) { - - Map recipes = CentrifugeRecipes.getRecipes(); - - for(Map.Entry recipe : recipes.entrySet()) { - if(recipe.getKey() instanceof List) { - - for(Object o : (List) recipe.getKey()) { - ItemStack stack = (ItemStack) o; - - if(NEIServerUtils.areStacksSameType(ingredient, stack)) { - this.arecipes.add(new RecipeSet(stack, RecipesCommon.objectToStackArray(recipe.getValue()))); - } - } - } - } - } - - @Override - public void drawExtras(int recipe) { - drawProgressBar(21, 24, 195, 55, 16, 16, 48, 7); - drawProgressBar(56, 5, 176, 0, 54, 54, 48 * 3, 0); - drawProgressBar(3, 6, 177, 55, 16, 52, 480, 7); - } - + @Override public void loadTransferRects() { - transferRects.add(new RecipeTransferRect(new Rectangle(56, 5, 54, 54), "centrifugeprocessing")); + super.loadTransferRects(); + transferRectsGui.add(new RecipeTransferRect(new Rectangle(56, 0, 80, 38), "ntmCentrifuge")); + guiGui.add(GUIMachineCentrifuge.class); + RecipeTransferRectHandler.registerRectsToGuis(guiGui, transferRectsGui); } - } diff --git a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java index dda5d9b04..aa1fb5132 100644 --- a/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java +++ b/src/main/java/com/hbm/handler/nei/NEIUniversalHandler.java @@ -60,7 +60,9 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { output = new PositionedStack[out.length]; for(int i = 0; i < out.length; i++) { ItemStack[] sub = out[i]; - this.output[i] = new PositionedStack(sub, 102 + i * 18, 24); + + boolean twos = out.length > 3; + this.output[i] = new PositionedStack(sub, 102 + i * 18 - ((twos && i < 2) ? 0 : 36), 24 + (twos ? (i < 2 ? -9 : 9) : 0)); } this.machinePositioned = new PositionedStack(machine, 75, 31); @@ -105,8 +107,10 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { for(int i = 0; i < rec.input.length; i++) drawTexturedModalRect(47 + i * -18, 23, 5, 87, 18, 18); - for(int i = 0; i < rec.output.length; i++) - drawTexturedModalRect(101 + i * 18, 23, 5, 87, 18, 18); + for(int i = 0; i < rec.output.length; i++) { + boolean twos = rec.output.length > 3; + drawTexturedModalRect(101 + i * 18 - ((twos && i < 2) ? 0 : 36), 23 + (twos ? (i < 2 ? -9 : 9) : 0), 5, 87, 18, 18); + } drawTexturedModalRect(74, 14, 59, 87, 18, 38); } @@ -177,6 +181,7 @@ public abstract class NEIUniversalHandler extends TemplateRecipeHandler { @Override public void loadTransferRects() { transferRectsGui = new LinkedList(); + guiGui = new LinkedList>(); transferRects.add(new RecipeTransferRect(new Rectangle(147, 1, 18, 18), getKey())); RecipeTransferRectHandler.registerRectsToGuis(getRecipeTransferRectGuis(), transferRects); } diff --git a/src/main/java/com/hbm/inventory/material/Mats.java b/src/main/java/com/hbm/inventory/material/Mats.java index f83928ef6..42b58d0ab 100644 --- a/src/main/java/com/hbm/inventory/material/Mats.java +++ b/src/main/java/com/hbm/inventory/material/Mats.java @@ -48,7 +48,7 @@ public class Mats { //Vanilla and vanilla-like public static final NTMMaterial MAT_STONE = makeSmeltable(_VS + 00, df("Stone"), 0x4D2F23).omitAutoGen(); - public static final NTMMaterial MAT_CARBON = makeAdditive( 1499, df("Carbon"), 0x808080).omitAutoGen(); + public static final NTMMaterial MAT_CARBON = makeAdditive( 1499, df("Carbon"), 0x404040).omitAutoGen(); public static final NTMMaterial MAT_COAL = make( 1400, COAL) .setConversion(MAT_CARBON, 3, 1).omitAutoGen(); public static final NTMMaterial MAT_LIGNITE = make( 1401, LIGNITE) .setConversion(MAT_CARBON, 4, 1); public static final NTMMaterial MAT_COALCOKE = make( 1410, COALCOKE) .setConversion(MAT_CARBON, 2, 1); diff --git a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java index 8d34db3dc..22522cce5 100644 --- a/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java +++ b/src/main/java/com/hbm/inventory/recipes/CentrifugeRecipes.java @@ -3,7 +3,6 @@ package com.hbm.inventory.recipes; import java.io.IOException; import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Map.Entry; import com.google.gson.JsonArray; @@ -367,12 +366,12 @@ public class CentrifugeRecipes extends SerializableRecipe { return null; } - public static Map getRecipes() { + public static HashMap getRecipes() { - Map recipes = new HashMap(); + HashMap recipes = new HashMap(); for(Entry entry : CentrifugeRecipes.recipes.entrySet()) { - recipes.put(entry.getKey().extractForNEI(), entry.getValue()); + recipes.put(entry.getKey(), entry.getValue()); } return recipes; diff --git a/src/main/java/com/hbm/items/machine/ItemMold.java b/src/main/java/com/hbm/items/machine/ItemMold.java index 1743aca29..26c7f301d 100644 --- a/src/main/java/com/hbm/items/machine/ItemMold.java +++ b/src/main/java/com/hbm/items/machine/ItemMold.java @@ -247,7 +247,7 @@ public class ItemMold extends Item { @Override public String getTitle() { - return I18nUtil.resolveKey("shape." + MaterialShapes.WIRE.name().toLowerCase()) + " x8"; + return I18nUtil.resolveKey("shape.wire") + " x8"; } } diff --git a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java index 29ef557c4..17784a3fa 100644 --- a/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java +++ b/src/main/java/com/hbm/items/weapon/ItemAmmoArty.java @@ -1,6 +1,7 @@ package com.hbm.items.weapon; import java.util.List; +import java.util.Random; import com.hbm.config.BombConfig; import com.hbm.entity.effect.EntityNukeCloudSmall; @@ -41,7 +42,8 @@ import net.minecraft.util.Vec3; import net.minecraft.util.MovingObjectPosition.MovingObjectType; public class ItemAmmoArty extends Item { - + + public static Random rand = new Random(); public static ArtilleryShell[] itemTypes = new ArtilleryShell[ /* >>> */ 9 /* <<< */ ]; //public static ArtilleryShell[] shellTypes = new ArtilleryShell[ /* >>> */ 8 /* <<< */ ]; /* item types */ @@ -184,7 +186,7 @@ public class ItemAmmoArty extends Item { } public static void standardExplosion(EntityArtilleryShell shell, MovingObjectPosition mop, float size, float rangeMod, boolean breaksBlocks) { - shell.worldObj.playSoundEffect(shell.posX, shell.posY, shell.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + shell.worldObj.rand.nextFloat() * 0.2F); + shell.worldObj.playSoundEffect(shell.posX, shell.posY, shell.posZ, "hbm:weapon.explosionMedium", 20.0F, 0.9F + rand.nextFloat() * 0.2F); Vec3 vec = Vec3.createVectorHelper(shell.motionX, shell.motionY, shell.motionZ).normalize(); ExplosionVNT xnt = new ExplosionVNT(shell.worldObj, mop.hitVec.xCoord - vec.xCoord, mop.hitVec.yCoord - vec.yCoord, mop.hitVec.zCoord - vec.zCoord, size); if(breaksBlocks) { @@ -217,9 +219,9 @@ public class ItemAmmoArty extends Item { EntityArtilleryShell cluster = new EntityArtilleryShell(shell.worldObj); cluster.setType(clusterType); cluster.setPositionAndRotation(shell.posX, shell.posY, shell.posZ, shell.rotationYaw, shell.rotationPitch); - cluster.motionX = i == 0 ? shell.motionX : (shell.motionX + shell.worldObj.rand.nextGaussian() * deviation); + cluster.motionX = i == 0 ? shell.motionX : (shell.motionX + rand.nextGaussian() * deviation); cluster.motionY = shell.motionY; - cluster.motionZ = i == 0 ? shell.motionZ : (shell.motionZ + shell.worldObj.rand.nextGaussian() * deviation); + cluster.motionZ = i == 0 ? shell.motionZ : (shell.motionZ + rand.nextGaussian() * deviation); double[] target = shell.getTarget(); cluster.setTarget(target[0], target[1], target[2]); cluster.setWhistle(shell.getWhistle() && !shell.didWhistle()); diff --git a/src/main/java/com/hbm/lib/RefStrings.java b/src/main/java/com/hbm/lib/RefStrings.java index 00d7f12a7..0dbe95285 100644 --- a/src/main/java/com/hbm/lib/RefStrings.java +++ b/src/main/java/com/hbm/lib/RefStrings.java @@ -3,7 +3,7 @@ package com.hbm.lib; public class RefStrings { public static final String MODID = "hbm"; public static final String NAME = "Hbm's Nuclear Tech Mod"; - public static final String VERSION = "1.0.27 BETA (4403)"; + public static final String VERSION = "1.0.27 BETA (4410)"; //HBM's Beta Naming Convention: //V T (X) //V -> next release version diff --git a/src/main/java/com/hbm/main/ModEventHandlerClient.java b/src/main/java/com/hbm/main/ModEventHandlerClient.java index f4948f0a9..7c584713d 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerClient.java +++ b/src/main/java/com/hbm/main/ModEventHandlerClient.java @@ -783,7 +783,7 @@ public class ModEventHandlerClient { CanneryBase cannery = Jars.canneries.get(comp); if(cannery != null) { - FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getName(), cannery.getIcon())); + FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getName(), cannery.getIcon(), cannery.seeAlso())); } break; diff --git a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java index 79db4e794..860829605 100644 --- a/src/main/java/com/hbm/main/ModEventHandlerRenderer.java +++ b/src/main/java/com/hbm/main/ModEventHandlerRenderer.java @@ -2,6 +2,7 @@ package com.hbm.main; import org.lwjgl.opengl.GL11; +import com.hbm.blocks.ICustomBlockHighlight; import com.hbm.blocks.generic.BlockAshes; import com.hbm.items.armor.IArmorDisableModel; import com.hbm.items.armor.IArmorDisableModel.EnumPlayerPart; @@ -12,12 +13,8 @@ import com.hbm.render.model.ModelMan; import cpw.mods.fml.common.eventhandler.EventPriority; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import net.minecraft.block.Block; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.ScaledResolution; import net.minecraft.client.model.ModelRenderer; -import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.RenderBlocks; -import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.entity.RenderManager; import net.minecraft.client.renderer.entity.RenderPlayer; import net.minecraft.entity.player.EntityPlayer; @@ -26,10 +23,10 @@ import net.minecraft.item.EnumAction; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; import net.minecraft.util.ResourceLocation; -import net.minecraftforge.client.event.RenderGameOverlayEvent; +import net.minecraftforge.client.event.DrawBlockHighlightEvent; import net.minecraftforge.client.event.RenderPlayerEvent; -import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; public class ModEventHandlerRenderer { @@ -121,7 +118,7 @@ public class ModEventHandlerRenderer { public void onRenderHeldItem(RenderPlayerEvent.Specials.Pre event) { EntityPlayer player = event.entityPlayer; - RenderPlayer renderer = event.renderer; + //RenderPlayer renderer = event.renderer; boolean isManly = player.isPotionActive(HbmPotion.death.id); @@ -237,6 +234,23 @@ public class ModEventHandlerRenderer { default: return null; } } + + @SubscribeEvent + public void onDrawHighlight(DrawBlockHighlightEvent event) { + MovingObjectPosition mop = event.target; + + if(mop != null && mop.typeOfHit == mop.typeOfHit.BLOCK) { + Block b = event.player.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); + if(b instanceof ICustomBlockHighlight) { + ICustomBlockHighlight cus = (ICustomBlockHighlight) b; + + if(cus.shouldDrawHighlight(event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ)) { + cus.drawHighlight(event, event.player.worldObj, mop.blockX, mop.blockY, mop.blockZ); + event.setCanceled(true); + } + } + } + } private ResourceLocation ashes = new ResourceLocation(RefStrings.MODID + ":textures/misc/overlay_ash.png"); public static int currentBrightness = 0; diff --git a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java index abaacf24c..b0028beba 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderCrucible.java +++ b/src/main/java/com/hbm/render/tileentity/RenderCrucible.java @@ -9,16 +9,19 @@ import com.hbm.lib.RefStrings; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityCrucible; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.Item; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.IItemRenderer; -public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRendererProvider { +public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRendererProvider, ITileActorRenderer { public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava.png"); @@ -36,7 +39,7 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe case 4: GL11.glRotatef(180, 0F, 1F, 0F); break; } - bindTexture(ResourceManager.crucible_tex); + ITileActorRenderer.bindTexture(ResourceManager.crucible_tex); ResourceManager.crucible_heat.renderAll(); TileEntityCrucible crucible = (TileEntityCrucible) tile; @@ -56,7 +59,7 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe GL11.glDisable(GL11.GL_CULL_FACE); OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 240F, 240F); - bindTexture(lava); + ITileActorRenderer.bindTexture(lava); Tessellator tess = Tessellator.instance; tess.setNormal(0F, 1F, 0F); tess.startDrawingQuads(); @@ -91,4 +94,15 @@ public class RenderCrucible extends TileEntitySpecialRenderer implements IItemRe ResourceManager.crucible_heat.renderAll(); }}; } + + @Override + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { + int x = data.getInteger("x"); + int y = data.getInteger("y"); + int z = data.getInteger("z"); + renderTileEntityAt(world.getTileEntity(x, y, z), x, y, z, interp); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java index a1c420293..71fcc4220 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFENSU.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFENSU.java @@ -5,6 +5,7 @@ import org.lwjgl.opengl.GL11; import com.hbm.blocks.BlockDummyable; import com.hbm.main.ResourceManager; import com.hbm.tileentity.machine.storage.TileEntityMachineFENSU; +import com.hbm.wiaj.WorldInAJar; import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.renderer.OpenGlHelper; @@ -62,7 +63,7 @@ public class RenderFENSU extends TileEntitySpecialRenderer implements ITileActor } @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java index 0976d9c12..8da434312 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderFoundry.java +++ b/src/main/java/com/hbm/render/tileentity/RenderFoundry.java @@ -6,6 +6,8 @@ import org.lwjgl.opengl.GL11; import com.hbm.lib.RefStrings; import com.hbm.tileentity.machine.IRenderFoundry; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -19,12 +21,13 @@ import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.ForgeHooksClient; -public class RenderFoundry extends TileEntitySpecialRenderer { +public class RenderFoundry extends TileEntitySpecialRenderer implements ITileActorRenderer { public static final ResourceLocation lava = new ResourceLocation(RefStrings.MODID, "textures/models/machines/lava_gray.png"); @@ -50,7 +53,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { Tessellator tess = Tessellator.instance; Block b = ((ItemBlock)stack.getItem()).field_150939_a; IIcon icon = b.getIcon(1, stack.getItemDamage()); - bindTexture(TextureMap.locationBlocksTexture); + ITileActorRenderer.bindTexture(TextureMap.locationBlocksTexture); tess.startDrawingQuads(); tess.setNormal(0F, 1F, 0F); @@ -91,7 +94,7 @@ public class RenderFoundry extends TileEntitySpecialRenderer { if(foundry.shouldRender()) { - this.bindTexture(lava); + ITileActorRenderer.bindTexture(lava); int hex = foundry.getMat().moltenColor; Color color = new Color(hex); @@ -134,4 +137,15 @@ public class RenderFoundry extends TileEntitySpecialRenderer { GL11.glPopMatrix(); } + + @Override + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { + int x = data.getInteger("x"); + int y = data.getInteger("y"); + int z = data.getInteger("z"); + renderTileEntityAt(world.getTileEntity(x, y, z), x, y, z, interp); + } + + @Override + public void updateActor(int ticks, NBTTagCompound data) { } } diff --git a/src/main/java/com/hbm/render/tileentity/RenderStirling.java b/src/main/java/com/hbm/render/tileentity/RenderStirling.java index 38699104c..d1544382d 100644 --- a/src/main/java/com/hbm/render/tileentity/RenderStirling.java +++ b/src/main/java/com/hbm/render/tileentity/RenderStirling.java @@ -7,6 +7,7 @@ import com.hbm.blocks.ModBlocks; import com.hbm.main.ResourceManager; import com.hbm.render.item.ItemRenderBase; import com.hbm.tileentity.machine.TileEntityStirling; +import com.hbm.wiaj.WorldInAJar; import com.hbm.wiaj.actors.ITileActorRenderer; import net.minecraft.client.Minecraft; @@ -104,7 +105,7 @@ public class RenderStirling extends TileEntitySpecialRenderer implements IItemRe } @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java index 1fdc124e9..cc37550a2 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineMiningLaser.java @@ -218,7 +218,7 @@ public class TileEntityMachineMiningLaser extends TileEntityMachineBase implemen private void tryFillContainer(int x, int y, int z) { Block b = worldObj.getBlock(x, y, z); - if(b != Blocks.chest && b != Blocks.trapped_chest && b != ModBlocks.crate_iron && + if(b != Blocks.chest && b != Blocks.trapped_chest && b != ModBlocks.crate_iron && b != ModBlocks.crate_desh && b != ModBlocks.crate_steel && b != ModBlocks.safe && b != Blocks.hopper) return; diff --git a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java index 5c1473628..4236c83ee 100644 --- a/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java +++ b/src/main/java/com/hbm/wiaj/GuiWorldInAJar.java @@ -16,6 +16,7 @@ import com.hbm.wiaj.actors.ISpecialActor; import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; import com.hbm.wiaj.cannery.*; +import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.client.Minecraft; import net.minecraft.client.audio.PositionedSoundRecord; import net.minecraft.client.gui.FontRenderer; @@ -53,6 +54,12 @@ public class GuiWorldInAJar extends GuiScreen { this.renderer.enableAO = true; this.titlePanel = new ActorFancyPanel(fontRendererObj, 40, 27, new Object[][] {{I18nUtil.resolveKey(title)}}, 0).setColors(CanneryBase.colorGold).setOrientation(Orientation.LEFT); + this.seeAlsoTitles = new ActorFancyPanel[seeAlso.length]; + + for(int i = 0; i < seeAlso.length; i++) { + this.seeAlsoTitles[i] = new ActorFancyPanel(fontRendererObj, 40, 27 + 36 * (i + 1), new Object[][] {{I18nUtil.resolveKey(seeAlso[i].getName())}}, 0).setColors(CanneryBase.colorGrey).setOrientation(Orientation.LEFT); + } + /*WorldInAJar world = new WorldInAJar(15, 15, 15); @@ -169,6 +176,10 @@ public class GuiWorldInAJar extends GuiScreen { this.mc.displayGuiScreen((GuiScreen) null); this.mc.setIngameFocus(); } + + /*try { + Tessellator.instance.draw(); //why, oh why is Tessellator.isDrawing private and without a getter? + } catch(Exception x) {}*/ } @Override @@ -199,6 +210,16 @@ public class GuiWorldInAJar extends GuiScreen { mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } } + + for(int i = 0; i < seeAlso.length; i++) { + + if(15 <= mouseX && 39 > mouseX && 15 + 36 * (i + 1) < mouseY && 39 + 36 * (i + 1) >= mouseY) { + CanneryBase cannery = seeAlso[i]; + mc.getSoundHandler().playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); + FMLCommonHandler.instance().showGuiScreen(new GuiWorldInAJar(cannery.createScript(), cannery.getName(), cannery.getIcon(), cannery.seeAlso())); + return; + } + } } private void drawGuiContainerForegroundLayer(int mouseX, int mouseY) { @@ -242,6 +263,7 @@ public class GuiWorldInAJar extends GuiScreen { GL11.glEnable(GL11.GL_DEPTH_TEST); this.drawTexturedModalRect(15, 15, 136, 48, 24, 24); + RenderHelper.enableGUIStandardItemLighting(); itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19); itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, this.icon, 19, 19, null); RenderHelper.disableStandardItemLighting(); @@ -249,6 +271,22 @@ public class GuiWorldInAJar extends GuiScreen { if(15 <= mouseX && 39 > mouseX && 15 < mouseY && 39 >= mouseY) { this.titlePanel.drawForegroundComponent(0, 0, this.jarScript.ticksElapsed, this.jarScript.interp); } + + for(int i = 0; i < seeAlso.length; i++) { + CanneryBase also = seeAlso[i]; + + Minecraft.getMinecraft().getTextureManager().bindTexture(guiUtil); + GL11.glDisable(GL11.GL_LIGHTING); + this.drawTexturedModalRect(15, 15 + 36 * (i + 1), 136, 72, 24, 24); + RenderHelper.enableGUIStandardItemLighting(); + itemRender.renderItemAndEffectIntoGUI(this.fontRendererObj, this.mc.renderEngine, also.getIcon(), 19, 19 + 36 * (i + 1)); + itemRender.renderItemOverlayIntoGUI(this.fontRendererObj, this.mc.renderEngine, also.getIcon(), 19, 19 + 36 * (i + 1), null); + RenderHelper.disableStandardItemLighting(); + + if(15 <= mouseX && 39 > mouseX && 15 + 36 * (i + 1) < mouseY && 39 + 36 * (i + 1) >= mouseY) { + this.seeAlsoTitles[i].drawForegroundComponent(0, 0, this.jarScript.ticksElapsed, this.jarScript.interp); + } + } } private void drawGuiContainerBackgroundLayer(float f, int mouseX, int mouseY) { @@ -282,7 +320,7 @@ public class GuiWorldInAJar extends GuiScreen { for(Entry actor : this.jarScript.actors.entrySet()) { GL11.glPushMatrix(); - actor.getValue().drawBackgroundComponent(this.jarScript.ticksElapsed, this.jarScript.interp); + actor.getValue().drawBackgroundComponent(this.jarScript.world, this.jarScript.ticksElapsed, this.jarScript.interp); GL11.glPopMatrix(); } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java index 55290e0bd..62c4079a9 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorBasicPanel.java @@ -8,6 +8,7 @@ import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL12; import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -40,7 +41,7 @@ public class ActorBasicPanel implements ISpecialActor { } @Override - public void drawBackgroundComponent(int ticks, float interp) { } + public void drawBackgroundComponent(WorldInAJar world, int ticks, float interp) { } @Override public void updateActor(JarScene scene) { } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java index c1b4de34f..f40436d6c 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorFancyPanel.java @@ -9,6 +9,7 @@ import org.lwjgl.opengl.GL12; import com.hbm.lib.RefStrings; import com.hbm.util.I18nUtil; import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -334,11 +335,12 @@ public class ActorFancyPanel implements ISpecialActor { itemRender.renderItemAndEffectIntoGUI(this.font, texman, stack, x, y - 8); itemRender.renderItemOverlayIntoGUI(this.font, texman, stack, x, y - 8, null); RenderHelper.disableStandardItemLighting(); + GL11.glColor3f(1F, 1F, 1F); GL11.glDisable(GL11.GL_DEPTH_TEST); } //TODO: scaled stacks } - @Override public void drawBackgroundComponent(int ticks, float interp) { } + @Override public void drawBackgroundComponent(WorldInAJar world, int ticks, float interp) { } @Override public void updateActor(JarScene scene) { } @Override public void setActorData(NBTTagCompound data) { } @Override public void setDataPoint(String tag, Object o) { } diff --git a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java index 50a1f1650..a6b6ec582 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorTileEntity.java @@ -1,6 +1,7 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; import net.minecraft.nbt.NBTTagCompound; @@ -21,8 +22,8 @@ public class ActorTileEntity extends ActorBase { public void drawForegroundComponent(int w, int h, int ticks, float interp) { } @Override - public void drawBackgroundComponent(int ticks, float interp) { - renderer.renderActor(ticks, interp, data); + public void drawBackgroundComponent(WorldInAJar world, int ticks, float interp) { + renderer.renderActor(world, ticks, interp, data); } @Override diff --git a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java index 2d4b02bed..9eabd8e67 100644 --- a/src/main/java/com/hbm/wiaj/actors/ActorVillager.java +++ b/src/main/java/com/hbm/wiaj/actors/ActorVillager.java @@ -3,6 +3,7 @@ package com.hbm.wiaj.actors; import org.lwjgl.opengl.GL11; import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.entity.RenderManager; @@ -24,7 +25,7 @@ public class ActorVillager implements ISpecialActor { public void drawForegroundComponent(int w, int h, int ticks, float interp) { } @Override - public void drawBackgroundComponent(int ticks, float interp) { + public void drawBackgroundComponent(WorldInAJar world, int ticks, float interp) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java index a70be8389..5bcd1beca 100644 --- a/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java +++ b/src/main/java/com/hbm/wiaj/actors/ISpecialActor.java @@ -1,6 +1,7 @@ package com.hbm.wiaj.actors; import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.WorldInAJar; import net.minecraft.nbt.NBTTagCompound; @@ -13,8 +14,8 @@ public interface ISpecialActor { /** Draws things in the foreground like text boxes */ public void drawForegroundComponent(int w, int h, int ticks, float interp); - /** Draws things in the background, fotted to the world renderer like TESRs */ - public void drawBackgroundComponent(int ticks, float interp); + /** Draws things in the background, fitted to the world renderer like TESRs */ + public void drawBackgroundComponent(WorldInAJar world, int ticks, float interp); /** Update ticks to emulate serverside ticking */ public void updateActor(JarScene scene); /** Sets the data object to the passed NBT */ diff --git a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java index 5c98d5b90..3e79842b2 100644 --- a/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java +++ b/src/main/java/com/hbm/wiaj/actors/ITileActorRenderer.java @@ -1,12 +1,14 @@ package com.hbm.wiaj.actors; +import com.hbm.wiaj.WorldInAJar; + import net.minecraft.client.Minecraft; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; public interface ITileActorRenderer { - public void renderActor(int ticks, float interp, NBTTagCompound data); + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data); public void updateActor(int ticks, NBTTagCompound data); public static void bindTexture(ResourceLocation tex) { diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java index c94397274..9c008849b 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryBase.java @@ -9,7 +9,7 @@ public abstract class CanneryBase { public static final int[] colorCopper = new int[] {0xFFFDCA88, 0xFFD57C4F, 0xFFAB4223, 0xFF1A1F22}; public static final int[] colorGold = new int[] {0xFFFFFDE0, 0xFFFAD64A, 0xFFDC9613, 0xFF1A1F22}; public static final int[] colorBlue = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; - public static final int[] colorGrey = new int[] {0xFFA5D9FF, 0xFF39ACFF, 0xFF1A6CA7, 0xFF1A1F22}; + public static final int[] colorGrey = new int[] {0xFFD1D1D1, 0xFF919191, 0xFF5D5D5D, 0xFF302E36}; public abstract ItemStack getIcon(); public abstract String getName(); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java index fe8cde550..fffdfadca 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCentrifuge.java @@ -144,7 +144,7 @@ public class CanneryCentrifuge extends CanneryBase { public static class ActorGasCent implements ITileActorRenderer { @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryCrucible.java b/src/main/java/com/hbm/wiaj/cannery/CanneryCrucible.java new file mode 100644 index 000000000..0e0b7f5ca --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryCrucible.java @@ -0,0 +1,226 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.render.tileentity.RenderCrucible; +import com.hbm.render.tileentity.RenderFoundry; +import com.hbm.tileentity.machine.TileEntityCrucible; +import com.hbm.tileentity.machine.TileEntityFoundryBasin; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionRotateBy; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionUpdateActor; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; +import com.hbm.wiaj.cannery.CanneryFirebox.ActorFirebox; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryCrucible extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.machine_crucible); + } + + @Override + public String getName() { + return "cannery.crucible"; + } + + public CanneryBase[] seeAlso() { + return new CanneryBase[] { + new CanneryFoundryChannel() + }; + } + + @Override + public JarScript createScript() { + WorldInAJar world = new WorldInAJar(5, 4, 5); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = 0; x < 5 ; x++) { + for(int z = 0; z < 5; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + } + scene0.add(new ActionWait(5)); + for(int x = 1; x < 4 ; x++) { + for(int z = 1; z < 4; z++) { + scene0.add(new ActionSetBlock(x, 1, z, Blocks.brick_block)); + } + } + scene0.add(new ActionWait(5)); + + scene0.add(new ActionSetTile(2, 2, 2, new TileEntityFauxCrucible() {{ meta = 14; }})); + scene0.add(new ActionCreateActor(1, new ActorTileEntity(new RenderCrucible(), new NBTTagCompound() {{ setInteger("x", 2); setInteger("y", 2); setInteger("z", 2); }}))); + + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -30, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.0")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(0)); + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -30, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.1")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(0)); + scene0.add(new ActionWait(10)); + + for(int x = 1; x < 4 ; x++) for(int z = 1; z < 4; z++) scene0.add(new ActionSetBlock(x, 1, z, Blocks.air)); + + NBTTagCompound firebox = new NBTTagCompound(); firebox.setDouble("x", 2); firebox.setDouble("y", 1); firebox.setDouble("z", 2); firebox.setInteger("rotation", 5); + scene0.add(new ActionCreateActor(2, new ActorTileEntity(new ActorFirebox(), firebox))); + + scene0.add(new ActionUpdateActor(2, "open", true)); + scene0.add(new ActionWait(30)); + scene0.add(new ActionUpdateActor(2, "isOn", true)); + + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -50, 25, new Object[][] {{new ItemStack(Items.coal)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + + scene0.add(new ActionWait(20)); + scene0.add(new ActionRemoveActor(0)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionUpdateActor(2, "open", false)); + scene0.add(new ActionWait(30)); + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -30, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.2")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionRotateBy(45, -60, 20)); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.3")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.CENTER))); + scene1.add(new ActionWait(40)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.4")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.5")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.6")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionWait(20)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.7")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.8")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.9")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene1.add(new ActionWait(60)); + + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionRotateBy(-45, 60, 20)); + scene1.add(new ActionWait(10)); + + JarScene scene2 = new JarScene(script); + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 30, 0, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.10")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.RIGHT))); + scene2.add(new ActionWait(60)); + + scene2.add(new ActionRemoveActor(0)); + scene2.add(new ActionWait(10)); + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -40, new Object[][] {{new ItemStack(Items.gold_ingot, 11)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene2.add(new ActionWait(20)); + + scene2.add(new ActionRemoveActor(0)); + scene2.add(new ActionSetTile(2, 2, 2, new TileEntityFauxCrucible() {{ meta = 14; recipeStack.add(new MaterialStack(Mats.MAT_GOLD, MaterialShapes.BLOCK.q(16))); }})); + scene2.add(new ActionWait(10)); + + scene2.add(new ActionSetTile(0, 1, 2, new TileEntityFoundryBasin())); + scene2.add(new ActionCreateActor(3, new ActorTileEntity(new RenderFoundry(), new NBTTagCompound() {{ setInteger("x", 0); setInteger("y", 1); setInteger("z", 2); }}))); + scene2.add(new ActionSetBlock(0, 1, 2, ModBlocks.foundry_basin)); + + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, 25, new Object[][] {{new ItemStack(ModItems.mold, 1, 12)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene2.add(new ActionWait(20)); + scene2.add(new ActionRemoveActor(0)); + scene2.add(new ActionSetTile(0, 1, 2, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); }})); + + scene2.add(new ActionWait(20)); + + for(int i = 0; i < 60; i++) { + final int j = i; + scene2.add(new ActionSetTile(2, 2, 2, new TileEntityFauxCrucible() {{ meta = 14; recipeStack.add(new MaterialStack(Mats.MAT_GOLD, MaterialShapes.BLOCK.q((60 - j), 60) * 16)); }})); + scene2.add(new ActionSetTile(0, 1, 2, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); type = Mats.MAT_GOLD; amount = MaterialShapes.BLOCK.q(j + 1, 60); }})); + scene2.add(new ActionWait(1)); + } + + scene2.add(new ActionWait(40)); + scene2.add(new ActionSetTile(0, 1, 2, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); slots[1] = new ItemStack(Blocks.gold_block); }})); + scene2.add(new ActionWait(20)); + scene2.add(new ActionSetTile(0, 1, 2, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); }})); + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 42, 25, new Object[][] {{new ItemStack(Blocks.gold_block)}}, 0) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene2.add(new ActionWait(20)); + scene2.add(new ActionRemoveActor(0)); + + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -30, new Object[][] {{I18nUtil.resolveKey("cannery.crucible.11")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene2.add(new ActionWait(60)); + scene2.add(new ActionRemoveActor(0)); + scene2.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -30, new Object[][] {{new ItemStack(Items.iron_shovel), " -> ", ItemScraps.create(new MaterialStack(Mats.MAT_GOLD, 1))}}, 200) + .setColors(colorCopper).setOrientation(Orientation.BOTTOM))); + scene2.add(new ActionSetTile(2, 2, 2, new TileEntityFauxCrucible() {{ meta = 14; }})); + scene2.add(new ActionWait(20)); + scene2.add(new ActionRemoveActor(0)); + + script.addScene(scene0).addScene(scene1).addScene(scene2); + + return script; + } + + public static class TileEntityFauxCrucible extends TileEntityCrucible { + + public int meta = 0; + + @Override + public int getBlockMetadata() { + return meta; + } + } + +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java index 3429c3404..1cde66431 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFirebox.java @@ -154,7 +154,7 @@ public class CanneryFirebox extends CanneryBase { public static class ActorFirebox implements ITileActorRenderer { @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryFoundryChannel.java b/src/main/java/com/hbm/wiaj/cannery/CanneryFoundryChannel.java new file mode 100644 index 000000000..29c8a3462 --- /dev/null +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryFoundryChannel.java @@ -0,0 +1,185 @@ +package com.hbm.wiaj.cannery; + +import com.hbm.blocks.ModBlocks; +import com.hbm.inventory.material.MaterialShapes; +import com.hbm.inventory.material.Mats; +import com.hbm.inventory.material.Mats.MaterialStack; +import com.hbm.items.ModItems; +import com.hbm.items.machine.ItemScraps; +import com.hbm.render.tileentity.RenderFoundry; +import com.hbm.tileentity.machine.TileEntityFoundryBasin; +import com.hbm.tileentity.machine.TileEntityFoundryChannel; +import com.hbm.tileentity.machine.TileEntityFoundryMold; +import com.hbm.tileentity.machine.TileEntityFoundryOutlet; +import com.hbm.tileentity.machine.TileEntityFoundryTank; +import com.hbm.util.I18nUtil; +import com.hbm.wiaj.JarScene; +import com.hbm.wiaj.JarScript; +import com.hbm.wiaj.WorldInAJar; +import com.hbm.wiaj.actions.ActionCreateActor; +import com.hbm.wiaj.actions.ActionRemoveActor; +import com.hbm.wiaj.actions.ActionSetBlock; +import com.hbm.wiaj.actions.ActionSetTile; +import com.hbm.wiaj.actions.ActionSetZoom; +import com.hbm.wiaj.actions.ActionWait; +import com.hbm.wiaj.actors.ActorFancyPanel; +import com.hbm.wiaj.actors.ActorTileEntity; +import com.hbm.wiaj.actors.ActorFancyPanel.Orientation; + +import net.minecraft.client.Minecraft; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CanneryFoundryChannel extends CanneryBase { + + @Override + public ItemStack getIcon() { + return new ItemStack(ModBlocks.foundry_channel); + } + + @Override + public String getName() { + return "cannery.foundryChannel"; + } + + public CanneryBase[] seeAlso() { + return new CanneryBase[] { + new CanneryCrucible() + }; + } + + @Override + public JarScript createScript() { + WorldInAJar world = new WorldInAJar(5, 4, 4); + JarScript script = new JarScript(world); + + JarScene scene0 = new JarScene(script); + + /// SETUP /// + scene0.add(new ActionSetZoom(3, 0)); + + for(int x = world.sizeX - 1; x >= 0 ; x--) { + for(int z = 0; z < world.sizeZ; z++) { + scene0.add(new ActionSetBlock(x, 0, z, Blocks.brick_block)); + } + } + + scene0.add(new ActionWait(5)); + scene0.add(new ActionSetBlock(1, 1, 2, Blocks.brick_block)); + scene0.add(new ActionSetBlock(2, 1, 2, Blocks.brick_block)); + scene0.add(new ActionSetBlock(3, 1, 2, Blocks.brick_block)); + scene0.add(new ActionSetBlock(3, 1, 3, Blocks.brick_block)); + + scene0.add(new ActionSetTile(3, 1, 1, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); }})); + scene0.add(new ActionCreateActor(1, new ActorTileEntity(new RenderFoundry(), new NBTTagCompound() {{ setInteger("x", 3); setInteger("y", 1); setInteger("z", 1); }}))); + scene0.add(new ActionSetBlock(3, 1, 1, ModBlocks.foundry_basin)); + scene0.add(new ActionSetTile(2, 1, 1, new TileEntityFoundryMold() {{ slots[0] = new ItemStack(ModItems.mold, 0, 2); }})); + scene0.add(new ActionCreateActor(2, new ActorTileEntity(new RenderFoundry(), new NBTTagCompound() {{ setInteger("x", 2); setInteger("y", 1); setInteger("z", 1); }}))); + scene0.add(new ActionSetBlock(2, 1, 1, ModBlocks.foundry_mold)); + + scene0.add(new ActionWait(5)); + scene0.add(new ActionSetBlock(3, 2, 3, Blocks.brick_block)); + scene0.add(new ActionSetTile(1, 2, 2, new TileEntityFoundryMold() {{ slots[0] = new ItemStack(ModItems.mold, 0, 2); }})); + scene0.add(new ActionCreateActor(3, new ActorTileEntity(new RenderFoundry(), new NBTTagCompound() {{ setInteger("x", 1); setInteger("y", 2); setInteger("z", 2); }}))); + scene0.add(new ActionSetBlock(1, 2, 2, ModBlocks.foundry_mold)); + scene0.add(new ActionSetTile(2, 2, 2, new TileEntityFoundryChannel())); + scene0.add(new ActionSetBlock(2, 2, 2, ModBlocks.foundry_channel)); + scene0.add(new ActionSetTile(3, 2, 2, new TileEntityFoundryChannel())); + scene0.add(new ActionSetBlock(3, 2, 2, ModBlocks.foundry_channel)); + + scene0.add(new ActionSetTile(2, 2, 1, new TileEntityFauxOutlet())); + scene0.add(new ActionSetBlock(2, 2, 1, ModBlocks.foundry_outlet, 2)); + scene0.add(new ActionSetTile(3, 2, 1, new TileEntityFauxOutlet())); + scene0.add(new ActionSetBlock(3, 2, 1, ModBlocks.foundry_outlet, 2)); + scene0.add(new ActionWait(5)); + scene0.add(new ActionSetTile(3, 3, 3, new TileEntityFoundryTank() {{ type = Mats.MAT_GOLD; amount = MaterialShapes.BLOCK.q(1); }})); + scene0.add(new ActionSetBlock(3, 3, 3, ModBlocks.foundry_tank)); + scene0.add(new ActionSetTile(3, 3, 2, new TileEntityFauxOutlet())); + scene0.add(new ActionSetBlock(3, 3, 2, ModBlocks.foundry_outlet, 2)); + + scene0.add(new ActionWait(10)); + + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -25, new Object[][] {{I18nUtil.resolveKey("cannery.foundryChannel.0")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(0)); + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, -5, -40, new Object[][] {{I18nUtil.resolveKey("cannery.foundryChannel.1")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.TOP))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(0)); + scene0.add(new ActionWait(10)); + scene0.add(new ActionSetTile(3, 2, 2, new TileEntityFoundryChannel() {{ type = Mats.MAT_GOLD; amount = MaterialShapes.INGOT.q(1); }})); + + scene0.add(new ActionWait(10)); + scene0.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -25, new Object[][] {{I18nUtil.resolveKey("cannery.foundryChannel.2")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + scene0.add(new ActionWait(60)); + scene0.add(new ActionRemoveActor(0)); + + for(int i = 0; i < 60; i++) { + final int j = i; + scene0.add(new ActionSetTile(3, 1, 1, new TileEntityFoundryBasin() {{ slots[0] = new ItemStack(ModItems.mold, 0, 12); type = Mats.MAT_GOLD; amount = MaterialShapes.BLOCK.q(j, 60); }})); + scene0.add(new ActionWait(1)); + } + + JarScene scene1 = new JarScene(script); + + scene1.add(new ActionWait(10)); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -25, new Object[][] {{I18nUtil.resolveKey("cannery.foundryChannel.3")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionRemoveActor(0)); + + scene1.add(new ActionWait(10)); + scene1.add(new ActionSetTile(2, 2, 2, new TileEntityFoundryChannel() {{ type = Mats.MAT_GOLD; amount = MaterialShapes.INGOT.q(1); }})); + scene1.add(new ActionWait(10)); + + for(int i = 0; i < 60; i++) { + final int j = i; + scene1.add(new ActionSetTile(2, 1, 1, new TileEntityFoundryMold() {{ slots[0] = new ItemStack(ModItems.mold, 0, 2); type = Mats.MAT_GOLD; amount = MaterialShapes.INGOT.q(j, 60); }})); + scene1.add(new ActionSetTile(1, 2, 2, new TileEntityFoundryMold() {{ slots[0] = new ItemStack(ModItems.mold, 0, 2); type = Mats.MAT_GOLD; amount = MaterialShapes.INGOT.q(j, 60); }})); + scene1.add(new ActionWait(1)); + } + + scene1.add(new ActionWait(2)); + scene1.add(new ActionSetTile(3, 3, 3, new TileEntityFoundryTank())); + scene1.add(new ActionWait(20)); + + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -25, new Object[][] {{I18nUtil.resolveKey("cannery.foundryChannel.4")}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + scene1.add(new ActionWait(40)); + scene1.add(new ActionRemoveActor(0)); + scene1.add(new ActionWait(10)); + + scene1.add(new ActionSetTile(2, 2, 2, new TileEntityFoundryChannel())); + scene1.add(new ActionSetTile(3, 2, 2, new TileEntityFoundryChannel())); + scene1.add(new ActionCreateActor(0, new ActorFancyPanel(Minecraft.getMinecraft().fontRenderer, 0, -25, new Object[][] {{new ItemStack(Items.iron_shovel), " -> ", ItemScraps.create(new MaterialStack(Mats.MAT_GOLD, 1))}}, 200) + .setColors(colorCopper).setOrientation(Orientation.LEFT))); + scene1.add(new ActionWait(40)); + scene1.add(new ActionRemoveActor(0)); + + scene1.add(new ActionWait(60)); + scene1.add(new ActionSetTile(2, 1, 1, new TileEntityFoundryMold() {{ slots[1] = new ItemStack(Items.gold_ingot); }})); + scene1.add(new ActionSetTile(1, 2, 2, new TileEntityFoundryMold() {{ slots[1] = new ItemStack(Items.gold_ingot); }})); + scene1.add(new ActionSetTile(3, 1, 1, new TileEntityFoundryBasin() {{ slots[1] = new ItemStack(Blocks.gold_block); }})); + + script.addScene(scene0); + script.addScene(scene1); + + return script; + } + + public static class TileEntityFauxOutlet extends TileEntityFoundryOutlet { + + public boolean isClosed = false; + + @Override + public boolean isClosed() { return isClosed; } + } +} diff --git a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java index a59b8f1a0..30e0c66e3 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java +++ b/src/main/java/com/hbm/wiaj/cannery/CannerySILEX.java @@ -241,7 +241,7 @@ public class CannerySILEX extends CanneryBase { public static class ActorFEL implements ITileActorRenderer { @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); @@ -281,7 +281,7 @@ public class CannerySILEX extends CanneryBase { public static class ActorSILEX implements ITileActorRenderer { @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java index e150b4959..ea5eb2520 100644 --- a/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java +++ b/src/main/java/com/hbm/wiaj/cannery/CanneryStirling.java @@ -182,7 +182,7 @@ public class CanneryStirling extends CanneryBase { public static class ActorBurner implements ITileActorRenderer { @Override - public void renderActor(int ticks, float interp, NBTTagCompound data) { + public void renderActor(WorldInAJar world, int ticks, float interp, NBTTagCompound data) { double x = data.getDouble("x"); double y = data.getDouble("y"); double z = data.getDouble("z"); diff --git a/src/main/java/com/hbm/wiaj/cannery/Jars.java b/src/main/java/com/hbm/wiaj/cannery/Jars.java index 30907c583..6398fc5e6 100644 --- a/src/main/java/com/hbm/wiaj/cannery/Jars.java +++ b/src/main/java/com/hbm/wiaj/cannery/Jars.java @@ -17,5 +17,7 @@ public class Jars { canneries.put(new ComparableStack(ModBlocks.machine_fensu), new CanneryFEnSU()); canneries.put(new ComparableStack(ModBlocks.machine_fel), new CannerySILEX()); canneries.put(new ComparableStack(ModBlocks.machine_silex), new CannerySILEX()); + canneries.put(new ComparableStack(ModBlocks.foundry_channel), new CanneryFoundryChannel()); + canneries.put(new ComparableStack(ModBlocks.machine_crucible), new CanneryCrucible()); } } diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 4669e98a1..1f9fd132b 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -324,6 +324,20 @@ cannery.centrifuge.3=Uranium hexafluoride can be processed with just two centrif cannery.centrifuge.4=Fully processing it into Uranium-235 and Uranium-238 requires a total of four centrifuges. cannery.centrifuge.5=Some recipes also require the centrifuge overclocking upgrade. +cannery.crucible=Crucible +cannery.crucible.0=The crucible is used to smelt ores, ingots or other metallic items for alloying and to cast them into different shapes. +cannery.crucible.1=It requires an external heat source connected to the bottom, like a firebox. +cannery.crucible.2=Once heated up, the crucible can be used in two ways, with or without a recipe template. +cannery.crucible.3=The crucible has two storage buffers for material: +cannery.crucible.4=The buffer to the left is for §abyproducts§r, all material smelted without a recipe template will land here. +cannery.crucible.5=If a recipe is installed, materials that do not match the recipe will also be stored here. +cannery.crucible.6=Materials in this buffer will not react with each other, they can only be output from the green outlet for casting. +cannery.crucible.7=The buffer to the right is for §crecipes§r, if a recipe is installed and that particular material is relevant to that recipe, it will land here. +cannery.crucible.8=The materials will slowly combine into the output material which is automatically output from the red outlet. +cannery.crucible.9=Note that only this buffer handles recipes. If a template is installed retroactively, materials in the byproduct buffer will not combine, nor transfer to the recipe buffer. +cannery.crucible.10=The outlet will output material automatically, if the target is valid, for example a foundry channel or a mold. +cannery.crucible.11=As with all foundry blocks, a shovel can be used to remove all material from the crucible. + cannery.fensu=FEnSU cannery.fensu.0=The FEnSU is capable of storing absurd amounts of energy, over 9EHE (that's a nine followed by 18 zeros). cannery.fensu.1=There is only one energy connector which can be found on the bottom. @@ -336,6 +350,13 @@ cannery.firebox.2=Heat is given off by the copper contact at the top of the fire cannery.firebox.3=If heat isn't being used up and the heat buffer becomes full, the firebox will shut off to prevent wasting of fuel. cannery.firebox.4=One such machine is the stirling engine, which will turn heat directly into energy. +cannery.foundryChannel=Foundry Channel +cannery.foundryChannel.0=Foundry channels are used to transport molten material from a crucible or storage tank into molds. +cannery.foundryChannel.1=Channels can receive material either by pouring from the top - via an outlet or directly form a crucible - or from the side from other channels. +cannery.foundryChannel.2=When transporting materials, channels will prioritize blocks like outlets and shallow molds. +cannery.foundryChannel.3=When it cannot supply an outlet or a mold, the material will then flow into a neighboring channel. +cannery.foundryChannel.4=Leftover material can be removed by using a shovel. + cannery.silex=FEL & SILEX cannery.silex.0=The Free Electron Laser (FEL) uses energy and a laser crystal to create a powerful laser beam. cannery.silex.1=Be careful, as the laser will burn/melt through weaker blocks... diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_crucible.png index 42e8fb314331b92abbea437e9b96a33889092eb5..684157aa2886f97fa0dcbfcd8259ec2237efd7c1 100644 GIT binary patch delta 10747 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 Gqy7&KiNS6F diff --git a/src/main/resources/assets/hbm/textures/models/machines/heating_oven.png b/src/main/resources/assets/hbm/textures/models/machines/heating_oven.png index c441b5062dd4820de1e668315828a312ef6fc13f..92cc0d2d51f9f27a28bada21869247b659a66597 100644 GIT binary patch literal 7405 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 literal 6993 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 j5cWu2hgoCRdAa`|eJ4~