From 0ecca70ffea917e1628e8e4108451183ed84033e Mon Sep 17 00:00:00 2001 From: pahimar Date: Fri, 30 Nov 2012 15:28:42 -0500 Subject: [PATCH] Move art/sprite related constants out of the general Reference class into their out Sprites lib class, move the RenderTickHandler into the client package (where it belongs), --- ee3_client/ee3/client/core/ClientProxy.java | 8 +- .../handlers/DrawBlockHighlightHandler.java | 22 +- .../core/handlers/RenderTickHandler.java | 57 +++-- ee3_client/ee3/client/gui/GuiCalcinator.java | 4 +- .../ee3/client/render/ModelCalcinator.java | 4 +- .../client/render/RenderItemCalcinator.java | 3 +- .../ee3/client/render/TextureRedWaterFX.java | 4 +- .../client/render/TextureRedWaterFlowFX.java | 4 +- .../ee3/common/EquivalentExchange3.java | 2 +- .../common/block/BlockRedWaterFlowing.java | 6 +- .../ee3/common/block/BlockRedWaterStill.java | 7 +- .../core/handlers/EquivalencyHandler.java | 206 ++++++++++-------- .../core/helper/TransmutationHelper.java | 87 ++++---- ee3_common/ee3/common/item/ItemEE.java | 3 +- ee3_common/ee3/common/lib/Reference.java | 8 - ee3_common/ee3/common/lib/Sprites.java | 15 ++ ee3_common/ee3/common/lib/Strings.java | 1 + resources/ee3/art/sprites/test-circle.png | Bin 0 -> 19370 bytes 18 files changed, 238 insertions(+), 203 deletions(-) rename {ee3_common/ee3/common => ee3_client/ee3/client}/core/handlers/RenderTickHandler.java (60%) create mode 100644 ee3_common/ee3/common/lib/Sprites.java create mode 100644 resources/ee3/art/sprites/test-circle.png diff --git a/ee3_client/ee3/client/core/ClientProxy.java b/ee3_client/ee3/client/core/ClientProxy.java index 0addd2c9..5185012f 100644 --- a/ee3_client/ee3/client/core/ClientProxy.java +++ b/ee3_client/ee3/client/core/ClientProxy.java @@ -13,6 +13,7 @@ import cpw.mods.fml.common.registry.LanguageRegistry; import cpw.mods.fml.common.registry.TickRegistry; import ee3.client.core.handlers.DrawBlockHighlightHandler; import ee3.client.core.handlers.KeyBindingHandler; +import ee3.client.core.handlers.RenderTickHandler; import ee3.client.core.handlers.SoundHandler; import ee3.client.core.helper.KeyBindingHelper; import ee3.client.render.RenderCalcinator; @@ -20,10 +21,9 @@ import ee3.client.render.RenderItemCalcinator; import ee3.client.render.TextureRedWaterFX; import ee3.client.render.TextureRedWaterFlowFX; import ee3.common.core.CommonProxy; -import ee3.common.core.handlers.RenderTickHandler; import ee3.common.lib.BlockIds; -import ee3.common.lib.Reference; import ee3.common.lib.RenderIds; +import ee3.common.lib.Sprites; import ee3.common.tile.TileCalcinator; import static ee3.common.lib.CustomItemRarity.*; @@ -96,8 +96,8 @@ public class ClientProxy extends CommonProxy { RenderIds.calcinatorRenderId = RenderingRegistry.getNextAvailableRenderId(); - MinecraftForgeClient.preloadTexture(Reference.SPRITE_SHEET_LOCATION + Reference.BLOCK_SPRITE_SHEET); - MinecraftForgeClient.preloadTexture(Reference.SPRITE_SHEET_LOCATION + Reference.ITEM_SPRITE_SHEET); + MinecraftForgeClient.preloadTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.BLOCK_SPRITE_SHEET); + MinecraftForgeClient.preloadTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.ITEM_SPRITE_SHEET); FMLClientHandler.instance().getClient().renderEngine.registerTextureFX(new TextureRedWaterFX()); FMLClientHandler.instance().getClient().renderEngine.registerTextureFX(new TextureRedWaterFlowFX()); diff --git a/ee3_client/ee3/client/core/handlers/DrawBlockHighlightHandler.java b/ee3_client/ee3/client/core/handlers/DrawBlockHighlightHandler.java index 1d71ec51..e0ce6d0b 100644 --- a/ee3_client/ee3/client/core/handlers/DrawBlockHighlightHandler.java +++ b/ee3_client/ee3/client/core/handlers/DrawBlockHighlightHandler.java @@ -6,7 +6,7 @@ import org.lwjgl.opengl.GL12; import ee3.common.item.ITransmutationStone; import ee3.common.item.IChargeable; import ee3.common.lib.ConfigurationSettings; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; import net.minecraft.src.EnumMovingObjectType; import net.minecraft.src.RenderEngine; import net.minecraft.src.Tessellator; @@ -38,18 +38,18 @@ public class DrawBlockHighlightHandler { double iPX = event.player.prevPosX + (event.player.posX - event.player.prevPosX) * event.partialTicks; double iPY = event.player.prevPosY + (event.player.posY - event.player.prevPosY) * event.partialTicks; double iPZ = event.player.prevPosZ + (event.player.posZ - event.player.prevPosZ) * event.partialTicks; - int texture = event.context.renderEngine.getTexture(Reference.SPRITE_SHEET_LOCATION + "noise.png"); + int texture = event.context.renderEngine.getTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.WORLD_TRANSMUTATION_TEXTURE); int xScale = 1; int yScale = 1; int zScale = 1; int chargeLevel; int itemChargeLevel = 0; - + if (event.currentItem.getItem() instanceof IChargeable) { - itemChargeLevel = ((IChargeable)event.currentItem.getItem()).getCharge(event.currentItem); + itemChargeLevel = ((IChargeable) event.currentItem.getItem()).getCharge(event.currentItem); } - + chargeLevel = 1 + itemChargeLevel * 2; if ((event.target.sideHit == 0) || (event.target.sideHit == 1)) { @@ -132,15 +132,15 @@ public class DrawBlockHighlightHandler { GL11.glEnable(GL12.GL_RESCALE_NORMAL); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); - GL11.glColor4f(1, 1, 1, transparency); + GL11.glColor4f(1, 1, 1, slide); tessellator.startDrawingQuads(); - tessellator.setColorRGBA_F(1, 1, 1, transparency); + tessellator.setColorRGBA_F(1, 1, 1, slide); - tessellator.addVertexWithUV(-0.5D, 0.5D, 0F, 0, pulse); - tessellator.addVertexWithUV(0.5D, 0.5D, 0F, 0, pulse); - tessellator.addVertexWithUV(0.5D, -0.5D, 0F, 1, pulse); - tessellator.addVertexWithUV(-0.5D, -0.5D, 0F, 1, pulse); + tessellator.addVertexWithUV(-0.5D, 0.5D, 0F, 0, 1); + tessellator.addVertexWithUV(0.5D, 0.5D, 0F, 1, 1); + tessellator.addVertexWithUV(0.5D, -0.5D, 0F, 1, 0); + tessellator.addVertexWithUV(-0.5D, -0.5D, 0F, 0, 0); tessellator.draw(); GL11.glDisable(GL11.GL_BLEND); diff --git a/ee3_common/ee3/common/core/handlers/RenderTickHandler.java b/ee3_client/ee3/client/core/handlers/RenderTickHandler.java similarity index 60% rename from ee3_common/ee3/common/core/handlers/RenderTickHandler.java rename to ee3_client/ee3/client/core/handlers/RenderTickHandler.java index ba1b1884..6baee069 100644 --- a/ee3_common/ee3/common/core/handlers/RenderTickHandler.java +++ b/ee3_client/ee3/client/core/handlers/RenderTickHandler.java @@ -1,4 +1,4 @@ -package ee3.common.core.handlers; +package ee3.client.core.handlers; import java.util.EnumSet; @@ -19,7 +19,6 @@ import net.minecraft.src.ScaledResolution; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.ITickHandler; import cpw.mods.fml.common.TickType; -import ee3.client.core.handlers.DrawBlockHighlightHandler; import ee3.client.core.helper.RenderUtils; import ee3.common.core.helper.TransmutationHelper; import ee3.common.core.helper.VersionHelper; @@ -44,7 +43,7 @@ public class RenderTickHandler implements ITickHandler { if (type.contains(TickType.RENDER)) { if (player != null) { currentItemStack = player.inventory.getCurrentItem(); - + if ((currentItemStack != null) && (minecraft.inGameHasFocus) && (currentItemStack.getItem() instanceof ITransmutationStone) && (ConfigurationSettings.ENABLE_OVERLAY_WORLD_TRANSMUTATION)) { renderStoneHUD(minecraft, player, currentItemStack, (Float) tickData[0]); } @@ -66,39 +65,39 @@ public class RenderTickHandler implements ITickHandler { private static void renderStoneHUD(Minecraft minecraft, EntityPlayer player, ItemStack stack, float partialTicks) { - float overlayScale = 2F; // TODO config option + float overlayScale = 2F; // TODO config option float blockScale = overlayScale / 2; - float overlayOpacity = 1F; // TODO config option - + float overlayOpacity = 1F; // TODO config option + MovingObjectPosition rayTrace = minecraft.objectMouseOver; ItemStack currentBlock = null; - + if ((player.worldObj != null) && (rayTrace != null)) { currentBlock = TransmutationHelper.getNextBlock(player.worldObj.getBlockId(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ), player.worldObj.getBlockMetadata(rayTrace.blockX, rayTrace.blockY, rayTrace.blockZ), player.isSneaking()); } - + GL11.glPushMatrix(); - ScaledResolution sr = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight); - GL11.glClear(256); - GL11.glMatrixMode(GL11.GL_PROJECTION); - GL11.glLoadIdentity(); - GL11.glOrtho(0.0D, sr.getScaledWidth_double(), sr.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); - GL11.glMatrixMode(GL11.GL_MODELVIEW); - GL11.glLoadIdentity(); - GL11.glTranslatef(0.0F, 0.0F, -2000.0F); - - GL11.glPushMatrix(); - RenderHelper.enableGUIStandardItemLighting(); - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glEnable(GL12.GL_RESCALE_NORMAL); - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - GL11.glEnable(GL11.GL_LIGHTING); - RenderUtils.renderItemIntoGUI(minecraft.fontRenderer, minecraft.renderEngine, stack, (int) (sr.getScaledWidth() - (16 * overlayScale)), (int) (sr.getScaledHeight() - (16 * overlayScale)), overlayOpacity / 2, overlayScale); - if ((currentBlock != null) && (currentBlock.getItem() instanceof ItemBlock)) { - RenderUtils.renderRotatingBlockIntoGUI(minecraft.fontRenderer, minecraft.renderEngine, currentBlock, (int) (sr.getScaledWidth() - (16 * overlayScale) / 2 - 8), (int) (sr.getScaledHeight() - (16 * overlayScale) / 2 - 8), -90, blockScale); - } - GL11.glDisable(GL11.GL_LIGHTING); - GL11.glPopMatrix(); + ScaledResolution sr = new ScaledResolution(minecraft.gameSettings, minecraft.displayWidth, minecraft.displayHeight); + GL11.glClear(256); + GL11.glMatrixMode(GL11.GL_PROJECTION); + GL11.glLoadIdentity(); + GL11.glOrtho(0.0D, sr.getScaledWidth_double(), sr.getScaledHeight_double(), 0.0D, 1000.0D, 3000.0D); + GL11.glMatrixMode(GL11.GL_MODELVIEW); + GL11.glLoadIdentity(); + GL11.glTranslatef(0.0F, 0.0F, -2000.0F); + + GL11.glPushMatrix(); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glEnable(GL11.GL_LIGHTING); + RenderUtils.renderItemIntoGUI(minecraft.fontRenderer, minecraft.renderEngine, stack, (int) (sr.getScaledWidth() - (16 * overlayScale)), (int) (sr.getScaledHeight() - (16 * overlayScale)), overlayOpacity / 2, overlayScale); + if ((currentBlock != null) && (currentBlock.getItem() instanceof ItemBlock)) { + RenderUtils.renderRotatingBlockIntoGUI(minecraft.fontRenderer, minecraft.renderEngine, currentBlock, (int) (sr.getScaledWidth() - (16 * overlayScale) / 2 - 8), (int) (sr.getScaledHeight() - (16 * overlayScale) / 2 - 8), -90, blockScale); + } + GL11.glDisable(GL11.GL_LIGHTING); + GL11.glPopMatrix(); GL11.glPopMatrix(); } diff --git a/ee3_client/ee3/client/gui/GuiCalcinator.java b/ee3_client/ee3/client/gui/GuiCalcinator.java index 8b3e2619..6132db65 100644 --- a/ee3_client/ee3/client/gui/GuiCalcinator.java +++ b/ee3_client/ee3/client/gui/GuiCalcinator.java @@ -6,7 +6,7 @@ import cpw.mods.fml.common.Side; import cpw.mods.fml.common.asm.SideOnly; import cpw.mods.fml.common.registry.LanguageRegistry; import ee3.common.container.ContainerCalcinator; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; import ee3.common.lib.Strings; import ee3.common.tile.TileCalcinator; import net.minecraft.src.Container; @@ -42,7 +42,7 @@ public class GuiCalcinator extends GuiContainer { protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { - int var4 = this.mc.renderEngine.getTexture(Reference.GUI_SHEET_LOCATION + "calcinator.png"); + int var4 = this.mc.renderEngine.getTexture(Sprites.GUI_SHEET_LOCATION + Sprites.CALCINATOR_MODEL_TEXTURE); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture(var4); int var5 = (this.width - this.xSize) / 2; diff --git a/ee3_client/ee3/client/render/ModelCalcinator.java b/ee3_client/ee3/client/render/ModelCalcinator.java index fb3c61a1..de21b265 100644 --- a/ee3_client/ee3/client/render/ModelCalcinator.java +++ b/ee3_client/ee3/client/render/ModelCalcinator.java @@ -2,7 +2,7 @@ package ee3.client.render; import org.lwjgl.opengl.GL11; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; import ee3.common.tile.TileCalcinator; import net.minecraft.src.ModelBase; import net.minecraft.src.ModelRenderer; @@ -130,7 +130,7 @@ public class ModelCalcinator extends ModelBase { GL11.glDisable(GL11.GL_LIGHTING); GL11.glTranslated(x, y, z); - ForgeHooksClient.bindTexture(Reference.SPRITE_SHEET_LOCATION + Reference.CALCINATOR_TEXTURE_SHEET, 0); + ForgeHooksClient.bindTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.CALCINATOR_MODEL_TEXTURE, 0); firePotBottom.render(scale); bowlBottom.render(scale); diff --git a/ee3_client/ee3/client/render/RenderItemCalcinator.java b/ee3_client/ee3/client/render/RenderItemCalcinator.java index 3ede590f..8432d6a5 100644 --- a/ee3_client/ee3/client/render/RenderItemCalcinator.java +++ b/ee3_client/ee3/client/render/RenderItemCalcinator.java @@ -3,6 +3,7 @@ package ee3.client.render; import org.lwjgl.opengl.GL11; import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; import net.minecraft.src.ItemStack; import net.minecraft.src.Tessellator; import net.minecraftforge.client.ForgeHooksClient; @@ -48,7 +49,7 @@ public class RenderItemCalcinator implements IItemRenderer { private void renderCalcinator(float x, float y, float z) { Tessellator tesselator = Tessellator.instance; - ForgeHooksClient.bindTexture(Reference.SPRITE_SHEET_LOCATION + "calcinator.png", 0); + ForgeHooksClient.bindTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.CALCINATOR_MODEL_TEXTURE, 0); GL11.glPushMatrix(); //start GL11.glTranslatef(x, y, z); //size calcinatorModel.render(0.0625F); diff --git a/ee3_client/ee3/client/render/TextureRedWaterFX.java b/ee3_client/ee3/client/render/TextureRedWaterFX.java index 98d4ade7..adee7bc9 100644 --- a/ee3_client/ee3/client/render/TextureRedWaterFX.java +++ b/ee3_client/ee3/client/render/TextureRedWaterFX.java @@ -6,7 +6,7 @@ import net.minecraft.src.RenderEngine; import net.minecraftforge.client.MinecraftForgeClient; import cpw.mods.fml.client.FMLTextureFX; import ee3.common.block.ModBlocks; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; /** * TextureRedWaterFX @@ -42,7 +42,7 @@ public class TextureRedWaterFX extends FMLTextureFX { @Override public void bindImage(RenderEngine renderEngine) { - GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderEngine.getTexture(Reference.SPRITE_SHEET_LOCATION + Reference.BLOCK_SPRITE_SHEET)); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderEngine.getTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.BLOCK_SPRITE_SHEET)); } public void onTick() { diff --git a/ee3_client/ee3/client/render/TextureRedWaterFlowFX.java b/ee3_client/ee3/client/render/TextureRedWaterFlowFX.java index 5a70ad8e..f09b2971 100644 --- a/ee3_client/ee3/client/render/TextureRedWaterFlowFX.java +++ b/ee3_client/ee3/client/render/TextureRedWaterFlowFX.java @@ -6,7 +6,7 @@ import org.lwjgl.opengl.GL11; import cpw.mods.fml.client.FMLTextureFX; import ee3.common.block.ModBlocks; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; /** * TextureRedWaterFlowFX @@ -43,7 +43,7 @@ public class TextureRedWaterFlowFX extends FMLTextureFX { @Override public void bindImage(RenderEngine renderEngine) { - GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderEngine.getTexture(Reference.SPRITE_SHEET_LOCATION + Reference.BLOCK_SPRITE_SHEET)); + GL11.glBindTexture(GL11.GL_TEXTURE_2D, renderEngine.getTexture(Sprites.SPRITE_SHEET_LOCATION + Sprites.BLOCK_SPRITE_SHEET)); } public void onTick() { diff --git a/ee3_common/ee3/common/EquivalentExchange3.java b/ee3_common/ee3/common/EquivalentExchange3.java index 516e6ab4..51db7eb8 100644 --- a/ee3_common/ee3/common/EquivalentExchange3.java +++ b/ee3_common/ee3/common/EquivalentExchange3.java @@ -17,6 +17,7 @@ import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.common.registry.TickRegistry; +import ee3.client.core.handlers.RenderTickHandler; import ee3.common.block.ModBlocks; import ee3.common.core.CommonProxy; import ee3.common.core.CreativeTabEE3; @@ -28,7 +29,6 @@ import ee3.common.core.handlers.ItemPickupHandler; import ee3.common.core.handlers.LocalizationHandler; import ee3.common.core.handlers.PacketHandler; import ee3.common.core.handlers.PlayerDestroyItemHandler; -import ee3.common.core.handlers.RenderTickHandler; import ee3.common.core.handlers.VersionCheckTickHandler; import ee3.common.core.helper.LogHelper; import ee3.common.core.helper.VersionHelper; diff --git a/ee3_common/ee3/common/block/BlockRedWaterFlowing.java b/ee3_common/ee3/common/block/BlockRedWaterFlowing.java index c4633a07..435704d4 100644 --- a/ee3_common/ee3/common/block/BlockRedWaterFlowing.java +++ b/ee3_common/ee3/common/block/BlockRedWaterFlowing.java @@ -2,6 +2,8 @@ package ee3.common.block; import ee3.common.EquivalentExchange3; import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; +import ee3.common.lib.Strings; import net.minecraft.src.BlockFlowing; import net.minecraft.src.CreativeTabs; import net.minecraft.src.Material; @@ -22,12 +24,12 @@ public class BlockRedWaterFlowing extends BlockFlowing { this.blockHardness = 100F; this.setLightOpacity(3); this.setCreativeTab(EquivalentExchange3.tabsEE3); - this.setBlockName("redWaterFlowing"); + this.setBlockName(Strings.RED_WATER_FLOWING_NAME); } @Override public String getTextureFile() { - return Reference.SPRITE_SHEET_LOCATION + Reference.BLOCK_SPRITE_SHEET; + return Sprites.SPRITE_SHEET_LOCATION + Sprites.BLOCK_SPRITE_SHEET; } } diff --git a/ee3_common/ee3/common/block/BlockRedWaterStill.java b/ee3_common/ee3/common/block/BlockRedWaterStill.java index 8c8b89fe..e9081d22 100644 --- a/ee3_common/ee3/common/block/BlockRedWaterStill.java +++ b/ee3_common/ee3/common/block/BlockRedWaterStill.java @@ -1,7 +1,8 @@ package ee3.common.block; import ee3.common.EquivalentExchange3; -import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; +import ee3.common.lib.Strings; import net.minecraft.src.BlockStationary; import net.minecraft.src.Material; @@ -20,7 +21,7 @@ public class BlockRedWaterStill extends BlockStationary { super(id, Material.water); this.blockHardness = 100F; this.setLightOpacity(3); - this.setBlockName("redWaterStill"); + this.setBlockName(Strings.RED_WATER_STILL_NAME); this.setCreativeTab(EquivalentExchange3.tabsEE3); this.disableStats(); this.setRequiresSelfNotify(); @@ -28,7 +29,7 @@ public class BlockRedWaterStill extends BlockStationary { @Override public String getTextureFile() { - return Reference.SPRITE_SHEET_LOCATION + Reference.BLOCK_SPRITE_SHEET; + return Sprites.SPRITE_SHEET_LOCATION + Sprites.BLOCK_SPRITE_SHEET; } } diff --git a/ee3_common/ee3/common/core/handlers/EquivalencyHandler.java b/ee3_common/ee3/common/core/handlers/EquivalencyHandler.java index cd02a3c6..c1f623c5 100644 --- a/ee3_common/ee3/common/core/handlers/EquivalencyHandler.java +++ b/ee3_common/ee3/common/core/handlers/EquivalencyHandler.java @@ -16,19 +16,22 @@ import net.minecraft.src.ItemStack; */ public class EquivalencyHandler { - private static final EquivalencyHandler instance = new EquivalencyHandler(); - + private static final EquivalencyHandler instance = new EquivalencyHandler(); + private static ArrayList> equivalencyList = new ArrayList>(); - + public static EquivalencyHandler instance() { - return instance; + + return instance; } - + public ArrayList> getAllLists() { - return equivalencyList; + + return equivalencyList; } public void addObjects(Object obj1, Object obj2) { + ItemStack stack1 = GeneralHelper.convertObjectToItemStack(obj1); ItemStack stack2 = GeneralHelper.convertObjectToItemStack(obj2); @@ -39,7 +42,7 @@ public class EquivalencyHandler { if ((stack1Index != null) && (stack2Index != null)) { return; - } + } else if ((stack1Index != null) && (stack2Index == null)) { currentList = equivalencyList.get(stack1Index.intValue()); currentList.add(stack2); @@ -58,6 +61,7 @@ public class EquivalencyHandler { } public void addObjects(Object... objList) { + if (objList.length < 2) return; @@ -67,6 +71,7 @@ public class EquivalencyHandler { } public Integer getIndexInList(Object obj) { + ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); ArrayList currentList; int i = 0; @@ -83,25 +88,27 @@ public class EquivalencyHandler { return null; } - - public Integer getIndexinList(int id, int meta) { - ArrayList currentList; - int i = 0; - while (i < equivalencyList.size()) { - currentList = equivalencyList.get(i); - for (ItemStack currentStack : currentList) { - if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { - return new Integer(i); - } - } - ++i; - } + public Integer getIndexInList(int id, int meta) { - return null; + ArrayList currentList; + int i = 0; + + while (i < equivalencyList.size()) { + currentList = equivalencyList.get(i); + for (ItemStack currentStack : currentList) { + if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { + return new Integer(i); + } + } + ++i; + } + + return null; } public ArrayList getEquivalencyList(Object obj) { + ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); if (checkStack == null) @@ -117,95 +124,106 @@ public class EquivalencyHandler { return null; } - + public ArrayList getEquivalencyList(int id, int meta) { - for (ArrayList list : equivalencyList) { - for (ItemStack currentStack : list) { - if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { - return list; - } - } - } - return null; + for (ArrayList list : equivalencyList) { + for (ItemStack currentStack : list) { + if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { + return list; + } + } + } + + return null; } - + public ItemStack getNextInList(Object obj) { - ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); - if (checkStack != null) { - return getNextInList(checkStack.itemID, checkStack.getItemDamage()); - } - - return null; + ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); + + if (checkStack != null) { + return getNextInList(checkStack.itemID, checkStack.getItemDamage()); + } + + return null; } - + public ItemStack getNextInList(int id, int meta) { - ArrayList list = getEquivalencyList(id, meta); - ItemStack currentStack; - ItemStack returnStack = null; - int i = 0; + ArrayList list = getEquivalencyList(id, meta); - if (list != null) { - if (list.size() == 1) { - return list.get(i); - } - - while (i < list.size()) { - currentStack = list.get(i); - - if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { - returnStack = list.get((i + 1) % list.size()); - break; - } - - ++i; - } - } + ItemStack currentStack; + ItemStack returnStack = null; + int i = 0; - return returnStack; - } - - public ItemStack getPrevInList(Object obj) { - ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); - - if (checkStack != null) { - return getPrevInList(checkStack.itemID, checkStack.getItemDamage()); - } - - return null; - } - - public ItemStack getPrevInList(int id, int meta) { - ArrayList list = getEquivalencyList(id, meta); - - ItemStack currentStack; - ItemStack returnStack = null; - int i = 0; - - if (list != null) { - if (list.size() == 1) { + if (list != null) { + if (list.size() == 1) { return list.get(i); } - - while (i < list.size()) { - currentStack = list.get(i); - - if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { - int index = ((i - 1) + list.size()) % list.size(); - returnStack = list.get(index); - break; - } - - ++i; - } - } - return returnStack; + while (i < list.size()) { + currentStack = list.get(i); + + if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { + returnStack = list.get((i + 1) % list.size()); + break; + } + + ++i; + } + } + + return returnStack; + } + + public ItemStack getPrevInList(Object obj) { + + ItemStack checkStack = GeneralHelper.convertObjectToItemStack(obj); + + if (checkStack != null) { + return getPrevInList(checkStack.itemID, checkStack.getItemDamage()); + } + + return null; + } + + public ItemStack getPrevInList(int id, int meta) { + + ArrayList list = getEquivalencyList(id, meta); + + ItemStack currentStack; + ItemStack returnStack = null; + int i = 0; + + if (list != null) { + if (list.size() == 1) { + return list.get(i); + } + + while (i < list.size()) { + currentStack = list.get(i); + + if ((id == currentStack.itemID) && (meta == currentStack.getItemDamage())) { + int index = ((i - 1) + list.size()) % list.size(); + returnStack = list.get(index); + break; + } + + ++i; + } + } + + return returnStack; + } + + public boolean areEquivalent(Object obj1, Object obj2) { + + return (getEquivalencyList(obj1).equals(getEquivalencyList(obj2))); } public void debug() { + int i = 0; for (ArrayList list : equivalencyList) { System.out.println("equivalencyList[" + i + "]: " + list.toString()); diff --git a/ee3_common/ee3/common/core/helper/TransmutationHelper.java b/ee3_common/ee3/common/core/helper/TransmutationHelper.java index 1de1667e..348eb344 100644 --- a/ee3_common/ee3/common/core/helper/TransmutationHelper.java +++ b/ee3_common/ee3/common/core/helper/TransmutationHelper.java @@ -30,7 +30,7 @@ public class TransmutationHelper { int meta = world.getBlockMetadata(x, y, z); if ((world.getBlockMaterial(x, y, z) == Material.leaves) && (Block.blocksList[id] instanceof BlockLeaves)) { - meta = meta % 4; + meta = meta % 4; } ItemStack nextItem = getNextBlock(id, meta, player.isSneaking()); @@ -42,70 +42,75 @@ public class TransmutationHelper { return true; } } - + return false; } - + public static ItemStack getNextBlock(int id, int meta, boolean allowFalling) { + ArrayList list = EquivalencyHandler.instance().getEquivalencyList(id, meta); - + ItemStack nextStack = null; - + if (list != null) { return getNextBlock(id, meta, id, meta, allowFalling); } - + return nextStack; } - + private static ItemStack getNextBlock(int id, int meta, int origId, int origMeta, boolean allowFalling) { + ArrayList list = EquivalencyHandler.instance().getEquivalencyList(id, meta); - + ItemStack nextStack = null; - + if (list != null) { nextStack = EquivalencyHandler.instance().getNextInList(id, meta); /* - * If the current item is the same as the original one we started with, then we have - * recursed through the entire list and not found a next block so return the original. - * This is the "base case" for the recursion. + * If the current item is the same as the original one we started + * with, then we have recursed through the entire list and not found + * a next block so return the original. This is the "base case" for + * the recursion. */ if ((nextStack.itemID == origId) && (nextStack.getItemDamage() == origMeta)) { - return nextStack; + return nextStack; } else { - /* - * If we are allowing any block (including falling ones) just check to see if the - * next item is a block. If it is, return it. Otherwise continue the recursion. - */ - if (allowFalling) { - if (nextStack.getItem() instanceof ItemBlock) { - return nextStack; - } - else { - return getNextBlock(nextStack.itemID, nextStack.getItemDamage(), origId, origMeta, allowFalling); - } - } - /* - * Else we need to check to make sure the next item is both a block and not an - * instance of BlockSand (which all gravity affected blocks are a subclass of. - * If the next item is a block, and is not a subclass of BlockSand return it, - * otherwise, continue the recursion. - */ - else { - if ((nextStack.getItem() instanceof ItemBlock) && (!(Block.blocksList[nextStack.itemID] instanceof BlockSand))) { - return nextStack; - } - else { - return getNextBlock(nextStack.itemID, nextStack.getItemDamage(), origId, origMeta, allowFalling); - } - } + /* + * If we are allowing any block (including falling ones) just + * check to see if the next item is a block. If it is, return + * it. Otherwise continue the recursion. + */ + if (allowFalling) { + if (nextStack.getItem() instanceof ItemBlock) { + return nextStack; + } + else { + return getNextBlock(nextStack.itemID, nextStack.getItemDamage(), origId, origMeta, allowFalling); + } + } + /* + * Else we need to check to make sure the next item is both a + * block and not an instance of BlockSand (which all gravity + * affected blocks are a subclass of. If the next item is a + * block, and is not a subclass of BlockSand return it, + * otherwise, continue the recursion. + */ + else { + if ((nextStack.getItem() instanceof ItemBlock) && (!(Block.blocksList[nextStack.itemID] instanceof BlockSand))) { + return nextStack; + } + else { + return getNextBlock(nextStack.itemID, nextStack.getItemDamage(), origId, origMeta, allowFalling); + } + } } } - + // In the event the list is null, return null return nextStack; } - + } diff --git a/ee3_common/ee3/common/item/ItemEE.java b/ee3_common/ee3/common/item/ItemEE.java index a20ae239..c2040708 100644 --- a/ee3_common/ee3/common/item/ItemEE.java +++ b/ee3_common/ee3/common/item/ItemEE.java @@ -1,6 +1,7 @@ package ee3.common.item; import ee3.common.lib.Reference; +import ee3.common.lib.Sprites; import net.minecraft.src.Item; /** @@ -17,7 +18,7 @@ public class ItemEE extends Item { public ItemEE(int id) { super(id - Reference.SHIFTED_ID_RANGE_CORRECTION); maxStackSize = 1; - setTextureFile(Reference.SPRITE_SHEET_LOCATION + Reference.ITEM_SPRITE_SHEET); + setTextureFile(Sprites.SPRITE_SHEET_LOCATION + Sprites.ITEM_SPRITE_SHEET); setNoRepair(); } diff --git a/ee3_common/ee3/common/lib/Reference.java b/ee3_common/ee3/common/lib/Reference.java index a6e5c761..cab79fef 100644 --- a/ee3_common/ee3/common/lib/Reference.java +++ b/ee3_common/ee3/common/lib/Reference.java @@ -34,14 +34,6 @@ public class Reference { public static final String KEYBINDING_CHARGE = "key.charge"; public static final int KEYBINDING_CHARGE_DEFAULT = 47; - /* Texture related constants */ - public static final String SPRITE_SHEET_LOCATION = "/ee3/art/sprites/"; - public static final String ARMOR_SHEET_LOCATION = "/ee3/art/armor/"; - public static final String GUI_SHEET_LOCATION = "/ee3/art/gui/"; - public static final String ITEM_SPRITE_SHEET = "ee3_items.png"; - public static final String BLOCK_SPRITE_SHEET = "ee3_blocks.png"; - public static final String CALCINATOR_TEXTURE_SHEET = "calcinator.png"; - /* General Tile Entity related constants */ public static final String TE_GEN_OWNER_NBT_TAG_LABEL = "owner"; public static final String TE_GEN_STATE_NBT_TAG_LABEL = "state"; diff --git a/ee3_common/ee3/common/lib/Sprites.java b/ee3_common/ee3/common/lib/Sprites.java new file mode 100644 index 00000000..fe186c50 --- /dev/null +++ b/ee3_common/ee3/common/lib/Sprites.java @@ -0,0 +1,15 @@ +package ee3.common.lib; + + +public class Sprites { + + public static final String SPRITE_SHEET_LOCATION = "/ee3/art/sprites/"; + public static final String ARMOR_SHEET_LOCATION = "/ee3/art/armor/"; + public static final String GUI_SHEET_LOCATION = "/ee3/art/gui/"; + + public static final String ITEM_SPRITE_SHEET = "ee3_items.png"; + public static final String BLOCK_SPRITE_SHEET = "ee3_blocks.png"; + public static final String CALCINATOR_MODEL_TEXTURE = "calcinator.png"; + public static final String WORLD_TRANSMUTATION_TEXTURE = "noise.png"; + +} diff --git a/ee3_common/ee3/common/lib/Strings.java b/ee3_common/ee3/common/lib/Strings.java index 194ba426..dbca0c37 100644 --- a/ee3_common/ee3/common/lib/Strings.java +++ b/ee3_common/ee3/common/lib/Strings.java @@ -21,6 +21,7 @@ public class Strings { /* Block name constants */ public static final String CALCINATOR_NAME = "calcinator"; public static final String RED_WATER_STILL_NAME = "redWaterStill"; + public static final String RED_WATER_FLOWING_NAME = "redWaterFlowing"; /* Item name constants */ public static final String MINIUM_SHARD_NAME = "miniumShard"; diff --git a/resources/ee3/art/sprites/test-circle.png b/resources/ee3/art/sprites/test-circle.png new file mode 100644 index 0000000000000000000000000000000000000000..5005589e9938391d25f31ddf202bd666208ed761 GIT binary patch literal 19370 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