From 1beceb77cbe87e4314b5f6de86de613645e4eb41 Mon Sep 17 00:00:00 2001 From: Lizbeth Rika Date: Mon, 15 Dec 2014 18:58:43 +0000 Subject: [PATCH] Assembly Halo, part one. Lots of stuff done already. Now to get the actual crafting to work. --- .../client/core/proxy/ClientProxy.java | 8 + .../gui/crafting/ContainerCraftingHalo.java | 29 ++ .../client/gui/crafting/GuiCraftingHalo.java | 46 +++ .../client/integration/nei/NEIGuiHooks.java | 26 ++ .../botania/client/lib/LibResources.java | 1 + .../common/core/BotaniaCreativeTab.java | 1 + .../common/core/proxy/CommonProxy.java | 9 + .../botania/common/item/ItemCraftingHalo.java | 322 ++++++++++++++++++ .../vazkii/botania/common/item/ModItems.java | 2 + .../vazkii/botania/common/lib/LibGuiIDs.java | 1 + .../botania/common/lib/LibItemNames.java | 3 +- .../botania/common/network/GuiHandler.java | 11 + .../botania/textures/items/craftingHalo.png | Bin 0 -> 3237 bytes .../assets/botania/textures/misc/glow.png | Bin 0 -> 4116 bytes .../botania/textures/misc/glow.png.mcmeta | 6 + 15 files changed, 464 insertions(+), 1 deletion(-) create mode 100644 src/main/java/vazkii/botania/client/gui/crafting/ContainerCraftingHalo.java create mode 100644 src/main/java/vazkii/botania/client/gui/crafting/GuiCraftingHalo.java create mode 100644 src/main/java/vazkii/botania/client/integration/nei/NEIGuiHooks.java create mode 100644 src/main/java/vazkii/botania/common/item/ItemCraftingHalo.java create mode 100644 src/main/resources/assets/botania/textures/items/craftingHalo.png create mode 100644 src/main/resources/assets/botania/textures/misc/glow.png create mode 100644 src/main/resources/assets/botania/textures/misc/glow.png.mcmeta 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 fb9d1f3a8..95e4ee642 100644 --- a/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java +++ b/src/main/java/vazkii/botania/client/core/proxy/ClientProxy.java @@ -46,6 +46,7 @@ import vazkii.botania.client.fx.FXWisp; import vazkii.botania.client.gui.lexicon.GuiLexicon; import vazkii.botania.client.gui.lexicon.GuiLexiconEntry; import vazkii.botania.client.gui.lexicon.GuiLexiconIndex; +import vazkii.botania.client.integration.nei.NEIGuiHooks; import vazkii.botania.client.lib.LibRenderIDs; import vazkii.botania.client.render.block.RenderAltar; import vazkii.botania.client.render.block.RenderBrewery; @@ -108,6 +109,7 @@ import cpw.mods.fml.client.registry.ClientRegistry; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.relauncher.ReflectionHelper; @@ -191,6 +193,12 @@ public class ClientProxy extends CommonProxy { ShaderHelper.initShaders(); } + + @Override + @Optional.Method(modid = "NotEnoughItems") + public void registerNEIStuff() { + NEIGuiHooks.init(); + } @Override public void setEntryToOpen(LexiconEntry entry) { diff --git a/src/main/java/vazkii/botania/client/gui/crafting/ContainerCraftingHalo.java b/src/main/java/vazkii/botania/client/gui/crafting/ContainerCraftingHalo.java new file mode 100644 index 000000000..41d56895c --- /dev/null +++ b/src/main/java/vazkii/botania/client/gui/crafting/ContainerCraftingHalo.java @@ -0,0 +1,29 @@ +/** + * 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 a + * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License + * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) + * + * File Created @ [Dec 15, 2014, 6:02:52 PM (GMT)] + */ +package vazkii.botania.client.gui.crafting; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ContainerWorkbench; +import net.minecraft.world.World; + +public class ContainerCraftingHalo extends ContainerWorkbench { + + public ContainerCraftingHalo(InventoryPlayer p_i1808_1_, World p_i1808_2_) { + super(p_i1808_1_, p_i1808_2_, 0, 0, 0); + } + + @Override + public boolean canInteractWith(EntityPlayer p_75145_1_) { + return true; + } +} diff --git a/src/main/java/vazkii/botania/client/gui/crafting/GuiCraftingHalo.java b/src/main/java/vazkii/botania/client/gui/crafting/GuiCraftingHalo.java new file mode 100644 index 000000000..2d9cbf97f --- /dev/null +++ b/src/main/java/vazkii/botania/client/gui/crafting/GuiCraftingHalo.java @@ -0,0 +1,46 @@ +/** + * 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 a + * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License + * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) + * + * File Created @ [Dec 15, 2014, 6:02:04 PM (GMT)] + */ +package vazkii.botania.client.gui.crafting; + +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.client.resources.I18n; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; + +import org.lwjgl.opengl.GL11; + +// This is pretty much a copypasta of GuiCrafting >_> +public class GuiCraftingHalo extends GuiContainer { + + private static final ResourceLocation craftingTableGuiTextures = new ResourceLocation("textures/gui/container/crafting_table.png"); + + public GuiCraftingHalo(InventoryPlayer p_i1084_1_, World p_i1084_2_) { + super(new ContainerCraftingHalo(p_i1084_1_, p_i1084_2_)); + } + + @Override + protected void drawGuiContainerForegroundLayer(int p_146979_1_, int p_146979_2_) { + this.fontRendererObj.drawString(I18n.format("container.crafting", new Object[0]), 28, 6, 4210752); + this.fontRendererObj.drawString(I18n.format("container.inventory", new Object[0]), 8, this.ySize - 96 + 2, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float p_146976_1_, int p_146976_2_, int p_146976_3_) { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(craftingTableGuiTextures); + int k = (this.width - this.xSize) / 2; + int l = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); + } + +} diff --git a/src/main/java/vazkii/botania/client/integration/nei/NEIGuiHooks.java b/src/main/java/vazkii/botania/client/integration/nei/NEIGuiHooks.java new file mode 100644 index 000000000..e0c73d01c --- /dev/null +++ b/src/main/java/vazkii/botania/client/integration/nei/NEIGuiHooks.java @@ -0,0 +1,26 @@ +/** + * 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 a + * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License + * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) + * + * File Created @ [Dec 15, 2014, 6:09:38 PM (GMT)] + */ +package vazkii.botania.client.integration.nei; + +import vazkii.botania.client.gui.crafting.GuiCraftingHalo; +import net.minecraft.client.gui.inventory.GuiCrafting; +import codechicken.nei.api.API; +import codechicken.nei.recipe.DefaultOverlayHandler; + +public class NEIGuiHooks { + + public static void init() { + API.registerGuiOverlay(GuiCraftingHalo.class, "crafting"); + API.registerGuiOverlayHandler(GuiCraftingHalo.class, new DefaultOverlayHandler(), "crafting"); + } + +} diff --git a/src/main/java/vazkii/botania/client/lib/LibResources.java b/src/main/java/vazkii/botania/client/lib/LibResources.java index f4e7c6c81..840e3909b 100644 --- a/src/main/java/vazkii/botania/client/lib/LibResources.java +++ b/src/main/java/vazkii/botania/client/lib/LibResources.java @@ -107,6 +107,7 @@ public final class LibResources { public static final String MISC_WISP_LARGE = PREFIX_MISC + "wispLarge.png"; public static final String MISC_WISP_SMALL = PREFIX_MISC + "wispSmall.png"; public static final String MISC_HALO = PREFIX_MISC + "halo.png"; + public static final String MISC_GLOW = PREFIX_MISC + "glow.png"; public static final String OBJ_MODEL_PYLON = PREFIX_OBJ_MODEL + "pylon.obj"; diff --git a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java index 6deddfef7..42957b3fb 100644 --- a/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java +++ b/src/main/java/vazkii/botania/common/core/BotaniaCreativeTab.java @@ -93,6 +93,7 @@ public final class BotaniaCreativeTab extends CreativeTabs { addBlock(ModBlocks.forestEye); addBlock(ModBlocks.enderEye); addItem(ModItems.enderHand); + addItem(ModItems.craftingHalo); addItem(ModItems.spawnerMover); addBlock(ModBlocks.spawnerClaw); diff --git a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java index aeb26dc87..aade89a9f 100644 --- a/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java +++ b/src/main/java/vazkii/botania/common/core/proxy/CommonProxy.java @@ -11,10 +11,12 @@ */ package vazkii.botania.common.core.proxy; +import buildcraft.api.transport.IPipeTile; import net.minecraft.block.Block; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; @@ -52,6 +54,7 @@ import vazkii.botania.common.item.ModItems; import vazkii.botania.common.lexicon.LexiconData; import vazkii.botania.common.network.GuiHandler; import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.Optional; import cpw.mods.fml.common.event.FMLInitializationEvent; import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLPostInitializationEvent; @@ -110,6 +113,8 @@ public class CommonProxy { ModBlocks.addDispenserBehaviours(); ConfigHandler.loadPostInit(); LexiconData.postInit(); + + registerNEIStuff(); } public void serverStarting(FMLServerStartingEvent event) { @@ -118,6 +123,10 @@ public class CommonProxy { event.registerServerCommand(new CommandOpen()); } + public void registerNEIStuff() { + // NO-OP + } + public void setEntryToOpen(LexiconEntry entry) { // NO-OP } diff --git a/src/main/java/vazkii/botania/common/item/ItemCraftingHalo.java b/src/main/java/vazkii/botania/common/item/ItemCraftingHalo.java new file mode 100644 index 000000000..efe8dea5e --- /dev/null +++ b/src/main/java/vazkii/botania/common/item/ItemCraftingHalo.java @@ -0,0 +1,322 @@ +/** + * 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 a + * Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License + * (http://creativecommons.org/licenses/by-nc-sa/3.0/deed.en_GB) + * + * File Created @ [Dec 15, 2014, 3:53:30 PM (GMT)] + */ +package vazkii.botania.common.item; + +import java.awt.Color; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.ItemRenderer; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderManager; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.util.ResourceLocation; +import net.minecraft.world.World; +import net.minecraftforge.client.ForgeHooksClient; +import net.minecraftforge.client.event.RenderWorldLastEvent; +import net.minecraftforge.common.MinecraftForge; + +import org.lwjgl.opengl.GL11; + +import vazkii.botania.client.core.handler.ClientTickHandler; +import vazkii.botania.client.lib.LibResources; +import vazkii.botania.common.Botania; +import vazkii.botania.common.core.helper.ItemNBTHelper; +import vazkii.botania.common.lib.LibGuiIDs; +import vazkii.botania.common.lib.LibItemNames; +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.PlayerEvent.ItemCraftedEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class ItemCraftingHalo extends ItemMod { + + private static final ResourceLocation glowTexture = new ResourceLocation(LibResources.MISC_GLOW); + private static final ItemStack craftingTable = new ItemStack(Blocks.crafting_table); + + private static final int SEGMENTS = 12; + + private static final String TAG_LAST_CRAFTING = "lastCrafting"; + private static final String TAG_STORED_RECIPE_PREFIX = "storedRecipe"; + private static final String TAG_ITEM_PREFIX = "item"; + + public ItemCraftingHalo() { + setUnlocalizedName(LibItemNames.CRAFTING_HALO); + setMaxStackSize(1); + MinecraftForge.EVENT_BUS.register(this); + FMLCommonHandler.instance().bus().register(this); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) { + int segment = getSegmentLookedAt(player); + boolean swing = false; + + if(segment == 0) { + player.openGui(Botania.instance, LibGuiIDs.CRAFTING_HALO, world, 0, 0, 0); + swing = true; + } else assignRecipe(stack, segment); + + if(swing && world.isRemote) + player.swingItem(); + + return stack; + } + + private int getSegmentLookedAt(EntityPlayer player) { + float yaw = getCheckingAngle(player); + + int angles = 360; + int segAngles = angles / SEGMENTS; + for(int seg = 0; seg < SEGMENTS; seg++) { + float calcAngle = (float) seg * segAngles; + if(yaw >= calcAngle && yaw < (calcAngle + segAngles)) + return seg; + } + return -1; + } + + private float getCheckingAngle(EntityPlayer player) { + float yaw = MathHelper.wrapAngleTo180_float(player.rotationYaw) + 90F; + if(yaw < 0) + yaw = 180F + (180F - Math.abs(yaw)); + return 360F - yaw; + } + + public static ItemStack getItemForSlot(ItemStack stack, int slot) { + if(slot == 0) + return craftingTable; + else if(slot >= SEGMENTS) + return null; + else { + NBTTagCompound cmp = getStoredRecipeCompound(stack, slot); + + if(cmp != null) { + ItemStack cmpStack = getLastCraftingItem(cmp, 9); + return cmpStack; + } else return null; + } + } + + public static void assignRecipe(ItemStack stack, int pos) { + ItemStack itemForPos = getItemForSlot(stack, pos); + if(itemForPos != null) + ItemNBTHelper.setCompound(stack, TAG_STORED_RECIPE_PREFIX + pos, new NBTTagCompound()); + else { + System.out.println("Assigning to " + pos + " " + getLastCraftingCompound(stack, false)); + ItemNBTHelper.setCompound(stack, TAG_STORED_RECIPE_PREFIX + pos, getLastCraftingCompound(stack, false)); + } + } + + + @SubscribeEvent + public void onItemCrafted(ItemCraftedEvent event) { + for(int i = 0; i < event.player.inventory.getSizeInventory(); i++) { + ItemStack stack = event.player.inventory.getStackInSlot(i); + if(stack != null && stack.getItem() == this) + saveRecipeToStack(event, stack); + } + } + + private void saveRecipeToStack(ItemCraftedEvent event, ItemStack stack) { + NBTTagCompound cmp = new NBTTagCompound(); + NBTTagCompound cmp1 = new NBTTagCompound(); + + event.crafting.writeToNBT(cmp1); + cmp.setTag(TAG_ITEM_PREFIX + 9, cmp1); + + for(int i = 0; i < 9; i++) { + cmp1 = new NBTTagCompound(); + ItemStack stackSlot = event.craftMatrix.getStackInSlot(i); + if(stackSlot != null) + stackSlot.writeToNBT(cmp1); + cmp.setTag(TAG_ITEM_PREFIX + i, cmp1); + } + + System.out.println("Set: " + cmp); + ItemNBTHelper.setCompound(stack, TAG_LAST_CRAFTING, cmp); + } + + public static ItemStack[] getLastCraftingItems(ItemStack stack) { + return getCraftingItems(stack, SEGMENTS); + } + + public static ItemStack[] getCraftingItems(ItemStack stack, int slot) { + ItemStack[] stackArray = new ItemStack[10]; + + NBTTagCompound cmp = getStoredRecipeCompound(stack, slot); + if(cmp != null) + for(int i = 0; i < stackArray.length; i++) + stackArray[i] = getLastCraftingItem(cmp, i); + + return stackArray; + } + + public static NBTTagCompound getLastCraftingCompound(ItemStack stack, boolean nullify) { + return ItemNBTHelper.getCompound(stack, TAG_LAST_CRAFTING, nullify); + } + + public static NBTTagCompound getStoredRecipeCompound(ItemStack stack, int slot) { + return slot == SEGMENTS ? getLastCraftingCompound(stack, true) : ItemNBTHelper.getCompound(stack, TAG_STORED_RECIPE_PREFIX + slot, true); + } + + public static ItemStack getLastCraftingItem(ItemStack stack, int pos) { + return getLastCraftingItem(getLastCraftingCompound(stack, true), pos); + } + + public static ItemStack getLastCraftingItem(NBTTagCompound cmp, int pos) { + if(cmp == null) + return null; + + NBTTagCompound cmp1 = cmp.getCompoundTag(TAG_ITEM_PREFIX + pos); + if(cmp1 == null) + return null; + + return ItemStack.loadItemStackFromNBT(cmp1); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onRenderWorldLast(RenderWorldLastEvent event) { + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + ItemStack stack = player.getCurrentEquippedItem(); + if(stack != null && stack.getItem() == this) + render(stack, player, event.partialTicks); + } + + @SideOnly(Side.CLIENT) + public void render(ItemStack stack, EntityPlayer player, float partialTicks) { + Minecraft mc = Minecraft.getMinecraft(); + Tessellator tess = Tessellator.instance; + tess.renderingWorldRenderer = false; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + float alpha = ((float) Math.sin((ClientTickHandler.ticksInGame + partialTicks) * 0.2F) * 0.5F + 0.5F) * 0.4F + 0.3F; + + double posX = player.prevPosX + (player.posX - player.prevPosX) * partialTicks; + double posY = player.prevPosY + (player.posY - player.prevPosY) * partialTicks; + double posZ = player.prevPosZ + (player.posZ - player.prevPosZ) * partialTicks; + + GL11.glTranslated(posX - RenderManager.renderPosX, posY - RenderManager.renderPosY, posZ - RenderManager.renderPosZ); + + int angles = 360; + int segAngles = angles / SEGMENTS; + + float u = 1F; + float v = 0.25F; + + float uper = u / angles; + float ucurr = 0F; + + float s = 3F; + float m = 0.8F; + float x = u * s; + float y = v * s * 2; + float y0 = 0; + + int segmentLookedAt = getSegmentLookedAt(player); + + for(int seg = 0; seg < SEGMENTS; seg++) { + boolean inside = false; + float rotationAngle = ((float) seg + 0.5F) * segAngles; + GL11.glPushMatrix(); + GL11.glRotatef(rotationAngle, 0F, 1F, 0F); + GL11.glTranslatef(s * m, -0.75F, 0F); + + if(segmentLookedAt == seg) + inside = true; + + ItemStack slotStack = getItemForSlot(stack, seg); + if(slotStack != null) { + mc.renderEngine.bindTexture(slotStack.getItem() instanceof ItemBlock ? TextureMap.locationBlocksTexture : TextureMap.locationItemsTexture); + + if(slotStack.getItem() instanceof ItemBlock && RenderBlocks.renderItemIn3d(Block.getBlockFromItem(slotStack.getItem()).getRenderType())) { + float scale = seg == 0 ? 0.75F : 0.5F; + GL11.glScalef(scale, scale, scale); + if(seg != 0) + GL11.glTranslatef(0F, 0.5F, 0F); + + RenderBlocks.getInstance().renderBlockAsItem(Block.getBlockFromItem(slotStack.getItem()), slotStack.getItemDamage(), 1F); + } else { + GL11.glScalef(0.75F, 0.75F, 0.75F); + GL11.glTranslatef(0F, 0F, 0.5F); + int renderPass = 0; + do { + IIcon icon = slotStack.getItem().getIcon(slotStack, renderPass); + if(icon != null) { + GL11.glRotatef(90F, 0F, 1F, 0F); + Color color = new Color(slotStack.getItem().getColorFromItemStack(slotStack, 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 < slotStack.getItem().getRenderPasses(slotStack.getItemDamage())); + } + } + GL11.glPopMatrix(); + + GL11.glPushMatrix(); + GL11.glRotatef(180F, 1F, 0F, 0F); + float a = alpha; + if(inside) { + a += 0.3F; + y0 = -y; + } + + if(seg % 2 == 0) + GL11.glColor4f(0.6F, 0.6F, 0.6F, a); + else GL11.glColor4f(1F, 1F, 1F, a); + + mc.renderEngine.bindTexture(glowTexture); + tess.startDrawingQuads(); + for(int i = 0; i < segAngles; i++) { + int ang = i + seg * segAngles; + double xp = Math.cos(ang * Math.PI / 180F) * s; + double zp = Math.sin(ang * Math.PI / 180F) * s; + + tess.addVertexWithUV(xp * m, y, zp * m, u, v); + tess.addVertexWithUV(xp, y0, zp, u, 0); + + ucurr += uper; + xp = Math.cos((ang + 1) * Math.PI / 180F) * s; + zp = Math.sin((ang + 1) * Math.PI / 180F) * s; + + tess.addVertexWithUV(xp, y0, zp, 0, 0); + tess.addVertexWithUV(xp * m, y, zp * m, 0, v); + } + y0 = 0; + tess.draw(); + + GL11.glPopMatrix(); + } + GL11.glPopMatrix(); + } + +} diff --git a/src/main/java/vazkii/botania/common/item/ModItems.java b/src/main/java/vazkii/botania/common/item/ModItems.java index 47568b1ec..fea65fd99 100644 --- a/src/main/java/vazkii/botania/common/item/ModItems.java +++ b/src/main/java/vazkii/botania/common/item/ModItems.java @@ -186,6 +186,7 @@ public final class ModItems { public static Item missileRod; public static Item holyCloak; public static Item unholyCloak; + public static Item craftingHalo; public static void init() { lexicon = new ItemLexicon(); @@ -283,6 +284,7 @@ public final class ModItems { missileRod = new ItemMissileRod(); holyCloak = new ItemHolyCloak(); unholyCloak = new ItemUnholyCloak(); + craftingHalo = new ItemCraftingHalo(); OreDictionary.registerOre(LibOreDict.LEXICON, lexicon); for(int i = 0; i < 16; i++) { diff --git a/src/main/java/vazkii/botania/common/lib/LibGuiIDs.java b/src/main/java/vazkii/botania/common/lib/LibGuiIDs.java index 280793393..2ed76b876 100644 --- a/src/main/java/vazkii/botania/common/lib/LibGuiIDs.java +++ b/src/main/java/vazkii/botania/common/lib/LibGuiIDs.java @@ -14,5 +14,6 @@ package vazkii.botania.common.lib; public final class LibGuiIDs { public static final int LEXICON = 0; + public static final int CRAFTING_HALO = 1; } diff --git a/src/main/java/vazkii/botania/common/lib/LibItemNames.java b/src/main/java/vazkii/botania/common/lib/LibItemNames.java index f6d5c1d86..1e05ae7d6 100644 --- a/src/main/java/vazkii/botania/common/lib/LibItemNames.java +++ b/src/main/java/vazkii/botania/common/lib/LibItemNames.java @@ -109,7 +109,8 @@ public final class LibItemNames { public static final String MISSILE_ROD = "missileRod"; public static final String HOLY_CLOAK = "holyCloak"; public static final String UNHOLY_CLOAK = "unholyCloak"; - + public static final String CRAFTING_HALO = "craftingHalo"; + public static final String[] LENS_NAMES = new String[] { "lensNormal", "lensSpeed", diff --git a/src/main/java/vazkii/botania/common/network/GuiHandler.java b/src/main/java/vazkii/botania/common/network/GuiHandler.java index cfeb2dec8..f352fdc8f 100644 --- a/src/main/java/vazkii/botania/common/network/GuiHandler.java +++ b/src/main/java/vazkii/botania/common/network/GuiHandler.java @@ -14,6 +14,8 @@ package vazkii.botania.common.network; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; import vazkii.botania.api.lexicon.ILexicon; +import vazkii.botania.client.gui.crafting.ContainerCraftingHalo; +import vazkii.botania.client.gui.crafting.GuiCraftingHalo; import vazkii.botania.client.gui.lexicon.GuiLexicon; import vazkii.botania.common.lib.LibGuiIDs; import cpw.mods.fml.common.network.IGuiHandler; @@ -22,6 +24,12 @@ public class GuiHandler implements IGuiHandler { @Override public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) { + switch(ID) { + case LibGuiIDs.CRAFTING_HALO : { + return new ContainerCraftingHalo(player.inventory, world); + } + } + return null; } @@ -35,6 +43,9 @@ public class GuiHandler implements IGuiHandler { return null; return lex; } + case LibGuiIDs.CRAFTING_HALO : { + return new GuiCraftingHalo(player.inventory, world); + } } return null; diff --git a/src/main/resources/assets/botania/textures/items/craftingHalo.png b/src/main/resources/assets/botania/textures/items/craftingHalo.png new file mode 100644 index 0000000000000000000000000000000000000000..2651a86fb632c7ee3e75a5fe52d969b380289195 GIT binary patch literal 3237 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 X$~(u{&6-r900000NkvXXu0mjfTv7U| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/botania/textures/misc/glow.png b/src/main/resources/assets/botania/textures/misc/glow.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad4774b3a1dd42fa3d9eab4f005fc0695334f0b GIT binary patch literal 4116 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/botania/textures/misc/glow.png.mcmeta b/src/main/resources/assets/botania/textures/misc/glow.png.mcmeta new file mode 100644 index 000000000..2077f3ce0 --- /dev/null +++ b/src/main/resources/assets/botania/textures/misc/glow.png.mcmeta @@ -0,0 +1,6 @@ +{ + "texture": { + "blur": true + } +} +