diff --git a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java index 3678aca46..21bf26eae 100644 --- a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java +++ b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java @@ -23,7 +23,6 @@ import net.minecraft.client.network.NetHandlerPlayClient; import net.minecraft.client.renderer.entity.RenderSnowball; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.Item; import net.minecraft.item.ItemRecord; import net.minecraft.item.ItemStack; @@ -101,6 +100,7 @@ import vazkii.botania.client.render.tile.RenderTilePylon; import vazkii.botania.client.render.tile.RenderTileRedString; import vazkii.botania.client.render.tile.RenderTileRuneAltar; import vazkii.botania.client.render.tile.RenderTileSkullOverride; +import vazkii.botania.client.render.tile.RenderTileSparkChanger; import vazkii.botania.client.render.tile.RenderTileSpawnerClaw; import vazkii.botania.client.render.tile.RenderTileSpreader; import vazkii.botania.client.render.tile.RenderTileStarfield; @@ -117,6 +117,7 @@ import vazkii.botania.common.block.tile.TileHourglass; import vazkii.botania.common.block.tile.TileIncensePlate; import vazkii.botania.common.block.tile.TilePylon; import vazkii.botania.common.block.tile.TileRuneAltar; +import vazkii.botania.common.block.tile.TileSparkChanger; import vazkii.botania.common.block.tile.TileSpawnerClaw; import vazkii.botania.common.block.tile.TileStarfield; import vazkii.botania.common.block.tile.TileTerraPlate; @@ -151,8 +152,8 @@ import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.relauncher.ReflectionHelper; public class ClientProxy extends CommonProxy { @@ -278,6 +279,7 @@ public class ClientProxy extends CommonProxy { ClientRegistry.bindTileEntitySpecialRenderer(TileCorporeaCrystalCube.class, new RenderTileCorporeaCrystalCube()); ClientRegistry.bindTileEntitySpecialRenderer(TileIncensePlate.class, new RenderTileIncensePlate()); ClientRegistry.bindTileEntitySpecialRenderer(TileHourglass.class, new RenderTileHourglass()); + ClientRegistry.bindTileEntitySpecialRenderer(TileSparkChanger.class, new RenderTileSparkChanger()); ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySkull.class, new RenderTileSkullOverride()); diff --git a/src/main/java/vazkii/botania/client/render/tile/RenderTileSparkChanger.java b/src/main/java/vazkii/botania/client/render/tile/RenderTileSparkChanger.java new file mode 100644 index 000000000..97188418e --- /dev/null +++ b/src/main/java/vazkii/botania/client/render/tile/RenderTileSparkChanger.java @@ -0,0 +1,66 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jun 28, 2015, 10:19:20 PM (GMT)] + */ +package vazkii.botania.client.render.tile; + +import java.awt.Color; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; + +import org.lwjgl.opengl.GL11; + +import vazkii.botania.common.block.tile.TileSparkChanger; + +public class RenderTileSparkChanger extends TileEntitySpecialRenderer { + + @Override + public void renderTileEntityAt(TileEntity tileentity, double d0, double d1, double d2, float pticks) { + GL11.glPushMatrix(); + GL11.glTranslated(d0, d1, d2); + GL11.glRotated(90F, 1F, 0F, 0F); + GL11.glTranslatef(0.8F, 0.2F, -0.22F); + GL11.glColor4f(1F, 1F, 1F, 1F); + ItemStack stack = ((TileSparkChanger) tileentity).getStackInSlot(0); + if(stack != null) { + GL11.glPushMatrix(); + Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.locationItemsTexture); + float s = 0.6F; + GL11.glScalef(s, s, s); + GL11.glRotatef(180F, 0F, 1F, 0F); + + int renderPass = 0; + do { + IIcon icon = stack.getItem().getIcon(stack, renderPass); + if(icon != null) { + Color color = new Color(stack.getItem().getColorFromItemStack(stack, renderPass)); + GL11.glColor3ub((byte) color.getRed(), (byte) color.getGreen(), (byte) color.getBlue()); + float f = icon.getMinU(); + float f1 = icon.getMaxU(); + float f2 = icon.getMinV(); + float f3 = icon.getMaxV(); + ItemRenderer.renderItemIn2D(Tessellator.instance, f1, f2, f, f3, icon.getIconWidth(), icon.getIconHeight(), 1F / 16F); + GL11.glColor3f(1F, 1F, 1F); + } + renderPass++; + } while(renderPass < stack.getItem().getRenderPasses(stack.getItemDamage())); + GL11.glPopMatrix(); + } + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glPopMatrix(); + } + +} diff --git a/src/main/java/vazkii/botania/common/block/BlockSparkChanger.java b/src/main/java/vazkii/botania/common/block/BlockSparkChanger.java new file mode 100644 index 000000000..040cf5994 --- /dev/null +++ b/src/main/java/vazkii/botania/common/block/BlockSparkChanger.java @@ -0,0 +1,160 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jun 28, 2015, 10:01:01 PM (GMT)] + */ +package vazkii.botania.common.block; + +import java.util.Random; + +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import vazkii.botania.client.core.helper.IconHelper; +import vazkii.botania.common.block.tile.TileSimpleInventory; +import vazkii.botania.common.block.tile.TileSparkChanger; +import vazkii.botania.common.block.tile.TileTerraPlate; +import vazkii.botania.common.block.tile.string.TileRedStringDispenser; +import vazkii.botania.common.item.ModItems; +import vazkii.botania.common.lib.LibBlockNames; + +public class BlockSparkChanger extends BlockModContainer { + + IIcon[] icons; + Random random; + + public BlockSparkChanger() { + super(Material.rock); + setBlockBounds(0F, 0F, 0F, 1F, 3F / 16F, 1F); + setHardness(2.0F); + setResistance(10.0F); + setStepSound(soundTypeStone); + setBlockName(LibBlockNames.SPARK_CHANGER); + + random = new Random(); + } + + @Override + public boolean renderAsNormalBlock() { + return false; + } + + @Override + public boolean isOpaqueCube() { + return false; + } + + @Override + public boolean getBlocksMovement(IBlockAccess p_149655_1_, int p_149655_2_, int p_149655_3_, int p_149655_4_) { + return false; + } + + @Override + public void registerBlockIcons(IIconRegister par1IconRegister) { + icons = new IIcon[3]; + for(int i = 0; i < icons.length; i++) + icons[i] = IconHelper.forBlock(par1IconRegister, this, i); + } + + @Override + public IIcon getIcon(int par1, int par2) { + return icons[Math.min(2, par1)]; + } + + @Override + public void onNeighborBlockChange(World world, int x, int y, int z, Block block) { + boolean power = world.isBlockIndirectlyGettingPowered(x, y, z) || world.isBlockIndirectlyGettingPowered(x, y + 1, z); + int meta = world.getBlockMetadata(x, y, z); + boolean powered = (meta & 8) != 0; + + if(power && !powered) { + ((TileSparkChanger) world.getTileEntity(x, y, z)).doSwap(); + world.setBlockMetadataWithNotify(x, y, z, meta | 8, 4); + } else if(!power && powered) + world.setBlockMetadataWithNotify(x, y, z, meta & -9, 4); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int s, float xs, float ys, float zs) { + TileSparkChanger changer = (TileSparkChanger) world.getTileEntity(x, y, z); + ItemStack cstack = changer.getStackInSlot(0); + ItemStack pstack = player.getCurrentEquippedItem(); + if(pstack != null && pstack.getItem() == ModItems.sparkUpgrade) { + changer.setInventorySlotContents(0, pstack.copy()); + changer.markDirty(); + + pstack.stackSize--; + if(pstack.stackSize == 0) + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + + if(cstack != null && !player.inventory.addItemStackToInventory(cstack)) + player.dropPlayerItemWithRandomChoice(cstack, false); + return true; + } else if(cstack != null) { + changer.setInventorySlotContents(0, null); + changer.markDirty(); + if(!player.inventory.addItemStackToInventory(cstack)) + player.dropPlayerItemWithRandomChoice(cstack, false); + return true; + } + + return false; + } + + @Override + public void breakBlock(World par1World, int par2, int par3, int par4, Block par5, int par6) { + TileSimpleInventory inv = (TileSimpleInventory) par1World.getTileEntity(par2, par3, par4); + + if (inv != null) { + for (int j1 = 0; j1 < inv.getSizeInventory(); ++j1) { + ItemStack itemstack = inv.getStackInSlot(j1); + + if (itemstack != null) { + float f = random.nextFloat() * 0.8F + 0.1F; + float f1 = random.nextFloat() * 0.8F + 0.1F; + EntityItem entityitem; + + for (float f2 = random.nextFloat() * 0.8F + 0.1F; itemstack.stackSize > 0; par1World.spawnEntityInWorld(entityitem)) { + int k1 = random.nextInt(21) + 10; + + if (k1 > itemstack.stackSize) + k1 = itemstack.stackSize; + + itemstack.stackSize -= k1; + entityitem = new EntityItem(par1World, par2 + f, par3 + f1, par4 + f2, new ItemStack(itemstack.getItem(), k1, itemstack.getItemDamage())); + float f3 = 0.05F; + entityitem.motionX = (float)random.nextGaussian() * f3; + entityitem.motionY = (float)random.nextGaussian() * f3 + 0.2F; + entityitem.motionZ = (float)random.nextGaussian() * f3; + + if (itemstack.hasTagCompound()) + entityitem.getEntityItem().setTagCompound((NBTTagCompound)itemstack.getTagCompound().copy()); + } + } + } + + par1World.func_147453_f(par2, par3, par4, par5); + } + + super.breakBlock(par1World, par2, par3, par4, par5, par6); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta) { + return new TileSparkChanger(); + } + +} diff --git a/src/main/java/vazkii/botania/common/block/ModBlocks.java b/src/main/java/vazkii/botania/common/block/ModBlocks.java index 47a5a9ff0..2a036fa48 100644 --- a/src/main/java/vazkii/botania/common/block/ModBlocks.java +++ b/src/main/java/vazkii/botania/common/block/ModBlocks.java @@ -127,6 +127,7 @@ import vazkii.botania.common.block.tile.TileOpenCrate; import vazkii.botania.common.block.tile.TilePlatform; import vazkii.botania.common.block.tile.TilePylon; import vazkii.botania.common.block.tile.TileRuneAltar; +import vazkii.botania.common.block.tile.TileSparkChanger; import vazkii.botania.common.block.tile.TileSpawnerClaw; import vazkii.botania.common.block.tile.TileSpecialFlower; import vazkii.botania.common.block.tile.TileStarfield; @@ -229,6 +230,7 @@ public final class ModBlocks { public static Block incensePlate; public static Block hourglass; public static Block ghostRail; + public static Block sparkChanger; public static void init() { flower = new BlockModFlower(); @@ -302,6 +304,7 @@ public final class ModBlocks { incensePlate = new BlockIncensePlate(); hourglass = new BlockHourglass(); ghostRail = new BlockGhostRail(); + sparkChanger = new BlockSparkChanger(); ModFluffBlocks.init(); @@ -391,6 +394,7 @@ public final class ModBlocks { registerTile(TileCorporeaCrystalCube.class, LibBlockNames.CORPOREA_CRYSTAL_CUBE); registerTile(TileIncensePlate.class, LibBlockNames.INCENSE_PLATE); registerTile(TileHourglass.class, LibBlockNames.HOURGLASS); + registerTile(TileSparkChanger.class, LibBlockNames.SPARK_CHANGER); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_PUREDAISY, SubTilePureDaisy.class); BotaniaAPI.registerSubTile(LibBlockNames.SUBTILE_MANASTAR, SubTileManastar.class); diff --git a/src/main/java/vazkii/botania/common/block/tile/TileSparkChanger.java b/src/main/java/vazkii/botania/common/block/tile/TileSparkChanger.java new file mode 100644 index 000000000..13c1052f6 --- /dev/null +++ b/src/main/java/vazkii/botania/common/block/tile/TileSparkChanger.java @@ -0,0 +1,86 @@ +/** + * This class was created by . It's distributed as + * part of the Botania Mod. Get the Source Code in github: + * https://github.com/Vazkii/Botania + * + * Botania is Open Source and distributed under the + * Botania License: http://botaniamod.net/license.php + * + * File Created @ [Jun 28, 2015, 10:02:11 PM (GMT)] + */ +package vazkii.botania.common.block.tile; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; +import vazkii.botania.api.internal.VanillaPacketDispatcher; +import vazkii.botania.api.mana.spark.ISparkAttachable; +import vazkii.botania.api.mana.spark.ISparkEntity; +import vazkii.botania.common.item.ModItems; +import vazkii.botania.common.lib.LibBlockNames; +import vazkii.botania.common.lib.LibMisc; + +public class TileSparkChanger extends TileSimpleInventory { + + public void doSwap() { + if(worldObj.isRemote) + return; + + ItemStack changeStack = getStackInSlot(0); + List attachables = new ArrayList(); + for(ForgeDirection dir : LibMisc.CARDINAL_DIRECTIONS) { + TileEntity tile = worldObj.getTileEntity(xCoord + dir.offsetX, yCoord, zCoord + dir.offsetZ); + if(tile != null && tile instanceof ISparkAttachable) { + ISparkAttachable attach = (ISparkAttachable) tile; + ISparkEntity spark = attach.getAttachedSpark(); + if(spark != null) { + int upg = spark.getUpgrade(); + int newUpg = changeStack == null ? 0 : changeStack.getItemDamage() + 1; + if(upg != newUpg) + attachables.add(attach); + } + } + } + + if(attachables.size() > 0) { + ISparkAttachable attach = attachables.get(worldObj.rand.nextInt(attachables.size())); + ISparkEntity spark = attach.getAttachedSpark(); + int upg = spark.getUpgrade(); + ItemStack sparkStack = upg == 0 ? null : new ItemStack(ModItems.sparkUpgrade, 1, upg - 1); + int newUpg = changeStack == null ? 0 : changeStack.getItemDamage() + 1; + spark.setUpgrade(newUpg); + setInventorySlotContents(0, sparkStack); + markDirty(); + } + } + + @Override + public int getSizeInventory() { + return 1; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) { + return itemstack != null && itemstack.getItem() == ModItems.sparkUpgrade; + } + + @Override + public int getInventoryStackLimit() { + return 1; + } + + @Override + public void markDirty() { + super.markDirty(); + VanillaPacketDispatcher.dispatchTEToNearbyPlayers(this); + } + + @Override + public String getInventoryName() { + return LibBlockNames.SPARK_CHANGER; + } + +} diff --git a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java index a520ca115..7bb04047c 100644 --- a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java +++ b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java @@ -240,6 +240,7 @@ public final class BotaniaCreativeTab extends CreativeTabs { addItem(ModItems.clip); addItem(ModItems.spark); addItem(ModItems.sparkUpgrade); + addBlock(ModBlocks.sparkChanger); addItem(ModItems.corporeaSpark); addBlock(ModBlocks.corporeaIndex); addBlock(ModBlocks.corporeaFunnel); diff --git a/src/main/java/vazkii/botania/common/lib/LibBlockNames.java b/src/main/java/vazkii/botania/common/lib/LibBlockNames.java index 132ad8fd9..0390c2362 100644 --- a/src/main/java/vazkii/botania/common/lib/LibBlockNames.java +++ b/src/main/java/vazkii/botania/common/lib/LibBlockNames.java @@ -86,6 +86,7 @@ public final class LibBlockNames { public static final String INCENSE_PLATE = "incensePlate"; public static final String HOURGLASS = "hourglass"; public static final String GHOST_RAIL = "ghostRail"; + public static final String SPARK_CHANGER = "sparkChanger"; public static final String SUBTILE_PUREDAISY = "puredaisy"; public static final String SUBTILE_MANASTAR = "manastar"; diff --git a/src/main/resources/assets/botania/lang/en_US.lang b/src/main/resources/assets/botania/lang/en_US.lang index 6e3e1a24f..298bd48f3 100644 --- a/src/main/resources/assets/botania/lang/en_US.lang +++ b/src/main/resources/assets/botania/lang/en_US.lang @@ -930,6 +930,7 @@ tile.botania:corporeaCrystalCube.name=Corporea Crystal Cube tile.botania:incensePlate.name=Incense Plate tile.botania:hourglass.name=Hovering Hourglass tile.botania:ghostRail.name=Spectral Rail +tile.botania:sparkChanger.name=Spark Tinkerer # FLOWER NAMES tile.botania:flower..name=Botania Flower diff --git a/src/main/resources/assets/botania/textures/blocks/sparkChanger0.png b/src/main/resources/assets/botania/textures/blocks/sparkChanger0.png new file mode 100644 index 000000000..a012985bc Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/sparkChanger0.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/sparkChanger1.png b/src/main/resources/assets/botania/textures/blocks/sparkChanger1.png new file mode 100644 index 000000000..be11b6241 Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/sparkChanger1.png differ diff --git a/src/main/resources/assets/botania/textures/blocks/sparkChanger2.png b/src/main/resources/assets/botania/textures/blocks/sparkChanger2.png new file mode 100644 index 000000000..a40baf87d Binary files /dev/null and b/src/main/resources/assets/botania/textures/blocks/sparkChanger2.png differ