From 51346b56383f0908563699d1824740b1be544c8b Mon Sep 17 00:00:00 2001 From: WayofTime Date: Mon, 3 Nov 2014 18:05:28 -0500 Subject: [PATCH] Initial comment to start using Blood Utils' book --- src/api/java/bloodutils/api/BUApi.java | 4 + .../api/classes/guide/GuiCategories.java | 83 +++++++ .../api/classes/guide/GuiEntry.java | 150 ++++++++++++ .../api/classes/guide/GuiIndex.java | 213 ++++++++++++++++++ .../api/classes/guide/buttons/ButtonNext.java | 38 ++++ .../api/classes/guide/buttons/ButtonPage.java | 33 +++ .../guide/elements/ElementCategory.java | 55 +++++ .../java/bloodutils/api/compact/Category.java | 18 ++ .../bloodutils/api/compact/CompactItem.java | 21 ++ .../java/bloodutils/api/compact/Entry.java | 14 ++ .../api/entries/EntryAltarRecipe.java | 127 +++++++++++ .../api/entries/EntryCraftingRecipe.java | 204 +++++++++++++++++ .../bloodutils/api/entries/EntryImage.java | 73 ++++++ .../bloodutils/api/entries/EntryItemText.java | 90 ++++++++ .../api/entries/EntryRitualInfo.java | 38 ++++ .../bloodutils/api/entries/EntryText.java | 48 ++++ .../java/bloodutils/api/entries/IEntry.java | 25 ++ .../java/bloodutils/api/enums/EnumType.java | 5 + .../bloodutils/api/helpers/GuiHelper.java | 102 +++++++++ .../api/helpers/OreDictionaryHelper.java | 16 ++ .../api/interfaces/IEntryElement.java | 41 ++++ .../bloodutils/api/interfaces/IReviving.java | 7 + src/api/java/bloodutils/api/package-info.java | 3 + .../api/registries/EntryRegistry.java | 40 ++++ .../api/registries/RecipeRegistry.java | 47 ++++ .../api/registries/RevivingRegistry.java | 13 ++ .../AlchemicalWizardry.java | 101 ++++++++- .../alchemicalWizardry/ModItems.java | 89 +++++++- .../client/nei/NEIBloodOrbShapedHandler.java | 4 - .../common/book/BUEntries.java | 122 ++++++++++ .../common/book/ItemBMBook.java | 50 ++++ .../common/tileEntity/gui/GuiHandler.java | 39 +++- .../assets/bloodutils/lang/en_US.lang | 73 ++++++ .../assets/bloodutils/lang/zh_CN.lang | 43 ++++ .../bloodutils/textures/blocks/area_air.png | Bin 0 -> 1405 bytes .../textures/blocks/area_air.png.mcmeta | 16 ++ .../textures/blocks/area_darkness.png | Bin 0 -> 1581 bytes .../textures/blocks/area_darkness.png.mcmeta | 16 ++ .../bloodutils/textures/blocks/area_earth.png | Bin 0 -> 1492 bytes .../textures/blocks/area_earth.png.mcmeta | 16 ++ .../bloodutils/textures/blocks/area_fire.png | Bin 0 -> 1274 bytes .../textures/blocks/area_fire.png.mcmeta | 16 ++ .../bloodutils/textures/blocks/area_light.png | Bin 0 -> 1495 bytes .../textures/blocks/area_light.png.mcmeta | 16 ++ .../textures/blocks/area_rainbow.png | Bin 0 -> 1608 bytes .../textures/blocks/area_rainbow.png.mcmeta | 16 ++ .../bloodutils/textures/blocks/area_water.png | Bin 0 -> 1295 bytes .../textures/blocks/area_water.png.mcmeta | 16 ++ .../textures/blocks/block_bloodDiamond.png | Bin 0 -> 281 bytes .../textures/blocks/block_bloodIron.png | Bin 0 -> 194 bytes .../bloodutils/textures/blocks/builder.png | Bin 0 -> 821 bytes .../bloodutils/textures/blocks/discoball.png | Bin 0 -> 244 bytes .../textures/blocks/discoball.png.mcmeta | 22 ++ .../textures/blocks/essence_darkness.png | Bin 0 -> 167 bytes .../textures/blocks/essence_light.png | Bin 0 -> 168 bytes .../textures/blocks/essence_rainbow.png | Bin 0 -> 188 bytes .../blocks/essence_rainbow.png.mcmeta | 16 ++ .../bloodutils/textures/blocks/progress.png | Bin 0 -> 799 bytes .../assets/bloodutils/textures/gui/altar.png | Bin 0 -> 3371 bytes .../bloodutils/textures/gui/crafting.png | Bin 0 -> 551 bytes .../assets/bloodutils/textures/gui/front.png | Bin 0 -> 2690 bytes .../assets/bloodutils/textures/gui/guide.png | Bin 0 -> 8642 bytes .../textures/items/bloodShard_royal.png | Bin 0 -> 400 bytes .../textures/items/diamond_blood.png | Bin 0 -> 316 bytes .../bloodutils/textures/items/gem_air.png | Bin 0 -> 525 bytes .../textures/items/gem_air.png.mcmeta | 16 ++ .../textures/items/gem_darkness.png | Bin 0 -> 499 bytes .../textures/items/gem_darkness.png.mcmeta | 16 ++ .../bloodutils/textures/items/gem_earth.png | Bin 0 -> 508 bytes .../textures/items/gem_earth.png.mcmeta | 16 ++ .../bloodutils/textures/items/gem_empty.png | Bin 0 -> 315 bytes .../bloodutils/textures/items/gem_fire.png | Bin 0 -> 464 bytes .../textures/items/gem_fire.png.mcmeta | 16 ++ .../bloodutils/textures/items/gem_light.png | Bin 0 -> 502 bytes .../textures/items/gem_light.png.mcmeta | 16 ++ .../bloodutils/textures/items/gem_rainbow.png | Bin 0 -> 422 bytes .../textures/items/gem_rainbow.png.mcmeta | 16 ++ .../bloodutils/textures/items/gem_water.png | Bin 0 -> 484 bytes .../textures/items/gem_water.png.mcmeta | 16 ++ .../bloodutils/textures/items/guide.png | Bin 0 -> 421 bytes .../bloodutils/textures/items/iron_blood.png | Bin 0 -> 286 bytes .../items/sigil_advancedDivination.png | Bin 0 -> 616 bytes .../textures/items/sigil_ritual.png | Bin 0 -> 587 bytes .../textures/items/tool_creative.png | Bin 0 -> 214 bytes .../textures/misc/screenshots/t1.png | Bin 0 -> 53606 bytes .../assets/bloodutils/textures/misc/tab.png | Bin 0 -> 277 bytes .../textures/models/model_guide.png | Bin 0 -> 322 bytes .../textures/models/model_reviver.png | Bin 0 -> 1058 bytes .../creative_inventory/tab_blood.png | Bin 0 -> 1023 bytes src/main/resources/todo.txt | 2 + 90 files changed, 2272 insertions(+), 21 deletions(-) create mode 100644 src/api/java/bloodutils/api/BUApi.java create mode 100644 src/api/java/bloodutils/api/classes/guide/GuiCategories.java create mode 100644 src/api/java/bloodutils/api/classes/guide/GuiEntry.java create mode 100644 src/api/java/bloodutils/api/classes/guide/GuiIndex.java create mode 100644 src/api/java/bloodutils/api/classes/guide/buttons/ButtonNext.java create mode 100644 src/api/java/bloodutils/api/classes/guide/buttons/ButtonPage.java create mode 100644 src/api/java/bloodutils/api/classes/guide/elements/ElementCategory.java create mode 100644 src/api/java/bloodutils/api/compact/Category.java create mode 100644 src/api/java/bloodutils/api/compact/CompactItem.java create mode 100644 src/api/java/bloodutils/api/compact/Entry.java create mode 100644 src/api/java/bloodutils/api/entries/EntryAltarRecipe.java create mode 100644 src/api/java/bloodutils/api/entries/EntryCraftingRecipe.java create mode 100644 src/api/java/bloodutils/api/entries/EntryImage.java create mode 100644 src/api/java/bloodutils/api/entries/EntryItemText.java create mode 100644 src/api/java/bloodutils/api/entries/EntryRitualInfo.java create mode 100644 src/api/java/bloodutils/api/entries/EntryText.java create mode 100644 src/api/java/bloodutils/api/entries/IEntry.java create mode 100644 src/api/java/bloodutils/api/enums/EnumType.java create mode 100644 src/api/java/bloodutils/api/helpers/GuiHelper.java create mode 100644 src/api/java/bloodutils/api/helpers/OreDictionaryHelper.java create mode 100644 src/api/java/bloodutils/api/interfaces/IEntryElement.java create mode 100644 src/api/java/bloodutils/api/interfaces/IReviving.java create mode 100644 src/api/java/bloodutils/api/package-info.java create mode 100644 src/api/java/bloodutils/api/registries/EntryRegistry.java create mode 100644 src/api/java/bloodutils/api/registries/RecipeRegistry.java create mode 100644 src/api/java/bloodutils/api/registries/RevivingRegistry.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/book/BUEntries.java create mode 100644 src/main/java/WayofTime/alchemicalWizardry/common/book/ItemBMBook.java create mode 100644 src/main/resources/assets/bloodutils/lang/en_US.lang create mode 100644 src/main/resources/assets/bloodutils/lang/zh_CN.lang create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_air.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_air.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_earth.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_earth.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_fire.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_fire.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_light.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_light.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_rainbow.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_rainbow.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_water.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/area_water.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/block_bloodDiamond.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/block_bloodIron.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/builder.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/discoball.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/discoball.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/essence_darkness.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/essence_light.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/essence_rainbow.png create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/essence_rainbow.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/blocks/progress.png create mode 100644 src/main/resources/assets/bloodutils/textures/gui/altar.png create mode 100644 src/main/resources/assets/bloodutils/textures/gui/crafting.png create mode 100644 src/main/resources/assets/bloodutils/textures/gui/front.png create mode 100644 src/main/resources/assets/bloodutils/textures/gui/guide.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/bloodShard_royal.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/diamond_blood.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_air.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_air.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_darkness.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_darkness.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_earth.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_earth.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_empty.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_fire.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_fire.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_light.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_light.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_rainbow.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_rainbow.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_water.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/gem_water.png.mcmeta create mode 100644 src/main/resources/assets/bloodutils/textures/items/guide.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/iron_blood.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/sigil_advancedDivination.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/sigil_ritual.png create mode 100644 src/main/resources/assets/bloodutils/textures/items/tool_creative.png create mode 100644 src/main/resources/assets/bloodutils/textures/misc/screenshots/t1.png create mode 100644 src/main/resources/assets/bloodutils/textures/misc/tab.png create mode 100644 src/main/resources/assets/bloodutils/textures/models/model_guide.png create mode 100644 src/main/resources/assets/bloodutils/textures/models/model_reviver.png create mode 100644 src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_blood.png create mode 100644 src/main/resources/todo.txt diff --git a/src/api/java/bloodutils/api/BUApi.java b/src/api/java/bloodutils/api/BUApi.java new file mode 100644 index 00000000..b54343fa --- /dev/null +++ b/src/api/java/bloodutils/api/BUApi.java @@ -0,0 +1,4 @@ +package bloodutils.api; + +public class BUApi { +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/GuiCategories.java b/src/api/java/bloodutils/api/classes/guide/GuiCategories.java new file mode 100644 index 00000000..99ad8439 --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/GuiCategories.java @@ -0,0 +1,83 @@ +package bloodutils.api.classes.guide; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +import bloodutils.api.classes.guide.elements.ElementCategory; +import bloodutils.api.compact.Category; +import bloodutils.api.registries.EntryRegistry; + +public class GuiCategories extends GuiScreen{ + public GuiCategories(EntityPlayer player){ + this.player = player; + } + private static final ResourceLocation gui = new ResourceLocation("bloodutils:textures/gui/front.png"); + + int gwidth = 192; + int gheight = 192; + int x, y; + ElementCategory[] categories = new ElementCategory[EntryRegistry.categories.size()]; + EntityPlayer player; + + @Override + public void initGui(){ + super.initGui(); + x = (this.width/2) - (gwidth/2); + y = (this.height/2) - (gheight/2); + this.buttonList.clear(); + + int pX = x - 1; + int pY = y + 12; + + int iWidth = 20; + int iHeight = 20; + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + Category category = EntryRegistry.categories.get(i); + this.categories[i] = new ElementCategory(category, pX, pY + (i*iHeight) - 2, iWidth, iHeight, this.player); + } + } + + @Override + public void drawScreen(int mX, int mY, float f1){ + super.drawScreen(mX, mY, f1); + int fHeight = Minecraft.getMinecraft().fontRenderer.FONT_HEIGHT; + + GL11.glColor4f(1F, 1F, 1F, 1F); + this.mc.renderEngine.bindTexture(gui); + drawTexturedModalRect(x, y, 0, 0, gwidth, gheight); + + /** Title */ + String str = "Categories"; + this.drawCenteredString(fontRendererObj, str, this.x + gwidth / 2, y - 15, 0x336666); + + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + ElementCategory category = this.categories[i]; + category.drawElement(); + + if(category.isMouseInElement(mX, mY)){ + category.onMouseEnter(mX, mY); + } + } + } + + @Override + public void mouseClicked(int mX, int mY, int type){ + super.mouseClicked(mX, mY, type); + + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + ElementCategory category = this.categories[i]; + if(category.isMouseInElement(mX, mY)){ + category.onMouseClick(mX, mY, type); + } + } + } + + @Override + public boolean doesGuiPauseGame(){ + return false; + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/GuiEntry.java b/src/api/java/bloodutils/api/classes/guide/GuiEntry.java new file mode 100644 index 00000000..57df7cbc --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/GuiEntry.java @@ -0,0 +1,150 @@ +package bloodutils.api.classes.guide; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import bloodutils.api.classes.guide.buttons.ButtonNext; +import bloodutils.api.compact.Category; +import bloodutils.api.compact.Entry; +import bloodutils.api.entries.IEntry; +import bloodutils.api.registries.EntryRegistry; + +public class GuiEntry extends GuiScreen{ + public GuiEntry(String key, EntityPlayer player, Category category){ + this.key = key; + this.player = player; + this.category = category; + } + + public GuiEntry(String key, EntityPlayer player, Category category, int currPage){ + this.key = key; + this.player = player; + this.category = category; + this.currPage = currPage; + } + + private static final ResourceLocation gui = new ResourceLocation("bloodutils:textures/gui/guide.png"); + int gwidth = 192; + int gheight = 192; + int prevPage; + int left, top; + + String key; + + int currPage = 1; + GuiButton next, prev, back; + EntityPlayer player; + Category category; + + @SuppressWarnings("unchecked") + @Override + public void initGui(){ + super.initGui(); + left = (this.width/2) - (gwidth/2); + top = (this.height/2) - (gheight/2); + this.buttonList.clear(); + int k = (this.width - this.gwidth) / 2; + + this.buttonList.add(next = new ButtonNext(500, k + 120, top + 160, true)); + this.buttonList.add(prev = new ButtonNext(501, k + 38, top + 160, false)); + + Entry e = EntryRegistry.entries.get(this.category).get(this.key); + if(e != null){ + IEntry entry = e.entry[this.currPage - 1]; + if(entry != null) + entry.initGui(gwidth, gheight, left, top, player, this.buttonList); + }else{ + mc.displayGuiScreen(new GuiCategories(this.player)); + } + } + + @Override + public void drawScreen(int mX, int mY, float f1){ + GL11.glColor4f(1F, 1F, 1F, 1F); + this.mc.renderEngine.bindTexture(gui); + drawTexturedModalRect(left, top, 0, 0, gwidth, gheight); + Entry e = EntryRegistry.entries.get(this.category).get(this.key); + + /** Title */ + String str = e.name; + this.drawCenteredString(fontRendererObj, str, this.left + gwidth / 2, top - 15, 0x336666); + + /** Current Page */ + this.drawCenteredString(fontRendererObj, (currPage) + "/" + (e.entry.length), this.left + gwidth / 2, top + 160, 0x336666); + + IEntry entry = e.entry[currPage - 1]; + if(entry != null){ + entry.draw(this, gwidth, gheight, left, top, player, e.name, currPage, mX, mY); + } + super.drawScreen(mX, mY, f1); + } + + @Override + public void mouseClicked(int mX, int mY, int type){ + super.mouseClicked(mX, mY, type); + + if(type == 1) + mc.displayGuiScreen(new GuiIndex(this.category, this.player)); + } + + @Override + public void keyTyped(char c, int i){ + super.keyTyped(c, i); + + if(Keyboard.getEventKeyState()){ + if(i == 14){ + mc.displayGuiScreen(new GuiIndex(this.category, this.player)); + + return; + } + } + } + + @Override + public boolean doesGuiPauseGame(){ + return false; + } + + @Override + protected void actionPerformed(GuiButton button){ + int id = button.id; + int maxPages = EntryRegistry.entries.get(this.category).get(this.key).entry.length; + + if(id == 500){ + if(currPage < maxPages){ + currPage++; + initGui(); + } + }else if(id == 501){ + if(currPage > 1){ + currPage--; + initGui(); + } + }else{ + Entry e = EntryRegistry.entries.get(this.category).get(this.key); + if(e != null){ + IEntry entry = e.entry[this.currPage]; + if(entry != null) + entry.actionPerformed(button); + }else{ + mc.displayGuiScreen(new GuiCategories(this.player)); + } + } + } + + @Override + public void onGuiClosed(){ + ItemStack held = player.getHeldItem(); + if(held.hasTagCompound()){ + held.getTagCompound().setString("CATEGORY", this.category.name); + held.getTagCompound().setString("KEY", this.key); + held.getTagCompound().setInteger("PAGE", this.currPage); + } + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/GuiIndex.java b/src/api/java/bloodutils/api/classes/guide/GuiIndex.java new file mode 100644 index 00000000..7c3fbe82 --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/GuiIndex.java @@ -0,0 +1,213 @@ +package bloodutils.api.classes.guide; + +import java.util.HashMap; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +import bloodutils.api.classes.guide.buttons.ButtonNext; +import bloodutils.api.classes.guide.buttons.ButtonPage; +import bloodutils.api.classes.guide.elements.ElementCategory; +import bloodutils.api.compact.Category; +import bloodutils.api.compact.Entry; +import bloodutils.api.registries.EntryRegistry; + +public class GuiIndex extends GuiScreen{ + public GuiIndex(Category category, EntityPlayer player){ + this.category = category; + this.player = player; + } + + public GuiIndex(Category category, EntityPlayer player, int currPage){ + this.category = category; + this.player = player; + this.currPage = currPage; + } + private static final ResourceLocation gui = new ResourceLocation("bloodutils:textures/gui/guide.png"); + GuiButton prev, next, back; + + Category category; + EntityPlayer player; + + ElementCategory[] categories = new ElementCategory[EntryRegistry.categories.size()]; + + int gwidth = 192; + int gheight = 192; + int left, top; + int currPage = 0; + + @SuppressWarnings("unchecked") + @Override + public void initGui(){ + super.initGui(); + left = (this.width/2) - (gwidth/2); + top = (this.height/2) - (gheight/2); + this.buttonList.clear(); + + populate(); + drawCategories(); + + int k = (this.width - this.gwidth) / 2; + this.buttonList.add(next = new ButtonNext(500, k + 120, top + 160, true)); + this.buttonList.add(prev = new ButtonNext(501, k + 38, top + 160, false)); + } + + public void drawCategories(){ + int pX = left - 1; + int pY = top + 12; + + int iWidth = 20; + int iHeight = 20; + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + Category category = EntryRegistry.categories.get(i); + this.categories[i] = new ElementCategory(category, pX, pY + (i*iHeight) - 2, iWidth, iHeight, this.player); + } + } + + @SuppressWarnings("unchecked") + public void populate(){ + this.buttonList.clear(); + + HashMap entries = EntryRegistry.entries.get(this.category); + int x, y; + + if(entries != null && !entries.isEmpty()){ + int j = 0; + for(int i = 0; i < entries.size(); i++){ + Entry entry = (Entry)entries.values().toArray()[i]; + if(entry != null && entry.indexPage == this.currPage){ + x = this.left + gwidth / 2 - 75; + y = (top + 15) + (10*j); + buttonList.add(new ButtonPage(j, x, y, 110, 10, "")); + j++; + } + } + } + + int k = (this.width - this.gwidth) / 2; + + this.buttonList.add(next = new ButtonNext(500, k + 120, top + 160, true)); + this.buttonList.add(prev = new ButtonNext(501, k + 38, top + 160, false)); + } + + @Override + public void drawScreen(int mX, int mY, float f1){ + GL11.glColor4f(1F, 1F, 1F, 1F); + this.mc.renderEngine.bindTexture(gui); + drawTexturedModalRect(left, top, 0, 0, gwidth, gheight); + + /** Title */ + String str = category.name; + this.drawCenteredString(fontRendererObj, str, this.left + gwidth / 2, top - 15, 0x336666); + + /** Current Page */ + if(this.category != null && EntryRegistry.maxEntries.containsKey(this.category)){ + int size = EntryRegistry.maxEntries.get(this.category); + this.drawCenteredString(fontRendererObj, (currPage + 1) + "/" + (size + 1), this.left + gwidth / 2, top + 160, 0x336666); + registerButtons(); + } + + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + ElementCategory category = this.categories[i]; + category.drawElement(); + + if(category.isMouseInElement(mX, mY)){ + category.onMouseEnter(mX, mY); + } + } + super.drawScreen(mX, mY, f1); + } + + public void registerButtons(){ + HashMap entries = EntryRegistry.entries.get(this.category); + if(entries != null && !entries.isEmpty()){ + int j = 0; + for(int i = 0; i < entries.size(); i++){ + Entry entry = (Entry)entries.values().toArray()[i]; + + if(entry != null && entry.indexPage == this.currPage){ + String title = entry.name; + if(title != null && buttonList.get(j) != null && buttonList.get(j) instanceof ButtonPage){ + ButtonPage button = (ButtonPage) buttonList.get(j); + button.displayString = title; + j++; + } + } + } + } + } + + @Override + public void mouseClicked(int mX, int mY, int type){ + super.mouseClicked(mX, mY, type); + + if(type == 1) + mc.displayGuiScreen(new GuiCategories(this.player)); + + for(int i = 0; i < EntryRegistry.categories.size(); i++){ + ElementCategory category = this.categories[i]; + if(category.isMouseInElement(mX, mY)){ + category.onMouseClick(mX, mY, type); + } + } + } + + @Override + public boolean doesGuiPauseGame(){ + return false; + } + + @Override + protected void actionPerformed(GuiButton button){ + int id = button.id; + int size; + if(EntryRegistry.maxEntries.containsKey(this.category)) + size = EntryRegistry.maxEntries.get(this.category); + else + size = 1; + if(id == 500){ + if(currPage + 1 < size + 1){ + currPage++; + populate(); + registerButtons(); + } + }else if(id == 501){ + if(currPage > 0){ + currPage--; + populate(); + registerButtons(); + } + }else{ + mc.displayGuiScreen(new GuiEntry(button.displayString, player, category)); + } + } + + @Override + public void keyTyped(char c, int i){ + super.keyTyped(c, i); + + if(Keyboard.getEventKeyState()){ + if(i == 14){ + mc.displayGuiScreen(new GuiCategories(this.player)); + + return; + } + } + } + + @Override + public void onGuiClosed(){ + ItemStack held = player.getHeldItem(); + if(held.hasTagCompound()){ + held.getTagCompound().setString("CATEGORY", this.category.name); + held.getTagCompound().setString("KEY", "0"); + held.getTagCompound().setInteger("PAGE", this.currPage); + } + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/buttons/ButtonNext.java b/src/api/java/bloodutils/api/classes/guide/buttons/ButtonNext.java new file mode 100644 index 00000000..5c2ee604 --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/buttons/ButtonNext.java @@ -0,0 +1,38 @@ +package bloodutils.api.classes.guide.buttons; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.ResourceLocation; + +import org.lwjgl.opengl.GL11; + +public class ButtonNext extends GuiButton { + private final boolean field_146151_o; + + public ButtonNext(int id, int x, int y, boolean p_i1079_4_){ + super(id, x, y, 23, 13, ""); + this.field_146151_o = p_i1079_4_; + } + + public void drawButton(Minecraft mc, int p_146112_2_, int p_146112_3_){ + if (this.visible){ + boolean flag = p_146112_2_ >= this.xPosition && p_146112_3_ >= this.yPosition && p_146112_2_ < this.xPosition + this.width && p_146112_3_ < this.yPosition + this.height; + GL11.glEnable(GL11.GL_BLEND); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + mc.getTextureManager().bindTexture(new ResourceLocation("bloodutils:textures/gui/guide.png")); + int k = 0; + int l = 192; + + if (flag){ + k += 23; + } + + if (!this.field_146151_o){ + l += 13; + } + + this.drawTexturedModalRect(this.xPosition, this.yPosition, k, l, 23, 13); + GL11.glDisable(GL11.GL_BLEND); + } + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/buttons/ButtonPage.java b/src/api/java/bloodutils/api/classes/guide/buttons/ButtonPage.java new file mode 100644 index 00000000..06275c61 --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/buttons/ButtonPage.java @@ -0,0 +1,33 @@ +package bloodutils.api.classes.guide.buttons; + +import java.awt.Color; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; + +public class ButtonPage extends GuiButton { + + public ButtonPage(int id, int xPos, int yPos, int width, int height, String string) { + super(id, xPos, yPos, width, height, string); + } + int gwidth = 170; + int gheight = 180; + + @Override + public void drawButton(Minecraft mc, int x, int y) { + field_146123_n = x >= xPosition && y >= yPosition && x < xPosition + width && y < yPosition + height; + int state = getHoverState(field_146123_n); + x = this.xPosition + width / 2 - 30; + y = this.yPosition + (height - 6) / 2; + mc.fontRenderer.setUnicodeFlag(true); + mc.fontRenderer.drawString(displayString, x + (state == 2 ? 5 : 0), y, calcColor(state)); + mc.fontRenderer.setUnicodeFlag(false); + } + + public int calcColor(int state){ + if(state == 2) + return new Color(155, 155, 155).getRGB(); + else + return new Color(55, 55, 55).getRGB(); + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/classes/guide/elements/ElementCategory.java b/src/api/java/bloodutils/api/classes/guide/elements/ElementCategory.java new file mode 100644 index 00000000..9e970858 --- /dev/null +++ b/src/api/java/bloodutils/api/classes/guide/elements/ElementCategory.java @@ -0,0 +1,55 @@ +package bloodutils.api.classes.guide.elements; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.IIcon; +import net.minecraft.util.ResourceLocation; +import bloodutils.api.classes.guide.GuiIndex; +import bloodutils.api.compact.Category; +import bloodutils.api.helpers.GuiHelper; +import bloodutils.api.interfaces.IEntryElement; + +public class ElementCategory extends GuiScreen implements IEntryElement{ + public ElementCategory(Category category, int x, int y, int width, int height, EntityPlayer player) { + this.category = category; + this.player = player; + + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + public Category category; + public EntityPlayer player; + + public int x; + public int y; + public int width; + public int height; + + + @Override + public void drawElement() { + IIcon icon = category.iconStack.getIconIndex(); + Minecraft.getMinecraft().getTextureManager().bindTexture(new ResourceLocation("bloodutils:textures/misc/tab.png")); + GuiHelper.drawIconWithoutColor(x - 1, y - 1, width + 2 , height + 2, 0); + + GuiHelper.renderIcon(x + 3, y + 2, 16, 16, icon, this.category.type); + } + + @Override + public boolean isMouseInElement(int mX, int mY) { + return GuiHelper.isMouseBetween(mX, mY, x, y, width, height); + } + + @Override + public void onMouseEnter(int mX, int mY) { + Minecraft.getMinecraft().fontRenderer.drawString(this.category.name, mX + 6, mY, 0); + } + + @Override + public void onMouseClick(int mX, int mY, int type){ + Minecraft.getMinecraft().displayGuiScreen(new GuiIndex(this.category, this.player)); + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/compact/Category.java b/src/api/java/bloodutils/api/compact/Category.java new file mode 100644 index 00000000..3e616443 --- /dev/null +++ b/src/api/java/bloodutils/api/compact/Category.java @@ -0,0 +1,18 @@ +package bloodutils.api.compact; + +import net.minecraft.item.ItemStack; +import bloodutils.api.enums.EnumType; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +public class Category { + public Category(String name, ItemStack iconStack, EnumType type){ + this.name = name; + this.iconStack = iconStack; + this.type = type; + } + public String name; + public ItemStack iconStack; + + public EnumType type; +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/compact/CompactItem.java b/src/api/java/bloodutils/api/compact/CompactItem.java new file mode 100644 index 00000000..aac35a16 --- /dev/null +++ b/src/api/java/bloodutils/api/compact/CompactItem.java @@ -0,0 +1,21 @@ +package bloodutils.api.compact; + +import net.minecraft.item.Item; + +public class CompactItem { + public CompactItem(Item item1, Item item2){ + this.item1 = item1; + this.item2 = item2; + } + public Item item1; + public Item item2; + + @Override + public boolean equals(Object obj){ + if(obj instanceof CompactItem){ + CompactItem ci = (CompactItem)obj; + return ci.item1 == this.item1 && ci.item2 == this.item2; + } + return false; + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/compact/Entry.java b/src/api/java/bloodutils/api/compact/Entry.java new file mode 100644 index 00000000..8a701792 --- /dev/null +++ b/src/api/java/bloodutils/api/compact/Entry.java @@ -0,0 +1,14 @@ +package bloodutils.api.compact; + +import bloodutils.api.entries.IEntry; + +public class Entry { + public Entry(IEntry[] entry, String name, int indexPage){ + this.entry = entry; + this.name = name; + this.indexPage = indexPage - 1; + } + public IEntry[] entry; + public String name; + public int indexPage; +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/entries/EntryAltarRecipe.java b/src/api/java/bloodutils/api/entries/EntryAltarRecipe.java new file mode 100644 index 00000000..dbe7df00 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryAltarRecipe.java @@ -0,0 +1,127 @@ +package bloodutils.api.entries; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.oredict.ShapedOreRecipe; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipe; +import bloodutils.api.classes.guide.GuiEntry; + +public class EntryAltarRecipe implements IEntry{ + public EntryAltarRecipe(AltarRecipe recipes){ + this.recipes = recipes; + populate(recipes); + } + public AltarRecipe recipes; + + public ItemStack input; + public ItemStack output; + public int essence; + + public ArrayList icons = new ArrayList(); + + @SuppressWarnings("unchecked") + public void populate(AltarRecipe recipe){ + this.input = recipe.requiredItem; + this.output = recipe.result; + this.essence = recipe.liquidRequired; + } + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + renderOverlay(entry, width, height, left, top); + + x = left + width / 2 - (65-45); + y = (height/2 - 36) + (18*(4-3)); + drawIcon(this.input, x, y); + + /** Result */ + x = left + width / 2 - (65-(48+48)-5); + y = (height/2 - 36) + (18*(4-3)); + drawIcon(this.output, x, y); + + RenderHelper.disableStandardItemLighting(); + + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + + for(ItemIcon icon : icons){ + if(icon.stack != null) + icon.onMouseBetween(mX, mY); + } + } + + public void drawIcon(ItemStack stack, int x, int y){ + RenderItem ri = new RenderItem(); + ri.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, x, y); + ri.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, x, y); + + icons.add(new ItemIcon(stack, x, y)); + } + + public void renderOverlay(GuiEntry entry, int width, int height, int left, int top){ + TextureManager tm = Minecraft.getMinecraft().getTextureManager(); + tm.bindTexture(new ResourceLocation("bloodutils:textures/gui/altar.png")); + entry.drawTexturedModalRect(left, (height/2 - 36) + (18*0) - 17, 0, 0, width, height); + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList){ + + } + + @Override + public void actionPerformed(GuiButton button){ + + } + + static class ItemIcon { + public ItemIcon(ItemStack stack, int x, int y){ + this.stack = stack; + this.x = x; + this.y = y; + } + public ItemStack stack; + public int x, y; + + public void onMouseBetween(int mX, int mY){ + int xSize = x + 16; + int ySize = y + 16; + + + if(mX > x && mX < xSize && mY > y && mY < ySize){ + GL11.glDisable(GL11.GL_DEPTH_TEST); + if(stack != null && stack.getDisplayName() != null) + Minecraft.getMinecraft().fontRenderer.drawString(stack.getDisplayName(), mX + 6, mY, new Color(139, 137, 137).getRGB()); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + } +} diff --git a/src/api/java/bloodutils/api/entries/EntryCraftingRecipe.java b/src/api/java/bloodutils/api/entries/EntryCraftingRecipe.java new file mode 100644 index 00000000..796c8c19 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryCraftingRecipe.java @@ -0,0 +1,204 @@ +package bloodutils.api.entries; + +import java.awt.Color; +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.item.crafting.ShapedRecipes; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.oredict.ShapedOreRecipe; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import WayofTime.alchemicalWizardry.ModItems; +import WayofTime.alchemicalWizardry.api.items.ShapedBloodOrbRecipe; +import bloodutils.api.classes.guide.GuiEntry; + +public class EntryCraftingRecipe implements IEntry{ + public EntryCraftingRecipe(IRecipe recipes){ + this.recipes = recipes; + populate(recipes); + } + public IRecipe recipes; + + public ItemStack[] recipe; + public ItemStack output; + + public ArrayList icons = new ArrayList(); + + @SuppressWarnings("unchecked") + public void populate(IRecipe recipe){ + if(recipe instanceof ShapedRecipes){ + ShapedRecipes rec = (ShapedRecipes)recipe; + if(rec != null && rec.recipeItems != null && rec.recipeItems.length > 0){ + this.recipe = rec.recipeItems; + this.output = rec.getRecipeOutput(); + } + }else if(recipe instanceof ShapedOreRecipe){ + ShapedOreRecipe rec = (ShapedOreRecipe)recipe; + this.recipe = new ItemStack[rec.getInput().length];; + for(int i = 0; i < rec.getInput().length; i++){ + ItemStack s = null; + if(rec.getInput()[i] instanceof ItemStack){ + s = (ItemStack)rec.getInput()[i]; + }else{ + s = ((ArrayList)rec.getInput()[i]).get(0); + } + this.recipe[i] = s; + this.output = rec.getRecipeOutput(); + } + }else if(recipe instanceof ShapedBloodOrbRecipe){ + ShapedBloodOrbRecipe rec = (ShapedBloodOrbRecipe)recipe; + this.recipe = new ItemStack[rec.getInput().length];; + for(int i = 0; i < rec.getInput().length; i++){ + ItemStack s = null; + if(rec.getInput()[i] instanceof ItemStack){ + s = (ItemStack)rec.getInput()[i]; + }else if(rec.getInput()[i] instanceof Object){ + s = new ItemStack(ModItems.masterBloodOrb); + }else{ + s = ((ArrayList)rec.getInput()[i]).get(0); + } + this.recipe[i] = s; + this.output = rec.getRecipeOutput(); + } + } + } + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + renderOverlay(entry, width, height, left, top); + + /** Row 1 */ + x = (left + width / 2) - (65-31); + y = (height/2 - 18) + (18*0); + drawIcon(0, x, y); + + x = left + width / 2 - (65-48) + 1; + y = (height/2 - 18) + (18*(3-3)); + drawIcon(1, x, y); + + x = left + width / 2 - (65-(48+16)-3); + y = (height/2 - 18) + (18*(6-6)); + drawIcon(2, x, y); + + /** Row 2 */ + x = (left + width / 2) - (65-31); + y = (height/2 - 18) + (18*1); + drawIcon(3, x, y); + + x = left + width / 2 - (65-48) + 1; + y = (height/2 - 18) + (18*(4-3)); + drawIcon(4, x, y); + + x = left + width / 2 - (65-(48+16)-3); + y = (height/2 - 18) + (18*(7-6)); + drawIcon(5, x, y); + + /** Row 3 */ + x = (left + width / 2) - (65-31); + y = (height/2 - 18) + (18*2); + drawIcon(6, x, y); + + x = left + width / 2 - (65-48) + 1; + y = (height/2 - 18) + (18*(5-3)); + drawIcon(7, x, y); + + x = left + width / 2 - (65-(48+16)-3); + y = (height/2 - 18) + (18*(8-6)); + drawIcon(8, x, y); + + /** Result */ + x = left + width / 2 - (65-(48+48)-5); + y = (height/2 - 18) + (18*(4-3)); + drawIcon(this.output, x, y); + + RenderHelper.disableStandardItemLighting(); + + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + + for(ItemIcon icon : icons){ + if(icon.stack != null) + icon.onMouseBetween(mX, mY); + } + } + + public void drawIcon(int entry, int x, int y){ + RenderItem ri = new RenderItem(); + if(recipe != null && recipe.length > 0 && recipe[entry] != null){ + ri.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), recipe[entry], x, y); + ri.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), recipe[entry], x, y); + + icons.add(new ItemIcon(recipe[entry], x, y)); + } + } + + public void drawIcon(ItemStack stack, int x, int y){ + RenderItem ri = new RenderItem(); + ri.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, x, y); + ri.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, x, y); + + icons.add(new ItemIcon(stack, x, y)); + } + + public void renderOverlay(GuiEntry entry, int width, int height, int left, int top){ + TextureManager tm = Minecraft.getMinecraft().getTextureManager(); + tm.bindTexture(new ResourceLocation("bloodutils:textures/gui/crafting.png")); + entry.drawTexturedModalRect(left, (height/2 - 18) + (18*0) - 17, 0, 0, width, height); + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList){ + + } + + @Override + public void actionPerformed(GuiButton button){ + + } + + static class ItemIcon { + public ItemIcon(ItemStack stack, int x, int y){ + this.stack = stack; + this.x = x; + this.y = y; + } + public ItemStack stack; + public int x, y; + + public void onMouseBetween(int mX, int mY){ + int xSize = x + 16; + int ySize = y + 16; + + + if(mX > x && mX < xSize && mY > y && mY < ySize){ + GL11.glDisable(GL11.GL_DEPTH_TEST); + if(stack != null && stack.getDisplayName() != null) + Minecraft.getMinecraft().fontRenderer.drawString(stack.getDisplayName(), mX + 6, mY, new Color(139, 137, 137).getRGB()); + GL11.glEnable(GL11.GL_DEPTH_TEST); + } + } + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/entries/EntryImage.java b/src/api/java/bloodutils/api/entries/EntryImage.java new file mode 100644 index 00000000..9d9e1720 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryImage.java @@ -0,0 +1,73 @@ +package bloodutils.api.entries; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import bloodutils.api.classes.guide.GuiEntry; +import bloodutils.api.helpers.GuiHelper; + +public class EntryImage implements IEntry{ + public EntryImage(String resource, int iconWidth, int iconHeight){ + this.resource = new ResourceLocation(resource); + this.iconWidth = iconWidth; + this.iconHeight = iconHeight; + } + public ResourceLocation resource; + public int iconWidth; + public int iconHeight; + + public EntryImage(String resource, int iconWidth, int iconHeight, String entryName){ + this.resource = new ResourceLocation(resource); + this.iconWidth = iconWidth; + this.iconHeight = iconHeight; + this.entryName = entryName; + } + public String entryName; + + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + drawImage(entry, width, height, left, top, player, key, page, mX, mY); + drawText(entry, width, height, left, top, player, key, page, mX, mY); + } + + public void drawImage(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x = left + 32; + int y = top + 10; + Minecraft.getMinecraft().getTextureManager().bindTexture(this.resource); + + GuiHelper.drawScaledIconWithoutColor(x, y, this.iconWidth, this.iconHeight, 0); + } + + public void drawText(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + + if(this.entryName == null) + this.entryName = key; + + String s = StatCollector.translateToLocal("bu.entry." + this.entryName + "." + page); + x = left + width / 2 - 58; + y = (top + 15) + 65; + + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(true); + Minecraft.getMinecraft().fontRenderer.drawSplitString(s, x, y, 110, 0); + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(false); + + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList) { + + } + + @Override + public void actionPerformed(GuiButton button){ + + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/entries/EntryItemText.java b/src/api/java/bloodutils/api/entries/EntryItemText.java new file mode 100644 index 00000000..b99a71d6 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryItemText.java @@ -0,0 +1,90 @@ +package bloodutils.api.entries; + +import java.awt.Color; +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import bloodutils.api.classes.guide.GuiEntry; + +public class EntryItemText implements IEntry{ + public EntryItemText(ItemStack stack){ + this.stack = stack; + } + public ItemStack stack; + + public EntryItemText(ItemStack stack, String entryName){ + this.stack = stack; + this.entryName = entryName; + } + public String entryName; + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + drawText(entry, width, height, left, top, player, key, page, mX, mY); + drawBlock(entry, width, height, left, top, player, key, page, mX, mY); + } + + public void drawText(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + + if(this.entryName == null) + this.entryName = key; + + String s = StatCollector.translateToLocal("bu.entry." + this.entryName + "." + page); + x = left + width / 2 - 58; + y = (top + 15); + + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(true); + Minecraft.getMinecraft().fontRenderer.drawSplitString(s, x, y, 110, 0); + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(false); + + } + + public void drawBlock(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + + RenderItem ri = new RenderItem(); + GL11.glPushMatrix(); + + GL11.glScaled(3, 3, 1); + + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + ri.renderItemAndEffectIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, left - (left/2) + 2, top + 20); + ri.renderItemOverlayIntoGUI(Minecraft.getMinecraft().fontRenderer, Minecraft.getMinecraft().getTextureManager(), stack, left - (left/2) + 2, top + 20); + + RenderHelper.disableStandardItemLighting(); + + GL11.glPopMatrix(); + GL11.glDisable(GL11.GL_LIGHTING); + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList) { + + } + + @Override + public void actionPerformed(GuiButton button){ + + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/entries/EntryRitualInfo.java b/src/api/java/bloodutils/api/entries/EntryRitualInfo.java new file mode 100644 index 00000000..df12a088 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryRitualInfo.java @@ -0,0 +1,38 @@ +package bloodutils.api.entries; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.EntityPlayer; +import bloodutils.api.classes.guide.GuiEntry; + +public class EntryRitualInfo implements IEntry{ + public EntryRitualInfo(int cost){ + + this.cost = cost; + } + public int cost; + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + x = left + width / 2 - 58; + y = (top + 15); + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(true); + Minecraft.getMinecraft().fontRenderer.drawString("Cost: " + this.cost + " LP", x, y, 0); + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(false); + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList){ + + } + + @Override + public void actionPerformed(GuiButton button){ + + } +} diff --git a/src/api/java/bloodutils/api/entries/EntryText.java b/src/api/java/bloodutils/api/entries/EntryText.java new file mode 100644 index 00000000..7268be74 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/EntryText.java @@ -0,0 +1,48 @@ +package bloodutils.api.entries; + +import java.util.List; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.StatCollector; +import bloodutils.api.classes.guide.GuiEntry; + +public class EntryText implements IEntry{ + public EntryText(){ + + } + + public EntryText(String entryName){ + this.entryName = entryName; + } + public String entryName; + + @Override + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY){ + int x, y; + + if(this.entryName == null) + this.entryName = key; + + String s = StatCollector.translateToLocal("bu.entry." + this.entryName + "." + page); + x = left + width / 2 - 58; + y = (top + 15); + + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(true); + Minecraft.getMinecraft().fontRenderer.drawSplitString(s, x, y, 110, 0); + Minecraft.getMinecraft().fontRenderer.setUnicodeFlag(false); + } + + @SuppressWarnings("rawtypes") + @Override + public void initGui(int width, int height, int left, int top, + EntityPlayer player, List buttonList){ + + } + + @Override + public void actionPerformed(GuiButton button){ + + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/entries/IEntry.java b/src/api/java/bloodutils/api/entries/IEntry.java new file mode 100644 index 00000000..b9de2c51 --- /dev/null +++ b/src/api/java/bloodutils/api/entries/IEntry.java @@ -0,0 +1,25 @@ +package bloodutils.api.entries; + +import java.util.List; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.entity.player.EntityPlayer; +import bloodutils.api.classes.guide.GuiEntry; + +public interface IEntry { + /** + * This get's called in GuiEntry, you can do whatever you want here (images, recipes, icons, text, combination of them) + * @param width + * @param height + * @param left + * @param top + * @param player + * The player who has the book open + */ + public void draw(GuiEntry entry, int width, int height, int left, int top, EntityPlayer player, String key, int page, int mX, int mY); + + @SuppressWarnings("rawtypes") + public void initGui(int width, int height, int left, int top, EntityPlayer player, List buttonList); + + public void actionPerformed(GuiButton button); +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/enums/EnumType.java b/src/api/java/bloodutils/api/enums/EnumType.java new file mode 100644 index 00000000..f534a6fe --- /dev/null +++ b/src/api/java/bloodutils/api/enums/EnumType.java @@ -0,0 +1,5 @@ +package bloodutils.api.enums; + +public enum EnumType { + BLOCK, ITEM; +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/helpers/GuiHelper.java b/src/api/java/bloodutils/api/helpers/GuiHelper.java new file mode 100644 index 00000000..90ab2c51 --- /dev/null +++ b/src/api/java/bloodutils/api/helpers/GuiHelper.java @@ -0,0 +1,102 @@ +package bloodutils.api.helpers; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.RenderHelper; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.texture.TextureMap; +import net.minecraft.util.IIcon; + +import org.lwjgl.opengl.GL11; +import org.lwjgl.opengl.GL12; + +import bloodutils.api.enums.EnumType; + +public class GuiHelper { + public static boolean isMouseBetween(int mouseX, int mouseY, int x, int y, int width, int height) { + int xSize = x + width; + int ySize = y + height; + + return (mouseX > x && mouseX < xSize && mouseY > y && mouseY < ySize); + } + + public static void renderIcon(int x, int y, int width, int height, IIcon icon, EnumType type){ + if(type == EnumType.BLOCK) + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationBlocksTexture); + else if(type == EnumType.ITEM) + Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.locationItemsTexture); + + int zLevel = 0; + + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + Tessellator t = Tessellator.instance; + t.startDrawingQuads(); + t.addVertexWithUV((double)(x + 0), (double)(y + height), (double)zLevel, (double)icon.getMinU(), (double)icon.getMaxV()); + t.addVertexWithUV((double)(x + width), (double)(y + height), (double)zLevel, (double)icon.getMaxU(), (double)icon.getMaxV()); + t.addVertexWithUV((double)(x + width), (double)(y + 0), (double)zLevel, (double)icon.getMaxU(), (double)icon.getMinV()); + t.addVertexWithUV((double)(x + 0), (double)(y + 0), (double)zLevel, (double)icon.getMinU(), (double)icon.getMinV()); + t.draw(); + + RenderHelper.disableStandardItemLighting(); + + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } + + public static void drawScaledIconWithoutColor(int x, int y, int width, int height, float zLevel){ + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + GL11.glScaled(0.13D, 0.13D, 0.13D); + GL11.glTranslated(x + 900, y + 250, 0); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + Tessellator t = Tessellator.instance; + t.startDrawingQuads(); + t.addVertexWithUV(x + 0, y + height, zLevel, 0D, 1D); + t.addVertexWithUV(x + width, y + height, zLevel, 1D, 1D); + t.addVertexWithUV(x + width, y + 0, zLevel, 1D, 0D); + t.addVertexWithUV(x + 0, y + 0, zLevel, 0D, 0D); + t.draw(); + + RenderHelper.disableStandardItemLighting(); + + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } + + public static void drawIconWithoutColor(int x, int y, int width, int height, float zLevel){ + GL11.glPushMatrix(); + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glColor4f(1F, 1F, 1F, 1F); + RenderHelper.enableGUIStandardItemLighting(); + GL11.glEnable(GL12.GL_RESCALE_NORMAL); + GL11.glEnable(GL11.GL_DEPTH_TEST); + + Tessellator t = Tessellator.instance; + t.startDrawingQuads(); + t.addVertexWithUV(x + 0, y + height, zLevel, 0D, 1D); + t.addVertexWithUV(x + width, y + height, zLevel, 1D, 1D); + t.addVertexWithUV(x + width, y + 0, zLevel, 1D, 0D); + t.addVertexWithUV(x + 0, y + 0, zLevel, 0D, 0D); + t.draw(); + + RenderHelper.disableStandardItemLighting(); + + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPopMatrix(); + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/helpers/OreDictionaryHelper.java b/src/api/java/bloodutils/api/helpers/OreDictionaryHelper.java new file mode 100644 index 00000000..0848155b --- /dev/null +++ b/src/api/java/bloodutils/api/helpers/OreDictionaryHelper.java @@ -0,0 +1,16 @@ +package bloodutils.api.helpers; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; + +public class OreDictionaryHelper { + public static boolean entryExists(String material){ + return OreDictionary.getOres(material).size() > 0; + } + + public static ItemStack getItemStack(String material, int entry){ + if(entryExists(material)) + return OreDictionary.getOres(material).get(entry); + return null; + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/interfaces/IEntryElement.java b/src/api/java/bloodutils/api/interfaces/IEntryElement.java new file mode 100644 index 00000000..09bd8d7f --- /dev/null +++ b/src/api/java/bloodutils/api/interfaces/IEntryElement.java @@ -0,0 +1,41 @@ +package bloodutils.api.interfaces; + +/** + * Copied from WaslieCore, to make it no longer require it in the API. (https://github.com/wasliebob/WaslieCore/blob/master/src/main/java/wasliecore/interfaces/IElement.java) + */ +public interface IEntryElement{ + /** + * In here you need to draw the element + */ + public void drawElement(); + + /** + * @param mX + * Mouse X Position + * @param mY + * Mouse Y Position + * @return is the mouse in a element + */ + public boolean isMouseInElement(int mX, int mY); + + /** + * This get's called when you enter the element + * @param mX + * Mouse X Position + * @param mY + * Mouse Y Position + */ + + public void onMouseEnter(int mX, int mY); + + /** + * This get's called when you click within the element + * @param mX + * Mouse X Position + * @param mY + * Mouse Y Position + * @param type + * Type of click (right, left, scroll) + */ + public void onMouseClick(int mX, int mY, int type); +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/interfaces/IReviving.java b/src/api/java/bloodutils/api/interfaces/IReviving.java new file mode 100644 index 00000000..e8939376 --- /dev/null +++ b/src/api/java/bloodutils/api/interfaces/IReviving.java @@ -0,0 +1,7 @@ +package bloodutils.api.interfaces; + +import net.minecraft.world.World; + +public interface IReviving { + public void spawnEntity(World world, int x, int y, int z); +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/package-info.java b/src/api/java/bloodutils/api/package-info.java new file mode 100644 index 00000000..a307cf7e --- /dev/null +++ b/src/api/java/bloodutils/api/package-info.java @@ -0,0 +1,3 @@ +@API(owner = "BloodUtils", apiVersion = "1.0c", provides = "BloodUtils|API") +package bloodutils.api; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/api/java/bloodutils/api/registries/EntryRegistry.java b/src/api/java/bloodutils/api/registries/EntryRegistry.java new file mode 100644 index 00000000..1b82db16 --- /dev/null +++ b/src/api/java/bloodutils/api/registries/EntryRegistry.java @@ -0,0 +1,40 @@ +package bloodutils.api.registries; + +import java.util.ArrayList; +import java.util.HashMap; + +import bloodutils.api.compact.Category; +import bloodutils.api.compact.Entry; +import bloodutils.api.entries.IEntry; + +public class EntryRegistry { + public static void registerCategories(Category category){ + categories.add(category); + categoryMap.put(category.name, category); + categoryCount++; + } + public static ArrayList categories = new ArrayList(); + public static HashMap categoryMap = new HashMap(); + + public static int categoryCount = 0; + + public static void registerEntry(Category category, HashMap entryMap, Entry entry){ + entryMap.put(entry.name, entry); + entries.put(category, entryMap); + + if(maxEntries.containsKey(category) && entry.indexPage > maxEntries.get(category)) + maxEntries.put(category, entry.indexPage); + else if(!maxEntries.containsKey(category)) + maxEntries.put(category, 0); + + } + public static HashMap> entries = new HashMap>(); + + public static HashMap maxEntries = new HashMap(); + + + public static HashMap basics = new HashMap(); + public static HashMap rituals = new HashMap(); + public static HashMap bloodUtils = new HashMap(); + +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/registries/RecipeRegistry.java b/src/api/java/bloodutils/api/registries/RecipeRegistry.java new file mode 100644 index 00000000..5bbd2da4 --- /dev/null +++ b/src/api/java/bloodutils/api/registries/RecipeRegistry.java @@ -0,0 +1,47 @@ +package bloodutils.api.registries; + +import java.util.ArrayList; + +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.oredict.ShapedOreRecipe; +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipe; +import WayofTime.alchemicalWizardry.api.altarRecipeRegistry.AltarRecipeRegistry; +import WayofTime.alchemicalWizardry.api.items.ShapedBloodOrbRecipe; +import cpw.mods.fml.common.registry.GameRegistry; + +public class RecipeRegistry { +public static ArrayList craftingRecipes = new ArrayList(); +public static ArrayList altarRecipes = new ArrayList(); + + /** Used to register crafting recipes to the guide */ + public static IRecipe getLatestCraftingRecipe(){ + IRecipe rec = (IRecipe)CraftingManager.getInstance().getRecipeList().get(CraftingManager.getInstance().getRecipeList().size() -1); + craftingRecipes.add(rec); + return craftingRecipes.get(craftingRecipes.size() - 1); + } + + /** Used to register items to the guide */ + public static AltarRecipe getLatestAltarRecipe(){ + AltarRecipe rec = (AltarRecipe)AltarRecipeRegistry.altarRecipes.get(AltarRecipeRegistry.altarRecipes.size() - 1); + altarRecipes.add(rec); + return altarRecipes.get(altarRecipes.size() - 1); + } + + public static void addAltarRecipe(ItemStack result, ItemStack requiredItem, int minTier, int liquidRequired, int consumptionRate, int drainRate, boolean canBeFilled){ + AltarRecipeRegistry.registerAltarRecipe(result, requiredItem, minTier, liquidRequired, consumptionRate, drainRate, canBeFilled); + } + + public static void addShapedRecipe(ItemStack output, Object[] obj){ + GameRegistry.addShapedRecipe(output, obj); + } + + public static void addShapedOrbRecipe(ItemStack output, Object[] obj){ + GameRegistry.addRecipe(new ShapedBloodOrbRecipe(output, obj)); + } + + public static void addShapedOreRecipe(ItemStack output, Object[] obj){ + GameRegistry.addRecipe(new ShapedOreRecipe(output, obj)); + } +} \ No newline at end of file diff --git a/src/api/java/bloodutils/api/registries/RevivingRegistry.java b/src/api/java/bloodutils/api/registries/RevivingRegistry.java new file mode 100644 index 00000000..c3b97d65 --- /dev/null +++ b/src/api/java/bloodutils/api/registries/RevivingRegistry.java @@ -0,0 +1,13 @@ +package bloodutils.api.registries; + +import java.util.HashMap; + +import bloodutils.api.compact.CompactItem; +import bloodutils.api.interfaces.IReviving; + +public class RevivingRegistry { + public static void registerReviving(CompactItem ingredients, IReviving reviving){ + recipes.put(ingredients, reviving); + } + public static HashMap recipes = new HashMap(); +} \ No newline at end of file diff --git a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java index 56db6b31..5e82274e 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java +++ b/src/main/java/WayofTime/alchemicalWizardry/AlchemicalWizardry.java @@ -54,21 +54,108 @@ import WayofTime.alchemicalWizardry.common.NewPacketHandler; import WayofTime.alchemicalWizardry.common.alchemy.CombinedPotionRegistry; import WayofTime.alchemicalWizardry.common.block.ArmourForge; import WayofTime.alchemicalWizardry.common.bloodAltarUpgrade.UpgradedAltars; +import WayofTime.alchemicalWizardry.common.book.BUEntries; import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketAngel; import WayofTime.alchemicalWizardry.common.demonVillage.demonHoard.DemonPacketRegistry; import WayofTime.alchemicalWizardry.common.demonVillage.tileEntity.TEDemonPortal; -import WayofTime.alchemicalWizardry.common.entity.mob.*; -import WayofTime.alchemicalWizardry.common.harvest.*; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBileDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityBoulderFist; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityEarthElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFallenAngel; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityFireElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityHolyElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityIceDemon; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityLowerGuardian; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShade; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityShadeElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntitySmallEarthGolem; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityWaterElemental; +import WayofTime.alchemicalWizardry.common.entity.mob.EntityWingedFireDemon; +import WayofTime.alchemicalWizardry.common.harvest.BloodMagicHarvestHandler; +import WayofTime.alchemicalWizardry.common.harvest.CactusReedHarvestHandler; +import WayofTime.alchemicalWizardry.common.harvest.GourdHarvestHandler; +import WayofTime.alchemicalWizardry.common.harvest.PamHarvestCompatRegistry; import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; import WayofTime.alchemicalWizardry.common.items.thaumcraft.ItemSanguineArmour; -import WayofTime.alchemicalWizardry.common.potion.*; +import WayofTime.alchemicalWizardry.common.potion.PotionBoost; +import WayofTime.alchemicalWizardry.common.potion.PotionDeaf; +import WayofTime.alchemicalWizardry.common.potion.PotionDrowning; +import WayofTime.alchemicalWizardry.common.potion.PotionFeatherFall; +import WayofTime.alchemicalWizardry.common.potion.PotionFireFuse; +import WayofTime.alchemicalWizardry.common.potion.PotionFlameCloak; +import WayofTime.alchemicalWizardry.common.potion.PotionFlight; +import WayofTime.alchemicalWizardry.common.potion.PotionHeavyHeart; +import WayofTime.alchemicalWizardry.common.potion.PotionIceCloak; +import WayofTime.alchemicalWizardry.common.potion.PotionInhibit; +import WayofTime.alchemicalWizardry.common.potion.PotionPlanarBinding; +import WayofTime.alchemicalWizardry.common.potion.PotionProjectileProtect; +import WayofTime.alchemicalWizardry.common.potion.PotionReciprocation; +import WayofTime.alchemicalWizardry.common.potion.PotionSoulFray; +import WayofTime.alchemicalWizardry.common.potion.PotionSoulHarden; import WayofTime.alchemicalWizardry.common.renderer.AlchemyCircleRenderer; -import WayofTime.alchemicalWizardry.common.rituals.*; -import WayofTime.alchemicalWizardry.common.spell.simple.*; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAnimalGrowth; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectAutoAlchemy; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectBiomeChanger; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectContainment; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectCrushing; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectEllipsoid; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectEvaporation; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectExpulsion; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredEarth; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFeatheredKnife; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFlight; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectFullStomach; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectGrowth; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHarvest; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectHealing; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectInterdiction; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectItemSuction; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectJumping; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLava; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLeap; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectLifeConduit; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectMagnetic; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSoulBound; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSpawnWard; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSummonMeteor; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectSupression; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectUnbinding; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectVeilOfEvil; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWater; +import WayofTime.alchemicalWizardry.common.rituals.RitualEffectWellOfSuffering; +import WayofTime.alchemicalWizardry.common.spell.simple.HomSpellRegistry; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellEarthBender; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellExplosions; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellFireBurst; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellFrozenWater; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellHolyBlast; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellLightningBolt; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellTeleport; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellWateryGrave; +import WayofTime.alchemicalWizardry.common.spell.simple.SpellWindGust; import WayofTime.alchemicalWizardry.common.summoning.SummoningHelperAW; import WayofTime.alchemicalWizardry.common.summoning.meteor.MeteorRegistry; -import WayofTime.alchemicalWizardry.common.tileEntity.*; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAlchemicCalcinator; +import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEBellJar; +import WayofTime.alchemicalWizardry.common.tileEntity.TEConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TEHomHeart; +import WayofTime.alchemicalWizardry.common.tileEntity.TEMasterStone; +import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; +import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; +import WayofTime.alchemicalWizardry.common.tileEntity.TEReagentConduit; +import WayofTime.alchemicalWizardry.common.tileEntity.TESchematicSaver; +import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpectralContainer; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEffectBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellEnhancementBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellModifierBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TESpellParadigmBlock; +import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; +import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import WayofTime.alchemicalWizardry.common.tileEntity.gui.GuiHandler; import WayofTime.alchemicalWizardry.common.tweaker.MineTweakerIntegration; import cpw.mods.fml.common.FMLCommonHandler; @@ -777,6 +864,8 @@ public class AlchemicalWizardry @EventHandler public void postInit(FMLPostInitializationEvent event) { + BUEntries entries = new BUEntries(); + entries.postInit(); //TODO Thaumcraft Integration if (Loader.isModLoaded("Thaumcraft")) { diff --git a/src/main/java/WayofTime/alchemicalWizardry/ModItems.java b/src/main/java/WayofTime/alchemicalWizardry/ModItems.java index d7cb3b79..6a2e112d 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/ModItems.java +++ b/src/main/java/WayofTime/alchemicalWizardry/ModItems.java @@ -1,16 +1,84 @@ package WayofTime.alchemicalWizardry; -import WayofTime.alchemicalWizardry.common.items.*; -import WayofTime.alchemicalWizardry.common.items.energy.ItemAttunedCrystal; -import WayofTime.alchemicalWizardry.common.items.energy.ItemDestinationClearer; -import WayofTime.alchemicalWizardry.common.items.energy.ItemTankSegmenter; -import WayofTime.alchemicalWizardry.common.items.potion.*; -import WayofTime.alchemicalWizardry.common.items.sigil.*; -import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; -import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Items; import net.minecraft.item.Item; +import WayofTime.alchemicalWizardry.common.book.ItemBMBook; +import WayofTime.alchemicalWizardry.common.items.AWBaseItems; +import WayofTime.alchemicalWizardry.common.items.ActivationCrystal; +import WayofTime.alchemicalWizardry.common.items.AirScribeTool; +import WayofTime.alchemicalWizardry.common.items.ApprenticeBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ArchmageBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ArmourInhibitor; +import WayofTime.alchemicalWizardry.common.items.BlankSpell; +import WayofTime.alchemicalWizardry.common.items.BloodShard; +import WayofTime.alchemicalWizardry.common.items.BoundArmour; +import WayofTime.alchemicalWizardry.common.items.BoundAxe; +import WayofTime.alchemicalWizardry.common.items.BoundPickaxe; +import WayofTime.alchemicalWizardry.common.items.BoundShovel; +import WayofTime.alchemicalWizardry.common.items.CheatyItem; +import WayofTime.alchemicalWizardry.common.items.CreativeDagger; +import WayofTime.alchemicalWizardry.common.items.DaggerOfSacrifice; +import WayofTime.alchemicalWizardry.common.items.DemonPlacer; +import WayofTime.alchemicalWizardry.common.items.DemonicTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.DuskScribeTool; +import WayofTime.alchemicalWizardry.common.items.EarthScribeTool; +import WayofTime.alchemicalWizardry.common.items.EnergyBattery; +import WayofTime.alchemicalWizardry.common.items.EnergyBazooka; +import WayofTime.alchemicalWizardry.common.items.EnergyBlast; +import WayofTime.alchemicalWizardry.common.items.EnergySword; +import WayofTime.alchemicalWizardry.common.items.EnhancedTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.FireScribeTool; +import WayofTime.alchemicalWizardry.common.items.ItemAlchemyBase; +import WayofTime.alchemicalWizardry.common.items.ItemComplexSpellCrystal; +import WayofTime.alchemicalWizardry.common.items.ItemComponents; +import WayofTime.alchemicalWizardry.common.items.ItemDiabloKey; +import WayofTime.alchemicalWizardry.common.items.ItemRitualDiviner; +import WayofTime.alchemicalWizardry.common.items.LavaCrystal; +import WayofTime.alchemicalWizardry.common.items.LifeBucket; +import WayofTime.alchemicalWizardry.common.items.MagicianBloodOrb; +import WayofTime.alchemicalWizardry.common.items.MasterBloodOrb; +import WayofTime.alchemicalWizardry.common.items.ReinforcedTelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.SacrificialDagger; +import WayofTime.alchemicalWizardry.common.items.TelepositionFocus; +import WayofTime.alchemicalWizardry.common.items.WaterScribeTool; +import WayofTime.alchemicalWizardry.common.items.energy.ItemAttunedCrystal; +import WayofTime.alchemicalWizardry.common.items.energy.ItemDestinationClearer; +import WayofTime.alchemicalWizardry.common.items.energy.ItemTankSegmenter; +import WayofTime.alchemicalWizardry.common.items.potion.AlchemyFlask; +import WayofTime.alchemicalWizardry.common.items.potion.AlchemyReagent; +import WayofTime.alchemicalWizardry.common.items.potion.AverageLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.AveragePowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.CombinationalCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.EnhancedFillingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.GreaterLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.GreaterPowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.MundaneLengtheningCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.MundanePowerCatalyst; +import WayofTime.alchemicalWizardry.common.items.potion.StandardBindingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.StandardFillingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.WeakBindingAgent; +import WayofTime.alchemicalWizardry.common.items.potion.WeakFillingAgent; +import WayofTime.alchemicalWizardry.common.items.sigil.AirSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.DivinationSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemBloodLightSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemFluidSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSeerSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSigilOfEnderSeverance; +import WayofTime.alchemicalWizardry.common.items.sigil.ItemSigilOfSupression; +import WayofTime.alchemicalWizardry.common.items.sigil.LavaSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfElementalAffinity; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfGrowth; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHaste; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfHolding; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfMagnetism; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfTheBridge; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfTheFastMiner; +import WayofTime.alchemicalWizardry.common.items.sigil.SigilOfWind; +import WayofTime.alchemicalWizardry.common.items.sigil.VoidSigil; +import WayofTime.alchemicalWizardry.common.items.sigil.WaterSigil; +import WayofTime.alchemicalWizardry.common.items.spell.ItemSpellMultiTool; +import cpw.mods.fml.common.registry.GameRegistry; /** * Created with IntelliJ IDEA. @@ -121,6 +189,8 @@ public class ModItems public static Item itemAttunedCrystal; public static Item itemTankSegmenter; public static Item itemDestinationClearer; + + public static Item itemBloodMagicBook; public static Item bucketLife; @@ -216,6 +286,7 @@ public class ModItems itemAttunedCrystal = new ItemAttunedCrystal().setUnlocalizedName("itemAttunedCrystal"); itemTankSegmenter = new ItemTankSegmenter().setUnlocalizedName("itemTankSegmenter"); itemDestinationClearer = new ItemDestinationClearer().setUnlocalizedName("destinationClearer"); + itemBloodMagicBook = new ItemBMBook().setUnlocalizedName("bmBook"); } public static void registerItems() @@ -314,6 +385,8 @@ public class ModItems GameRegistry.registerItem(ModItems.itemTankSegmenter, "itemTankSegmenter"); GameRegistry.registerItem(ModItems.itemDestinationClearer, "itemDestinationClearer"); + GameRegistry.registerItem(ModItems.itemBloodMagicBook, "itemBloodMagicBook"); + GameRegistry.registerItem(ModItems.baseItems, "bloodMagicBaseItems"); GameRegistry.registerItem(ModItems.baseAlchemyItems, "bloodMagicBaseAlchemyItems"); //GameRegistry.registerItem(ModItems.itemBloodFrame, "itemBloodFrame"); diff --git a/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBloodOrbShapedHandler.java b/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBloodOrbShapedHandler.java index 4f89f30d..1db08fa1 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBloodOrbShapedHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/client/nei/NEIBloodOrbShapedHandler.java @@ -129,10 +129,6 @@ public class NEIBloodOrbShapedHandler extends ShapedRecipeHandler { transferRects.add(new RecipeTransferRect(new Rectangle(84, 23, 24, 18), "crafting")); } - @Override - public String getOverlayIdentifier() { - return "crafting"; - } @Override public String getRecipeName() { diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/book/BUEntries.java b/src/main/java/WayofTime/alchemicalWizardry/common/book/BUEntries.java new file mode 100644 index 00000000..3d92ac3b --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/book/BUEntries.java @@ -0,0 +1,122 @@ +package WayofTime.alchemicalWizardry.common.book; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumChatFormatting; +import WayofTime.alchemicalWizardry.ModBlocks; +import WayofTime.alchemicalWizardry.ModItems; +import bloodutils.api.compact.Category; +import bloodutils.api.compact.Entry; +import bloodutils.api.entries.EntryAltarRecipe; +import bloodutils.api.entries.EntryCraftingRecipe; +import bloodutils.api.entries.EntryImage; +import bloodutils.api.entries.EntryItemText; +import bloodutils.api.entries.EntryRitualInfo; +import bloodutils.api.entries.EntryText; +import bloodutils.api.entries.IEntry; +import bloodutils.api.enums.EnumType; +import bloodutils.api.registries.EntryRegistry; + +public class BUEntries +{ + public void postInit() + { + initCategories(); + initEntries(); + } + + public void initCategories(){ + categoryBasics = new Category("Basics", new ItemStack(ModItems.weakBloodOrb), EnumType.ITEM); + categoryRituals = new Category("Rituals", new ItemStack(ModItems.itemRitualDiviner), EnumType.ITEM); + + registerCategories(); + } + public static Category categoryBasics; + public static Category categoryRituals; + + public void registerCategories(){ + EntryRegistry.registerCategories(BUEntries.categoryBasics); + EntryRegistry.registerCategories(BUEntries.categoryRituals); + + } + + public void initEntries(){ + theAltar = new Entry(new IEntry[]{new EntryItemText(new ItemStack(ModBlocks.blockAltar), "Blood Altar")}, EnumChatFormatting.BLUE + "Blood Altar", 1); + runes = new Entry(new IEntry[]{new EntryItemText(new ItemStack(ModBlocks.runeOfSelfSacrifice)), new EntryItemText(new ItemStack(ModBlocks.runeOfSacrifice)), new EntryItemText(new ItemStack(ModBlocks.speedRune))}, "Runes", 1); + + /** Page 1 */ + ritualWater = new Entry(new IEntry[]{new EntryText()}, "Full Spring", 1); + ritualLava = new Entry(new IEntry[]{new EntryText(), new EntryText()}, "Nether", 1); + ritualGreenGrove = new Entry(new IEntry[]{new EntryText(), new EntryText()}, "Green Grove", 1); + ritualInterdiction = new Entry(new IEntry[]{new EntryText(), new EntryText()}, "Interdiction", 1); + ritualContainment = new Entry(new IEntry[]{new EntryText()}, "Containment", 1); + ritualHighJump = new Entry(new IEntry[]{new EntryText()}, "High Jump", 1); + ritualSpeed = new Entry(new IEntry[]{new EntryText()}, "Speed", 1); + ritualMagnet = new Entry(new IEntry[]{new EntryText()}, "Magnetism", 1); + ritualCrusher = new Entry(new IEntry[]{new EntryText()}, "Crusher", 1); + ritualShepherd = new Entry(new IEntry[]{new EntryText()}, "Shepherd", 1); + ritualRegeneration = new Entry(new IEntry[]{new EntryText(), new EntryText(), new EntryText()}, "Regeneration", 1); + ritualFeatheredKnife = new Entry(new IEntry[]{new EntryText(), new EntryText(), new EntryText(), new EntryText()}, "Feathered Knife", 1); + ritualMoon = new Entry(new IEntry[]{new EntryText()}, "Harvest Moon", 1); + ritualSoul = new Entry(new IEntry[]{new EntryText(), new EntryText()}, "Eternal Soul", 1); + + ritualCure = new Entry(new IEntry[]{new EntryText(), new EntryRitualInfo(500)}, "Curing", 1); +// blockDivination = new Entry(new IEntry[]{new EntryItemText(new ItemStack(BUBlocks.altarProgress)), new EntryCraftingRecipe(BURecipes.altarProgress)}, "Divination Block", 1); +// sigilAdvancedDivination = new Entry(new IEntry[]{new EntryItemText(new ItemStack(BUItems.sigil_advancedDivination)), new EntryAltarRecipe(BURecipes.advancedSigil)}, "Advanced Divination", 1); +// +// elementRituals = new Entry(new IEntry[]{new EntryItemText(new ItemStack(BUBlocks.darknessArea)), new EntryText(), new EntryCraftingRecipe(BURecipes.gemEmpty), new EntryAltarRecipe(BURecipes.diamondBlood)}, "Elemental Rituals", 1); +// reviving = new Entry(new IEntry[]{new EntryText(), new EntryCraftingRecipe(BURecipes.reviver)}, "Reviving", 1); + + /** Debug */ + debug = new Entry(new IEntry[]{new EntryText("Debug"), new EntryImage("bloodutils:textures/misc/screenshots/t1.png", 854, 480, "Debug")}, EnumChatFormatting.AQUA + "De" + EnumChatFormatting.RED + "bug", 1); + registerEntries(); + } + public static Entry theAltar; + public static Entry runes; + + public static Entry ritualCure; + public static Entry sigilAdvancedDivination; + public static Entry blockDivination; + + public static Entry ritualWater; + public static Entry ritualLava; + public static Entry ritualGreenGrove; + public static Entry ritualInterdiction; + public static Entry ritualContainment; + public static Entry ritualHighJump; + public static Entry ritualSpeed; + public static Entry ritualMagnet; + public static Entry ritualCrusher; + public static Entry ritualShepherd; + public static Entry ritualRegeneration; + public static Entry ritualFeatheredKnife; + public static Entry ritualMoon; + public static Entry ritualSoul; + + public static Entry elementRituals; + public static Entry reviving; + + public static Entry debug; + + public void registerEntries(){ + EntryRegistry.registerEntry(BUEntries.categoryBasics, EntryRegistry.basics, BUEntries.theAltar); + EntryRegistry.registerEntry(BUEntries.categoryBasics, EntryRegistry.basics, BUEntries.runes); + + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualWater); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualLava); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualGreenGrove); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualInterdiction); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualContainment); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualHighJump); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualSpeed); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualMagnet); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualCrusher); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualShepherd); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualRegeneration); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualFeatheredKnife); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualMoon); + EntryRegistry.registerEntry(BUEntries.categoryRituals, EntryRegistry.rituals, BUEntries.ritualSoul); + + /** Debug */ + EntryRegistry.registerEntry(BUEntries.categoryBasics, EntryRegistry.basics, BUEntries.debug); + } +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/book/ItemBMBook.java b/src/main/java/WayofTime/alchemicalWizardry/common/book/ItemBMBook.java new file mode 100644 index 00000000..df36e724 --- /dev/null +++ b/src/main/java/WayofTime/alchemicalWizardry/common/book/ItemBMBook.java @@ -0,0 +1,50 @@ +package WayofTime.alchemicalWizardry.common.book; + +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.World; +import WayofTime.alchemicalWizardry.AlchemicalWizardry; + +public class ItemBMBook extends Item +{ + public ItemBMBook() + { + super(); + setMaxStackSize(1); + this.setCreativeTab(AlchemicalWizardry.tabBloodMagic); + } + + @Override + public void registerIcons(IIconRegister ir) + { + itemIcon = ir.registerIcon("AlchemicalWizardry" + ":" + "guide"); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) + { + player.openGui(AlchemicalWizardry.instance, 2, world, (int)player.posX, (int)player.posY, (int)player.posZ); + return stack; + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5) + { + super.onUpdate(stack, world, entity, par4, par5); + if(!stack.hasTagCompound()) + stack.setTagCompound(new NBTTagCompound()); + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player) + { + super.onCreated(stack, world, player); + if(!stack.hasTagCompound()) + stack.setTagCompound(new NBTTagCompound()); + } + +} diff --git a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java index 2c50234a..bff2754c 100644 --- a/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java +++ b/src/main/java/WayofTime/alchemicalWizardry/common/tileEntity/gui/GuiHandler.java @@ -1,13 +1,19 @@ package WayofTime.alchemicalWizardry.common.tileEntity.gui; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerTeleposer; import WayofTime.alchemicalWizardry.common.tileEntity.container.ContainerWritingTable; +import bloodutils.api.classes.guide.GuiCategories; +import bloodutils.api.classes.guide.GuiEntry; +import bloodutils.api.classes.guide.GuiIndex; +import bloodutils.api.compact.Category; +import bloodutils.api.registries.EntryRegistry; import cpw.mods.fml.common.network.IGuiHandler; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; public class GuiHandler implements IGuiHandler { @@ -44,6 +50,8 @@ public class GuiHandler implements IGuiHandler public Object getClientGuiElement(int id, EntityPlayer player, World world, int x, int y, int z) { TileEntity tileEntity; + + ItemStack held = player.getHeldItem(); switch (id) { @@ -66,6 +74,31 @@ public class GuiHandler implements IGuiHandler } break; + + case 2: + + if(held.hasTagCompound() && held.getTagCompound().getString("CATEGORY") != null){ + if(held.hasTagCompound() && held.getTagCompound().getString("KEY") != null && held.getTagCompound().getString("KEY") != "0"){ + String cate = held.getTagCompound().getString("CATEGORY"); + String key = held.getTagCompound().getString("KEY"); + int page = held.getTagCompound().getInteger("PAGE"); + if(EntryRegistry.categoryMap.containsKey(cate)){ + Category category = EntryRegistry.categoryMap.get(cate); + return new GuiEntry(key, player, category, page); + }else{ + return new GuiCategories(player); + } + }else if(held.hasTagCompound() && held.getTagCompound().getString("CATEGORY") != null){ + String cate = held.getTagCompound().getString("CATEGORY"); + int page = held.getTagCompound().getInteger("PAGE"); + if(EntryRegistry.categoryMap.containsKey(cate)){ + Category category = EntryRegistry.categoryMap.get(cate); + return new GuiIndex(category, player, page); + } + } + } + return new GuiCategories(player); + } return null; diff --git a/src/main/resources/assets/bloodutils/lang/en_US.lang b/src/main/resources/assets/bloodutils/lang/en_US.lang new file mode 100644 index 00000000..88c667b1 --- /dev/null +++ b/src/main/resources/assets/bloodutils/lang/en_US.lang @@ -0,0 +1,73 @@ +--Items-- +item.ritual sigil.name=Ritual Sigil +item.advanced divination sigil.name=Advanced Divination Sigil +item.creative tool.name=Creative Tool +item.blood tome.name=Blood Tome +item.earth gem.name=Earth Gem +item.water gem.name=Water Gem +item.fire gem.name=Fire Gem +item.air gem.name=Air Gem +item.light gem.name=Light Gem +item.darkness gem.name=Darkness Gem +item.rainbow gem.name=Rainbow Gem +item.empty gem.name=Elemental Gem Casing +item.blood diamond.name=Blood Diamond +item.blood iron ingot.name=Blood Diamond Ingot +item.royal blood shard.name=Royal Blood Shard +--Blocks-- +tile.altar progression checker.name=Divination Block +tile.altar builder.name=Altar Builder +tile.blood diamond block.name=Blood Diamond Block +tile.blood iron block.name=Blood Iron Block +tile.area earth.name=Magic Ritual: Earth +tile.area fire.name=Magic Ritual: Fire +tile.area water.name=Magic Ritual: Water +tile.area air.name=Magic Ritual: Air +tile.area darkness.name=Magic Ritual: Darkness +tile.area light.name=Magic Ritual: Light +tile.area rainbow.name=Magic Ritual: Rainbow +tile.earth block.name=Earth Block +tile.discoball.name=Discoball +tile.discoball stairs.name=Disco Stairs +tile.reviver.name=Reviving Altar +--Entities-- +entity.BloodUtils.royal.name=Royal +--Entries-- +bu.entry.Blood Altar.1=The altar is the first thing you most likely want to make in blood magic, it's the base of everything. You need a sacrificial knife/orb to fill it up. +bu.entry.Runes.1=The Rune of Self-Sacrifice is a rune which increases the amount of essence you get for sacrificing yourself by 10 percent. +bu.entry.Runes.2=The Rune of Sacrifice is a rune which increases the amount of essence you get from mobs by 10 percent. +bu.entry.Runes.3=The Speed Rune is a rune which increases the speed of your altar by 20 percent. +bu.entry.Advanced Divination.1=The Advanced Divination Sigil is an advanced version of the Divination Sigil, displaying some extra info like progress and essence obtained by (self)sacrificing. +bu.entry.Divination Block.1=The Divination Block is basicly a block version of the Advanced Divination Sigil. +bu.entry.Full Spring.1=By jumpstarting the ritual with 500LP, you can create a simple infinite spring that will always replenish itself - at the cost of 25 LP per source block. If you have a pump, and are afraid of things like server lag causing a water source to not materialize, try this easy infinite water! Buckets also work on this thing! +bu.entry.Nether.1=A bit more hellish of a ritual, this process will allow an infinite source of lava to be added to the world at an activation cost of 10000LP, but 500LP per source. +bu.entry.Nether.2=It is intended for people who would otherwise pump the Nether dry, and offers up instead a lag-less alternative. You still need a pump, though, so don't forget that. Or a bucket - that works, too! +bu.entry.Green Grove.1=When activated, this ritual will take a measly 250LP away, but will cause any plant two spaces above the Master Ritual Stone to grow faster. At the cost of 20LP per second, it will every second apply a "growth tick" on the plant! +bu.entry.Green Grove.2= if the plant gets enough of these, it will grow naturally. This may be tuned in the future, but things such as sugar cane or mushrooms will now grow at a much faster rate!This should also work for any mod-added plant! +bu.entry.Interdiction.1=This ritual is a tribute to EE2's Interdiction Torch. At a cost of 1000LP to activate and 10LP per second to have it run, it might be wise to have a lever of some sort on it to keep it off when not in use. If you are wondering what it does, simply put an animal of some sort close to the center stone and activate it. +bu.entry.Interdiction.2= At a cost of 1000LP to activate and 10LP per second to have it run, it might be wise to have a lever of some sort on it to keep it off when not in use. If you are wondering what it does, simply put an animal of some sort close to the center stone and activate it. Quite useful for aggressive mobs, too! +bu.entry.Containment.1=This ritual does the opposite of what the interdiction ritual does. It pushes the mobs out instead of keeping them in the area. +bu.entry.Speed.1=When in the Area of Influence, the entity will get launched forwards and upwards in the direction of the Dusk rune. You will go quite fast, so make sure to have a good way to slow down! +bu.entry.Harvest Moon.1=This ritual searches a 9x9 area for harvestable plants. What is more, it will replant one of the seeds that is dropped into the soil and drop the remainder items into the world. It has a radius of 4, so it will work on plants above/below it. Modders may hook into the ritual to add their own harvest handlers. +bu.entry.Shepherd.1=For those who enjoy sacrificing animals, or even just making them grow faster for whatever reason, this ritual is for you. While active, it will take a child animal and accelerate its growth rate by 6, meaning it will take only 3 minutes to grow to an adult instead of the usual 20 minutes! +bu.entry.Shepherd.2=This will take approximately 400LP per animal from infant to adult, so if you do plan to sacrifice your animals (you monster!) make sure your altar is properly equipped. +bu.entry.Regeneration.1=his ritual acts to cast regeneration on any entity that is within its range of 10 blocks. Unlike beacons, it works on all entities at a cost, however it also works on players (who knew), and it will only cast regen on the entity if they are below max health. +bu.entry.Regeneration.2= Since the life force of players is a lot more precious than that of common sheep and pigs, it will cost more to heal them. +bu.entry.Regeneration.3=This ritual is designed to have either the Well of Suffering ritual or the Ritual of the Feathered Knife to slot into the ritual, to save space, although it is not necessary to do so. If you do keep the ritual on, just make sure no creepers or such were to have regen on when they sneak up on you... +bu.entry.Feathered Knife.1=While you or any player is within its area of influence, which is about a radius of 15 horizontally and 20 vertically, this ritual will start to siphon from your pool of health directly. +bu.entry.Feathered Knife.2=For every heart of life that is taken from a player is placed into a nearby altar (costs 20LP per half-heart and fills the altar by 100LP). Ritual looks for target altar in radius of 5 horizontally and 10 vertically. +bu.entry.Feathered Knife.3=Like the Well of Suffering, this ritual does respect any Self-Sacrifice runes that are on the altar. What's more, this ritual also stops siphoning from your health if your health drops to three hearts or less. +bu.entry.Feathered Knife.4=So unless a zombie jumps you while you are in your base, you shouldn't be worried about any possible death! Like the Well of Suffering it costs 50,000 LP to activate this ritual. +bu.entry.High Jump.1=When activated, any entities on top of it get launched into the air. If they land on top of the center stone, no fall damage occurs. +bu.entry.Crusher.1=One of the more useful rituals, this ritual will search the 3x3x3 volume below itself and try to break the blocks there. If there is a chest (or any Inventory) directly on top of the center ritual stone, it will dump the contents inside of the chest. If you pair this with a Ritual of Magnetism. +bu.entry.Magnetism.1=This ritual searches in a 7x7 area beneath itself and looks for any ores - when it finds one, it sucks it to the surface and places it inside of the 3x3x3 volume in the ritual. This will be handy for anyone that wishes to quarry a decent area without having to worry about leaving huge holes. +bu.entry.Eternal Soul.1=Meant to be the pinnacle of self-sacrifice, this ritual will use your body as a conduit to fill the nearby altar from your Soul Network. For every LP that it puts into the altar, it will take 2LP from your Network, and will only function while the activator is around the ritual. +bu.entry.Eternal Soul.2=What is more, it will put the LP into the input buffer of the altar. It's best to use good runes for your altar to maximize the benefits. Also, while in the ritual's effect and when work is being done, the user's health will be set to 1 heart. Make sure to only use this ritual in a safe place or near your comrades. +bu.entry.Curing.1=This ritual can become really helpful, this ritual cures a player from all potion effects, it basicly works like milk. +bu.entry.Elemental Rituals.1=These blocks are capable of storing a whole (small) ritual inside them. It's a long lost art, which still is not fully revealed at this point. +bu.entry.Elemental Rituals.2=These so called Elemental Rituals exist out of a three components, two of these area already discovered. One of the three components is the Empty Gem Casing. The second Component is a blood diamond, forged from blood and a diamond. The third component still remains to be found. +bu.entry.Reviving.1=After all your hard research you discovered a way to revive the dead. To use this forbidden art you need to make a structure that requires the Reviving Altar, 2 altars (placed 2 blocks away from the altar) and two items. These items are bound to the entity your willing to spawn. An example of the items are a Blood Diamond and a Darkness Gem. To finish this all off you just need to interact with the Altar. +bu.entry.Debug.1=Blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah. +bu.entry.Debug.2=Yes Altar Tier explaination will come later :). +--Misc-- +itemGroup.tabBloodUtilsMain=Blood Utils: Main \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/lang/zh_CN.lang b/src/main/resources/assets/bloodutils/lang/zh_CN.lang new file mode 100644 index 00000000..be3c6ccd --- /dev/null +++ b/src/main/resources/assets/bloodutils/lang/zh_CN.lang @@ -0,0 +1,43 @@ +==Items== +item.ritual sigil.name=仪式印记 +item.advanced divination sigil.name=进阶占卜印记 +item.creative tool.name=无限LP工具 +item.blood tome.name=血之卷轴 +==Blocks== +tile.altar progression checker.name=占卜符文 +tile.altar builder.name=祭坛搭建器 +==Entries== +bu.entry.Blood Altar.1=要成为血魔法使就必须先拥有血祭坛, 它是最基础的工具. 你需要用牺牲匕首或牺牲宝珠来向祭坛灌输你的血. +bu.entry.Runes.1=为你的血祭坛装上牺牲符文, 通过牺牲匕首灌输的生命源质将增加10%. +bu.entry.Runes.2=为你的血祭坛装上献祭符文, 通过献祭匕首灌输的生命源质将增加10%. +bu.entry.Runes.3=为你的血祭坛装上速度符文, 可以使其增加20%的工作速度. +bu.entry.Advanced Divination.1=进阶占卜印记是占卜印记的升级版, 它会检测并显示更多信息, 例如血祭坛的工作进度或是牺牲/献祭符文增加的LP. +bu.entry.Divination Block.1=占卜符文的功能与进阶占卜印记相同, 将它放置在血祭坛上方即可检测祭坛数据. +bu.entry.Full Spring.1=消耗500LP即可快速启动全春仪式, 它能为你提供永不枯竭的水源 - 当仪式上的水被取走时会消耗25LP重新生成水源. 如果你想用泵抽水, 但担心服务器会因为流动水而出现延迟现象, 就来试试看全春仪式吧! 你也可以使用水桶从中提取无限水. +bu.entry.Nether.1=下界夜曲仪式能提供无限岩浆, 你需要10000LP去激活此仪式, 每当岩浆被提取后仪式会消耗500LP重新生成岩浆, 也许有点破坏游戏平衡性? +bu.entry.Nether.2=如果你想把地狱的岩浆抽干, 却不想因流动的岩浆而产生延迟, 那么下界夜曲仪式是你的最佳选择 - 使用泵或桶都可以从中提取无限岩浆! +bu.entry.Green Grove.1=激活绿丛仪式需要消耗250LP, 它能加快仪式石上方2格植物的生长速度, 包括其它模组中的植物. 仪式每秒会消耗20LP来向植物发送"growth tick" +bu.entry.Green Grove.2= 当植物获取到足够的"growth tick"后就会停止加速生长. 绿丛仪式不能加快甘蔗或蘑菇等植物的生长速度, 或许这会在以后得以改善. +bu.entry.Interdiction.1=禁止仪式的功能类似于等价交换2中的禁止火把, 激活后会弹开主仪式石附近的所有生物. 激活此仪式需要1000LP, 仪式的持续需要每秒消耗10LP, 你可以使用红石信号来控制其激活状态, 最好只在有需要时才开启仪式. +bu.entry.Interdiction.2= 禁止仪式同样能让生物无法接近, 这点对防御怪物十分有效! +bu.entry.Containment.1=牵制仪式与禁止仪式截然相反. 它会在激活后将附近的所有生物吸引过来. 激活需要1000LP, 持续仪式需要每秒消耗10LP. +bu.entry.Speed.1=速移仪式被激活后, 附近的实体会顺着幽暗仪式石的方向弹射出去. 你会急速前冲并承受掉落伤害, 所以请确保你做好了充足的准备! +bu.entry.Harvest Moon.1=满月收割仪式会探测并收获9x9范围内成熟的作物, 不仅如此, 收获后掉落在地上的种子会被仪式拾取, 并自动补种. 仪式还会收获半径4以内上方或下方种植的作物. 通过修改仪式代码可以添加特殊的收获方式. +bu.entry.Shepherd.1=如果你对于献祭乐在其中却没有足够的动物; 或只是想要让动物们更快的成长, 那么你将需要牧养仪式. 当仪式被激活, 上方的动物将加速成长, 一只幼年动物只需3分钟就会长大, 而普通情况下则需要20分钟! +bu.entry.Shepherd.2=牧养仪式每使一只动物生长成年需要消耗约400LP. 如果你想用此仪式配合动物献祭 (你真是可怕!) 就得确保血祭坛已放置在仪式旁边. +bu.entry.Regeneration.1=重生仪式将会向半径10格内的生物提供生命恢复效果. 此仪式与信标的区别在于它会恢复一切生物的生命, 包括怪物, 并只会治愈血量不满的生物. +bu.entry.Regeneration.2= 由于玩家的生命值高于普通的猪, 羊, 所以每次治愈将会恢复更多的血量. +bu.entry.Regeneration.3=重生仪式可以配合苦难之井或羽刀仪式使用, 它们都能互相完美的契合在一起. 如果仪式持续运作, 请小心不要让怪物进入, 以免一只爬行者在恢复完血量后偷偷走向你.... +bu.entry.Feathered Knife.1=羽刀仪式的效果会影响任何玩家, 包括你. 主仪式石水平半径15格, 垂直半径20格内都是其影响范围, 一旦玩家进入影响范围, 仪式将立即抽取他们的生命值. +bu.entry.Feathered Knife.2=玩家被抽取的生命值将会传输至仪式附近的血祭坛中 (每抽取半颗心将消耗灵魂网络中的20LP, 并向血祭坛增加100LP). 被输入LP的血祭坛需放置在仪式水平半径5格, 垂直半径10格的范围内. +bu.entry.Feathered Knife.3=与苦难之井仪式的相同之处在于, 羽刀仪式可以配合祭坛装配的牺牲符文来使传输的LP增值. 此外, 若玩家的生命值被消耗到3颗心或以下, 仪式将不再运作. +bu.entry.Feathered Knife.4=所以你完全不必担心自己被仪式所杀, 除非在献祭时突然出现一只僵尸冲过来. 与苦难之井仪式一样, 激活羽刀仪式需要消耗灵魂网络中的50,000LP. +bu.entry.High Jump.1=当高跳仪式被激活, 任何站在仪式上方的生物都将被弹射至空中. 如果它们刚好掉落在主仪式石上方, 那么将不会受到掉落伤害. +bu.entry.Crusher.1=十分有用的仪式. 挖掘仪式会在激活后搜索下方3x3x3范围内的方块并采掘它们. 如果主仪式石上方有箱子 (或任何容器) , 仪式挖掘的方块将被自动输送进去. 此仪式适合配合磁矿仪式使用. +bu.entry.Magnetism.1=磁矿仪式会搜索下方7x7范围内的一切矿石 - 搜索到的矿石会被吸到主仪式石上方3x3x3的区域. 磁矿仪式可配合采石场使用, 这样能在更方便采集矿石的同时防止你给世界留下一个深坑. +bu.entry.Eternal Soul.1=永魂之泣仪式必须配合4级血祭坛使用. 当激活者接近这个仪式, 其灵魂网络中的LP就会被传输进血祭坛中, 每次会消耗网络中的2LP来使祭坛增加1LP. +bu.entry.Eternal Soul.2=除此之外, 被传输的LP会首先积攒在血祭坛的缓存区, 这就代表着你可以使用一些符文来使传输的LP增值, 例如牺牲符文. 另外, 如果你的生命值被永魂之泣仪式消耗到仅剩1颗心, 那么仪式将不再运作. 请确保你呆在安全的地方进行献祭! +bu.entry.Curing.1=治愈仪式能消除玩家携有的一切负面效果, 就像牛奶那样. +bu.entry.Debug.1=滴滴哒哒...滴滴哒哒...滴滴哒哒...滴滴哒哒...滴滴哒哒...滴滴哒哒...滴滴哒哒.... +==Misc== +itemGroup.tabBloodUtilsMain=Blood Utils diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_air.png b/src/main/resources/assets/bloodutils/textures/blocks/area_air.png new file mode 100644 index 0000000000000000000000000000000000000000..4fe5519d445e2322df8ea541190a75c5d074fe16 GIT binary patch literal 1405 zcmV-@1%mpCP) z000W>0fLJSS^xk52XskIMF-vq8wfWf%>Qsr000FXNkl$sScnPQxk=7a_lv0Es7u$-0Kx;`56^c-*Aqc%-VpK|7jj<^UBud0s z6N%9TBhhCXo0!y6F5TVP*`3*)@nOqOO=h=!un7U0~2!%rU{eCi;46-b9_XGj~Y}+Of2w<8fmSrLP{eD(#8p>a~GEhk{7{szHB9RET zZ8I`50zfz%=FwGO=kNahZ4L6>4u4**L)Uf6$}|!Qor;PICMG7xX0wFDVPsimbaa$I zzN^EuOcqZT5^dWCK-YDaz8K}fXZmme)3gYO!;FspgD6S>tk^WfL(lf3g+c&Gl7yH_ zrMNOsiJ~X~{C#x?k|>hRW-yEtnx>)a34A^um(DB)z_x9E9;`-HRYX-)NvG2Yg1}$D z)RRaguq=z)x9^a(?ffSyib5b5B^r_>kc9B~ipkrLePE9$0pUcq~pJ z5FnW}ux%U5val=*$AL(soTuw9BZwk~k;)bD`~5t&`aG6p0kEWM0K-V(^C?)CmCr;l z7~uXTUHLU$UV8~m(~yHfHMdo=%*d||T)#ey&z~j`@BbX1+hj5s9LGUba}7+>L{StLE$(E|%p3x z9v=L5vA74{pDp4+<+e!=dWw7S@bjJdDefT;>RVk8dfSS7@X{{VgTYf%Jh;$3GY`&p zF~v9quT zZH=x6T`e9Socm~c4?3FXJeXY%YFnoFVDCu}4|W`LJ=lJ@um>-^?s~BMgog*wlf^yw z{9q9e8jcL+15(U`svY;F2M2px584}xd+^3_*MrWcDIR>hZ)P5xZpnGD^SFlxdrn1p z^=M%a4)zSuaLmJl_D0u(uZ|V=;GK=G2OsY6@Sy+w={;y~obzCIJ=oGZy$1(A_3)s% z)AeB2iNYSN+vj?){}T@nzBp3cgRbTx9_%?em=8!X4{BQeXAk}b5^GtFN8rU900000 LNkvXXu0mjflplah literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_air.png.mcmeta b/src/main/resources/assets/bloodutils/textures/blocks/area_air.png.mcmeta new file mode 100644 index 00000000..3ca39cc0 --- /dev/null +++ b/src/main/resources/assets/bloodutils/textures/blocks/area_air.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1, + 0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png b/src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png new file mode 100644 index 0000000000000000000000000000000000000000..831839fdff29a6a0a7b3eb99a6119ac03f6f6688 GIT binary patch literal 1581 zcmV+|2GaS7P) z000W>0fLJSS^xk52XskIMF-vq8wm>rYpx<;000HdNkle!L~$D>qE#ZNA*!oHsR)V)5rIUG3{g>|TCwOGh>A-5B_I&IAOV4rg3=p-CQWeK z6sS@qO{hsqOKD=uu3cZ_cz5oa`DpTB*&LW11$GWmBuwSXx>l3`5H0GODUFJw460 zP7V@?fESk&$x##mVB0olUim%0_|Kg+XhJkDt2EOkjNfO`t z?zgcl3n2uHi}whlD0xIp)5z&M#|Mr95|SjfuHgGV<#L(1xjB44Kvh*d&%^V4nj!#6 zqFSxuI1ZI^nTBQII1aKbw-RWYMzL6=tE&q|RS3g~o}SGViv?6o!_ajAeBTEk3_~p2 zCMHG*fh>ezX{nBBngEEVz%UH5*$jEZASNb`V-!W9P%u#xg)j_p9S=oOQ1kgbj^om3 zSj2Hmz22Z;nn;pFHk-w9TohTxaU7y3reNj)3BxdGHk-)v3k%4yjF!ouX&RMkh57k; zR8=L4BJzfg>$;RmB@{)$_kBz=PY|@OBrCFv>v=?B$j^R$iblObE|NV1IUdaVT6Y?fDEJBttkfZv{Z8Q1m5WHf{j$xi5cjvxN`r^y)q@%#l$ z(?r#Eqcv5k%Ja{ChdXyh@dKY+E(<`tUZ+?rq9_VOgD0p~t1K?wO9o1{Z5x0yFTa{B zNEAghn@!?4#xPn31VMnNY5d?vKS`>vEDLF9@I-7`Hl~@!Fbo=vMiLMNK~h0?cQ>|e zt>wYB8zaf72M_G;=)w7m zmy+22BZu#M@bzOy*X6-L|4{-F@WyhYRUQn#^=DrD!@0H|T)Q#C+1JmfJvew^f8xQj zLxXKS*!#reN&60c=|I|plg~W8rUwTPeDQ$?8|uMJuby4ggDY3Br#*P~2HZcXjuHNk( zJ$UbLe@`mhx2NyE2m7DgyDksDux~Gc2)MqSXq5*ew?5>ZcdxbeU~FQFD_7r3d$6l_ zd*VU=k;830*tX@NqrH#`wXb}6O%HbU?s(wAhI;V!U$3m`!6&2RX%BAw+;}pTelF1fXU@Vt2~&QU*z`KL|YF$5ivUcY1)HIsgQWEr*C5J9w69h!r9F83 z^E=n{pi(M6@L)qd_~$31YkFY0LE3})yY~_gre@~adT?XpRx-wQ+r>0Z`jbnfbeE z5A=+Zc(8NFqisD1121V`K9@;*u>Fy3YkHt()CV4Hs0R~MGi!PfNov{y$7}r;t5ho7 zYuIf)_~>7Ek}+<^Qrd$`semfQZ9S-!yV$wo(f{s2!**%h9;4db)zO0wKfayzK+mY_ f_CU`lt33EO3Yu{&gU?Qx00000NkvXXu0mjf@uvKl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png.mcmeta b/src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png.mcmeta new file mode 100644 index 00000000..3ca39cc0 --- /dev/null +++ b/src/main/resources/assets/bloodutils/textures/blocks/area_darkness.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1, + 0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_earth.png b/src/main/resources/assets/bloodutils/textures/blocks/area_earth.png new file mode 100644 index 0000000000000000000000000000000000000000..137ad65d3c88d4e77ba64d9e13773af3fad2bdbd GIT binary patch literal 1492 zcmV;_1uOcAP) z000W>0fLJSS^xk52XskIMF-vq8weu+-cm!!000GZNkl1gA7{~GNTzkw; zmv*}?VvO;K#CSyUPUKp_iyl;?0;NTi7b+ex#5cxBcxNyY6R#H%4&@40DGHXJKqQDo z!YdU+l!O;j3y9s_+1Z)@?u;+C%-Srw<%J}?U|#?8d!GONpXVbz_e`^wOeU$XuV;98 z7=TD5LNFL4m&>85Di^;{D1_^}ghC-4$3X~z8Vm;MzxPPt#P!g8au(rm7$F4lcpTSt zIeq#x0I^t%tvBrP0~h?+jC!#``|z`vrioE)kWQP_)zvXFGD1F|Cl-sLswzW6L$qnn z;s}Rrqd~Ikx&WA_Nyp9Id|kH_4{#hoEEZ#E=r3eh0igfhBW#@5ff0!SpePD*Hk+mS zqXM( zG(re2T=<8)>-s-Y(=51ZbK@G#X{Xgb66BLO$;@Y0`B>qgAMyh8_+BVB0nT`Fx(V zY2x7_gg_QTFfx+FFbn`hPN3^L!C-)huH)h1c^-(b-pGTHuv_Jq&)2NNt za_-zYR8_@wT_SoI%d)7hu0~N5Y}>{#A~;UrO0pu$SlKLYKF`{kt)!AELZJ|ujD_pE z2q6$c;CT>_*V290AtYJGva*GMU@*w;TYC^f0I>bWy;xS3KtMwX;qOE^9OBc!T7QhY z?l_2H7^vZ}UYIIX<@M}h{`lh*cF-mi3IdQ!CW%I)D2hVsnYqN{aV|*z_yeVyrU`NA zxT&kKAl1#du1hYL!}C0Jy->h$95hYi6KxID7rIEN(@5>D^SpH0#4sZ0x=t#U^4oMA z$M2w~rUuhAu`J79`QhPVRLin3%`}mS&Z$$U#&~dXg#l8j!p~Jz)%T#TuCCz0Kw_{^ z@=j+uh&!9nSx`vFJhDZ!MSQ!NL+2Z@1){O6nd)9g|YUi-6sTo0NCAG_wk74=}MI|J%p>s*S6sSM*?eTep99-sY!^9xU9}bXgv> zZf(L54m(DJ#(2>A(f}Ku|E8=5``J$QX>TUifgESus#U(<>ir5?QU z<@|9yXjne&ng>_ZgRkD|9M^-sl}AfG*t6oG??K0VePuoPV#y|djC(#fQtH90s~1%C uVBUvMmG@xx`vd-hRPx~SmpA^u9{dX>GGj|&9&c*^0000 z000W>0fLJSS^xk52XskIMF-vq8we~eg&b1J000D;Nkld*2TR4( zcv1+0Cq*d@^wKp+ZL>SSzdJJ?cDsx)&hEiL5BdH9&-e2@JkLwoGcletn@vVXM_E}} z0l+j(bX}+2ZlkIyH(#+>B#vW>#Uf!CB7{KIb)6mcMF6$|m&SKdDwPmIP_0&p_wPl$`NQg=NgT&v*s`!~hgz-1`uaLi6j7;EP*s&iqk(pCl2C-) z(Jds$aSVXtIBcI^p!(?-BtRGnDwPV2#$U*?0>F;?BBP&wiDjAqD2jsY`#zV(ccEz- z0PQ!9p~x~()W-9CEX%@iYzl<}zdk(%Kpe+heqkKLFpv$yAP52^Ny0z+Dzd!S^#Z10kdTlh35udHG-RPD3Q-i{xju@bpqi$M>w2_WHc67uY_=G( zEF?)n*L7UiLy=`%*CmbTjTpKT*R_0)KbalY?Z1K z96Q40%gYqPfMQVxpxJCvE|*ahg~sGQs?{p;^&7o~QXR)(1lT@z4uIkPdx_(icDqfI zBp62LgD?!yG!6CiG_`ID+qRJoP3}u<+rhF-48x$+YV~4J|5I=O%D!tJph>P)CcfjX48WW_F&fl9=wv}!AmI*Ud-`eEakz= zSsr}f$Ah^%4-O3I!IQV92WL_qO!e{Lt&|5R(jJ@|(1Ulo9=x69!O8grrgA(uQ(xqG zmIqTQ4?fEA;PsRT$Fn^6U;q!MHa*y258fQWgZHyMIF<6?og5EdOL_2KmIu>)JUE%> k!O5-%C;E7B z000W>0fLJSS^xk52XskIMF-vq8wfi!3i=GjsOLIX<*((oAN`gCsn#pI6q}d#|;AN_ADGACJcwH*OsL{rvz$A`ybY zAlYmdUDtVXLZJ|z=Mf5pa9tN61bQ$SP z6Q^bDg86gNpHx`9uom04DJv@@nY5{>s9PNaIC z2Y_wcoH}!s?~nY554f%%8jaG|_YbP70dV=+O}c(Kh82kbplKRvI-RDvsuII609e0v z6`HD&%Vlw#G?ryy+erd}08=JT0KoG+KAKg9X_}~}X_CogP!xqVO${WINrVtQe*7;v z&y$~M7zUwmnChzOfP$hZLr=(LGDM?M9z1wJCgY;(I_Y$pbUH&;xS%M+Vlh&w6y?z< ziDZ&gDut@5LkSGSptQ7G);oR01?x~$H(`5G)<$V#6r_Fa=9E%DvhRT=#fZ-RLUWdNaFiG z@pys~%R*5Ug25oEl!K zc%DbZ4C6QsWo2b(nnos*!LlN_?$DD|O;vHyX}nyHL!DhD;t4{b5UG@d=XnSr5JKSl z5Q~-b>!qtGs*2;JhY|#XLC*A?LkI!DPp7(ZoHT)efe=FOL^vE`*WUedjL%=Vgk@Ri z;jlS0Rl3gFRgK)edyhacKqwRhARdoXT3U*xX)LU*Ar_0FDykeP-L`E2PIdn*7sT^C zve_)Y?_-)n1zgv~Fbuxgvrpb4nM|V8*39;kNgK>$>!yqM~BRgZ7StvT957`l23e+14s! z+qQ3g>cLk#TA#^-oo%hS!sYYfL?b-d-nNsCn>H8ppuOWDpMJI_--DLs_0ogy4t5mu zU{&J^*}l!2n)5w4uz&BU9<(%XccO0Ob)$N)ZsVqW4;q_ROAnSTZz$-&2Qy~LFpj!O_Ft74~3x!%Ddz#XOiceddek!MwV9S+%#PyQl|~-~T|yUcYkjsRzH^ zxcW>U+`4`hSGY_WPBg-UY13!&-h@d7J(yQl&-jUx^F8S8>6RY+edl&T503wEM7Hmj zb3OSU{PpMWqk7QWbLOQ7&((u>-W@-x2eWHx^F5eeHA{Lhby{UX4_<%sZ8^pt&Z)`w z;Lhzoih6M4>ZQUSOskv$z@tZxihA(c8*jac9yG04C#!aK9xCd=-1!S+?CBH7o_f&J zee#(+`1$lnT;WnPoM?mxb@d-J^TRm>J!o39j_TQS^F8S5JS081b^S^~5BBZZCEIuO zaA&>;*DhZe)q}3iZ(n-wTs^3)svgyY6)RWgdr-f4iS%Gz-NJ$%OqeuPj`6aFmH8fA xzjCpt2i+%+7xtiT;Uc*p#XJ~4amxSe!G8 z000W>0fLJSS^xk52XskIMF-vq8wmsyACFJw000H&NklSrA@GW7CH=r3vku!mc$bE39lpDi&O&(MB4L#NHDU5^U2%Vr$!If+iZMU=^W& zpj?-w)z-EuNz*n~6WErN=5%+-a?Y7KbNQc{>BAi6K+o+3l0Goc|NQ>9-|v&(f26hd ztd1&`3iIdBXL@=X0K+gyr_EmDl}hoIJ8uCX3`5r5^BHtqN7i*6 z&-0KZi6cQ?J*NXD?ksmSwb5 z3Qf}(C=M_?JBzBSgkgxGXK@^dd_Iq&D0rTSX&U%`yd_zYWgOQf3<6$!>5o(^RWg|j zwVFd1h6o`LLJ&nzEDrG2v40`SGLGZM0n+I-`wx7A5CVW-?fn~$FK&4V4m&>6j3J-4h0>xqxS-PAg zlxo{H0DJd+1boE!`Xz*6NWESsiXwD9p1}8gG)?2DKc7feVObW^`1*B`W!adffv)RR ztJP$H@B7IL`uqE_Z5zjNl9HdEo!C!X>37S)$kw$l(E=@yxHA@g{xx^)T3=Y$efy_ez3C#3*J9V_+}dq ztl_2y#f_akD1E8vLG84A2-UH9hG6 z-BlilMt{&h9($1T+k3!h(}Un@4^lwpEgNxV8 zgV}c{nQbg<@ru!|9{l~_8_5sj?hpJ_TMs^W@BIxA zkT%$m`dGMPTp8J1%FKmD3sbtn|BTskr;Clz2NX9;M?{iHLeztB$qd(~G z!L#@6z!yH>Zv?u=gDpqC&F0r0?dZYwcb?+Oy_;G+*f#QX;=!&>uXps|ySHymuJ4B{ zpK0~rrAPMk^kCb__M0BuP!As4{cukYemuFg)q|~Xe<$(a2ZuIy^kCx)_a|xmqlqo8 z9=!aGR~!97dk=oH_WAh#K|2q&9DXt>kZvA4v}4`%_29n@GivAddZk_f0000 z000W>0fLJSS^xk52XskIMF-vq8wfT9nT=6W000E8Nklj*J9OZJEIF2co%Y2pLzq+G?7iyBnSc|N#d24-otSmgb-|Q zZV|l&-0LFxi^8PX;dl|_Uze%qAEmD%;e-gDwPpbO~W({0D>R@Ac`U!*CioA2!Skw zV0*iTZQB5duD~=+biIUSnj|D7NrIv%jEvYQib51c_+AG^QBW<*!t;FEZHFXDXtmmm z*fx?Rq3b%H=cC9np63zA2_v=zNSLNcx7$VDxPBd3meEQjG)-f?HqOSz2CAwO$1#>^ z;QKzKqoXK_LJ$PlwnZ5BjwCCxjNj=HM-d-={3h*In{v5~=lR5Oj1U4L1W5w5+Bo0+ z@F9{cL+5RpZ$3Z%F^x4F5Tx{FIG)>y=c0V8t!~PD&#>Q}67vJ~$CEsi| zQGMUXbsa3rWMyULUmn~nVSskKce$#n_C2WA>!}A$1Dw=@i2)v5$#}3o>%qN4dT>wb z!IeA@uFkXYTY(2ogT>2v9!z9Bc(A|&E91dro(B&M;laeN2RrP+FGF~+mFK}<84p$q zJh+tc;6|PYhX#0XpvZ%@IauozNTCN8Z%+@52DAYKrsV-1xTjz{^V zc^-uGEZivYz-X|zmFIz+@nC;}2VTYlHP3^)hVVe%^+Yvfd}7YJoqusgWren;KHs4JM6)ILwN9Ho(GR+ zJb0+Ug98~4p2+jy@&FGm-O2-C>EZPM;Kl$C_W#fQ!9Q#&Vs01fSc(7u002ovPDHLk FV1l}jWA6X} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/area_water.png.mcmeta b/src/main/resources/assets/bloodutils/textures/blocks/area_water.png.mcmeta new file mode 100644 index 00000000..3ca39cc0 --- /dev/null +++ b/src/main/resources/assets/bloodutils/textures/blocks/area_water.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1, + 0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/textures/blocks/block_bloodDiamond.png b/src/main/resources/assets/bloodutils/textures/blocks/block_bloodDiamond.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad1e5313baeb92dceb50abf9c2c768136bc31f7 GIT binary patch literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;Y;yrApwB&b2_H9iA?ZAr_~XPIlxwq#)pGpBgkt?bwEwZsKtVv@7Gk%N=ly zm3H3MaN$Dhr9};zZ`V}T|NA3(V`;9enF!+nM~*iZ$LD=k`myRt^n*Jlt`9Cp?P+6V z2w1yOx3fSfNp7LBT2;xK*D23a*ccM-&QUdNJ2%6_Md&H3&5kX5UV9jo6kWI4yK8~q z(+BmbbDMwVBno|4skc?X^TUN*HNACZ@3-Az66gGLXw?&;;t$~+E3bP0l+XkKPF8RY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/block_bloodIron.png b/src/main/resources/assets/bloodutils/textures/blocks/block_bloodIron.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad95d99f1521990d382fb59da087ed5b4e440ff GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4q_)-xzH&6Cpyif|Tq zL>4nJa0`PlBg3pY5H=O_IsRCe7aUvZ`LRQh5S8T978NlCx1yy`0>Ayk%>j( z19Q%+2nir~BYA>ZJdy2Bf`a^pnuLUe3a4ey_<4AEbeMpIR*KYz(ktAH;~c&<@hpw2 haOxCKP@BljV4orR@9+AMy+ETGJYD@<);T3K0RSU%HCF%t literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/builder.png b/src/main/resources/assets/bloodutils/textures/blocks/builder.png new file mode 100644 index 0000000000000000000000000000000000000000..4c5c6192f3b7c43e31478369d95764a0b01bc70f GIT binary patch literal 821 zcmV-51Iqk~P)n#Kl` zORuIzV;d9FV8v9$DnedF{Ih%z@xhiB3vJU<;%TTMZ6eg5Nl;oefgWDai)=1 z?fJ0aJPpGz%nZ47;as!XEEEdo?l0dMI$+x$WHK48HRl`v04ZgXBvQ&aj+Ih0lgXqi zfNM`SZQC}+c%J9FZV&`P5X5mD$MNe%Lu*Y4p=pxVI?Yo`_Y`xJzub$$H~wC?P$=}y zE%a3vXO>ozqyvB_Ns`TG&&(~Z#vyYG0)R$Ql+Wi!s()3#nJh7p7W?(9;~>QIJOB-&uMd2*G&xEs1;9S5 z47sk0wP&Nx|F0XJp=4?Nn6xD&#InR=zpHillYs{h$7`?FKin&X;7X~To#uok>qh&G zFI+tR#SgOv9R>oxptEuLY}t|k+O063%h7B$dwza7b$@?+Xzb1(KI0`Oe8yAKXl#FX zY_Mk3l}Ast*1WO3ox1N%PjnHIo|7)|7ze-@i=t@d)Y#u)=mL~c`sbI!cgBW0z;1IF zz;9EP@aoyJCFe&6ea1bn%XM8sX}cW)V3kkHTInQ7iba2F_I}N%&o^K9tiGrleWLyb zK(Ml^D}&k?N=ZJSr?%}Vr5We`tsm<~mzYQ^`HcT`a`?fwUzaV}|MMIrln|OE2|LvH zvE$gKQct75_jz&8)BVN%&6f#qcj71j&iTIw_Z@jr+w4Cm1dpPK9jOexecMthrj$le z1mM|$o{ds>5ClR9DP_CeUg^%aS}jWH*4EZLZ}2f?&3EFd00000NkvXXu0mjf??!w} literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/discoball.png b/src/main/resources/assets/bloodutils/textures/blocks/discoball.png new file mode 100644 index 0000000000000000000000000000000000000000..576c0289a37ceef075de8cd8dbf6dd583904bdb9 GIT binary patch literal 244 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr!2~3Gzt@!lDb50q$YKTtZeb8+WSBKa0w~B{ z;_2(kevea{M}zBD)$Id7A=%83h!W@g+}zZ>5+Ij>!MP|ku_QG`p**uBL&4qCHy}kX zl^rOa<>}%W5^?zLwS~M51|qH(oj8OVRSqiNXqDV>=Ae?!VU~!ngCdRx!zayo-oNvt zfAkTHwmDN3iy1!12W%-`EX1&+I^tKHDnmtB?BSI_-uH(q%BM0Y+&#RlOpDRsm%gtS hjsE+~qC!#1-@@jnx{XE z)7O>#9;Y-9i`EU*3Cn;&vY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=} zJ4m6Yi(`nz>0}X6(b}U9j0s5#1bUMjXZV>KN014gu6{1-oD!M< Dai%Fu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/essence_light.png b/src/main/resources/assets/bloodutils/textures/blocks/essence_light.png new file mode 100644 index 0000000000000000000000000000000000000000..df123cf2e502ff87f8f9f8b88e179f5d326af838 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;Y-9s|4rE59vT5+02lL66gHf+|;}hAeVu`xhOTUBsE2$JhLQ2!QIn0AVn{g z9Vjm6>Eak-aXNWV{r`X3Y+MY&%&iGm8UmT!cqMdz_D(EdUcP7krQ0AQJYD@<);T3K F0RXDZDZKyy literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/blocks/essence_rainbow.png b/src/main/resources/assets/bloodutils/textures/blocks/essence_rainbow.png new file mode 100644 index 0000000000000000000000000000000000000000..07f0ee69be9f3c22ea51376150455f3030bcf715 GIT binary patch literal 188 zcmeAS@N?(olHy`uVBq!ia0vp^0ze$V!3JWj{>lraI14-?iy0WWUV|`WQ#WrEP>{XE z)7O>#9;Y;q5Nm#pga%M3+SA1`B;xSf8w&*+3`AHi{`Fz&b~x@DAUa7%vw>?vCW9lV z;ld7yBXNxWYxcaTwU)eb>t%NlKu zC}^#xws#?fb&iOLXn1SKT5F7HKUnIluCcYU*Xsc&4GajN_WVW4oMoB!-g_U0A%Lmv z-8|2&wE()^E?ucs-Pnccm-|N}Lm!6+vr8AT*@|nE?RJ|tHnYa9Z% z$??5608(a?=hoUzrxV^=I=A}AXlqY4ZU;*Bx?SgenTV||H(L^bV=fa(B4!3)jVVZZ z#3swK+!zP}0D$uzfIME9>$3ooLP06T&8@%dH|*Ta=+*1f)6+c9i6~_bl=`|fPh*uz zw0H2WaVyXBv7Lh-j*iXpB7}hVxODOI{$JJOFP+J%uT{;)W-?WizOQqRnLp3}R3-|; zkccFaQmRaJ*r>-zVx0qEnCblRu&<0>KX`jIdR}Y&VQ5fm9Rz{%UTd9>SBk}=Bnp3f z`f28x)>=V`+?bU4#_M;7jk@=~KSIh3;M2mK{QiC5S+gHQ5s8(g)SI0VLL^CI*PjEh z_1QQ{NJ>eRt*!xxA1t4>+udHTxc^4<_twjI;y6A#J7Z=k<;eCf0RQB%A`(J4?@vxn d@@MM+{s(mmIgJIGLze&m002ovPDHLkV1g5{YS91y literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/gui/altar.png b/src/main/resources/assets/bloodutils/textures/gui/altar.png new file mode 100644 index 0000000000000000000000000000000000000000..d287d05d6f6b1609d2c0fca7fc5c9e1465485b22 GIT binary patch literal 3371 zcmd^>c{E$w8o)!*Hj4I^_7*oa6*ZJ+t|FA0V& z_s%Yy7vR=VsWquf1%WO!ni%NWhJD?fpY_cQhV2ol*mH^3MLQQKz3@1<*=w5MguC@u z*7uf!+%a9Q|0s9;qbScg@ObIi^xWD~?rM1A>d|pDGU-tC)Q$hpVj@vHA`5$My^v1| zTeM$hIbkLK`Wt8IJwkZA&!MXO=vw6WVE0i^jQgBoMgvHM?Z54f_A@P<74~b&4E0~P znRV0pz{W~{MN(Y5;i}r?kBG@}K&Mm2(Ghd>M*OfC+uWEBR=~BQAaVdsb^UtjWkK?v zXF$5_|3mi+trj2tOY>(0$)EJ1tTPe9mwn_z!`hTv5Y`zHk&&dC6EEsw(SlC!IjY2q?oInkYodtV0oB<#f+q2Cv4xRb>^(frTFQI?P2$;qY;Mw1 z;y32oLM2RCe;*-&Uo6N?`Den)SKMoMwG|kKGxg?Vv}c}@xeaEEysg#GaC6B1$I2MJ zteG}vZkQ-RVXQP0fh7Xq{*Q9~!Kd4z+P8aEV2<_jT`Kh1z1n&P-2{EIzYjGuldf8(>6VOB4;qENdt^+h;%St4GY#%ggfLmln=;n?-vL*i|7L zx6Ck7rP4RUFj5L|JBRG3u}rD{U>DRo?Fv8~x@^B*jleC#7Q<0x2%P+JJ1;Ns;0|WB zf6(2{7;I?tARW0AU)kS@3N`ZBUB}HNJnMRYsv~=x_ zT%svM!I$Iox@&S2ygiV}$1g-EJbipt>=H4m1a>0t3D1QK(vXxa<{UU7K>R2>%X=pt zq#mzMxY&n|>U!;ww;S)H=kMf`$?{n`Yk!ubwWKJgEKCj?8yov-3j7-6Q_LzXJduSk zWqDho1pIz7C~l6~l_fZ+xb&2pqmrB~Lz_In2}GnbrWh_d4eRP_wXj}Xm3_&LWct_9 z8D^gjyW?Zy<4aS|0P)D?;^N9QmH;}@gxv$laSwHc97;kYF)9>f+#p!`U`*nlWI&&9tAwsd!Xpxk>^fyV;tYL?~s$F z1G?=v>*dAYUXde$P2*TYP_wx913}Oq9SCVwx>wt?ZIafa%#GOO1kNUmRBv#g9)zP& zfR{|f18{w*+fOXEl9rhLSXNZmfN-*-O_7Pj>}$NMJy*LS#4`n#fz^@RTJZnyaMx;i_fG+|sAsuIj`eo?K-Zz)btP;l>izVEGkjxSOfd5r<@ zhld(oI2GgZb58)<>`#OYANO=Hw3;wEP8`b`zY$)h9wcW+wSxwqdHk8Pyu+u4g*f7v zIc4UOrLB<+Kv2j&!~5HS08Ao7^NzB3!d<1iqBDAb^zoegQ%PSm0TN-H!Og8%XuckG z@j#XndBXgA#9TLA9pqrfH*VUo+r(-C#K;s_(7tu22tpta5C}r^r%&{i9JtII;}3uf zI}YZE%}une14+Sz(n_CvwJLWq&lD@%U4*YO552X+wjV7)(st(JII1EJ**f$le$0cR z>D^DfJU!n?3=R&uAcALS1yZ_A(J^Ir#iaSRO<&pX3n-`!6jGC=Fb?}na@u2#GqDx( z5*$EzEN1$8dX8*wS3#optb;>BWQ2KX2Rl?RAD_u=d8eR_>1woI^EcgF7F=1GBtm)RO~Cx>YHJ%C8_kf7whx_ou_wC_O7PIF2_wSje?`x~7M7k9BChXy!)E?AFgwsx# z^N`L_Wnxm2s*+O4&!0Ys>8hnfQfWnn89?L1hYv@Cs%VxHe>D9(Ov!-xuY8UZv0|$n z4JgFU)_A0Qd3$G>OR8#V$&IPhMKXK}w8HO0PYz1mJv{8}?aO`J4h>K3JN&g;2PmGc zpO~MQA5-D(O-G^nRbZQxcDR%!CbR7G4!YKjoQ)fK2qR$zsQmKoc4_Z*r1RBV&Q^heHJX~5ws1Hp9eUEZ zJdMNM)ZXnA4_!Xkq0_fJt!gIYT*0a-{1PGf~#$GbZgn% z=XXJx1T0n(m74mYsmU>k_pi~m=%c*>S(0={|6Db7jSDC{Jt12Q1Y?O3AS=>!ej8uD zd>Kz5*l89#(ASUe>FH5XS1$+t!>+U`($oq$M^#z5G;sBc=kw>r0HC282SD5~w!@r_ z*T|@o-Y5S;06gTY`%dO6djN%upEv3B;F6Qi149KCYl!uf$u-C0a3)d~@2q69&|60U zA8n<*IZxF<-kr@9pC8*xT{l)(n0BoSK)Lq-t1F3*>@Q4!x4WWHC}8IZli7la+BE?J zt5;J~6CiAql9IB%zCMbD<&Tey6#HpZ+RD7oagA6@gRr{zpvGu-cXt(SZNmP3h)Y|* zJ=X8lUI51O(jfpN%8fN($uf>hAf}f21F0f7k$hQ-KiR-khg}$DNT2a2#8p>UZ^sr< zd(*vxf^2D%gt5_4G{A`}6pHLk-&$K6xeAZ6-ht%ufS!T`Z~FTB0PR3NhHf6TFkgVo;`KPK^n86u ztj{S54_+MS=jQ{o5xcwZO^lEK$o0UC6zeB}p+iUr^6$T0sZ=VU=k(A5hqTLy#9Qz0 z<35EjD@bh*tHEJQ-B)vYIRrWa2*~Q@W=)udh1auZ1~3>bp@{*@SIdfmK(kEy{e?Hb z)|u5KPCY8HpwOx0EtCw%7Bpq;d}1Va39-=PXsJ!lypPMomX`xH3>>}D)O7oJZ_H9q zNXW*;rJ(KT=N*^kAQK?0KwdV}dhMH~7TxDVg-nA&Lb5YiE61!O6K`+tV)mEa)Zcp< zmMR(=eUhSKRhM-S8K0N7qYu+_aNAJu=`H{Nw4Eq0`M8i1Pp2hHl24Do|H(?D8gCb z5n0T@z;_UY8Fx&~ehU<2FY)wsWxvNM%E>49G|SQvXv`K*7srr_TW{}dg z+v{rjlb}O$CVPK0{e0_*XafTS69Wf>0s~HlfZz6Jg?Qc!7whH6!o5AGb+RbfbUXat zBYxVYjuGfh76t(Z2atcUGZyr@E;x2B^QomkLwqF5F5{<9#qn!!U}!MlX)-C}L-ET{ a;`r-ve0SX$7rS;g$km>%elF{r5}E*AYG1kl literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/gui/front.png b/src/main/resources/assets/bloodutils/textures/gui/front.png new file mode 100644 index 0000000000000000000000000000000000000000..81f4733db015400c7e15d33cfa3d15397fbdc934 GIT binary patch literal 2690 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 Br&j;~ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/gui/guide.png b/src/main/resources/assets/bloodutils/textures/gui/guide.png new file mode 100644 index 0000000000000000000000000000000000000000..f99e309d59f5524c2640e73c90e98948acf775af GIT binary patch literal 8642 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/diamond_blood.png b/src/main/resources/assets/bloodutils/textures/items/diamond_blood.png new file mode 100644 index 0000000000000000000000000000000000000000..1d5cf9c6d945457ee9523870b48e0d03aa137cf6 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4q_)-xzH&6Cpyif|Tq zL>4nJa0`PlBg3pY5H=O_IsRCe7xeXwqN-Q6guhY;uvCa`sn11Tug>MZTn9Z z%Di~?PN$=wTc(z2{(+c(!#a;qSmEp4j42x! zjrnI7J@hZTdFq(_65X%Y4HxGe^tD~h6Q|jnlJxDt^4gBA?33CZ(<*hs%YmL^@O1Ta JS?83{1ON^uaz6k7 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/gem_air.png b/src/main/resources/assets/bloodutils/textures/items/gem_air.png new file mode 100644 index 0000000000000000000000000000000000000000..1c16c230011af9d78171833e016ba82304d18c5a GIT binary patch literal 525 zcmV+o0`mQdP)%9xng@010qNS#tmY3hMv>3hM!aiw#-;000McNliru-U%8FIthaL_xk_<0h&of zK~z}7?Uu1_!axj$|BIpu5!9(->VPr=8$wJ--TEM%yY~^gGxtH*keE=#MlwbnIz>!X zg1WUsF}hrAk|@`qBozY|O0{~v0MqkkE;W<)ZtmGu&ZNF3S zzo(yUB4vt6NCGn5uP0Han1tahNB^b=07&;4l1*?*q$g3PIGp7Ga1xWH`wRe(Y=S}( zkGmLCEcpOHnWs}=emE2YgKoFb4r#n|r%dMwrt{=%C2R{#%r`GeKjC#9mIObS85HM0 zx(7~N>lNt9s(kha$;v2OStc$~)jE4R528hO-E==ZIx^P z5A;zUPIk@y2d#J@iKR;H^B^|1kZZvz55)h0UP&wv+40~qcyM?B1^`$s2hDjvVzSk8 zP@e~;Sn{zvkOK8eL>^R$xfr`Vpo^+%p^^tuD`x-VD{z%a)!7-Ozs-YhvvtTtzQc1a P00000NkvXXu0mjf%$42B literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/gem_air.png.mcmeta b/src/main/resources/assets/bloodutils/textures/items/gem_air.png.mcmeta new file mode 100644 index 00000000..3ca39cc0 --- /dev/null +++ b/src/main/resources/assets/bloodutils/textures/items/gem_air.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1, + 0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/textures/items/gem_darkness.png b/src/main/resources/assets/bloodutils/textures/items/gem_darkness.png new file mode 100644 index 0000000000000000000000000000000000000000..04d44fc16e8df7486653ea1d26e077929499d050 GIT binary patch literal 499 zcmV3hM!aiw#-;000McNliru-U%BACJE7{NEHA80f0$F zK~z}7?Upfa!!Qg*zl@{^gu323dDfEKc^D7ug_+k>0 zfXw#WL4+?R;o)>e-}e9jDJAy1^$^GoB7E`TbOnGxOeUoS0PJ^bCrA-$j4$SV03iI^ z>0sA&&cUjxoN`E0+`GjX17pnHOoAm$v6bH_`-ZYCZv@m#=NY*^gv3#=;NQae(hX9Q zQBJZJ_Av14J_qG7o0+fTq!2<>>!`J<3|^Y5#*+JmAD!Ch2+LZ{Zjh zXY-(l;Q>eF%!6g{plw?KfKqBY4@gX=l#1tpFXntf9&iWkOjsU_i9=`7@_-sOR>CL` pxKjN3*;fc3hM!aiw#-;000McNliru-U%8FBqsf7^?d*U0f|XO zK~z}7?Uuhz!!QuWKSycQ0aao_{exgeeJo~%Zae~8ht51!)VURqhy^L?fa*#xz(uxu z7duKAN`2$$zVrEf_mdTVEnn?20K@siMFjxQkMl1WcK?(sFm~i5;q}$f^1r-)vWb){ zCLsyPOuv~#xndG7all|S008JpV}Z0zWF}Frc!>i5)M7GSX#l_isg)$*8smy39{?!# zbPC*m?5)7;GPABjnxyHJqAXFAWn(4m71~(pHp)CHlJ(Ssu7zH_5s1Kx$&pE9gqs5RE*DJm|~=nnrV#gZ~HSC~wx=cK?G;Jdngv zCH?cj-9jH1JM$n3;ekZt$b<9X!P{#A0GQ4u?Rh|AvgvFR&I4C0`B)xEfo3Hl4}4-S yre7XVqkLEJ@<6(Zdw=m2xJsnz`Wd9t=D|14o3REj%|V#}00004nJ@ErzW#^d=bQhN_vlu0WbcEP)%9xng@010qNS#tmY3hMv>3hM!aiw#-;000McNliru-U%8FI6HV4#Q6XK0bNN% zK~z}7?Uuhz!!QuWKU-B*ONfyP9sp(V>i1!0?;~XI%=>utVDSKDVnmf%vA|+i#+=F&hh>EDFVU#?yv^1>7H*s0N`cYeIc=@-U|@+%Nd3DcbgynxAzm7NaW%u zjDl#XKTRTXaTM-*k7IbJ06c8FbD}hf$i@5K1Hf5~Bnd*IG>N1Nb7cAeK;);#z|Smj zon0qtWbKsK@YG@?M%pSbRC>ZAAyCvHmFhr=SzS;}-*kgC$tX{nu|q_}$@l z=o~a2%*g|n1?p>f!1=n-Jdm7?YdmN?SO5=JrH!N3S#f#b3KiE29P<2z|fn~JK&dLMB5Eu>*Ec5=wE*Pe7x3hM!aiw#-;000McNliru-U%BADIsHs{2%}T0fR|I zK~z}7?Uu1>!!Qtrf0&f==D}a`Kq=)MJRXnZc@UG`WF8bT8<%;Ic`ySWEVzve zt#fD^gFNuXevrBFfNNsZD;Q&Xh-MyS9!%x|O{2Za(flra*pj^6T^Rm@;DWu&Cj&(|3p^r= z85p=;gD_)LH*XYBkiEpy*OmPqr!>2fJokMqK?Vj!V^0^ykch*{DGg1lC-2{2Xkbu~ z@%&RwQbIz)jOc}b=QDDul*go|9AGkFNt8-GVi9m;{+?frR~6h!&KmR@@ESDe^yP3U z?@F6-Y{|F%8f<4)r?g48fJI7rUnIn-8h0uB@Q5(E1?3!n#?=*T@PUn|DPn<_(;}~+ zWnO8A(gYU1Inxp&7c=)yYyTSunVP4LFE1b0U@P%HEfg-dAlrrg?xjs8I{X|r`_76U z-e|L+UME0Rv3DAK^Hv)R171@p*-aff{1;3YF}LePO=E8X+S2tfLhgdS*osLL+)g(i zjFR(tyT2*Pp==>v;Zw$4ZY2|9S2!R3)G*=gjTl3j)6Bn)GldFW%BVDmIL-Wc-%Aa) zIl8A**4a2*@8CNpmU?M}jY5jGSvb$}PYwSzI!tXb*>akhfj?aI`#tk5{lE}q@O1Ta JS?83{1OOEqqBj5l literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/gem_rainbow.png.mcmeta b/src/main/resources/assets/bloodutils/textures/items/gem_rainbow.png.mcmeta new file mode 100644 index 00000000..3ca39cc0 --- /dev/null +++ b/src/main/resources/assets/bloodutils/textures/items/gem_rainbow.png.mcmeta @@ -0,0 +1,16 @@ +{ + "animation": { + "frametime": 2, + "frames": [ + 0, + 1, + 2, + 3, + 4, + 3, + 2, + 1, + 0 + ] + } +} \ No newline at end of file diff --git a/src/main/resources/assets/bloodutils/textures/items/gem_water.png b/src/main/resources/assets/bloodutils/textures/items/gem_water.png new file mode 100644 index 0000000000000000000000000000000000000000..f042df5e6705f5140430c800691b38ab940e38c9 GIT binary patch literal 484 zcmV3hM!aiw#-;000McNliru-U%8FDIQ?OGp+yt0dYx0 zK~z}7?Up@m0x=MUpDhFwRvM&KxdGS74I;|4h$BR_lo2=JI(vguk+z9kKt+n(Vf{0+ z>jkHX)*~UI*?Hp`d;G}?tyKp*2e4efn;!r;?$%d0_V!UJFcvvU`0~8;{9oT^HjxU& zBqRZu>vxl=P)x$@=PLl)el^%{PPasE5*3OYAsjJoNdREKIeAGmShI;fK*g&!fi{RY z23|X)(S562F3qnmMra}3X7NUKD=ZeA#KeOn?E@!HJOz{J%QZ+@Mmfu6;t~yAXYKN! zI@qVNb5MBjmprIzKXA3Wg9jPVMZ_uglfW(-+j8)XNdmjR!j$voC)R~o?87XhzEOijl zbqG!k3Y6Y-lKuU6=ijzWR|{f%y}a??7~TO|l1s0^EpR>>p&|q`%DT2o5xEAwj>iB5 z@6njIB4?aj1?|*%3&5!pfKTr`R#GsSp&~qr@NL$Ks0g8jx^AM#0AQZ95zJcHdsL*G zKZS!?Wb6U>cmj@1gQ_w-RnzngR2ixg%sAFHG!40P91aHtv2yMl!TSyl-nSzqLew?S z%O$yUR8@6u<76@+caHUJc6MlS_6TKJMpad8i-L9Hg3W>V-H!c!|0|M!09lrGYh|B} zsYr}i^%6{Nq)%kC*#NLDieB*MO-yYqZ|t3}7QJsl%0C_u_by(G^b7a_U;d{#y6!2J P00000NkvXXu0mjf2H32= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/iron_blood.png b/src/main/resources/assets/bloodutils/textures/items/iron_blood.png new file mode 100644 index 0000000000000000000000000000000000000000..5e7ed49b9678cb427256a69f4dd615876a69c2c1 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`oCO|{#S9GG!XV7ZFl&wkP>{XE z)7O>#9;Y-nr&Ve33y=YOJzX3_EKXmYWXRWSz~effQLwa8QQQ5Y(3~mWUle3#Xr($% zUFFhLqItr>^ZGacvPIvYTFC!%o4a-6X0vzapGt4Jk~)o1;MvT3mX@YBoO449KiBP* z-*bP)2}zb52i;tyxmyFBH9yE5T2}8P%<2#w8gqQ&u^B2QmG2)WFkFy0{J^%?(39hV z<@xN`7ZYFGq<@%ab$;@Mu#GyYh8~TIZcVSMpQrq74eE{RlDW5PVZY-gwWS_HR=$hQ eIdlEe-OG>~mbt+FX_!0EBMhFdelF{r5}E)IL2LQ| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/sigil_advancedDivination.png b/src/main/resources/assets/bloodutils/textures/items/sigil_advancedDivination.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc91cb7af6e399bb3792db4949d31259022557 GIT binary patch literal 616 zcmV-u0+;=XP)WFU8GbZ8()Nlj2>E@cM*00GQNL_t(I%bk<4YE(fK zhQBj&XYP7;VCJ2h^;RW(gaN{C|0SIU?Dz%nhhy@0L5Ts zvDtg??%g|cEH*c~>?*{+oCDwd|9@sgRRQ?&EcZa`%ENY_Ge{ahcV$JbwK(S(mL;l+ zh=2$HpL#v{C*bPxvRV<+R*O0WG)8uAU*f^*9{|6BCu)GEIq=S5tz|SE((<02waMuD zt&7+s!CH%m5JH%8kWBj#Y?4ro$879b%JLh|dphkld7e|0CDs_CDxECzgQBQTBQ!lU zw}iR|5w_NsSf~pa9YcGOdoRBO&^tVoSqDH>Rcx&<&6KtARv6bu_%xls=SDcu)7_sW z$z(L>_es+f=RJw{7-J~@2591xWrQ$0g)%~C#B|j&gX-J({-5X4h82NF-Ep; zUVwA~+KZ4bu(@`gLBG$rESqv`=0#{ac>JaU;L+{?fXzFX;g8bi0-6|iUwp-ga14~g zA@^S$0T5%H{}NS|>)ozaqY)y45y7P?s!FJ9R2A<%Ap}0|@6UE{ZFN;+j3m|~fEYul zYhnl_&Jk4^kH_r2`yg{20Ccj<0t|{GocTBYuYLg?aLrPb^x;MT0000lTT|CK^Vq=@668Z8go>z#rh{8iWH$G zdJqxRgXm}Rrn6e=jii`tYP>O}=>iArxFn@x6i=Jk+nG&TzLIlcqGd7kH;5mg0X z_i^rl?CPVF1CAkS0Nu4UwbtUCV_X!dDk1_R0KDt<)0F-6P zgZ=^WkNIY2g{rRc-cR8RBOL1Wr3)m<^k_I3kftflITG(N#xVLDpovoy1wKuA_<4VJ zwsEBcK%VEk-`<|B!_0RmIOm8la_7??xkgG=a*f>l@R8wQFx$>TK%?9HKLB`hxkH8W z>f%`dZhid@zm>ia(8PGUbP6Lv5hKNT%!`#X0K^y002ovPDHLkV1g2k{yP8w literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/items/tool_creative.png b/src/main/resources/assets/bloodutils/textures/items/tool_creative.png new file mode 100644 index 0000000000000000000000000000000000000000..3722483e7d5f90e1ba6323db3105a75aba7bc135 GIT binary patch literal 214 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

Ye3Dp&pT#fKhgZwh2;5&BcNvGxU11w8&yd! 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 Z>N?4idBfXVaG4VL>~its)Uc7{{{yYF=AQrn literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/misc/tab.png b/src/main/resources/assets/bloodutils/textures/misc/tab.png new file mode 100644 index 0000000000000000000000000000000000000000..4226a378f26046fdcde5bd1a756beeccc0d2e33c GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1SFYWcSQjy&H|6fVg?3oVGw3ym^DWND9B#o z>FdgVk5gJu#mLK8rVuD3n;8;O;+&tGo0?YwNT^vI!P9L4($aTnphvB&CM6s9Jd%i5TTm1jk(QuKMNkJb3G#;%Lykq%BGttTH zWag}QDS{49)~q^U5W^_Qxa-{~$?(_Q1?35m^BQJyE?D(Cs^lS>4@luBvJL zaky!H<pv1@3(CSK#^ z^C8YVeR>|Rk6f(N&6>5$!KI={`F~sS`{mcx)RggoSXe)e0LV{I(*t0OPvSM6nbP0l+XkKF5`MT literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/bloodutils/textures/models/model_reviver.png b/src/main/resources/assets/bloodutils/textures/models/model_reviver.png new file mode 100644 index 0000000000000000000000000000000000000000..96b286ac2b2b85c2ddba1261cea631a1a8551517 GIT binary patch literal 1058 zcmV+-1l{|IP)VGd000McNliru-U%KKIXC5zkevVk1FuO$ zK~#9!?b$(Y+eQ?|@xLgFW^4&bV*x3Q0PZ5lsk-gDC+HEn?isqsg#rVG0at+msjw|d zp=O3;7b58)BgTd)Kr#INHXLd+l7Kgw_l7gT^D7i1AO@B|)&2_xboelRS6J&XxdY(j zC-#iK;dp{^ zmbpopMln%1s^636Imvnjz}%$0#$PCg`b%;`laUt_yY=C{`^T`{pvfI`IXUCH|&xc`%b8cG?0JHUyv*SsfGAft13q`Td1o&76 zxXSwvwcFOtVT-&Da627DtyQ6}0rIRY=n8C+W1OpNftY}lyzxD+k79x#;3~Ooqyaf_ z3a~|vE%MHqfbt(-rGs|P9}R+U#;4>&1Q>EQS+?zWmQexYa8%a{ssZ+t0xYm@Rqc;W z0eRspUE9E@qih`WBy($j1?Ej!EfVGYyTVzAL6tjLY+#&*u|onMU!>oLw#H zea7oF@CPXZ+rj%U^-d9^X26YeL}9qs@$$qK;Lzv!haUgZSC9}6d!B#j@h`oG2&;W} zpY!lOyrRlc;3!C(W$qo*!uCAA>fg05f9~U7Yz<(Xt6#|TtZ^Qn6)+qO>ht(2 z*ZTSNIgh`*U1%2}A|fIpA|fIpA|fIpA|fIpA|fIpA|fIpA|fIpA|fIpA|fIpA|fIp cA|i+MKMA2UL1-lEY5)KL07*qoM6N<$g50P4L;wH) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_blood.png b/src/main/resources/assets/minecraft/textures/gui/container/creative_inventory/tab_blood.png new file mode 100644 index 0000000000000000000000000000000000000000..d52684dc3751830e8b429267ce3085eb4093b7b8 GIT binary patch literal 1023 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K5893O0R7}x|G$6&6|H(?D8gCb z5n0T@z;_UY8Fx&~ehU<2FY)wsWxvNM%EvD5VXdRdz`)$&>EaktaqI1!gTAjFMA|M| zPptOfeiLC`8^{`(D!ko6cxB=ZhCZbw3ORo(&f=i=XT9gtPu zctQF4Qm~o(LzNa?i&9ofiWGa#k$L9xo_iciUDj?*;c>X*#t`&R%}1)?@UPF};f$I2 z|7ORxY1%W^d@^j<^4;;6|G}f~^(Rj6XTlL@nBhsRhyuesChSQHGm#N3f|fXm)`!O- em`48VEa&?0($e=vt^qKsGI+ZBxvX