From b958f0d07fbacd03c39ae9f7e03a3fea0e21482e Mon Sep 17 00:00:00 2001 From: MachineMuse Date: Mon, 17 Dec 2012 14:24:42 -0700 Subject: [PATCH] Doing it right dot jpeg --- .gitattributes | 22 ++ .gitignore | 163 +++++++++++++ .../client/ClientPacketHandler.java | 19 ++ .../powersuits/client/ClientProxy.java | 25 ++ .../powersuits/client/EquipmentRenderer.java | 26 +++ .../powersuits/client/GuiTinkerTable.java | 136 +++++++++++ machinemuse/powersuits/client/MuseGui.java | 147 ++++++++++++ machinemuse/powersuits/common/AugLayout.java | 8 + machinemuse/powersuits/common/AugSlot.java | 62 +++++ .../powersuits/common/BlockTinkerTable.java | 48 ++++ .../powersuits/common/CommonProxy.java | 13 ++ machinemuse/powersuits/common/Config.java | 121 ++++++++++ .../common/ContainerTinkerTable.java | 174 ++++++++++++++ machinemuse/powersuits/common/GuiHandler.java | 22 ++ .../common/InventoryModularItem.java | 219 ++++++++++++++++++ .../powersuits/common/ItemAugmentation.java | 77 ++++++ .../powersuits/common/ItemPowerArmor.java | 60 +++++ .../powersuits/common/ItemPowerTool.java | 12 + .../powersuits/common/PowersuitsMod.java | 68 ++++++ .../common/ServerPacketHandler.java | 22 ++ .../common/SlotArmorInTinkerTable.java | 85 +++++++ .../powersuits/common/SlotAugmentation.java | 53 +++++ 22 files changed, 1582 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 machinemuse/powersuits/client/ClientPacketHandler.java create mode 100644 machinemuse/powersuits/client/ClientProxy.java create mode 100644 machinemuse/powersuits/client/EquipmentRenderer.java create mode 100644 machinemuse/powersuits/client/GuiTinkerTable.java create mode 100644 machinemuse/powersuits/client/MuseGui.java create mode 100644 machinemuse/powersuits/common/AugLayout.java create mode 100644 machinemuse/powersuits/common/AugSlot.java create mode 100644 machinemuse/powersuits/common/BlockTinkerTable.java create mode 100644 machinemuse/powersuits/common/CommonProxy.java create mode 100644 machinemuse/powersuits/common/Config.java create mode 100644 machinemuse/powersuits/common/ContainerTinkerTable.java create mode 100644 machinemuse/powersuits/common/GuiHandler.java create mode 100644 machinemuse/powersuits/common/InventoryModularItem.java create mode 100644 machinemuse/powersuits/common/ItemAugmentation.java create mode 100644 machinemuse/powersuits/common/ItemPowerArmor.java create mode 100644 machinemuse/powersuits/common/ItemPowerTool.java create mode 100644 machinemuse/powersuits/common/PowersuitsMod.java create mode 100644 machinemuse/powersuits/common/ServerPacketHandler.java create mode 100644 machinemuse/powersuits/common/SlotArmorInTinkerTable.java create mode 100644 machinemuse/powersuits/common/SlotAugmentation.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ebd21a --- /dev/null +++ b/.gitignore @@ -0,0 +1,163 @@ +################# +## Eclipse +################# + +*.pydevproject +.project +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath + + +################# +## Visual Studio +################# + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results +[Dd]ebug/ +[Rr]elease/ +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.vspscc +.builds +*.dotCover + +## TODO: If you have NuGet Package Restore enabled, uncomment this +#packages/ + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf + +# Visual Studio profiler +*.psess +*.vsp + +# ReSharper is a .NET coding add-in +_ReSharper* + +# Installshield output folder +[Ee]xpress + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish + +# Others +[Bb]in +[Oo]bj +sql +TestResults +*.Cache +ClientBin +stylecop.* +~$* +*.dbmdl +Generated_Code #added for RIA/Silverlight projects + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML + + + +############ +## Windows +############ + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + + +############# +## Python +############# + +*.py[co] + +# Packages +*.egg +*.egg-info +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox + +#Translations +*.mo + +#Mr Developer +.mr.developer.cfg + +# Mac crap +.DS_Store diff --git a/machinemuse/powersuits/client/ClientPacketHandler.java b/machinemuse/powersuits/client/ClientPacketHandler.java new file mode 100644 index 0000000..b9773ea --- /dev/null +++ b/machinemuse/powersuits/client/ClientPacketHandler.java @@ -0,0 +1,19 @@ +package machinemuse.powersuits.client; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; + +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet250CustomPayload; +import cpw.mods.fml.common.network.IPacketHandler; +import cpw.mods.fml.common.network.Player; + +public class ClientPacketHandler implements IPacketHandler { + @Override + public void onPacketData(INetworkManager manager, + Packet250CustomPayload payload, Player player) { + DataInputStream data = new DataInputStream(new ByteArrayInputStream( + payload.data)); + } + +} diff --git a/machinemuse/powersuits/client/ClientProxy.java b/machinemuse/powersuits/client/ClientProxy.java new file mode 100644 index 0000000..2d2e859 --- /dev/null +++ b/machinemuse/powersuits/client/ClientProxy.java @@ -0,0 +1,25 @@ +package machinemuse.powersuits.client; + +import machinemuse.powersuits.common.CommonProxy; +import machinemuse.powersuits.common.PowersuitsMod; +import net.minecraft.item.Item; +import net.minecraftforge.client.MinecraftForgeClient; + +public class ClientProxy extends CommonProxy { + private static EquipmentRenderer eRenderer = new EquipmentRenderer(); + + @Override + public void registerRenderers() { + for (Item i : PowersuitsMod.allItems) { + MinecraftForgeClient.registerItemRenderer( + i.shiftedIndex, eRenderer); + } + // for (Item i : PowersuitsMod.allBlocks) { + // MinecraftForgeClient.registerItemRenderer( + // i.shiftedIndex, eRenderer); + // } + + MinecraftForgeClient.preloadTexture("/gui/tinktablegui.png"); + } + +} \ No newline at end of file diff --git a/machinemuse/powersuits/client/EquipmentRenderer.java b/machinemuse/powersuits/client/EquipmentRenderer.java new file mode 100644 index 0000000..62fcc3f --- /dev/null +++ b/machinemuse/powersuits/client/EquipmentRenderer.java @@ -0,0 +1,26 @@ +package machinemuse.powersuits.client; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.client.IItemRenderer; + +public class EquipmentRenderer implements IItemRenderer { + private static final boolean useRenderHelper = true; + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) { + return useRenderHelper; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, + ItemRendererHelper helper) { + return false; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) { + MuseGui muse = new MuseGui(); + muse.drawCircleAround(8, 8, 8); + } + +} diff --git a/machinemuse/powersuits/client/GuiTinkerTable.java b/machinemuse/powersuits/client/GuiTinkerTable.java new file mode 100644 index 0000000..a29c17c --- /dev/null +++ b/machinemuse/powersuits/client/GuiTinkerTable.java @@ -0,0 +1,136 @@ +package machinemuse.powersuits.client; + +import machinemuse.powersuits.common.ContainerTinkerTable; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.inventory.IInventory; + +import org.lwjgl.opengl.GL11; + +public class GuiTinkerTable extends GuiContainer { + public IInventory[] armorInventory; + + public GuiTinkerTable(ContainerTinkerTable container) { + super(container); + this.xSize = 256; + this.ySize = 226; + } + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + public void initGui() + { + super.initGui(); + } + + public void refresh() { + for (int i = 0; i < 4; i++) { + + } + } + + // public void drawNthItem(ItemStack stack, int n) { + // // TBI + // // draw item + // // draw a button if it's moddable + // } + // + // public void drawSelection() { + // // if(selectedSlot != null) { + // // drawCircleAround(selectedSlot.position, renderEngine, selectedSlot); + // // } + // // for (Augmentation a : Augmentation.getAllAugs()) { + // // if (a.canGoInSlot(selectedSlot.getType())) { + // // + // // } + // // } + // + // } + + // public void drawLayout(AugLayout layout) { + // + // } + // + // public void drawBackground() { + // this.drawDefaultBackground(); + // this.drawRectangularBackground(); + // } + // + // public void drawScreen(int par1, int par2, float par3) { + // super.drawScreen(par1, par2, par3); + // drawBackground(); + // drawItemList(); + // if (editingItem != null && editingLayout != null) { + // drawLayout(editingLayout); + // if (selectedSlot != null) { + // drawSelection(); + // } + // } + // } + // + // public void drawItemList() { + // List items = new ArrayList(); + // for (int i = 0; i < 4; i++) { + // ItemStack item = editingPlayer.inventory.armorItemInSlot(i); + // this.drawItemAt(new Point2Df(0, 0), this.mc.renderEngine, item); + // items.add(item); + // } + // for (int i = 0; i < 9; i++) { + // items.add(editingPlayer.inventory.mainInventory[i]); + // } + // this.drawItemsOnVerticalLine(items, new Point2Df(-0.9f, 0), 0.9f, + // this.mc.renderEngine); + // } + + /** + * Draw the foreground layer for the GuiContainer (everything in front of + * the items) + */ + protected void drawGuiContainerForegroundLayer(int par1, int par2) + { + int x = 0; + int y = 0; + int color = 0; + double weight = 0.0; + double capacity = 0.0; + + this.fontRenderer.drawString("Weight: " + weight, 8, 104, + color); + this.fontRenderer.drawString("Capacity: " + capacity, 8, 114, + color); + this.fontRenderer.drawString("Speed: " + capacity, 8, 124, + color); + } + + protected void drawAugmentationContainerBackground(int paddingX, + int paddingY, int j) { + int n = 0; // set N to the number of augs in that item, plus 1 + for (int i = 0; i < n; i++) { + this.drawTexturedModalRect( + paddingX + 35, // where on the screen + paddingY + 8 + 18 * j, + 0, // where in the texture + 227, + 18 * i, // how much + 18); + } + } + + /** + * Draw the background layer for the GuiContainer (everything behind the + * items) + */ + protected void drawGuiContainerBackgroundLayer(float par1, int par2, + int par3) + { + int textureIndex = this.mc.renderEngine + .getTexture("/img/tinktablegui.png"); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.renderEngine.bindTexture(textureIndex); + int paddingX = (this.width - this.xSize) / 2; + int paddingY = (this.height - this.ySize) / 2; + int numrows = 5; + this.drawTexturedModalRect(paddingX, paddingY, 0, 0, this.xSize, + this.ySize); + } +} diff --git a/machinemuse/powersuits/client/MuseGui.java b/machinemuse/powersuits/client/MuseGui.java new file mode 100644 index 0000000..114d016 --- /dev/null +++ b/machinemuse/powersuits/client/MuseGui.java @@ -0,0 +1,147 @@ +package machinemuse.powersuits.client; + +import java.util.List; + +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.renderer.RenderEngine; +import net.minecraft.client.renderer.Tessellator; +import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.item.ItemStack; + +import org.lwjgl.input.Keyboard; +import org.lwjgl.opengl.GL11; + +public class MuseGui extends GuiScreen { + protected static RenderItem itemRenderer = new RenderItem(); + private final boolean usePretty = true; + private static final int numSegments = 360; + private static final int xcenter = 8; + private static final int ycenter = 8; + private static final Tessellator tesselator = Tessellator.instance; + + public static final double theta = (2 * Math.PI) / numSegments; + + /** + * Adds the buttons (and other controls) to the screen in question. + */ + public void initGui() { + super.initGui(); + this.controlList.clear(); + Keyboard.enableRepeatEvents(true); + } + + public void drawRectangularBackground() { + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glBegin(GL11.GL_QUADS); + GL11.glColor4f(0.5f, 0.5f, 0.5f, 0.8f); + GL11.glVertex2d(0, 0); + GL11.glVertex2d(width - 10, 0); + GL11.glVertex2d(width - 10, height - 10); + GL11.glVertex2d(0, height - 10); + GL11.glEnd(); + } + + public void drawItemsOnVerticalLine(List items, Point2Df offset, + float lineheight, RenderEngine engine) { + if (items.size() < 1) { + return; + } else if (items.size() < 2) { + drawItemAt(offset, engine, items.get(0)); + } else { + int top = (int) (offset.getAbsY(height) - height * lineheight / 2); + int bottom = (int) (offset.getAbsY(height) + height * lineheight + / 2); + Point2Df position = new Point2Df(offset.x, top * 2.0f / height - 1); + int step = (top - bottom) / (items.size() - 1); + for (int i = 0; i < items.size(); i++) { + drawItemAt(position, engine, items.get(i)); + position.y += step; + } + } + } + + public void drawItemAt(Point2Df p, RenderEngine engine, + ItemStack item) { + itemRenderer.renderItemAndEffectIntoGUI(this.fontRenderer, engine, + item, p.getAbsX(width) - xcenter, p.getAbsY(height) - ycenter); + } + + public void drawCircleAround(float xoffset, float yoffset, float radius) { + int start = (int) (System.currentTimeMillis() / 4 % 360); + double x = radius * Math.sin(theta * start); + double y = radius * Math.cos(theta * start); + double tf = Math.tan(theta); + double rf = Math.cos(theta); + double tx; + double ty; + Colour c = new Colour(0.0f, 1.0f, 0.0f, 0.0f); + GL11.glEnable(GL11.GL_BLEND); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glBegin(GL11.GL_LINE_LOOP); + for (int i = 0; i < numSegments; i++) { + GL11.glColor4f(c.r, c.g, c.b, c.a); + GL11.glVertex2d(x + xoffset, y + yoffset); + tx = y; + ty = -x; + x += tx * tf; + y += ty * tf; + x *= rf; + y *= rf; + c.r += theta / 7; + c.b += theta / 7; + c.a += theta / 2; + } + GL11.glEnd(); + } + + public static class Colour { + public float r; + public float g; + public float b; + public float a; + + public Colour(float r, float g, float b, float a) { + this.r = r; + this.g = g; + this.b = b; + this.a = a; + } + + public Colour(float r, float g, float b) { + this(r, g, b, 1.0F); + } + + public Colour(int c) { + this.r = (c >> 16 & 255) / 255.0F; + this.g = (c >> 8 & 255) / 255.0F; + this.b = (c & 255) / 255.0F; + this.a = 1.0F; + } + } + + public static class Point2Df { + /* + * point representation where [-1,-1] is the top left corner of the + * screen and [1,1] is the bottom right. + */ + public float x; + public float y; + + public Point2Df(float x, float y) { + this.x = x; + this.y = y; + } + + public int getAbsX(int width) { + return (int) ((x + 1) * width / 2); + } + + public int getAbsY(int height) { + return (int) ((y + 1) * height / 2); + } + + } +} diff --git a/machinemuse/powersuits/common/AugLayout.java b/machinemuse/powersuits/common/AugLayout.java new file mode 100644 index 0000000..cb861d3 --- /dev/null +++ b/machinemuse/powersuits/common/AugLayout.java @@ -0,0 +1,8 @@ +package machinemuse.powersuits.common; + +import java.util.List; + +public abstract class AugLayout { + private List slots; + +} diff --git a/machinemuse/powersuits/common/AugSlot.java b/machinemuse/powersuits/common/AugSlot.java new file mode 100644 index 0000000..6b090f7 --- /dev/null +++ b/machinemuse/powersuits/common/AugSlot.java @@ -0,0 +1,62 @@ +package machinemuse.powersuits.common; + +import java.util.ArrayList; +import java.util.List; + +public class AugSlot { + private List connectedSlots; + private SlotType type; + private ItemAugmentation installedAug; + + public AugSlot(SlotType type) { + connectedSlots = new ArrayList(); + this.type = type; + } + + public List getConnectedSlots() { + return connectedSlots; + } + + public void connectToSlot(AugSlot other) { + if (!this.connectedSlots.contains(other)) { + this.connectedSlots.add(other); + } + if (!other.connectedSlots.contains(this)) { + other.connectedSlots.add(this); + } + } + + // Returns true if successful, false otherwise + public boolean installAugmentation(ItemAugmentation aug) { + if (aug.canGoInSlot(type)) { + installedAug = aug; + return true; + } else { + return false; + } + } + + public void disconnectFromSlot(AugSlot other) { + if (!this.connectedSlots.contains(other)) { + this.connectedSlots.add(other); + } + if (!other.connectedSlots.contains(this)) { + other.connectedSlots.add(this); + } + } + + public SlotType getType() { + return type; + } + + public static enum SlotType { + Vision, + Hearing, + Movement, + Generator, + PowerConduit, + Weapon, + Tool, + + } +} diff --git a/machinemuse/powersuits/common/BlockTinkerTable.java b/machinemuse/powersuits/common/BlockTinkerTable.java new file mode 100644 index 0000000..c1506fa --- /dev/null +++ b/machinemuse/powersuits/common/BlockTinkerTable.java @@ -0,0 +1,48 @@ +package machinemuse.powersuits.common; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.LanguageRegistry; + +public class BlockTinkerTable extends Block { + + public BlockTinkerTable() { + super(Config.getAssignedBlockID(Config.Blocks.TinkerTable), + Config.Blocks.TinkerTable.textureIndex, + Config.Blocks.TinkerTable.material); + setHardness(Config.Blocks.TinkerTable.hardness); + setStepSound(Config.Blocks.TinkerTable.stepSound); + setBlockName(Config.Blocks.TinkerTable.idName); + setCreativeTab(Config.getCreativeTab()); + LanguageRegistry.addName(this, Config.Blocks.TinkerTable.englishName); + MinecraftForge.setBlockHarvestLevel(this, + Config.Blocks.TinkerTable.harvestTool, + Config.Blocks.TinkerTable.harvestLevel); + ItemStack recipeResult = new ItemStack(this); + GameRegistry.registerBlock(this); + + } + + @Override + public String getTextureFile() { + return CommonProxy.BLOCK_PNG; + } + + /** + * Called upon block activation (right click on the block.) + */ + public boolean onBlockActivated(World world, int x, int y, + int z, EntityPlayer player, int par6, float par7, + float par8, float par9) + { + if (player.isSneaking()) { + return false; + } + player.openGui(PowersuitsMod.instance, 0, world, x, y, z); + return true; + } +} diff --git a/machinemuse/powersuits/common/CommonProxy.java b/machinemuse/powersuits/common/CommonProxy.java new file mode 100644 index 0000000..89b31c9 --- /dev/null +++ b/machinemuse/powersuits/common/CommonProxy.java @@ -0,0 +1,13 @@ +package machinemuse.powersuits.common; + + +public class CommonProxy { + public static String ITEMS_PNG = "/tutorial/generic/items.png"; + public static String BLOCK_PNG = "/tutorial/generic/block.png"; + + // Client stuff + public void registerRenderers() { + // Nothing here as this is the server side proxy + } + +} diff --git a/machinemuse/powersuits/common/Config.java b/machinemuse/powersuits/common/Config.java new file mode 100644 index 0000000..921931b --- /dev/null +++ b/machinemuse/powersuits/common/Config.java @@ -0,0 +1,121 @@ +package machinemuse.powersuits.common; + +import net.minecraft.block.Block; +import net.minecraft.block.StepSound; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.Configuration; +import cpw.mods.fml.common.registry.GameRegistry; + +public class Config extends Configuration { + private static final int[] assignedItemIDs = new int[Items.values().length]; + private static final int[] assignedBlockIDs = new int[Blocks.values().length]; + private static Configuration config; + + public static void init(Configuration config) { + Config.config = config; + config.load(); + + // Request block IDs + for (Blocks b : Blocks.values()) { + assignedBlockIDs[b.ordinal()] = + config.getBlock(b.englishName, 1002).getInt(); + } + + // Request item IDs + for (Items i : Items.values()) { + assignedItemIDs[i.ordinal()] = + config.getItem(i.englishName, 5000).getInt(); + } + config.save(); + } + + public static CreativeTabs getCreativeTab() { + return CreativeTabs.tabMisc; + } + + public static int getAssignedItemID(Items item) { + if (assignedItemIDs[item.ordinal()] == 0) { + assignedItemIDs[item.ordinal()] = config.getItem(item.englishName, + 1002).getInt(); + } + return assignedItemIDs[item.ordinal()]; + } + + public static int getAssignedBlockID(Blocks block) { + if (assignedBlockIDs[block.ordinal()] == 0) { + assignedBlockIDs[block.ordinal()] = config.getBlock( + block.englishName, 5000).getInt(); + } + return assignedBlockIDs[block.ordinal()]; + } + + public static int RegisterRecipes() { + ItemStack iron = new ItemStack(Item.ingotIron); + ItemStack lapis = new ItemStack(Item.dyePowder, 1); + GameRegistry.addRecipe(new ItemStack(new BlockTinkerTable()), " I ", + "ILI", + " I ", 'I', iron, 'L', lapis); + return 0; + } + + public static enum Blocks { + TinkerTable(1002, 0, "tinkerTable", "Tinker Table", + 80.0F, Material.iron, Block.soundMetalFootstep, + "pickaxe", 1); + + public final int defaultBlockId; + public final int textureIndex; + public final String idName; + public final String englishName; + public final float hardness; + public final Material material; + public final StepSound stepSound; + public final String harvestTool; + public final int harvestLevel; + + private Blocks( + int defaultBlockId, int textureIndex, String idName, + String englishName, + float hardness, Material material, + StepSound stepSound, String harvestTool, int harvestLevel) { + this.defaultBlockId = defaultBlockId; + this.textureIndex = textureIndex; + this.idName = idName; + this.englishName = englishName; + this.hardness = hardness; + this.material = material; + this.stepSound = stepSound; + this.harvestTool = harvestTool; + this.harvestLevel = harvestLevel; + } + + } + + public static enum Items { + // Icon index, ID name, English name, Armor Type + PowerArmorHead(0, "powerArmorHead", "Power Armor Head"), + PowerArmorTorso(1, "powerArmorTorso", "Power Armor Torso"), + PowerArmorLegs(2, "powerArmorLegs", "Power Armor Legs"), + PowerArmorFeet(3, "powerArmorFeet", "Power Armor Feet"), + PowerTool(4, "powerTool", "Power Tool"), + Augmentation(5, "modularAugmentation", "Modular Augmentation"), + + ; + + public final int iconIndex; + public final String idName; + public final String englishName; + + Items(int iconIndex, + String idName, String englishName) { + this.iconIndex = iconIndex; + this.idName = idName; + this.englishName = englishName; + } + + } + +} diff --git a/machinemuse/powersuits/common/ContainerTinkerTable.java b/machinemuse/powersuits/common/ContainerTinkerTable.java new file mode 100644 index 0000000..1f048c8 --- /dev/null +++ b/machinemuse/powersuits/common/ContainerTinkerTable.java @@ -0,0 +1,174 @@ +package machinemuse.powersuits.common; + +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public class ContainerTinkerTable extends Container { + EntityPlayer player; + private World world; + private int posX; + private int posY; + private int posZ; + private final int inventoryTop = 145; + public InventoryModularItem[] itemInventories; + public SlotArmorInTinkerTable[] armorslots; + public ArrayList augslots; + + public ContainerTinkerTable(EntityPlayer player, World world, int x, int y, + int z) { + this.player = player; + this.world = world; + this.posX = x; + this.posY = y; + this.posZ = z; + int id = 0; + int slotx = 0; + int sloty = 0; + + armorslots = new SlotArmorInTinkerTable[4]; + itemInventories = new InventoryModularItem[5]; + augslots = new ArrayList(); + + for (int i = 0; i < 4; i++) { + armorslots[i] = new SlotArmorInTinkerTable(this, + player.inventory, + player.inventory.getSizeInventory() - 1 - i, + 8, + 8 + i * 18, + i); + this.addSlotToContainer(armorslots[i]); + } + + bindPlayerInventory(player); + + this.update(); + } + + public void update() { + this.inventorySlots.removeAll(augslots); + augslots.clear(); + for (int i = 0; i < 4; i++) { + ItemStack stack = armorslots[i].getStack(); + if (stack != null) { + if (stack.getItem() instanceof ItemPowerArmor) { + itemInventories[i] = InventoryModularItem + .fromItemStack(stack, this); + this.bindItemInventory(itemInventories[i], i); + } + } + } + } + + public void bindItemInventory(InventoryModularItem inv, int row) { + for (int i = 0; i < inv.getSizeInventory(); ++i) { + SlotAugmentation slot = new SlotAugmentation( + inv, + i, + 32 + i * 18, + 9 + row * 18); + this.addSlotToContainer(slot); + this.augslots.add(slot); + } + } + + public void bindPlayerInventory(EntityPlayer player) { + for (int i = 0; i < 3; ++i) { + for (int j = 0; j < 9; ++j) { + this.addSlotToContainer(new Slot( + player.inventory, + 9 + j + i * 9, + 8 + j * 18, + inventoryTop + i * 18)); + } + } + + for (int i = 0; i < 9; ++i) { + this.addSlotToContainer(new Slot( + player.inventory, + i, + 8 + i * 18, + inventoryTop + 58)); + } + } + + /** + * Callback for when the crafting gui is closed. + */ + public void onCraftGuiClosed(EntityPlayer par1EntityPlayer) + { + } + + public boolean canInteractWith(EntityPlayer par1EntityPlayer) + { + return par1EntityPlayer.getDistanceSq((double) this.posX + 0.5D, + (double) this.posY + 0.5D, (double) this.posZ + 0.5D) <= 64.0D; + } + + /** + * Called when a player shift-clicks on a slot. You must override this or + * you will crash when someone does that. + */ + public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) + { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if (var4 != null && var4.getHasStack()) + { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if (par2 == 0) + { + if (!this.mergeItemStack(var5, 10, 46, true)) + { + return null; + } + + var4.onSlotChange(var5, var3); + } + else if (par2 >= 10 && par2 < 37) + { + if (!this.mergeItemStack(var5, 37, 46, false)) + { + return null; + } + } + else if (par2 >= 37 && par2 < 46) + { + if (!this.mergeItemStack(var5, 10, 37, false)) + { + return null; + } + } + else if (!this.mergeItemStack(var5, 10, 46, false)) + { + return null; + } + + if (var5.stackSize == 0) + { + var4.putStack((ItemStack) null); + } + else + { + var4.onSlotChanged(); + } + + if (var5.stackSize == var3.stackSize) + { + return null; + } + + var4.onPickupFromSlot(par1EntityPlayer, var5); + } + + return var3; + } + +} diff --git a/machinemuse/powersuits/common/GuiHandler.java b/machinemuse/powersuits/common/GuiHandler.java new file mode 100644 index 0000000..946508d --- /dev/null +++ b/machinemuse/powersuits/common/GuiHandler.java @@ -0,0 +1,22 @@ +package machinemuse.powersuits.common; + +import machinemuse.powersuits.client.GuiTinkerTable; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.world.World; +import cpw.mods.fml.common.network.IGuiHandler; + +public class GuiHandler implements IGuiHandler { + + @Override + public Object getServerGuiElement(int ID, EntityPlayer player, World world, + int x, int y, int z) { + return new ContainerTinkerTable(player, world, x, y, z); + } + + @Override + public Object getClientGuiElement(int ID, EntityPlayer player, World world, + int x, int y, int z) { + return new GuiTinkerTable(new ContainerTinkerTable(player, world, x, y, + z)); + } +} diff --git a/machinemuse/powersuits/common/InventoryModularItem.java b/machinemuse/powersuits/common/InventoryModularItem.java new file mode 100644 index 0000000..e7e84b0 --- /dev/null +++ b/machinemuse/powersuits/common/InventoryModularItem.java @@ -0,0 +1,219 @@ +package machinemuse.powersuits.common; + +import java.util.ArrayList; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class InventoryModularItem implements IInventory { + + /** List of the stacks in the crafting matrix. */ + private ArrayList stackList; + private ItemStack associatedWith; + private ContainerTinkerTable container; + + /** the width of the crafting inventory */ + public InventoryModularItem(ContainerTinkerTable container) + { + this.container = container; + this.stackList = new ArrayList(); + } + + /** + * Creates a new Inventory from the nbt tag list associated with an + * itemStack. + */ + public static InventoryModularItem fromItemStack(ItemStack stack, + ContainerTinkerTable container) { + InventoryModularItem inv = null; + if (stack.getItem() instanceof ItemPowerArmor) { + NBTTagCompound tags = stack.getTagCompound(); + if (tags != null) { + inv = fromNBT(tags, container); + } else { + inv = new InventoryModularItem(container); + } + inv.associatedWith = stack; + inv.addEmptySlot(); + } else if (stack.getItem() instanceof ItemPowerTool) { + NBTTagCompound tags = stack.getTagCompound(); + if (tags != null) { + inv = fromNBT(tags, container); + } else { + inv = new InventoryModularItem(container); + } + inv.associatedWith = stack; + inv.addEmptySlot(); + } + return inv; + } + + /** + * Creates a new Inventory from an nbt tag list. + */ + public static InventoryModularItem fromNBT(NBTTagCompound tags, + ContainerTinkerTable container) { + InventoryModularItem inv = new InventoryModularItem(container); + int[] moduleIDs = tags.getIntArray("Contents"); + for (int i = 0; i < moduleIDs.length; i++) { + inv.stackList.add(new ItemStack(ItemAugmentation.index, 1, + moduleIDs[i])); + } + return inv; + } + + /** + * Creates an NBT tag list describing the inventory in its current state, + * and associates it with the given ItemStack. + */ + public void toNBTOfStack(ItemStack stack) { + if (stack != null) { + stack.setTagCompound(toNBT()); + } + } + + /** + * Creates an NBT tag list describing the inventory in its current state. + */ + public NBTTagCompound toNBT() { + NBTTagCompound nbt = new NBTTagCompound(); + int[] moduleIDs = new int[stackList.size()]; + for (int i = 0; i < stackList.size(); i++) { + if (stackList.get(i) != null) { + moduleIDs[i] = stackList.get(i).getItemDamage(); + } else { + moduleIDs[i] = -1; + } + } + nbt.setIntArray("Contents", moduleIDs); + return nbt; + } + + /** + * Returns the number of slots in the inventory. + */ + public int getSizeInventory() + { + return this.stackList.size(); + } + + /** + * Returns the stack in slot i + */ + public ItemStack getStackInSlot(int par1) + { + return par1 >= this.getSizeInventory() ? null : this.stackList + .get(par1); + } + + /** + * Returns the name of the inventory. + */ + public String getInvName() + { + return "container.crafting"; + } + + /** + * When some containers are closed they call this on each slot, then drop + * whatever it returns as an EntityItem - like when you close a workbench + * GUI. + */ + public ItemStack getStackInSlotOnClosing(int par1) + { + if (this.stackList.get(par1) != null) + { + ItemStack var2 = this.stackList.get(par1); + this.stackList.remove(par1); + return var2; + } + else + { + return null; + } + } + + /** + * Removes from an inventory slot (first arg) up to a specified number + * (second arg) of items and returns them in a new stack. + */ + public ItemStack decrStackSize(int index, int number) + { + if (this.stackList.get(index) != null) + { + ItemStack var3; + + if (this.stackList.get(index).stackSize <= number) + { + var3 = this.stackList.get(index); + this.stackList.remove(index); + return var3; + } + else + { + var3 = this.stackList.get(index).splitStack(number); + + if (this.stackList.get(index).stackSize == 0) + { + this.stackList.remove(index); + } + + return var3; + } + } + else + { + return null; + } + } + + /** + * Sets the given item stack to the specified slot in the inventory (can be + * crafting or armor sections). + */ + public void setInventorySlotContents(int index, ItemStack stack) + { + this.stackList.set(index, stack); + } + + /** + * Returns the maximum stack size for a inventory slot. Seems to always be + * 64, possibly will be extended. *Isn't this more of a set than a get?* + */ + public int getInventoryStackLimit() + { + return 1; + } + + /** + * Called when an the contents of an Inventory change, usually + */ + public void onInventoryChanged() { + if (this.associatedWith != null) { + this.toNBTOfStack(associatedWith); + } + container.update(); + } + + public void addEmptySlot() { + this.stackList.add(null); + } + + /** + * Do not make give this method the name canInteractWith because it clashes + * with Container + */ + public boolean isUseableByPlayer(EntityPlayer par1EntityPlayer) + { + return true; + } + + public void openChest() { + } + + public void closeChest() { + } + +} diff --git a/machinemuse/powersuits/common/ItemAugmentation.java b/machinemuse/powersuits/common/ItemAugmentation.java new file mode 100644 index 0000000..9f72e21 --- /dev/null +++ b/machinemuse/powersuits/common/ItemAugmentation.java @@ -0,0 +1,77 @@ +package machinemuse.powersuits.common; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; +import cpw.mods.fml.common.Side; +import cpw.mods.fml.common.asm.SideOnly; + +public class ItemAugmentation extends Item { + static List allAugs = new ArrayList(); + public static int index; + + public ItemAugmentation(Config.Items item) { + super(Config.getAssignedItemID(item)); + index = shiftedIndex; + this.setHasSubtypes(true); + this.setMaxDamage(0); + allAugs.add(this); + } + + public static List getAllAugs() { + return allAugs; + } + + public boolean canGoInSlot(AugSlot.SlotType type) { + return true; + } + + public static enum AugTypes { + Armor("armor", "Armor Plate", 1), + SteamReceptacle("steamReceptacle", "Steam Receptacle", 2), + + ; + + String idName; + String englishName; + int id; + + private AugTypes(String idName, String englishName, int id) { + this.idName = idName; + this.englishName = englishName; + this.id = id; + } + } + + @SideOnly(Side.CLIENT) + /** + * Gets an icon index based on an item's damage value + */ + public int getIconFromDamage(int par1) + { + return this.iconIndex; + } + + public String getItemNameIS(ItemStack par1ItemStack) + { + int var2 = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, 15); + return "augmentation." + AugTypes.values()[var2].idName; + } + + @SideOnly(Side.CLIENT) + /** + * returns a list of items with the same ID, but different meta (eg: dye returns 16 items) + */ + public void getSubItems(int id, CreativeTabs creativeTab, + List tabItems) + { + for (AugTypes i : AugTypes.values()) + { + tabItems.add(new ItemStack(id, 1, i.id)); + } + } +} diff --git a/machinemuse/powersuits/common/ItemPowerArmor.java b/machinemuse/powersuits/common/ItemPowerArmor.java new file mode 100644 index 0000000..21f98e7 --- /dev/null +++ b/machinemuse/powersuits/common/ItemPowerArmor.java @@ -0,0 +1,60 @@ +package machinemuse.powersuits.common; + +import net.minecraft.entity.EntityLiving; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumArmorMaterial; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraftforge.common.ISpecialArmor; +import cpw.mods.fml.common.registry.LanguageRegistry; + +public class ItemPowerArmor extends ItemArmor implements ISpecialArmor { + protected ItemPowerArmor(Config.Items item) { + super(Config.getAssignedItemID(item), // itemID + EnumArmorMaterial.IRON, // Material + item.iconIndex, // Texture index + item.ordinal()); // armor type. + setMaxStackSize(1); + setCreativeTab(Config.getCreativeTab()); + setIconIndex(item.iconIndex); + setItemName(item.idName); + LanguageRegistry.addName(this, item.englishName); + } + + public String getTextureFile() { + return CommonProxy.ITEMS_PNG; + } + + @Override + public ArmorProperties getProperties(EntityLiving player, ItemStack armor, + DamageSource source, double damage, int slot) { + // Order in which this armor is assessed for damage. + int priority = 1; + + // How much of incoming damage is absorbed by this armor piece. + // 1.0 = absorbs all damage + // 0.5 = 50% damage to item, 50% damage carried over + double absorbRatio = 0.1; + + // Maximum damage absorbed by this piece + int absorbMax = 2; + + ArmorProperties props = new ArmorProperties(priority, absorbRatio, + absorbMax); + return props; + } + + @Override + public int getArmorDisplay(EntityPlayer player, ItemStack armor, int slot) { + // How many half-shields of armor display on the player's gui from this + // piece + return 4; + } + + @Override + public void damageArmor(EntityLiving entity, ItemStack stack, + DamageSource source, int damage, int slot) { + // Damage the armor's durability + } +} diff --git a/machinemuse/powersuits/common/ItemPowerTool.java b/machinemuse/powersuits/common/ItemPowerTool.java new file mode 100644 index 0000000..9dc4288 --- /dev/null +++ b/machinemuse/powersuits/common/ItemPowerTool.java @@ -0,0 +1,12 @@ +package machinemuse.powersuits.common; + +import net.minecraft.item.Item; + +public class ItemPowerTool extends Item { + + public ItemPowerTool(int par1) { + super(par1); + // TODO Auto-generated constructor stub + } + +} diff --git a/machinemuse/powersuits/common/PowersuitsMod.java b/machinemuse/powersuits/common/PowersuitsMod.java new file mode 100644 index 0000000..ef1ab91 --- /dev/null +++ b/machinemuse/powersuits/common/PowersuitsMod.java @@ -0,0 +1,68 @@ +package machinemuse.powersuits.common; + +import java.util.ArrayList; +import java.util.List; + +import machinemuse.powersuits.client.ClientPacketHandler; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraftforge.common.Configuration; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.Init; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.Mod.PostInit; +import cpw.mods.fml.common.Mod.PreInit; +import cpw.mods.fml.common.SidedProxy; +import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; +import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.network.NetworkMod; +import cpw.mods.fml.common.network.NetworkMod.SidedPacketHandler; +import cpw.mods.fml.common.network.NetworkRegistry; + +@Mod(modid = "mmmPowersuits", name = "MachineMuse Modular Powersuits", version = "0.0.1") +@NetworkMod(clientSideRequired = true, serverSideRequired = true, + clientPacketHandlerSpec = + @SidedPacketHandler(channels = { "mmPowersuits" }, packetHandler = ClientPacketHandler.class), + serverPacketHandlerSpec = + @SidedPacketHandler(channels = { "mmPowersuits" }, packetHandler = ServerPacketHandler.class)) +public class PowersuitsMod { + + // The instance of your mod that Forge uses. + @Instance("PowersuitsMod") + public static PowersuitsMod instance; + + // Says where the client and server 'proxy' code is loaded. + @SidedProxy(clientSide = "machinemuse.powersuits.client.ClientProxy", serverSide = "machinemuse.powersuits.common.CommonProxy") + public static CommonProxy proxy; + + @PreInit + public void preInit(FMLPreInitializationEvent event) { + instance = this; + Config.init(new Configuration( + event.getSuggestedConfigurationFile())); + } + + public static List allBlocks = new ArrayList(); + public static List allItems = new ArrayList(); + public static GuiHandler guiHandler = new GuiHandler(); + + @Init + public void load(FMLInitializationEvent event) { + allBlocks.add(new BlockTinkerTable()); + + for (int i = 0; i < 4; i++) { + allItems.add(new ItemPowerArmor( + Config.Items.values()[i])); + } + allItems.add(new ItemAugmentation(Config.Items.Augmentation)); + + proxy.registerRenderers(); + NetworkRegistry.instance().registerGuiHandler(this, guiHandler); + } + + @PostInit + public void postInit(FMLPostInitializationEvent event) { + // Stub Method + } +} \ No newline at end of file diff --git a/machinemuse/powersuits/common/ServerPacketHandler.java b/machinemuse/powersuits/common/ServerPacketHandler.java new file mode 100644 index 0000000..1161def --- /dev/null +++ b/machinemuse/powersuits/common/ServerPacketHandler.java @@ -0,0 +1,22 @@ +package machinemuse.powersuits.common; + +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.network.INetworkManager; +import net.minecraft.network.packet.Packet250CustomPayload; +import cpw.mods.fml.common.network.IPacketHandler; +import cpw.mods.fml.common.network.Player; + +public class ServerPacketHandler implements IPacketHandler { + + @Override + public void onPacketData(INetworkManager manager, + Packet250CustomPayload packet, Player player) { + DataInputStream data = new DataInputStream(new ByteArrayInputStream( + packet.data)); + EntityPlayer sender = (EntityPlayer) player; + } + +} diff --git a/machinemuse/powersuits/common/SlotArmorInTinkerTable.java b/machinemuse/powersuits/common/SlotArmorInTinkerTable.java new file mode 100644 index 0000000..01f46ec --- /dev/null +++ b/machinemuse/powersuits/common/SlotArmorInTinkerTable.java @@ -0,0 +1,85 @@ +package machinemuse.powersuits.common; + +import net.minecraft.block.Block; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemArmor; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.Side; +import cpw.mods.fml.common.asm.SideOnly; + +public class SlotArmorInTinkerTable extends Slot { + /** + * The armor type that can be placed on that slot, it uses the same values + * of armorType field on ItemArmor. + */ + final int armorType; + final ContainerTinkerTable table; + private ItemStack stackCache; + + /** + * Constructor. Takes an inventory and an index, x and y locations for the + * icon, and armorType. + */ + SlotArmorInTinkerTable(ContainerTinkerTable table, IInventory inventory, + int index, int x, int y, + int armorType) + { + super(inventory, index, x, y); + this.armorType = armorType; + this.table = table; + this.stackCache = this.getStack(); + } + + /** + * Returns the maximum stack size for a given slot (usually the same as + * getInventoryStackLimit(), but 1 in the case of armor slots) + */ + public int getSlotStackLimit() + { + return 1; + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for + * the armor slots. + */ + public boolean isItemValid(ItemStack stack) + { + if (stack == null) { + return false; + } else { + Item stackType = (Item) stack.getItem(); + if (stack.getItem() instanceof ItemArmor) { + if (((ItemArmor) stackType).armorType == this.armorType) { + return true; + } else { + return false; + } + } else if (stackType.shiftedIndex == Block.pumpkin.blockID + && this.armorType == 0) { + return true; + } else if (stackType.shiftedIndex == Item.skull.shiftedIndex + && this.armorType == 0) { + return true; + } else { + return false; + } + } + } + + @SideOnly(Side.CLIENT) + /** + * Returns the icon index on items.png that is used as background image of the slot. + */ + public int getBackgroundIconIndex() + { + return 15 + this.armorType * 16; + } + + public void onSlotChanged() { + super.onSlotChanged(); + table.update(); + } +} diff --git a/machinemuse/powersuits/common/SlotAugmentation.java b/machinemuse/powersuits/common/SlotAugmentation.java new file mode 100644 index 0000000..46950e3 --- /dev/null +++ b/machinemuse/powersuits/common/SlotAugmentation.java @@ -0,0 +1,53 @@ +package machinemuse.powersuits.common; + +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import cpw.mods.fml.common.Side; +import cpw.mods.fml.common.asm.SideOnly; + +public class SlotAugmentation extends Slot { + + public SlotAugmentation(IInventory par1iInventory, int par2, int par3, + int par4) { + super(par1iInventory, par2, par3, par4); + } + + /** + * Returns the maximum stack size for a given slot (usually the same as + * getInventoryStackLimit(), but 1 in the case of armor slots) + */ + public int getSlotStackLimit() + { + return 1; + } + + /** + * Check if the stack is a valid item for this slot. Always true beside for + * the armor slots. + */ + public boolean isItemValid(ItemStack stack) + { + if (stack == null) { + return false; + } else { + Item stackType = (Item) stack.getItem(); + if (stack.getItem() instanceof ItemAugmentation) { + return true; + } else { + return false; + } + } + } + + @SideOnly(Side.CLIENT) + /** + * Returns the icon index on items.png that is used as background image of the slot. + */ + public int getBackgroundIconIndex() + { + return 18; + } + +}