diff --git a/.gitignore b/.gitignore index f185b2593..98f584375 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,11 @@ .Spotlight-V100 .Trashes ehthumbs.db -Thumbs.db \ No newline at end of file +Thumbs.db +/bin +.classpath +.gradle/ +.settings/ +build/ +eclipse/ +.project diff --git a/.gitmodules b/.gitmodules index 198d713f1..e69de29bb 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "src/main/resources/assets/resonantinduction/languages"] - path = src/main/resources/assets/resonantinduction/languages - url = https://github.com/calclavia/Resonant-Induction-Localization diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlock.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlock.java new file mode 100644 index 000000000..8b4dd131e --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlock.java @@ -0,0 +1,34 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +@Deprecated +public interface IWailaBlock { + /* + * Use this method to return an item stack in case the default lookup system fails. + * Return null if you want to use the default lookup system. + * You get the world, the player and the location of the block. With that, it is easy to gather information & tile entities + */ + ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); + + /* Waila HUD is divided into 3 zones. The head corresponds to the item name, + * body to where you mostly want to put informations, and I reserve the tail for modname display + */ + + /* Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. + * You get in input world, player and the block location. You also get the itemstack as returned by the default lookup system or getWailaStack(). + * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the configuration. Refer the ConfigHandler class for more info. + * currenttip represents the current list of text lines in the tooltip zone. + * For example, getWailaHead() will have the current item name as currenttip. + * You can modify the tips, add more, remove some, etc. + * When you are done, just returns the currenttip and it will display in Waila. + * + * Always return the currenttip is you don't want to modify the current zone. + */ + + List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java new file mode 100644 index 000000000..935d475fa --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java @@ -0,0 +1,9 @@ +package mcp.mobius.waila.api; + +import net.minecraft.item.ItemStack; + +public interface IWailaBlockDecorator { + + void decorateBlock(ItemStack itemStack, IWailaDataAccessor accessor, IWailaConfigHandler config); + +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java new file mode 100644 index 000000000..faede63f6 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java @@ -0,0 +1,28 @@ +package mcp.mobius.waila.api; + +import java.util.HashMap; +import java.util.Set; + +public interface IWailaConfigHandler { + /* Returns a set of all the currently loaded modules in the config handler */ + public Set getModuleNames(); + + /* Returns all the currently available options for a given module */ + public HashMap getConfigKeys(String modName); + + /* Add a new option to a given module + * + * modName is the name of the module to add the option to (ie : Buildcraft, IndustrialCraft2, etc) + * key is the config key (ie : bc.tankcontent, ic2.inputvalue) + * name is the human readable name of the option (ie : "Tank content", "Max EU Input") + * */ + //public void addConfig(String modName, String key, String name); + + /* Returns the current value of an option (true/false) with a default value defvalue if not set*/ + public boolean getConfig(String key, boolean defvalue); + + /* Returns the current value of an option (true/false) with a default value true if not set*/ + public boolean getConfig(String key); + + //public void setConfig(String key, boolean value); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java new file mode 100644 index 000000000..5eade35f3 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java @@ -0,0 +1,33 @@ +package mcp.mobius.waila.api; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaDataAccessor { + + World getWorld(); + EntityPlayer getPlayer(); + Block getBlock(); + int getBlockID(); + int getMetadata(); + TileEntity getTileEntity(); + MovingObjectPosition getPosition(); + Vec3 getRenderingPosition(); + NBTTagCompound getNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); + ForgeDirection getSide(); + ItemStack getStack(); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java new file mode 100644 index 000000000..4859d9cd3 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java @@ -0,0 +1,33 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IWailaDataProvider{ + /* + * Use this method to return an item stack in case the default lookup system fails. + * Return null if you want to use the default lookup system. + * You get the world, the player and the location of the block. With that, it is easy to gather information & tile entities + */ + ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); + + /* Waila HUD is divided into 3 zones. The head corresponds to the item name, + * body to where you mostly want to put informations, and I reserve the tail for modname display + */ + + /* Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. + * You get in input world, player and the block location. You also get the itemstack as returned by the default lookup system or getWailaStack(). + * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the configuration. Refer the ConfigHandler class for more info. + * currenttip represents the current list of text lines in the tooltip zone. + * For example, getWailaHead() will have the current item name as currenttip. + * You can modify the tips, add more, remove some, etc. + * When you are done, just returns the currenttip and it will display in Waila. + * + * Always return the currenttip is you don't want to modify the current zone. + */ + + List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java new file mode 100644 index 000000000..788067afc --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java @@ -0,0 +1,24 @@ +package mcp.mobius.waila.api; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaEntityAccessor { + World getWorld(); + EntityPlayer getPlayer(); + Entity getEntity(); + MovingObjectPosition getPosition(); + Vec3 getRenderingPosition(); + NBTTagCompound getNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java new file mode 100644 index 000000000..9548289aa --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java @@ -0,0 +1,16 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.entity.Entity; + +public interface IWailaEntityProvider { + + /* A way to get an override on the entity returned by the raytracing */ + Entity getWailaOverride(IWailaEntityAccessor accessor, IWailaConfigHandler config); + + /* The classical HEAD/BODY/TAIL text getters */ + List getWailaHead(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); + List getWailaBody(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); + List getWailaTail(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java new file mode 100644 index 000000000..e30afc435 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java @@ -0,0 +1,28 @@ +package mcp.mobius.waila.api; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaFMPAccessor { + World getWorld(); + EntityPlayer getPlayer(); + TileEntity getTileEntity(); + MovingObjectPosition getPosition(); + NBTTagCompound getNBTData(); + NBTTagCompound getFullNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); + Vec3 getRenderingPosition(); + String getID(); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java new file mode 100644 index 000000000..839af31f9 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java @@ -0,0 +1,7 @@ +package mcp.mobius.waila.api; + +import net.minecraft.item.ItemStack; + +public interface IWailaFMPDecorator { + void decorateBlock(ItemStack itemStack, IWailaFMPAccessor accessor, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java new file mode 100644 index 000000000..232c83eff --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java @@ -0,0 +1,12 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IWailaFMPProvider { + /* The classical HEAD/BODY/TAIL text getters */ + List getWailaHead(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java new file mode 100644 index 000000000..833f77159 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java @@ -0,0 +1,56 @@ +package mcp.mobius.waila.api; + +public interface IWailaRegistrar { + /* Add a config option in the section modname with displayed text configtext and access key keyname */ + public void addConfig(String modname, String keyname, String configtext); + public void addConfigRemote(String modname, String keyname, String configtext); + public void addConfig(String modname, String keyname); + public void addConfigRemote(String modname, String keyname); + + /* Register a IWailaDataProvider for the given blockID, either for the Head section or the Body section */ + @Deprecated + public void registerHeadProvider (IWailaDataProvider dataProvider, int blockID); + @Deprecated + public void registerBodyProvider (IWailaDataProvider dataProvider, int blockID); + @Deprecated + public void registerTailProvider (IWailaDataProvider dataProvider, int blockID); + + /* Register a stack overrider for the given blockID */ + @Deprecated + public void registerStackProvider(IWailaDataProvider dataProvider, int blockID); + public void registerStackProvider(IWailaDataProvider dataProvider, Class block); + + /* Same thing, but works on a class hierarchy instead */ + public void registerHeadProvider (IWailaDataProvider dataProvider, Class block); + public void registerBodyProvider (IWailaDataProvider dataProvider, Class block); + public void registerTailProvider (IWailaDataProvider dataProvider, Class block); + + /* Entity text registration methods */ + public void registerHeadProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerBodyProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerTailProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerOverrideEntityProvider (IWailaEntityProvider dataProvider, Class entity); + + /* FMP Providers */ + public void registerHeadProvider(IWailaFMPProvider dataProvider, String name); + public void registerBodyProvider(IWailaFMPProvider dataProvider, String name); + public void registerTailProvider(IWailaFMPProvider dataProvider, String name); + + /* The block decorators */ + @Deprecated + public void registerDecorator (IWailaBlockDecorator decorator, int blockID); + public void registerDecorator (IWailaBlockDecorator decorator, Class block); + public void registerDecorator (IWailaFMPDecorator decorator, String name); + + /* Selective NBT key syncing. Will register a key to sync over the network for the given class (block, te or ent). + * Accept * as a ending wildcard + * registerNBTKey("bob.*", MyBlock.class) + * registerNBTKey("data.life", MyEntity.class) + * registerNBTKey("*", MyTileEntity.class) will reproduce the full tag syncing from 1.4.5 + * */ + public void registerSyncedNBTKey(String key, Class target); + + /* UNUSED FOR NOW (Will be used for the ingame wiki */ + public void registerDocTextFile (String filename); + public void registerShortDataProvider (IWailaSummaryProvider dataProvider, Class item); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java b/archaic/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java new file mode 100644 index 000000000..f79064981 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java @@ -0,0 +1,21 @@ +package mcp.mobius.waila.api; + +import java.util.LinkedHashMap; + +import net.minecraft.item.ItemStack; + +public interface IWailaSummaryProvider { + /* This interface is used to control the display data in the description screen */ + + /* BASIC TOOLS & ITEMS DATA */ + //EnumToolMaterial getMaterial(ItemStack stack); + //String getMaterialName(ItemStack stack); + //String getEffectiveBlock(ItemStack stack); + //int getHarvestLevel(ItemStack stack); + //float getEfficiencyOnProperMaterial(ItemStack stack); + //int getEnchantability(ItemStack stack); + //int getDamageVsEntity(ItemStack stack); + //int getDurability(ItemStack stack); + + LinkedHashMap getSummary(ItemStack stack, LinkedHashMap currentSummary, IWailaConfigHandler config); +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/SpecialChars.java b/archaic/src/api/java/mcp/mobius/waila/api/SpecialChars.java new file mode 100644 index 000000000..5bd92a820 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/SpecialChars.java @@ -0,0 +1,40 @@ +package mcp.mobius.waila.api; + +public class SpecialChars { + + public static String MCStyle = "\u00A7"; + + public static String BLACK = MCStyle + "0"; + public static String DBLUE = MCStyle + "1"; + public static String DGREEN = MCStyle + "2"; + public static String DAQUA = MCStyle + "3"; + public static String DRED = MCStyle + "4"; + public static String DPURPLE = MCStyle + "5"; + public static String GOLD = MCStyle + "6"; + public static String GRAY = MCStyle + "7"; + public static String DGRAY = MCStyle + "8"; + public static String BLUE = MCStyle + "9"; + public static String GREEN = MCStyle + "a"; + public static String AQUA = MCStyle + "b"; + public static String RED = MCStyle + "c"; + public static String LPURPLE = MCStyle + "d"; + public static String YELLOW = MCStyle + "e"; + public static String WHITE = MCStyle + "f"; + + public static String OBF = MCStyle + "k"; + public static String BOLD = MCStyle + "l"; + public static String STRIKE = MCStyle + "m"; + public static String UNDER = MCStyle + "n"; + public static String ITALIC = MCStyle + "o"; + public static String RESET = MCStyle + "r"; + + public static String WailaStyle = "\u00A4"; + public static String WailaIcon = "\u00A5"; + public static String TAB = WailaStyle + WailaStyle +"a"; + public static String ALIGNRIGHT = WailaStyle + WailaStyle +"b"; + public static String ALIGNCENTER = WailaStyle + WailaStyle +"c"; + public static String HEART = WailaStyle + WailaIcon +"a"; + public static String HHEART = WailaStyle + WailaIcon +"b"; + public static String EHEART = WailaStyle + WailaIcon +"c"; + +} diff --git a/archaic/src/api/java/mcp/mobius/waila/api/package-info.java b/archaic/src/api/java/mcp/mobius/waila/api/package-info.java new file mode 100644 index 000000000..9b5e663b4 --- /dev/null +++ b/archaic/src/api/java/mcp/mobius/waila/api/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0",owner="Waila",provides="WailaAPI") +package mcp.mobius.waila.api; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/archaic/src/main/scala/resonantinduction/archaic/Archaic.java b/archaic/src/main/scala/resonantinduction/archaic/Archaic.java index 44037c760..7b4a7a4e5 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/Archaic.java +++ b/archaic/src/main/scala/resonantinduction/archaic/Archaic.java @@ -1,25 +1,16 @@ package resonantinduction.archaic; -import calclavia.lib.content.ContentRegistry; -import calclavia.lib.network.PacketAnnotation; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.item.ItemBlockMetadata; -import calclavia.lib.recipe.UniversalRecipe; -import cpw.mods.fml.common.Mod; -import cpw.mods.fml.common.Mod.EventHandler; -import cpw.mods.fml.common.Mod.Instance; -import cpw.mods.fml.common.ModMetadata; -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.NetworkRegistry; -import cpw.mods.fml.common.registry.GameRegistry; import net.minecraft.block.Block; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.ShapedOreRecipe; +import resonant.lib.content.ContentRegistry; +import resonant.lib.modproxy.ProxyHandler; +import resonant.lib.network.PacketAnnotation; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.item.ItemBlockMetadata; +import resonant.lib.recipe.UniversalRecipe; import resonantinduction.archaic.blocks.TileTurntable; import resonantinduction.archaic.crate.BlockCrate; import resonantinduction.archaic.crate.ItemBlockCrate; @@ -40,120 +31,142 @@ import resonantinduction.archaic.process.BlockCastingMold; import resonantinduction.archaic.process.BlockMillstone; import resonantinduction.archaic.process.TileCastingMold; import resonantinduction.archaic.process.TileMillstone; +import resonantinduction.archaic.waila.Waila; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.Settings; import resonantinduction.core.TabRI; import resonantinduction.core.prefab.imprint.ItemImprint; import resonantinduction.core.resource.ItemHandCrank; +import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.Mod.EventHandler; +import cpw.mods.fml.common.Mod.Instance; +import cpw.mods.fml.common.ModMetadata; +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.NetworkRegistry; +import cpw.mods.fml.common.registry.GameRegistry; -/** - * Resonant Induction Archaic Module - * - * @author DarkCow, Calclavia - */ +/** Resonant Induction Archaic Module + * + * @author DarkCow, Calclavia */ @Mod(modid = Archaic.ID, name = Archaic.NAME, version = Reference.VERSION, dependencies = "required-after:" + ResonantInduction.ID) @NetworkMod(channels = Reference.CHANNEL, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class) public class Archaic { - /** - * Mod Information - */ - public static final String ID = "ResonantInduction|Archaic"; - public static final String NAME = Reference.NAME + " Archaic"; - public static final ContentRegistry contentRegistry = new ContentRegistry(Settings.CONFIGURATION, Settings.idManager, ID).setPrefix(Reference.PREFIX).setTab(TabRI.DEFAULT); - @Instance(ID) - public static Archaic INSTANCE; - @SidedProxy(clientSide = "resonantinduction.archaic.ClientProxy", serverSide = "resonantinduction.archaic.CommonProxy") - public static CommonProxy proxy; - @Mod.Metadata(ID) - public static ModMetadata metadata; - public static Block blockEngineeringTable; - public static Block blockCrate; - public static Block blockImprinter; - public static Block blockTurntable; - public static Block blockFirebox; - public static Block blockHotPlate; - public static Block blockMillstone; - public static Block blockCast; - public static Item itemImprint; + /** Mod Information */ + public static final String ID = "ResonantInduction|Archaic"; + public static final String NAME = Reference.NAME + " Archaic"; + public static final ContentRegistry contentRegistry = new ContentRegistry(Settings.CONFIGURATION, Settings.idManager, ID).setPrefix(Reference.PREFIX).setTab(TabRI.DEFAULT); + @Instance(ID) + public static Archaic INSTANCE; + @SidedProxy(clientSide = "resonantinduction.archaic.ClientProxy", serverSide = "resonantinduction.archaic.CommonProxy") + public static CommonProxy proxy; + @Mod.Metadata(ID) + public static ModMetadata metadata; + public static Block blockEngineeringTable; + public static Block blockCrate; + public static Block blockImprinter; + public static Block blockTurntable; + public static Block blockFirebox; + public static Block blockHotPlate; + public static Block blockMillstone; + public static Block blockCast; + public static Item itemImprint; - // Machine and Processing - public static Item itemHammer; - public static Item itemHandCrank; - public static Block blockFilter; + // Machine and Processing + public static Item itemHammer; + public static Item itemHandCrank; + public static Block blockFilter; - // Fluid - public static Block blockGrate; - public static Block blockGutter; - public static Block blockTank; + // Fluid + public static Block blockGrate; + public static Block blockGutter; + public static Block blockTank; - @EventHandler - public void preInit(FMLPreInitializationEvent evt) - { - NetworkRegistry.instance().registerGuiHandler(this, proxy); - Settings.CONFIGURATION.load(); - blockEngineeringTable = contentRegistry.newBlock(TileEngineeringTable.class); - blockCrate = contentRegistry.createBlock(BlockCrate.class, ItemBlockCrate.class, TileCrate.class); - blockImprinter = contentRegistry.createTile(BlockImprinter.class, TileImprinter.class); - blockTurntable = contentRegistry.newBlock(TileTurntable.class); - blockFirebox = contentRegistry.createBlock(BlockFirebox.class, ItemBlockMetadata.class, TileFirebox.class); - blockHotPlate = contentRegistry.createTile(BlockHotPlate.class, TileHotPlate.class); - blockMillstone = contentRegistry.createTile(BlockMillstone.class, TileMillstone.class); - blockCast = contentRegistry.createTile(BlockCastingMold.class, TileCastingMold.class); - blockGutter = contentRegistry.newBlock(TileGutter.class); - blockGrate = contentRegistry.newBlock(TileGrate.class); - blockFilter = contentRegistry.newBlock(TileFilter.class); - blockTank = contentRegistry.newBlock(TileTank.class); + public ProxyHandler modproxies; - itemHandCrank = contentRegistry.createItem(ItemHandCrank.class); - itemImprint = contentRegistry.createItem(ItemImprint.class); - itemHammer = contentRegistry.createItem(ItemHammer.class); + @EventHandler + public void preInit(FMLPreInitializationEvent evt) + { + modproxies = new ProxyHandler(); + NetworkRegistry.instance().registerGuiHandler(this, proxy); + Settings.CONFIGURATION.load(); + blockEngineeringTable = contentRegistry.newBlock(TileEngineeringTable.class); + blockCrate = contentRegistry.createBlock(BlockCrate.class, ItemBlockCrate.class, TileCrate.class); + blockImprinter = contentRegistry.createTile(BlockImprinter.class, TileImprinter.class); + blockTurntable = contentRegistry.newBlock(TileTurntable.class); + blockFirebox = contentRegistry.createBlock(BlockFirebox.class, ItemBlockMetadata.class, TileFirebox.class); + blockHotPlate = contentRegistry.createTile(BlockHotPlate.class, TileHotPlate.class); + blockMillstone = contentRegistry.createTile(BlockMillstone.class, TileMillstone.class); + blockCast = contentRegistry.createTile(BlockCastingMold.class, TileCastingMold.class); + blockGutter = contentRegistry.newBlock(TileGutter.class); + blockGrate = contentRegistry.newBlock(TileGrate.class); + blockFilter = contentRegistry.newBlock(TileFilter.class); + blockTank = contentRegistry.newBlock(TileTank.class); - proxy.preInit(); - Settings.CONFIGURATION.save(); + itemHandCrank = contentRegistry.createItem(ItemHandCrank.class); + itemImprint = contentRegistry.createItem(ItemImprint.class); + itemHammer = contentRegistry.createItem(ItemHammer.class); - PacketAnnotation.register(TileFirebox.class); - PacketAnnotation.register(TileFilter.class); - proxy.preInit(); - } + modproxies.applyModule(Waila.class, true); + Settings.CONFIGURATION.save(); - @EventHandler - public void init(FMLInitializationEvent evt) - { - Settings.setModMetadata(metadata, ID, NAME, ResonantInduction.ID); - proxy.init(); - } + PacketAnnotation.register(TileFirebox.class); + PacketAnnotation.register(TileFilter.class); + proxy.preInit(); + modproxies.preInit(); + } - @EventHandler - public void postInit(FMLPostInitializationEvent evt) - { - TabRI.ITEMSTACK = new ItemStack(blockEngineeringTable); + @EventHandler + public void init(FMLInitializationEvent evt) + { + Settings.setModMetadata(metadata, ID, NAME, ResonantInduction.ID); + proxy.init(); + modproxies.init(); + } - // Add recipes - GameRegistry.addRecipe(new ShapedOreRecipe(blockEngineeringTable, "P", "C", 'P', Block.pressurePlatePlanks, 'C', Block.workbench)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockFilter, "B", "P", "B", 'B', Block.fenceIron, 'P', Item.paper)); + @EventHandler + public void postInit(FMLPostInitializationEvent evt) + { + TabRI.ITEMSTACK = new ItemStack(blockEngineeringTable); + if (OreDictionary.getOres("cobblestone") == null) + { + OreDictionary.registerOre("cobblestone", Block.cobblestone); + } + if (OreDictionary.getOres("stickWood") == null) + { + OreDictionary.registerOre("stickWood", Item.stick); + } - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 0), "WWW", "WSW", "WWW", 'S', Item.stick, 'W', "logWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 1), "WWW", "WSW", "WWW", 'S', new ItemStack(blockCrate, 1, 0), 'W', "ingotIron")); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 2), "WWW", "WSW", "WWW", 'S', new ItemStack(blockCrate, 1, 1), 'W', UniversalRecipe.PRIMARY_METAL.get())); + // Add recipes + GameRegistry.addRecipe(new ShapedOreRecipe(blockEngineeringTable, "P", "C", 'P', Block.pressurePlatePlanks, 'C', Block.workbench)); + GameRegistry.addRecipe(new ShapedOreRecipe(blockFilter, "B", "P", "B", 'B', Block.fenceIron, 'P', Item.paper)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockFirebox, "III", "SFS", "SSS", 'I', Item.ingotIron, 'F', Block.furnaceIdle, 'S', Block.stone)); - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockFirebox, 1, 1), "III", "SFS", "SSS", 'I', UniversalRecipe.PRIMARY_METAL.get(), 'F', new ItemStack(blockFirebox, 1, 0), 'S', UniversalRecipe.WIRE.get())); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 0), "WWW", "WSW", "WWW", 'S', "stickWood", 'W', "logWood")); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 1), "WWW", "WSW", "WWW", 'S', new ItemStack(blockCrate, 1, 0), 'W', "ingotIron")); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockCrate, 1, 2), "WWW", "WSW", "WWW", 'S', new ItemStack(blockCrate, 1, 1), 'W', UniversalRecipe.PRIMARY_METAL.get())); - GameRegistry.addRecipe(new ShapedOreRecipe(blockImprinter, "SSS", "W W", "PPP", 'S', Block.stone, 'P', Block.pistonBase, 'W', "logWood")); + GameRegistry.addRecipe(new ShapedOreRecipe(blockFirebox, "III", "SFS", "SSS", 'I', Item.ingotIron, 'F', Block.furnaceIdle, 'S', Block.stone)); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(blockFirebox, 1, 1), "III", "SFS", "SSS", 'I', UniversalRecipe.PRIMARY_METAL.get(), 'F', new ItemStack(blockFirebox, 1, 0), 'S', UniversalRecipe.WIRE.get())); - GameRegistry.addRecipe(new ShapedOreRecipe(blockTurntable, "SSS", "PGP", "WWW", 'S', Block.stone, 'G', Item.redstone, 'P', Block.pistonBase, 'W', "logWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(blockCast, "I I", "IBI", "III", 'S', Item.ingotIron, 'B', Block.fenceIron)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockGutter, "S S", "I I", "III", 'S', Item.stick, 'I', Block.cobblestone)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockGrate, "WBW", "B B", "WBW", 'B', Block.fenceIron, 'W', "plankWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(blockHotPlate, "SSS", "III", 'I', Item.ingotIron, 'S', Block.stone)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockMillstone, "SPS", "SAS", "SSS", 'P', Block.pistonBase, 'A', Item.pickaxeStone, 'S', Block.stone)); - GameRegistry.addRecipe(new ShapedOreRecipe(blockTank, "GGG", "GSG", "GGG", 'G', Block.glass, 'S', Item.ingotIron)); + GameRegistry.addRecipe(new ShapedOreRecipe(blockImprinter, "SSS", "W W", "PPP", 'S', Block.stone, 'P', Block.pistonBase, 'W', "logWood")); - GameRegistry.addRecipe(new ShapedOreRecipe(itemHandCrank, "S ", "SSS", " S", 'S', Item.stick)); - GameRegistry.addRecipe(new ShapedOreRecipe(itemImprint, "PPP", "PIP", "PPP", 'P', Item.paper, 'I', new ItemStack(Item.dyePowder, 0))); - GameRegistry.addRecipe(new ShapedOreRecipe(itemHammer, "CC ", "CS ", " S", 'C', Block.cobblestone, 'S', Item.stick)); - proxy.postInit(); - } + GameRegistry.addRecipe(new ShapedOreRecipe(blockTurntable, "SSS", "PGP", "WWW", 'S', Block.stone, 'G', Item.redstone, 'P', Block.pistonBase, 'W', "logWood")); + GameRegistry.addRecipe(new ShapedOreRecipe(blockCast, "I I", "IBI", "III", 'S', Item.ingotIron, 'B', Block.fenceIron)); + GameRegistry.addRecipe(new ShapedOreRecipe(blockGutter, "S S", "I I", "III", 'S', Item.stick, 'I', "cobblestone")); + GameRegistry.addRecipe(new ShapedOreRecipe(blockGrate, "WBW", "B B", "WBW", 'B', Block.fenceIron, 'W', "plankWood")); + GameRegistry.addRecipe(new ShapedOreRecipe(blockHotPlate, "SSS", "III", 'I', Item.ingotIron, 'S', Block.stone)); + GameRegistry.addRecipe(new ShapedOreRecipe(blockMillstone, "SPS", "SAS", "SSS", 'P', Block.pistonBase, 'A', Item.pickaxeStone, 'S', Block.stone)); + GameRegistry.addRecipe(new ShapedOreRecipe(blockTank, "GGG", "GSG", "GGG", 'G', Block.glass, 'S', Item.ingotIron)); + + GameRegistry.addRecipe(new ShapedOreRecipe(itemHandCrank, "S ", "SSS", " S", 'S', "stickWood")); + GameRegistry.addRecipe(new ShapedOreRecipe(itemImprint, "PPP", "PIP", "PPP", 'P', Item.paper, 'I', new ItemStack(Item.dyePowder, 0))); + GameRegistry.addRecipe(new ShapedOreRecipe(itemHammer, "CC ", "CS ", " S", 'C', "cobblestone", 'S', "stickWood")); + proxy.postInit(); + modproxies.postInit(); + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/CommonProxy.java b/archaic/src/main/scala/resonantinduction/archaic/CommonProxy.java index 805cbfecc..0e02ddc7b 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/CommonProxy.java +++ b/archaic/src/main/scala/resonantinduction/archaic/CommonProxy.java @@ -1,6 +1,6 @@ package resonantinduction.archaic; -import calclavia.lib.prefab.ProxyBase; +import resonant.lib.prefab.ProxyBase; public class CommonProxy extends ProxyBase { diff --git a/archaic/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala b/archaic/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala index 9416d7de8..b71bdbe0c 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala +++ b/archaic/src/main/scala/resonantinduction/archaic/blocks/TileTurntable.scala @@ -1,5 +1,7 @@ package resonantinduction.archaic.blocks +import codechicken.multipart.TileMultipart +import cpw.mods.fml.relauncher.SideOnly import net.minecraft.block.Block import net.minecraft.block.material.Material import net.minecraft.client.renderer.texture.IconRegister @@ -8,110 +10,92 @@ import net.minecraft.util.Icon import net.minecraft.world.IBlockAccess import net.minecraft.world.World import net.minecraftforge.common.ForgeDirection +import resonant.api.IRotatable +import resonant.api.blocks.IRotatableBlock +import resonant.api.blocks.IRotatableBlock +import resonant.lib.content.module.TileBlock +import resonant.lib.content.module.TileRender +import resonant.lib.render.RotatedTextureRenderer import resonantinduction.core.Reference import universalelectricity.api.vector.Vector3 -import calclavia.lib.prefab.block.IRotatableBlock -import calclavia.lib.prefab.tile.IRotatable -import codechicken.multipart.TileMultipart import cpw.mods.fml.relauncher.Side -import cpw.mods.fml.relauncher.SideOnly -import calclavia.lib.content.module.{TileRender, TileBlock} -import calclavia.lib.render.RotatedTextureRenderer -class TileTurntable extends TileBlock(Material.piston) with IRotatable -{ +class TileTurntable extends TileBlock(Material.piston) with IRotatable { textureName = "turntable_side" tickRandomly = true rotationMask = Integer.parseInt("111111", 2).toByte override def tickRate(par1World: World): Int = - { - return 5 - } + { + return 5 + } - @SideOnly(Side.CLIENT) override def registerIcons(iconReg: IconRegister) - { + @SideOnly(Side.CLIENT) override def registerIcons(iconReg: IconRegister) { super.registerIcons(iconReg) TileTurntable.top = iconReg.registerIcon(Reference.PREFIX + "turntable") } - override def updateEntity() - { + override def updateEntity() { updateTurntableState(world, x, y, z) } @SideOnly(Side.CLIENT) override def getIcon(access: IBlockAccess, side: Int): Icon = - { - if (side == super.metadata()) { - return TileTurntable.top - } + if (side == super.metadata()) { + return TileTurntable.top + } - return getIcon - } + return getIcon + } @SideOnly(Side.CLIENT) override def getIcon(side: Int, meta: Int): Icon = - { - if (side == 1) { - return TileTurntable.top + if (side == 1) { + return TileTurntable.top + } + return getIcon } - return getIcon - } - override def onNeighborChanged() - { + override def onNeighborChanged() { scheduelTick(10) } - private def updateTurntableState(world: World, x: Int, y: Int, z: Int) - { - if (world.isBlockIndirectlyGettingPowered(x, y, z)) - { - try - { + private def updateTurntableState(world: World, x: Int, y: Int, z: Int) { + if (world.isBlockIndirectlyGettingPowered(x, y, z)) { + try { val facing: ForgeDirection = ForgeDirection.getOrientation(world.getBlockMetadata(x, y, z)) val position: Vector3 = new Vector3(x, y, z).translate(facing) val tileEntity: TileEntity = position.getTileEntity(world) val block: Block = Block.blocksList(position.getBlockID(world)) - if (!(tileEntity.isInstanceOf[TileMultipart])) - { - if (tileEntity.isInstanceOf[IRotatable]) - { + if (!(tileEntity.isInstanceOf[TileMultipart])) { + if (tileEntity.isInstanceOf[IRotatable]) { val blockRotation: ForgeDirection = (tileEntity.asInstanceOf[IRotatable]).getDirection (tileEntity.asInstanceOf[IRotatable]).setDirection(blockRotation.getRotation(facing.getOpposite)) - } - else if (block.isInstanceOf[IRotatableBlock]) - { + } else if (block.isInstanceOf[IRotatableBlock]) { val blockRotation: ForgeDirection = (block.asInstanceOf[IRotatableBlock]).getDirection(world, position.intX, position.intY, position.intZ) (block.asInstanceOf[IRotatableBlock]).setDirection(world, position.intX, position.intY, position.intZ, blockRotation.getRotation(facing.getOpposite)) - } - else if (block != null) - { + } else if (block != null) { Block.blocksList(blockID).rotateBlock(world, position.intX, position.intY, position.intZ, facing.getOpposite) } world.markBlockForUpdate(position.intX, position.intY, position.intZ) world.playSoundEffect(x + 0.5D, y + 0.5D, z + 0.5D, "tile.piston.in", 0.5F, world.rand.nextFloat * 0.15F + 0.6F) } - } - catch - { - case e: Exception => + } catch { + case e: Exception => { System.out.println("Error while rotating a block near " + x + "x " + y + "y " + z + "z " + (if (world != null && world.provider != null) world.provider.dimensionId + "d" else "null:world")) e.printStackTrace } - } + } } } @SideOnly(Side.CLIENT) protected override def newRenderer: TileRender = - { - return new RotatedTextureRenderer(this) - } + { + return new RotatedTextureRenderer(this) + } } -object TileTurntable -{ +object TileTurntable { var top: Icon = null } \ No newline at end of file diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/BlockCrate.java b/archaic/src/main/scala/resonantinduction/archaic/crate/BlockCrate.java index b167011ae..43104b190 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/BlockCrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/crate/BlockCrate.java @@ -10,437 +10,418 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatMessageComponent; import net.minecraft.util.Icon; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.utility.WrenchUtility; import codechicken.multipart.ControlKeyModifer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -/** - * A block that allows the placement of mass amount of a specific item within it. It will be allowed +/** A block that allows the placement of mass amount of a specific item within it. It will be allowed * to go on Conveyor Belts. * * NOTE: Crates should be upgraded with an item. * - * @author DarkGuardsman - */ + * @author DarkGuardsman */ public class BlockCrate extends BlockTile { - Icon advanced, elite; + Icon advanced, elite; - public BlockCrate(int id) - { - super(id, UniversalElectricity.machine); - } + public BlockCrate(int id) + { + super(id, UniversalElectricity.machine); + } - @SideOnly(Side.CLIENT) - @Override - public void registerIcons(IconRegister iconReg) - { - this.blockIcon = iconReg.registerIcon(Reference.PREFIX + "crate_wood"); - this.advanced = iconReg.registerIcon(Reference.PREFIX + "crate_iron"); - this.elite = iconReg.registerIcon(Reference.PREFIX + "crate_steel"); - } + @SideOnly(Side.CLIENT) + @Override + public void registerIcons(IconRegister iconReg) + { + this.blockIcon = iconReg.registerIcon(Reference.PREFIX + "crate_wood"); + this.advanced = iconReg.registerIcon(Reference.PREFIX + "crate_iron"); + this.elite = iconReg.registerIcon(Reference.PREFIX + "crate_steel"); + } - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) - { - if (meta == 1) - { - return advanced; - } - else if (meta == 2) - { - return elite; - } - return this.blockIcon; - } + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(int side, int meta) + { + if (meta == 1) + { + return advanced; + } + else if (meta == 2) + { + return elite; + } + return this.blockIcon; + } - @Override - public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) - { - if (!world.isRemote) - { - if (world.getBlockTileEntity(x, y, z) instanceof TileCrate) - { - TileCrate tileEntity = (TileCrate) world.getBlockTileEntity(x, y, z); + @Override + public void onBlockClicked(World world, int x, int y, int z, EntityPlayer player) + { + if (!world.isRemote && world.getBlockTileEntity(x, y, z) instanceof TileCrate) + { + TileCrate tileEntity = (TileCrate) world.getBlockTileEntity(x, y, z); + this.tryEject(tileEntity, player, world.getWorldTime() - tileEntity.prevClickTime < 10); + tileEntity.prevClickTime = world.getWorldTime(); + } + } - /** Make double clicking input all stacks. */ - boolean allMode = (world.getWorldTime() - tileEntity.prevClickTime < 10); + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote && world.getBlockTileEntity(x, y, z) instanceof TileCrate) + { + TileCrate tile = (TileCrate) world.getBlockTileEntity(x, y, z); + tile.buildSampleStack(); + ItemStack sampleStack = tile.getSampleStack(); + int oreID = OreDictionary.getOreID(sampleStack); - tileEntity.prevClickTime = world.getWorldTime(); + if (ControlKeyModifer.isControlDown(player)) + { + tile.oreFilterEnabled = !tile.oreFilterEnabled; + player.sendChatToPlayer(ChatMessageComponent.createFromText(LanguageUtility.getLocal("crate.orefilter." + tile.oreFilterEnabled))); + } + else if (oreID != -1) + { + /* Switches ore itemStack around */ + ArrayList ores = OreDictionary.getOres(oreID); - this.tryEject(tileEntity, player, allMode); - } + for (int oreIndex = 0; oreIndex < ores.size(); oreIndex++) + { + if (ores.get(oreIndex).isItemEqual(sampleStack)) + { + int nextIndex = (oreIndex + 1) % ores.size(); + ItemStack desiredStack = ores.get(nextIndex).copy(); + desiredStack.stackSize = sampleStack.stackSize; - } - } + for (int index = 0; index < tile.getSizeInventory(); index++) + tile.setInventorySlotContents(index, null); - /** Placed the item the player is holding into the crate. */ - @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) - { - if (!world.isRemote) - { - if (world.getBlockTileEntity(x, y, z) instanceof TileCrate) - { - TileCrate tile = (TileCrate) world.getBlockTileEntity(x, y, z); + tile.addStackToStorage(desiredStack); + break; + } + } + } + } + return true; + } - if (player.getCurrentEquippedItem() != null && WrenchUtility.isWrench(player.getCurrentEquippedItem())) - { - if (player.isSneaking()) - { - ItemStack containingStack = tile.getSampleStack(); - tile.buildSampleStack(); + @Override + public boolean onSneakUseWrench(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote && world.getBlockTileEntity(x, y, z) instanceof TileCrate) + { + TileCrate tile = (TileCrate) world.getBlockTileEntity(x, y, z); + tile.buildSampleStack(); + ItemStack sampleStack = tile.getSampleStack(); - if (containingStack != null) - { - if (containingStack.stackSize > 0) - { - float area = 0.7F; - double dropX = (world.rand.nextFloat() * area) + (1.0F - area) * 0.5D; - double dropY = (world.rand.nextFloat() * area) + (1.0F - area) * 0.5D; - double dropZ = (world.rand.nextFloat() * area) + (1.0F - area) * 0.5D; + if (sampleStack != null && sampleStack.stackSize > 0) + { + ItemStack dropStack = new ItemStack(this, 1, world.getBlockMetadata(x, y, z)); + ItemBlockCrate.setContainingItemStack(dropStack, sampleStack); + InventoryUtility.dropItemStack(world, x, y, z, dropStack, 10, 0); - ItemStack dropStack = new ItemStack(this, 1, tile.getBlockMetadata()); - ItemBlockCrate.setContainingItemStack(dropStack, containingStack); + for (int i = 0; i < tile.getInventory().getSizeInventory(); i++) + { + tile.getInventory().setInventorySlotContents(i, null); + } + world.setBlock(x, y, z, 0, 0, 3); + } + } + return true; + } - EntityItem var13 = new EntityItem(world, x + dropX, y + dropY, z + dropZ, dropStack); - var13.delayBeforeCanPickup = 10; - world.spawnEntityInWorld(var13); + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + { + if (!world.isRemote && world.getBlockTileEntity(x, y, z) instanceof TileCrate) + { + TileCrate tile = (TileCrate) world.getBlockTileEntity(x, y, z); - for (int i = 0; i < tile.getInventory().getSizeInventory(); i++) - { - tile.getInventory().setInventorySlotContents(i, null); - } - world.setBlock(x, y, z, 0, 0, 3); - return true; - } - } + if (ControlKeyModifer.isControlDown(player)) + { + if (player.getCurrentEquippedItem() != null && (!player.getCurrentEquippedItem().getItem().isDamageable() || player.getCurrentEquippedItem().getItem().getDamage(player.getCurrentEquippedItem()) > 0)) + { + ItemStack filter = player.getCurrentEquippedItem().copy(); + filter.stackSize = 0; + tile.setFilter(filter); + } + else + { + tile.setFilter(null); + } + } + else + { + /* Creative mode way to fill crates to max in one click */ + ItemStack current = player.inventory.getCurrentItem(); + if (player.capabilities.isCreativeMode) + { + if (side == 1 && current != null && tile.getSampleStack() == null) + { + ItemStack cStack = current.copy(); + cStack.stackSize = TileCrate.getSlotCount(world.getBlockMetadata(x, y, z)) * 64; + addStackToCrate(tile, cStack); + } + else if (hitY >= 0.5) + { + tryEject(tile, player, world.getWorldTime() - tile.prevClickTime < 10); + } + } + else + { + tryInsert(tile, player, world.getWorldTime() - tile.prevClickTime < 10); + } - return false; - } + } + tile.prevClickTime = world.getWorldTime(); + } + return true; + } - /** - * Swap oredict nodes if the player is wrenching the crate. - */ - ItemStack sampleStack = tile.getSampleStack(); + /** Try to inject it into the crate. Otherwise, look around for nearby crates and try to put them + * in. */ + public void tryInsert(TileCrate tileEntity, EntityPlayer player, boolean allMode, boolean doSearch) + { + boolean success = allMode ? this.insertAllItems(tileEntity, player) : this.insertCurrentItem(tileEntity, player); - int oreID = OreDictionary.getOreID(sampleStack); + if (!success && doSearch) + { + PathfinderCrate pathfinder = new PathfinderCrate().init(tileEntity); - if (oreID != -1) - { - ArrayList ores = OreDictionary.getOres(oreID); + for (TileEntity checkTile : pathfinder.iteratedNodes) + { + if (checkTile instanceof TileCrate) + { + this.tryInsert(((TileCrate) checkTile), player, allMode, false); + } + } + } + } - for (int i = 0; i < ores.size(); i++) - { - if (ores.get(i).isItemEqual(sampleStack)) - { - int nextIndex = (i + 1) % ores.size(); - ItemStack desiredStack = ores.get(nextIndex).copy(); - desiredStack.stackSize = sampleStack.stackSize; + public void tryInsert(TileCrate tileEntity, EntityPlayer player, boolean allMode) + { + tryInsert(tileEntity, player, allMode, true); + } - for (int index = 0; index < tile.getSizeInventory(); index++) - tile.setInventorySlotContents(index, null); + public void tryEject(TileCrate tileEntity, EntityPlayer player, boolean allMode) + { + if (tileEntity.getSampleStack() == null) + { + return; + } + if (allMode && !player.isSneaking()) + { + this.ejectItems(tileEntity, player, tileEntity.getSlotCount() * 64); + } + else + { + if (player.isSneaking()) + { + this.ejectItems(tileEntity, player, 1); + } + else + { + this.ejectItems(tileEntity, player, tileEntity.getSampleStack().getMaxStackSize()); + } + } + } - tile.addStackToStorage(desiredStack); - break; - } - } - } - } + /** Inserts a the itemStack the player is holding into the crate. */ + public boolean insertCurrentItem(TileCrate tileEntity, EntityPlayer player) + { + ItemStack currentStack = player.getCurrentEquippedItem(); - /** Make double clicking input all stacks. */ - boolean allMode = (world.getWorldTime() - tile.prevClickTime < 10); + if (currentStack != null) + { + if (currentStack.getItem().itemID == blockID) + { + ItemStack containedStack = ItemBlockCrate.getContainingItemStack(currentStack); + ItemStack crateStack = tileEntity.getSampleStack(); - tile.prevClickTime = world.getWorldTime(); + if (containedStack != null && (crateStack == null || ItemStack.areItemStacksEqual(containedStack, crateStack))) + { + ItemStack returned = BlockCrate.addStackToCrate(tileEntity, containedStack); + ItemBlockCrate.setContainingItemStack(currentStack, returned); + return true; + } + } + else + { + if (tileEntity.getSampleStack() != null) + { + if (!(tileEntity.getSampleStack().isItemEqual(currentStack) || (tileEntity.oreFilterEnabled && !OreDictionary.getOreName(OreDictionary.getOreID(tileEntity.getSampleStack())).equals("Unknown") && OreDictionary.getOreID(tileEntity.getSampleStack()) == OreDictionary.getOreID(currentStack)))) + { + return false; + } + } - if (ControlKeyModifer.isControlDown(player)) - { - tryEject(tile, player, allMode); - } - else - { - ItemStack current = player.inventory.getCurrentItem(); - if (side == 1 && player.capabilities.isCreativeMode) - { - if (current != null && tile.getSampleStack() == null) - { - ItemStack cStack = current.copy(); - cStack.stackSize = TileCrate.getSlotCount(world.getBlockMetadata(x, y, z)) * 64; - addStackToCrate(tile, cStack); - } - } + player.inventory.setInventorySlotContents(player.inventory.currentItem, BlockCrate.addStackToCrate(tileEntity, currentStack)); + return true; + } + } - tryInsert(tile, player, allMode); - } - } - } + return false; + } - return true; - } + /** Inserts all items of the same type this player has into the crate. + * + * @return True on success */ + public boolean insertAllItems(TileCrate tileEntity, EntityPlayer player) + { + ItemStack requestStack = null; - /** - * Try to inject it into the crate. Otherwise, look around for nearby crates and try to put them - * in. - */ - public void tryInsert(TileCrate tileEntity, EntityPlayer player, boolean allMode, boolean doSearch) - { - boolean success; + if (tileEntity.getSampleStack() != null) + { + requestStack = tileEntity.getSampleStack().copy(); + } - if (allMode) - { - success = this.insertAllItems(tileEntity, player); - } - else - { - success = this.insertCurrentItem(tileEntity, player); - } + if (requestStack == null) + { + requestStack = player.getCurrentEquippedItem(); + } - if (!success && doSearch) - { - PathfinderCrate pathfinder = new PathfinderCrate().init(tileEntity); + if (requestStack != null && requestStack.itemID != this.blockID) + { + boolean success = false; - for (TileEntity checkTile : pathfinder.iteratedNodes) - { - if (checkTile instanceof TileCrate) - { - this.tryInsert(((TileCrate) checkTile), player, allMode, false); - } - } - } - } + for (int i = 0; i < player.inventory.getSizeInventory(); i++) + { + ItemStack currentStack = player.inventory.getStackInSlot(i); - public void tryInsert(TileCrate tileEntity, EntityPlayer player, boolean allMode) - { - tryInsert(tileEntity, player, allMode, true); - } + if (currentStack != null) + { + if (requestStack.isItemEqual(currentStack)) + { + player.inventory.setInventorySlotContents(i, BlockCrate.addStackToCrate(tileEntity, currentStack)); - public void tryEject(TileCrate tileEntity, EntityPlayer player, boolean allMode) - { - if (tileEntity.getSampleStack() == null) - { - return; - } - if (allMode && !player.isSneaking()) - { - this.ejectItems(tileEntity, player, tileEntity.getSlotCount() * 64); - } - else - { - if (player.isSneaking()) - { - this.ejectItems(tileEntity, player, 1); - } - else - { - this.ejectItems(tileEntity, player, tileEntity.getSampleStack().getMaxStackSize()); - } - } - } + if (player instanceof EntityPlayerMP) + { + ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); + } - /** Inserts a the itemStack the player is holding into the crate. */ - public boolean insertCurrentItem(TileCrate tileEntity, EntityPlayer player) - { - ItemStack currentStack = player.getCurrentEquippedItem(); + success = true; + } + } + } + return success; + } + return false; + } - if (currentStack != null) - { - if (currentStack.getItem().itemID == blockID) - { - ItemStack containedStack = ItemBlockCrate.getContainingItemStack(currentStack); - ItemStack crateStack = tileEntity.getSampleStack(); + /** Ejects and item out of the crate and spawn it under the player entity. + * + * @param tileEntity + * @param player + * @param requestSize - The maximum stack size to take out. Default should be 64. + * @return True on success */ + public boolean ejectItems(TileCrate tileEntity, EntityPlayer player, int requestSize) + { + World world = tileEntity.worldObj; + if (!world.isRemote) + { + ItemStack sampleStack = tileEntity.getSampleStack(); + int ammountEjected = 0; + if (sampleStack != null && requestSize > 0) + { + for (int slot = 0; slot < tileEntity.getInventory().getSizeInventory(); slot++) + { + ItemStack slotStack = tileEntity.getInventory().getStackInSlot(slot); - if (containedStack != null && (crateStack == null || ItemStack.areItemStacksEqual(containedStack, crateStack))) - { - ItemStack returned = BlockCrate.addStackToCrate(tileEntity, containedStack); - ItemBlockCrate.setContainingItemStack(currentStack, returned); - return true; - } - } - else - { - if (tileEntity.getSampleStack() != null) - { - if (!(tileEntity.getSampleStack().isItemEqual(currentStack) || (!OreDictionary.getOreName(OreDictionary.getOreID(tileEntity.getSampleStack())).equals("Unknown") && OreDictionary.getOreID(tileEntity.getSampleStack()) == OreDictionary.getOreID(currentStack)))) - { - return false; - } - } + if (slotStack != null && slotStack.stackSize > 0) + { + int amountToTake = Math.min(slotStack.stackSize, requestSize); - player.inventory.setInventorySlotContents(player.inventory.currentItem, BlockCrate.addStackToCrate(tileEntity, currentStack)); - return true; - } - } + ItemStack dropStack = slotStack.copy(); + dropStack.stackSize = amountToTake; - return false; - } + EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, dropStack); + entityItem.delayBeforeCanPickup = 0; + world.spawnEntityInWorld(entityItem); - /** - * Inserts all items of the same type this player has into the crate. - * - * @return True on success - */ - public boolean insertAllItems(TileCrate tileEntity, EntityPlayer player) - { - ItemStack requestStack = null; + slotStack.stackSize -= amountToTake; + ammountEjected += amountToTake; + if (slotStack.stackSize <= 0) + { + slotStack = null; + } + tileEntity.getInventory().setInventorySlotContents(slot, slotStack); - if (tileEntity.getSampleStack() != null) - { - requestStack = tileEntity.getSampleStack().copy(); - } + } + if (ammountEjected >= requestSize) + { + return true; + } + } + tileEntity.onInventoryChanged(); + return true; + } + } + return false; + } - if (requestStack == null) - { - requestStack = player.getCurrentEquippedItem(); - } + /** Puts an itemStack into the crate. + * + * @param tileEntity + * @param itemStack */ + public static ItemStack addStackToCrate(TileCrate tileEntity, ItemStack itemStack) + { + if (itemStack == null || itemStack.getItem().isDamageable() && itemStack.getItem().getDamage(itemStack) > 0) + { + return itemStack; + } - if (requestStack != null && requestStack.itemID != this.blockID) - { - boolean success = false; + ItemStack containingStack = tileEntity.getSampleStack(); - for (int i = 0; i < player.inventory.getSizeInventory(); i++) - { - ItemStack currentStack = player.inventory.getStackInSlot(i); + if (containingStack == null || (containingStack.isItemEqual(itemStack) || (tileEntity.oreFilterEnabled && OreDictionary.getOreID(containingStack) == OreDictionary.getOreID(itemStack)))) + { + int room = Math.max((tileEntity.getInventory().getSizeInventory() * 64) - (containingStack != null ? containingStack.stackSize : 0), 0); + if (itemStack.stackSize <= room) + { + tileEntity.addToStack(itemStack); + itemStack = null; + } + else + { + tileEntity.addToStack(itemStack, room); + itemStack.stackSize -= room; + } + return itemStack; - if (currentStack != null) - { - if (requestStack.isItemEqual(currentStack)) - { - player.inventory.setInventorySlotContents(i, BlockCrate.addStackToCrate(tileEntity, currentStack)); + } - if (player instanceof EntityPlayerMP) - { - ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); - } + if (itemStack.stackSize <= 0) + { + return null; + } - success = true; - } - } - } - return success; - } - return false; - } + return itemStack; + } - /** - * Ejects and item out of the crate and spawn it under the player entity. - * - * @param tileEntity - * @param player - * @param requestSize - The maximum stack size to take out. Default should be 64. - * @return True on success - */ - public boolean ejectItems(TileCrate tileEntity, EntityPlayer player, int requestSize) - { - World world = tileEntity.worldObj; - if (!world.isRemote) - { - ItemStack sampleStack = tileEntity.getSampleStack(); - int ammountEjected = 0; - if (sampleStack != null && requestSize > 0) - { - for (int slot = 0; slot < tileEntity.getInventory().getSizeInventory(); slot++) - { - ItemStack slotStack = tileEntity.getInventory().getStackInSlot(slot); + @Override + public int damageDropped(int metadata) + { + return metadata; + } - if (slotStack != null && slotStack.stackSize > 0) - { - int amountToTake = Math.min(slotStack.stackSize, requestSize); + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileCrate(); + } - ItemStack dropStack = slotStack.copy(); - dropStack.stackSize = amountToTake; - - EntityItem entityItem = new EntityItem(world, player.posX, player.posY, player.posZ, dropStack); - entityItem.delayBeforeCanPickup = 0; - world.spawnEntityInWorld(entityItem); - - slotStack.stackSize -= amountToTake; - ammountEjected += amountToTake; - if (slotStack.stackSize <= 0) - { - slotStack = null; - } - tileEntity.getInventory().setInventorySlotContents(slot, slotStack); - - } - if (ammountEjected >= requestSize) - { - tileEntity.onInventoryChanged(); - return true; - } - } - tileEntity.onInventoryChanged(); - return true; - } - } - tileEntity.onInventoryChanged(); - return false; - } - - /** - * Puts an itemStack into the crate. - * - * @param tileEntity - * @param itemStack - */ - public static ItemStack addStackToCrate(TileCrate tileEntity, ItemStack itemStack) - { - if (itemStack == null || itemStack.getItem().isDamageable() && itemStack.getItem().getDamage(itemStack) > 0) - { - return itemStack; - } - - ItemStack containingStack = tileEntity.getSampleStack(); - - if (containingStack == null || (containingStack.isItemEqual(itemStack) || OreDictionary.getOreID(containingStack) == OreDictionary.getOreID(itemStack))) - { - int room = Math.max((tileEntity.getInventory().getSizeInventory() * 64) - (containingStack != null ? containingStack.stackSize : 0), 0); - if (itemStack.stackSize <= room) - { - tileEntity.addToStack(itemStack); - itemStack = null; - } - else - { - tileEntity.addToStack(itemStack, room); - itemStack.stackSize -= room; - } - return itemStack; - - } - - if (itemStack.stackSize <= 0) - { - return null; - } - - return itemStack; - } - - @Override - public int damageDropped(int metadata) - { - return metadata; - } - - @Override - public TileEntity createNewTileEntity(World var1) - { - return new TileCrate(); - } - - @Override - public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) - { - par3List.add(new ItemStack(par1, 1, 0)); - par3List.add(new ItemStack(par1, 1, 1)); - par3List.add(new ItemStack(par1, 1, 2)); - } + @Override + public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + par3List.add(new ItemStack(par1, 1, 0)); + par3List.add(new ItemStack(par1, 1, 1)); + par3List.add(new ItemStack(par1, 1, 2)); + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.java b/archaic/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.java index 25daca6bb..6975b7589 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/crate/InventoryCrate.java @@ -3,7 +3,7 @@ package resonantinduction.archaic.crate; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import calclavia.lib.utility.inventory.ExternalInventory; +import resonant.lib.utility.inventory.ExternalInventory; public class InventoryCrate extends ExternalInventory { diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.java b/archaic/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.java index 425986208..5b2af7376 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/crate/ItemBlockCrate.java @@ -4,145 +4,147 @@ import java.util.List; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.potion.Potion; import net.minecraft.potion.PotionEffect; import net.minecraft.world.World; +import resonant.lib.prefab.item.ItemBlockTooltip; +import resonant.lib.utility.LanguageUtility; -public class ItemBlockCrate extends ItemBlock +public class ItemBlockCrate extends ItemBlockTooltip { - public ItemBlockCrate(int par1) - { - super(par1); - this.setHasSubtypes(true); - } + public ItemBlockCrate(int id) + { + super(id); + this.setHasSubtypes(true); + } - @Override - public String getUnlocalizedName(ItemStack itemStack) - { - return this.getUnlocalizedName() + "." + itemStack.getItemDamage(); - } + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + return this.getUnlocalizedName() + "." + itemStack.getItemDamage(); + } - @Override - public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List par3List, boolean par4) - { - ItemStack containingStack = getContainingItemStack(itemStack); + @Override + public void addInformation(ItemStack itemStack, EntityPlayer par2EntityPlayer, List list, boolean par4) + { + super.addInformation(itemStack, par2EntityPlayer, list, par4); + ItemStack containingStack = getContainingItemStack(itemStack); - if (containingStack != null) - { - par3List.add(containingStack.getDisplayName()); - par3List.add("Amount: " + containingStack.stackSize); - } - } + if (containingStack != null) + { + list.add(containingStack.getDisplayName()); + list.add(LanguageUtility.getLocal("crate.tooltip.amount") + " " + containingStack.stackSize); + } + } - @Override - public int getItemStackLimit(ItemStack stack) - { - ItemStack containingStack = getContainingItemStack(stack); - if (containingStack != null) - { - return 1; - } - return this.maxStackSize; - } + @Override + public int getItemStackLimit(ItemStack stack) + { + ItemStack containingStack = getContainingItemStack(stack); + if (containingStack != null) + { + return 1; + } + return this.maxStackSize; + } - @Override - public void onUpdate(ItemStack itemStack, World par2World, Entity entity, int par4, boolean par5) - { - if (entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) entity; - ItemStack containingStack = getContainingItemStack(itemStack); + @Override + public void onUpdate(ItemStack itemStack, World par2World, Entity entity, int par4, boolean par5) + { + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + ItemStack containingStack = getContainingItemStack(itemStack); - if (containingStack != null && !player.capabilities.isCreativeMode) - { - player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 5, (int) ((float) containingStack.stackSize / (float) TileCrate.getSlotCount(itemStack.getItemDamage())) * 5)); - } - } - } + if (containingStack != null && !player.capabilities.isCreativeMode) + { + player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 5, (int) ((float) containingStack.stackSize / (float) TileCrate.getSlotCount(itemStack.getItemDamage())) * 5)); + } + } + } - public static void setContainingItemStack(ItemStack itemStack, ItemStack containingStack) - { - if (itemStack.stackTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound()); - } + public static void setContainingItemStack(ItemStack itemStack, ItemStack containingStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } - if (containingStack != null) - { - NBTTagCompound itemTagCompound = new NBTTagCompound(); - containingStack.stackSize = Math.abs(containingStack.stackSize); - containingStack.writeToNBT(itemTagCompound); - itemStack.getTagCompound().setTag("Item", itemTagCompound); + if (containingStack != null) + { + NBTTagCompound itemTagCompound = new NBTTagCompound(); + containingStack.stackSize = Math.abs(containingStack.stackSize); + containingStack.writeToNBT(itemTagCompound); + itemStack.getTagCompound().setTag("Item", itemTagCompound); - itemStack.getTagCompound().setInteger("Count", containingStack.stackSize); - } - else - { - itemStack.getTagCompound().setTag("Item", new NBTTagCompound()); - itemStack.getTagCompound().setInteger("Count", 0); - } - } + itemStack.getTagCompound().setInteger("Count", containingStack.stackSize); + } + else + { + itemStack.getTagCompound().setTag("Item", new NBTTagCompound()); + itemStack.getTagCompound().setInteger("Count", 0); + } + } - public static ItemStack getContainingItemStack(ItemStack itemStack) - { - if (itemStack.stackTagCompound == null) - { - itemStack.setTagCompound(new NBTTagCompound()); - return null; - } + public static ItemStack getContainingItemStack(ItemStack itemStack) + { + if (itemStack.stackTagCompound == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + return null; + } - NBTTagCompound itemTagCompound = itemStack.getTagCompound().getCompoundTag("Item"); - ItemStack containingStack = ItemStack.loadItemStackFromNBT(itemTagCompound); + NBTTagCompound itemTagCompound = itemStack.getTagCompound().getCompoundTag("Item"); + ItemStack containingStack = ItemStack.loadItemStackFromNBT(itemTagCompound); - if (containingStack != null) - { - containingStack.stackSize = itemStack.getTagCompound().getInteger("Count"); - } + if (containingStack != null) + { + containingStack.stackSize = itemStack.getTagCompound().getInteger("Count"); + } - return containingStack; - } + return containingStack; + } - @Override - public int getMetadata(int metadata) - { - return metadata; - } + @Override + public int getMetadata(int metadata) + { + return metadata; + } - @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) - { - if (super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) - { - ItemStack containingItem = getContainingItemStack(stack); + @Override + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) + { + if (super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) + { + ItemStack containingItem = getContainingItemStack(stack); - if (world.getBlockTileEntity(x, y, z) != null && containingItem != null) - { - if (containingItem.stackSize > 0) - { - TileCrate tileEntity = (TileCrate) world.getBlockTileEntity(x, y, z); - int count = containingItem.stackSize; + if (world.getBlockTileEntity(x, y, z) != null && containingItem != null) + { + if (containingItem.stackSize > 0) + { + TileCrate tileEntity = (TileCrate) world.getBlockTileEntity(x, y, z); + int count = containingItem.stackSize; - for (int slot = 0; slot < tileEntity.getInventory().getSizeInventory(); slot++) - { - int stackSize = Math.min(64, count); - tileEntity.getInventory().setInventorySlotContents(slot, new ItemStack(containingItem.itemID, stackSize, containingItem.getItemDamage())); - count -= stackSize; + for (int slot = 0; slot < tileEntity.getInventory().getSizeInventory(); slot++) + { + int stackSize = Math.min(64, count); + tileEntity.getInventory().setInventorySlotContents(slot, new ItemStack(containingItem.itemID, stackSize, containingItem.getItemDamage())); + count -= stackSize; - if (count <= 0) - { - containingItem = null; - break; - } + if (count <= 0) + { + containingItem = null; + break; + } - } - tileEntity.buildSampleStack(); - } - } - } + } + tileEntity.buildSampleStack(); + } + } + } - return true; - } + return true; + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/ItemStorageCan.java b/archaic/src/main/scala/resonantinduction/archaic/crate/ItemStorageCan.java deleted file mode 100644 index 1c63d9608..000000000 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/ItemStorageCan.java +++ /dev/null @@ -1,11 +0,0 @@ -package resonantinduction.archaic.crate; - -/** - * Can that is used to store items such as food, parts, or solid fuels. - * - * @author DarkGuardsman - */ -public class ItemStorageCan -{ - -} diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/RenderCrate.java b/archaic/src/main/scala/resonantinduction/archaic/crate/RenderCrate.java index 7690600ef..a350282b7 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/RenderCrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/crate/RenderCrate.java @@ -5,8 +5,8 @@ import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.utility.LanguageUtility; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.utility.LanguageUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/crate/TileCrate.java b/archaic/src/main/scala/resonantinduction/archaic/crate/TileCrate.java index c0d670bd5..1c7d664ea 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/crate/TileCrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/crate/TileCrate.java @@ -1,289 +1,350 @@ package resonantinduction.archaic.crate; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.oredict.OreDictionary; +import resonant.api.IExtendedStorage; +import resonant.api.IFilterable; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileExternalInventory; import resonantinduction.core.ResonantInduction; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileExternalInventory; -import calclavia.lib.utility.inventory.IExtendedStorage; import com.google.common.io.ByteArrayDataInput; -/** - * Basic single stack inventory. - * +/** Basic single stack inventory. + *

* TODO: Add filter-locking feature. Put filter in, locks the crate to only use that item. * - * @author DarkGuardsman - */ -public class TileCrate extends TileExternalInventory implements IPacketReceiver, IExtendedStorage + * @author DarkGuardsman */ +public class TileCrate extends TileExternalInventory implements IPacketReceiver, IExtendedStorage, IFilterable { - /* - * TODO - * Fix issues with ItemStacks with NBT tags having issues - * Fix possible render issues with some items - * Yell at MachineMuse for her items rendering threw walls - * Add support to disable sides of crates when rendering items are unwanted - * Simplify item rendering to decrease graphic lag - * Add crafting manger to prevent crafting with full crates - * As well keep item stacks when upgrade crate threw crafting - * Add upgrade item for crate - * Add crate swapping in which an advanced can trade place with a basic while keeping inventory - * at the locaiton - */ - /** Collective total stack of all inv slots */ - private ItemStack sampleStack; + /** max meta size of the crate */ + public static final int maxSize = 2; - /** delay from last click */ - public long prevClickTime = -1000; - /** max meta size of the crate */ - public static final int maxSize = 2; + /** delay from last click */ + public long prevClickTime = -1000; - @Override - public InventoryCrate getInventory() - { - if (this.inventory == null) - { - inventory = new InventoryCrate(this); - } - return (InventoryCrate) this.inventory; - } + /** Check to see if oreName items can be force stacked */ + public boolean oreFilterEnabled = false; - /** Gets the sample stack that represent the total inv */ - public ItemStack getSampleStack() - { - if (this.sampleStack == null) - { - this.buildSampleStack(); - } - return this.sampleStack; - } + /** Collective total stack of all inv slots */ + private ItemStack sampleStack; + private ItemStack filterStack; - /** - * Turns the inventory array into a single stack of matching items. This assumes that all items - * in the crate are the same TODO eject minority items and only keep the majority that are the - * same to prevent duplication issues - * TODO: Add Force? - * @param force - force a rebuild of the inventory from the single stack created - */ - public void buildSampleStack() - { - ItemStack stack = null; + private long updateTick = 1; + private boolean doUpdate = false; - boolean rebuildBase = false; + @Override + public void updateEntity() + { + super.updateEntity(); + if (!worldObj.isRemote) + { + this.writeToNBT(new NBTTagCompound()); + if (ticks % updateTick == 0) + { + updateTick = 5 + worldObj.rand.nextInt(50); + doUpdate = true; + } + if (doUpdate) + { + doUpdate = false; + PacketHandler.sendPacketToClients(getDescriptionPacket(), this.worldObj); + } + } - /* Creates the sample stack that is used as a collective itemstack */ - for (int i = 0; i < this.getInventory().getContainedItems().length; i++) - { - ItemStack s = this.getInventory().getContainedItems()[i]; - if (s != null && s.itemID > 0 && s.stackSize > 0) - { - if (stack == null) - { - stack = s.copy(); - } - else - { - stack.stackSize += this.getInventory().getContainedItems()[i].stackSize; - } - if (this.getInventory().getContainedItems()[i].stackSize > this.getInventory().getContainedItems()[i].getMaxStackSize()) - { - rebuildBase = true; - } - } - } - if (stack == null || stack.itemID == 0 || stack.stackSize == 0) - { - this.sampleStack = null; - } - else - { - this.sampleStack = stack.copy(); - } - /* if one stack is over sized this rebuilds the inv to redistribute the items in the slots */ - if ((rebuildBase || this.getInventory().getContainedItems().length > this.getSlotCount()) && this.sampleStack != null) - { - this.getInventory().buildInventory(this.sampleStack); - } - } + } - /** Adds an item to the stack */ - public void addToStack(ItemStack stack, int amount) - { - if (stack != null) - { - this.addToStack(new ItemStack(stack.stackSize, amount, stack.getItemDamage())); - } - } + /** Gets the slot count for the crate meta */ + public static int getSlotCount(int metadata) + { + if (metadata >= 2) + { + return 256; + } + else if (metadata >= 1) + { + return 64; + } + return 32; + } - /** Adds the stack to the sample stack */ - public void addToStack(ItemStack stack) - { - if (stack != null) - { - this.buildSampleStack(); - boolean flag = false; + @Override + public InventoryCrate getInventory() + { + if (this.inventory == null) + { + inventory = new InventoryCrate(this); + } + return (InventoryCrate) this.inventory; + } - if (this.sampleStack == null) - { - this.sampleStack = stack; - flag = true; - } - else if (this.sampleStack.isItemEqual(stack) || OreDictionary.getOreID(sampleStack) == OreDictionary.getOreID(stack)) - { - this.sampleStack.stackSize += stack.stackSize; - flag = true; - } + /** Gets the sample stack that represent the total inventory */ + public ItemStack getSampleStack() + { + if (this.sampleStack == null) + { + this.buildSampleStack(); + } + return this.sampleStack; + } - if (flag) - { - this.getInventory().buildInventory(this.sampleStack); - this.onInventoryChanged(); - } - } - } + /** Builds the sample stack using the inventory as a point of reference. Assumes all items match + * each other, and only takes into account stack sizes */ + public void buildSampleStack() + { + buildSampleStack(true); + } - @Override - public void onInventoryChanged() - { - super.onInventoryChanged(); + public void buildSampleStack(boolean buildInv) + { + if (worldObj == null || !worldObj.isRemote) + { + ItemStack newSampleStack = null; + boolean rebuildBase = false; - if (worldObj != null && !worldObj.isRemote) - { - PacketHandler.sendPacketToClients(getDescriptionPacket(), this.worldObj); - } - } + /* Creates the sample stack that is used as a collective itemstack */ + for (int slot = 0; slot < this.getSizeInventory(); slot++) + { + ItemStack slotStack = this.getInventory().getContainedItems()[slot]; + if (slotStack != null && Item.itemsList[slotStack.itemID] != null && slotStack.stackSize > 0) + { + if (newSampleStack == null) + { + newSampleStack = slotStack.copy(); + } + else + { + newSampleStack.stackSize += slotStack.stackSize; + } - @Override - public boolean canStore(ItemStack stack, int slot, ForgeDirection side) - { - return sampleStack == null || stack != null && (stack.isItemEqual(sampleStack) || OreDictionary.getOreID(sampleStack) == OreDictionary.getOreID(stack)); - } + if (slotStack.stackSize > slotStack.getMaxStackSize()) + { + rebuildBase = true; + } + } + } + if (newSampleStack == null || newSampleStack.itemID == 0 || newSampleStack.stackSize <= 0) + { + this.sampleStack = this.getFilter() != null ? this.getFilter().copy() : null; + } + else + { + this.sampleStack = newSampleStack.copy(); + } - /** Gets the current slot count for the crate */ - public int getSlotCount() - { - if (this.worldObj == null) - { - return TileCrate.getSlotCount(TileCrate.maxSize); - } - return TileCrate.getSlotCount(this.getBlockMetadata()); - } + /* Rebuild inventory if the inventory is not valid */ + if (buildInv && this.sampleStack != null && (rebuildBase || this.getInventory().getContainedItems().length > this.getSizeInventory())) + { + this.getInventory().buildInventory(this.sampleStack); + } + } + } - /** Gets the slot count for the crate meta */ - public static int getSlotCount(int metadata) - { - if (metadata >= 2) - { - return 256; - } - else if (metadata >= 1) - { - return 64; - } - return 32; - } + @Override + public ItemStack addStackToStorage(ItemStack stack) + { + return BlockCrate.addStackToCrate(this, stack); + } - @Override - public boolean canUpdate() - { - return false; - } + /** Adds an item to the stack */ + public void addToStack(ItemStack stack, int amount) + { + if (stack != null) + { + ItemStack newStack = stack.copy(); + newStack.stackSize = amount; + this.addToStack(newStack); + } + } - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - if (this.worldObj.isRemote) - { - try - { - if (data.readBoolean()) - { - this.sampleStack = ItemStack.loadItemStackFromNBT(PacketHandler.readNBTTagCompound(data)); - this.sampleStack.stackSize = data.readInt(); - } - else - { - this.sampleStack = null; - } - } - catch (Exception e) - { - e.printStackTrace(); - } - } - } + /** Adds the stack to the sample stack */ + public void addToStack(ItemStack stack) + { + if (stack != null && stack.stackSize > 0) + { + if (this.getSampleStack() == null) + { + this.sampleStack = stack; + getInventory().buildInventory(getSampleStack()); + } + else if (this.getSampleStack().isItemEqual(stack) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack))) + { + getSampleStack().stackSize += stack.stackSize; + getInventory().buildInventory(getSampleStack()); + } + } + } - @Override - public Packet getDescriptionPacket() - { - this.buildSampleStack(); - ItemStack stack = this.getSampleStack(); - if (stack != null) - { - return ResonantInduction.PACKET_TILE.getPacket(this, true, stack.writeToNBT(new NBTTagCompound()), stack.stackSize); - } - else - { - return ResonantInduction.PACKET_TILE.getPacket(this, false); - } - } + @Override + public ItemStack decrStackSize(int slot, int amount) + { + if (sampleStack != null) + { + ItemStack var3; - /** NBT Data */ - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - /* Load current two inv methods */ - ItemStack stack = null; - int count = nbt.getInteger("Count"); - if (nbt.hasKey("itemID")) - { - stack = new ItemStack(nbt.getInteger("itemID"), count, nbt.getInteger("itemMeta")); - } - else - { - stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack")); - if (stack != null) - { - stack.stackSize = count; - } - } + if (sampleStack.stackSize <= amount) + { + var3 = sampleStack; + sampleStack = null; + this.onInventoryChanged(); + getInventory().buildInventory(getSampleStack()); + return var3; + } + else + { + var3 = sampleStack.splitStack(amount); - /* Only load sample stack if the read stack is valid */ - if (stack != null && stack.itemID != 0 && stack.stackSize > 0) - { - this.sampleStack = stack; - this.getInventory().buildInventory(this.sampleStack); - } + if (sampleStack.stackSize == 0) + { + sampleStack = null; + } - } + getInventory().buildInventory(getSampleStack()); + onInventoryChanged(); + return var3; + } + } + else + { + return null; + } + } - @Override - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - /* Re-Build sample stack for saving */ - this.buildSampleStack(); - ItemStack stack = this.getSampleStack(); - /* Save sample stack */ - if (stack != null) - { - nbt.setInteger("Count", stack.stackSize); - nbt.setCompoundTag("stack", stack.writeToNBT(new NBTTagCompound())); - } + @Override + public void onInventoryChanged() + { + super.onInventoryChanged(); + if (worldObj != null && !worldObj.isRemote) + doUpdate = true; + } - } + @Override + public boolean canStore(ItemStack stack, int slot, ForgeDirection side) + { + return getSampleStack() == null || stack != null && (stack.isItemEqual(getSampleStack()) || (this.oreFilterEnabled && OreDictionary.getOreID(getSampleStack()) == OreDictionary.getOreID(stack))); + } - @Override - public ItemStack addStackToStorage(ItemStack stack) - { - return BlockCrate.addStackToCrate(this, stack); - } + /** Gets the current slot count for the crate */ + public int getSlotCount() + { + if (this.worldObj == null) + { + return TileCrate.getSlotCount(TileCrate.maxSize); + } + return TileCrate.getSlotCount(this.getBlockMetadata()); + } + + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + if (this.worldObj.isRemote) + { + try + { + if (data.readBoolean()) + { + this.sampleStack = ItemStack.loadItemStackFromNBT(PacketHandler.readNBTTagCompound(data)); + this.sampleStack.stackSize = data.readInt(); + } + else + { + this.sampleStack = null; + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + @Override + public Packet getDescriptionPacket() + { + this.buildSampleStack(); + ItemStack stack = this.getSampleStack(); + if (stack != null) + { + return ResonantInduction.PACKET_TILE.getPacket(this, true, stack.writeToNBT(new NBTTagCompound()), stack.stackSize); + } + else + { + return ResonantInduction.PACKET_TILE.getPacket(this, false); + } + } + + /** NBT Data */ + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + /* Load current two inv methods */ + ItemStack stack = null; + int count = nbt.getInteger("Count"); + if (nbt.hasKey("itemID")) + { + stack = new ItemStack(nbt.getInteger("itemID"), count, nbt.getInteger("itemMeta")); + } + else + { + stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("stack")); + if (stack != null) + { + stack.stackSize = count; + } + } + + /* Only load sample stack if the read stack is valid */ + if (stack != null && stack.itemID != 0 && stack.stackSize > 0) + { + this.sampleStack = stack; + this.getInventory().buildInventory(this.sampleStack); + } + this.oreFilterEnabled = nbt.getBoolean("oreFilter"); + if (nbt.hasKey("filter")) + { + filterStack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("filter")); + } + + } + + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + /* Re-Build sample stack for saving */ + this.buildSampleStack(false); + ItemStack stack = this.getSampleStack(); + /* Save sample stack */ + if (stack != null) + { + nbt.setInteger("Count", stack.stackSize); + nbt.setCompoundTag("stack", stack.writeToNBT(new NBTTagCompound())); + } + nbt.setBoolean("oreFilter", this.oreFilterEnabled); + if (this.filterStack != null) + { + nbt.setCompoundTag("filter", filterStack.writeToNBT(new NBTTagCompound())); + } + } + + @Override + public ItemStack getFilter() + { + return this.filterStack; + } + + @Override + public void setFilter(ItemStack filter) + { + this.filterStack = filter; + this.onInventoryChanged(); + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.java b/archaic/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.java index 42e76d2fa..59c59fc22 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.java +++ b/archaic/src/main/scala/resonantinduction/archaic/engineering/ItemHammer.java @@ -1,77 +1,14 @@ package resonantinduction.archaic.engineering; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; -import resonantinduction.core.Reference; -import resonantinduction.core.ResonantInduction; -import resonantinduction.core.ResonantInduction.RecipeType; -import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.lib.utility.inventory.InventoryUtility; +/** Item used to interact with engineering table to crush ore */ public class ItemHammer extends Item { - public ItemHammer(int id) - { - super(id); - setMaxStackSize(1); - setMaxDamage(400); - } - - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - - if (tileEntity instanceof TileEngineeringTable) - { - TileEngineeringTable tile = (TileEngineeringTable) tileEntity; - - // We don't want to bash the output slots - for (int i = 0; i < TileEngineeringTable.CRAFTING_OUTPUT_END; i++) - { - ItemStack inputStack = tile.getStackInSlot(i); - - if (inputStack != null) - { - String oreName = OreDictionary.getOreName(OreDictionary.getOreID(inputStack)); - - if (oreName != null && !oreName.equals("Unknown")) - { - RecipeResource[] outputs = MachineRecipes.INSTANCE.getOutput(RecipeType.CRUSHER.name(), oreName); - - if (outputs.length > 0) - { - if (!world.isRemote && world.rand.nextFloat() < 0.04) - { - for (RecipeResource resource : outputs) - { - ItemStack outputStack = resource.getItemStack().copy(); - - if (outputStack != null) - { - InventoryUtility.dropItemStack(world, new Vector3(player), outputStack, 0); - tile.setInventorySlotContents(i, --inputStack.stackSize <= 0 ? null : inputStack); - } - } - } - - ResonantInduction.proxy.renderBlockParticle(world, new Vector3(x + 0.5, y + 0.5, z + 0.5), new Vector3((Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3), inputStack.itemID, 1); - world.playSoundEffect(x + 0.5, y + 0.5, z + 0.5, Reference.PREFIX + "hammer", 0.5f, 0.8f + (0.2f * world.rand.nextFloat())); - player.addExhaustion(0.3f); - stack.damageItem(1, player); - return true; - } - } - } - } - } - - return false; - } + public ItemHammer(int id) + { + super(id); + setMaxStackSize(1); + setMaxDamage(400); + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.java b/archaic/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.java index 1fa342d0d..3eae0ffb5 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.java +++ b/archaic/src/main/scala/resonantinduction/archaic/engineering/TileEngineeringTable.java @@ -19,29 +19,35 @@ import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.oredict.OreDictionary; import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.opengl.GL11; +import resonant.api.IRotatable; +import resonant.api.ISlotPickResult; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.content.module.TileRender; +import resonant.lib.content.module.prefab.TileInventory; +import resonant.lib.gui.ContainerDummy; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.item.ItemBlockSaved; +import resonant.lib.prefab.vector.Cuboid; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.type.Pair; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.WorldUtility; +import resonant.lib.utility.inventory.AutoCraftingManager; +import resonant.lib.utility.inventory.AutoCraftingManager.IAutoCrafter; +import resonant.lib.utility.inventory.InventoryUtility; +import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; +import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.prefab.imprint.ItemImprint; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.content.module.prefab.TileInventory; -import calclavia.lib.gui.ContainerDummy; -import calclavia.lib.type.Pair; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.item.ItemBlockSaved; -import calclavia.lib.prefab.slot.ISlotPickResult; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.utility.WorldUtility; -import calclavia.lib.utility.inventory.AutoCraftingManager; -import calclavia.lib.utility.inventory.AutoCraftingManager.IAutoCrafter; -import calclavia.lib.utility.inventory.InventoryUtility; import codechicken.multipart.ControlKeyModifer; import com.google.common.io.ByteArrayDataInput; @@ -49,700 +55,726 @@ import com.google.common.io.ByteArrayDataInput; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +/** Advanced crafting table that stores its crafting grid, can craft out of the player's inv, and be + * configed to auto craft. + * + * @author DarkGuardsman, Calclavia */ public class TileEngineeringTable extends TileInventory implements IPacketReceiver, IRotatable, ISidedInventory, ISlotPickResult, IAutoCrafter { - public static final int CRAFTING_MATRIX_END = 9; - public static final int CRAFTING_OUTPUT_END = CRAFTING_MATRIX_END + 1; - public static final int PLAYER_OUTPUT_END = CRAFTING_OUTPUT_END + 40; - public static final int CENTER_SLOT = 4; - - // Relative slot IDs - public static final int CRAFTING_OUTPUT_SLOT = 0; - private static final int IMPRINT_SLOT = 1; - - private AutoCraftingManager craftManager; - - /** 9 slots for crafting, 1 slot for a output. */ - public static final int CRAFTING_MATRIX_SIZE = 9; - public ItemStack[] craftingMatrix = new ItemStack[CRAFTING_MATRIX_SIZE]; - public static final int[] craftingSlots = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; - - /** The output inventory containing slots. */ - public ItemStack[] outputInventory = new ItemStack[1]; - - /** The ability for the engineering table to search nearby inventories. */ - public boolean searchInventories = true; - - /** Temporary player inventory stored to draw the player's items. */ - private InventoryPlayer invPlayer = null; - private int[] playerSlots; - - @SideOnly(Side.CLIENT) - private static Icon iconTop, iconFront, iconSide; - - public TileEngineeringTable() - { - super(Material.wood); - bounds = new Cuboid(0, 0, 0, 1, 0.9f, 1); - isOpaqueCube = false; - normalRender = false; - itemBlock = ItemBlockSaved.class; - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) - { - return side == 1 ? iconTop : (side == meta ? iconFront : iconSide); - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister iconRegister) - { - iconTop = iconRegister.registerIcon(getTextureName() + "_top"); - iconFront = iconRegister.registerIcon(getTextureName() + "_front"); - iconSide = iconRegister.registerIcon(getTextureName() + "_side"); - } - - @Override - public void click(EntityPlayer player) - { - if (!world().isRemote && ControlKeyModifer.isControlDown(player)) - { - if (this instanceof IInventory) - { - IInventory inventory = this; - - // Don't drop the output, so subtract by one. - for (int i = 0; i < inventory.getSizeInventory() - 1; ++i) - { - ItemStack dropStack = inventory.getStackInSlot(i); - - if (dropStack != null) - { - InventoryUtility.dropItemStack(world(), new Vector3(player), dropStack); - inventory.setInventorySlotContents(i, null); - } - } - - inventory.onInventoryChanged(); - } - } - } - - @Override - protected boolean use(EntityPlayer player, int hitSide, Vector3 hit) - { - if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemHammer) - { - return false; - } - - if (hitSide == 1) - { - if (!world().isRemote) - { - Vector3 hitVector = new Vector3(hit.x, 0, hit.z); - final double regionLength = 1d / 3d; - - // Rotate the hit vector based on direction of the tile. - hitVector.translate(new Vector3(-0.5, 0, -0.5)); - hitVector.rotate(WorldUtility.getAngleFromForgeDirection(getDirection()), Vector3.UP()); - hitVector.translate(new Vector3(0.5, 0, 0.5)); - - /** Crafting Matrix */ - matrix: - for (int j = 0; j < 3; j++) - { - for (int k = 0; k < 3; k++) - { - Vector2 check = new Vector2(j, k).scale(regionLength); - - if (check.distance(hitVector.toVector2()) < regionLength) - { - int slotID = j * 3 + k; - interactCurrentItem(this, slotID, player); - break matrix; - } - } - } - - onInventoryChanged(); - } - - return true; - } - else if (hitSide != 0) - { - /** Take out of engineering table. */ - if (!world().isRemote) - { - setPlayerInventory(player.inventory); - - ItemStack output = getStackInSlot(9); - boolean firstLoop = true; - - while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) - { - onPickUpFromSlot(player, 9, output); - - if (output.stackSize > 0) - { - InventoryUtility.dropItemStack(world(), new Vector3(player), output, 0); - } - - setInventorySlotContents(9, null); - onInventoryChanged(); - - output = getStackInSlot(9); - firstLoop = false; - } - - setPlayerInventory(null); - } - - return true; - - } - return false; - } - - @Override - protected boolean configure(EntityPlayer player, int side, Vector3 hit) - { - if (player.isSneaking()) - { - searchInventories = !searchInventories; - - if (!world().isRemote) - { - if (searchInventories) - player.addChatMessage("Engineering table will now search for nearby inventories for resources."); - else - player.addChatMessage("Engineering table will not search for nearby inventories for resources."); - } - - markUpdate(); - return true; - } - - return super.configure(player, side, hit); - } - - @Override - public ArrayList getDrops(int metadata, int fortune) - { - return new ArrayList(); - } - - @Override - public void onRemove(int par5, int par6) - { - ItemStack stack = ItemBlockSaved.getItemStackWithNBT(this.getBlockType(), world(), x(), y(), z()); - InventoryUtility.dropItemStack(world(), center(), stack); - } - - /** Creates a "fake inventory" and hook the player up to the crafter to use the player's items. */ - public void setPlayerInventory(InventoryPlayer invPlayer) - { - if (searchInventories) - { - if (invPlayer != null) - { - playerSlots = new int[invPlayer.getSizeInventory()]; - for (int i = 0; i < playerSlots.length; i++) - playerSlots[i] = i + CRAFTING_OUTPUT_END; - } - else - { - playerSlots = null; - } - - this.invPlayer = invPlayer; - } - } - - @Override - public boolean canUpdate() - { - return false; - } - - /** Gets the AutoCraftingManager that does all the crafting results */ - public AutoCraftingManager getCraftingManager() - { - if (craftManager == null) - { - craftManager = new AutoCraftingManager(this); - } - return craftManager; - } - - @Override - public Packet getDescriptionPacket() - { - NBTTagCompound nbt = new NBTTagCompound(); - this.writeToNBT(nbt); - return ResonantInduction.PACKET_TILE.getPacket(this, nbt); - } - - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - try - { - readFromNBT(PacketHandler.readNBTTagCompound(data)); - } - catch (Exception e) - { - e.printStackTrace(); - } - } - - @Override - public int getSizeInventory() - { - return 10 + (this.invPlayer != null ? this.invPlayer.getSizeInventory() : 0); - } - - /** DO NOT USE THIS INTERNALLY. FOR EXTERNAL USE ONLY! */ - @Override - public ItemStack getStackInSlot(int slot) - { - if (slot < CRAFTING_MATRIX_END) - { - return this.craftingMatrix[slot]; - } - else if (slot < CRAFTING_OUTPUT_END) - { - return outputInventory[slot - CRAFTING_MATRIX_END]; - } - else if (slot < PLAYER_OUTPUT_END && invPlayer != null) - { - return this.invPlayer.getStackInSlot(slot - CRAFTING_OUTPUT_END); - } - else if (searchInventories) - { - int idDisplacement = PLAYER_OUTPUT_END; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); - - if (tile instanceof IInventory) - { - IInventory inventory = (IInventory) tile; - int slotID = slot - idDisplacement; - - if (slotID >= 0 && slotID < inventory.getSizeInventory()) - return inventory.getStackInSlot(slotID); - - idDisplacement += inventory.getSizeInventory(); - } - } - } - - return null; - } - - @Override - public ItemStack decrStackSize(int i, int amount) - { - if (getStackInSlot(i) != null) - { - ItemStack stack; - - if (getStackInSlot(i).stackSize <= amount) - { - stack = getStackInSlot(i); - setInventorySlotContents(i, null); - return stack; - } - else - { - stack = getStackInSlot(i).splitStack(amount); - - if (getStackInSlot(i).stackSize == 0) - { - setInventorySlotContents(i, null); - } - - return stack; - } - } - else - { - return null; - } - } - - @Override - public void setInventorySlotContents(int slot, ItemStack itemStack) - { - if (slot < CRAFTING_MATRIX_END) - { - craftingMatrix[slot] = itemStack; - } - else if (slot < CRAFTING_OUTPUT_END) - { - outputInventory[slot - CRAFTING_MATRIX_END] = itemStack; - } - else if (slot < PLAYER_OUTPUT_END && this.invPlayer != null) - { - this.invPlayer.setInventorySlotContents(slot - CRAFTING_OUTPUT_END, itemStack); - EntityPlayer player = this.invPlayer.player; - - if (player instanceof EntityPlayerMP) - { - ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); - } - } - else if (searchInventories) - { - int idDisplacement = PLAYER_OUTPUT_END; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); - - if (tile instanceof IInventory) - { - IInventory inventory = (IInventory) tile; - int slotID = slot - idDisplacement; - - if (slotID >= 0 && slotID < inventory.getSizeInventory()) - inventory.setInventorySlotContents(slotID, itemStack); - - idDisplacement += inventory.getSizeInventory(); - } - } - } - - onInventoryChanged(); - } - - /** - * 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. - */ - @Override - public ItemStack getStackInSlotOnClosing(int slot) - { - if (this.getStackInSlot(slot) != null) - { - ItemStack var2 = this.getStackInSlot(slot); - this.setInventorySlotContents(slot, null); - return var2; - } - else - { - return null; - } - } - - @Override - public String getInvName() - { - return this.getBlockType().getLocalizedName(); - } - - @Override - public void openChest() - { - this.onInventoryChanged(); - } - - @Override - public void closeChest() - { - this.onInventoryChanged(); - } - - /** - * Construct an InventoryCrafting Matrix on the fly. - * - * @return - */ - public InventoryCrafting getCraftingMatrix() - { - InventoryCrafting inventoryCrafting = new InventoryCrafting(new ContainerDummy(this), 3, 3); - - for (int i = 0; i < this.craftingMatrix.length; i++) - { - inventoryCrafting.setInventorySlotContents(i, this.craftingMatrix[i]); - } - - return inventoryCrafting; - } - - /** Updates all the output slots. Call this to update the Engineering Table. */ - @Override - public void onInventoryChanged() - { - if (worldObj != null) - { - if (!worldObj.isRemote) - { - this.outputInventory[CRAFTING_OUTPUT_SLOT] = null; - - /** Try to craft from crafting grid. If not possible, then craft from imprint. */ - boolean didCraft = false; - - /** Simulate an Inventory Crafting Instance */ - InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); - - ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj); - - if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null) - { - this.outputInventory[CRAFTING_OUTPUT_SLOT] = matrixOutput; - didCraft = true; - } - - /** If output does not exist, try using the filter. */ - if (!didCraft) - { - ItemStack filterStack = craftingMatrix[CENTER_SLOT]; - - if (filterStack != null && filterStack.getItem() instanceof ItemImprint) - { - Set filters = ItemImprint.getFilters(filterStack); - - for (ItemStack outputStack : filters) - { - if (outputStack != null) - { - Pair idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack); - - if (idealRecipe != null) - { - ItemStack recipeOutput = idealRecipe.left(); - if (recipeOutput != null & recipeOutput.stackSize > 0) - { - this.outputInventory[CRAFTING_OUTPUT_SLOT] = recipeOutput; - didCraft = true; - break; - } - } - } - } - } - } - - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - } - } - - @Override - public void onPickUpFromSlot(EntityPlayer entityPlayer, int slotID, ItemStack itemStack) - { - if (!worldObj.isRemote) - { - if (itemStack != null) - { - Pair idealRecipeItem = getCraftingManager().getIdealRecipe(itemStack); - - if (idealRecipeItem != null) - { - getCraftingManager().consumeItems(idealRecipeItem.right().clone()); - } - else - { - itemStack.stackSize = 0; - } - } - } - } - - // /////////////////////////////////////// - // // Save And Data processing ////// - // /////////////////////////////////////// - /** NBT Data */ - @Override - public void readFromNBT(NBTTagCompound nbt) - { - super.readFromNBT(nbt); - - NBTTagList nbtList = nbt.getTagList("Items"); - this.craftingMatrix = new ItemStack[9]; - this.outputInventory = new ItemStack[1]; - - for (int i = 0; i < nbtList.tagCount(); ++i) - { - NBTTagCompound stackTag = (NBTTagCompound) nbtList.tagAt(i); - byte id = stackTag.getByte("Slot"); - - if (id >= 0 && id < this.getSizeInventory()) - { - this.setInventorySlotContents(id, ItemStack.loadItemStackFromNBT(stackTag)); - } - } - - this.searchInventories = nbt.getBoolean("searchInventories"); - } - - /** Writes a tile entity to NBT. */ - @Override - public void writeToNBT(NBTTagCompound nbt) - { - super.writeToNBT(nbt); - - NBTTagList nbtList = new NBTTagList(); - - for (int i = 0; i < this.getSizeInventory(); ++i) - { - if (this.getStackInSlot(i) != null) - { - NBTTagCompound var4 = new NBTTagCompound(); - var4.setByte("Slot", (byte) i); - this.getStackInSlot(i).writeToNBT(var4); - nbtList.appendTag(var4); - } - } - - nbt.setTag("Items", nbtList); - nbt.setBoolean("searchInventories", this.searchInventories); - } - - // /////////////////////////////////////// - // // Inventory Access side Methods ////// - // /////////////////////////////////////// - - @Override - public boolean isInvNameLocalized() - { - return false; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemstack) - { - return true; - } - - @Override - public int getInventoryStackLimit() - { - return 64; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer entityplayer) - { - return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) <= 64.0D; - - } - - @Override - public int[] getAccessibleSlotsFromSide(int side) - { - return new int[0]; - } - - /** Auto-crafting methods. */ - @Override - public boolean canInsertItem(int slot, ItemStack itemstack, int side) - { - if (getStackInSlot(4) != null && getStackInSlot(4).getItem() instanceof ItemImprint) - return true; - - int minSize = 64; - int optimalSlot = -1; - - for (int i = 0; i < craftingMatrix.length; i++) - { - ItemStack checkStack = getStackInSlot(i); - - if (checkStack != null && checkStack.isItemEqual(itemstack)) - { - if (checkStack.stackSize < minSize || optimalSlot < 0) - { - optimalSlot = i; - minSize = checkStack.stackSize; - } - } - } - - return slot == optimalSlot; - } - - @Override - public boolean canExtractItem(int slot, ItemStack itemstack, int side) - { - ItemStack outputStack = getStackInSlot(CRAFTING_MATRIX_END); - - if (outputStack != null) - { - /** Only allow take out crafting result when it can be crafted twice! */ - Pair idealRecipeItem = this.getCraftingManager().getIdealRecipe(outputStack); - ItemStack[] doubleResults = ArrayUtils.addAll(idealRecipeItem.right(), idealRecipeItem.right()); - - if (!getCraftingManager().consumeItems(false, doubleResults)) - { - return false; - } - } - - return slot == CRAFTING_MATRIX_END; - } - - @Override - public int[] getCraftingInv() - { - int[] slots = craftingSlots; - - if (playerSlots != null) - { - slots = ArrayUtils.addAll(playerSlots, slots); - } - - if (searchInventories) - { - int temporaryInvID = PLAYER_OUTPUT_END; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); - - if (tile instanceof IInventory) - { - IInventory inventory = (IInventory) tile; - int[] nearbySlots = new int[inventory.getSizeInventory()]; - - for (int i = 0; i < inventory.getSizeInventory(); i++) - { - nearbySlots[i] = temporaryInvID++; - } - - slots = ArrayUtils.addAll(nearbySlots, slots); - } - } - } - - return slots; - } - - @Override - @SideOnly(Side.CLIENT) - protected TileRender newRenderer() - { - return new TileRender() - { - @Override - public boolean renderDynamic(Vector3 position, boolean isItem, float frame) - { - if (!isItem) - { - GL11.glPushMatrix(); - RenderItemOverlayUtility.renderItemOnSides(TileEngineeringTable.this, getStackInSlot(9), position.x, position.y, position.z); - RenderItemOverlayUtility.renderTopOverlay(TileEngineeringTable.this, craftingMatrix, getDirection(), position.x, position.y - 0.1, position.z); - GL11.glPopMatrix(); - } - - return false; - } - }; - } + public static final int CRAFTING_MATRIX_END = 9; + public static final int CRAFTING_OUTPUT_END = CRAFTING_MATRIX_END + 1; + public static final int PLAYER_OUTPUT_END = CRAFTING_OUTPUT_END + 40; + public static final int CENTER_SLOT = 4; + + // Relative slot IDs + public static final int CRAFTING_OUTPUT_SLOT = 0; + + private AutoCraftingManager craftManager; + + /** 9 slots for crafting, 1 slot for a output. */ + public static final int CRAFTING_MATRIX_SIZE = 9; + public ItemStack[] craftingMatrix = new ItemStack[CRAFTING_MATRIX_SIZE]; + public static final int[] craftingSlots = { 0, 1, 2, 3, 4, 5, 6, 7, 8 }; + + /** The output inventory containing slots. */ + public ItemStack[] outputInventory = new ItemStack[1]; + + /** The ability for the engineering table to search nearby inventories. */ + public boolean searchInventories = true; + + /** Temporary player inventory stored to draw the player's items. */ + private InventoryPlayer invPlayer = null; + private int[] playerSlots; + + @SideOnly(Side.CLIENT) + private static Icon iconTop, iconFront, iconSide; + + public TileEngineeringTable() + { + super(Material.wood); + bounds = new Cuboid(0, 0, 0, 1, 0.9f, 1); + isOpaqueCube = false; + normalRender = false; + itemBlock = ItemBlockSaved.class; + } + + @Override + @SideOnly(Side.CLIENT) + public Icon getIcon(int side, int meta) + { + return side == 1 ? iconTop : (side == meta ? iconFront : iconSide); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IconRegister iconRegister) + { + iconTop = iconRegister.registerIcon(getTextureName() + "_top"); + iconFront = iconRegister.registerIcon(getTextureName() + "_front"); + iconSide = iconRegister.registerIcon(getTextureName() + "_side"); + } + + @Override + public void click(EntityPlayer player) + { + if (!world().isRemote && ControlKeyModifer.isControlDown(player)) + { + // Don't drop the output, so subtract by one. + for (int i = 0; i < getSizeInventory() - 1; ++i) + { + if (getStackInSlot(i) != null) + { + InventoryUtility.dropItemStack(world(), new Vector3(player), getStackInSlot(i)); + setInventorySlotContents(i, null); + } + } + } + } + + @Override + protected boolean use(EntityPlayer player, int hitSide, Vector3 hit) + { + if (player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() instanceof ItemHammer) + { + for (int slot = 0; slot < TileEngineeringTable.CRAFTING_OUTPUT_END; slot++) + { + ItemStack inputStack = getStackInSlot(slot); + + if (inputStack != null) + { + String oreName = OreDictionary.getOreName(OreDictionary.getOreID(inputStack)); + + if (oreName != null && !oreName.equals("Unknown")) + { + RecipeResource[] outputs = MachineRecipes.INSTANCE.getOutput(RecipeType.CRUSHER.name(), oreName); + + if (outputs != null && outputs.length > 0) + { + if (!world().isRemote && world().rand.nextFloat() < 0.2) + { + for (RecipeResource resource : outputs) + { + ItemStack outputStack = resource.getItemStack().copy(); + + if (outputStack != null) + { + InventoryUtility.dropItemStack(world(), new Vector3(player), outputStack, 0); + setInventorySlotContents(slot, --inputStack.stackSize <= 0 ? null : inputStack); + } + } + } + + ResonantInduction.proxy.renderBlockParticle(world(), new Vector3(x() + 0.5, y() + 0.5, z() + 0.5), new Vector3((Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3, (Math.random() - 0.5f) * 3), inputStack.itemID, 1); + world().playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, Reference.PREFIX + "hammer", 0.5f, 0.8f + (0.2f * world().rand.nextFloat())); + player.addExhaustion(0.1f); + player.getCurrentEquippedItem().damageItem(1, player); + return true; + } + } + } + } + return true; + } + + if (hitSide == 1) + { + if (!world().isRemote) + { + Vector3 hitVector = new Vector3(hit.x, 0, hit.z); + final double regionLength = 1d / 3d; + + // Rotate the hit vector based on direction of the tile. + hitVector.translate(new Vector3(-0.5, 0, -0.5)); + hitVector.rotate(WorldUtility.getAngleFromForgeDirection(getDirection()), Vector3.UP()); + hitVector.translate(new Vector3(0.5, 0, 0.5)); + + /** Crafting Matrix */ + matrix: + for (int j = 0; j < 3; j++) + { + for (int k = 0; k < 3; k++) + { + Vector2 check = new Vector2(j, k).scale(regionLength); + + if (check.distance(hitVector.toVector2()) < regionLength) + { + int slotID = j * 3 + k; + interactCurrentItem(this, slotID, player); + break matrix; + } + } + } + + onInventoryChanged(); + } + + return true; + } + else if (hitSide != 0) + { + /** Take out of engineering table. */ + if (!world().isRemote) + { + setPlayerInventory(player.inventory); + + ItemStack output = getStackInSlot(9); + boolean firstLoop = true; + + while (output != null && (firstLoop || ControlKeyModifer.isControlDown(player))) + { + onPickUpFromSlot(player, 9, output); + + if (output.stackSize > 0) + { + InventoryUtility.dropItemStack(world(), new Vector3(player), output, 0); + } + + setInventorySlotContents(9, null); + onInventoryChanged(); + + output = getStackInSlot(9); + firstLoop = false; + } + + setPlayerInventory(null); + } + + return true; + + } + return false; + } + + @Override + protected boolean configure(EntityPlayer player, int side, Vector3 hit) + { + if (player.isSneaking()) + { + searchInventories = !searchInventories; + if (!world().isRemote) + { + if (searchInventories) + player.addChatMessage(LanguageUtility.getLocal("engineerTable.config.inventory.true")); + else + player.addChatMessage(LanguageUtility.getLocal("engineerTable.config.inventory.false")); + } + + markUpdate(); + return true; + } + + return super.configure(player, side, hit); + } + + @Override + public ArrayList getDrops(int metadata, int fortune) + { + return new ArrayList(); + } + + @Override + public void onRemove(int par5, int par6) + { + ItemStack stack = ItemBlockSaved.getItemStackWithNBT(this.getBlockType(), world(), x(), y(), z()); + InventoryUtility.dropItemStack(world(), center(), stack); + } + + /** Creates a "fake inventory" and hook the player up to the crafter to use the player's items. */ + public void setPlayerInventory(InventoryPlayer invPlayer) + { + if (searchInventories) + { + if (invPlayer != null) + { + playerSlots = new int[invPlayer.getSizeInventory()]; + for (int i = 0; i < playerSlots.length; i++) + playerSlots[i] = i + CRAFTING_OUTPUT_END; + } + else + { + playerSlots = null; + } + + this.invPlayer = invPlayer; + } + } + + @Override + public boolean canUpdate() + { + return false; + } + + /** Gets the AutoCraftingManager that does all the crafting results */ + public AutoCraftingManager getCraftingManager() + { + if (craftManager == null) + { + craftManager = new AutoCraftingManager(this); + } + return craftManager; + } + + @Override + public Packet getDescriptionPacket() + { + NBTTagCompound nbt = new NBTTagCompound(); + this.writeToNBT(nbt); + return ResonantInduction.PACKET_TILE.getPacket(this, nbt); + } + + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + try + { + readFromNBT(PacketHandler.readNBTTagCompound(data)); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @Override + public int getSizeInventory() + { + return 10 + (this.invPlayer != null ? this.invPlayer.getSizeInventory() : 0); + } + + /** DO NOT USE THIS INTERNALLY. FOR EXTERNAL USE ONLY! */ + @Override + public ItemStack getStackInSlot(int slot) + { + if (slot < CRAFTING_MATRIX_END) + { + return this.craftingMatrix[slot]; + } + else if (slot < CRAFTING_OUTPUT_END) + { + return outputInventory[slot - CRAFTING_MATRIX_END]; + } + else if (slot < PLAYER_OUTPUT_END && invPlayer != null) + { + return this.invPlayer.getStackInSlot(slot - CRAFTING_OUTPUT_END); + } + else if (searchInventories) + { + int idDisplacement = PLAYER_OUTPUT_END; + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); + + if (tile instanceof IInventory) + { + IInventory inventory = (IInventory) tile; + int slotID = slot - idDisplacement; + + if (slotID >= 0 && slotID < inventory.getSizeInventory()) + return inventory.getStackInSlot(slotID); + + idDisplacement += inventory.getSizeInventory(); + } + } + } + + return null; + } + + @Override + public ItemStack decrStackSize(int i, int amount) + { + if (getStackInSlot(i) != null) + { + ItemStack stack; + + if (getStackInSlot(i).stackSize <= amount) + { + stack = getStackInSlot(i); + setInventorySlotContents(i, null); + return stack; + } + else + { + stack = getStackInSlot(i).splitStack(amount); + + if (getStackInSlot(i).stackSize == 0) + { + setInventorySlotContents(i, null); + } + + return stack; + } + } + else + { + return null; + } + } + + @Override + public void setInventorySlotContents(int slot, ItemStack itemStack) + { + if (slot < CRAFTING_MATRIX_END) + { + craftingMatrix[slot] = itemStack; + } + else if (slot < CRAFTING_OUTPUT_END) + { + outputInventory[slot - CRAFTING_MATRIX_END] = itemStack; + } + else if (slot < PLAYER_OUTPUT_END && this.invPlayer != null) + { + this.invPlayer.setInventorySlotContents(slot - CRAFTING_OUTPUT_END, itemStack); + EntityPlayer player = this.invPlayer.player; + + if (player instanceof EntityPlayerMP) + { + ((EntityPlayerMP) player).sendContainerToPlayer(player.inventoryContainer); + } + } + else if (searchInventories) + { + int idDisplacement = PLAYER_OUTPUT_END; + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); + + if (tile instanceof IInventory) + { + IInventory inventory = (IInventory) tile; + int slotID = slot - idDisplacement; + + if (slotID >= 0 && slotID < inventory.getSizeInventory()) + inventory.setInventorySlotContents(slotID, itemStack); + + idDisplacement += inventory.getSizeInventory(); + } + } + } + + onInventoryChanged(); + } + + /** 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. */ + @Override + public ItemStack getStackInSlotOnClosing(int slot) + { + if (this.getStackInSlot(slot) != null) + { + ItemStack var2 = this.getStackInSlot(slot); + this.setInventorySlotContents(slot, null); + return var2; + } + else + { + return null; + } + } + + @Override + public String getInvName() + { + return this.getBlockType().getLocalizedName(); + } + + @Override + public void openChest() + { + this.onInventoryChanged(); + } + + @Override + public void closeChest() + { + this.onInventoryChanged(); + } + + /** Construct an InventoryCrafting Matrix on the fly. + * + * @return */ + public InventoryCrafting getCraftingMatrix() + { + InventoryCrafting inventoryCrafting = new InventoryCrafting(new ContainerDummy(this), 3, 3); + + for (int i = 0; i < this.craftingMatrix.length; i++) + { + inventoryCrafting.setInventorySlotContents(i, this.craftingMatrix[i]); + } + + return inventoryCrafting; + } + + /** Updates all the output slots. Call this to update the Engineering Table. */ + @Override + public void onInventoryChanged() + { + if (worldObj != null) + { + if (!worldObj.isRemote) + { + this.outputInventory[CRAFTING_OUTPUT_SLOT] = null; + + /** Try to craft from crafting grid. If not possible, then craft from imprint. */ + boolean didCraft = false; + + /** Simulate an Inventory Crafting Instance */ + InventoryCrafting inventoryCrafting = this.getCraftingMatrix(); + + ItemStack matrixOutput = CraftingManager.getInstance().findMatchingRecipe(inventoryCrafting, this.worldObj); + + if (matrixOutput != null && this.getCraftingManager().getIdealRecipe(matrixOutput) != null) + { + this.outputInventory[CRAFTING_OUTPUT_SLOT] = matrixOutput; + didCraft = true; + } + + /** If output does not exist, try using the filter. */ + if (!didCraft) + { + ItemStack filterStack = craftingMatrix[CENTER_SLOT]; + + if (filterStack != null && filterStack.getItem() instanceof ItemImprint) + { + Set filters = ItemImprint.getFilters(filterStack); + + for (ItemStack outputStack : filters) + { + if (outputStack != null) + { + Pair idealRecipe = this.getCraftingManager().getIdealRecipe(outputStack); + + if (idealRecipe != null) + { + ItemStack recipeOutput = idealRecipe.left(); + if (recipeOutput != null & recipeOutput.stackSize > 0) + { + this.outputInventory[CRAFTING_OUTPUT_SLOT] = recipeOutput; + didCraft = true; + break; + } + } + } + } + } + } + + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } + + @Override + public void onPickUpFromSlot(EntityPlayer entityPlayer, int slotID, ItemStack itemStack) + { + if (!worldObj.isRemote) + { + if (itemStack != null) + { + Pair idealRecipeItem = getCraftingManager().getIdealRecipe(itemStack); + + if (idealRecipeItem != null) + { + getCraftingManager().consumeItems(idealRecipeItem.right().clone()); + } + else + { + itemStack.stackSize = 0; + } + } + } + } + + // /////////////////////////////////////// + // // Save And Data processing ////// + // /////////////////////////////////////// + /** NBT Data */ + @Override + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + + NBTTagList nbtList = nbt.getTagList("Items"); + this.craftingMatrix = new ItemStack[9]; + this.outputInventory = new ItemStack[1]; + + for (int i = 0; i < nbtList.tagCount(); ++i) + { + NBTTagCompound stackTag = (NBTTagCompound) nbtList.tagAt(i); + byte id = stackTag.getByte("Slot"); + + if (id >= 0 && id < this.getSizeInventory()) + { + this.setInventorySlotContents(id, ItemStack.loadItemStackFromNBT(stackTag)); + } + } + + this.searchInventories = nbt.getBoolean("searchInventories"); + } + + /** Writes a tile entity to NBT. */ + @Override + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + + NBTTagList nbtList = new NBTTagList(); + + for (int i = 0; i < this.getSizeInventory(); ++i) + { + if (this.getStackInSlot(i) != null) + { + NBTTagCompound var4 = new NBTTagCompound(); + var4.setByte("Slot", (byte) i); + this.getStackInSlot(i).writeToNBT(var4); + nbtList.appendTag(var4); + } + } + + nbt.setTag("Items", nbtList); + nbt.setBoolean("searchInventories", this.searchInventories); + } + + // /////////////////////////////////////// + // // Inventory Access side Methods ////// + // /////////////////////////////////////// + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return true; + } + + @Override + public int getInventoryStackLimit() + { + return 64; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return this.worldObj.getBlockTileEntity(this.xCoord, this.yCoord, this.zCoord) != this ? false : entityplayer.getDistanceSq(this.xCoord + 0.5D, this.yCoord + 0.5D, this.zCoord + 0.5D) <= 64.0D; + + } + + @Override + public int[] getAccessibleSlotsFromSide(int side) + { + return new int[0]; + } + + /** Auto-crafting methods. */ + @Override + public boolean canInsertItem(int slot, ItemStack itemstack, int side) + { + if (getStackInSlot(4) != null && getStackInSlot(4).getItem() instanceof ItemImprint) + return true; + + int minSize = 64; + int optimalSlot = -1; + + for (int i = 0; i < craftingMatrix.length; i++) + { + ItemStack checkStack = getStackInSlot(i); + + if (checkStack != null && checkStack.isItemEqual(itemstack)) + { + if (checkStack.stackSize < minSize || optimalSlot < 0) + { + optimalSlot = i; + minSize = checkStack.stackSize; + } + } + } + + return slot == optimalSlot; + } + + @Override + public boolean canExtractItem(int slot, ItemStack itemstack, int side) + { + ItemStack outputStack = getStackInSlot(CRAFTING_MATRIX_END); + + if (outputStack != null) + { + /** Only allow take out crafting result when it can be crafted twice! */ + Pair idealRecipeItem = this.getCraftingManager().getIdealRecipe(outputStack); + ItemStack[] doubleResults = ArrayUtils.addAll(idealRecipeItem.right(), idealRecipeItem.right()); + + if (!getCraftingManager().consumeItems(false, doubleResults)) + { + return false; + } + } + + return slot == CRAFTING_MATRIX_END; + } + + @Override + public int[] getCraftingInv() + { + int[] slots = craftingSlots; + + if (playerSlots != null) + { + slots = ArrayUtils.addAll(playerSlots, slots); + } + + if (searchInventories) + { + int temporaryInvID = PLAYER_OUTPUT_END; + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = new Vector3(this).translate(dir).getTileEntity(worldObj); + + if (tile instanceof IInventory) + { + IInventory inventory = (IInventory) tile; + int[] nearbySlots = new int[inventory.getSizeInventory()]; + + for (int i = 0; i < inventory.getSizeInventory(); i++) + { + nearbySlots[i] = temporaryInvID++; + } + + slots = ArrayUtils.addAll(nearbySlots, slots); + } + } + } + + return slots; + } + + @Override + @SideOnly(Side.CLIENT) + protected TileRender newRenderer() + { + return new TileRender() + { + @Override + public boolean renderDynamic(Vector3 position, boolean isItem, float frame) + { + if (!isItem) + { + GL11.glPushMatrix(); + RenderItemOverlayUtility.renderItemOnSides(TileEngineeringTable.this, getStackInSlot(9), position.x, position.y, position.z); + RenderItemOverlayUtility.renderTopOverlay(TileEngineeringTable.this, craftingMatrix, getDirection(), position.x, position.y - 0.1, position.z); + GL11.glPopMatrix(); + } + + return false; + } + }; + } } diff --git a/archaic/src/main/scala/resonantinduction/archaic/filter/BlockImprinter.java b/archaic/src/main/scala/resonantinduction/archaic/filter/BlockImprinter.java index 9923d99cc..ca809bae2 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/filter/BlockImprinter.java +++ b/archaic/src/main/scala/resonantinduction/archaic/filter/BlockImprinter.java @@ -9,14 +9,14 @@ import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import resonantinduction.core.prefab.imprint.ItemImprint; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.utility.inventory.InventoryUtility; import codechicken.multipart.ControlKeyModifer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/filter/RenderImprinter.java b/archaic/src/main/scala/resonantinduction/archaic/filter/RenderImprinter.java index ece662474..174c01632 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/filter/RenderImprinter.java +++ b/archaic/src/main/scala/resonantinduction/archaic/filter/RenderImprinter.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; -import calclavia.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RenderItemOverlayUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/filter/TileFilter.java b/archaic/src/main/scala/resonantinduction/archaic/filter/TileFilter.java index 99be3dc45..66353e55e 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/filter/TileFilter.java +++ b/archaic/src/main/scala/resonantinduction/archaic/filter/TileFilter.java @@ -12,6 +12,16 @@ import net.minecraft.network.packet.Packet; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.IFluidHandler; +import resonant.api.IFilterable; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.content.module.TileRender; +import resonant.lib.network.Synced.SyncedInput; +import resonant.lib.network.Synced.SyncedOutput; +import resonant.lib.prefab.vector.Cuboid; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.prefab.imprint.ItemImprint; @@ -19,16 +29,6 @@ import resonantinduction.core.prefab.imprint.TileFilterable; import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.fluid.BlockFluidMixture; import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.api.resonantinduction.IFilterable; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.network.Synced.SyncedInput; -import calclavia.lib.network.Synced.SyncedOutput; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.utility.LanguageUtility; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -84,7 +84,6 @@ public class TileFilter extends TileFilterable implements IFilterable Vector3 checkBelow = position.clone().translate(ForgeDirection.DOWN); Block bAbove = Block.blocksList[checkAbove.getBlockID(worldObj)]; - Block bBelow = Block.blocksList[checkAbove.getBlockID(worldObj)]; if (bAbove instanceof BlockFluidMixture && (worldObj.isAirBlock(checkBelow.intX(), checkBelow.intY(), checkBelow.intZ()) || checkBelow.getTileEntity(worldObj) instanceof IFluidHandler)) { @@ -100,8 +99,9 @@ public class TileFilter extends TileFilterable implements IFilterable /** * Drop item from fluid. */ - for (RecipeResource resoure : MachineRecipes.INSTANCE.getOutput(RecipeType.MIXER.name(), "dust" + LanguageUtility.capitalizeFirst(ResourceGenerator.mixtureToMaterial(fluidBlock.getFluid().getName())))) + for (RecipeResource resoure : MachineRecipes.INSTANCE.getOutput(RecipeType.MIXER.name(), "dirtyDust" + LanguageUtility.capitalizeFirst(ResourceGenerator.mixtureToMaterial(fluidBlock.getFluid().getName())))) { + InventoryUtility.dropItemStack(worldObj, checkAbove.clone().add(0.5), resoure.getItemStack().copy(), 0, 0); } diff --git a/archaic/src/main/scala/resonantinduction/archaic/filter/TileImprinter.java b/archaic/src/main/scala/resonantinduction/archaic/filter/TileImprinter.java index eaf23c95d..388ac2422 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/filter/TileImprinter.java +++ b/archaic/src/main/scala/resonantinduction/archaic/filter/TileImprinter.java @@ -10,11 +10,11 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.network.packet.Packet; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileAdvanced; import resonantinduction.core.ResonantInduction; import resonantinduction.core.prefab.imprint.ItemImprint; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileAdvanced; import com.google.common.io.ByteArrayDataInput; diff --git a/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockFirebox.java b/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockFirebox.java index 2eefd8ae7..42ac7a055 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockFirebox.java +++ b/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockFirebox.java @@ -13,9 +13,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.utility.FluidUtility; import resonantinduction.core.Reference; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.utility.FluidUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockHotPlate.java b/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockHotPlate.java index b7f1f96ac..bd14f9267 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockHotPlate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/firebox/BlockHotPlate.java @@ -10,10 +10,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.DamageSource; import net.minecraft.util.Icon; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; import resonantinduction.core.Reference; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.block.BlockTile; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.java b/archaic/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.java index 05888ad8f..d6ad0576a 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/firebox/RenderHotPlate.java @@ -4,7 +4,7 @@ import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; -import calclavia.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RenderItemOverlayUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.java b/archaic/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.java index 5240dc4d7..5a714dfd4 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.java +++ b/archaic/src/main/scala/resonantinduction/archaic/firebox/TileFirebox.java @@ -1,11 +1,5 @@ package resonantinduction.archaic.firebox; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.Synced; -import calclavia.lib.prefab.tile.TileElectricalInventory; -import calclavia.lib.thermal.BoilEvent; -import calclavia.lib.thermal.ThermalPhysics; -import com.google.common.io.ByteArrayDataInput; import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -15,7 +9,18 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.Synced; +import resonant.lib.prefab.tile.TileElectricalInventory; +import resonant.lib.thermal.BoilEvent; +import resonant.lib.thermal.ThermalPhysics; import resonantinduction.archaic.Archaic; import resonantinduction.archaic.fluid.gutter.TileGutter; import resonantinduction.core.ResonantInduction; @@ -24,6 +29,8 @@ import resonantinduction.core.resource.TileMaterial; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector3; +import com.google.common.io.ByteArrayDataInput; + /** * Meant to replace the furnace class. * @@ -143,7 +150,7 @@ public class TileFirebox extends TileElectricalInventory implements IPacketRecei { if (FluidRegistry.getFluid("steam") != null) { - MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, volume), new FluidStack(FluidRegistry.getFluid("steam"), volume), 2)); + MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, volume), new FluidStack(FluidRegistry.getFluid("steam"), volume), 2, false)); boiledVolume += volume; } @@ -168,7 +175,7 @@ public class TileFirebox extends TileElectricalInventory implements IPacketRecei { if (FluidRegistry.getFluid("steam") != null) { - MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, volume), new FluidStack(FluidRegistry.getFluid("steam"), volume), 2)); + MinecraftForge.EVENT_BUS.post(new BoilEvent(worldObj, new Vector3(this).translate(0, 1, 0), new FluidStack(FluidRegistry.WATER, volume), new FluidStack(FluidRegistry.getFluid("steam"), volume), 2, false)); ((TileGutter) tileEntity).drain(ForgeDirection.DOWN, volume, true); } diff --git a/archaic/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.java b/archaic/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.java index 6557e6f71..ff948b446 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/firebox/TileHotPlate.java @@ -9,11 +9,11 @@ import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.IPacketSender; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileExternalInventory; import resonantinduction.core.ResonantInduction; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.IPacketSender; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileExternalInventory; import com.google.common.io.ByteArrayDataInput; diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.java index 7da2169f4..43212d9f3 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.java +++ b/archaic/src/main/scala/resonantinduction/archaic/fluid/grate/TileGrate.java @@ -1,10 +1,10 @@ package resonantinduction.archaic.fluid.grate; -import calclavia.lib.config.Config; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.utility.FluidUtility; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.PriorityQueue; + import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -12,16 +12,20 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import resonant.api.IRotatable; +import resonant.lib.config.Config; +import resonant.lib.utility.FluidUtility; import resonantinduction.core.Reference; import resonantinduction.core.fluid.TilePressureNode; import resonantinduction.core.grid.fluid.FluidPressureNode; import universalelectricity.api.vector.Vector3; - -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.PriorityQueue; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class TileGrate extends TilePressureNode implements IRotatable { diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.java index 5a7e28ab7..0ec607199 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.java +++ b/archaic/src/main/scala/resonantinduction/archaic/fluid/gutter/TileGutter.java @@ -1,16 +1,8 @@ package resonantinduction.archaic.fluid.gutter; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.render.FluidRenderUtility; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.utility.FluidUtility; -import calclavia.lib.utility.WorldUtility; -import calclavia.lib.utility.inventory.InventoryUtility; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.material.Material; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.entity.Entity; @@ -22,8 +14,24 @@ import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.fluids.*; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.IFluidTank; + import org.lwjgl.opengl.GL11; + +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.content.module.TileRender; +import resonant.lib.prefab.vector.Cuboid; +import resonant.lib.render.FluidRenderUtility; +import resonant.lib.render.RenderUtility; +import resonant.lib.utility.FluidUtility; +import resonant.lib.utility.WorldUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.archaic.fluid.grate.TileGrate; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction.RecipeType; @@ -31,9 +39,8 @@ import resonantinduction.core.fluid.TilePressureNode; import resonantinduction.core.grid.fluid.FluidPressureNode; import resonantinduction.core.grid.fluid.IPressureNodeProvider; import universalelectricity.api.vector.Vector3; - -import java.util.ArrayList; -import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * The gutter, used for fluid transfer. diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockFluidContainer.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockFluidContainer.java deleted file mode 100644 index 7f1dbc4f8..000000000 --- a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockFluidContainer.java +++ /dev/null @@ -1,138 +0,0 @@ -package resonantinduction.archaic.fluid.tank; - -import java.util.List; - -import net.minecraft.block.Block; -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.potion.Potion; -import net.minecraft.potion.PotionEffect; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; -import net.minecraftforge.common.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import resonantinduction.archaic.Archaic; -import resonantinduction.core.fluid.TileFluidDistribution; -import universalelectricity.api.energy.UnitDisplay; -import universalelectricity.api.energy.UnitDisplay.Unit; -import universalelectricity.api.energy.UnitDisplay.UnitPrefix; -import universalelectricity.api.vector.Vector3; -import calclavia.lib.utility.LanguageUtility; - -/** @author Darkguardsman */ -public class ItemBlockFluidContainer extends ItemBlock -{ - public ItemBlockFluidContainer(int id) - { - super(id); - this.setMaxDamage(0); - this.setHasSubtypes(true); - } - - @Override - public int getMetadata(int damage) - { - return damage; - } - - @Override - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) - { - if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("fluid")) - { - FluidStack fluid = FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag("fluid")); - - if (fluid != null) - { - list.add("Fluid: " + fluid.getFluid().getLocalizedName()); - list.add("Volume: " + UnitDisplay.getDisplay(fluid.amount, Unit.LITER, UnitPrefix.MILLI)); - } - } - } - - public static ItemStack getWrenchedItem(World world, Vector3 vec) - { - TileEntity entity = vec.getTileEntity(world); - - if (entity instanceof TileTank && ((TileTank) entity).getInternalTank() != null && ((TileTank) entity).getInternalTank().getFluid() != null) - { - ItemStack itemStack = new ItemStack(Archaic.blockTank); - - FluidStack stack = ((TileTank) entity).getInternalTank().getFluid(); - - if (itemStack.getTagCompound() == null) - { - itemStack.setTagCompound(new NBTTagCompound()); - } - if (stack != null) - { - ((TileTank) entity).drain(ForgeDirection.UNKNOWN, stack.amount, true); - itemStack.getTagCompound().setCompoundTag("fluid", stack.writeToNBT(new NBTTagCompound())); - } - return itemStack; - } - - return null; - } - - @Override - public void onUpdate(ItemStack itemStack, World par2World, Entity entity, int par4, boolean par5) - { - if (entity instanceof EntityPlayer) - { - EntityPlayer player = (EntityPlayer) entity; - - if (itemStack.getTagCompound() != null && !player.capabilities.isCreativeMode && itemStack.getTagCompound().hasKey("fluid")) - { - player.addPotionEffect(new PotionEffect(Potion.moveSlowdown.id, 5, 0)); - } - } - } - - @Override - public int getItemStackLimit(ItemStack stack) - { - if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("fluid")) - { - return 1; - } - return this.maxStackSize; - } - - @Override - public String getUnlocalizedName(ItemStack itemStack) - { - String translation = LanguageUtility.getLocal(Block.blocksList[this.getBlockID()].getUnlocalizedName() + "." + itemStack.getItemDamage()); - - if (translation == null || translation.isEmpty()) - { - return Block.blocksList[this.getBlockID()].getUnlocalizedName(); - } - - return Block.blocksList[this.getBlockID()].getUnlocalizedName() + "." + itemStack.getItemDamage(); - } - - @Override - public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) - { - if (super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) - { - TileEntity tile = world.getBlockTileEntity(x, y, z); - if (tile instanceof TileFluidDistribution) - { - ((TileFluidDistribution) tile).setSubID(stack.getItemDamage()); - - if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("fluid")) - { - ((TileFluidDistribution) tile).getInternalTank().fill(FluidStack.loadFluidStackFromNBT(stack.getTagCompound().getCompoundTag("fluid")), true); - } - } - return true; - } - - return false; - } -} diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java new file mode 100644 index 000000000..42a73936e --- /dev/null +++ b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/ItemBlockTank.java @@ -0,0 +1,245 @@ +package resonantinduction.archaic.fluid.tank; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.IFluidContainerItem; +import resonant.lib.utility.LanguageUtility; +import resonantinduction.archaic.Archaic; +import resonantinduction.core.fluid.TileFluidDistribution; +import universalelectricity.api.energy.UnitDisplay; +import universalelectricity.api.energy.UnitDisplay.Unit; +import universalelectricity.api.energy.UnitDisplay.UnitPrefix; +import universalelectricity.api.vector.Vector3; + +/** @author Darkguardsman */ +public class ItemBlockTank extends ItemBlock implements IFluidContainerItem +{ + public ItemBlockTank(int id) + { + super(id); + this.setMaxDamage(0); + this.setHasSubtypes(true); + } + + @Override + public int getMetadata(int damage) + { + return damage; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) + { + if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("fluid")) + { + FluidStack fluid = getFluid(stack); + + if (fluid != null) + { + list.add("Fluid: " + fluid.getFluid().getLocalizedName()); + list.add("Volume: " + UnitDisplay.getDisplay(fluid.amount, Unit.LITER, UnitPrefix.MILLI)); + } + } + } + + public static ItemStack getWrenchedItem(World world, Vector3 vec) + { + TileEntity entity = vec.getTileEntity(world); + + if (entity instanceof TileTank && ((TileTank) entity).getInternalTank() != null && ((TileTank) entity).getInternalTank().getFluid() != null) + { + ItemStack itemStack = new ItemStack(Archaic.blockTank); + + FluidStack stack = ((TileTank) entity).getInternalTank().getFluid(); + + if (stack != null) + { + if (itemStack.getTagCompound() == null) + { + itemStack.setTagCompound(new NBTTagCompound()); + } + ((TileTank) entity).drain(ForgeDirection.UNKNOWN, stack.amount, true); + itemStack.getTagCompound().setCompoundTag("fluid", stack.writeToNBT(new NBTTagCompound())); + } + return itemStack; + } + + return null; + } + + @Override + public int getItemStackLimit(ItemStack stack) + { + if (stack.getTagCompound() != null && stack.getTagCompound().hasKey("fluid")) + { + return 1; + } + return this.maxStackSize; + } + + @Override + public String getUnlocalizedName(ItemStack itemStack) + { + String translation = LanguageUtility.getLocal(Block.blocksList[this.getBlockID()].getUnlocalizedName() + "." + itemStack.getItemDamage()); + + if (translation == null || translation.isEmpty()) + { + return Block.blocksList[this.getBlockID()].getUnlocalizedName(); + } + + return Block.blocksList[this.getBlockID()].getUnlocalizedName() + "." + itemStack.getItemDamage(); + } + + @Override + public boolean placeBlockAt(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ, int metadata) + { + if (super.placeBlockAt(stack, player, world, x, y, z, side, hitX, hitY, hitZ, metadata)) + { + TileEntity tile = world.getBlockTileEntity(x, y, z); + if (tile instanceof TileFluidDistribution) + { + ((TileFluidDistribution) tile).setSubID(stack.getItemDamage()); + ((TileFluidDistribution) tile).getInternalTank().fill(getFluid(stack), true); + + } + return true; + } + + return false; + } + + @Override + public FluidStack getFluid(ItemStack container) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("fluid")) + { + return null; + } + return FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("fluid")); + } + + @Override + public int getCapacity(ItemStack container) + { + return TileTank.VOLUME; + } + + @Override + public int fill(ItemStack container, FluidStack resource, boolean doFill) + { + if (resource == null) + { + return 0; + } + + if (!doFill) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("fluid")) + { + return Math.min(getCapacity(container), resource.amount); + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("fluid")); + + if (stack == null) + { + return Math.min(getCapacity(container), resource.amount); + } + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + return Math.min(getCapacity(container) - stack.amount, resource.amount); + } + + if (container.stackTagCompound == null) + { + container.stackTagCompound = new NBTTagCompound(); + } + + if (!container.stackTagCompound.hasKey("fluid")) + { + NBTTagCompound fluidTag = resource.writeToNBT(new NBTTagCompound()); + + if (getCapacity(container) < resource.amount) + { + fluidTag.setInteger("Amount", getCapacity(container)); + container.stackTagCompound.setTag("fluid", fluidTag); + return getCapacity(container); + } + + container.stackTagCompound.setTag("fluid", fluidTag); + return resource.amount; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("fluid"); + FluidStack stack = FluidStack.loadFluidStackFromNBT(fluidTag); + + if (!stack.isFluidEqual(resource)) + { + return 0; + } + + int filled = getCapacity(container) - stack.amount; + if (resource.amount < filled) + { + stack.amount += resource.amount; + filled = resource.amount; + } + else + { + stack.amount = getCapacity(container); + } + + container.stackTagCompound.setTag("fluid", stack.writeToNBT(fluidTag)); + return filled; + } + + @Override + public FluidStack drain(ItemStack container, int maxDrain, boolean doDrain) + { + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("fluid") || maxDrain == 0) + { + return null; + } + + FluidStack stack = FluidStack.loadFluidStackFromNBT(container.stackTagCompound.getCompoundTag("fluid")); + if (stack == null) + { + return null; + } + + int drained = Math.min(stack.amount, maxDrain); + if (doDrain) + { + if (maxDrain >= stack.amount) + { + container.stackTagCompound.removeTag("fluid"); + + if (container.stackTagCompound.hasNoTags()) + { + container.stackTagCompound = null; + } + return stack; + } + + NBTTagCompound fluidTag = container.stackTagCompound.getCompoundTag("fluid"); + fluidTag.setInteger("Amount", fluidTag.getInteger("Amount") - maxDrain); + container.stackTagCompound.setTag("fluid", fluidTag); + } + stack.amount = drained; + return stack; + } +} diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TankNetwork.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TankNetwork.java index f22f5bddb..95a8a83f0 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TankNetwork.java +++ b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TankNetwork.java @@ -3,13 +3,12 @@ package resonantinduction.archaic.fluid.tank; import java.util.Comparator; import java.util.HashMap; import java.util.PriorityQueue; -import java.util.Random; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.fluids.FluidStack; +import resonant.lib.utility.FluidUtility; import resonantinduction.core.fluid.FluidDistributionetwork; import resonantinduction.core.fluid.IFluidDistribution; -import calclavia.lib.utility.FluidUtility; /** * Network that handles connected tanks diff --git a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java index ea5e2550c..f7491efa0 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java +++ b/archaic/src/main/scala/resonantinduction/archaic/fluid/tank/TileTank.java @@ -1,15 +1,7 @@ package resonantinduction.archaic.fluid.tank; -import calclavia.lib.content.module.TileBlock.IComparatorInputOverride; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.render.FluidRenderUtility; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.utility.FluidUtility; -import calclavia.lib.utility.WorldUtility; -import calclavia.lib.utility.inventory.InventoryUtility; -import calclavia.lib.utility.render.RenderBlockUtility; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.awt.Color; + import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; @@ -19,7 +11,17 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; + import org.lwjgl.opengl.GL11; + +import resonant.lib.content.module.TileBlock.IComparatorInputOverride; +import resonant.lib.content.module.TileRender; +import resonant.lib.render.FluidRenderUtility; +import resonant.lib.render.RenderUtility; +import resonant.lib.utility.FluidUtility; +import resonant.lib.utility.WorldUtility; +import resonant.lib.utility.inventory.InventoryUtility; +import resonant.lib.utility.render.RenderBlockUtility; import resonantinduction.archaic.Archaic; import resonantinduction.core.Reference; import resonantinduction.core.fluid.FluidDistributionetwork; @@ -27,8 +29,8 @@ import resonantinduction.core.fluid.IFluidDistribution; import resonantinduction.core.fluid.TileFluidDistribution; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.vector.Vector3; - -import java.awt.*; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class TileTank extends TileFluidDistribution implements IComparatorInputOverride { @@ -40,7 +42,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO this.getInternalTank().setCapacity(VOLUME * FluidContainerRegistry.BUCKET_VOLUME); isOpaqueCube = false; normalRender = false; - itemBlock = ItemBlockFluidContainer.class; + itemBlock = ItemBlockTank.class; } @Override @@ -56,7 +58,7 @@ public class TileTank extends TileFluidDistribution implements IComparatorInputO { if (player.isSneaking()) { - ItemStack dropStack = ItemBlockFluidContainer.getWrenchedItem(world(), position()); + ItemStack dropStack = ItemBlockTank.getWrenchedItem(world(), position()); if (dropStack != null) { if (player.getHeldItem() == null) diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/BlockCastingMold.java b/archaic/src/main/scala/resonantinduction/archaic/process/BlockCastingMold.java index b9a33d6e3..d4ebfa726 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/BlockCastingMold.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/BlockCastingMold.java @@ -5,11 +5,11 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.render.block.BlockRenderingHandler; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.render.block.BlockRenderingHandler; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/BlockMillstone.java b/archaic/src/main/scala/resonantinduction/archaic/process/BlockMillstone.java index 3e451c7e9..a3417c97c 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/BlockMillstone.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/BlockMillstone.java @@ -8,11 +8,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import resonantinduction.core.resource.ItemHandCrank; import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.java b/archaic/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.java index 8a6f5e64e..1a1026287 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/RenderCastingMold.java @@ -7,9 +7,9 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.render.RenderUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/RenderMillstone.java b/archaic/src/main/scala/resonantinduction/archaic/process/RenderMillstone.java index 06b8779f7..3a1b037b5 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/RenderMillstone.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/RenderMillstone.java @@ -3,7 +3,7 @@ package resonantinduction.archaic.process; import net.minecraft.client.renderer.RenderBlocks; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; -import calclavia.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RenderItemOverlayUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/TileCastingMold.java b/archaic/src/main/scala/resonantinduction/archaic/process/TileCastingMold.java index 3de5e4d6f..c0f3737ad 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/TileCastingMold.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/TileCastingMold.java @@ -10,15 +10,15 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileExternalInventory; +import resonant.lib.utility.FluidUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction.RecipeType; import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileExternalInventory; -import calclavia.lib.utility.FluidUtility; import com.google.common.io.ByteArrayDataInput; diff --git a/archaic/src/main/scala/resonantinduction/archaic/process/TileMillstone.java b/archaic/src/main/scala/resonantinduction/archaic/process/TileMillstone.java index 88b973dba..b6aa3a311 100644 --- a/archaic/src/main/scala/resonantinduction/archaic/process/TileMillstone.java +++ b/archaic/src/main/scala/resonantinduction/archaic/process/TileMillstone.java @@ -5,15 +5,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraftforge.common.ForgeDirection; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileExternalInventory; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction.RecipeType; import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileExternalInventory; -import calclavia.lib.utility.inventory.InventoryUtility; import com.google.common.io.ByteArrayDataInput; diff --git a/archaic/src/main/scala/resonantinduction/archaic/waila/Waila.java b/archaic/src/main/scala/resonantinduction/archaic/waila/Waila.java new file mode 100644 index 000000000..8b168898a --- /dev/null +++ b/archaic/src/main/scala/resonantinduction/archaic/waila/Waila.java @@ -0,0 +1,36 @@ +package resonantinduction.archaic.waila; + +import resonant.lib.modproxy.ICompatProxy; +import resonant.lib.utility.Mods; +import cpw.mods.fml.common.event.FMLInterModComms; + +/** + * @since 21/03/14 + * @author tgame14 + */ +public class Waila implements ICompatProxy +{ + @Override + public void preInit () + { + // nothing + } + + @Override + public void init () + { + FMLInterModComms.sendMessage(Mods.WAILA(), "register", "resonantinduction.archaic.waila.WailaRegistrar.wailaCallBack"); + } + + @Override + public void postInit () + { + // nothing + } + + @Override + public String modId () + { + return Mods.WAILA(); + } +} diff --git a/archaic/src/main/scala/resonantinduction/archaic/waila/WailaCrate.java b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaCrate.java new file mode 100644 index 000000000..3d301eecc --- /dev/null +++ b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaCrate.java @@ -0,0 +1,57 @@ +package resonantinduction.archaic.waila; + +import java.util.List; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import resonant.lib.utility.LanguageUtility; +import resonantinduction.archaic.crate.TileCrate; + +/** Waila support for crates + * + * @author Darkguardsman */ +public class WailaCrate implements IWailaDataProvider +{ + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + TileEntity tile = accessor.getTileEntity(); + if (tile instanceof TileCrate) + { + ItemStack stored = ((TileCrate) tile).getSampleStack(); + int cap = ((TileCrate) tile).getSlotCount() * 64; + if (stored != null) + { + currenttip.add(LanguageUtility.getLocal("info.waila.crate.stack") + " " + stored.getDisplayName()); + currenttip.add(LanguageUtility.getLocal("info.waila.crate.stored") + " " + stored.stackSize + " / " + cap); + } + else + { + currenttip.add(LanguageUtility.getLocal("info.waila.crate.empty")); + } + } + return currenttip; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return currenttip; + } + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return null; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return currenttip; + } + +} diff --git a/archaic/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java new file mode 100644 index 000000000..86179a542 --- /dev/null +++ b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaFluidTank.java @@ -0,0 +1,57 @@ +package resonantinduction.archaic.waila; + +import java.util.List; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.fluids.FluidTank; +import resonant.lib.utility.LanguageUtility; +import resonantinduction.archaic.fluid.tank.TileTank; + +/** Waila support for tanks + * + * @author Darkguardsman */ +public class WailaFluidTank implements IWailaDataProvider +{ + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + TileEntity tile = accessor.getTileEntity(); + if (tile instanceof TileTank) + { + FluidTank tank = ((TileTank) tile).getInternalTank(); + if (tank != null && tank.getFluid() != null) + { + currenttip.add(LanguageUtility.getLocal("info.waila.tank.fluid") + " " + tank.getFluid().getFluid().getLocalizedName()); + currenttip.add(LanguageUtility.getLocal("info.waila.tank.vol") + " " + tank.getFluidAmount() + " / " + tank.getCapacity()); + } + else + { + currenttip.add(LanguageUtility.getLocal("info.waila.tank.empty")); + } + } + return currenttip; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return currenttip; + } + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return null; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) + { + return currenttip; + } + +} diff --git a/archaic/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.java b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.java new file mode 100644 index 000000000..158925550 --- /dev/null +++ b/archaic/src/main/scala/resonantinduction/archaic/waila/WailaRegistrar.java @@ -0,0 +1,14 @@ +package resonantinduction.archaic.waila; + +import mcp.mobius.waila.api.IWailaRegistrar; +import resonantinduction.archaic.crate.TileCrate; +import resonantinduction.archaic.fluid.tank.TileTank; + +public class WailaRegistrar +{ + public static void wailaCallBack(IWailaRegistrar registrar) + { + registrar.registerBodyProvider(new WailaCrate(), TileCrate.class); + registrar.registerBodyProvider(new WailaFluidTank(), TileTank.class); + } +} diff --git a/build-old.gradle b/build-old.gradle deleted file mode 100644 index a2e5db9a2..000000000 --- a/build-old.gradle +++ /dev/null @@ -1,137 +0,0 @@ -buildscript { - repositories { - mavenCentral() - maven { - name = "forge" - url = "http://files.minecraftforge.net/maven" - } - } - dependencies { - classpath 'net.minecraftforge.gradle:ForgeGradle:1.0-SNAPSHOT' - } -} - -apply plugin: 'forge' -apply plugin: 'maven-publish' - -sourceSets { - main { - java { - srcDirs 'src/main/java', 'archaic/src/main/java', 'electrical/src/main/java', 'mechanical/src/main/java' - //exclude 'resonantinduction/core/nei/**' - } - } -} - -ext.buildProps = file "build.properties" - -buildProps.withReader { - def prop = new Properties() - prop.load(it) - ext.config = new ConfigSlurper().parse prop -} - -version = "${config.version.mod.major}.${config.version.mod.minor}.${config.version.mod.revis}" -group = "resonantinduction" -archivesBaseName = "${System.getenv().JOB_NAME}" - -minecraft { - version = "${config.version.minecraft}-${config.version.forge}" - - replaceIn "Reference.java" - replace "@MAJOR@", config.version.mod.major - replace "@MINOR@", config.version.mod.minor - replace "@REVIS@", config.version.mod.revis - replace "@BUILD@", System.getenv("BUILD_NUMBER") -} - -if (System.getenv("BUILD_NUMBER") != null) - version += ".${System.getenv("BUILD_NUMBER")}" - - -processResources { - from 'build.properties' -} - -task copyBuildXml(type: Copy) { - from 'build.properties' - into 'output' -} - -task apiZip(type: Zip) { - classifier = 'api' - from sourceSets*.allSource - include 'resonantinduction/api/**' - destinationDir = file 'output' -} - -artifacts { - archives apiZip -} - -jar { - dependsOn copyBuildXml - classifier = '' - destinationDir = file 'output' -} - -repositories { - maven { - name 'Calclavia Maven' - url 'http://calclavia.com/maven' - } - - ivy { - name 'FMP' - artifactPattern "http://files.minecraftforge.net/[module]/[module]-dev-[revision].[ext]" - } - - ivy { - artifactPattern "http://www.chickenbones.craftsaddle.org/Files/New_Versions/1.6.4/[module]-dev%20[revision].[ext]" - } -} - -dependencies { - compile group: 'universalelectricity', name: 'Universal-Electricity', version: "${config.version.universalelectricity}", classifier: "dev" - compile group: 'calclaviacore', name: 'calclavia-core', version: "${config.version.calclaviacore}", classifier: "dev" - compile name: 'CodeChickenLib', version: "${config.version.minecraft}-${config.version.cclib}", ext: 'jar' - compile name: 'ForgeMultipart', version: "${config.version.minecraft}-${config.version.fmp}", ext: 'jar' - compile name: 'NotEnoughItems', version: "${config.version.nei}", ext: 'jar' - compile name: 'CodeChickenCore', version: "${config.version.cccore}", ext: 'jar' -} - -publishing { - publications { - mavenJava(MavenPublication) { - artifact jar - /*artifact apiZip*/ - - artifact { - file 'output/build.properties' - } - } - } - repositories { - maven { - url "file://var/www/maven" - } - } -} - -import net.minecraftforge.gradle.tasks.dev.ChangelogTask -import net.minecraftforge.gradle.common.Constants -import net.minecraftforge.gradle.delayed.* - -task createChangelog(type: ChangelogTask) { - def jobName = "${System.getenv().JOB_NAME}" - def buildNumber = "${System.getenv().BUILD_NUMBER}" - jobName.replaceAll(' ','%20') - setServerRoot(new DelayedString(project, 'http://ci.calclavia.com/')) - setJobName(new DelayedString(project, jobName.toString())); - setAuthName(new DelayedString(project, 'console_script')); - setAuthPassword(new DelayedString(project, '625d2ac53190be3422faa0c474fb299b')); - setTargetBuild({buildNumber.toString()}); - setOutput(new DelayedFile(project, 'output/' + jobName + "-${project.version}" + '-changelog' + '.txt')); -} - -build.dependsOn "createChangelog" \ No newline at end of file diff --git a/build.gradle b/build.gradle index 187a55e46..5440e6dde 100644 --- a/build.gradle +++ b/build.gradle @@ -67,10 +67,7 @@ allprojects { dependencies { compile group: 'universalelectricity', name: 'Universal-Electricity', version: "${rootProject.config.version.universalelectricity}", classifier: "dev" - if (System.getenv().JOB_NAME == "Resonant-Induction-Development") - compile group: 'calclavia-core-development', name: 'calclavia-core', version: "${rootProject.config.version.calclaviacore}", classifier: "dev" - else - compile group: 'calclavia-core', name: 'calclavia-core', version: "${config.version.calclaviacore}", classifier: "dev" + compile group: 'resonant-engine-development', name: 'resonant-engine', version: "${config.version.resonantengine}", classifier: "dev" compile name: 'CodeChickenLib', version: "${config.version.minecraft}-${config.version.cclib}", ext: 'jar' compile name: 'ForgeMultipart', version: "${config.version.minecraft}-${config.version.fmp}", ext: 'jar' @@ -99,8 +96,8 @@ allprojects { } subprojects { - archivesBaseName = "${System.getenv().JOB_NAME}" - + archivesBaseName = "${System.getenv().JOB_NAME}" + sourceSets.main.compileClasspath += rootProject.sourceSets.api.output dependencies { compile rootProject } @@ -127,7 +124,7 @@ task apiZip(type: Zip) { include 'resonantinduction/api/**' destinationDir = file 'output' } - + artifacts { archives apiZip } diff --git a/build.properties b/build.properties index 80098a3ff..3afcc5640 100644 --- a/build.properties +++ b/build.properties @@ -3,7 +3,7 @@ dir.mcp=${dir.development}forge/mcp version.minecraft=1.6.4 version.forge=9.11.1.964 version.universalelectricity=3.1.+ -version.calclaviacore=1.2.+ +version.resonantengine=1.2.+ version.cclib=1.0.0.61 version.cccore=0.9.0.9 version.fmp=1.0.0.244 diff --git a/electrical/src/main/scala/resonantinduction/electrical/ClientProxy.java b/electrical/src/main/scala/resonantinduction/electrical/ClientProxy.java index 0813c8f4a..5a1503fb2 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/ClientProxy.java +++ b/electrical/src/main/scala/resonantinduction/electrical/ClientProxy.java @@ -3,12 +3,14 @@ package resonantinduction.electrical; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import net.minecraftforge.client.MinecraftForgeClient; +import resonant.lib.render.item.GlobalItemRenderer; import resonantinduction.electrical.battery.RenderBattery; import resonantinduction.electrical.battery.TileBattery; import resonantinduction.electrical.charger.RenderCharger; import resonantinduction.electrical.encoder.TileEncoder; import resonantinduction.electrical.encoder.gui.GuiEncoderInventory; -import resonantinduction.electrical.generator.solar.TileSolarPanel; +import resonantinduction.electrical.laser.gun.RenderMiningLaserGun; import resonantinduction.electrical.levitator.RenderLevitator; import resonantinduction.electrical.multimeter.GuiMultimeter; import resonantinduction.electrical.multimeter.PartMultimeter; @@ -19,7 +21,6 @@ import resonantinduction.electrical.tesla.TileTesla; import resonantinduction.electrical.transformer.RenderTransformer; import resonantinduction.quantum.gate.RenderQuantumGlyph; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.item.GlobalItemRenderer; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; import cpw.mods.fml.client.FMLClientHandler; @@ -40,6 +41,7 @@ public class ClientProxy extends CommonProxy GlobalItemRenderer.register(Electrical.itemCharger.itemID, RenderCharger.INSTANCE); GlobalItemRenderer.register(Electrical.itemLevitator.itemID, RenderLevitator.INSTANCE); GlobalItemRenderer.register(Electrical.itemQuantumGlyph.itemID, RenderQuantumGlyph.INSTANCE); + MinecraftForgeClient.registerItemRenderer(Electrical.itemLaserGun.itemID, new RenderMiningLaserGun()); ClientRegistry.bindTileEntitySpecialRenderer(TileTesla.class, new RenderTesla()); ClientRegistry.bindTileEntitySpecialRenderer(TileBattery.class, new RenderBattery()); } diff --git a/electrical/src/main/scala/resonantinduction/electrical/CommonProxy.java b/electrical/src/main/scala/resonantinduction/electrical/CommonProxy.java index 18e791ba8..e985b805f 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/CommonProxy.java +++ b/electrical/src/main/scala/resonantinduction/electrical/CommonProxy.java @@ -5,12 +5,12 @@ import java.awt.Color; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import resonant.lib.prefab.ProxyBase; import resonantinduction.electrical.encoder.TileEncoder; import resonantinduction.electrical.encoder.gui.ContainerEncoder; import resonantinduction.electrical.multimeter.ContainerMultimeter; import resonantinduction.electrical.multimeter.PartMultimeter; import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.ProxyBase; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; diff --git a/electrical/src/main/scala/resonantinduction/electrical/Electrical.java b/electrical/src/main/scala/resonantinduction/electrical/Electrical.java index 7f926527e..ff995f052 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/Electrical.java +++ b/electrical/src/main/scala/resonantinduction/electrical/Electrical.java @@ -7,6 +7,10 @@ import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; +import resonant.lib.content.ContentRegistry; +import resonant.lib.modproxy.ProxyHandler; +import resonant.lib.network.PacketHandler; +import resonant.lib.recipe.UniversalRecipe; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.Settings; @@ -21,6 +25,8 @@ import resonantinduction.electrical.generator.TileMotor; import resonantinduction.electrical.generator.solar.TileSolarPanel; import resonantinduction.electrical.generator.thermopile.BlockThermopile; import resonantinduction.electrical.generator.thermopile.TileThermopile; +import resonantinduction.electrical.itemrailing.ItemItemRailing; +import resonantinduction.electrical.laser.gun.ItemMiningLaser; import resonantinduction.electrical.levitator.ItemLevitator; import resonantinduction.electrical.multimeter.ItemMultimeter; import resonantinduction.electrical.tesla.BlockTesla; @@ -29,9 +35,6 @@ import resonantinduction.electrical.transformer.ItemTransformer; import resonantinduction.electrical.wire.EnumWireMaterial; import resonantinduction.electrical.wire.ItemWire; import resonantinduction.quantum.gate.ItemQuantumGlyph; -import calclavia.lib.content.ContentRegistry; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.recipe.UniversalRecipe; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -77,7 +80,10 @@ public class Electrical public static Item itemCharger; public static Block blockTesla; public static Block blockBattery; - public static Block blockEncoder; + public static Block blockEncoder; + + // Railings + public static Item itemRailing; // Generators public static Block blockSolarPanel; @@ -93,10 +99,16 @@ public class Electrical // Quantum public static Block blockQuantumGate; public static Item itemQuantumGlyph; + + // Tools + public static Item itemLaserGun; + + public ProxyHandler modproxies; @EventHandler public void preInit(FMLPreInitializationEvent evt) { + modproxies = new ProxyHandler(); NetworkRegistry.instance().registerGuiHandler(this, proxy); Settings.CONFIGURATION.load(); @@ -115,6 +127,7 @@ public class Electrical // blockEncoder = contentRegistry.createTile(BlockEncoder.cass); // itemDisk = contentRegistry.createItem(ItemDisk.class); itemInsulation = contentRegistry.createItem("insulation", ItemResourcePart.class); + itemLaserGun = contentRegistry.createItem("laserDrill", ItemMiningLaser.class); // Generator blockSolarPanel = contentRegistry.newBlock(TileSolarPanel.class); @@ -123,6 +136,10 @@ public class Electrical // Quantum itemQuantumGlyph = contentRegistry.createItem(ItemQuantumGlyph.class); + + //Railings + itemRailing = contentRegistry.createItem(ItemItemRailing.class); + Settings.CONFIGURATION.save(); OreDictionary.registerOre("wire", itemWire); @@ -141,6 +158,7 @@ public class Electrical } proxy.preInit(); + modproxies.preInit(); } @EventHandler @@ -149,6 +167,7 @@ public class Electrical Settings.setModMetadata(metadata, ID, NAME, ResonantInduction.ID); MultipartElectrical.INSTANCE = new MultipartElectrical(); proxy.init(); + modproxies.init(); } @EventHandler @@ -176,8 +195,8 @@ public class Electrical GameRegistry.addRecipe(new ShapedOreRecipe(tierThreeBattery, "RRR", "RIR", "RRR", 'R', tierTwoBattery, 'I', Block.blockDiamond)); /** Wires **/ - GameRegistry.addRecipe(new ShapelessOreRecipe(itemInsulation, Item.slimeBall, new ItemStack(Block.cloth, 2, OreDictionary.WILDCARD_VALUE))); - GameRegistry.addRecipe(new ShapelessOreRecipe(itemInsulation, "slimeball", new ItemStack(Block.cloth, 2, OreDictionary.WILDCARD_VALUE))); + //GameRegistry.addRecipe(new ShapelessOreRecipe(itemInsulation, Item.slimeBall, new ItemStack(Block.cloth, 2, OreDictionary.WILDCARD_VALUE))); + //GameRegistry.addRecipe(new ShapelessOreRecipe(itemInsulation, "slimeball", new ItemStack(Block.cloth, 2, OreDictionary.WILDCARD_VALUE))); GameRegistry.addRecipe(new ShapedOreRecipe(EnumWireMaterial.COPPER.getWire(3), "MMM", 'M', "ingotCopper")); GameRegistry.addRecipe(new ShapedOreRecipe(EnumWireMaterial.TIN.getWire(3), "MMM", 'M', "ingotTin")); @@ -189,7 +208,7 @@ public class Electrical GameRegistry.addRecipe(new ShapedOreRecipe(itemCharger, "WWW", "ICI", 'W', "wire", 'I', UniversalRecipe.PRIMARY_METAL.get(), 'C', UniversalRecipe.CIRCUIT_T1.get())); GameRegistry.addRecipe(new ShapedOreRecipe(itemTransformer, "WWW", "WWW", "III", 'W', "wire", 'I', UniversalRecipe.PRIMARY_METAL.get())); - GameRegistry.addRecipe(new ShapedOreRecipe(itemLevitator, " G ", "SDS", "SWS", 'W', "wire", 'G', Block.glass, 'D', Block.blockDiamond, 'S', UniversalRecipe.PRIMARY_METAL.get())); + //GameRegistry.addRecipe(new ShapedOreRecipe(itemLevitator, " G ", "SDS", "SWS", 'W', "wire", 'G', Block.glass, 'D', Block.blockDiamond, 'S', UniversalRecipe.PRIMARY_METAL.get())); /** Quantum Gates */ GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(itemQuantumGlyph, 1, 0), " CT", "LBL", "TCT", 'B', Block.blockDiamond, 'L', itemLevitator, 'C', itemCharger, 'T', blockTesla)); @@ -202,6 +221,9 @@ public class Electrical GameRegistry.addRecipe(new ShapedOreRecipe(blockMotor, "SRS", "SMS", "SWS", 'W', "wire", 'R', Item.redstone, 'M', Block.blockIron, 'S', UniversalRecipe.PRIMARY_METAL.get())); GameRegistry.addRecipe(new ShapedOreRecipe(blockThermopile, "ORO", "OWO", "OOO", 'W', "wire", 'O', Block.obsidian, 'R', Item.redstone)); + + GameRegistry.addRecipe(new ShapedOreRecipe(itemLaserGun, "RDR", "RDR", "ICB", 'R', Item.redstone, 'D', Item.diamond, 'I', Item.ingotGold, 'C', UniversalRecipe.CIRCUIT_T2.get(), 'B', ItemBlockBattery.setTier(new ItemStack(blockBattery, 1, 0), (byte) 0))); + /** Wire Compatiblity **/ if (Loader.isModLoaded("IC2")) { @@ -217,5 +239,6 @@ public class Electrical } proxy.postInit(); + modproxies.postInit(); } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/MultipartElectrical.java b/electrical/src/main/scala/resonantinduction/electrical/MultipartElectrical.java index bf771c79e..d3385b425 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/MultipartElectrical.java +++ b/electrical/src/main/scala/resonantinduction/electrical/MultipartElectrical.java @@ -1,6 +1,7 @@ package resonantinduction.electrical; import resonantinduction.electrical.charger.PartCharger; +import resonantinduction.electrical.itemrailing.PartRailing; import resonantinduction.electrical.levitator.PartLevitator; import resonantinduction.electrical.multimeter.PartMultimeter; import resonantinduction.electrical.transformer.PartTransformer; @@ -18,7 +19,7 @@ public class MultipartElectrical implements IPartFactory { public static MultipartElectrical INSTANCE; - public static final String[] PART_TYPES = { "resonant_induction_quantum_glyph", "resonant_induction_wire", "resonant_induction_switch_wire", "resonant_induction_flat_wire", "resonant_induction_flat_switch_wire", "resonant_induction_multimeter", "resonant_induction_transformer", "resonant_induction_charger", "resonant_induction_levitator" }; + public static final String[] PART_TYPES = { "resonant_induction_quantum_glyph", "resonant_induction_wire", "resonant_induction_switch_wire", "resonant_induction_flat_wire", "resonant_induction_flat_switch_wire", "resonant_induction_multimeter", "resonant_induction_transformer", "resonant_induction_charger", "resonant_induction_levitator", "resonant_induction_itemrailing" }; public MultipartElectrical() { @@ -51,6 +52,8 @@ public class MultipartElectrical implements IPartFactory return new PartLevitator(); else if (name.equals("resonant_induction_quantum_glyph")) return new PartQuantumGlyph(); + else if (name.equals("resonant_induction_itemrailing")) + return new PartRailing(); return null; } diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/BlockArmbot.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/BlockArmbot.java index cdb767ce6..fa958b095 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/BlockArmbot.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/BlockArmbot.java @@ -7,95 +7,95 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import resonant.core.ResonantEngine; +import resonant.lib.multiblock.IBlockActivate; +import resonant.lib.multiblock.IMultiBlock; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.render.block.BlockRenderingHandler; import universalelectricity.api.UniversalElectricity; -import calclavia.components.CalclaviaLoader; -import calclavia.lib.multiblock.fake.IBlockActivate; -import calclavia.lib.multiblock.fake.IMultiBlock; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; public class BlockArmbot extends BlockTile { - public BlockArmbot(int id) - { - super(id, UniversalElectricity.machine); - } + public BlockArmbot(int id) + { + super(id, UniversalElectricity.machine); + } - @Override - public boolean canBlockStay(World world, int x, int y, int z) - { - return world.getBlockMaterial(x, y - 1, z).isSolid(); - } + @Override + public boolean canBlockStay(World world, int x, int y, int z) + { + return world.getBlockMaterial(x, y - 1, z).isSolid(); + } - @Override - public void onBlockAdded(World world, int x, int y, int z) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + @Override + public void onBlockAdded(World world, int x, int y, int z) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - if (tileEntity instanceof IMultiBlock) - { - CalclaviaLoader.blockMulti.createMultiBlockStructure((IMultiBlock) tileEntity); - } - } + if (tileEntity instanceof IMultiBlock) + { + ResonantEngine.blockMulti.createMultiBlockStructure((IMultiBlock) tileEntity); + } + } - @Override - public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + @Override + public boolean onMachineActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - if (tileEntity instanceof IBlockActivate) - { - return ((IBlockActivate) tileEntity).onActivated(player); - } + if (tileEntity instanceof IBlockActivate) + { + return ((IBlockActivate) tileEntity).onActivated(player); + } - return false; - } + return false; + } - @Override - public void breakBlock(World world, int x, int y, int z, int par5, int par6) - { - TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + @Override + public void breakBlock(World world, int x, int y, int z, int par5, int par6) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); - if (tileEntity instanceof TileArmbot) - { - ((TileArmbot) tileEntity).dropHeldObject(); - CalclaviaLoader.blockMulti.destroyMultiBlockStructure((TileArmbot) tileEntity); - } + if (tileEntity instanceof TileArmbot) + { + ((TileArmbot) tileEntity).dropHeldObject(); + ResonantEngine.blockMulti.destroyMultiBlockStructure((TileArmbot) tileEntity); + } - this.dropBlockAsItem_do(world, x, y, z, new ItemStack(this)); - super.breakBlock(world, x, y, z, par5, par6); - } + this.dropBlockAsItem_do(world, x, y, z, new ItemStack(this)); + super.breakBlock(world, x, y, z, par5, par6); + } - @Override - public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) - { - return new ItemStack(this); - } + @Override + public ItemStack getPickBlock(MovingObjectPosition target, World world, int x, int y, int z) + { + return new ItemStack(this); + } - @Override - public int quantityDropped(Random par1Random) - { - return 0; - } + @Override + public int quantityDropped(Random par1Random) + { + return 0; + } - @Override - public TileEntity createNewTileEntity(World var1) - { - return new TileArmbot(); - } + @Override + public TileEntity createNewTileEntity(World var1) + { + return new TileArmbot(); + } - @SideOnly(Side.CLIENT) - @Override - public int getRenderType() - { - return BlockRenderingHandler.ID; - } + @SideOnly(Side.CLIENT) + @Override + public int getRenderType() + { + return BlockRenderingHandler.ID; + } - @Override - public boolean isOpaqueCube() - { - return false; - } + @Override + public boolean isOpaqueCube() + { + return false; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/Program.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/Program.java index 12ccdb774..44804ef3d 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/Program.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/Program.java @@ -7,13 +7,13 @@ import java.util.Map.Entry; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import resonant.lib.utility.nbt.NBTUtility; import resonantinduction.electrical.encoder.coding.ILogicTask; import resonantinduction.electrical.encoder.coding.IProgram; import resonantinduction.electrical.encoder.coding.IProgrammableMachine; import resonantinduction.electrical.encoder.coding.ITask; import resonantinduction.electrical.encoder.coding.TaskRegistry; import universalelectricity.api.vector.Vector2; -import calclavia.lib.utility.nbt.NBTUtility; public class Program implements IProgram { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/RenderArmbot.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/RenderArmbot.java index 6f1695ef1..d6e267b03 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/RenderArmbot.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/RenderArmbot.java @@ -14,10 +14,10 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBase.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBase.java index 391664bcd..299352955 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBase.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBase.java @@ -5,12 +5,12 @@ import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; +import resonant.lib.utility.nbt.NBTUtility; import resonantinduction.core.ArgumentData; import resonantinduction.electrical.encoder.coding.IProgram; import resonantinduction.electrical.encoder.coding.IProgrammableMachine; import resonantinduction.electrical.encoder.coding.ITask; import universalelectricity.api.vector.Vector2; -import calclavia.lib.utility.nbt.NBTUtility; /** @author DarkGuardsman */ public abstract class TaskBase implements ITask diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBaseProcess.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBaseProcess.java index d21e0d11a..39d0201b3 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBaseProcess.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/TaskBaseProcess.java @@ -1,10 +1,10 @@ package resonantinduction.electrical.armbot; -import calclavia.lib.science.units.UnitHelper; +import net.minecraft.item.ItemStack; +import resonant.lib.science.units.UnitHelper; +import resonantinduction.electrical.encoder.coding.IProcessTask; import dan200.computercraft.api.lua.ILuaContext; import dan200.computercraft.api.peripheral.IComputerAccess; -import net.minecraft.item.ItemStack; -import resonantinduction.electrical.encoder.coding.IProcessTask; /** * Basic command prefab used by machines like an armbot. You are not required to use this in order diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/TileArmbot.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/TileArmbot.java index afe11ea8f..90e39d197 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/TileArmbot.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/TileArmbot.java @@ -9,6 +9,13 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.multiblock.IMultiBlock; +import resonant.lib.network.IPacketReceiverWithID; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileElectrical; +import resonant.lib.type.Pair; +import resonant.lib.utility.MathUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.electrical.armbot.task.TaskDrop; import resonantinduction.electrical.armbot.task.TaskGOTO; @@ -20,13 +27,6 @@ import resonantinduction.electrical.encoder.coding.ProgramHelper; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; -import calclavia.lib.multiblock.fake.IMultiBlock; -import calclavia.lib.network.IPacketReceiverWithID; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileElectrical; -import calclavia.lib.utility.MathUtility; -import calclavia.lib.utility.inventory.InventoryUtility; import com.google.common.io.ByteArrayDataInput; diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskBreak.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskBreak.java index cf6349910..219c5d412 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskBreak.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskBreak.java @@ -7,13 +7,13 @@ import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import resonant.lib.type.Pair; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.ITask; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; -import calclavia.lib.utility.inventory.InventoryUtility; /** * Used by arms to break a specific block in a position. diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskFire.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskFire.java index 448dd6bb5..b7dc860df 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskFire.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskFire.java @@ -9,13 +9,13 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import resonant.lib.science.units.UnitHelper; +import resonant.lib.type.Pair; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentFloatData; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; -import calclavia.lib.science.units.UnitHelper; public class TaskFire extends TaskBaseArmbot { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGive.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGive.java index a734eba04..8a4ffb631 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGive.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGive.java @@ -8,15 +8,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.science.units.UnitHelper; +import resonant.lib.utility.MathUtility; +import resonant.lib.utility.inventory.InternalInventoryHandler; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.science.units.UnitHelper; -import calclavia.lib.utility.MathUtility; -import calclavia.lib.utility.inventory.InternalInventoryHandler; public class TaskGive extends TaskBaseArmbot { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabEntity.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabEntity.java index 8969a244b..b88f4a19a 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabEntity.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabEntity.java @@ -8,10 +8,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.AxisAlignedBB; +import resonant.api.ai.EntitySettings; import resonantinduction.core.ArgumentData; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; -import calclavia.api.resonantinduction.electrical.ArmbotEntity; public class TaskGrabEntity extends TaskGrabPrefab { @@ -98,7 +98,7 @@ public class TaskGrabEntity extends TaskGrabPrefab { super.loadProgress(taskCompound); this.child = taskCompound.getBoolean("child"); - this.entityToInclude = ArmbotEntity.get(taskCompound.getString("name")); + this.entityToInclude = EntitySettings.get(taskCompound.getString("name")); } @Override @@ -106,7 +106,7 @@ public class TaskGrabEntity extends TaskGrabPrefab { super.saveProgress(taskCompound); taskCompound.setBoolean("child", child); - taskCompound.setString("name", ((this.entityToInclude != null) ? ArmbotEntity.get(this.entityToInclude) : "")); + taskCompound.setString("name", ((this.entityToInclude != null) ? EntitySettings.get(this.entityToInclude) : "")); } @Override @@ -116,7 +116,7 @@ public class TaskGrabEntity extends TaskGrabPrefab String entity = ""; if (this.entityToInclude != null) { - entity = ArmbotEntity.get(this.entityToInclude); + entity = EntitySettings.get(this.entityToInclude); if (this.child) { // TODO do check for EntityAgable diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabItem.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabItem.java index c5cc196f2..621a887b9 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabItem.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabItem.java @@ -6,10 +6,10 @@ import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; +import resonant.lib.science.units.UnitHelper; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; -import calclavia.lib.science.units.UnitHelper; public class TaskGrabItem extends TaskGrabPrefab { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabPrefab.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabPrefab.java index 1c29dfd50..9a02f3014 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabPrefab.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskGrabPrefab.java @@ -2,11 +2,11 @@ package resonantinduction.electrical.armbot.task; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IEntityConveyor; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.mechanical.IBelt; /** * Prefab for grab based commands @@ -17,7 +17,7 @@ public abstract class TaskGrabPrefab extends TaskBaseArmbot { public static final float radius = 0.5f; protected Vector3 armPos; - protected IBelt belt; + protected IEntityConveyor belt; public TaskGrabPrefab(String name) { @@ -37,9 +37,9 @@ public abstract class TaskGrabPrefab extends TaskBaseArmbot { entity = this.armPos.clone().translate(new Vector3(ForgeDirection.DOWN)).getTileEntity(this.program.getMachine().getLocation().left()); } - if (entity instanceof IBelt) + if (entity instanceof IEntityConveyor) { - this.belt = (IBelt) entity; + this.belt = (IEntityConveyor) entity; } return ProcessReturn.CONTINUE; } diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskIdle.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskIdle.java index 613152496..516663683 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskIdle.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskIdle.java @@ -3,10 +3,10 @@ package resonantinduction.electrical.armbot.task; import java.util.List; import net.minecraft.nbt.NBTTagCompound; +import resonant.lib.science.units.UnitHelper; import resonantinduction.core.ArgumentData; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.IProgrammableMachine; -import calclavia.lib.science.units.UnitHelper; public class TaskIdle extends TaskBaseProcess { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateBy.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateBy.java index 44022f16b..8ff1583ad 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateBy.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateBy.java @@ -3,13 +3,13 @@ package resonantinduction.electrical.armbot.task; import java.util.List; import net.minecraft.nbt.NBTTagCompound; +import resonant.lib.science.units.UnitHelper; +import resonant.lib.utility.MathUtility; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; import universalelectricity.api.vector.Vector2; -import calclavia.lib.science.units.UnitHelper; -import calclavia.lib.utility.MathUtility; /** * Rotates an armbot by a set amount diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateTo.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateTo.java index 7149e9c67..941d52d0e 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateTo.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskRotateTo.java @@ -3,13 +3,13 @@ package resonantinduction.electrical.armbot.task; import java.util.List; import net.minecraft.nbt.NBTTagCompound; +import resonant.lib.science.units.UnitHelper; +import resonant.lib.utility.MathUtility; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; import universalelectricity.api.vector.Vector2; -import calclavia.lib.science.units.UnitHelper; -import calclavia.lib.utility.MathUtility; /** * Rotates the armbot to a specific direction. diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskTake.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskTake.java index a7a943634..90201b4cf 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskTake.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskTake.java @@ -8,15 +8,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.science.units.UnitHelper; +import resonant.lib.utility.MathUtility; +import resonant.lib.utility.inventory.InternalInventoryHandler; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; import universalelectricity.api.vector.Vector2; import universalelectricity.api.vector.Vector3; -import calclavia.lib.science.units.UnitHelper; -import calclavia.lib.utility.MathUtility; -import calclavia.lib.utility.inventory.InternalInventoryHandler; public class TaskTake extends TaskBaseArmbot { diff --git a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskUse.java b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskUse.java index a2e84cee2..3e7825c46 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskUse.java +++ b/electrical/src/main/scala/resonantinduction/electrical/armbot/task/TaskUse.java @@ -5,13 +5,13 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import resonant.lib.science.units.UnitHelper; import resonantinduction.electrical.armbot.IArmbot; import resonantinduction.electrical.armbot.IArmbotUseable; import resonantinduction.electrical.armbot.TaskBaseArmbot; import resonantinduction.electrical.armbot.TaskBaseProcess; import resonantinduction.electrical.encoder.coding.IProcessTask; import resonantinduction.electrical.encoder.coding.args.ArgumentIntData; -import calclavia.lib.science.units.UnitHelper; public class TaskUse extends TaskBaseArmbot { diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/BlockBattery.java b/electrical/src/main/scala/resonantinduction/electrical/battery/BlockBattery.java index 533781442..7e75bbe99 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/BlockBattery.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/BlockBattery.java @@ -13,12 +13,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockSidedIO; +import resonant.lib.render.block.BlockRenderingHandler; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockSidedIO; -import calclavia.lib.render.block.BlockRenderingHandler; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -64,8 +64,8 @@ public class BlockBattery extends BlockSidedIO implements ITileEntityProvider { ItemBlockBattery itemBlock = (ItemBlockBattery) itemStack.getItem(); TileBattery battery = (TileBattery) world.getBlockTileEntity(x, y, z); - battery.energy.setCapacity(TileBattery.getEnergyForTier(ItemBlockBattery.getTier(itemStack))); - battery.energy.setEnergy(itemBlock.getEnergy(itemStack)); + battery.getEnergyHandler().setCapacity(TileBattery.getEnergyForTier(ItemBlockBattery.getTier(itemStack))); + battery.getEnergyHandler().setEnergy(itemBlock.getEnergy(itemStack)); battery.updateStructure(); world.setBlockMetadataWithNotify(x, y, z, ItemBlockBattery.getTier(itemStack), 3); } @@ -98,7 +98,7 @@ public class BlockBattery extends BlockSidedIO implements ITileEntityProvider TileBattery battery = (TileBattery) world.getBlockTileEntity(x, y, z); ItemBlockBattery itemBlock = (ItemBlockBattery) itemStack.getItem(); ItemBlockBattery.setTier(itemStack, (byte) world.getBlockMetadata(x, y, z)); - itemBlock.setEnergy(itemStack, battery.energy.getEnergy()); + itemBlock.setEnergy(itemStack, battery.getEnergyHandler().getEnergy()); } ret.add(itemStack); return ret; @@ -146,6 +146,6 @@ public class BlockBattery extends BlockSidedIO implements ITileEntityProvider } TileBattery battery = (TileBattery) world.getBlockTileEntity(x, y, z); - return CompatibilityModule.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(id, 1, 0), (byte) world.getBlockMetadata(x, y, z)), battery.energy.getEnergy()); + return CompatibilityModule.getItemWithCharge(ItemBlockBattery.setTier(new ItemStack(id, 1, 0), (byte) world.getBlockMetadata(x, y, z)), battery.getEnergyHandler().getEnergy()); } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/EnergyDistributionNetwork.java b/electrical/src/main/scala/resonantinduction/electrical/battery/EnergyDistributionNetwork.java index 6382360a1..fd64856f1 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/EnergyDistributionNetwork.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/EnergyDistributionNetwork.java @@ -6,106 +6,104 @@ import java.util.Set; import universalelectricity.core.net.Network; +/** Energy network designed to allow several tiles to act as if they share the same energy + * level */ public class EnergyDistributionNetwork extends Network { - public long totalEnergy = 0; - public long totalCapacity = 0; + public long totalEnergy = 0; + public long totalCapacity = 0; - public EnergyDistributionNetwork() - { - super(TileEnergyDistribution.class); - } + public EnergyDistributionNetwork() + { + super(TileEnergyDistribution.class); + } - public void redistribute(TileEnergyDistribution... exclusion) - { - int lowestY = 255, highestY = 0; + public void redistribute(TileEnergyDistribution... exclusion) + { + int lowestY = 255, highestY = 0; - totalEnergy = 0; - totalCapacity = 0; + totalEnergy = 0; + totalCapacity = 0; - for (TileEnergyDistribution connector : this.getConnectors()) - { - totalEnergy += connector.energy.getEnergy(); - totalCapacity += connector.energy.getEnergyCapacity(); + for (TileEnergyDistribution connector : this.getConnectors()) + { + totalEnergy += connector.getEnergyHandler().getEnergy(); + totalCapacity += connector.getEnergyHandler().getEnergyCapacity(); - lowestY = Math.min(connector.yCoord, lowestY); - highestY = Math.max(connector.yCoord, highestY); + lowestY = Math.min(connector.yCoord, lowestY); + highestY = Math.max(connector.yCoord, highestY); - connector.renderEnergyAmount = 0; - } + connector.renderEnergyAmount = 0; + } - /** - * Apply render - */ - long remainingRenderEnergy = totalEnergy; + /** Apply render */ + long remainingRenderEnergy = totalEnergy; - for (int y = lowestY; y <= highestY; y++) - { - Set connectorsInlevel = new LinkedHashSet(); + for (int y = lowestY; y <= highestY; y++) + { + Set connectorsInlevel = new LinkedHashSet(); - for (TileEnergyDistribution connector : this.getConnectors()) - { - if (connector.yCoord == y) - { - connectorsInlevel.add(connector); - } - } + for (TileEnergyDistribution connector : this.getConnectors()) + { + if (connector.yCoord == y) + { + connectorsInlevel.add(connector); + } + } - int levelSize = connectorsInlevel.size(); - long used = 0; + int levelSize = connectorsInlevel.size(); + long used = 0; - for (TileEnergyDistribution connector : connectorsInlevel) - { - long tryInject = Math.min(remainingRenderEnergy / levelSize, connector.energy.getEnergyCapacity()); - connector.renderEnergyAmount = tryInject; - used += tryInject; - } + for (TileEnergyDistribution connector : connectorsInlevel) + { + long tryInject = Math.min(remainingRenderEnergy / levelSize, connector.getEnergyHandler().getEnergyCapacity()); + connector.renderEnergyAmount = tryInject; + used += tryInject; + } - remainingRenderEnergy -= used; + remainingRenderEnergy -= used; - if (remainingRenderEnergy <= 0) - break; - } + if (remainingRenderEnergy <= 0) + break; + } - /** - * Apply energy loss. - */ - double percentageLoss = 0;// Math.max(0, (1 - (getConnectors().size() * 6 / 100d))); - long energyLoss = (long) (percentageLoss * 100); - totalEnergy -= energyLoss; + /** Apply energy loss. */ + double percentageLoss = 0;// Math.max(0, (1 - (getConnectors().size() * 6 / 100d))); + long energyLoss = (long) (percentageLoss * 100); + totalEnergy -= energyLoss; - int amountOfNodes = this.getConnectors().size() - exclusion.length; + int amountOfNodes = this.getConnectors().size() - exclusion.length; - if (totalEnergy > 0 && amountOfNodes > 0) - { - long remainingEnergy = totalEnergy; + if (totalEnergy > 0 && amountOfNodes > 0) + { + long remainingEnergy = totalEnergy; - TileEnergyDistribution firstNode = this.getFirstConnector(); + TileEnergyDistribution firstNode = this.getFirstConnector(); - for (TileEnergyDistribution node : this.getConnectors()) - { - if (node != firstNode && !Arrays.asList(exclusion).contains(node)) - { - double percentage = ((double) node.energy.getEnergyCapacity() / (double) totalCapacity); - long energyForBattery = Math.max(Math.round(totalEnergy * percentage), 0); - node.energy.setEnergy(energyForBattery); - remainingEnergy -= energyForBattery; - } - } + for (TileEnergyDistribution node : this.getConnectors()) + { + if (node != firstNode && !Arrays.asList(exclusion).contains(node)) + { + double percentage = ((double) node.getEnergyHandler().getEnergyCapacity() / (double) totalCapacity); + long energyForBattery = Math.max(Math.round(totalEnergy * percentage), 0); + node.getEnergyHandler().setEnergy(energyForBattery); + remainingEnergy -= energyForBattery; + } + } - firstNode.energy.setEnergy(Math.max(remainingEnergy, 0)); - } - } + firstNode.getEnergyHandler().setEnergy(Math.max(remainingEnergy, 0)); + } + } - @Override - protected void reconstructConnector(TileEnergyDistribution node) - { - node.setNetwork(this); - } + @Override + protected void reconstructConnector(TileEnergyDistribution node) + { + node.setNetwork(this); + } - @Override - public EnergyDistributionNetwork newInstance() - { - return new EnergyDistributionNetwork(); - } + @Override + public EnergyDistributionNetwork newInstance() + { + return new EnergyDistributionNetwork(); + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.java b/electrical/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.java index 9b5f120d7..5c335cf6f 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/ItemBlockBattery.java @@ -8,6 +8,8 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LanguageUtility; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.UniversalClass; import universalelectricity.api.UniversalElectricity; @@ -15,8 +17,6 @@ import universalelectricity.api.energy.UnitDisplay; import universalelectricity.api.energy.UnitDisplay.Unit; import universalelectricity.api.item.IEnergyItem; import universalelectricity.api.item.IVoltageItem; -import calclavia.lib.render.EnumColor; -import calclavia.lib.utility.LanguageUtility; @UniversalClass public class ItemBlockBattery extends ItemBlock implements IEnergyItem, IVoltageItem diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/RenderBattery.java b/electrical/src/main/scala/resonantinduction/electrical/battery/RenderBattery.java index 7592201a2..d8709d6cb 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/RenderBattery.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/RenderBattery.java @@ -19,10 +19,10 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -80,7 +80,7 @@ public class RenderBattery extends TileEntitySpecialRenderer implements ISimpleI TileBattery tile = (TileBattery) t; - int energyLevel = (int) Math.round(((double) tile.energy.getEnergy() / (double) TileBattery.getEnergyForTier(tile.getBlockMetadata())) * 8); + int energyLevel = (int) Math.round(((double) tile.getEnergyHandler().getEnergy() / (double) TileBattery.getEnergyForTier(tile.getBlockMetadata())) * 8); RenderUtility.bind(Reference.DOMAIN, Reference.MODEL_PATH + "battery/battery.png"); List disabledParts = new ArrayList(); diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/TileBattery.java b/electrical/src/main/scala/resonantinduction/electrical/battery/TileBattery.java index 91acb1506..66d1f653d 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/TileBattery.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/TileBattery.java @@ -5,6 +5,8 @@ import java.util.ArrayList; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.packet.Packet; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.IPacketSender; import resonantinduction.core.ResonantInduction; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.electricity.IVoltageInput; @@ -12,110 +14,104 @@ import universalelectricity.api.electricity.IVoltageOutput; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.energy.IEnergyContainer; import universalelectricity.api.energy.IEnergyInterface; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.IPacketSender; import com.google.common.io.ByteArrayDataInput; -/** - * A modular battery. +/** A modular battery box that allows shared connections with boxes next to it. * - * @author Calclavia - */ + * @author Calclavia */ public class TileBattery extends TileEnergyDistribution implements IVoltageInput, IVoltageOutput, IPacketSender, IPacketReceiver, IEnergyInterface, IEnergyContainer { - /** - * Tiers: 0, 1, 2 - */ - public static final int MAX_TIER = 2; + /** Tiers: 0, 1, 2 */ + public static final int MAX_TIER = 2; - /** The transfer rate **/ - public static final long DEFAULT_WATTAGE = getEnergyForTier(0); + /** The transfer rate **/ + public static final long DEFAULT_WATTAGE = getEnergyForTier(0); - /** Voltage increases as series connection increases */ - public static final long DEFAULT_VOLTAGE = UniversalElectricity.DEFAULT_VOLTAGE; + public TileBattery() + { + this.setEnergyHandler(new EnergyStorageHandler(0)); + this.getEnergyHandler().setCapacity(Long.MAX_VALUE); + this.ioMap = 0; + this.saveIOMap = true; + } - public TileBattery() - { - this.energy = new EnergyStorageHandler(0); - this.ioMap = 0; - this.saveIOMap = true; - } + /** @param tier - 0, 1, 2 + * @return */ + public static long getEnergyForTier(int tier) + { + return Math.round(Math.pow(500000000, (tier / (MAX_TIER + 0.7f)) + 1) / (500000000)) * (500000000); + } - /** - * @param tier - 0, 1, 2 - * @return - */ - public static long getEnergyForTier(int tier) - { - return Math.round(Math.pow(500000000, (tier / (MAX_TIER + 0.7f)) + 1) / (500000000)) * (500000000); - } + @Override + public void initiate() + { + super.initiate(); + getEnergyHandler().setCapacity(getEnergyForTier(getBlockMetadata())); + getEnergyHandler().setMaxTransfer(getEnergyHandler().getEnergyCapacity()); + } - @Override - public void initiate() - { - super.initiate(); - energy.setCapacity(getEnergyForTier(getBlockMetadata())); - } + @Override + public void updateEntity() + { + if (!this.worldObj.isRemote) + { + markDistributionUpdate |= produce() > 0; + } - @Override - public void updateEntity() - { - if (!this.worldObj.isRemote) - { - // energy.setMaxTransfer((long) Math.min(Math.pow(10000, - // this.getNetwork().getConnectors().size()), energy.getEnergyCapacity())); - energy.setMaxTransfer(energy.getEnergyCapacity()); - markDistributionUpdate |= produce() > 0; - } + super.updateEntity(); + } - super.updateEntity(); - } + @Override + public Packet getDescriptionPacket() + { + return ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray()); + } - @Override - public Packet getDescriptionPacket() - { - return ResonantInduction.PACKET_TILE.getPacket(this, getPacketData(0).toArray()); - } + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + getEnergyHandler().setEnergy(data.readLong()); + ioMap = data.readShort(); + } - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - energy.setEnergy(data.readLong()); - ioMap = data.readShort(); - } + @Override + public ArrayList getPacketData(int type) + { + ArrayList data = new ArrayList(); + data.add(renderEnergyAmount); + data.add(ioMap); + return data; + } - @Override - public ArrayList getPacketData(int type) - { - ArrayList data = new ArrayList(); - data.add(renderEnergyAmount); - data.add(ioMap); - return data; - } + @Override + public long getVoltageOutput(ForgeDirection side) + { + return UniversalElectricity.DEFAULT_VOLTAGE; + } - @Override - public long getVoltageOutput(ForgeDirection side) - { - return DEFAULT_VOLTAGE; - } + @Override + public long getVoltageInput(ForgeDirection direction) + { + return UniversalElectricity.DEFAULT_VOLTAGE; + } - @Override - public long getVoltageInput(ForgeDirection direction) - { - return DEFAULT_VOLTAGE; - } + @Override + public void onWrongVoltage(ForgeDirection direction, long voltage) + { - @Override - public void onWrongVoltage(ForgeDirection direction, long voltage) - { + } - } + @Override + public void setIO(ForgeDirection dir, int type) + { + super.setIO(dir, type); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } - @Override - public void setIO(ForgeDirection dir, int type) - { - super.setIO(dir, type); - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } + @Override + public String toString() + { + return "[TileBattery]" + x() + "x " + y() + "y " + z() + "z "; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/battery/TileEnergyDistribution.java b/electrical/src/main/scala/resonantinduction/electrical/battery/TileEnergyDistribution.java index ebc4adab0..11e735d26 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/battery/TileEnergyDistribution.java +++ b/electrical/src/main/scala/resonantinduction/electrical/battery/TileEnergyDistribution.java @@ -1,171 +1,170 @@ package resonantinduction.electrical.battery; -import calclavia.lib.prefab.tile.TileElectrical; import net.minecraft.block.material.Material; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.prefab.tile.TileElectrical; import universalelectricity.api.net.IConnector; import universalelectricity.api.vector.Vector3; -public class TileEnergyDistribution extends TileElectrical - implements IConnector +public class TileEnergyDistribution extends TileElectrical implements IConnector { - public boolean markClientUpdate = false; - public boolean markDistributionUpdate = false; - public long renderEnergyAmount = 0; - private EnergyDistributionNetwork network; + public boolean markClientUpdate = false; + public boolean markDistributionUpdate = false; + public long renderEnergyAmount = 0; + private EnergyDistributionNetwork network; - public TileEnergyDistribution() - { - super(null); - } + public TileEnergyDistribution() + { + super(null); + } - public TileEnergyDistribution(Material material) - { - super(material); - } + public TileEnergyDistribution(Material material) + { + super(material); + } - @Override - public void initiate() - { - super.initiate(); - this.updateStructure(); - } + @Override + public void initiate() + { + super.initiate(); + this.updateStructure(); + } - @Override - public void onAdded() - { - if (!world().isRemote) - { - updateStructure(); - } - } + @Override + public void onAdded() + { + if (!world().isRemote) + { + updateStructure(); + } + } - @Override - public void onNeighborChanged() - { - if (!world().isRemote) - { - updateStructure(); - } - } + @Override + public void onNeighborChanged() + { + if (!world().isRemote) + { + updateStructure(); + } + } - @Override - public void updateEntity() - { - super.updateEntity(); + @Override + public void updateEntity() + { + super.updateEntity(); - if (!this.worldObj.isRemote) - { - if (markDistributionUpdate && ticks % 5 == 0) - { - getNetwork().redistribute(); - markDistributionUpdate = false; - } + if (!this.worldObj.isRemote) + { + if (markDistributionUpdate && ticks % 5 == 0) + { + getNetwork().redistribute(); + markDistributionUpdate = false; + } - if (markClientUpdate && ticks % 5 == 0) - { - worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); - } - } - } + if (markClientUpdate && ticks % 5 == 0) + { + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + } + } - @Override - public long getEnergy(ForgeDirection from) - { - return getNetwork().totalEnergy; - } + @Override + public long getEnergy(ForgeDirection from) + { + return getNetwork().totalEnergy; + } - @Override - public long getEnergyCapacity(ForgeDirection from) - { - return getNetwork().totalCapacity; + @Override + public long getEnergyCapacity(ForgeDirection from) + { + return getNetwork().totalCapacity; - } + } - @Override - public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) - { - long returnValue = super.onReceiveEnergy(from, receive, doReceive); - markDistributionUpdate = true; - markClientUpdate = true; - return returnValue; - } + @Override + public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) + { + long returnValue = super.onReceiveEnergy(from, receive, doReceive); + markDistributionUpdate = true; + markClientUpdate = true; + return returnValue; + } - @Override - public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract) - { - long returnValue = super.onExtractEnergy(from, extract, doExtract); - markDistributionUpdate = true; - markClientUpdate = true; - return returnValue; - } + @Override + public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract) + { + long returnValue = super.onExtractEnergy(from, extract, doExtract); + markDistributionUpdate = true; + markClientUpdate = true; + return returnValue; + } - @Override - public EnergyDistributionNetwork getNetwork() - { - if (this.network == null) - { - this.network = new EnergyDistributionNetwork(); - this.network.addConnector(this); - } + @Override + public EnergyDistributionNetwork getNetwork() + { + if (this.network == null) + { + this.network = new EnergyDistributionNetwork(); + this.network.addConnector(this); + } - return this.network; - } + return this.network; + } - @Override - public void setNetwork(EnergyDistributionNetwork structure) - { - this.network = structure; - } + @Override + public void setNetwork(EnergyDistributionNetwork structure) + { + this.network = structure; + } - public void updateStructure() - { - if (!this.worldObj.isRemote) - { - for (Object obj : getConnections()) - { - if (obj != null) - { - this.getNetwork().merge(((TileEnergyDistribution) obj).getNetwork()); - } - } + public void updateStructure() + { + if (!this.worldObj.isRemote) + { + for (Object obj : getConnections()) + { + if (obj != null) + { + this.getNetwork().merge(((TileEnergyDistribution) obj).getNetwork()); + } + } - markDistributionUpdate = true; - markClientUpdate = true; - } - } + markDistributionUpdate = true; + markClientUpdate = true; + } + } - @Override - public Object[] getConnections() - { - Object[] connections = new Object[6]; + @Override + public Object[] getConnections() + { + Object[] connections = new Object[6]; - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tile = new Vector3(this).translate(dir).getTileEntity(this.worldObj); + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tile = new Vector3(this).translate(dir).getTileEntity(this.worldObj); - if (tile != null && tile.getClass() == this.getClass()) - { - connections[dir.ordinal()] = tile; - } - } + if (tile != null && tile.getClass() == this.getClass()) + { + connections[dir.ordinal()] = tile; + } + } - return connections; - } + return connections; + } - @Override - public void invalidate() - { - this.getNetwork().redistribute(this); - this.getNetwork().split(this); - super.invalidate(); - } + @Override + public void invalidate() + { + this.getNetwork().redistribute(this); + this.getNetwork().split(this); + super.invalidate(); + } - @Override - public IConnector getInstance(ForgeDirection from) - { - return this; - } + @Override + public IConnector getInstance(ForgeDirection from) + { + return this; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/charger/PartCharger.java b/electrical/src/main/scala/resonantinduction/electrical/charger/PartCharger.java index 8141c63cf..e3b5287ab 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/charger/PartCharger.java +++ b/electrical/src/main/scala/resonantinduction/electrical/charger/PartCharger.java @@ -4,325 +4,146 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.ForgeDirection; -import resonantinduction.core.prefab.part.PartFace; +import resonant.lib.utility.WrenchUtility; +import resonant.lib.utility.inventory.InventoryUtility; +import resonantinduction.core.prefab.part.PartInventoryPanel; import resonantinduction.electrical.Electrical; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.UniversalClass; import universalelectricity.api.energy.IEnergyInterface; -import calclavia.lib.utility.WrenchUtility; -import calclavia.lib.utility.inventory.ExternalInventory; -import calclavia.lib.utility.inventory.IExternalInventory; -import calclavia.lib.utility.inventory.IExternalInventoryBox; -import calclavia.lib.utility.inventory.InventoryUtility; -import codechicken.lib.data.MCDataInput; -import codechicken.lib.data.MCDataOutput; import codechicken.lib.vec.Vector3; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -/** - * TODO: This DOES NOT WORK when @UniversalClass is not annotated. Flat wires seem to only interact - * with TE multiparts. +/** Micro part machine designed to charge all items contained inside of it. Doesn't contain its own + * battery and only acts as an inventory. Items are charged each time doReceive is called by an + * energy supplier. * - * @author Calclavia - * - */ + * @author Darkguardsman, converted to Part by Calclavia */ @UniversalClass -public class PartCharger extends PartFace implements IExternalInventory, ISidedInventory, IEnergyInterface +public class PartCharger extends PartInventoryPanel implements IEnergyInterface { - private long lastPacket; + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) + { + if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem(), x(), y(), z())) + { + if (!world().isRemote) + { + WrenchUtility.damageWrench(player, player.inventory.getCurrentItem(), x(), y(), z()); + facing = (byte) ((facing + 1) % 4); + sendDescUpdate(); + tile().notifyPartChange(this); + } - @Override - public void readDesc(MCDataInput packet) - { - super.readDesc(packet); - getInventory().load(packet.readNBTTagCompound()); - } + return true; + } - @Override - public void writeDesc(MCDataOutput packet) - { - super.writeDesc(packet); - NBTTagCompound nbt = new NBTTagCompound(); - getInventory().save(nbt); - packet.writeNBTTagCompound(nbt); - } + if (item != null) + { + if (getStackInSlot(0) == null && item != null && CompatibilityModule.isHandler(item.getItem())) + { + setInventorySlotContents(0, item); + player.inventory.setInventorySlotContents(player.inventory.currentItem, null); - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) - { - if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem(), x(), y(), z())) - { - if (!world().isRemote) - { - WrenchUtility.damageWrench(player, player.inventory.getCurrentItem(), x(), y(), z()); - facing = (byte) ((facing + 1) % 4); - sendDescUpdate(); - tile().notifyPartChange(this); - } + if (!world().isRemote) + sendDescUpdate(); - return true; - } + return true; + } + } - if (item != null) - { - if (getStackInSlot(0) == null && item != null && CompatibilityModule.isHandler(item.getItem())) - { - setInventorySlotContents(0, item); - player.inventory.setInventorySlotContents(player.inventory.currentItem, null); + if (getStackInSlot(0) != null) + { + InventoryUtility.dropItemStack(world(), new universalelectricity.api.vector.Vector3(player), getStackInSlot(0), 0); + setInventorySlotContents(0, null); + if (!world().isRemote) + sendDescUpdate(); + } - if (!world().isRemote) - sendDescUpdate(); + return true; + } - return true; - } - } + @Override + public boolean canConnect(ForgeDirection direction, Object obj) + { + return obj instanceof IEnergyInterface && placementSide != direction.getOpposite(); + } - if (getStackInSlot(0) != null) - { - InventoryUtility.dropItemStack(world(), new universalelectricity.api.vector.Vector3(player), getStackInSlot(0), 0); - setInventorySlotContents(0, null); - if (!world().isRemote) - sendDescUpdate(); - } + @Override + public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) + { + if (receive > 0) + { + long energyUsed = 0; + for (int slot = 0; slot < this.getSizeInventory(); slot++) + { + energyUsed += CompatibilityModule.chargeItem(this.getStackInSlot(slot), receive - energyUsed, doReceive); + if (energyUsed >= receive) + break; + } - return true; - } + if (energyUsed > 0) + this.markedForUpdate = true; - @Override - public boolean canConnect(ForgeDirection direction, Object obj) - { - return obj instanceof IEnergyInterface; - } + return energyUsed; + } + return 0; + } - @Override - public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) - { - long energyUsed = 0; - long energyLeft = receive; - for (int i = 0; i < this.getSizeInventory(); i++) - { - long input = CompatibilityModule.chargeItem(this.getStackInSlot(i), energyLeft, true); - energyUsed += input; - energyLeft -= input; - if (energyLeft <= 0) - break; - } + @Override + public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract) + { + return 0; + } - if (!world().isRemote && energyUsed > 0 && System.currentTimeMillis() - this.lastPacket >= 50) - { - this.lastPacket = System.currentTimeMillis(); - sendDescUpdate(); - } - return energyUsed; - } + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(Vector3 pos, float frame, int pass) + { + if (pass == 0) + { + RenderCharger.INSTANCE.render(this, pos.x, pos.y, pos.z); + } + } - @Override - public long onExtractEnergy(ForgeDirection from, long extract, boolean doExtract) - { - return 0; - } + @Override + protected ItemStack getItem() + { + return new ItemStack(Electrical.itemCharger); + } - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(Vector3 pos, float frame, int pass) - { - if (pass == 0) - { - RenderCharger.INSTANCE.render(this, pos.x, pos.y, pos.z); - } - } + @Override + public String getType() + { + return "resonant_induction_charger"; + } - @Override - protected ItemStack getItem() - { - return new ItemStack(Electrical.itemCharger); - } + @Override + public Iterable getDrops() + { + List drops = new ArrayList(); + drops.add(getItem()); - @Override - public String getType() - { - return "resonant_induction_charger"; - } + for (int i = 0; i < getSizeInventory(); i++) + if (getStackInSlot(i) != null) + drops.add(getStackInSlot(i)); - @Override - public Iterable getDrops() - { - List drops = new ArrayList(); - drops.add(getItem()); + return drops; + } - for (int i = 0; i < getSizeInventory(); i++) - if (getStackInSlot(i) != null) - drops.add(getStackInSlot(i)); - - return drops; - } - - /** - * Save and load - */ - @Override - public void load(NBTTagCompound nbt) - { - super.load(nbt); - this.getInventory().load(nbt); - } - - @Override - public void save(NBTTagCompound nbt) - { - super.save(nbt); - this.getInventory().save(nbt); - } - - /** - * Inventory Methods - */ - protected IExternalInventoryBox inventory; - protected int maxSlots = 1; - - @Override - public IExternalInventoryBox getInventory() - { - if (inventory == null) - { - inventory = new ExternalInventory(null, this, this.maxSlots); - } - - return inventory; - } - - @Override - public int getSizeInventory() - { - return this.getInventory().getSizeInventory(); - } - - @Override - public ItemStack getStackInSlot(int i) - { - return this.getInventory().getStackInSlot(i); - } - - @Override - public ItemStack decrStackSize(int i, int j) - { - return this.getInventory().decrStackSize(i, j); - } - - public void incrStackSize(int slot, ItemStack itemStack) - { - if (this.getStackInSlot(slot) == null) - { - setInventorySlotContents(slot, itemStack.copy()); - } - else if (this.getStackInSlot(slot).isItemEqual(itemStack)) - { - getStackInSlot(slot).stackSize += itemStack.stackSize; - } - - onInventoryChanged(); - } - - @Override - public ItemStack getStackInSlotOnClosing(int i) - { - return this.getInventory().getStackInSlotOnClosing(i); - } - - @Override - public void setInventorySlotContents(int i, ItemStack itemstack) - { - this.getInventory().setInventorySlotContents(i, itemstack); - - } - - @Override - public String getInvName() - { - return ""; - } - - @Override - public boolean isInvNameLocalized() - { - return true; - } - - @Override - public int getInventoryStackLimit() - { - return this.getInventory().getInventoryStackLimit(); - } - - @Override - public boolean isUseableByPlayer(EntityPlayer entityplayer) - { - return this.getInventory().isUseableByPlayer(entityplayer); - } - - @Override - public void openChest() - { - this.getInventory().openChest(); - - } - - @Override - public void closeChest() - { - this.getInventory().closeChest(); - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack itemstack) - { - return this.getInventory().isItemValidForSlot(i, itemstack); - } - - @Override - public int[] getAccessibleSlotsFromSide(int var1) - { - return this.getInventory().getAccessibleSlotsFromSide(var1); - } - - @Override - public boolean canInsertItem(int i, ItemStack itemstack, int j) - { - return this.getInventory().canInsertItem(i, itemstack, j); - } - - @Override - public boolean canExtractItem(int i, ItemStack itemstack, int j) - { - return this.getInventory().canExtractItem(i, itemstack, j); - } - - @Override - public boolean canStore(ItemStack stack, int slot, ForgeDirection side) - { - return false; - } - - @Override - public boolean canRemove(ItemStack stack, int slot, ForgeDirection side) - { - if (slot >= this.getSizeInventory()) - { - return false; - } - return true; - } - - @Override - public void onInventoryChanged() - { - - } + @Override + public boolean canStore(ItemStack stack, int slot, ForgeDirection side) + { + return slot < this.getSizeInventory() && stack != null && CompatibilityModule.isHandler(stack.getItem()); + } + @Override + public String toString() + { + return "[PartCharger]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/charger/RenderCharger.java b/electrical/src/main/scala/resonantinduction/electrical/charger/RenderCharger.java index 1ea8957b7..f3533f22c 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/charger/RenderCharger.java +++ b/electrical/src/main/scala/resonantinduction/electrical/charger/RenderCharger.java @@ -11,14 +11,14 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.energy.UnitDisplay; import universalelectricity.api.energy.UnitDisplay.Unit; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; /** * Renderer for electric item charger diff --git a/electrical/src/main/scala/resonantinduction/electrical/distributor/TileDistributor.scala b/electrical/src/main/scala/resonantinduction/electrical/distributor/TileDistributor.scala index 74e3b8e05..44fcf9ea1 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/distributor/TileDistributor.scala +++ b/electrical/src/main/scala/resonantinduction/electrical/distributor/TileDistributor.scala @@ -1,19 +1,18 @@ package resonantinduction.electrical.distributor -import calclavia.lib.content.prefab.{TraitElectrical, TraitInventory} -import net.minecraft.block.material.Material -import calclavia.lib.content.module.TileBase -import universalelectricity.api.vector.Vector3 -import net.minecraft.inventory.IInventory -import net.minecraftforge.common.ForgeDirection -import calclavia.lib.utility.inventory.InventoryUtility -import net.minecraft.item.ItemStack - -import java.util.Collections import java.util +import java.util.Collections -import scala.util.control.Breaks._ +import net.minecraft.block.material.Material +import net.minecraft.inventory.IInventory +import net.minecraft.item.ItemStack import net.minecraft.tileentity.TileEntity +import net.minecraftforge.common.ForgeDirection +import resonant.lib.content.module.TileBase +import resonant.lib.content.prefab.TraitElectrical +import resonant.lib.content.prefab.TraitInventory +import resonant.lib.utility.inventory.InventoryUtility +import universalelectricity.api.vector.Vector3 /** * A Block that interacts with connected inventories diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/BlockEncoder.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/BlockEncoder.java index 6beaed2cc..00a186c7c 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/BlockEncoder.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/BlockEncoder.java @@ -6,10 +6,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; import resonantinduction.core.Reference; import resonantinduction.electrical.Electrical; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockTile; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/TileEncoder.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/TileEncoder.java index 6891252ca..b24aeece1 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/TileEncoder.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/TileEncoder.java @@ -7,6 +7,9 @@ import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.tile.TileExternalInventory; import resonantinduction.core.ResonantInduction; import resonantinduction.electrical.armbot.Program; import resonantinduction.electrical.armbot.task.TaskRotateTo; @@ -14,9 +17,6 @@ import resonantinduction.electrical.encoder.coding.IProgram; import resonantinduction.electrical.encoder.coding.ITask; import resonantinduction.electrical.encoder.coding.TaskRegistry; import universalelectricity.api.vector.Vector2; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.TileExternalInventory; import com.google.common.io.ByteArrayDataInput; diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/IProgrammableMachine.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/IProgrammableMachine.java index bf5e2b08d..0d13651dd 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/IProgrammableMachine.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/IProgrammableMachine.java @@ -1,8 +1,8 @@ package resonantinduction.electrical.encoder.coding; import net.minecraft.world.World; +import resonant.lib.type.Pair; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; /** * Simple interface too say an object is programmable diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/ITask.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/ITask.java index a153d4ddd..113f977b3 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/ITask.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/coding/ITask.java @@ -4,9 +4,9 @@ import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ResourceLocation; +import resonant.lib.utility.nbt.ISaveObj; import resonantinduction.core.ArgumentData; import universalelectricity.api.vector.Vector2; -import calclavia.lib.utility.nbt.ISaveObj; /** @author DarkGuardsman */ public interface ITask extends Cloneable, ISaveObj diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/ContainerEncoder.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/ContainerEncoder.java index b33b09779..014bdd400 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/ContainerEncoder.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/ContainerEncoder.java @@ -2,10 +2,10 @@ package resonantinduction.electrical.encoder.gui; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; +import resonant.lib.gui.ContainerBase; +import resonant.lib.prefab.slot.SlotSpecific; import resonantinduction.electrical.encoder.ItemDisk; import resonantinduction.electrical.encoder.TileEncoder; -import calclavia.lib.gui.ContainerBase; -import calclavia.lib.prefab.slot.SlotSpecific; public class ContainerEncoder extends ContainerBase { diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java index 8f7279759..b7b3ad1ab 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderBase.java @@ -2,9 +2,9 @@ package resonantinduction.electrical.encoder.gui; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.Container; +import resonant.lib.gui.ContainerDummy; +import resonant.lib.gui.GuiContainerBase; import resonantinduction.electrical.encoder.TileEncoder; -import calclavia.lib.gui.ContainerDummy; -import calclavia.lib.gui.GuiContainerBase; public class GuiEncoderBase extends GuiContainerBase { diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderEditTask.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderEditTask.java index 0685e4601..ad7061cca 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderEditTask.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderEditTask.java @@ -8,12 +8,12 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; +import resonant.lib.gui.ContainerDummy; +import resonant.lib.gui.GuiContainerBase; import resonantinduction.core.ArgumentData; import resonantinduction.core.Reference; import resonantinduction.electrical.encoder.coding.ITask; import universalelectricity.api.vector.Vector2; -import calclavia.lib.gui.ContainerDummy; -import calclavia.lib.gui.GuiContainerBase; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; diff --git a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderTaskList.java b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderTaskList.java index 30b096fa7..5c5c6803d 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderTaskList.java +++ b/electrical/src/main/scala/resonantinduction/electrical/encoder/gui/GuiEncoderTaskList.java @@ -6,6 +6,7 @@ import net.minecraft.tileentity.TileEntity; import org.lwjgl.opengl.GL11; +import resonant.api.IScroll; import resonantinduction.electrical.armbot.task.TaskEnd; import resonantinduction.electrical.armbot.task.TaskIdle; import resonantinduction.electrical.armbot.task.TaskStart; @@ -13,7 +14,6 @@ import resonantinduction.electrical.encoder.TileEncoder; import resonantinduction.electrical.encoder.coding.IProgram; import resonantinduction.electrical.encoder.coding.IRedirectTask; import resonantinduction.electrical.encoder.coding.ITask; -import calclavia.lib.prefab.terminal.IScroll; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.common.FMLCommonHandler; diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/BlockMotor.java b/electrical/src/main/scala/resonantinduction/electrical/generator/BlockMotor.java index 6d1a024bb..907bdcd51 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/BlockMotor.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/BlockMotor.java @@ -4,10 +4,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.prefab.block.BlockRotatable; +import resonant.lib.render.block.BlockRenderingHandler; import resonantinduction.core.Reference; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockRotatable; -import calclavia.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/RenderMotor.java b/electrical/src/main/scala/resonantinduction/electrical/generator/RenderMotor.java index b72bc4c49..0768c64fe 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/RenderMotor.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/RenderMotor.java @@ -10,9 +10,9 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; /** * @author Calclavia diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/TileMotor.java b/electrical/src/main/scala/resonantinduction/electrical/generator/TileMotor.java index 6e75fcd79..9bc102be9 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/TileMotor.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/TileMotor.java @@ -4,13 +4,13 @@ import java.util.EnumSet; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IMechanicalNode; +import resonant.api.IRotatable; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; +import resonant.lib.grid.NodeRegistry; +import resonant.lib.prefab.tile.TileElectrical; import universalelectricity.api.energy.EnergyStorageHandler; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.grid.NodeRegistry; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.prefab.tile.TileElectrical; /** * A kinetic energy to electrical energy converter. @@ -43,7 +43,8 @@ public class TileMotor extends TileElectrical implements IRotatable, INodeProvid public void initiate() { super.initiate(); - node.reconstruct(); + if (node != null) + node.reconstruct(); } @Override @@ -81,7 +82,7 @@ public class TileMotor extends TileElectrical implements IRotatable, INodeProvid if (receive > 0) { double percentageUsed = receive / power; - node.apply(-node.getTorque() * percentageUsed, -node.getAngularVelocity() * percentageUsed); + node.apply(this, -node.getTorque() * percentageUsed, -node.getAngularVelocity() * percentageUsed); } } @@ -111,7 +112,7 @@ public class TileMotor extends TileElectrical implements IRotatable, INodeProvid if (currentVelo != 0) setAngularVelocity = Math.min(+setAngularVelocity, maxAngularVelocity) * (node.getAngularVelocity() / currentVelo); - node.apply(setTorque - node.getTorque(), setAngularVelocity - node.getAngularVelocity()); + node.apply(this, setTorque - node.getTorque(), setAngularVelocity - node.getAngularVelocity()); energy.extractEnergy((long) Math.abs(setTorque * setAngularVelocity), true); } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/solar/TileSolarPanel.java b/electrical/src/main/scala/resonantinduction/electrical/generator/solar/TileSolarPanel.java index 80d01df76..a8ef5e3ac 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/solar/TileSolarPanel.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/solar/TileSolarPanel.java @@ -1,26 +1,28 @@ package resonantinduction.electrical.generator.solar; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.render.ConnectedTextureRenderer; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.util.Icon; +import resonant.lib.content.module.TileRender; +import resonant.lib.prefab.vector.Cuboid; +import resonant.lib.utility.ConnectedTextureRenderer; import resonantinduction.core.Reference; +import resonantinduction.core.Settings; import resonantinduction.electrical.battery.TileEnergyDistribution; import universalelectricity.api.energy.EnergyStorageHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; public class TileSolarPanel extends TileEnergyDistribution { @SideOnly(Side.CLIENT) public static Icon sideIcon, bottomIcon; + public TileSolarPanel() { super(Material.iron); - energy = new EnergyStorageHandler(800); + energy = new EnergyStorageHandler(Settings.SOLAR_ENERGY * 20); ioMap = 728; textureName = "solarPanel_top"; bounds = new Cuboid(0, 0, 0, 1, 0.3f, 1); @@ -64,7 +66,7 @@ public class TileSolarPanel extends TileEnergyDistribution { if (!(this.worldObj.isThundering() || this.worldObj.isRaining())) { - this.energy.receiveEnergy(25, true); + this.energy.receiveEnergy(Settings.SOLAR_ENERGY, true); markDistributionUpdate |= produce() > 0; } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/BlockThermopile.java b/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/BlockThermopile.java index fc8fc58fd..9902fd3a6 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/BlockThermopile.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/BlockThermopile.java @@ -4,9 +4,9 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; import resonantinduction.core.Reference; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockTile; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/TileThermopile.java b/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/TileThermopile.java index 66c766868..8dbc3766a 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/TileThermopile.java +++ b/electrical/src/main/scala/resonantinduction/electrical/generator/thermopile/TileThermopile.java @@ -2,9 +2,9 @@ package resonantinduction.electrical.generator.thermopile; import net.minecraft.block.Block; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.prefab.tile.TileElectrical; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.tile.TileElectrical; public class TileThermopile extends TileElectrical { diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/GridRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/GridRailing.java index 653b30326..0cb3b2913 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/GridRailing.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/GridRailing.java @@ -1,15 +1,57 @@ package resonantinduction.electrical.itemrailing; -import calclavia.lib.grid.NodeGrid; +import java.util.Arrays; + +import net.minecraft.item.ItemStack; +import resonant.lib.grid.TickingGrid; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailing; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer; /** * @since 18/03/14 * @author tgame14 */ -public class GridRailing extends NodeGrid +public class GridRailing extends TickingGrid { - public GridRailing (Class type) + public final static String CATEGORY_RAILING = "Item_Railings"; + + public GridRailing (NodeRailing railing, Class type) { - super(type); + super(railing, type); } + + public IItemRailing findTargetForIItemTransfer(IItemRailingTransfer itemwrapper) + { + if (itemwrapper.getColor() == null) + { + return findNearestInventory(itemwrapper); + } + return findNearestColoredTarget(itemwrapper); + } + + public IItemRailing findNearestInventory(IItemRailingTransfer itemwrapper) + { + IItemRailing[] arr = (IItemRailing[]) this.getNodes().toArray(); + Arrays.sort(arr, new RailingDistanceComparator.RailingInventoryDistanceComparator(itemwrapper.getRailing())); + return arr[0]; + } + + public IItemRailing findNearestColoredTarget(IItemRailingTransfer itemwrapper) + { + IItemRailing[] arr = (IItemRailing[]) this.getNodes().toArray(); + Arrays.sort(arr, new RailingDistanceComparator.RailingColoredDistanceComparator(itemwrapper.getRailing(), itemwrapper.getColor())); + return arr[0]; + } + + public IItemRailing chooseNextInstantGoal(IItemRailingTransfer itemwrapper) + { + IItemRailing[] arr = (IItemRailing[]) itemwrapper.getRailing().getConnectionMap().entrySet().toArray(); + Arrays.sort(arr, new RailingDistanceComparator(itemwrapper.getEndGoal())); + return arr[0]; + } + + public void onItemEnterGrid(IItemRailing railing, ItemStack item) + { + + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemItemRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemItemRailing.java new file mode 100644 index 000000000..bbe0c7d49 --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemItemRailing.java @@ -0,0 +1,60 @@ +package resonantinduction.electrical.itemrailing; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.core.MultipartUtility; +import codechicken.lib.vec.BlockCoord; +import codechicken.lib.vec.Vector3; +import codechicken.multipart.ControlKeyModifer; +import codechicken.multipart.JItemMultiPart; +import codechicken.multipart.MultiPartRegistry; +import codechicken.multipart.TMultiPart; + +/** + * @author tgame14 + * @since 17/04/14 + */ +public class ItemItemRailing extends JItemMultiPart +{ + public ItemItemRailing(int id) + { + super(id); + } + + @Override + public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 vhit) + { + BlockCoord onPos = pos.copy().offset(side ^ 1); + + if (player.isSneaking() && !ControlKeyModifer.isControlDown(player)) + { + PartRailing railing = (PartRailing) MultiPartRegistry.createPart("resonant_induction_itemrailing", false); + + if (railing != null) + { + railing.preparePlacement(itemStack.getItemDamage()); + } + + return railing; + } + else + { + if (!MultipartUtility.canPlaceWireOnSide(world, onPos.x, onPos.y, onPos.z, ForgeDirection.getOrientation(side), false)) + { + return null; + } + + PartRailing railing = (PartRailing) MultiPartRegistry.createPart("resonant_induction_itemrailing", false); + + if (railing != null) + { + railing.preparePlacement(side); + } + + return railing; + } + } + +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemRailingTransfer.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemRailingTransfer.java index 00fed6b44..2d8fea720 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemRailingTransfer.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/ItemRailingTransfer.java @@ -1,13 +1,15 @@ package resonantinduction.electrical.itemrailing; +import java.lang.ref.WeakReference; + import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import resonant.lib.render.EnumColor; import resonantinduction.electrical.itemrailing.interfaces.IItemRailing; import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer; -import calclavia.lib.render.EnumColor; /** - * An object that Transfers all + * An object that is a wrapper for all items through railings * * @since 16/03/14 * @author tgame14 @@ -16,13 +18,15 @@ public class ItemRailingTransfer implements IItemRailingTransfer { private ItemStack stack; private EnumColor color; - private PartRailing railing; + private WeakReference railing; + private WeakReference endTarget; public ItemRailingTransfer(ItemStack stack, PartRailing railing) { this.stack = stack.copy(); - this.color = EnumColor.ORANGE; - this.railing = railing; + this.color = null; + this.railing = new WeakReference(railing.getNode()); + this.endTarget = new WeakReference(railing.getNode().getGrid().findTargetForIItemTransfer(this)); } public ItemRailingTransfer(Item item, PartRailing railing) @@ -49,29 +53,28 @@ public class ItemRailingTransfer implements IItemRailingTransfer } @Override - public PartRailing getRailing() + public IItemRailing getRailing() { - return this.railing; + return this.railing.get(); } @Override - public IItemRailingTransfer setRailing(PartRailing railing) + public IItemRailingTransfer setRailing(IItemRailing railing) { - this.railing = railing; + this.railing = new WeakReference(railing); return this; } @Override public IItemRailing getEndGoal() { - // TODO Auto-generated method stub - return null; + return endTarget.get(); } @Override public IItemRailingTransfer setEndGoal(IItemRailing goal) { - // TODO Auto-generated method stub - return null; + this.endTarget = new WeakReference(goal); + return this; } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/NodeRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/NodeRailing.java index 665b24def..de571bbc9 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/NodeRailing.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/NodeRailing.java @@ -1,25 +1,181 @@ package resonantinduction.electrical.itemrailing; -import calclavia.lib.grid.Grid; -import calclavia.lib.grid.Node; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import net.minecraft.inventory.IInventory; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonant.lib.config.Config; +import resonant.lib.grid.Node; +import resonant.lib.render.EnumColor; +import resonant.lib.type.Pair; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailing; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailingProvider; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer; +import universalelectricity.api.vector.IVectorWorld; +import universalelectricity.api.vector.VectorWorld; + +import com.google.common.collect.Lists; /** - * @since 18/03/14 * @author tgame14 + * @since 18/03/14 */ -public class NodeRailing extends Node +public class NodeRailing extends Node implements IVectorWorld, IItemRailing { - public NodeRailing (PartRailing parent) - { - super(parent); - } + private int maxItemSpeed; + private byte connectionMap; + private EnumColor color; - @Override - protected GridRailing newGrid () - { - return new GridRailing(getClass()); - } + @Config(category = GridRailing.CATEGORY_RAILING) + private static int MAX_TICKS_IN_RAILING = 5; + /** hold a timer here per item */ + private Set> itemNodeSet; + + + public NodeRailing(IItemRailingProvider parent) + { + super(parent); + this.itemNodeSet = new HashSet>(); + this.color = null; + this.connectionMap = Byte.parseByte("111111", 2); + this.maxItemSpeed = 20; + } + + public NodeRailing setConnection(byte connectionMap) + { + this.connectionMap = connectionMap; + return this; + } + + @Override + public void update(float deltaTime) + { + if (!world().isRemote) + { + Iterator> iterator = new HashMap(getConnections()).entrySet().iterator(); + + for (Pair pair : this.itemNodeSet) + { + if (pair.right() <= 0) + { + //TODO move to next item railing + + } + else + { + pair.setRight(pair.right() - 1); + } + + + } + + while (iterator.hasNext()) + { + Map.Entry entry = iterator.next(); + Object obj = entry.getKey(); + + if (obj instanceof NodeRailing) + { + + } + } + + } + } + + @Override + protected GridRailing newGrid() + { + return new GridRailing(this, getClass()); + } + + @Override + public double z() + { + return this.getWorldPos().z(); + } + + @Override + public World world() + { + return parent.getWorldPos().world(); + } + + @Override + public double x() + { + return parent.getWorldPos().x(); + } + + @Override + public double y() + { + return parent.getWorldPos().y(); + } + + @Override + public boolean canItemEnter (IItemRailingTransfer item) + { + return this.color != null ? this.color == item.getColor() : false; + } + + @Override + public boolean canConnectToRailing (IItemRailing railing, ForgeDirection from) + { + return this.color != null ? this.color == railing.getRailingColor() : true; + } + + @Override + public EnumColor getRailingColor () + { + return this.color; + } + + @Override + public IItemRailing setRailingColor (EnumColor color) + { + this.color = color; + return this; + } + + @Override + public VectorWorld getWorldPos() + { + return (VectorWorld) parent.getWorldPos(); + } + + @Override + public Map getConnectionMap() + { + return new HashMap(this.getConnections()); + } + + @Override + public IInventory[] getInventoriesNearby() + { + ArrayList invList = Lists.newArrayList(); + for (Object tile : this.getConnections().entrySet()) + { + if (tile instanceof IInventory) + { + invList.add((IInventory) tile); + } + } + return (IInventory[]) invList.toArray(); + } + + @Override + public boolean isLeaf() + { + return connectionMap < 2; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/PartRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/PartRailing.java index 513ee5725..5b71961dd 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/PartRailing.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/PartRailing.java @@ -1,47 +1,45 @@ package resonantinduction.electrical.itemrailing; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.render.EnumColor; -import codechicken.microblock.IHollowConnect; -import codechicken.multipart.JNormalOcclusion; -import codechicken.multipart.TSlottedPart; +import java.lang.reflect.Constructor; + import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; -import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.api.grid.INode; import resonantinduction.core.prefab.part.PartFramedConnection; import resonantinduction.electrical.Electrical; -import resonantinduction.electrical.itemrailing.interfaces.IItemRailing; -import resonantinduction.electrical.itemrailing.interfaces.IItemRailingTransfer; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailingProvider; +import universalelectricity.api.energy.EnergyNetworkLoader; import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IEnergyNetwork; - -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +import universalelectricity.api.vector.VectorWorld; +import codechicken.multipart.TileMultipart; /** * @since 16/03/14 * @author tgame14 */ -public class PartRailing extends PartFramedConnection implements IConductor, TSlottedPart, JNormalOcclusion, IHollowConnect, IItemRailing, INodeProvider +public class PartRailing extends PartFramedConnection implements IConductor, IItemRailingProvider { - public enum EnumRailing + public static enum EnumRailing { DEFAULT, EXTENTION; } - // default is NULL - private EnumColor color; + public NodeRailing getNode() + { + return node; + } + private NodeRailing node; public PartRailing () { super(Electrical.itemInsulation); - - this.color = null; + this.material = EnumRailing.DEFAULT; + this.node = new NodeRailing(this); } @@ -69,38 +67,12 @@ public class PartRailing extends PartFramedConnection getConnectedNodes (Pathfinder finder, Vector3 currentNode) - { - return null; - } - - @Override - public boolean onSearch (Pathfinder finder, Vector3 start, Vector3 currentNode) - { - return false; - } - } - - -} diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RailingDistanceComparator.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RailingDistanceComparator.java new file mode 100644 index 000000000..ebb6e692d --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RailingDistanceComparator.java @@ -0,0 +1,88 @@ +package resonantinduction.electrical.itemrailing; + +import java.util.Comparator; + +import resonant.lib.render.EnumColor; +import resonantinduction.electrical.itemrailing.interfaces.IItemRailing; + +/** + * @author tgame14 + * @since 16/04/14 + */ +public class RailingDistanceComparator implements Comparator +{ + private IItemRailing source; + + public RailingDistanceComparator(IItemRailing source) + { + this.source = source; + } + + @Override + public int compare(IItemRailing o1, IItemRailing o2) + { + return (int) (source.getWorldPos().floor().distance(o1.getWorldPos()) - source.getWorldPos().floor().distance(o2.getWorldPos())); + } + + + public static class RailingInventoryDistanceComparator extends RailingDistanceComparator + { + public RailingInventoryDistanceComparator(IItemRailing source) + { + super(source); + } + + @Override + public int compare(IItemRailing o1, IItemRailing o2) + { + if (o1.getInventoriesNearby() != null && o2.getInventoriesNearby() != null) + { + return super.compare(o1, o2); + } + + else if (o1.getInventoriesNearby() == null && o2.getInventoriesNearby() == null) + { + return super.compare(o1, o2); + } + + if (o1.getInventoriesNearby() != null) + { + return 1; + } + return -1; + } + } + + + public static class RailingColoredDistanceComparator extends RailingDistanceComparator + { + private EnumColor color; + + public RailingColoredDistanceComparator(IItemRailing source, EnumColor color) + { + super(source); + this.color = color; + } + + @Override + public int compare(IItemRailing o1, IItemRailing o2) + { + if (o1.getRailingColor() == o2.getRailingColor()) + { + return super.compare(o1, o2); + } + + else if (color == o1.getRailingColor()) + { + return 1; + } + + else if (color == o2.getRailingColor()) + { + return -1; + } + + return super.compare(o1, o2); + } + } +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RenderRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RenderRailing.java new file mode 100644 index 000000000..83410aabb --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/RenderRailing.java @@ -0,0 +1,17 @@ +package resonantinduction.electrical.itemrailing; + +import net.minecraft.item.ItemStack; +import resonant.api.items.ISimpleItemRenderer; + +/** + * @author tgame14 + * @since 20/04/14 + */ +public class RenderRailing implements ISimpleItemRenderer +{ + @Override + public void renderInventoryItem(ItemStack itemStack) + { + + } +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailing.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailing.java index 5a8612e6f..0e73a368a 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailing.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailing.java @@ -1,8 +1,12 @@ package resonantinduction.electrical.itemrailing.interfaces; -import calclavia.lib.render.EnumColor; -import net.minecraft.world.World; +import java.util.Map; + +import net.minecraft.inventory.IInventory; import net.minecraftforge.common.ForgeDirection; +import resonant.api.grid.INode; +import resonant.lib.render.EnumColor; +import universalelectricity.api.vector.VectorWorld; /** * implement on Part Railings. @@ -10,7 +14,7 @@ import net.minecraftforge.common.ForgeDirection; * @since 16/03/14 * @author tgame14 */ -public interface IItemRailing +public interface IItemRailing extends INode { public boolean canItemEnter (IItemRailingTransfer item); @@ -20,14 +24,13 @@ public interface IItemRailing public IItemRailing setRailingColor (EnumColor color); - /** an easy implementation for tiles / parts that already have this method in them */ - public World getWorldObj (); + public VectorWorld getWorldPos(); - public int x (); + public Map getConnectionMap(); - public int y (); + public IInventory[] getInventoriesNearby(); - public int z (); + public boolean isLeaf(); diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingProvider.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingProvider.java new file mode 100644 index 000000000..7b2394656 --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingProvider.java @@ -0,0 +1,13 @@ +package resonantinduction.electrical.itemrailing.interfaces; + +import resonant.api.grid.INodeProvider; +import universalelectricity.api.vector.IVectorWorld; + +/** + * @author tgame14 + * @since 20/04/14 + */ +public interface IItemRailingProvider extends INodeProvider +{ + public IVectorWorld getWorldPos(); +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingTransfer.java b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingTransfer.java index f3089a1cd..95a187ae1 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingTransfer.java +++ b/electrical/src/main/scala/resonantinduction/electrical/itemrailing/interfaces/IItemRailingTransfer.java @@ -1,11 +1,10 @@ package resonantinduction.electrical.itemrailing.interfaces; import net.minecraft.item.ItemStack; -import resonantinduction.electrical.itemrailing.PartRailing; -import calclavia.lib.render.EnumColor; +import resonant.lib.render.EnumColor; /** - * the object that handles the items that flow through Railings + * the object that functions as a Wrapper for items and handles the items that flow through Railings * * @since 16/03/14 * @author tgame14 @@ -18,9 +17,9 @@ public interface IItemRailingTransfer public IItemRailingTransfer setColor(EnumColor color); - public PartRailing getRailing(); + public IItemRailing getRailing(); - public IItemRailingTransfer setRailing(PartRailing railing); + public IItemRailingTransfer setRailing(IItemRailing railing); public IItemRailing getEndGoal(); diff --git a/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemMiningLaser.java b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemMiningLaser.java new file mode 100644 index 000000000..3cea5c9f5 --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemMiningLaser.java @@ -0,0 +1,231 @@ +package resonantinduction.electrical.laser.gun; + +import java.awt.Color; +import java.util.HashMap; + +import net.minecraft.block.Block; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumMovingObjectType; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import net.minecraftforge.common.MinecraftForge; +import resonant.api.event.LaserEvent; +import resonant.lib.prefab.vector.RayTraceHelper; +import resonant.lib.type.Pair; +import resonantinduction.core.ResonantInduction; +import resonantinduction.core.prefab.items.ItemEnergyTool; +import universalelectricity.api.vector.IVector3; +import universalelectricity.api.vector.Vector3; + +/** Stream laser mining tool, When held down it will slowly mine away at the block in front of it. + * + * + * TODO create model for this that is 3D. The front should spin around the barrel as its mines + * generating a laser. As well the player should be wearing a battery pack when the laser is out. + * Other option is to force the player to wear a battery pack as armor when using the tool + * + * TODO when the laser hits the block there should be a flaring effect that simi blinds the player. + * That way they are force to wear wielding googles. As well this will gear the player more towards + * mining and less to fighting. Though the laser should still be a very effect fighting weapon, with + * only down side being its battery, and that it slows you down when held. Eg its a heavy peace of + * mining gear and the player will be simi-stationary when using it + * + * @author DarkGuardsman */ +public class ItemMiningLaser extends ItemEnergyTool +{ + /** Cost per tick of using the item */ + long joulesPerTick = 100; + /** Damage to entities hit by the laser */ + float damageToEntities = 3.3f; + /** Range of the laser ray trace */ + int blockRange = 50; + /** Time to break a single block */ + int breakTime = 15; + + /** Map of players and how long they have focused the laser on a single block */ + HashMap> miningMap = new HashMap>(); + /** Used to track energy used while the player uses the laser rather then direct editing the nbt */ + HashMap energyUsedMap = new HashMap(); + + public static final int MODE_REMOVE = 0, MODE_SMELT = 1, MODE_DAMAGE = 2; + + public ItemMiningLaser(int id) + { + super(id); + hasModes = true; + toolModes = new String[] { "laser.toolmode.remove", "laser.toolmode.smelt", "laser.toolmode.damage" }; + } + + @Override + public void onUpdate(ItemStack itemStack, World world, Entity entity, int slot, boolean currentHeldItem) + { + //Remove player from mining map if he puts the laser gun away + if (entity instanceof EntityPlayer) + { + EntityPlayer player = (EntityPlayer) entity; + if (!currentHeldItem) + { + if (this.miningMap.containsKey(player)) + { + this.miningMap.remove(player); + } + if (this.energyUsedMap.containsKey(player)) + { + this.energyUsedMap.remove(player); + } + } + } + } + + @Override + public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count) + { + //Small delay to prevent unwanted usage of the item + //TODO increase this delay to simulate warm up time + //TODO increase break time longer the laser has been running + //TODO match hardness of block for break time + //TODO add audio + if (count > 5 && (player.capabilities.isCreativeMode || discharge(stack, joulesPerTick, false) >= joulesPerTick && (!this.energyUsedMap.containsKey(player) || this.energyUsedMap.get(player) <= this.getEnergy(stack)))) + { + Vec3 playerPosition = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); + Vec3 playerLook = RayTraceHelper.getLook(player, 1.0f); + Vec3 p = Vec3.createVectorHelper(playerPosition.xCoord + playerLook.xCoord, playerPosition.yCoord + playerLook.yCoord, playerPosition.zCoord + playerLook.zCoord); + + Vec3 playerViewOffset = Vec3.createVectorHelper(playerPosition.xCoord + playerLook.xCoord * blockRange, playerPosition.yCoord + playerLook.yCoord * blockRange, playerPosition.zCoord + playerLook.zCoord * blockRange); + MovingObjectPosition hit = RayTraceHelper.do_rayTraceFromEntity(player, new Vector3().toVec3(), blockRange, true); + + if (!player.capabilities.isCreativeMode) + { + long energyUsed = this.energyUsedMap.containsKey(player) ? this.energyUsedMap.get(player) : 0; + + switch (getMode(stack)) + { + case 0: + energyUsed += joulesPerTick; + case 1: + energyUsed += joulesPerTick / 2; + case 2: + energyUsed += joulesPerTick / 3; + } + this.energyUsedMap.put(player, energyUsed); + } + + if (hit != null) + { + LaserEvent event = new LaserEvent.LaserFiredPlayerEvent(player, hit, stack); + MinecraftForge.EVENT_BUS.post(event); + if (!player.worldObj.isRemote && !event.isCanceled()) + { + if (hit.typeOfHit == EnumMovingObjectType.ENTITY && hit.entityHit != null) + { + //TODO re-implements laser damage source + DamageSource damageSource = DamageSource.causeMobDamage(player); + hit.entityHit.attackEntityFrom(damageSource, damageToEntities); + hit.entityHit.setFire(5); + } + else if (hit.typeOfHit == EnumMovingObjectType.TILE) + { + int time = 1; + boolean mined = false; + if (miningMap.containsKey(player)) + { + Pair lastHit = miningMap.get(player); + if (lastHit != null && lastHit.left() != null && lastHit.left().equals(new Vector3(hit))) + { + Block b = Block.blocksList[player.worldObj.getBlockId(hit.blockX, hit.blockY, hit.blockZ)]; + if (b != null && b.getBlockHardness(player.worldObj, hit.blockX, hit.blockY, hit.blockZ) > -1) + { + time = lastHit.right() + 1; + if (time >= breakTime && this.getMode(stack) == MODE_REMOVE) + { + LaserEvent.onBlockMinedByLaser(player.worldObj, player, new Vector3(hit)); + mined = true; + miningMap.remove(player); + } + else if (this.getMode(stack) == MODE_SMELT) + { + //TODO get the actual hit side from the angle of the ray trace + LaserEvent.onLaserHitBlock(player.worldObj, player, new Vector3(hit), ForgeDirection.UP); + player.worldObj.destroyBlockInWorldPartially(player.entityId, hit.blockX, hit.blockY, hit.blockZ, time); + } + } + } + } + if (!mined) + { + miningMap.put(player, new Pair(new Vector3(hit), time)); + } + } + + } + playerViewOffset = hit.hitVec; + } + + //Only call client as the server can render stuff threw packets + if (player.worldObj.isRemote) + { + float x = (float) (MathHelper.cos((float) (player.rotationYawHead * 0.0174532925)) * (-.4) - MathHelper.sin((float) (player.rotationYawHead * 0.0174532925)) * (-.1)); + float z = (float) (MathHelper.sin((float) (player.rotationYawHead * 0.0174532925)) * (-.4) + MathHelper.cos((float) (player.rotationYawHead * 0.0174532925)) * (-.1)); + ResonantInduction.proxy.renderBeam(player.worldObj, (IVector3) new Vector3(p).translate(new Vector3(x, -.25, z)), (IVector3) new Vector3(playerViewOffset), Color.red, 5); + ResonantInduction.proxy.renderBeam(player.worldObj, (IVector3) new Vector3(p).translate(new Vector3(x, -.45, z)), (IVector3) new Vector3(playerViewOffset), Color.red, 5); + } + + } + + } + + @Override + public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) + { + if (!player.isSneaking()) + { + player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); + } + return super.onItemRightClick(itemStack, world, player); + } + + @Override + public void onPlayerStoppedUsing(ItemStack stack, World world, EntityPlayer player, int par4) + { + if (miningMap.containsKey(player)) + { + Pair vec = miningMap.get(player); + if (vec != null && vec.left() != null) + { + player.worldObj.destroyBlockInWorldPartially(player.entityId, vec.left().intX(), vec.left().intY(), vec.left().intZ(), -1); + } + miningMap.remove(player); + } + if (this.energyUsedMap.containsKey(player)) + { + discharge(stack, this.energyUsedMap.get(player), true); + this.energyUsedMap.remove(player); + } + } + + @Override + public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) + { + return 72000; + } + + @Override + public EnumAction getItemUseAction(ItemStack par1ItemStack) + { + return EnumAction.bow; + } + +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemThermalLaser.java b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemThermalLaser.java new file mode 100644 index 000000000..2243fdcb7 --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/ItemThermalLaser.java @@ -0,0 +1,125 @@ +package resonantinduction.electrical.laser.gun; + +import java.awt.Color; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumAction; +import net.minecraft.item.ItemStack; +import net.minecraft.util.DamageSource; +import net.minecraft.util.EnumMovingObjectType; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import resonant.api.event.LaserEvent; +import resonant.lib.prefab.vector.RayTraceHelper; +import resonant.lib.thermal.ThermalGrid; +import resonantinduction.core.ResonantInduction; +import universalelectricity.api.item.ItemElectric; +import universalelectricity.api.vector.IVector3; +import universalelectricity.api.vector.Vector3; +import universalelectricity.api.vector.VectorWorld; + +/** Version of the mining laser that uses the thermal grid to melt blocks down + * + * @author DarkGuardsman */ +public class ItemThermalLaser extends ItemElectric +{ + long batterySize = 100000; + float wattPerShot = 1; + float damageToEntities = 3.3f; + int blockRange = 50; + int firingDelay = 5; + int breakTime = 15; + boolean createLava = true, setFire = true; + + public ItemThermalLaser(int id) + { + super(id); + this.setUnlocalizedName("MiningLaser"); + this.setMaxStackSize(1); + this.setCreativeTab(CreativeTabs.tabTools); + } + + @Override + public EnumAction getItemUseAction(ItemStack par1ItemStack) + { + return EnumAction.bow; + } + + @Override + public int getMaxItemUseDuration(ItemStack par1ItemStack) + { + //TODO change render of the laser too show it slowly over heat, when it over heats eg gets to max use damage the player, and tool + return 1000; + } + + @Override + public void onUsingItemTick(ItemStack stack, EntityPlayer player, int count) + { + if (count > 5) + { + Vec3 playerPosition = Vec3.createVectorHelper(player.posX, player.posY + player.getEyeHeight(), player.posZ); + Vec3 playerLook = RayTraceHelper.getLook(player, 1.0f); + Vec3 p = Vec3.createVectorHelper(playerPosition.xCoord + playerLook.xCoord, playerPosition.yCoord + playerLook.yCoord, playerPosition.zCoord + playerLook.zCoord); + + Vec3 playerViewOffset = Vec3.createVectorHelper(playerPosition.xCoord + playerLook.xCoord * blockRange, playerPosition.yCoord + playerLook.yCoord * blockRange, playerPosition.zCoord + playerLook.zCoord * blockRange); + MovingObjectPosition hit = RayTraceHelper.do_rayTraceFromEntity(player, new Vector3().toVec3(), blockRange, true); + + //TODO fix sound + if (hit != null) + { + LaserEvent event = new LaserEvent.LaserFiredPlayerEvent(player, hit, stack); + MinecraftForge.EVENT_BUS.post(event); + if (!player.worldObj.isRemote && !event.isCanceled()) + { + if (hit.typeOfHit == EnumMovingObjectType.ENTITY && hit.entityHit != null) + { + //TODO re-implements laser damage source + DamageSource damageSource = DamageSource.causeMobDamage(player); + hit.entityHit.attackEntityFrom(damageSource, damageToEntities); + hit.entityHit.setFire(5); + } + else if (hit.typeOfHit == EnumMovingObjectType.TILE) + { + ThermalGrid.addTemperature(new VectorWorld(player.worldObj, hit.blockX, hit.blockY, hit.blockZ), 100f); + } + + } + playerViewOffset = hit.hitVec; + } + //TODO make beam brighter the longer it has been used + //TODO adjust the laser for the end of the gun + float x = (float) (MathHelper.cos((float) (player.rotationYawHead * 0.0174532925)) * (-.4) - MathHelper.sin((float) (player.rotationYawHead * 0.0174532925)) * (-.1)); + float z = (float) (MathHelper.sin((float) (player.rotationYawHead * 0.0174532925)) * (-.4) + MathHelper.cos((float) (player.rotationYawHead * 0.0174532925)) * (-.1)); + ResonantInduction.proxy.renderBeam(player.worldObj, (IVector3) new Vector3(p).translate(new Vector3(x, -.25, z)), (IVector3) new Vector3(playerViewOffset), Color.ORANGE, 1); + ResonantInduction.proxy.renderBeam(player.worldObj, (IVector3) new Vector3(p).translate(new Vector3(x, -.45, z)), (IVector3) new Vector3(playerViewOffset), Color.ORANGE, 1); + } + + } + + @Override + public ItemStack onItemRightClick(ItemStack itemStack, World par2World, EntityPlayer player) + { + if (player.capabilities.isCreativeMode || this.getEnergy(itemStack) > this.wattPerShot) + { + player.setItemInUse(itemStack, this.getMaxItemUseDuration(itemStack)); + } + return itemStack; + } + + @Override + public ItemStack onEaten(ItemStack par1ItemStack, World par2World, EntityPlayer par3EntityPlayer) + { + return par1ItemStack; + } + + @Override + public long getEnergyCapacity(ItemStack theItem) + { + return this.batterySize; + } + +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/laser/gun/RenderMiningLaserGun.java b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/RenderMiningLaserGun.java new file mode 100644 index 000000000..3574dc320 --- /dev/null +++ b/electrical/src/main/scala/resonantinduction/electrical/laser/gun/RenderMiningLaserGun.java @@ -0,0 +1,80 @@ +package resonantinduction.electrical.laser.gun; + +import net.minecraft.client.Minecraft; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.client.IItemRenderer; +import net.minecraftforge.client.model.AdvancedModelLoader; +import net.minecraftforge.client.model.IModelCustom; + +import org.lwjgl.opengl.GL11; + +import resonantinduction.core.Reference; +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +@SideOnly(Side.CLIENT) +public class RenderMiningLaserGun implements IItemRenderer +{ + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "MiningLaserGun.tcn"); + private static final ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "LaserGun.png"); + + @Override + public boolean handleRenderType(ItemStack item, ItemRenderType type) + { + return true; + } + + @Override + public boolean shouldUseRenderHelper(ItemRenderType type, ItemStack item, ItemRendererHelper helper) + { + return true; + } + + @Override + public void renderItem(ItemRenderType type, ItemStack item, Object... data) + { + GL11.glPushMatrix(); + + FMLClientHandler.instance().getClient().renderEngine.bindTexture(TEXTURE); + + if (type == ItemRenderType.EQUIPPED_FIRST_PERSON) + { + float scale = 5f; + + if (Minecraft.getMinecraft().thePlayer.getItemInUse() != item) + { + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(0.2f, 0.2f, 0.67f); + GL11.glRotatef(-40, 0, 1, 0); + GL11.glRotatef(10, 1, 0, 0); + } + else + { + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(0.2f, 0.2f, 0.67f); + GL11.glRotatef(-40, 0, 1, 0); + GL11.glRotatef(20, 1, 0, 0); + } + } + else if (type == ItemRenderType.EQUIPPED) + { + float scale = 3f; + GL11.glScalef(scale, scale, scale); + GL11.glRotatef(-80, 1, 0, 0); + GL11.glRotatef(60, 0, 1, 0); + GL11.glRotatef(20, 0, 0, 1); + GL11.glTranslatef(0f, 0f, 0.6f); + } + else if (type == ItemRenderType.INVENTORY) + { + float scale = 1.5f; + GL11.glScalef(scale, scale, scale); + GL11.glTranslatef(0.1f, 0.06f, 0.52f); + } + MODEL.renderAll(); + + GL11.glPopMatrix(); + } +} diff --git a/electrical/src/main/scala/resonantinduction/electrical/levitator/ItemLevitator.java b/electrical/src/main/scala/resonantinduction/electrical/levitator/ItemLevitator.java index 2f5b93b25..93b83a561 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/levitator/ItemLevitator.java +++ b/electrical/src/main/scala/resonantinduction/electrical/levitator/ItemLevitator.java @@ -1,5 +1,7 @@ package resonantinduction.electrical.levitator; +import java.util.List; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.MathHelper; @@ -14,30 +16,38 @@ import codechicken.multipart.TMultiPart; public class ItemLevitator extends JItemMultiPart implements IHighlight { - public ItemLevitator(int id) - { - super(id); - } + public ItemLevitator(int id) + { + super(id); + } - @Override - public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 hit) - { - side = FacePlacementGrid$.MODULE$.getHitSlot(hit, side); - PartLevitator part = (PartLevitator) MultiPartRegistry.createPart("resonant_induction_levitator", false); + @Override + @SuppressWarnings("unchecked") + public void addInformation(ItemStack itemstack, EntityPlayer player, List list, boolean par4) + { + list.add("\u00a7cFrom Dev's - Functionality Disabled"); - if (part != null) - { - int l = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; - int facing = l == 0 ? 2 : (l == 1 ? 5 : (l == 2 ? 3 : (l == 3 ? 4 : 0))); - part.preparePlacement(side, facing); - } + } - return part; - } + @Override + public TMultiPart newPart(ItemStack itemStack, EntityPlayer player, World world, BlockCoord pos, int side, Vector3 hit) + { + side = FacePlacementGrid$.MODULE$.getHitSlot(hit, side); + PartLevitator part = (PartLevitator) MultiPartRegistry.createPart("resonant_induction_levitator", false); - @Override - public int getHighlightType() - { - return 0; - } + if (part != null) + { + int l = MathHelper.floor_double(player.rotationYaw * 4.0F / 360.0F + 0.5D) & 3; + int facing = l == 0 ? 2 : (l == 1 ? 5 : (l == 2 ? 3 : (l == 3 ? 4 : 0))); + part.preparePlacement(side, facing); + } + + return part; + } + + @Override + public int getHighlightType() + { + return 0; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/levitator/PartLevitator.java b/electrical/src/main/scala/resonantinduction/electrical/levitator/PartLevitator.java index d78026507..57fe91cf0 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/levitator/PartLevitator.java +++ b/electrical/src/main/scala/resonantinduction/electrical/levitator/PartLevitator.java @@ -21,6 +21,10 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.IFluidBlock; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LinkUtility; +import resonant.lib.utility.WrenchUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.MultipartUtility; import resonantinduction.core.Settings; import resonantinduction.core.prefab.part.PartFace; @@ -28,10 +32,6 @@ import resonantinduction.electrical.Electrical; import resonantinduction.electrical.tesla.TileTesla; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; -import calclavia.lib.render.EnumColor; -import calclavia.lib.utility.LinkUtility; -import calclavia.lib.utility.WrenchUtility; -import calclavia.lib.utility.inventory.InventoryUtility; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import codechicken.multipart.TMultiPart; @@ -40,16 +40,17 @@ import cpw.mods.fml.relauncher.SideOnly; public class PartLevitator extends PartFace { - private int pushDelay; - - private AxisAlignedBB operationBounds; - private AxisAlignedBB suckBounds; - /** * true = suck, false = push */ public boolean input = true; - + /** + * Client Side Only + */ + public float renderRotation = 0; + private int pushDelay; + private AxisAlignedBB operationBounds; + private AxisAlignedBB suckBounds; /** * Pathfinding */ @@ -57,20 +58,21 @@ public class PartLevitator extends PartFace private PathfinderLevitator pathfinder; private WeakReference linked; private int lastCalcTime = 0; - - /** Color of beam */ + /** + * Color of beam + */ private int dyeID = TileTesla.DEFAULT_COLOR; - /** * Linking */ private byte saveLinkSide; private VectorWorld saveLinkVector; - /** - * Client Side Only - */ - public float renderRotation = 0; + public static boolean canBePath(World world, Vector3 position) + { + Block block = Block.blocksList[position.getBlockID(world)]; + return block == null || (block instanceof BlockSnow || block instanceof BlockVine || block instanceof BlockLadder || ((block instanceof BlockFluid || block instanceof IFluidBlock) && block.blockID != Block.lavaMoving.blockID && block.blockID != Block.lavaStill.blockID)); + } @Override public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack itemStack) @@ -80,13 +82,17 @@ public class PartLevitator extends PartFace if (tryLink(LinkUtility.getLink(itemStack), LinkUtility.getSide(itemStack))) { if (world().isRemote) + { player.addChatMessage("Successfully linked devices."); + } LinkUtility.clearLink(itemStack); } else { if (world().isRemote) + { player.addChatMessage("Marked link for device."); + } LinkUtility.setLink(itemStack, new VectorWorld(world(), x(), y(), z())); LinkUtility.setSide(itemStack, (byte) placementSide.ordinal()); @@ -111,7 +117,9 @@ public class PartLevitator extends PartFace } if (player.isSneaking()) + { input = !input; + } updateBounds(); updatePath(); @@ -152,18 +160,18 @@ public class PartLevitator extends PartFace */ if (!world().isRemote && input && canFunction() && entity instanceof EntityItem) { - EntityItem item = (EntityItem) entity; + EntityItem entityItem = (EntityItem) entity; IInventory inventory = (IInventory) getLatched(); - ItemStack remains = InventoryUtility.putStackInInventory(inventory, item.getEntityItem(), placementSide.getOpposite().getOpposite().ordinal(), false); + ItemStack remains = InventoryUtility.putStackInInventory(inventory, entityItem.getEntityItem(), placementSide.getOpposite().getOpposite().ordinal(), false); if (remains == null) { - item.setDead(); + entityItem.setDead(); } else { - item.setEntityItemStack(remains); + entityItem.getEntityItem().stackSize = remains.stackSize; } // TODO: Add redstone pulse and reaction? @@ -174,7 +182,9 @@ public class PartLevitator extends PartFace public void update() { if (ticks % 60 == 0) + { updateBounds(); + } super.update(); @@ -209,11 +219,11 @@ public class PartLevitator extends PartFace if (retrieved != null) { - EntityItem item = getItemWithPosition(retrieved); + EntityItem entityItem = getItemWithPosition(retrieved); if (!world().isRemote) { - world().spawnEntityInWorld(item); + world().spawnEntityInWorld(entityItem); } pushDelay = Settings.LEVITATOR_PUSH_DELAY; @@ -277,7 +287,9 @@ public class PartLevitator extends PartFace final ForgeDirection direction = difference.toForgeDirection(); if (renderBeam) + { Electrical.proxy.renderElectricShock(world(), prevResult.clone().translate(0.5), result.clone().translate(0.5), EnumColor.DYES[dyeID].toColor(), world().rand.nextFloat() > 0.9); + } AxisAlignedBB bounds = AxisAlignedBB.getAABBPool().getAABB(result.x, result.y, result.z, result.x + 1, result.y + 1, result.z + 1); List entities = world().getEntitiesWithinAABB(EntityItem.class, bounds); @@ -313,7 +325,9 @@ public class PartLevitator extends PartFace } if (ticks % renderPeriod == 0) + { Electrical.proxy.renderElectricShock(world(), getBeamSpawnPosition(), new Vector3(operationBounds.maxX - 0.5 - placementSide.offsetX / 3f, operationBounds.maxY - 0.5 - placementSide.offsetY / 3f, operationBounds.maxZ - 0.5 - placementSide.offsetZ / 3f), EnumColor.DYES[dyeID].toColor(), world().rand.nextFloat() > 0.9); + } } } @@ -325,21 +339,19 @@ public class PartLevitator extends PartFace { TMultiPart partSelf = MultipartUtility.getMultipart(new VectorWorld(world, position), placementSide.ordinal()); if (partSelf == this) + { return true; + } TMultiPart partLink = MultipartUtility.getMultipart(new VectorWorld(world, position), getLink().placementSide.ordinal()); if (partLink == getLink()) + { return true; + } return canBePath(world, position); } - public static boolean canBePath(World world, Vector3 position) - { - Block block = Block.blocksList[position.getBlockID(world)]; - return block == null || (block instanceof BlockSnow || block instanceof BlockVine || block instanceof BlockLadder || ((block instanceof BlockFluid || block instanceof IFluidBlock) && block.blockID != Block.lavaMoving.blockID && block.blockID != Block.lavaStill.blockID)); - } - private boolean hasLink() { return getLink() != null && getLink().getLink() == this; @@ -506,7 +518,8 @@ public class PartLevitator extends PartFace public boolean canFunction() { - return isLatched() && !world().isBlockIndirectlyGettingPowered(x(), y(), z()); + //TODO remove (false) when working on + return false && isLatched() && !world().isBlockIndirectlyGettingPowered(x(), y(), z()); } public boolean isLatched() diff --git a/electrical/src/main/scala/resonantinduction/electrical/levitator/PathfinderLevitator.java b/electrical/src/main/scala/resonantinduction/electrical/levitator/PathfinderLevitator.java index de552e71f..74f463381 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/levitator/PathfinderLevitator.java +++ b/electrical/src/main/scala/resonantinduction/electrical/levitator/PathfinderLevitator.java @@ -5,10 +5,10 @@ import java.util.Set; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.path.IPathCallBack; +import resonant.lib.path.Pathfinder; +import resonant.lib.path.PathfinderAStar; import universalelectricity.api.vector.Vector3; -import calclavia.lib.path.IPathCallBack; -import calclavia.lib.path.Pathfinder; -import calclavia.lib.path.PathfinderAStar; /** * Uses the well known A* Pathfinding algorithm. diff --git a/electrical/src/main/scala/resonantinduction/electrical/levitator/RenderLevitator.java b/electrical/src/main/scala/resonantinduction/electrical/levitator/RenderLevitator.java index 76179b2d8..97968e33d 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/levitator/RenderLevitator.java +++ b/electrical/src/main/scala/resonantinduction/electrical/levitator/RenderLevitator.java @@ -7,9 +7,9 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.client.FMLClientHandler; public class RenderLevitator implements ISimpleItemRenderer diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/Graph.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/Graph.java index 0687748b5..df844765d 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/Graph.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/Graph.java @@ -1,7 +1,7 @@ package resonantinduction.electrical.multimeter; import net.minecraft.nbt.NBTTagCompound; -import calclavia.lib.type.EvictingList; +import resonant.lib.type.EvictingList; /** * Graph for the multimeter diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java index 1728232d7..be99a0aa1 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/GuiMultimeter.java @@ -6,9 +6,9 @@ package resonantinduction.electrical.multimeter; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiTextField; import net.minecraft.entity.player.InventoryPlayer; -import calclavia.lib.gui.GuiContainerBase; -import calclavia.lib.render.EnumColor; -import calclavia.lib.utility.LanguageUtility; +import resonant.lib.gui.GuiContainerBase; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LanguageUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java index 46394662f..73a59b928 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/ItemMultimeter.java @@ -12,10 +12,10 @@ import net.minecraft.world.World; import org.lwjgl.input.Keyboard; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.prefab.part.IHighlight; import resonantinduction.electrical.wire.EnumWireMaterial; -import calclavia.lib.render.EnumColor; -import calclavia.lib.utility.LanguageUtility; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Vector3; import codechicken.microblock.FacePlacementGrid$; diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/MultimeterNetwork.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/MultimeterNetwork.java index 10b528c66..9d1e9583a 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/MultimeterNetwork.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/MultimeterNetwork.java @@ -6,13 +6,13 @@ import java.util.List; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import resonant.lib.utility.LanguageUtility; import universalelectricity.api.energy.UnitDisplay; import universalelectricity.api.energy.UnitDisplay.Unit; import universalelectricity.api.net.IUpdate; import universalelectricity.api.vector.Vector3; import universalelectricity.core.net.Network; import universalelectricity.core.net.NetworkTickHandler; -import calclavia.lib.utility.LanguageUtility; public class MultimeterNetwork extends Network implements IUpdate { diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.java index 71a21c2c6..9c96ba910 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/PartMultimeter.java @@ -11,6 +11,10 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import resonant.api.IMechanicalNode; +import resonant.api.grid.INodeProvider; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.utility.WrenchUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.core.grid.fluid.FluidPressureNode; import resonantinduction.core.grid.fluid.IPressureNodeProvider; @@ -21,10 +25,6 @@ import universalelectricity.api.electricity.IElectricalNetwork; import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IEnergyNetwork; import universalelectricity.api.net.IConnector; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.utility.WrenchUtility; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import codechicken.lib.vec.Cuboid6; @@ -39,549 +39,548 @@ import cpw.mods.fml.common.network.PacketDispatcher; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -/** - * Block that detects power. +/** Block that detects power. * - * @author Calclavia - * - */ + * @author Calclavia */ public class PartMultimeter extends PartFace implements IConnector, IRedstonePart, IPacketReceiver { - public enum DetectMode - { - NONE("none"), LESS_THAN("lessThan"), LESS_THAN_EQUAL("lessThanOrEqual"), EQUAL("equal"), - GREATER_THAN_EQUAL("greaterThanOrEqual"), GREATER_THAN("greaterThan"); - - public String display; - - private DetectMode(String s) - { - display = s; - } - } - - public Set playersUsing = new HashSet(); - - /** - * Detection - */ - public double redstoneTriggerLimit; - public byte detectType = 0; - public byte graphType = 0; - private DetectMode detectMode = DetectMode.NONE; - public boolean redstoneOn; - private boolean doDetect = true; - - public boolean isPrimary; - private MultimeterNetwork network; - - public boolean hasMultimeter(int x, int y, int z) - { - return getMultimeter(x, y, z) != null; - } - - @Override - public void preRemove() - { - if (!world().isRemote) - getNetwork().split(this); - } - - public void refresh() - { - if (world() != null) - { - if (!world().isRemote) - { - for (Object obj : getConnections()) - { - if (obj instanceof PartMultimeter) - { - getNetwork().merge(((PartMultimeter) obj).getNetwork()); - } - } - - getNetwork().reconstruct(); - } - } - } - - public void updateDesc() - { - writeDesc(getWriteStream()); - } - - public void updateGraph() - { - writeGraph(getWriteStream()); - } - - @Override - public void onWorldJoin() - { - refresh(); - } - - @Override - public void onNeighborChanged() - { - refresh(); - } - - @Override - public void onPartChanged(TMultiPart part) - { - refresh(); - } - - /** - * Gets the multimeter on the same plane. - */ - public PartMultimeter getMultimeter(int x, int y, int z) - { - TileEntity tileEntity = world().getBlockTileEntity(x, y, z); - - if (tileEntity instanceof TileMultipart) - { - TMultiPart part = ((TileMultipart) tileEntity).partMap(placementSide.ordinal()); - - if (part instanceof PartMultimeter) - { - return (PartMultimeter) part; - } - } - - return null; - } - - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) - { - if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem(), x(), y(), z())) - { - if (!this.world().isRemote) - { - doDetect = !doDetect; - player.addChatMessage("Multimeter detection set to: " + doDetect); - WrenchUtility.damageWrench(player, player.inventory.getCurrentItem(), x(), y(), z()); - } - return true; - } - - player.openGui(Electrical.INSTANCE, placementSide.ordinal(), world(), x(), y(), z()); - return true; - } - - @Override - public void update() - { - super.update(); - - this.ticks++; - - if (!world().isRemote) - { - if (doDetect) - updateDetections(); - - double detectedValue = getNetwork().graphs.get(detectType).getDouble(); - - boolean outputRedstone = false; - - switch (detectMode) - { - default: - break; - case EQUAL: - outputRedstone = detectedValue == redstoneTriggerLimit; - break; - case GREATER_THAN: - outputRedstone = detectedValue > redstoneTriggerLimit; - break; - case GREATER_THAN_EQUAL: - outputRedstone = detectedValue >= redstoneTriggerLimit; - break; - case LESS_THAN: - outputRedstone = detectedValue < redstoneTriggerLimit; - break; - case LESS_THAN_EQUAL: - outputRedstone = detectedValue <= redstoneTriggerLimit; - break; - } - - getNetwork().markUpdate(); - - if (ticks % 20 == 0) - { - if (outputRedstone != redstoneOn) - { - redstoneOn = outputRedstone; - tile().notifyPartChange(this); - } - - updateGraph(); - } - } - - if (!world().isRemote) - { - for (EntityPlayer player : playersUsing) - { - updateGraph(); - } - } - } - - public void updateDetections() - { - ForgeDirection receivingSide = getDirection().getOpposite(); - TileEntity tileEntity = getDetectedTile(); - - /** - * Update Energy Graph - */ - if (tileEntity instanceof IConductor) - { - IConnector instance = ((IConductor) tileEntity).getInstance(receivingSide); - - for (ForgeDirection dir : ForgeDirection.values()) - { - if (instance != null) - { - break; - } - - instance = ((IConnector) tileEntity).getInstance(dir); - } - - if (instance != null) - { - if (instance.getNetwork() instanceof IEnergyNetwork) - { - IEnergyNetwork network = instance.getNetwork(); - getNetwork().energyGraph.queue(Math.max(network.getBuffer(), network.getLastBuffer())); - getNetwork().powerGraph.queue(getNetwork().energyGraph.getAverage() * 20); - - if (instance.getNetwork() instanceof IElectricalNetwork) - getNetwork().voltageGraph.queue(((IElectricalNetwork) network).getVoltage()); - } - } - } - - if (tileEntity instanceof INodeProvider) - { - IMechanicalNode instance = ((INodeProvider) tileEntity).getNode(IMechanicalNode.class, receivingSide); - - for (ForgeDirection dir : ForgeDirection.values()) - { - if (instance != null) - { - break; - } - - instance = ((INodeProvider) tileEntity).getNode(IMechanicalNode.class, dir); - } - - if (instance != null) - { - getNetwork().torqueGraph.queue(instance.getTorque()); - getNetwork().angularVelocityGraph.queue(instance.getAngularVelocity()); - getNetwork().powerGraph.queue((long) instance.getPower()); - } - } - - if (tileEntity instanceof IFluidHandler) - { - FluidTankInfo[] fluidInfo = ((IFluidHandler) tileEntity).getTankInfo(receivingSide); - - if (fluidInfo != null) - { - for (FluidTankInfo info : fluidInfo) - { - if (info != null) - if (info.fluid != null) - getNetwork().fluidGraph.queue(info.fluid.amount); - } - } - } - - if (tileEntity instanceof IPressureNodeProvider) - { - getNetwork().pressureGraph.queue(((IPressureNodeProvider) tileEntity).getNode(FluidPressureNode.class, receivingSide).getPressure(receivingSide)); - } - - getNetwork().energyGraph.queue(CompatibilityModule.getEnergy(tileEntity, receivingSide)); - - /** - * Update Energy Capacity Graph - */ - getNetwork().energyCapacityGraph.queue(CompatibilityModule.getMaxEnergy(tileEntity, receivingSide)); - } - - @Override - public void readDesc(MCDataInput packet) - { - packet.readByte(); - placementSide = ForgeDirection.getOrientation(packet.readByte()); - facing = packet.readByte(); - detectMode = DetectMode.values()[packet.readByte()]; - detectType = packet.readByte(); - graphType = packet.readByte(); - getNetwork().center = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); - getNetwork().size = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); - getNetwork().isEnabled = packet.readBoolean(); - } - - @Override - public void writeDesc(MCDataOutput packet) - { - packet.writeByte(0); - packet.writeByte(placementSide.ordinal()); - packet.writeByte(facing); - packet.writeByte(detectMode.ordinal()); - packet.writeByte(detectType); - packet.writeByte(graphType); - packet.writeNBTTagCompound(getNetwork().center.writeToNBT(new NBTTagCompound())); - packet.writeNBTTagCompound(getNetwork().size.writeToNBT(new NBTTagCompound())); - packet.writeBoolean(getNetwork().isEnabled); - } - - public void writeGraph(MCDataOutput packet) - { - packet.writeByte(2); - isPrimary = getNetwork().isPrimary(this); - packet.writeBoolean(isPrimary); - - if (isPrimary) - packet.writeNBTTagCompound(getNetwork().save()); - } - - @Override - public void read(MCDataInput packet) - { - read(packet, packet.readUByte()); - } - - public void read(MCDataInput packet, int packetID) - { - switch (packetID) - { - case 0: - { - placementSide = ForgeDirection.getOrientation(packet.readByte()); - facing = packet.readByte(); - detectMode = DetectMode.values()[packet.readByte()]; - detectType = packet.readByte(); - graphType = packet.readByte(); - getNetwork().center = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); - getNetwork().size = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); - getNetwork().isEnabled = packet.readBoolean(); - refresh(); - break; - } - case 1: - { - redstoneTriggerLimit = packet.readLong(); - break; - } - case 2: - { - isPrimary = packet.readBoolean(); - - if (isPrimary) - getNetwork().load(packet.readNBTTagCompound()); - break; - } - } - } - - @Override - public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) - { - detectMode = DetectMode.values()[data.readByte()]; - detectType = data.readByte(); - graphType = data.readByte(); - redstoneTriggerLimit = data.readDouble(); - } - - public TileEntity getDetectedTile() - { - ForgeDirection direction = getDirection(); - return world().getBlockTileEntity(x() + direction.offsetX, y() + direction.offsetY, z() + direction.offsetZ); - } - - public ForgeDirection getDirection() - { - return ForgeDirection.getOrientation(this.placementSide.ordinal()); - } - - public void toggleGraphType() - { - graphType = (byte) ((graphType + 1) % getNetwork().graphs.size()); - updateServer(); - } - - public void toggleMode() - { - detectMode = DetectMode.values()[(detectMode.ordinal() + 1) % DetectMode.values().length]; - updateServer(); - } - - public void toggleDetectionValue() - { - detectType = (byte) ((detectType + 1) % getNetwork().graphs.size()); - updateServer(); - } - - public void updateServer() - { - PacketDispatcher.sendPacketToServer(ResonantInduction.PACKET_MULTIPART.getPacket(new universalelectricity.api.vector.Vector3(x(), y(), z()), placementSide.ordinal(), (byte) detectMode.ordinal(), detectType, graphType, redstoneTriggerLimit)); - } - - @Override - public void load(NBTTagCompound nbt) - { - super.load(nbt); - placementSide = ForgeDirection.getOrientation(nbt.getByte("side")); - detectMode = DetectMode.values()[nbt.getByte("detectMode")]; - detectType = nbt.getByte("detectionType"); - graphType = nbt.getByte("graphType"); - doDetect = nbt.getBoolean("doDetect"); - redstoneTriggerLimit = nbt.getDouble("triggerLimit"); - } - - @Override - public void save(NBTTagCompound nbt) - { - super.save(nbt); - nbt.setByte("side", (byte) placementSide.ordinal()); - nbt.setByte("detectMode", (byte) detectMode.ordinal()); - nbt.setByte("detectionType", detectType); - nbt.setByte("graphType", graphType); - nbt.setBoolean("doDetect", doDetect); - nbt.setDouble("triggerLimit", redstoneTriggerLimit); - } - - public DetectMode getMode() - { - return detectMode; - } - - @Override - public String getType() - { - return "resonant_induction_multimeter"; - } - - @Override - public int redstoneConductionMap() - { - return 0x1F; - } - - @Override - public boolean solid(int arg0) - { - return true; - } - - @Override - protected ItemStack getItem() - { - return new ItemStack(Electrical.itemMultimeter); - } - - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(Vector3 pos, float frame, int pass) - { - if (pass == 0) - { - RenderMultimeter.render(this, pos.x, pos.y, pos.z); - } - } - - @Override - public boolean canConnectRedstone(int arg0) - { - return true; - } - - @Override - public int strongPowerLevel(int arg0) - { - return redstoneOn ? 14 : 0; - } - - @Override - public int weakPowerLevel(int arg0) - { - return redstoneOn ? 14 : 0; - } - - @Override - public MultimeterNetwork getNetwork() - { - if (network == null) - { - network = new MultimeterNetwork(); - network.addConnector(this); - } - - return network; - } - - @Override - public void setNetwork(MultimeterNetwork network) - { - this.network = network; - } - - @Override - public boolean canConnect(ForgeDirection direction, Object obj) - { - return obj instanceof PartMultimeter; - } - - @Override - public Object[] getConnections() - { - Object[] connections = new Object[6]; - - for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) - { - if (dir != getDirection() && dir != getDirection().getOpposite()) - { - universalelectricity.api.vector.Vector3 vector = getPosition().translate(dir); - - if (hasMultimeter(vector.intX(), vector.intY(), vector.intZ())) - { - connections[dir.ordinal()] = getMultimeter(vector.intX(), vector.intY(), vector.intZ()); - } - } - } - - return connections; - } - - @Override - public IConnector getInstance(ForgeDirection dir) - { - return this; - } - - public universalelectricity.api.vector.Vector3 getPosition() - { - return new universalelectricity.api.vector.Vector3(x(), y(), z()); - } - - @Override - @SideOnly(Side.CLIENT) - public Cuboid6 getRenderBounds() - { - if (isPrimary) - return Cuboid6.full.copy().expand(new Vector3(getNetwork().size.x, getNetwork().size.y, getNetwork().size.z)); - return Cuboid6.full; - } + public enum DetectMode + { + NONE("none"), + LESS_THAN("lessThan"), + LESS_THAN_EQUAL("lessThanOrEqual"), + EQUAL("equal"), + GREATER_THAN_EQUAL("greaterThanOrEqual"), + GREATER_THAN("greaterThan"); + + public String display; + + private DetectMode(String s) + { + display = s; + } + } + + public Set playersUsing = new HashSet(); + + /** Detection */ + public double redstoneTriggerLimit; + public byte detectType = 0; + public byte graphType = 0; + private DetectMode detectMode = DetectMode.NONE; + public boolean redstoneOn; + private boolean doDetect = true; + + public boolean isPrimary; + private MultimeterNetwork network; + + public boolean hasMultimeter(int x, int y, int z) + { + return getMultimeter(x, y, z) != null; + } + + @Override + public void preRemove() + { + if (!world().isRemote) + getNetwork().split(this); + } + + public void refresh() + { + if (world() != null) + { + if (!world().isRemote) + { + for (Object obj : getConnections()) + { + if (obj instanceof PartMultimeter) + { + getNetwork().merge(((PartMultimeter) obj).getNetwork()); + } + } + + getNetwork().reconstruct(); + } + } + } + + public void updateDesc() + { + writeDesc(getWriteStream()); + } + + public void updateGraph() + { + writeGraph(getWriteStream()); + } + + @Override + public void onWorldJoin() + { + refresh(); + } + + @Override + public void onNeighborChanged() + { + refresh(); + } + + @Override + public void onPartChanged(TMultiPart part) + { + refresh(); + } + + /** Gets the multimeter on the same plane. */ + public PartMultimeter getMultimeter(int x, int y, int z) + { + TileEntity tileEntity = world().getBlockTileEntity(x, y, z); + + if (tileEntity instanceof TileMultipart) + { + TMultiPart part = ((TileMultipart) tileEntity).partMap(placementSide.ordinal()); + + if (part instanceof PartMultimeter) + { + return (PartMultimeter) part; + } + } + + return null; + } + + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) + { + if (WrenchUtility.isUsableWrench(player, player.inventory.getCurrentItem(), x(), y(), z())) + { + if (!this.world().isRemote) + { + doDetect = !doDetect; + player.addChatMessage("Multimeter detection set to: " + doDetect); + WrenchUtility.damageWrench(player, player.inventory.getCurrentItem(), x(), y(), z()); + } + return true; + } + + player.openGui(Electrical.INSTANCE, placementSide.ordinal(), world(), x(), y(), z()); + return true; + } + + @Override + public void update() + { + super.update(); + + this.ticks++; + + if (!world().isRemote) + { + if (doDetect) + updateDetections(); + + double detectedValue = getNetwork().graphs.get(detectType).getDouble(); + + boolean outputRedstone = false; + + switch (detectMode) + { + default: + break; + case EQUAL: + outputRedstone = detectedValue == redstoneTriggerLimit; + break; + case GREATER_THAN: + outputRedstone = detectedValue > redstoneTriggerLimit; + break; + case GREATER_THAN_EQUAL: + outputRedstone = detectedValue >= redstoneTriggerLimit; + break; + case LESS_THAN: + outputRedstone = detectedValue < redstoneTriggerLimit; + break; + case LESS_THAN_EQUAL: + outputRedstone = detectedValue <= redstoneTriggerLimit; + break; + } + + getNetwork().markUpdate(); + + if (ticks % 20 == 0) + { + if (outputRedstone != redstoneOn) + { + redstoneOn = outputRedstone; + tile().notifyPartChange(this); + } + + updateGraph(); + } + } + + if (!world().isRemote) + { + for (EntityPlayer player : playersUsing) + { + updateGraph(); + } + } + } + + public void updateDetections() + { + ForgeDirection receivingSide = getDirection().getOpposite(); + TileEntity tileEntity = getDetectedTile(); + + /** Update Energy Graph */ + if (tileEntity instanceof IConductor) + { + IConnector instance = ((IConductor) tileEntity).getInstance(receivingSide); + + for (ForgeDirection dir : ForgeDirection.values()) + { + if (instance != null) + { + break; + } + + instance = ((IConnector) tileEntity).getInstance(dir); + } + + if (instance != null) + { + if (instance.getNetwork() instanceof IEnergyNetwork) + { + IEnergyNetwork network = instance.getNetwork(); + getNetwork().energyGraph.queue(Math.max(network.getBuffer(), network.getLastBuffer())); + getNetwork().powerGraph.queue(getNetwork().energyGraph.getAverage() * 20); + + if (instance.getNetwork() instanceof IElectricalNetwork) + getNetwork().voltageGraph.queue(((IElectricalNetwork) network).getVoltage()); + } + } + } + + if (tileEntity instanceof INodeProvider) + { + IMechanicalNode instance = ((INodeProvider) tileEntity).getNode(IMechanicalNode.class, receivingSide); + + for (ForgeDirection dir : ForgeDirection.values()) + { + if (instance != null) + { + break; + } + + instance = ((INodeProvider) tileEntity).getNode(IMechanicalNode.class, dir); + } + + if (instance != null) + { + getNetwork().torqueGraph.queue(instance.getTorque()); + getNetwork().angularVelocityGraph.queue(instance.getAngularVelocity()); + getNetwork().powerGraph.queue((long) instance.getPower()); + } + } + + if (tileEntity instanceof IFluidHandler) + { + FluidTankInfo[] fluidInfo = ((IFluidHandler) tileEntity).getTankInfo(receivingSide); + + if (fluidInfo != null) + { + for (FluidTankInfo info : fluidInfo) + { + if (info != null) + if (info.fluid != null) + getNetwork().fluidGraph.queue(info.fluid.amount); + } + } + } + + if (tileEntity instanceof IPressureNodeProvider) + { + getNetwork().pressureGraph.queue(((IPressureNodeProvider) tileEntity).getNode(FluidPressureNode.class, receivingSide).getPressure(receivingSide)); + } + + getNetwork().energyGraph.queue(CompatibilityModule.getEnergy(tileEntity, receivingSide)); + + /** Update Energy Capacity Graph */ + getNetwork().energyCapacityGraph.queue(CompatibilityModule.getMaxEnergy(tileEntity, receivingSide)); + } + + @Override + public void readDesc(MCDataInput packet) + { + packet.readByte(); + placementSide = ForgeDirection.getOrientation(packet.readByte()); + facing = packet.readByte(); + detectMode = DetectMode.values()[packet.readByte()]; + detectType = packet.readByte(); + graphType = packet.readByte(); + getNetwork().center = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); + getNetwork().size = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); + getNetwork().isEnabled = packet.readBoolean(); + } + + @Override + public void writeDesc(MCDataOutput packet) + { + packet.writeByte(0); + packet.writeByte(placementSide.ordinal()); + packet.writeByte(facing); + packet.writeByte(detectMode.ordinal()); + packet.writeByte(detectType); + packet.writeByte(graphType); + packet.writeNBTTagCompound(getNetwork().center.writeToNBT(new NBTTagCompound())); + packet.writeNBTTagCompound(getNetwork().size.writeToNBT(new NBTTagCompound())); + packet.writeBoolean(getNetwork().isEnabled); + } + + public void writeGraph(MCDataOutput packet) + { + packet.writeByte(2); + isPrimary = getNetwork().isPrimary(this); + packet.writeBoolean(isPrimary); + + if (isPrimary) + packet.writeNBTTagCompound(getNetwork().save()); + } + + @Override + public void read(MCDataInput packet) + { + read(packet, packet.readUByte()); + } + + public void read(MCDataInput packet, int packetID) + { + switch (packetID) + { + case 0: + { + placementSide = ForgeDirection.getOrientation(packet.readByte()); + facing = packet.readByte(); + detectMode = DetectMode.values()[packet.readByte()]; + detectType = packet.readByte(); + graphType = packet.readByte(); + getNetwork().center = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); + getNetwork().size = new universalelectricity.api.vector.Vector3(packet.readNBTTagCompound()); + getNetwork().isEnabled = packet.readBoolean(); + refresh(); + break; + } + case 1: + { + redstoneTriggerLimit = packet.readLong(); + break; + } + case 2: + { + isPrimary = packet.readBoolean(); + + if (isPrimary) + getNetwork().load(packet.readNBTTagCompound()); + break; + } + } + } + + @Override + public void onReceivePacket(ByteArrayDataInput data, EntityPlayer player, Object... extra) + { + detectMode = DetectMode.values()[data.readByte()]; + detectType = data.readByte(); + graphType = data.readByte(); + redstoneTriggerLimit = data.readDouble(); + } + + public TileEntity getDetectedTile() + { + ForgeDirection direction = getDirection(); + return world().getBlockTileEntity(x() + direction.offsetX, y() + direction.offsetY, z() + direction.offsetZ); + } + + public ForgeDirection getDirection() + { + return ForgeDirection.getOrientation(this.placementSide.ordinal()); + } + + public void toggleGraphType() + { + graphType = (byte) ((graphType + 1) % getNetwork().graphs.size()); + updateServer(); + } + + public void toggleMode() + { + detectMode = DetectMode.values()[(detectMode.ordinal() + 1) % DetectMode.values().length]; + updateServer(); + } + + public void toggleDetectionValue() + { + detectType = (byte) ((detectType + 1) % getNetwork().graphs.size()); + updateServer(); + } + + public void updateServer() + { + PacketDispatcher.sendPacketToServer(ResonantInduction.PACKET_MULTIPART.getPacket(new universalelectricity.api.vector.Vector3(x(), y(), z()), placementSide.ordinal(), (byte) detectMode.ordinal(), detectType, graphType, redstoneTriggerLimit)); + } + + @Override + public void load(NBTTagCompound nbt) + { + super.load(nbt); + placementSide = ForgeDirection.getOrientation(nbt.getByte("side")); + detectMode = DetectMode.values()[nbt.getByte("detectMode")]; + detectType = nbt.getByte("detectionType"); + graphType = nbt.getByte("graphType"); + doDetect = nbt.getBoolean("doDetect"); + redstoneTriggerLimit = nbt.getDouble("triggerLimit"); + } + + @Override + public void save(NBTTagCompound nbt) + { + super.save(nbt); + nbt.setByte("side", (byte) placementSide.ordinal()); + nbt.setByte("detectMode", (byte) detectMode.ordinal()); + nbt.setByte("detectionType", detectType); + nbt.setByte("graphType", graphType); + nbt.setBoolean("doDetect", doDetect); + nbt.setDouble("triggerLimit", redstoneTriggerLimit); + } + + public DetectMode getMode() + { + return detectMode; + } + + @Override + public String getType() + { + return "resonant_induction_multimeter"; + } + + @Override + public int redstoneConductionMap() + { + return 0x1F; + } + + @Override + public boolean solid(int arg0) + { + return true; + } + + @Override + protected ItemStack getItem() + { + return new ItemStack(Electrical.itemMultimeter); + } + + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(Vector3 pos, float frame, int pass) + { + if (pass == 0) + { + RenderMultimeter.render(this, pos.x, pos.y, pos.z); + } + } + + @Override + public boolean canConnectRedstone(int arg0) + { + return true; + } + + @Override + public int strongPowerLevel(int arg0) + { + return redstoneOn ? 14 : 0; + } + + @Override + public int weakPowerLevel(int arg0) + { + return redstoneOn ? 14 : 0; + } + + @Override + public MultimeterNetwork getNetwork() + { + if (network == null) + { + network = new MultimeterNetwork(); + network.addConnector(this); + } + + return network; + } + + @Override + public void setNetwork(MultimeterNetwork network) + { + this.network = network; + } + + @Override + public boolean canConnect(ForgeDirection direction, Object obj) + { + return obj instanceof PartMultimeter; + } + + @Override + public Object[] getConnections() + { + Object[] connections = new Object[6]; + + for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) + { + if (dir != getDirection() && dir != getDirection().getOpposite()) + { + universalelectricity.api.vector.Vector3 vector = getPosition().translate(dir); + + if (hasMultimeter(vector.intX(), vector.intY(), vector.intZ())) + { + connections[dir.ordinal()] = getMultimeter(vector.intX(), vector.intY(), vector.intZ()); + } + } + } + + return connections; + } + + @Override + public IConnector getInstance(ForgeDirection dir) + { + return this; + } + + public universalelectricity.api.vector.Vector3 getPosition() + { + return new universalelectricity.api.vector.Vector3(x(), y(), z()); + } + + @Override + @SideOnly(Side.CLIENT) + public Cuboid6 getRenderBounds() + { + if (isPrimary) + return Cuboid6.full.copy().expand(new Vector3(getNetwork().size.x, getNetwork().size.y, getNetwork().size.z)); + return Cuboid6.full; + } + + @Override + public String toString() + { + return "[PartMultimeter]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.java b/electrical/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.java index 4cae90daa..0bad02726 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.java +++ b/electrical/src/main/scala/resonantinduction/electrical/multimeter/RenderMultimeter.java @@ -10,12 +10,12 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; -import calclavia.lib.utility.LanguageUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/tesla/BlockTesla.java b/electrical/src/main/scala/resonantinduction/electrical/tesla/BlockTesla.java index df4e59fc9..fb2aff2d8 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/tesla/BlockTesla.java +++ b/electrical/src/main/scala/resonantinduction/electrical/tesla/BlockTesla.java @@ -9,15 +9,15 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockSidedIO; +import resonant.lib.render.block.BlockRenderingHandler; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.LinkUtility; +import resonant.lib.utility.WrenchUtility; import resonantinduction.core.MultipartUtility; import resonantinduction.core.Reference; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.vector.VectorWorld; -import calclavia.lib.prefab.block.BlockSidedIO; -import calclavia.lib.render.block.BlockRenderingHandler; -import calclavia.lib.utility.LanguageUtility; -import calclavia.lib.utility.LinkUtility; -import calclavia.lib.utility.WrenchUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/electrical/src/main/scala/resonantinduction/electrical/tesla/TileTesla.java b/electrical/src/main/scala/resonantinduction/electrical/tesla/TileTesla.java index 35b10b53d..ec6f45cbd 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/tesla/TileTesla.java +++ b/electrical/src/main/scala/resonantinduction/electrical/tesla/TileTesla.java @@ -20,21 +20,22 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.multiblock.IMultiBlockStructure; +import resonant.lib.multiblock.MultiBlockHandler; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.IPacketSender; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.damage.ElectricalDamage; +import resonant.lib.prefab.tile.TileElectrical; +import resonant.lib.render.EnumColor; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.Settings; import resonantinduction.electrical.Electrical; +import universalelectricity.api.UniversalElectricity; import universalelectricity.api.energy.EnergyStorageHandler; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; -import calclavia.lib.multiblock.reference.IMultiBlockStructure; -import calclavia.lib.multiblock.reference.MultiBlockHandler; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.IPacketSender; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.CustomDamageSource; -import calclavia.lib.prefab.tile.TileElectrical; -import calclavia.lib.render.EnumColor; import com.google.common.io.ByteArrayDataInput; @@ -241,7 +242,7 @@ public class TileTesla extends TileElectrical implements IMultiBlockStructure 0) - { - entity.attackEntityFrom(CustomDamageSource.electrocution, this.getNetwork().getLastBuffer()); - } - } + @Override + public void onEntityCollision(Entity entity) + { + if (!this.isInsulated() && this.getNetwork() instanceof IElectricalNetwork) + ElectricalDamage.handleElectrocution(entity, this, (IElectricalNetwork) this.getNetwork()); + } - @Override - public float getResistance() - { - return this.getMaterial().resistance; - } + @Override + public float getResistance() + { + return this.getMaterial().resistance; + } - @Override - public long getCurrentCapacity() - { - return this.getMaterial().maxAmps; - } + @Override + public long getCurrentCapacity() + { + return this.getMaterial().maxAmps; + } - /** - * Material Methods - */ - public EnumWireMaterial getMaterial() - { - return this.material; - } + /** Material Methods */ + public EnumWireMaterial getMaterial() + { + return this.material; + } - public void setMaterial(EnumWireMaterial material) - { - this.material = material; - } + public void setMaterial(EnumWireMaterial material) + { + this.material = material; + } - public void setMaterial(int id) - { - this.setMaterial(EnumWireMaterial.values()[id]); - } + public void setMaterial(int id) + { + this.setMaterial(EnumWireMaterial.values()[id]); + } - public int getMaterialID() - { - return this.material.ordinal(); - } + public int getMaterialID() + { + return this.material.ordinal(); + } - /** - * Insulation Methods - */ - public void setInsulated(boolean insulated) - { - this.isInsulated = insulated; - this.color = DEFAULT_COLOR; + /** Insulation Methods */ + public void setInsulated(boolean insulated) + { + this.isInsulated = insulated; + this.color = DEFAULT_COLOR; - if (!this.world().isRemote) - { - tile().notifyPartChange(this); - this.sendInsulationUpdate(); - } - } + if (!this.world().isRemote) + { + tile().notifyPartChange(this); + this.sendInsulationUpdate(); + } + } - public void setInsulated(int dyeColour) - { - this.isInsulated = true; - this.color = dyeColour; + public void setInsulated(int dyeColour) + { + this.isInsulated = true; + this.color = dyeColour; - if (!this.world().isRemote) - { - tile().notifyPartChange(this); - this.sendInsulationUpdate(); - this.sendColorUpdate(); - } - } + if (!this.world().isRemote) + { + tile().notifyPartChange(this); + this.sendInsulationUpdate(); + this.sendColorUpdate(); + } + } - public boolean isInsulated() - { - return this.isInsulated; - } + public boolean isInsulated() + { + return this.isInsulated; + } - public void sendInsulationUpdate() - { - tile().getWriteStream(this).writeByte(1).writeBoolean(this.isInsulated); - } + public void sendInsulationUpdate() + { + tile().getWriteStream(this).writeByte(1).writeBoolean(this.isInsulated); + } - /** - * Wire Coloring Methods - */ - public int getColor() - { - return this.isInsulated ? this.color : -1; - } + /** Wire Coloring Methods */ + public int getColor() + { + return this.isInsulated ? this.color : -1; + } - public void setColor(int dye) - { - if (this.isInsulated) - { - this.color = dye; + public void setColor(int dye) + { + if (this.isInsulated) + { + this.color = dye; - if (!this.world().isRemote) - { - tile().notifyPartChange(this); - this.sendColorUpdate(); - } - } - } + if (!this.world().isRemote) + { + tile().notifyPartChange(this); + this.sendColorUpdate(); + } + } + } - public void sendColorUpdate() - { - tile().getWriteStream(this).writeByte(2).writeInt(this.color); - } + public void sendColorUpdate() + { + tile().getWriteStream(this).writeByte(2).writeInt(this.color); + } - /** - * Changes the wire's color. - */ - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack itemStack) - { - if (itemStack != null) - { - int dyeColor = MultipartUtility.isDye(itemStack); + /** Changes the wire's color. */ + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack itemStack) + { + if (itemStack != null) + { + int dyeColor = MultipartUtility.isDye(itemStack); - if (dyeColor != -1 && this.isInsulated()) - { - if (!player.capabilities.isCreativeMode) - { - player.inventory.decrStackSize(player.inventory.currentItem, 1); - } + if (dyeColor != -1 && this.isInsulated()) + { + if (!player.capabilities.isCreativeMode) + { + player.inventory.decrStackSize(player.inventory.currentItem, 1); + } - this.setColor(dyeColor); - return true; - } - else if (itemStack.getItem() == insulationType) - { - if (this.isInsulated()) - { - if (!world().isRemote && player.capabilities.isCreativeMode) - { - tile().dropItems(Collections.singletonList(new ItemStack(insulationType, 1, BlockColored.getBlockFromDye(color)))); - } + this.setColor(dyeColor); + return true; + } + else if (itemStack.itemID == insulationType.itemID) + { + if (this.isInsulated()) + { + if (!world().isRemote && player.capabilities.isCreativeMode) + { + tile().dropItems(Collections.singletonList(insulationType)); + } - this.setInsulated(false); - return true; - } - else - { - if (!player.capabilities.isCreativeMode) - { - player.inventory.decrStackSize(player.inventory.currentItem, 1); - } + this.setInsulated(false); + return true; + } + else + { + if (!player.capabilities.isCreativeMode) + { + player.inventory.decrStackSize(player.inventory.currentItem, 1); + } - this.setInsulated(BlockColored.getDyeFromBlock(itemStack.getItemDamage())); - return true; - } - } - else if (itemStack.getItem() instanceof ItemShears && isInsulated()) - { - if (!world().isRemote && !player.capabilities.isCreativeMode) - { - tile().dropItems(Collections.singletonList(new ItemStack(insulationType, 1, BlockColored.getBlockFromDye(color)))); - } + this.setInsulated(BlockColored.getDyeFromBlock(itemStack.getItemDamage())); + return true; + } + } + else if (itemStack.getItem() instanceof ItemShears && isInsulated()) + { + if (!world().isRemote && !player.capabilities.isCreativeMode) + { + tile().dropItems(Collections.singletonList(insulationType)); + } - this.setInsulated(false); - return true; - } - } + this.setInsulated(false); + return true; + } + } - return false; - } + return false; + } - @Override - protected ItemStack getItem() - { - return EnumWireMaterial.values()[getMaterialID()].getWire(); - } + @Override + protected ItemStack getItem() + { + return EnumWireMaterial.values()[getMaterialID()].getWire(); + } - @Override - public Iterable getDrops() - { - List drops = new ArrayList(); - drops.add(getItem()); + @Override + public Iterable getDrops() + { + List drops = new ArrayList(); + drops.add(getItem()); - if (this.isInsulated) - { - drops.add(new ItemStack(insulationType, 1, BlockColored.getBlockFromDye(color))); - } + if (this.isInsulated) + { + drops.add(insulationType.copy()); + } - return drops; - } + return drops; + } - @Override - public ItemStack pickItem(MovingObjectPosition hit) - { - return getItem(); - } + @Override + public ItemStack pickItem(MovingObjectPosition hit) + { + return getItem(); + } - @Override - public void readDesc(MCDataInput packet) - { - this.setMaterial(packet.readByte()); - this.color = packet.readByte(); - this.isInsulated = packet.readBoolean(); - } + @Override + public void readDesc(MCDataInput packet) + { + this.setMaterial(packet.readByte()); + this.color = packet.readByte(); + this.isInsulated = packet.readBoolean(); + } - @Override - public void writeDesc(MCDataOutput packet) - { - packet.writeByte((byte) this.getMaterialID()); - packet.writeByte((byte) this.color); - packet.writeBoolean(this.isInsulated); - } + @Override + public void writeDesc(MCDataOutput packet) + { + packet.writeByte((byte) this.getMaterialID()); + packet.writeByte((byte) this.color); + packet.writeBoolean(this.isInsulated); + } - public void read(MCDataInput packet, int packetID) - { - switch (packetID) - { - case 1: - this.isInsulated = packet.readBoolean(); - this.tile().markRender(); - break; - case 2: - this.color = packet.readInt(); - this.tile().markRender(); - break; - } - } + public void read(MCDataInput packet, int packetID) + { + switch (packetID) + { + case 1: + this.isInsulated = packet.readBoolean(); + this.tile().markRender(); + break; + case 2: + this.color = packet.readInt(); + this.tile().markRender(); + break; + } + } - @Override - public void save(NBTTagCompound nbt) - { - super.save(nbt); - nbt.setInteger("typeID", getMaterialID()); - nbt.setBoolean("isInsulated", isInsulated); - nbt.setInteger("dyeID", color); - } + @Override + public void save(NBTTagCompound nbt) + { + super.save(nbt); + nbt.setInteger("typeID", getMaterialID()); + nbt.setBoolean("isInsulated", isInsulated); + nbt.setInteger("dyeID", color); + } - @Override - public void load(NBTTagCompound nbt) - { - super.load(nbt); - setMaterial(nbt.getInteger("typeID")); - this.isInsulated = nbt.getBoolean("isInsulated"); - this.color = nbt.getInteger("dyeID"); - } + @Override + public void load(NBTTagCompound nbt) + { + super.load(nbt); + setMaterial(nbt.getInteger("typeID")); + this.isInsulated = nbt.getBoolean("isInsulated"); + this.color = nbt.getInteger("dyeID"); + } - @Override - protected boolean checkRedstone(int side) - { - if (this.world().isBlockIndirectlyGettingPowered(x(), y(), z())) - { - return true; - } - else - { - for (TMultiPart tp : tile().jPartList()) - { - if (tp instanceof IRedstonePart) - { - IRedstonePart rp = (IRedstonePart) tp; - if ((Math.max(rp.strongPowerLevel(side), rp.weakPowerLevel(side)) << 4) > 0) - { - return true; - } - } - } - } + @Override + protected boolean checkRedstone(int side) + { + if (this.world().isBlockIndirectlyGettingPowered(x(), y(), z())) + { + return true; + } + else + { + for (TMultiPart tp : tile().jPartList()) + { + if (tp instanceof IRedstonePart) + { + IRedstonePart rp = (IRedstonePart) tp; + if ((Math.max(rp.strongPowerLevel(side), rp.weakPowerLevel(side)) << 4) > 0) + { + return true; + } + } + } + } - return false; - } + return false; + } + + @Override + public String toString() + { + return "[PartAdvancedWire]" + x() + "x " + y() + "y " + z() + "z "; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/wire/PartConductor.java b/electrical/src/main/scala/resonantinduction/electrical/wire/PartConductor.java index 3f2beb2d0..17a38214e 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/wire/PartConductor.java +++ b/electrical/src/main/scala/resonantinduction/electrical/wire/PartConductor.java @@ -22,173 +22,169 @@ import codechicken.multipart.TMultiPart; @Deprecated public abstract class PartConductor extends PartAdvanced implements IConductor { - private IEnergyNetwork network; + private IEnergyNetwork network; - protected Object[] connections = new Object[6]; + protected Object[] connections = new Object[6]; - /** - * Universal Electricity conductor functions. - */ - @Override - public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) - { - return this.getNetwork().produce(this, from.getOpposite(), receive, doReceive); - } + /** Universal Electricity conductor functions. */ + @Override + public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) + { + return this.getNetwork().produce(this, from.getOpposite(), receive, doReceive); + } - @Override - public long onExtractEnergy(ForgeDirection from, long request, boolean doExtract) - { - return 0; - } + @Override + public long onExtractEnergy(ForgeDirection from, long request, boolean doExtract) + { + return 0; + } - @Override - public IEnergyNetwork getNetwork() - { - if (this.network == null) - { - this.setNetwork(EnergyNetworkLoader.getNewNetwork(this)); - } + @Override + public IEnergyNetwork getNetwork() + { + if (this.network == null) + { + this.setNetwork(EnergyNetworkLoader.getNewNetwork(this)); + } - return this.network; - } + return this.network; + } - @Override - public void setNetwork(IEnergyNetwork network) - { - this.network = network; - } + @Override + public void setNetwork(IEnergyNetwork network) + { + this.network = network; + } - @Override - public boolean doesTick() - { - return false; - } + @Override + public boolean doesTick() + { + return false; + } - @Override - public Object[] getConnections() - { - return this.connections; - } + @Override + public Object[] getConnections() + { + return this.connections; + } - /** - * EXTERNAL USE Can this wire be connected by another block? - */ - @Override - public boolean canConnect(ForgeDirection direction, Object source) - { - Vector3 connectPos = new Vector3(tile()).translate(direction); - TileEntity connectTile = connectPos.getTileEntity(world()); + /** EXTERNAL USE Can this wire be connected by another block? */ + @Override + public boolean canConnect(ForgeDirection direction, Object source) + { + Vector3 connectPos = new Vector3(tile()).translate(direction); + TileEntity connectTile = connectPos.getTileEntity(world()); - if (connectTile instanceof IConductor) - { - return false; - } + if (connectTile instanceof IConductor) + { + return false; + } - return CompatibilityModule.isHandler(connectTile); - } + return CompatibilityModule.isHandler(connectTile); + } - public abstract boolean canConnectTo(Object obj); + public abstract boolean canConnectTo(Object obj); - /** - * Recalculates all the network connections - */ - protected void recalculateConnections() - { - this.connections = new Object[6]; - /** - * Calculate all external connections with this conductor. - */ - for (byte i = 0; i < 6; i++) - { - ForgeDirection side = ForgeDirection.getOrientation(i); + /** Recalculates all the network connections */ + protected void recalculateConnections() + { + this.connections = new Object[6]; + /** Calculate all external connections with this conductor. */ + for (byte i = 0; i < 6; i++) + { + ForgeDirection side = ForgeDirection.getOrientation(i); - if (this.canConnect(side, this)) - { - TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); - connections[i] = tileEntity; - } - } - } + if (this.canConnect(side, this)) + { + TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); + connections[i] = tileEntity; + } + } + } - /** - * IC2 Functions - */ - @Override - public void onWorldJoin() - { - if (tile() instanceof IEnergyTile && !world().isRemote) - { - // Check if there's another part that's an IEnergyTile - boolean foundAnotherPart = false; + /** IC2 Functions */ + @Override + public void onWorldJoin() + { + if (tile() instanceof IEnergyTile && !world().isRemote) + { + // Check if there's another part that's an IEnergyTile + boolean foundAnotherPart = false; - for (int i = 0; i < tile().partList().size(); i++) - { - TMultiPart part = tile().partMap(i); + for (int i = 0; i < tile().partList().size(); i++) + { + TMultiPart part = tile().partMap(i); - if (part instanceof IEnergyTile && part != this) - { - foundAnotherPart = true; - break; - } - } + if (part instanceof IEnergyTile && part != this) + { + foundAnotherPart = true; + break; + } + } - if (!foundAnotherPart) - { - MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent((IEnergyTile) tile())); - } - } - } + if (!foundAnotherPart) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent((IEnergyTile) tile())); + } + } + } - @Override - public void preRemove() - { - if (!world().isRemote) - { - this.getNetwork().split(this); + @Override + public void preRemove() + { + if (!world().isRemote) + { + this.getNetwork().split(this); - if (tile() instanceof IEnergyTile) - { - // Check if there's another part that's an IEnergyTile - boolean foundAnotherPart = false; + if (tile() instanceof IEnergyTile) + { + // Check if there's another part that's an IEnergyTile + boolean foundAnotherPart = false; - for (int i = 0; i < tile().partList().size(); i++) - { - TMultiPart part = tile().partMap(i); + for (int i = 0; i < tile().partList().size(); i++) + { + TMultiPart part = tile().partMap(i); - if (part instanceof IEnergyTile && part != this) - { - foundAnotherPart = true; - break; - } - } + if (part instanceof IEnergyTile && part != this) + { + foundAnotherPart = true; + break; + } + } - if (!foundAnotherPart) - { - MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile) tile())); - } - } - } + if (!foundAnotherPart) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile) tile())); + } + } + } - super.preRemove(); - } + super.preRemove(); + } - @Override - public IConnector getInstance(ForgeDirection dir) - { - return this; - } + @Override + public IConnector getInstance(ForgeDirection dir) + { + return this; + } - @Override - public void save(NBTTagCompound nbt) - { - super.save(nbt); - nbt.setLong("savedBuffer", getNetwork().getBufferOf(this)); - } + @Override + public void save(NBTTagCompound nbt) + { + super.save(nbt); + nbt.setLong("savedBuffer", getNetwork().getBufferOf(this)); + } - @Override - public void load(NBTTagCompound nbt) - { - super.load(nbt); - getNetwork().setBufferFor(this, nbt.getLong("savedBuffer")); - } + @Override + public void load(NBTTagCompound nbt) + { + super.load(nbt); + getNetwork().setBufferFor(this, nbt.getLong("savedBuffer")); + } + + @Override + public String toString() + { + return "[PartConductor]" + x() + "x " + y() + "y " + z() + "z "; + } } diff --git a/electrical/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.java b/electrical/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.java index c09eed39b..b11926df0 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.java +++ b/electrical/src/main/scala/resonantinduction/electrical/wire/flat/PartFlatWire.java @@ -41,935 +41,925 @@ import codechicken.multipart.TileMultipart; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -/** - * This is the base class for all wire types. It can be used for any sub type, as it contains the +/** This is the base class for all wire types. It can be used for any sub type, as it contains the * base calculations necessary to create a working wire. This calculates all possible connections to * sides, around corners, and inside corners, while checking for microblock obstructions. * - * @author Modified by Calclavia, MrTJP - */ + * @author Modified by Calclavia, MrTJP */ public class PartFlatWire extends PartAdvancedWire implements TFacePart, JNormalOcclusion { - public static Cuboid6[][] selectionBounds = new Cuboid6[3][6]; - public static Cuboid6[][] occlusionBounds = new Cuboid6[3][6]; - - static - { - for (int t = 0; t < 3; t++) - { - // Subtract the box a little because we'd like things like posts to get first hit - Cuboid6 selection = new Cuboid6(0, 0, 0, 1, (t + 2) / 16D, 1).expand(-0.005); - Cuboid6 occlusion = new Cuboid6(2 / 8D, 0, 2 / 8D, 6 / 8D, (t + 2) / 16D, 6 / 8D); - for (int s = 0; s < 6; s++) - { - selectionBounds[t][s] = selection.copy().apply(Rotation.sideRotations[s].at(Vector3.center)); - occlusionBounds[t][s] = occlusion.copy().apply(Rotation.sideRotations[s].at(Vector3.center)); - } - } - } - - public byte side; - - /** - * A map of the corners. - * - * - * Currently split into 4 nybbles (from lowest) 0 = Corner connections (this wire should connect - * around a corner to something external) 1 = Straight connections (this wire should connect to - * something external) 2 = Internal connections (this wire should connect to something internal) - * 3 = Internal open connections (this wire is not blocked by a cover/edge part and *could* - * connect through side) bit 16 = connection to the centerpart 5 = Render corner connections. - * Like corner connections but set to low if the other wire part is smaller than this (they - * render to us not us to them) - */ - public int connMap; - - public PartFlatWire() - { - - } - - public PartFlatWire(int typeID) - { - this(EnumWireMaterial.values()[typeID]); - } - - public PartFlatWire(EnumWireMaterial type) - { - material = type; - } - - public void preparePlacement(int side, int meta) - { - this.side = (byte) (side ^ 1); - this.setMaterial(meta); - } - - /** PACKET and NBT Methods */ - @Override - public void load(NBTTagCompound tag) - { - super.load(tag); - this.side = tag.getByte("side"); - this.connMap = tag.getInteger("connMap"); - } - - @Override - public void save(NBTTagCompound tag) - { - super.save(tag); - tag.setByte("side", this.side); - tag.setInteger("connMap", this.connMap); - } - - @Override - public void readDesc(MCDataInput packet) - { - super.readDesc(packet); - this.side = packet.readByte(); - this.connMap = packet.readInt(); - } - - @Override - public void writeDesc(MCDataOutput packet) - { - super.writeDesc(packet); - packet.writeByte(this.side); - packet.writeInt(this.connMap); - } - - @Override - public void read(MCDataInput packet) - { - read(packet, packet.readUByte()); - } - - @Override - public void read(MCDataInput packet, int packetID) - { - if (packetID == 0) - { - this.connMap = packet.readInt(); - tile().markRender(); - } - else - { - super.read(packet, packetID); - } - } - - public void sendConnUpdate() - { - tile().getWriteStream(this).writeByte(0).writeInt(this.connMap); - } - - /* WORLD EVENTS */ - @Override - public void onRemoved() - { - super.onRemoved(); - - if (!world().isRemote) - { - for (int r = 0; r < 4; r++) - { - if (maskConnects(r)) - { - if ((connMap & 1 << r) != 0) - { - notifyCornerChange(r); - } - else if ((connMap & 0x10 << r) != 0) - { - notifyStraightChange(r); - } - } - } - } - } - - @Override - public void onChunkLoad() - { - if ((connMap & 0x80000000) != 0) // compat with converters, recalc connections - { - if (dropIfCantStay()) - { - return; - } - - connMap = 0; - - updateInternalConnections(); - - if (updateOpenConnections()) - { - updateExternalConnections(); - } - - tile().markDirty(); - } - - this.recalculateConnections(); - - super.onChunkLoad(); - } - - @Override - public void onAdded() - { - super.onAdded(); - - if (!world().isRemote) - { - updateOpenConnections(); - boolean changed = updateInternalConnections(); - // don't use || because it's fail fast - changed |= updateExternalConnections(); - - if (changed) - { - sendConnUpdate(); - } - - this.recalculateConnections(); - } - } - - @Override - public void onPartChanged(TMultiPart part) - { - if (!world().isRemote) - { - boolean changed = updateInternalConnections(); - - if (updateOpenConnections()) - { - changed |= updateExternalConnections(); - } - - if (changed) - { - sendConnUpdate(); - } - - this.recalculateConnections(); - } - - super.onPartChanged(part); - } - - @Override - public void onNeighborChanged() - { - if (!world().isRemote) - { - if (dropIfCantStay()) - { - return; - } - - if (updateExternalConnections()) - { - sendConnUpdate(); - } - - this.recalculateConnections(); - } - super.onNeighborChanged(); - } - - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) - { - if (item != null) - { - if (item.getItem().itemID == Block.lever.blockID) - { - TileMultipart tile = tile(); - World w = world(); - - if (!w.isRemote) - { - PartFlatSwitchWire wire = (PartFlatSwitchWire) MultiPartRegistry.createPart("resonant_induction_flat_switch_wire", false); - wire.copyFrom(this); - - if (tile.canReplacePart(this, wire)) - { - tile.remPart(this); - TileMultipart.addPart(w, new BlockCoord(tile), wire); - - if (!player.capabilities.isCreativeMode) - { - player.inventory.decrStackSize(player.inventory.currentItem, 1); - } - } - } - return true; - } - } - - return super.activate(player, part, item); - } - - @Override - public void recalculateConnections() - { - this.updateOpenConnections(); - - boolean[] calculatedSides = new boolean[6]; - - /** Check external connections. */ - for (byte r = 0; r < 4; r++) - { - if (maskOpen(r)) - { - int absDir = Rotation.rotateSide(this.side, r); - - // Check direct connection. - if (this.setExternalConnection(r, absDir)) - { - calculatedSides[absDir] = true; - } - - // Check Corner Connection - BlockCoord cornerPos = new BlockCoord(tile()); - cornerPos.offset(absDir); - - if (canConnectThroughCorner(cornerPos, absDir ^ 1, this.side)) - { - cornerPos.offset(this.side); - TileMultipart tpCorner = MultipartUtility.getMultipartTile(world(), cornerPos); - - if (tpCorner != null) - { - TMultiPart tp = tpCorner.partMap(absDir ^ 1); - - if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) - { - this.connections[absDir] = tp; - - if (tp instanceof PartFlatWire) - { - // We found a wire, merge networks! - this.getNetwork().merge(((PartFlatWire) tp).getNetwork()); - } - - calculatedSides[absDir] = true; - continue; - } - } - } - - if (!calculatedSides[absDir]) - { - this.disconnect(absDir); - } - } - } - - /** Check internal connections. */ - for (byte r = 0; r < 4; r++) - { - int absDir = Rotation.rotateSide(this.side, r); - - /** Look for an internal straight connection. */ - if (tile().partMap(PartMap.edgeBetween(absDir, this.side)) == null) - { - TMultiPart tp = tile().partMap(absDir); - - if (this.canConnectTo(tp)) - { - // We found a wire! Merge networks! - this.connections[absDir] = tp; - - if (tp instanceof PartFlatWire) - { - this.getNetwork().merge(((PartFlatWire) tp).getNetwork()); - } - continue; - } - } - - if (!calculatedSides[absDir]) - { - this.disconnect(absDir); - } - } - - // Connect to the face of the block the wire is placed on. - this.setExternalConnection(-1, this.side); - - this.getNetwork().reconstruct(); - } - - public boolean setExternalConnection(int r, int absSide) - { - BlockCoord pos = new BlockCoord(tile()).offset(absSide); - - /** Look for an external wire connection. */ - TileMultipart tileMultiPart = MultipartUtility.getMultipartTile(world(), pos); - - if (tileMultiPart != null && r != -1) - { - TMultiPart tp = tileMultiPart.partMap(this.side); - - if (this.canConnectTo(tp, ForgeDirection.getOrientation(absSide))) - { - // Check the wire we are connecting to and see if THAT block can accept this one. - int otherR = (r + 2) % 4; - - if (tp instanceof PartFlatWire && ((PartFlatWire) tp).canConnectTo(this, ForgeDirection.getOrientation(absSide).getOpposite()) && ((PartFlatWire) tp).maskOpen(otherR)) - { - // We found a wire! Merge connection. - connections[absSide] = tp; - getNetwork().merge(((PartFlatWire) tp).getNetwork()); - return true; - } - - /** - * Check for a micro-energy block - */ - if (canConnectTo(tp)) - { - connections[absSide] = tp; - return true; - } - } - - this.disconnect(absSide); - } - - /** Look for an external energy handler. */ - TileEntity tileEntity = world().getBlockTileEntity(pos.x, pos.y, pos.z); - - if (this.canConnectTo(tileEntity, ForgeDirection.getOrientation(absSide))) - { - this.connections[absSide] = tileEntity; - return true; - } - - this.disconnect(absSide); - - return false; - } - - private synchronized void disconnect(int i) - { - if (!this.world().isRemote) - { - if (this.connections[i] != null) - { - if (this.connections[i] instanceof PartFlatWire) - { - PartFlatWire wire = (PartFlatWire) this.connections[i]; - this.connections[i] = null; - this.getNetwork().split(this, wire); - } - else - { - this.connections[i] = null; - } - } - } - } - - @Override - public Object[] getConnections() - { - return this.connections; - } - - public boolean canStay() - { - BlockCoord pos = new BlockCoord(tile()).offset(side); - return MultipartUtility.canPlaceWireOnSide(world(), pos.x, pos.y, pos.z, ForgeDirection.getOrientation(side ^ 1), false); - } - - public boolean dropIfCantStay() - { - if (!canStay()) - { - drop(); - return true; - } - return false; - } - - public void drop() - { - TileMultipart.dropItem(getItem(), world(), Vector3.fromTileEntityCenter(tile())); - tile().remPart(this); - } - - /** - * Recalculates connections to blocks outside this space - * - * @return true if a new connection was added or one was removed - */ - protected boolean updateExternalConnections() - { - int newConn = 0; - - for (int r = 0; r < 4; r++) - { - if (!maskOpen(r)) - { - continue; - } - - if (connectStraight(r)) - { - newConn |= 0x10 << r; - } - else - { - int cnrMode = connectCorner(r); - - if (cnrMode != 0) - { - newConn |= 1 << r; - - if (cnrMode == 2) - { - newConn |= 0x100000 << r;// render flag - } - } - } - } - - if (newConn != (connMap & 0xF000FF)) - { - int diff = connMap ^ newConn; - connMap = connMap & ~0xF000FF | newConn; - - // Notify corner disconnections - for (int r = 0; r < 4; r++) - { - if ((diff & 1 << r) != 0) - { - notifyCornerChange(r); - } - } - - return true; - } - - return false; - } - - /** - * Recalculates connections to other parts within this space - * - * @return true if a new connection was added or one was removed - */ - protected boolean updateInternalConnections() - { - int newConn = 0; - for (int r = 0; r < 4; r++) - { - if (connectInternal(r)) - { - newConn |= 0x100 << r; - } - } - - if (connectCenter()) - { - newConn |= 0x10000; - } - - if (newConn != (connMap & 0x10F00)) - { - connMap = connMap & ~0x10F00 | newConn; - return true; - } - return false; - } - - /** - * Recalculates connections that can be made to other parts outside of this space - * - * @return true if external connections should be recalculated - */ - protected boolean updateOpenConnections() - { - int newConn = 0; - for (int r = 0; r < 4; r++) - if (connectionOpen(r)) - newConn |= 0x1000 << r; - - if (newConn != (connMap & 0xF000)) - { - connMap = connMap & ~0xF000 | newConn; - return true; - } - return false; - } - - public boolean connectionOpen(int r) - { - int absDir = Rotation.rotateSide(side, r); - TMultiPart facePart = tile().partMap(absDir); - if (facePart != null && (!(facePart instanceof PartFlatWire) || !canConnectTo(facePart, ForgeDirection.getOrientation(absDir)))) - return false; - - if (tile().partMap(PartMap.edgeBetween(side, absDir)) != null) - return false; - - return true; - } - - /** - * Return a corner connection state. 0 = No connection 1 = Physical connection 2 = Render - * connection - */ - public int connectCorner(int r) - { - int absDir = Rotation.rotateSide(side, r); - - BlockCoord pos = new BlockCoord(tile()); - pos.offset(absDir); - - if (!canConnectThroughCorner(pos, absDir ^ 1, side)) - return 0; - - pos.offset(side); - TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); - if (t != null) - { - TMultiPart tp = t.partMap(absDir ^ 1); - - if (canConnectTo(tp, ForgeDirection.getOrientation(absDir))) - { - if (tp instanceof PartFlatWire) - { - boolean b = ((PartFlatWire) tp).connectCorner(this, Rotation.rotationTo(absDir ^ 1, side ^ 1)); - - if (b) - { - // let them connect to us - if (!renderThisCorner((PartFlatWire) tp)) - { - return 1; - } - - return 2; - } - } - - return 2; - } - } - return 0; - } - - public boolean canConnectThroughCorner(BlockCoord pos, int side1, int side2) - { - if (world().isAirBlock(pos.x, pos.y, pos.z)) - { - return true; - } - - TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); - if (t != null) - { - return t.partMap(side1) == null && t.partMap(side2) == null && t.partMap(PartMap.edgeBetween(side1, side2)) == null; - } - - return false; - } - - public boolean connectStraight(int r) - { - int absDir = Rotation.rotateSide(side, r); - - BlockCoord pos = new BlockCoord(tile()).offset(absDir); - - TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); - if (t != null) - { - TMultiPart tp = t.partMap(side); - - if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) - { - if (tp instanceof PartFlatWire) - { - return ((PartFlatWire) tp).connectStraight(this, (r + 2) % 4); - } - - return true; - } - } - else - { - TileEntity tileEntity = world().getBlockTileEntity(pos.x, pos.y, pos.z); - return this.canConnectTo(tileEntity, ForgeDirection.getOrientation(absDir)); - } - - return false; - } - - public boolean connectInternal(int r) - { - int absDir = Rotation.rotateSide(side, r); - - if (tile().partMap(PartMap.edgeBetween(absDir, side)) != null) - return false; - - TMultiPart tp = tile().partMap(absDir); - - if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) - { - return ((PartFlatWire) tp).connectInternal(this, Rotation.rotationTo(absDir, side)); - } - - return connectInternalOverride(tp, r); - } - - public boolean connectInternalOverride(TMultiPart p, int r) - { - return false; - } - - public boolean connectCenter() - { - TMultiPart tp = tile().partMap(6); - - if (this.canConnectTo(tp)) - { - if (tp instanceof PartFlatWire) - { - return ((PartFlatWire) tp).connectInternal(this, side); - } - - return true; - } - - return false; - } - - public boolean renderThisCorner(PartFlatWire part) - { - if (!(part instanceof PartFlatWire)) - return false; - - PartFlatWire wire = part; - if (wire.getThickness() == getThickness()) - return side < wire.side; - - return wire.getThickness() > getThickness(); - } - - public boolean connectCorner(PartFlatWire wire, int r) - { - int absDir = Rotation.rotateSide(side, r); - - if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir)) && maskOpen(r)) - { - int oldConn = connMap; - connMap |= 0x1 << r; - if (renderThisCorner(wire))// render connection - connMap |= 0x100000 << r; - - if (oldConn != connMap) - sendConnUpdate(); - return true; - } - return false; - } - - public boolean connectStraight(PartFlatWire wire, int r) - { - int absDir = Rotation.rotateSide(side, r); - - if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir)) && maskOpen(r)) - { - int oldConn = connMap; - connMap |= 0x10 << r; - if (oldConn != connMap) - sendConnUpdate(); - return true; - } - return false; - } - - public boolean connectInternal(PartFlatWire wire, int r) - { - int absDir = Rotation.rotateSide(side, r); - - if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir))) - { - int oldConn = connMap; - connMap |= 0x100 << r; - if (oldConn != connMap) - sendConnUpdate(); - return true; - } - return false; - } - - public boolean canConnectCorner(int r) - { - return true; - } - - public void notifyCornerChange(int r) - { - int absDir = Rotation.rotateSide(side, r); - - BlockCoord pos = new BlockCoord(tile()).offset(absDir).offset(side); - world().notifyBlockOfNeighborChange(pos.x, pos.y, pos.z, tile().getBlockType().blockID); - } - - public void notifyStraightChange(int r) - { - int absDir = Rotation.rotateSide(side, r); - - BlockCoord pos = new BlockCoord(tile()).offset(absDir); - world().notifyBlockOfNeighborChange(pos.x, pos.y, pos.z, tile().getBlockType().blockID); - } - - public boolean maskConnects(int r) - { - return (connMap & 0x111 << r) != 0; - } - - public boolean maskOpen(int r) - { - return (connMap & 0x1000 << r) != 0; - } - - /** START TILEMULTIPART INTERACTIONS **/ - @Override - public float getStrength(MovingObjectPosition hit, EntityPlayer player) - { - return 4; - } - - @Override - public int getSlotMask() - { - return 1 << this.side; - } - - @Override - public Iterable getSubParts() - { - return Arrays.asList(new IndexedCuboid6(0, selectionBounds[getThickness()][side])); - } - - @Override - public boolean occlusionTest(TMultiPart npart) - { - return NormalOcclusionTest.apply(this, npart); - } - - @Override - public Iterable getOcclusionBoxes() - { - return Arrays.asList(occlusionBounds[getThickness()][side]); - } - - public int getThickness() - { - return this.isInsulated ? 2 : 1; - } - - @Override - public int redstoneConductionMap() - { - return 0; - } - - @Override - public boolean solid(int arg0) - { - return false; - } - - @Override - public String getType() - { - return "resonant_induction_flat_wire"; - } - - /** RENDERING */ - @SideOnly(Side.CLIENT) - public Icon getIcon() - { - return RenderFlatWire.flatWireTexture; - } - - public Colour getColour() - { - if (isInsulated) - { - Colour color = new ColourARGB(ItemDye.dyeColors[this.color]); - color.a = (byte) 255; - return color; - } - - return getMaterial().color; - } - - public boolean useStaticRenderer() - { - return true; - } - - @Override - @SideOnly(Side.CLIENT) - public void renderStatic(Vector3 pos, LazyLightMatrix olm, int pass) - { - if (pass == 0 && useStaticRenderer()) - { - CCRenderState.setBrightness(world(), x(), y(), z()); - RenderFlatWire.render(this, pos); - CCRenderState.setColour(-1); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(Vector3 pos, float frame, int pass) - { - if (pass == 0 && !useStaticRenderer()) - { - GL11.glDisable(GL11.GL_LIGHTING); - TextureUtils.bindAtlas(0); - CCRenderState.useModelColours(true); - CCRenderState.startDrawing(7); - RenderFlatWire.render(this, pos); - CCRenderState.draw(); - CCRenderState.setColour(-1); - GL11.glEnable(GL11.GL_LIGHTING); - } - } - - @Override - @SideOnly(Side.CLIENT) - public void drawBreaking(RenderBlocks renderBlocks) - { - CCRenderState.reset(); - RenderFlatWire.renderBreakingOverlay(renderBlocks.overrideBlockTexture, this); - } - - /** - * Utility method to aid in initializing this or subclasses, usually when you need to change the - * wire to another type - * - * @param otherCable the wire to copy from - */ - public void copyFrom(PartFlatWire otherCable) - { - this.isInsulated = otherCable.isInsulated; - this.color = otherCable.color; - this.connections = otherCable.connections; - this.material = otherCable.material; - this.side = otherCable.side; - this.connMap = otherCable.connMap; - this.setNetwork(otherCable.getNetwork()); - this.getNetwork().setBufferFor(this, otherCable.getNetwork().getBufferOf(otherCable)); - } + public static Cuboid6[][] selectionBounds = new Cuboid6[3][6]; + public static Cuboid6[][] occlusionBounds = new Cuboid6[3][6]; + + static + { + for (int t = 0; t < 3; t++) + { + // Subtract the box a little because we'd like things like posts to get first hit + Cuboid6 selection = new Cuboid6(0, 0, 0, 1, (t + 2) / 16D, 1).expand(-0.005); + Cuboid6 occlusion = new Cuboid6(2 / 8D, 0, 2 / 8D, 6 / 8D, (t + 2) / 16D, 6 / 8D); + for (int s = 0; s < 6; s++) + { + selectionBounds[t][s] = selection.copy().apply(Rotation.sideRotations[s].at(Vector3.center)); + occlusionBounds[t][s] = occlusion.copy().apply(Rotation.sideRotations[s].at(Vector3.center)); + } + } + } + + public byte side; + + /** A map of the corners. + * + * + * Currently split into 4 nybbles (from lowest) 0 = Corner connections (this wire should connect + * around a corner to something external) 1 = Straight connections (this wire should connect to + * something external) 2 = Internal connections (this wire should connect to something internal) + * 3 = Internal open connections (this wire is not blocked by a cover/edge part and *could* + * connect through side) bit 16 = connection to the centerpart 5 = Render corner connections. + * Like corner connections but set to low if the other wire part is smaller than this (they + * render to us not us to them) */ + public int connMap; + + public PartFlatWire() + { + + } + + public PartFlatWire(int typeID) + { + this(EnumWireMaterial.values()[typeID]); + } + + public PartFlatWire(EnumWireMaterial type) + { + material = type; + } + + public void preparePlacement(int side, int meta) + { + this.side = (byte) (side ^ 1); + this.setMaterial(meta); + } + + /** PACKET and NBT Methods */ + @Override + public void load(NBTTagCompound tag) + { + super.load(tag); + this.side = tag.getByte("side"); + this.connMap = tag.getInteger("connMap"); + } + + @Override + public void save(NBTTagCompound tag) + { + super.save(tag); + tag.setByte("side", this.side); + tag.setInteger("connMap", this.connMap); + } + + @Override + public void readDesc(MCDataInput packet) + { + super.readDesc(packet); + this.side = packet.readByte(); + this.connMap = packet.readInt(); + } + + @Override + public void writeDesc(MCDataOutput packet) + { + super.writeDesc(packet); + packet.writeByte(this.side); + packet.writeInt(this.connMap); + } + + @Override + public void read(MCDataInput packet) + { + read(packet, packet.readUByte()); + } + + @Override + public void read(MCDataInput packet, int packetID) + { + if (packetID == 0) + { + this.connMap = packet.readInt(); + tile().markRender(); + } + else + { + super.read(packet, packetID); + } + } + + public void sendConnUpdate() + { + tile().getWriteStream(this).writeByte(0).writeInt(this.connMap); + } + + /* WORLD EVENTS */ + @Override + public void onRemoved() + { + super.onRemoved(); + + if (!world().isRemote) + { + for (int r = 0; r < 4; r++) + { + if (maskConnects(r)) + { + if ((connMap & 1 << r) != 0) + { + notifyCornerChange(r); + } + else if ((connMap & 0x10 << r) != 0) + { + notifyStraightChange(r); + } + } + } + } + } + + @Override + public void onChunkLoad() + { + if ((connMap & 0x80000000) != 0) // compat with converters, recalc connections + { + if (dropIfCantStay()) + { + return; + } + + connMap = 0; + + updateInternalConnections(); + + if (updateOpenConnections()) + { + updateExternalConnections(); + } + + tile().markDirty(); + } + + this.recalculateConnections(); + + super.onChunkLoad(); + } + + @Override + public void onAdded() + { + super.onAdded(); + + if (!world().isRemote) + { + updateOpenConnections(); + boolean changed = updateInternalConnections(); + // don't use || because it's fail fast + changed |= updateExternalConnections(); + + if (changed) + { + sendConnUpdate(); + } + + this.recalculateConnections(); + } + } + + @Override + public void onPartChanged(TMultiPart part) + { + if (!world().isRemote) + { + boolean changed = updateInternalConnections(); + + if (updateOpenConnections()) + { + changed |= updateExternalConnections(); + } + + if (changed) + { + sendConnUpdate(); + } + + this.recalculateConnections(); + } + + super.onPartChanged(part); + } + + @Override + public void onNeighborChanged() + { + if (!world().isRemote) + { + if (dropIfCantStay()) + { + return; + } + + if (updateExternalConnections()) + { + sendConnUpdate(); + } + + this.recalculateConnections(); + } + super.onNeighborChanged(); + } + + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) + { + if (item != null) + { + if (item.getItem().itemID == Block.lever.blockID) + { + TileMultipart tile = tile(); + World w = world(); + + if (!w.isRemote) + { + PartFlatSwitchWire wire = (PartFlatSwitchWire) MultiPartRegistry.createPart("resonant_induction_flat_switch_wire", false); + wire.copyFrom(this); + + if (tile.canReplacePart(this, wire)) + { + tile.remPart(this); + TileMultipart.addPart(w, new BlockCoord(tile), wire); + + if (!player.capabilities.isCreativeMode) + { + player.inventory.decrStackSize(player.inventory.currentItem, 1); + } + } + } + return true; + } + } + + return super.activate(player, part, item); + } + + @Override + public void recalculateConnections() + { + this.updateOpenConnections(); + + boolean[] calculatedSides = new boolean[6]; + + /** Check external connections. */ + for (byte r = 0; r < 4; r++) + { + if (maskOpen(r)) + { + int absDir = Rotation.rotateSide(this.side, r); + + // Check direct connection. + if (this.setExternalConnection(r, absDir)) + { + calculatedSides[absDir] = true; + } + + // Check Corner Connection + BlockCoord cornerPos = new BlockCoord(tile()); + cornerPos.offset(absDir); + + if (canConnectThroughCorner(cornerPos, absDir ^ 1, this.side)) + { + cornerPos.offset(this.side); + TileMultipart tpCorner = MultipartUtility.getMultipartTile(world(), cornerPos); + + if (tpCorner != null) + { + TMultiPart tp = tpCorner.partMap(absDir ^ 1); + + if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) + { + this.connections[absDir] = tp; + + if (tp instanceof PartFlatWire) + { + // We found a wire, merge networks! + this.getNetwork().merge(((PartFlatWire) tp).getNetwork()); + } + + calculatedSides[absDir] = true; + continue; + } + } + } + + if (!calculatedSides[absDir]) + { + this.disconnect(absDir); + } + } + } + + /** Check internal connections. */ + for (byte r = 0; r < 4; r++) + { + int absDir = Rotation.rotateSide(this.side, r); + + /** Look for an internal straight connection. */ + if (tile().partMap(PartMap.edgeBetween(absDir, this.side)) == null) + { + TMultiPart tp = tile().partMap(absDir); + + if (this.canConnectTo(tp)) + { + // We found a wire! Merge networks! + this.connections[absDir] = tp; + + if (tp instanceof PartFlatWire) + { + this.getNetwork().merge(((PartFlatWire) tp).getNetwork()); + } + continue; + } + } + + if (!calculatedSides[absDir]) + { + this.disconnect(absDir); + } + } + + // Connect to the face of the block the wire is placed on. + this.setExternalConnection(-1, this.side); + + this.getNetwork().reconstruct(); + } + + public boolean setExternalConnection(int r, int absSide) + { + BlockCoord pos = new BlockCoord(tile()).offset(absSide); + + /** Look for an external wire connection. */ + TileMultipart tileMultiPart = MultipartUtility.getMultipartTile(world(), pos); + + if (tileMultiPart != null && r != -1) + { + TMultiPart tp = tileMultiPart.partMap(this.side); + + if (this.canConnectTo(tp, ForgeDirection.getOrientation(absSide))) + { + // Check the wire we are connecting to and see if THAT block can accept this one. + int otherR = (r + 2) % 4; + + if (tp instanceof PartFlatWire && ((PartFlatWire) tp).canConnectTo(this, ForgeDirection.getOrientation(absSide).getOpposite()) && ((PartFlatWire) tp).maskOpen(otherR)) + { + // We found a wire! Merge connection. + connections[absSide] = tp; + getNetwork().merge(((PartFlatWire) tp).getNetwork()); + return true; + } + + /** Check for a micro-energy block */ + if (canConnectTo(tp)) + { + connections[absSide] = tp; + return true; + } + } + + this.disconnect(absSide); + } + + /** Look for an external energy handler. */ + TileEntity tileEntity = world().getBlockTileEntity(pos.x, pos.y, pos.z); + + if (this.canConnectTo(tileEntity, ForgeDirection.getOrientation(absSide))) + { + this.connections[absSide] = tileEntity; + return true; + } + + this.disconnect(absSide); + + return false; + } + + private synchronized void disconnect(int i) + { + if (!this.world().isRemote) + { + if (this.connections[i] != null) + { + if (this.connections[i] instanceof PartFlatWire) + { + PartFlatWire wire = (PartFlatWire) this.connections[i]; + this.connections[i] = null; + this.getNetwork().split(this, wire); + } + else + { + this.connections[i] = null; + } + } + } + } + + @Override + public Object[] getConnections() + { + return this.connections; + } + + public boolean canStay() + { + BlockCoord pos = new BlockCoord(tile()).offset(side); + return MultipartUtility.canPlaceWireOnSide(world(), pos.x, pos.y, pos.z, ForgeDirection.getOrientation(side ^ 1), false); + } + + public boolean dropIfCantStay() + { + if (!canStay()) + { + drop(); + return true; + } + return false; + } + + public void drop() + { + TileMultipart.dropItem(getItem(), world(), Vector3.fromTileEntityCenter(tile())); + tile().remPart(this); + } + + /** Recalculates connections to blocks outside this space + * + * @return true if a new connection was added or one was removed */ + protected boolean updateExternalConnections() + { + int newConn = 0; + + for (int r = 0; r < 4; r++) + { + if (!maskOpen(r)) + { + continue; + } + + if (connectStraight(r)) + { + newConn |= 0x10 << r; + } + else + { + int cnrMode = connectCorner(r); + + if (cnrMode != 0) + { + newConn |= 1 << r; + + if (cnrMode == 2) + { + newConn |= 0x100000 << r;// render flag + } + } + } + } + + if (newConn != (connMap & 0xF000FF)) + { + int diff = connMap ^ newConn; + connMap = connMap & ~0xF000FF | newConn; + + // Notify corner disconnections + for (int r = 0; r < 4; r++) + { + if ((diff & 1 << r) != 0) + { + notifyCornerChange(r); + } + } + + return true; + } + + return false; + } + + /** Recalculates connections to other parts within this space + * + * @return true if a new connection was added or one was removed */ + protected boolean updateInternalConnections() + { + int newConn = 0; + for (int r = 0; r < 4; r++) + { + if (connectInternal(r)) + { + newConn |= 0x100 << r; + } + } + + if (connectCenter()) + { + newConn |= 0x10000; + } + + if (newConn != (connMap & 0x10F00)) + { + connMap = connMap & ~0x10F00 | newConn; + return true; + } + return false; + } + + /** Recalculates connections that can be made to other parts outside of this space + * + * @return true if external connections should be recalculated */ + protected boolean updateOpenConnections() + { + int newConn = 0; + for (int r = 0; r < 4; r++) + if (connectionOpen(r)) + newConn |= 0x1000 << r; + + if (newConn != (connMap & 0xF000)) + { + connMap = connMap & ~0xF000 | newConn; + return true; + } + return false; + } + + public boolean connectionOpen(int r) + { + int absDir = Rotation.rotateSide(side, r); + TMultiPart facePart = tile().partMap(absDir); + if (facePart != null && (!(facePart instanceof PartFlatWire) || !canConnectTo(facePart, ForgeDirection.getOrientation(absDir)))) + return false; + + if (tile().partMap(PartMap.edgeBetween(side, absDir)) != null) + return false; + + return true; + } + + /** Return a corner connection state. 0 = No connection 1 = Physical connection 2 = Render + * connection */ + public int connectCorner(int r) + { + int absDir = Rotation.rotateSide(side, r); + + BlockCoord pos = new BlockCoord(tile()); + pos.offset(absDir); + + if (!canConnectThroughCorner(pos, absDir ^ 1, side)) + return 0; + + pos.offset(side); + TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); + if (t != null) + { + TMultiPart tp = t.partMap(absDir ^ 1); + + if (canConnectTo(tp, ForgeDirection.getOrientation(absDir))) + { + if (tp instanceof PartFlatWire) + { + boolean b = ((PartFlatWire) tp).connectCorner(this, Rotation.rotationTo(absDir ^ 1, side ^ 1)); + + if (b) + { + // let them connect to us + if (!renderThisCorner((PartFlatWire) tp)) + { + return 1; + } + + return 2; + } + } + + return 2; + } + } + return 0; + } + + public boolean canConnectThroughCorner(BlockCoord pos, int side1, int side2) + { + if (world().isAirBlock(pos.x, pos.y, pos.z)) + { + return true; + } + + TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); + if (t != null) + { + return t.partMap(side1) == null && t.partMap(side2) == null && t.partMap(PartMap.edgeBetween(side1, side2)) == null; + } + + return false; + } + + public boolean connectStraight(int r) + { + int absDir = Rotation.rotateSide(side, r); + + BlockCoord pos = new BlockCoord(tile()).offset(absDir); + + TileMultipart t = MultipartUtility.getMultipartTile(world(), pos); + if (t != null) + { + TMultiPart tp = t.partMap(side); + + if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) + { + if (tp instanceof PartFlatWire) + { + return ((PartFlatWire) tp).connectStraight(this, (r + 2) % 4); + } + + return true; + } + } + else + { + TileEntity tileEntity = world().getBlockTileEntity(pos.x, pos.y, pos.z); + return this.canConnectTo(tileEntity, ForgeDirection.getOrientation(absDir)); + } + + return false; + } + + public boolean connectInternal(int r) + { + int absDir = Rotation.rotateSide(side, r); + + if (tile().partMap(PartMap.edgeBetween(absDir, side)) != null) + return false; + + TMultiPart tp = tile().partMap(absDir); + + if (this.canConnectTo(tp, ForgeDirection.getOrientation(absDir))) + { + return ((PartFlatWire) tp).connectInternal(this, Rotation.rotationTo(absDir, side)); + } + + return connectInternalOverride(tp, r); + } + + public boolean connectInternalOverride(TMultiPart p, int r) + { + return false; + } + + public boolean connectCenter() + { + TMultiPart tp = tile().partMap(6); + + if (this.canConnectTo(tp)) + { + if (tp instanceof PartFlatWire) + { + return ((PartFlatWire) tp).connectInternal(this, side); + } + + return true; + } + + return false; + } + + public boolean renderThisCorner(PartFlatWire part) + { + if (!(part instanceof PartFlatWire)) + return false; + + PartFlatWire wire = part; + if (wire.getThickness() == getThickness()) + return side < wire.side; + + return wire.getThickness() > getThickness(); + } + + public boolean connectCorner(PartFlatWire wire, int r) + { + int absDir = Rotation.rotateSide(side, r); + + if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir)) && maskOpen(r)) + { + int oldConn = connMap; + connMap |= 0x1 << r; + if (renderThisCorner(wire))// render connection + connMap |= 0x100000 << r; + + if (oldConn != connMap) + sendConnUpdate(); + return true; + } + return false; + } + + public boolean connectStraight(PartFlatWire wire, int r) + { + int absDir = Rotation.rotateSide(side, r); + + if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir)) && maskOpen(r)) + { + int oldConn = connMap; + connMap |= 0x10 << r; + if (oldConn != connMap) + sendConnUpdate(); + return true; + } + return false; + } + + public boolean connectInternal(PartFlatWire wire, int r) + { + int absDir = Rotation.rotateSide(side, r); + + if (this.canConnectTo(wire, ForgeDirection.getOrientation(absDir))) + { + int oldConn = connMap; + connMap |= 0x100 << r; + if (oldConn != connMap) + sendConnUpdate(); + return true; + } + return false; + } + + public boolean canConnectCorner(int r) + { + return true; + } + + public void notifyCornerChange(int r) + { + int absDir = Rotation.rotateSide(side, r); + + BlockCoord pos = new BlockCoord(tile()).offset(absDir).offset(side); + world().notifyBlockOfNeighborChange(pos.x, pos.y, pos.z, tile().getBlockType().blockID); + } + + public void notifyStraightChange(int r) + { + int absDir = Rotation.rotateSide(side, r); + + BlockCoord pos = new BlockCoord(tile()).offset(absDir); + world().notifyBlockOfNeighborChange(pos.x, pos.y, pos.z, tile().getBlockType().blockID); + } + + public boolean maskConnects(int r) + { + return (connMap & 0x111 << r) != 0; + } + + public boolean maskOpen(int r) + { + return (connMap & 0x1000 << r) != 0; + } + + /** START TILEMULTIPART INTERACTIONS **/ + @Override + public float getStrength(MovingObjectPosition hit, EntityPlayer player) + { + return 4; + } + + @Override + public int getSlotMask() + { + return 1 << this.side; + } + + @Override + public Iterable getSubParts() + { + return Arrays.asList(new IndexedCuboid6(0, selectionBounds[getThickness()][side])); + } + + @Override + public boolean occlusionTest(TMultiPart npart) + { + return NormalOcclusionTest.apply(this, npart); + } + + @Override + public Iterable getOcclusionBoxes() + { + return Arrays.asList(occlusionBounds[getThickness()][side]); + } + + public int getThickness() + { + return this.isInsulated ? 2 : 1; + } + + @Override + public int redstoneConductionMap() + { + return 0; + } + + @Override + public boolean solid(int arg0) + { + return false; + } + + @Override + public String getType() + { + return "resonant_induction_flat_wire"; + } + + /** RENDERING */ + @SideOnly(Side.CLIENT) + public Icon getIcon() + { + return RenderFlatWire.flatWireTexture; + } + + public Colour getColour() + { + if (isInsulated) + { + Colour color = new ColourARGB(ItemDye.dyeColors[this.color]); + color.a = (byte) 255; + return color; + } + + return getMaterial().color; + } + + public boolean useStaticRenderer() + { + return true; + } + + @Override + @SideOnly(Side.CLIENT) + public void renderStatic(Vector3 pos, LazyLightMatrix olm, int pass) + { + if (pass == 0 && useStaticRenderer()) + { + CCRenderState.setBrightness(world(), x(), y(), z()); + RenderFlatWire.render(this, pos); + CCRenderState.setColour(-1); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(Vector3 pos, float frame, int pass) + { + if (pass == 0 && !useStaticRenderer()) + { + GL11.glDisable(GL11.GL_LIGHTING); + TextureUtils.bindAtlas(0); + CCRenderState.useModelColours(true); + CCRenderState.startDrawing(7); + RenderFlatWire.render(this, pos); + CCRenderState.draw(); + CCRenderState.setColour(-1); + GL11.glEnable(GL11.GL_LIGHTING); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void drawBreaking(RenderBlocks renderBlocks) + { + CCRenderState.reset(); + RenderFlatWire.renderBreakingOverlay(renderBlocks.overrideBlockTexture, this); + } + + /** Utility method to aid in initializing this or subclasses, usually when you need to change the + * wire to another type + * + * @param otherCable the wire to copy from */ + public void copyFrom(PartFlatWire otherCable) + { + this.isInsulated = otherCable.isInsulated; + this.color = otherCable.color; + this.connections = otherCable.connections; + this.material = otherCable.material; + this.side = otherCable.side; + this.connMap = otherCable.connMap; + this.setNetwork(otherCable.getNetwork()); + this.getNetwork().setBufferFor(this, otherCable.getNetwork().getBufferOf(otherCable)); + } + + @Override + public String toString() + { + return "[PartFlatWire]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } \ No newline at end of file diff --git a/electrical/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.java b/electrical/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.java index 7ea27be15..a2572694a 100644 --- a/electrical/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.java +++ b/electrical/src/main/scala/resonantinduction/electrical/wire/framed/PartFramedWire.java @@ -10,6 +10,7 @@ import java.util.Set; import net.minecraft.block.Block; import net.minecraft.client.renderer.RenderBlocks; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -17,11 +18,13 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.common.MinecraftForge; +import resonant.lib.prefab.damage.ElectricalDamage; import resonantinduction.core.prefab.part.PartFramedConnection; import resonantinduction.electrical.Electrical; import resonantinduction.electrical.wire.EnumWireMaterial; import universalelectricity.api.CompatibilityModule; import universalelectricity.api.UniversalClass; +import universalelectricity.api.electricity.IElectricalNetwork; import universalelectricity.api.energy.EnergyNetworkLoader; import universalelectricity.api.energy.IConductor; import universalelectricity.api.energy.IEnergyNetwork; @@ -46,306 +49,317 @@ import cpw.mods.fml.relauncher.SideOnly; @UniversalClass public class PartFramedWire extends PartFramedConnection implements IConductor, TSlottedPart, JNormalOcclusion, IHollowConnect { - public PartFramedWire() - { - super(Electrical.itemInsulation); - if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) - breakIcon = RenderFramedWire.breakIcon; - } + public PartFramedWire() + { + super(Electrical.itemInsulation); + if (FMLCommonHandler.instance().getEffectiveSide() == Side.CLIENT) + breakIcon = RenderFramedWire.breakIcon; + } - public PartFramedWire(EnumWireMaterial type) - { - this(); - material = type; - } + public PartFramedWire(EnumWireMaterial type) + { + this(); + material = type; + } - public PartFramedWire(int typeID) - { - this(EnumWireMaterial.values()[typeID]); - } + public PartFramedWire(int typeID) + { + this(EnumWireMaterial.values()[typeID]); + } - @Override - public String getType() - { - return "resonant_induction_wire"; - } + @Override + public String getType() + { + return "resonant_induction_wire"; + } - /** - * IC2 Functions - */ - @Override - public void onWorldJoin() - { - if (tile() instanceof IEnergyTile && !world().isRemote) - { - // Check if there's another part that's an IEnergyTile - boolean foundAnotherPart = false; + /** IC2 Functions */ + @Override + public void onWorldJoin() + { + if (tile() instanceof IEnergyTile && !world().isRemote) + { + // Check if there's another part that's an IEnergyTile + boolean foundAnotherPart = false; - for (int i = 0; i < tile().partList().size(); i++) - { - TMultiPart part = tile().partMap(i); + for (int i = 0; i < tile().partList().size(); i++) + { + TMultiPart part = tile().partMap(i); - if (part instanceof IEnergyTile && part != this) - { - foundAnotherPart = true; - break; - } - } + if (part instanceof IEnergyTile && part != this) + { + foundAnotherPart = true; + break; + } + } - if (!foundAnotherPart) - { - MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent((IEnergyTile) tile())); - } - } + if (!foundAnotherPart) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileLoadEvent((IEnergyTile) tile())); + } + } - super.onWorldJoin(); - } + super.onWorldJoin(); + } - @Override - public void preRemove() - { - if (!world().isRemote) - { - this.getNetwork().split(this); + @Override + public void preRemove() + { + if (!world().isRemote) + { + this.getNetwork().split(this); - if (tile() instanceof IEnergyTile) - { - // Check if there's another part that's an IEnergyTile - boolean foundAnotherPart = false; + if (tile() instanceof IEnergyTile) + { + // Check if there's another part that's an IEnergyTile + boolean foundAnotherPart = false; - for (int i = 0; i < tile().partList().size(); i++) - { - TMultiPart part = tile().partMap(i); + for (int i = 0; i < tile().partList().size(); i++) + { + TMultiPart part = tile().partMap(i); - if (part instanceof IEnergyTile && part != this) - { - foundAnotherPart = true; - break; - } - } + if (part instanceof IEnergyTile && part != this) + { + foundAnotherPart = true; + break; + } + } - if (!foundAnotherPart) - { - MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile) tile())); - } - } - } + if (!foundAnotherPart) + { + MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent((IEnergyTile) tile())); + } + } + } - super.preRemove(); - } + super.preRemove(); + } - @Override - public boolean doesTick() - { - return false; - } + @Override + public boolean doesTick() + { + return false; + } - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) - { - if (!world().isRemote) - System.out.println(getNetwork()); + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition part, ItemStack item) + { + if (!world().isRemote) + System.out.println(getNetwork()); - if (item != null) - { - if (item.getItem().itemID == Block.lever.blockID) - { - TileMultipart tile = tile(); - World w = world(); + if (item != null) + { + if (item.getItem().itemID == Block.lever.blockID) + { + TileMultipart tile = tile(); + World w = world(); - if (!w.isRemote) - { - PartFramedSwitchWire wire = (PartFramedSwitchWire) MultiPartRegistry.createPart("resonant_induction_switch_wire", false); - wire.copyFrom(this); + if (!w.isRemote) + { + PartFramedSwitchWire wire = (PartFramedSwitchWire) MultiPartRegistry.createPart("resonant_induction_switch_wire", false); + wire.copyFrom(this); - if (tile.canReplacePart(this, wire)) - { - tile.remPart(this); - TileMultipart.addPart(w, new BlockCoord(tile), wire); + if (tile.canReplacePart(this, wire)) + { + tile.remPart(this); + TileMultipart.addPart(w, new BlockCoord(tile), wire); - if (!player.capabilities.isCreativeMode) - { - player.inventory.decrStackSize(player.inventory.currentItem, 1); - } - } - } - return true; - } - } + if (!player.capabilities.isCreativeMode) + { + player.inventory.decrStackSize(player.inventory.currentItem, 1); + } + } + } + return true; + } + } - return super.activate(player, part, item); - } + return super.activate(player, part, item); + } - @Override - public void preparePlacement(int meta) - { - this.setMaterial(meta); - } + @Override + public void preparePlacement(int meta) + { + this.setMaterial(meta); + } - @Override - public Iterable getCollisionBoxes() - { - Set collisionBoxes = new HashSet(); - collisionBoxes.addAll((Collection) getSubParts()); - return collisionBoxes; - } + @Override + public Iterable getCollisionBoxes() + { + Set collisionBoxes = new HashSet(); + collisionBoxes.addAll((Collection) getSubParts()); + return collisionBoxes; + } - @Override - public float getStrength(MovingObjectPosition hit, EntityPlayer player) - { - return 10F; - } + @Override + public float getStrength(MovingObjectPosition hit, EntityPlayer player) + { + return 10F; + } - @Override - @SideOnly(Side.CLIENT) - public void renderStatic(codechicken.lib.vec.Vector3 pos, LazyLightMatrix olm, int pass) - { - if (pass == 0) - { - RenderFramedWire.INSTANCE.renderStatic(this); - } - } + @Override + @SideOnly(Side.CLIENT) + public void renderStatic(codechicken.lib.vec.Vector3 pos, LazyLightMatrix olm, int pass) + { + if (pass == 0) + { + RenderFramedWire.INSTANCE.renderStatic(this); + } + } - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(codechicken.lib.vec.Vector3 pos, float frame, int pass) - { - if (getMaterial() == EnumWireMaterial.SILVER) - { - RenderFramedWire.INSTANCE.renderShine(this, pos.x, pos.y, pos.z, frame); - } - } + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(codechicken.lib.vec.Vector3 pos, float frame, int pass) + { + if (getMaterial() == EnumWireMaterial.SILVER) + { + RenderFramedWire.INSTANCE.renderShine(this, pos.x, pos.y, pos.z, frame); + } + } - @Override - public void drawBreaking(RenderBlocks renderBlocks) - { - CCRenderState.reset(); - RenderUtils.renderBlock(sides[6], 0, new Translation(x(), y(), z()), new IconTransformation(renderBlocks.overrideBlockTexture), null); - } + @Override + public void drawBreaking(RenderBlocks renderBlocks) + { + CCRenderState.reset(); + RenderUtils.renderBlock(sides[6], 0, new Translation(x(), y(), z()), new IconTransformation(renderBlocks.overrideBlockTexture), null); + } - @Override - public Iterable getOcclusionBoxes() - { - return getCollisionBoxes(); - } + @Override + public Iterable getOcclusionBoxes() + { + return getCollisionBoxes(); + } - @Override - public int getSlotMask() - { - return PartMap.CENTER.mask; - } + @Override + public int getSlotMask() + { + return PartMap.CENTER.mask; + } - @Override - public int getHollowSize() - { - return isInsulated ? 8 : 6; - } + @Override + public int getHollowSize() + { + return isInsulated ? 8 : 6; + } - @Override - protected boolean canConnectTo(TileEntity tile, ForgeDirection side) - { - Object obj = tile instanceof TileMultipart ? ((TileMultipart) tile).partMap(ForgeDirection.UNKNOWN.ordinal()) : tile; - return canConnect(side, obj); - } + @Override + protected boolean canConnectTo(TileEntity tile, ForgeDirection side) + { + Object obj = tile instanceof TileMultipart ? ((TileMultipart) tile).partMap(ForgeDirection.UNKNOWN.ordinal()) : tile; + return canConnect(side, obj); + } - @Override - public IConductor getConnector(TileEntity tile) - { - if (tile instanceof IConductor) - return (IConductor) ((IConductor) tile).getInstance(ForgeDirection.UNKNOWN); + @Override + public IConductor getConnector(TileEntity tile) + { + if (tile instanceof IConductor) + return (IConductor) ((IConductor) tile).getInstance(ForgeDirection.UNKNOWN); - return null; - } + return null; + } - /** Shouldn't need to be overridden. Override connectionPrevented instead */ - @Override - public boolean canConnect(ForgeDirection from, Object obj) - { - if (isBlockedOnSide(from)) - return false; + /** Shouldn't need to be overridden. Override connectionPrevented instead */ + @Override + public boolean canConnect(ForgeDirection from, Object obj) + { + if (isBlockedOnSide(from)) + return false; - if (obj instanceof PartFramedWire) - { - if (world().isBlockIndirectlyGettingPowered(x(), y(), z())) - { - return false; - } + if (obj instanceof PartFramedWire) + { + if (world().isBlockIndirectlyGettingPowered(x(), y(), z())) + { + return false; + } - PartFramedWire wire = (PartFramedWire) obj; + PartFramedWire wire = (PartFramedWire) obj; - if (this.getMaterial() == wire.getMaterial()) - { - if (isInsulated() && wire.isInsulated()) - { - return getColor() == wire.getColor() || (getColor() == DEFAULT_COLOR || wire.getColor() == DEFAULT_COLOR); - } + if (this.getMaterial() == wire.getMaterial()) + { + if (isInsulated() && wire.isInsulated()) + { + return getColor() == wire.getColor() || (getColor() == DEFAULT_COLOR || wire.getColor() == DEFAULT_COLOR); + } - return true; - } + return true; + } - return false; - } + return false; + } - return CompatibilityModule.canConnect(obj, from.getOpposite(), this); - } + return CompatibilityModule.canConnect(obj, from.getOpposite(), this); + } - @Override - public float getResistance() - { - return this.getMaterial().resistance; - } + @Override + public float getResistance() + { + return this.getMaterial().resistance; + } - public void copyFrom(PartFramedWire otherCable) - { - this.isInsulated = otherCable.isInsulated; - this.color = otherCable.color; - this.connections = otherCable.connections; - this.material = otherCable.material; - this.currentWireConnections = otherCable.currentWireConnections; - this.currentAcceptorConnections = otherCable.currentAcceptorConnections; - this.setNetwork(otherCable.getNetwork()); - this.getNetwork().setBufferFor(this, otherCable.getInstance(ForgeDirection.UNKNOWN).getNetwork().getBufferOf(otherCable)); - } + public void copyFrom(PartFramedWire otherCable) + { + this.isInsulated = otherCable.isInsulated; + this.color = otherCable.color; + this.connections = otherCable.connections; + this.material = otherCable.material; + this.currentWireConnections = otherCable.currentWireConnections; + this.currentAcceptorConnections = otherCable.currentAcceptorConnections; + this.setNetwork(otherCable.getNetwork()); + this.getNetwork().setBufferFor(this, otherCable.getInstance(ForgeDirection.UNKNOWN).getNetwork().getBufferOf(otherCable)); + } - @Override - public IEnergyNetwork getNetwork() - { - if (network == null) - { - setNetwork(EnergyNetworkLoader.getNewNetwork(this)); - } + @Override + public IEnergyNetwork getNetwork() + { + if (network == null) + { + setNetwork(EnergyNetworkLoader.getNewNetwork(this)); + } - return network; - } + return network; + } - @Override - public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) - { - return this.getNetwork().produce(this, from.getOpposite(), receive, doReceive); - } + @Override + public long onReceiveEnergy(ForgeDirection from, long receive, boolean doReceive) + { + return this.getNetwork().produce(this, from.getOpposite(), receive, doReceive); + } - @Override - public long onExtractEnergy(ForgeDirection from, long request, boolean doExtract) - { - return 0; - } + @Override + public long onExtractEnergy(ForgeDirection from, long request, boolean doExtract) + { + return 0; + } - @Override - public long getCurrentCapacity() - { - return this.getMaterial().maxAmps; - } + @Override + public long getCurrentCapacity() + { + return this.getMaterial().maxAmps; + } - @Override - public void setMaterial(int i) - { - setMaterial(EnumWireMaterial.values()[i]); - } + @Override + public void setMaterial(int i) + { + setMaterial(EnumWireMaterial.values()[i]); + } - @Override - protected ItemStack getItem() - { - return new ItemStack(Electrical.itemWire, 1, getMaterialID()); - } + @Override + protected ItemStack getItem() + { + return new ItemStack(Electrical.itemWire, 1, getMaterialID()); + } + + @Override + public void onEntityCollision(Entity entity) + { + if (!this.isInsulated() && this.getNetwork() instanceof IElectricalNetwork) + ElectricalDamage.handleElectrocution(entity, this, (IElectricalNetwork) this.getNetwork()); + } + + @Override + public String toString() + { + return "[PartFramedWire]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } \ No newline at end of file diff --git a/electrical/src/main/scala/resonantinduction/quantum/gate/BlockGlyph.java b/electrical/src/main/scala/resonantinduction/quantum/gate/BlockGlyph.java deleted file mode 100644 index c7d63d2e6..000000000 --- a/electrical/src/main/scala/resonantinduction/quantum/gate/BlockGlyph.java +++ /dev/null @@ -1,55 +0,0 @@ -package resonantinduction.quantum.gate; - -import java.util.List; - -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IconRegister; -import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.item.ItemStack; -import net.minecraft.util.Icon; -import resonantinduction.core.Reference; -import calclavia.lib.prefab.block.BlockAdvanced; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; - -public class BlockGlyph extends BlockAdvanced -{ - public static final int MAX_GLYPH = 4; - public static final Icon[] icons = new Icon[MAX_GLYPH]; - - public BlockGlyph(int id) - { - super(id, Material.iron); - setHardness(32F); - setResistance(1000F); - } - - @Override - @SideOnly(Side.CLIENT) - public Icon getIcon(int side, int meta) - { - return icons[meta]; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerIcons(IconRegister register) - { - for (int i = 0; i < icons.length; i++) - { - icons[i] = register.registerIcon(Reference.PREFIX + "glyph_" + i); - } - - this.blockIcon = icons[0]; - } - - @Override - @SideOnly(Side.CLIENT) - public void getSubBlocks(int par1, CreativeTabs par2CreativeTabs, List par3List) - { - for (int i = 0; i < icons.length; i++) - { - par3List.add(new ItemStack(par1, 1, i)); - } - } -} diff --git a/electrical/src/main/scala/resonantinduction/quantum/gate/IQuantumGate.java b/electrical/src/main/scala/resonantinduction/quantum/gate/IQuantumGate.java index dfc4e7957..22b4e407f 100644 --- a/electrical/src/main/scala/resonantinduction/quantum/gate/IQuantumGate.java +++ b/electrical/src/main/scala/resonantinduction/quantum/gate/IQuantumGate.java @@ -4,7 +4,7 @@ import net.minecraft.entity.Entity; import net.minecraft.inventory.ISidedInventory; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; -import calclavia.api.icbm.IBlockFrequency; +import resonant.api.blocks.IBlockFrequency; /** * Only TileEntities should implement this. diff --git a/electrical/src/main/scala/resonantinduction/quantum/gate/PartQuantumGlyph.java b/electrical/src/main/scala/resonantinduction/quantum/gate/PartQuantumGlyph.java index 4ed9d13cb..e8ef000c1 100644 --- a/electrical/src/main/scala/resonantinduction/quantum/gate/PartQuantumGlyph.java +++ b/electrical/src/main/scala/resonantinduction/quantum/gate/PartQuantumGlyph.java @@ -18,13 +18,13 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; +import resonant.api.IExternalInventory; +import resonant.api.IExternalInventoryBox; +import resonant.api.blocks.IBlockFrequency; +import resonant.lib.utility.inventory.ExternalInventory; import resonantinduction.electrical.Electrical; import universalelectricity.api.vector.VectorWorld; -import calclavia.api.icbm.IBlockFrequency; import calclavia.api.mffs.fortron.FrequencyGrid; -import calclavia.lib.utility.inventory.ExternalInventory; -import calclavia.lib.utility.inventory.IExternalInventory; -import calclavia.lib.utility.inventory.IExternalInventoryBox; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import codechicken.lib.vec.Cuboid6; diff --git a/electrical/src/main/scala/resonantinduction/quantum/gate/RenderQuantumGlyph.java b/electrical/src/main/scala/resonantinduction/quantum/gate/RenderQuantumGlyph.java index acbe79145..83080afe8 100644 --- a/electrical/src/main/scala/resonantinduction/quantum/gate/RenderQuantumGlyph.java +++ b/electrical/src/main/scala/resonantinduction/quantum/gate/RenderQuantumGlyph.java @@ -6,9 +6,9 @@ import net.minecraft.item.ItemStack; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import codechicken.lib.vec.Cuboid6; public class RenderQuantumGlyph implements ISimpleItemRenderer diff --git a/electrical/src/main/scala/resonantinduction/quantum/gate/TraitQuantumGate.java b/electrical/src/main/scala/resonantinduction/quantum/gate/TraitQuantumGate.java index f978d5f38..f95c72af5 100644 --- a/electrical/src/main/scala/resonantinduction/quantum/gate/TraitQuantumGate.java +++ b/electrical/src/main/scala/resonantinduction/quantum/gate/TraitQuantumGate.java @@ -8,7 +8,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; -import calclavia.api.icbm.IBlockFrequency; +import resonant.api.blocks.IBlockFrequency; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/ClientProxy.java b/mechanical/src/main/scala/resonantinduction/mechanical/ClientProxy.java index 0ce7e9b11..75d90e2e2 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/ClientProxy.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/ClientProxy.java @@ -1,9 +1,9 @@ package resonantinduction.mechanical; +import resonant.lib.render.item.GlobalItemRenderer; import resonantinduction.mechanical.energy.gear.RenderGear; -import resonantinduction.mechanical.energy.gear.RenderGearShaft; +import resonantinduction.mechanical.energy.gearshaft.RenderGearShaft; import resonantinduction.mechanical.fluid.pipe.RenderPipe; -import calclavia.lib.render.item.GlobalItemRenderer; public class ClientProxy extends CommonProxy { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/CommonProxy.java b/mechanical/src/main/scala/resonantinduction/mechanical/CommonProxy.java index e36d09cf1..d7e3360ef 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/CommonProxy.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/CommonProxy.java @@ -1,6 +1,6 @@ package resonantinduction.mechanical; -import calclavia.lib.prefab.ProxyBase; +import resonant.lib.prefab.ProxyBase; public class CommonProxy extends ProxyBase { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/Mechanical.java b/mechanical/src/main/scala/resonantinduction/mechanical/Mechanical.java index b5b2081e2..71a944bd6 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/Mechanical.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/Mechanical.java @@ -1,13 +1,47 @@ package resonantinduction.mechanical; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.components.creative.BlockCreativeBuilder; -import calclavia.lib.content.ContentRegistry; -import calclavia.lib.grid.NodeRegistry; -import calclavia.lib.network.PacketAnnotation; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.item.ItemBlockMetadata; -import calclavia.lib.recipe.UniversalRecipe; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.oredict.OreDictionary; +import net.minecraftforge.oredict.ShapedOreRecipe; +import resonant.api.IMechanicalNode; +import resonant.core.content.debug.BlockCreativeBuilder; +import resonant.lib.content.ContentRegistry; +import resonant.lib.grid.NodeRegistry; +import resonant.lib.network.PacketAnnotation; +import resonant.lib.network.PacketHandler; +import resonant.lib.prefab.item.ItemBlockMetadata; +import resonant.lib.recipe.UniversalRecipe; +import resonantinduction.core.Reference; +import resonantinduction.core.ResonantInduction; +import resonantinduction.core.Settings; +import resonantinduction.core.TabRI; +import resonantinduction.mechanical.belt.BlockConveyorBelt; +import resonantinduction.mechanical.belt.TileConveyorBelt; +import resonantinduction.mechanical.energy.gear.ItemGear; +import resonantinduction.mechanical.energy.gearshaft.ItemGearShaft; +import resonantinduction.mechanical.energy.grid.MechanicalNode; +import resonantinduction.mechanical.energy.turbine.BlockWaterTurbine; +import resonantinduction.mechanical.energy.turbine.BlockWindTurbine; +import resonantinduction.mechanical.energy.turbine.SchematicWaterTurbine; +import resonantinduction.mechanical.energy.turbine.SchematicWindTurbine; +import resonantinduction.mechanical.energy.turbine.TileWaterTurbine; +import resonantinduction.mechanical.energy.turbine.TileWindTurbine; +import resonantinduction.mechanical.fluid.pipe.EnumPipeMaterial; +import resonantinduction.mechanical.fluid.pipe.ItemPipe; +import resonantinduction.mechanical.fluid.transport.TilePump; +import resonantinduction.mechanical.logistic.belt.BlockDetector; +import resonantinduction.mechanical.logistic.belt.BlockManipulator; +import resonantinduction.mechanical.logistic.belt.TileDetector; +import resonantinduction.mechanical.logistic.belt.TileManipulator; +import resonantinduction.mechanical.logistic.belt.TileSorter; +import resonantinduction.mechanical.process.crusher.TileMechanicalPiston; +import resonantinduction.mechanical.process.edit.TileBreaker; +import resonantinduction.mechanical.process.edit.TilePlacer; +import resonantinduction.mechanical.process.grinder.TileGrindingWheel; +import resonantinduction.mechanical.process.purifier.TileMixer; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.Mod.Instance; @@ -19,31 +53,6 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.oredict.OreDictionary; -import net.minecraftforge.oredict.ShapedOreRecipe; -import resonantinduction.core.Reference; -import resonantinduction.core.ResonantInduction; -import resonantinduction.core.Settings; -import resonantinduction.core.TabRI; -import resonantinduction.mechanical.belt.BlockConveyorBelt; -import resonantinduction.mechanical.belt.TileConveyorBelt; -import resonantinduction.mechanical.energy.gear.ItemGear; -import resonantinduction.mechanical.energy.gear.ItemGearShaft; -import resonantinduction.mechanical.energy.grid.MechanicalNode; -import resonantinduction.mechanical.energy.turbine.*; -import resonantinduction.mechanical.fluid.pipe.EnumPipeMaterial; -import resonantinduction.mechanical.fluid.pipe.ItemPipe; -import resonantinduction.mechanical.fluid.transport.TilePump; -import resonantinduction.mechanical.logistic.belt.*; -import resonantinduction.mechanical.process.crusher.TileMechanicalPiston; -import resonantinduction.mechanical.process.edit.TileBreaker; -import resonantinduction.mechanical.process.edit.TilePlacer; -import resonantinduction.mechanical.process.grinder.TileGrindingWheel; -import resonantinduction.mechanical.process.purifier.TileMixer; /** * Resonant Induction Mechanical Module diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/belt/BeltNetwork.java b/mechanical/src/main/scala/resonantinduction/mechanical/belt/BeltNetwork.java index 93c02db48..fb37b5cb3 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/belt/BeltNetwork.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/belt/BeltNetwork.java @@ -1,6 +1,6 @@ package resonantinduction.mechanical.belt; -import calclavia.lib.grid.TickingGrid; +import resonant.lib.grid.TickingGrid; /** @author Darkguardsman */ public class BeltNetwork extends TickingGrid diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/belt/BlockConveyorBelt.java b/mechanical/src/main/scala/resonantinduction/mechanical/belt/BlockConveyorBelt.java index 7f394b097..9a4b43845 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/belt/BlockConveyorBelt.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/belt/BlockConveyorBelt.java @@ -13,11 +13,11 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.prefab.block.BlockTile; +import resonant.lib.render.block.BlockRenderingHandler; import resonantinduction.core.Reference; import resonantinduction.mechanical.belt.TileConveyorBelt.BeltType; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.prefab.block.BlockTile; -import calclavia.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/belt/RenderConveyorBelt.java b/mechanical/src/main/scala/resonantinduction/mechanical/belt/RenderConveyorBelt.java index 6cbffdd0f..1abbbcf40 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/belt/RenderConveyorBelt.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/belt/RenderConveyorBelt.java @@ -7,9 +7,9 @@ import net.minecraft.util.ResourceLocation; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; import resonantinduction.core.Reference; import resonantinduction.mechanical.belt.TileConveyorBelt.BeltType; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/belt/TileConveyorBelt.java b/mechanical/src/main/scala/resonantinduction/mechanical/belt/TileConveyorBelt.java index 90a4d3856..06a28fae1 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/belt/TileConveyorBelt.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/belt/TileConveyorBelt.java @@ -11,15 +11,15 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IEntityConveyor; +import resonant.api.IRotatable; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; +import resonant.lib.content.module.TileBase; +import resonant.lib.network.IPacketReceiverWithID; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.mechanical.Mechanical; -import calclavia.api.resonantinduction.mechanical.IBelt; -import calclavia.lib.content.module.TileBase; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.network.IPacketReceiverWithID; -import calclavia.lib.prefab.tile.IRotatable; import com.google.common.io.ByteArrayDataInput; @@ -28,7 +28,7 @@ import cpw.mods.fml.common.network.PacketDispatcher; /** Conveyer belt TileEntity that allows entities of all kinds to be moved * * @author DarkGuardsman */ -public class TileConveyorBelt extends TileBase implements IBelt, IRotatable, INodeProvider, IPacketReceiverWithID +public class TileConveyorBelt extends TileBase implements IEntityConveyor, IRotatable, INodeProvider, IPacketReceiverWithID { public enum BeltType { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ConnectionLogic.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ConnectionLogic.java index 3c970cbbd..bae471ed3 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ConnectionLogic.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ConnectionLogic.java @@ -3,8 +3,8 @@ package resonantinduction.mechanical.energy.gear; import java.util.HashMap; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.utility.WorldUtility; import universalelectricity.api.vector.Vector3; -import calclavia.lib.utility.WorldUtility; /** * Used for testing. NO-OP diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/GearMultiBlockHandler.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/GearMultiBlockHandler.java index 90d698ba2..1ec1db368 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/GearMultiBlockHandler.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/GearMultiBlockHandler.java @@ -2,8 +2,8 @@ package resonantinduction.mechanical.energy.gear; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.multiblock.MultiBlockHandler; import universalelectricity.api.vector.Vector3; -import calclavia.lib.multiblock.reference.MultiBlockHandler; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGear.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGear.java index 1deb32513..1f38e96eb 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGear.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGear.java @@ -62,6 +62,8 @@ public class ItemGear extends JItemMultiPart implements IHighlight { listToAddTo.add(new ItemStack(itemID, 1, i)); } + + listToAddTo.add(new ItemStack(itemID, 1, 10)); } @Override diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGear.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGear.java index 55c84012f..5b0b0c1ad 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGear.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGear.java @@ -11,17 +11,17 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IMechanicalNode; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; +import resonant.lib.multiblock.IMultiBlockStructure; +import resonant.lib.multiblock.MultiBlockHandler; +import resonant.lib.utility.WrenchUtility; import resonantinduction.core.Reference; import resonantinduction.core.resource.ItemHandCrank; import resonantinduction.mechanical.Mechanical; import resonantinduction.mechanical.energy.grid.MechanicalNode; import resonantinduction.mechanical.energy.grid.PartMechanical; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.multiblock.reference.IMultiBlockStructure; -import calclavia.lib.multiblock.reference.MultiBlockHandler; -import calclavia.lib.utility.WrenchUtility; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Rotation; import codechicken.lib.vec.Transformation; @@ -33,529 +33,527 @@ import codechicken.multipart.TileMultipart; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -/** - * We assume all the force acting on the gear is 90 degrees. +/** We assume all the force acting on the gear is 90 degrees. * - * @author Calclavia - */ + * @author Calclavia */ public class PartGear extends PartMechanical implements IMultiBlockStructure { - public static Cuboid6[][] oBoxes = new Cuboid6[6][2]; - - static - { - oBoxes[0][0] = new Cuboid6(1 / 8D, 0, 0, 7 / 8D, 1 / 8D, 1); - oBoxes[0][1] = new Cuboid6(0, 0, 1 / 8D, 1, 1 / 8D, 7 / 8D); - for (int s = 1; s < 6; s++) - { - Transformation t = Rotation.sideRotations[s].at(Vector3.center); - oBoxes[s][0] = oBoxes[0][0].copy().apply(t); - oBoxes[s][1] = oBoxes[0][1].copy().apply(t); - } - } - - private boolean isClockwiseCrank = true; - private int manualCrankTime = 0; - private int multiBlockRadius = 1; - - public PartGear() - { - super(); - node = new MechanicalNode(this) - { - @Override - public void onUpdate() - { - if (!getMultiBlock().isPrimary()) - { - torque = 0; - angularVelocity = 0; - } - } - - @Override - public double getTorqueLoad() - { - // Decelerate the gear based on tier. - switch (tier) - { - default: - return 0.8; - case 1: - return 0.6; - case 2: - return 0.4; - } - } - - @Override - public double getAngularVelocityLoad() - { - // Decelerate the gear based on tier. - switch (tier) - { - default: - return 0.6; - case 1: - return 0.8; - case 2: - return 0.4; - } - } - - @Override - public void doRecache() - { - connections.clear(); - - /** - * Only call refresh if this is the main block of a multiblock gear or a single - * gear - * block. - */ - if (!getMultiBlock().isPrimary() || world() == null) - { - return; - } - - /** Look for gears that are back-to-back with this gear. Equate torque. */ - TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world()); - - if (tileBehind instanceof INodeProvider) - { - MechanicalNode instance = ((INodeProvider) tileBehind).getNode(MechanicalNode.class, placementSide.getOpposite()); - - if (instance != null && instance != this && !(instance.parent instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this)) - { - connections.put(instance, placementSide); - } - } - - /** - * Look for gears that are internal and adjacent to this gear. (The 4 sides + - * the internal center) - */ - for (int i = 0; i < 6; i++) - { - ForgeDirection checkDir = ForgeDirection.getOrientation(i); - - TileEntity tile = tile(); - - if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite()) - { - tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world()); - } - - if (tile instanceof INodeProvider) - { - /** - * If we're checking for the block that is opposite to the gear's - * placement - * side - * (the center), then we try to look for a gear shaft in the center. - */ - MechanicalNode instance = ((INodeProvider) tile).getNode(MechanicalNode.class, checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir); - - if (!connections.containsValue(checkDir) && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this)) - { - connections.put(instance, checkDir); - } - } - } - - int displaceCheck = 1; - - if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed()) - { - displaceCheck = 2; - } - - /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ - for (int i = 0; i < 4; i++) - { - ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(PartGear.this.placementSide.ordinal(), i)); - TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world()); - - if (!connections.containsValue(checkDir) && checkTile instanceof INodeProvider) - { - MechanicalNode instance = ((INodeProvider) checkTile).getNode(MechanicalNode.class, placementSide); - - if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.parent instanceof PartGearShaft)) - { - connections.put(instance, checkDir); - } - } - } - } - - /** - * Can this gear be connected BY the source? - * - * @param from - Direction source is coming from. - * @param with - The source of the connection. - * @return True is so. - */ - @Override - public boolean canConnect(ForgeDirection from, Object with) - { - if (!getMultiBlock().isPrimary()) - { - return false; - } - - if (with instanceof MechanicalNode) - { - INodeProvider parent = ((MechanicalNode) with).parent; - - /** - * Check for flat connections (gear face on gear face) to make sure it's - * actually on this gear block. - */ - if (from == placementSide.getOpposite()) - { - if (parent instanceof PartGear || parent instanceof PartGearShaft) - { - if (parent instanceof PartGearShaft) - { - PartGearShaft shaft = (PartGearShaft) parent; - return shaft.tile().partMap(from.getOpposite().ordinal()) == PartGear.this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ); - } - else if (parent instanceof PartGear) - { - if (((PartGear) parent).tile() == tile() && !getMultiBlock().isConstructed()) - { - return true; - } - - if (((PartGear) parent).placementSide != placementSide) - { - TMultiPart part = tile().partMap(((PartGear) parent).placementSide.ordinal()); - - if (part instanceof PartGear) - { - /** - * Case when we connect gears via edges internally. Large - * gear - * attempt to connect to small gear. - */ - PartGear sourceGear = (PartGear) part; - - if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary()) - { - // For large gear to small gear on edge connection. - return true; - } - } - else - { - /** Small gear attempting to connect to large gear. */ - if (getMultiBlock().isConstructed()) - { - TMultiPart checkPart = ((PartGear) parent).tile().partMap(placementSide.ordinal()); - - if (checkPart instanceof PartGear) - { - ForgeDirection requiredDirection = ((PartGear) checkPart).getPosition().subtract(position()).toForgeDirection(); - return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) parent).placementSide == requiredDirection; - } - } - } - } - } - } - - /** Face to face stick connection. */ - TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world()); - - if (sourceTile instanceof INodeProvider) - { - MechanicalNode sourceInstance = ((INodeProvider) sourceTile).getNode(MechanicalNode.class, from); - return sourceInstance == with; - } - } - else if (from == placementSide) - { - /** Face to face stick connection. */ - TileEntity sourceTile = position().translate(from).getTileEntity(world()); - - if (sourceTile instanceof INodeProvider) - { - MechanicalNode sourceInstance = ((INodeProvider) sourceTile).getNode(MechanicalNode.class, from.getOpposite()); - return sourceInstance == with; - } - } - else - { - TileEntity destinationTile = ((MechanicalNode) with).position().translate(from.getOpposite()).getTileEntity(world()); - - if (destinationTile instanceof INodeProvider && destinationTile instanceof TileMultipart) - { - TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal()); - - if (destinationPart instanceof PartGear) - { - if (PartGear.this != destinationPart) - { - return ((PartGear) destinationPart).isCenterMultiBlock(); - } - else - { - return true; - } - } - else - { - return true; - } - } - } - } - - return false; - } - - @Override - public float getRatio(ForgeDirection dir, IMechanicalNode with) - { - universalelectricity.api.vector.Vector3 deltaPos = with.position().subtract(position()); - - boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0; - boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0; - boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0; - - if (caseX || caseY || caseZ) - { - return super.getRatio(dir, with); - } - - return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, with); - } - }; - } - - @Override - public void update() - { - super.update(); - - if (!this.world().isRemote) - { - if (manualCrankTime > 0) - { - node.apply(isClockwiseCrank ? 5 : -5, isClockwiseCrank ? 0.025f : -0.025f); - manualCrankTime--; - } - - } - - getMultiBlock().update(); - } - - @Override - public void checkClientUpdate() - { - if (getMultiBlock().isPrimary()) - super.checkClientUpdate(); - } - - @Override - public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack itemStack) - { - if (itemStack != null && itemStack.getItem() instanceof ItemHandCrank) - { - if (!world().isRemote && ControlKeyModifer.isControlDown(player)) - { - getMultiBlock().get().node.torque = -getMultiBlock().get().node.torque; - getMultiBlock().get().node.angularVelocity = -getMultiBlock().get().node.angularVelocity; - return true; - } - - isClockwiseCrank = player.isSneaking(); - getMultiBlock().get().manualCrankTime = 10; - world().playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, Reference.PREFIX + "gearCrank", 0.5f, 0.9f + world().rand.nextFloat() * 0.2f); - player.addExhaustion(0.01f); - return true; - } - - if (WrenchUtility.isWrench(itemStack)) - { - getMultiBlock().toggleConstruct(); - return true; - } - - return super.activate(player, hit, itemStack); - } - - @Override - public void preRemove() - { - super.preRemove(); - getMultiBlock().deconstruct(); - } - - /** - * Is this gear block the one in the center-edge of the multiblock that can interact with other - * gears? - * - * @return - */ - public boolean isCenterMultiBlock() - { - if (!getMultiBlock().isConstructed()) - { - return true; - } - - universalelectricity.api.vector.Vector3 primaryPos = getMultiBlock().getPrimary().getPosition(); - - if (primaryPos.intX() == x() && placementSide.offsetX == 0) - { - return true; - } - - if (primaryPos.intY() == y() && placementSide.offsetY == 0) - { - return true; - } - - if (primaryPos.intZ() == z() && placementSide.offsetZ == 0) - { - return true; - } - - return false; - } - - @Override - protected ItemStack getItem() - { - return new ItemStack(Mechanical.itemGear, 1, tier); - } - - @Override - @SideOnly(Side.CLIENT) - public void renderDynamic(Vector3 pos, float frame, int pass) - { - if (pass == 0) - { - RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, tier); - } - } - - @Override - public String getType() - { - return "resonant_induction_gear"; - } - - @Override - public void load(NBTTagCompound nbt) - { - super.load(nbt); - getMultiBlock().load(nbt); - } - - @Override - public void save(NBTTagCompound nbt) - { - super.save(nbt); - getMultiBlock().save(nbt); - } - - /** Multiblock */ - private GearMultiBlockHandler multiBlock; - - @Override - public universalelectricity.api.vector.Vector3[] getMultiBlockVectors() - { - Set vectors = new HashSet(); - ForgeDirection dir = placementSide; - - universalelectricity.api.vector.Vector3 rotationalAxis = universalelectricity.api.vector.Vector3.UP(); - - if (placementSide == ForgeDirection.NORTH || placementSide == ForgeDirection.SOUTH) - { - rotationalAxis = universalelectricity.api.vector.Vector3.EAST(); - } - else if (placementSide == ForgeDirection.WEST || placementSide == ForgeDirection.EAST) - { - rotationalAxis = universalelectricity.api.vector.Vector3.SOUTH(); - } - - for (int x = -1; x <= 1; x++) - { - for (int z = -1; z <= 1; z++) - { - universalelectricity.api.vector.Vector3 vector = new universalelectricity.api.vector.Vector3(x, 0, z); - vector.rotate(90, rotationalAxis); - vector = vector.round(); - vectors.add(vector); - } - } - - return vectors.toArray(new universalelectricity.api.vector.Vector3[0]); - } - - @Override - public World getWorld() - { - return world(); - } - - @Override - public void onMultiBlockChanged() - { - if (world() != null) - { - tile().notifyPartChange(this); - - if (!world().isRemote) - { - sendDescUpdate(); - } - } - } - - @Override - public MultiBlockHandler getMultiBlock() - { - if (multiBlock == null) - multiBlock = new GearMultiBlockHandler(this); - - return multiBlock; - } - - @Override - public N getNode(Class nodeType, ForgeDirection from) - { - if (nodeType.isAssignableFrom(node.getClass())) - return (N) getMultiBlock().get().node; - return null; - } - - /** Multipart Bounds */ - @Override - public Iterable getOcclusionBoxes() - { - return Arrays.asList(oBoxes[this.placementSide.ordinal()]); - } - - @Override - public int getSlotMask() - { - return 1 << this.placementSide.ordinal(); - } - - @Override - public Cuboid6 getBounds() - { - return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()]; - } - - @Override - @SideOnly(Side.CLIENT) - public Cuboid6 getRenderBounds() - { - return Cuboid6.full.copy().expand(multiBlockRadius); - } + public static Cuboid6[][] oBoxes = new Cuboid6[6][2]; + + static + { + oBoxes[0][0] = new Cuboid6(1 / 8D, 0, 0, 7 / 8D, 1 / 8D, 1); + oBoxes[0][1] = new Cuboid6(0, 0, 1 / 8D, 1, 1 / 8D, 7 / 8D); + for (int s = 1; s < 6; s++) + { + Transformation t = Rotation.sideRotations[s].at(Vector3.center); + oBoxes[s][0] = oBoxes[0][0].copy().apply(t); + oBoxes[s][1] = oBoxes[0][1].copy().apply(t); + } + } + + private boolean isClockwiseCrank = true; + private int manualCrankTime = 0; + private int multiBlockRadius = 1; + + public PartGear() + { + super(); + node = new MechanicalNode(this) + { + @Override + public void onUpdate() + { + if (!getMultiBlock().isPrimary()) + { + torque = 0; + angularVelocity = 0; + } + else + { + if (tier == 10) + { + torque = 100; + angularVelocity = 100; + } + } + } + + @Override + public double getTorqueLoad() + { + // Decelerate the gear based on tier. + switch (tier) + { + default: + return 0.3; + case 1: + return 0.2; + case 2: + return 0.1; + case 10: + return 0; + } + } + + @Override + public double getAngularVelocityLoad() + { + // Decelerate the gear based on tier. + switch (tier) + { + default: + return 0.03; + case 1: + return 0.02; + case 2: + return 0.01; + case 10: + return 0; + } + } + + @Override + public void doRecache() + { + connections.clear(); + + /** Only call refresh if this is the main block of a multiblock gear or a single gear + * block. */ + if (!getMultiBlock().isPrimary() || world() == null) + { + return; + } + + /** Look for gears that are back-to-back with this gear. Equate torque. */ + TileEntity tileBehind = new universalelectricity.api.vector.Vector3(tile()).translate(placementSide).getTileEntity(world()); + + if (tileBehind instanceof INodeProvider) + { + MechanicalNode instance = ((INodeProvider) tileBehind).getNode(MechanicalNode.class, placementSide.getOpposite()); + + if (instance != null && instance != this && !(instance.parent instanceof PartGearShaft) && instance.canConnect(placementSide.getOpposite(), this)) + { + connections.put(instance, placementSide); + } + } + + /** Look for gears that are internal and adjacent to this gear. (The 4 sides + the + * internal center) */ + for (int i = 0; i < 6; i++) + { + ForgeDirection checkDir = ForgeDirection.getOrientation(i); + + TileEntity tile = tile(); + + if (getMultiBlock().isConstructed() && checkDir != placementSide && checkDir != placementSide.getOpposite()) + { + tile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world()); + } + + if (tile instanceof INodeProvider) + { + /** If we're checking for the block that is opposite to the gear's placement + * side (the center), then we try to look for a gear shaft in the center. */ + MechanicalNode instance = ((INodeProvider) tile).getNode(MechanicalNode.class, checkDir == placementSide.getOpposite() ? ForgeDirection.UNKNOWN : checkDir); + + if (!connections.containsValue(checkDir) && instance != this && checkDir != placementSide && instance != null && instance.canConnect(checkDir.getOpposite(), this)) + { + connections.put(instance, checkDir); + } + } + } + + int displaceCheck = 1; + + if (getMultiBlock().isPrimary() && getMultiBlock().isConstructed()) + { + displaceCheck = 2; + } + + /** Look for gears outside this block space, the relative UP, DOWN, LEFT, RIGHT */ + for (int i = 0; i < 4; i++) + { + ForgeDirection checkDir = ForgeDirection.getOrientation(Rotation.rotateSide(PartGear.this.placementSide.ordinal(), i)); + TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir, displaceCheck).getTileEntity(world()); + + if (!connections.containsValue(checkDir) && checkTile instanceof INodeProvider) + { + MechanicalNode instance = ((INodeProvider) checkTile).getNode(MechanicalNode.class, placementSide); + + if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this) && !(instance.parent instanceof PartGearShaft)) + { + connections.put(instance, checkDir); + } + } + } + } + + /** Can this gear be connected BY the source? + * + * @param from - Direction source is coming from. + * @param with - The source of the connection. + * @return True is so. */ + @Override + public boolean canConnect(ForgeDirection from, Object with) + { + if (!getMultiBlock().isPrimary()) + { + return false; + } + + if (with instanceof MechanicalNode) + { + INodeProvider parent = ((MechanicalNode) with).parent; + + /** Check for flat connections (gear face on gear face) to make sure it's + * actually on this gear block. */ + if (from == placementSide.getOpposite()) + { + if (parent instanceof PartGear || parent instanceof PartGearShaft) + { + if (parent instanceof PartGearShaft) + { + PartGearShaft shaft = (PartGearShaft) parent; + return shaft.tile().partMap(from.getOpposite().ordinal()) == PartGear.this && Math.abs(shaft.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(shaft.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(shaft.placementSide.offsetZ) == Math.abs(placementSide.offsetZ); + } + else if (parent instanceof PartGear) + { + if (((PartGear) parent).tile() == tile() && !getMultiBlock().isConstructed()) + { + return true; + } + + if (((PartGear) parent).placementSide != placementSide) + { + TMultiPart part = tile().partMap(((PartGear) parent).placementSide.ordinal()); + + if (part instanceof PartGear) + { + /** Case when we connect gears via edges internally. Large + * gear attempt to connect to small gear. */ + PartGear sourceGear = (PartGear) part; + + if (sourceGear.isCenterMultiBlock() && !sourceGear.getMultiBlock().isPrimary()) + { + // For large gear to small gear on edge connection. + return true; + } + } + else + { + /** Small gear attempting to connect to large gear. */ + if (getMultiBlock().isConstructed()) + { + TMultiPart checkPart = ((PartGear) parent).tile().partMap(placementSide.ordinal()); + + if (checkPart instanceof PartGear) + { + ForgeDirection requiredDirection = ((PartGear) checkPart).getPosition().subtract(position()).toForgeDirection(); + return ((PartGear) checkPart).isCenterMultiBlock() && ((PartGear) parent).placementSide == requiredDirection; + } + } + } + } + } + } + + /** Face to face stick connection. */ + TileEntity sourceTile = position().translate(from.getOpposite()).getTileEntity(world()); + + if (sourceTile instanceof INodeProvider) + { + MechanicalNode sourceInstance = ((INodeProvider) sourceTile).getNode(MechanicalNode.class, from); + return sourceInstance == with; + } + } + else if (from == placementSide) + { + /** Face to face stick connection. */ + TileEntity sourceTile = position().translate(from).getTileEntity(world()); + + if (sourceTile instanceof INodeProvider) + { + MechanicalNode sourceInstance = ((INodeProvider) sourceTile).getNode(MechanicalNode.class, from.getOpposite()); + return sourceInstance == with; + } + } + else + { + TileEntity destinationTile = ((MechanicalNode) with).position().translate(from.getOpposite()).getTileEntity(world()); + + if (destinationTile instanceof INodeProvider && destinationTile instanceof TileMultipart) + { + TMultiPart destinationPart = ((TileMultipart) destinationTile).partMap(placementSide.ordinal()); + + if (destinationPart instanceof PartGear) + { + if (PartGear.this != destinationPart) + { + return ((PartGear) destinationPart).isCenterMultiBlock(); + } + else + { + return true; + } + } + else + { + return true; + } + } + } + } + + return false; + } + + @Override + public float getRatio(ForgeDirection dir, IMechanicalNode with) + { + universalelectricity.api.vector.Vector3 deltaPos = with.position().subtract(position()); + + boolean caseX = placementSide.offsetX != 0 && deltaPos.y == 0 && deltaPos.z == 0; + boolean caseY = placementSide.offsetY != 0 && deltaPos.x == 0 && deltaPos.z == 0; + boolean caseZ = placementSide.offsetZ != 0 && deltaPos.x == 0 && deltaPos.y == 0; + + if (caseX || caseY || caseZ) + { + return super.getRatio(dir, with); + } + + return getMultiBlock().isConstructed() ? 1.5f : super.getRatio(dir, with); + } + }; + } + + @Override + public void update() + { + super.update(); + + if (!this.world().isRemote) + { + if (manualCrankTime > 0) + { + node.apply(this, isClockwiseCrank ? 15 : -15, isClockwiseCrank ? 0.025f : -0.025f); + manualCrankTime--; + } + + } + + getMultiBlock().update(); + } + + @Override + public void checkClientUpdate() + { + if (getMultiBlock().isPrimary()) + super.checkClientUpdate(); + } + + @Override + public boolean activate(EntityPlayer player, MovingObjectPosition hit, ItemStack itemStack) + { + if (itemStack != null && itemStack.getItem() instanceof ItemHandCrank) + { + if (!world().isRemote && ControlKeyModifer.isControlDown(player)) + { + getMultiBlock().get().node.torque = -getMultiBlock().get().node.torque; + getMultiBlock().get().node.angularVelocity = -getMultiBlock().get().node.angularVelocity; + return true; + } + + isClockwiseCrank = player.isSneaking(); + getMultiBlock().get().manualCrankTime = 20; + world().playSoundEffect(x() + 0.5, y() + 0.5, z() + 0.5, Reference.PREFIX + "gearCrank", 0.5f, 0.9f + world().rand.nextFloat() * 0.2f); + player.addExhaustion(0.01f); + return true; + } + + if (WrenchUtility.isWrench(itemStack)) + { + getMultiBlock().toggleConstruct(); + return true; + } + + return super.activate(player, hit, itemStack); + } + + @Override + public void preRemove() + { + super.preRemove(); + getMultiBlock().deconstruct(); + } + + /** Is this gear block the one in the center-edge of the multiblock that can interact with other + * gears? + * + * @return */ + public boolean isCenterMultiBlock() + { + if (!getMultiBlock().isConstructed()) + { + return true; + } + + universalelectricity.api.vector.Vector3 primaryPos = getMultiBlock().getPrimary().getPosition(); + + if (primaryPos.intX() == x() && placementSide.offsetX == 0) + { + return true; + } + + if (primaryPos.intY() == y() && placementSide.offsetY == 0) + { + return true; + } + + if (primaryPos.intZ() == z() && placementSide.offsetZ == 0) + { + return true; + } + + return false; + } + + @Override + protected ItemStack getItem() + { + return new ItemStack(Mechanical.itemGear, 1, tier); + } + + @Override + @SideOnly(Side.CLIENT) + public void renderDynamic(Vector3 pos, float frame, int pass) + { + if (pass == 0) + { + RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, tier); + } + } + + @Override + public String getType() + { + return "resonant_induction_gear"; + } + + @Override + public void load(NBTTagCompound nbt) + { + super.load(nbt); + getMultiBlock().load(nbt); + } + + @Override + public void save(NBTTagCompound nbt) + { + super.save(nbt); + getMultiBlock().save(nbt); + } + + /** Multiblock */ + private GearMultiBlockHandler multiBlock; + + @Override + public universalelectricity.api.vector.Vector3[] getMultiBlockVectors() + { + Set vectors = new HashSet(); + ForgeDirection dir = placementSide; + + universalelectricity.api.vector.Vector3 rotationalAxis = universalelectricity.api.vector.Vector3.UP(); + + if (placementSide == ForgeDirection.NORTH || placementSide == ForgeDirection.SOUTH) + { + rotationalAxis = universalelectricity.api.vector.Vector3.EAST(); + } + else if (placementSide == ForgeDirection.WEST || placementSide == ForgeDirection.EAST) + { + rotationalAxis = universalelectricity.api.vector.Vector3.SOUTH(); + } + + for (int x = -1; x <= 1; x++) + { + for (int z = -1; z <= 1; z++) + { + universalelectricity.api.vector.Vector3 vector = new universalelectricity.api.vector.Vector3(x, 0, z); + vector.rotate(90, rotationalAxis); + vector = vector.round(); + vectors.add(vector); + } + } + + return vectors.toArray(new universalelectricity.api.vector.Vector3[0]); + } + + @Override + public World getWorld() + { + return world(); + } + + @Override + public void onMultiBlockChanged() + { + if (world() != null) + { + tile().notifyPartChange(this); + + if (!world().isRemote) + { + sendDescUpdate(); + } + } + } + + @Override + public MultiBlockHandler getMultiBlock() + { + if (multiBlock == null) + multiBlock = new GearMultiBlockHandler(this); + + return multiBlock; + } + + @Override + public N getNode(Class nodeType, ForgeDirection from) + { + if (nodeType.isAssignableFrom(node.getClass())) + return (N) getMultiBlock().get().node; + return null; + } + + /** Multipart Bounds */ + @Override + public Iterable getOcclusionBoxes() + { + return Arrays.asList(oBoxes[this.placementSide.ordinal()]); + } + + @Override + public int getSlotMask() + { + return 1 << this.placementSide.ordinal(); + } + + @Override + public Cuboid6 getBounds() + { + return FaceMicroClass.aBounds()[0x10 | this.placementSide.ordinal()]; + } + + @Override + @SideOnly(Side.CLIENT) + public Cuboid6 getRenderBounds() + { + return Cuboid6.full.copy().expand(multiBlockRadius); + } + + @Override + public String toString() + { + return "[PartGear]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } \ No newline at end of file diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGearShaft.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGearShaft.java index 58b1e1424..71f3fb270 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGearShaft.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/PartGearShaft.java @@ -1,23 +1,21 @@ package resonantinduction.mechanical.energy.gear; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INodeProvider; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.ForgeDirection; +import resonantinduction.mechanical.Mechanical; +import resonantinduction.mechanical.energy.gearshaft.GearShaftNode; +import resonantinduction.mechanical.energy.gearshaft.RenderGearShaft; +import resonantinduction.mechanical.energy.grid.PartMechanical; import codechicken.lib.raytracer.IndexedCuboid6; import codechicken.lib.vec.Cuboid6; import codechicken.lib.vec.Vector3; import codechicken.multipart.PartMap; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.common.ForgeDirection; -import resonantinduction.mechanical.Mechanical; -import resonantinduction.mechanical.energy.grid.MechanicalNode; -import resonantinduction.mechanical.energy.grid.PartMechanical; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; /** * We assume all the force acting on the gear is 90 degrees. @@ -43,112 +41,7 @@ public class PartGearShaft extends PartMechanical { super(); - node = new MechanicalNode(this) - { - @Override - public double getTorqueLoad() - { - // Decelerate the gear based on tier. - switch (tier) - { - default: - return 0.08; - case 1: - return 0.06; - case 2: - return 0.04; - } - } - - @Override - public double getAngularVelocityLoad() - { - // Decelerate the gear based on tier. - switch (tier) - { - default: - return 0.06; - case 1: - return 0.08; - case 2: - return 0.04; - } - } - - @Override - public void doRecache() - { - connections.clear(); - - /** Check for internal connections, the FRONT and BACK. */ - for (int i = 0; i < 6; i++) - { - ForgeDirection checkDir = ForgeDirection.getOrientation(i); - - if (checkDir == placementSide || checkDir == placementSide.getOpposite()) - { - MechanicalNode instance = ((INodeProvider) tile()).getNode(MechanicalNode.class, checkDir); - - if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this)) - { - connections.put(instance, checkDir); - } - } - } - - /** Look for connections outside this block space, the relative FRONT and BACK */ - for (int i = 0; i < 6; i++) - { - ForgeDirection checkDir = ForgeDirection.getOrientation(i); - - if (!connections.containsValue(checkDir) && (checkDir == placementSide || checkDir == placementSide.getOpposite())) - { - TileEntity checkTile = new universalelectricity.api.vector.Vector3(tile()).translate(checkDir).getTileEntity(world()); - - if (checkTile instanceof INodeProvider) - { - MechanicalNode instance = ((INodeProvider) checkTile).getNode(MechanicalNode.class, checkDir.getOpposite()); - - // Only connect to shafts outside of this block space. - if (instance != null && instance != this && instance.parent instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this)) - { - connections.put(instance, checkDir); - } - } - } - } - } - - @Override - public boolean canConnect(ForgeDirection from, Object source) - { - if (source instanceof MechanicalNode) - { - if (((MechanicalNode) source).parent instanceof PartGear) - { - PartGear gear = (PartGear) ((MechanicalNode) source).parent; - - if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(placementSide.offsetZ))) - { - return false; - } - } - } - - return from == placementSide || from == placementSide.getOpposite(); - } - - @Override - public boolean inverseRotation(ForgeDirection dir, IMechanicalNode with) - { - if (placementSide.offsetY != 0 || placementSide.offsetZ != 0) - { - return dir == placementSide.getOpposite(); - } - - return dir == placementSide; - } - }; + node = new GearShaftNode(this); } @Override diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGear.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGear.java index 2cc436ee1..96606180b 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGear.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGear.java @@ -7,9 +7,9 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @@ -18,6 +18,7 @@ public class RenderGear implements ISimpleItemRenderer { public static final RenderGear INSTANCE = new RenderGear(); public final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "gears.obj"); + public void renderGear(int side, int tier, boolean isLarge, double angle) { @@ -32,6 +33,9 @@ public class RenderGear implements ISimpleItemRenderer case 2: RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "iron_block.png"); break; + case 10: + RenderUtility.bind(Reference.BLOCK_TEXTURE_DIRECTORY + "pumpkin_top.png"); + break; } RenderUtility.rotateFaceBlockToSide(ForgeDirection.getOrientation(side)); diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/GearShaftNode.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/GearShaftNode.java new file mode 100644 index 000000000..baf2c8435 --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/GearShaftNode.java @@ -0,0 +1,123 @@ +package resonantinduction.mechanical.energy.gearshaft; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.ForgeDirection; +import resonant.api.IMechanicalNode; +import resonant.api.grid.INodeProvider; +import resonantinduction.mechanical.energy.gear.PartGear; +import resonantinduction.mechanical.energy.gear.PartGearShaft; +import resonantinduction.mechanical.energy.grid.MechanicalNode; + +public class GearShaftNode extends MechanicalNode +{ + public GearShaftNode(PartGearShaft parent) + { + super(parent); + } + + @Override + public double getTorqueLoad() + { + // Decelerate the gear based on tier. + switch (shaft().tier) + { + default: + return 0.03; + case 1: + return 0.02; + case 2: + return 0.01; + } + } + + @Override + public double getAngularVelocityLoad() + { + return 0; + } + + @Override + public void doRecache() + { + connections.clear(); + List dirs = new ArrayList(); + dirs.add(shaft().placementSide); + dirs.add(shaft().placementSide.getOpposite()); + /** Check for internal connections, the FRONT and BACK. */ + Iterator it = dirs.iterator(); + while(it.hasNext()) + { + ForgeDirection checkDir = it.next(); + if (checkDir == shaft().placementSide || checkDir == shaft().placementSide.getOpposite()) + { + MechanicalNode instance = ((INodeProvider) shaft().tile()).getNode(MechanicalNode.class, checkDir); + + if (instance != null && instance != this && instance.canConnect(checkDir.getOpposite(), this)) + { + connections.put(instance, checkDir); + it.remove(); + } + } + } + + /** Look for connections outside this block space, the relative FRONT and BACK */ + if (!dirs.isEmpty()) + for (ForgeDirection checkDir : dirs) + { + if (!connections.containsValue(checkDir) && (checkDir == shaft().placementSide || checkDir == shaft().placementSide.getOpposite())) + { + TileEntity checkTile = new universalelectricity.api.vector.Vector3(shaft().tile()).translate(checkDir).getTileEntity(world()); + + if (checkTile instanceof INodeProvider) + { + MechanicalNode instance = ((INodeProvider) checkTile).getNode(MechanicalNode.class, checkDir.getOpposite()); + + // Only connect to shafts outside of this block space. + if (instance != null && instance != this && instance.parent instanceof PartGearShaft && instance.canConnect(checkDir.getOpposite(), this)) + { + connections.put(instance, checkDir); + } + } + } + } + } + + @Override + public boolean canConnect(ForgeDirection from, Object source) + { + if (source instanceof MechanicalNode) + { + if (((MechanicalNode) source).parent instanceof PartGear) + { + PartGear gear = (PartGear) ((MechanicalNode) source).parent; + + if (!(Math.abs(gear.placementSide.offsetX) == Math.abs(shaft().placementSide.offsetX) && Math.abs(gear.placementSide.offsetY) == Math.abs(shaft().placementSide.offsetY) && Math.abs(gear.placementSide.offsetZ) == Math.abs(shaft().placementSide.offsetZ))) + { + return false; + } + } + } + + return from == shaft().placementSide || from == shaft().placementSide.getOpposite(); + } + + @Override + public boolean inverseRotation(ForgeDirection dir, IMechanicalNode with) + { + if (shaft().placementSide.offsetY != 0 || shaft().placementSide.offsetZ != 0) + { + return dir == shaft().placementSide.getOpposite(); + } + + return dir == shaft().placementSide; + } + + public PartGearShaft shaft() + { + return (PartGearShaft) this.parent; + } +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGearShaft.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ItemGearShaft.java similarity index 91% rename from mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGearShaft.java rename to mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ItemGearShaft.java index 0e187e6c7..adb1f4dae 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/ItemGearShaft.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ItemGearShaft.java @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.energy.gear; +package resonantinduction.mechanical.energy.gearshaft; import java.util.List; @@ -7,6 +7,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import resonantinduction.core.prefab.part.IHighlight; +import resonantinduction.mechanical.energy.gear.PartGearShaft; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Vector3; import codechicken.multipart.JItemMultiPart; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGearShaft.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/RenderGearShaft.java similarity index 90% rename from mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGearShaft.java rename to mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/RenderGearShaft.java index 4328e3581..8129720c0 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gear/RenderGearShaft.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/RenderGearShaft.java @@ -1,4 +1,4 @@ -package resonantinduction.mechanical.energy.gear; +package resonantinduction.mechanical.energy.gearshaft; import static org.lwjgl.opengl.GL11.glRotatef; import net.minecraft.item.ItemStack; @@ -8,9 +8,10 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; +import resonantinduction.mechanical.energy.gear.PartGearShaft; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftGrid.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftGrid.java new file mode 100644 index 000000000..048cc5462 --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftGrid.java @@ -0,0 +1,12 @@ +package resonantinduction.mechanical.energy.gearshaft; + +import resonant.lib.grid.NodeGrid; + +public class ShaftGrid extends NodeGrid +{ + public ShaftGrid(ShaftSubNode node) + { + super(ShaftSubNode.class); + add(node); + } +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftSubNode.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftSubNode.java new file mode 100644 index 000000000..aa62d4da2 --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/gearshaft/ShaftSubNode.java @@ -0,0 +1,19 @@ +package resonantinduction.mechanical.energy.gearshaft; + +import resonant.api.grid.INodeProvider; +import resonant.lib.grid.Node; +import resonantinduction.mechanical.energy.gear.PartGearShaft; + +public class ShaftSubNode extends Node +{ + public ShaftSubNode(PartGearShaft parent) + { + super(parent); + } + + @Override + protected ShaftGrid newGrid() + { + return new ShaftGrid(this); + } +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java index 53b37c882..031352014 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/grid/MechanicalNode.java @@ -1,30 +1,27 @@ package resonantinduction.mechanical.energy.grid; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.grid.Node; -import calclavia.lib.grid.TickingGrid; -import codechicken.multipart.TMultiPart; +import java.util.Iterator; +import java.util.Map.Entry; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IMechanicalNode; +import resonant.api.grid.INodeProvider; +import resonant.lib.grid.Node; +import resonant.lib.grid.TickingGrid; import resonantinduction.core.ResonantInduction; import universalelectricity.api.vector.Vector3; - -import java.util.Iterator; -import java.util.Map.Entry; +import codechicken.multipart.TMultiPart; /** * A mechanical node for mechanical energy. *

* Useful Formula: *

- * Power is the work per unit time. - * Power (W) = Torque (Strength of the rotation, Newton Meters) x Speed (Angular Velocity, RADIAN - * PER SECOND). - * *OR* - * Power = Torque / Time + * Power is the work per unit time. Power (W) = Torque (Strength of the rotation, Newton Meters) x + * Speed (Angular Velocity, RADIAN PER SECOND). *OR* Power = Torque / Time *

* Torque = r (Radius) * F (Force) * sin0 (Direction/Angle of the force applied. 90 degrees if * optimal.) @@ -42,6 +39,8 @@ public class MechanicalNode extends Node= 0) + { + angle += Math.min(angularVelocity, this.maxDeltaAngle) * deltaTime; + } + else + { + angle += Math.max(angularVelocity, -this.maxDeltaAngle) * deltaTime; + } } if (angle % (Math.PI * 2) != angle) @@ -84,11 +90,9 @@ public class MechanicalNode extends Node 0) @@ -111,6 +115,11 @@ public class MechanicalNode extends Node Math.abs(targetTorque)) { torque -= applyTorque; } - double applyVelocity = inversion * adjacentMech.getAngularVelocity() * ratio * acceleration; + double targetVelocity = inversion * adjacentMech.getAngularVelocity() * ratio; + double applyVelocity = targetVelocity * acceleration; - if (Math.abs(angularVelocity + applyVelocity) < Math.abs(adjacentMech.getAngularVelocity() * ratio)) + if (Math.abs(angularVelocity + applyVelocity) < Math.abs(targetVelocity)) { angularVelocity += applyVelocity; } - else + else if (Math.abs(angularVelocity - applyVelocity) > Math.abs(targetVelocity)) { angularVelocity -= applyVelocity; } - /** - * Set all current rotations - */ + /** Set all current rotations */ // adjacentMech.angle = Math.abs(angle) * (adjacentMech.angle >= 0 ? 1 : -1); } } } onUpdate(); + prev_angle = angle; } protected void onUpdate() @@ -179,7 +187,7 @@ public class MechanicalNode extends Node toFlip = new HashSet(); + if (!world.isRemote && tileEntity instanceof TileTurbineBase) + { + Set toFlip = new HashSet(); - if (!((TileTurbine) tileEntity).getMultiBlock().isConstructed()) - { - toFlip.add((TileTurbine) tileEntity); - } - else - { - Set str = ((TileTurbine) tileEntity).getMultiBlock().getPrimary().getMultiBlock().getStructure(); + if (!((TileTurbineBase) tileEntity).getMultiBlock().isConstructed()) + { + toFlip.add((TileTurbineBase) tileEntity); + } + else + { + Set str = ((TileTurbineBase) tileEntity).getMultiBlock().getPrimary().getMultiBlock().getStructure(); - if (str != null) - toFlip.addAll(str); - } + if (str != null) + toFlip.addAll(str); + } - for (TileTurbine turbine : toFlip) - { - if (side == turbine.getDirection().ordinal()) - world.setBlockMetadataWithNotify(turbine.xCoord, turbine.yCoord, turbine.zCoord, side ^ 1, 3); - else - world.setBlockMetadataWithNotify(turbine.xCoord, turbine.yCoord, turbine.zCoord, side, 3); - } - } + for (TileTurbineBase turbine : toFlip) + { + if (side == turbine.getDirection().ordinal()) + world.setBlockMetadataWithNotify(turbine.xCoord, turbine.yCoord, turbine.zCoord, side ^ 1, 3); + else + world.setBlockMetadataWithNotify(turbine.xCoord, turbine.yCoord, turbine.zCoord, side, 3); + } + } - return true; - } + return true; + } } diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockTurbineBase.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockTurbineBase.java new file mode 100644 index 000000000..c12daf1db --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockTurbineBase.java @@ -0,0 +1,62 @@ +package resonantinduction.mechanical.energy.turbine; + +import net.minecraft.block.material.Material; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockRotatable; + +/* + * Turbine block, extend this. + */ +public class BlockTurbineBase extends BlockRotatable +{ + public BlockTurbineBase(int id, Material material) + { + super(id, material); + rotationMask = Byte.parseByte("000001", 2); + } + + @Override + public boolean onUseWrench(World world, int x, int y, int z, EntityPlayer player, int side, float hitX, float hitY, float hitZ) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + + if (tileEntity instanceof TileTurbineBase) + { + if (!world.isRemote) + { + return ((TileTurbineBase) tileEntity).getMultiBlock().toggleConstruct(); + } + + return true; + } + + return false; + } + + @Override + public void breakBlock(World world, int x, int y, int z, int par5, int par6) + { + TileEntity tileEntity = world.getBlockTileEntity(x, y, z); + + if (tileEntity instanceof TileTurbineBase) + { + ((TileTurbineBase) tileEntity).getMultiBlock().deconstruct(); + } + + super.breakBlock(world, x, y, z, par5, par6); + } + + @Override + public boolean renderAsNormalBlock() + { + return false; + } + + @Override + public boolean isOpaqueCube() + { + return false; + } +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWaterTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWaterTurbine.java index 4da909d9b..4fabfee43 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWaterTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWaterTurbine.java @@ -6,7 +6,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import calclavia.lib.render.block.BlockRenderingHandler; +import resonant.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWindTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWindTurbine.java index 97a129fe9..f1146f136 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWindTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/BlockWindTurbine.java @@ -6,7 +6,7 @@ import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import calclavia.lib.render.block.BlockRenderingHandler; +import resonant.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWaterTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWaterTurbine.java index c5a9bba17..210fdbcf4 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWaterTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWaterTurbine.java @@ -8,9 +8,9 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java index 430188e0b..b2f332641 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/RenderWindTurbine.java @@ -8,9 +8,9 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWaterTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWaterTurbine.java index d99ab17f9..95731b909 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWaterTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWaterTurbine.java @@ -3,10 +3,10 @@ package resonantinduction.mechanical.energy.turbine; import java.util.HashMap; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.schematic.Schematic; +import resonant.lib.type.Pair; import resonantinduction.mechanical.Mechanical; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; -import calclavia.lib.schematic.Schematic; public class SchematicWaterTurbine extends Schematic { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWindTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWindTurbine.java index 2cc6c0421..6e9ea3d5d 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWindTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/SchematicWindTurbine.java @@ -3,10 +3,10 @@ package resonantinduction.mechanical.energy.turbine; import java.util.HashMap; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.schematic.Schematic; +import resonant.lib.type.Pair; import resonantinduction.mechanical.Mechanical; import universalelectricity.api.vector.Vector3; -import calclavia.lib.type.Pair; -import calclavia.lib.schematic.Schematic; public class SchematicWindTurbine extends Schematic { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java index 57b1ee5cb..65029fde1 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileMechanicalTurbine.java @@ -3,18 +3,16 @@ package resonantinduction.mechanical.energy.turbine; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IMechanicalNode; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; +import resonant.lib.network.Synced; +import resonant.lib.network.Synced.SyncedInput; +import resonant.lib.network.Synced.SyncedOutput; import resonantinduction.mechanical.energy.grid.MechanicalNode; -import universalelectricity.api.energy.EnergyStorageHandler; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.network.Synced; -import calclavia.lib.network.Synced.SyncedInput; -import calclavia.lib.network.Synced.SyncedOutput; -import calclavia.lib.prefab.turbine.TileTurbine; //TODO: MC 1.7, merge turbines in. -public class TileMechanicalTurbine extends TileTurbine implements INodeProvider +public class TileMechanicalTurbine extends TileTurbineBase implements INodeProvider { protected MechanicalNode mechanicalNode; @Synced(1) @@ -66,7 +64,6 @@ public class TileMechanicalTurbine extends TileTurbine implements INodeProvider public TileMechanicalTurbine() { super(); - energy = new EnergyStorageHandler(0); mechanicalNode = new TurbineNode(this); } @@ -119,7 +116,7 @@ public class TileMechanicalTurbine extends TileTurbine implements INodeProvider if (mechanicalNode.angularVelocity < 0) angularVelocity = -Math.abs(angularVelocity); - mechanicalNode.apply((torque - mechanicalNode.getTorque()) / 10, (angularVelocity - mechanicalNode.getAngularVelocity()) / 10); + mechanicalNode.apply(this, (torque - mechanicalNode.getTorque()) / 10, (angularVelocity - mechanicalNode.getAngularVelocity()) / 10); } } diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileTurbineBase.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileTurbineBase.java new file mode 100644 index 000000000..2ad38ce3d --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileTurbineBase.java @@ -0,0 +1,217 @@ +package resonantinduction.mechanical.energy.turbine; + +import java.util.HashSet; +import java.util.Set; + +import net.minecraft.block.material.Material; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.packet.Packet; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; +import resonant.core.ResonantEngine; +import resonant.lib.References; +import resonant.lib.content.module.TileBase; +import resonant.lib.multiblock.IMultiBlockStructure; +import resonant.lib.network.Synced; +import resonant.lib.network.Synced.SyncedInput; +import resonant.lib.network.Synced.SyncedOutput; +import universalelectricity.api.vector.Vector3; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** Reduced version of the main turbine class */ +public abstract class TileTurbineBase extends TileBase implements IMultiBlockStructure +{ + /** Radius of large turbine? */ + public int multiBlockRadius = 1; + + /** Max power in watts. */ + protected long maxPower; + + /** The power of the turbine this tick. In joules/tick */ + public long power = 0; + + /** Current rotation of the turbine in radians. */ + public float rotation = 0; + + protected final long defaultTorque = 5000; + protected long torque = defaultTorque; + protected float prevAngularVelocity = 0; + + @Synced(1) + protected float angularVelocity = 0; + @Synced + public int tier = 0; + + public TileTurbineBase() + { + super(Material.wood); + } + + public ForgeDirection getDirection() + { + return ForgeDirection.getOrientation(getBlockMetadata()); + } + + @Override + public void initiate() + { + super.initiate(); + } + + @Override + public void updateEntity() + { + super.updateEntity(); + + getMultiBlock().update(); + + if (getMultiBlock().isPrimary()) + { + if (!worldObj.isRemote) + { + /** Set angular velocity based on power and torque. */ + angularVelocity = (float) ((double) power / torque); + + if (!worldObj.isRemote && ticks % 3 == 0 && prevAngularVelocity != angularVelocity) + { + sendPowerUpdate(); + prevAngularVelocity = angularVelocity; + } + + if (power > 0) + onProduce(); + } + + if (angularVelocity != 0) + { + playSound(); + + /** Update rotation. */ + rotation = (float) ((rotation + angularVelocity / 20) % (Math.PI * 2)); + } + } + + if (!worldObj.isRemote) + power = 0; + } + + protected long getMaxPower() + { + if (this.getMultiBlock().isConstructed()) + { + return (long) (maxPower * getArea()); + } + + return maxPower; + } + + public int getArea() + { + return (int) (((multiBlockRadius + 0.5) * 2) * ((multiBlockRadius + 0.5) * 2)); + } + + public void onProduce() + { + } + + public void playSound() + { + + } + + @Override + public Packet getDescriptionPacket() + { + return References.PACKET_ANNOTATION.getPacket(this); + } + + public void sendPowerUpdate() + { + References.PACKET_ANNOTATION.sync(this, 1); + } + + /** Reads a tile entity from NBT. */ + @Override + @SyncedInput + public void readFromNBT(NBTTagCompound nbt) + { + super.readFromNBT(nbt); + multiBlockRadius = nbt.getInteger("multiBlockRadius"); + getMultiBlock().load(nbt); + } + + /** Writes a tile entity to NBT. */ + @Override + @SyncedOutput + public void writeToNBT(NBTTagCompound nbt) + { + super.writeToNBT(nbt); + nbt.setInteger("multiBlockRadius", multiBlockRadius); + getMultiBlock().save(nbt); + } + + @Override + @SideOnly(Side.CLIENT) + public AxisAlignedBB getRenderBoundingBox() + { + return AxisAlignedBB.getAABBPool().getAABB(this.xCoord - multiBlockRadius, this.yCoord - multiBlockRadius, this.zCoord - multiBlockRadius, this.xCoord + 1 + multiBlockRadius, this.yCoord + 1 + multiBlockRadius, this.zCoord + 1 + multiBlockRadius); + } + + /** MutliBlock methods. */ + private TurbineMBlockHandler multiBlock; + + @Override + public Vector3[] getMultiBlockVectors() + { + Set vectors = new HashSet(); + + ForgeDirection dir = getDirection(); + int xMulti = dir.offsetX != 0 ? 0 : 1; + int yMulti = dir.offsetY != 0 ? 0 : 1; + int zMulti = dir.offsetZ != 0 ? 0 : 1; + + for (int x = -multiBlockRadius; x <= multiBlockRadius; x++) + { + for (int y = -multiBlockRadius; y <= multiBlockRadius; y++) + { + for (int z = -multiBlockRadius; z <= multiBlockRadius; z++) + { + vectors.add(new Vector3(x * xMulti, y * yMulti, z * zMulti)); + } + } + } + + return vectors.toArray(new Vector3[0]); + } + + @Override + public Vector3 getPosition() + { + return new Vector3(this); + } + + @Override + public TurbineMBlockHandler getMultiBlock() + { + if (multiBlock == null) + multiBlock = new TurbineMBlockHandler(this); + + return multiBlock; + } + + @Override + public void onMultiBlockChanged() + { + worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, getBlockType() != null ? getBlockType().blockID : 0); + worldObj.markBlockForUpdate(xCoord, yCoord, zCoord); + } + + @Override + public World getWorld() + { + return worldObj; + } + +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWaterTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWaterTurbine.java index b157e2551..746760aeb 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWaterTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWaterTurbine.java @@ -8,9 +8,10 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Vec3; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; +import resonant.api.grid.INodeProvider; +import resonantinduction.core.Settings; import resonantinduction.mechanical.energy.grid.MechanicalNode; import universalelectricity.api.vector.Vector3; -import calclavia.lib.grid.INodeProvider; import cpw.mods.fml.relauncher.ReflectionHelper; /** @@ -132,6 +133,6 @@ public class TileWaterTurbine extends TileMechanicalTurbine */ private long getWaterPower() { - return maxPower / (2 - tier + 1); + return (maxPower / (2 - tier + 1)) * Settings.WATER_POWER_RATIO; } } diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java index 5559556af..a53717125 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TileWindTurbine.java @@ -1,174 +1,115 @@ package resonantinduction.mechanical.energy.turbine; -import java.util.List; - import net.minecraft.block.Block; -import net.minecraft.entity.Entity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.biome.BiomeGenOcean; import net.minecraft.world.biome.BiomeGenPlains; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.utility.inventory.InventoryUtility; +import resonantinduction.core.Settings; import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.IBoilHandler; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.utility.inventory.InventoryUtility; -/** - * The vertical wind turbine collects airflow. - * The horizontal wind turbine collects steam from steam power plants. +/** The vertical wind turbine collects airflow. The horizontal wind turbine collects steam from steam + * power plants. * - * @author Calclavia - * - */ -public class TileWindTurbine extends TileMechanicalTurbine implements IBoilHandler + * @author Calclavia */ +public class TileWindTurbine extends TileMechanicalTurbine { - private final byte[] openBlockCache = new byte[224]; - private int checkCount = 0; - private float efficiency = 0; - private long windPower = 0; + private final byte[] openBlockCache = new byte[224]; + private int checkCount = 0; + private float efficiency = 0; + private long windPower = 0; - @Override - public void updateEntity() - { - /** - * Break under storm. - */ - if (tier == 0 && getDirection().offsetY == 0 && worldObj.isRaining() && worldObj.isThundering() && worldObj.rand.nextFloat() < 0.00000008) - { - InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Block.cloth, 1 + worldObj.rand.nextInt(2))); - InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Item.stick, 3 + worldObj.rand.nextInt(8))); - worldObj.setBlockToAir(xCoord, yCoord, zCoord); - return; - } + - /** - * Only the primary turbine ticks. - */ - if (!getMultiBlock().isPrimary()) - return; + @Override + public void updateEntity() + { + /** Break under storm. */ + if (tier == 0 && getDirection().offsetY == 0 && worldObj.isRaining() && worldObj.isThundering() && worldObj.rand.nextFloat() < 0.00000008) + { + InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Block.cloth, 1 + worldObj.rand.nextInt(2))); + InventoryUtility.dropItemStack(worldObj, new Vector3(this), new ItemStack(Item.stick, 3 + worldObj.rand.nextInt(8))); + worldObj.setBlockToAir(xCoord, yCoord, zCoord); + return; + } - /** - * If this is a vertical turbine. - */ - if (getDirection().offsetY == 0) - { - maxPower = 3000; + /** Only the primary turbine ticks. */ + if (!getMultiBlock().isPrimary()) + return; - if (ticks % 20 == 0 && !worldObj.isRemote) - computePower(); + /** If this is a vertical turbine. */ + if (getDirection().offsetY == 0) + { + maxPower = 3000; - getMultiBlock().get().power += windPower; - } - else - { - maxPower = 10000; - } + if (ticks % 20 == 0 && !worldObj.isRemote) + computePower(); - if (getMultiBlock().isConstructed()) - torque = (long) (defaultTorque / (9d / multiBlockRadius)); - else - torque = defaultTorque / 12; + getMultiBlock().get().power += windPower; + } + else + { + maxPower = 10000; + } - super.updateEntity(); - } + if (getMultiBlock().isConstructed()) + torque = (long) (defaultTorque / (9d / multiBlockRadius)); + else + torque = defaultTorque / 12; - @Override - public void onProduce() - { - super.onProduce(); + super.updateEntity(); + } - /** - * Blow entities if greater than max power. - */ - double velocity = !worldObj.isRemote ? mechanicalNode.getAngularVelocity() : renderAngularVelocity; + private void computePower() + { + int checkSize = 10; + int height = yCoord + checkCount / 28; + int deviation = checkCount % 7; + ForgeDirection checkDir; - if (velocity != 0) - { - ForgeDirection dir = getDirection(); + Vector3 check = new Vector3(this); - double affectRange = Math.abs(velocity * 2); + switch (checkCount / 7 % 4) + { + case 0: + checkDir = ForgeDirection.NORTH; + check = new Vector3(xCoord - 3 + deviation, height, zCoord - 4); + break; + case 1: + checkDir = ForgeDirection.WEST; + check = new Vector3(xCoord - 4, height, zCoord - 3 + deviation); + break; + case 2: + checkDir = ForgeDirection.SOUTH; + check = new Vector3(xCoord - 3 + deviation, height, zCoord + 4); + break; + default: + checkDir = ForgeDirection.EAST; + check = new Vector3(xCoord + 4, height, zCoord - 3 + deviation); + } - Cuboid effect = Cuboid.full().translate(new Vector3(this).translate(dir)); + byte openAirBlocks = 0; - if (getMultiBlock().isConstructed()) - { - double xMulti = dir.offsetX != 0 ? affectRange : 1; - double yMulti = dir.offsetY != 0 ? affectRange : 1; - double zMulti = dir.offsetZ != 0 ? affectRange : 1; + while (openAirBlocks < checkSize && worldObj.isAirBlock(check.intX(), check.intY(), check.intZ())) + { + check.translate(checkDir); + openAirBlocks++; + } - effect.expand(new Vector3(multiBlockRadius * xMulti, multiBlockRadius * yMulti, multiBlockRadius * zMulti)); - } - else - { - double xMulti = dir.offsetX != 0 ? affectRange : 0; - double yMulti = dir.offsetY != 0 ? affectRange : 0; - double zMulti = dir.offsetZ != 0 ? affectRange : 0; + efficiency = efficiency - openBlockCache[checkCount] + openAirBlocks; + openBlockCache[checkCount] = openAirBlocks; + checkCount = (checkCount + 1) % (openBlockCache.length - 1); - effect.expand(new Vector3(xMulti, yMulti, zMulti)); - } + float multiblockMultiplier = (multiBlockRadius + 0.5f) * 2; + float materialMultiplier = tier == 0 ? 1.1f : tier == 1 ? 0.9f : 1; - List entities = worldObj.getEntitiesWithinAABB(Entity.class, effect.toAABB()); + BiomeGenBase biome = worldObj.getBiomeGenForCoords(xCoord, zCoord); + boolean hasBonus = biome instanceof BiomeGenOcean || biome instanceof BiomeGenPlains || biome == BiomeGenBase.river; - velocity = Math.min(Math.max(velocity, -0.3), 0.3); - - for (Entity entity : entities) - { - entity.motionX += dir.offsetX * velocity / 20 * 0.3; - entity.motionY += dir.offsetY * velocity / 20 * 0.3; - entity.motionZ += dir.offsetZ * velocity / 20 * 0.3; - } - } - } - - private void computePower() - { - int checkSize = 10; - int height = yCoord + checkCount / 28; - int deviation = checkCount % 7; - ForgeDirection checkDir; - - Vector3 check = new Vector3(this); - - switch (checkCount / 7 % 4) - { - case 0: - checkDir = ForgeDirection.NORTH; - check = new Vector3(xCoord - 3 + deviation, height, zCoord - 4); - break; - case 1: - checkDir = ForgeDirection.WEST; - check = new Vector3(xCoord - 4, height, zCoord - 3 + deviation); - break; - case 2: - checkDir = ForgeDirection.SOUTH; - check = new Vector3(xCoord - 3 + deviation, height, zCoord + 4); - break; - default: - checkDir = ForgeDirection.EAST; - check = new Vector3(xCoord + 4, height, zCoord - 3 + deviation); - } - - byte openAirBlocks = 0; - - while (openAirBlocks < checkSize && worldObj.isAirBlock(check.intX(), check.intY(), check.intZ())) - { - check.translate(checkDir); - openAirBlocks++; - } - - efficiency = efficiency - openBlockCache[checkCount] + openAirBlocks; - openBlockCache[checkCount] = openAirBlocks; - checkCount = (checkCount + 1) % (openBlockCache.length - 1); - - float multiblockMultiplier = (multiBlockRadius + 0.5f) * 2; - float materialMultiplier = tier == 0 ? 1.1f : tier == 1 ? 0.9f : 1; - - BiomeGenBase biome = worldObj.getBiomeGenForCoords(xCoord, zCoord); - boolean hasBonus = biome instanceof BiomeGenOcean || biome instanceof BiomeGenPlains || biome == BiomeGenBase.river; - - float windSpeed = (worldObj.rand.nextFloat() / 8) + (yCoord / 256f) * (hasBonus ? 1.2f : 1) + worldObj.getRainStrength(1.5f); - windPower = (long) Math.min(materialMultiplier * multiblockMultiplier * windSpeed * efficiency, maxPower); - } + float windSpeed = (worldObj.rand.nextFloat() / 8) + (yCoord / 256f) * (hasBonus ? 1.2f : 1) + worldObj.getRainStrength(1.5f); + windPower = (long) Math.min(materialMultiplier * multiblockMultiplier * windSpeed * efficiency * Settings.WIND_POWER_RATIO, maxPower * Settings.WIND_POWER_RATIO); + } } diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TurbineMBlockHandler.java b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TurbineMBlockHandler.java new file mode 100644 index 000000000..3280f4185 --- /dev/null +++ b/mechanical/src/main/scala/resonantinduction/mechanical/energy/turbine/TurbineMBlockHandler.java @@ -0,0 +1,28 @@ +package resonantinduction.mechanical.energy.turbine; + +import net.minecraft.tileentity.TileEntity; +import resonant.lib.multiblock.MultiBlockHandler; +import universalelectricity.api.vector.Vector3; + +public class TurbineMBlockHandler extends MultiBlockHandler +{ + public TurbineMBlockHandler(TileTurbineBase wrapper) + { + super(wrapper); + } + + public TileTurbineBase getWrapperAt(Vector3 position) + { + TileEntity tile = position.getTileEntity(self.getWorld()); + + if (tile != null && wrapperClass.isAssignableFrom(tile.getClass())) + { + if (((TileTurbineBase) tile).getDirection() == self.getDirection() && ((TileTurbineBase) tile).tier == self.tier) + { + return (TileTurbineBase) tile; + } + } + + return null; + } +} diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.java b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.java index 96bf2e958..38587494f 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/ItemPipe.java @@ -9,10 +9,10 @@ import net.minecraft.world.World; import org.lwjgl.input.Keyboard; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LanguageUtility; import universalelectricity.api.energy.UnitDisplay; import universalelectricity.api.energy.UnitDisplay.Unit; -import calclavia.lib.render.EnumColor; -import calclavia.lib.utility.LanguageUtility; import codechicken.lib.vec.BlockCoord; import codechicken.lib.vec.Vector3; import codechicken.multipart.JItemMultiPart; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.java b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.java index 1f9338505..3751885d2 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/PartPipe.java @@ -11,13 +11,13 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import resonant.lib.type.EvictingList; +import resonant.lib.utility.WorldUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.core.grid.fluid.FluidPressureNode; import resonantinduction.core.grid.fluid.IPressureNodeProvider; import resonantinduction.core.prefab.part.PartFramedNode; import resonantinduction.mechanical.Mechanical; -import calclavia.lib.type.EvictingList; -import calclavia.lib.utility.WorldUtility; import codechicken.lib.data.MCDataInput; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.IconTransformation; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.java b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.java index af2a57534..c50efccd1 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/pipe/RenderPipe.java @@ -12,11 +12,11 @@ import net.minecraftforge.fluids.FluidStack; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.FluidRenderUtility; +import resonant.lib.render.RenderUtility; +import resonant.lib.utility.WorldUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.FluidRenderUtility; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; -import calclavia.lib.utility.WorldUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/RenderPump.java b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/RenderPump.java index 2ab67b5e7..4d0be3faf 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/RenderPump.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/RenderPump.java @@ -11,8 +11,8 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; public class RenderPump extends TileEntitySpecialRenderer { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.java b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.java index b4cbbe8ca..5726fa821 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/fluid/transport/TilePump.java @@ -7,13 +7,13 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import resonant.api.IRotatable; +import resonant.api.grid.INode; import resonantinduction.core.grid.fluid.FluidPressureNode; import resonantinduction.core.grid.fluid.IPressureNodeProvider; import resonantinduction.mechanical.energy.grid.TileMechanical; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.vector.Vector3; -import calclavia.lib.grid.INode; -import calclavia.lib.prefab.tile.IRotatable; public class TilePump extends TileMechanical implements IPressureNodeProvider, IRotatable { diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockManipulator.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockManipulator.java index f6887ee66..796a59397 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockManipulator.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockManipulator.java @@ -5,9 +5,9 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatMessageComponent; import net.minecraft.world.World; +import resonant.lib.render.block.BlockRenderingHandler; import resonantinduction.core.prefab.imprint.BlockImprintable; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockRejector.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockRejector.java index d90313b3d..3953ba8c7 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockRejector.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/BlockRejector.java @@ -4,10 +4,10 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.Icon; import net.minecraft.world.World; +import resonant.lib.render.block.BlockRenderingHandler; import resonantinduction.core.Reference; import resonantinduction.core.prefab.imprint.BlockImprintable; import universalelectricity.api.UniversalElectricity; -import calclavia.lib.render.block.BlockRenderingHandler; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileDetector.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileDetector.java index c982080a7..261ed3633 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileDetector.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileDetector.java @@ -10,11 +10,11 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; import resonantinduction.core.ResonantInduction; import resonantinduction.core.prefab.imprint.TileFilterable; import resonantinduction.mechanical.Mechanical; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; import com.google.common.io.ByteArrayDataInput; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileManipulator.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileManipulator.java index 504d26702..3e80d3781 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileManipulator.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileManipulator.java @@ -9,14 +9,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IManipulator; +import resonant.api.IRotatable; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.utility.inventory.InternalInventoryHandler; import resonantinduction.core.ResonantInduction; import resonantinduction.core.prefab.imprint.ItemImprint; import resonantinduction.core.prefab.imprint.TileFilterable; import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.mechanical.IManipulator; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.utility.inventory.InternalInventoryHandler; import com.google.common.io.ByteArrayDataInput; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileRejector.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileRejector.java index 24c5d5308..a136946e0 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileRejector.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileRejector.java @@ -10,11 +10,11 @@ import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IEntityConveyor; +import resonant.lib.network.IPacketReceiverWithID; import resonantinduction.core.ResonantInduction; import resonantinduction.core.prefab.imprint.TileFilterable; import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.mechanical.IBelt; -import calclavia.lib.network.IPacketReceiverWithID; import com.google.common.io.ByteArrayDataInput; @@ -73,9 +73,9 @@ public class TileRejector extends TileFilterable implements IPacketReceiverWithI // entity.motionY += 0.10000000298023224D; entity.posZ += side.offsetZ; - if (!this.worldObj.isRemote && tileEntity instanceof IBelt) + if (!this.worldObj.isRemote && tileEntity instanceof IEntityConveyor) { - ((IBelt) tileEntity).ignoreEntity(entity); + ((IEntityConveyor) tileEntity).ignoreEntity(entity); } } diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileSorter.java b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileSorter.java index 5553fa883..1f98a495f 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileSorter.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/logistic/belt/TileSorter.java @@ -19,17 +19,17 @@ import net.minecraftforge.common.ForgeDirection; import org.lwjgl.opengl.GL11; +import resonant.lib.content.module.TileRender; +import resonant.lib.content.module.prefab.TileInventory; +import resonant.lib.network.Synced.SyncedInput; +import resonant.lib.network.Synced.SyncedOutput; +import resonant.lib.prefab.vector.Cuboid; +import resonant.lib.render.RenderUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import resonantinduction.core.prefab.imprint.ItemImprint; import universalelectricity.api.UniversalElectricity; import universalelectricity.api.vector.Vector3; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.content.module.prefab.TileInventory; -import calclavia.lib.network.Synced.SyncedInput; -import calclavia.lib.network.Synced.SyncedOutput; -import calclavia.lib.prefab.vector.Cuboid; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java index 0e1cd145d..3391869b1 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/RenderMechanicalPiston.java @@ -5,19 +5,21 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; +import net.minecraftforge.common.ForgeDirection; +import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.opengl.GL11; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; @SideOnly(Side.CLIENT) public class RenderMechanicalPiston extends TileEntitySpecialRenderer { - public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "rejector.tcn"); - public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "rejector.png"); + public static final IModelCustom MODEL = AdvancedModelLoader.loadModel(Reference.MODEL_DIRECTORY + "piston/mechanicalPiston.tcn"); + public static ResourceLocation TEXTURE = new ResourceLocation(Reference.DOMAIN, Reference.MODEL_PATH + "piston/mechanicalPiston_iron.png"); @Override public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float f) @@ -25,43 +27,53 @@ public class RenderMechanicalPiston extends TileEntitySpecialRenderer GL11.glPushMatrix(); GL11.glTranslated(x + 0.5, y + 0.5, z + 0.5); TileMechanicalPiston tile = (TileMechanicalPiston) tileEntity; + GL11.glRotated(-90, 0, 1, 0); + GL11.glRotated(180, 0, 0, 1); if (tile.worldObj != null) + { RenderUtility.rotateBlockBasedOnDirection(tile.getDirection()); + } RenderUtility.bind(TEXTURE); // Angle in radians of the rotor. - float angle = (float) tile.mechanicalNode.angle; - float radius = 0.5f; - // Length of piston arm - float length = 0.8f; - - double beta = Math.asin((radius * Math.sin(angle)) / (length / 2)); - - /** - * Render Piston Rod - */ - GL11.glPushMatrix(); - double pistonTranslateX = 2 * length * Math.cos(beta); - double pistonTranslateY = 2 * length * Math.sin(beta); - - GL11.glTranslated(0, pistonTranslateY, pistonTranslateX); - GL11.glRotated(-Math.toDegrees(beta), 1, 0, 0); - // MODEL.renderOnly("PistonShaft", "PistonFace", "PistonFace2"); - GL11.glPopMatrix(); + double angle = tile.mechanicalNode.angle; + final String[] staticParts = { "baseRing", "leg1", "leg2", "leg3", "leg4", "connector", "basePlate", "basePlateTop", "connectorBar", "centerPiston" }; + final String[] shaftParts = { "topPlate", "outerPiston" }; /** * Render Piston Rotor */ GL11.glPushMatrix(); - // TODO: Temporary, unless new models come out. - GL11.glTranslated(0, 0, (0.06 * Math.sin(angle)) - 0.01); - MODEL.renderOnly("PistonShaft", "PistonFace", "PistonFace2"); + GL11.glRotated(-Math.toDegrees(angle), 0, 0, 1); + MODEL.renderAllExcept(ArrayUtils.addAll(shaftParts, staticParts)); GL11.glPopMatrix(); - MODEL.renderAllExcept("PistonShaft", "PistonFace", "PistonFace2"); + /** + * Render Piston Shaft + */ + GL11.glPushMatrix(); + + if (tile.worldObj != null) + { + ForgeDirection dir = tile.getDirection(); + + if (tile.world().isAirBlock(tile.x() + dir.offsetX, tile.y() + dir.offsetY, tile.z() + dir.offsetZ)) + { + GL11.glTranslated(0, 0, (0.4 * Math.sin(angle)) - 0.5); + } + else + { + GL11.glTranslated(0, 0, (0.06 * Math.sin(angle)) - 0.03); + } + } + + MODEL.renderOnly(shaftParts); + GL11.glPopMatrix(); + + MODEL.renderOnly(staticParts); GL11.glPopMatrix(); } } \ No newline at end of file diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java index 83f3c1cbf..e602ab833 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/crusher/TileMechanicalPiston.java @@ -9,15 +9,15 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IRotatable; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.config.Config; +import resonant.lib.utility.MovementUtility; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.ResonantInduction; import resonantinduction.mechanical.energy.grid.TileMechanical; import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.lib.config.Config; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.utility.MovementUtility; -import calclavia.lib.utility.inventory.InventoryUtility; import cpw.mods.fml.common.Loader; import cpw.mods.fml.relauncher.ReflectionHelper; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TileBreaker.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TileBreaker.java index 58ce7a10d..377f03ff1 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TileBreaker.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TileBreaker.java @@ -1,15 +1,7 @@ package resonantinduction.mechanical.process.edit; -import calclavia.lib.content.module.TileBase; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.render.RotatedTextureRenderer; -import calclavia.lib.utility.inventory.InternalInventoryHandler; -import com.google.common.io.ByteArrayDataInput; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.ArrayList; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; @@ -20,11 +12,21 @@ import net.minecraft.network.packet.Packet; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IRotatable; +import resonant.lib.content.module.TileBase; +import resonant.lib.content.module.TileRender; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.render.RotatedTextureRenderer; +import resonant.lib.utility.inventory.InternalInventoryHandler; import resonantinduction.core.ResonantInduction; import universalelectricity.api.vector.Vector3; import universalelectricity.api.vector.VectorWorld; -import java.util.ArrayList; +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * @author tgame14 diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TilePlacer.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TilePlacer.java index 59aa32767..beb07b736 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TilePlacer.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/edit/TilePlacer.java @@ -1,18 +1,7 @@ package resonantinduction.mechanical.process.edit; -import calclavia.lib.content.module.TileRender; -import calclavia.lib.content.module.prefab.TileInventory; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.render.RenderItemOverlayUtility; -import calclavia.lib.render.RotatedTextureRenderer; -import calclavia.lib.utility.LanguageUtility; -import calclavia.lib.utility.inventory.InternalInventoryHandler; -import calclavia.lib.utility.inventory.InventoryUtility; -import com.google.common.io.ByteArrayDataInput; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.EnumSet; + import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -23,11 +12,26 @@ import net.minecraft.util.ChatMessageComponent; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraftforge.common.ForgeDirection; + import org.lwjgl.opengl.GL11; + +import resonant.api.IRotatable; +import resonant.lib.content.module.TileRender; +import resonant.lib.content.module.prefab.TileInventory; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketHandler; +import resonant.lib.render.RenderItemOverlayUtility; +import resonant.lib.render.RotatedTextureRenderer; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.inventory.InternalInventoryHandler; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.ResonantInduction; import universalelectricity.api.vector.Vector3; -import java.util.EnumSet; +import com.google.common.io.ByteArrayDataInput; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * @author tgame14 diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/RenderGrindingWheel.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/RenderGrindingWheel.java index ed9695148..8db681935 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/RenderGrindingWheel.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/RenderGrindingWheel.java @@ -10,8 +10,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.client.model.AdvancedModelLoader; import net.minecraftforge.client.model.IModelCustom; import net.minecraftforge.common.ForgeDirection; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java index f71dbe77d..416d0ea24 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/grinder/TileGrindingWheel.java @@ -7,20 +7,17 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.DamageSource; import net.minecraftforge.common.ForgeDirection; - -import org.apache.commons.lang3.ArrayUtils; - +import resonant.api.IMechanicalNode; +import resonant.api.IRotatable; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.lib.prefab.vector.Cuboid; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.Timer; import resonantinduction.mechanical.energy.grid.TileMechanical; import universalelectricity.api.vector.Vector3; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.prefab.tile.IRotatable; -import calclavia.lib.prefab.vector.Cuboid; /** * @author Calclavia diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/RenderMixer.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/RenderMixer.java index 517e7ed1a..87d3eaec3 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/RenderMixer.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/RenderMixer.java @@ -13,9 +13,9 @@ import net.minecraftforge.client.model.IModelCustom; import org.lwjgl.opengl.GL11; +import resonant.api.items.ISimpleItemRenderer; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; -import calclavia.lib.render.RenderUtility; -import calclavia.lib.render.item.ISimpleItemRenderer; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/TileMixer.java b/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/TileMixer.java index 649c5aeae..58bace684 100644 --- a/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/TileMixer.java +++ b/mechanical/src/main/scala/resonantinduction/mechanical/process/purifier/TileMixer.java @@ -1,8 +1,9 @@ package resonantinduction.mechanical.process.purifier; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.resonantinduction.IMechanicalNode; -import calclavia.lib.utility.inventory.InventoryUtility; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + import net.minecraft.block.Block; import net.minecraft.block.BlockFluid; import net.minecraft.block.material.Material; @@ -14,6 +15,9 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.AxisAlignedBB; import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.IFluidBlock; +import resonant.api.IMechanicalNode; +import resonant.api.recipe.MachineRecipes; +import resonant.lib.utility.inventory.InventoryUtility; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.Timer; @@ -22,10 +26,6 @@ import resonantinduction.core.resource.fluid.BlockFluidMixture; import resonantinduction.mechanical.energy.grid.TileMechanical; import universalelectricity.api.vector.Vector3; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; - /** * @author Calclavia */ @@ -34,6 +34,8 @@ public class TileMixer extends TileMechanical implements IInventory public static final long POWER = 500000; public static final int PROCESS_TIME = 12 * 20; public static final Timer timer = new Timer(); + + private boolean areaBlockedFromMoving = false; public TileMixer() { @@ -60,6 +62,7 @@ public class TileMixer extends TileMechanical implements IInventory { if (!world().isRemote && ticks % 20 == 0) { + this.areaBlockedFromMoving = false; for (int x = -1; x <= 1; x++) { for (int z = -1; z <= 1; z++) @@ -71,8 +74,7 @@ public class TileMixer extends TileMechanical implements IInventory if (block != null && !(block instanceof IFluidBlock) && !(block instanceof BlockFluid)) { - block.dropBlockAsItem(world(), x(), y(), z(), 0, 0); - position().setBlock(0); + this.areaBlockedFromMoving = true; return; } } @@ -95,7 +97,7 @@ public class TileMixer extends TileMechanical implements IInventory */ public boolean canWork() { - return mechanicalNode.getAngularVelocity() != 0; + return mechanicalNode.getAngularVelocity() != 0 && areaBlockedFromMoving; } public void doWork() @@ -143,13 +145,12 @@ public class TileMixer extends TileMechanical implements IInventory if (timeLeft <= 0) { - if (this.doneWork(processingItem)) + if (doneWork(processingItem)) { if (--processingItem.getEntityItem().stackSize <= 0) { processingItem.setDead(); timer.remove(processingItem); - processingItem = null; } else { @@ -170,7 +171,6 @@ public class TileMixer extends TileMechanical implements IInventory else { timer.remove(processingItem); - processingItem = null; } } @@ -190,20 +190,24 @@ public class TileMixer extends TileMechanical implements IInventory if (mixPosition.getBlockID(world()) != blockID()) { Block block = Block.blocksList[mixPosition.getBlockID(worldObj)]; + Block blockFluidFinite = ResourceGenerator.getMixture(ResourceGenerator.getName(entity.getEntityItem())); - if (block instanceof BlockFluidMixture) + if (blockFluidFinite != null) { - ItemStack itemStack = entity.getEntityItem().copy(); - - if (((BlockFluidMixture) block).mix(worldObj, mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), itemStack)) + if (block instanceof BlockFluidMixture) { - worldObj.notifyBlocksOfNeighborChange(mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), mixPosition.getBlockID(worldObj)); - return true; + ItemStack itemStack = entity.getEntityItem().copy(); + + if (((BlockFluidMixture) block).mix(worldObj, mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), itemStack)) + { + worldObj.notifyBlocksOfNeighborChange(mixPosition.intX(), mixPosition.intY(), mixPosition.intZ(), mixPosition.getBlockID(worldObj)); + return true; + } + } + else if (block != null && (block.blockID == Block.waterStill.blockID || block.blockID == Block.waterMoving.blockID)) + { + mixPosition.setBlock(worldObj, blockFluidFinite.blockID); } - } - else if (block != null && (block.blockID == Block.waterStill.blockID || block.blockID == Block.waterMoving.blockID)) - { - mixPosition.setBlock(worldObj, ResourceGenerator.getMixture(ResourceGenerator.getName(entity.getEntityItem())).blockID); } } diff --git a/src/api/java/mcp/mobius/waila/api/IWailaBlock.java b/src/api/java/mcp/mobius/waila/api/IWailaBlock.java new file mode 100644 index 000000000..8b4dd131e --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaBlock.java @@ -0,0 +1,34 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +@Deprecated +public interface IWailaBlock { + /* + * Use this method to return an item stack in case the default lookup system fails. + * Return null if you want to use the default lookup system. + * You get the world, the player and the location of the block. With that, it is easy to gather information & tile entities + */ + ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); + + /* Waila HUD is divided into 3 zones. The head corresponds to the item name, + * body to where you mostly want to put informations, and I reserve the tail for modname display + */ + + /* Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. + * You get in input world, player and the block location. You also get the itemstack as returned by the default lookup system or getWailaStack(). + * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the configuration. Refer the ConfigHandler class for more info. + * currenttip represents the current list of text lines in the tooltip zone. + * For example, getWailaHead() will have the current item name as currenttip. + * You can modify the tips, add more, remove some, etc. + * When you are done, just returns the currenttip and it will display in Waila. + * + * Always return the currenttip is you don't want to modify the current zone. + */ + + List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java b/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java new file mode 100644 index 000000000..935d475fa --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaBlockDecorator.java @@ -0,0 +1,9 @@ +package mcp.mobius.waila.api; + +import net.minecraft.item.ItemStack; + +public interface IWailaBlockDecorator { + + void decorateBlock(ItemStack itemStack, IWailaDataAccessor accessor, IWailaConfigHandler config); + +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java b/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java new file mode 100644 index 000000000..faede63f6 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaConfigHandler.java @@ -0,0 +1,28 @@ +package mcp.mobius.waila.api; + +import java.util.HashMap; +import java.util.Set; + +public interface IWailaConfigHandler { + /* Returns a set of all the currently loaded modules in the config handler */ + public Set getModuleNames(); + + /* Returns all the currently available options for a given module */ + public HashMap getConfigKeys(String modName); + + /* Add a new option to a given module + * + * modName is the name of the module to add the option to (ie : Buildcraft, IndustrialCraft2, etc) + * key is the config key (ie : bc.tankcontent, ic2.inputvalue) + * name is the human readable name of the option (ie : "Tank content", "Max EU Input") + * */ + //public void addConfig(String modName, String key, String name); + + /* Returns the current value of an option (true/false) with a default value defvalue if not set*/ + public boolean getConfig(String key, boolean defvalue); + + /* Returns the current value of an option (true/false) with a default value true if not set*/ + public boolean getConfig(String key); + + //public void setConfig(String key, boolean value); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java new file mode 100644 index 000000000..5eade35f3 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaDataAccessor.java @@ -0,0 +1,33 @@ +package mcp.mobius.waila.api; + +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaDataAccessor { + + World getWorld(); + EntityPlayer getPlayer(); + Block getBlock(); + int getBlockID(); + int getMetadata(); + TileEntity getTileEntity(); + MovingObjectPosition getPosition(); + Vec3 getRenderingPosition(); + NBTTagCompound getNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); + ForgeDirection getSide(); + ItemStack getStack(); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java new file mode 100644 index 000000000..4859d9cd3 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaDataProvider.java @@ -0,0 +1,33 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IWailaDataProvider{ + /* + * Use this method to return an item stack in case the default lookup system fails. + * Return null if you want to use the default lookup system. + * You get the world, the player and the location of the block. With that, it is easy to gather information & tile entities + */ + ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config); + + /* Waila HUD is divided into 3 zones. The head corresponds to the item name, + * body to where you mostly want to put informations, and I reserve the tail for modname display + */ + + /* Those 2 methods works exactly the same way, except they are related to a different zone in Waila HUD. + * You get in input world, player and the block location. You also get the itemstack as returned by the default lookup system or getWailaStack(). + * ConfigHandler provides the current Waila config state so you can show/hide elements depending on the configuration. Refer the ConfigHandler class for more info. + * currenttip represents the current list of text lines in the tooltip zone. + * For example, getWailaHead() will have the current item name as currenttip. + * You can modify the tips, add more, remove some, etc. + * When you are done, just returns the currenttip and it will display in Waila. + * + * Always return the currenttip is you don't want to modify the current zone. + */ + + List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java new file mode 100644 index 000000000..788067afc --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaEntityAccessor.java @@ -0,0 +1,24 @@ +package mcp.mobius.waila.api; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaEntityAccessor { + World getWorld(); + EntityPlayer getPlayer(); + Entity getEntity(); + MovingObjectPosition getPosition(); + Vec3 getRenderingPosition(); + NBTTagCompound getNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java new file mode 100644 index 000000000..9548289aa --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaEntityProvider.java @@ -0,0 +1,16 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.entity.Entity; + +public interface IWailaEntityProvider { + + /* A way to get an override on the entity returned by the raytracing */ + Entity getWailaOverride(IWailaEntityAccessor accessor, IWailaConfigHandler config); + + /* The classical HEAD/BODY/TAIL text getters */ + List getWailaHead(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); + List getWailaBody(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); + List getWailaTail(Entity entity, List currenttip, IWailaEntityAccessor accessor, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java new file mode 100644 index 000000000..e30afc435 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaFMPAccessor.java @@ -0,0 +1,28 @@ +package mcp.mobius.waila.api; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; +import net.minecraft.world.World; +import net.minecraftforge.common.ForgeDirection; + +/* The Accessor is used to get some basic data out of the game without having to request + * direct access to the game engine. + * It will also return things that are unmodified by the overriding systems (like getWailaStack). + */ + +public interface IWailaFMPAccessor { + World getWorld(); + EntityPlayer getPlayer(); + TileEntity getTileEntity(); + MovingObjectPosition getPosition(); + NBTTagCompound getNBTData(); + NBTTagCompound getFullNBTData(); + int getNBTInteger(NBTTagCompound tag, String keyname); + double getPartialFrame(); + Vec3 getRenderingPosition(); + String getID(); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java new file mode 100644 index 000000000..839af31f9 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaFMPDecorator.java @@ -0,0 +1,7 @@ +package mcp.mobius.waila.api; + +import net.minecraft.item.ItemStack; + +public interface IWailaFMPDecorator { + void decorateBlock(ItemStack itemStack, IWailaFMPAccessor accessor, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java new file mode 100644 index 000000000..232c83eff --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaFMPProvider.java @@ -0,0 +1,12 @@ +package mcp.mobius.waila.api; + +import java.util.List; + +import net.minecraft.item.ItemStack; + +public interface IWailaFMPProvider { + /* The classical HEAD/BODY/TAIL text getters */ + List getWailaHead(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); + List getWailaBody(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); + List getWailaTail(ItemStack itemStack, List currenttip, IWailaFMPAccessor accessor, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java b/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java new file mode 100644 index 000000000..833f77159 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaRegistrar.java @@ -0,0 +1,56 @@ +package mcp.mobius.waila.api; + +public interface IWailaRegistrar { + /* Add a config option in the section modname with displayed text configtext and access key keyname */ + public void addConfig(String modname, String keyname, String configtext); + public void addConfigRemote(String modname, String keyname, String configtext); + public void addConfig(String modname, String keyname); + public void addConfigRemote(String modname, String keyname); + + /* Register a IWailaDataProvider for the given blockID, either for the Head section or the Body section */ + @Deprecated + public void registerHeadProvider (IWailaDataProvider dataProvider, int blockID); + @Deprecated + public void registerBodyProvider (IWailaDataProvider dataProvider, int blockID); + @Deprecated + public void registerTailProvider (IWailaDataProvider dataProvider, int blockID); + + /* Register a stack overrider for the given blockID */ + @Deprecated + public void registerStackProvider(IWailaDataProvider dataProvider, int blockID); + public void registerStackProvider(IWailaDataProvider dataProvider, Class block); + + /* Same thing, but works on a class hierarchy instead */ + public void registerHeadProvider (IWailaDataProvider dataProvider, Class block); + public void registerBodyProvider (IWailaDataProvider dataProvider, Class block); + public void registerTailProvider (IWailaDataProvider dataProvider, Class block); + + /* Entity text registration methods */ + public void registerHeadProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerBodyProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerTailProvider (IWailaEntityProvider dataProvider, Class entity); + public void registerOverrideEntityProvider (IWailaEntityProvider dataProvider, Class entity); + + /* FMP Providers */ + public void registerHeadProvider(IWailaFMPProvider dataProvider, String name); + public void registerBodyProvider(IWailaFMPProvider dataProvider, String name); + public void registerTailProvider(IWailaFMPProvider dataProvider, String name); + + /* The block decorators */ + @Deprecated + public void registerDecorator (IWailaBlockDecorator decorator, int blockID); + public void registerDecorator (IWailaBlockDecorator decorator, Class block); + public void registerDecorator (IWailaFMPDecorator decorator, String name); + + /* Selective NBT key syncing. Will register a key to sync over the network for the given class (block, te or ent). + * Accept * as a ending wildcard + * registerNBTKey("bob.*", MyBlock.class) + * registerNBTKey("data.life", MyEntity.class) + * registerNBTKey("*", MyTileEntity.class) will reproduce the full tag syncing from 1.4.5 + * */ + public void registerSyncedNBTKey(String key, Class target); + + /* UNUSED FOR NOW (Will be used for the ingame wiki */ + public void registerDocTextFile (String filename); + public void registerShortDataProvider (IWailaSummaryProvider dataProvider, Class item); +} diff --git a/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java b/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java new file mode 100644 index 000000000..f79064981 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/IWailaSummaryProvider.java @@ -0,0 +1,21 @@ +package mcp.mobius.waila.api; + +import java.util.LinkedHashMap; + +import net.minecraft.item.ItemStack; + +public interface IWailaSummaryProvider { + /* This interface is used to control the display data in the description screen */ + + /* BASIC TOOLS & ITEMS DATA */ + //EnumToolMaterial getMaterial(ItemStack stack); + //String getMaterialName(ItemStack stack); + //String getEffectiveBlock(ItemStack stack); + //int getHarvestLevel(ItemStack stack); + //float getEfficiencyOnProperMaterial(ItemStack stack); + //int getEnchantability(ItemStack stack); + //int getDamageVsEntity(ItemStack stack); + //int getDurability(ItemStack stack); + + LinkedHashMap getSummary(ItemStack stack, LinkedHashMap currentSummary, IWailaConfigHandler config); +} diff --git a/src/api/java/mcp/mobius/waila/api/SpecialChars.java b/src/api/java/mcp/mobius/waila/api/SpecialChars.java new file mode 100644 index 000000000..5bd92a820 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/SpecialChars.java @@ -0,0 +1,40 @@ +package mcp.mobius.waila.api; + +public class SpecialChars { + + public static String MCStyle = "\u00A7"; + + public static String BLACK = MCStyle + "0"; + public static String DBLUE = MCStyle + "1"; + public static String DGREEN = MCStyle + "2"; + public static String DAQUA = MCStyle + "3"; + public static String DRED = MCStyle + "4"; + public static String DPURPLE = MCStyle + "5"; + public static String GOLD = MCStyle + "6"; + public static String GRAY = MCStyle + "7"; + public static String DGRAY = MCStyle + "8"; + public static String BLUE = MCStyle + "9"; + public static String GREEN = MCStyle + "a"; + public static String AQUA = MCStyle + "b"; + public static String RED = MCStyle + "c"; + public static String LPURPLE = MCStyle + "d"; + public static String YELLOW = MCStyle + "e"; + public static String WHITE = MCStyle + "f"; + + public static String OBF = MCStyle + "k"; + public static String BOLD = MCStyle + "l"; + public static String STRIKE = MCStyle + "m"; + public static String UNDER = MCStyle + "n"; + public static String ITALIC = MCStyle + "o"; + public static String RESET = MCStyle + "r"; + + public static String WailaStyle = "\u00A4"; + public static String WailaIcon = "\u00A5"; + public static String TAB = WailaStyle + WailaStyle +"a"; + public static String ALIGNRIGHT = WailaStyle + WailaStyle +"b"; + public static String ALIGNCENTER = WailaStyle + WailaStyle +"c"; + public static String HEART = WailaStyle + WailaIcon +"a"; + public static String HHEART = WailaStyle + WailaIcon +"b"; + public static String EHEART = WailaStyle + WailaIcon +"c"; + +} diff --git a/src/api/java/mcp/mobius/waila/api/package-info.java b/src/api/java/mcp/mobius/waila/api/package-info.java new file mode 100644 index 000000000..9b5e663b4 --- /dev/null +++ b/src/api/java/mcp/mobius/waila/api/package-info.java @@ -0,0 +1,3 @@ +@API(apiVersion="1.0",owner="Waila",provides="WailaAPI") +package mcp.mobius.waila.api; +import cpw.mods.fml.common.API; \ No newline at end of file diff --git a/src/main/resources/assets/resonantinduction/languages b/src/main/resources/assets/resonantinduction/languages deleted file mode 160000 index 63935dce3..000000000 --- a/src/main/resources/assets/resonantinduction/languages +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 63935dce34b6ef16188fe2c7b3250c2158c2b574 diff --git a/src/main/resources/assets/resonantinduction/models/LaserGun.png b/src/main/resources/assets/resonantinduction/models/LaserGun.png new file mode 100644 index 000000000..6530c640e Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/LaserGun.png differ diff --git a/src/main/resources/assets/resonantinduction/models/MiningLaserGun.tcn b/src/main/resources/assets/resonantinduction/models/MiningLaserGun.tcn new file mode 100644 index 000000000..37a9c1fae Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/MiningLaserGun.tcn differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston.tcn b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston.tcn new file mode 100644 index 000000000..f298fed29 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston.tcn differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_diamond.png b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_diamond.png new file mode 100644 index 000000000..84a9456a2 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_diamond.png differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_iron.png b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_iron.png new file mode 100644 index 000000000..5f85bfddd Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_iron.png differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_stone.png b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_stone.png new file mode 100644 index 000000000..4599d3527 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_stone.png differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wood.png b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wood.png new file mode 100644 index 000000000..405ad5fdf Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wood.png differ diff --git a/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wool.png b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wool.png new file mode 100644 index 000000000..075d47d4c Binary files /dev/null and b/src/main/resources/assets/resonantinduction/models/piston/mechanicalPiston_wool.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/filter.png b/src/main/resources/assets/resonantinduction/textures/blocks/filter.png index 3509b62f7..35eb11173 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/filter.png and b/src/main/resources/assets/resonantinduction/textures/blocks/filter.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_off.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_off.png new file mode 100644 index 000000000..38969ce48 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_off.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_on.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_on.png new file mode 100644 index 000000000..1ab61bf93 Binary files /dev/null and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_front_on.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png index 95afb03cc..58fe4ec76 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_off.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png index 0921588b7..2099ec601 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_side_on.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png index 1197fd466..d9ccf6bb8 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_off.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png index eee5ff8d3..36a2a78d4 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png and b/src/main/resources/assets/resonantinduction/textures/blocks/firebox_top_on.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png b/src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png index fc5bb2d53..269acd62d 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png and b/src/main/resources/assets/resonantinduction/textures/blocks/material_steel.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png b/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png index f84e6fa0f..c2ac4beb7 100644 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png and b/src/main/resources/assets/resonantinduction/textures/blocks/material_steel_dark.png differ diff --git a/src/main/resources/assets/resonantinduction/textures/blocks/quantumGate.png b/src/main/resources/assets/resonantinduction/textures/blocks/quantumGate.png deleted file mode 100644 index 83b52a404..000000000 Binary files a/src/main/resources/assets/resonantinduction/textures/blocks/quantumGate.png and /dev/null differ diff --git a/src/main/scala/resonantinduction/core/ArgumentData.java b/src/main/scala/resonantinduction/core/ArgumentData.java index 945f1972b..653532e35 100644 --- a/src/main/scala/resonantinduction/core/ArgumentData.java +++ b/src/main/scala/resonantinduction/core/ArgumentData.java @@ -1,8 +1,8 @@ package resonantinduction.core; import net.minecraft.nbt.NBTTagCompound; -import calclavia.lib.utility.nbt.ISaveObj; -import calclavia.lib.utility.nbt.NBTUtility; +import resonant.lib.utility.nbt.ISaveObj; +import resonant.lib.utility.nbt.NBTUtility; /** * Used to store arguments in a way that can be easier to read, limit, and understand diff --git a/src/main/scala/resonantinduction/core/ClientProxy.java b/src/main/scala/resonantinduction/core/ClientProxy.java index a9b5fe4ab..229cc89cc 100644 --- a/src/main/scala/resonantinduction/core/ClientProxy.java +++ b/src/main/scala/resonantinduction/core/ClientProxy.java @@ -1,11 +1,15 @@ package resonantinduction.core; +import java.awt.Color; + import net.minecraft.block.Block; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.particle.EntityDiggingFX; import net.minecraft.client.particle.EntityFX; import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; +import resonant.lib.render.fx.FxLaser; +import universalelectricity.api.vector.IVector3; import universalelectricity.api.vector.Vector3; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.relauncher.Side; @@ -49,7 +53,7 @@ public class ClientProxy extends CommonProxy @Override public void renderBlockParticle(World world, Vector3 position, Vector3 velocity, int blockID, float scale) { - this.renderBlockParticle(world, position.x, position.y, position.z, velocity, blockID, scale); + this.renderBlockParticle(world, position.x, position.y, position.z, velocity, blockID, scale); } @Override @@ -61,4 +65,16 @@ public class ClientProxy extends CommonProxy FMLClientHandler.instance().getClient().effectRenderer.addEffect(fx); } + @Override + public void renderBeam(World world, IVector3 position, IVector3 hit, Color color, int age) + { + renderBeam(world, position, hit, color.getRed(), color.getGreen(), color.getBlue(), age); + } + + @Override + public void renderBeam(World world, IVector3 position, IVector3 target, float red, float green, float blue, int age) + { + FMLClientHandler.instance().getClient().effectRenderer.addEffect(new FxLaser(world, position, target, red, green, blue, age)); + } + } diff --git a/src/main/scala/resonantinduction/core/CommonProxy.java b/src/main/scala/resonantinduction/core/CommonProxy.java index 8da100814..9385b5a07 100644 --- a/src/main/scala/resonantinduction/core/CommonProxy.java +++ b/src/main/scala/resonantinduction/core/CommonProxy.java @@ -3,34 +3,43 @@ */ package resonantinduction.core; -import net.minecraft.world.World; -import universalelectricity.api.vector.Vector3; -import calclavia.lib.prefab.ProxyBase; +import java.awt.Color; -/** - * @author Calclavia - * - */ +import net.minecraft.world.World; +import resonant.lib.prefab.ProxyBase; +import universalelectricity.api.vector.IVector3; +import universalelectricity.api.vector.Vector3; + +/** @author Calclavia */ public class CommonProxy extends ProxyBase { - public boolean isPaused() - { - return false; - } + public boolean isPaused() + { + return false; + } - public boolean isGraphicsFancy() - { - return false; - } + public boolean isGraphicsFancy() + { + return false; + } - public void renderBlockParticle(World world, double x, double y, double z, Vector3 velocity, int blockID, float scale) + public void renderBlockParticle(World world, double x, double y, double z, Vector3 velocity, int blockID, float scale) { } - - public void renderBlockParticle(World world, Vector3 position, Vector3 velocity, int blockID, float scale) - { - } + public void renderBlockParticle(World world, Vector3 position, Vector3 velocity, int blockID, float scale) + { + + } + + public void renderBeam(World world, IVector3 position, IVector3 hit, Color color, int age) + { + } + + public void renderBeam(World world, IVector3 position, IVector3 target, float red, float green, float blue, int age) + { + + } } diff --git a/src/main/scala/resonantinduction/core/ResonantInduction.java b/src/main/scala/resonantinduction/core/ResonantInduction.java index 1f0e2e486..b4a651502 100644 --- a/src/main/scala/resonantinduction/core/ResonantInduction.java +++ b/src/main/scala/resonantinduction/core/ResonantInduction.java @@ -1,13 +1,32 @@ package resonantinduction.core; -import calclavia.lib.config.ConfigAnnotationEvent; -import calclavia.lib.config.ConfigHandler; -import calclavia.lib.content.ContentRegistry; -import calclavia.lib.network.PacketAnnotation; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.network.PacketTile; -import calclavia.lib.prefab.item.ItemBlockMetadata; -import calclavia.lib.utility.LanguageUtility; +import java.util.HashMap; +import java.util.logging.Logger; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.fluids.BlockFluidFinite; + +import org.modstats.ModstatInfo; +import org.modstats.Modstats; + +import resonant.lib.config.ConfigHandler; +import resonant.lib.content.ContentRegistry; +import resonant.lib.network.PacketAnnotation; +import resonant.lib.network.PacketHandler; +import resonant.lib.network.PacketTile; +import resonant.lib.prefab.item.ItemBlockMetadata; +import resonant.lib.utility.LanguageUtility; +import resonantinduction.core.handler.TextureHookHandler; +import resonantinduction.core.prefab.part.PacketMultiPart; +import resonantinduction.core.resource.BlockDust; +import resonantinduction.core.resource.BlockMachineMaterial; +import resonantinduction.core.resource.ItemOreResource; +import resonantinduction.core.resource.ResourceGenerator; +import resonantinduction.core.resource.TileDust; +import resonantinduction.core.resource.fluid.ItemOreResourceBucket; +import resonantinduction.core.resource.fluid.TileFluidMixture; import cpw.mods.fml.common.FMLLog; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; @@ -20,28 +39,13 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.network.NetworkMod; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.ForgeSubscribe; -import net.minecraftforge.fluids.BlockFluidFinite; -import org.modstats.ModstatInfo; -import org.modstats.Modstats; -import resonantinduction.core.handler.TextureHookHandler; -import resonantinduction.core.prefab.part.PacketMultiPart; -import resonantinduction.core.resource.*; -import resonantinduction.core.resource.fluid.ItemOreResourceBucket; -import resonantinduction.core.resource.fluid.TileFluidMixture; - -import java.util.HashMap; -import java.util.logging.Logger; /** * The core module of Resonant Induction * * @author Calclavia */ -@Mod(modid = ResonantInduction.ID, name = ResonantInduction.NAME, version = Reference.VERSION, dependencies = "required-after:ForgeMultipart@[1.0.0.244,);required-after:CalclaviaCore;before:ThermalExpansion;before:Mekanism") +@Mod(modid = ResonantInduction.ID, name = ResonantInduction.NAME, version = Reference.VERSION, dependencies = "required-after:ForgeMultipart@[1.0.0.244,);required-after:ResonantEngine;before:ThermalExpansion;before:Mekanism") @NetworkMod(channels = Reference.CHANNEL, clientSideRequired = true, serverSideRequired = false, packetHandler = PacketHandler.class) @ModstatInfo(prefix = "resonantin") public class ResonantInduction @@ -136,15 +140,6 @@ public class ResonantInduction proxy.postInit(); Settings.CONFIGURATION.save(); } -// -// @ForgeSubscribe -// public void configAnnotationAdded(ConfigAnnotationEvent event) -// { -// if (event.sourceClass.startsWith("resonantinduction")) -// { -// ConfigHandler.handleClass(event.sourceClass, Settings.CONFIGURATION); -// } -// } /** * Recipe Types diff --git a/src/main/scala/resonantinduction/core/Settings.java b/src/main/scala/resonantinduction/core/Settings.java index 73146c652..f4b72f837 100644 --- a/src/main/scala/resonantinduction/core/Settings.java +++ b/src/main/scala/resonantinduction/core/Settings.java @@ -5,9 +5,9 @@ import java.util.Arrays; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.Configuration; -import calclavia.lib.config.Config; -import calclavia.lib.content.IDManager; -import calclavia.lib.utility.LanguageUtility; +import resonant.lib.config.Config; +import resonant.lib.content.IDManager; +import resonant.lib.utility.LanguageUtility; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.ModMetadata; @@ -16,7 +16,7 @@ import cpw.mods.fml.common.ModMetadata; public class Settings { public static final Configuration CONFIGURATION = new Configuration(new File(Loader.instance().getConfigDir(), Reference.NAME + ".cfg")); - + public static final String DOMAIN = "resonantinduction"; /** IDs suggested by Jyzarc and Horfius */ public static final IDManager idManager; @@ -27,7 +27,7 @@ public class Settings CONFIGURATION.save(); } - public static int getNextBlockID() + public static int getNextBlockID() { return idManager.getNextBlockID(); } @@ -65,6 +65,13 @@ public class Settings public static double LEVITATOR_MAX_SPEED = .2; @Config(category = Configuration.CATEGORY_GENERAL, key = "Levitator Acceleration") public static double LEVITATOR_ACCELERATION = .02; + + @Config(category = "Power", key = "Wind_tubine_Ratio") + public static int WIND_POWER_RATIO = 1; + @Config(category = "Power", key = "Water_tubine_Ratio") + public static int WATER_POWER_RATIO = 1; + @Config(category = "Power", key = "Solor_Panel") + public static int SOLAR_ENERGY = 50; public static void setModMetadata(ModMetadata metadata, String id, String name) { diff --git a/src/main/scala/resonantinduction/core/fluid/TileFluidDistribution.java b/src/main/scala/resonantinduction/core/fluid/TileFluidDistribution.java index 5d3a92238..13596eb0d 100644 --- a/src/main/scala/resonantinduction/core/fluid/TileFluidDistribution.java +++ b/src/main/scala/resonantinduction/core/fluid/TileFluidDistribution.java @@ -6,8 +6,8 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; +import resonant.lib.utility.WorldUtility; import universalelectricity.api.vector.Vector3; -import calclavia.lib.utility.WorldUtility; /** * A prefab class for tiles that use the fluid network. diff --git a/src/main/scala/resonantinduction/core/fluid/TileFluidNode.java b/src/main/scala/resonantinduction/core/fluid/TileFluidNode.java index 07d5add28..ecc52fd16 100644 --- a/src/main/scala/resonantinduction/core/fluid/TileFluidNode.java +++ b/src/main/scala/resonantinduction/core/fluid/TileFluidNode.java @@ -7,12 +7,12 @@ import net.minecraft.network.packet.Packet; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; +import resonant.lib.content.module.TileBase; +import resonant.lib.network.IPacketReceiverWithID; +import resonant.lib.network.PacketHandler; +import resonant.lib.utility.FluidUtility; import resonantinduction.core.ResonantInduction; import universalelectricity.api.vector.Vector3; -import calclavia.lib.content.module.TileBase; -import calclavia.lib.network.IPacketReceiverWithID; -import calclavia.lib.network.PacketHandler; -import calclavia.lib.utility.FluidUtility; import com.google.common.io.ByteArrayDataInput; diff --git a/src/main/scala/resonantinduction/core/fluid/TilePressureNode.java b/src/main/scala/resonantinduction/core/fluid/TilePressureNode.java index 7f6c96b62..b9e07798e 100644 --- a/src/main/scala/resonantinduction/core/fluid/TilePressureNode.java +++ b/src/main/scala/resonantinduction/core/fluid/TilePressureNode.java @@ -6,10 +6,10 @@ import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.FluidTankInfo; +import resonant.api.grid.INode; +import resonant.lib.network.IPacketReceiverWithID; import resonantinduction.core.grid.fluid.FluidPressureNode; import resonantinduction.core.grid.fluid.IPressureNodeProvider; -import calclavia.lib.grid.INode; -import calclavia.lib.network.IPacketReceiverWithID; /** * A prefab class for tiles that use the fluid network. diff --git a/src/main/scala/resonantinduction/core/grid/TraitNodeProvider.java b/src/main/scala/resonantinduction/core/grid/TraitNodeProvider.java index 2438e5a02..2b436477e 100644 --- a/src/main/scala/resonantinduction/core/grid/TraitNodeProvider.java +++ b/src/main/scala/resonantinduction/core/grid/TraitNodeProvider.java @@ -1,8 +1,8 @@ package resonantinduction.core.grid; import net.minecraftforge.common.ForgeDirection; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; import codechicken.multipart.PartMap; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; diff --git a/src/main/scala/resonantinduction/core/grid/fluid/FluidPressureNode.java b/src/main/scala/resonantinduction/core/grid/fluid/FluidPressureNode.java index c230c9d89..6ae369704 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/FluidPressureNode.java +++ b/src/main/scala/resonantinduction/core/grid/fluid/FluidPressureNode.java @@ -1,8 +1,9 @@ package resonantinduction.core.grid.fluid; -import calclavia.lib.grid.Node; -import calclavia.lib.grid.TickingGrid; -import codechicken.multipart.TMultiPart; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; + import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; @@ -10,11 +11,10 @@ import net.minecraftforge.common.ForgeDirection; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; +import resonant.lib.grid.Node; +import resonant.lib.grid.TickingGrid; import universalelectricity.api.vector.Vector3; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map.Entry; +import codechicken.multipart.TMultiPart; public class FluidPressureNode extends Node { diff --git a/src/main/scala/resonantinduction/core/grid/fluid/IPressureNodeProvider.java b/src/main/scala/resonantinduction/core/grid/fluid/IPressureNodeProvider.java index e0cbc78e5..5e22db378 100644 --- a/src/main/scala/resonantinduction/core/grid/fluid/IPressureNodeProvider.java +++ b/src/main/scala/resonantinduction/core/grid/fluid/IPressureNodeProvider.java @@ -2,7 +2,7 @@ package resonantinduction.core.grid.fluid; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; -import calclavia.lib.grid.INodeProvider; +import resonant.api.grid.INodeProvider; public interface IPressureNodeProvider extends INodeProvider, IFluidHandler { diff --git a/src/main/scala/resonantinduction/core/handler/TextureHookHandler.java b/src/main/scala/resonantinduction/core/handler/TextureHookHandler.java index 7b66156e6..d79a168b1 100644 --- a/src/main/scala/resonantinduction/core/handler/TextureHookHandler.java +++ b/src/main/scala/resonantinduction/core/handler/TextureHookHandler.java @@ -3,11 +3,11 @@ package resonantinduction.core.handler; import net.minecraftforge.client.event.TextureStitchEvent; import net.minecraftforge.event.ForgeSubscribe; import net.minecraftforge.fluids.BlockFluidFinite; +import resonant.lib.render.RenderUtility; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.fluid.FluidColored; import resonantinduction.core.resource.ResourceGenerator; -import calclavia.lib.render.RenderUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/scala/resonantinduction/core/nei/RICrusherRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RICrusherRecipeHandler.java index 5bea29e58..1342b2e97 100644 --- a/src/main/scala/resonantinduction/core/nei/RICrusherRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RICrusherRecipeHandler.java @@ -1,7 +1,7 @@ package resonantinduction.core.nei; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.lib.utility.LanguageUtility; public class RICrusherRecipeHandler extends RITemplateRecipeHandler { diff --git a/src/main/scala/resonantinduction/core/nei/RIGrinderRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RIGrinderRecipeHandler.java index 8e1330610..3cd3db6dc 100644 --- a/src/main/scala/resonantinduction/core/nei/RIGrinderRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RIGrinderRecipeHandler.java @@ -1,7 +1,7 @@ package resonantinduction.core.nei; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.lib.utility.LanguageUtility; public class RIGrinderRecipeHandler extends RITemplateRecipeHandler { diff --git a/src/main/scala/resonantinduction/core/nei/RIMixerRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RIMixerRecipeHandler.java index d08cef0ba..314dbc9ee 100644 --- a/src/main/scala/resonantinduction/core/nei/RIMixerRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RIMixerRecipeHandler.java @@ -1,7 +1,7 @@ package resonantinduction.core.nei; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.lib.utility.LanguageUtility; public class RIMixerRecipeHandler extends RITemplateRecipeHandler { diff --git a/src/main/scala/resonantinduction/core/nei/RISawmillRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RISawmillRecipeHandler.java index 40b80f713..2fdbd0faf 100644 --- a/src/main/scala/resonantinduction/core/nei/RISawmillRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RISawmillRecipeHandler.java @@ -1,7 +1,7 @@ package resonantinduction.core.nei; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.lib.utility.LanguageUtility; public class RISawmillRecipeHandler extends RITemplateRecipeHandler { diff --git a/src/main/scala/resonantinduction/core/nei/RISmelterRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RISmelterRecipeHandler.java index a46e18631..ef708e9e3 100644 --- a/src/main/scala/resonantinduction/core/nei/RISmelterRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RISmelterRecipeHandler.java @@ -1,7 +1,7 @@ package resonantinduction.core.nei; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.lib.utility.LanguageUtility; public class RISmelterRecipeHandler extends RITemplateRecipeHandler { diff --git a/src/main/scala/resonantinduction/core/nei/RITemplateRecipeHandler.java b/src/main/scala/resonantinduction/core/nei/RITemplateRecipeHandler.java index 327017550..486e5f60e 100644 --- a/src/main/scala/resonantinduction/core/nei/RITemplateRecipeHandler.java +++ b/src/main/scala/resonantinduction/core/nei/RITemplateRecipeHandler.java @@ -12,14 +12,14 @@ import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; +import resonant.api.recipe.MachineRecipes; +import resonant.api.recipe.RecipeResource; +import resonant.api.recipe.RecipeResource.FluidStackResource; +import resonant.api.recipe.RecipeResource.ItemStackResource; +import resonant.api.recipe.RecipeResource.OreDictResource; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction.RecipeType; -import calclavia.api.recipe.MachineRecipes; -import calclavia.api.recipe.RecipeResource; -import calclavia.api.recipe.RecipeResource.FluidStackResource; -import calclavia.api.recipe.RecipeResource.ItemStackResource; -import calclavia.api.recipe.RecipeResource.OreDictResource; -import calclavia.lib.utility.LanguageUtility; import codechicken.core.gui.GuiDraw; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.GuiRecipe; diff --git a/src/main/scala/resonantinduction/core/prefab/imprint/BlockImprintable.java b/src/main/scala/resonantinduction/core/prefab/imprint/BlockImprintable.java index 29a0ce19f..01f3177e2 100644 --- a/src/main/scala/resonantinduction/core/prefab/imprint/BlockImprintable.java +++ b/src/main/scala/resonantinduction/core/prefab/imprint/BlockImprintable.java @@ -6,8 +6,8 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; -import calclavia.api.resonantinduction.IFilterable; -import calclavia.lib.prefab.block.BlockRotatable; +import resonant.api.IFilterable; +import resonant.lib.prefab.block.BlockRotatable; /** * Extend this block class if a filter is allowed to be placed inside of this block. diff --git a/src/main/scala/resonantinduction/core/prefab/imprint/ItemImprint.java b/src/main/scala/resonantinduction/core/prefab/imprint/ItemImprint.java index 66c7ea410..b31f55f18 100644 --- a/src/main/scala/resonantinduction/core/prefab/imprint/ItemImprint.java +++ b/src/main/scala/resonantinduction/core/prefab/imprint/ItemImprint.java @@ -14,11 +14,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.nbt.NBTUtility; import resonantinduction.core.Reference; import resonantinduction.core.Settings; import resonantinduction.core.TabRI; -import calclavia.lib.utility.LanguageUtility; -import calclavia.lib.utility.nbt.NBTUtility; public class ItemImprint extends Item { diff --git a/src/main/scala/resonantinduction/core/prefab/imprint/TileFilterable.java b/src/main/scala/resonantinduction/core/prefab/imprint/TileFilterable.java index 1ba18a150..cef599511 100644 --- a/src/main/scala/resonantinduction/core/prefab/imprint/TileFilterable.java +++ b/src/main/scala/resonantinduction/core/prefab/imprint/TileFilterable.java @@ -8,10 +8,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.ForgeDirection; +import resonant.api.IFilterable; +import resonant.api.IRotatable; +import resonant.lib.content.module.prefab.TileInventory; import universalelectricity.api.vector.Vector3; -import calclavia.api.resonantinduction.IFilterable; -import calclavia.lib.content.module.prefab.TileInventory; -import calclavia.lib.prefab.tile.IRotatable; public abstract class TileFilterable extends TileInventory implements IRotatable, IFilterable { diff --git a/src/main/scala/resonantinduction/core/prefab/items/ItemEnergyTool.java b/src/main/scala/resonantinduction/core/prefab/items/ItemEnergyTool.java new file mode 100644 index 000000000..7c2d1dcc2 --- /dev/null +++ b/src/main/scala/resonantinduction/core/prefab/items/ItemEnergyTool.java @@ -0,0 +1,165 @@ +package resonantinduction.core.prefab.items; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import resonant.lib.render.EnumColor; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.nbt.NBTUtility; +import universalelectricity.api.CompatibilityModule; +import universalelectricity.api.UniversalClass; +import universalelectricity.api.UniversalElectricity; +import universalelectricity.api.energy.UnitDisplay; +import universalelectricity.api.energy.UnitDisplay.Unit; +import universalelectricity.api.item.IEnergyItem; +import universalelectricity.api.item.IVoltageItem; + +/** Prefab for all eletric based tools + * + * @author DarkGurdsman */ +@UniversalClass +public class ItemEnergyTool extends ItemTool implements IEnergyItem, IVoltageItem +{ + /** Default battery size */ + protected long batterySize = 500000; + /** Does this item support energy tiers */ + protected boolean hasTier = false; + /** Display energy in tool tips */ + protected boolean showEnergy = true; + /** Number of energy tiers */ + protected int energyTiers = 0; + + public ItemEnergyTool(int id) + { + super(id); + } + + @SuppressWarnings("unchecked") + @Override + public void addInformation(ItemStack itemStack, EntityPlayer entityPlayer, List list, boolean par4) + { + if (hasTier) + list.add(LanguageUtility.getLocal("tooltip.tier") + ": " + (getTier(itemStack) + 1)); + + if (showEnergy) + { + String color = ""; + long joules = this.getEnergy(itemStack); + + if (joules <= this.getEnergyCapacity(itemStack) / 3) + { + color = "\u00a74"; + } + else if (joules > this.getEnergyCapacity(itemStack) * 2 / 3) + { + color = "\u00a72"; + } + else + { + color = "\u00a76"; + } + list.add(LanguageUtility.getLocal("tooltip.battery.energy").replace("%0", color).replace("%1", EnumColor.GREY.toString()).replace("%v0", UnitDisplay.getDisplayShort(joules, Unit.JOULES)).replace("%v1", UnitDisplay.getDisplayShort(this.getEnergyCapacity(itemStack), Unit.JOULES))); + } + } + + @Override + public void onCreated(ItemStack itemStack, World world, EntityPlayer player) + { + super.onCreated(itemStack, world, player); + this.setEnergy(itemStack, 0); + } + + @Override + public long recharge(ItemStack itemStack, long energy, boolean doReceive) + { + long rejectedElectricity = Math.max((this.getEnergy(itemStack) + energy) - this.getEnergyCapacity(itemStack), 0); + long energyToReceive = Math.min(energy - rejectedElectricity, getTransferRate(itemStack)); + + if (doReceive) + { + this.setEnergy(itemStack, this.getEnergy(itemStack) + energyToReceive); + } + + return energyToReceive; + } + + @Override + public long discharge(ItemStack itemStack, long energy, boolean doTransfer) + { + long energyToExtract = Math.min(Math.min(this.getEnergy(itemStack), energy), getTransferRate(itemStack)); + + if (doTransfer) + { + this.setEnergy(itemStack, this.getEnergy(itemStack) - energyToExtract); + } + + return energyToExtract; + } + + @Override + public long getVoltage(ItemStack itemStack) + { + return UniversalElectricity.DEFAULT_VOLTAGE; + } + + @Override + public void setEnergy(ItemStack itemStack, long joules) + { + long electricityStored = Math.max(Math.min(joules, this.getEnergyCapacity(itemStack)), 0); + NBTUtility.getNBTTagCompound(itemStack).setLong("electricity", electricityStored); + } + + public long getEnergySpace(ItemStack itemStack) + { + return this.getEnergyCapacity(itemStack) - this.getEnergy(itemStack); + } + + /** Gets the energy stored in the item. Energy is stored using item NBT */ + @Override + public long getEnergy(ItemStack itemStack) + { + return NBTUtility.getNBTTagCompound(itemStack).getLong("electricity"); + } + + @Override + public int getDisplayDamage(ItemStack stack) + { + return (int) (100 - ((double) this.getEnergy(stack) / (double) getEnergyCapacity(stack)) * 100); + } + + @Override + public long getEnergyCapacity(ItemStack theItem) + { + return this.batterySize; + } + + public long getTransferRate(ItemStack itemStack) + { + return this.getEnergyCapacity(itemStack) / 100; + } + + public static ItemStack setTier(ItemStack itemStack, int tier) + { + NBTUtility.getNBTTagCompound(itemStack).setByte("tier", (byte) tier); + return itemStack; + } + + public static byte getTier(ItemStack itemStack) + { + return NBTUtility.getNBTTagCompound(itemStack).getByte("tier"); + } + + @SuppressWarnings("unchecked") + @Override + public void getSubItems(int par1, CreativeTabs par2CreativeTabs, List par3List) + { + for (int i = 0; i >= 0 && i < this.energyTiers; i++) + { + par3List.add(CompatibilityModule.getItemWithCharge(setTier(new ItemStack(this), i), 0)); + par3List.add(CompatibilityModule.getItemWithCharge(setTier(new ItemStack(this), i), this.getEnergyCapacity(setTier(new ItemStack(this), i)))); + } + } +} diff --git a/src/main/scala/resonantinduction/core/prefab/items/ItemTool.java b/src/main/scala/resonantinduction/core/prefab/items/ItemTool.java new file mode 100644 index 000000000..47530089e --- /dev/null +++ b/src/main/scala/resonantinduction/core/prefab/items/ItemTool.java @@ -0,0 +1,88 @@ +package resonantinduction.core.prefab.items; + +import java.util.List; + +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.nbt.NBTUtility; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + +/** Prefab for all tool based items + * + * @author Darkguardsman */ +public class ItemTool extends Item +{ + protected boolean hasModes = false; + protected String[] toolModes = new String[] { "Remove" }; + + public ItemTool(int par1) + { + super(par1); + this.setMaxStackSize(1); + this.setCreativeTab(CreativeTabs.tabTools); + } + + @Override + public void onCreated(ItemStack stack, World par2World, EntityPlayer entityPlayer) + { + //Save who crafted the tool + if (entityPlayer != null) + { + NBTUtility.getNBTTagCompound(stack).setString("Creator", entityPlayer.username); + } + } + + @SideOnly(Side.CLIENT) + @Override + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean par4) + { + super.addInformation(stack, player, list, par4); + + //Item creator + String creator = NBTUtility.getNBTTagCompound(stack).getString("Creator"); + if (!creator.equalsIgnoreCase("creative") && creator != "") + { + list.add("Created by: " + creator); + } + else if (creator.equalsIgnoreCase("creative")) + { + list.add("Created by Magic Dwarfs"); + } + } + + @Override + public ItemStack onItemRightClick(ItemStack itemStack, World world, EntityPlayer player) + { + if (hasModes && toolModes != null && toolModes.length > 1) + { + //TODO replace with middle mouse wheel + //Changes the mod of the tool + if (player.isSneaking()) + { + setMode(itemStack, (getMode(itemStack) + 1) % toolModes.length); + String modeKey = toolModes[getMode(itemStack)]; + if (!world.isRemote && modeKey != null && !modeKey.isEmpty()) + { + player.addChatMessage(LanguageUtility.getLocal("tool.mode.set") + " " + LanguageUtility.getLocal(modeKey)); + } + + } + } + return itemStack; + } + + public int getMode(ItemStack itemStack) + { + return NBTUtility.getNBTTagCompound(itemStack).getInteger("mode"); + } + + public void setMode(ItemStack itemStack, int mode) + { + NBTUtility.getNBTTagCompound(itemStack).setInteger("mode", mode); + } +} diff --git a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.java b/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.java index 3f4d8ecc1..276628ad9 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.java +++ b/src/main/scala/resonantinduction/core/prefab/part/PacketMultiPart.java @@ -6,9 +6,9 @@ import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.network.packet.Packet; import net.minecraft.tileentity.TileEntity; +import resonant.lib.network.IPacketReceiver; +import resonant.lib.network.PacketType; import universalelectricity.api.vector.Vector3; -import calclavia.lib.network.IPacketReceiver; -import calclavia.lib.network.PacketType; import codechicken.multipart.TMultiPart; import codechicken.multipart.TileMultipart; diff --git a/src/main/scala/resonantinduction/core/prefab/part/PartFramedConnection.java b/src/main/scala/resonantinduction/core/prefab/part/PartFramedConnection.java index 2f75a613c..375a2e835 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PartFramedConnection.java +++ b/src/main/scala/resonantinduction/core/prefab/part/PartFramedConnection.java @@ -35,399 +35,395 @@ import cpw.mods.fml.relauncher.SideOnly; public abstract class PartFramedConnection, N extends INodeNetwork> extends PartColorableMaterial implements IConnector, TSlottedPart, JNormalOcclusion, IHollowConnect { - public static IndexedCuboid6[] sides = new IndexedCuboid6[7]; - public static IndexedCuboid6[] insulatedSides = new IndexedCuboid6[7]; + public static IndexedCuboid6[] sides = new IndexedCuboid6[7]; + public static IndexedCuboid6[] insulatedSides = new IndexedCuboid6[7]; - static - { - sides[0] = new IndexedCuboid6(0, new Cuboid6(0.36, 0.000, 0.36, 0.64, 0.36, 0.64)); - sides[1] = new IndexedCuboid6(1, new Cuboid6(0.36, 0.64, 0.36, 0.64, 1.000, 0.64)); - sides[2] = new IndexedCuboid6(2, new Cuboid6(0.36, 0.36, 0.000, 0.64, 0.64, 0.36)); - sides[3] = new IndexedCuboid6(3, new Cuboid6(0.36, 0.36, 0.64, 0.64, 0.64, 1.000)); - sides[4] = new IndexedCuboid6(4, new Cuboid6(0.000, 0.36, 0.36, 0.36, 0.64, 0.64)); - sides[5] = new IndexedCuboid6(5, new Cuboid6(0.64, 0.36, 0.36, 1.000, 0.64, 0.64)); - sides[6] = new IndexedCuboid6(6, new Cuboid6(0.36, 0.36, 0.36, 0.64, 0.64, 0.64)); - insulatedSides[0] = new IndexedCuboid6(0, new Cuboid6(0.3, 0.0, 0.3, 0.7, 0.3, 0.7)); - insulatedSides[1] = new IndexedCuboid6(1, new Cuboid6(0.3, 0.7, 0.3, 0.7, 1.0, 0.7)); - insulatedSides[2] = new IndexedCuboid6(2, new Cuboid6(0.3, 0.3, 0.0, 0.7, 0.7, 0.3)); - insulatedSides[3] = new IndexedCuboid6(3, new Cuboid6(0.3, 0.3, 0.7, 0.7, 0.7, 1.0)); - insulatedSides[4] = new IndexedCuboid6(4, new Cuboid6(0.0, 0.3, 0.3, 0.3, 0.7, 0.7)); - insulatedSides[5] = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7)); - insulatedSides[6] = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)); - } + static + { + sides[0] = new IndexedCuboid6(0, new Cuboid6(0.36, 0.000, 0.36, 0.64, 0.36, 0.64)); + sides[1] = new IndexedCuboid6(1, new Cuboid6(0.36, 0.64, 0.36, 0.64, 1.000, 0.64)); + sides[2] = new IndexedCuboid6(2, new Cuboid6(0.36, 0.36, 0.000, 0.64, 0.64, 0.36)); + sides[3] = new IndexedCuboid6(3, new Cuboid6(0.36, 0.36, 0.64, 0.64, 0.64, 1.000)); + sides[4] = new IndexedCuboid6(4, new Cuboid6(0.000, 0.36, 0.36, 0.36, 0.64, 0.64)); + sides[5] = new IndexedCuboid6(5, new Cuboid6(0.64, 0.36, 0.36, 1.000, 0.64, 0.64)); + sides[6] = new IndexedCuboid6(6, new Cuboid6(0.36, 0.36, 0.36, 0.64, 0.64, 0.64)); + insulatedSides[0] = new IndexedCuboid6(0, new Cuboid6(0.3, 0.0, 0.3, 0.7, 0.3, 0.7)); + insulatedSides[1] = new IndexedCuboid6(1, new Cuboid6(0.3, 0.7, 0.3, 0.7, 1.0, 0.7)); + insulatedSides[2] = new IndexedCuboid6(2, new Cuboid6(0.3, 0.3, 0.0, 0.7, 0.7, 0.3)); + insulatedSides[3] = new IndexedCuboid6(3, new Cuboid6(0.3, 0.3, 0.7, 0.7, 0.7, 1.0)); + insulatedSides[4] = new IndexedCuboid6(4, new Cuboid6(0.0, 0.3, 0.3, 0.3, 0.7, 0.7)); + insulatedSides[5] = new IndexedCuboid6(5, new Cuboid6(0.7, 0.3, 0.3, 1.0, 0.7, 0.7)); + insulatedSides[6] = new IndexedCuboid6(6, new Cuboid6(0.3, 0.3, 0.3, 0.7, 0.7, 0.7)); + } - protected Object[] connections = new Object[6]; + protected Object[] connections = new Object[6]; - protected N network; + protected N network; - /** - * Bitmask connections - */ - public byte currentWireConnections = 0x00; - public byte currentAcceptorConnections = 0x00; + /** Bitmask connections */ + public byte currentWireConnections = 0x00; + public byte currentAcceptorConnections = 0x00; - /** Client Side */ - private ForgeDirection testingSide; + /** Client Side */ + private ForgeDirection testingSide; - @SideOnly(Side.CLIENT) - protected Icon breakIcon; + @SideOnly(Side.CLIENT) + protected Icon breakIcon; - public PartFramedConnection(Item insulationType) - { - super(insulationType); - } + public PartFramedConnection(Item insulationType) + { + super(insulationType); + } - public void preparePlacement(int meta) - { - this.setMaterial(meta); - } + public void preparePlacement(int meta) + { + this.setMaterial(meta); + } - @Override - public boolean occlusionTest(TMultiPart other) - { - return NormalOcclusionTest.apply(this, other); - } + @Override + public boolean occlusionTest(TMultiPart other) + { + return NormalOcclusionTest.apply(this, other); + } - @Override - public Iterable getSubParts() - { - Set subParts = new HashSet(); - IndexedCuboid6[] currentSides = isInsulated() ? insulatedSides : sides; + @Override + public Iterable getSubParts() + { + Set subParts = new HashSet(); + IndexedCuboid6[] currentSides = isInsulated() ? insulatedSides : sides; - if (tile() != null) - { - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - int ord = side.ordinal(); - if (connectionMapContainsSide(getAllCurrentConnections(), side) || side == testingSide) - subParts.add(currentSides[ord]); - } - } + if (tile() != null) + { + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + { + int ord = side.ordinal(); + if (connectionMapContainsSide(getAllCurrentConnections(), side) || side == testingSide) + subParts.add(currentSides[ord]); + } + } - subParts.add(currentSides[6]); - return subParts; - } + subParts.add(currentSides[6]); + return subParts; + } - /** - * Rendering and block bounds. - */ - @Override - public Iterable getCollisionBoxes() - { - Set collisionBoxes = new HashSet(); - collisionBoxes.addAll((Collection) getSubParts()); + /** Rendering and block bounds. */ + @Override + public Iterable getCollisionBoxes() + { + Set collisionBoxes = new HashSet(); + collisionBoxes.addAll((Collection) getSubParts()); - return collisionBoxes; - } + return collisionBoxes; + } - @Override - public float getStrength(MovingObjectPosition hit, EntityPlayer player) - { - return 10F; - } + @Override + public float getStrength(MovingObjectPosition hit, EntityPlayer player) + { + return 10F; + } - @Override - public void drawBreaking(RenderBlocks renderBlocks) - { - if (breakIcon != null) - { - CCRenderState.reset(); - RenderUtils.renderBlock(sides[6], 0, new Translation(x(), y(), z()), new IconTransformation(breakIcon), null); - } - } + @Override + public void drawBreaking(RenderBlocks renderBlocks) + { + if (breakIcon != null) + { + CCRenderState.reset(); + RenderUtils.renderBlock(sides[6], 0, new Translation(x(), y(), z()), new IconTransformation(breakIcon), null); + } + } - @Override - public Iterable getOcclusionBoxes() - { - return getCollisionBoxes(); - } + @Override + public Iterable getOcclusionBoxes() + { + return getCollisionBoxes(); + } - @Override - public int getSlotMask() - { - return PartMap.CENTER.mask; - } + @Override + public int getSlotMask() + { + return PartMap.CENTER.mask; + } - @Override - public int getHollowSize() - { - return isInsulated ? 8 : 6; - } + @Override + public int getHollowSize() + { + return isInsulated ? 8 : 6; + } - public boolean isBlockedOnSide(ForgeDirection side) - { - TMultiPart blocker = tile().partMap(side.ordinal()); - testingSide = side; - boolean expandable = NormalOcclusionTest.apply(this, blocker); - testingSide = null; - return !expandable; - } + public boolean isBlockedOnSide(ForgeDirection side) + { + TMultiPart blocker = tile().partMap(side.ordinal()); + testingSide = side; + boolean expandable = NormalOcclusionTest.apply(this, blocker); + testingSide = null; + return !expandable; + } - public byte getAllCurrentConnections() - { - return (byte) (currentWireConnections | currentAcceptorConnections); - } + public byte getAllCurrentConnections() + { + return (byte) (currentWireConnections | currentAcceptorConnections); + } - public static boolean connectionMapContainsSide(byte connections, ForgeDirection side) - { - byte tester = (byte) (1 << side.ordinal()); - return ((connections & tester) > 0); - } + public static boolean connectionMapContainsSide(byte connections, ForgeDirection side) + { + byte tester = (byte) (1 << side.ordinal()); + return ((connections & tester) > 0); + } - @Override - public void bind(TileMultipart t) - { - if (this.getNetwork() != null) - { - getNetwork().getConnectors().remove(this); - super.bind(t); - getNetwork().getConnectors().add(this); - } - else - { - super.bind(t); - } - } + @Override + public void bind(TileMultipart t) + { + if (this.getNetwork() != null) + { + getNetwork().getConnectors().remove(this); + super.bind(t); + getNetwork().getConnectors().add(this); + } + else + { + super.bind(t); + } + } - /** - * CONNECTION LOGIC CODE - */ - protected abstract boolean canConnectTo(TileEntity tile, ForgeDirection to); + /** CONNECTION LOGIC CODE */ + protected abstract boolean canConnectTo(TileEntity tile, ForgeDirection to); - protected abstract C getConnector(TileEntity tile); + protected abstract C getConnector(TileEntity tile); - public boolean canConnectBothSides(TileEntity tile, ForgeDirection side) - { - boolean notPrevented = !isConnectionPrevented(tile, side); + public boolean canConnectBothSides(TileEntity tile, ForgeDirection side) + { + boolean notPrevented = !isConnectionPrevented(tile, side); - if (getConnector(tile) != null) - { - notPrevented &= getConnector(tile).canConnect(side.getOpposite(), this); - } + if (getConnector(tile) != null) + { + notPrevented &= getConnector(tile).canConnect(side.getOpposite(), this); + } - return notPrevented; - } + return notPrevented; + } - /** - * Override if there are ways of preventing a connection - * - * @param tile The TileEntity on the given side - * @param side The side we're checking - * @return Whether we're preventing connections on given side or to given tileEntity - */ - public boolean isConnectionPrevented(TileEntity tile, ForgeDirection side) - { - return (!this.canConnectTo(tile, side)) || (isBlockedOnSide(side)); - } + /** Override if there are ways of preventing a connection + * + * @param tile The TileEntity on the given side + * @param side The side we're checking + * @return Whether we're preventing connections on given side or to given tileEntity */ + public boolean isConnectionPrevented(TileEntity tile, ForgeDirection side) + { + return (!this.canConnectTo(tile, side)) || (isBlockedOnSide(side)); + } - public byte getPossibleWireConnections() - { - byte connections = 0x00; + public byte getPossibleWireConnections() + { + byte connections = 0x00; - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); - if (getConnector(tileEntity) != null && canConnectBothSides(tileEntity, side)) - { - connections |= 1 << side.ordinal(); - } - } + if (getConnector(tileEntity) != null && canConnectBothSides(tileEntity, side)) + { + connections |= 1 << side.ordinal(); + } + } - return connections; - } + return connections; + } - public byte getPossibleAcceptorConnections() - { - byte connections = 0x00; + public byte getPossibleAcceptorConnections() + { + byte connections = 0x00; - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + { + TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); - if (canConnectTo(tileEntity, side) && canConnectBothSides(tileEntity, side)) - { - connections |= 1 << side.ordinal(); - } - } + if (canConnectTo(tileEntity, side) && canConnectBothSides(tileEntity, side)) + { + connections |= 1 << side.ordinal(); + } + } - return connections; - } + return connections; + } - public void refresh() - { - if (!world().isRemote) - { - byte possibleWireConnections = getPossibleWireConnections(); - byte possibleAcceptorConnections = getPossibleAcceptorConnections(); + public void refresh() + { + if (!world().isRemote) + { + byte possibleWireConnections = getPossibleWireConnections(); + byte possibleAcceptorConnections = getPossibleAcceptorConnections(); - if (possibleWireConnections != this.currentWireConnections) - { - byte or = (byte) (possibleWireConnections | this.currentWireConnections); + if (possibleWireConnections != this.currentWireConnections) + { + byte or = (byte) (possibleWireConnections | this.currentWireConnections); - // Connections have been removed - if (or != possibleWireConnections) - { - this.getNetwork().removeConnector(this); - this.getNetwork().split(this); - setNetwork(null); - } + // Connections have been removed + if (or != possibleWireConnections) + { + this.getNetwork().removeConnector(this); + this.getNetwork().split(this); + setNetwork(null); + } - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) - { - if (connectionMapContainsSide(possibleWireConnections, side)) - { - TileEntity tileEntity = VectorHelper.getConnectorFromSide(world(), new Vector3(tile()), side, this); + for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) + { + if (connectionMapContainsSide(possibleWireConnections, side)) + { + TileEntity tileEntity = VectorHelper.getConnectorFromSide(world(), new Vector3(tile()), side, this); - if (getConnector(tileEntity) != null) - { - getNetwork().merge(getConnector(tileEntity).getNetwork()); - } - } - } + if (getConnector(tileEntity) != null) + { + getNetwork().merge(getConnector(tileEntity).getNetwork()); + } + } + } - this.currentWireConnections = possibleWireConnections; - } + this.currentWireConnections = possibleWireConnections; + } - this.currentAcceptorConnections = possibleAcceptorConnections; - this.getNetwork().reconstruct(); - this.sendConnectionUpdate(); - } + this.currentAcceptorConnections = possibleAcceptorConnections; + this.getNetwork().reconstruct(); + this.sendConnectionUpdate(); + } - tile().markRender(); - } + tile().markRender(); + } - /** - * Should include connections that are in the current connection maps even if those connections - * aren't allowed any more. This is so that networks split correctly. - */ - @Override - public TileEntity[] getConnections() - { - TileEntity[] connections = new TileEntity[6]; + /** Should include connections that are in the current connection maps even if those connections + * aren't allowed any more. This is so that networks split correctly. */ + @Override + public TileEntity[] getConnections() + { + TileEntity[] connections = new TileEntity[6]; - if (world() != null) - { - for (byte i = 0; i < 6; i++) - { - ForgeDirection side = ForgeDirection.getOrientation(i); - TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); + if (world() != null) + { + for (byte i = 0; i < 6; i++) + { + ForgeDirection side = ForgeDirection.getOrientation(i); + TileEntity tileEntity = VectorHelper.getTileEntityFromSide(world(), new Vector3(tile()), side); - if (isCurrentlyConnected(side)) - { - connections[i] = tileEntity; - } - } + if (isCurrentlyConnected(side)) + { + connections[i] = tileEntity; + } + } - } - return connections; - } + } + return connections; + } - public boolean isCurrentlyConnected(ForgeDirection side) - { - return connectionMapContainsSide(getAllCurrentConnections(), side); - } + public boolean isCurrentlyConnected(ForgeDirection side) + { + return connectionMapContainsSide(getAllCurrentConnections(), side); + } - /** Shouldn't need to be overridden. Override connectionPrevented instead */ - @Override - public boolean canConnect(ForgeDirection direction, Object source) - { - Vector3 connectPos = new Vector3(tile()).translate(direction); - TileEntity connectTile = connectPos.getTileEntity(world()); - return !isConnectionPrevented(connectTile, direction); - } + /** Shouldn't need to be overridden. Override connectionPrevented instead */ + @Override + public boolean canConnect(ForgeDirection direction, Object source) + { + Vector3 connectPos = new Vector3(tile()).translate(direction); + TileEntity connectTile = connectPos.getTileEntity(world()); + return !isConnectionPrevented(connectTile, direction); + } - @Override - public void onAdded() - { - super.onAdded(); - refresh(); - } + @Override + public void onAdded() + { + super.onAdded(); + refresh(); + } - @Override - public void onWorldJoin() - { - refresh(); - } + @Override + public void onWorldJoin() + { + refresh(); + } - @Override - public void onNeighborChanged() - { - super.onNeighborChanged(); - refresh(); - } + @Override + public void onNeighborChanged() + { + super.onNeighborChanged(); + refresh(); + } - @Override - public void onPartChanged(TMultiPart part) - { - refresh(); - } + @Override + public void onPartChanged(TMultiPart part) + { + refresh(); + } - public void copyFrom(PartFramedConnection other) - { - this.isInsulated = other.isInsulated; - this.color = other.color; - this.connections = other.connections; - this.material = other.material; - this.currentWireConnections = other.currentWireConnections; - this.currentAcceptorConnections = other.currentAcceptorConnections; - this.setNetwork(other.getNetwork()); - } + public void copyFrom(PartFramedConnection other) + { + this.isInsulated = other.isInsulated; + this.color = other.color; + this.connections = other.connections; + this.material = other.material; + this.currentWireConnections = other.currentWireConnections; + this.currentAcceptorConnections = other.currentAcceptorConnections; + this.setNetwork(other.getNetwork()); + } - /** Packet Methods */ - public void sendConnectionUpdate() - { - tile().getWriteStream(this).writeByte(0).writeByte(this.currentWireConnections).writeByte(this.currentAcceptorConnections); - } + /** Packet Methods */ + public void sendConnectionUpdate() + { + tile().getWriteStream(this).writeByte(0).writeByte(this.currentWireConnections).writeByte(this.currentAcceptorConnections); + } - @Override - public void readDesc(MCDataInput packet) - { - super.readDesc(packet); - this.currentWireConnections = packet.readByte(); - this.currentAcceptorConnections = packet.readByte(); - } + @Override + public void readDesc(MCDataInput packet) + { + super.readDesc(packet); + this.currentWireConnections = packet.readByte(); + this.currentAcceptorConnections = packet.readByte(); + } - @Override - public void writeDesc(MCDataOutput packet) - { - super.writeDesc(packet); - packet.writeByte(this.currentWireConnections); - packet.writeByte(this.currentAcceptorConnections); - } + @Override + public void writeDesc(MCDataOutput packet) + { + super.writeDesc(packet); + packet.writeByte(this.currentWireConnections); + packet.writeByte(this.currentAcceptorConnections); + } - @Override - public void read(MCDataInput packet) - { - read(packet, packet.readUByte()); - } + @Override + public void read(MCDataInput packet) + { + read(packet, packet.readUByte()); + } - @Override - public void read(MCDataInput packet, int packetID) - { - if (packetID == 0) - { - this.currentWireConnections = packet.readByte(); - this.currentAcceptorConnections = packet.readByte(); - tile().markRender(); - } - else - { - super.read(packet, packetID); - } - } + @Override + public void read(MCDataInput packet, int packetID) + { + if (packetID == 0) + { + this.currentWireConnections = packet.readByte(); + this.currentAcceptorConnections = packet.readByte(); + tile().markRender(); + } + else + { + super.read(packet, packetID); + } + } - /** Network Methods */ - @Override - public void setNetwork(N network) - { - this.network = network; - } + /** Network Methods */ + @Override + public void setNetwork(N network) + { + this.network = network; + } - @Override - public IConnector getInstance(ForgeDirection dir) - { - return this; - } + @Override + public IConnector getInstance(ForgeDirection dir) + { + return this; + } + + @Override + public String toString() + { + return "[PartFramedConnection]" + x() + "x " + y() + "y " + z() + "z " + getSlotMask() + "s "; + } } \ No newline at end of file diff --git a/src/main/scala/resonantinduction/core/prefab/part/PartFramedNode.java b/src/main/scala/resonantinduction/core/prefab/part/PartFramedNode.java index a75c25f6e..d625b681c 100644 --- a/src/main/scala/resonantinduction/core/prefab/part/PartFramedNode.java +++ b/src/main/scala/resonantinduction/core/prefab/part/PartFramedNode.java @@ -12,9 +12,9 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.Icon; import net.minecraft.util.MovingObjectPosition; import net.minecraftforge.common.ForgeDirection; -import calclavia.lib.grid.INode; -import calclavia.lib.grid.INodeProvider; -import calclavia.lib.grid.Node; +import resonant.api.grid.INode; +import resonant.api.grid.INodeProvider; +import resonant.lib.grid.Node; import codechicken.lib.data.MCDataInput; import codechicken.lib.data.MCDataOutput; import codechicken.lib.raytracer.IndexedCuboid6; diff --git a/src/main/scala/resonantinduction/core/prefab/part/PartInventoryPanel.java b/src/main/scala/resonantinduction/core/prefab/part/PartInventoryPanel.java new file mode 100644 index 000000000..47f6d6554 --- /dev/null +++ b/src/main/scala/resonantinduction/core/prefab/part/PartInventoryPanel.java @@ -0,0 +1,200 @@ +package resonantinduction.core.prefab.part; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.ForgeDirection; +import resonant.api.IExternalInventory; +import resonant.api.IExternalInventoryBox; +import resonant.lib.utility.inventory.ExternalInventory; +import codechicken.lib.data.MCDataInput; +import codechicken.lib.data.MCDataOutput; + +/** Panel based part that provides a prefab for other tiles to build an inventory from. Inventory + * code is wrapped to an ExternalInventory object allowing inventories to be implemented without + * repeat copying of code. As well Code is based on TileInventory and should operate in the exact + * same way. + * + * @author Darkguardsman */ +public abstract class PartInventoryPanel extends PartFace implements IExternalInventory, ISidedInventory +{ + protected IExternalInventoryBox inventory; + protected int maxSlots = 1; + protected boolean markedForUpdate = false; + + @Override + public void update() + { + super.update(); + if (ticks % 3 == 0 && !world().isRemote && markedForUpdate) + { + sendDescUpdate(); + } + } + + @Override + public void onInventoryChanged() + { + markedForUpdate = true; + } + + /** Save and load */ + @Override + public void load(NBTTagCompound nbt) + { + super.load(nbt); + this.getInventory().load(nbt); + } + + @Override + public void save(NBTTagCompound nbt) + { + super.save(nbt); + this.getInventory().save(nbt); + } + + @Override + public void readDesc(MCDataInput packet) + { + super.readDesc(packet); + getInventory().load(packet.readNBTTagCompound()); + } + + @Override + public void writeDesc(MCDataOutput packet) + { + super.writeDesc(packet); + NBTTagCompound nbt = new NBTTagCompound(); + getInventory().save(nbt); + packet.writeNBTTagCompound(nbt); + } + + @Override + public IExternalInventoryBox getInventory() + { + if (inventory == null) + { + inventory = new ExternalInventory(null, this, this.maxSlots); + } + + return inventory; + } + + @Override + public int getSizeInventory() + { + return this.getInventory().getSizeInventory(); + } + + @Override + public ItemStack getStackInSlot(int i) + { + return this.getInventory().getStackInSlot(i); + } + + @Override + public ItemStack decrStackSize(int i, int j) + { + return this.getInventory().decrStackSize(i, j); + } + + public void incrStackSize(int slot, ItemStack itemStack) + { + if (this.getStackInSlot(slot) == null) + { + setInventorySlotContents(slot, itemStack.copy()); + } + else if (this.getStackInSlot(slot).isItemEqual(itemStack)) + { + getStackInSlot(slot).stackSize += itemStack.stackSize; + } + + onInventoryChanged(); + } + + @Override + public ItemStack getStackInSlotOnClosing(int i) + { + return this.getInventory().getStackInSlotOnClosing(i); + } + + @Override + public void setInventorySlotContents(int i, ItemStack itemstack) + { + this.getInventory().setInventorySlotContents(i, itemstack); + + } + + @Override + public String getInvName() + { + return "Inventory"; + } + + @Override + public boolean isInvNameLocalized() + { + return false; + } + + @Override + public int getInventoryStackLimit() + { + return this.getInventory().getInventoryStackLimit(); + } + + @Override + public boolean isUseableByPlayer(EntityPlayer entityplayer) + { + return this.getInventory().isUseableByPlayer(entityplayer); + } + + @Override + public void openChest() + { + this.getInventory().openChest(); + } + + @Override + public void closeChest() + { + this.getInventory().closeChest(); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack itemstack) + { + return this.getInventory().isItemValidForSlot(i, itemstack); + } + + @Override + public int[] getAccessibleSlotsFromSide(int var1) + { + return this.getInventory().getAccessibleSlotsFromSide(var1); + } + + @Override + public boolean canInsertItem(int i, ItemStack itemstack, int j) + { + return this.getInventory().canInsertItem(i, itemstack, j); + } + + @Override + public boolean canExtractItem(int i, ItemStack itemstack, int j) + { + return this.getInventory().canExtractItem(i, itemstack, j); + } + + @Override + public boolean canRemove(ItemStack stack, int slot, ForgeDirection side) + { + return slot < this.getSizeInventory(); + } + + @Override + public boolean canStore(ItemStack stack, int slot, ForgeDirection side) + { + return false; + } +} diff --git a/src/main/scala/resonantinduction/core/render/RenderImprintable.java b/src/main/scala/resonantinduction/core/render/RenderImprintable.java index e5db234c5..e39b58101 100644 --- a/src/main/scala/resonantinduction/core/render/RenderImprintable.java +++ b/src/main/scala/resonantinduction/core/render/RenderImprintable.java @@ -8,10 +8,10 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.MovingObjectPosition; +import resonant.lib.render.RenderUtility; import resonantinduction.core.prefab.imprint.ItemImprint; import resonantinduction.core.prefab.imprint.TileFilterable; import universalelectricity.api.vector.Vector3; -import calclavia.lib.render.RenderUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/scala/resonantinduction/core/resource/BlockDust.java b/src/main/scala/resonantinduction/core/resource/BlockDust.java index cc280c7b2..d224c201b 100644 --- a/src/main/scala/resonantinduction/core/resource/BlockDust.java +++ b/src/main/scala/resonantinduction/core/resource/BlockDust.java @@ -1,8 +1,7 @@ package resonantinduction.core.resource; -import calclavia.lib.prefab.block.BlockTile; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.Random; + import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; @@ -11,10 +10,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.AxisAlignedBB; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import resonant.lib.prefab.block.BlockTile; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; - -import java.util.Random; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * The block form of the item dust. diff --git a/src/main/scala/resonantinduction/core/resource/BlockMachineMaterial.java b/src/main/scala/resonantinduction/core/resource/BlockMachineMaterial.java index d39f6564e..a470b5c89 100644 --- a/src/main/scala/resonantinduction/core/resource/BlockMachineMaterial.java +++ b/src/main/scala/resonantinduction/core/resource/BlockMachineMaterial.java @@ -7,8 +7,8 @@ import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.ItemStack; import net.minecraft.util.Icon; +import resonant.lib.prefab.block.BlockTile; import resonantinduction.core.Reference; -import calclavia.lib.prefab.block.BlockTile; /** * A block used to build machines or decoration. diff --git a/src/main/scala/resonantinduction/core/resource/ItemOreResource.java b/src/main/scala/resonantinduction/core/resource/ItemOreResource.java index 0e13fb2e2..48e0f24dc 100644 --- a/src/main/scala/resonantinduction/core/resource/ItemOreResource.java +++ b/src/main/scala/resonantinduction/core/resource/ItemOreResource.java @@ -1,8 +1,7 @@ package resonantinduction.core.resource; -import calclavia.lib.utility.LanguageUtility; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; @@ -11,11 +10,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.oredict.OreDictionary; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.TabRI; - -import java.util.List; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * An item used for auto-generated dusts based on registered ingots in the OreDict. diff --git a/src/main/scala/resonantinduction/core/resource/ResourceGenerator.java b/src/main/scala/resonantinduction/core/resource/ResourceGenerator.java index 511f16471..1e4d69b80 100644 --- a/src/main/scala/resonantinduction/core/resource/ResourceGenerator.java +++ b/src/main/scala/resonantinduction/core/resource/ResourceGenerator.java @@ -1,16 +1,17 @@ package resonantinduction.core.resource; -import calclavia.api.recipe.MachineRecipes; -import calclavia.lib.config.Config; -import calclavia.lib.utility.LanguageUtility; -import calclavia.lib.utility.nbt.IVirtualObject; -import calclavia.lib.utility.nbt.NBTUtility; -import calclavia.lib.utility.nbt.SaveManager; -import com.google.common.collect.HashBiMap; -import cpw.mods.fml.common.registry.GameRegistry; -import cpw.mods.fml.common.registry.LanguageRegistry; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; + +import javax.imageio.ImageIO; + import net.minecraft.block.Block; import net.minecraft.client.Minecraft; import net.minecraft.item.Item; @@ -28,6 +29,12 @@ import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.oredict.OreDictionary; import net.minecraftforge.oredict.OreDictionary.OreRegisterEvent; +import resonant.api.recipe.MachineRecipes; +import resonant.lib.config.Config; +import resonant.lib.utility.LanguageUtility; +import resonant.lib.utility.nbt.IVirtualObject; +import resonant.lib.utility.nbt.NBTUtility; +import resonant.lib.utility.nbt.SaveManager; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction; import resonantinduction.core.ResonantInduction.RecipeType; @@ -36,16 +43,12 @@ import resonantinduction.core.fluid.FluidColored; import resonantinduction.core.resource.fluid.BlockFluidMaterial; import resonantinduction.core.resource.fluid.BlockFluidMixture; -import javax.imageio.ImageIO; -import java.awt.*; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; +import com.google.common.collect.HashBiMap; + +import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.registry.LanguageRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; /** * @author Calclavia @@ -360,7 +363,7 @@ public class ResourceGenerator implements IVirtualObject public static String getName(ItemStack itemStack) { - return LanguageUtility.decapitalizeFirst(OreDictionary.getOreName(OreDictionary.getOreID(itemStack)).replace("dust", "").replace("ore", "").replace("ingot", "")); + return LanguageUtility.decapitalizeFirst(OreDictionary.getOreName(OreDictionary.getOreID(itemStack)).replace("dirtyDust", "").replace("dust", "").replace("ore", "").replace("ingot", "")); } public static int getColor(String name) diff --git a/src/main/scala/resonantinduction/core/resource/TileMaterial.java b/src/main/scala/resonantinduction/core/resource/TileMaterial.java index 8ce32564c..509234bcb 100644 --- a/src/main/scala/resonantinduction/core/resource/TileMaterial.java +++ b/src/main/scala/resonantinduction/core/resource/TileMaterial.java @@ -1,14 +1,15 @@ package resonantinduction.core.resource; -import calclavia.lib.content.module.TileBase; -import calclavia.lib.network.IPacketReceiver; -import com.google.common.io.ByteArrayDataInput; import net.minecraft.block.material.Material; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.network.packet.Packet; +import resonant.lib.content.module.TileBase; +import resonant.lib.network.IPacketReceiver; import resonantinduction.core.ResonantInduction; +import com.google.common.io.ByteArrayDataInput; + /** * A tile that stores the material name. * diff --git a/src/main/scala/resonantinduction/core/resource/fluid/BlockFluidMixture.java b/src/main/scala/resonantinduction/core/resource/fluid/BlockFluidMixture.java index 302af785e..a1bcdf075 100644 --- a/src/main/scala/resonantinduction/core/resource/fluid/BlockFluidMixture.java +++ b/src/main/scala/resonantinduction/core/resource/fluid/BlockFluidMixture.java @@ -8,11 +8,11 @@ import net.minecraftforge.fluids.BlockFluidFinite; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; +import resonant.api.recipe.MachineRecipes; import resonantinduction.core.Reference; import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.Settings; import resonantinduction.core.resource.ResourceGenerator; -import calclavia.api.recipe.MachineRecipes; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/scala/resonantinduction/core/resource/fluid/ItemOreResourceBucket.java b/src/main/scala/resonantinduction/core/resource/fluid/ItemOreResourceBucket.java index 198e98cd7..8eb3e8ec6 100644 --- a/src/main/scala/resonantinduction/core/resource/fluid/ItemOreResourceBucket.java +++ b/src/main/scala/resonantinduction/core/resource/fluid/ItemOreResourceBucket.java @@ -15,11 +15,11 @@ import net.minecraftforge.event.Event; import net.minecraftforge.event.entity.player.FillBucketEvent; import net.minecraftforge.fluids.BlockFluidFinite; import net.minecraftforge.fluids.FluidRegistry; +import resonant.lib.utility.LanguageUtility; import resonantinduction.core.Reference; import resonantinduction.core.TabRI; import resonantinduction.core.resource.ItemOreResource; import resonantinduction.core.resource.ResourceGenerator; -import calclavia.lib.utility.LanguageUtility; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; diff --git a/src/main/scala/resonantinduction/core/resource/fluid/TileFluidMixture.java b/src/main/scala/resonantinduction/core/resource/fluid/TileFluidMixture.java index 593510081..e07314886 100644 --- a/src/main/scala/resonantinduction/core/resource/fluid/TileFluidMixture.java +++ b/src/main/scala/resonantinduction/core/resource/fluid/TileFluidMixture.java @@ -7,10 +7,10 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.fluids.FluidStack; +import resonant.api.recipe.MachineRecipes; import resonantinduction.core.ResonantInduction.RecipeType; import resonantinduction.core.resource.ResourceGenerator; import resonantinduction.core.resource.TileMaterial; -import calclavia.api.recipe.MachineRecipes; /** * NO-OP. Not yet properly implemented. We're not using TEs for now.