From 263c0eea1ebda160735adbc7cbe6c6b3586d9e22 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 7 May 2015 16:36:29 +0200 Subject: [PATCH 01/29] -Added Hairy Balls -Updated Bugs --- build.gradle | 2 +- newestVersion.txt | 2 +- .../blocks/BlockGrinder.java | 2 +- .../config/values/ConfigBoolValues.java | 4 +- .../config/values/ConfigIntValues.java | 8 +- .../crafting/BlockCrafting.java | 2 +- .../crafting/GrinderCrafting.java | 10 ++- .../creative/CreativeTab.java | 1 + .../event/EntityLivingEvent.java | 31 ++++++++ .../actuallyadditions/event/InitEvents.java | 1 + .../actuallyadditions/items/InitItems.java | 7 ++ .../items/ItemHairyBall.java | 74 ++++++++++++++++++ .../items/metalists/ThePotionRings.java | 14 ++-- .../recipe/GrinderRecipeHandler.java | 34 +------- .../recipe/GrinderRecipes.java | 54 ++++++++++++- .../recipe/HairyBallHandler.java | 57 ++++++++++++++ .../tile/TileEntityBase.java | 20 +---- .../tile/TileEntityBreaker.java | 9 +++ .../tile/TileEntityFishingNet.java | 48 ++++++++++-- .../tile/TileEntityGrinder.java | 9 +++ .../tile/TileEntityInputter.java | 9 +++ .../tile/TileEntityInventoryBase.java | 5 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../assets/actuallyadditions/lang/en_US.lang | 51 +----------- .../textures/items/itemHairyBall.png | Bin 0 -> 365 bytes src/main/resources/mcmod.info | 2 +- 26 files changed, 328 insertions(+), 130 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/event/EntityLivingEvent.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java create mode 100644 src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemHairyBall.png diff --git a/build.gradle b/build.gradle index 4fc4b5d1f..c5b1c8c5b 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.4.3" +version = "1.7.10-0.0.4.4" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/newestVersion.txt b/newestVersion.txt index d4ec1fbbc..b3a35a712 100644 --- a/newestVersion.txt +++ b/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.4.3 \ No newline at end of file +1.7.10-0.0.4.4 \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java index 63b653816..1f13cd985 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java @@ -29,7 +29,7 @@ public class BlockGrinder extends BlockContainerBase implements INameableItem{ private IIcon onIcon; private IIcon bottomIcon; - private boolean isDouble; + private final boolean isDouble; public BlockGrinder(boolean isDouble){ super(Material.rock); diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java index 9c246564c..8c65da1ec 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java @@ -22,7 +22,9 @@ public enum ConfigBoolValues{ DO_UPDATE_CHECK("Do Update Check", ConfigCategories.OTHER, true, "If Actually Additions should check for an Update on joining a World"), - DO_CRUSHER_SPAM("Crusher Debug", ConfigCategories.OTHER, false, "Print out Crusher Recipe Initializing Debug"); + DO_CRUSHER_SPAM("Crusher Debug", ConfigCategories.OTHER, false, "Print out Crusher Recipe Initializing Debug"), + + DO_CAT_DROPS("Do Cat Drops", ConfigCategories.OTHER, true, "If Cats drop Hairy Balls on Occasion"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index 65944bf6c..80df3d523 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -19,7 +19,7 @@ public enum ConfigIntValues{ COMPOST_AMOUNT("Compost: Amount Needed To Convert", ConfigCategories.MACHINE_VALUES, 10, 1, 64, "How many items are needed in the Compost to convert to Fertilizer"), COMPOST_TIME("Compost: Conversion Time Needed", ConfigCategories.MACHINE_VALUES, 1000, 30, 10000, "How long the Compost needs to convert to Fertilizer"), - FISHER_TIME("Fishing Net: Time Needed", ConfigCategories.MACHINE_VALUES, 2000, 50, 50000, "How long it takes on Average until the Fishing Net catches a Fish"), + FISHER_TIME("Fishing Net: Time Needed", ConfigCategories.MACHINE_VALUES, 10000, 50, 500000, "How long it takes on Average until the Fishing Net catches a Fish"), FEEDER_REACH("Feeder: Reach", ConfigCategories.MACHINE_VALUES, 5, 1, 20, "The Radius of Action of the Feeder"), FEEDER_TIME("Feeder: Time Needed", ConfigCategories.MACHINE_VALUES, 100, 50, 5000, "The time spent between feeding animals with the Feeder"), @@ -39,14 +39,16 @@ public enum ConfigIntValues{ GRINDER_DOUBLE_CRUSH_TIME("Double Crusher: Crush Time", ConfigCategories.MACHINE_VALUES, 300, 10, 1000, "How long the Double Crusher takes to crush an item"), FURNACE_DOUBLE_SMELT_TIME("Double Furnace: Smelt Time", ConfigCategories.MACHINE_VALUES, 300, 10, 1000, "How long the Double Furnace takes to crush an item"), - REPAIRER_SPEED_SLOWDOWN("Item Repairer: Speed Slowdown", ConfigCategories.MACHINE_VALUES, 2, 1, 100, "How much slower the Item Repairer repairs"), + REPAIRER_SPEED_SLOWDOWN("Item Repairer: Speed Slowdown", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "How much slower the Item Repairer repairs"), HEAT_COLLECTOR_BLOCKS("Heat Collector: Blocks Needed", ConfigCategories.MACHINE_VALUES, 4, 1, 5, "How many Blocks are needed for the Heat Collector to power Machines above it"), HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 10000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), GLASS_TIME_NEEDED("Greenhouse Glass: Time Needed", ConfigCategories.MACHINE_VALUES, 1000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), BREAKER_TIME_NEEDED("Breaker and Placer: Time Needed", ConfigCategories.MACHINE_VALUES, 15, 1, 10000, "The Time Needed for the Breaker and the Placer to place or break a Block"), - DROPPER_TIME_NEEDED("Dropper: Time Needed", ConfigCategories.MACHINE_VALUES, 10, 1, 10000, "The Time Needed for the Dropper to drop an Item"); + DROPPER_TIME_NEEDED("Dropper: Time Needed", ConfigCategories.MACHINE_VALUES, 10, 1, 10000, "The Time Needed for the Dropper to drop an Item"), + + CAT_DROP_CHANCE("Cat Drops: Chance", ConfigCategories.OTHER, 5000, 5, 10000000, "The 1 in X chance for a Hairy Ball to Drop from a Cat with X being this value"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index acadece1b..6e174270e 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -58,7 +58,7 @@ public class BlockCrafting{ 'D', "gemDiamond", 'I', "ingotIron", 'O', TheMiscItems.COIL.getOredictName(), - 'C', TheMiscBlocks.STONE_CASING.getOredictName())); + 'C', Items.nether_star)); //Solar Panel /*if(ConfigCrafting.SOLAR_PANEL.isEnabled()) diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index b5cb88347..a75b29265 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -4,7 +4,6 @@ import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheDusts; import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler; import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler.SearchCase; -import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler.SpecialOreCase; import ellpeck.actuallyadditions.recipe.GrinderRecipes; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; @@ -19,10 +18,15 @@ public class GrinderCrafting{ public static void init(){ Util.logInfo("Initializing Crusher Recipes..."); - grindRec.registerRecipe(new ItemStack(Blocks.iron_ore), new ItemStack(InitItems.itemDust, 2, TheDusts.IRON.ordinal()), new ItemStack(InitItems.itemDust, 1, TheDusts.GOLD.ordinal()), 10); grindRec.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10), null, 0); grindRec.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal()), null, 0); - grindRecHan.specialOreCases.add(new SpecialOreCase("oreNickel", "dustPlatinum", 30)); + + grindRec.registerRecipe("cobblestone", "sand"); + grindRec.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); + grindRec.registerRecipe("stone", "cobblestone"); + + grindRec.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); + grindRec.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); grindRecHan.searchCases.add(new SearchCase("ore", 2)); grindRecHan.searchCases.add(new SearchCase("oreNether", 6)); diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index a6f6b816a..7a15a5fbd 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -47,6 +47,7 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockCompost); this.addBlock(InitBlocks.blockGiantChest); + this.addItem(InitItems.itemHairyBall); this.addItem(InitItems.itemSpeedUpgrade); this.addItem(InitItems.itemMisc); this.addItem(InitItems.itemFertilizer); diff --git a/src/main/java/ellpeck/actuallyadditions/event/EntityLivingEvent.java b/src/main/java/ellpeck/actuallyadditions/event/EntityLivingEvent.java new file mode 100644 index 000000000..ea6520261 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/event/EntityLivingEvent.java @@ -0,0 +1,31 @@ +package ellpeck.actuallyadditions.event; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ellpeck.actuallyadditions.config.values.ConfigBoolValues; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.InitItems; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.passive.EntityOcelot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.living.LivingEvent.LivingUpdateEvent; + +import java.util.Random; + +public class EntityLivingEvent{ + + @SubscribeEvent + public void livingUpdateEvent(LivingUpdateEvent event){ + if(!event.entityLiving.worldObj.isRemote){ + if(event.entityLiving instanceof EntityOcelot){ + EntityOcelot theOcelot = (EntityOcelot)event.entityLiving; + if(ConfigBoolValues.DO_CAT_DROPS.isEnabled() && theOcelot.isTamed()){ + if(new Random().nextInt(ConfigIntValues.CAT_DROP_CHANCE.getValue())+1 == 1){ + EntityItem item = new EntityItem(theOcelot.worldObj, theOcelot.posX + 0.5, theOcelot.posY + 0.5, theOcelot.posZ + 0.5, new ItemStack(InitItems.itemHairyBall)); + theOcelot.worldObj.spawnEntityInWorld(item); + } + } + } + } + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java index 71c28a16d..d087f1b95 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java +++ b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java @@ -12,6 +12,7 @@ public class InitEvents{ Util.registerEvent(new KilledEvent()); Util.registerEvent(new PickupEvent()); Util.registerEvent(new TooltipEvent()); + Util.registerEvent(new EntityLivingEvent()); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index c0062a2c5..703d497f0 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.items; import ellpeck.actuallyadditions.items.tools.*; import ellpeck.actuallyadditions.material.InitItemMaterials; +import ellpeck.actuallyadditions.recipe.HairyBallHandler; import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; @@ -40,6 +41,8 @@ public class InitItems{ public static Item itemSpeedUpgrade; + public static Item itemHairyBall; + public static void init(){ Util.logInfo("Initializing Items..."); @@ -82,6 +85,10 @@ public class InitItems{ itemSpeedUpgrade = new ItemUpgrade(ItemUpgrade.UpgradeType.SPEED, "itemUpgradeSpeed", 2+3); ItemUtil.register(itemSpeedUpgrade); + itemHairyBall = new ItemHairyBall(); + ItemUtil.register(itemHairyBall); + HairyBallHandler.init(); + itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); itemShovelEmerald = new ItemShovelAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemShovelEmerald", EnumRarity.rare); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java new file mode 100644 index 000000000..3f6482ab0 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java @@ -0,0 +1,74 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.recipe.HairyBallHandler; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.WeightedRandom; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Random; + +public class ItemHairyBall extends Item implements INameableItem{ + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(!world.isRemote){ + ItemStack returnItem = this.getRandomReturnItem(); + if(!player.inventory.addItemStackToInventory(returnItem)){ + EntityItem entityItem = new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, returnItem); + entityItem.delayBeforeCanPickup = 0; + player.worldObj.spawnEntityInWorld(entityItem); + } + stack.stackSize--; + } + return stack; + } + + public ItemStack getRandomReturnItem(){ + return ((HairyBallHandler.Return)WeightedRandom.getRandomItem(new Random(), HairyBallHandler.returns)).returnItem.copy(); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 2, ""); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "itemHairyBall"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java index 3e08a50c9..a5904b898 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java @@ -8,17 +8,17 @@ import net.minecraft.item.ItemStack; public enum ThePotionRings implements INameableItem{ - SPEED("Speed", 8171462, 1, 0, 3, 10, false, EnumRarity.uncommon, new ItemStack(Items.sugar)), + SPEED("Speed", 8171462, 1, 0, 1, 10, false, EnumRarity.uncommon, new ItemStack(Items.sugar)), //TODO Slowness - HASTE("Haste", 14270531, 3, 0, 3, 10, false, EnumRarity.epic, new ItemStack(Items.repeater)), + HASTE("Haste", 14270531, 3, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.repeater)), //TODO Mining Fatigue - STRENGTH("Strength", 9643043, 5, 0, 3, 10, false, EnumRarity.rare, new ItemStack(Items.blaze_powder)), + STRENGTH("Strength", 9643043, 5, 0, 1, 10, false, EnumRarity.rare, new ItemStack(Items.blaze_powder)), //Health (Not Happening) //TODO Damage - JUMP_BOOST("JumpBoost", 7889559, 8, 0, 3, 10, false, EnumRarity.rare, new ItemStack(Blocks.piston)), + JUMP_BOOST("JumpBoost", 7889559, 8, 0, 1, 10, false, EnumRarity.rare, new ItemStack(Blocks.piston)), //TODO Nausea - REGEN("Regen", 13458603, 10, 0, 3, 50, true, EnumRarity.rare, new ItemStack(Items.ghast_tear)), - RESISTANCE("Resistance", 10044730, 11, 0, 3, 10, false, EnumRarity.epic, new ItemStack(Items.slime_ball)), + REGEN("Regen", 13458603, 10, 0, 1, 50, true, EnumRarity.rare, new ItemStack(Items.ghast_tear)), + RESISTANCE("Resistance", 10044730, 11, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.slime_ball)), FIRE_RESISTANCE("FireResistance", 14981690, 12, 0, 0, 10, false, EnumRarity.uncommon, new ItemStack(Items.magma_cream)), WATER_BREATHING("WaterBreathing", 3035801, 13, 0, 0, 10, false, EnumRarity.rare, new ItemStack(Items.fish, 1, 3)), INVISIBILITY("Invisibility", 8356754, 14, 0, 0, 10, false, EnumRarity.epic, new ItemStack(Items.fermented_spider_eye)), @@ -30,7 +30,7 @@ public enum ThePotionRings implements INameableItem{ //TODO Withering //Health Boost (Not Happening) //Absorption (Not Happening) - SATURATION("Saturation", 16262179, 23, 0, 3, 10, false, EnumRarity.epic, new ItemStack(Items.cooked_beef)); + SATURATION("Saturation", 16262179, 23, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.cooked_beef)); public final String name; public final int color; diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java index 192270f4f..ee4b4a5d7 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java @@ -18,7 +18,6 @@ public class GrinderRecipeHandler{ public ArrayList searchCases = new ArrayList(); public ArrayList exceptions = new ArrayList(); - public ArrayList specialOreCases = new ArrayList(); public static class SearchCase{ @@ -31,20 +30,6 @@ public class GrinderRecipeHandler{ } } - public static class SpecialOreCase{ - - public final String inputName; - public final String secondResultName; - public final int secondResultChance; - - public SpecialOreCase(String inputName, String secondResultName, int secondResultChance){ - this.inputName = inputName; - this.secondResultChance = secondResultChance; - this.secondResultName = secondResultName; - } - - } - public void registerFinally(){ String[] names = OreDictionary.getOreNames(); for(String inputName : names){ @@ -73,23 +58,8 @@ public class GrinderRecipeHandler{ ItemStack input = theInput.copy(); ItemStack output = theDust.copy(); output.stackSize = resultAmount; - if(!GrinderRecipes.instance().hasExactRecipe(input, output)){ - ArrayList specialStacks = null; - int specialAmount = 0; - - for(SpecialOreCase theCase : specialOreCases){ - if(inputName.equals(theCase.inputName)){ - specialStacks = OreDictionary.getOres(theCase.secondResultName); - specialAmount = theCase.secondResultChance; - } - } - if(specialStacks != null && specialStacks.size() > 0){ - for(ItemStack theSpecial : specialStacks){ - ItemStack special = theSpecial.copy(); - GrinderRecipes.instance().registerRecipe(input, output, special, specialAmount); - } - } - else GrinderRecipes.instance().registerRecipe(input, output, null, 0); + if(!GrinderRecipes.instance().hasRecipe(inputName, inputWithDustPrefix)){ + GrinderRecipes.instance().registerRecipe(input, output, null, 0); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java index d0a2ebab2..3b60baad6 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java @@ -1,6 +1,7 @@ package ellpeck.actuallyadditions.recipe; import net.minecraft.item.ItemStack; +import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; @@ -18,6 +19,36 @@ public class GrinderRecipes{ this.recipes.add(new GrinderRecipe(input, outputOne, outputTwo, secondChance)); } + public void registerRecipe(String input, String outputOne, String outputTwo, int secondChance, int outputTwoAmount){ + ArrayList inputStacks = OreDictionary.getOres(input); + ArrayList outputOneStacks = OreDictionary.getOres(outputOne); + ArrayList outputTwoStacks = OreDictionary.getOres(outputTwo); + + if(inputStacks != null && !inputStacks.isEmpty()){ + for(ItemStack theInput : inputStacks){ + if(outputOneStacks != null && !outputOneStacks.isEmpty()){ + for(ItemStack theOutputOne : outputOneStacks){ + theOutputOne.stackSize = outputTwoAmount; + if(outputTwoStacks != null && !outputTwoStacks.isEmpty()){ + for(ItemStack theOutputTwo : outputTwoStacks){ + this.registerRecipe(theInput, theOutputOne, theOutputTwo, secondChance); + } + } + else this.registerRecipe(theInput, theOutputOne, null, 0); + } + } + } + } + } + + public void registerRecipe(String input, String outputOne){ + this.registerRecipe(input, outputOne, "", 0, 1); + } + + public void registerRecipe(ItemStack input, ItemStack outputOne){ + this.registerRecipe(input, outputOne, null, 0); + } + public ItemStack getOutput(ItemStack input, boolean wantSecond){ for(GrinderRecipe recipe : recipes){ if(recipe.input.isItemEqual(input)){ @@ -27,13 +58,28 @@ public class GrinderRecipes{ return null; } - public boolean hasExactRecipe(ItemStack input, ItemStack outputOne){ + public boolean hasRecipe(String input, String outputOne){ + boolean containsInput = false; + boolean containsOutput = false; + for(GrinderRecipe recipe : recipes){ - if(recipe.input.isItemEqual(input) && recipe.firstOutput.isItemEqual(outputOne)){ - return true; + int[] recipeInputIDs = OreDictionary.getOreIDs(recipe.input); + for(int recipeInputID : recipeInputIDs){ + if(input.equals(OreDictionary.getOreName(recipeInputID))){ + containsInput = true; + break; + } + } + + int[] recipeOutputIDs = OreDictionary.getOreIDs(recipe.firstOutput); + for(int recipeOutputID : recipeOutputIDs){ + if(outputOne.equals(OreDictionary.getOreName(recipeOutputID))){ + containsOutput = true; + break; + } } } - return false; + return containsInput && containsOutput; } public int getSecondChance(ItemStack input){ diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java new file mode 100644 index 000000000..a03da6f18 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java @@ -0,0 +1,57 @@ +package ellpeck.actuallyadditions.recipe; + +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +import java.util.ArrayList; + +public class HairyBallHandler{ + + public static ArrayList returns = new ArrayList(); + + public static void init(){ + addReturn(new ItemStack(Items.string), 100); + addReturn(new ItemStack(Items.diamond), 2); + addReturn(new ItemStack(Items.name_tag), 1); + addReturn(new ItemStack(Items.fish), 80); + addReturn(new ItemStack(Items.feather), 60); + addReturn(new ItemStack(Items.leather), 30); + addReturn(new ItemStack(Items.dye), 70); + addReturn(new ItemStack(Items.clay_ball), 40); + addReturn(new ItemStack(Items.stick), 40); + addReturn(new ItemStack(Items.iron_ingot), 10); + addReturn(new ItemStack(Items.gold_ingot), 6); + addReturn(new ItemStack(Items.beef), 30); + addReturn(new ItemStack(Items.ender_pearl), 2); + addReturn(new ItemStack(Blocks.planks), 20); + addReturn(new ItemStack(Blocks.waterlily), 10); + addReturn(new ItemStack(Items.experience_bottle), 3); + addReturn(new ItemStack(Blocks.gravel), 40); + addReturn(new ItemStack(Blocks.sand), 50); + addReturn(new ItemStack(Blocks.vine), 30); + addReturn(new ItemStack(Blocks.web), 4); + addReturn(new ItemStack(InitItems.itemSpecialDrop, 1, TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()), 20); + addReturn(new ItemStack(InitItems.itemSpecialDrop, 1, TheSpecialDrops.EMERALD_SHARD.ordinal()), 10); + addReturn(new ItemStack(InitItems.itemSpecialDrop, 1, TheSpecialDrops.PEARL_SHARD.ordinal()), 10); + } + + public static void addReturn(ItemStack stack, int chance){ + returns.add(new Return(stack, chance)); + } + + public static class Return extends WeightedRandom.Item{ + + public ItemStack returnItem; + + public Return(ItemStack returnItem, int chance){ + super(chance); + this.returnItem = returnItem; + } + + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index cfde380a7..cf3f30777 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -4,29 +4,11 @@ import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; -import net.minecraft.block.BlockAir; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.network.NetworkManager; -import net.minecraft.network.Packet; -import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityBase extends TileEntity{ - @Override - public Packet getDescriptionPacket(){ - NBTTagCompound compound = new NBTTagCompound(); - this.writeToNBT(compound); - return new S35PacketUpdateTileEntity(this.xCoord, this.yCoord, this.zCoord, this.getBlockMetadata(), compound); - } - - @Override - public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet){ - super.onDataPacket(net, packet); - this.readFromNBT(packet.func_148857_g()); - } - public static void init(){ Util.logInfo("Registering TileEntities..."); GameRegistry.registerTileEntity(TileEntityCompost.class, ModUtil.MOD_ID_LOWER + ":tileEntityCompost"); @@ -49,6 +31,6 @@ public class TileEntityBase extends TileEntity{ @Override public boolean shouldRefresh(Block oldBlock, Block newBlock, int oldMeta, int newMeta, World world, int x, int y, int z){ - return newBlock == null || newBlock instanceof BlockAir; + return !(oldBlock.isAssociatedBlock(newBlock)); } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index 27ef4bfb3..c316ab395 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -40,6 +40,15 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + + //TODO Remove after some Updating + if(this.isPlacer && this.getClass() != TileEntityPlacer.class){ + ItemStack[] theSlots = this.slots.clone(); + worldObj.removeTileEntity(xCoord, yCoord, zCoord); + worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityPlacer()); + ((TileEntityPlacer)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); + } + if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ if(this.currentTime > 0){ this.currentTime--; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFishingNet.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFishingNet.java index d4d84c4f2..6139fc209 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFishingNet.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFishingNet.java @@ -3,8 +3,13 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.FishingHooks; +import net.minecraftforge.common.util.ForgeDirection; import java.util.Random; @@ -17,15 +22,44 @@ public class TileEntityFishingNet extends TileEntityBase{ @Override public void updateEntity(){ if(!worldObj.isRemote){ - if(worldObj.getBlock(xCoord, yCoord-1, zCoord).getMaterial() == Material.water){ - Random rand = new Random(); - if(this.timeUntilNextDrop > 0){ - this.timeUntilNextDrop--; - if(timeUntilNextDrop <= 0){ - worldObj.spawnEntityInWorld(new EntityItem(worldObj, xCoord+0.5, yCoord+1.8, zCoord+0.5, FishingHooks.getRandomFishable(rand, this.worldObj.rand.nextFloat()))); + if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ + if(worldObj.getBlock(xCoord, yCoord - 1, zCoord).getMaterial() == Material.water){ + Random rand = new Random(); + if(this.timeUntilNextDrop > 0){ + this.timeUntilNextDrop--; + if(timeUntilNextDrop <= 0){ + ItemStack fishable = FishingHooks.getRandomFishable(rand, this.worldObj.rand.nextFloat()); + TileEntity tile = worldObj.getTileEntity(xCoord, yCoord + 1, zCoord); + if(tile != null && tile instanceof IInventory){ + this.insertIntoInventory((IInventory)tile, fishable); + } + else{ + EntityItem item = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, fishable); + item.lifespan = 2000; + worldObj.spawnEntityInWorld(item); + } + } + } + else this.timeUntilNextDrop = this.timeUntilNextDropToSet + rand.nextInt(this.timeUntilNextDropToSet / 2); + } + } + } + } + + public void insertIntoInventory(IInventory inventory, ItemStack stack){ + for(int i = 0; i < inventory.getSizeInventory(); i++){ + if(inventory.isItemValidForSlot(i, stack)){ + if(!(inventory instanceof ISidedInventory) || ((ISidedInventory)inventory).canInsertItem(i, stack, ForgeDirection.DOWN.flag)){ + ItemStack slot = inventory.getStackInSlot(i); + if(slot == null){ + inventory.setInventorySlotContents(i, stack); + return; + } + if(slot.isItemEqual(stack) && slot.stackSize <= slot.getMaxStackSize() - stack.stackSize && slot.stackSize <= inventory.getInventoryStackLimit() - stack.stackSize){ + slot.stackSize += stack.stackSize; + return; } } - else this.timeUntilNextDrop = this.timeUntilNextDropToSet + rand.nextInt(this.timeUntilNextDropToSet/2); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index 6c80adcdd..e9057a3cf 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -57,6 +57,15 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + + //TODO Remove after some Updating + if(this.isDouble && this.getClass() != TileEntityGrinderDouble.class){ + ItemStack[] theSlots = this.slots.clone(); + worldObj.removeTileEntity(xCoord, yCoord, zCoord); + worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityGrinderDouble()); + ((TileEntityGrinderDouble)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); + } + this.speedUp(); boolean theFlag = this.coalTimeLeft > 0; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java index c96d5953f..7cb0f5ff6 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java @@ -45,6 +45,15 @@ public class TileEntityInputter extends TileEntityInventoryBase{ @Override public void updateEntity(){ if(!worldObj.isRemote){ + + //TODO Remove after some Updating + if(this.isAdvanced && this.getClass() != TileEntityInputterAdvanced.class){ + ItemStack[] theSlots = this.slots.clone(); + worldObj.removeTileEntity(xCoord, yCoord, zCoord); + worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityInputterAdvanced()); + ((TileEntityInputterAdvanced)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); + } + this.initVars(); if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java index 2ecc4bc2d..0ba5b40b2 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java @@ -78,7 +78,10 @@ public abstract class TileEntityInventoryBase extends TileEntityBase implements @Override public ItemStack getStackInSlot(int i){ - return slots[i]; + if(i < this.getSizeInventory()){ + return slots[i]; + } + return null; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 94584f60d..6b79d8d70 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.4.3"; + public static final String VERSION = "1.7.10-0.0.4.4"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 9c5c10455..445f97aa0 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -58,6 +58,7 @@ item.actuallyadditions.itemJamChApCi.name=ChApCi-Jam item.actuallyadditions.itemJamHoMeKi.name=HoMeKi-Jam item.actuallyadditions.itemJamPiCo.name=PiCo-Jam +item.actuallyadditions.itemHairyBall.name=Ball of Hair item.actuallyadditions.itemLeafBlower.name=Leaf Blower item.actuallyadditions.itemLeafBlowerAdvanced.name=Advanced Leaf Blower item.actuallyadditions.itemKnife.name=Knife @@ -131,53 +132,8 @@ tooltip.actuallyadditions.itemJamChApCi.desc=Cherry, Apple and Cinnamon tooltip.actuallyadditions.itemJamHoMeKi.desc=Honeydew Melon and Kiwi tooltip.actuallyadditions.itemJamPiCo.desc=Pineapple and Coconut -tile.actuallyadditions.blockCompactIronSingle.name=Single Compact Iron -tile.actuallyadditions.blockCompactIronDouble.name=Double Compact Iron -tile.actuallyadditions.blockCompactIronTriple.name=Triple Compact Iron -tile.actuallyadditions.blockCompactIronQuadruple.name=Quadruple Compact Iron -tile.actuallyadditions.blockCompactIronQuintuple.name=Quintuple Compact Iron -tile.actuallyadditions.blockCompactIronSextuple.name=Sextuple Compact Iron -tooltip.actuallyadditions.blockCompactIron.desc=Iron, but bunched together! - -tile.actuallyadditions.blockCompactGoldSingle.name=Single Compact Gold -tile.actuallyadditions.blockCompactGoldDouble.name=Double Compact Gold -tile.actuallyadditions.blockCompactGoldTriple.name=Triple Compact Gold -tile.actuallyadditions.blockCompactGoldQuadruple.name=Quadruple Compact Gold -tile.actuallyadditions.blockCompactGoldQuintuple.name=Quintuple Compact Gold -tile.actuallyadditions.blockCompactGoldSextuple.name=Sextuple Compact Gold -tooltip.actuallyadditions.blockCompactGold.desc=Gold, but bunched together! - -tile.actuallyadditions.blockCompactDiamondSingle.name=Single Compact Diamond -tile.actuallyadditions.blockCompactDiamondDouble.name=Double Compact Diamond -tile.actuallyadditions.blockCompactDiamondTriple.name=Triple Compact Diamond -tile.actuallyadditions.blockCompactDiamondQuadruple.name=Quadruple Compact Diamond -tile.actuallyadditions.blockCompactDiamondQuintuple.name=Quintuple Compact Diamond -tile.actuallyadditions.blockCompactDiamondSextuple.name=Sextuple Compact Diamond -tooltip.actuallyadditions.blockCompactDiamond.desc=Diamond, but bunched together! - -tile.actuallyadditions.blockCompactRedstoneSingle.name=Single Compact Redstone -tile.actuallyadditions.blockCompactRedstoneDouble.name=Double Compact Redstone -tile.actuallyadditions.blockCompactRedstoneTriple.name=Triple Compact Redstone -tile.actuallyadditions.blockCompactRedstoneQuadruple.name=Quadruple Compact Redstone -tile.actuallyadditions.blockCompactRedstoneQuintuple.name=Quintuple Compact Redstone -tile.actuallyadditions.blockCompactRedstoneSextuple.name=Sextuple Compact Redstone -tooltip.actuallyadditions.blockCompactRedstone.desc=Redstone, but bunched together! - -tile.actuallyadditions.blockCompactCoalSingle.name=Single Compact Coal -tile.actuallyadditions.blockCompactCoalDouble.name=Double Compact Coal -tile.actuallyadditions.blockCompactCoalTriple.name=Triple Compact Coal -tile.actuallyadditions.blockCompactCoalQuadruple.name=Quadruple Compact Coal -tile.actuallyadditions.blockCompactCoalQuintuple.name=Quintuple Compact Coal -tile.actuallyadditions.blockCompactCoalSextuple.name=Sextuple Compact Coal -tooltip.actuallyadditions.blockCompactCoal.desc=Coal, but bunched together! - -tile.actuallyadditions.blockCompactLapisSingle.name=Single Compact Lapis -tile.actuallyadditions.blockCompactLapisDouble.name=Double Compact Lapis -tile.actuallyadditions.blockCompactLapisTriple.name=Triple Compact Lapis -tile.actuallyadditions.blockCompactLapisQuadruple.name=Quadruple Compact Lapis -tile.actuallyadditions.blockCompactLapisQuintuple.name=Quintuple Compact Lapis -tile.actuallyadditions.blockCompactLapisSextuple.name=Sextuple Compact Lapis -tooltip.actuallyadditions.blockCompactLapis.desc=Lapis, but bunched together! +tooltip.actuallyadditions.itemHairyBall.desc.1=A Ball of Hair dropped from a Cat... +tooltip.actuallyadditions.itemHairyBall.desc.2=Maybe you can get something from it by using it... tooltip.actuallyadditions.itemUpgradeSpeed.desc.1=Speeds up Machines when placed in their Upgrade Slot tooltip.actuallyadditions.itemUpgradeSpeed.desc.2=Works in: @@ -344,6 +300,7 @@ info.actuallyadditions.update.generic.desc=[{"text":"There is an "},{"text":"Upd info.actuallyadditions.update.versionComp.desc=[{"text":"You have Version "},{"text":"%s","color":"dark_red","italic":"false"},{"text":", the newest one is ","color":"none","italic":"false"},{"text":"%s","color":"dark_green","underlined":"false"},{"text":"!","color":"none","underlined":"false"}] info.actuallyadditions.update.download.desc=[{"text":"Download the newest Version "},{"text":"here! (Click me!)","color":"dark_green","underlined":"true","clickEvent":{"action":"open_url","value":"%s"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Click here to open your Browser and download the newest Version!"}]}}}] info.actuallyadditions.update.failed.desc=[{"text":"The Update Check for "},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"failed! Check your Internet Connection and the Logs for more Info!","color":"none"}] +info.actuallyadditions.update.new.desc=Important Changes: achievement.actuallyadditions.pickUpSolidXP=Hard and Rich and Stuff achievement.actuallyadditions.pickUpSolidXP.desc=Pick up some Solidified Experience diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemHairyBall.png b/src/main/resources/assets/actuallyadditions/textures/items/itemHairyBall.png new file mode 100644 index 0000000000000000000000000000000000000000..f8d9492a7b8a3078bed8a38912d4632714b11793 GIT binary patch literal 365 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&os5wC>5yYwWo_? zh=u>&i5CT%6$D&X9+T2JuO<9+_tUPDo+&3ytO&MZC$p(bD5+=90$)xJyI7)eBsgd=J!30)Y3&89VJ>B zr52Vt8#t>K?qZl-!qy=xzwtNA!o>bxUz~2roc-5-@Paj`u&l-mzLy@c%y+N0tb9DL zsf0&Fz#(hKf`xv9%lfLBTp9$zc Date: Wed, 20 May 2015 22:39:43 +0200 Subject: [PATCH 02/29] Added tons of stuff! --- build.gradle | 2 +- src/main/java/cofh/api/CoFHAPIProps.java | 11 ++ .../java/cofh/api/energy/EnergyStorage.java | 158 ++++++++++++++++ .../cofh/api/energy/IEnergyConnection.java | 21 +++ .../cofh/api/energy/IEnergyContainerItem.java | 52 ++++++ .../java/cofh/api/energy/IEnergyHandler.java | 58 ++++++ .../java/cofh/api/energy/IEnergyProvider.java | 38 ++++ .../java/cofh/api/energy/IEnergyReceiver.java | 38 ++++ .../java/cofh/api/energy/IEnergyStorage.java | 46 +++++ .../cofh/api/energy/ItemEnergyContainer.java | 110 +++++++++++ .../cofh/api/energy/TileEnergyHandler.java | 65 +++++++ .../java/cofh/api/energy/package-info.java | 10 + src/main/java/cofh/api/package-info.java | 9 + .../actuallyadditions/ActuallyAdditions.java | 2 + .../ellpeck/actuallyadditions/PLANNED.txt | 39 +++- .../blocks/BlockCanolaPress.java | 112 +++++++++++ .../blocks/BlockCoalGenerator.java | 112 +++++++++++ .../blocks/BlockCompost.java | 3 + ...achine.java => BlockFermentingBarrel.java} | 78 ++++---- .../blocks/BlockFluidFlowing.java | 103 +++++++++++ .../blocks/BlockFurnaceDouble.java | 1 + .../blocks/BlockFurnaceSolar.java | 1 + .../blocks/BlockGrinder.java | 2 + .../blocks/BlockHeatCollector.java | 1 + .../blocks/BlockItemRepairer.java | 1 + .../blocks/BlockOilGenerator.java | 112 +++++++++++ .../blocks/BlockPhantomface.java | 112 +++++++++++ .../actuallyadditions/blocks/BlockPlant.java | 138 ++++++++++++++ .../actuallyadditions/blocks/FluidAA.java | 10 + .../actuallyadditions/blocks/InitBlocks.java | 51 +++++ .../blocks/metalists/TheMiscBlocks.java | 4 +- .../config/values/ConfigBoolValues.java | 6 +- .../config/values/ConfigCrafting.java | 15 +- .../config/values/ConfigIntValues.java | 38 +++- .../crafting/BlockCrafting.java | 72 +++++++- .../crafting/FoodCrafting.java | 5 + .../crafting/GrinderCrafting.java | 16 +- .../crafting/ItemCrafting.java | 57 ++++-- .../crafting/MiscCrafting.java | 6 + .../creative/CreativeTab.java | 18 +- .../event/BucketFillEvent.java | 31 ++++ .../actuallyadditions/event/InitEvents.java | 2 + .../event/WorldDecorationEvent.java | 63 +++++++ .../gen/JamVillagerTradeHandler.java | 18 +- .../inventory/ContainerCanolaPress.java | 127 +++++++++++++ .../inventory/ContainerCoalGenerator.java | 117 ++++++++++++ .../inventory/ContainerFermentingBarrel.java | 126 +++++++++++++ .../inventory/ContainerFurnaceDouble.java | 45 ++--- .../inventory/ContainerGrinder.java | 45 ++--- .../inventory/ContainerOilGenerator.java | 120 ++++++++++++ .../inventory/ContainerRepairer.java | 25 +-- .../inventory/GuiBreaker.java | 2 +- .../inventory/GuiCanolaPress.java | 75 ++++++++ .../inventory/GuiCoalGenerator.java | 64 +++++++ .../inventory/GuiCrafter.java | 2 +- .../inventory/GuiDropper.java | 2 +- .../inventory/GuiFeeder.java | 2 +- .../inventory/GuiFermentingBarrel.java | 75 ++++++++ .../inventory/GuiFurnaceDouble.java | 15 +- .../inventory/GuiGiantChest.java | 2 +- .../inventory/GuiGrinder.java | 15 +- .../inventory/GuiHandler.java | 32 +++- .../inventory/GuiInputter.java | 2 +- .../inventory/GuiOilGenerator.java | 74 ++++++++ .../inventory/GuiRepairer.java | 15 +- .../actuallyadditions/items/InitItems.java | 37 +++- .../{ItemUpgrade.java => ItemBucketAA.java} | 30 +-- .../items/ItemHairyBall.java | 1 + .../items/ItemPhantomConnector.java | 146 +++++++++++++++ .../items/ItemResonantRice.java | 62 +++++++ .../actuallyadditions/items/ItemSeed.java | 130 +++++++++++++ .../items/metalists/TheFoods.java | 4 +- .../items/metalists/TheJams.java | 12 +- .../items/metalists/TheMiscItems.java | 7 +- .../nei/CompostRecipeHandler.java | 109 +++++++++++ .../nei/CrusherRecipeHandler.java | 65 +------ .../nei/HairyBallRecipeHandler.java | 129 +++++++++++++ .../nei/NEIActuallyAdditionsConfig.java | 13 +- .../actuallyadditions/recipe/FuelHandler.java | 72 ++++++++ .../recipe/GrinderRecipes.java | 6 +- .../recipe/HairyBallHandler.java | 2 + .../tile/IPowerAcceptor.java | 12 -- .../tile/TileEntityBase.java | 5 + .../tile/TileEntityCanolaPress.java | 174 ++++++++++++++++++ .../tile/TileEntityCoalGenerator.java | 117 ++++++++++++ .../tile/TileEntityFermentingBarrel.java | 153 +++++++++++++++ .../tile/TileEntityFurnaceDouble.java | 102 ++++------ .../tile/TileEntityFurnaceSolar.java | 79 +++++--- .../tile/TileEntityGrinder.java | 116 +++++------- .../tile/TileEntityHeatCollector.java | 80 +++++--- .../tile/TileEntityInventoryBase.java | 32 ++-- .../tile/TileEntityItemRepairer.java | 93 ++++------ .../tile/TileEntityOilGenerator.java | 168 +++++++++++++++++ .../tile/TileEntityPhantomface.java | 164 +++++++++++++++++ .../tile/TileEntityUpgradable.java | 40 ---- .../actuallyadditions/util/AssetUtil.java | 4 +- .../actuallyadditions/util/BlockUtil.java | 25 ++- .../actuallyadditions/util/ItemUtil.java | 6 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 26 +++ .../waila/WailaDataProvider.java | 37 +++- .../assets/actuallyadditions/lang/en_US.lang | 94 +++++++++- .../textures/blocks/blockCanolaOilFlowing.png | Bin 0 -> 10800 bytes .../blocks/blockCanolaOilFlowing.png.mcmeta | 3 + .../textures/blocks/blockCanolaOilStill.png | Bin 0 -> 10857 bytes .../blocks/blockCanolaOilStill.png.mcmeta | 5 + .../textures/blocks/blockCanolaPress.png | Bin 0 -> 883 bytes .../textures/blocks/blockCanolaPressTop.png | Bin 0 -> 921 bytes .../textures/blocks/blockCanolaStage1.png | Bin 0 -> 282 bytes .../textures/blocks/blockCanolaStage2.png | Bin 0 -> 279 bytes .../textures/blocks/blockCanolaStage3.png | Bin 0 -> 324 bytes .../textures/blocks/blockCanolaStage4.png | Bin 0 -> 358 bytes .../textures/blocks/blockCoalGenerator.png | Bin 0 -> 527 bytes .../textures/blocks/blockCoalGeneratorTop.png | Bin 0 -> 550 bytes .../textures/blocks/blockFermentingBarrel.png | Bin 0 -> 783 bytes .../blocks/blockFermentingBarrelTop.png | Bin 0 -> 707 bytes .../textures/blocks/blockMiscCharcoal.png | Bin 0 -> 484 bytes .../textures/blocks/blockMiscEnderpearl.png | Bin 0 -> 830 bytes .../textures/blocks/blockOilFlowing.png | Bin 0 -> 9946 bytes .../blocks/blockOilFlowing.png.mcmeta | 3 + .../textures/blocks/blockOilGenerator.png | Bin 0 -> 490 bytes .../textures/blocks/blockOilGeneratorTop.png | Bin 0 -> 537 bytes .../textures/blocks/blockOilStill.png | Bin 0 -> 9022 bytes .../textures/blocks/blockOilStill.png.mcmeta | 5 + .../textures/blocks/blockPhantomface.png | Bin 0 -> 798 bytes .../textures/blocks/blockRiceStage1.png | Bin 0 -> 258 bytes .../textures/blocks/blockRiceStage2.png | Bin 0 -> 316 bytes .../textures/blocks/blockRiceStage3.png | Bin 0 -> 385 bytes .../textures/blocks/blockRiceStage4.png | Bin 0 -> 478 bytes .../textures/blocks/blockRiceStage5.png | Bin 0 -> 621 bytes .../textures/blocks/blockRiceStage6.png | Bin 0 -> 637 bytes .../textures/gui/guiCanolaPress.png | Bin 0 -> 2441 bytes .../textures/gui/guiCoalGenerator.png | Bin 0 -> 2036 bytes .../textures/gui/guiFermentingBarrel.png | Bin 0 -> 2459 bytes .../textures/gui/guiFurnaceDouble.png | Bin 2337 -> 2190 bytes .../textures/gui/guiGrinder.png | Bin 2462 -> 2212 bytes .../textures/gui/guiGrinderDouble.png | Bin 2601 -> 2423 bytes .../textures/gui/guiNEICompost.png | Bin 0 -> 1786 bytes .../textures/gui/guiNEIHairyBall.png | Bin 0 -> 1786 bytes .../textures/gui/guiOilGenerator.png | Bin 0 -> 2121 bytes .../textures/gui/guiRepairer.png | Bin 2145 -> 2036 bytes .../textures/items/itemBucketCanolaOil.png | Bin 0 -> 339 bytes .../textures/items/itemBucketOil.png | Bin 0 -> 338 bytes .../textures/items/itemCanolaSeed.png | Bin 0 -> 258 bytes .../textures/items/itemFoodRice.png | Bin 0 -> 512 bytes .../textures/items/itemFoodRiceBread.png | Bin 0 -> 347 bytes .../textures/items/itemMiscCanola.png | Bin 0 -> 428 bytes .../textures/items/itemMiscRiceDough.png | Bin 0 -> 363 bytes .../textures/items/itemMiscRiceSlime.png | Bin 0 -> 340 bytes .../textures/items/itemMiscTinyCharcoal.png | Bin 0 -> 368 bytes .../textures/items/itemMiscTinyCoal.png | Bin 0 -> 331 bytes .../textures/items/itemPhantomConnector.png | Bin 0 -> 330 bytes .../textures/items/itemResonantRice.png | Bin 0 -> 553 bytes .../textures/items/itemRiceSeed.png | Bin 0 -> 283 bytes src/main/resources/mcmod.info | 2 +- 155 files changed, 4573 insertions(+), 628 deletions(-) create mode 100644 src/main/java/cofh/api/CoFHAPIProps.java create mode 100644 src/main/java/cofh/api/energy/EnergyStorage.java create mode 100644 src/main/java/cofh/api/energy/IEnergyConnection.java create mode 100644 src/main/java/cofh/api/energy/IEnergyContainerItem.java create mode 100644 src/main/java/cofh/api/energy/IEnergyHandler.java create mode 100644 src/main/java/cofh/api/energy/IEnergyProvider.java create mode 100644 src/main/java/cofh/api/energy/IEnergyReceiver.java create mode 100644 src/main/java/cofh/api/energy/IEnergyStorage.java create mode 100644 src/main/java/cofh/api/energy/ItemEnergyContainer.java create mode 100644 src/main/java/cofh/api/energy/TileEnergyHandler.java create mode 100644 src/main/java/cofh/api/energy/package-info.java create mode 100644 src/main/java/cofh/api/package-info.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java rename src/main/java/ellpeck/actuallyadditions/blocks/{BlockCoffeeMachine.java => BlockFermentingBarrel.java} (66%) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/FluidAA.java create mode 100644 src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java create mode 100644 src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoalGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java rename src/main/java/ellpeck/actuallyadditions/items/{ItemUpgrade.java => ItemBucketAA.java} (71%) create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java create mode 100644 src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java create mode 100644 src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java create mode 100644 src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/tile/IPowerAcceptor.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityUpgradable.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png.mcmeta create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilStill.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilStill.png.mcmeta create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaPress.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaPressTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage1.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage2.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage3.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage4.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGenerator.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGeneratorTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFermentingBarrel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFermentingBarrelTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscCharcoal.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscEnderpearl.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png.mcmeta create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGenerator.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGeneratorTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png.mcmeta create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomface.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage1.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage2.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage3.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage4.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage5.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage6.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiCanolaPress.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiCoalGenerator.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiFermentingBarrel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiNEICompost.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiNEIHairyBall.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiOilGenerator.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemBucketCanolaOil.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemBucketOil.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemCanolaSeed.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemFoodRice.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemFoodRiceBread.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscCanola.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscRiceDough.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscRiceSlime.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscTinyCharcoal.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscTinyCoal.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemPhantomConnector.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemResonantRice.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemRiceSeed.png diff --git a/build.gradle b/build.gradle index c5b1c8c5b..63a38bcf0 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.4.4" +version = "1.7.10-0.0.5.0" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/cofh/api/CoFHAPIProps.java b/src/main/java/cofh/api/CoFHAPIProps.java new file mode 100644 index 000000000..9b528304a --- /dev/null +++ b/src/main/java/cofh/api/CoFHAPIProps.java @@ -0,0 +1,11 @@ +package cofh.api; + +public class CoFHAPIProps { + + private CoFHAPIProps() { + + } + + public static final String VERSION = "1.7.10R1.0.2"; + +} diff --git a/src/main/java/cofh/api/energy/EnergyStorage.java b/src/main/java/cofh/api/energy/EnergyStorage.java new file mode 100644 index 000000000..1674c1894 --- /dev/null +++ b/src/main/java/cofh/api/energy/EnergyStorage.java @@ -0,0 +1,158 @@ +package cofh.api.energy; + +import net.minecraft.nbt.NBTTagCompound; + +/** + * Reference implementation of {@link IEnergyStorage}. Use/extend this or implement your own. + * + * @author King Lemming + * + */ +public class EnergyStorage implements IEnergyStorage { + + protected int energy; + protected int capacity; + protected int maxReceive; + protected int maxExtract; + + public EnergyStorage(int capacity) { + + this(capacity, capacity, capacity); + } + + public EnergyStorage(int capacity, int maxTransfer) { + + this(capacity, maxTransfer, maxTransfer); + } + + public EnergyStorage(int capacity, int maxReceive, int maxExtract) { + + this.capacity = capacity; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + } + + public EnergyStorage readFromNBT(NBTTagCompound nbt) { + + this.energy = nbt.getInteger("Energy"); + + if (energy > capacity) { + energy = capacity; + } + return this; + } + + public NBTTagCompound writeToNBT(NBTTagCompound nbt) { + + if (energy < 0) { + energy = 0; + } + nbt.setInteger("Energy", energy); + return nbt; + } + + public void setCapacity(int capacity) { + + this.capacity = capacity; + + if (energy > capacity) { + energy = capacity; + } + } + + public void setMaxTransfer(int maxTransfer) { + + setMaxReceive(maxTransfer); + setMaxExtract(maxTransfer); + } + + public void setMaxReceive(int maxReceive) { + + this.maxReceive = maxReceive; + } + + public void setMaxExtract(int maxExtract) { + + this.maxExtract = maxExtract; + } + + public int getMaxReceive() { + + return maxReceive; + } + + public int getMaxExtract() { + + return maxExtract; + } + + /** + * This function is included to allow for server -> client sync. Do not call this externally to the containing Tile Entity, as not all IEnergyHandlers + * are guaranteed to have it. + * + * @param energy + */ + public void setEnergyStored(int energy) { + + this.energy = energy; + + if (this.energy > capacity) { + this.energy = capacity; + } else if (this.energy < 0) { + this.energy = 0; + } + } + + /** + * This function is included to allow the containing tile to directly and efficiently modify the energy contained in the EnergyStorage. Do not rely on this + * externally, as not all IEnergyHandlers are guaranteed to have it. + * + * @param energy + */ + public void modifyEnergyStored(int energy) { + + this.energy += energy; + + if (this.energy > capacity) { + this.energy = capacity; + } else if (this.energy < 0) { + this.energy = 0; + } + } + + /* IEnergyStorage */ + @Override + public int receiveEnergy(int maxReceive, boolean simulate) { + + int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive)); + + if (!simulate) { + energy += energyReceived; + } + return energyReceived; + } + + @Override + public int extractEnergy(int maxExtract, boolean simulate) { + + int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); + + if (!simulate) { + energy -= energyExtracted; + } + return energyExtracted; + } + + @Override + public int getEnergyStored() { + + return energy; + } + + @Override + public int getMaxEnergyStored() { + + return capacity; + } + +} diff --git a/src/main/java/cofh/api/energy/IEnergyConnection.java b/src/main/java/cofh/api/energy/IEnergyConnection.java new file mode 100644 index 000000000..79bdf77af --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyConnection.java @@ -0,0 +1,21 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on TileEntities which should connect to energy transportation blocks. This is intended for blocks which generate energy but do not + * accept it; otherwise just use IEnergyHandler. + *

+ * Note that {@link IEnergyHandler} is an extension of this. + * + * @author King Lemming + * + */ +public interface IEnergyConnection { + + /** + * Returns TRUE if the TileEntity can connect on a given side. + */ + boolean canConnectEnergy(ForgeDirection from); + +} diff --git a/src/main/java/cofh/api/energy/IEnergyContainerItem.java b/src/main/java/cofh/api/energy/IEnergyContainerItem.java new file mode 100644 index 000000000..c28455b1a --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyContainerItem.java @@ -0,0 +1,52 @@ +package cofh.api.energy; + +import net.minecraft.item.ItemStack; + +/** + * Implement this interface on Item classes that support external manipulation of their internal energy storages. + *

+ * A reference implementation is provided {@link ItemEnergyContainer}. + * + * @author King Lemming + * + */ +public interface IEnergyContainerItem { + + /** + * Adds energy to a container item. Returns the quantity of energy that was accepted. This should always return 0 if the item cannot be externally charged. + * + * @param container + * ItemStack to be charged. + * @param maxReceive + * Maximum amount of energy to be sent into the item. + * @param simulate + * If TRUE, the charge will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) received by the item. + */ + int receiveEnergy(ItemStack container, int maxReceive, boolean simulate); + + /** + * Removes energy from a container item. Returns the quantity of energy that was removed. This should always return 0 if the item cannot be externally + * discharged. + * + * @param container + * ItemStack to be discharged. + * @param maxExtract + * Maximum amount of energy to be extracted from the item. + * @param simulate + * If TRUE, the discharge will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) extracted from the item. + */ + int extractEnergy(ItemStack container, int maxExtract, boolean simulate); + + /** + * Get the amount of energy currently stored in the container item. + */ + int getEnergyStored(ItemStack container); + + /** + * Get the max amount of energy that can be stored in the container item. + */ + int getMaxEnergyStored(ItemStack container); + +} diff --git a/src/main/java/cofh/api/energy/IEnergyHandler.java b/src/main/java/cofh/api/energy/IEnergyHandler.java new file mode 100644 index 000000000..22f2dbc62 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyHandler.java @@ -0,0 +1,58 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on Tile Entities which should handle energy, generally storing it in one or more internal {@link IEnergyStorage} objects. + *

+ * A reference implementation is provided {@link TileEnergyHandler}. + * + * @author King Lemming + * + */ +public interface IEnergyHandler extends IEnergyProvider, IEnergyReceiver { + + // merely a convenience interface (remove these methods in 1.8; provided here for back-compat via compiler doing things) + + /** + * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. + * + * @param from + * Orientation the energy is received from. + * @param maxReceive + * Maximum amount of energy to receive. + * @param simulate + * If TRUE, the charge will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) received. + */ + @Override + int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); + + /** + * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. + * + * @param from + * Orientation the energy is extracted from. + * @param maxExtract + * Maximum amount of energy to extract. + * @param simulate + * If TRUE, the extraction will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) extracted. + */ + @Override + int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); + + + /** + * Returns the amount of energy currently stored. + */ + @Override + int getEnergyStored(ForgeDirection from); + + /** + * Returns the maximum amount of energy that can be stored. + */ + @Override + int getMaxEnergyStored(ForgeDirection from); + +} diff --git a/src/main/java/cofh/api/energy/IEnergyProvider.java b/src/main/java/cofh/api/energy/IEnergyProvider.java new file mode 100644 index 000000000..05287b35e --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyProvider.java @@ -0,0 +1,38 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on Tile Entities which should provide energy, generally storing it in one or more internal {@link IEnergyStorage} objects. + *

+ * A reference implementation is provided {@link TileEnergyHandler}. + * + * @author King Lemming + * + */ +public interface IEnergyProvider extends IEnergyConnection { + + /** + * Remove energy from an IEnergyProvider, internal distribution is left entirely to the IEnergyProvider. + * + * @param from + * Orientation the energy is extracted from. + * @param maxExtract + * Maximum amount of energy to extract. + * @param simulate + * If TRUE, the extraction will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) extracted. + */ + int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate); + + /** + * Returns the amount of energy currently stored. + */ + int getEnergyStored(ForgeDirection from); + + /** + * Returns the maximum amount of energy that can be stored. + */ + int getMaxEnergyStored(ForgeDirection from); + +} diff --git a/src/main/java/cofh/api/energy/IEnergyReceiver.java b/src/main/java/cofh/api/energy/IEnergyReceiver.java new file mode 100644 index 000000000..c726e09e0 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyReceiver.java @@ -0,0 +1,38 @@ +package cofh.api.energy; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Implement this interface on Tile Entities which should receive energy, generally storing it in one or more internal {@link IEnergyStorage} objects. + *

+ * A reference implementation is provided {@link TileEnergyHandler}. + * + * @author King Lemming + * + */ +public interface IEnergyReceiver extends IEnergyConnection { + + /** + * Add energy to an IEnergyReceiver, internal distribution is left entirely to the IEnergyReceiver. + * + * @param from + * Orientation the energy is received from. + * @param maxReceive + * Maximum amount of energy to receive. + * @param simulate + * If TRUE, the charge will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) received. + */ + int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate); + + /** + * Returns the amount of energy currently stored. + */ + int getEnergyStored(ForgeDirection from); + + /** + * Returns the maximum amount of energy that can be stored. + */ + int getMaxEnergyStored(ForgeDirection from); + +} diff --git a/src/main/java/cofh/api/energy/IEnergyStorage.java b/src/main/java/cofh/api/energy/IEnergyStorage.java new file mode 100644 index 000000000..bc2065607 --- /dev/null +++ b/src/main/java/cofh/api/energy/IEnergyStorage.java @@ -0,0 +1,46 @@ +package cofh.api.energy; + +/** + * An energy storage is the unit of interaction with Energy inventories.
+ * This is not to be implemented on TileEntities. This is for internal use only. + *

+ * A reference implementation can be found at {@link EnergyStorage}. + * + * @author King Lemming + * + */ +public interface IEnergyStorage { + + /** + * Adds energy to the storage. Returns quantity of energy that was accepted. + * + * @param maxReceive + * Maximum amount of energy to be inserted. + * @param simulate + * If TRUE, the insertion will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) accepted by the storage. + */ + int receiveEnergy(int maxReceive, boolean simulate); + + /** + * Removes energy from the storage. Returns quantity of energy that was removed. + * + * @param maxExtract + * Maximum amount of energy to be extracted. + * @param simulate + * If TRUE, the extraction will only be simulated. + * @return Amount of energy that was (or would have been, if simulated) extracted from the storage. + */ + int extractEnergy(int maxExtract, boolean simulate); + + /** + * Returns the amount of energy currently stored. + */ + int getEnergyStored(); + + /** + * Returns the maximum amount of energy that can be stored. + */ + int getMaxEnergyStored(); + +} diff --git a/src/main/java/cofh/api/energy/ItemEnergyContainer.java b/src/main/java/cofh/api/energy/ItemEnergyContainer.java new file mode 100644 index 000000000..055ae45bc --- /dev/null +++ b/src/main/java/cofh/api/energy/ItemEnergyContainer.java @@ -0,0 +1,110 @@ +package cofh.api.energy; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +/** + * Reference implementation of {@link IEnergyContainerItem}. Use/extend this or implement your own. + * + * @author King Lemming + * + */ +public class ItemEnergyContainer extends Item implements IEnergyContainerItem { + + protected int capacity; + protected int maxReceive; + protected int maxExtract; + + public ItemEnergyContainer() { + + } + + public ItemEnergyContainer(int capacity) { + + this(capacity, capacity, capacity); + } + + public ItemEnergyContainer(int capacity, int maxTransfer) { + + this(capacity, maxTransfer, maxTransfer); + } + + public ItemEnergyContainer(int capacity, int maxReceive, int maxExtract) { + + this.capacity = capacity; + this.maxReceive = maxReceive; + this.maxExtract = maxExtract; + } + + public ItemEnergyContainer setCapacity(int capacity) { + + this.capacity = capacity; + return this; + } + + public void setMaxTransfer(int maxTransfer) { + + setMaxReceive(maxTransfer); + setMaxExtract(maxTransfer); + } + + public void setMaxReceive(int maxReceive) { + + this.maxReceive = maxReceive; + } + + public void setMaxExtract(int maxExtract) { + + this.maxExtract = maxExtract; + } + + /* IEnergyContainerItem */ + @Override + public int receiveEnergy(ItemStack container, int maxReceive, boolean simulate) { + + if (container.stackTagCompound == null) { + container.stackTagCompound = new NBTTagCompound(); + } + int energy = container.stackTagCompound.getInteger("Energy"); + int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive)); + + if (!simulate) { + energy += energyReceived; + container.stackTagCompound.setInteger("Energy", energy); + } + return energyReceived; + } + + @Override + public int extractEnergy(ItemStack container, int maxExtract, boolean simulate) { + + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Energy")) { + return 0; + } + int energy = container.stackTagCompound.getInteger("Energy"); + int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract)); + + if (!simulate) { + energy -= energyExtracted; + container.stackTagCompound.setInteger("Energy", energy); + } + return energyExtracted; + } + + @Override + public int getEnergyStored(ItemStack container) { + + if (container.stackTagCompound == null || !container.stackTagCompound.hasKey("Energy")) { + return 0; + } + return container.stackTagCompound.getInteger("Energy"); + } + + @Override + public int getMaxEnergyStored(ItemStack container) { + + return capacity; + } + +} diff --git a/src/main/java/cofh/api/energy/TileEnergyHandler.java b/src/main/java/cofh/api/energy/TileEnergyHandler.java new file mode 100644 index 000000000..7cc655e92 --- /dev/null +++ b/src/main/java/cofh/api/energy/TileEnergyHandler.java @@ -0,0 +1,65 @@ +package cofh.api.energy; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Reference implementation of {@link IEnergyHandler}. Use/extend this or implement your own. + * + * @author King Lemming + * + */ +public class TileEnergyHandler extends TileEntity implements IEnergyHandler { + + protected EnergyStorage storage = new EnergyStorage(32000); + + @Override + public void readFromNBT(NBTTagCompound nbt) { + + super.readFromNBT(nbt); + storage.readFromNBT(nbt); + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + + super.writeToNBT(nbt); + storage.writeToNBT(nbt); + } + + /* IEnergyConnection */ + @Override + public boolean canConnectEnergy(ForgeDirection from) { + + return true; + } + + /* IEnergyReceiver */ + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate) { + + return storage.receiveEnergy(maxReceive, simulate); + } + + /* IEnergyProvider */ + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate) { + + return storage.extractEnergy(maxExtract, simulate); + } + + /* IEnergyReceiver and IEnergyProvider */ + @Override + public int getEnergyStored(ForgeDirection from) { + + return storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from) { + + return storage.getMaxEnergyStored(); + } + +} diff --git a/src/main/java/cofh/api/energy/package-info.java b/src/main/java/cofh/api/energy/package-info.java new file mode 100644 index 000000000..7379702b8 --- /dev/null +++ b/src/main/java/cofh/api/energy/package-info.java @@ -0,0 +1,10 @@ +/** + * (C) 2014 Team CoFH / CoFH / Cult of the Full Hub + * http://www.teamcofh.com + */ +@API(apiVersion = CoFHAPIProps.VERSION, owner = "CoFHAPI", provides = "CoFHAPI|energy") +package cofh.api.energy; + +import cofh.api.CoFHAPIProps; +import cpw.mods.fml.common.API; + diff --git a/src/main/java/cofh/api/package-info.java b/src/main/java/cofh/api/package-info.java new file mode 100644 index 000000000..08ff5fcb6 --- /dev/null +++ b/src/main/java/cofh/api/package-info.java @@ -0,0 +1,9 @@ +/** + * (C) 2014 Team CoFH / CoFH / Cult of the Full Hub + * http://www.teamcofh.com + */ +@API(apiVersion = CoFHAPIProps.VERSION, owner = "CoFHLib", provides = "CoFHAPI") +package cofh.api; + +import cpw.mods.fml.common.API; + diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index d6d0604a6..e22cfa268 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -21,6 +21,7 @@ import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.material.InitItemMaterials; import ellpeck.actuallyadditions.network.PacketHandler; import ellpeck.actuallyadditions.proxy.IProxy; +import ellpeck.actuallyadditions.recipe.FuelHandler; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; @@ -44,6 +45,7 @@ public class ActuallyAdditions{ InitBlocks.init(); InitItems.init(); InitVillager.init(); + FuelHandler.init(); proxy.preInit(); Util.logInfo("PreInitialization Finished."); diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index 44545e5e1..cc501acef 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -3,6 +3,10 @@ -Doesn't use Levels -Needs Quartz and Diamond Blocks instead of Bookcases around +-Chestie + -Follows you around + -Has an Inventory, a Crafting Table and a Furnace + -Instant Teleport Device -Teleports Players to where they look (Much like the Bukkit Compass) @@ -17,10 +21,6 @@ -Destroys excess Items (also determined by a Filter) -Gets emptied into Chest on Right-Click --Rice - -Gets planted in the Water - -Used to make Rice Flour and Rice Bread - -Auto-Crafting Item -Has a Recipe saved -Crafts Recipe on Shift-Right-Click if all Items are in Inventory @@ -57,7 +57,30 @@ -File Jukebox -Plays Sound Files put into your Minecraft Folder --RF Implementation - -Power Acceptor Block that powers Machines - -Machines still don't accept RF themselves! - -Solar Panel & Heat Collector produce RF \ No newline at end of file +-Oil Plant + -Used to make Oil (For use with other mods' machines) + +-Pharmacy Plants + -Give you different effects + +-Multi-Block Ore Factory + -Fluids and things higher Multiplying Chance (x2, x3..) + -Speed Upgrades etc. + +-Advanced Redstone Transmitter + -You can mark an area + -On Activation, all blocks in the area get a Signal + +-Lava Factory + -2x3 Multi Block + -Requires Energy + -Produces Lava from Cobblestone + -Has Upgrade Slots + +-Phantom Chest + -Is bound to Inventory on Right-Click + -Allows you to open the bound Inventory when placed down + -Only accessible with Pipes etc. + -ISided like the bound Block + -Range of 10, Range Upgrade adds 15 Range + -Nether Star allows direct GUI Access and adds 50 Range diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java new file mode 100644 index 000000000..16ca12ff4 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java @@ -0,0 +1,112 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityCanolaPress; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockCanolaPress extends BlockContainerBase implements INameableItem{ + + private IIcon topIcon; + + public BlockCanolaPress(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityCanolaPress(); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side == 1 || side == 0 ? this.topIcon : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityCanolaPress press = (TileEntityCanolaPress)world.getTileEntity(x, y, z); + if (press != null) player.openGui(ActuallyAdditions.instance, GuiHandler.CANOLA_PRESS_ID, world, x, y, z); + return true; + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return "blockCanolaPress"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityCanolaPress.energyUsedPerTick); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java new file mode 100644 index 000000000..b57296420 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java @@ -0,0 +1,112 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityCoalGenerator; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockCoalGenerator extends BlockContainerBase implements INameableItem{ + + private IIcon topIcon; + + public BlockCoalGenerator(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityCoalGenerator(); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side <= 1 ? this.topIcon : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityCoalGenerator press = (TileEntityCoalGenerator)world.getTileEntity(x, y, z); + if (press != null) player.openGui(ActuallyAdditions.instance, GuiHandler.COAL_GENERATOR_ID, world, x, y, z); + return true; + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return "blockCoalGenerator"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerProductionInfo(list, TileEntityCoalGenerator.energyProducedPerTick); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java index ec518b1c4..2fb26fdc5 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java @@ -33,6 +33,8 @@ public class BlockCompost extends BlockContainerBase implements INameableItem{ this.setHarvestLevel("axe", 0); this.setHardness(1.0F); this.setStepSound(soundTypeWood); + + this.setBlockBoundsForItemRender(); } @Override @@ -46,6 +48,7 @@ public class BlockCompost extends BlockContainerBase implements INameableItem{ else tile.slots[0].stackSize++; if(!player.capabilities.isCreativeMode) player.inventory.getCurrentItem().stackSize--; } + //Add Fertilizer to player's inventory else if(tile.slots[0] != null && (stackPlayer == null || (stackPlayer.getItem() instanceof ItemFertilizer && stackPlayer.stackSize <= stackPlayer.getMaxStackSize() - tile.slots[0].stackSize)) && tile.slots[0].getItem() instanceof ItemFertilizer){ if(stackPlayer == null) player.inventory.setInventorySlotContents(player.inventory.currentItem, tile.slots[0].copy()); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java similarity index 66% rename from src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java rename to src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java index af10c8998..68ab2eb43 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java @@ -1,15 +1,17 @@ package ellpeck.actuallyadditions.blocks; -import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -19,9 +21,11 @@ import net.minecraft.world.World; import java.util.List; -public class BlockCoffeeMachine extends BlockContainerBase implements INameableItem{ +public class BlockFermentingBarrel extends BlockContainerBase implements INameableItem{ - public BlockCoffeeMachine(){ + private IIcon iconTop; + + public BlockFermentingBarrel(){ super(Material.wood); this.setHarvestLevel("axe", 0); this.setHardness(1.0F); @@ -29,44 +33,25 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI } @Override - public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int f6, float f7, float f8, float f9){ - if(!world.isRemote){ + public String getOredictName(){ + return this.getName(); + } + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityFermentingBarrel(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityFermentingBarrel press = (TileEntityFermentingBarrel)world.getTileEntity(x, y, z); + if (press != null) player.openGui(ActuallyAdditions.instance, GuiHandler.FERMENTING_BARREL_ID, world, x, y, z); + return true; } return true; } - @Override - public IIcon getIcon(int side, int metadata){ - return this.blockIcon; - } - - @Override - @SideOnly(Side.CLIENT) - public void registerBlockIcons(IIconRegister iconReg){ - this.blockIcon = Blocks.hopper.getIcon(0, 0); - } - - @Override - public boolean isOpaqueCube(){ - return false; - } - - @Override - public boolean renderAsNormalBlock(){ - return false; - } - - @Override - public int getRenderType(){ - return RenderingRegistry.getNextAvailableRenderId(); - } - - @Override - public TileEntity createNewTileEntity(World world, int meta){ - return null; - } - @Override public void breakBlock(World world, int x, int y, int z, Block block, int par6){ this.dropInventory(world, x, y, z); @@ -74,13 +59,20 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI } @Override - public String getName(){ - return "blockCoffeeMachine"; + public IIcon getIcon(int side, int metadata){ + return side <= 1 ? this.iconTop : this.blockIcon; } @Override - public String getOredictName(){ - return this.getName(); + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.iconTop = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public String getName(){ + return "blockFermentingBarrel"; } public static class TheItemBlock extends ItemBlock{ @@ -112,8 +104,8 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI } @Override - public int getMetadata(int damage){ - return damage; + public int getMetadata(int meta){ + return meta; } } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java new file mode 100644 index 000000000..c60c1f7a4 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java @@ -0,0 +1,103 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fluids.BlockFluidClassic; +import net.minecraftforge.fluids.Fluid; + +import java.util.List; + +public class BlockFluidFlowing extends BlockFluidClassic implements INameableItem{ + + private String name; + + public IIcon stillIcon; + public IIcon flowingIcon; + + public BlockFluidFlowing(Fluid fluid, Material material, String unlocalizedName){ + super(fluid, material); + this.name = unlocalizedName; + this.setRenderPass(1); + displacements.put(this, false); + } + + @Override + public boolean canDisplace(IBlockAccess world, int x, int y, int z){ + return !world.getBlock(x, y, z).getMaterial().isLiquid() && super.canDisplace(world, x, y, z); + } + + @Override + public boolean displaceIfPossible(World world, int x, int y, int z){ + return !world.getBlock(x, y, z).getMaterial().isLiquid() && super.displaceIfPossible(world, x, y, z); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side <= 1 ? this.stillIcon : this.flowingIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.stillIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Still"); + this.flowingIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Flowing"); + this.definedFluid.setIcons(this.stillIcon, this.flowingIcon); + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java index bee306682..a0986d1c9 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java @@ -171,6 +171,7 @@ public class BlockFurnaceDouble extends BlockContainerBase implements INameableI @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityFurnaceDouble.energyUsePerTick); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java index 3f3e8cf14..0c2ae5542 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java @@ -97,6 +97,7 @@ public class BlockFurnaceSolar extends BlockContainerBase implements INameableIt @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerProductionInfo(list, TileEntityFurnaceSolar.energyProducedPerTick); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java index 1f13cd985..1c63f53f6 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityGrinder; import ellpeck.actuallyadditions.util.BlockUtil; @@ -134,6 +135,7 @@ public class BlockGrinder extends BlockContainerBase implements INameableItem{ @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, ((BlockGrinder)theBlock).isDouble ? 3 : 4, ""); + BlockUtil.addPowerUsageInfo(list, ((BlockGrinder)theBlock).isDouble ? ConfigIntValues.GRINDER_DOUBLE_ENERGY_USED.getValue() : ConfigIntValues.GRINDER_ENERGY_USED.getValue()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java index 6d12ce546..c026c01dd 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java @@ -85,6 +85,7 @@ public class BlockHeatCollector extends BlockContainerBase implements INameableI @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 3, ""); + BlockUtil.addPowerProductionInfo(list, TileEntityHeatCollector.energyProducedPerTick); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java index 0b41e06d8..10be6b9a1 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java @@ -122,6 +122,7 @@ public class BlockItemRepairer extends BlockContainerBase implements INameableIt @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityItemRepairer.energyUsePerTick); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java new file mode 100644 index 000000000..28e8d6568 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java @@ -0,0 +1,112 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockOilGenerator extends BlockContainerBase implements INameableItem{ + + private IIcon topIcon; + + public BlockOilGenerator(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityOilGenerator(); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side <= 1 ? this.topIcon : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityOilGenerator generator = (TileEntityOilGenerator)world.getTileEntity(x, y, z); + if (generator != null) player.openGui(ActuallyAdditions.instance, GuiHandler.OIL_GENERATOR_ID, world, x, y, z); + return true; + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return "blockOilGenerator"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerProductionInfo(list, TileEntityOilGenerator.energyProducedPerTick); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java new file mode 100644 index 000000000..da7866f6a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -0,0 +1,112 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityPhantomface; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockPhantomface extends BlockContainerBase implements INameableItem{ + + public BlockPhantomface(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int hitSide, float hitX, float hitY, float hitZ){ + if(!world.isRemote){ + TileEntityPhantomface tile = (TileEntityPhantomface)world.getTileEntity(x, y, z); + if(tile != null){ + if(tile.hasBoundTile()){ + if(tile.isBoundTileInRage()){ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", tile.boundTile.xCoord, tile.boundTile.yCoord, tile.boundTile.zCoord))); + return true; + } + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", tile.boundTile.xCoord, tile.boundTile.yCoord, tile.boundTile.zCoord))); + return true; + } + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); + return true; + } + } + return false; + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityPhantomface(); + } + + @Override + public IIcon getIcon(int side, int metadata){ + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "blockPhantomface"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 2, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java new file mode 100644 index 000000000..6de887356 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -0,0 +1,138 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.items.ItemSeed; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.BlockCrops; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +public class BlockPlant extends BlockCrops implements INameableItem{ + + private IIcon[] textures; + private String name; + public Item seedItem; + public ItemStack returnItem; + + public BlockPlant(String name, int stages){ + this.name = name; + this.textures = new IIcon[stages]; + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z){ + return y > 0 && y < 256 && world.getBlock(x, y-1, z).getMaterial() == ((ItemSeed)this.seedItem).soilBlock.getMaterial(); + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune){ + ArrayList ret = super.getDrops(world, x, y, z, metadata, fortune); + if (metadata >= 7){ + for (int i = 0; i < 3 + fortune; ++i){ + if (world.rand.nextInt(15) <= metadata){ + ret.add(new ItemStack(this.seedItem)); + } + } + ret.add(this.returnItem.copy()); + } + + return ret; + } + + @Override + public Item getItemDropped(int meta, Random rand, int i){ + return null; + } + + + @Override + public boolean canPlaceBlockOn(Block block){ + return block == ((ItemSeed)this.seedItem).soilBlock; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta){ + if(meta < 7){ + if (meta == 6) meta = 5; + return this.textures[meta >> 1]; + } + else return this.textures[this.textures.length-1]; + } + + @Override + public Item func_149866_i(){ + return this.seedItem; + } + + @Override + public Item func_149865_P(){ + return this.returnItem.getItem(); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + for (int i = 0; i < this.textures.length; i++){ + textures[i] = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Stage" + (i+1)); + } + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/FluidAA.java b/src/main/java/ellpeck/actuallyadditions/blocks/FluidAA.java new file mode 100644 index 000000000..5e09fef8a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/FluidAA.java @@ -0,0 +1,10 @@ +package ellpeck.actuallyadditions.blocks; + +import net.minecraftforge.fluids.Fluid; + +public class FluidAA extends Fluid{ + + public FluidAA(String fluidName){ + super(fluidName); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 40b45453e..64cdf3528 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -3,6 +3,10 @@ package ellpeck.actuallyadditions.blocks; import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.item.EnumRarity; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; public class InitBlocks{ @@ -26,9 +30,56 @@ public class InitBlocks{ public static Block blockPlacer; public static Block blockDropper; + public static Block blockRice; + public static Block blockCanola; + + public static Fluid fluidCanolaOil; + public static Block blockCanolaOil; + public static Fluid fluidOil; + public static Block blockOil; + + public static Block blockCanolaPress; + public static Block blockFermentingBarrel; + + public static Block blockCoalGenerator; + public static Block blockOilGenerator; + + public static Block blockPhantomface; + public static void init(){ Util.logInfo("Initializing Blocks..."); + fluidCanolaOil = new FluidAA("canolaOil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); + FluidRegistry.registerFluid(fluidCanolaOil); + blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); + BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); + + fluidOil = new FluidAA("oil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); + FluidRegistry.registerFluid(fluidOil); + blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); + BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); + + blockCanolaPress = new BlockCanolaPress(); + BlockUtil.register(blockCanolaPress, BlockCanolaPress.TheItemBlock.class); + + blockPhantomface = new BlockPhantomface(); + BlockUtil.register(blockPhantomface, BlockPhantomface.TheItemBlock.class); + + blockCoalGenerator = new BlockCoalGenerator(); + BlockUtil.register(blockCoalGenerator, BlockCoalGenerator.TheItemBlock.class); + + blockOilGenerator = new BlockOilGenerator(); + BlockUtil.register(blockOilGenerator, BlockOilGenerator.TheItemBlock.class); + + blockFermentingBarrel = new BlockFermentingBarrel(); + BlockUtil.register(blockFermentingBarrel, BlockFermentingBarrel.TheItemBlock.class); + + blockRice = new BlockPlant("blockRice", 6); + BlockUtil.register(blockRice, BlockPlant.TheItemBlock.class, false); + + blockCanola = new BlockPlant("blockCanola", 4); + BlockUtil.register(blockCanola, BlockPlant.TheItemBlock.class, false); + blockCompost = new BlockCompost(); BlockUtil.register(blockCompost, BlockCompost.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java index d2c2dcdb3..a007cda29 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java @@ -10,7 +10,9 @@ public enum TheMiscBlocks implements INameableItem{ QUARTZ("BlackQuartz", EnumRarity.rare, "blockQuartzBlack"), ORE_QUARTZ("OreBlackQuartz", EnumRarity.epic, "oreQuartzBlack"), WOOD_CASING("WoodCasing", EnumRarity.common, "blockCasingWood"), - STONE_CASING("StoneCasing", EnumRarity.uncommon, "blockCasingStone"); + STONE_CASING("StoneCasing", EnumRarity.uncommon, "blockCasingStone"), + CHARCOAL_BLOCK("Charcoal", EnumRarity.common, "blockCharcoal"), + ENDERPEARL_BLOCK("Enderpearl", EnumRarity.rare, "blockEnderpearl"); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java index 8c65da1ec..6c89187ec 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java @@ -21,10 +21,12 @@ public enum ConfigBoolValues{ EMERALD_SHARD_CROP("Emerald Shard", ConfigCategories.MOB_DROPS, true, "If the Emerald Shard drops from Mobs"), DO_UPDATE_CHECK("Do Update Check", ConfigCategories.OTHER, true, "If Actually Additions should check for an Update on joining a World"), - DO_CRUSHER_SPAM("Crusher Debug", ConfigCategories.OTHER, false, "Print out Crusher Recipe Initializing Debug"), + DO_CAT_DROPS("Do Cat Drops", ConfigCategories.OTHER, true, "If Cats drop Hairy Balls on Occasion"), + DO_WAILA_INFO("Waila Display Info", ConfigCategories.OTHER, true, "If the Shift Description should display in Waila too"), - DO_CAT_DROPS("Do Cat Drops", ConfigCategories.OTHER, true, "If Cats drop Hairy Balls on Occasion"); + DO_RICE_GEN("Rice Gen", ConfigCategories.WORLD_GEN, true, "If Rice should generate in the World"), + DO_CANOLA_GEN("Canola Gen", ConfigCategories.WORLD_GEN, true, "If Canola should generate in the World"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java index 7faebfc9d..c88e70e39 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java @@ -68,7 +68,19 @@ public enum ConfigCrafting{ KNIFE_BLADE("Knife Blade", ConfigCategories.ITEMS_CRAFTING), TOOL_EMERALD("Emerald Tools", ConfigCategories.ITEMS_CRAFTING), - TOOL_OBSIDIAN("Obsidian Tools", ConfigCategories.ITEMS_CRAFTING); + TOOL_OBSIDIAN("Obsidian Tools", ConfigCategories.ITEMS_CRAFTING), + RICE_BREAD("Rice Bread", ConfigCategories.FOOD_CRAFTING), + RICE_DOUGH("Rice Dough", ConfigCategories.FOOD_CRAFTING), + + RICE_GADGETS("Rice Gadgets", ConfigCategories.ITEMS_CRAFTING), + RESONANT_RICE("Resonant Rice", ConfigCategories.ITEMS_CRAFTING), + + CANOLA_PRESS("Canola Press", ConfigCategories.BLOCKS_CRAFTING), + FERMENTING_BARREL("Fermenting Barrel", ConfigCategories.BLOCKS_CRAFTING), + COAL_GENERATOR("Coal Generator", ConfigCategories.BLOCKS_CRAFTING), + OIL_GENERATOR("Oil Generator", ConfigCategories.BLOCKS_CRAFTING), + PHANTOMFACE("Phantomface", ConfigCategories.BLOCKS_CRAFTING), + PHANTOM_CONNECTOR("Phantom Connector", ConfigCategories.ITEMS_CRAFTING); public final String name; public final String category; @@ -87,5 +99,4 @@ public enum ConfigCrafting{ public boolean isEnabled(){ return ConfigValues.craftingValues[this.ordinal()]; } - } diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index 80df3d523..571d2a6e0 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -12,14 +12,14 @@ public enum ConfigIntValues{ BLACK_QUARTZ_BASE_AMOUNT("Black Quartz Amount", ConfigCategories.WORLD_GEN, 3, 1, 50, "How big a Black Quartz Vein is at least"), BLACK_QUARTZ_ADD_CHANCE("Black Quartz Additional Chance", ConfigCategories.WORLD_GEN, 3, 0, 50, "How much bigger than the Base Amount a Black Quartz Vein can get"), - BLACK_QUARTZ_CHANCE("Black Quartz Chance", ConfigCategories.WORLD_GEN, 25, 1, 150, "How often the Black Quartz tries to generate"), + BLACK_QUARTZ_CHANCE("Black Quartz Chance", ConfigCategories.WORLD_GEN, 5, 1, 150, "How often the Black Quartz tries to generate"), BLACK_QUARTZ_MIN_HEIGHT("Black Quartz Min Height", ConfigCategories.WORLD_GEN, 0, 0, 256, "How high the Black Quartz starts to generate"), BLACK_QUARTZ_MAX_HEIGHT("Black Quartz Max Height", ConfigCategories.WORLD_GEN, 25, 0, 256, "How high the Black Quartz stops to generate at"), COMPOST_AMOUNT("Compost: Amount Needed To Convert", ConfigCategories.MACHINE_VALUES, 10, 1, 64, "How many items are needed in the Compost to convert to Fertilizer"), COMPOST_TIME("Compost: Conversion Time Needed", ConfigCategories.MACHINE_VALUES, 1000, 30, 10000, "How long the Compost needs to convert to Fertilizer"), - FISHER_TIME("Fishing Net: Time Needed", ConfigCategories.MACHINE_VALUES, 10000, 50, 500000, "How long it takes on Average until the Fishing Net catches a Fish"), + FISHER_TIME("Fishing Net: Time Needed", ConfigCategories.MACHINE_VALUES, 15000, 50, 500000, "How long it takes on Average until the Fishing Net catches a Fish"), FEEDER_REACH("Feeder: Reach", ConfigCategories.MACHINE_VALUES, 5, 1, 20, "The Radius of Action of the Feeder"), FEEDER_TIME("Feeder: Time Needed", ConfigCategories.MACHINE_VALUES, 100, 50, 5000, "The time spent between feeding animals with the Feeder"), @@ -35,20 +35,41 @@ public enum ConfigIntValues{ OBSIDIAN_USES("Obsidian: Max Uses", ConfigCategories.TOOL_VALUES, 8000, 50, 20000, "How often Obsidian Tools can be used"), OBSIDIAN_ENCHANTABILITY("Obsidian: Enchantability", ConfigCategories.TOOL_VALUES, 15, 1, 30, "How enchantable an Obsidian Tool is"), - GRINDER_CRUSH_TIME("Crusher: Crush Time", ConfigCategories.MACHINE_VALUES, 200, 10, 1000, "How long the Crusher takes to crush an item"), - GRINDER_DOUBLE_CRUSH_TIME("Double Crusher: Crush Time", ConfigCategories.MACHINE_VALUES, 300, 10, 1000, "How long the Double Crusher takes to crush an item"), - FURNACE_DOUBLE_SMELT_TIME("Double Furnace: Smelt Time", ConfigCategories.MACHINE_VALUES, 300, 10, 1000, "How long the Double Furnace takes to crush an item"), + GRINDER_CRUSH_TIME("Crusher: Time", ConfigCategories.MACHINE_VALUES, 100, 10, 1000, "How long the Crusher takes to crush an item"), + GRINDER_DOUBLE_CRUSH_TIME("Double Crusher: Time", ConfigCategories.MACHINE_VALUES, 150, 10, 1000, "How long the Double Crusher takes to crush an item"), + FURNACE_DOUBLE_SMELT_TIME("Double Furnace: Time", ConfigCategories.MACHINE_VALUES, 80, 10, 1000, "How long the Double Furnace takes to crush an item"), - REPAIRER_SPEED_SLOWDOWN("Item Repairer: Speed Slowdown", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "How much slower the Item Repairer repairs"), + REPAIRER_SPEED_SLOWDOWN("Repairer: Speed Slowdown", ConfigCategories.MACHINE_VALUES, 2, 1, 100, "How much slower the Item Repairer repairs"), HEAT_COLLECTOR_BLOCKS("Heat Collector: Blocks Needed", ConfigCategories.MACHINE_VALUES, 4, 1, 5, "How many Blocks are needed for the Heat Collector to power Machines above it"), HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 10000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), - GLASS_TIME_NEEDED("Greenhouse Glass: Time Needed", ConfigCategories.MACHINE_VALUES, 1000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), + GLASS_TIME_NEEDED("Greenhouse Glass: Time Needed", ConfigCategories.MACHINE_VALUES, 4000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), BREAKER_TIME_NEEDED("Breaker and Placer: Time Needed", ConfigCategories.MACHINE_VALUES, 15, 1, 10000, "The Time Needed for the Breaker and the Placer to place or break a Block"), DROPPER_TIME_NEEDED("Dropper: Time Needed", ConfigCategories.MACHINE_VALUES, 10, 1, 10000, "The Time Needed for the Dropper to drop an Item"), - CAT_DROP_CHANCE("Cat Drops: Chance", ConfigCategories.OTHER, 5000, 5, 10000000, "The 1 in X chance for a Hairy Ball to Drop from a Cat with X being this value"); + CAT_DROP_CHANCE("Cat Drops: Chance", ConfigCategories.OTHER, 5000, 5, 10000000, "The 1 in X chance for a Hairy Ball to Drop from a Cat with X being this value"), + + RICE_AMOUNT("Rice Amount", ConfigCategories.WORLD_GEN, 15, 1, 100, "The Chance of Rice generating"), + CANOLA_AMOUNT("Canola Amount", ConfigCategories.WORLD_GEN, 2, 1, 50, "The Chance of Canola generating"), + + GRINDER_ENERGY_USED("Energy Use: Crusher", ConfigCategories.MACHINE_VALUES, 40, 1, 500, "The Amount of Energy used by the Crusher per Tick"), + GRINDER_DOUBLE_ENERGY_USED("Energy Use: Double Crusher", ConfigCategories.MACHINE_VALUES, 60, 1, 500, "The Amount of Energy used by the Double Crusher per Tick"), + FURNACE_SOLAR_ENERGY_PRODUCED("Energy Production: Furnace Solar", ConfigCategories.MACHINE_VALUES, 15, 1, 500, "The Amount of Energy produced by the Solar per Tick"), + HEAT_COLLECTOR_ENERGY_PRODUCED("Energy Production: Heat Collector", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Energy produced by the Heat Collector per Tick"), + REPAIRER_ENERGY_USED("Energy Use: Repairer", ConfigCategories.MACHINE_VALUES, 1250, 1, 5000, "The Amount of Energy used by the Repairer per Tick"), + FURNACE_ENERGY_USED("Energy Use: Double Furnace", ConfigCategories.MACHINE_VALUES, 25, 1, 500, "The Amount of Energy used by the Double Furnace per Tick"), + + PRESS_PROCESSING_TIME("Canola Press: Processing Time", ConfigCategories.MACHINE_VALUES, 30, 1, 1000, "The Amount of time it takes to process one Canola"), + PRESS_MB_PRODUCED("Canola Press: mB Produced", ConfigCategories.MACHINE_VALUES, 50, 1, 5000, "The Amount of Canola Oil produced from one Canola"), + PRESS_ENERGY_USED("Energy Use: Canola Press", ConfigCategories.MACHINE_VALUES, 35, 10, 500, "The Amount of Energy used by the Canola Press per Tick"), + + BARREL_MB_PRODUCED("Fermenting Barrel: mB Produced", ConfigCategories.MACHINE_VALUES, 50, 1, 3000, "The Amount of mB produced by the Barrel per cycle"), + BARREL_PROCESSING_TIME("Fermenting Barrel: Processing Time", ConfigCategories.MACHINE_VALUES, 100, 1, 5000, "The Amount of time it takes to process one Canola Oil to Oil"), + + COAL_GEN_ENERGY_PRODUCED("Coal Generator: Energy Produced", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Energy generated by the Coal Generator"), + + PHANTOMFACE_RANGE("Phantomface: Default Range", ConfigCategories.MACHINE_VALUES, 16, 3, 100, "The Default Range of the Phantomface"); public final String name; public final String category; @@ -69,5 +90,4 @@ public enum ConfigIntValues{ public int getValue(){ return ConfigValues.intValues[this.ordinal()]; } - } diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index 6e174270e..96d7aaca5 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -4,6 +4,7 @@ import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; import ellpeck.actuallyadditions.config.values.ConfigCrafting; +import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.init.Blocks; @@ -23,6 +24,13 @@ public class BlockCrafting{ 'W', "plankWood", 'C', TheMiscBlocks.WOOD_CASING.getOredictName())); + //Charcoal Block + GameRegistry.addRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.CHARCOAL_BLOCK.ordinal()), + "CCC", "CCC", "CCC", + 'C', new ItemStack(Items.coal, 1, 1)); + GameRegistry.addShapelessRecipe(new ItemStack(Items.coal, 9, 1), + new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.CHARCOAL_BLOCK.ordinal())); + //Wood Casing if(ConfigCrafting.WOOD_CASING.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.WOOD_CASING.ordinal()), @@ -31,6 +39,56 @@ public class BlockCrafting{ 'R', "dustRedstone", 'S', "stickWood")); + //Canola Press + if(ConfigCrafting.CANOLA_PRESS.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockCanolaPress), + "CHC", "CDC", "CRC", + 'C', "cobblestone", + 'H', Blocks.hopper, + 'R', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'D', TheMiscItems.CANOLA.getOredictName())); + + //Fermenting Barrel + if(ConfigCrafting.FERMENTING_BARREL.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockFermentingBarrel), + "CHC", "CDC", "CRC", + 'C', "logWood", + 'H', Blocks.hopper, + 'R', TheMiscBlocks.WOOD_CASING.getOredictName(), + 'D', TheMiscItems.CANOLA.getOredictName())); + + //Phantomface + if(ConfigCrafting.PHANTOMFACE.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockPhantomface), + "ECE", "EBE", "ESE", + 'E', Items.ender_eye, + 'C', Blocks.chest, + 'S', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'B', TheMiscBlocks.ENDERPEARL_BLOCK.getOredictName())); + + //Oil Generator + if(ConfigCrafting.OIL_GENERATOR.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockOilGenerator), + "CRC", "CBC", "CRC", + 'C', "cobblestone", + 'R', TheMiscBlocks.STONE_CASING.getOredictName(), + 'B', InitItems.itemBucketOil)); + + //Coal Generator + if(ConfigCrafting.COAL_GENERATOR.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockCoalGenerator), + "CRC", "CBC", "CRC", + 'C', "cobblestone", + 'R', TheMiscBlocks.STONE_CASING.getOredictName(), + 'B', "coal")); + + //Enderpearl Block + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ENDERPEARL_BLOCK.ordinal()), + "EE", "EE", + 'E', Items.ender_pearl)); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(Items.ender_pearl, 4), + TheMiscBlocks.ENDERPEARL_BLOCK.getOredictName())); + //Stone Casing if(ConfigCrafting.STONE_CASING.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.STONE_CASING.ordinal()), @@ -58,28 +116,28 @@ public class BlockCrafting{ 'D', "gemDiamond", 'I', "ingotIron", 'O', TheMiscItems.COIL.getOredictName(), - 'C', Items.nether_star)); + 'C', TheMiscBlocks.STONE_CASING.getOredictName())); //Solar Panel - /*if(ConfigCrafting.SOLAR_PANEL.isEnabled()) + if(ConfigCrafting.SOLAR_PANEL.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockFurnaceSolar), "IQI", "CDC", "IBI", 'D', "blockDiamond", 'I', "ingotIron", 'Q', TheMiscBlocks.STONE_CASING.getOredictName(), 'C', TheMiscItems.COIL_ADVANCED.getOredictName(), - 'B', new ItemStack(Blocks.iron_bars)));*/ + 'B', new ItemStack(Blocks.iron_bars))); //Heat Collector - /*if(ConfigCrafting.HEAT_COLLECTOR.isEnabled()) + if(ConfigCrafting.HEAT_COLLECTOR.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockHeatCollector), "BRB", "CDC", "BQB", - 'D', "blockDiamond", + 'D', "gemDiamond", 'R', new ItemStack(Items.repeater), 'Q', TheMiscBlocks.STONE_CASING.getOredictName(), 'L', new ItemStack(Items.lava_bucket), 'C', TheMiscItems.COIL_ADVANCED.getOredictName(), - 'B', new ItemStack(Blocks.iron_bars)));*/ + 'B', new ItemStack(Blocks.iron_bars))); //Quartz Pillar GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.QUARTZ_PILLAR.ordinal()), @@ -158,7 +216,7 @@ public class BlockCrafting{ GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockGreenhouseGlass), "GSG", "SDS", "GSG", 'G', "blockGlass", - 'D', "gemDiamond", + 'D', "blockDiamond", 'S', "treeSapling")); //Placer diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java index ab4d04a5a..070226d02 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java @@ -19,6 +19,11 @@ public class FoodCrafting{ String knifeStack = ((INameableItem)InitItems.itemKnife).getOredictName(); + //Rice Bread + if(ConfigCrafting.RICE_BREAD.isEnabled()) + GameRegistry.addSmelting(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.RICE_DOUGH.ordinal()), + new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE_BREAD.ordinal()), 1F); + //Baguette if(ConfigCrafting.BAGUETTE.isEnabled()) GameRegistry.addSmelting(new ItemStack(InitItems.itemMisc, 1, diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index a75b29265..231dade0f 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.crafting; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheDusts; +import ellpeck.actuallyadditions.items.metalists.TheFoods; import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler; import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler.SearchCase; import ellpeck.actuallyadditions.recipe.GrinderRecipes; @@ -18,21 +19,24 @@ public class GrinderCrafting{ public static void init(){ Util.logInfo("Initializing Crusher Recipes..."); - grindRec.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10), null, 0); - grindRec.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal()), null, 0); + grindRec.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10)); + grindRec.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal())); + grindRec.registerRecipe(new ItemStack(Items.coal), new ItemStack(InitItems.itemDust, 1, TheDusts.COAL.ordinal())); + grindRec.registerRecipe(new ItemStack(Blocks.coal_block), new ItemStack(InitItems.itemDust, 9, TheDusts.COAL.ordinal())); - grindRec.registerRecipe("cobblestone", "sand"); + grindRec.registerRecipe(new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.sand)); grindRec.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); - grindRec.registerRecipe("stone", "cobblestone"); + grindRec.registerRecipe(new ItemStack(Blocks.stone), new ItemStack(Blocks.cobblestone)); + grindRec.registerRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal()), new ItemStack(Items.sugar, 2)); grindRec.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); grindRec.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); - grindRecHan.searchCases.add(new SearchCase("ore", 2)); grindRecHan.searchCases.add(new SearchCase("oreNether", 6)); grindRecHan.searchCases.add(new SearchCase("denseore", 8)); - grindRecHan.searchCases.add(new SearchCase("gem", 1)); grindRecHan.searchCases.add(new SearchCase("ingot", 1)); + grindRecHan.searchCases.add(new SearchCase("gem", 1)); + grindRecHan.searchCases.add(new SearchCase("ore", 2)); grindRecHan.exceptions.add("ingotBrick"); grindRecHan.exceptions.add("ingotBrickNether"); diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java index fee9b529e..5fae3d929 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java @@ -5,10 +5,7 @@ import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; import ellpeck.actuallyadditions.config.values.ConfigCrafting; import ellpeck.actuallyadditions.items.InitItems; -import ellpeck.actuallyadditions.items.metalists.TheDusts; -import ellpeck.actuallyadditions.items.metalists.TheMiscItems; -import ellpeck.actuallyadditions.items.metalists.ThePotionRings; -import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; +import ellpeck.actuallyadditions.items.metalists.*; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -22,6 +19,21 @@ public class ItemCrafting{ public static void init(){ + //Rice Stuff + if(ConfigCrafting.RICE_GADGETS.isEnabled()){ + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(Items.paper, 3), + "RRR", + 'R', TheFoods.RICE.getOredictName())); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 4, TheMiscItems.RICE_SLIME.ordinal()), + " R ", "RBR", " R ", + 'R', TheMiscItems.RICE_DOUGH.getOredictName(), + 'B', Items.water_bucket)); + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 4, TheMiscItems.RICE_SLIME.ordinal()), + " R ", "RBR", " R ", + 'R', TheMiscItems.RICE_DOUGH.getOredictName(), + 'B', new ItemStack(Items.potionitem))); + } + //Leaf Blower if(ConfigCrafting.LEAF_BLOWER.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemLeafBlower), @@ -38,6 +50,11 @@ public class ItemCrafting{ 'I', "ingotIron", 'R', "dustRedstone")); + //Resonant Rice + if(ConfigCrafting.RESONANT_RICE.isEnabled()) + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.itemResonantRice), + TheFoods.RICE.getOredictName(), "nuggetEnderium", Items.gunpowder)); + //Advanced Coil if(ConfigCrafting.ADV_COIL.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.COIL_ADVANCED.ordinal()), @@ -64,6 +81,14 @@ public class ItemCrafting{ 'P', new ItemStack(Blocks.piston), 'C', TheMiscItems.COIL_ADVANCED.getOredictName())); + //Phantom Connector + if(ConfigCrafting.PHANTOM_CONNECTOR.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemPhantomConnector), + "YE", "EY", "S ", + 'Y', Items.ender_eye, + 'E', Items.ender_pearl, + 'S', "stickWood")); + //Quartz GameRegistry.addSmelting(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ORE_QUARTZ.ordinal()), new ItemStack(InitItems.itemMisc, 1, TheMiscItems.QUARTZ.ordinal()), 1F); @@ -81,13 +106,19 @@ public class ItemCrafting{ new ItemStack(Items.sign), new ItemStack(Items.slime_ball)); - //SpeedUpgrade - if(ConfigCrafting.SPEED_UPGRADE.isEnabled()) - GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemSpeedUpgrade, 2), - "RGR", "GUG", "RGR", - 'U', TheMiscItems.COIL.getOredictName(), - 'R', "dustRedstone", - 'G', "ingotGold")); + //Tiny Coal + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 8, TheMiscItems.TINY_COAL.ordinal()), + new ItemStack(Items.coal)); + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 8, TheMiscItems.TINY_CHAR.ordinal()), + new ItemStack(Items.coal, 1, 1)); + + //Rice Seeds + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemRiceSeed), + new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal())); + + //Canola Seeds + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemCanolaSeed), + new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CANOLA.ordinal())); //Mashed Food if(ConfigCrafting.MASHED_FOOD.isEnabled()) @@ -139,14 +170,14 @@ public class ItemCrafting{ public static void addRingRecipeWithStack(ItemStack mainStack, int meta){ GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemPotionRing, 1, meta), mainStack, mainStack, mainStack, mainStack, new ItemStack(Blocks.diamond_block), new ItemStack(Items.nether_wart), new ItemStack(Items.potionitem), new ItemStack(InitItems.itemMisc, 1, TheMiscItems.RING.ordinal())); - GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemPotionRingAdvanced, 1, meta), new ItemStack(InitItems.itemPotionRing, 1, meta), new ItemStack(Items.nether_star)); + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemPotionRingAdvanced, 1, meta), new ItemStack(InitItems.itemPotionRing, 1, meta), new ItemStack(Items.nether_star), new ItemStack(Items.nether_star)); } public static void initMashedFoodRecipes(){ for(Object nextIterator : Item.itemRegistry){ if(nextIterator instanceof ItemFood){ ItemStack ingredient = new ItemStack((Item)nextIterator, 1, Util.WILDCARD); - GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 8, TheMiscItems.MASHED_FOOD.ordinal()), ingredient, ingredient, ingredient, ingredient, new ItemStack(InitItems.itemKnife, 1, Util.WILDCARD)); + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 12, TheMiscItems.MASHED_FOOD.ordinal()), ingredient, ingredient, ingredient, ingredient, new ItemStack(InitItems.itemKnife, 1, Util.WILDCARD)); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java index 56e1bc903..0ae0905ce 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.crafting; import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.config.values.ConfigCrafting; import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheFoods; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -18,6 +19,11 @@ public class MiscCrafting{ GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.itemMisc, 2, TheMiscItems.DOUGH.ordinal()), "cropWheat", "cropWheat")); + //Rice Dough + if(ConfigCrafting.RICE_DOUGH.isEnabled()) + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.itemMisc, 2, TheMiscItems.RICE_DOUGH.ordinal()), + TheFoods.RICE.getOredictName(), TheFoods.RICE.getOredictName())); + //Paper Cone if(ConfigCrafting.PAPER_CONE.isEnabled()) GameRegistry.addRecipe(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.PAPER_CONE.ordinal()), diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 7a15a5fbd..3ce8bed67 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -28,14 +28,16 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockInputter); this.addBlock(InitBlocks.blockInputterAdvanced); + this.addBlock(InitBlocks.blockPhantomface); this.addBlock(InitBlocks.blockGreenhouseGlass); this.addBlock(InitBlocks.blockGrinder); this.addBlock(InitBlocks.blockGrinderDouble); this.addBlock(InitBlocks.blockFurnaceDouble); - //TODO Re-add - //this.addBlock(InitBlocks.blockFurnaceSolar); - //this.addBlock(InitBlocks.blockHeatCollector); + this.addBlock(InitBlocks.blockFurnaceSolar); + this.addBlock(InitBlocks.blockHeatCollector); + this.addBlock(InitBlocks.blockCoalGenerator); + this.addBlock(InitBlocks.blockOilGenerator); this.addBlock(InitBlocks.blockItemRepairer); this.addBlock(InitBlocks.blockFishingNet); this.addBlock(InitBlocks.blockBreaker); @@ -46,10 +48,18 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockFeeder); this.addBlock(InitBlocks.blockCompost); this.addBlock(InitBlocks.blockGiantChest); + this.addBlock(InitBlocks.blockCanolaPress); + this.addBlock(InitBlocks.blockFermentingBarrel); + this.addItem(InitItems.itemPhantomConnector); + this.addItem(InitItems.itemBucketCanolaOil); + this.addItem(InitItems.itemBucketOil); + + this.addItem(InitItems.itemRiceSeed); + this.addItem(InitItems.itemCanolaSeed); this.addItem(InitItems.itemHairyBall); - this.addItem(InitItems.itemSpeedUpgrade); this.addItem(InitItems.itemMisc); + this.addItem(InitItems.itemResonantRice); this.addItem(InitItems.itemFertilizer); this.addItem(InitItems.itemFoods); this.addItem(InitItems.itemKnife); diff --git a/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java b/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java new file mode 100644 index 000000000..953bed198 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java @@ -0,0 +1,31 @@ +package ellpeck.actuallyadditions.event; + +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ellpeck.actuallyadditions.blocks.BlockFluidFlowing; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.items.InitItems; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraftforge.event.entity.player.FillBucketEvent; + +public class BucketFillEvent{ + + @SubscribeEvent + public void onBucketFilled(FillBucketEvent event){ + Block block = event.world.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ); + + if(block instanceof BlockFluidFlowing){ + if(block == InitBlocks.blockCanolaOil){ + event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); + event.result = new ItemStack(InitItems.itemBucketCanolaOil); + } + if(block == InitBlocks.blockOil){ + event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); + event.result = new ItemStack(InitItems.itemBucketOil); + } + event.setResult(Event.Result.ALLOW); + } + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java index d087f1b95..638251ebc 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java +++ b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java @@ -13,6 +13,8 @@ public class InitEvents{ Util.registerEvent(new PickupEvent()); Util.registerEvent(new TooltipEvent()); Util.registerEvent(new EntityLivingEvent()); + Util.registerEvent(new WorldDecorationEvent()); + Util.registerEvent(new BucketFillEvent()); } } diff --git a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java new file mode 100644 index 000000000..1d36159fc --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java @@ -0,0 +1,63 @@ +package ellpeck.actuallyadditions.event; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.config.values.ConfigBoolValues; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import net.minecraft.block.material.Material; +import net.minecraft.world.World; +import net.minecraftforge.event.terraingen.DecorateBiomeEvent; + +import java.util.ArrayList; +import java.util.Random; + +public class WorldDecorationEvent{ + + @SubscribeEvent + public void onWorldDecoration(DecorateBiomeEvent event){ + if(ConfigBoolValues.DO_RICE_GEN.isEnabled()){ + for(int i = 0; i < ConfigIntValues.RICE_AMOUNT.getValue(); i++){ + if(new Random().nextInt(10) == 0){ + int genX = event.chunkX+event.rand.nextInt(16)+8; + int genZ = event.chunkZ+event.rand.nextInt(16)+8; + int genY = event.world.getTopSolidOrLiquidBlock(genX, genZ); + + if(event.world.getBlock(genX, genY, genZ).getMaterial() == Material.water){ + ArrayList blocksAroundBottom = this.getMaterialsAround(event.world, genX, genY, genZ); + ArrayList blocksAroundTop = this.getMaterialsAround(event.world, genX, genY+1, genZ); + if(blocksAroundBottom.contains(Material.grass) || blocksAroundBottom.contains(Material.ground) || blocksAroundBottom.contains(Material.rock) || blocksAroundBottom.contains(Material.sand)){ + if(!blocksAroundTop.contains(Material.water) && !blocksAroundTop.contains(Material.water) && !blocksAroundTop.contains(Material.water) && event.world.getBlock(genX, genY+1, genZ).getMaterial() == Material.air){ + event.world.setBlock(genX, genY+1, genZ, InitBlocks.blockRice, event.rand.nextInt(8), 2); + } + } + } + } + } + } + + if(ConfigBoolValues.DO_CANOLA_GEN.isEnabled()){ + for(int i = 0; i < ConfigIntValues.CANOLA_AMOUNT.getValue(); i++){ + if(new Random().nextInt(50) == 0){ + int genX = event.chunkX+event.rand.nextInt(16)+8; + int genZ = event.chunkZ+event.rand.nextInt(16)+8; + int genY = event.world.getTopSolidOrLiquidBlock(genX, genZ)-1; + + if(event.world.getBlock(genX, genY, genZ).getMaterial() == Material.grass){ + event.world.setBlock(genX, genY+1, genZ, InitBlocks.blockCanola, event.rand.nextInt(8), 2); + } + } + } + } + } + + public ArrayList getMaterialsAround(World world, int x, int y, int z){ + ArrayList blocks = new ArrayList(); + blocks.add(world.getBlock(x+1, y, z).getMaterial()); + blocks.add(world.getBlock(x-1, y, z).getMaterial()); + blocks.add(world.getBlock(x, y, z+1).getMaterial()); + blocks.add(world.getBlock(x, y, z-1).getMaterial()); + + return blocks; + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java b/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java index dccd4fdee..8cee0c841 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java @@ -18,15 +18,15 @@ public class JamVillagerTradeHandler implements VillagerRegistry.IVillageTradeHa private ArrayList trades = new ArrayList(); public JamVillagerTradeHandler(){ - this.addWants("ingotGold", 3, 2); - this.addWants("cropWheat", 10, 10); - this.addWants("dustRedstone", 15, 15); - this.addWants(new ItemStack(Items.bucket), 1, 4); - this.addWants(new ItemStack(Items.glass_bottle), 5, 5); + this.addWants("ingotGold", 5, 2); + this.addWants("cropWheat", 15, 10); + this.addWants("dustRedstone", 25, 15); + this.addWants(new ItemStack(Items.bucket), 5, 4); + this.addWants(new ItemStack(Items.glass_bottle), 12, 5); this.addWants(new ItemStack(Items.potionitem), 1, 0); - this.addWants("ingotIron", 5, 5); - this.addWants("gemDiamond", 1, 1); - this.addWants("dustGlowstone", 5, 10); + this.addWants("ingotIron", 10, 5); + this.addWants("gemDiamond", 1, 2); + this.addWants("dustGlowstone", 12, 10); } @Override @@ -48,7 +48,7 @@ public class JamVillagerTradeHandler implements VillagerRegistry.IVillageTradeHa if(wantsOne == wantsTwo) wantsTwo = null; for(int k = 0; k < TheJams.values().length; k++){ - recipeList.add(new MerchantRecipe(wantsOne, wantsTwo, new ItemStack(InitItems.itemJams, rand.nextInt(5)+1, k))); + recipeList.add(new MerchantRecipe(wantsOne, wantsTwo, new ItemStack(InitItems.itemJams, rand.nextInt(3)+1, k))); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java new file mode 100644 index 000000000..4217aa86c --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java @@ -0,0 +1,127 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCanolaPress; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +@InventoryContainer +public class ContainerCanolaPress extends Container{ + + private TileEntityCanolaPress press; + + private int lastEnergyStored; + private int lastTankAmount; + private int lastProcessTime; + + public ContainerCanolaPress(InventoryPlayer inventory, TileEntityBase tile){ + this.press = (TileEntityCanolaPress)tile; + + this.addSlotToContainer(new Slot(this.press, 0, 81, 10)); + this.addSlotToContainer(new Slot(this.press, 1, 136, 73)); + this.addSlotToContainer(new SlotOutput(this.press, 2, 136, 42)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.press.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.press.getEnergyStored(ForgeDirection.UNKNOWN)); + iCraft.sendProgressBarUpdate(this, 1, this.press.tank.getFluidAmount()); + iCraft.sendProgressBarUpdate(this, 2, this.press.currentProcessTime); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyStored != this.press.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.press.getEnergyStored(ForgeDirection.UNKNOWN)); + if(this.lastTankAmount != this.press.tank.getFluidAmount()) iCraft.sendProgressBarUpdate(this, 1, this.press.tank.getFluidAmount()); + if(this.lastProcessTime != this.press.currentProcessTime) iCraft.sendProgressBarUpdate(this, 2, this.press.currentProcessTime); + } + + this.lastEnergyStored = this.press.getEnergyStored(ForgeDirection.UNKNOWN); + this.lastTankAmount = this.press.tank.getFluidAmount(); + this.lastProcessTime = this.press.currentProcessTime; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.press.storage.setEnergyStored(par2); + if(par1 == 1) this.press.tank.setFluid(new FluidStack(InitBlocks.fluidCanolaOil, par2)); + if(par1 == 2) this.press.currentProcessTime = par2; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 3; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemMisc && currentStack.getItemDamage() == TheMiscItems.CANOLA.ordinal()){ + this.mergeItemStack(newStack, 0, 1, false); + } + if(currentStack.getItem() == Items.bucket){ + this.mergeItemStack(newStack, 1, 2, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoalGenerator.java new file mode 100644 index 000000000..8f92656c2 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoalGenerator.java @@ -0,0 +1,117 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCoalGenerator; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; + +@InventoryContainer +public class ContainerCoalGenerator extends Container{ + + private TileEntityCoalGenerator generator; + + private int lastEnergyStored; + private int lastBurnTime; + private int lastMaxBurnTime; + + public ContainerCoalGenerator(InventoryPlayer inventory, TileEntityBase tile){ + this.generator = (TileEntityCoalGenerator)tile; + + this.addSlotToContainer(new Slot(this.generator, 0, 87, 43)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.generator.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.generator.getEnergyStored(ForgeDirection.UNKNOWN)); + iCraft.sendProgressBarUpdate(this, 1, this.generator.currentBurnTime); + iCraft.sendProgressBarUpdate(this, 2, this.generator.maxBurnTime); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyStored != this.generator.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.generator.getEnergyStored(ForgeDirection.UNKNOWN)); + if(this.lastBurnTime != this.generator.currentBurnTime) iCraft.sendProgressBarUpdate(this, 1, this.generator.currentBurnTime); + if(this.lastMaxBurnTime != this.generator.maxBurnTime) iCraft.sendProgressBarUpdate(this, 2, this.generator.maxBurnTime); + } + + this.lastEnergyStored = this.generator.getEnergyStored(ForgeDirection.UNKNOWN); + this.lastBurnTime = this.generator.currentBurnTime; + this.lastMaxBurnTime = this.generator.maxBurnTime; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.generator.storage.setEnergyStored(par2); + if(par1 == 1) this.generator.currentBurnTime = par2; + if(par1 == 2) this.generator.maxBurnTime = par2; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 1; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(TileEntityFurnace.getItemBurnTime(currentStack) > 0){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java new file mode 100644 index 000000000..85946bd3f --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java @@ -0,0 +1,126 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.init.Items; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +@InventoryContainer +public class ContainerFermentingBarrel extends Container{ + + private TileEntityFermentingBarrel barrel; + + private int lastProcessTime; + private int lastCanolaTank; + private int lastOilTank; + + public ContainerFermentingBarrel(InventoryPlayer inventory, TileEntityBase tile){ + this.barrel = (TileEntityFermentingBarrel)tile; + + this.addSlotToContainer(new Slot(this.barrel, 0, 42, 74)); + this.addSlotToContainer(new SlotOutput(this.barrel, 1, 42, 43)); + this.addSlotToContainer(new Slot(this.barrel, 2, 118, 74)); + this.addSlotToContainer(new SlotOutput(this.barrel, 3, 118, 43)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.barrel.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.barrel.oilTank.getFluidAmount()); + iCraft.sendProgressBarUpdate(this, 1, this.barrel.canolaTank.getFluidAmount()); + iCraft.sendProgressBarUpdate(this, 2, this.barrel.currentProcessTime); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastOilTank != this.barrel.oilTank.getFluidAmount()) iCraft.sendProgressBarUpdate(this, 0, this.barrel.oilTank.getFluidAmount()); + if(this.lastCanolaTank != this.barrel.canolaTank.getFluidAmount()) iCraft.sendProgressBarUpdate(this, 1, this.barrel.canolaTank.getFluidAmount()); + if(this.lastProcessTime != this.barrel.currentProcessTime) iCraft.sendProgressBarUpdate(this, 2, this.barrel.currentProcessTime); + } + + this.lastOilTank = this.barrel.oilTank.getFluidAmount(); + this.lastCanolaTank = this.barrel.canolaTank.getFluidAmount(); + this.lastProcessTime = this.barrel.currentProcessTime; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.barrel.oilTank.setFluid(new FluidStack(InitBlocks.fluidOil, par2)); + if(par1 == 1) this.barrel.canolaTank.setFluid(new FluidStack(InitBlocks.fluidCanolaOil, par2)); + if(par1 == 2) this.barrel.currentProcessTime = par2; + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 4; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemBucketCanolaOil){ + this.mergeItemStack(newStack, 0, 1, false); + } + if(currentStack.getItem() == Items.bucket){ + this.mergeItemStack(newStack, 2, 3, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java index c2e2fbc89..b68c0b322 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java @@ -13,15 +13,14 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; @InventoryContainer public class ContainerFurnaceDouble extends Container{ private TileEntityFurnaceDouble tileFurnace; - private int lastCoalTime; - private int lastCoalTimeLeft; + private int lastEnergy; private int lastFirstCrushTime; private int lastSecondCrushTime; private int lastBurnTime; @@ -29,15 +28,11 @@ public class ContainerFurnaceDouble extends Container{ public ContainerFurnaceDouble(InventoryPlayer inventory, TileEntityBase tile){ this.tileFurnace = (TileEntityFurnaceDouble)tile; - this.addSlotToContainer(new Slot(this.tileFurnace, TileEntityFurnaceDouble.SLOT_COAL, 80, 21)); - this.addSlotToContainer(new Slot(this.tileFurnace, TileEntityFurnaceDouble.SLOT_INPUT_1, 51, 21)); this.addSlotToContainer(new SlotOutput(this.tileFurnace, TileEntityFurnaceDouble.SLOT_OUTPUT_1, 51, 69)); this.addSlotToContainer(new Slot(this.tileFurnace, TileEntityFurnaceDouble.SLOT_INPUT_2, 109, 21)); this.addSlotToContainer(new SlotOutput(this.tileFurnace, TileEntityFurnaceDouble.SLOT_OUTPUT_2, 108, 69)); - this.addSlotToContainer(new Slot(this.tileFurnace, this.tileFurnace.speedUpgradeSlot, 155, 21)); - for (int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); @@ -51,11 +46,10 @@ public class ContainerFurnaceDouble extends Container{ @Override public void addCraftingToCrafters(ICrafting iCraft){ super.addCraftingToCrafters(iCraft); - iCraft.sendProgressBarUpdate(this, 0, this.tileFurnace.coalTime); - iCraft.sendProgressBarUpdate(this, 1, this.tileFurnace.coalTimeLeft); - iCraft.sendProgressBarUpdate(this, 2, this.tileFurnace.firstSmeltTime); - iCraft.sendProgressBarUpdate(this, 3, this.tileFurnace.secondSmeltTime); - iCraft.sendProgressBarUpdate(this, 4, this.tileFurnace.maxBurnTime); + iCraft.sendProgressBarUpdate(this, 0, this.tileFurnace.firstSmeltTime); + iCraft.sendProgressBarUpdate(this, 1, this.tileFurnace.secondSmeltTime); + iCraft.sendProgressBarUpdate(this, 2, this.tileFurnace.maxBurnTime); + iCraft.sendProgressBarUpdate(this, 3, this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN)); } @Override @@ -64,28 +58,25 @@ public class ContainerFurnaceDouble extends Container{ for(Object crafter : this.crafters){ ICrafting iCraft = (ICrafting)crafter; - if(this.lastCoalTime != this.tileFurnace.coalTime) iCraft.sendProgressBarUpdate(this, 0, this.tileFurnace.coalTime); - if(this.lastCoalTimeLeft != this.tileFurnace.coalTimeLeft) iCraft.sendProgressBarUpdate(this, 1, this.tileFurnace.coalTimeLeft); - if(this.lastFirstCrushTime != this.tileFurnace.firstSmeltTime) iCraft.sendProgressBarUpdate(this, 2, this.tileFurnace.firstSmeltTime); - if(this.lastSecondCrushTime != this.tileFurnace.secondSmeltTime) iCraft.sendProgressBarUpdate(this, 3, this.tileFurnace.secondSmeltTime); - if(this.lastBurnTime != this.tileFurnace.maxBurnTime) iCraft.sendProgressBarUpdate(this, 4, this.tileFurnace.maxBurnTime); + if(this.lastFirstCrushTime != this.tileFurnace.firstSmeltTime) iCraft.sendProgressBarUpdate(this, 0, this.tileFurnace.firstSmeltTime); + if(this.lastSecondCrushTime != this.tileFurnace.secondSmeltTime) iCraft.sendProgressBarUpdate(this, 1, this.tileFurnace.secondSmeltTime); + if(this.lastBurnTime != this.tileFurnace.maxBurnTime) iCraft.sendProgressBarUpdate(this, 2, this.tileFurnace.maxBurnTime); + if(this.lastEnergy != this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 3, this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN)); } - this.lastCoalTime = this.tileFurnace.coalTime; - this.lastCoalTimeLeft = this.tileFurnace.coalTimeLeft; this.lastFirstCrushTime = this.tileFurnace.firstSmeltTime; this.lastSecondCrushTime = this.tileFurnace.secondSmeltTime; this.lastBurnTime = this.tileFurnace.maxBurnTime; + this.lastEnergy = this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN); } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int par1, int par2){ - if(par1 == 0) this.tileFurnace.coalTime = par2; - if(par1 == 1) this.tileFurnace.coalTimeLeft = par2; - if(par1 == 2) this.tileFurnace.firstSmeltTime = par2; - if(par1 == 3) this.tileFurnace.secondSmeltTime = par2; - if(par1 == 4) this.tileFurnace.maxBurnTime = par2; + if(par1 == 0) this.tileFurnace.firstSmeltTime = par2; + if(par1 == 1) this.tileFurnace.secondSmeltTime = par2; + if(par1 == 2) this.tileFurnace.maxBurnTime = par2; + if(par1 == 3) this.tileFurnace.storage.setEnergyStored(par2); } @Override @@ -95,7 +86,7 @@ public class ContainerFurnaceDouble extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = 6; + final int inventoryStart = 4; final int inventoryEnd = inventoryStart+26; final int hotbarStart = inventoryEnd+1; final int hotbarEnd = hotbarStart+8; @@ -110,10 +101,6 @@ public class ContainerFurnaceDouble extends Container{ this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_1, TileEntityFurnaceDouble.SLOT_INPUT_1+1, false); this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_2, TileEntityFurnaceDouble.SLOT_INPUT_2+2, false); } - - if(TileEntityFurnace.getItemBurnTime(currentStack) > 0){ - this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_COAL, TileEntityFurnaceDouble.SLOT_COAL+1, false); - } } if(slot <= hotbarEnd && slot >= hotbarStart){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java index a3e0c6abb..296ca65f0 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java @@ -13,7 +13,7 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; @InventoryContainer public class ContainerGrinder extends Container{ @@ -21,18 +21,15 @@ public class ContainerGrinder extends Container{ private TileEntityGrinder tileGrinder; private boolean isDouble; - private int lastCoalTime; - private int lastCoalTimeLeft; private int lastFirstCrushTime; private int lastSecondCrushTime; private int lastMaxCrushTime; + private int lastEnergyStored; public ContainerGrinder(InventoryPlayer inventory, TileEntityBase tile, boolean isDouble){ this.tileGrinder = (TileEntityGrinder)tile; this.isDouble = isDouble; - this.addSlotToContainer(new Slot(this.tileGrinder, TileEntityGrinder.SLOT_COAL, this.isDouble ? 80 : 51, 21)); - this.addSlotToContainer(new Slot(this.tileGrinder, TileEntityGrinder.SLOT_INPUT_1, this.isDouble ? 51 : 80, 21)); this.addSlotToContainer(new SlotOutput(this.tileGrinder, TileEntityGrinder.SLOT_OUTPUT_1_1, this.isDouble ? 37 : 66, 69)); this.addSlotToContainer(new SlotOutput(this.tileGrinder, TileEntityGrinder.SLOT_OUTPUT_1_2, this.isDouble ? 64 : 92, 69)); @@ -42,8 +39,6 @@ public class ContainerGrinder extends Container{ this.addSlotToContainer(new SlotOutput(this.tileGrinder, TileEntityGrinder.SLOT_OUTPUT_2_2, 121, 69)); } - this.addSlotToContainer(new Slot(this.tileGrinder, this.tileGrinder.speedUpgradeSlot, this.isDouble ? 155 : 146, 21)); - for (int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); @@ -57,11 +52,10 @@ public class ContainerGrinder extends Container{ @Override public void addCraftingToCrafters(ICrafting iCraft){ super.addCraftingToCrafters(iCraft); - iCraft.sendProgressBarUpdate(this, 0, this.tileGrinder.coalTime); - iCraft.sendProgressBarUpdate(this, 1, this.tileGrinder.coalTimeLeft); - iCraft.sendProgressBarUpdate(this, 2, this.tileGrinder.firstCrushTime); - iCraft.sendProgressBarUpdate(this, 3, this.tileGrinder.maxCrushTime); - if(this.isDouble) iCraft.sendProgressBarUpdate(this, 4, this.tileGrinder.secondCrushTime); + iCraft.sendProgressBarUpdate(this, 0, this.tileGrinder.firstCrushTime); + iCraft.sendProgressBarUpdate(this, 1, this.tileGrinder.maxCrushTime); + if(this.isDouble) iCraft.sendProgressBarUpdate(this, 2, this.tileGrinder.secondCrushTime); + iCraft.sendProgressBarUpdate(this, 3, this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN)); } @Override @@ -70,28 +64,25 @@ public class ContainerGrinder extends Container{ for(Object crafter : this.crafters){ ICrafting iCraft = (ICrafting)crafter; - if(this.lastCoalTime != this.tileGrinder.coalTime) iCraft.sendProgressBarUpdate(this, 0, this.tileGrinder.coalTime); - if(this.lastCoalTimeLeft != this.tileGrinder.coalTimeLeft) iCraft.sendProgressBarUpdate(this, 1, this.tileGrinder.coalTimeLeft); - if(this.lastFirstCrushTime != this.tileGrinder.firstCrushTime) iCraft.sendProgressBarUpdate(this, 2, this.tileGrinder.firstCrushTime); - if(this.lastMaxCrushTime != this.tileGrinder.maxCrushTime) iCraft.sendProgressBarUpdate(this, 3, this.tileGrinder.maxCrushTime); - if(this.isDouble) if(this.lastSecondCrushTime != this.tileGrinder.secondCrushTime) iCraft.sendProgressBarUpdate(this, 4, this.tileGrinder.secondCrushTime); + if(this.lastFirstCrushTime != this.tileGrinder.firstCrushTime) iCraft.sendProgressBarUpdate(this, 0, this.tileGrinder.firstCrushTime); + if(this.lastMaxCrushTime != this.tileGrinder.maxCrushTime) iCraft.sendProgressBarUpdate(this, 1, this.tileGrinder.maxCrushTime); + if(this.isDouble) if(this.lastSecondCrushTime != this.tileGrinder.secondCrushTime) iCraft.sendProgressBarUpdate(this, 2, this.tileGrinder.secondCrushTime); + if(this.lastEnergyStored != this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 3, this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN)); } - this.lastCoalTime = this.tileGrinder.coalTime; - this.lastCoalTimeLeft = this.tileGrinder.coalTimeLeft; this.lastFirstCrushTime = this.tileGrinder.firstCrushTime; this.lastMaxCrushTime = this.tileGrinder.maxCrushTime; if(this.isDouble) this.lastSecondCrushTime = this.tileGrinder.secondCrushTime; + this.lastEnergyStored = this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN); } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int par1, int par2){ - if(par1 == 0) this.tileGrinder.coalTime = par2; - if(par1 == 1) this.tileGrinder.coalTimeLeft = par2; - if(par1 == 2) this.tileGrinder.firstCrushTime = par2; - if(par1 == 3) this.tileGrinder.maxCrushTime = par2; - if(this.isDouble && par1 == 4) this.tileGrinder.secondCrushTime = par2; + if(par1 == 0) this.tileGrinder.firstCrushTime = par2; + if(par1 == 1) this.tileGrinder.maxCrushTime = par2; + if(this.isDouble && par1 == 2) this.tileGrinder.secondCrushTime = par2; + if(par1 == 3) this.tileGrinder.storage.setEnergyStored(par2); } @Override @@ -101,7 +92,7 @@ public class ContainerGrinder extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = this.isDouble ? 8 : 5; + final int inventoryStart = this.isDouble ? 6 : 3; final int inventoryEnd = inventoryStart+26; final int hotbarStart = inventoryEnd+1; final int hotbarEnd = hotbarStart+8; @@ -116,10 +107,6 @@ public class ContainerGrinder extends Container{ this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_1, TileEntityGrinder.SLOT_INPUT_1+1, false); if(this.isDouble) this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_2, TileEntityGrinder.SLOT_INPUT_2+1, false); } - - if(TileEntityFurnace.getItemBurnTime(currentStack) > 0){ - this.mergeItemStack(newStack, TileEntityGrinder.SLOT_COAL, TileEntityGrinder.SLOT_COAL+1, false); - } } if(slot <= hotbarEnd && slot >= hotbarStart){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java new file mode 100644 index 000000000..e1164f9b7 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java @@ -0,0 +1,120 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidStack; + +@InventoryContainer +public class ContainerOilGenerator extends Container{ + + private TileEntityOilGenerator generator; + + private int lastEnergyStored; + private int lastBurnTime; + private int lastTankAmount; + + public ContainerOilGenerator(InventoryPlayer inventory, TileEntityBase tile){ + this.generator = (TileEntityOilGenerator)tile; + + this.addSlotToContainer(new Slot(this.generator, 0, 98, 74)); + this.addSlotToContainer(new Slot(this.generator, 1, 98, 43)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.generator.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.generator.getEnergyStored(ForgeDirection.UNKNOWN)); + iCraft.sendProgressBarUpdate(this, 1, this.generator.currentBurnTime); + iCraft.sendProgressBarUpdate(this, 2, this.generator.tank.getFluidAmount()); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyStored != this.generator.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.generator.getEnergyStored(ForgeDirection.UNKNOWN)); + if(this.lastBurnTime != this.generator.currentBurnTime) iCraft.sendProgressBarUpdate(this, 1, this.generator.currentBurnTime); + if(this.lastTankAmount != this.generator.tank.getFluidAmount()) iCraft.sendProgressBarUpdate(this, 2, this.generator.tank.getFluidAmount()); + } + + this.lastEnergyStored = this.generator.getEnergyStored(ForgeDirection.UNKNOWN); + this.lastBurnTime = this.generator.currentBurnTime; + this.lastTankAmount = this.generator.tank.getFluidAmount(); + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.generator.storage.setEnergyStored(par2); + if(par1 == 1) this.generator.currentBurnTime = par2; + if(par1 == 2) this.generator.tank.setFluid(new FluidStack(InitBlocks.fluidOil, par2)); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 2; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemBucketOil){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java index 0eb861132..57a8a3f09 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java @@ -12,21 +12,18 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; @InventoryContainer public class ContainerRepairer extends Container{ private TileEntityItemRepairer tileRepairer; - private int lastCoalTime; - private int lastCoalTimeLeft; + private int lastEnergy; public ContainerRepairer(InventoryPlayer inventory, TileEntityBase tile){ this.tileRepairer = (TileEntityItemRepairer)tile; - this.addSlotToContainer(new Slot(this.tileRepairer, TileEntityItemRepairer.SLOT_COAL, 80, 21)); - this.addSlotToContainer(new Slot(this.tileRepairer, TileEntityItemRepairer.SLOT_INPUT, 47, 53)); this.addSlotToContainer(new SlotOutput(this.tileRepairer, TileEntityItemRepairer.SLOT_OUTPUT, 109, 53)); @@ -43,8 +40,7 @@ public class ContainerRepairer extends Container{ @Override public void addCraftingToCrafters(ICrafting iCraft){ super.addCraftingToCrafters(iCraft); - iCraft.sendProgressBarUpdate(this, 0, this.tileRepairer.coalTime); - iCraft.sendProgressBarUpdate(this, 1, this.tileRepairer.coalTimeLeft); + iCraft.sendProgressBarUpdate(this, 0, this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN)); } @Override @@ -53,19 +49,16 @@ public class ContainerRepairer extends Container{ for(Object crafter : this.crafters){ ICrafting iCraft = (ICrafting)crafter; - if(this.lastCoalTime != this.tileRepairer.coalTime) iCraft.sendProgressBarUpdate(this, 0, this.tileRepairer.coalTime); - if(this.lastCoalTimeLeft != this.tileRepairer.coalTimeLeft) iCraft.sendProgressBarUpdate(this, 1, this.tileRepairer.coalTimeLeft); + if(this.lastEnergy != this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN)); } - this.lastCoalTime = this.tileRepairer.coalTime; - this.lastCoalTimeLeft = this.tileRepairer.coalTimeLeft; + this.lastEnergy = this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN); } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int par1, int par2){ - if(par1 == 0) this.tileRepairer.coalTime = par2; - if(par1 == 1) this.tileRepairer.coalTimeLeft = par2; + if(par1 == 0) this.tileRepairer.storage.setEnergyStored(par2); } @Override @@ -75,7 +68,7 @@ public class ContainerRepairer extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = 3; + final int inventoryStart = 2; final int inventoryEnd = inventoryStart+26; final int hotbarStart = inventoryEnd+1; final int hotbarEnd = hotbarStart+8; @@ -89,10 +82,6 @@ public class ContainerRepairer extends Container{ if(TileEntityItemRepairer.canBeRepaired(currentStack)){ this.mergeItemStack(newStack, TileEntityItemRepairer.SLOT_INPUT, TileEntityItemRepairer.SLOT_INPUT+1, false); } - - if(TileEntityFurnace.getItemBurnTime(currentStack) > 0){ - this.mergeItemStack(newStack, TileEntityItemRepairer.SLOT_COAL, TileEntityItemRepairer.SLOT_COAL+1, false); - } } if(slot <= hotbarEnd && slot >= hotbarStart){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java index 9975882b7..0fc2dfa5a 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java @@ -26,7 +26,7 @@ public class GuiBreaker extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 93-5, -10, this.breaker.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.breaker.getInventoryName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java new file mode 100644 index 000000000..80afcb98a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java @@ -0,0 +1,75 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCanolaPress; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiCanolaPress extends GuiContainer{ + + private TileEntityCanolaPress press; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiCanolaPress"); + + public GuiCanolaPress(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerCanolaPress(inventory, tile)); + this.press = (TileEntityCanolaPress)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.press.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.press.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.press.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft + 43, this.guiTop+89-i, 176, 29, 16, i); + } + + if(this.press.tank.getFluidAmount() > 0){ + int i = this.press.getTankScaled(83); + drawTexturedModalRect(this.guiLeft + 117, this.guiTop+89-i, 192, 29, 16, i); + } + + if(this.press.currentProcessTime > 0){ + int i = this.press.getProcessScaled(29); + drawTexturedModalRect(this.guiLeft + 83, this.guiTop+32, 176, 0, 12, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + String text1 = this.press.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.press.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+43 && y >= guiTop+6 && x <= guiLeft+58 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + + String text2 = this.press.tank.getFluidAmount() + "/" + this.press.tank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaOil"); + if(x >= guiLeft+117 && y >= guiTop+6 && x <= guiLeft+132 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java new file mode 100644 index 000000000..17ac5d93d --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java @@ -0,0 +1,64 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCoalGenerator; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiCoalGenerator extends GuiContainer{ + + private TileEntityCoalGenerator generator; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiCoalGenerator"); + + public GuiCoalGenerator(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerCoalGenerator(inventory, tile)); + this.generator = (TileEntityCoalGenerator)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.generator.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.generator.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.generator.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+43, this.guiTop+89-i, 176, 0, 16, i); + } + + if(this.generator.currentBurnTime > 0){ + int i = this.generator.getBurningScaled(13); + this.drawTexturedModalRect(guiLeft+87, guiTop+27+12-i, 176, 96-i, 14, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + String text1 = this.generator.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.generator.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+43 && y >= guiTop+6 && x <= guiLeft+58 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java index 6a3357f93..f8a21ba64 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java @@ -23,7 +23,7 @@ public class GuiCrafter extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 74, -10, "container." + ModUtil.MOD_ID_LOWER + ".crafting"); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, "container."+ModUtil.MOD_ID_LOWER+".crafting"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java index eb7543178..1a79f8281 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java @@ -26,7 +26,7 @@ public class GuiDropper extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 93-5, -10, this.dropper.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.dropper.getInventoryName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java index 288a1a8b2..74537ae62 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java @@ -31,7 +31,7 @@ public class GuiFeeder extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 70-5, -10, this.tileFeeder.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileFeeder.getInventoryName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java new file mode 100644 index 000000000..f15245136 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java @@ -0,0 +1,75 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiFermentingBarrel extends GuiContainer{ + + private TileEntityFermentingBarrel press; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiFermentingBarrel"); + + public GuiFermentingBarrel(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerFermentingBarrel(inventory, tile)); + this.press = (TileEntityFermentingBarrel)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.press.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.press.canolaTank.getFluidAmount() > 0){ + int i = this.press.getCanolaTankScaled(83); + drawTexturedModalRect(this.guiLeft + 61, this.guiTop+89-i, 192, 29, 16, i); + } + + if(this.press.oilTank.getFluidAmount() > 0){ + int i = this.press.getOilTankScaled(83); + drawTexturedModalRect(this.guiLeft + 99, this.guiTop+89-i, 176, 29, 16, i); + } + + if(this.press.currentProcessTime > 0){ + int i = this.press.getProcessScaled(29); + drawTexturedModalRect(this.guiLeft+82, this.guiTop+34, 176, 0, 12, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + + String text1 = this.press.canolaTank.getFluidAmount() + "/" + this.press.canolaTank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaOil"); + if(x >= guiLeft+61 && y >= guiTop+6 && x <= guiLeft+76 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + + String text2 = this.press.oilTank.getFluidAmount() + "/" + this.press.oilTank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.oil"); + if(x >= guiLeft+99 && y >= guiTop+6 && x <= guiLeft+114 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java index 3afe84460..acb2fafee 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java @@ -8,8 +8,11 @@ import ellpeck.actuallyadditions.util.AssetUtil; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; +import java.util.Collections; + @SideOnly(Side.CLIENT) public class GuiFurnaceDouble extends GuiContainer{ @@ -25,7 +28,7 @@ public class GuiFurnaceDouble extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 93-5, -10, this.tileFurnace.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileFurnace.getInventoryName()); } @Override @@ -38,9 +41,9 @@ public class GuiFurnaceDouble extends GuiContainer{ this.mc.getTextureManager().bindTexture(resLoc); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); - if(this.tileFurnace.coalTime > 0){ - int i = this.tileFurnace.getCoalTimeToScale(15); - this.drawTexturedModalRect(this.guiLeft+80, this.guiTop+5+14-i, 176, 44+14-i, 14, i); + if(this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.tileFurnace.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+28, this.guiTop+89-i, 176, 44, 16, i); } if(this.tileFurnace.firstSmeltTime > 0){ int i = this.tileFurnace.getFirstTimeToScale(23); @@ -55,5 +58,9 @@ public class GuiFurnaceDouble extends GuiContainer{ @Override public void drawScreen(int x, int y, float f){ super.drawScreen(x, y, f); + String text = this.tileFurnace.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.tileFurnace.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+28 && y >= guiTop+6 && x <= guiLeft+43 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text), x, y); + } } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java index 9d85dc943..e030b9d03 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java @@ -27,7 +27,7 @@ public class GuiGiantChest extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 172-5, -10, this.chest.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.chest.getInventoryName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java index b9f723df7..4bd6eb59c 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java @@ -8,8 +8,11 @@ import ellpeck.actuallyadditions.util.AssetUtil; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; +import java.util.Collections; + @SideOnly(Side.CLIENT) public class GuiGrinder extends GuiContainer{ @@ -28,7 +31,7 @@ public class GuiGrinder extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 93-5, -10, this.tileGrinder.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileGrinder.getInventoryName()); } @Override @@ -41,9 +44,9 @@ public class GuiGrinder extends GuiContainer{ this.mc.getTextureManager().bindTexture(this.isDouble ? resLocDouble : resLoc); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); - if(this.tileGrinder.coalTime > 0){ - int i = this.tileGrinder.getCoalTimeToScale(15); - this.drawTexturedModalRect(this.guiLeft+(isDouble ? 80 : 51), this.guiTop+5+14-i, 176, 44+14-i, 14, i); + if(this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.tileGrinder.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft + (isDouble ? 14 : 43), this.guiTop+89-i, 176, (isDouble ? 44 : 23), 16, i); } if(this.tileGrinder.firstCrushTime > 0){ int i = this.tileGrinder.getFirstTimeToScale(23); @@ -60,5 +63,9 @@ public class GuiGrinder extends GuiContainer{ @Override public void drawScreen(int x, int y, float f){ super.drawScreen(x, y, f); + String text = this.tileGrinder.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.tileGrinder.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if((this.isDouble && x >= guiLeft+14 && y >= guiTop+6 && x <= guiLeft+29 && y <= guiTop+88) || (!this.isDouble && x >= guiLeft+43 && y >= guiTop+6 && x <= guiLeft+58 && y <= guiTop+88)){ + this.func_146283_a(Collections.singletonList(text), x, y); + } } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index 7a3e81c66..bfefb5ec4 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -13,7 +13,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ - switch (id){ + switch(id){ case FEEDER_ID: TileEntityBase tileFeeder = (TileEntityBase)world.getTileEntity(x, y, z); return new ContainerFeeder(entityPlayer.inventory, tileFeeder); @@ -46,6 +46,18 @@ public class GuiHandler implements IGuiHandler{ case DROPPER_ID: TileEntityBase tileDropper = (TileEntityBase)world.getTileEntity(x, y, z); return new ContainerDropper(entityPlayer.inventory, tileDropper); + case CANOLA_PRESS_ID: + TileEntityBase tilePress = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerCanolaPress(entityPlayer.inventory, tilePress); + case FERMENTING_BARREL_ID: + TileEntityBase tileBarrel = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerFermentingBarrel(entityPlayer.inventory, tileBarrel); + case COAL_GENERATOR_ID: + TileEntityBase tileGenerator = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerCoalGenerator(entityPlayer.inventory, tileGenerator); + case OIL_GENERATOR_ID: + TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerOilGenerator(entityPlayer.inventory, tileOilGen); default: return null; } @@ -53,7 +65,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getClientGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ - switch (id){ + switch(id){ case FEEDER_ID: TileEntityBase tileFeeder = (TileEntityBase)world.getTileEntity(x, y, z); return new GuiFeeder(entityPlayer.inventory, tileFeeder); @@ -86,6 +98,18 @@ public class GuiHandler implements IGuiHandler{ case DROPPER_ID: TileEntityBase tileDropper = (TileEntityBase)world.getTileEntity(x, y, z); return new GuiDropper(entityPlayer.inventory, tileDropper); + case CANOLA_PRESS_ID: + TileEntityBase tilePress = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiCanolaPress(entityPlayer.inventory, tilePress); + case FERMENTING_BARREL_ID: + TileEntityBase tileBarrel = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiFermentingBarrel(entityPlayer.inventory, tileBarrel); + case COAL_GENERATOR_ID: + TileEntityBase tileGenerator = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiCoalGenerator(entityPlayer.inventory, tileGenerator); + case OIL_GENERATOR_ID: + TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiOilGenerator(entityPlayer.inventory, tileOilGen); default: return null; } @@ -102,6 +126,10 @@ public class GuiHandler implements IGuiHandler{ public static final int INPUTTER_ADVANCED_ID = 8; public static final int BREAKER_ID = 9; public static final int DROPPER_ID = 10; + public static final int CANOLA_PRESS_ID = 11; + public static final int FERMENTING_BARREL_ID = 12; + public static final int COAL_GENERATOR_ID = 13; + public static final int OIL_GENERATOR_ID = 14; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java index 4b036a739..22b5c166c 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java @@ -62,7 +62,7 @@ public class GuiInputter extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, this.isAdvanced ? 105-5 : 93-5, -10, this.tileInputter.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileInputter.getInventoryName()); } @SuppressWarnings("unchecked") diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java new file mode 100644 index 000000000..864722db6 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java @@ -0,0 +1,74 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiOilGenerator extends GuiContainer{ + + private TileEntityOilGenerator generator; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiOilGenerator"); + + public GuiOilGenerator(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerOilGenerator(inventory, tile)); + this.generator = (TileEntityOilGenerator)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.generator.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.generator.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.generator.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+43, this.guiTop+89-i, 176, 0, 16, i); + } + + if(this.generator.tank.getFluidAmount() > 0){ + int i = this.generator.getTankScaled(83); + drawTexturedModalRect(this.guiLeft+117, this.guiTop+89-i, 192, 0, 16, i); + } + + if(this.generator.currentBurnTime > 0){ + int i = this.generator.getBurningScaled(13); + this.drawTexturedModalRect(guiLeft+72, guiTop+44+12-i, 176, 96-i, 14, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + String text1 = this.generator.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.generator.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+43 && y >= guiTop+6 && x <= guiLeft+58 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + String text2 = this.generator.tank.getFluidAmount() + "/" + this.generator.tank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.oil"); + if(x >= guiLeft+117 && y >= guiTop+6 && x <= guiLeft+132 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java index 81151158b..435af2cf9 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java @@ -8,8 +8,11 @@ import ellpeck.actuallyadditions.util.AssetUtil; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.opengl.GL11; +import java.util.Collections; + @SideOnly(Side.CLIENT) public class GuiRepairer extends GuiContainer{ @@ -25,7 +28,7 @@ public class GuiRepairer extends GuiContainer{ @Override public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameAndInventoryString(this.fontRendererObj, xSize, 93-5, -10, this.tileRepairer.getInventoryName()); + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileRepairer.getInventoryName()); } @Override @@ -38,9 +41,9 @@ public class GuiRepairer extends GuiContainer{ this.mc.getTextureManager().bindTexture(resLoc); this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); - if(this.tileRepairer.coalTime > 0){ - int i = this.tileRepairer.getCoalTimeToScale(15); - this.drawTexturedModalRect(this.guiLeft+80, this.guiTop+5+14-i, 176, 44+14-i, 14, i); + if(this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.tileRepairer.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+28, this.guiTop+89-i, 176, 44, 16, i); } if(TileEntityItemRepairer.canBeRepaired(this.tileRepairer.slots[TileEntityItemRepairer.SLOT_INPUT])){ int i = this.tileRepairer.getItemDamageToScale(22); @@ -51,5 +54,9 @@ public class GuiRepairer extends GuiContainer{ @Override public void drawScreen(int x, int y, float f){ super.drawScreen(x, y, f); + String text = this.tileRepairer.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.tileRepairer.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+28 && y >= guiTop+6 && x <= guiLeft+43 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text), x, y); + } } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 703d497f0..5f6354598 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -1,5 +1,8 @@ package ellpeck.actuallyadditions.items; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.items.metalists.TheFoods; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.items.tools.*; import ellpeck.actuallyadditions.material.InitItemMaterials; import ellpeck.actuallyadditions.recipe.HairyBallHandler; @@ -10,6 +13,8 @@ import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.fluids.FluidContainerRegistry; public class InitItems{ @@ -39,16 +44,35 @@ public class InitItems{ public static Item itemSwordObsidian; public static Item itemHoeObsidian; - public static Item itemSpeedUpgrade; - public static Item itemHairyBall; + public static Item itemRiceSeed; + public static Item itemCanolaSeed; + public static Item itemResonantRice; + public static Item itemBucketOil; + public static Item itemBucketCanolaOil; + + public static Item itemPhantomConnector; public static void init(){ Util.logInfo("Initializing Items..."); + itemBucketOil = new ItemBucketAA(InitBlocks.blockOil, "itemBucketOil"); + ItemUtil.register(itemBucketOil); + FluidContainerRegistry.registerFluidContainer(InitBlocks.fluidOil, new ItemStack(itemBucketOil), FluidContainerRegistry.EMPTY_BUCKET); + + itemBucketCanolaOil = new ItemBucketAA(InitBlocks.blockCanolaOil, "itemBucketCanolaOil"); + ItemUtil.register(itemBucketCanolaOil); + FluidContainerRegistry.registerFluidContainer(InitBlocks.fluidCanolaOil, new ItemStack(itemBucketCanolaOil), FluidContainerRegistry.EMPTY_BUCKET); + itemFertilizer = new ItemFertilizer(); ItemUtil.register(itemFertilizer); + itemPhantomConnector = new ItemPhantomConnector(); + ItemUtil.register(itemPhantomConnector); + + itemResonantRice = new ItemResonantRice(); + ItemUtil.register(itemResonantRice); + itemMisc = new ItemMisc(); ItemUtil.register(itemMisc, ItemMisc.allMiscItems); @@ -82,13 +106,16 @@ public class InitItems{ itemPotionRingAdvanced = new ItemPotionRing(true); ItemUtil.register(itemPotionRingAdvanced); - itemSpeedUpgrade = new ItemUpgrade(ItemUpgrade.UpgradeType.SPEED, "itemUpgradeSpeed", 2+3); - ItemUtil.register(itemSpeedUpgrade); - itemHairyBall = new ItemHairyBall(); ItemUtil.register(itemHairyBall); HairyBallHandler.init(); + itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, new ItemStack(itemFoods, 1, TheFoods.RICE.ordinal())); + ItemUtil.register(itemRiceSeed); + + itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Crop, new ItemStack(itemMisc, 1, TheMiscItems.CANOLA.ordinal())); + ItemUtil.register(itemCanolaSeed); + itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); itemShovelEmerald = new ItemShovelAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemShovelEmerald", EnumRarity.rare); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemUpgrade.java b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java similarity index 71% rename from src/main/java/ellpeck/actuallyadditions/items/ItemUpgrade.java rename to src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java index 96623e566..f753459b1 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemUpgrade.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java @@ -5,37 +5,41 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; +import net.minecraft.item.ItemBucket; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import java.util.List; -public class ItemUpgrade extends Item implements INameableItem{ +public class ItemBucketAA extends ItemBucket implements INameableItem{ - private final String name; - public UpgradeType type; - private int textAmount; + private String name; - public ItemUpgrade(UpgradeType type, String name, int textAmount){ - this.name = name; - this.type = type; - this.textAmount = textAmount; + public ItemBucketAA(Block block, String unlocName){ + super(block); + this.name = unlocName; } @Override public EnumRarity getRarity(ItemStack stack){ - return EnumRarity.rare; + return EnumRarity.uncommon; + } + + @Override + public Item getContainerItem(){ + return Items.bucket; } @Override - @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, this.textAmount, ""); + ItemUtil.addInformation(this, list, 1, ""); } @Override @@ -58,8 +62,4 @@ public class ItemUpgrade extends Item implements INameableItem{ public String getOredictName(){ return this.getName(); } - - public enum UpgradeType{ - SPEED - } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java index 3f6482ab0..8ce79fdd3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java @@ -31,6 +31,7 @@ public class ItemHairyBall extends Item implements INameableItem{ player.worldObj.spawnEntityInWorld(entityItem); } stack.stackSize--; + world.playSoundAtEntity(player, "random.pop", 0.2F, new Random().nextFloat() * 0.1F + 0.9F); } return stack; } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java new file mode 100644 index 000000000..b02400107 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -0,0 +1,146 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityPhantomface; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +import java.util.List; + +public class ItemPhantomConnector extends Item implements INameableItem{ + + public ItemPhantomConnector(){ + this.setMaxStackSize(1); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10){ + if(!world.isRemote){ + TileEntity tile = world.getTileEntity(x, y, z); + + if(tile != null && tile instanceof TileEntityPhantomface && this.getStoredConnection(stack) != null){ + TileEntity stored = this.getStoredConnection(stack); + if(stored != null && stored.getWorldObj().getTileEntity(stored.xCoord, stored.yCoord, stored.zCoord) == stored){ + ((TileEntityPhantomface)tile).boundTile = stored.getWorldObj().getTileEntity(stored.xCoord, stored.yCoord, stored.zCoord); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.connected.desc"))); + this.clearStorage(stack); + return true; + } + } + + if(tile != null && !(tile instanceof TileEntityPhantomface) && tile instanceof IInventory){ + this.storeConnection(stack, tile); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.stored.desc"))); + return true; + } + else{ + if(tile instanceof TileEntityPhantomface) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.noBound.desc"))); + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.notInventory.desc"))); + } + } + return super.onItemUse(stack, player, world, x, y, z, par7, par8, par9, par10); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5){ + if(this.getStoredConnection(stack) == null) this.clearStorage(stack); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(KeyUtil.isControlPressed()) this.clearStorage(stack); + return stack; + } + + public TileEntity getStoredConnection(ItemStack stack){ + NBTTagCompound tag = stack.getTagCompound(); + if(tag != null){ + int x = tag.getInteger("XCoordOfTileStored"); + int y = tag.getInteger("YCoordOfTileStored"); + int z = tag.getInteger("ZCoordOfTileStored"); + World world = DimensionManager.getWorld(tag.getInteger("WorldOfTileStored")); + + return world.getTileEntity(x, y, z); + } + return null; + } + + public void storeConnection(ItemStack stack, TileEntity tile){ + NBTTagCompound tag = stack.getTagCompound(); + if(tag == null) tag = new NBTTagCompound(); + + tag.setInteger("XCoordOfTileStored", tile.xCoord); + tag.setInteger("YCoordOfTileStored", tile.yCoord); + tag.setInteger("ZCoordOfTileStored", tile.zCoord); + tag.setInteger("WorldOfTileStored", tile.getWorldObj().provider.dimensionId); + + stack.setTagCompound(tag); + } + + public void clearStorage(ItemStack stack){ + stack.setTagCompound(new NBTTagCompound()); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 2, ""); + TileEntity tile = this.getStoredConnection(stack); + if(tile != null){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.boundTo.desc") + ":"); + list.add("X: " + tile.xCoord); + list.add("Y: " + tile.yCoord); + list.add("Z: " + tile.zCoord); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.inWorld.desc") + " " + tile.getWorldObj().provider.dimensionId); + } + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "itemPhantomConnector"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public boolean getShareTag(){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java new file mode 100644 index 000000000..79e956b5a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java @@ -0,0 +1,62 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.*; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.List; + +public class ItemResonantRice extends Item implements INameableItem{ + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(!world.isRemote){ + stack.stackSize--; + world.createExplosion(null, player.posX, player.posY, player.posZ, 0.5F, true); + } + return stack; + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + if(KeyUtil.isShiftPressed() && OreDictionary.getOres("nuggetEnderium").size() == 0) list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemResonantRice.uncraftable.desc")); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "itemResonantRice"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java new file mode 100644 index 000000000..872f9af7c --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -0,0 +1,130 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.BlockPlant; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.common.EnumPlantType; +import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.BlockSnapshot; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.event.ForgeEventFactory; + +import java.util.List; + +public class ItemSeed extends Item implements IPlantable, INameableItem{ + + public Block plant; + public Block soilBlock; + public EnumPlantType type; + public String name; + + public ItemSeed(String name, Block plant, Block soilBlock, EnumPlantType type, ItemStack returnItem){ + this.name = name; + this.plant = plant; + this.soilBlock = soilBlock; + this.type = type; + ((BlockPlant)this.plant).seedItem = this; + ((BlockPlant)this.plant).returnItem = returnItem; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int hitSide, float hitX, float hitY, float hitZ){ + if(this.type == EnumPlantType.Water || hitSide != 1) return false; + else if(player.canPlayerEdit(x, y, z, hitSide, stack) && player.canPlayerEdit(x, y + 1, z, hitSide, stack)){ + if(((BlockPlant)this.plant).canPlaceBlockOn(world.getBlock(x, y, z)) && world.isAirBlock(x, y + 1, z)){ + world.setBlock(x, y + 1, z, this.plant); + stack.stackSize--; + return true; + } + } + return false; + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(this.type == EnumPlantType.Water){ + MovingObjectPosition pos = this.getMovingObjectPositionFromPlayer(world, player, true); + if(pos != null){ + if(pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){ + int i = pos.blockX; + int j = pos.blockY; + int k = pos.blockZ; + + if(world.canMineBlock(player, i, j, k) && player.canPlayerEdit(i, j, k, pos.sideHit, stack)){ + if(world.getBlock(i, j, k).getMaterial() == Material.water && world.getBlockMetadata(i, j, k) == 0 && world.isAirBlock(i, j + 1, k)){ + BlockSnapshot snap = BlockSnapshot.getBlockSnapshot(world, i, j+1, k); + world.setBlock(i, j + 1, k, this.plant); + if(ForgeEventFactory.onPlayerBlockPlace(player, snap, ForgeDirection.UP).isCanceled()){ + snap.restore(true, false); + return super.onItemRightClick(stack, world, player); + } + stack.stackSize--; + } + } + } + } + } + return super.onItemRightClick(stack, world, player); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z){ + return this.type; + } + + @Override + public Block getPlant(IBlockAccess world, int x, int y, int z){ + return this.plant; + } + + @Override + public int getPlantMetadata(IBlockAccess world, int x, int y, int z){ + return 0; + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.getName(); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheFoods.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheFoods.java index b9df1658a..4dc38122c 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheFoods.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheFoods.java @@ -23,7 +23,9 @@ public enum TheFoods implements INameableItem{ BIG_COOKIE("BigCookie", 6, 1F, false, 20, EnumRarity.uncommon, "foodBigCookie"), HAMBURGER("Hamburger", 14, 6F, false, 40, EnumRarity.common, "foodHamburger"), PIZZA("Pizza", 20, 10F, false, 45, EnumRarity.uncommon, "foodPizza"), - BAGUETTE("Baguette", 7, 2F, false, 25, EnumRarity.common, "foodBaguette"); + BAGUETTE("Baguette", 7, 2F, false, 25, EnumRarity.common, "foodBaguette"), + RICE("Rice", 2, 1F, false, 10, EnumRarity.uncommon, "foodRice"), + RICE_BREAD("RiceBread", 8, 3F, false, 25, EnumRarity.uncommon, "foodRiceBread"); public static void setReturnItems(){ SPAGHETTI.returnItem = new ItemStack(Items.bowl); diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java index fc770f571..296c24102 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java @@ -5,12 +5,12 @@ import net.minecraft.item.EnumRarity; public enum TheJams implements INameableItem{ - CU_BA_RA("CuBaRa", 20, 5F, EnumRarity.rare, "jamCuBaRa", 5, 12, 12595273), - GRA_KI_BA("GraKiBa", 20, 5F, EnumRarity.rare, "jamGraKiBa", 16, 13, 5492820), - PL_AP_LE("PlApLe", 20, 5F, EnumRarity.rare, "jamPlApLe", 15, 3, 13226009), - CH_AP_CI("ChApCi", 20, 5F, EnumRarity.rare, "jamChApCi", 10, 1, 13189222), - HO_ME_KI("HoMeKi", 20, 5F, EnumRarity.rare, "jamHoMeKi", 10, 14, 2031360), - PI_CO("PiCo", 20, 5F, EnumRarity.rare, "jamPiCo", 9, 1, 16056203); + CU_BA_RA("CuBaRa", 4, 5F, EnumRarity.rare, "jamCuBaRa", 5, 12, 12595273), + GRA_KI_BA("GraKiBa", 4, 5F, EnumRarity.rare, "jamGraKiBa", 16, 13, 5492820), + PL_AP_LE("PlApLe", 4, 5F, EnumRarity.rare, "jamPlApLe", 15, 3, 13226009), + CH_AP_CI("ChApCi", 4, 5F, EnumRarity.rare, "jamChApCi", 10, 1, 13189222), + HO_ME_KI("HoMeKi", 4, 5F, EnumRarity.rare, "jamHoMeKi", 10, 14, 2031360), + PI_CO("PiCo", 4, 5F, EnumRarity.rare, "jamPiCo", 9, 1, 16056203); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java index c8e5fcfd1..b678244ec 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java @@ -13,7 +13,12 @@ public enum TheMiscItems implements INameableItem{ QUARTZ("BlackQuartz", EnumRarity.epic, "gemQuartzBlack"), RING("Ring", EnumRarity.uncommon, "itemRing"), COIL("Coil", EnumRarity.common, "itemCoilBasic"), - COIL_ADVANCED("CoilAdvanced", EnumRarity.uncommon, "itemCoilAdvanced"); + COIL_ADVANCED("CoilAdvanced", EnumRarity.uncommon, "itemCoilAdvanced"), + RICE_DOUGH("RiceDough", EnumRarity.uncommon, "itemRiceDough"), + TINY_COAL("TinyCoal", EnumRarity.common, "itemTinyCoal"), + TINY_CHAR("TinyCharcoal", EnumRarity.common, "itemTinyChar"), + RICE_SLIME("RiceSlime", EnumRarity.uncommon, "slimeball"), + CANOLA("Canola", EnumRarity.uncommon, "itemCanola"); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java new file mode 100644 index 000000000..4111dbba9 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java @@ -0,0 +1,109 @@ +package ellpeck.actuallyadditions.nei; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.RecipeInfo; +import codechicken.nei.recipe.TemplateRecipeHandler; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.util.Collections; + +public class CompostRecipeHandler extends TemplateRecipeHandler{ + + public static final String NAME = "compost"; + + public CompostRecipeHandler(){ + super(); + RecipeInfo.setGuiOffset(this.getGuiClass(), 0, 0); + } + + public class CachedCompostRecipe extends CachedRecipe{ + + public PositionedStack result; + public PositionedStack input; + public int chance; + + public CachedCompostRecipe(ItemStack input, ItemStack result){ + this.result = new PositionedStack(result, 67+32, 19); + this.input = new PositionedStack(input, 5+32, 19); + } + + @Override + public PositionedStack getIngredient(){ + return input; + } + + @Override + public PositionedStack getResult(){ + return result; + } + } + + @Override + public int recipiesPerPage(){ + return 2; + } + + @Override + public Class getGuiClass(){ + return null; + } + + @Override + public String getRecipeName(){ + return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); + } + + @Override + public void loadTransferRects(){ + transferRects.add(new RecipeTransferRect(new Rectangle(31+32, 18, 22, 16), NAME)); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results){ + if(outputId.equals(NAME) && getClass() == CompostRecipeHandler.class){ + arecipes.add(new CachedCompostRecipe(new ItemStack(InitItems.itemMisc, ConfigIntValues.COMPOST_AMOUNT.getValue(), TheMiscItems.MASHED_FOOD.ordinal()), new ItemStack(InitItems.itemFertilizer, ConfigIntValues.COMPOST_AMOUNT.getValue()))); + } + else super.loadCraftingRecipes(outputId, results); + } + + @Override + public void loadCraftingRecipes(ItemStack result){ + if(NEIServerUtils.areStacksSameType(new ItemStack(InitItems.itemFertilizer), result)) arecipes.add(new CachedCompostRecipe(new ItemStack(InitItems.itemMisc, ConfigIntValues.COMPOST_AMOUNT.getValue(), TheMiscItems.MASHED_FOOD.ordinal()), new ItemStack(InitItems.itemFertilizer, ConfigIntValues.COMPOST_AMOUNT.getValue()))); + } + + @Override + public void loadUsageRecipes(ItemStack ingredient){ + if(NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemMisc, ConfigIntValues.COMPOST_AMOUNT.getValue(), TheMiscItems.MASHED_FOOD.ordinal()), ingredient)){ + CachedCompostRecipe theRecipe = new CachedCompostRecipe(new ItemStack(InitItems.itemMisc, ConfigIntValues.COMPOST_AMOUNT.getValue(), TheMiscItems.MASHED_FOOD.ordinal()), new ItemStack(InitItems.itemFertilizer, ConfigIntValues.COMPOST_AMOUNT.getValue())); + theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.input), ingredient); + arecipes.add(theRecipe); + } + } + + @Override + public String getGuiTexture(){ + return ModUtil.MOD_ID_LOWER + ":textures/gui/guiNEICompost.png"; + } + + @Override + public void drawBackground(int recipeIndex){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(32, 0, 0, 0, 96, 60); + } + + @Override + public String getOverlayIdentifier(){ + return NAME; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java index 8eae1f040..bbb50f5c9 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java @@ -1,7 +1,6 @@ package ellpeck.actuallyadditions.nei; import codechicken.lib.gui.GuiDraw; -import codechicken.nei.ItemList; import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.RecipeInfo; @@ -11,23 +10,18 @@ import ellpeck.actuallyadditions.recipe.GrinderRecipes; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.StringUtil; import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.init.Blocks; -import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntityFurnace; import net.minecraft.util.StatCollector; import org.lwjgl.opengl.GL11; import java.awt.*; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class CrusherRecipeHandler extends TemplateRecipeHandler{ public static final String NAME = "crushing"; - public static final String FUEL = "fuel"; - - public static ArrayList fuels; public CrusherRecipeHandler(){ super(); @@ -59,15 +53,9 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ return resultOne; } - @Override - public PositionedStack getOtherStack(){ - return fuels.get((cycleticks / 48) % fuels.size()).stack; - } - @Override public List getOtherStacks(){ ArrayList list = new ArrayList(); - list.add(this.getOtherStack()); if(this.resultTwo != null) list.add(this.resultTwo); return list; } @@ -78,20 +66,8 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ return 1; } - public static class Fuel{ - - public Fuel(ItemStack in, int burnTime){ - this.stack = new PositionedStack(in, 51, 21, false); - this.burnTime = burnTime; - } - - public PositionedStack stack; - public int burnTime; - } - @Override public void loadTransferRects(){ - transferRects.add(new RecipeTransferRect(new Rectangle(51, 5, 14, 14), FUEL)); transferRects.add(new RecipeTransferRect(new Rectangle(80, 40, 24, 22), NAME)); } @@ -105,12 +81,6 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); } - @Override - public TemplateRecipeHandler newInstance(){ - if (fuels == null || fuels.isEmpty()) findFuels(); - return super.newInstance(); - } - @Override public void loadCraftingRecipes(String outputId, Object... results){ if(outputId.equals(NAME) && getClass() == CrusherRecipeHandler.class){ @@ -130,12 +100,6 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ } } - @Override - public void loadUsageRecipes(String inputId, Object... ingredients){ - if (inputId.equals(FUEL) && getClass() == CrusherRecipeHandler.class) loadCraftingRecipes(NAME); - else super.loadUsageRecipes(inputId, ingredients); - } - @Override public void loadUsageRecipes(ItemStack ingredient){ ArrayList recipes = GrinderRecipes.instance().recipes; @@ -157,12 +121,11 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ public void drawBackground(int recipeIndex){ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); GuiDraw.changeTexture(getGuiTexture()); - GuiDraw.drawTexturedModalRect(49, 5, 49, 5, 66, 86); + GuiDraw.drawTexturedModalRect(60, 13, 60, 13, 56, 79); } @Override public void drawExtras(int recipe){ - drawProgressBar(51, 5, 176, 44, 14, 14, 48, 7); drawProgressBar(80, 40, 176, 0, 24, 23, 48, 1); CachedCrush crush = (CachedCrush)this.arecipes.get(recipe); @@ -173,28 +136,6 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ } } - private static Set excludedFuels(){ - Set theFuels = new HashSet(); - theFuels.add(Item.getItemFromBlock(Blocks.brown_mushroom)); - theFuels.add(Item.getItemFromBlock(Blocks.red_mushroom)); - theFuels.add(Item.getItemFromBlock(Blocks.standing_sign)); - theFuels.add(Item.getItemFromBlock(Blocks.wall_sign)); - theFuels.add(Item.getItemFromBlock(Blocks.wooden_door)); - theFuels.add(Item.getItemFromBlock(Blocks.trapped_chest)); - return theFuels; - } - - private static void findFuels(){ - fuels = new ArrayList(); - Set theFuels = excludedFuels(); - for(ItemStack item : ItemList.items){ - if(!theFuels.contains(item.getItem())){ - int burnTime = TileEntityFurnace.getItemBurnTime(item); - if(burnTime > 0) fuels.add(new Fuel(item.copy(), burnTime)); - } - } - } - @Override public String getOverlayIdentifier(){ return NAME; diff --git a/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java new file mode 100644 index 000000000..950afc0ef --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java @@ -0,0 +1,129 @@ +package ellpeck.actuallyadditions.nei; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.RecipeInfo; +import codechicken.nei.recipe.TemplateRecipeHandler; +import ellpeck.actuallyadditions.recipe.HairyBallHandler; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; + +public class HairyBallRecipeHandler extends TemplateRecipeHandler{ + + public static final String NAME = "ballOfHair"; + + public HairyBallRecipeHandler(){ + super(); + RecipeInfo.setGuiOffset(this.getGuiClass(), 0, 0); + } + + public class CachedBallRecipe extends CachedRecipe{ + + public PositionedStack result; + public PositionedStack input; + public int chance; + + public CachedBallRecipe(ItemStack input, ItemStack result, int chance){ + this.result = new PositionedStack(result, 67+32, 19); + this.chance = chance; + this.input = new PositionedStack(input, 5+32, 19); + } + + @Override + public PositionedStack getIngredient(){ + return input; + } + + @Override + public PositionedStack getResult(){ + return result; + } + } + + @Override + public int recipiesPerPage(){ + return 2; + } + + @Override + public Class getGuiClass(){ + return null; + } + + @Override + public String getRecipeName(){ + return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); + } + + @Override + public void loadTransferRects(){ + transferRects.add(new RecipeTransferRect(new Rectangle(31+32, 18, 22, 16), NAME)); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results){ + if(outputId.equals(NAME) && getClass() == HairyBallRecipeHandler.class){ + ArrayList recipes = HairyBallHandler.returns; + for(HairyBallHandler.Return recipe : recipes){ + arecipes.add(new CachedBallRecipe(recipe.inputItem, recipe.returnItem, recipe.itemWeight)); + } + } + else super.loadCraftingRecipes(outputId, results); + } + + @Override + public void loadCraftingRecipes(ItemStack result){ + ArrayList recipes = HairyBallHandler.returns; + for(HairyBallHandler.Return recipe : recipes){ + if(NEIServerUtils.areStacksSameType(recipe.returnItem, result)) arecipes.add(new CachedBallRecipe(recipe.inputItem, recipe.returnItem, recipe.itemWeight)); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient){ + ArrayList recipes = HairyBallHandler.returns; + for(HairyBallHandler.Return recipe : recipes){ + if(NEIServerUtils.areStacksSameTypeCrafting(recipe.inputItem, ingredient)){ + CachedBallRecipe theRecipe = new CachedBallRecipe(recipe.inputItem, recipe.returnItem, recipe.itemWeight); + theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.input), ingredient); + arecipes.add(theRecipe); + } + } + } + + @Override + public String getGuiTexture(){ + return ModUtil.MOD_ID_LOWER + ":textures/gui/guiNEIHairyBall.png"; + } + + @Override + public void drawBackground(int recipeIndex){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(32, 0, 0, 0, 96, 60); + } + + @Override + public void drawExtras(int rec){ + CachedBallRecipe recipe = (CachedBallRecipe)this.arecipes.get(rec); + if(recipe.result != null){ + int secondChance = recipe.chance; + String secondString = secondChance + "%"; + GuiDraw.drawString(secondString, 65+32, 48, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + } + } + + @Override + public String getOverlayIdentifier(){ + return NAME; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java index 7f90d5e67..74fdadcff 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java @@ -17,9 +17,16 @@ public class NEIActuallyAdditionsConfig implements IConfigureNEI{ API.registerRecipeHandler(crusherRecipeHandler); API.registerUsageHandler(crusherRecipeHandler); - //TODO Re-add - API.hideItem(new ItemStack(InitBlocks.blockHeatCollector)); - API.hideItem(new ItemStack(InitBlocks.blockFurnaceSolar)); + HairyBallRecipeHandler ballRecipeHandler = new HairyBallRecipeHandler(); + API.registerRecipeHandler(ballRecipeHandler); + API.registerUsageHandler(ballRecipeHandler); + + CompostRecipeHandler compostRecipeHandler = new CompostRecipeHandler(); + API.registerRecipeHandler(compostRecipeHandler); + API.registerUsageHandler(compostRecipeHandler); + + API.hideItem(new ItemStack(InitBlocks.blockRice)); + API.hideItem(new ItemStack(InitBlocks.blockCanola)); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java new file mode 100644 index 000000000..8fe8d7311 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java @@ -0,0 +1,72 @@ +package ellpeck.actuallyadditions.recipe; + +import cpw.mods.fml.common.IFuelHandler; +import cpw.mods.fml.common.registry.GameRegistry; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.util.Util; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.HashMap; + +@SuppressWarnings("unused") +public class FuelHandler implements IFuelHandler{ + + private static HashMap, Integer> fuelList = new HashMap, Integer>(); + + public static void init(){ + Util.logInfo("Initializing Fuelstuffs..."); + + GameRegistry.registerFuelHandler(new FuelHandler()); + setFuelValues(); + } + + @Override + public int getBurnTime(ItemStack fuel){ + return getFuelValue(fuel); + } + + public static void setFuelValues(){ + addFuel(InitItems.itemMisc, TheMiscItems.TINY_CHAR.ordinal(), 200); + addFuel(InitItems.itemMisc, TheMiscItems.TINY_COAL.ordinal(), 200); + addFuel(InitBlocks.blockMisc, TheMiscBlocks.CHARCOAL_BLOCK.ordinal(), 16000); + } + + private static void addFuel(Item item, int metadata, int value){ + fuelList.put(Pair.of(item, metadata), value); + } + + private static void addFuel(Item item, int value){ + addFuel(item, 0, value); + } + + private static void addFuel(Block block, int metadata, int value){ + addFuel(Item.getItemFromBlock(block), metadata, value); + } + + private static void addFuel(Block block, int value){ + addFuel(Item.getItemFromBlock(block), 0, value); + } + + private static int getFuelValue(ItemStack stack){ + if(stack != null && stack.getItem() != null){ + Pair pair = Pair.of(stack.getItem(), stack.getItemDamage()); + + if(fuelList.containsKey(pair)){ + return fuelList.get(pair); + } + else{ + pair = Pair.of(stack.getItem(), 0); + if(fuelList.containsKey(pair)){ + return fuelList.get(pair); + } + } + } + return 0; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java index 3b60baad6..208a5f2d0 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java @@ -41,10 +41,6 @@ public class GrinderRecipes{ } } - public void registerRecipe(String input, String outputOne){ - this.registerRecipe(input, outputOne, "", 0, 1); - } - public void registerRecipe(ItemStack input, ItemStack outputOne){ this.registerRecipe(input, outputOne, null, 0); } @@ -78,6 +74,8 @@ public class GrinderRecipes{ break; } } + + if(containsInput && containsOutput) break; } return containsInput && containsOutput; } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java index a03da6f18..87d81bf5d 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java @@ -46,10 +46,12 @@ public class HairyBallHandler{ public static class Return extends WeightedRandom.Item{ public ItemStack returnItem; + public ItemStack inputItem; public Return(ItemStack returnItem, int chance){ super(chance); this.returnItem = returnItem; + this.inputItem = new ItemStack(InitItems.itemHairyBall); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/IPowerAcceptor.java b/src/main/java/ellpeck/actuallyadditions/tile/IPowerAcceptor.java deleted file mode 100644 index 4c4f46d19..000000000 --- a/src/main/java/ellpeck/actuallyadditions/tile/IPowerAcceptor.java +++ /dev/null @@ -1,12 +0,0 @@ -package ellpeck.actuallyadditions.tile; - -public interface IPowerAcceptor{ - - void setBlockMetadataToOn(); - - void setPower(int power); - - void setItemPower(int power); - - int getItemPower(); -} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index cf3f30777..202429ee6 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -27,6 +27,11 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityInputter.TileEntityInputterAdvanced.class, ModUtil.MOD_ID_LOWER + ":tileEntityInputterAdvanced"); GameRegistry.registerTileEntity(TileEntityBreaker.TileEntityPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityPlacer"); GameRegistry.registerTileEntity(TileEntityGrinder.TileEntityGrinderDouble.class, ModUtil.MOD_ID_LOWER + ":tileEntityGrinderDouble"); + GameRegistry.registerTileEntity(TileEntityCanolaPress.class, ModUtil.MOD_ID_LOWER + ":tileEntityCanolaPress"); + GameRegistry.registerTileEntity(TileEntityFermentingBarrel.class, ModUtil.MOD_ID_LOWER + ":tileEntityFermentingBarrel"); + GameRegistry.registerTileEntity(TileEntityOilGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityOilGenerator"); + GameRegistry.registerTileEntity(TileEntityCoalGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoalGenerator"); + GameRegistry.registerTileEntity(TileEntityPhantomface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomface"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java new file mode 100644 index 000000000..bd19b96cd --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -0,0 +1,174 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.*; + +public class TileEntityCanolaPress extends TileEntityInventoryBase implements IEnergyReceiver, IFluidHandler{ + + public EnergyStorage storage = new EnergyStorage(40000, energyUsedPerTick+50); + + public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); + + public static int energyUsedPerTick = ConfigIntValues.PRESS_ENERGY_USED.getValue(); + public int mbProducedPerCanola = ConfigIntValues.PRESS_MB_PRODUCED.getValue(); + + public int maxTimeProcessing = ConfigIntValues.PRESS_PROCESSING_TIME.getValue(); + public int currentProcessTime; + + public TileEntityCanolaPress(){ + super(3, "canolaPress"); + } + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + if(this.isCanola(0) && this.storage.getEnergyStored() >= energyUsedPerTick && this.mbProducedPerCanola <= this.tank.getCapacity()-this.tank.getFluidAmount()){ + this.currentProcessTime++; + if(this.currentProcessTime >= this.maxTimeProcessing){ + this.currentProcessTime = 0; + + this.slots[0].stackSize--; + if(this.slots[0].stackSize == 0) this.slots[0] = null; + + this.tank.fill(new FluidStack(InitBlocks.fluidCanolaOil, mbProducedPerCanola), true); + this.markDirty(); + } + } + else this.currentProcessTime = 0; + + if(this.slots[1] != null && this.slots[1].getItem() == Items.bucket && this.slots[2] == null){ + if(this.tank.getFluidAmount() > 0 && this.tank.getFluid().getFluid() == InitBlocks.fluidCanolaOil && this.tank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME){ + this.slots[2] = new ItemStack(InitItems.itemBucketCanolaOil); + this.slots[1].stackSize--; + if(this.slots[1].stackSize == 0) this.slots[1] = null; + this.tank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); + } + } + + if(this.currentProcessTime > 0) this.storage.extractEnergy(energyUsedPerTick, false); + + if(this.tank.getFluidAmount() > 0){ + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, this.tank); + } + } + } + + public boolean isCanola(int slot){ + return this.slots[slot] != null && this.slots[slot].getItem() == InitItems.itemMisc && this.slots[slot].getItemDamage() == TheMiscItems.CANOLA.ordinal(); + } + + @SideOnly(Side.CLIENT) + public int getTankScaled(int i){ + return this.tank.getFluidAmount() * i / this.tank.getCapacity(); + } + + @SideOnly(Side.CLIENT) + public int getProcessScaled(int i){ + return this.currentProcessTime * i / this.maxTimeProcessing; + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + compound.setInteger("ProcessTime", this.currentProcessTime); + this.storage.writeToNBT(compound); + this.tank.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.currentProcessTime = compound.getInteger("ProcessTime"); + this.storage.readFromNBT(compound); + this.tank.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return (i == 0 && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CANOLA.ordinal()) || (i == 1 && stack.getItem() == Items.bucket); + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == 2 && stack.getItem() == InitItems.itemBucketCanolaOil; + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.tank.drain(resource.amount, doDrain); + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + return this.tank.drain(maxDrain, doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return false; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return true; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + return new FluidTankInfo[]{this.tank.getInfo()}; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java new file mode 100644 index 000000000..f89c9156a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java @@ -0,0 +1,117 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCoalGenerator extends TileEntityInventoryBase implements IEnergyReceiver{ + + public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + + public static int energyProducedPerTick = ConfigIntValues.COAL_GEN_ENERGY_PRODUCED.getValue(); + + public int maxBurnTime; + public int currentBurnTime; + + public TileEntityCoalGenerator(){ + super(1, "coalGenerator"); + } + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + + if(this.currentBurnTime > 0){ + this.currentBurnTime--; + this.storage.receiveEnergy(energyProducedPerTick, false); + } + + if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + if(this.currentBurnTime <= 0 && this.slots[0] != null && TileEntityFurnace.getItemBurnTime(this.slots[0]) > 0){ + this.maxBurnTime = TileEntityFurnace.getItemBurnTime(this.slots[0]); + this.currentBurnTime = this.maxBurnTime; + this.slots[0].stackSize--; + if(this.slots[0].stackSize == 0) this.slots[0] = this.slots[0].getItem().getContainerItem(this.slots[0]); + } + } + + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); + } + } + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @SideOnly(Side.CLIENT) + public int getBurningScaled(int i){ + return this.currentBurnTime * i / this.maxBurnTime; + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + compound.setInteger("BurnTime", this.currentBurnTime); + compound.setInteger("MaxBurnTime", this.maxBurnTime); + this.storage.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.currentBurnTime = compound.getInteger("BurnTime"); + this.maxBurnTime = compound.getInteger("MaxBurnTime"); + this.storage.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return TileEntityFurnace.getItemBurnTime(stack) > 0; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return false; + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java new file mode 100644 index 000000000..b9c15ad2e --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -0,0 +1,153 @@ +package ellpeck.actuallyadditions.tile; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.*; + +public class TileEntityFermentingBarrel extends TileEntityInventoryBase implements IFluidHandler{ + + public FluidTank canolaTank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); + public FluidTank oilTank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); + + public int currentProcessTime; + public int maxTimeProcessing = ConfigIntValues.BARREL_PROCESSING_TIME.getValue(); + + public int mBProducedPerCycle = ConfigIntValues.BARREL_MB_PRODUCED.getValue(); + + public TileEntityFermentingBarrel(){ + super(4, "fermentingBarrel"); + } + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + if(this.canolaTank.getFluidAmount() >= this.mBProducedPerCycle && this.mBProducedPerCycle <= this.oilTank.getCapacity()-this.oilTank.getFluidAmount()){ + this.currentProcessTime++; + if(this.currentProcessTime >= this.maxTimeProcessing){ + this.currentProcessTime = 0; + + this.oilTank.fill(new FluidStack(InitBlocks.fluidOil, mBProducedPerCycle), true); + this.canolaTank.drain(mBProducedPerCycle, true); + this.markDirty(); + } + } + else this.currentProcessTime = 0; + + if(this.slots[0] != null && this.slots[0].getItem() == InitItems.itemBucketCanolaOil && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ + if(FluidContainerRegistry.BUCKET_VOLUME <= this.canolaTank.getCapacity()-this.canolaTank.getFluidAmount()){ + if(this.slots[1] == null) this.slots[1] = new ItemStack(Items.bucket); + else this.slots[1].stackSize++; + this.slots[0] = null; + this.canolaTank.fill(new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME), true); + } + } + + if(this.slots[2] != null && this.slots[2].getItem() == Items.bucket && this.slots[3] == null){ + if(this.oilTank.getFluidAmount() > 0 && this.oilTank.getFluid().getFluid() == InitBlocks.fluidOil && this.oilTank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME){ + this.slots[3] = new ItemStack(InitItems.itemBucketOil); + this.slots[2].stackSize--; + if(this.slots[2].stackSize == 0) this.slots[2] = null; + this.oilTank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); + } + } + + if(this.oilTank.getFluidAmount() > 0){ + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, this.oilTank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.oilTank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, this.oilTank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, this.oilTank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, this.oilTank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, this.oilTank); + } + } + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + compound.setInteger("ProcessTime", this.currentProcessTime); + this.canolaTank.writeToNBT(compound); + NBTTagCompound tag = new NBTTagCompound(); + this.oilTank.writeToNBT(tag); + compound.setTag("OilTank", tag); + super.writeToNBT(compound); + } + + @SideOnly(Side.CLIENT) + public int getProcessScaled(int i){ + return this.currentProcessTime * i / this.maxTimeProcessing; + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.currentProcessTime = compound.getInteger("ProcessTime"); + this.canolaTank.readFromNBT(compound); + this.oilTank.readFromNBT((NBTTagCompound)compound.getTag("OilTank")); + super.readFromNBT(compound); + } + + @SideOnly(Side.CLIENT) + public int getOilTankScaled(int i){ + return this.oilTank.getFluidAmount() * i / this.oilTank.getCapacity(); + } + + @SideOnly(Side.CLIENT) + public int getCanolaTankScaled(int i){ + return this.canolaTank.getFluidAmount() * i / this.canolaTank.getCapacity(); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return (i == 0 && stack.getItem() == InitItems.itemBucketCanolaOil) || (i == 2 && stack.getItem() == Items.bucket); + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return (slot == 1 && stack.getItem() == Items.bucket) || (slot == 3 && stack.getItem() == InitItems.itemBucketOil); + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.canolaTank.fill(resource, doFill); + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidOil.getName())) return this.oilTank.drain(resource.amount, doDrain); + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + return this.oilTank.drain(maxDrain, doDrain); + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return fluid == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName()); + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return fluid == FluidRegistry.getFluid(InitBlocks.fluidOil.getName()); + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + return new FluidTankInfo[]{this.canolaTank.getInfo(), this.oilTank.getInfo()}; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java index efdfb5363..05bd9747c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java @@ -1,24 +1,25 @@ package ellpeck.actuallyadditions.tile; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.FurnaceRecipes; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPowerAcceptor{ +public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements IEnergyReceiver{ - public static final int SLOT_COAL = 0; - public static final int SLOT_INPUT_1 = 1; - public static final int SLOT_OUTPUT_1 = 2; - public static final int SLOT_INPUT_2 = 3; - public static final int SLOT_OUTPUT_2 = 4; + public static final int SLOT_INPUT_1 = 0; + public static final int SLOT_OUTPUT_1 = 1; + public static final int SLOT_INPUT_2 = 2; + public static final int SLOT_OUTPUT_2 = 3; - public int coalTime; - public int coalTimeLeft; + public EnergyStorage storage = new EnergyStorage(30000, energyUsePerTick+30); + + public static int energyUsePerTick = ConfigIntValues.FURNACE_ENERGY_USED.getValue(); public int maxBurnTime = this.getStandardSpeed(); @@ -26,33 +27,18 @@ public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPo public int secondSmeltTime; public TileEntityFurnaceDouble(){ - super(6, "furnaceDouble"); - this.speedUpgradeSlot = 5; + super(4, "furnaceDouble"); } @Override @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - this.speedUp(); - - boolean theFlag = this.coalTimeLeft > 0; - - if(this.coalTimeLeft > 0) this.coalTimeLeft -= 1+this.burnTimeAmplifier; boolean canSmeltOnFirst = this.canSmeltOn(SLOT_INPUT_1, SLOT_OUTPUT_1); boolean canSmeltOnSecond = this.canSmeltOn(SLOT_INPUT_2, SLOT_OUTPUT_2); - if((canSmeltOnFirst || canSmeltOnSecond) && this.coalTimeLeft <= 0 && this.slots[SLOT_COAL] != null){ - this.coalTime = TileEntityFurnace.getItemBurnTime(this.slots[SLOT_COAL]); - this.coalTimeLeft = this.coalTime; - if(this.coalTime > 0){ - this.slots[SLOT_COAL].stackSize--; - if(this.slots[SLOT_COAL].stackSize <= 0) this.slots[SLOT_COAL] = this.slots[SLOT_COAL].getItem().getContainerItem(this.slots[SLOT_COAL]); - } - } - - if(this.coalTimeLeft > 0){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ if(canSmeltOnFirst){ this.firstSmeltTime++; if(this.firstSmeltTime >= maxBurnTime){ @@ -74,14 +60,9 @@ public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPo else{ this.firstSmeltTime = 0; this.secondSmeltTime = 0; - this.coalTime = 0; } - if(theFlag != this.coalTimeLeft > 0){ - int metaBefore = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, (this.coalTimeLeft > 0 ? metaBefore+4 : metaBefore-4), 2); - this.markDirty(); - } + if(this.firstSmeltTime > 0 || this.secondSmeltTime > 0) this.storage.extractEnergy(energyUsePerTick, false); } } @@ -112,24 +93,22 @@ public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPo @Override public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); - compound.setInteger("CoalTime", this.coalTime); - compound.setInteger("CoalTimeLeft", this.coalTimeLeft); compound.setInteger("FirstSmeltTime", this.firstSmeltTime); compound.setInteger("SecondSmeltTime", this.secondSmeltTime); + this.storage.writeToNBT(compound); } @Override public void readFromNBT(NBTTagCompound compound){ super.readFromNBT(compound); - this.coalTime = compound.getInteger("CoalTime"); - this.coalTimeLeft = compound.getInteger("CoalTimeLeft"); this.firstSmeltTime = compound.getInteger("FirstSmeltTime"); this.secondSmeltTime = compound.getInteger("SecondSmeltTime"); + this.storage.readFromNBT(compound); } @SideOnly(Side.CLIENT) - public int getCoalTimeToScale(int i){ - return this.coalTimeLeft * i / this.coalTime; + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); } @SideOnly(Side.CLIENT) @@ -144,7 +123,7 @@ public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPo @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return i == SLOT_COAL && TileEntityFurnace.getItemBurnTime(stack) > 0 || (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && FurnaceRecipes.smelting().getSmeltingResult(stack) != null; + return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && FurnaceRecipes.smelting().getSmeltingResult(stack) != null; } @Override @@ -154,37 +133,30 @@ public class TileEntityFurnaceDouble extends TileEntityUpgradable implements IPo @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return slot == SLOT_OUTPUT_1 || slot == SLOT_OUTPUT_2 || (slot == SLOT_COAL && stack.getItem() == Items.bucket); + return slot == SLOT_OUTPUT_1 || slot == SLOT_OUTPUT_2; } - @Override - public void setBlockMetadataToOn(){ - int metaBefore = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, metaBefore+4, 2); - } - - @Override - public void setPower(int power){ - this.coalTimeLeft = power; - } - - @Override - public void setItemPower(int power){ - this.coalTime = power; - } - - @Override - public int getItemPower(){ - return this.coalTime; - } - - @Override public int getStandardSpeed(){ return ConfigIntValues.FURNACE_DOUBLE_SMELT_TIME.getValue(); } @Override - public void setSpeed(int newSpeed){ - this.maxBurnTime = newSpeed; + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java index 3b8fa4d91..236cd7dc7 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java @@ -1,44 +1,67 @@ package ellpeck.actuallyadditions.tile; -public class TileEntityFurnaceSolar extends TileEntityBase{ +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyProvider; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityFurnaceSolar extends TileEntityBase implements IEnergyProvider{ @Override - public boolean canUpdate(){ - return false; + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return this.storage.extractEnergy(maxExtract, simulate); } - //TODO Reimplement + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } - /*@Override + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return from != ForgeDirection.UP; + } + + public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + + public static int energyProducedPerTick = ConfigIntValues.FURNACE_SOLAR_ENERGY_PRODUCED.getValue(); + + @Override public void updateEntity(){ if(!worldObj.isRemote){ if(worldObj.canBlockSeeTheSky(xCoord, yCoord, zCoord) && worldObj.isDaytime()){ - TileEntity tileBelow = WorldUtil.getTileEntityFromSide(1, worldObj, xCoord, yCoord, zCoord); + if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + this.storage.receiveEnergy(energyProducedPerTick, false); + this.markDirty(); + } + } - givePowerTo(tileBelow); + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); } } } - public static void givePowerTo(TileEntity tile){ - if(tile instanceof IPowerAcceptor){ - IPowerAcceptor acceptor = (IPowerAcceptor)tile; - int coalTimeBefore = acceptor.getItemPower(); - acceptor.setItemPower(42); - acceptor.setPower(42); - if(coalTimeBefore == 0){ - acceptor.setBlockMetadataToOn(); - } - return; - } - if(tile instanceof TileEntityFurnace){ - TileEntityFurnace furnaceBelow = (TileEntityFurnace)tile; - int burnTimeBefore = furnaceBelow.furnaceBurnTime; - furnaceBelow.furnaceBurnTime = 42; - furnaceBelow.currentItemBurnTime = 42; - if(burnTimeBefore == 0){ - BlockFurnace.updateFurnaceBlockState(true, tile.getWorldObj(), furnaceBelow.xCoord, furnaceBelow.yCoord, furnaceBelow.zCoord); - } - } - }*/ + @Override + public void writeToNBT(NBTTagCompound compound){ + this.storage.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.storage.readFromNBT(compound); + super.readFromNBT(compound); + } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index e9057a3cf..a62170ef3 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -1,39 +1,60 @@ package ellpeck.actuallyadditions.tile; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.recipe.GrinderRecipes; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; import java.util.Random; -public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcceptor{ +public class TileEntityGrinder extends TileEntityInventoryBase implements IEnergyReceiver{ + + public EnergyStorage storage = new EnergyStorage(60000, energyUsePerTick+20); + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } public static class TileEntityGrinderDouble extends TileEntityGrinder{ public TileEntityGrinderDouble(){ - super(8, "grinderDouble"); + super(6, "grinderDouble"); this.isDouble = true; this.maxCrushTime = this.getStandardSpeed(); - this.speedUpgradeSlot = 7; + energyUsePerTick = ConfigIntValues.GRINDER_DOUBLE_ENERGY_USED.getValue(); } } - public static final int SLOT_COAL = 0; - public static final int SLOT_INPUT_1 = 1; - public static final int SLOT_OUTPUT_1_1 = 2; - public static final int SLOT_OUTPUT_1_2 = 3; - public static final int SLOT_INPUT_2 = 4; - public static final int SLOT_OUTPUT_2_1 = 5; - public static final int SLOT_OUTPUT_2_2 = 6; + public static final int SLOT_INPUT_1 = 0; + public static final int SLOT_OUTPUT_1_1 = 1; + public static final int SLOT_OUTPUT_1_2 = 2; + public static final int SLOT_INPUT_2 = 3; + public static final int SLOT_OUTPUT_2_1 = 4; + public static final int SLOT_OUTPUT_2_2 = 5; - public int coalTime; - public int coalTimeLeft; + public static int energyUsePerTick; public int maxCrushTime; @@ -47,10 +68,10 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc } public TileEntityGrinder(){ - super(5, "grinder"); + super(3, "grinder"); this.isDouble = false; this.maxCrushTime = this.getStandardSpeed(); - this.speedUpgradeSlot = 4; + energyUsePerTick = ConfigIntValues.GRINDER_ENERGY_USED.getValue(); } @Override @@ -66,26 +87,11 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc ((TileEntityGrinderDouble)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); } - this.speedUp(); - - boolean theFlag = this.coalTimeLeft > 0; - - if(this.coalTimeLeft > 0) this.coalTimeLeft -= 1+this.burnTimeAmplifier; - boolean canCrushOnFirst = this.canCrushOn(SLOT_INPUT_1, SLOT_OUTPUT_1_1, SLOT_OUTPUT_1_2); boolean canCrushOnSecond = false; if(this.isDouble) canCrushOnSecond = this.canCrushOn(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2); - if((canCrushOnFirst || canCrushOnSecond) && this.coalTimeLeft <= 0 && this.slots[SLOT_COAL] != null){ - this.coalTime = TileEntityFurnace.getItemBurnTime(this.slots[SLOT_COAL]); - this.coalTimeLeft = this.coalTime; - if(this.coalTime > 0){ - this.slots[SLOT_COAL].stackSize--; - if(this.slots[SLOT_COAL].stackSize <= 0) this.slots[SLOT_COAL] = this.slots[SLOT_COAL].getItem().getContainerItem(this.slots[SLOT_COAL]); - } - } - - if(this.coalTimeLeft > 0){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ if(canCrushOnFirst){ this.firstCrushTime++; if(this.firstCrushTime >= maxCrushTime){ @@ -109,13 +115,9 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc else{ this.firstCrushTime = 0; this.secondCrushTime = 0; - this.coalTime = 0; } - if(theFlag != this.coalTimeLeft > 0){ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, (this.coalTimeLeft > 0 ? 1 : 0), 2); - this.markDirty(); - } + if(this.firstCrushTime > 0 || this.secondCrushTime > 0) this.storage.extractEnergy(energyUsePerTick, false); } } @@ -155,25 +157,23 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc @Override public void writeToNBT(NBTTagCompound compound){ - compound.setInteger("CoalTime", this.coalTime); - compound.setInteger("CoalTimeLeft", this.coalTimeLeft); compound.setInteger("FirstCrushTime", this.firstCrushTime); compound.setInteger("SecondCrushTime", this.secondCrushTime); + this.storage.writeToNBT(compound); super.writeToNBT(compound); } @Override public void readFromNBT(NBTTagCompound compound){ - this.coalTime = compound.getInteger("CoalTime"); - this.coalTimeLeft = compound.getInteger("CoalTimeLeft"); this.firstCrushTime = compound.getInteger("FirstCrushTime"); this.secondCrushTime = compound.getInteger("SecondCrushTime"); + this.storage.readFromNBT(compound); super.readFromNBT(compound); } @SideOnly(Side.CLIENT) - public int getCoalTimeToScale(int i){ - return this.coalTimeLeft * i / this.coalTime; + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); } @SideOnly(Side.CLIENT) @@ -188,7 +188,7 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return i == SLOT_COAL && TileEntityFurnace.getItemBurnTime(stack) > 0 || (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipes.instance().getOutput(stack, false) != null; + return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipes.instance().getOutput(stack, false) != null; } @Override @@ -198,36 +198,10 @@ public class TileEntityGrinder extends TileEntityUpgradable implements IPowerAcc @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return slot == SLOT_OUTPUT_1_1 || slot == SLOT_OUTPUT_1_2 || slot == SLOT_OUTPUT_2_1 || slot == SLOT_OUTPUT_2_2 || (slot == SLOT_COAL && stack.getItem() == Items.bucket); + return slot == SLOT_OUTPUT_1_1 || slot == SLOT_OUTPUT_1_2 || slot == SLOT_OUTPUT_2_1 || slot == SLOT_OUTPUT_2_2; } - @Override - public void setBlockMetadataToOn(){ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); - } - - @Override - public void setPower(int power){ - this.coalTimeLeft = power; - } - - @Override - public void setItemPower(int power){ - this.coalTime = power; - } - - @Override - public int getItemPower(){ - return this.coalTime; - } - - @Override public int getStandardSpeed(){ return this.isDouble ? ConfigIntValues.GRINDER_DOUBLE_CRUSH_TIME.getValue() : ConfigIntValues.GRINDER_CRUSH_TIME.getValue(); } - - @Override - public void setSpeed(int newSpeed){ - this.maxCrushTime = newSpeed; - } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java index eca959c5b..de73f6523 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java @@ -1,45 +1,75 @@ package ellpeck.actuallyadditions.tile; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyProvider; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.util.ChunkCoordinates; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityHeatCollector extends TileEntityBase{ +import java.util.ArrayList; +import java.util.Random; + +public class TileEntityHeatCollector extends TileEntityBase implements IEnergyProvider{ private int randomChance = ConfigIntValues.HEAT_COLLECTOR_LAVA_CHANCE.getValue(); private int blocksNeeded = ConfigIntValues.HEAT_COLLECTOR_BLOCKS.getValue(); + public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + + public static int energyProducedPerTick = ConfigIntValues.HEAT_COLLECTOR_ENERGY_PRODUCED.getValue(); + @Override - public boolean canUpdate(){ - return false; - } - - //TODO Reimplement - - /*@Override public void updateEntity(){ if(!worldObj.isRemote){ ArrayList blocksAround = new ArrayList(); - - for(int i = 1; i <= 5; i++){ - ChunkCoordinates coords = WorldUtil.getCoordsFromSide(i, xCoord, yCoord, zCoord); - if(coords != null){ - Block block = worldObj.getBlock(coords.posX, coords.posY, coords.posZ); - if(block != null && block.getMaterial() == Material.lava && worldObj.getBlockMetadata(coords.posX, coords.posY, coords.posZ) == 0){ - blocksAround.add(i); + if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + for(int i = 1; i <= 5; i++){ + ChunkCoordinates coords = WorldUtil.getCoordsFromSide(WorldUtil.getDirectionByRotatingSide(i), xCoord, yCoord, zCoord); + if(coords != null){ + Block block = worldObj.getBlock(coords.posX, coords.posY, coords.posZ); + if(block != null && block.getMaterial() == Material.lava && worldObj.getBlockMetadata(coords.posX, coords.posY, coords.posZ) == 0){ + blocksAround.add(i); + } } } - } - if(blocksAround.size() >= blocksNeeded){ - TileEntity tileAbove = WorldUtil.getTileEntityFromSide(0, worldObj, xCoord, yCoord, zCoord); + if(blocksAround.size() >= blocksNeeded){ + this.storage.receiveEnergy(energyProducedPerTick, false); + this.markDirty(); - TileEntityFurnaceSolar.givePowerTo(tileAbove); - - Random rand = new Random(); - if(rand.nextInt(randomChance) == 0){ - int randomSide = blocksAround.get(rand.nextInt(blocksAround.size())); - WorldUtil.breakBlockAtSide(randomSide, worldObj, xCoord, yCoord, zCoord); + Random rand = new Random(); + if(rand.nextInt(randomChance) == 0){ + int randomSide = blocksAround.get(rand.nextInt(blocksAround.size())); + WorldUtil.breakBlockAtSide(WorldUtil.getDirectionByRotatingSide(randomSide), worldObj, xCoord, yCoord, zCoord); + } + } + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, this.storage); } } } - }*/ + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return this.storage.extractEnergy(maxExtract, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return from == ForgeDirection.UP; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java index 0ba5b40b2..ad52e7157 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java @@ -20,27 +20,31 @@ public abstract class TileEntityInventoryBase extends TileEntityBase implements @Override public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); - NBTTagList tagList = new NBTTagList(); - for(int currentIndex = 0; currentIndex < slots.length; currentIndex++){ - if (slots[currentIndex] != null){ - NBTTagCompound tagCompound = new NBTTagCompound(); - tagCompound.setByte("Slot", (byte)currentIndex); - slots[currentIndex].writeToNBT(tagCompound); - tagList.appendTag(tagCompound); + if(this.slots.length > 0){ + NBTTagList tagList = new NBTTagList(); + for(int currentIndex = 0; currentIndex < slots.length; currentIndex++){ + if(slots[currentIndex] != null){ + NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setByte("Slot", (byte)currentIndex); + slots[currentIndex].writeToNBT(tagCompound); + tagList.appendTag(tagCompound); + } } + compound.setTag("Items", tagList); } - compound.setTag("Items", tagList); } @Override public void readFromNBT(NBTTagCompound compound){ super.readFromNBT(compound); - NBTTagList tagList = compound.getTagList("Items", 10); - for (int i = 0; i < tagList.tagCount(); i++){ - NBTTagCompound tagCompound = tagList.getCompoundTagAt(i); - byte slotIndex = tagCompound.getByte("Slot"); - if (slotIndex >= 0 && slotIndex < slots.length){ - slots[slotIndex] = ItemStack.loadItemStackFromNBT(tagCompound); + if(this.slots.length > 0){ + NBTTagList tagList = compound.getTagList("Items", 10); + for(int i = 0; i < tagList.tagCount(); i++){ + NBTTagCompound tagCompound = tagList.getCompoundTagAt(i); + byte slotIndex = tagCompound.getByte("Slot"); + if(slotIndex >= 0 && slotIndex < slots.length){ + slots[slotIndex] = ItemStack.loadItemStackFromNBT(tagCompound); + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java index d7873dd15..b51bee937 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java @@ -1,68 +1,53 @@ package ellpeck.actuallyadditions.tile; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.tileentity.TileEntityFurnace; +import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityItemRepairer extends TileEntityInventoryBase implements IPowerAcceptor{ +public class TileEntityItemRepairer extends TileEntityInventoryBase implements IEnergyReceiver{ - public static final int SLOT_COAL = 0; - public static final int SLOT_INPUT = 1; - public static final int SLOT_OUTPUT = 2; + public static final int SLOT_INPUT = 0; + public static final int SLOT_OUTPUT = 1; + + public EnergyStorage storage = new EnergyStorage(300000, energyUsePerTick+100); private final int speedSlowdown = ConfigIntValues.REPAIRER_SPEED_SLOWDOWN.getValue(); - public int coalTime; - public int coalTimeLeft; + public static int energyUsePerTick = ConfigIntValues.REPAIRER_ENERGY_USED.getValue(); public int nextRepairTick; public TileEntityItemRepairer(){ - super(3, "repairer"); + super(2, "repairer"); } @Override @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - boolean theFlag = this.coalTimeLeft > 0; - - if(this.coalTimeLeft > 0) this.coalTimeLeft--; - - if(this.slots[SLOT_OUTPUT] == null){ - if(canBeRepaired(this.slots[SLOT_INPUT])){ - if(this.slots[SLOT_INPUT].getItemDamage() <= 0){ - this.slots[SLOT_OUTPUT] = this.slots[SLOT_INPUT].copy(); - this.slots[SLOT_INPUT] = null; - } - else{ - if(this.coalTimeLeft <= 0){ - this.coalTime = TileEntityFurnace.getItemBurnTime(this.slots[SLOT_COAL]); - this.coalTimeLeft = this.coalTime; - if(this.coalTime > 0){ - this.slots[SLOT_COAL].stackSize--; - if(this.slots[SLOT_COAL].stackSize <= 0) this.slots[SLOT_COAL] = this.slots[SLOT_COAL].getItem().getContainerItem(this.slots[SLOT_COAL]); - } - } - if(this.coalTimeLeft > 0){ - this.nextRepairTick++; - if(this.nextRepairTick >= this.speedSlowdown){ - this.nextRepairTick = 0; - this.slots[SLOT_INPUT].setItemDamage(this.slots[SLOT_INPUT].getItemDamage() - 1); - } + if(this.slots[SLOT_OUTPUT] == null && canBeRepaired(this.slots[SLOT_INPUT])){ + if(this.slots[SLOT_INPUT].getItemDamage() <= 0){ + this.slots[SLOT_OUTPUT] = this.slots[SLOT_INPUT].copy(); + this.slots[SLOT_INPUT] = null; + this.nextRepairTick = 0; + } + else{ + if(this.storage.getEnergyStored() >= energyUsePerTick){ + this.nextRepairTick++; + this.storage.extractEnergy(energyUsePerTick, false); + if(this.nextRepairTick >= this.speedSlowdown){ + this.nextRepairTick = 0; + this.slots[SLOT_INPUT].setItemDamage(this.slots[SLOT_INPUT].getItemDamage() - 1); } } } } - - if(theFlag != this.coalTimeLeft > 0){ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, (this.coalTimeLeft > 0 ? 1 : 0), 2); - this.markDirty(); - } + else this.nextRepairTick = 0; } } @@ -72,23 +57,21 @@ public class TileEntityItemRepairer extends TileEntityInventoryBase implements I @Override public void writeToNBT(NBTTagCompound compound){ - compound.setInteger("CoalTime", this.coalTime); - compound.setInteger("CoalTimeLeft", this.coalTimeLeft); compound.setInteger("NextRepairTick", this.nextRepairTick); super.writeToNBT(compound); + this.storage.writeToNBT(compound); } @Override public void readFromNBT(NBTTagCompound compound){ - this.coalTime = compound.getInteger("CoalTime"); - this.coalTimeLeft = compound.getInteger("CoalTimeLeft"); this.nextRepairTick = compound.getInteger("NextRepairTick"); super.readFromNBT(compound); + this.storage.readFromNBT(compound); } @SideOnly(Side.CLIENT) - public int getCoalTimeToScale(int i){ - return this.coalTimeLeft * i / this.coalTime; + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); } @SideOnly(Side.CLIENT) @@ -101,7 +84,7 @@ public class TileEntityItemRepairer extends TileEntityInventoryBase implements I @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return i == SLOT_COAL && TileEntityFurnace.getItemBurnTime(stack) > 0 || i == SLOT_INPUT; + return i == SLOT_INPUT; } @Override @@ -111,26 +94,26 @@ public class TileEntityItemRepairer extends TileEntityInventoryBase implements I @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return slot == SLOT_OUTPUT || (slot == SLOT_COAL && stack.getItem() == Items.bucket); + return slot == SLOT_OUTPUT; } @Override - public void setBlockMetadataToOn(){ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); } @Override - public void setPower(int power){ - this.coalTimeLeft = power; + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); } @Override - public void setItemPower(int power){ - this.coalTime = power; + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); } @Override - public int getItemPower(){ - return this.coalTime; + public boolean canConnectEnergy(ForgeDirection from){ + return true; } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java new file mode 100644 index 000000000..ddb04823a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -0,0 +1,168 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyProvider; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.*; + +public class TileEntityOilGenerator extends TileEntityInventoryBase implements IEnergyProvider, IFluidHandler{ + + public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + + public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); + + public static int energyProducedPerTick = 76; + + public int fuelUsedPerBurnup = 50; + public int maxBurnTime = 100; + + public int currentBurnTime; + + public TileEntityOilGenerator(){ + super(2, "oilGenerator"); + } + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + + if(this.currentBurnTime > 0){ + this.currentBurnTime--; + this.storage.receiveEnergy(energyProducedPerTick, false); + } + + if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + if(this.currentBurnTime <= 0 && this.tank.getFluidAmount() >= this.fuelUsedPerBurnup){ + this.currentBurnTime = this.maxBurnTime; + this.tank.drain(this.fuelUsedPerBurnup, true); + } + } + + if(this.slots[0] != null && this.slots[0].getItem() == InitItems.itemBucketOil && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ + if(FluidContainerRegistry.BUCKET_VOLUME <= this.tank.getCapacity()-this.tank.getFluidAmount()){ + if(this.slots[1] == null) this.slots[1] = new ItemStack(Items.bucket); + else this.slots[1].stackSize++; + this.slots[0] = null; + this.tank.fill(new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME), true); + } + } + + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); + } + } + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @SideOnly(Side.CLIENT) + public int getTankScaled(int i){ + return this.tank.getFluidAmount() * i / this.tank.getCapacity(); + } + + @SideOnly(Side.CLIENT) + public int getBurningScaled(int i){ + return this.currentBurnTime * i / this.maxBurnTime; + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + compound.setInteger("BurnTime", this.currentBurnTime); + compound.setInteger("MaxBurnTime", this.maxBurnTime); + this.storage.writeToNBT(compound); + this.tank.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.currentBurnTime = compound.getInteger("BurnTime"); + this.maxBurnTime = compound.getInteger("MaxBurnTime"); + this.storage.readFromNBT(compound); + this.tank.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return stack.getItem() == InitItems.itemBucketOil && i == 0; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == 1; + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return this.storage.extractEnergy(maxExtract, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidOil.getName())) return this.tank.fill(resource, doFill); + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return fluid == FluidRegistry.getFluid(InitBlocks.fluidOil.getName()); + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + return new FluidTankInfo[]{this.tank.getInfo()}; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java new file mode 100644 index 000000000..69a778842 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -0,0 +1,164 @@ +package ellpeck.actuallyadditions.tile; + +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.ISidedInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +public class TileEntityPhantomface extends TileEntityInventoryBase{ + + public TileEntity boundTile; + + public final int range = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); + + public TileEntityPhantomface(){ + super(0, "phantomface"); + } + + @Override + public void updateEntity(){ + if(!this.hasBoundTile()) this.boundTile = null; + + if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ + this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); + this.tempX = 0; + this.tempY = 0; + this.tempZ = 0; + this.tempWorld = null; + } + } + + public boolean isBoundTileInRage(){ + if(this.hasBoundTile() && this.boundTile.getWorldObj().loadedTileEntityList.contains(this.boundTile)){ + int xDif = this.boundTile.xCoord-this.xCoord; + int yDif = this.boundTile.yCoord-this.yCoord; + int zDif = this.boundTile.zCoord-this.zCoord; + + if(xDif >= -this.range && xDif <= this.range){ + if(yDif >= -this.range && yDif <= this.range){ + if(zDif >= -this.range && zDif <= this.range) return true; + } + } + } + return false; + } + + public boolean hasBoundTile(){ + return this.boundTile != null && boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) != null && boundTile.getWorldObj() == this.getWorldObj() && boundTile instanceof IInventory; + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + super.writeToNBT(compound); + if(this.hasBoundTile()){ + compound.setInteger("XCoordOfTileStored", boundTile.xCoord); + compound.setInteger("YCoordOfTileStored", boundTile.yCoord); + compound.setInteger("ZCoordOfTileStored", boundTile.zCoord); + compound.setInteger("WorldOfTileStored", boundTile.getWorldObj().provider.dimensionId); + } + } + + private int tempX; + private int tempY; + private int tempZ; + private World tempWorld; + + @Override + public void readFromNBT(NBTTagCompound compound){ + super.readFromNBT(compound); + this.tempX = compound.getInteger("XCoordOfTileStored"); + this.tempY = compound.getInteger("YCoordOfTileStored"); + this.tempZ = compound.getInteger("ZCoordOfTileStored"); + this.tempWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); + } + + public IInventory getInventory(){ + TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); + if(tile != null && tile instanceof IInventory){ + this.markDirty(); + return (IInventory)tile; + } + return null; + } + + public ISidedInventory getSided(){ + return this.getInventory() instanceof ISidedInventory ? (ISidedInventory)this.getInventory() : null; + } + + @Override + public int getInventoryStackLimit(){ + return this.isBoundTileInRage() ? this.getInventory().getInventoryStackLimit() : 0; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player){ + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return this.isBoundTileInRage() && this.getInventory().isItemValidForSlot(i, stack); + } + + @Override + public ItemStack getStackInSlotOnClosing(int i){ + return this.isBoundTileInRage() ? this.getInventory().getStackInSlotOnClosing(i) : null; + } + + @Override + public void setInventorySlotContents(int i, ItemStack stack){ + if(this.isBoundTileInRage()) this.getInventory().setInventorySlotContents(i, stack); + } + + @Override + public int getSizeInventory(){ + return this.isBoundTileInRage() ? this.getInventory().getSizeInventory() : 0; + } + + @Override + public ItemStack getStackInSlot(int i){ + return this.isBoundTileInRage() ? this.getInventory().getStackInSlot(i) : null; + } + + @Override + public ItemStack decrStackSize(int i, int j){ + return this.isBoundTileInRage() ? this.getInventory().decrStackSize(i, j) : null; + } + + @Override + public String getInventoryName(){ + return this.name; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side){ + if(this.isBoundTileInRage()){ + if(this.getSided() != null){ + return this.getSided().getAccessibleSlotsFromSide(side); + } + else{ + int[] theInt = new int[this.getSizeInventory()]; + for(int i = 0; i < theInt.length; i++){ + theInt[i] = i; + } + return theInt; + } + } + return new int[0]; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canInsertItem(slot, stack, side)); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canExtractItem(slot, stack, side)); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityUpgradable.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityUpgradable.java deleted file mode 100644 index 864678128..000000000 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityUpgradable.java +++ /dev/null @@ -1,40 +0,0 @@ -package ellpeck.actuallyadditions.tile; - -import ellpeck.actuallyadditions.items.ItemUpgrade; -import net.minecraft.item.ItemStack; - -public abstract class TileEntityUpgradable extends TileEntityInventoryBase{ - - public int speedUpgradeSlot; - public int burnTimeAmplifier; - - public TileEntityUpgradable(int slots, String name){ - super(slots, name); - } - - public void speedUp(){ - ItemStack stack = this.slots[speedUpgradeSlot]; - if(stack != null && stack.getItem() instanceof ItemUpgrade && ((ItemUpgrade)stack.getItem()).type == ItemUpgrade.UpgradeType.SPEED){ - int newSpeed = this.getStandardSpeed() - 10*stack.stackSize; - this.speedUpBurnTimeBySpeed(stack.stackSize); - if(newSpeed < 5) newSpeed = 5; - this.setSpeed(newSpeed); - } - else{ - this.speedUpBurnTimeBySpeed(0); - this.setSpeed(this.getStandardSpeed()); - } - } - - public void speedUpBurnTimeBySpeed(int upgradeAmount){ - this.burnTimeAmplifier = upgradeAmount*2; - } - - public int getStandardSpeed(){ - return 0; - } - - public void setSpeed(int newSpeed){ - - } -} diff --git a/src/main/java/ellpeck/actuallyadditions/util/AssetUtil.java b/src/main/java/ellpeck/actuallyadditions/util/AssetUtil.java index 4528b0a01..4db32fb3f 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/AssetUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/AssetUtil.java @@ -12,10 +12,8 @@ public class AssetUtil{ return new ResourceLocation(ModUtil.MOD_ID_LOWER, "textures/gui/" + file + ".png"); } - public static void displayNameAndInventoryString(FontRenderer font, int xSize, int yPositionOfInventoryText, int yPositionOfMachineText, String machineName){ + public static void displayNameString(FontRenderer font, int xSize, int yPositionOfMachineText, String machineName){ String localMachineName = StatCollector.translateToLocal(machineName + ".name"); - String inventoryName = StatCollector.translateToLocal("container.inventory"); font.drawString(localMachineName, xSize/2 - font.getStringWidth(localMachineName)/2, yPositionOfMachineText, StringUtil.DECIMAL_COLOR_WHITE); - font.drawString(inventoryName, xSize/2 - font.getStringWidth(inventoryName)/2, yPositionOfInventoryText-1, StringUtil.DECIMAL_COLOR_GRAY_TEXT); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java index 86fc9e727..6a90f1b2c 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.util; import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.creative.CreativeTab; +import ellpeck.actuallyadditions.waila.WailaDataProvider; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -26,6 +27,20 @@ public class BlockUtil{ else list.add(ItemUtil.shiftForInfo()); } + @SuppressWarnings("unchecked") + public static void addPowerUsageInfo(List list, int usage){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".uses.desc") + " " + usage + " RF/t"); + } + } + + @SuppressWarnings("unchecked") + public static void addPowerProductionInfo(List list, int produce){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".produces.desc") + " " + produce + " RF/t"); + } + } + public static void register(Block block, Class itemBlock, Enum[] list){ block.setCreativeTab(CreativeTab.instance); block.setBlockName(createUnlocalizedName(block)); @@ -33,13 +48,21 @@ public class BlockUtil{ for(Enum current : list){ if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(block, 1, current.ordinal())); } + + WailaDataProvider.registerList.add(block); } public static void register(Block block, Class itemBlock){ - block.setCreativeTab(CreativeTab.instance); + register(block, itemBlock, true); + } + + public static void register(Block block, Class itemBlock, boolean addTab){ + if(addTab) block.setCreativeTab(CreativeTab.instance); block.setBlockName(createUnlocalizedName(block)); GameRegistry.registerBlock(block, itemBlock, ((INameableItem)block).getName()); if(!((INameableItem)block).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)block).getOredictName(), new ItemStack(block, 1, Util.WILDCARD)); + + WailaDataProvider.registerList.add(block); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java index cfe583ece..b38dd0e51 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java @@ -28,7 +28,11 @@ public class ItemUtil{ } public static void register(Item item){ - item.setCreativeTab(CreativeTab.instance); + register(item, true); + } + + public static void register(Item item, boolean addTab){ + if(addTab) item.setCreativeTab(CreativeTab.instance); item.setUnlocalizedName(createUnlocalizedName(item)); GameRegistry.registerItem(item, ((INameableItem)item).getName()); if(!((INameableItem)item).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)item).getOredictName(), new ItemStack(item, 1, Util.WILDCARD)); diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 6b79d8d70..d62825ba3 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.4.4"; + public static final String VERSION = "1.7.10-0.0.5.0"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 05966627c..fa205740f 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -1,5 +1,7 @@ package ellpeck.actuallyadditions.util; +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; import net.minecraft.entity.item.EntityItem; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; @@ -7,6 +9,8 @@ import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.IFluidHandler; public class WorldUtil{ @@ -22,6 +26,28 @@ public class WorldUtil{ } } + public static void pushEnergy(World world, int x, int y, int z, ForgeDirection side, EnergyStorage storage){ + TileEntity tile = getTileEntityFromSide(side, world, x, y, z); + if(tile != null && tile instanceof IEnergyReceiver){ + if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ + int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); + storage.extractEnergy(receive, false); + world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); + } + } + } + + public static void pushFluid(World world, int x, int y, int z, ForgeDirection side, FluidTank tank){ + TileEntity tile = getTileEntityFromSide(side, world, x, y, z); + if(tile != null && tank.getFluid() != null && tile instanceof IFluidHandler){ + if(((IFluidHandler)tile).canFill(side.getOpposite(), tank.getFluid().getFluid())){ + int receive = ((IFluidHandler)tile).fill(side.getOpposite(), tank.getFluid(), true); + tank.drain(receive, true); + world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); + } + } + } + public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ if(world instanceof WorldServer){ if(side != ForgeDirection.UNKNOWN){ diff --git a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java index d2dd090fa..da5b44583 100644 --- a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java +++ b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java @@ -1,18 +1,24 @@ package ellpeck.actuallyadditions.waila; +import ellpeck.actuallyadditions.blocks.BlockCompost; +import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.tile.TileEntityCompost; +import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; import mcp.mobius.waila.api.IWailaRegistrar; +import net.minecraft.block.Block; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.ArrayList; import java.util.List; @SuppressWarnings("unused") @@ -20,20 +26,29 @@ public class WailaDataProvider implements IWailaDataProvider{ private final String WAILA_PRE_LANG = "gui." + ModUtil.MOD_ID_LOWER + ".waila."; + public static final ArrayList registerList = new ArrayList(); + @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config){ return null; } @Override - public List getWailaHead(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ + public List getWailaHead(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ + + if(ConfigBoolValues.DO_WAILA_INFO.isEnabled()){ + if(accessor.getBlock() instanceof INameableItem){ + Item.getItemFromBlock(accessor.getBlock()).addInformation(stack, accessor.getPlayer(), currentTip, true); + } + } + return currentTip; } @Override - public List getWailaBody(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ + public List getWailaBody(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ - if (accessor.getTileEntity() instanceof TileEntityCompost){ + if(accessor.getTileEntity() instanceof TileEntityCompost){ this.compostBody(accessor, currentTip); } @@ -45,21 +60,21 @@ public class WailaDataProvider implements IWailaDataProvider{ TileEntityCompost tile = (TileEntityCompost)accessor.getTileEntity(); if(meta <= tile.amountNeededToConvert){ - String tip1 = StatCollector.translateToLocal(WAILA_PRE_LANG + "compostAmount" + ".name") + ": " + meta + "/" + tile.amountNeededToConvert; + String tip1 = StatCollector.translateToLocal(WAILA_PRE_LANG + "compostAmount.name") + ": " + meta + "/" + tile.amountNeededToConvert; currentTip.add(tip1); if(meta == tile.amountNeededToConvert){ - currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostConverting" + ".name")); + currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostConverting.name")); } } if(meta == tile.amountNeededToConvert+1){ - currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostDone" + ".name")); + currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostDone.name")); } } @Override - public List getWailaTail(ItemStack itemStack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ + public List getWailaTail(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ return currentTip; } @@ -71,6 +86,12 @@ public class WailaDataProvider implements IWailaDataProvider{ public static void register(IWailaRegistrar registrar){ Util.logInfo("Initializing Waila Plugin..."); - registrar.registerBodyProvider(new WailaDataProvider(), TileEntityCompost.class); + WailaDataProvider provider = new WailaDataProvider(); + + registrar.registerBodyProvider(provider, BlockCompost.class); + + for(Block theBlock : registerList){ + registrar.registerHeadProvider(provider, theBlock.getClass()); + } } } \ No newline at end of file diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 445f97aa0..825a39cef 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -1,6 +1,9 @@ itemGroup.actuallyadditions=Actually Additions achievement.page.actuallyadditions=Actually Additions +fluid.oil=Oil +fluid.canolaOil=Canola Oil + tile.actuallyadditions.blockCompost.name=Compost tile.actuallyadditions.blockMiscOreBlackQuartz.name=Black Quartz Ore tile.actuallyadditions.blockMiscBlackQuartz.name=Block of Black Quartz @@ -12,14 +15,77 @@ tile.actuallyadditions.blockGrinder.name=Crusher tile.actuallyadditions.blockGrinderDouble.name=Double Crusher tile.actuallyadditions.blockFurnaceDouble.name=Double Furnace tile.actuallyadditions.blockFishingNet.name=Fishing Net -tile.actuallyadditions.blockFurnaceSolar.name=Solar Panel [TEMPORARILY UNIMPLEMENTED] -tile.actuallyadditions.blockHeatCollector.name=Heat Collector [TEMPORARILY UNIMPLEMENTED] +tile.actuallyadditions.blockFurnaceSolar.name=Solar Panel +tile.actuallyadditions.blockHeatCollector.name=Heat Collector tile.actuallyadditions.blockItemRepairer.name=Item Repairer tile.actuallyadditions.blockMiscWoodCasing.name=Wood Casing tile.actuallyadditions.blockMiscStoneCasing.name=Stone Casing tile.actuallyadditions.blockGreenhouseGlass.name=Greenhouse Glass +tile.actuallyadditions.blockRice.name=Rice Plant +tooltip.actuallyadditions.blockRice.desc=It's growing... kind of.. +item.actuallyadditions.itemFoodRice.name=Rice +tooltip.actuallyadditions.itemFoodRice.desc=Used to make all kinds of useful stuff! +item.actuallyadditions.itemMiscRiceDough.name=Rice Dough +tooltip.actuallyadditions.itemMiscRiceDough.desc=It's Dough, but made from Rice +item.actuallyadditions.itemFoodRiceBread.name=Rice Bread +tooltip.actuallyadditions.itemFoodRiceBread.desc=It's like Bread, but ricey! +item.actuallyadditions.itemRiceSeed.name=Rice Seeds +tooltip.actuallyadditions.itemRiceSeed.desc=Grows on Water! + +item.actuallyadditions.itemMiscTinyCoal.name=Tiny Coal +tooltip.actuallyadditions.itemMiscTinyCoal.desc=Crafted from Coal, smelts one Item +item.actuallyadditions.itemMiscTinyCharcoal.name=Tiny Charcoal +tooltip.actuallyadditions.itemMiscTinyCharcoal.desc=Crafted from Charcoal, smelts one Item +tile.actuallyadditions.blockMiscCharcoal.name=Block of Charcoal +tooltip.actuallyadditions.blockMiscCharcoal.desc=Crafted from Charcoal +item.actuallyadditions.itemMiscRiceSlime.name=Rice Slimeball +tooltip.actuallyadditions.itemMiscRiceSlime.desc=It's sticky... and smells kinda good... + +tile.actuallyadditions.blockCoalGenerator.name=Coal Generator +tooltip.actuallyadditions.blockCoalGenerator.desc=Produces Energy from Coal and other flammable Materials + +item.actuallyadditions.itemBucketCanolaOil.name=Canola Oil Bucket +tooltip.actuallyadditions.itemBucketCanolaOil.desc=A Bucket filled with Canola Oil +item.actuallyadditions.itemBucketOil.name=Oil Bucket +tooltip.actuallyadditions.itemBucketOil.desc=Made in a Fermenting Barrel from Canola Oil + +tile.actuallyadditions.blockPhantomface.name=Phantomface +tooltip.actuallyadditions.blockPhantomface.desc.1=Like a Pipe, only Wireless! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input into connected Blocks! + +item.actuallyadditions.itemPhantomConnector.name=Phantom Connector +tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! +tooltip.actuallyadditions.itemPhantomConnector.desc.2=Press Control to clear the stored TileEntity + +item.actuallyadditions.itemCanolaSeed.name=Canola Seeds +tooltip.actuallyadditions.itemCanolaSeed.desc=Grows on Grass! +item.actuallyadditions.itemMiscCanola.name=Canola +tooltip.actuallyadditions.itemMiscCanola.desc=Used to make Oil in a Canola Press +tile.actuallyadditions.blockCanola.name=Canola Plant +tooltip.actuallyadditions.blockCanola.desc=It's growing... kind of.. + +item.actuallyadditions.itemResonantRice.name=Resonant Rice +tooltip.actuallyadditions.itemResonantRice.desc=Don't know what it does... maybe if you right-click it? +tooltip.actuallyadditions.itemResonantRice.uncraftable.desc=Uncraftable because there's no Mod installed that adds Enderium :( + +tile.actuallyadditions.blockCanolaPress.name=Canola Press +tooltip.actuallyadditions.blockCanolaPress.desc=Makes Canola Oil from Canola +tile.actuallyadditions.blockFermentingBarrel.name=Fermenting Barrel +tooltip.actuallyadditions.blockFermentingBarrel.desc=Ferments Canola Oil made in a Press to Canola + +tile.actuallyadditions.blockCanolaOil.name=Canola Oil +tooltip.actuallyadditions.blockCanolaOil.desc=Oil made from Canola +tile.actuallyadditions.blockOil.name=Oil +tooltip.actuallyadditions.blockOil.desc=Can be used to power Machines + +tile.actuallyadditions.blockMiscEnderpearl.name=Block of Enderpearl +tooltip.actuallyadditions.blockMiscEnderpearl.desc=It's a Block. Made of Pearls. Wow. + +tile.actuallyadditions.blockOilGenerator.name=Oil Generator +tooltip.actuallyadditions.blockOilGenerator.desc=Generates Power from Oil + tile.actuallyadditions.blockBreaker.name=Auto-Breaker tile.actuallyadditions.blockPlacer.name=Auto-Placer tile.actuallyadditions.blockDropper.name=Automatic Precision Dropper @@ -42,6 +108,16 @@ tile.actuallyadditions.blockInputter.add.13.name=Efficient Sucking Dilettant tile.actuallyadditions.blockInputter.add.14.name=Extreme Sand Digger tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO +tooltip.actuallyadditions.phantom.connected.desc= +tooltip.actuallyadditions.phantom.stored.desc= +tooltip.actuallyadditions.phantom.noBound.desc=The Connector has no Information stored! +tooltip.actuallyadditions.phantom.notInventory.desc=This Block is not an Inventory! +tooltip.actuallyadditions.phantom.inWorld.desc=In World +tooltip.actuallyadditions.phantom.boundTo.desc=Bound to +tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to TileEntity at %s, %s, %s +tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to TileEntity at %s, %s, %s but it is not in Range! +tooltip.actuallyadditions.phantom.notConnected.desc=This Phantomface isn't connected to anything! + item.actuallyadditions.itemMiscMashedFood.name=Mashed Food item.actuallyadditions.itemFertilizer.name=Fertilizer item.actuallyadditions.itemMiscDough.name=Dough @@ -164,8 +240,8 @@ tooltip.actuallyadditions.blockInputter.desc.5=-Side to Output to and Input from tooltip.actuallyadditions.blockInputter.desc.6=-Slot in the other Inventory to Output to and Input from tooltip.actuallyadditions.blockInputterAdvanced.desc=Has an Input and Output Filter! tooltip.actuallyadditions.blockFishingNet.desc=Catches Fish automatically when placed above Water -tooltip.actuallyadditions.blockFurnaceSolar.desc=Powers Actually Additions Machines and Vanilla Furnaces below it in Daylight -tooltip.actuallyadditions.blockHeatCollector.desc.1=Powers Actually Additions Machines and Vanilla Furnaces above it +tooltip.actuallyadditions.blockFurnaceSolar.desc=Produces RF in Daylight +tooltip.actuallyadditions.blockHeatCollector.desc.1=Produces RF tooltip.actuallyadditions.blockHeatCollector.desc.2=Needs a bunch of Lava around it tooltip.actuallyadditions.blockHeatCollector.desc.3=Occasionally steals the Lava. Watch out! tooltip.actuallyadditions.blockItemRepairer.desc=Repairs Tools and Armor automatically @@ -265,6 +341,9 @@ info.actuallyadditions.gui.slot=Slot info.actuallyadditions.gui.put=Put info.actuallyadditions.gui.pull=Pull +tooltip.actuallyadditions.uses.desc=Uses +tooltip.actuallyadditions.produces.desc=Produces + effect.actuallyadditions.speed.name=Speed effect.actuallyadditions.haste.name=Haste effect.actuallyadditions.strength.name=Strength @@ -289,8 +368,14 @@ container.actuallyadditions.placer.name=Placer container.actuallyadditions.breaker.name=Breaker container.actuallyadditions.dropper.name=Precision Dropper container.actuallyadditions.crafting.name=Crafting Table On A Stick +container.actuallyadditions.canolaPress.name=Canola Press +container.actuallyadditions.fermentingBarrel.name=Fermenting Barrel +container.actuallyadditions.coalGenerator.name=Coal Generator +container.actuallyadditions.oilGenerator.name=Oil Generator container.actuallyadditions.nei.crushing.name=Crusher +container.actuallyadditions.nei.ballOfHair.name=Ball Of Hair Usage +container.actuallyadditions.nei.compost.name=Compost gui.actuallyadditions.waila.compostAmount.name=Amount of Mashed Food gui.actuallyadditions.waila.compostDone.name=Done! @@ -300,7 +385,6 @@ info.actuallyadditions.update.generic.desc=[{"text":"There is an "},{"text":"Upd info.actuallyadditions.update.versionComp.desc=[{"text":"You have Version "},{"text":"%s","color":"dark_red","italic":"false"},{"text":", the newest one is ","color":"none","italic":"false"},{"text":"%s","color":"dark_green","underlined":"false"},{"text":"!","color":"none","underlined":"false"}] info.actuallyadditions.update.download.desc=[{"text":"Download the newest Version "},{"text":"here! (Click me!)","color":"dark_green","underlined":"true","clickEvent":{"action":"open_url","value":"%s"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Click here to open your Browser and download the newest Version!"}]}}}] info.actuallyadditions.update.failed.desc=[{"text":"The Update Check for "},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"failed! Check your Internet Connection and the Logs for more Info!","color":"none"}] -info.actuallyadditions.update.new.desc=Important Changes: achievement.actuallyadditions.pickUpSolidXP=Hard and Rich and Stuff achievement.actuallyadditions.pickUpSolidXP.desc=Pick up some Solidified Experience diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png new file mode 100644 index 0000000000000000000000000000000000000000..f5982ec906794f34c9b4a6ee5f45edaa0643aa20 GIT binary patch literal 10800 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png.mcmeta b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png.mcmeta new file mode 100644 index 000000000..4f0718ac9 --- /dev/null +++ b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilFlowing.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilStill.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaOilStill.png new file mode 100644 index 0000000000000000000000000000000000000000..59569bc405ab0b33afb86900f5a04098bed0a11d GIT binary patch literal 10857 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 V9p12FryI}>44$rjF6*2UngA4zVB-J) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage2.png new file mode 100644 index 0000000000000000000000000000000000000000..67c69118cf5ff0046065e19aa9ac7f902d58ba08 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$O}>W|+2DF6ydl(rIsj|=o#plrnVZT0@ajyx;Tbd_`jWakhj5rhuN4(Uo1u9n4ZO2 z)$e8whk`addUA>VYxb)hS#!#He`?om>#^nylzXO__NCSD#==ttX>Y`>p0e&t5Z(Mn zd|Nkr$jqmH=2O}^4HuigIIyr=@^_oA{)w-fw2a@GxKz$)pK($A*W3FMUm1k!|Guf7 Sw3-v>00vK2KbLh*2~7YcQDKz; literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage3.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage3.png new file mode 100644 index 0000000000000000000000000000000000000000..d51b6a7afd9a641623ffc6306d84b66c858efb49 GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$OJq7wY)i-1BBC9V-A!TD(= z<%vb93~dIox?sjWt-KsAdzT^vI!{NMU*6g=d>Q*6X2%5B6W>sz)k ziN#87;gTw)+oxWJ8ZzuE7CAlX-Q)g4FNGf0^fKOSJilb+^Pf@2e{b%)9rlaSc0&j2 zsqe=p&0BeZpU3#bhIg{M7Z}_mn(OODZDnUaWR<9Y=g%7TWL7boX26pj&#K!vr4H2W z%X)WmLbJPW(b=7gMVECXMws5Wj#|LjV{pv$uC>`=Zi7`T)u+205r1@$_krS+I8UH! O89ZJ6T-G@yGywqi$a7Wz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage4.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCanolaStage4.png new file mode 100644 index 0000000000000000000000000000000000000000..163a73904d20da2c70fc7ea36424412ad2c7ed5f GIT binary patch literal 358 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$M@^1dYzia;TW64!{5;QX|b z^2DN4hJwV*yb`^<)Di^~Jp(<{)K;TZpqe9|E{-7<{zv;a3OX6`IG>&0(8Vg**4Gxh zLZY$HQ)A_)O23j9zw5F}o^M{dSw#I`|MTq3_vbIoc=`Rf;?H?(_gNLWcHL7FPmkg~ z=h))v)g5XbTebcmr+EMKjCdBdw6A-QUpmv&ZFG8t!1GLzEe^+h41ez|*y|^MO+JfZ z>FQ)=F@&7V!UIllVL+!FJXZN`^P^ED5z;jjL`-^J^H x`Pxs3Z!a*(8i$%bKfKMAcR|eOxhkCPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0f0$FK~y+TWs*CK!cY)}ZMICgmA^-9Y%Ihl z1Vh9}p}2~us}bTGg=Im(#wv}af5Aeq+5hC1J7b9K0h4>rJ?G5aiHXk_tQaEZ!yrzo zp;RhWtJQQmozLgL3^JJvjO)5QAycUovSc!u5chC6%;j>96}iddcD5cY}V^FqISDoEEdb5G_vcC;PwB2rx z$K&B}==FN5)yfnw2H<%f6(*C(bUMXcC=`ATVCM5V5sgLzHOhnxfkrX(`+a)gY&05m zyWQn-NllJ?-=|46g!z_558QIU-=m-zhSO@bASp!=)C7rA?;sbF3}NDHp7KF}R=B_L zcs%|LZnqmxwt8^CtAQVe>puiRpsVZkd_G?;7m3!E*bC$gk!-O=Kp9q$7Evhu4pTr8 z=0{VKJfOlLU@g@m5*g{*5`z~E1_K5UbZ;OGvd|ze#%e0P!AwQ}+W?tmSx-$F4ZQ3D R#;E`R002ovPDHLkV1lUE-7NqB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGeneratorTop.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGeneratorTop.png new file mode 100644 index 0000000000000000000000000000000000000000..deef7462dd24f68b26551a8296fc3b9d06eb9a27 GIT binary patch literal 550 zcmV+>0@?kEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02p*dSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;VI^GGzb&0hdWcK~y+TO_Dip!ax*+X;QjOMaj>hq5y%g zg@r(Xk&MAeV8VSGVG+V1XsGz3`MhsKJQB<9+nIUCI`#PnBY}71Lm?T|f^<5a$z)jN z2!sTPvq}&`N}|KzFrUv?tJQCX(P&h!*K@htdcB^_W|c|>f@op^I@2^eozCO&XfzsO z818mENUrOaN~LnS+-kKBhlAvg1^i(^6z?wuA?^43+wFF}UVY!+Znr9d5`gJ+N`~=x zJef=o7mLLo1tP1}3X5j52^(fghCrbR`u#pNa2EtYx7*!pHss`Lxm;4D7R3IBK@D^n zMG*{&snu$Z;}9ejNnm3nOx=U$d9?Lmjx*E1S*Ao9GOu(+LKh z;L08uz0T+J#bQCKcDs#*7Vtwb7z~&_C=?0^XjG2OfMO6J6Kh=(v*()eaV=E5SvgYD z@pu$LoI!f$;thI$YTGs)lTExp?Ejt;-j~aTDY0TEvgh;3+d-9V&~Vo!0eN{Pk0C+X oBqRS{t3;DfQ_WFU8GbZ8()Nlj2>E@cM*00MJKL_t(I%XN~?ZyQw< z#eetC8^@jrjnm);k+@25D>j8}XaONUHlY6Fm5_>rRD@WeKtq$-Mh;2l!(-38m&Ht1 zh{e-;(mUrKopX#r<_cWSg+TVWyOo1Ua`6)Vp~sz6l)RRIKda5qE*0dNozRJF%A zF&c<6NCN_BYfh3#=ePIebVM^l5JFJ8FJTiS;Dnx|W*rHEXkB2vK5dL3ux(=p5s0mI zc(f1kzA%|)oXn1xJ^F}~*_6rQggna`Bm=HqzhS<(=G*6IeTa7~7YqJ6zoHIJKc?3d zywiS{0f4`Id4D>*cLe0wEce6xU53LUAx)XDZfP3h%g>&0us_BuQdSi&Uj9N^uX#Lu zfM68$nzw)7qVCqsbth3J4JimTn=R&snPJgLlHPMja6m;61Z`WR-L`$R90XLAGz1b= zM1^RP5CWpzHq4CJMv_EPM@Z9vis0VueA~7iSp+xduB;jE3{Vlw9Tg>{fwncm?tw7= zaQOdKetpS&vBKi^KUH3b4RSW!@#D#R>}EN`(TI!rilW}|{nt+!kN4O%4Mkb;803B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00JjTL_t(I%SDq(jvPk} zMIVP8YEriZNw5~afsdg3A44z<7_uS2ax1%Xj3B*;61*T{^~ulw81nhIUvlVs#-T?| zcz$}~dOnevxH;Q?upI}T88r&u|9zp>V47Zea~bj5$cJN9bf+V z%Imz~g7D$pTb|!sIgKM-XSgXuB_jY3cLJyp2tDIzNa}oi4ubju8ZFRJi!cl6Q9)XxQo6-=9KEli-Y7kNB-MF3y+`-)&Z_s8jf*{GL zAkvzOw1z53CZdTvXn1C&>>H6mMp6ZYAORI2(Vr}cTFDG*B>TFyJ6M;6%-|>$b3xIz zhBN_ym{E_Fnm{JYTA1z&e}DVlLfrSAd0xouaWjzpflVKQ0t9P;ZQHrO-udx5b6*ZT zf#3i9i|M}b>Ek;(H)=N9ZU*^3k?B4&uREn2yi9ZZOxw0nOXVoZ%QQ2L11iQ*E9Y@U pMc9u65n(So({x9GS_;Ru@*iuIL%$xIvY7w?002ovPDHLkV1kRhDH{L) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscCharcoal.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscCharcoal.png new file mode 100644 index 0000000000000000000000000000000000000000..31c637308b2be7d26fe99893781bfc416ac579d6 GIT binary patch literal 484 zcmV1RwnazrcU@gbB;C2$Lmq_ukn%Gb$YUc@|HTu)3O$ zh6BPvtW@#+{(POy(=-krR?CZGwm3;Z-gk9fox_9hbXN+2R2@$z-=Dk7B7+Bm^!dI7 z`Pi>tUv5Ao)dVGllgY>*^j76*90i~t{AWqXDTRf=sfs+^K32;`wpm}pqZpMW5P-jJ zYY3zW+8*GMYu~z)!0(Gv2u}A9P4fa8%Qv0O(g*=KFTf^k1fJWxKv=%%LaD$x8K|fVhsawvj*9-v^_xx+*pQdFG3|PiYn20IHYLOo)5`E2>drpUxkipyK aJogU)Drw5BA#AP)WFU8GbZ8()Nlj2>E@cM*00N>(L_t(I%WaZNZ(C&$ zhM)Ov=lC2uZ5peIE!wDZ+a0h(f;D2pf}hHcA5n1;63`YUv`%Rxi`a>8=k}d%SU4Lb zMtWBx&Ajh3BjtBrs|g-)77+o!XBjSdnyN-q4=SX-heI1p32h^(>u@H|uz7}9LtYd- zc{$_J=^4fvK3-h1UM$$%ZK&%8aSky8DUoak0?uXulX*Uw&G_uAFE~0m!Ff-!+fglV zS-roaxmnQ*m=Lf%i+aTYZOYaPSUknMVdX{tT9iv^2!bN;#daJW-a(EmzPLSqlAoJ`J`KA(Xx zxOThe;?>WTWeH*s=MG!{r!*y;^Bhkm9G^YL7>i4NWWCzcZnju!5kQQf>0q7v2pB<( zW&G?Z$CFdW(+PvJz)7#DD!bJkebXF1GS8rH(UcAYj3C|YP4@%a24pJ&Y9yrr#boTeU=1;WDzbRxuEh4-G~ zXhc3N8H|n?jE00!!T9`~}Y^?J*(xCeZ9x!g99w*h+W6-?w0N9j%u?z zL_k5iNDu70h#(jv)NMmn*I2h<86$n{Nih=J4vmr6b)+uxFK@C*1uoYs&j0`b07*qo IM6N<$f;f0<2><{9 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png new file mode 100644 index 0000000000000000000000000000000000000000..d40c0a2f296c228d02e8894c4cb75da5d13f318a GIT binary patch literal 9946 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png.mcmeta b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png.mcmeta new file mode 100644 index 000000000..4f0718ac9 --- /dev/null +++ b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilFlowing.png.mcmeta @@ -0,0 +1,3 @@ +{ + "animation": {} +} \ No newline at end of file diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGenerator.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGenerator.png new file mode 100644 index 0000000000000000000000000000000000000000..120541747adf6c128a510530f97b2e9b09ed5457 GIT binary patch literal 490 zcmVN2bZe?^J zG%heMHD!e|WdHyHXh}ptR5(v%lCe(0P!xt)96LHOY7hl1VsPLg5DldkN~si3A~T7T zPr}rNk;E5}frN$C#piG}e!b_kf$-&Wd(XN5f6nbKxziMDk1TUy*iWkA>-SH{7J`H_ zBg^OWIdPMEx-av#8O3EKdBJm*AGn zz$tmnb7}?ctIzKrWNP5ScHoqz;T^RZ-G^e}lwSw+*{H!7dNu~rz!-osp=*o!xl_hJ z9n={^w=(f-gknIMlS?3lXXsVE)&;F1&kj4~aW9dM{aVziu&aiozGYE>!8RPP85l&V z?;tNEH6*jYW|j{E+F_Hj-EMb=^?J=rs2iJ&8u(#Y9TCT|u2!qXVzFEN2bZe?^J zG%heMHD!e|WdHyHmq|oHR5(vfk~wd}Koo>&Qo2k<$`Wfa!EfhVghjnM@EDi^U%WBCFL3 zi)OP48)iy|K%ofw{XR8t7X(4K+udw7d446GA6bcAvRF2GmVh|t`Yh4nv=bG_xEmXW&Ia1Q`coadLL3-!n4SIlT z+cq7OO}s$t|DF=wm&=7Iv0^5&=kv+iL6vOKaMvXPd3hy|Awk(BBmZBkM3Ycc(cdhMb literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png new file mode 100644 index 0000000000000000000000000000000000000000..b00fa0ae40b112d9257fb3b6a391439efd271dff GIT binary patch literal 9022 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png.mcmeta b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png.mcmeta new file mode 100644 index 000000000..0645f48c6 --- /dev/null +++ b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilStill.png.mcmeta @@ -0,0 +1,5 @@ +{ + "animation": { + "frametime": 2 + } +} diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomface.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomface.png new file mode 100644 index 0000000000000000000000000000000000000000..b11ae7923b4bfc89dc6df27311e7a52bd5d41fdd GIT binary patch literal 798 zcmV+(1L6FMP)WFU8GbZ8()Nlj2>E@cM*00M$ZL_t(I%XO1YZX{I@ zgunMP->WKjxBnO$XEhDug0Gt=R1iS>)InV6k1+kgpyhkKZ z^2pHd*l!l3VUJm%Wy zH!tU$ou31+S}u9G_yjKjQ825BHh3Svwp4gRg>w7VibEwUWmJZ4=q<4rn{!?EIYh^^B|2z!5Vx>kGo<3^T*)@mn~DH_Hr% zJ#8Clnt++{e{jx|#)ODRG~%2;dN7m?P5hYDM#k-e)pGIS?EfTeSS^?2en%P-BEs26 zw`^BW=rLu97z0hpZ2tL!$3JfX*sL#}P5k@ep8fkr(wOinXpGcaQLBYoGui~2d?fIq z^s6Vr$tlixa=&B${*mq5`=f*)Sgl}&0>>pPAqRf^Zozi@3+wHUph6owZ5N*tIu0$O zN{k($=}_lA&UvH}GzXeoNjcM{NI#5Z&oQBg5sd>Hgrp-lVeI#~i<>X4=8;+x;Bd}; zXk~|nhHf%rdUlQXg6OemsXtIkX7TPX)O!JqI1?~Cl6Vhh)KVDw1GPR;(n!uD4x^f3 cwP0ra3&M6&(R8)i>i_@%07*qoM6N<$f|9Le3jhEB literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage1.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage1.png new file mode 100644 index 0000000000000000000000000000000000000000..aa5312e75affbf541e286ad4c1ca60c12ac8dd6d GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~E58UYcUz9RC{Rc?GbEzKIX^cyHLnE7WngeFN=+Tz~Aph3>)3h6Nnbhd;N+OSmktl&q`y?K|&(kkr-x u&%b5-J-)n+b^ep%+wCRx)f|!b;bCxIC@cOU^YaIgQ#@V$T-G@yGywqOAY9r2 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage2.png new file mode 100644 index 0000000000000000000000000000000000000000..42f2c1181c7a0678d178026745077a240f302163 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~E58W0`lEM$3V=egnIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^P<(->i(`nz>Er|n*2N8S3JT8e;)9kxtB?8AvqR;Q^w$6X z|9$UnY;5d&c>lhA{r~^zNpUx-q@8Vr&CYUeUG;ze{~t#Ws2@1_;qU2uHa51jw6_2M zJ&PUvwqN@{y??*4hemoJ~KvW4sh6XWVwY@N36Ccf03FLWS$nZTT(k|7@`S#~sIBn#C(U<;X^p z;Pfvpk2F4Ry>;Nb?T&TKD@D{E9+&T*nv&Q5O64i1&HBLXDFo_2F3~@(+W6!cNY<-e^IfxG$+0xu zgSiJJco`~QvOij;Z1Yg)_`nZEDuY(mqQ3U1!sk?A_&P>Nqp`b7KFwif6AO*Brg W3%;QOMbiX4KjJ6BIwWPkbi zvDWUWwkF4>)6=5W$_1Gq0*u@5;KqhVRTA%fpEc^?zi& z(pmq_>s~G$vr2SF#N8+Jt)6dxy7(8Laiq-k@}C=jvuLU$U2=5VWgKN#ymQ;pQ=xBm zh}|pcxV_qL=7Gb%Qy6yGeLG#*=d&R^F4>*+LYd34`AU;}A1~Q>cHjEMEv$16G)1_n z2{b7zNsw;i(0!mLGOt>$=XiitW8(kddnVQ*nHRE3UaVcO`HpGlRFz%)%1@?=I;EY6 z=(y%OTkN00%xMz)q+WEg9@t>UAo!qPmv8m!Jr@pSaM!0KHZ#o3;khJOFq!H4^Y1Dd zY782y*x9Gr=&xPIp!R-K(e%Dcof?a-=3G90Ai>CNWo2vevx&{(yqeFWFU8GbZ8()Nlj2>E@cM*00GfSL_t(I%hi*;ixXiG zhoAS|-Ry31kt;3=@#C;K4X9u$!Pfu4#zHK#6RgC-!op7cLJk!{4(uWXPC>A=)lwU6 z6mqwBm&@g1zH>=7yYJX}iAT~q-7xceW`>!8|K8NJ!1cRl1SPzA@Izg_vm}n~5RO6$ zPk(7ZrUGu>KQFaLgNyk*Vk|y={z7J9p0i7*X|~!_cIvD={Q6gCkBe{I%SrC!DT3rC z-?zR|4MIMylogb@bZuKM!{>%i`1%nICBF=p&^byj10P+(3{WL7z6d~ z5$|3G3PA6RPsowuDRy>i;0&l&hB&SweaI(~RG#bE#G%HqZKL#lQ9a&@Wmz)p3))g> ztw}f@mCX*V-H2q$MU0}d-q)+o19bqf`XW#pKfB6tg@mVB$og!R+GMgmBH*PUielcs z3MR(ZqJaOhm#3Z9^vO(P@VG zNn8E9_X$Ap*}8iBWKDf|y`lQOh{MO`u(ZSP>R?!0E~&jvL>x~vFnI^#)@??l(;g@_ zEIcZC0ENe;1Ba)l0gB5dRj>7EH+t@@U$AEdTa7TX^z58JgWABC`YGbc00000NkvXX Hu0mjf7W@_z literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage6.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockRiceStage6.png new file mode 100644 index 0000000000000000000000000000000000000000..e75005dd13c6674818926ea6968110ab3f638642 GIT binary patch literal 637 zcmV-@0)qXCP)WFU8GbZ8()Nlj2>E@cM*00H4iL_t(I%e9leZWBQi zg}<3yd!3Dqk%$}{JES0piYGuWC@3PKC=xYW;QR<)fcJnd6-t4q^8ipFL5mQwkT77$ z8xkodNZ8Jkw=I8xP24U0ytY#p@3*>3?1(X?ES5 z0odAJp8^r**M9Q!A#dM&#JAtmJ&Xv02!MkY}tl3JW2i^Q}jDH8&ZSfXMV^5Hy=@$~Rm(t=_m(+eC4Mle3Xh(mjljQqB`m5Qi2B zkW%90Y%;dPai@n?hQ)$|6c$<=I$sA93Nqp6w+5V^oKdPe7-LwfEbz1aho#B_#z6k6 zBvvs1x9=?Hld&=_VreBy6f6AiJ?xB))&>FMq5?d$97 z@9&>5VZx+IlMWp^bolV$BS(%LJ$m%mv17-NA3t&8#L1H&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&os5wC>2<~y!Ui* z45^5FJNs?aZ8r&*!dWJn+6KNGrf%_UUi*8$+pbA`>sL;AA*J}C>e-(UKO)6Eizi&0 zA9Lqv;YO1;&+Avd{^h;ZZ#!pO+QglYyVEj@c$fT}Kl|BpZSIJD^}*><9)G`QR;4#A zjC{iVVvhdt-`^|SgX({7{#ttbAD{E)6Ji%+pEjj%@2E6pT&);d{^WeaeftU9rsyuP zX3cw@dkd(jLvx^)U zr@vL(72TE=IH%$5)4coN{LN=E>6QC#z905`3tJY~id)YcOJh&YW1M~ZTg0!W6Bb5_ zs4rL_7q0$0q@s{f_O7Uc&VpN}o3b7Dx4!a?p|JH={ z$p@kI1K)#fnTskI8D)W{STM@7|1oRGycxmp(?qObOT)L^-<~WiZ&tnf9>3$i1owjS zf_Y5$3jZ52F`2Et`h`t(sNrU-)KBJFCQG7W*-ol}9pO6t4Eg z&2?dSq>Yps^o3h#9p|h?tR?c%S0>xrS2OyCF5SF8Gv7^6Fu?z-_zo7e z>HFt>7T++pf{o?5{(|IJl?%EW{yvdfQN-r6o>_@$nV`Uh{W5bN{b615`u{&~o@9B#7dVoo%;jVqlJ;uGv%TkjWpInY;V2wDS%~{bfjloXD{z3n7-31bicYjui zJXc#_du#CqhAMWkfL#s$CTh!9v1fMNbBtu_YrV&Kn15qK5lhX3-apC<$|tnFkQGsR zP;o9t&_)gz)(MPa35;L(;sP1|FZ!&qwt>H%zhYa%MBUzc8#@(Q15k+9uC39#wLgzd z=GW>&>*Oc!T(DkH?yx@RmOW7DlJ?Nt?Mwn+)3_-RW*pj2upu+}< z!Cux0M}b<<3_Z$Ok*U)#;=b!%m-s7G4j&Yi}u{Fc>pC)Aj4{j^#Uf;)A&GF%LqwjkzW{Cp~ zIc9ty4HC=`3V9M3Kq71j?--d2-p&T`8qOXA8<5Ok)5i#suQ5CD`g~9N-!C^9j$1R8 zzMFpBgw5if;11rndGGX>863FCv}OCw*O&iZ6=CNwuwiGf*vqSC`Ao1PII%0aPEh4Q zZQ`88Y!xdFP6qZLIDJ{=_-KXNFIRnnu$9rwq(X>hX z|K^VxrU&}(^XJGW%qlwg+5zik_RzqH*|a!|58O91}0i3tygZv%X%we_2A8 z=oRyFwwNcuiK`8FUH)3ebZU0|Ja5)z5eIb{!asb~e7@xU>FfKJ<)0S3p~i5Jcl+-D zWzsRH5)%qpcXJ2$dGQvkbbofgR{2Y7#;;%E4zm09c=3GrXKoZ3bMPHgPA_AD4%>l^ m5)8+a7-YIf9;dx%??1+u*SlxTWeTzZ6~LaZelF{r5}E*^;+rD? literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiFermentingBarrel.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiFermentingBarrel.png new file mode 100644 index 0000000000000000000000000000000000000000..68f68415e534fc4ceb53daa50221b30a34fda130 GIT binary patch literal 2459 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 HQ$iB}TK7Rr literal 2601 zcmeHI`!|$n9Dm<;<~0|rv(m(HqSDB&doGg=GcqwPnlLrF4y`DR!62GbFSa4H$hKJ( z);3DXWo-s!4VGj#%4MlcO)g1pm2&6Zv1fnU{R{SN-*cYx`JT`7{hagtexBz!&smnc zvnr8H1OPyl>Eh%80H7iT0X#+lVPzaI1zs%2HklgaH5puw1%1|5wFYc# zY?PP)&I=$!13P@w*=+WJD+8?oP*hhW5~Zc3rKhK7WMpJ!X6EGNh{fWzwl)++74nbq z(SiT21BT^dwe^Q0@NoB3+~@yu0G{)>?TV8m@Ldka0Kg|T>kI5`uM;asO#y==@Qgev zh!2bo2Ka%;cmfk%ut3k!#LUDh_>4s`0Ki#HC%V@O|EbHW@x`_pjHmYZ4o=7`Mk_ga^f%UrAV;9vc0WKe=<#VupU3-7+0yt2Y1BX{=1?Mzl8M z9}rV{C$IcRyOOol@*Y}w%@%pAeV5XJpKBo^%wB%?_K{WTjV`)$VtJ*@NQ)b9ZU?=i zPrIH)sOaqCUqqL&UcW22B^*|*mmhK77t_NzThhWz~?lm3C7Eo=1+ zkW%`uJiBo#r~})pXw?T#y{oKDHA#uChp%>DG7CL^k=Ej9ZudFToMfJRhp@Hi_>QaU z(v~FaNB+hrS%gh!!_F7*sp^Fm2K3`bSNu>rcx68KWkSh#d+Qf!dUCHBZ<;kLqE8_g;nT#j;>TeN zofsS_u&s0;;xXa9ij4v`pmPX{F?qQQexuJhNL$tCu%$1UmDiEsT&^2<&Yox;D7w#Hp@_sUj*o#^ z)WH~dFyC7mX`c^yD@`X72J`jh%iGx}lV92)Ln#Z=%NbfGdVUweN!>dwlow9@Fl625 z`GVZhC22a|G3v{Zju~iQ(Mj~vmk&PAd{{cfLHEEyo@A3Ib*|o3s`Uz+x}<9;pAB1% zl!X;Nnn;J50qseXqjwQ%_0y^PE?RXz6;!UD>L#7rrfIBqsKyUneQo*hwUxWnLaV)E z^e6-c1xKP0jepQnlj16(pt#>&c{WhC=n=mhi(8d=(rzmB8Eh5*R&^Isva^}DG*LUm zX5WNAc*}nnYm|%pj6L|aI0}0Nc8Zvonwv?K#i)hOkqx-Fvzo@2o~IJlH8f%4eS@0n zwYZ7{5b5T1yUsPrcg;cSkVn)-;l|x_4%rL`-uFxfj z%sxF}>QEH?tCC`D{USEbZBuiRikrju9YTpNP`WUXIJh6&hYzjQ6v37&#Ub!W&IfHp z=?*yyr>o4BFXqUg@&_!iw<&e&(q8+sh%fHanfIAO5_kZo-73ful0iu`M4=!7y~ar! zJFlsCx8EnY%$Heks2FE&1m*x6YH=i5K{I3|g+v$4g;!w?0-GhB_n1AUF%ZisYzo-2JE%U%DSnGAQQaz}3RpB|Z$ AB>(^b diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiNEICompost.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiNEICompost.png new file mode 100644 index 0000000000000000000000000000000000000000..8f0ac2bc8967ab800ec60aaff69273bbdae9f620 GIT binary patch literal 1786 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~6Kav4M@OO4qV9awC zctjR6F!1dHVMfvYW|x415+$w?CBgY=CFO}lsSE{)nRz98d8s7|CVB>Xrm3w)sSFHE z37#&FAr*0NuiW)Yb`)U??A`ZY`}lsNS;Ydb88=F(dnS#$Kav4M@OO4qV9awC zctjR6F!1dHVMfvYW|x415+$w?CBgY=CFO}lsSE{)nRz98d8s7|CVB>Xrm3w)sSFHE z37#&FAr*0NuiW)Yb`)U??A`ZY`}lsNS;Ydb88=F(dnS#$1dt{?4unj9bnEkH}&M2EG*_%%~jtbRtktqQo_# zBsf20_0X?bH8QG#}peQszhA4zs;% zFYYcV2XUpp|N7hRyqvMh{Kee|8}fd!%B(wm*!lj_3%ecPv$dCA)@^vbM@n0up#I#v z?0WM*f74(2WD9)w-NS!h^t=7}6~>wlj9dvDQlZ8LGVJVO5?R2&s^P%+B~PQl?!6m` z2C4~YU=lfya2jgtVum6~kQ$Kii@N~~wfA~KG*AslZ^OZ93(K4D@$$WX_KWF<+!f>B zCXBz0+oDB3{8_uRexLnvhAQ*Cume}BRz=hp~%1pPcA{?g9HcyYUW0sSDd3T2(W9aWAhkUL%3oss+b-%=NMoh|( zY1OTlt0oq+|6ymnuzR9fLj9kkCxj2N>~UJwFj+l$Nkiec&61i4Re#R1F|o@0KF?Oe zc47BIut&K97@BpR-?QzNmbrHJI;VxA_koYbABF!^#4vI#D0hbVeE|boblW}NDszi9 zv#)Ymb~XHBM6 zG3;A@GOVw$`KR^gp;BssbEMlLwY z>ch07>AnBi$%!k{@0Z=UF7iW$@k!Q^}11E@UrboFyt=akR{0JICqS^xk5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiRepairer.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiRepairer.png index a00a0fc686e33f4dab1b91195eeda9ff687b43fe..6ba8a00ae0ac28973022d4b2c96dfe0650b29b60 100644 GIT binary patch literal 2036 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~6~dIox?sjWt-zyc-8)5S5QBJS;+i$PL>0<4{C2Y>wkpDmW@ev@_5tVylA zm;YXRGDho8W~=(CySG)#zBgTu@9fs!UcFcRwb+g?S>JE}|C)N0={nP%JMGV(n{vl+ z9;gj_UdZ%k#^&c;+n+Wv{h77#oPH}KPXdG9MmDws#XttL!~upku@Vj1_ryTVm?U1F zhUY*An?VEPjok(e;d^wiGk;L2I3!~xVavd3kz-KPkj%&@-6Q{CFGD-8nZSd9hQn;p z90sBfHXJNq?9)Eq!T;e%A~W*?%YCeW1Z30?r0_}SC>%Hl)Ng-awi&O)fvw^J!=8NmonLr=9j(!3+)-Ni za(a@z{si%aFa?7HnT}D_6IbN2mdQn zFk1dt{?4unjB3sTkH}&M2EHvI%(&64N(U$?QQ{g=5}cn_Ql40p%21G)nOCBh zms+A=qGzCIn%ZiV3M^2Ld%8G=RK&fV(_OU4fWh@{Sls{r2lJTRS08m3R*-sUYh09( z#4XclZCzGnVf*+4pGBGCJh^uUdzv?~&Xav>d)@wvEB79*3)7$f-ks7Y&Sz>_Om=Hoi8tG;qcWvVb6yRGs`9wHk@KEd0cw@?3U?1e;M_nA2Qf)ceL6a z!4xh!>E_Yd3XIDdUCM+W#3;_4tJC;dZSJf04NI@cKDeKMDZl9ybIb34ZC~UcGVncM znB%}H!*KsFqs#+l<_{`A4*8@7R5NfH%yj(9xQq$Nsc+cGFj?}Af`iV16t-#(0gzNF z<1+7mtu+n$YQ_Z&HT`oK?taPE3pe;!{wj`1JK+252V5%b9BD?)vMe1y@)vUtkbK4L z10-)TC#V^(&_6J7`Pah!gRED?7j&{7bHD7#_G0#jIWHGVKDbdH^VIxCL zh(-FhhYwe)3NRmuUck%GCLW;2@ZWNlq4lwDhPMJtN50y(2=VAG*u`+%ET+2R>+S+= z8Bu1F!y8}sf4thS2{a>#;o4jN&7wS;KW=5}(N@^=BT-t*U`N9hhB;qb-M^oBvpxA5 zmjTbiz3U|pozJ(kIk287n^ofdzmH}ahm#Tt7^T^E=xzvWsN)d7&zBp)nAm=hHAnKn zvI9|!vlRa^3+UUusjX^w&9wS1gVX>q}m3~%~1*b>T}3>c~xh&RkNE@J$^x|PAWOi1DXhlLLS5KIZY?vEed9{c%Q_1B@1pLKY1B+L0#LT=By}Z;C1rt33 zJ=4@yqg0@pBc3jfAr}5;Cv4V$JMu0#LT=By}Z;C1rt33 zJ=4@yqg0@p!=5gVAr}5;Cm3=u849=-^EoFUn<3ealH%gFT}*n73=4IG*RnFbua$eiWMzJA3af}#z`OU?Cu%WP z%zJ*&a(eTot=r-mJeWQ_ZAy~-pzF~zojsmi)$uA@!~ZkqdD%`gF!4-oICYh&;b6Y! d_5Cg#;v24Odj0uTd=}^(22WQ%mvv4FO#nJXd^P|8 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemCanolaSeed.png b/src/main/resources/assets/actuallyadditions/textures/items/itemCanolaSeed.png new file mode 100644 index 0000000000000000000000000000000000000000..f5773f3145e9d2db78ddd3cfa991788290bc4ad2 GIT binary patch literal 258 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@p22U5q z5DWjc6Aif<40v3-OW(`RnY(M(j!H(w@AjUm2jdr+1Z6U<_pXyu;niHK_{6eE=giKt zP64hihxQ#ir0`hV!Es5Wf_`w~yA@}CatQqBp6@U({H17tiT5Xg1%^5YrW;l*a24G$ z%eI7j&DK>1xOQ-^*&Wg-$`BUM(j)q#?GUSy-E&RH5bJcHTNpfD{an^LB{Ts5Z`D@c literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemFoodRice.png b/src/main/resources/assets/actuallyadditions/textures/items/itemFoodRice.png new file mode 100644 index 0000000000000000000000000000000000000000..e927b9e97a34e4c7fe663bb1e7f3b5438faed7e7 GIT binary patch literal 512 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~E59%+$EDA|lz>9AnIRD+&iT2ysd*(pE(3#eQEFmI zYKlU6W=V#EyQgnJie4%^0|R4Ew=;ndHIVhC8Z?YT$BSlCVB)E=KnAhbya!e!sSO^y1sQOEYC4s&z!i{n;qHf>iEgVtB>I9lAa zptWmu&6|^tDns9-NTpir2v>b|^^|wh+qJQVZ$(yaX-<{gGK<%1dis}d{2vrA``*-@ z?3HeyJG=Yxev6lJO#4sXI<}~)wE2DU=S5$Y7tdGou$pV~?jO)29xdTJpDz2;KkIeT zm)Fa)ez)dtE*9$7JY?XaqQYU)`nah||J!XF=Gcl!QzcJ&_JJb8)78&qol`;+0M1I* AYXATM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemFoodRiceBread.png b/src/main/resources/assets/actuallyadditions/textures/items/itemFoodRiceBread.png new file mode 100644 index 0000000000000000000000000000000000000000..fdbf09679f1f1a15a62ff1c23fd2f5e5a707e815 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqg0@pGoCJvAr}5iC)jc^849!(&)VB^BPUU{L+KXBuBHU-8(c~i4AR=%`Bt+z zf49x#Jjo>{|KxpbzDLHaWv7xXIk*4TI+*Qte|9hXK@P+I=T_&__c~Ee(=!XNSEoy`Y`N)I+{phq*^S%4RU|;|!&!+~?=B|!YY%+>Hj45r_MV-` z!tuIHaKT*pYsapgjhoQhXB$=fdBub22Eig%j$J#^Bwy@NAGTKV#G`_omnHK&3)V=^ m;Ptj(`4Zdd;8O3fkX_QGBXeh0=sTdl7(8A5T-G@yGywpD)_vOm literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemMiscCanola.png b/src/main/resources/assets/actuallyadditions/textures/items/itemMiscCanola.png new file mode 100644 index 0000000000000000000000000000000000000000..b02f176eb96b6a9cdb238226394fab75f50b909e GIT binary patch literal 428 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmP~tDumciPa0kaG;QEW=KSdbAE1aYF-JD%fR4Vl$uzQ znxasiS(2gP?&%wlqL<3fz`!Wr>Eak-ar*6~y8f24nATG-v>Z?<{% zb!}R@#iOE63iU!g{{2pmWuhw6wk>|~eT8&4QxnHb&lfX$R`0I9DKJO&T`S*=>(kDt zY{_%|AiI09qUS2lsRrw(oyqc^mz6g!jzuAg`;t=nPs63tm(H+oJJNXl#b zn$VOWomqUjJWY!-ZK7u1UtdsHBOtcbRjGH4j9pit-Go%h?fvIB)!y;7V`OGcHao;| QRSpzrp00i_>zopr0K>4R4*&oF literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemMiscRiceDough.png b/src/main/resources/assets/actuallyadditions/textures/items/itemMiscRiceDough.png new file mode 100644 index 0000000000000000000000000000000000000000..d25613c551c2525fe4e01de5e912c3472c3da3c2 GIT binary patch literal 363 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE({MD?lGKCu%5&X6yYrJ zh%9Dc;1&j9Muu5)B!GhKC7!;n?Dtvug_RiC-X16g3dv@MM3gw^=jNv7l>oU649-QV zi6yBi3gww484B*6z5ywEsq8@U^PVn_Ar`0KPTZTt6e!TT-}*6Yq}e+A-!7GG2bW9; z5wn{-HCAO?V@T!PsSDmoZJY4o-PQp8F7G69ZhupmXEkT|?|l7l6#A^hsOb2v+tM>u zGagUS<_cJ>(D&2mzi5iz;lj_2ZXw6Jezo~Ve%Ko|xn}9T>UaESB@?V9ckYnA)ak_V zs*&};EveHc$GfTo9(knAY@g$Mp^GWxXtUq)4U2TbEL{T^X~_juHt&#i%5=D6SFpp~ z=(OIoAD_8r&tLo9{@(qRKfhkC`}O|x<;5#k<@;NU$prs79h!Lq0#LT=By}Z;C1rt33 zJ=4@yqg0@pqn<8~Ar}5iCs=bGau9LdJpbmD)&;Gt+8Ydf1-5K74()2_SQfOU)7vBa zwV#suheNaH8%D^?*lGNIPohxrnRu4NhAhrA^rx*=D`DT`z*Sk9wfgwxX49J~R-aw2 z9n(GZGphW}=S9Be*8Yz;HB8r+v%lW7>nl?S*O!uTg@S$OwoN-C^g^9k)kyGTlVjsN zj_K8Rn-iv{6*|6Qei$ILf4_rDOiRGcxqQ%_wFi2L!PC{xWt~$(69A#Cd;$Of literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemMiscTinyCharcoal.png b/src/main/resources/assets/actuallyadditions/textures/items/itemMiscTinyCharcoal.png new file mode 100644 index 0000000000000000000000000000000000000000..6d10d84c5dd07841e6688afd9b1d19ae561f5b19 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G^tAk28_ZrvZCAbW|YuPggqRyGbLvzJf4gM=hXTq84D?J>Ta8kIYHoYFIEGmGukAm`)#M=J%G%ka(9$#UQqvk9ro$c_=8Aew8RCwo z|1HpeaXbFb!i9xW?wxuvN1oTFyLs~pnkMz+IUbb=d{t_#qWtWD#O-ZAKb06Qs@=21 zrdxAPrOcW8rnMW+NIY)R`113UV&{uGU9CyCZl913sIdb&CCF>LwqBHelfI{F5=X$H zlhchBUoJeZ`a?JU!gcO~T0<6%hgVXJ)$dDxQZJU>>#%3V0uF@(R~0#q*wxevUI~xvnM`*j$=-U=Wi&tH8h6m|t50#LT=By}Z;C1rt33 zJ=4@yqg0@pJ)SO(Ar}5?`}T6R7zng5Zxa){DAK6Vp&*f4^FRIe?#M|S$|KK;em}V3 z(VrDRtzDL^>I|EdwP@;+Stkmvmo9msyu2xaqw!nq^3OIutKLUeF0pJV=-J5g;N0gJ zw>40ea+n0qV^p&DA@VFx|Ts-VaDlAQ{vA# zNha@5ntdz(NrR5lWs|A#=i}G2Ihaj~fvlUT?$y Ut9(8)2j~w5Pgg&ebxsLQ0K-^!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@p6P_-P zAr}5iCmrNEWFX*DyxM)Ch~OXYug`9-fB8Q?IqnkYNf8Kj|uhh(zU*Qak zPOUM>@D@BPz-;hw4p-hg#=a(&^1>YZ@7{v58IM{U%9zNBntWQm(k0q#Px#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^Ra1rHMi z2-5TVA^-pY7<5HgbW?9;ba!ELWdLwtX>N2bZe?^JG%heMHD!e|WdHyHheIk=N5k%-W}2`X7Fz8`7!?)CNC>gB1H>qL_hh7)T^jD9UA&wHiXfV?<*D&QD|W7ZAvV&45_Cy~mx^ zMo}?PkTv8b6_H31d%OG2Iej}D_`>4n-@A?6q&^cdgBcv{@hB)gbFc={E%53s0#LT=By}Z;C1rt33 zJ=4@yqg0@p9#0p?5DWjc{TDeK40v3uH_qPCQLm@CX#YFmotL;bE?X!j&oaBHviD{A zx9o{UGR#fIvtvD{%N#y#wR4ikzlKSdv?j&~3hMSxvuPI1cKm*e!BP5|!S!uL(+;Uk zy5Tsj?bYcO&*vunzbu{5Kj*Agj9@$;L(6GH?it*wORuh7!*XS(8qdDCUryh%A1^6k Ze*R5_?a|ffHlVv0JYD@<);T3K0RT*+XBPkf literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index a5141932f..74d25c21b 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "ActuallyAdditions", "name": "Actually Additions", "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.4.4", + "version": "0.0.5.0", "mcversion": "1.7.10", "url": "https://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", From 8051728c71598294b4646484d83d17cff998c95f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 22 May 2015 17:48:50 +0200 Subject: [PATCH 03/29] Added MFR Compatibility, fixed Bugs --- .../actuallyadditions/blocks/BlockPlant.java | 61 +++++++- .../actuallyadditions/blocks/InitBlocks.java | 5 + .../config/values/ConfigIntValues.java | 4 +- .../inventory/ContainerBreaker.java | 44 +++--- .../inventory/ContainerDropper.java | 44 +++--- .../inventory/ContainerFeeder.java | 44 +++--- .../inventory/ContainerFermentingBarrel.java | 44 +++--- .../inventory/ContainerFurnaceDouble.java | 48 +++--- .../inventory/ContainerGiantChest.java | 44 +++--- .../inventory/ContainerGrinder.java | 48 +++--- .../inventory/ContainerInputter.java | 32 ++-- .../inventory/ContainerOilGenerator.java | 38 ++--- .../inventory/ContainerRepairer.java | 46 +++--- .../actuallyadditions/items/InitItems.java | 5 +- .../items/ItemPhantomConnector.java | 2 +- .../actuallyadditions/items/ItemSeed.java | 41 +++++- .../tile/TileEntityBreaker.java | 7 +- .../tile/TileEntityPhantomface.java | 2 +- .../actuallyadditions/util/BlockUtil.java | 9 +- .../actuallyadditions/util/KeyUtil.java | 4 + .../actuallyadditions/util/WorldUtil.java | 8 +- .../waila/WailaDataProvider.java | 6 +- .../api/FactoryRegistry.java | 113 +++++++++++++++ .../api/FertilizerType.java | 29 ++++ .../minefactoryreloaded/api/HarvestType.java | 56 +++++++ .../api/IDeepStorageUnit.java | 35 +++++ .../api/IFactoryFertilizable.java | 58 ++++++++ .../api/IFactoryFertilizer.java | 32 ++++ .../api/IFactoryFruit.java | 106 ++++++++++++++ .../api/IFactoryGrindable.java | 44 ++++++ .../api/IFactoryHarvestable.java | 106 ++++++++++++++ .../api/IFactoryLaserSource.java | 24 +++ .../api/IFactoryLaserTarget.java | 36 +++++ .../api/IFactoryPlantable.java | 94 ++++++++++++ .../api/IFactoryRanchable.java | 34 +++++ .../api/ILiquidDrinkHandler.java | 16 ++ .../minefactoryreloaded/api/IMFRHammer.java | 11 ++ .../api/IMobEggHandler.java | 23 +++ .../api/IMobSpawnHandler.java | 35 +++++ .../minefactoryreloaded/api/INeedleAmmo.java | 16 ++ .../api/IRandomMobProvider.java | 19 +++ .../api/ISafariNetHandler.java | 35 +++++ .../minefactoryreloaded/api/ISyringe.java | 64 ++++++++ .../minefactoryreloaded/api/MobDrop.java | 21 +++ .../minefactoryreloaded/api/RanchedItem.java | 68 +++++++++ .../minefactoryreloaded/api/RandomMob.java | 28 ++++ .../api/ReplacementBlock.java | 137 ++++++++++++++++++ .../minefactoryreloaded/api/ValuedItem.java | 72 +++++++++ .../api/rednet/IRedNetInfo.java | 28 ++++ .../api/rednet/IRedNetInputNode.java | 51 +++++++ .../api/rednet/IRedNetLogicCircuit.java | 19 +++ .../api/rednet/IRedNetLogicPoint.java | 36 +++++ .../api/rednet/IRedNetNetworkContainer.java | 32 ++++ .../api/rednet/IRedNetOmniNode.java | 22 +++ .../api/rednet/IRedNetOutputNode.java | 50 +++++++ .../connectivity/IRedNetConnection.java | 26 ++++ .../connectivity/IRedNetDecorative.java | 11 ++ .../connectivity/IRedNetNoConnection.java | 13 ++ .../rednet/connectivity/IRedstoneAlike.java | 10 ++ .../connectivity/RedNetConnectionType.java | 86 +++++++++++ .../assets/actuallyadditions/lang/en_US.lang | 2 +- 61 files changed, 2053 insertions(+), 231 deletions(-) create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java create mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index 6de887356..d08f25789 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -16,12 +16,17 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import powercrystals.minefactoryreloaded.api.FertilizerType; +import powercrystals.minefactoryreloaded.api.HarvestType; +import powercrystals.minefactoryreloaded.api.IFactoryFertilizable; +import powercrystals.minefactoryreloaded.api.IFactoryHarvestable; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Random; -public class BlockPlant extends BlockCrops implements INameableItem{ +public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHarvestable, IFactoryFertilizable{ private IIcon[] textures; private String name; @@ -58,7 +63,6 @@ public class BlockPlant extends BlockCrops implements INameableItem{ return null; } - @Override public boolean canPlaceBlockOn(Block block){ return block == ((ItemSeed)this.seedItem).soilBlock; @@ -135,4 +139,57 @@ public class BlockPlant extends BlockCrops implements INameableItem{ return damage; } } + + @Override + public Block getPlant(){ + return this; + } + + @Override + public boolean canFertilize(World world, int x, int y, int z, FertilizerType fertilizerType){ + return true; + } + + @Override + public boolean fertilize(World world, Random rand, int x, int y, int z, FertilizerType fertilizerType){ + if (this.func_149851_a(world, x, y, z, world.isRemote)){ + if(!world.isRemote){ + if(this.func_149852_a(world, world.rand, x, y, z)){ + this.func_149853_b(world, world.rand, x, y, z); + return true; + } + } + } + return false; + } + + @Override + public HarvestType getHarvestType(){ + return HarvestType.Normal; + } + + @Override + public boolean breakBlock(){ + return true; + } + + @Override + public boolean canBeHarvested(World world, Map harvesterSettings, int x, int y, int z){ + return world.getBlockMetadata(x, y, z) >= 7; + } + + @Override + public List getDrops(World world, Random rand, Map harvesterSettings, int x, int y, int z){ + return this.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); + } + + @Override + public void preHarvest(World world, int x, int y, int z){ + + } + + @Override + public void postHarvest(World world, int x, int y, int z){ + + } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 64cdf3528..1835c493e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -7,6 +7,7 @@ import net.minecraft.block.material.Material; import net.minecraft.item.EnumRarity; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import powercrystals.minefactoryreloaded.api.FactoryRegistry; public class InitBlocks{ @@ -76,9 +77,13 @@ public class InitBlocks{ blockRice = new BlockPlant("blockRice", 6); BlockUtil.register(blockRice, BlockPlant.TheItemBlock.class, false); + FactoryRegistry.sendMessage("registerHarvestable", blockRice); + FactoryRegistry.sendMessage("registerFertilizable", blockRice); blockCanola = new BlockPlant("blockCanola", 4); BlockUtil.register(blockCanola, BlockPlant.TheItemBlock.class, false); + FactoryRegistry.sendMessage("registerHarvestable", blockCanola); + FactoryRegistry.sendMessage("registerFertilizable", blockCanola); blockCompost = new BlockCompost(); BlockUtil.register(blockCompost, BlockCompost.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index 571d2a6e0..42506dfdd 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -43,7 +43,7 @@ public enum ConfigIntValues{ HEAT_COLLECTOR_BLOCKS("Heat Collector: Blocks Needed", ConfigCategories.MACHINE_VALUES, 4, 1, 5, "How many Blocks are needed for the Heat Collector to power Machines above it"), HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 10000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), - GLASS_TIME_NEEDED("Greenhouse Glass: Time Needed", ConfigCategories.MACHINE_VALUES, 4000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), + GLASS_TIME_NEEDED("Greenhouse Glass: Time", ConfigCategories.MACHINE_VALUES, 5000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), BREAKER_TIME_NEEDED("Breaker and Placer: Time Needed", ConfigCategories.MACHINE_VALUES, 15, 1, 10000, "The Time Needed for the Breaker and the Placer to place or break a Block"), DROPPER_TIME_NEEDED("Dropper: Time Needed", ConfigCategories.MACHINE_VALUES, 10, 1, 10000, "The Time Needed for the Dropper to drop an Item"), @@ -61,7 +61,7 @@ public enum ConfigIntValues{ FURNACE_ENERGY_USED("Energy Use: Double Furnace", ConfigCategories.MACHINE_VALUES, 25, 1, 500, "The Amount of Energy used by the Double Furnace per Tick"), PRESS_PROCESSING_TIME("Canola Press: Processing Time", ConfigCategories.MACHINE_VALUES, 30, 1, 1000, "The Amount of time it takes to process one Canola"), - PRESS_MB_PRODUCED("Canola Press: mB Produced", ConfigCategories.MACHINE_VALUES, 50, 1, 5000, "The Amount of Canola Oil produced from one Canola"), + PRESS_MB_PRODUCED("Canola Press: mB Produced", ConfigCategories.MACHINE_VALUES, 30, 1, 5000, "The Amount of Canola Oil produced from one Canola"), PRESS_ENERGY_USED("Energy Use: Canola Press", ConfigCategories.MACHINE_VALUES, 35, 10, 500, "The Amount of Energy used by the Canola Press per Tick"), BARREL_MB_PRODUCED("Fermenting Barrel: mB Produced", ConfigCategories.MACHINE_VALUES, 50, 1, 3000, "The Amount of mB produced by the Barrel per cycle"), diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerBreaker.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerBreaker.java index 224a8f0dd..161cb37ef 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerBreaker.java @@ -50,28 +50,30 @@ public class ContainerBreaker extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, 0, 9+1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 9, false); + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDropper.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDropper.java index 47dde5e19..095a9e254 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDropper.java @@ -50,28 +50,30 @@ public class ContainerDropper extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, 0, 9+1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 9, false); + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFeeder.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFeeder.java index ae0d3528f..e17e0ba9a 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFeeder.java @@ -79,28 +79,30 @@ public class ContainerFeeder extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, 0, 1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 1, false); + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java index 85946bd3f..f1c01935c 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java @@ -93,33 +93,35 @@ public class ContainerFermentingBarrel extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - if(currentStack.getItem() == InitItems.itemBucketCanolaOil){ - this.mergeItemStack(newStack, 0, 1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemBucketCanolaOil){ + this.mergeItemStack(newStack, 0, 1, false); + } + if(currentStack.getItem() == Items.bucket){ + this.mergeItemStack(newStack, 2, 3, false); + } } - if(currentStack.getItem() == Items.bucket){ - this.mergeItemStack(newStack, 2, 3, false); + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); } - } - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ + else if(slot < inventoryStart){ this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java index b68c0b322..3ef872724 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFurnaceDouble.java @@ -96,31 +96,33 @@ public class ContainerFurnaceDouble extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - if(FurnaceRecipes.smelting().getSmeltingResult(currentStack) != null){ - this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_1, TileEntityFurnaceDouble.SLOT_INPUT_1+1, false); - this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_2, TileEntityFurnaceDouble.SLOT_INPUT_2+2, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(FurnaceRecipes.smelting().getSmeltingResult(currentStack) != null){ + this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_1, TileEntityFurnaceDouble.SLOT_INPUT_1+1, false); + this.mergeItemStack(newStack, TileEntityFurnaceDouble.SLOT_INPUT_2, TileEntityFurnaceDouble.SLOT_INPUT_2+2, false); + } } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGiantChest.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGiantChest.java index 3d5d510a8..941b9ad60 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGiantChest.java @@ -50,28 +50,30 @@ public class ContainerGiantChest extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, 0, 117, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 117, false); + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java index 296ca65f0..9047d05d0 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java @@ -102,31 +102,33 @@ public class ContainerGrinder extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - if(GrinderRecipes.instance().getOutput(currentStack, false) != null){ - this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_1, TileEntityGrinder.SLOT_INPUT_1+1, false); - if(this.isDouble) this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_2, TileEntityGrinder.SLOT_INPUT_2+1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(GrinderRecipes.instance().getOutput(currentStack, false) != null){ + this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_1, TileEntityGrinder.SLOT_INPUT_1+1, false); + if(this.isDouble) this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_2, TileEntityGrinder.SLOT_INPUT_2+1, false); + } } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java index 648ea273a..b11a6ebc0 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java @@ -114,28 +114,30 @@ public class ContainerInputter extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, 0, 1, false); - } + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 1, false); + } - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd, false); - } + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd, false); + } - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd, false); - } + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd, false); + } - else if(slot < inventoryStart){ + else if(slot < inventoryStart){ this.mergeItemStack(newStack, inventoryStart, hotbarEnd, false); } - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); - return currentStack; + return currentStack; + } } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java index e1164f9b7..570cac557 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java @@ -90,30 +90,32 @@ public class ContainerOilGenerator extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - if(currentStack.getItem() == InitItems.itemBucketOil){ - this.mergeItemStack(newStack, 0, 1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemBucketOil){ + this.mergeItemStack(newStack, 0, 1, false); + } } - } - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } - else if(slot < inventoryStart){ + else if(slot < inventoryStart){ this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java index 57a8a3f09..da2450df6 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerRepairer.java @@ -78,30 +78,32 @@ public class ContainerRepairer extends Container{ ItemStack currentStack = theSlot.getStack(); ItemStack newStack = currentStack.copy(); - if(slot <= hotbarEnd && slot >= inventoryStart){ - if(TileEntityItemRepairer.canBeRepaired(currentStack)){ - this.mergeItemStack(newStack, TileEntityItemRepairer.SLOT_INPUT, TileEntityItemRepairer.SLOT_INPUT+1, false); + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(TileEntityItemRepairer.canBeRepaired(currentStack)){ + this.mergeItemStack(newStack, TileEntityItemRepairer.SLOT_INPUT, TileEntityItemRepairer.SLOT_INPUT+1, false); + } } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; } - - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); - } - - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); - } - - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); - } - - if(newStack.stackSize == 0) theSlot.putStack(null); - else theSlot.onSlotChanged(); - if(newStack.stackSize == currentStack.stackSize) return null; - theSlot.onPickupFromSlot(player, newStack); - - return currentStack; } return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 5f6354598..5c44e0ddd 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -15,6 +15,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.fluids.FluidContainerRegistry; +import powercrystals.minefactoryreloaded.api.FactoryRegistry; public class InitItems{ @@ -112,9 +113,11 @@ public class InitItems{ itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, new ItemStack(itemFoods, 1, TheFoods.RICE.ordinal())); ItemUtil.register(itemRiceSeed); + FactoryRegistry.sendMessage("registerPlantable", itemRiceSeed); - itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Crop, new ItemStack(itemMisc, 1, TheMiscItems.CANOLA.ordinal())); + itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Plains, new ItemStack(itemMisc, 1, TheMiscItems.CANOLA.ordinal())); ItemUtil.register(itemCanolaSeed); + FactoryRegistry.sendMessage("registerPlantable", itemCanolaSeed); itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index b02400107..28165a6c2 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -65,7 +65,7 @@ public class ItemPhantomConnector extends Item implements INameableItem{ @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ - if(KeyUtil.isControlPressed()) this.clearStorage(stack); + if(KeyUtil.isAltPressed()) this.clearStorage(stack); return stack; } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java index 872f9af7c..7f5d1c7d6 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -12,20 +12,22 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; +import net.minecraft.item.ItemSeeds; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.common.EnumPlantType; -import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.BlockSnapshot; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.ForgeEventFactory; +import powercrystals.minefactoryreloaded.api.IFactoryPlantable; +import powercrystals.minefactoryreloaded.api.ReplacementBlock; import java.util.List; -public class ItemSeed extends Item implements IPlantable, INameableItem{ +public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlantable{ public Block plant; public Block soilBlock; @@ -33,6 +35,7 @@ public class ItemSeed extends Item implements IPlantable, INameableItem{ public String name; public ItemSeed(String name, Block plant, Block soilBlock, EnumPlantType type, ItemStack returnItem){ + super(plant, soilBlock); this.name = name; this.plant = plant; this.soilBlock = soilBlock; @@ -64,7 +67,7 @@ public class ItemSeed extends Item implements IPlantable, INameableItem{ int j = pos.blockY; int k = pos.blockZ; - if(world.canMineBlock(player, i, j, k) && player.canPlayerEdit(i, j, k, pos.sideHit, stack)){ + if(player.canPlayerEdit(i, j, k, pos.sideHit, stack)){ if(world.getBlock(i, j, k).getMaterial() == Material.water && world.getBlockMetadata(i, j, k) == 0 && world.isAirBlock(i, j + 1, k)){ BlockSnapshot snap = BlockSnapshot.getBlockSnapshot(world, i, j+1, k); world.setBlock(i, j + 1, k, this.plant); @@ -127,4 +130,34 @@ public class ItemSeed extends Item implements IPlantable, INameableItem{ public String getOredictName(){ return this.getName(); } -} + + @Override + public Item getSeed(){ + return this; + } + + @Override + public boolean canBePlanted(ItemStack stack, boolean forFermenting){ + return true; + } + + @Override + public ReplacementBlock getPlantedBlock(World world, int x, int y, int z, ItemStack stack){ + return new ReplacementBlock(this.plant); + } + + @Override + public boolean canBePlantedHere(World world, int x, int y, int z, ItemStack stack){ + return world.getBlock(x, y, z).isReplaceable(world, x, y, z) && ((BlockPlant)this.plant).canPlaceBlockOn(world.getBlock(x, y-1, z)); + } + + @Override + public void prePlant(World world, int x, int y, int z, ItemStack stack){ + + } + + @Override + public void postPlant(World world, int x, int y, int z, ItemStack stack){ + + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index c316ab395..ed1893a36 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -3,7 +3,6 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.block.Block; -import net.minecraft.block.BlockAir; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.ChunkCoordinates; @@ -70,9 +69,9 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ this.markDirty(); } } - else if(this.isPlacer && (worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ))){ + else if(this.isPlacer && worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ)){ ItemStack removeFalse = this.removeFromInventory(false); - if(removeFalse != null && Block.getBlockFromItem(removeFalse.getItem()) != blockToBreak && WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, removeFalse)){ + if(removeFalse != null && WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, removeFalse)){ this.removeFromInventory(true); } } @@ -115,7 +114,7 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ public ItemStack removeFromInventory(boolean actuallyDo){ for(int i = 0; i < this.slots.length; i++){ - if(this.slots[i] != null && !(Block.getBlockFromItem(this.slots[i].getItem()) instanceof BlockAir)){ + if(this.slots[i] != null){ ItemStack slot = this.slots[i].copy(); if(actuallyDo){ this.slots[i].stackSize--; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 69a778842..77ff04357 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -80,7 +80,6 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ public IInventory getInventory(){ TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); if(tile != null && tile instanceof IInventory){ - this.markDirty(); return (IInventory)tile; } return null; @@ -113,6 +112,7 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ @Override public void setInventorySlotContents(int i, ItemStack stack){ if(this.isBoundTileInRage()) this.getInventory().setInventorySlotContents(i, stack); + this.markDirty(); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java index 6a90f1b2c..ff35bbba2 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java @@ -2,13 +2,13 @@ package ellpeck.actuallyadditions.util; import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.creative.CreativeTab; -import ellpeck.actuallyadditions.waila.WailaDataProvider; import net.minecraft.block.Block; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; +import java.util.ArrayList; import java.util.List; public class BlockUtil{ @@ -41,6 +41,8 @@ public class BlockUtil{ } } + public static final ArrayList wailaRegisterList = new ArrayList(); + public static void register(Block block, Class itemBlock, Enum[] list){ block.setCreativeTab(CreativeTab.instance); block.setBlockName(createUnlocalizedName(block)); @@ -49,7 +51,7 @@ public class BlockUtil{ if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(block, 1, current.ordinal())); } - WailaDataProvider.registerList.add(block); + wailaRegisterList.add(block); } public static void register(Block block, Class itemBlock){ @@ -62,7 +64,6 @@ public class BlockUtil{ GameRegistry.registerBlock(block, itemBlock, ((INameableItem)block).getName()); if(!((INameableItem)block).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)block).getOredictName(), new ItemStack(block, 1, Util.WILDCARD)); - WailaDataProvider.registerList.add(block); + wailaRegisterList.add(block); } - } diff --git a/src/main/java/ellpeck/actuallyadditions/util/KeyUtil.java b/src/main/java/ellpeck/actuallyadditions/util/KeyUtil.java index 7db820f5f..a455ca1fa 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/KeyUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/KeyUtil.java @@ -12,4 +12,8 @@ public class KeyUtil{ return Keyboard.isKeyDown(Keyboard.KEY_LCONTROL) || Keyboard.isKeyDown(Keyboard.KEY_RCONTROL); } + public static boolean isAltPressed(){ + return Keyboard.isKeyDown(Keyboard.KEY_LMENU) || Keyboard.isKeyDown(Keyboard.KEY_RMENU); + } + } diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index fa205740f..4d088e31d 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -8,6 +8,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import net.minecraft.world.WorldServer; +import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; @@ -50,8 +51,13 @@ public class WorldUtil{ public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ if(world instanceof WorldServer){ + if(stack.getItem() instanceof IPlantable){ + if(((IPlantable)stack.getItem()).getPlant(world, x, y, z).canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ + return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z)); + } + } if(side != ForgeDirection.UNKNOWN){ - return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world, x, y, z, side.ordinal(), 0, 0, 0); + return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world,x, y, z, side.ordinal(), 0, 0, 0); } } return false; diff --git a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java index da5b44583..8bf9f5272 100644 --- a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java +++ b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.waila; import ellpeck.actuallyadditions.blocks.BlockCompost; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.tile.TileEntityCompost; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; @@ -18,7 +19,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import java.util.ArrayList; import java.util.List; @SuppressWarnings("unused") @@ -26,8 +26,6 @@ public class WailaDataProvider implements IWailaDataProvider{ private final String WAILA_PRE_LANG = "gui." + ModUtil.MOD_ID_LOWER + ".waila."; - public static final ArrayList registerList = new ArrayList(); - @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config){ return null; @@ -90,7 +88,7 @@ public class WailaDataProvider implements IWailaDataProvider{ registrar.registerBodyProvider(provider, BlockCompost.class); - for(Block theBlock : registerList){ + for(Block theBlock : BlockUtil.wailaRegisterList){ registrar.registerHeadProvider(provider, theBlock.getClass()); } } diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java b/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java new file mode 100644 index 000000000..804d2999a --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java @@ -0,0 +1,113 @@ +package powercrystals.minefactoryreloaded.api; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.event.FMLInterModComms; +import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +/** + * @author PowerCrystals + * + * Class used to register plants and other farming-related things with MFR. Will do nothing if MFR does not exist. + * + */ +public class FactoryRegistry +{ + /* + * This may be called at any time during pre-init, init or post-init, assuming all blocks and items + * that are being accessed from the registry have been appropriately registered. + * Possible messages: + * + * // Registration: + * addLaserPreferredOre | NBTTag with an ItemStack saved on it, with the color on the "value" attribute, + * | A ValuedItem with item and value set. + * registerAutoSpawnerBlacklist | The String identifier of an entity, + * | A subclass of EntityLivingBase. + * registerFertilizable | An instance of IFactoryFertilizable. + * registerFertilizer | An instance of IFactoryFertilizer. + * registerFruitLog | The String identifier of a block. + * registerGrindable | An instance of IFactoryGrindable. + * registerGrinderBlacklist | A subclass of EntityLivingBase. + * registerHarvestable | An instance of IFactoryHarvestable. + * registerLaserOre | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, + * | A ValuedItem with item and value set. + * registerLiquidDrinkHandler | A ValuedItem with key and object set; ILiquidDrinkHandler expected. + * registerMobEggHandler | An instance of IMobEggHandler. + * registerPickableFruit | An instance of IFactoryFruit. + * registerPlantable | An instance of IFactoryPlantable. + * registerRanchable | An instance of IFactoryRanchable. + * registerRedNetLogicCircuit | An instance of IRedNetLogicCircuit. + * registerRubberTreeBiome | The biomeName field of a biome to white list for rubber trees to spawn in. + * registerSafariNetBlacklist | A subclass of EntityLivingBase. + * registerSafariNetHandler | An instance of ISafariNetHandler. + * registerSludgeDrop | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, + * | A ValuedItem with item and value set. + * registerSpawnHandler | An instance of IMobSpawnHandler. + * registerVillagerTradeMob | An instance of IRandomMobProvider. + * + * // Simple implementations: + * { Harvestables + * registerHarvestable_Standard | The String identifier of a block. + * registerHarvestable_Log | The String identifier of a block. + * registerHarvestable_Leaves | The String identifier of a block. + * registerHarvestable_Vine | The String identifier of a block. + * registerHarvestable_Shrub | The String identifier of a block. + * registerHarvestable_Mushroom | The String identifier of a block. + * registerHarvestable_Crop | An ItemStack of a block, with a damage value indicating the meta value to harvest at. + * | A ValuedItem with value and object set; Block expected. + * registerHarvestable_Gourd | An NBTTag with the stem and fruit attributes, both String identifiers of blocks. + * } + * { Plantables + * registerPlantable_Standard | An NBTTag with the seed (Item, String identifier), and + * crop (Block, String identifier) attributes set, optionally + * also having the meta (Integer, accepted metadata value of the seed item) attribute set. + * No special checks for location, just sustainability. + * registerPlantable_Crop | An NBTTag with the seed (Item, String identifier), and + * crop (Block, String identifier) attributes set, optionally + * also having the meta (Integer, accepted metadata value of the seed item) attribute set. + * Will automatically hoe dirt and grass into farmland when planting. + * registerPlantable_Sapling | An NBTTag with the sapling (Block, String identifier), and optionally + * the seed (Item, String identifier) attributes set. + * } + * { Fertilizer + * registerFertilizer_Standard | An NBTTag with the fert (Item, String identifier), meta (Integer), and + * type (Integer, index into FertilizerType.values()) attributes set. + * } + * { Fertilizables + * registerFertilizable_Grass | The String identifier of a block. Will bonemeal the block and expect + * tall grass be planted above and around it, must be IGrowable. Works with + * the GrowPlant and Grass type fertilizers, not recommended for crop plants. + * registerFertilizable_Gourd | The String identifier of a block. Must be IGrowable, and expects identical + * behavior to vanilla stems. Works with the GrowPlant fertilizers. + * registerFertilizable_Crop | An NBTTag with the plant (Block, String identifier, IGrowable), and + * meta (Integer, max growth phase) attributes set, optionally also having + * the type (Integer, index into FertilizerType) attribute set. + * registerFertilizable_Cocoa | An NBTTag with the plant (Block, String identifier), and optionally also + * the type (Integer, index into FertilizerType) attributes set. + * Expects metadata of the block to exactly match cocoa pods. + * registerFertilizable_Standard | An NBTTag with the plant (Block, String identifier, IGrowable), and + * optionally also the type (Integer, index into FertilizerType) attributes set. + * Expects the block to change when successfully grown (e.g., saplings). + * } + */ + public static void sendMessage(String message, Object value) + { + if (!Loader.isModLoaded("MineFactoryReloaded") || + Loader.instance().activeModContainer() == null) + return; + try + { + Method m = FMLInterModComms.class.getDeclaredMethod("enqueueMessage", Object.class, String.class, IMCMessage.class); + m.setAccessible(true); + Constructor c = IMCMessage.class.getDeclaredConstructor(String.class, Object.class); + c.setAccessible(true); + m.invoke(null, Loader.instance().activeModContainer(), "MineFactoryReloaded", c.newInstance(message, value)); + } + catch(Exception e) + { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java b/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java new file mode 100644 index 000000000..43af2b656 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java @@ -0,0 +1,29 @@ +package powercrystals.minefactoryreloaded.api; + +/** + * Determines what kind of action a given fertilizer can perform. Your + * IFactoryFertilizable instances should check this before performing any action + * to maintain future compatibility. + * + * @author PowerCrystals + */ +public enum FertilizerType { + + /** + * The fertilizer will fertilize nothing. + */ + None, + /** + * The fertilizer will fertilize grass. + */ + Grass, + /** + * The fertilizer will grow a plant. + */ + GrowPlant, + /** + * The fertilizer will grow magical crops. + */ + GrowMagicalCrop, + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java b/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java new file mode 100644 index 000000000..85ef23835 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java @@ -0,0 +1,56 @@ +package powercrystals.minefactoryreloaded.api; + +/** + * Determines what algorithm the Harvester uses when it encounters this + * IFactoryHarvestable in the world. + * + * @author PowerCrystals + */ +public enum HarvestType { + + /** + * Just break the single block - no special action needed. e.g. Carrots, + * flowers, wheat. + */ + Normal, + /** + * Search for harvestable blocks adjacent to this block but leave this + * block. e.g. Pumpkin, melon + */ + Gourd, + /** + * Search for identical blocks above. + */ + Column, + /** + * Search for identical blocks above but leave the bottom one for the + * future. e.g. Cactus, sugarcane. + */ + LeaveBottom, + /** + * This block is the base of a tree and the harvester should enter + * tree-cutting mode. + */ + Tree, + /** + * This block is the base of the tree and the harvester should enter + * tree-cutting mode. + * The tree is searched for in the negative y axis instead. + */ + TreeFlipped, + /** + * This block is part of a tree as above, but leaves are cut before logs. + * The tree is searched for in the current mode. + *

+ * If not in tree-cutting mode, tree-cutting mode will be entered as though + * the type was Tree. + */ + TreeLeaf, + /** + * This block is part of a tree as above, but fruits are cut before logs. + * e.g. cocoa + * The tree is not searched for. + */ + TreeFruit + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java b/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java new file mode 100644 index 000000000..2ec1f76b3 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java @@ -0,0 +1,35 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.item.ItemStack; + +public interface IDeepStorageUnit { + + /** + * @return A populated ItemStack with stackSize for the full amount of + * materials in the DSU.
+ * May have a stackSize > getMaxStackSize(). May have a stackSize of + * 0 (indicating locked contents). + */ + ItemStack getStoredItemType(); + + /** + * Sets the total amount of the item currently being stored, or zero if all + * items are to be removed. + */ + void setStoredItemCount(int amount); + + /** + * Sets the type of the stored item and initializes the number of stored + * items to amount. + *

+ * Will overwrite any existing stored items. + */ + void setStoredItemType(ItemStack type, int amount); + + /** + * @return The maximum number of items the DSU can hold.
+ * May change based on the current type stored. + */ + int getMaxStoredCount(); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java new file mode 100644 index 000000000..a4b8c8975 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java @@ -0,0 +1,58 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.block.Block; +import net.minecraft.world.World; + +import java.util.Random; + +/** + * Defines a fertilizable block, and the process to fertilize it. You can assume + * that you will never have to check that block matches the one returned by + * getPlant(). + * + * @author PowerCrystals + */ +public interface IFactoryFertilizable { + + /** + * @return The block this instance is managing. + */ + public Block getPlant(); + + /** + * @param world + * The world this block belongs to. + * @param x + * The X coordinate of this block. + * @param y + * The Y coordinate of this block. + * @param z + * The Z coordinate of this block. + * @param fertilizerType + * The kind of fertilizer being used. + * + * @return True if the block at (x,y,z) can be fertilized with the given + * type of fertilizer. + */ + public boolean canFertilize(World world, int x, int y, int z, FertilizerType fertilizerType); + + /** + * @param world + * The world this block belongs to. + * @param rand + * A Random instance to use when fertilizing, if necessary. + * @param x + * The X coordinate of this block. + * @param y + * The Y coordinate of this block. + * @param z + * The Z coordinate of this block. + * @param fertilizerType + * The kind of fertilizer being used. + * + * @return True if fertilization was successful. If false, the Fertilizer + * will not consume a fertilizer item and will not drain power. + */ + public boolean fertilize(World world, Random rand, int x, int y, int z, FertilizerType fertilizerType); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java new file mode 100644 index 000000000..2f201e68e --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java @@ -0,0 +1,32 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +/** + * Defines a fertilizer item for use in the Fertilizer. + * + * @author PowerCrystals + */ +public interface IFactoryFertilizer { + + /** + * @return The ID of this fertilizer item. + */ + Item getFertilizer(); + + /** + * @return The type of fertilizer this is. + */ + FertilizerType getFertilizerType(ItemStack stack); + + /** + * Called when a fertilization is successful. If you set the ItemStack size + * to 0, it will be deleted by the fertilizer. + * + * @param fertilizer + * The ItemStack used to fertilize. + */ + void consume(ItemStack fertilizer); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java new file mode 100644 index 000000000..2251ee94c --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java @@ -0,0 +1,106 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Random; + +/** + * Defines a fruit entry for the Fruit Picker. + * + * @author powercrystals + * + */ +public interface IFactoryFruit { + + /** + * @return The block this fruit has in the world. + */ + public Block getPlant(); + + /** + * Used to determine if this fruit can be picked (is it ripe yet, etc) + * + * @param world + * The world where the fruit is being picked + * @param x + * The x-coordinate of the fruit + * @param y + * The y-coordinate of the fruit + * @param z + * The z-coordinate of the fruit + * + * @return True if the fruit can be picked + */ + public boolean canBePicked(World world, int x, int y, int z); + + /** + * @deprecated This method is no longer called. ReplacementBlock now handles + * interaction. + */ + @Deprecated + public boolean breakBlock(); + + /** + * Called by the Fruit Picker to determine what block to replace the picked + * block with. At the time this method is called, the fruit still exists. + * + * @param world + * The world where the fruit is being picked + * @param x + * The x-coordinate of the fruit + * @param y + * The y-coordinate of the fruit + * @param z + * The z-coordinate of the fruit + * + * @return The block to replace the fruit block with, or null for air. + */ + public ReplacementBlock getReplacementBlock(World world, int x, int y, int z); + + /** + * Called by the Fruit Picker to determine what drops to generate. At the + * time this method is called, the fruit still exists. + * + * @param world + * The world where the fruit is being picked + * @param x + * The x-coordinate of the fruit + * @param y + * The y-coordinate of the fruit + * @param z + * The z-coordinate of the fruit + */ + public List getDrops(World world, Random rand, int x, int y, int z); + + /** + * Called by the Fruit Picker after getDrops, prior to the block being + * replaced/removed. + * + * @param world + * The world where the fruit is being picked + * @param x + * The x-coordinate of the fruit + * @param y + * The y-coordinate of the fruit + * @param z + * The z-coordinate of the fruit + */ + public void prePick(World world, int x, int y, int z); + + /** + * Called by the Fruit Picker after the fruit is picked. + * + * @param world + * The world where the fruit is being picked + * @param x + * The x-coordinate of the fruit + * @param y + * The y-coordinate of the fruit + * @param z + * The z-coordinate of the fruit + */ + public void postPick(World world, int x, int y, int z); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java new file mode 100644 index 000000000..0ef2149fe --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java @@ -0,0 +1,44 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Random; + +/** + * Defines a grindable entity for the Grinder. + * + * @author PowerCrystals + */ +public interface IFactoryGrindable { + + /** + * @return The class that this grindable instance is handling. This must be + * a subtype of EntityLivingBase or the entity will never + * be noticed by the Grinder. + */ + public Class getGrindableEntity(); + + /** + * @param world + * The world this entity is in. + * @param entity + * The entity instance being ground. + * @param random + * A Random instance. + * + * @return The drops generated when this entity is killed. Only one of these + * will be chosen. + */ + public List grind(World world, EntityLivingBase entity, Random random); + + /** + * @param entity + * The entity instance being ground. + * + * @return Whether this entity has been fully processed or not. (e.g., it is + * already dead) + */ + public boolean processEntity(EntityLivingBase entity); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java new file mode 100644 index 000000000..2d691aa95 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java @@ -0,0 +1,106 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +import java.util.List; +import java.util.Map; +import java.util.Random; + +/** + * Defines a harvestable block for the Harvester. + * + * @author PowerCrystals + */ +public interface IFactoryHarvestable { + + /** + * @return The block this harvestable instance is managing. + */ + public Block getPlant(); + + /** + * @return The type of harvest the Harvester should perform on this block. + */ + public HarvestType getHarvestType(); + + /** + * Used to determine if the harvester should replace this block with air. + * + * @return Whether or not the Harvester should break the block when + * harvesting. If false, no changes will be performed by the + * Harvester itself. + */ + public boolean breakBlock(); + + /** + * Used to determine if this crop can be harvested (is it at a stage that + * drops crops, etc.) + * + * @param world + * The world this block is in. + * @param harvesterSettings + * The harvester's current settings. Do not modify these. + * @param x + * The X coordinate of the block being harvested. + * @param y + * The Y coordinate of the block being harvested. + * @param z + * The Z coordinate of the block being harvested. + * + * @return True if this block can be harvested. + */ + public boolean canBeHarvested(World world, Map harvesterSettings, int x, int y, int z); + + /** + * @param world + * The world this block is in. + * @param rand + * A Random instance to use when generating drops. + * @param harvesterSettings + * The harvester's current settings. Do not modify these. + * @param x + * The X coordinate of the block being harvested. + * @param y + * The Y coordinate of the block being harvested. + * @param z + * The Z coordinate of the block being harvested. + * + * @return The drops generated by breaking this block. For a default + * implementation, calling Block.getDrops() is usually + * sufficient. + */ + public List getDrops(World world, Random rand, Map harvesterSettings, int x, int y, int z); + + /** + * Called before the block is going to be harvested, after getDrops. Usually + * empty. + * + * @param world + * The world this block is in. + * @param x + * The X coordinate of the block being harvested. + * @param y + * The Y coordinate of the block being harvested. + * @param z + * The Z coordinate of the block being harvested. + */ + public void preHarvest(World world, int x, int y, int z); + + /** + * Called after the block is going to be harvested. Used to re-till soil, + * for example. + * + * @param world + * The world this block is in. + * @param x + * The X coordinate of the block being harvested. + * @param y + * The Y coordinate of the block being harvested. + * @param z + * The Z coordinate of the block being harvested. + */ + public void postHarvest(World world, int x, int y, int z); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java new file mode 100644 index 000000000..4eab9eb66 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java @@ -0,0 +1,24 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Defines a target for the laser blocks. TileEntities that implement this + * interface will sustain the beam. + * + * @author skyboy + */ +public interface IFactoryLaserSource { + + /** + * Used to determine if laser blocks can remain in the world when emitted + * from from + * + * @param from + * The direction the laser is oriented + * + * @return True if the beam should be sustained from this side + */ + public boolean canFormBeamFrom(ForgeDirection from); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java new file mode 100644 index 000000000..7fcc41137 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java @@ -0,0 +1,36 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Defines a target for the Laser Drill Precharger + * + * @author skyboy + */ +public interface IFactoryLaserTarget { + + /** + * Used to be determined if a laser can be formed on from + * + * @param from + * The direction the laser is coming from + * + * @return True if the precharger can form a beam from this side + */ + public boolean canFormBeamWith(ForgeDirection from); + + /** + * Used to add energy to the tile. + * + * @param from + * The direction the energy is coming from + * @param energy + * The amount of energy being transferred + * @param simulate + * true if this transaction will only be simulated + * + * @return The amount of energy not consumed + */ + public int addEnergy(ForgeDirection from, int energy, boolean simulate); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java new file mode 100644 index 000000000..1d620b37e --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java @@ -0,0 +1,94 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Defines a plantable object for use in the Planter. + * + * @author PowerCrystals + */ +public interface IFactoryPlantable { + + /** + * @return The item this plantable is managing. + */ + public Item getSeed(); + + /** + * @param stack + * The stack being planted. + * @param forFermenting + * True if this stack will be converted to biofuel + * + * @return True if this plantable can be planted (useful for metadata + * items). + */ + public boolean canBePlanted(ItemStack stack, boolean forFermenting); + + /** + * @param world + * The world instance this block or item will be placed into. + * @param x + * The destination X coordinate. + * @param y + * The destination Y coordinate. + * @param z + * The destination Z coordinate. + * @param stack + * The stack being planted. + * + * @return The block that will be placed into the world. + */ + public ReplacementBlock getPlantedBlock(World world, int x, int y, int z, ItemStack stack); + + /** + * @param world + * The world instance this block or item will be placed into. + * @param x + * The destination X coordinate. + * @param y + * The destination Y coordinate. + * @param z + * The destination Z coordinate. + * @param stack + * The stack being planted. + * + * @return True if this plantable can be placed at the provided coordinates. + */ + public boolean canBePlantedHere(World world, int x, int y, int z, ItemStack stack); + + /** + * Called before planting is performed. Used to till soil, for example. + * + * @param world + * The world instance this block or item will be placed into. + * @param x + * The destination X coordinate. + * @param y + * The destination Y coordinate. + * @param z + * The destination Z coordinate. + * @param stack + * The stack being planted. + */ + public void prePlant(World world, int x, int y, int z, ItemStack stack); + + /** + * Called after planting is performed. Usually empty. + * + * @param world + * The world instance this block or item will be placed into. + * @param x + * The destination X coordinate. + * @param y + * The destination Y coordinate. + * @param z + * The destination Z coordinate. + * @param stack + * The stack being planted. + */ + public void postPlant(World world, int x, int y, int z, ItemStack stack); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java new file mode 100644 index 000000000..21fc61abc --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java @@ -0,0 +1,34 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.inventory.IInventory; +import net.minecraft.world.World; + +import java.util.List; + +/** + * Defines a ranchable entity for use in the Rancher. + * + * @author PowerCrystals + */ +public interface IFactoryRanchable { + + /** + * @return The entity being ranched. Must be a subtype of EntityLivingBase. + */ + public Class getRanchableEntity(); + + /** + * @param world + * The world this entity is in. + * @param entity + * The entity instance being ranched. + * @param rancher + * The rancher instance doing the ranching. Used to access the + * Rancher's inventory when milking cows, for example. + * + * @return A list of drops. All Items be dropped, fluids not matching the tank's contents will be discarded. + */ + public List ranch(World world, EntityLivingBase entity, IInventory rancher); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java new file mode 100644 index 000000000..d8d58866a --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java @@ -0,0 +1,16 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityLivingBase; + +public interface ILiquidDrinkHandler { + + /** + * Called when an entity has consumed the fluid this manages. + * + * @param entity + * The entity that has consumed the fluid this + * ILiquidDrinkHandler manages + */ + public void onDrink(EntityLivingBase entity); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java new file mode 100644 index 000000000..4f951dae0 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java @@ -0,0 +1,11 @@ +package powercrystals.minefactoryreloaded.api; + +/** + * Defines a tool that can rotate MFR machines. Implement on an Item class. + * Requires no additional work on your part. + * + * @author PowerCrystals + */ +public interface IMFRHammer { + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java new file mode 100644 index 000000000..4801feb9f --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java @@ -0,0 +1,23 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.item.ItemStack; + +/** + * Defines a class that MFR will use to local egg info for a given mob. This is + * used to color the Safari Net based on the captured mob. + * + * @author PowerCrystals + */ +public interface IMobEggHandler { + + /** + * @param safariNet + * The Safari Net that is looking for egg info. + * + * @return An EntityEggInfo, or null if this instance cannot handle this + * mob. + */ + public EntityEggInfo getEgg(ItemStack safariNet); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java new file mode 100644 index 000000000..65d2b3031 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java @@ -0,0 +1,35 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityLivingBase; + +/** + * Defines a handler for mob spawns from the autospawner. Added primarily to + * solve item duping on exact spawn & entity inventories + * + * @author skyboy + */ +public interface IMobSpawnHandler { + + /** + * @return The class that this instance is handling. + */ + public Class getMobClass(); + + /** + * Called when a mob has been spawned normally. + * + * @param entity + * The entity instance being spawned. Typically your regular + * spawn code 100% handles this + */ + public void onMobSpawn(EntityLivingBase entity); + + /** + * Called when an exact copy of an entity has been made. + * + * @param entity + * The entity instance being exact-copied. Clear your inventories + * & etc. here + */ + public void onMobExactSpawn(EntityLivingBase entity); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java b/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java new file mode 100644 index 000000000..38e648205 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java @@ -0,0 +1,16 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +public interface INeedleAmmo { + + public boolean onHitEntity(ItemStack stac, EntityPlayer owner, Entity hit, double distance); + + public void onHitBlock(ItemStack stac, EntityPlayer owner, World world, int x, int y, int z, int side, double distance); + + public float getSpread(ItemStack stack); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java b/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java new file mode 100644 index 000000000..e72db202c --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java @@ -0,0 +1,19 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.world.World; + +import java.util.List; + +public interface IRandomMobProvider { + + /** + * Called to provide random entities to be spawned by mystery SafariNets + * + * @param world + * The world object the entities will be spawned in. + * @return A list of RandomMob instances of entities that are all ready to + * be spawned in the world with no additional method calls. + */ + public List getRandomMobs(World world); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java new file mode 100644 index 000000000..cb9a0d7ff --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java @@ -0,0 +1,35 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +import java.util.List; + +/** + * Defines an object that can display information about a captured mob in a + * Safari net. + * + * @author PowerCrystals + */ +public interface ISafariNetHandler { + + /** + * @return The class of mob that this handler applies to. + */ + public Class validFor(); + + /** + * Called to add information regarding a mob contained in a SafariNet. + * + * @param safariNetStack + * The Safari Net that is requesting information. + * @param player + * The player holding the Safari Net. + * @param infoList + * The current list of information strings. Add yours to this. + * @param advancedTooltips + * True if the advanced tooltips option is on. + */ + public void addInformation(ItemStack safariNetStack, EntityPlayer player, List infoList, boolean advancedTooltips); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java b/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java new file mode 100644 index 000000000..b3cbfba9d --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java @@ -0,0 +1,64 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; + +/** + * Defines a syringe for use in the Vet machine. + * + * @author PowerCrystals + */ +public interface ISyringe { + + /** + * Called when the vet is deciding if it should use this syringe. + * + * @param world + * The world instance. + * @param entity + * The entity being injected. + * @param syringe + * The syringe ItemStack. + * + * @return True if the entity can be injected by this syringe. + */ + public boolean canInject(World world, EntityLivingBase entity, ItemStack syringe); + + /** + * Called to perform an injection. + * + * @param world + * The world instance. + * @param entity + * The entity being injected. + * @param syringe + * The syringe ItemStack. + * + * @return True if injection was successful. + */ + public boolean inject(World world, EntityLivingBase entity, ItemStack syringe); + + /** + * Called to check if a syringe is empty + * + * @param syringe + * The syringe ItemStack. + * + * @return True if the syringe is empty + */ + public boolean isEmpty(ItemStack syringe); + + /** + * Called to get the empty syringe + *

+ * Note: this will replace the syringe, max stacksize should be 1 + * + * @param syringe + * The syringe ItemStack. + * + * @return An empty syringe ItemStack + */ + public ItemStack getEmptySyringe(ItemStack syringe); + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java b/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java new file mode 100644 index 000000000..7f5dd7cc9 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java @@ -0,0 +1,21 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.item.ItemStack; +import net.minecraft.util.WeightedRandom; + +public class MobDrop extends WeightedRandom.Item +{ + private ItemStack _stack; + + public MobDrop(int weight, ItemStack stack) + { + super(weight); + _stack = stack; + } + + public ItemStack getStack() + { + if(_stack == null) return null; + return _stack.copy(); + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java b/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java new file mode 100644 index 000000000..86791cc54 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java @@ -0,0 +1,68 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +/** + * @author skyboy026 + * + * Defines an ItemStack or a FluidStack that is the result of an entity being ranched + */ +public final class RanchedItem { + private final ItemStack item; + private final FluidStack fluid; + + public RanchedItem(Block item, int amount, int meta) + { + this(new ItemStack(item, amount, meta)); + } + + public RanchedItem(Block item, int amount) + { + this(new ItemStack(item, amount)); + } + + public RanchedItem(Block item) + { + this(new ItemStack(item)); + } + + public RanchedItem(Item item, int amount, int meta) + { + this(new ItemStack(item, amount, meta)); + } + + public RanchedItem(Item item, int amount) + { + this(new ItemStack(item, amount)); + } + + public RanchedItem(Item item) + { + this(new ItemStack(item)); + } + + public RanchedItem(ItemStack item) + { + this.item = item; + fluid = null; + } + + public RanchedItem(FluidStack fluid) + { + this.fluid = fluid; + item = null; + } + + public boolean hasFluid() + { + return item == null & fluid != null; + } + + public Object getResult() + { + return item == null ? fluid : item; + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java b/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java new file mode 100644 index 000000000..2ffa56b1a --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java @@ -0,0 +1,28 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.entity.Entity; +import net.minecraft.util.WeightedRandom; + +public class RandomMob extends WeightedRandom.Item +{ + private Entity _mob; + public final boolean shouldInit; + + public RandomMob(Entity savedMob, int weight, boolean init) + { + super(weight); + _mob = savedMob; + shouldInit = init; + } + + public RandomMob(Entity savedMob, int weight) + { + this(savedMob, weight, true); + } + + public Entity getMob() + { + if(_mob == null) return null; + return _mob; + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java b/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java new file mode 100644 index 000000000..88cd7a86f --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java @@ -0,0 +1,137 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +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; + +public class ReplacementBlock +{ + protected byte _hasMeta; + protected int _meta; + protected final Block _block; + protected final NBTTagCompound _tileTag; + + /** + * Called to replace a block in the world. + * @param world The world object + * @param x The X coord + * @param y The Y coord + * @param z The Z coord + * @param stack The ItemStack being used to replace the block (may be null) + * @return True if the block was set successfully + */ + public boolean replaceBlock(World world, int x, int y, int z, ItemStack stack) + { + int meta = getMeta(world, x, y, z, stack); + if (world.setBlock(x, y, z, _block, meta, 3)) + { + if (hasTag(stack) && _block.hasTileEntity(meta)) + { + TileEntity tile = world.getTileEntity(x, y, z); + if (tile != null) + tile.readFromNBT(getTag(world, x, y, z, stack)); + } + return true; + } + return false; + } + + /** + * Called to get the metadata of the replacement block in the world. + * @param world The world object + * @param x The X coord + * @param y The Y coord + * @param z The Z coord + * @param stack The ItemStack being used to replace the block (may be null) + * @return The metadata of the block + */ + protected int getMeta(World world, int x, int y, int z, ItemStack stack) + { + int m = 0; + if (_hasMeta > 0) + { + if (_hasMeta > 1) + return _meta; + m = stack.getItemDamage(); + Item item = stack.getItem(); + if (item instanceof ItemBlock) + m = ((ItemBlock)item).getMetadata(m); + } + return m; + } + + /** + * Called to set the metdata of this ReplacementBlock to a fixed value + * @param meta The metadata of the block + * @return This instance + */ + public ReplacementBlock setMeta(int meta) + { + if (meta >= 0) + { + _hasMeta = 2; + _meta = meta; + } + return this; + } + + /** + * Called to set the metdata of this ReplacementBlock to a value read from an ItemStack + * @param meta The metadata of the block + * @return This instance + */ + public ReplacementBlock setMeta(boolean hasMeta) + { + _hasMeta = (byte) (hasMeta ? 1 : 0); + return this; + } + + /** + * Called to get the NBTTagCompound a TileEntity will read its state from + * @param world The world object + * @param x The X coord + * @param y The Y coord + * @param z The Z coord + * @param stack The ItemStack being used to replace the block (may be null) + * @return The NBTTagCompound a TileEntity will read its state from + */ + protected NBTTagCompound getTag(World world, int x, int y, int z, ItemStack stack) + { + return _tileTag; + } + + /** + * Called to see if a TileEntity should have its state set + * @param stack The ItemStack being used to replace the block (may be null) + * @return True if the TileEntity should have its state set + */ + protected boolean hasTag(ItemStack stack) + { + return _tileTag != null; + } + + public ReplacementBlock(Item block) + { + this(Block.getBlockFromItem(block)); + } + + public ReplacementBlock(Item block, NBTTagCompound tag) + { + this(Block.getBlockFromItem(block), tag); + } + + public ReplacementBlock(Block block) + { + this(block, null); + } + + public ReplacementBlock(Block block, NBTTagCompound tag) + { + _block = block; + _tileTag = tag; + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java b/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java new file mode 100644 index 000000000..3d075fa3b --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java @@ -0,0 +1,72 @@ +package powercrystals.minefactoryreloaded.api; + +import net.minecraft.item.ItemStack; + +public class ValuedItem +{ + public final int value; + public final ItemStack item; + public final String key; + public final Object object; + + public ValuedItem(int v, ItemStack i) + { + value = v; + item = i; + key = null; + object = null; + } + + public ValuedItem(String v, Object i) + { + value = -1; + item = null; + key = v; + object = i; + } + + /** + * Presently unused but included so that if they do get used in the future, + * people including this in their jar and loading before MFR don't destroy everyone + */ + + public ValuedItem(int v, Object i) + { + value = v; + item = null; + key = null; + object = i; + } + + public ValuedItem(String v, ItemStack i) + { + value = -1; + item = i; + key = v; + object = null; + } + + public ValuedItem(int v, String k, ItemStack i) + { + value = v; + item = i; + key = k; + object = null; + } + + public ValuedItem(int v, String k, Object i) + { + value = v; + item = null; + key = k; + object = i; + } + + public ValuedItem(int v, String k, ItemStack i, Object o) + { + value = v; + item = i; + key = k; + object = o; + } +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java new file mode 100644 index 000000000..b6b8a23df --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java @@ -0,0 +1,28 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.IChatComponent; +import net.minecraft.world.IBlockAccess; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.List; + +/** + * Defines a Block that can print information about itself using the RedNet Meter. This must be implemented on your Block class. + */ +public interface IRedNetInfo +{ + /** + * This function appends information to a list provided to it. + * + * @param world Reference to the world. + * @param x X coordinate of the block. + * @param y Y coordinate of the block. + * @param z Z coordinate of the block. + * @param side The side of the block that is being queried. + * @param player Player doing the querying - this can be NULL. + * @param info The list that the information should be appended to. + */ + public void getRedNetInfo(IBlockAccess world, int x, int y, int z, + ForgeDirection side, EntityPlayer player, List info); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java new file mode 100644 index 000000000..a0f8b7094 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java @@ -0,0 +1,51 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection; + +/** + * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. + *

+ * Note that when you implement this, the RedNet network makes several assumptions about your code - + * It will not clamp values to 0 <= x <= 15. This means you must be able to accept any possible integer + * without crashing, even negatives. It will also assume that calling the onInput(s)Changed() methods + * are sufficient, and will not issue block updates. In Single mode, it will call onInputChanged. + *

+ * RedNet cables have their subnets indicated to the user by colored bands on the cable. + * The color of a given subnet is the same as the wool with metadata equal to the subnet number. + *

+ * For reference:
+ * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, + * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black + */ +public interface IRedNetInputNode extends IRedNetConnection +{ + /** + * Called when the input values to this block change. Only called if your block is connected in "All" mode. + * Do not issue a network value update from inside this method call; it will be ignored. Issue your updates + * on the next tick. + * + * @param world The world this block is in. + * @param x This block's X coordinate. + * @param y This block's Y coordinate. + * @param z This block's Z coordinate. + * @param side The side the input values are being changed on. + * @param inputValues The new set of input values. This array will be 16 elements long. Do not alter or cache. + */ + public void onInputsChanged(World world, int x, int y, int z, ForgeDirection side, int[] inputValues); + + /** + * Called when the input value to this block changes. Only called if your block is connected in "Single" mode. + * Do not issue a network value update from inside this method call; it will be ignored. Issue your updates + * on the next tick. + * + * @param world The world this block is in. + * @param x This block's X coordinate. + * @param y This block's Y coordinate. + * @param z This block's Z coordinate. + * @param side The side the input values are being changed on. + * @param inputValue The new input value + */ + public void onInputChanged(World world, int x, int y, int z, ForgeDirection side, int inputValue); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java new file mode 100644 index 000000000..981ce06b6 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java @@ -0,0 +1,19 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +import net.minecraft.nbt.NBTTagCompound; + +public interface IRedNetLogicCircuit +{ + public byte getInputCount(); + + public byte getOutputCount(); + + public int[] recalculateOutputValues(long worldTime, int[] inputValues); + + public String getUnlocalizedName(); + public String getInputPinLabel(int pin); + public String getOutputPinLabel(int pin); + + public void readFromNBT(NBTTagCompound tag); + public void writeToNBT(NBTTagCompound tag); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java new file mode 100644 index 000000000..dd05969e9 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java @@ -0,0 +1,36 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +/** + * + * @author skyboy + */ +public interface IRedNetLogicPoint +{ + /** + * + * @param out + * @return + */ + public void transformOutput(int[] out); + + /** + * + * @param out + * @return + */ + public void transformOutput(int out); + + /** + * + * @param in + * @return + */ + public int[] transformInput(int[] in); + + /** + * + * @param in + * @return + */ + public int transformInput(int in); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java new file mode 100644 index 000000000..c9fb0bf81 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java @@ -0,0 +1,32 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * + * You should not implement this yourself. Instead, use this to look for cables to notify from your IRedNetOmniNode as this does not + * require a block update. This will be implemented on the cable's Block class. + * + */ +public interface IRedNetNetworkContainer +{ + /** + * Tells the network to recalculate all subnets. + * @param world The world this cable is in. + * @param x The x-coordinate of this cable. + * @param x The y-coordinate of this cable. + * @param x The z-coordinate of this cable. + */ + public void updateNetwork(World world, int x, int y, int z, ForgeDirection from); + + /** + * Tells the network to recalculate a specific subnet. + * @param world The world this cable is in. + * @param x The x-coordinate of this cable. + * @param x The y-coordinate of this cable. + * @param x The z-coordinate of this cable. + * @param subnet The subnet to recalculate. + */ + public void updateNetwork(World world, int x, int y, int z, int subnet, ForgeDirection from); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java new file mode 100644 index 000000000..f2bdf397c --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java @@ -0,0 +1,22 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +/** + * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. + *

+ * Note that when you implement this, the RedNet network makes several assumptions about your code - + * It will not clamp values to 0 <= x <= 15. This means you must be able to accept any possible integer + * without crashing, even negatives. It will also assume that calling the onInput(s)Changed() methods + * are sufficient, and will not issue block updates. It will never call the vanilla redstone output + * methods, and will only query the methods contained in this interface. + *

+ * RedNet cables have their subnets indicated to the user by colored bands on the cable. + * The color of a given subnet is the same as the wool with metadata equal to the subnet number. + *

+ * For reference:
+ * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, + * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black + */ +public interface IRedNetOmniNode extends IRedNetInputNode, IRedNetOutputNode +{ + // this is merely provided for convenience +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java new file mode 100644 index 000000000..8a0b41568 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java @@ -0,0 +1,50 @@ +package powercrystals.minefactoryreloaded.api.rednet; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection; + +/** + * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. + *

+ * Note that when you implement this, the RedNet network makes several assumptions about your code - + * It will never call the vanilla redstone output methods, querying only the methods contained in + * this interface, and will not issue block updates. + *

+ * RedNet cables have their subnets indicated to the user by colored bands on the cable. + * The color of a given subnet is the same as the wool with metadata equal to the subnet number. + *

+ * For reference:
+ * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, + * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black + */ +public interface IRedNetOutputNode extends IRedNetConnection +{ + /** + * Returns the output values of this RedNet node. + * This array must be 16 elements long. + * Only called if your block is connected in "All" mode. + * + * @param world The world this block is in. + * @param x This block's X coordinate. + * @param y This block's Y coordinate. + * @param z This block's Z coordinate. + * @param side The side the output values are required for. + * @return The output values. + */ + public int[] getOutputValues(World world, int x, int y, int z, ForgeDirection side); + + /** + * Returns the output value of this RedNet node for a given subnet. + * Must be the same as getOutputValues(world, x, y, z, side)[subnet]. + * + * @param world The world this block is in. + * @param x This block's X coordinate. + * @param y This block's Y coordinate. + * @param z This block's Z coordinate. + * @param side The side the output value is required for. + * @param subnet The subnet to get the output value for (0-15). + * @return The output value. + */ + public int getOutputValue(World world, int x, int y, int z, ForgeDirection side, int subnet); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java new file mode 100644 index 000000000..003800d8f --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java @@ -0,0 +1,26 @@ +package powercrystals.minefactoryreloaded.api.rednet.connectivity; + +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +/** + * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. + */ +public interface IRedNetConnection +{ + /** + * Returns the connection type of this Block. If this value must be changed + * while the block is alive, it must notify neighbors of a change. + *

+ * For nodes that want to interact with rednet, + * see IRedNetInputNode, IRedNetOutputNode, and IRedNetOmniNode + * + * @param world The world this block is in. + * @param x This block's X coordinate. + * @param y This block's Y coordinate. + * @param z This block's Z coordinate. + * @param side The side that connection information is required for. + * @return The connection type. + */ + public RedNetConnectionType getConnectionType(World world, int x, int y, int z, ForgeDirection side); +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java new file mode 100644 index 000000000..89de12b13 --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java @@ -0,0 +1,11 @@ +package powercrystals.minefactoryreloaded.api.rednet.connectivity; + +/** + * This must be implemented on your Block class. + *

+ * RedNet cables will treat your block similar to a vanilla block that's not redstone active. + */ +public interface IRedNetDecorative +{ + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java new file mode 100644 index 000000000..16225a74f --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java @@ -0,0 +1,13 @@ +package powercrystals.minefactoryreloaded.api.rednet.connectivity; + +/** + * This must be implemented on your Block class. + *

+ * RedNet cables will not connect to your block. + *
+ * This behavior can be overridden in subclasses by IRedNetConnection + */ +public interface IRedNetNoConnection +{ + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java new file mode 100644 index 000000000..f3784cfbf --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java @@ -0,0 +1,10 @@ +package powercrystals.minefactoryreloaded.api.rednet.connectivity; + +/** + * This must be implemented on your Block class. + *

+ * RedNet cables will treat your block similar to a redstone dust, and subtract one from the power value. + */ +public interface IRedstoneAlike { + +} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java new file mode 100644 index 000000000..08ba24c1e --- /dev/null +++ b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java @@ -0,0 +1,86 @@ +package powercrystals.minefactoryreloaded.api.rednet.connectivity; + +import java.util.HashMap; +import java.util.Map; + +/** + * Defines how RedNet cable connects to a block + *

+ * None: RedNet will never connect to this block (if this is all you want: use IRedNetNoConnection) + *

+ * CableSingle: Connections will use the cable renderer with a single band, best used for whole blocks + *
+ * PlateSingle: Connections will use the plate renderer with a single band, used for conveyers and rails + *

+ * CableAll: Connections permit access to all 16 bands + *
+ * PlateAll: Connections permit access to all 16 bands + *

+ * Forced connection modes are best used for decoration blocks: RedNet will not connect normally, + * but will if the user forces it. Typically, IRedNetDecorative is desired for this instead + *

+ * ForcedCableSingle: Connections permit access to a single band, only when the cable is in forced connection mode + *
+ * ForcedPlateSingle: Connections permit access to a single band, only when the cable is in forced connection mode + *

+ * ForcedCableAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode + *
+ * ForcedPlateAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode + *

+ * The decorative nodes are for when you want rednet to decide how to connect to your block, + * but also need to receive full updates from the network. + *

+ * DecorativeSingle: Connections permit access to a single band, using standard connection logic + *
+ * DecorativeAll: Connections permit access to all 16 bands, using standard connection logic + *
+ * ForcedDecorativeSingle: Connections permit access to a single band, only when the cable is in forced connection mode + *
+ * ForcedDecorativeAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode + */ +public enum RedNetConnectionType +{ + None, // 0; 0000000 + CableSingle, // 11; 0001011 + PlateSingle, // 13; 0001101 + CableAll, // 19; 0010011 + PlateAll, // 21; 0010101 + ForcedCableSingle, // 43; 0101011 + ForcedPlateSingle, // 45; 0101101 + ForcedCableAll, // 51; 0110011 + ForcedPlateAll, // 53; 0110101 + DecorativeSingle, // NA; 0001001 + DecorativeAll, // NA; 0010001 + ForcedDecorativeSingle, // NA; 0101001 + ForcedDecorativeAll; // NA; 0110001 + + public final boolean isConnected = this.ordinal() != 0; // 0 bit (mask: 1) + public final boolean isSingleSubnet = this.name().endsWith("Single"); // 3 bit (mask: 8) + public final boolean isAllSubnets = this.name().endsWith("All"); // 4 bit (mask: 16) + public final boolean isPlate = this.name().contains("Plate"); // 2 bit (mask: 4) + public final boolean isCable = this.name().contains("Cable"); // 1 bit (mask: 2) + public final boolean isConnectionForced = this.name().startsWith("Forced"); // 5 bit (mask: 32) + public final boolean isDecorative = this.name().contains("Decorative"); + public final short flags = toFlags(isConnected, isCable, isPlate, + isSingleSubnet, isAllSubnets, isConnectionForced); + + public static final RedNetConnectionType fromFlags(short flags) + { + return connections.get(flags); + } + + private static final short toFlags(boolean ...flags) + { + short ret = 0; + for (int i = flags.length; i --> 0;) + ret |= (flags[i] ? 1 : 0) << i; + return ret; + } + + private static final Map connections = new HashMap(); + + static { + for (RedNetConnectionType type : RedNetConnectionType.values()) + connections.put(type.flags, type); + } +} diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 825a39cef..770a179ed 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -57,7 +57,7 @@ tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input item.actuallyadditions.itemPhantomConnector.name=Phantom Connector tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! -tooltip.actuallyadditions.itemPhantomConnector.desc.2=Press Control to clear the stored TileEntity +tooltip.actuallyadditions.itemPhantomConnector.desc.2=Hold ALT to clear the stored TileEntity item.actuallyadditions.itemCanolaSeed.name=Canola Seeds tooltip.actuallyadditions.itemCanolaSeed.desc=Grows on Grass! From 1ea12b89aeb61698a5b92c2d9404667c5305fe97 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 22 May 2015 22:12:59 +0200 Subject: [PATCH 04/29] Updated to 0.0.5.0! --- newestVersion.txt | 2 +- .../ellpeck/actuallyadditions/blocks/BlockPlant.java | 3 ++- .../actuallyadditions/config/values/ConfigIntValues.java | 9 ++++++--- .../actuallyadditions/tile/TileEntityCanolaPress.java | 5 ----- .../actuallyadditions/tile/TileEntityCoalGenerator.java | 4 ++-- .../tile/TileEntityFermentingBarrel.java | 9 ++------- .../tile/TileEntityGreenhouseGlass.java | 5 ++--- .../actuallyadditions/tile/TileEntityOilGenerator.java | 9 +++++---- .../actuallyadditions/tile/TileEntityPhantomface.java | 2 +- .../resources/assets/actuallyadditions/lang/en_US.lang | 2 +- 10 files changed, 22 insertions(+), 28 deletions(-) diff --git a/newestVersion.txt b/newestVersion.txt index b3a35a712..79ca37a9a 100644 --- a/newestVersion.txt +++ b/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.4.4 \ No newline at end of file +1.7.10-0.0.5.0 \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index d08f25789..8f29d1fc5 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -52,7 +52,8 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar ret.add(new ItemStack(this.seedItem)); } } - ret.add(this.returnItem.copy()); + if(this == InitBlocks.blockCanola) ret.add(new ItemStack(this.returnItem.getItem(), new Random().nextInt(3)+3, this.returnItem.getItemDamage())); + else ret.add(this.returnItem.copy()); } return ret; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index 42506dfdd..f4ad51d58 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -61,15 +61,18 @@ public enum ConfigIntValues{ FURNACE_ENERGY_USED("Energy Use: Double Furnace", ConfigCategories.MACHINE_VALUES, 25, 1, 500, "The Amount of Energy used by the Double Furnace per Tick"), PRESS_PROCESSING_TIME("Canola Press: Processing Time", ConfigCategories.MACHINE_VALUES, 30, 1, 1000, "The Amount of time it takes to process one Canola"), - PRESS_MB_PRODUCED("Canola Press: mB Produced", ConfigCategories.MACHINE_VALUES, 30, 1, 5000, "The Amount of Canola Oil produced from one Canola"), + PRESS_MB_PRODUCED("Canola Press: mB Produced", ConfigCategories.MACHINE_VALUES, 100, 1, 5000, "The Amount of Canola Oil produced from one Canola"), PRESS_ENERGY_USED("Energy Use: Canola Press", ConfigCategories.MACHINE_VALUES, 35, 10, 500, "The Amount of Energy used by the Canola Press per Tick"), BARREL_MB_PRODUCED("Fermenting Barrel: mB Produced", ConfigCategories.MACHINE_VALUES, 50, 1, 3000, "The Amount of mB produced by the Barrel per cycle"), BARREL_PROCESSING_TIME("Fermenting Barrel: Processing Time", ConfigCategories.MACHINE_VALUES, 100, 1, 5000, "The Amount of time it takes to process one Canola Oil to Oil"), - COAL_GEN_ENERGY_PRODUCED("Coal Generator: Energy Produced", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Energy generated by the Coal Generator"), - PHANTOMFACE_RANGE("Phantomface: Default Range", ConfigCategories.MACHINE_VALUES, 16, 3, 100, "The Default Range of the Phantomface"); + PHANTOMFACE_RANGE("Phantomface: Default Range", ConfigCategories.MACHINE_VALUES, 16, 3, 100, "The Default Range of the Phantomface"), + + OIL_GEN_ENERGY_PRODUCED("Oil Generator: Energy Produced", ConfigCategories.MACHINE_VALUES, 76, 1, 500, "The Amount of Energy generated by the Oil Generator"), + OIL_GEN_FUEL_USED("Oil Generator: Fuel Usage", ConfigCategories.MACHINE_VALUES, 50, 1, 300, "The Amount of Fuel used per Burnup in the Oil Generator"), + OIL_GEN_BURN_TIME("Oil Generator: Burn Time", ConfigCategories.MACHINE_VALUES, 100, 1, 1000, "The Amount of Time Fuel keeps burning for"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index bd19b96cd..19255fb29 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -61,12 +61,7 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE if(this.currentProcessTime > 0) this.storage.extractEnergy(energyUsedPerTick, false); if(this.tank.getFluidAmount() > 0){ - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, this.tank); WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.tank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, this.tank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, this.tank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, this.tank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, this.tank); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java index f89c9156a..7fbb4b197 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java @@ -13,7 +13,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCoalGenerator extends TileEntityInventoryBase implements IEnergyReceiver{ - public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + public EnergyStorage storage = new EnergyStorage(60000, energyProducedPerTick+50); public static int energyProducedPerTick = ConfigIntValues.COAL_GEN_ENERGY_PRODUCED.getValue(); @@ -34,7 +34,7 @@ public class TileEntityCoalGenerator extends TileEntityInventoryBase implements this.storage.receiveEnergy(energyProducedPerTick, false); } - if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + if(energyProducedPerTick*100 <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ if(this.currentBurnTime <= 0 && this.slots[0] != null && TileEntityFurnace.getItemBurnTime(this.slots[0]) > 0){ this.maxBurnTime = TileEntityFurnace.getItemBurnTime(this.slots[0]); this.currentBurnTime = this.maxBurnTime; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java index b9c15ad2e..cb9e2883b 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -61,12 +61,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen } if(this.oilTank.getFluidAmount() > 0){ - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, this.oilTank); WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.oilTank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, this.oilTank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, this.oilTank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, this.oilTank); - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, this.oilTank); } } } @@ -121,7 +116,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ - if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.canolaTank.fill(resource, doFill); + if(from != ForgeDirection.DOWN && resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.canolaTank.fill(resource, doFill); return 0; } @@ -138,7 +133,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean canFill(ForgeDirection from, Fluid fluid){ - return fluid == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName()); + return from != ForgeDirection.DOWN && fluid == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java index c59eea2dc..9b7439bf4 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java @@ -1,6 +1,7 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.FakePlayerUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockAir; import net.minecraft.block.BlockGrass; @@ -9,8 +10,6 @@ import net.minecraft.init.Items; import net.minecraft.item.ItemDye; import net.minecraft.item.ItemStack; import net.minecraft.util.ChunkCoordinates; -import net.minecraft.world.WorldServer; -import net.minecraftforge.common.util.FakePlayerFactory; import java.util.Random; @@ -53,6 +52,6 @@ public class TileEntityGreenhouseGlass extends TileEntityBase{ } public boolean applyBonemealEffect(ChunkCoordinates coords){ - return ItemDye.applyBonemeal(new ItemStack(Items.dye, 1, 15), worldObj, coords.posX, coords.posY, coords.posZ, FakePlayerFactory.getMinecraft((WorldServer)worldObj)); + return ItemDye.applyBonemeal(new ItemStack(Items.dye, 1, 15), worldObj, coords.posX, coords.posY, coords.posZ, FakePlayerUtil.newFakePlayer(worldObj)); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index ddb04823a..bb89e77f8 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -5,6 +5,7 @@ import cofh.api.energy.IEnergyProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.init.Items; @@ -19,10 +20,10 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); - public static int energyProducedPerTick = 76; + public static int energyProducedPerTick = ConfigIntValues.OIL_GEN_ENERGY_PRODUCED.getValue(); - public int fuelUsedPerBurnup = 50; - public int maxBurnTime = 100; + public int fuelUsedPerBurnup = ConfigIntValues.OIL_GEN_FUEL_USED.getValue(); + public int maxBurnTime = ConfigIntValues.OIL_GEN_BURN_TIME.getValue(); public int currentBurnTime; @@ -40,7 +41,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I this.storage.receiveEnergy(energyProducedPerTick, false); } - if(energyProducedPerTick <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + if(energyProducedPerTick*this.maxBurnTime/2 <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ if(this.currentBurnTime <= 0 && this.tank.getFluidAmount() >= this.fuelUsedPerBurnup){ this.currentBurnTime = this.maxBurnTime; this.tank.drain(this.fuelUsedPerBurnup, true); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 77ff04357..424ffbe5a 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -34,7 +34,7 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } public boolean isBoundTileInRage(){ - if(this.hasBoundTile() && this.boundTile.getWorldObj().loadedTileEntityList.contains(this.boundTile)){ + if(this.hasBoundTile()){ int xDif = this.boundTile.xCoord-this.xCoord; int yDif = this.boundTile.yCoord-this.yCoord; int zDif = this.boundTile.zCoord-this.zCoord; diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 770a179ed..f68e00458 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -52,7 +52,7 @@ item.actuallyadditions.itemBucketOil.name=Oil Bucket tooltip.actuallyadditions.itemBucketOil.desc=Made in a Fermenting Barrel from Canola Oil tile.actuallyadditions.blockPhantomface.name=Phantomface -tooltip.actuallyadditions.blockPhantomface.desc.1=Like a Pipe, only Wireless! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomface.desc.1=Like a Hopper-Chain, only Wireless! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input into connected Blocks! item.actuallyadditions.itemPhantomConnector.name=Phantom Connector From a5a79fb95c70d6baf427d20741f627dd37847629 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 24 May 2015 13:58:34 +0200 Subject: [PATCH 05/29] Fixed a Crusher Bug with 0.0.5.0! --- build.gradle | 7 +------ newestVersion.txt | 2 +- .../ellpeck/actuallyadditions/PLANNED.txt | 18 ++++++++-------- .../crafting/GrinderCrafting.java | 1 + .../event/RenderPlayerEventAA.java | 6 +++--- .../inventory/ContainerCanolaPress.java | 1 - .../recipe/GrinderRecipeHandler.java | 1 - .../recipe/GrinderRecipes.java | 13 +++++++----- .../actuallyadditions/util/StringUtil.java | 2 -- .../actuallyadditions/util/WorldUtil.java | 21 ++++++++++++------- src/main/resources/mcmod.info | 2 +- 11 files changed, 38 insertions(+), 36 deletions(-) diff --git a/build.gradle b/build.gradle index 63a38bcf0..7526bf9ef 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.0" +version = "1.7.10-0.0.5.1" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" @@ -40,11 +40,6 @@ repositories { dependencies { compile "mcp.mobius.waila:Waila:1.5.6_1.7.10" - - /*When Compiling from Github, you will need to have this file present - because InventoryTweaks doesn't have a Maven Repo. - But no one is going to download and compile this anyway, so it doesn't really matter. */ - compile files("lib/InventoryTweaks-api-1.58-147.jar") } task copyChickenBones(type: Copy, dependsOn: "extractUserDev") { diff --git a/newestVersion.txt b/newestVersion.txt index 79ca37a9a..6b0a207ec 100644 --- a/newestVersion.txt +++ b/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.0 \ No newline at end of file +1.7.10-0.0.5.1 \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index cc501acef..8f389e4b3 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -10,10 +10,11 @@ -Instant Teleport Device -Teleports Players to where they look (Much like the Bukkit Compass) --Magnet - -Pulls Mobs and Items towards it - -Has a certain Redstone Output depending on Mob Amount - -Can be toggled On and Off +-Ender Attractor / Repulsor + -Attracts/Repulses Mobs + -Has an aggressive and a friendly version + -Maybe for Items + -Crafted with an Ender Casing -Void Bag -Sucks up picked up Items @@ -57,9 +58,6 @@ -File Jukebox -Plays Sound Files put into your Minecraft Folder --Oil Plant - -Used to make Oil (For use with other mods' machines) - -Pharmacy Plants -Give you different effects @@ -80,7 +78,9 @@ -Phantom Chest -Is bound to Inventory on Right-Click -Allows you to open the bound Inventory when placed down - -Only accessible with Pipes etc. - -ISided like the bound Block -Range of 10, Range Upgrade adds 15 Range -Nether Star allows direct GUI Access and adds 50 Range + +-Thermopile + -Needs a hot and a cold fluid + -Depending on the fluids, it generates more power \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index 231dade0f..4f5703b1c 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -37,6 +37,7 @@ public class GrinderCrafting{ grindRecHan.searchCases.add(new SearchCase("ingot", 1)); grindRecHan.searchCases.add(new SearchCase("gem", 1)); grindRecHan.searchCases.add(new SearchCase("ore", 2)); + grindRecHan.exceptions.add("ingotBrick"); grindRecHan.exceptions.add("ingotBrickNether"); diff --git a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java index d26b563b2..e5d0b7037 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java +++ b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java @@ -13,7 +13,7 @@ public class RenderPlayerEventAA{ private RenderSpecial ellpeckRender = new RenderSpecial(new ModelStandardBlock("Ellpeck")); private RenderSpecial hoseRender = new RenderSpecial(new ModelTorch()); - private RenderSpecial paktoRender = new RenderSpecial(new ModelStandardBlock("Pakto")); + //private RenderSpecial paktoRender = new RenderSpecial(new ModelStandardBlock("Pakto")); private RenderSpecial glenRender = new RenderSpecial(new ModelStandardBlock("Glenthor")); @SubscribeEvent(priority = EventPriority.HIGHEST) @@ -26,10 +26,10 @@ public class RenderPlayerEventAA{ } //Paktosan - if(event.entityPlayer.getUniqueID().equals(UUID.fromString("0bac71ad-9156-487e-9ade-9c5b57274b23"))){ + /*if(event.entityPlayer.getUniqueID().equals(UUID.fromString("0bac71ad-9156-487e-9ade-9c5b57274b23"))){ paktoRender.render(event.entityPlayer, event.partialRenderTick, 0.3F, 1F); return; - } + }*/ //TwoOfEight if(event.entityPlayer.getUniqueID().equals(UUID.fromString("a57d2829-9711-4552-a7de-ee800802f643"))){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java index 4217aa86c..4807e9e9e 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCanolaPress.java @@ -106,7 +106,6 @@ public class ContainerCanolaPress extends Container{ if(slot <= hotbarEnd && slot >= hotbarStart){ this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); } - else if(slot <= inventoryEnd && slot >= inventoryStart){ this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java index ee4b4a5d7..801c315e1 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java @@ -78,5 +78,4 @@ public class GrinderRecipeHandler{ } } } - } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java index 208a5f2d0..28cdafd63 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java @@ -19,18 +19,21 @@ public class GrinderRecipes{ this.recipes.add(new GrinderRecipe(input, outputOne, outputTwo, secondChance)); } - public void registerRecipe(String input, String outputOne, String outputTwo, int secondChance, int outputTwoAmount){ + public void registerRecipe(String input, String outputOne, String outputTwo, int secondChance, int outputAmount){ ArrayList inputStacks = OreDictionary.getOres(input); ArrayList outputOneStacks = OreDictionary.getOres(outputOne); ArrayList outputTwoStacks = OreDictionary.getOres(outputTwo); if(inputStacks != null && !inputStacks.isEmpty()){ - for(ItemStack theInput : inputStacks){ + for(ItemStack anInput : inputStacks){ + ItemStack theInput = anInput.copy(); if(outputOneStacks != null && !outputOneStacks.isEmpty()){ - for(ItemStack theOutputOne : outputOneStacks){ - theOutputOne.stackSize = outputTwoAmount; + for(ItemStack anOutputOne : outputOneStacks){ + ItemStack theOutputOne = anOutputOne.copy(); + theOutputOne.stackSize = outputAmount; if(outputTwoStacks != null && !outputTwoStacks.isEmpty()){ - for(ItemStack theOutputTwo : outputTwoStacks){ + for(ItemStack anOutputTwo : outputTwoStacks){ + ItemStack theOutputTwo = anOutputTwo.copy(); this.registerRecipe(theInput, theOutputOne, theOutputTwo, secondChance); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/StringUtil.java b/src/main/java/ellpeck/actuallyadditions/util/StringUtil.java index 4319d7753..f5326be85 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/StringUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/StringUtil.java @@ -24,8 +24,6 @@ public class StringUtil{ public static final String OBFUSCATED = (char)167 + "k"; public static final String RESET = (char)167 + "r"; - public static final String[] ROMAN_NUMERALS = new String[]{"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X"}; - public static final int DECIMAL_COLOR_WHITE = 16777215; public static final int DECIMAL_COLOR_GRAY_TEXT = 4210752; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 4d088e31d..ccb40a609 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -10,6 +10,7 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; @@ -51,6 +52,10 @@ public class WorldUtil{ public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ if(world instanceof WorldServer){ + if(FluidContainerRegistry.isBucket(stack) && stack.isItemEqual(FluidContainerRegistry.EMPTY_BUCKET)){ + //if() + return false; + } if(stack.getItem() instanceof IPlantable){ if(((IPlantable)stack.getItem()).getPlant(world, x, y, z).canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z)); @@ -86,13 +91,15 @@ public class WorldUtil{ } public static ForgeDirection getDirectionByRotatingSide(int side){ - if(side == 0) return ForgeDirection.UP; - if(side == 1) return ForgeDirection.DOWN; - if(side == 2) return ForgeDirection.NORTH; - if(side == 3) return ForgeDirection.EAST; - if(side == 4) return ForgeDirection.SOUTH; - if(side == 5) return ForgeDirection.WEST; - else return ForgeDirection.UNKNOWN; + switch(side){ + case 0: return ForgeDirection.UP; + case 1: return ForgeDirection.DOWN; + case 2: return ForgeDirection.NORTH; + case 3: return ForgeDirection.EAST; + case 4: return ForgeDirection.SOUTH; + case 5: return ForgeDirection.WEST; + default: return ForgeDirection.UNKNOWN; + } } } diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 74d25c21b..e76c2ffcc 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "ActuallyAdditions", "name": "Actually Additions", "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.5.0", + "version": "0.0.5.1", "mcversion": "1.7.10", "url": "https://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", From f896308888d252f2bd5f8a69b8cd8eb42fb1d944 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Mon, 25 May 2015 17:00:54 +0200 Subject: [PATCH 06/29] -Fixed another Crusher Bug... derp! --- build.gradle | 2 +- newestVersion.txt | 2 +- .../ellpeck/actuallyadditions/PLANNED.txt | 18 +- .../blocks/BlockCompost.java | 2 - .../blocks/BlockContainerBase.java | 15 ++ .../blocks/BlockPhantomface.java | 63 +++++-- .../actuallyadditions/blocks/InitBlocks.java | 10 +- .../crafting/GrinderCrafting.java | 22 +-- .../creative/CreativeTab.java | 5 +- .../inventory/ContainerPhantomPlacer.java | 80 +++++++++ .../inventory/GuiHandler.java | 7 + .../inventory/GuiPhantomPlacer.java | 47 ++++++ .../items/ItemPhantomConnector.java | 102 ++++++++---- ...andler.java => GrinderRecipeRegistry.java} | 10 +- .../recipe/GrinderRecipes.java | 25 +-- .../tile/TileEntityBase.java | 2 + .../tile/TileEntityBreaker.java | 30 ++-- .../tile/TileEntityCanolaPress.java | 2 +- .../tile/TileEntityCompost.java | 7 +- .../tile/TileEntityFermentingBarrel.java | 8 +- .../tile/TileEntityOilGenerator.java | 4 +- .../tile/TileEntityPhantomPlacer.java | 154 ++++++++++++++++++ .../tile/TileEntityPhantomface.java | 25 ++- .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 13 +- .../assets/actuallyadditions/lang/en_US.lang | 24 ++- src/main/resources/mcmod.info | 2 +- 27 files changed, 536 insertions(+), 147 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerPhantomPlacer.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java rename src/main/java/ellpeck/actuallyadditions/recipe/{GrinderRecipeHandler.java => GrinderRecipeRegistry.java} (94%) create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java diff --git a/build.gradle b/build.gradle index 7526bf9ef..f4c2ae758 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.1" +version = "1.7.10-0.0.5.2" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/newestVersion.txt b/newestVersion.txt index 6b0a207ec..da8ef1323 100644 --- a/newestVersion.txt +++ b/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.1 \ No newline at end of file +1.7.10-0.0.5.2 \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index 8f389e4b3..06c52a7ef 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -75,12 +75,16 @@ -Produces Lava from Cobblestone -Has Upgrade Slots --Phantom Chest - -Is bound to Inventory on Right-Click - -Allows you to open the bound Inventory when placed down - -Range of 10, Range Upgrade adds 15 Range - -Nether Star allows direct GUI Access and adds 50 Range - -Thermopile -Needs a hot and a cold fluid - -Depending on the fluids, it generates more power \ No newline at end of file + -Depending on the fluids, it generates more power + +-More Effect Rings + -Ring of Growth: Lets Plants grow, more Reach with Tier 2 + -Ring of Thorns: Hurts Attackers when they hit you with a Projectile + -Ring of Water Walking + -Ring of Flight + -Ring of Aquadive: Fast underwater movement + -Ring of Suction: Sucks up Items in the area + -Ring of Water Absorption: Removes Water around + -Ring of Striptease (Or something like that): Attacker lose parts of their Armor \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java index 2fb26fdc5..8953a197e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java @@ -53,8 +53,6 @@ public class BlockCompost extends BlockContainerBase implements INameableItem{ else if(tile.slots[0] != null && (stackPlayer == null || (stackPlayer.getItem() instanceof ItemFertilizer && stackPlayer.stackSize <= stackPlayer.getMaxStackSize() - tile.slots[0].stackSize)) && tile.slots[0].getItem() instanceof ItemFertilizer){ if(stackPlayer == null) player.inventory.setInventorySlotContents(player.inventory.currentItem, tile.slots[0].copy()); else player.getCurrentEquippedItem().stackSize+=tile.slots[0].stackSize; - //TODO Add again when readding Achievements - //player.addStat(InitAchievements.achievementCraftFertilizer, 1); tile.slots[0] = null; } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java index f7000482d..001823ba0 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java @@ -4,8 +4,11 @@ import ellpeck.actuallyadditions.tile.TileEntityInventoryBase; import net.minecraft.block.BlockContainer; import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import java.util.Random; @@ -38,4 +41,16 @@ public abstract class BlockContainerBase extends BlockContainer{ } return tileEntity; } + + @Override + public boolean hasComparatorInputOverride(){ + return true; + } + + @Override + public int getComparatorInputOverride(World world, int x, int y, int z, int meta){ + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof IInventory) return Container.calcRedstoneFromInventory((IInventory)tile); + return 0; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index da7866f6a..f04cf625c 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -2,6 +2,9 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; @@ -23,13 +26,26 @@ import java.util.List; public class BlockPhantomface extends BlockContainerBase implements INameableItem{ - public BlockPhantomface(){ + public static final int FACE = 0; + public static final int PLACER = 1; + public static final int BREAKER = 2; + + public int type; + + public BlockPhantomface(int type){ super(Material.rock); + this.type = type; this.setHarvestLevel("pickaxe", 0); this.setHardness(1.0F); this.setStepSound(soundTypeStone); } + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + if(this.type == PLACER || this.type == BREAKER) this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + @Override public String getOredictName(){ return this.getName(); @@ -38,26 +54,47 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @Override public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int hitSide, float hitX, float hitY, float hitZ){ if(!world.isRemote){ - TileEntityPhantomface tile = (TileEntityPhantomface)world.getTileEntity(x, y, z); + TileEntity tile = world.getTileEntity(x, y, z); if(tile != null){ - if(tile.hasBoundTile()){ - if(tile.isBoundTileInRage()){ - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", tile.boundTile.xCoord, tile.boundTile.yCoord, tile.boundTile.zCoord))); - return true; + if(tile instanceof TileEntityPhantomface){ + TileEntityPhantomface phantom = (TileEntityPhantomface)tile; + if(phantom.hasBoundTile()){ + if(phantom.isBoundTileInRage()){ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); + } + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); } - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", tile.boundTile.xCoord, tile.boundTile.yCoord, tile.boundTile.zCoord))); - return true; + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); + } + + else if(tile instanceof TileEntityPhantomPlacer){ + if(player.isSneaking()){ + TileEntityPhantomPlacer phantom = (TileEntityPhantomPlacer)tile; + if(phantom.hasBoundPosition()){ + if(phantom.isBoundPositionInRange()){ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); + } + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); + } + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); + } + else player.openGui(ActuallyAdditions.instance, GuiHandler.PHANTOM_PLACER_ID, world, x, y, z); } - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); - return true; } } - return false; + return true; } @Override public TileEntity createNewTileEntity(World world, int par2){ - return new TileEntityPhantomface(); + switch(this.type){ + case PLACER: + return new TileEntityPhantomPlacer(); + case BREAKER: + return new TileEntityPhantomPlacer.TileEntityPhantomBreaker(); + default: + return new TileEntityPhantomface(); + } } @Override @@ -73,7 +110,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @Override public String getName(){ - return "blockPhantomface"; + return this.type == PLACER ? "blockPhantomPlacer" : (this.type == BREAKER ? "blockPhantomBreaker" : "blockPhantomface"); } public static class TheItemBlock extends ItemBlock{ diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 1835c493e..3423e75f8 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -46,6 +46,8 @@ public class InitBlocks{ public static Block blockOilGenerator; public static Block blockPhantomface; + //public static Block blockPhantomPlacer; + //public static Block blockPhantomBreaker; public static void init(){ Util.logInfo("Initializing Blocks..."); @@ -63,9 +65,15 @@ public class InitBlocks{ blockCanolaPress = new BlockCanolaPress(); BlockUtil.register(blockCanolaPress, BlockCanolaPress.TheItemBlock.class); - blockPhantomface = new BlockPhantomface(); + blockPhantomface = new BlockPhantomface(BlockPhantomface.FACE); BlockUtil.register(blockPhantomface, BlockPhantomface.TheItemBlock.class); + //blockPhantomPlacer = new BlockPhantomface(BlockPhantomface.PLACER); + //BlockUtil.register(blockPhantomPlacer, BlockPhantomface.TheItemBlock.class); + + //blockPhantomBreaker = new BlockPhantomface(BlockPhantomface.BREAKER); + //BlockUtil.register(blockPhantomBreaker, BlockPhantomface.TheItemBlock.class); + blockCoalGenerator = new BlockCoalGenerator(); BlockUtil.register(blockCoalGenerator, BlockCoalGenerator.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index 4f5703b1c..3ef1a8d0b 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -3,8 +3,8 @@ package ellpeck.actuallyadditions.crafting; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheDusts; import ellpeck.actuallyadditions.items.metalists.TheFoods; -import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler; -import ellpeck.actuallyadditions.recipe.GrinderRecipeHandler.SearchCase; +import ellpeck.actuallyadditions.recipe.GrinderRecipeRegistry; +import ellpeck.actuallyadditions.recipe.GrinderRecipeRegistry.SearchCase; import ellpeck.actuallyadditions.recipe.GrinderRecipes; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; @@ -13,7 +13,7 @@ import net.minecraft.item.ItemStack; public class GrinderCrafting{ - private static GrinderRecipeHandler grindRecHan = GrinderRecipeHandler.instance(); + private static GrinderRecipeRegistry grindRecReg = GrinderRecipeRegistry.instance(); private static GrinderRecipes grindRec = GrinderRecipes.instance(); public static void init(){ @@ -32,15 +32,15 @@ public class GrinderCrafting{ grindRec.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); grindRec.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); - grindRecHan.searchCases.add(new SearchCase("oreNether", 6)); - grindRecHan.searchCases.add(new SearchCase("denseore", 8)); - grindRecHan.searchCases.add(new SearchCase("ingot", 1)); - grindRecHan.searchCases.add(new SearchCase("gem", 1)); - grindRecHan.searchCases.add(new SearchCase("ore", 2)); + grindRecReg.searchCases.add(new SearchCase("oreNether", 6)); + grindRecReg.searchCases.add(new SearchCase("denseore", 8)); + grindRecReg.searchCases.add(new SearchCase("ingot", 1)); + grindRecReg.searchCases.add(new SearchCase("gem", 1)); + grindRecReg.searchCases.add(new SearchCase("ore", 2)); - grindRecHan.exceptions.add("ingotBrick"); - grindRecHan.exceptions.add("ingotBrickNether"); + grindRecReg.exceptions.add("ingotBrick"); + grindRecReg.exceptions.add("ingotBrickNether"); - grindRecHan.registerFinally(); + grindRecReg.registerFinally(); } } diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 3ce8bed67..91dd6468e 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -26,9 +26,12 @@ public class CreativeTab extends CreativeTabs{ public void displayAllReleventItems(List list){ this.list = list; + this.addBlock(InitBlocks.blockPhantomface); + //this.addBlock(InitBlocks.blockPhantomPlacer); + //this.addBlock(InitBlocks.blockPhantomBreaker); this.addBlock(InitBlocks.blockInputter); this.addBlock(InitBlocks.blockInputterAdvanced); - this.addBlock(InitBlocks.blockPhantomface); + this.addBlock(InitBlocks.blockGreenhouseGlass); this.addBlock(InitBlocks.blockGrinder); this.addBlock(InitBlocks.blockGrinderDouble); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerPhantomPlacer.java new file mode 100644 index 000000000..613eb0628 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerPhantomPlacer.java @@ -0,0 +1,80 @@ +package ellpeck.actuallyadditions.inventory; + +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +@InventoryContainer +public class ContainerPhantomPlacer extends Container{ + + private TileEntityPhantomPlacer placer; + + public ContainerPhantomPlacer(InventoryPlayer inventory, TileEntityBase tile){ + this.placer = (TileEntityPhantomPlacer)tile; + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 3; j++){ + this.addSlotToContainer(new Slot(this.placer, j+i*3, 62+j*18, 21+i*18)); + } + } + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.placer.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 9; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, 0, 9, false); + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index bfefb5ec4..d09f57ba6 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -58,6 +58,9 @@ public class GuiHandler implements IGuiHandler{ case OIL_GENERATOR_ID: TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); return new ContainerOilGenerator(entityPlayer.inventory, tileOilGen); + case PHANTOM_PLACER_ID: + TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerPhantomPlacer(entityPlayer.inventory, tilePlacer); default: return null; } @@ -110,6 +113,9 @@ public class GuiHandler implements IGuiHandler{ case OIL_GENERATOR_ID: TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); return new GuiOilGenerator(entityPlayer.inventory, tileOilGen); + case PHANTOM_PLACER_ID: + TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiPhantomPlacer(entityPlayer.inventory, tilePlacer); default: return null; } @@ -130,6 +136,7 @@ public class GuiHandler implements IGuiHandler{ public static final int FERMENTING_BARREL_ID = 12; public static final int COAL_GENERATOR_ID = 13; public static final int OIL_GENERATOR_ID = 14; + public static final int PHANTOM_PLACER_ID = 15; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java new file mode 100644 index 000000000..9c0a99f9e --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java @@ -0,0 +1,47 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiPhantomPlacer extends GuiContainer{ + + private TileEntityPhantomPlacer placer; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiBreaker"); + + public GuiPhantomPlacer(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerPhantomPlacer(inventory, tile)); + this.placer = (TileEntityPhantomPlacer)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.placer.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index 28165a6c2..4fbe46e4e 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ItemUtil; @@ -10,13 +11,13 @@ import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChatComponentText; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; @@ -33,34 +34,56 @@ public class ItemPhantomConnector extends Item implements INameableItem{ @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int par7, float par8, float par9, float par10){ if(!world.isRemote){ + //Passing Data to Phantoms TileEntity tile = world.getTileEntity(x, y, z); - - if(tile != null && tile instanceof TileEntityPhantomface && this.getStoredConnection(stack) != null){ - TileEntity stored = this.getStoredConnection(stack); - if(stored != null && stored.getWorldObj().getTileEntity(stored.xCoord, stored.yCoord, stored.zCoord) == stored){ - ((TileEntityPhantomface)tile).boundTile = stored.getWorldObj().getTileEntity(stored.xCoord, stored.yCoord, stored.zCoord); - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.connected.desc"))); - this.clearStorage(stack); - return true; + if(tile != null){ + //Passing to Face + if(tile instanceof TileEntityPhantomface){ + if(this.checkHasConnection(stack, player)){ + ChunkCoordinates coords = this.getStoredPosition(stack); + TileEntity toStore = this.getStoredWorld(stack).getTileEntity(coords.posX, coords.posY, coords.posZ); + if(toStore != null){ + ((TileEntityPhantomface)tile).boundTile = toStore; + this.clearStorage(stack); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); + return true; + } + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notInventory.desc"))); + } + return false; + } + //Passing to Placer + else if(tile instanceof TileEntityPhantomPlacer){ + if(this.checkHasConnection(stack, player)){ + ((TileEntityPhantomPlacer)tile).boundPosition = this.getStoredPosition(stack); + ((TileEntityPhantomPlacer)tile).boundWorld = this.getStoredWorld(stack); + this.clearStorage(stack); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); + return true; + } + return false; } } - - if(tile != null && !(tile instanceof TileEntityPhantomface) && tile instanceof IInventory){ - this.storeConnection(stack, tile); - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.stored.desc"))); - return true; - } - else{ - if(tile instanceof TileEntityPhantomface) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.noBound.desc"))); - else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.notInventory.desc"))); - } + //Storing Connections + this.storeConnection(stack, x, y, z, world); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.stored.desc"))); + } + return true; + } + + public boolean checkHasConnection(ItemStack stack, EntityPlayer player){ + if(this.getStoredPosition(stack) != null && this.getStoredWorld(stack) != null){ + return true; + } + else{ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.noBound.desc"))); + return false; } - return super.onItemUse(stack, player, world, x, y, z, par7, par8, par9, par10); } @Override public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5){ - if(this.getStoredConnection(stack) == null) this.clearStorage(stack); + if(this.getStoredPosition(stack) == null || this.getStoredWorld(stack) == null) this.clearStorage(stack); } @Override @@ -69,27 +92,35 @@ public class ItemPhantomConnector extends Item implements INameableItem{ return stack; } - public TileEntity getStoredConnection(ItemStack stack){ + public ChunkCoordinates getStoredPosition(ItemStack stack){ NBTTagCompound tag = stack.getTagCompound(); if(tag != null){ int x = tag.getInteger("XCoordOfTileStored"); int y = tag.getInteger("YCoordOfTileStored"); int z = tag.getInteger("ZCoordOfTileStored"); - World world = DimensionManager.getWorld(tag.getInteger("WorldOfTileStored")); - return world.getTileEntity(x, y, z); + if(x == 0 && y == 0 && z == 0) return null; + return new ChunkCoordinates(x, y, z); } return null; } - public void storeConnection(ItemStack stack, TileEntity tile){ + public World getStoredWorld(ItemStack stack){ + NBTTagCompound tag = stack.getTagCompound(); + if(tag != null){ + return DimensionManager.getWorld(tag.getInteger("WorldOfTileStored")); + } + return null; + } + + public void storeConnection(ItemStack stack, int x, int y, int z, World world){ NBTTagCompound tag = stack.getTagCompound(); if(tag == null) tag = new NBTTagCompound(); - tag.setInteger("XCoordOfTileStored", tile.xCoord); - tag.setInteger("YCoordOfTileStored", tile.yCoord); - tag.setInteger("ZCoordOfTileStored", tile.zCoord); - tag.setInteger("WorldOfTileStored", tile.getWorldObj().provider.dimensionId); + tag.setInteger("XCoordOfTileStored", x); + tag.setInteger("YCoordOfTileStored", y); + tag.setInteger("ZCoordOfTileStored", z); + tag.setInteger("WorldOfTileStored", world.provider.dimensionId); stack.setTagCompound(tag); } @@ -108,13 +139,14 @@ public class ItemPhantomConnector extends Item implements INameableItem{ @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { ItemUtil.addInformation(this, list, 2, ""); - TileEntity tile = this.getStoredConnection(stack); - if(tile != null){ + ChunkCoordinates coords = this.getStoredPosition(stack); + World world = this.getStoredWorld(stack); + if(coords != null && world != null){ list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.boundTo.desc") + ":"); - list.add("X: " + tile.xCoord); - list.add("Y: " + tile.yCoord); - list.add("Z: " + tile.zCoord); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.inWorld.desc") + " " + tile.getWorldObj().provider.dimensionId); + list.add("X: " + coords.posX); + list.add("Y: " + coords.posY); + list.add("Z: " + coords.posZ); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.inWorld.desc") + " " + world.provider.dimensionId); } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java similarity index 94% rename from src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java rename to src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java index 801c315e1..ad3741758 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java @@ -8,11 +8,11 @@ import org.apache.logging.log4j.Level; import java.util.ArrayList; -public class GrinderRecipeHandler{ +public class GrinderRecipeRegistry{ - private static final GrinderRecipeHandler instance = new GrinderRecipeHandler(); + private static final GrinderRecipeRegistry instance = new GrinderRecipeRegistry(); - public static GrinderRecipeHandler instance(){ + public static GrinderRecipeRegistry instance(){ return instance; } @@ -58,7 +58,7 @@ public class GrinderRecipeHandler{ ItemStack input = theInput.copy(); ItemStack output = theDust.copy(); output.stackSize = resultAmount; - if(!GrinderRecipes.instance().hasRecipe(inputName, inputWithDustPrefix)){ + if(!GrinderRecipes.instance().hasRecipe(input, output)){ GrinderRecipes.instance().registerRecipe(input, output, null, 0); } } @@ -78,4 +78,4 @@ public class GrinderRecipeHandler{ } } } -} +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java index 28cdafd63..da55d9e4e 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java @@ -57,30 +57,11 @@ public class GrinderRecipes{ return null; } - public boolean hasRecipe(String input, String outputOne){ - boolean containsInput = false; - boolean containsOutput = false; - + public boolean hasRecipe(ItemStack input, ItemStack outputOne){ for(GrinderRecipe recipe : recipes){ - int[] recipeInputIDs = OreDictionary.getOreIDs(recipe.input); - for(int recipeInputID : recipeInputIDs){ - if(input.equals(OreDictionary.getOreName(recipeInputID))){ - containsInput = true; - break; - } - } - - int[] recipeOutputIDs = OreDictionary.getOreIDs(recipe.firstOutput); - for(int recipeOutputID : recipeOutputIDs){ - if(outputOne.equals(OreDictionary.getOreName(recipeOutputID))){ - containsOutput = true; - break; - } - } - - if(containsInput && containsOutput) break; + if(recipe.input.isItemEqual(input) && recipe.firstOutput.isItemEqual(outputOne)) return true; } - return containsInput && containsOutput; + return false; } public int getSecondChance(ItemStack input){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index 202429ee6..dd32a2e02 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -32,6 +32,8 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityOilGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityOilGenerator"); GameRegistry.registerTileEntity(TileEntityCoalGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoalGenerator"); GameRegistry.registerTileEntity(TileEntityPhantomface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomface"); + GameRegistry.registerTileEntity(TileEntityPhantomPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomPlacer"); + GameRegistry.registerTileEntity(TileEntityPhantomPlacer.TileEntityPhantomBreaker.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBreaker"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index ed1893a36..d06e178b4 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -62,17 +62,17 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ int meta = worldObj.getBlockMetadata(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ); drops.addAll(blockToBreak.getDrops(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ, meta, 0)); - if(this.addToInventory(drops, false)){ + if(addToInventory(this.slots, drops, false)){ worldObj.playAuxSFX(2001, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ, Block.getIdFromBlock(blockToBreak) + (meta << 12)); WorldUtil.breakBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord); - this.addToInventory(drops, true); + addToInventory(this.slots, drops, true); this.markDirty(); } } else if(this.isPlacer && worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ)){ - ItemStack removeFalse = this.removeFromInventory(false); + ItemStack removeFalse = removeFromInventory(this.slots, false); if(removeFalse != null && WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, removeFalse)){ - this.removeFromInventory(true); + removeFromInventory(this.slots, true); } } } @@ -95,15 +95,15 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ this.currentTime = compound.getInteger("CurrentTime"); } - public boolean addToInventory(ArrayList stacks, boolean actuallyDo){ + public static boolean addToInventory(ItemStack[] slots, ArrayList stacks, boolean actuallyDo){ int working = 0; for(ItemStack stack : stacks){ - for(int i = 0; i < this.slots.length; i++){ - if(this.slots[i] == null || (this.slots[i].isItemEqual(stack) && this.slots[i].stackSize <= stack.getMaxStackSize()-stack.stackSize)){ + for(int i = 0; i < slots.length; i++){ + if(slots[i] == null || (slots[i].isItemEqual(stack) && slots[i].stackSize <= stack.getMaxStackSize()-stack.stackSize)){ working++; if(actuallyDo){ - if(this.slots[i] == null) this.slots[i] = stack.copy(); - else this.slots[i].stackSize += stack.stackSize; + if(slots[i] == null) slots[i] = stack.copy(); + else slots[i].stackSize += stack.stackSize; } break; } @@ -112,13 +112,13 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ return working >= stacks.size(); } - public ItemStack removeFromInventory(boolean actuallyDo){ - for(int i = 0; i < this.slots.length; i++){ - if(this.slots[i] != null){ - ItemStack slot = this.slots[i].copy(); + public static ItemStack removeFromInventory(ItemStack[] slots, boolean actuallyDo){ + for(int i = 0; i < slots.length; i++){ + if(slots[i] != null){ + ItemStack slot = slots[i].copy(); if(actuallyDo){ - this.slots[i].stackSize--; - if(this.slots[i].stackSize <= 0) this.slots[i] = null; + slots[i].stackSize--; + if(slots[i].stackSize <= 0) slots[i] = null; } return slot; } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index 19255fb29..868b34ee3 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -143,7 +143,7 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ - if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.tank.drain(resource.amount, doDrain); + if(resource.getFluid() == InitBlocks.fluidCanolaOil) return this.tank.drain(resource.amount, doDrain); return null; } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCompost.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCompost.java index 1959426ff..6bd5ae80d 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCompost.java @@ -24,9 +24,12 @@ public class TileEntityCompost extends TileEntityInventoryBase{ if(!worldObj.isRemote){ if(this.slots[0] != null && this.slots[0].stackSize > 0){ - worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, this.slots[0].stackSize + (this.slots[0].getItem() instanceof ItemFertilizer ? 1 : 0), 2); + int toSet = this.slots[0].stackSize + (this.slots[0].getItem() instanceof ItemFertilizer ? 1 : 0); + if(worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != toSet) worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, toSet, 2); + } + else{ + if(worldObj.getBlockMetadata(xCoord, yCoord, zCoord) != 0) worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); } - else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); boolean theFlag = this.conversionTime > 0; if(this.slots[0] != null && !(this.slots[0].getItem() instanceof ItemFertilizer) && this.slots[0].stackSize >= this.amountNeededToConvert){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java index cb9e2883b..901ffda4f 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -116,13 +116,13 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ - if(from != ForgeDirection.DOWN && resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName())) return this.canolaTank.fill(resource, doFill); + if(from != ForgeDirection.DOWN && resource.getFluid() == InitBlocks.fluidCanolaOil) return this.canolaTank.fill(resource, doFill); return 0; } @Override public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ - if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidOil.getName())) return this.oilTank.drain(resource.amount, doDrain); + if(resource.getFluid() == InitBlocks.fluidOil) return this.oilTank.drain(resource.amount, doDrain); return null; } @@ -133,12 +133,12 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean canFill(ForgeDirection from, Fluid fluid){ - return from != ForgeDirection.DOWN && fluid == FluidRegistry.getFluid(InitBlocks.fluidCanolaOil.getName()); + return from != ForgeDirection.DOWN && fluid == InitBlocks.fluidCanolaOil; } @Override public boolean canDrain(ForgeDirection from, Fluid fluid){ - return fluid == FluidRegistry.getFluid(InitBlocks.fluidOil.getName()); + return fluid == InitBlocks.fluidOil; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index bb89e77f8..c76cc79b6 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -138,7 +138,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ - if(resource.getFluid() == FluidRegistry.getFluid(InitBlocks.fluidOil.getName())) return this.tank.fill(resource, doFill); + if(resource.getFluid() == InitBlocks.fluidOil) return this.tank.fill(resource, doFill); return 0; } @@ -154,7 +154,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @Override public boolean canFill(ForgeDirection from, Fluid fluid){ - return fluid == FluidRegistry.getFluid(InitBlocks.fluidOil.getName()); + return fluid == InitBlocks.fluidOil; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java new file mode 100644 index 000000000..c570254d8 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java @@ -0,0 +1,154 @@ +package ellpeck.actuallyadditions.tile; + +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; + +public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ + + public static class TileEntityPhantomBreaker extends TileEntityPhantomPlacer{ + + public TileEntityPhantomBreaker(){ + super(9, "phantomBreaker"); + this.isBreaker = true; + } + + } + + public ChunkCoordinates boundPosition; + public World boundWorld; + + public int currentTime; + public final int timeNeeded = 30; + + public final int range = 3; + + public boolean isBreaker; + + public TileEntityPhantomPlacer(int slots, String name){ + super(slots, name); + } + + public TileEntityPhantomPlacer(){ + super(9, "phantomPlacer"); + this.isBreaker = false; + } + + @Override + public void updateEntity(){ + if(!worldObj.isRemote){ + + if(!this.hasBoundPosition()){ + this.boundPosition = null; + this.boundWorld = null; + } + + if(this.isBoundPositionInRange()){ + if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ + if(this.currentTime > 0){ + this.currentTime--; + if(this.currentTime <= 0){ + if(this.isBreaker){ + Block blockToBreak = boundWorld.getBlock(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + if(blockToBreak != null && blockToBreak.getBlockHardness(boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ) > -1.0F){ + ArrayList drops = new ArrayList(); + int meta = boundWorld.getBlockMetadata(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + drops.addAll(blockToBreak.getDrops(boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ, meta, 0)); + + if(TileEntityBreaker.addToInventory(this.slots, drops, false)){ + boundWorld.playAuxSFX(2001, boundPosition.posX, boundPosition.posY, boundPosition.posZ, Block.getIdFromBlock(blockToBreak) + (meta << 12)); + WorldUtil.breakBlockAtSide(ForgeDirection.UNKNOWN, boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ); + TileEntityBreaker.addToInventory(this.slots, drops, true); + this.markDirty(); + } + } + } + else{ + if(boundWorld.getBlock(boundPosition.posX, boundPosition.posY, boundPosition.posZ).isReplaceable(boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ)){ + ItemStack removeFalse = TileEntityBreaker.removeFromInventory(this.slots, false); + if(removeFalse != null && WorldUtil.placeBlockAtSide(ForgeDirection.UNKNOWN, boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ, removeFalse)){ + TileEntityBreaker.removeFromInventory(this.slots, true); + } + } + } + } + } + else this.currentTime = this.timeNeeded; + } + } + } + } + + public boolean isBoundPositionInRange(){ + if(this.hasBoundPosition()){ + int xDif = this.boundPosition.posX-this.xCoord; + int yDif = this.boundPosition.posY-this.yCoord; + int zDif = this.boundPosition.posZ-this.zCoord; + + if(xDif >= -this.range && xDif <= this.range){ + if(yDif >= -this.range && yDif <= this.range){ + if(zDif >= -this.range && zDif <= this.range) return true; + } + } + } + return false; + } + + public boolean hasBoundPosition(){ + if(this.boundPosition != null && this.boundWorld != null){ + if(this.xCoord == this.boundPosition.posX && this.yCoord == this.boundPosition.posY && this.zCoord == this.boundPosition.posZ && this.worldObj == this.boundWorld){ + this.boundPosition = null; + this.boundWorld = null; + return false; + } + return this.boundWorld == this.worldObj; + } + return false; + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + super.writeToNBT(compound); + compound.setInteger("Time", currentTime); + if(this.hasBoundPosition()){ + compound.setInteger("XCoordOfTileStored", boundPosition.posX); + compound.setInteger("YCoordOfTileStored", boundPosition.posY); + compound.setInteger("ZCoordOfTileStored", boundPosition.posZ); + compound.setInteger("WorldOfTileStored", boundWorld.provider.dimensionId); + } + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + super.readFromNBT(compound); + int x = compound.getInteger("XCoordOfTileStored"); + int y = compound.getInteger("YCoordOfTileStored"); + int z = compound.getInteger("ZCoordOfTileStored"); + if(x != 0 && y != 0 && z != 0){ + this.boundPosition = new ChunkCoordinates(x, y, z); + this.boundWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); + } + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return true; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return false; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 424ffbe5a..881170494 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -22,14 +22,16 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ @Override public void updateEntity(){ - if(!this.hasBoundTile()) this.boundTile = null; + if(!worldObj.isRemote){ + if(!this.hasBoundTile()) this.boundTile = null; - if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ - this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); - this.tempX = 0; - this.tempY = 0; - this.tempZ = 0; - this.tempWorld = null; + if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ + this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); + this.tempX = 0; + this.tempY = 0; + this.tempZ = 0; + this.tempWorld = null; + } } } @@ -49,7 +51,14 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } public boolean hasBoundTile(){ - return this.boundTile != null && boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) != null && boundTile.getWorldObj() == this.getWorldObj() && boundTile instanceof IInventory; + if(this.boundTile != null){ + if(this.xCoord == this.boundTile.xCoord && this.yCoord == this.boundTile.yCoord && this.zCoord == this.boundTile.zCoord && this.worldObj == this.boundTile.getWorldObj()){ + this.boundTile = null; + return false; + } + return boundTile instanceof IInventory && boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) == boundTile && boundTile.getWorldObj() == this.worldObj; + } + return false; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index d62825ba3..ebfdedb00 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.0"; + public static final String VERSION = "1.7.10-0.0.5.2"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index ccb40a609..c7037353f 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -10,7 +10,6 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; @@ -22,6 +21,10 @@ public class WorldUtil{ } public static void breakBlockAtSide(ForgeDirection side, World world, int x, int y, int z){ + if(side == ForgeDirection.UNKNOWN){ + world.setBlockToAir(x, y, z); + return; + } ChunkCoordinates c = getCoordsFromSide(side, x, y, z); if(c != null){ world.setBlockToAir(c.posX, c.posY, c.posZ); @@ -52,18 +55,12 @@ public class WorldUtil{ public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ if(world instanceof WorldServer){ - if(FluidContainerRegistry.isBucket(stack) && stack.isItemEqual(FluidContainerRegistry.EMPTY_BUCKET)){ - //if() - return false; - } if(stack.getItem() instanceof IPlantable){ if(((IPlantable)stack.getItem()).getPlant(world, x, y, z).canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z)); } } - if(side != ForgeDirection.UNKNOWN){ - return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world,x, y, z, side.ordinal(), 0, 0, 0); - } + return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world,x, y, z, side == ForgeDirection.UNKNOWN ? 0 : side.ordinal(), 0, 0, 0); } return false; } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index f68e00458..fc0b2af1e 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -55,6 +55,14 @@ tile.actuallyadditions.blockPhantomface.name=Phantomface tooltip.actuallyadditions.blockPhantomface.desc.1=Like a Hopper-Chain, only Wireless! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input into connected Blocks! +tile.actuallyadditions.blockPhantomPlacer.name=Phantom Placer +tooltip.actuallyadditions.blockPhantomPlacer.desc.1=Places Blocks from a distance! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomPlacer.desc.2=Shift-Right-Click with an empty hand to see its Connections! + +tile.actuallyadditions.blockPhantomBreaker.name=Phantom Breaker +tooltip.actuallyadditions.blockPhantomBreaker.desc.1=Breaks Blocks from a distance! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomBreaker.desc.2=Shift-Right-Click with an empty hand to see its Connections! + item.actuallyadditions.itemPhantomConnector.name=Phantom Connector tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! tooltip.actuallyadditions.itemPhantomConnector.desc.2=Hold ALT to clear the stored TileEntity @@ -108,15 +116,15 @@ tile.actuallyadditions.blockInputter.add.13.name=Efficient Sucking Dilettant tile.actuallyadditions.blockInputter.add.14.name=Extreme Sand Digger tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO -tooltip.actuallyadditions.phantom.connected.desc= -tooltip.actuallyadditions.phantom.stored.desc= +tooltip.actuallyadditions.phantom.connected.desc= +tooltip.actuallyadditions.phantom.stored.desc= tooltip.actuallyadditions.phantom.noBound.desc=The Connector has no Information stored! -tooltip.actuallyadditions.phantom.notInventory.desc=This Block is not an Inventory! +tooltip.actuallyadditions.phantom.notInventory.desc=The stored Block is not an Inventory! tooltip.actuallyadditions.phantom.inWorld.desc=In World tooltip.actuallyadditions.phantom.boundTo.desc=Bound to -tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to TileEntity at %s, %s, %s -tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to TileEntity at %s, %s, %s but it is not in Range! -tooltip.actuallyadditions.phantom.notConnected.desc=This Phantomface isn't connected to anything! +tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to Block at %s, %s, %s +tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to Block at %s, %s, %s but it is not in Range! +tooltip.actuallyadditions.phantom.notConnected.desc=This isn't connected to anything! item.actuallyadditions.itemMiscMashedFood.name=Mashed Food item.actuallyadditions.itemFertilizer.name=Fertilizer @@ -372,6 +380,10 @@ container.actuallyadditions.canolaPress.name=Canola Press container.actuallyadditions.fermentingBarrel.name=Fermenting Barrel container.actuallyadditions.coalGenerator.name=Coal Generator container.actuallyadditions.oilGenerator.name=Oil Generator +container.actuallyadditions.phantomPlacer.name=Phantom Placer +container.actuallyadditions.phantomBreaker.name=Phantom Breaker +container.actuallyadditions.phantomface.name=Phantomface + container.actuallyadditions.nei.crushing.name=Crusher container.actuallyadditions.nei.ballOfHair.name=Ball Of Hair Usage diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index e76c2ffcc..87263fb92 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "ActuallyAdditions", "name": "Actually Additions", "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.5.1", + "version": "0.0.5.2", "mcversion": "1.7.10", "url": "https://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", From 22076b631c560c658e4508aa4fe8adf8e3c92ce0 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 27 May 2015 21:57:53 +0200 Subject: [PATCH 07/29] Update Checker Changes! --- .../blocks/BlockPhantomface.java | 27 +- .../actuallyadditions/blocks/InitBlocks.java | 16 +- .../config/values/ConfigIntValues.java | 5 +- .../crafting/BlockCrafting.java | 2 +- .../creative/CreativeTab.java | 6 +- .../actuallyadditions/items/ItemBucketAA.java | 7 +- .../items/ItemPhantomConnector.java | 2 +- .../tile/TileEntityBase.java | 3 +- .../tile/TileEntityBreaker.java | 2 +- .../tile/TileEntityInventoryBase.java | 11 +- .../tile/TileEntityPhantomPlacer.java | 5 +- .../tile/TileEntityPhantomface.java | 304 ++++++++++++------ .../update/UpdateChecker.java | 18 +- .../actuallyadditions/util/WorldUtil.java | 12 + .../waila/WailaDataProvider.java | 35 +- .../assets/actuallyadditions/lang/en_US.lang | 13 +- .../blocks/models/special/modelEllpeck.png | Bin 718 -> 1076 bytes update/changelog | 1 + newestVersion.txt => update/newestVersion.txt | 0 19 files changed, 291 insertions(+), 178 deletions(-) create mode 100644 update/changelog rename newestVersion.txt => update/newestVersion.txt (100%) diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index f04cf625c..b80007aed 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -29,6 +29,8 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte public static final int FACE = 0; public static final int PLACER = 1; public static final int BREAKER = 2; + public static final int LIQUIFACE = 3; + public static final int ENERGYFACE = 4; public int type; @@ -59,9 +61,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte if(tile instanceof TileEntityPhantomface){ TileEntityPhantomface phantom = (TileEntityPhantomface)tile; if(phantom.hasBoundTile()){ - if(phantom.isBoundTileInRage()){ - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); - } + if(phantom.isBoundTileInRage()) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); } else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); @@ -71,9 +71,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte if(player.isSneaking()){ TileEntityPhantomPlacer phantom = (TileEntityPhantomPlacer)tile; if(phantom.hasBoundPosition()){ - if(phantom.isBoundPositionInRange()){ - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); - } + if(phantom.isBoundPositionInRange()) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); } else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); @@ -92,8 +90,10 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte return new TileEntityPhantomPlacer(); case BREAKER: return new TileEntityPhantomPlacer.TileEntityPhantomBreaker(); + case LIQUIFACE: + return new TileEntityPhantomface.TileEntityPhantomLiquiface(); default: - return new TileEntityPhantomface(); + return new TileEntityPhantomface.TileEntityPhantomItemface(); } } @@ -110,7 +110,16 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @Override public String getName(){ - return this.type == PLACER ? "blockPhantomPlacer" : (this.type == BREAKER ? "blockPhantomBreaker" : "blockPhantomface"); + switch(this.type){ + case PLACER: + return "blockPhantomPlacer"; + case BREAKER: + return "blockPhantomBreaker"; + case LIQUIFACE: + return "blockPhantomLiquiface"; + default: + return "blockPhantomface"; + } } public static class TheItemBlock extends ItemBlock{ @@ -146,4 +155,4 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte return damage; } } -} +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 3423e75f8..5778cb376 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -46,8 +46,9 @@ public class InitBlocks{ public static Block blockOilGenerator; public static Block blockPhantomface; - //public static Block blockPhantomPlacer; - //public static Block blockPhantomBreaker; + public static Block blockPhantomPlacer; + public static Block blockPhantomBreaker; + public static Block blockPhantomLiquiface; public static void init(){ Util.logInfo("Initializing Blocks..."); @@ -68,11 +69,14 @@ public class InitBlocks{ blockPhantomface = new BlockPhantomface(BlockPhantomface.FACE); BlockUtil.register(blockPhantomface, BlockPhantomface.TheItemBlock.class); - //blockPhantomPlacer = new BlockPhantomface(BlockPhantomface.PLACER); - //BlockUtil.register(blockPhantomPlacer, BlockPhantomface.TheItemBlock.class); + blockPhantomPlacer = new BlockPhantomface(BlockPhantomface.PLACER); + BlockUtil.register(blockPhantomPlacer, BlockPhantomface.TheItemBlock.class); - //blockPhantomBreaker = new BlockPhantomface(BlockPhantomface.BREAKER); - //BlockUtil.register(blockPhantomBreaker, BlockPhantomface.TheItemBlock.class); + blockPhantomLiquiface = new BlockPhantomface(BlockPhantomface.LIQUIFACE); + BlockUtil.register(blockPhantomLiquiface, BlockPhantomface.TheItemBlock.class); + + blockPhantomBreaker = new BlockPhantomface(BlockPhantomface.BREAKER); + BlockUtil.register(blockPhantomBreaker, BlockPhantomface.TheItemBlock.class); blockCoalGenerator = new BlockCoalGenerator(); BlockUtil.register(blockCoalGenerator, BlockCoalGenerator.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index f4ad51d58..ccbae20e9 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -72,7 +72,10 @@ public enum ConfigIntValues{ OIL_GEN_ENERGY_PRODUCED("Oil Generator: Energy Produced", ConfigCategories.MACHINE_VALUES, 76, 1, 500, "The Amount of Energy generated by the Oil Generator"), OIL_GEN_FUEL_USED("Oil Generator: Fuel Usage", ConfigCategories.MACHINE_VALUES, 50, 1, 300, "The Amount of Fuel used per Burnup in the Oil Generator"), - OIL_GEN_BURN_TIME("Oil Generator: Burn Time", ConfigCategories.MACHINE_VALUES, 100, 1, 1000, "The Amount of Time Fuel keeps burning for"); + OIL_GEN_BURN_TIME("Oil Generator: Burn Time", ConfigCategories.MACHINE_VALUES, 100, 1, 1000, "The Amount of Time Fuel keeps burning for"), + + PHANTOM_PLACER_TIME("Phantom Placer and Breaker: Time Needed", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Time a Phantom Placer/Breaker needs"), + PHANTOM_PLACER_RANGE("Phantom Placer and Breaker: Range", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "The Default Range of the Phantom Placer/Breaker"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index 96d7aaca5..e09415721 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -216,7 +216,7 @@ public class BlockCrafting{ GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockGreenhouseGlass), "GSG", "SDS", "GSG", 'G', "blockGlass", - 'D', "blockDiamond", + 'D', "gemDiamond", 'S', "treeSapling")); //Placer diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 91dd6468e..35f03012a 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -27,8 +27,8 @@ public class CreativeTab extends CreativeTabs{ this.list = list; this.addBlock(InitBlocks.blockPhantomface); - //this.addBlock(InitBlocks.blockPhantomPlacer); - //this.addBlock(InitBlocks.blockPhantomBreaker); + this.addBlock(InitBlocks.blockPhantomPlacer); + this.addBlock(InitBlocks.blockPhantomBreaker); this.addBlock(InitBlocks.blockInputter); this.addBlock(InitBlocks.blockInputterAdvanced); @@ -92,7 +92,7 @@ public class CreativeTab extends CreativeTabs{ @Override public Item getTabIconItem(){ - return Item.getItemFromBlock(InitBlocks.blockInputter); + return Item.getItemFromBlock(InitBlocks.blockPhantomPlacer); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java index f753459b1..6c106c564 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java @@ -10,7 +10,6 @@ import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; -import net.minecraft.item.Item; import net.minecraft.item.ItemBucket; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; @@ -24,6 +23,7 @@ public class ItemBucketAA extends ItemBucket implements INameableItem{ public ItemBucketAA(Block block, String unlocName){ super(block); this.name = unlocName; + this.setContainerItem(Items.bucket); } @Override @@ -31,11 +31,6 @@ public class ItemBucketAA extends ItemBucket implements INameableItem{ return EnumRarity.uncommon; } - @Override - public Item getContainerItem(){ - return Items.bucket; - } - @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index 4fbe46e4e..e69386905 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -42,7 +42,7 @@ public class ItemPhantomConnector extends Item implements INameableItem{ if(this.checkHasConnection(stack, player)){ ChunkCoordinates coords = this.getStoredPosition(stack); TileEntity toStore = this.getStoredWorld(stack).getTileEntity(coords.posX, coords.posY, coords.posZ); - if(toStore != null){ + if(toStore != null && ((TileEntityPhantomface)tile).canConnectTo(toStore)){ ((TileEntityPhantomface)tile).boundTile = toStore; this.clearStorage(stack); player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index dd32a2e02..f5998df14 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -31,7 +31,8 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityFermentingBarrel.class, ModUtil.MOD_ID_LOWER + ":tileEntityFermentingBarrel"); GameRegistry.registerTileEntity(TileEntityOilGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityOilGenerator"); GameRegistry.registerTileEntity(TileEntityCoalGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoalGenerator"); - GameRegistry.registerTileEntity(TileEntityPhantomface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomface"); + GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomItemface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomItemface"); + GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomLiquiface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomLiquiface"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomPlacer"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.TileEntityPhantomBreaker.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBreaker"); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index d06e178b4..2fb16fca0 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -118,7 +118,7 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ ItemStack slot = slots[i].copy(); if(actuallyDo){ slots[i].stackSize--; - if(slots[i].stackSize <= 0) slots[i] = null; + if(slots[i].stackSize <= 0) slots[i] = slots[i].getItem().getContainerItem(slots[i]); } return slot; } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java index ad52e7157..23657083e 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInventoryBase.java @@ -134,10 +134,13 @@ public abstract class TileEntityInventoryBase extends TileEntityBase implements @Override public int[] getAccessibleSlotsFromSide(int side){ - int[] theInt = new int[slots.length]; - for(int i = 0; i < theInt.length; i++){ - theInt[i] = i; + if(this.slots.length > 0){ + int[] theInt = new int[slots.length]; + for(int i = 0; i < theInt.length; i++){ + theInt[i] = i; + } + return theInt; } - return theInt; + else return new int[0]; } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java index c570254d8..1ef588601 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java @@ -1,5 +1,6 @@ package ellpeck.actuallyadditions.tile; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; @@ -26,9 +27,9 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ public World boundWorld; public int currentTime; - public final int timeNeeded = 30; + public final int timeNeeded = ConfigIntValues.PHANTOM_PLACER_TIME.getValue(); - public final int range = 3; + public final int range = ConfigIntValues.PHANTOM_PLACER_RANGE.getValue(); public boolean isBreaker; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 881170494..018e0e2f4 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -1,5 +1,6 @@ package ellpeck.actuallyadditions.tile; +import ellpeck.actuallyadditions.blocks.BlockPhantomface; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -9,30 +10,26 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidHandler; public class TileEntityPhantomface extends TileEntityInventoryBase{ public TileEntity boundTile; + public int type; + public final int range = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); - public TileEntityPhantomface(){ - super(0, "phantomface"); + public TileEntityPhantomface(String name){ + super(0, name); } - @Override - public void updateEntity(){ - if(!worldObj.isRemote){ - if(!this.hasBoundTile()) this.boundTile = null; - - if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ - this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); - this.tempX = 0; - this.tempY = 0; - this.tempZ = 0; - this.tempWorld = null; - } - } + public boolean canConnectTo(TileEntity tile){ + return false; } public boolean isBoundTileInRage(){ @@ -50,13 +47,37 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ return false; } + @Override + public void updateEntity(){ + if(!worldObj.isRemote){ + + //TODO Remove after some Updating + if(this.type == BlockPhantomface.FACE && this.getClass() != TileEntityPhantomItemface.class){ + ItemStack[] theSlots = this.slots.clone(); + worldObj.removeTileEntity(xCoord, yCoord, zCoord); + worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityPhantomItemface()); + ((TileEntityPhantomItemface)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); + } + + if(!this.hasBoundTile()) this.boundTile = null; + + if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ + this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); + this.tempX = 0; + this.tempY = 0; + this.tempZ = 0; + this.tempWorld = null; + } + } + } + public boolean hasBoundTile(){ if(this.boundTile != null){ if(this.xCoord == this.boundTile.xCoord && this.yCoord == this.boundTile.yCoord && this.zCoord == this.boundTile.zCoord && this.worldObj == this.boundTile.getWorldObj()){ this.boundTile = null; return false; } - return boundTile instanceof IInventory && boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) == boundTile && boundTile.getWorldObj() == this.worldObj; + return boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) == boundTile && boundTile.getWorldObj() == this.worldObj; } return false; } @@ -72,10 +93,10 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } } - private int tempX; - private int tempY; - private int tempZ; - private World tempWorld; + public int tempX; + public int tempY; + public int tempZ; + public World tempWorld; @Override public void readFromNBT(NBTTagCompound compound){ @@ -86,88 +107,177 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ this.tempWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); } - public IInventory getInventory(){ - TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); - if(tile != null && tile instanceof IInventory){ - return (IInventory)tile; - } - return null; - } - - public ISidedInventory getSided(){ - return this.getInventory() instanceof ISidedInventory ? (ISidedInventory)this.getInventory() : null; - } - @Override - public int getInventoryStackLimit(){ - return this.isBoundTileInRage() ? this.getInventory().getInventoryStackLimit() : 0; - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player){ + public boolean canInsertItem(int slot, ItemStack stack, int side){ return false; } - @Override - public boolean isItemValidForSlot(int i, ItemStack stack){ - return this.isBoundTileInRage() && this.getInventory().isItemValidForSlot(i, stack); - } - - @Override - public ItemStack getStackInSlotOnClosing(int i){ - return this.isBoundTileInRage() ? this.getInventory().getStackInSlotOnClosing(i) : null; - } - - @Override - public void setInventorySlotContents(int i, ItemStack stack){ - if(this.isBoundTileInRage()) this.getInventory().setInventorySlotContents(i, stack); - this.markDirty(); - } - - @Override - public int getSizeInventory(){ - return this.isBoundTileInRage() ? this.getInventory().getSizeInventory() : 0; - } - - @Override - public ItemStack getStackInSlot(int i){ - return this.isBoundTileInRage() ? this.getInventory().getStackInSlot(i) : null; - } - - @Override - public ItemStack decrStackSize(int i, int j){ - return this.isBoundTileInRage() ? this.getInventory().decrStackSize(i, j) : null; - } - - @Override - public String getInventoryName(){ - return this.name; - } - - @Override - public int[] getAccessibleSlotsFromSide(int side){ - if(this.isBoundTileInRage()){ - if(this.getSided() != null){ - return this.getSided().getAccessibleSlotsFromSide(side); - } - else{ - int[] theInt = new int[this.getSizeInventory()]; - for(int i = 0; i < theInt.length; i++){ - theInt[i] = i; - } - return theInt; - } - } - return new int[0]; - } - - @Override - public boolean canInsertItem(int slot, ItemStack stack, int side){ - return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canInsertItem(slot, stack, side)); - } - @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canExtractItem(slot, stack, side)); + return false; + } + + public static class TileEntityPhantomLiquiface extends TileEntityPhantomface implements IFluidHandler{ + + public TileEntityPhantomLiquiface(){ + super("liquiface"); + this.type = BlockPhantomface.LIQUIFACE; + } + + @Override + public boolean canConnectTo(TileEntity tile){ + return tile instanceof IFluidHandler; + } + + public IFluidHandler getHandler(){ + TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); + if(tile != null && tile instanceof IFluidHandler){ + return (IFluidHandler)tile; + } + return null; + } + + @Override + public boolean hasBoundTile(){ + return super.hasBoundTile() && this.boundTile instanceof IFluidHandler; + } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + if(this.isBoundTileInRage()) return this.getHandler().fill(from, resource, doFill); + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + if(this.isBoundTileInRage()) return this.getHandler().drain(from, resource, doDrain); + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + if(this.isBoundTileInRage()) return this.getHandler().drain(from, maxDrain, doDrain); + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return this.isBoundTileInRage() && this.getHandler().canFill(from, fluid); + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return this.isBoundTileInRage() && this.getHandler().canDrain(from, fluid); + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + if(this.isBoundTileInRage()) return this.getHandler().getTankInfo(from); + return new FluidTankInfo[0]; + } + } + + public static class TileEntityPhantomItemface extends TileEntityPhantomface{ + + public TileEntityPhantomItemface(){ + super("phantomface"); + this.type = BlockPhantomface.FACE; + } + + @Override + public boolean canConnectTo(TileEntity tile){ + return tile instanceof IInventory; + } + + @Override + public boolean hasBoundTile(){ + return super.hasBoundTile() && this.boundTile instanceof IInventory; + } + + public IInventory getInventory(){ + TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); + if(tile != null && tile instanceof IInventory){ + return (IInventory)tile; + } + return null; + } + + public ISidedInventory getSided(){ + return this.getInventory() instanceof ISidedInventory ? (ISidedInventory)this.getInventory() : null; + } + + @Override + public int getInventoryStackLimit(){ + return this.isBoundTileInRage() ? this.getInventory().getInventoryStackLimit() : 0; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player){ + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return this.isBoundTileInRage() && this.getInventory().isItemValidForSlot(i, stack); + } + + @Override + public ItemStack getStackInSlotOnClosing(int i){ + return this.isBoundTileInRage() ? this.getInventory().getStackInSlotOnClosing(i) : null; + } + + @Override + public void setInventorySlotContents(int i, ItemStack stack){ + if(this.isBoundTileInRage()) this.getInventory().setInventorySlotContents(i, stack); + this.markDirty(); + } + + @Override + public int getSizeInventory(){ + return this.isBoundTileInRage() ? this.getInventory().getSizeInventory() : 0; + } + + @Override + public ItemStack getStackInSlot(int i){ + return this.isBoundTileInRage() ? this.getInventory().getStackInSlot(i) : null; + } + + @Override + public ItemStack decrStackSize(int i, int j){ + return this.isBoundTileInRage() ? this.getInventory().decrStackSize(i, j) : null; + } + + @Override + public String getInventoryName(){ + return this.name; + } + + @Override + public int[] getAccessibleSlotsFromSide(int side){ + if(this.isBoundTileInRage()){ + if(this.getSided() != null){ + return this.getSided().getAccessibleSlotsFromSide(side); + } + else{ + int[] theInt = new int[this.getSizeInventory()]; + for(int i = 0; i < theInt.length; i++){ + theInt[i] = i; + } + return theInt; + } + } + return new int[0]; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canInsertItem(slot, stack, side)); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return this.isBoundTileInRage() && (this.getSided() == null || this.getSided().canExtractItem(slot, stack, side)); + } + } } diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java index 8d96556a1..24c42bbfd 100644 --- a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java @@ -6,6 +6,7 @@ import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.IChatComponent; import net.minecraft.util.StatCollector; import org.apache.logging.log4j.Level; @@ -20,6 +21,7 @@ public class UpdateChecker{ public boolean checkFailed = false; public boolean notified = false; public String onlineVersion; + public String changelog; public void init(){ Util.logInfo("Initializing Update Checker..."); @@ -42,9 +44,11 @@ public class UpdateChecker{ String notice1 = "info." + ModUtil.MOD_ID_LOWER + ".update.generic.desc"; String notice2 = "info." + ModUtil.MOD_ID_LOWER + ".update.versionComp.desc"; String notice3 = "info." + ModUtil.MOD_ID_LOWER + ".update.download.desc"; + String notice4 = "info." + ModUtil.MOD_ID_LOWER + ".update.changelog.desc"; player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocal(notice1))); player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice2, ModUtil.VERSION, this.onlineVersion))); player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice3, "http://minecraft.curseforge.com/mc-mods/228404-actually-additions/files"))); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted(notice4, changelog))); } } @@ -64,10 +68,16 @@ public class UpdateChecker{ public void run(){ Util.logInfo("Starting Update Check..."); try{ - URL url = new URL("https://raw.githubusercontent.com/Ellpeck/ActuallyAdditions/master/newestVersion.txt"); - BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream())); - onlineVersion = r.readLine(); - r.close(); + URL newestURL = new URL("https://raw.githubusercontent.com/Ellpeck/ActuallyAdditions/master/update/newestVersion.txt"); + BufferedReader newestReader = new BufferedReader(new InputStreamReader(newestURL.openStream())); + onlineVersion = newestReader.readLine(); + newestReader.close(); + + URL changeURL = new URL("https://raw.githubusercontent.com/Ellpeck/ActuallyAdditions/master/update/changelog.txt"); + BufferedReader changeReader = new BufferedReader(new InputStreamReader(changeURL.openStream())); + changelog = changeReader.readLine(); + changeReader.close(); + Util.logInfo("Update Check done!"); } catch(Exception e){ diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index c7037353f..4064f30b5 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -10,6 +10,8 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTank; import net.minecraftforge.fluids.IFluidHandler; @@ -55,11 +57,21 @@ public class WorldUtil{ public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ if(world instanceof WorldServer){ + + //Fluids + FluidStack fluid = FluidContainerRegistry.getFluidForFilledItem(stack); + if(fluid != null && fluid.getFluid().getBlock() != null && fluid.getFluid().getBlock().canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ + return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, fluid.getFluid().getBlock()); + } + + //Plants if(stack.getItem() instanceof IPlantable){ if(((IPlantable)stack.getItem()).getPlant(world, x, y, z).canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z)); } } + + //Blocks return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world,x, y, z, side == ForgeDirection.UNKNOWN ? 0 : side.ordinal(), 0, 0, 0); } return false; diff --git a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java index 8bf9f5272..0b6e54cff 100644 --- a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java +++ b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java @@ -1,11 +1,7 @@ package ellpeck.actuallyadditions.waila; -import ellpeck.actuallyadditions.blocks.BlockCompost; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; -import ellpeck.actuallyadditions.tile.TileEntityCompost; import ellpeck.actuallyadditions.util.BlockUtil; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import mcp.mobius.waila.api.IWailaConfigHandler; import mcp.mobius.waila.api.IWailaDataAccessor; @@ -16,7 +12,6 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.List; @@ -24,8 +19,6 @@ import java.util.List; @SuppressWarnings("unused") public class WailaDataProvider implements IWailaDataProvider{ - private final String WAILA_PRE_LANG = "gui." + ModUtil.MOD_ID_LOWER + ".waila."; - @Override public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config){ return null; @@ -35,7 +28,7 @@ public class WailaDataProvider implements IWailaDataProvider{ public List getWailaHead(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ if(ConfigBoolValues.DO_WAILA_INFO.isEnabled()){ - if(accessor.getBlock() instanceof INameableItem){ + if(BlockUtil.wailaRegisterList.contains(accessor.getBlock())){ Item.getItemFromBlock(accessor.getBlock()).addInformation(stack, accessor.getPlayer(), currentTip, true); } } @@ -45,32 +38,9 @@ public class WailaDataProvider implements IWailaDataProvider{ @Override public List getWailaBody(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ - - if(accessor.getTileEntity() instanceof TileEntityCompost){ - this.compostBody(accessor, currentTip); - } - return currentTip; } - public void compostBody(IWailaDataAccessor accessor, List currentTip){ - int meta = accessor.getMetadata(); - TileEntityCompost tile = (TileEntityCompost)accessor.getTileEntity(); - - if(meta <= tile.amountNeededToConvert){ - String tip1 = StatCollector.translateToLocal(WAILA_PRE_LANG + "compostAmount.name") + ": " + meta + "/" + tile.amountNeededToConvert; - currentTip.add(tip1); - - if(meta == tile.amountNeededToConvert){ - currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostConverting.name")); - } - } - - if(meta == tile.amountNeededToConvert+1){ - currentTip.add(StatCollector.translateToLocal(WAILA_PRE_LANG + "compostDone.name")); - } - } - @Override public List getWailaTail(ItemStack stack, List currentTip, IWailaDataAccessor accessor, IWailaConfigHandler config){ return currentTip; @@ -85,9 +55,6 @@ public class WailaDataProvider implements IWailaDataProvider{ Util.logInfo("Initializing Waila Plugin..."); WailaDataProvider provider = new WailaDataProvider(); - - registrar.registerBodyProvider(provider, BlockCompost.class); - for(Block theBlock : BlockUtil.wailaRegisterList){ registrar.registerHeadProvider(provider, theBlock.getClass()); } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index fc0b2af1e..f41a17b94 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -57,11 +57,11 @@ tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input tile.actuallyadditions.blockPhantomPlacer.name=Phantom Placer tooltip.actuallyadditions.blockPhantomPlacer.desc.1=Places Blocks from a distance! Connect me with a Phantom Connector! -tooltip.actuallyadditions.blockPhantomPlacer.desc.2=Shift-Right-Click with an empty hand to see its Connections! +tooltip.actuallyadditions.blockPhantomPlacer.desc.2=Sneak-Right-Click with an empty hand to see its Connections! tile.actuallyadditions.blockPhantomBreaker.name=Phantom Breaker tooltip.actuallyadditions.blockPhantomBreaker.desc.1=Breaks Blocks from a distance! Connect me with a Phantom Connector! -tooltip.actuallyadditions.blockPhantomBreaker.desc.2=Shift-Right-Click with an empty hand to see its Connections! +tooltip.actuallyadditions.blockPhantomBreaker.desc.2=Sneak-Right-Click with an empty hand to see its Connections! item.actuallyadditions.itemPhantomConnector.name=Phantom Connector tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! @@ -119,7 +119,7 @@ tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO tooltip.actuallyadditions.phantom.connected.desc= tooltip.actuallyadditions.phantom.stored.desc= tooltip.actuallyadditions.phantom.noBound.desc=The Connector has no Information stored! -tooltip.actuallyadditions.phantom.notInventory.desc=The stored Block is not an Inventory! +tooltip.actuallyadditions.phantom.notInventory.desc=The stored Block is not the right type of Inventory! tooltip.actuallyadditions.phantom.inWorld.desc=In World tooltip.actuallyadditions.phantom.boundTo.desc=Bound to tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to Block at %s, %s, %s @@ -389,16 +389,13 @@ container.actuallyadditions.nei.crushing.name=Crusher container.actuallyadditions.nei.ballOfHair.name=Ball Of Hair Usage container.actuallyadditions.nei.compost.name=Compost -gui.actuallyadditions.waila.compostAmount.name=Amount of Mashed Food -gui.actuallyadditions.waila.compostDone.name=Done! -gui.actuallyadditions.waila.compostConverting.name=Converting... - info.actuallyadditions.update.generic.desc=[{"text":"There is an "},{"text":"Update ","bold":"true"},{"text":"for ","bold":"false"},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"available!","color":"none","bold":"false"}] info.actuallyadditions.update.versionComp.desc=[{"text":"You have Version "},{"text":"%s","color":"dark_red","italic":"false"},{"text":", the newest one is ","color":"none","italic":"false"},{"text":"%s","color":"dark_green","underlined":"false"},{"text":"!","color":"none","underlined":"false"}] info.actuallyadditions.update.download.desc=[{"text":"Download the newest Version "},{"text":"here! (Click me!)","color":"dark_green","underlined":"true","clickEvent":{"action":"open_url","value":"%s"},"hoverEvent":{"action":"show_text","value":{"text":"","extra":[{"text":"Click here to open your Browser and download the newest Version!"}]}}}] info.actuallyadditions.update.failed.desc=[{"text":"The Update Check for "},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"failed! Check your Internet Connection and the Logs for more Info!","color":"none"}] +info.actuallyadditions.update.changelog.desc=Updates: %s -achievement.actuallyadditions.pickUpSolidXP=Hard and Rich and Stuff +achievement.actuallyadditions.pickUpSolidXP=Square and yummy! achievement.actuallyadditions.pickUpSolidXP.desc=Pick up some Solidified Experience achievement.actuallyadditions.craftKnifeBlade=Sharp! So Sharp! achievement.actuallyadditions.craftKnifeBlade.desc=Craft a Knife Blade diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelEllpeck.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelEllpeck.png index cd769c4cad83bc2ffaa5dcbc7bf893d005a0b12f..4bdd01e0b3ab4e06253236922f1c19bcbdfbc746 100644 GIT binary patch delta 999 zcmX@dx`ktc%0xp6u0sqAe1{lCHM|-o2CLOGZ}N0;45^5F8*$n%I8bD7@{$YF#9mCc z%XoVAQqTnkEu|)pg*H5G5{o)JFD7`%SbWh|DLlk(Ancw|a^&!e&JJepCT5SCBb_Xd z`E|bAeRo*o{4T+}D6EK?Ic$^I>o>LE?4|`@Q9q|VWnYWOWl@*tbxPOF+Fa6@9)4kX zm2`JSJ?FEBD^D+2wQS}-wUD2)9jjl7_#LLq?e;9D;E6&{A7IM7j zSJF%&N$CdrDzSOLbYfKgg@g);ehJ-mdBwV1S6>Z&u$HncRh3)IPaH6r^fOcC#EFC7 zE&u#8?4Q5;`-bh7-Y2&{m}1?^749@M!Fk@Vvbn!L*8hxZlS#^5>{Vl9y|Tw8+U@{z^kY{{aI^kXL(y5&Q+{>j?NoImaN#=liT zGk<)2yU(kr{{1?yNw2T3OW!?h?x(FhmPewxRqA?zq+Jv$`TWI=Dt1QvIDO>cLQbHf zX_FrxJLY~vGrs=xgyy?@+c$nqV#)Rv|M13B?sSS$-EpTk+x~uh-)_2hzqe=Ij8^@a z1#H)s?*9J~!&dK8QrpJNLb~6 zmeKDA(D*+SjZM~wY}jek^68dE**(9<%CgVv`!}q5*~?iIXlmQ;vaLhlEQ24&C3pVu zta@2h6de3$<=Q=Am(<><{It-we|9Xb{CmPHC8-r3KVB7I`m6jD&>asJy{YYMU~!$*Q(y=`xH+d?*evjEeyjO}VA)yO zR+jlI6Vv8OMQdDL&n6>RCiVGxKaT}SWx_?BxTP<$gAQ}fuJHGq7Jj^Rl51(s&wc%u zFC1R1*ZtfO7{I{rHNUXV=fjLBSNqi`8)mbK#P8s4bdg``*6sIthF86wTd=%;UHfCb z>zjl3O;co#U$P)9m|wE+bBoxC#cFpr>z(zPdcSRay2Qd!uIkX0osks^p4a2|NCN}l z*hj^^=e<84{a*R;JIn9=YTF^4%zZ!X^v{ale}447@SAszopr056&M AOaK4? delta 636 zcmdnOagKF@3KwH>kh>GZx^prwCn`#F9cEzQJIr`Ie?`hfH??{udrud~kczms)4j6} zI|#Vca=fo)`JXG)QO|vHo7hRE@B2@=&hI-yjd;OZo9vi9PN1*h&R?^NGf@jmWS z)n32TPmSJ|?Uu=ZTO6ltHrux0YQ>Qh=wC6%L2ckDQ#{7309JBxCb-TdcecJt4_EZX^`#%k_9 zmhV?iJ-YI#n@9diUx%e!|H|CkCA;qysja)7oi*#(XQ|?>%);y+u5J8#I#wu!F7)bH z8q|JRas5dyp921mzyI2WZ=M#P@}r@EN!Z9?-r2NFtGUk}NHK>96t9xYjX7PfZ&c%8 z<0Q~x;d1E|$NTNY1#4}M(m4MznEt7|&)rh2*17P+Mn<2)ZI*`*PmkB#fB(Ca(+`uA z2g-GAOb%?8ke8~Q0yObtn6FpkHnJ zZdLwS|M~6bJ@aIX>$>yjKR>D}Q}f&A{j=N8E6wlQo!|ZQTjjm8+s}W_+gBSouN}u-%&*WiYYIIN#;J`wCSZ_G9hGBR0C7FLe?yxWbfv2mV%Q~loCIFF_F%$p* diff --git a/update/changelog b/update/changelog new file mode 100644 index 000000000..d8d44271f --- /dev/null +++ b/update/changelog @@ -0,0 +1 @@ +An Update Checker! ...wait, you're not gonna read this anyways. \ No newline at end of file diff --git a/newestVersion.txt b/update/newestVersion.txt similarity index 100% rename from newestVersion.txt rename to update/newestVersion.txt From 5fd285d3bcbf3b7812c4a425f7d6bde0fd38ff83 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 27 May 2015 22:00:20 +0200 Subject: [PATCH 08/29] Update Checker Changes! --- .../java/ellpeck/actuallyadditions/update/UpdateChecker.java | 2 +- update/{changelog => changelog.txt} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename update/{changelog => changelog.txt} (100%) diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java index 24c42bbfd..3ebdd9e1a 100644 --- a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java @@ -44,7 +44,7 @@ public class UpdateChecker{ String notice1 = "info." + ModUtil.MOD_ID_LOWER + ".update.generic.desc"; String notice2 = "info." + ModUtil.MOD_ID_LOWER + ".update.versionComp.desc"; String notice3 = "info." + ModUtil.MOD_ID_LOWER + ".update.download.desc"; - String notice4 = "info." + ModUtil.MOD_ID_LOWER + ".update.changelog.desc"; + String notice4 = "info." + ModUtil.MOD_ID_LOWER + ".update.changelog.txt.desc"; player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocal(notice1))); player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice2, ModUtil.VERSION, this.onlineVersion))); player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice3, "http://minecraft.curseforge.com/mc-mods/228404-actually-additions/files"))); diff --git a/update/changelog b/update/changelog.txt similarity index 100% rename from update/changelog rename to update/changelog.txt From 9f7031fdfef7f4df14794842c17cc936740f12f7 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 29 May 2015 18:17:28 +0200 Subject: [PATCH 09/29] -Liquid and Energy Phantomface -InvTweaks API --- .../blocks/BlockPhantomface.java | 13 +- .../actuallyadditions/blocks/BlockPlant.java | 9 +- .../actuallyadditions/blocks/InitBlocks.java | 4 + .../crafting/FoodCrafting.java | 2 +- .../creative/CreativeTab.java | 2 + .../event/RenderPlayerEventAA.java | 6 + .../recipe/HairyBallHandler.java | 3 + .../tile/TileEntityBase.java | 1 + .../tile/TileEntityCanolaPress.java | 2 +- .../tile/TileEntityCoalGenerator.java | 8 +- .../tile/TileEntityFermentingBarrel.java | 2 +- .../tile/TileEntityOilGenerator.java | 2 +- .../tile/TileEntityPhantomface.java | 137 ++++++++++++++++++ .../update/UpdateChecker.java | 8 +- .../actuallyadditions/util/WorldUtil.java | 2 +- src/main/java/invtweaks/api/IItemTree.java | 68 +++++++++ .../java/invtweaks/api/IItemTreeCategory.java | 46 ++++++ .../java/invtweaks/api/IItemTreeItem.java | 33 +++++ .../java/invtweaks/api/IItemTreeListener.java | 29 ++++ src/main/java/invtweaks/api/InvTweaksAPI.java | 84 +++++++++++ .../java/invtweaks/api/SortingMethod.java | 51 +++++++ .../api/container/ChestContainer.java | 38 +++++ .../api/container/ContainerSection.java | 88 +++++++++++ .../container/ContainerSectionCallback.java | 16 ++ .../api/container/IgnoreContainer.java | 15 ++ .../api/container/InventoryContainer.java | 20 +++ .../assets/actuallyadditions/lang/en_US.lang | 15 +- .../textures/blocks/blockPhantomBreaker.png | Bin 0 -> 804 bytes .../textures/blocks/blockPhantomPlacer.png | Bin 0 -> 809 bytes .../blocks/models/special/modelLordi.png | Bin 0 -> 610 bytes src/main/resources/mcmod.info | 2 +- 31 files changed, 683 insertions(+), 23 deletions(-) create mode 100644 src/main/java/invtweaks/api/IItemTree.java create mode 100644 src/main/java/invtweaks/api/IItemTreeCategory.java create mode 100644 src/main/java/invtweaks/api/IItemTreeItem.java create mode 100644 src/main/java/invtweaks/api/IItemTreeListener.java create mode 100644 src/main/java/invtweaks/api/InvTweaksAPI.java create mode 100644 src/main/java/invtweaks/api/SortingMethod.java create mode 100644 src/main/java/invtweaks/api/container/ChestContainer.java create mode 100644 src/main/java/invtweaks/api/container/ContainerSection.java create mode 100644 src/main/java/invtweaks/api/container/ContainerSectionCallback.java create mode 100644 src/main/java/invtweaks/api/container/IgnoreContainer.java create mode 100644 src/main/java/invtweaks/api/container/InventoryContainer.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomBreaker.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomPlacer.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index b80007aed..c07966ee2 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -6,9 +6,7 @@ import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; -import ellpeck.actuallyadditions.util.BlockUtil; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -92,6 +90,8 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte return new TileEntityPhantomPlacer.TileEntityPhantomBreaker(); case LIQUIFACE: return new TileEntityPhantomface.TileEntityPhantomLiquiface(); + case ENERGYFACE: + return new TileEntityPhantomface.TileEntityPhantomEnergyface(); default: return new TileEntityPhantomface.TileEntityPhantomItemface(); } @@ -117,6 +117,8 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte return "blockPhantomBreaker"; case LIQUIFACE: return "blockPhantomLiquiface"; + case ENERGYFACE: + return "blockPhantomEnergyface"; default: return "blockPhantomface"; } @@ -148,6 +150,11 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 2, ""); + if(KeyUtil.isShiftPressed() && ((BlockPhantomface)this.theBlock).type == LIQUIFACE){ + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.5")); + } } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index 8f29d1fc5..0dc51ac07 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -46,15 +46,14 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar @Override public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune){ ArrayList ret = super.getDrops(world, x, y, z, metadata, fortune); - if (metadata >= 7){ - for (int i = 0; i < 3 + fortune; ++i){ - if (world.rand.nextInt(15) <= metadata){ - ret.add(new ItemStack(this.seedItem)); - } + if(metadata >= 7){ + for(int i = 0; i < 3; ++i){ + if(world.rand.nextInt(15) <= metadata) ret.add(new ItemStack(this.seedItem)); } if(this == InitBlocks.blockCanola) ret.add(new ItemStack(this.returnItem.getItem(), new Random().nextInt(3)+3, this.returnItem.getItemDamage())); else ret.add(this.returnItem.copy()); } + else ret.add(new ItemStack(this.seedItem)); return ret; } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 5778cb376..46e4331cc 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -49,6 +49,7 @@ public class InitBlocks{ public static Block blockPhantomPlacer; public static Block blockPhantomBreaker; public static Block blockPhantomLiquiface; + public static Block blockPhantomEnergyface; public static void init(){ Util.logInfo("Initializing Blocks..."); @@ -75,6 +76,9 @@ public class InitBlocks{ blockPhantomLiquiface = new BlockPhantomface(BlockPhantomface.LIQUIFACE); BlockUtil.register(blockPhantomLiquiface, BlockPhantomface.TheItemBlock.class); + blockPhantomEnergyface = new BlockPhantomface(BlockPhantomface.ENERGYFACE); + BlockUtil.register(blockPhantomEnergyface, BlockPhantomface.TheItemBlock.class); + blockPhantomBreaker = new BlockPhantomface(BlockPhantomface.BREAKER); BlockUtil.register(blockPhantomBreaker, BlockPhantomface.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java index 070226d02..438715039 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/FoodCrafting.java @@ -118,7 +118,7 @@ public class FoodCrafting{ //Chocolate if(ConfigCrafting.CHOCOLATE.isEnabled()) - GameRegistry.addRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.CHOCOLATE.ordinal()), + GameRegistry.addRecipe(new ItemStack(InitItems.itemFoods, 3, TheFoods.CHOCOLATE.ordinal()), "C C", "CMC", "C C", 'C', new ItemStack(Items.dye, 1, 3), 'M', new ItemStack(Items.milk_bucket)); diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 35f03012a..4e6f0e9ff 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -27,6 +27,8 @@ public class CreativeTab extends CreativeTabs{ this.list = list; this.addBlock(InitBlocks.blockPhantomface); + this.addBlock(InitBlocks.blockPhantomEnergyface); + this.addBlock(InitBlocks.blockPhantomLiquiface); this.addBlock(InitBlocks.blockPhantomPlacer); this.addBlock(InitBlocks.blockPhantomBreaker); this.addBlock(InitBlocks.blockInputter); diff --git a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java index e5d0b7037..8508dd86b 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java +++ b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java @@ -15,6 +15,7 @@ public class RenderPlayerEventAA{ private RenderSpecial hoseRender = new RenderSpecial(new ModelTorch()); //private RenderSpecial paktoRender = new RenderSpecial(new ModelStandardBlock("Pakto")); private RenderSpecial glenRender = new RenderSpecial(new ModelStandardBlock("Glenthor")); + private RenderSpecial lordiRender = new RenderSpecial(new ModelStandardBlock("Lordi")); @SubscribeEvent(priority = EventPriority.HIGHEST) public void RenderPlayerEvent(RenderPlayerEvent.Pre event){ @@ -41,6 +42,11 @@ public class RenderPlayerEventAA{ if(event.entityPlayer.getUniqueID().equals(UUID.fromString("cb7b293a-5031-484e-b5be-b4f2f4e92726"))){ hoseRender.render(event.entityPlayer, event.partialRenderTick, 0.5F, 1.3F); } + + //Lordhallo + if(event.entityPlayer.getUniqueID().equals(UUID.fromString("990ecf6d-15dd-442c-b91b-323a6420c78e"))){ + lordiRender.render(event.entityPlayer, event.partialRenderTick, 0.3F, 1F); + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java index 87d81bf5d..3f6b01e37 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java @@ -18,6 +18,9 @@ public class HairyBallHandler{ addReturn(new ItemStack(Items.diamond), 2); addReturn(new ItemStack(Items.name_tag), 1); addReturn(new ItemStack(Items.fish), 80); + addReturn(new ItemStack(Items.fish, 1), 60); + addReturn(new ItemStack(Items.fish, 2), 10); + addReturn(new ItemStack(Items.fish, 3), 40); addReturn(new ItemStack(Items.feather), 60); addReturn(new ItemStack(Items.leather), 30); addReturn(new ItemStack(Items.dye), 70); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index f5998df14..d5739f65e 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -33,6 +33,7 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityCoalGenerator.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoalGenerator"); GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomItemface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomItemface"); GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomLiquiface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomLiquiface"); + GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomEnergyface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomEnergyface"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomPlacer"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.TileEntityPhantomBreaker.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBreaker"); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index 868b34ee3..f2f868780 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -159,7 +159,7 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE @Override public boolean canDrain(ForgeDirection from, Fluid fluid){ - return true; + return from != ForgeDirection.UP; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java index 7fbb4b197..18ba7ffb8 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java @@ -1,7 +1,7 @@ package ellpeck.actuallyadditions.tile; import cofh.api.energy.EnergyStorage; -import cofh.api.energy.IEnergyReceiver; +import cofh.api.energy.IEnergyProvider; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; @@ -11,7 +11,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntityFurnace; import net.minecraftforge.common.util.ForgeDirection; -public class TileEntityCoalGenerator extends TileEntityInventoryBase implements IEnergyReceiver{ +public class TileEntityCoalGenerator extends TileEntityInventoryBase implements IEnergyProvider{ public EnergyStorage storage = new EnergyStorage(60000, energyProducedPerTick+50); @@ -96,8 +96,8 @@ public class TileEntityCoalGenerator extends TileEntityInventoryBase implements } @Override - public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ - return this.storage.receiveEnergy(maxReceive, simulate); + public int extractEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.extractEnergy(maxReceive, simulate); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java index 901ffda4f..2768d8a72 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -138,7 +138,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean canDrain(ForgeDirection from, Fluid fluid){ - return fluid == InitBlocks.fluidOil; + return from != ForgeDirection.UP && fluid == InitBlocks.fluidOil; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index c76cc79b6..d536e2c7e 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -154,7 +154,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @Override public boolean canFill(ForgeDirection from, Fluid fluid){ - return fluid == InitBlocks.fluidOil; + return from != ForgeDirection.DOWN && fluid == InitBlocks.fluidOil; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 018e0e2f4..54f98befa 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -1,7 +1,11 @@ package ellpeck.actuallyadditions.tile; +import cofh.api.energy.IEnergyHandler; +import cofh.api.energy.IEnergyProvider; +import cofh.api.energy.IEnergyReceiver; import ellpeck.actuallyadditions.blocks.BlockPhantomface; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; @@ -124,6 +128,40 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ this.type = BlockPhantomface.LIQUIFACE; } + @Override + public void updateEntity(){ + super.updateEntity(); + + if(!worldObj.isRemote){ + if(this.isBoundTileInRage() && this.getHandler() != null){ + this.pushFluid(ForgeDirection.UP); + this.pushFluid(ForgeDirection.DOWN); + this.pushFluid(ForgeDirection.NORTH); + this.pushFluid(ForgeDirection.EAST); + this.pushFluid(ForgeDirection.SOUTH); + this.pushFluid(ForgeDirection.WEST); + } + } + } + + private void pushFluid(ForgeDirection side){ + TileEntity tile = WorldUtil.getTileEntityFromSide(side, worldObj, xCoord, yCoord, zCoord); + if(tile != null && tile instanceof IFluidHandler){ + for(FluidTankInfo myInfo : this.getTankInfo(side)){ + for(FluidTankInfo hisInfo : ((IFluidHandler)tile).getTankInfo(side.getOpposite())){ + if(myInfo != null && hisInfo != null && myInfo.fluid != null){ + if(((IFluidHandler)tile).canFill(side.getOpposite(), myInfo.fluid.getFluid()) && this.canDrain(side, myInfo.fluid.getFluid())){ + FluidStack receive = this.drain(side, Math.min(hisInfo.capacity-(hisInfo.fluid == null ? 0 : hisInfo.fluid.amount), myInfo.fluid.amount), false); + int actualReceive = ((IFluidHandler)tile).fill(side.getOpposite(), receive, true); + this.drain(side, new FluidStack(receive.getFluid(), actualReceive), true); + worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); + } + } + } + } + } + } + @Override public boolean canConnectTo(TileEntity tile){ return tile instanceof IFluidHandler; @@ -177,6 +215,105 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } } + public static class TileEntityPhantomEnergyface extends TileEntityPhantomface implements IEnergyHandler{ + + public TileEntityPhantomEnergyface(){ + super("energyface"); + this.type = BlockPhantomface.ENERGYFACE; + } + + @Override + public void updateEntity(){ + super.updateEntity(); + + if(!worldObj.isRemote){ + if(this.isBoundTileInRage() && this.getProvider() != null){ + this.pushEnergy(ForgeDirection.UP); + this.pushEnergy(ForgeDirection.DOWN); + this.pushEnergy(ForgeDirection.NORTH); + this.pushEnergy(ForgeDirection.EAST); + this.pushEnergy(ForgeDirection.SOUTH); + this.pushEnergy(ForgeDirection.WEST); + } + } + } + + private void pushEnergy(ForgeDirection side){ + TileEntity tile = WorldUtil.getTileEntityFromSide(side, worldObj, xCoord, yCoord, zCoord); + if(tile != null && tile instanceof IEnergyReceiver && this.getProvider().getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite()) && this.canConnectEnergy(side)){ + int receive = this.extractEnergy(side, Math.min(((IEnergyReceiver)tile).getMaxEnergyStored(ForgeDirection.UNKNOWN)-((IEnergyReceiver)tile).getEnergyStored(ForgeDirection.UNKNOWN), this.getEnergyStored(ForgeDirection.UNKNOWN)), true); + int actualReceive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), receive, false); + this.extractEnergy(side, actualReceive, false); + worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); + } + } + } + + @Override + public boolean canConnectTo(TileEntity tile){ + return tile instanceof IEnergyProvider || tile instanceof IEnergyReceiver; + } + + public IEnergyProvider getProvider(){ + TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); + if(tile != null && tile instanceof IEnergyProvider){ + return (IEnergyProvider)tile; + } + return null; + } + + public IEnergyReceiver getReceiver(){ + TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); + if(tile != null && tile instanceof IEnergyReceiver){ + return (IEnergyReceiver)tile; + } + return null; + } + + @Override + public boolean hasBoundTile(){ + return super.hasBoundTile() && (this.boundTile instanceof IEnergyReceiver || this.boundTile instanceof IEnergyProvider); + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.isBoundTileInRage() && this.getReceiver() != null ? this.getReceiver().receiveEnergy(from, maxReceive, simulate) : 0; + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return this.isBoundTileInRage() && this.getProvider() != null ? this.getProvider().extractEnergy(from, maxExtract, simulate) : 0; + } + + @Override + public int getEnergyStored(ForgeDirection from){ + if(this.isBoundTileInRage()){ + if(this.getProvider() != null) return this.getProvider().getEnergyStored(from); + if(this.getReceiver() != null) return this.getReceiver().getEnergyStored(from); + } + return 0; + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + if(this.isBoundTileInRage()){ + if(this.getProvider() != null) return this.getProvider().getMaxEnergyStored(from); + if(this.getReceiver() != null) return this.getReceiver().getMaxEnergyStored(from); + } + return 0; + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + if(this.isBoundTileInRage()){ + if(this.getProvider() != null) return this.getProvider().canConnectEnergy(from); + if(this.getReceiver() != null) return this.getReceiver().canConnectEnergy(from); + } + return false; + } + } + public static class TileEntityPhantomItemface extends TileEntityPhantomface{ public TileEntityPhantomItemface(){ diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java index 3ebdd9e1a..730717533 100644 --- a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java @@ -43,12 +43,12 @@ public class UpdateChecker{ if(update > client){ String notice1 = "info." + ModUtil.MOD_ID_LOWER + ".update.generic.desc"; String notice2 = "info." + ModUtil.MOD_ID_LOWER + ".update.versionComp.desc"; - String notice3 = "info." + ModUtil.MOD_ID_LOWER + ".update.download.desc"; - String notice4 = "info." + ModUtil.MOD_ID_LOWER + ".update.changelog.txt.desc"; + String notice3 = "info." + ModUtil.MOD_ID_LOWER + ".update.changelog.desc"; + String notice4 = "info." + ModUtil.MOD_ID_LOWER + ".update.download.desc"; player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocal(notice1))); player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice2, ModUtil.VERSION, this.onlineVersion))); - player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice3, "http://minecraft.curseforge.com/mc-mods/228404-actually-additions/files"))); - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted(notice4, changelog))); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted(notice3, changelog))); + player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StatCollector.translateToLocalFormatted(notice4, "http://minecraft.curseforge.com/mc-mods/228404-actually-additions/files"))); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 4064f30b5..89dc52e58 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -35,7 +35,7 @@ public class WorldUtil{ public static void pushEnergy(World world, int x, int y, int z, ForgeDirection side, EnergyStorage storage){ TileEntity tile = getTileEntityFromSide(side, world, x, y, z); - if(tile != null && tile instanceof IEnergyReceiver){ + if(tile != null && tile instanceof IEnergyReceiver && storage.getEnergyStored() > 0){ if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); storage.extractEnergy(receive, false); diff --git a/src/main/java/invtweaks/api/IItemTree.java b/src/main/java/invtweaks/api/IItemTree.java new file mode 100644 index 000000000..143ba14a0 --- /dev/null +++ b/src/main/java/invtweaks/api/IItemTree.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +import java.util.Collection; +import java.util.List; +import java.util.Random; + +public interface IItemTree { + void registerOre(String category, String name, String oreName, int order); + + boolean matches(List items, String keyword); + + boolean isKeywordValid(String keyword); + + Collection getAllCategories(); + + IItemTreeCategory getRootCategory(); + + void setRootCategory(IItemTreeCategory category); + + IItemTreeCategory getCategory(String keyword); + + boolean isItemUnknown(String id, int damage); + + List getItems(String id, int damage); + + List getItems(String name); + + IItemTreeItem getRandomItem(Random r); + + boolean containsItem(String name); + + boolean containsCategory(String name); + + IItemTreeCategory addCategory(String parentCategory, String newCategory) throws NullPointerException; + + void addCategory(String parentCategory, IItemTreeCategory newCategory) throws NullPointerException; + + IItemTreeItem addItem(String parentCategory, String name, String id, int damage, int order) + throws NullPointerException; + + void addItem(String parentCategory, IItemTreeItem newItem) throws NullPointerException; + + int getKeywordDepth(String keyword); + + int getKeywordOrder(String keyword); +} diff --git a/src/main/java/invtweaks/api/IItemTreeCategory.java b/src/main/java/invtweaks/api/IItemTreeCategory.java new file mode 100644 index 000000000..f1b5e9554 --- /dev/null +++ b/src/main/java/invtweaks/api/IItemTreeCategory.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +import java.util.Collection; +import java.util.List; + +public interface IItemTreeCategory { + boolean contains(IItemTreeItem item); + + void addCategory(IItemTreeCategory category); + + void addItem(IItemTreeItem item); + + Collection getSubCategories(); + + Collection> getItems(); + + String getName(); + + int getCategoryOrder(); + + int findCategoryOrder(String keyword); + + int findKeywordDepth(String keyword); +} diff --git a/src/main/java/invtweaks/api/IItemTreeItem.java b/src/main/java/invtweaks/api/IItemTreeItem.java new file mode 100644 index 000000000..2b6ae2db5 --- /dev/null +++ b/src/main/java/invtweaks/api/IItemTreeItem.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +public interface IItemTreeItem extends Comparable { + String getName(); + + String getId(); + + int getDamage(); + + int getOrder(); +} diff --git a/src/main/java/invtweaks/api/IItemTreeListener.java b/src/main/java/invtweaks/api/IItemTreeListener.java new file mode 100644 index 000000000..73a5815d5 --- /dev/null +++ b/src/main/java/invtweaks/api/IItemTreeListener.java @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +import java.util.EventListener; + +public interface IItemTreeListener extends EventListener { + void onTreeLoaded(IItemTree tree); +} diff --git a/src/main/java/invtweaks/api/InvTweaksAPI.java b/src/main/java/invtweaks/api/InvTweaksAPI.java new file mode 100644 index 000000000..6bdb84a93 --- /dev/null +++ b/src/main/java/invtweaks/api/InvTweaksAPI.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +import invtweaks.api.container.ContainerSection; +import net.minecraft.item.ItemStack; + +/** + * Interface to access functions exposed by Inventory Tweaks + *

+ * The main @Mod instance of the mod implements this interface, so a refernce to it can + * be obtained via @Instance("inventorytweaks") or methods in net.minecraftforge.fml.common.Loader + *

+ * All of these functions currently have no effect if called on a dedicated server. + */ +public interface InvTweaksAPI { + /** + * Add a listener for ItemTree load events + * + * @param listener + */ + void addOnLoadListener(IItemTreeListener listener); + + /** + * Remove a listener for ItemTree load events + * + * @param listener + * @return true if the listener was previously added + */ + boolean removeOnLoadListener(IItemTreeListener listener); + + /** + * Toggle sorting shortcut state. + * + * @param enabled + */ + void setSortKeyEnabled(boolean enabled); + + /** + * Toggle sorting shortcut supression. + * Unlike setSortKeyEnabled, this flag is automatically cleared when GUIs are closed. + * + * @param enabled + */ + void setTextboxMode(boolean enabled); + + /** + * Compare two items using the default (non-rule based) algorithm, + * sutable for an implementation of Comparator<ItemStack>. + * + * @param i + * @param j + * @return A value with a sign representing the relative order of the item stacks + */ + int compareItems(ItemStack i, ItemStack j); + + /** + * Initiate a sort as if the player had clicked on a sorting button or pressed the sort key. + * + * @param section + * @param method + */ + void sort(ContainerSection section, SortingMethod method); +} diff --git a/src/main/java/invtweaks/api/SortingMethod.java b/src/main/java/invtweaks/api/SortingMethod.java new file mode 100644 index 000000000..b824143ef --- /dev/null +++ b/src/main/java/invtweaks/api/SortingMethod.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api; + +public enum SortingMethod { + /** + * Standard 'r' sorting for generic inventories + */ + DEFAULT, + /** + * Sort method creating vertical columns of items. + * Used for chests only, requires container to have a valid row size for correct results. + */ + VERTICAL, + /** + * Sort method creating horizontal rows of items. + * Used for chests only, requires container to have a valid row size for correct results. + */ + HORIZONTAL, + /** + * Sort method for player inventory. + * Applies to extra player-specified sorting rules for the main inventory. + * Will always operate on main inventory. + */ + INVENTORY, + /** + * Attempts to even the number of items in each stack of the same type of item, without moving full stacks. + * Used in crafting grid sorting. + */ + EVEN_STACKS, +} diff --git a/src/main/java/invtweaks/api/container/ChestContainer.java b/src/main/java/invtweaks/api/container/ChestContainer.java new file mode 100644 index 000000000..a85c412a1 --- /dev/null +++ b/src/main/java/invtweaks/api/container/ChestContainer.java @@ -0,0 +1,38 @@ +package invtweaks.api.container; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A marker for containers that have a chest-like persistant storage component. Enables the Inventroy Tweaks sorting + * buttons for this container. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ChestContainer { + // Set to true if the Inventory Tweaks sorting buttons should be shown for this container. + boolean showButtons() default true; + + // Size of a chest row + int rowSize() default 9; + + // Uses 'large chest' mode for sorting buttons + // (Renders buttons vertically down the right side of the GUI) + boolean isLargeChest() default false; + + // Annotation for method to get size of a chest row if it is not a fixed size for this container class + // Signature int func() + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @interface RowSizeCallback { + } + + // Annotation for method to get size of a chest row if it is not a fixed size for this container class + // Signature int func() + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.METHOD) + @interface IsLargeCallback { + } +} diff --git a/src/main/java/invtweaks/api/container/ContainerSection.java b/src/main/java/invtweaks/api/container/ContainerSection.java new file mode 100644 index 000000000..83c2e08a4 --- /dev/null +++ b/src/main/java/invtweaks/api/container/ContainerSection.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2013 Andrew Crocker + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package invtweaks.api.container; + +/** + * Names for specific parts of containers. For unknown container types (such as mod containers), only INVENTORY and + * CHEST sections are available. + */ +public enum ContainerSection { + /** + * The player's inventory + */ + INVENTORY, + /** + * The player's inventory (only the hotbar) + */ + INVENTORY_HOTBAR, + /** + * The player's inventory (all except the hotbar) + */ + INVENTORY_NOT_HOTBAR, + /** + * The chest or dispenser contents. Also used for unknown container contents. + */ + CHEST, + /** + * The crafting input + */ + CRAFTING_IN, + /** + * The crafting input, for containters that store it internally + */ + CRAFTING_IN_PERSISTENT, + /** + * The crafting output + */ + CRAFTING_OUT, + /** + * The armor slots + */ + ARMOR, + /** + * The furnace input + */ + FURNACE_IN, + /** + * The furnace output + */ + FURNACE_OUT, + /** + * The furnace fuel + */ + FURNACE_FUEL, + /** + * The enchantment table slot + */ + ENCHANTMENT, + /** + * The three bottles slots in brewing tables + * NOTE: Do not use without also using BREWING_INGREDIENT. + */ + BREWING_BOTTLES, + /** + * The top slot in brewing tables + * NOTE: Do not use without also using BREWING_BOTTLES. + */ + BREWING_INGREDIENT +} diff --git a/src/main/java/invtweaks/api/container/ContainerSectionCallback.java b/src/main/java/invtweaks/api/container/ContainerSectionCallback.java new file mode 100644 index 000000000..379206b37 --- /dev/null +++ b/src/main/java/invtweaks/api/container/ContainerSectionCallback.java @@ -0,0 +1,16 @@ +package invtweaks.api.container; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A marker for a method to call which returns the set of ContainerSections for this container. + *

+ * Signature of the method should be Map> func() + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.METHOD) +public @interface ContainerSectionCallback { +} diff --git a/src/main/java/invtweaks/api/container/IgnoreContainer.java b/src/main/java/invtweaks/api/container/IgnoreContainer.java new file mode 100644 index 000000000..86e8aea12 --- /dev/null +++ b/src/main/java/invtweaks/api/container/IgnoreContainer.java @@ -0,0 +1,15 @@ +package invtweaks.api.container; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Use this annotation to override inherited annotation properties and mark a Container as unsortable. + * This effect is inherited as well. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface IgnoreContainer { +} diff --git a/src/main/java/invtweaks/api/container/InventoryContainer.java b/src/main/java/invtweaks/api/container/InventoryContainer.java new file mode 100644 index 000000000..d5a45b912 --- /dev/null +++ b/src/main/java/invtweaks/api/container/InventoryContainer.java @@ -0,0 +1,20 @@ +package invtweaks.api.container; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * A marker for containers that need special treatment, such as crafting inputs or alternate player inventory positions, + * but do not have a chest-like component. + *

+ * Does not enable the Inventory Tweaks sorting buttons for this container. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface InventoryContainer { + // Set to true if the Inventory Tweaks options button should be shown for this container. + // (For instance, if you are replacing a vanilla container such as the player's inventory) + boolean showOptions() default true; +} diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index f41a17b94..572582927 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -55,6 +55,17 @@ tile.actuallyadditions.blockPhantomface.name=Phantomface tooltip.actuallyadditions.blockPhantomface.desc.1=Like a Hopper-Chain, only Wireless! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomface.desc.2=Input things into me to input into connected Blocks! +tile.actuallyadditions.blockPhantomEnergyface.name=Phantom Energyface +tooltip.actuallyadditions.blockPhantomEnergyface.desc.1=Like a Conduit, only Wireless! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomEnergyface.desc.2=Put RF through me! + +tile.actuallyadditions.blockPhantomLiquiface.name=Phantom Liquiface +tooltip.actuallyadditions.blockPhantomLiquiface.desc.1=Like a Pipe, only Wireless! Connect me with a Phantom Connector! +tooltip.actuallyadditions.blockPhantomLiquiface.desc.2=Put Fluids through me! Auto-Outputs too! +tooltip.actuallyadditions.blockPhantomLiquiface.desc.3=Important: When having a linked Fluid Container that can input and output +tooltip.actuallyadditions.blockPhantomLiquiface.desc.4=the same Fluid, set possible Pipes to Input/Output Only Mode, +tooltip.actuallyadditions.blockPhantomLiquiface.desc.5=otherwise fluids will flow back and forward indefinitely! + tile.actuallyadditions.blockPhantomPlacer.name=Phantom Placer tooltip.actuallyadditions.blockPhantomPlacer.desc.1=Places Blocks from a distance! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomPlacer.desc.2=Sneak-Right-Click with an empty hand to see its Connections! @@ -311,7 +322,7 @@ tooltip.actuallyadditions.itemFoodChocolateCake.desc=Looks delicious. With redbe tooltip.actuallyadditions.itemFoodNoodle.desc=Just one. Like... that's not much. tooltip.actuallyadditions.itemFoodSpaghetti.desc=The most generic food ever. So clichée. tooltip.actuallyadditions.itemFoodFrenchFry.desc=French. Fry. -tooltip.actuallyadditions.itemFoodFrenchFries.desc=Much like French Fires, but actually taste good. +tooltip.actuallyadditions.itemFoodFrenchFries.desc=Much like French Fires, not as hot though... tooltip.actuallyadditions.itemFoodFishNChips.desc=It's Fish. It's Chips. Or French Fries. Whatevs. tooltip.actuallyadditions.itemFoodCarrotJuice.desc=Carrots, but pressed! tooltip.actuallyadditions.itemFoodPumpkinStew.desc=Like Mushroom Stew or Rabbit Stew, but pumpykinny. @@ -383,6 +394,8 @@ container.actuallyadditions.oilGenerator.name=Oil Generator container.actuallyadditions.phantomPlacer.name=Phantom Placer container.actuallyadditions.phantomBreaker.name=Phantom Breaker container.actuallyadditions.phantomface.name=Phantomface +container.actuallyadditions.liquiface.name=Liquiface +container.actuallyadditions.energyface.name=Energyface container.actuallyadditions.nei.crushing.name=Crusher diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomBreaker.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomBreaker.png new file mode 100644 index 0000000000000000000000000000000000000000..8a28eb99e99aa5a0a89eaf54bdec7f5fcfd7fc05 GIT binary patch literal 804 zcmV+<1Ka$GP)WFU8GbZ8()Nlj2>E@cM*00M|fL_t(I%T1HNi=1^3 z#y>Ojec#=?y}i2)XE10AQz;Tc3QM^%h~O1A+E@evB3NqapI~nzB8s-Avd#Sg8W6D% z>{6LzH~aJ5eZMnfu_t8OVIH1&e#oo0-c2hFstuxwYC*-=Z5Q;rHFeh!Uh!Ii1QApX zEd{eeX_^6I1=W`SfdC3Y0ue!klO)miB%o>-iHK0d_D5<3P$Heo;P+o&$JE$udKS|q zckcZLs^Ct9Bd&x7Mb%I%WG3NTA}Se`mx4&l&Jox8RtP}tOAxTJpMBcc4k)ld? zPrqC9-4`>C&Q3VFe#-cC%=l!Cn$mYW=FeB$eeW^h4uG0bGAfyh*Dc{Y7F|z1o%8Y> zos4OQEyokVn!VU$f+%wH&3h>-{PMN3m@aufU65Y+`}05Ot^kI>gD0P1YV?~O^Vy1b zKKN_zT11c6Er*j4mmgnpZE}p5(E(H73D5z{*%A-uhg;upe0oG_2B@_ZuRR$~?Y6YQ z`1At^-0Oa`Wt&Hj*V5Ql|*^Ea&zQ(ub z519bxKb`Z@SBhGLl_8}WBC2@ZQA8AEAB;>VTmaatHr#)7K{ISwPuG+dL=-V2(xFyr zzd^3uxRYKhnfs=R2%<(QElqn!X%8@KKxDrM+0wQE4nTd#@W{9=>@(@H; i1SM+Sv%JzRqVgZc2R{w;7afoQ0000;e3C92c03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00NCkL_t(I%T1F#tDI#J zhOe1<-gozW?AhIL42q`EN{bLuh**f&7;JJ1Evy8=LQ)D^iod{85DSAKSeU|87B;4^ zGl~}e2$Sq)zjxnfW-Q)_PCLxZJ=Z-WPrvY5T4_*i5LHwQD#l^Iq&sY=haKS+uN6oT zLDkSwFe{X%86Z|rZTYtmKp{vVB8YI3B)X0SR1G5$5sFw}q*eeW(#Z^d`|&wUjl;HM zIa_h<#(hu)cOo2dB{V3ihFT#r3EvY@$*8R6C%p01H)w%hZheTA0ze=n2?>zM^H(oY zR0;3s4jXQNJm>U$%=q$z(PYGEJVH(Bb_W)Z)?9zi32?{R5*hM18Kv4d_7>9Crw@Ni!J;!DmZr<7)ZT1)ZTk>S+c z9v#AHa*FhXs9Uf>uVOh{0s=sD)X)x(sI^kO+Y|2W);sRJc|mDgL=rJ*r~j?+`0qK8 z{Pg~NxI3j8;;~02PhHJSN6auQ-23hdr5&)HZ&=QjJe)1a>YN-kjLyfr{YlcaCs-L! z_iKtrCBxASM1s^Hhk16FcRt8vUdv#~$FJ)8*0V_>^&Sw1l z?X%qc{w`wh^((LQ?x%`cgOwqr86v89Jy1jxr1vY+3GYE|*IVwsb3rp~*~~VS7DN;= zBhsN(YPUr$J##I+RxQd*k!n9?3$)__Q#2i!X{D((l0mI5MVCYgzdp=OA+ n{qqn+RsJ#|}d8t~KSy00000NkvXXu0mjfvoT)| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png new file mode 100644 index 0000000000000000000000000000000000000000..e345b3db8319f60e2229227e5118c0000ef5127b GIT binary patch literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqf`b4#s{7* zjv*CsZ_hhs9dQs~Ir#U#^k4C6ffGxXIEc%$`G_A$eJQee{{DBrKY#uE%%XDPvMYDq z%$18hev;dC>9e%=UtU=G#jVgZHLqUoe!cLMlkdu%H?3`V^-UJf@;ZC=-ph-nbM^!T zXXSnK>tFZyN$aej;?3n%C9>-JSEkIG{r2+Wx|jY_X9WenPWvs_uV=dpC>mvc`+G&n z%Zp2wUAeOB=Dy>Lz5De{moB?@_M5F-Y*oohP1CJ;+unbCacQx)@5+^>n``^sr_04= zdHJrL{kGa>*OwPT!C6^%|K$G4fY<`$dI4P(5Yhv5oF>pDpdH+T*H^`xZ#{qUC8 zg%}RD-@-;yi!R(VX`656n9V+mh5CK{cTF8bk4X2jTWb0(!1Tc2>FVdQ&MBb@08|MS A$N&HU literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 87263fb92..531261f2b 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -10,7 +10,7 @@ "authorList": [ "Ellpeck" ], - "credits": "xdqmhose, GlenthorLP, Paktosan", + "credits": "xdqmhose, GlenthorLP, Paktosan, Lordhallo", "logoFile": "assets/actuallyadditions/textures/logo.png", "screenshots": [ ], From 505162cfd04bf5c7766c24177284596364eecced Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sat, 30 May 2015 17:47:57 +0200 Subject: [PATCH 10/29] -Ready for Version 0.0.5.3 --- build.gradle | 2 +- .../ellpeck/actuallyadditions/PLANNED.txt | 7 +- .../blocks/BlockFluidCollector.java | 135 +++++++++++ .../actuallyadditions/blocks/InitBlocks.java | 9 + .../config/values/ConfigCrafting.java | 9 +- .../crafting/BlockCrafting.java | 44 +++- .../creative/CreativeTab.java | 4 +- .../inventory/ContainerFluidCollector.java | 88 ++++++++ .../inventory/ContainerOilGenerator.java | 3 +- .../inventory/GuiFluidCollector.java | 59 +++++ .../inventory/GuiHandler.java | 7 + .../items/metalists/TheJams.java | 12 +- .../nei/NEIActuallyAdditionsConfig.java | 5 + .../network/PacketFluidCollectorToClient.java | 81 +++++++ .../network/PacketHandler.java | 1 + .../tile/TileEntityBase.java | 2 + .../tile/TileEntityBreaker.java | 18 +- .../tile/TileEntityDropper.java | 5 +- .../tile/TileEntityFluidCollector.java | 213 ++++++++++++++++++ .../tile/TileEntityPhantomPlacer.java | 11 +- .../tile/TileEntityPhantomface.java | 10 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 36 ++- .../assets/actuallyadditions/lang/en_US.lang | 9 +- .../textures/blocks/blockFluidCollector.png | Bin 0 -> 767 bytes .../blocks/blockFluidCollectorFront.png | Bin 0 -> 791 bytes .../blocks/blockFluidCollectorTop.png | Bin 0 -> 575 bytes .../textures/blocks/blockFluidPlacer.png | Bin 0 -> 779 bytes .../textures/blocks/blockFluidPlacerFront.png | Bin 0 -> 757 bytes .../textures/blocks/blockFluidPlacerTop.png | Bin 0 -> 575 bytes .../blocks/blockPhantomEnergyface.png | Bin 0 -> 663 bytes .../textures/blocks/blockPhantomLiquiface.png | Bin 0 -> 643 bytes .../blocks/models/special/modelEllpeck.png | Bin 1076 -> 1015 bytes .../textures/gui/guiFluidCollector.png | Bin 0 -> 1890 bytes src/main/resources/mcmod.info | 2 +- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 37 files changed, 724 insertions(+), 54 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerFluidCollector.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java create mode 100644 src/main/java/ellpeck/actuallyadditions/network/PacketFluidCollectorToClient.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollector.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorFront.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidPlacer.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidPlacerFront.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidPlacerTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomEnergyface.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockPhantomLiquiface.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiFluidCollector.png diff --git a/build.gradle b/build.gradle index f4c2ae758..6bbc56aff 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.2" +version = "1.7.10-0.0.5.3" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index 06c52a7ef..a1a0366ed 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -70,10 +70,11 @@ -On Activation, all blocks in the area get a Signal -Lava Factory - -2x3 Multi Block + -Bowl-Looking Multi Block -Requires Energy - -Produces Lava from Cobblestone - -Has Upgrade Slots + -Produces Lava + -Has a Controller in the Middle + -Places produced Lava Blocks on top of the Controller -Thermopile -Needs a hot and a cold fluid diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java new file mode 100644 index 000000000..5c7ec84af --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java @@ -0,0 +1,135 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.BlockPistonBase; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockFluidCollector extends BlockContainerBase implements INameableItem{ + + private IIcon frontIcon; + private IIcon topIcon; + + private boolean isPlacer; + + public BlockFluidCollector(boolean isPlacer){ + super(Material.rock); + this.isPlacer = isPlacer; + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack){ + int rotation = BlockPistonBase.determineOrientation(world, x, y, z, player); + world.setBlockMetadataWithNotify(x, y, z, rotation, 2); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return this.isPlacer ? new TileEntityFluidCollector.TileEntityFluidPlacer() : new TileEntityFluidCollector(); + } + + @Override + public IIcon getIcon(int side, int meta){ + if(side == 0 || side == 1) return this.topIcon; + if(side == 3) return this.frontIcon; + return this.blockIcon; + } + + @Override + public IIcon getIcon(IBlockAccess world, int x, int y, int z, int side){ + int meta = world.getBlockMetadata(x, y, z); + if(side != meta && (side == 0 || side == 1)) return this.topIcon; + if(side == meta) return this.frontIcon; + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.frontIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Front"); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityFluidCollector collector = (TileEntityFluidCollector)world.getTileEntity(x, y, z); + if (collector != null) player.openGui(ActuallyAdditions.instance, GuiHandler.FLUID_COLLECTOR_ID, world, x, y, z); + return true; + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return this.isPlacer ? "blockFluidPlacer" : "blockFluidCollector"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 46e4331cc..8333e9419 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -51,6 +51,9 @@ public class InitBlocks{ public static Block blockPhantomLiquiface; public static Block blockPhantomEnergyface; + public static Block blockFluidPlacer; + public static Block blockFluidCollector; + public static void init(){ Util.logInfo("Initializing Blocks..."); @@ -151,5 +154,11 @@ public class InitBlocks{ blockDropper = new BlockDropper(); BlockUtil.register(blockDropper, BlockDropper.TheItemBlock.class); + + blockFluidPlacer = new BlockFluidCollector(true); + BlockUtil.register(blockFluidPlacer, BlockFluidCollector.TheItemBlock.class); + + blockFluidCollector = new BlockFluidCollector(false); + BlockUtil.register(blockFluidCollector, BlockFluidCollector.TheItemBlock.class); } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java index c88e70e39..fb0fbcd9b 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java @@ -80,7 +80,14 @@ public enum ConfigCrafting{ COAL_GENERATOR("Coal Generator", ConfigCategories.BLOCKS_CRAFTING), OIL_GENERATOR("Oil Generator", ConfigCategories.BLOCKS_CRAFTING), PHANTOMFACE("Phantomface", ConfigCategories.BLOCKS_CRAFTING), - PHANTOM_CONNECTOR("Phantom Connector", ConfigCategories.ITEMS_CRAFTING); + PHANTOM_CONNECTOR("Phantom Connector", ConfigCategories.ITEMS_CRAFTING), + + PHANTOM_ENERGYFACE("Phantom Energyface", ConfigCategories.BLOCKS_CRAFTING), + PHANTOM_LIQUIFACE("Phantom Liquiface", ConfigCategories.BLOCKS_CRAFTING), + PHANTOM_PLACER("Phantom Placer", ConfigCategories.BLOCKS_CRAFTING), + PHANTOM_BREAKER("Phantom Breaker", ConfigCategories.BLOCKS_CRAFTING), + LIQUID_PLACER("Liquid Placer", ConfigCategories.BLOCKS_CRAFTING), + LIQUID_BREAKER("Liquid Collector", ConfigCategories.BLOCKS_CRAFTING); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index e09415721..43bc0c64c 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -60,12 +60,52 @@ public class BlockCrafting{ //Phantomface if(ConfigCrafting.PHANTOMFACE.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockPhantomface), - "ECE", "EBE", "ESE", + " C ", "EBE", " S ", 'E', Items.ender_eye, 'C', Blocks.chest, 'S', TheMiscItems.COIL_ADVANCED.getOredictName(), 'B', TheMiscBlocks.ENDERPEARL_BLOCK.getOredictName())); + //Phantom Placer + if(ConfigCrafting.PHANTOM_PLACER.isEnabled()) + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitBlocks.blockPhantomPlacer), + ((INameableItem)InitBlocks.blockPlacer).getOredictName(), + ((INameableItem)InitBlocks.blockPhantomface).getOredictName())); + + //Phantom Breaker + if(ConfigCrafting.PHANTOM_BREAKER.isEnabled()) + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitBlocks.blockPhantomBreaker), + ((INameableItem)InitBlocks.blockBreaker).getOredictName(), + ((INameableItem)InitBlocks.blockPhantomface).getOredictName())); + + //Phantom Energyface + if(ConfigCrafting.PHANTOM_ENERGYFACE.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockPhantomEnergyface), + " R ", "RFR", " R ", + 'R', "dustRedstone", + 'F', ((INameableItem)InitBlocks.blockPhantomface).getOredictName())); + + //Phantom Liquiface + if(ConfigCrafting.PHANTOM_LIQUIFACE.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockPhantomLiquiface), + "RFR", + 'R', Items.bucket, + 'F', ((INameableItem)InitBlocks.blockPhantomface).getOredictName())); + + //Liquid Placer + if(ConfigCrafting.LIQUID_PLACER.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockFluidPlacer), + "RFR", + 'R', Items.bucket, + 'F', ((INameableItem)InitBlocks.blockPlacer).getOredictName())); + + //Liquid Breaker + if(ConfigCrafting.LIQUID_BREAKER.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockFluidCollector), + "RFR", + 'R', Items.bucket, + 'F', ((INameableItem)InitBlocks.blockBreaker).getOredictName())); + //Oil Generator if(ConfigCrafting.OIL_GENERATOR.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockOilGenerator), @@ -233,7 +273,7 @@ public class BlockCrafting{ "CCC", "CRP", "CCC", 'C', "cobblestone", 'R', TheMiscItems.COIL.getOredictName(), - 'P', Items.diamond_pickaxe)); + 'P', Items.iron_pickaxe)); //Dropper if(ConfigCrafting.DROPPER.isEnabled()) diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 4e6f0e9ff..c5e17c237 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -48,6 +48,8 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockBreaker); this.addBlock(InitBlocks.blockPlacer); this.addBlock(InitBlocks.blockDropper); + this.addBlock(InitBlocks.blockFluidPlacer); + this.addBlock(InitBlocks.blockFluidCollector); this.addBlock(InitBlocks.blockMisc); this.addBlock(InitBlocks.blockFeeder); @@ -94,7 +96,7 @@ public class CreativeTab extends CreativeTabs{ @Override public Item getTabIconItem(){ - return Item.getItemFromBlock(InitBlocks.blockPhantomPlacer); + return Item.getItemFromBlock(InitBlocks.blockPhantomLiquiface); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFluidCollector.java new file mode 100644 index 000000000..4b1ce7ddb --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFluidCollector.java @@ -0,0 +1,88 @@ +package ellpeck.actuallyadditions.inventory; + +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; + +@InventoryContainer +public class ContainerFluidCollector extends Container{ + + private TileEntityFluidCollector collector; + + public ContainerFluidCollector(InventoryPlayer inventory, TileEntityBase tile){ + this.collector = (TileEntityFluidCollector)tile; + + this.addSlotToContainer(new Slot(collector, 0, 90, 73)); + this.addSlotToContainer(new SlotOutput(collector, 1, 90, 42)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.collector.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 2; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(this.collector.isPlacer){ + if(FluidContainerRegistry.isBucket(currentStack) && !newStack.isItemEqual(FluidContainerRegistry.EMPTY_BUCKET)){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + else{ + if(newStack.isItemEqual(FluidContainerRegistry.EMPTY_BUCKET)){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java index 570cac557..fbe538a00 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.inventory; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; @@ -29,7 +30,7 @@ public class ContainerOilGenerator extends Container{ this.generator = (TileEntityOilGenerator)tile; this.addSlotToContainer(new Slot(this.generator, 0, 98, 74)); - this.addSlotToContainer(new Slot(this.generator, 1, 98, 43)); + this.addSlotToContainer(new SlotOutput(this.generator, 1, 98, 43)); for (int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java new file mode 100644 index 000000000..d308d6dbc --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java @@ -0,0 +1,59 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiFluidCollector extends GuiContainer{ + + private TileEntityFluidCollector collector; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiFluidCollector"); + + public GuiFluidCollector(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerFluidCollector(inventory, tile)); + this.collector = (TileEntityFluidCollector)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.collector.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.collector.tank.getFluidAmount() > 0){ + int i = this.collector.getTankScaled(83); + drawTexturedModalRect(this.guiLeft+68, this.guiTop+89-i, 176, 0, 16, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + + String text2 = this.collector.tank.getFluidAmount()+"/"+this.collector.tank.getCapacity()+" mB "+ (this.collector.tank.getFluidAmount() > 0 ? this.collector.tank.getFluid().getLocalizedName() : ""); + if(x >= guiLeft+68 && y >= guiTop+6 && x <= guiLeft+83 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index d09f57ba6..a78570fcf 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -61,6 +61,9 @@ public class GuiHandler implements IGuiHandler{ case PHANTOM_PLACER_ID: TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); return new ContainerPhantomPlacer(entityPlayer.inventory, tilePlacer); + case FLUID_COLLECTOR_ID: + TileEntityBase tileCollector = (TileEntityBase)world.getTileEntity(x, y, z); + return new ContainerFluidCollector(entityPlayer.inventory, tileCollector); default: return null; } @@ -116,6 +119,9 @@ public class GuiHandler implements IGuiHandler{ case PHANTOM_PLACER_ID: TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); return new GuiPhantomPlacer(entityPlayer.inventory, tilePlacer); + case FLUID_COLLECTOR_ID: + TileEntityBase tileCollector = (TileEntityBase)world.getTileEntity(x, y, z); + return new GuiFluidCollector(entityPlayer.inventory, tileCollector); default: return null; } @@ -137,6 +143,7 @@ public class GuiHandler implements IGuiHandler{ public static final int COAL_GENERATOR_ID = 13; public static final int OIL_GENERATOR_ID = 14; public static final int PHANTOM_PLACER_ID = 15; + public static final int FLUID_COLLECTOR_ID = 16; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java index 296c24102..f2b404a13 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheJams.java @@ -5,12 +5,12 @@ import net.minecraft.item.EnumRarity; public enum TheJams implements INameableItem{ - CU_BA_RA("CuBaRa", 4, 5F, EnumRarity.rare, "jamCuBaRa", 5, 12, 12595273), - GRA_KI_BA("GraKiBa", 4, 5F, EnumRarity.rare, "jamGraKiBa", 16, 13, 5492820), - PL_AP_LE("PlApLe", 4, 5F, EnumRarity.rare, "jamPlApLe", 15, 3, 13226009), - CH_AP_CI("ChApCi", 4, 5F, EnumRarity.rare, "jamChApCi", 10, 1, 13189222), - HO_ME_KI("HoMeKi", 4, 5F, EnumRarity.rare, "jamHoMeKi", 10, 14, 2031360), - PI_CO("PiCo", 4, 5F, EnumRarity.rare, "jamPiCo", 9, 1, 16056203); + CU_BA_RA("CuBaRa", 4, 2F, EnumRarity.rare, "jamCuBaRa", 5, 12, 12595273), + GRA_KI_BA("GraKiBa", 4, 2F, EnumRarity.rare, "jamGraKiBa", 16, 13, 5492820), + PL_AP_LE("PlApLe", 4, 2F, EnumRarity.rare, "jamPlApLe", 15, 3, 13226009), + CH_AP_CI("ChApCi", 4, 2F, EnumRarity.rare, "jamChApCi", 10, 1, 13189222), + HO_ME_KI("HoMeKi", 4, 2F, EnumRarity.rare, "jamHoMeKi", 10, 14, 2031360), + PI_CO("PiCo", 4, 2F, EnumRarity.rare, "jamPiCo", 9, 1, 16056203); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java index 74fdadcff..b45733aec 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java @@ -2,7 +2,9 @@ package ellpeck.actuallyadditions.nei; import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; +import codechicken.nei.recipe.DefaultOverlayHandler; import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.inventory.GuiCrafter; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.item.ItemStack; @@ -13,6 +15,9 @@ public class NEIActuallyAdditionsConfig implements IConfigureNEI{ public void loadConfig(){ Util.logInfo("Initializing Not Enough Items Plugin..."); + API.registerGuiOverlay(GuiCrafter.class, "crafting"); + API.registerGuiOverlayHandler(GuiCrafter.class, new DefaultOverlayHandler(), "crafting"); + CrusherRecipeHandler crusherRecipeHandler = new CrusherRecipeHandler(); API.registerRecipeHandler(crusherRecipeHandler); API.registerUsageHandler(crusherRecipeHandler); diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketFluidCollectorToClient.java b/src/main/java/ellpeck/actuallyadditions/network/PacketFluidCollectorToClient.java new file mode 100644 index 000000000..6ce986166 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketFluidCollectorToClient.java @@ -0,0 +1,81 @@ +package ellpeck.actuallyadditions.network; + +import cpw.mods.fml.client.FMLClientHandler; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; +import io.netty.buffer.ByteBuf; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +public class PacketFluidCollectorToClient implements IMessage{ + + private boolean hasFluid; + private int fluidID; + private int fluidAmount; + private int x; + private int y; + private int z; + + @SuppressWarnings("unused") + public PacketFluidCollectorToClient(){ + + } + + public PacketFluidCollectorToClient(FluidStack fluid, TileEntity tile){ + if(fluid != null){ + this.hasFluid = true; + this.fluidID = fluid.getFluidID(); + this.fluidAmount = fluid.amount; + } + else this.hasFluid = false; + + this.x = tile.xCoord; + this.y = tile.yCoord; + this.z = tile.zCoord; + } + + @Override + public void fromBytes(ByteBuf buf){ + this.hasFluid = buf.readBoolean(); + this.fluidID = buf.readInt(); + this.fluidAmount = buf.readInt(); + this.x = buf.readInt(); + this.y = buf.readInt(); + this.z = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf){ + buf.writeBoolean(this.hasFluid); + buf.writeInt(this.fluidID); + buf.writeInt(this.fluidAmount); + buf.writeInt(this.x); + buf.writeInt(this.y); + buf.writeInt(this.z); + } + + public static class Handler implements IMessageHandler{ + + @Override + @SideOnly(Side.CLIENT) + public IMessage onMessage(PacketFluidCollectorToClient message, MessageContext ctx){ + World world = FMLClientHandler.instance().getClient().theWorld; + TileEntity tile = world.getTileEntity(message.x, message.y, message.z); + + if(tile instanceof TileEntityFluidCollector){ + TileEntityFluidCollector collector = (TileEntityFluidCollector)tile; + if(message.hasFluid){ + collector.tank.setFluid(new FluidStack(FluidRegistry.getFluid(message.fluidID), message.fluidAmount)); + } + else collector.tank.setFluid(null); + } + return null; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java index f136a8a9a..0884085e9 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java @@ -14,5 +14,6 @@ public class PacketHandler{ theNetwork.registerMessage(PacketTileEntityFeeder.Handler.class, PacketTileEntityFeeder.class, 0, Side.CLIENT); theNetwork.registerMessage(PacketInputterButton.Handler.class, PacketInputterButton.class, 1, Side.SERVER); + theNetwork.registerMessage(PacketFluidCollectorToClient.Handler.class, PacketFluidCollectorToClient.class, 2, Side.CLIENT); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index d5739f65e..54bf485cb 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -36,6 +36,8 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityPhantomface.TileEntityPhantomEnergyface.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomEnergyface"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomPlacer"); GameRegistry.registerTileEntity(TileEntityPhantomPlacer.TileEntityPhantomBreaker.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBreaker"); + GameRegistry.registerTileEntity(TileEntityFluidCollector.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidCollector"); + GameRegistry.registerTileEntity(TileEntityFluidCollector.TileEntityFluidPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidPlacer"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index 2fb16fca0..2c6e8e5ef 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -70,10 +70,9 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ } } else if(this.isPlacer && worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ)){ - ItemStack removeFalse = removeFromInventory(this.slots, false); - if(removeFalse != null && WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, removeFalse)){ - removeFromInventory(this.slots, true); - } + int theSlot = testInventory(this.slots); + this.setInventorySlotContents(theSlot, WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, this.slots[theSlot])); + if(this.slots[0] != null && this.slots[0].stackSize <= 0) this.slots[0] = null; } } } @@ -112,18 +111,13 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ return working >= stacks.size(); } - public static ItemStack removeFromInventory(ItemStack[] slots, boolean actuallyDo){ + public static int testInventory(ItemStack[] slots){ for(int i = 0; i < slots.length; i++){ if(slots[i] != null){ - ItemStack slot = slots[i].copy(); - if(actuallyDo){ - slots[i].stackSize--; - if(slots[i].stackSize <= 0) slots[i] = slots[i].getItem().getContainerItem(slots[i]); - } - return slot; + return i; } } - return null; + return 0; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityDropper.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityDropper.java index eeed05a36..80ba33391 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityDropper.java @@ -11,7 +11,10 @@ public class TileEntityDropper extends TileEntityInventoryBase{ private final int timeNeeded = ConfigIntValues.DROPPER_TIME_NEEDED.getValue(); private int currentTime; - @SuppressWarnings("unused") + public TileEntityDropper(int slots, String name){ + super(slots, name); + } + public TileEntityDropper(){ super(9, "dropper"); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java new file mode 100644 index 000000000..b42cf8589 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java @@ -0,0 +1,213 @@ +package ellpeck.actuallyadditions.tile; + +import cpw.mods.fml.common.network.NetworkRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.network.PacketFluidCollectorToClient; +import ellpeck.actuallyadditions.network.PacketHandler; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.ChunkCoordinates; +import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.*; + +public class TileEntityFluidCollector extends TileEntityInventoryBase implements IFluidHandler{ + + public FluidTank tank = new FluidTank(8*FluidContainerRegistry.BUCKET_VOLUME); + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + if(this.isPlacer){ + this.sendPacket(); + return this.tank.fill(resource, doFill); + } + return 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + if(!this.isPlacer){ + this.sendPacket(); + return this.tank.drain(resource.amount, doDrain); + } + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + if(!this.isPlacer){ + this.sendPacket(); + return this.tank.drain(maxDrain, doDrain); + } + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return this.isPlacer && from != ForgeDirection.DOWN; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return !this.isPlacer && from != ForgeDirection.UP; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + return new FluidTankInfo[]{this.tank.getInfo()}; + } + + public static class TileEntityFluidPlacer extends TileEntityFluidCollector{ + + public TileEntityFluidPlacer(){ + super(2, "fluidPlacer"); + this.isPlacer = true; + } + + } + + public boolean isPlacer; + + private final int timeNeeded = ConfigIntValues.BREAKER_TIME_NEEDED.getValue(); + private int currentTime; + + public TileEntityFluidCollector(int slots, String name){ + super(slots, name); + } + + public TileEntityFluidCollector(){ + super(2, "fluidCollector"); + this.isPlacer = false; + } + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + + int amountBefore = this.tank.getFluidAmount(); + if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ + if(this.currentTime > 0){ + this.currentTime--; + if(this.currentTime <= 0){ + ForgeDirection sideToManipulate = ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)); + + ChunkCoordinates coordsBlock = WorldUtil.getCoordsFromSide(sideToManipulate, xCoord, yCoord, zCoord); + if(coordsBlock != null){ + Block blockToBreak = worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ); + if(!this.isPlacer && blockToBreak != null && worldObj.getBlockMetadata(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ) == 0){ + if(blockToBreak instanceof IFluidBlock && ((IFluidBlock)blockToBreak).getFluid() != null){ + if(this.tank.fill(new FluidStack(((IFluidBlock)blockToBreak).getFluid(), FluidContainerRegistry.BUCKET_VOLUME), false) >= FluidContainerRegistry.BUCKET_VOLUME){ + this.tank.fill(new FluidStack(((IFluidBlock)blockToBreak).getFluid(), FluidContainerRegistry.BUCKET_VOLUME), true); + WorldUtil.breakBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord); + } + } + else if(blockToBreak == Blocks.lava || blockToBreak == Blocks.flowing_lava){ + if(this.tank.fill(new FluidStack(FluidRegistry.LAVA, FluidContainerRegistry.BUCKET_VOLUME), false) >= FluidContainerRegistry.BUCKET_VOLUME){ + this.tank.fill(new FluidStack(FluidRegistry.LAVA, FluidContainerRegistry.BUCKET_VOLUME), true); + WorldUtil.breakBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord); + } + } + else if(blockToBreak == Blocks.water || blockToBreak == Blocks.flowing_water){ + if(this.tank.fill(new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), false) >= FluidContainerRegistry.BUCKET_VOLUME){ + this.tank.fill(new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), true); + WorldUtil.breakBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord); + } + } + } + else if(this.isPlacer && worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ)){ + if(this.tank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME){ + if(this.tank.getFluid().getFluid().getBlock() != null){ + Block block = worldObj.getBlock(xCoord+sideToManipulate.offsetX, yCoord+sideToManipulate.offsetY, zCoord+sideToManipulate.offsetZ); + if(!(block instanceof IFluidBlock) && block != Blocks.lava && block != Blocks.water && block != Blocks.flowing_lava && block != Blocks.flowing_water){ + WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, new ItemStack(this.tank.getFluid().getFluid().getBlock())); + this.tank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); + } + } + } + } + } + } + } + else this.currentTime = this.timeNeeded; + } + + if(!this.isPlacer){ + if(this.slots[0] != null && this.slots[0].getItem() == Items.bucket && this.slots[1] == null){ + if(this.tank.getFluidAmount() >= FluidContainerRegistry.BUCKET_VOLUME){ + this.slots[1] = FluidContainerRegistry.fillFluidContainer(this.tank.getFluid(), this.slots[0].copy()); + this.slots[0].stackSize--; + if(this.slots[0].stackSize == 0) this.slots[0] = null; + this.tank.drain(FluidContainerRegistry.BUCKET_VOLUME, true); + } + } + } + else{ + if(this.slots[0] != null && FluidContainerRegistry.isBucket(this.slots[0]) && !this.slots[0].isItemEqual(FluidContainerRegistry.EMPTY_BUCKET) && (this.slots[1] == null || this.slots[1].stackSize < this.slots[1].getMaxStackSize())){ + if(FluidContainerRegistry.BUCKET_VOLUME <= this.tank.getCapacity()-this.tank.getFluidAmount()){ + if(this.slots[1] == null) this.slots[1] = new ItemStack(Items.bucket); + else this.slots[1].stackSize++; + this.tank.fill(FluidContainerRegistry.getFluidForFilledItem(this.slots[0]), true); + this.slots[0] = null; + } + } + } + + if(this.tank.getFluidAmount() > 0 && !this.isPlacer){ + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.tank); + } + + if(amountBefore != this.tank.getFluidAmount()){ + this.sendPacket(); + } + } + } + + public void sendPacket(){ + PacketHandler.theNetwork.sendToAllAround(new PacketFluidCollectorToClient(this.tank.getFluid(), this), new NetworkRegistry.TargetPoint(this.worldObj.provider.dimensionId, this.xCoord, this.yCoord, this.zCoord, 120)); + } + + @SideOnly(Side.CLIENT) + public int getTankScaled(int i){ + return this.tank.getFluidAmount() * i / this.tank.getCapacity(); + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + super.writeToNBT(compound); + compound.setInteger("CurrentTime", this.currentTime); + this.tank.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + super.readFromNBT(compound); + this.currentTime = compound.getInteger("CurrentTime"); + this.tank.readFromNBT(compound); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + if(i == 0){ + if(this.isPlacer) return FluidContainerRegistry.isFilledContainer(stack); + else return stack.isItemEqual(FluidContainerRegistry.EMPTY_BUCKET); + } + return false; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == 1; + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java index 1ef588601..f5ebc4f3b 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java @@ -73,10 +73,9 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ } else{ if(boundWorld.getBlock(boundPosition.posX, boundPosition.posY, boundPosition.posZ).isReplaceable(boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ)){ - ItemStack removeFalse = TileEntityBreaker.removeFromInventory(this.slots, false); - if(removeFalse != null && WorldUtil.placeBlockAtSide(ForgeDirection.UNKNOWN, boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ, removeFalse)){ - TileEntityBreaker.removeFromInventory(this.slots, true); - } + int theSlot = TileEntityBreaker.testInventory(this.slots); + this.setInventorySlotContents(theSlot, WorldUtil.placeBlockAtSide(ForgeDirection.UNKNOWN, boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ, this.slots[theSlot])); + if(this.slots[0] != null && this.slots[0].stackSize <= 0) this.slots[0] = null; } } } @@ -140,7 +139,7 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return true; + return !this.isBreaker; } @Override @@ -150,6 +149,6 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return false; + return this.isBreaker; } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index 54f98befa..aea8715ae 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -149,12 +149,14 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ if(tile != null && tile instanceof IFluidHandler){ for(FluidTankInfo myInfo : this.getTankInfo(side)){ for(FluidTankInfo hisInfo : ((IFluidHandler)tile).getTankInfo(side.getOpposite())){ - if(myInfo != null && hisInfo != null && myInfo.fluid != null){ + if(myInfo != null && hisInfo != null && myInfo.fluid != null && myInfo.fluid.getFluid() != null){ if(((IFluidHandler)tile).canFill(side.getOpposite(), myInfo.fluid.getFluid()) && this.canDrain(side, myInfo.fluid.getFluid())){ FluidStack receive = this.drain(side, Math.min(hisInfo.capacity-(hisInfo.fluid == null ? 0 : hisInfo.fluid.amount), myInfo.fluid.amount), false); - int actualReceive = ((IFluidHandler)tile).fill(side.getOpposite(), receive, true); - this.drain(side, new FluidStack(receive.getFluid(), actualReceive), true); - worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); + if(receive != null){ + int actualReceive = ((IFluidHandler)tile).fill(side.getOpposite(), receive, true); + this.drain(side, new FluidStack(receive.getFluid(), actualReceive), true); + worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index ebfdedb00..73e0741d5 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.2"; + public static final String VERSION = "1.7.10-0.0.5.3"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 89dc52e58..6352ca447 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -2,7 +2,9 @@ package ellpeck.actuallyadditions.util; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; +import net.minecraft.block.Block; import net.minecraft.entity.item.EntityItem; +import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; @@ -10,10 +12,8 @@ import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidContainerRegistry; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.IFluidHandler; +import net.minecraftforge.fluids.*; +import org.apache.logging.log4j.Level; public class WorldUtil{ @@ -55,26 +55,40 @@ public class WorldUtil{ } } - public static boolean placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ - if(world instanceof WorldServer){ + public static ItemStack placeBlockAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ + if(world instanceof WorldServer && stack != null && stack.getItem() != null){ //Fluids FluidStack fluid = FluidContainerRegistry.getFluidForFilledItem(stack); if(fluid != null && fluid.getFluid().getBlock() != null && fluid.getFluid().getBlock().canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ - return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, fluid.getFluid().getBlock()); + Block block = world.getBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ); + if(!(block instanceof IFluidBlock) && block != Blocks.lava && block != Blocks.water && block != Blocks.flowing_lava && block != Blocks.flowing_water){ + if(world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, fluid.getFluid().getBlock())){ + return stack.getItem().getContainerItem(stack); + } + } } //Plants if(stack.getItem() instanceof IPlantable){ if(((IPlantable)stack.getItem()).getPlant(world, x, y, z).canPlaceBlockAt(world, x+side.offsetX, y+side.offsetY, z+side.offsetZ)){ - return world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z)); + if(world.setBlock(x+side.offsetX, y+side.offsetY, z+side.offsetZ, ((IPlantable)stack.getItem()).getPlant(world, x, y, z))){ + stack.stackSize--; + return stack; + } } } - //Blocks - return stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world,x, y, z, side == ForgeDirection.UNKNOWN ? 0 : side.ordinal(), 0, 0, 0); + try{ + //Blocks + stack.tryPlaceItemIntoWorld(FakePlayerUtil.newFakePlayer(world), world, x, y, z, side == ForgeDirection.UNKNOWN ? 0 : side.ordinal(), 0, 0, 0); + return stack; + } + catch(Exception e){ + ModUtil.AA_LOGGER.log(Level.ERROR, "Something that places Blocks at "+x+", "+y+", "+z+" in World "+world.provider.dimensionId+" threw an Exception! Don't let that happen again!"); + } } - return false; + return stack; } public static boolean dropItemAtSide(ForgeDirection side, World world, int x, int y, int z, ItemStack stack){ diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 572582927..b4292fae7 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -74,6 +74,12 @@ tile.actuallyadditions.blockPhantomBreaker.name=Phantom Breaker tooltip.actuallyadditions.blockPhantomBreaker.desc.1=Breaks Blocks from a distance! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomBreaker.desc.2=Sneak-Right-Click with an empty hand to see its Connections! +tile.actuallyadditions.blockFluidPlacer.name=Fluid Placer +tooltip.actuallyadditions.blockFluidPlacer.desc=Places Fluids stored inside it + +tile.actuallyadditions.blockFluidCollector.name=Fluid Collector +tooltip.actuallyadditions.blockFluidCollector.desc=Stores Fluids in front of it inside it + item.actuallyadditions.itemPhantomConnector.name=Phantom Connector tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! tooltip.actuallyadditions.itemPhantomConnector.desc.2=Hold ALT to clear the stored TileEntity @@ -396,7 +402,8 @@ container.actuallyadditions.phantomBreaker.name=Phantom Breaker container.actuallyadditions.phantomface.name=Phantomface container.actuallyadditions.liquiface.name=Liquiface container.actuallyadditions.energyface.name=Energyface - +container.actuallyadditions.fluidPlacer.name=Fluid Placer +container.actuallyadditions.fluidCollector.name=Fluid Collector container.actuallyadditions.nei.crushing.name=Crusher container.actuallyadditions.nei.ballOfHair.name=Ball Of Hair Usage diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollector.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollector.png new file mode 100644 index 0000000000000000000000000000000000000000..b6168bcb23ae3510b1e0e286a4d3ae28a1fed707 GIT binary patch literal 767 zcmV5Q6b|Or=u6^E?2C!y)y09m6nCN->|$3B!(OjBv27dIb$Nb%rrmDSYPGO!oBjQL(ljN{b9B=*$@84s+gsMx z*Eu*i;PUbkDJ8{Xku*(dHk({rT;TgYg+hVV)m2>AMM{b3I1Zgo2g|aEqKL&}!P?py zaU64feNCxU!t*?~wzgOXTHa0fs_xqnKzhgW(Il(Xt0DRvkO;h4HW-u54U>F9z?^CPQI6ptfbzQEmuFyX* zR;yJ2q?8zj!DKRFu~;C4_zHC#ht17RfG>>ZC&nNM_`PPc87nI*j7B4pB%#;qkt7Mz z>6A*P!twF(pBQVk8trx)DJ4P(27>{k(TIAz&e72k)9I9#mluQ(NGaLb*?GrkSr(4t x5Cj2X82%xX>$(hwL*h98t4!r`8SP(n{sl{tZ__u5aJ&Ej002ovPDHLkV1fXrTmAq5 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorFront.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorFront.png new file mode 100644 index 0000000000000000000000000000000000000000..15812568dea0549ad35188b90cdb8ac4565a4e71 GIT binary patch literal 791 zcmV+y1L*vTP)2y4)7H`|SSkt%vr<}7Z^GTI=31t=F*A4p-h${tki!8H zTnH)wLBup_qfKkuH2IQQc$_oaVV>2ydS7^dJj&MARw|_gAW0IWl%#1&k|Y3($78D1 zDpE?MluRZQrqd~wWf8|Q8bG_<#`k@6UFYH9fkL6c!omUoH#av_DiwqfNGTbOM)v$I33R%2ylg-WG@uIrel$#6Jib#)cb^LTlA zLDe*kBuTixzo%ZW(`vQ2y1F8cWB%FOeNiTpAx+cw|NJMRO{Y`l=H@7sO6>3N zGaL?idU~SKXwd8Rs8lKpheH%aAqWB#MWJ4=b98jX+uIx32jk)4AwmcM9LHgMdz-;v zz{SM{073{H$HBI3(ln)3t8smO{Xb)|SR@Dn!Z1V#!P3$a0Gg%|$1w*72N;II^71l{ z{v>*BgDzb6bs{{8%!82I$<8|`+R$z;Ow^D~7)f#c)j_X8h{wr$gBGzh~G zUDuIPvi|)$rfIUcxX9`0DM1jR>pEc=vbMJN&X~<+F$@FOb@6@wkIH0O7Ruk&`6p|l VbZ82!h1&oC002ovPDHLkV1o2+YK;H@ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorTop.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidCollectorTop.png new file mode 100644 index 0000000000000000000000000000000000000000..819a8986150f50f2874485b202b96cf7ccc77127 GIT binary patch literal 575 zcmV-F0>J%=P)N2bZe?^J zG%heMHD!e|WdHyHy-7qtR5(wSl1YyNQ51#izmSMXhm^DkTVlZiiMhlOVvM0l3~io; zXl)1^D}S`Vsx{H^3@7;6mIp>vNx7$CJvRbVci^Xgzz)gddt>eFxYH1 zQ50oBwOWnG1#Xbc8}-EKD&3T3m|AEo;J zem=iZQ5?P*X#9ixwKlX)oRsfG%zNZOeSbXqY)DZgTZh(1RRYp$}Wn=aUb--fp+k=|n`>1Ds4IyoWROA zFuYDClj(HIs7j>*g(lWcr$hD>uLA(1>Xr-;0|1yNRle zK~y-)rIXD{`*;+FpL|Syp)vi^5@KyBb*Q=$5wshZb2D=Zv!6R~J@+vi1y|x;swG22 zq|sWVF|}zDf5|L5%KTw=bKtgJ+CX)%>ZkPFdPP^S^I2_XHbTCa5*L8V&d!yIu(d~9IO_RgJL$WNRC<;_v*C~pE zhld9?H#a#tI^yQ$hBQsFZJR91=yW<$K zNy5g)25}s7cXvm%TBY4?v$L~9S(f;|PoC!pA;|L_HI8F~AiyvT48!2%1VO;->no;da({o%<>e&+x)1`>G}+(Z=i}o8UDpZ2kV>V(!NCD}o@3iKgTa8s zVu7lvXqrZvrd(WHpi3#q^PH!rCw~9yS5TmoP-akmg7On61}i-WMTOsfJ|&7G9LGTg zczk@swrx{LqM&D4Mzva{)oSs_FMkrpG1KXke!tK2 z^D~a)5XUi!q7X$9ilVT!wZ-Y_>DS6DjOXX)XqpCq=XqpVMjXeCMk4?;O~dm%n$0Fx zS68^M%kAwg>KDdFqX9sgrf8bRbUGzT5`+-nrj})~y}b?ajZy!?7z6?TuK9e<+S(ev z@3UMk84iammrG`|8TERdv$L}wF*ch`dc7WLnj(Z?G#cUiKCM=Zlamu>vl;L2?+77C z)0Dlvy%k2oFt99(AP5M<@P{zDuFH5lCXVC(3{$OEL;1gP{u@@ueQ>lP8BzcM002ov JPDHLkV1h53T7Lil literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidPlacerFront.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFluidPlacerFront.png new file mode 100644 index 0000000000000000000000000000000000000000..f0c7e1bd56cd49fc29c7f8e449768cd71bece8d6 GIT binary patch literal 757 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf6951U69E94oEQKA00(qQO+^Ra1sxP9 zBcVFb8~^|SA#_DpbVG7wVRUJ4ZXi@?ZDjy5FflbcFf}?dIUq7JIy5jkGc}I)n%4jT z0!m3lK~y+TrBmHXVqp|rM~|8LlbR*|fTEb7R!|nEzJmwHQomD1kc-oRL`R^VFGG+8sI(<$6; zx8(WEW-}}n3v6$1W4T;H0Fuchy4@~}MkDI=I_!2kd_JE5JUl#LcXt&52gCPJYQn$0F$E*DNtPLRoD;PH46i9`f|;P16~d3nM9{=U@qdOhe= zRTa9AkB{(ry*N8N!~Ole(EIT7Bfd1h!s&G4?(R-HZf$L0XJ<#i=kqyKv)L@&H#Rmf z7z|`)vf!+j_U|y6Ofph7n-y)U)hb?JUxg9h`gbud2(q`gCtW$GPNzeyR>SS>t#s>j zIzpKT7>z~)<#Ji{P>DnhC?pdUtKaWSXO6=|7K;V3SWMUvoHe9>eSHm;9a;4J{EU1) zFAP|~LPb&j*tuSFpLHCU_UhJ@s4x$a4fUY71mfFZFvuR+k{R`(69iTHQ`l@anf2=G zN^EMiS_lS%GCM6~j>W^_P~LQ_P$*zL9z!`eIMBl3Frv|@bY#%3bUKaEXe4tpxW_y# zr5k)or4n>&8~JB3C=QDQfdCST1kTUTae8_xhgr*JjJ1tQJRa8$4-X~zcjR(8e5!l~ z48RY^H*tuwa|}kYSVX(shH`v-tQ{R42{q1521MsK4^dpd-;bM{8&RHnta*BR`fVc> nCp9K`N&e+B@kajVbzb5ZJ>OJ%=P)N2bZe?^J zG%heMHD!e|WdHyHy-7qtR5(wSl1YyNQ51#izmSMXhm^DkTVlZiiMhlOVvM0l3~io; zXl)1^D}S`Vsx{H^3@7;6mIp>vNx7$CJvRbVci^Xgzz)gddt>eFxYH1 zQ50oBwOWnG1#Xbc8}-EKD&3T3m|AEo;J zem=iZQ5?P*X#9ixwKlX)oRsfG%zNZOeSbXqY)DZgTZh(1RRYp$}Wn=aUb--fp+k=|n`>1Ds4IyoWROA zFuYDClj(HIs7j>*g(lWcr$hD>uLA(1>Xr-;0|1yNRWFU8GbZ8()Nlj2>E@cM*00H|+L_t(I%T1F@j?+L8 zhQDgJW5;n46U_z?2Vlz~H~`0B!2wvXW5S?tgFrHyI7O%PZGmD*O9xc~yTkyGlc@*+x^7^Rr9?J;5A&5xgD{@vFg!ng15C|{HmRmmb-;8M@^*m5~G9F8@0 z(*jE7pm5IszxNkwtSWC}lcXx~K)zW5ipF?dw@eymVdv3NpQdge5GRlzWFU8GbZ8()Nlj2>E@cM*00HMoL_t(I%Z-yglGHE| zg};_Hw#T0FF0~Mm5D;+;V(!2JNVx$Q+9Dz43`E3Ku>=$ho*&J4EU5`vv%6%tN^X_Z z-Fp4{weYM}oPZao1Tv5nlA09(EqkzYFkcZowS)D-91%bv6~}Y3m3c_4+4kzdgQv2W zZ{NKj$H=m+>DEhzn=4k=EBdRRZr$NrMLf+M4=2W-TVB2S2!J=}j_YB?X54d}W>CXo zKil*}hi^QsHt=+9WdWX~5S7)?kriHl_ySG!z=;;<(MlRWzokXM+495;G1IP>C|Gb? zR_zSHIm0Pk;IL@DJs^T70x7dtE-Zl;3%*)F=Pe>cvoRC)fqv)>fk-Lgl$fV8bywR( z?JRhx?_cGZzzJb@DEtUmBY-J0g%kht9mZhn3I%}zs)X@iQpjpGUtnKKIA_Sp?$>x9 z42m~#DBIr$%RE0K?3n%~F)3lQvsf>sjcO|U{$q!Tz?3X|%*F?g+BhY`Il^WSje}Y7 zUlOWzp1N)DZNoGM!WbC0fz6+-CG{1=h)0Z&uXjhB69jlJf;cg# z2+gp(2oKfFI3BD72f|IGHYnLt_h{1Y)mWL_O?}0t45zsua0=qe$d(qlGTNxwIoWyT dz?rC+mA^h@<-$d+Ms)xH002ovPDHLkV1iRE6ubZc literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelEllpeck.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelEllpeck.png index 4bdd01e0b3ab4e06253236922f1c19bcbdfbc746..af45ac1fae7f7d77d0376322344ada3cb7d7452d 100644 GIT binary patch delta 934 zcmV;X16lmE2=@n&JPN@801m+cxRGn^kwzzfbxA})RCr$Pm|IJgK@^7PqU@k<_ttW2 zT9&3AJdj!us0js9AsS>-cbNr6~CSxhgs(6@8#tM#QPM)RCe5Nda z@*^1Mhm4nT-d3-UB)&cgW@;~z!IhuGSLt-z>wMo;~>Zq8^jc2K<~nf$6VJ`0?d9CdM1^p>H2eEc8v->eb2S zDitN8??yT9w$Q|dLUdg&!GM^E%$hiVj9*hHF+Ft(-#;J2#MmL2cv(f7u+^)R#TDEb z!m9^Wcyhg*+cyAH$gNzQ46``}rj#LLnOhg25ixNbCXva9xPrENbu##l<|SdQw-zsH z!b^0^GMI`m%+7Q_WGr)hCI)0Bz2uYS46xLzBZpK@BBH}}cuy1FYDvP?nK1Q#tNoC% z%<x!}2-?7nKW806%y519N z_Ve0$>wY}e_3Hh+`u7Qc+Wow?UcH}J|2{zu3C(_9TkrkgNvhV*YwNuML#?0J)~omP z>fa|wfxya0t)JJ{tM~KTdao|F>BnPT?`n+a07*qo IM6N<$f|DoTkN^Mx delta 995 zcmey)zJ+6g4c8$C2EId#q8eTe6W!G7H+i}^hE&A8jX3QW94N9kdC7%oVlO7!Wjwul zDd+-&mQs_)LK~hoiA9~A7ZW^WEWT)~6dqzX5O&WfIdXVKX9u%)6SGInkxrJ!{5s$5 zzB?>(ewW}~6jsE{9JWd9^_$vncGH5dsGn1wvaiMCvZzb+I;Cr7Z7yj{55F+HO1is( zv;Nt`m8Tc1S~hc^TFB2?57*^3o6l&rzr?w`M%S5d;^pa{KMXka6=&{l3pw8ND`}>X zq;!LQmDs#rIx#B$LPCW^zl83(ykcFhtFHz>SW8)!s>-e9Ck~iQ`kAS6;>5x4mVf>k z_Rrt_eZzK3?~_{}OtEg|3U`{B;5_eF+1y_rf7VB}$t2}2_NuY5UfJUk?e@Zg|6%q| zH7WTB5Bn`sIQ=I27F6XNd78=``N-mNwq#L9`mvJ?-SVMZ|72}s&Y$*sFnLob1 z-RD(Q|9+j>eE#A_6+0t-oIY}JAtzALw8@W; z9do~-8GpKdLi63d?Hj))v1EITe|Y05cREF>?zq#NZGS($Z#Uh$-`lfpMyr0z0=DZ* zcmMzR6X@C>H`*@!y-{ht_El-_%6^|GQ$D=lc;Xz z*NvVW_+AmahW+VPp;>Z~H>%=}SgD>|)I3>C$#`4iTVA_!+o#ks`WfA_X-HV*f0ohj z2hjLG6OB#Qh-}zt)bi<;McF;S$I7zL>-#sXdfCfa6KHDN?y{{z;4Fh5$R&6F@vM4T zRTLcjXyw{HVVBh2sQk3hw|{mlt^9k!DwSyR{8U@ zQyps-J^nK@Yu02NqmA_wLe&ib_n#lVFZ|}6CKk~pU>z@ORR|Q5mXMsm#F#`kN1`uZSJN?%VC@4|l8c`CQpH@rz;wdX#WAEJ?(Lk5eo>Ah3~P`6`X8U8Y#l4rWHx8DXK7lTn_oil`G$QB zHhW|qBr^5S{ZzyH*wB65^TzBQ{mrZvsfR1hG@hRM_Wz%fH4MvhB>F8S9=xoRljj$W z$c|62c^1J?wyQf|;=ys#<)-`3mh%+sdUQA3jgc#WfluP#J?Ue~Tn+3Z3m8}JpLxlrSX~Wha#v9ea4W|2jiPw0*p6Ns7LhhQP6T%JB((hs$ zm_!)`Y{pjQ8e=0c`~GEfQF&^CkL!?qN`0_u+$cO)eoGH51;e={T^Gpw(fr(a&hxdXl5_2et1yWZsCE~pDkKj-?g>#Tl`ph zX1fLZgG2x7?H;~Ap8hAQR+Fn?s|Z83Cd0KLhBZqWBD@(lOk+yWWjzoz0wk91+4F}j X@X0EFiABrmL8YIktDnm{r-UW|KwL*= literal 0 HcmV?d00001 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 531261f2b..729f0ffdf 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "ActuallyAdditions", "name": "Actually Additions", "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.5.2", + "version": "0.0.5.3", "mcversion": "1.7.10", "url": "https://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", diff --git a/update/changelog.txt b/update/changelog.txt index d8d44271f..880dbac5f 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -An Update Checker! ...wait, you're not gonna read this anyways. \ No newline at end of file +Fluid Breakers & Placers and Phantom Energyface, Liquiface, Breaker & Placer \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index da8ef1323..14ed8b098 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.2 \ No newline at end of file +1.7.10-0.0.5.3 \ No newline at end of file From aecea40bb98b9375ebf157a4c675af09b4b73991 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sat, 6 Jun 2015 01:25:53 +0200 Subject: [PATCH 11/29] -Added Lava Factory --- .../ellpeck/actuallyadditions/PLANNED.txt | 14 +-- .../blocks/BlockLavaFactoryController.java | 118 ++++++++++++++++++ .../blocks/BlockPhantomface.java | 16 ++- .../actuallyadditions/blocks/BlockPlant.java | 16 ++- .../actuallyadditions/blocks/InitBlocks.java | 21 +++- .../blocks/metalists/TheMiscBlocks.java | 3 +- .../config/values/ConfigBoolValues.java | 3 +- .../config/values/ConfigIntValues.java | 10 +- .../creative/CreativeTab.java | 2 + .../event/RenderPlayerEventAA.java | 6 - .../event/WorldDecorationEvent.java | 16 ++- .../ellpeck/actuallyadditions/gen/OreGen.java | 2 +- .../inventory/ContainerFermentingBarrel.java | 4 +- .../inventory/ContainerOilGenerator.java | 4 +- .../inventory/GuiCanolaPress.java | 2 +- .../inventory/GuiFermentingBarrel.java | 2 +- .../actuallyadditions/items/InitItems.java | 7 ++ .../nei/NEIActuallyAdditionsConfig.java | 1 + .../recipe/GrinderRecipeRegistry.java | 4 +- .../recipe/HairyBallHandler.java | 6 +- .../tile/TileEntityBase.java | 1 + .../tile/TileEntityCanolaPress.java | 2 +- .../tile/TileEntityFermentingBarrel.java | 6 +- .../tile/TileEntityFluidCollector.java | 2 +- .../tile/TileEntityGreenhouseGlass.java | 13 +- .../tile/TileEntityLavaFactoryController.java | 102 +++++++++++++++ .../tile/TileEntityOilGenerator.java | 5 +- .../update/UpdateChecker.java | 2 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../ellpeck/actuallyadditions/util/Util.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 2 +- .../assets/actuallyadditions/lang/en_US.lang | 15 ++- .../blocks/blockLavaFactoryController.png | Bin 0 -> 773 bytes .../blocks/blockLavaFactoryControllerTop.png | Bin 0 -> 780 bytes .../blocks/blockMiscLavaFactoryCase.png | Bin 0 -> 773 bytes .../blocks/models/special/modelLordi.png | Bin 610 -> 0 bytes 36 files changed, 340 insertions(+), 71 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryController.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryControllerTop.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscLavaFactoryCase.png delete mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index a1a0366ed..2557bf0da 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -69,13 +69,6 @@ -You can mark an area -On Activation, all blocks in the area get a Signal --Lava Factory - -Bowl-Looking Multi Block - -Requires Energy - -Produces Lava - -Has a Controller in the Middle - -Places produced Lava Blocks on top of the Controller - -Thermopile -Needs a hot and a cold fluid -Depending on the fluids, it generates more power @@ -88,4 +81,9 @@ -Ring of Aquadive: Fast underwater movement -Ring of Suction: Sucks up Items in the area -Ring of Water Absorption: Removes Water around - -Ring of Striptease (Or something like that): Attacker lose parts of their Armor \ No newline at end of file + -Ring of Striptease (Or something like that): Attacker lose parts of their Armor + +-Coffee + -Coffee Machine + -Coffee Cup + -Bedrockium Coffee Cup diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java new file mode 100644 index 000000000..782eb30f2 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java @@ -0,0 +1,118 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityLavaFactoryController; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockLavaFactoryController extends BlockContainerBase implements INameableItem{ + + private IIcon topIcon; + + public BlockLavaFactoryController(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return new TileEntityLavaFactoryController(); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side == 1 ? this.topIcon : this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + TileEntityLavaFactoryController factory = (TileEntityLavaFactoryController)world.getTileEntity(x, y, z); + if(factory != null){ + int state = factory.isMultiblock(); + if(state == TileEntityLavaFactoryController.NOT_MULTI){ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".factory.notPart.desc"))); + } + if(state == TileEntityLavaFactoryController.HAS_AIR || state == TileEntityLavaFactoryController.HAS_LAVA){ + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".factory.works.desc"))); + } + player.addChatComponentMessage(new ChatComponentText(factory.storage.getEnergyStored() + "/" + factory.storage.getMaxEnergyStored() + " RF")); + } + return true; + } + return true; + } + + @Override + public String getName(){ + return "blockLavaFactoryController"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 3, ""); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".uses.desc") + " " + TileEntityLavaFactoryController.energyNeededToProduceLava + " RF/B"); + } + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index c07966ee2..85407eaec 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; @@ -31,6 +32,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte public static final int ENERGYFACE = 4; public int type; + public int range; public BlockPhantomface(int type){ super(Material.rock); @@ -38,6 +40,9 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte this.setHarvestLevel("pickaxe", 0); this.setHardness(1.0F); this.setStepSound(soundTypeStone); + + if(type == FACE || type == LIQUIFACE || type == ENERGYFACE) this.range = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); + else if(type == BREAKER || type == PLACER) this.range = ConfigIntValues.PHANTOM_PLACER_RANGE.getValue(); } @Override @@ -150,10 +155,13 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 2, ""); - if(KeyUtil.isShiftPressed() && ((BlockPhantomface)this.theBlock).type == LIQUIFACE){ - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.5")); + if(KeyUtil.isShiftPressed()){ + if(((BlockPhantomface)this.theBlock).type == LIQUIFACE){ + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.5")); + } + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index 0dc51ac07..f9298b9ac 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -32,10 +32,14 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar private String name; public Item seedItem; public ItemStack returnItem; + private int minDropAmount; + private int addDropAmount; - public BlockPlant(String name, int stages){ + public BlockPlant(String name, int stages, int minDropAmount, int addDropAmount){ this.name = name; this.textures = new IIcon[stages]; + this.minDropAmount = minDropAmount; + this.addDropAmount = addDropAmount; } @Override @@ -48,12 +52,14 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar ArrayList ret = super.getDrops(world, x, y, z, metadata, fortune); if(metadata >= 7){ for(int i = 0; i < 3; ++i){ - if(world.rand.nextInt(15) <= metadata) ret.add(new ItemStack(this.seedItem)); + if(world.rand.nextInt(6) == 0) ret.add(new ItemStack(this.seedItem)); } - if(this == InitBlocks.blockCanola) ret.add(new ItemStack(this.returnItem.getItem(), new Random().nextInt(3)+3, this.returnItem.getItemDamage())); - else ret.add(this.returnItem.copy()); + + ItemStack stack = this.returnItem.copy(); + stack.stackSize = new Random().nextInt(addDropAmount)+minDropAmount; + ret.add(stack); } - else ret.add(new ItemStack(this.seedItem)); + else ret.add(new ItemStack(this.seedItem)); return ret; } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 8333e9419..599857a19 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -33,6 +33,7 @@ public class InitBlocks{ public static Block blockRice; public static Block blockCanola; + public static Block blockFlax; public static Fluid fluidCanolaOil; public static Block blockCanolaOil; @@ -54,16 +55,25 @@ public class InitBlocks{ public static Block blockFluidPlacer; public static Block blockFluidCollector; + public static Block blockLavaFactoryController; + public static void init(){ Util.logInfo("Initializing Blocks..."); - fluidCanolaOil = new FluidAA("canolaOil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); + blockLavaFactoryController = new BlockLavaFactoryController(); + BlockUtil.register(blockLavaFactoryController, BlockLavaFactoryController.TheItemBlock.class); + + fluidCanolaOil = new FluidAA("canolaoil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); FluidRegistry.registerFluid(fluidCanolaOil); + fluidCanolaOil = FluidRegistry.getFluid(fluidCanolaOil.getName()); + blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); fluidOil = new FluidAA("oil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); FluidRegistry.registerFluid(fluidOil); + fluidOil = FluidRegistry.getFluid(fluidOil.getName()); + blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); @@ -94,16 +104,21 @@ public class InitBlocks{ blockFermentingBarrel = new BlockFermentingBarrel(); BlockUtil.register(blockFermentingBarrel, BlockFermentingBarrel.TheItemBlock.class); - blockRice = new BlockPlant("blockRice", 6); + blockRice = new BlockPlant("blockRice", 6, 1, 2); BlockUtil.register(blockRice, BlockPlant.TheItemBlock.class, false); FactoryRegistry.sendMessage("registerHarvestable", blockRice); FactoryRegistry.sendMessage("registerFertilizable", blockRice); - blockCanola = new BlockPlant("blockCanola", 4); + blockCanola = new BlockPlant("blockCanola", 4, 3, 3); BlockUtil.register(blockCanola, BlockPlant.TheItemBlock.class, false); FactoryRegistry.sendMessage("registerHarvestable", blockCanola); FactoryRegistry.sendMessage("registerFertilizable", blockCanola); + blockFlax = new BlockPlant("blockFlax", 6, 2, 4); + BlockUtil.register(blockFlax, BlockPlant.TheItemBlock.class); + FactoryRegistry.sendMessage("registerHarvestable", blockFlax); + FactoryRegistry.sendMessage("registerFertilizable", blockFlax); + blockCompost = new BlockCompost(); BlockUtil.register(blockCompost, BlockCompost.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java index a007cda29..1eb1dfa4d 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java @@ -12,7 +12,8 @@ public enum TheMiscBlocks implements INameableItem{ WOOD_CASING("WoodCasing", EnumRarity.common, "blockCasingWood"), STONE_CASING("StoneCasing", EnumRarity.uncommon, "blockCasingStone"), CHARCOAL_BLOCK("Charcoal", EnumRarity.common, "blockCharcoal"), - ENDERPEARL_BLOCK("Enderpearl", EnumRarity.rare, "blockEnderpearl"); + ENDERPEARL_BLOCK("Enderpearl", EnumRarity.rare, "blockEnderpearl"), + LAVA_FACTORY_CASE("LavaFactoryCase", EnumRarity.uncommon, "blockLavaFactoryCase"); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java index 6c89187ec..0d400efbb 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java @@ -26,7 +26,8 @@ public enum ConfigBoolValues{ DO_WAILA_INFO("Waila Display Info", ConfigCategories.OTHER, true, "If the Shift Description should display in Waila too"), DO_RICE_GEN("Rice Gen", ConfigCategories.WORLD_GEN, true, "If Rice should generate in the World"), - DO_CANOLA_GEN("Canola Gen", ConfigCategories.WORLD_GEN, true, "If Canola should generate in the World"); + DO_CANOLA_GEN("Canola Gen", ConfigCategories.WORLD_GEN, true, "If Canola should generate in the World"), + DO_FLAX_GEN("Flax Gen", ConfigCategories.WORLD_GEN, true, "If Flax should generate in the World"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index ccbae20e9..fe3b2b4d8 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -43,7 +43,7 @@ public enum ConfigIntValues{ HEAT_COLLECTOR_BLOCKS("Heat Collector: Blocks Needed", ConfigCategories.MACHINE_VALUES, 4, 1, 5, "How many Blocks are needed for the Heat Collector to power Machines above it"), HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 10000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), - GLASS_TIME_NEEDED("Greenhouse Glass: Time", ConfigCategories.MACHINE_VALUES, 5000, 10, 1000000, "The Time Needed for the Greenhouse Glass to grow a Plant below it"), + GLASS_TIME_NEEDED("Greenhouse Glass: Time", ConfigCategories.MACHINE_VALUES, 300, 1, 10000, "Time Needed for the Greenhouse Glass to grow a Plant below it"), BREAKER_TIME_NEEDED("Breaker and Placer: Time Needed", ConfigCategories.MACHINE_VALUES, 15, 1, 10000, "The Time Needed for the Breaker and the Placer to place or break a Block"), DROPPER_TIME_NEEDED("Dropper: Time Needed", ConfigCategories.MACHINE_VALUES, 10, 1, 10000, "The Time Needed for the Dropper to drop an Item"), @@ -51,7 +51,8 @@ public enum ConfigIntValues{ CAT_DROP_CHANCE("Cat Drops: Chance", ConfigCategories.OTHER, 5000, 5, 10000000, "The 1 in X chance for a Hairy Ball to Drop from a Cat with X being this value"), RICE_AMOUNT("Rice Amount", ConfigCategories.WORLD_GEN, 15, 1, 100, "The Chance of Rice generating"), - CANOLA_AMOUNT("Canola Amount", ConfigCategories.WORLD_GEN, 2, 1, 50, "The Chance of Canola generating"), + CANOLA_AMOUNT("Canola Amount", ConfigCategories.WORLD_GEN, 10, 1, 50, "The Chance of Canola generating"), + FLAX_AMOUNT("Flax Amount", ConfigCategories.WORLD_GEN, 5, 1, 50, "The Chance of Flax generating"), GRINDER_ENERGY_USED("Energy Use: Crusher", ConfigCategories.MACHINE_VALUES, 40, 1, 500, "The Amount of Energy used by the Crusher per Tick"), GRINDER_DOUBLE_ENERGY_USED("Energy Use: Double Crusher", ConfigCategories.MACHINE_VALUES, 60, 1, 500, "The Amount of Energy used by the Double Crusher per Tick"), @@ -75,7 +76,10 @@ public enum ConfigIntValues{ OIL_GEN_BURN_TIME("Oil Generator: Burn Time", ConfigCategories.MACHINE_VALUES, 100, 1, 1000, "The Amount of Time Fuel keeps burning for"), PHANTOM_PLACER_TIME("Phantom Placer and Breaker: Time Needed", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Time a Phantom Placer/Breaker needs"), - PHANTOM_PLACER_RANGE("Phantom Placer and Breaker: Range", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "The Default Range of the Phantom Placer/Breaker"); + PHANTOM_PLACER_RANGE("Phantom Placer and Breaker: Range", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "The Default Range of the Phantom Placer/Breaker"), + + LAVA_FACTORY_ENERGY_USED("Lava Factory: Energy Used", ConfigCategories.MACHINE_VALUES, 150000, 10, 3000000, "The amount of Energy used by the Lava Factory per Bucket of Lava produced"), + LAVA_FACTORY_TIME("Lava Factory: Production Time", ConfigCategories.MACHINE_VALUES, 200, 5, 10000, "The amount of time it takes for the Lava Factory to produce one Bucket"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index c5e17c237..7f7d1b70e 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -38,6 +38,7 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockGrinder); this.addBlock(InitBlocks.blockGrinderDouble); this.addBlock(InitBlocks.blockFurnaceDouble); + this.addBlock(InitBlocks.blockLavaFactoryController); this.addBlock(InitBlocks.blockFurnaceSolar); this.addBlock(InitBlocks.blockHeatCollector); @@ -64,6 +65,7 @@ public class CreativeTab extends CreativeTabs{ this.addItem(InitItems.itemRiceSeed); this.addItem(InitItems.itemCanolaSeed); + this.addItem(InitItems.itemFlaxSeed); this.addItem(InitItems.itemHairyBall); this.addItem(InitItems.itemMisc); this.addItem(InitItems.itemResonantRice); diff --git a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java index 8508dd86b..e5d0b7037 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java +++ b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java @@ -15,7 +15,6 @@ public class RenderPlayerEventAA{ private RenderSpecial hoseRender = new RenderSpecial(new ModelTorch()); //private RenderSpecial paktoRender = new RenderSpecial(new ModelStandardBlock("Pakto")); private RenderSpecial glenRender = new RenderSpecial(new ModelStandardBlock("Glenthor")); - private RenderSpecial lordiRender = new RenderSpecial(new ModelStandardBlock("Lordi")); @SubscribeEvent(priority = EventPriority.HIGHEST) public void RenderPlayerEvent(RenderPlayerEvent.Pre event){ @@ -42,11 +41,6 @@ public class RenderPlayerEventAA{ if(event.entityPlayer.getUniqueID().equals(UUID.fromString("cb7b293a-5031-484e-b5be-b4f2f4e92726"))){ hoseRender.render(event.entityPlayer, event.partialRenderTick, 0.5F, 1.3F); } - - //Lordhallo - if(event.entityPlayer.getUniqueID().equals(UUID.fromString("990ecf6d-15dd-442c-b91b-323a6420c78e"))){ - lordiRender.render(event.entityPlayer, event.partialRenderTick, 0.3F, 1F); - } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java index 1d36159fc..4c3ff7cda 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java +++ b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java @@ -4,6 +4,7 @@ import cpw.mods.fml.common.eventhandler.SubscribeEvent; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.world.World; import net.minecraftforge.event.terraingen.DecorateBiomeEvent; @@ -35,15 +36,20 @@ public class WorldDecorationEvent{ } } - if(ConfigBoolValues.DO_CANOLA_GEN.isEnabled()){ - for(int i = 0; i < ConfigIntValues.CANOLA_AMOUNT.getValue(); i++){ - if(new Random().nextInt(50) == 0){ + this.genPlantNormally(InitBlocks.blockCanola, ConfigIntValues.CANOLA_AMOUNT.getValue(), ConfigBoolValues.DO_CANOLA_GEN.isEnabled(), Material.grass, event); + this.genPlantNormally(InitBlocks.blockFlax, ConfigIntValues.FLAX_AMOUNT.getValue(), ConfigBoolValues.DO_FLAX_GEN.isEnabled(), Material.grass, event); + } + + public void genPlantNormally(Block plant, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event){ + if(doIt){ + for(int i = 0; i < amount; i++){ + if(new Random().nextInt(100) == 0){ int genX = event.chunkX+event.rand.nextInt(16)+8; int genZ = event.chunkZ+event.rand.nextInt(16)+8; int genY = event.world.getTopSolidOrLiquidBlock(genX, genZ)-1; - if(event.world.getBlock(genX, genY, genZ).getMaterial() == Material.grass){ - event.world.setBlock(genX, genY+1, genZ, InitBlocks.blockCanola, event.rand.nextInt(8), 2); + if(event.world.getBlock(genX, genY, genZ).getMaterial() == blockBelow){ + event.world.setBlock(genX, genY+1, genZ, plant, event.rand.nextInt(8), 2); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java b/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java index 1559282b5..92c700067 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java @@ -55,7 +55,7 @@ public class OreGen implements IWorldGenerator{ new WorldGenMinable(block, meta, maxVeinSize, blockIn).generate(world, random, posX, posY, posZ); } } - else ModUtil.AA_LOGGER.log(Level.FATAL, "Couldn't generate '" + block.getUnlocalizedName() + "' into the world because the Min Y coordinate is bigger than the Max! This is definitely a Config Error! Check the Files!"); + else ModUtil.LOGGER.log(Level.FATAL, "Couldn't generate '" + block.getUnlocalizedName() + "' into the world because the Min Y coordinate is bigger than the Max! This is definitely a Config Error! Check the Files!"); } public int getRandom(int base, int extra, Random rand){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java index f1c01935c..24ed5f1dd 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerFermentingBarrel.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.inventory.slot.SlotOutput; -import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; import invtweaks.api.container.InventoryContainer; @@ -15,6 +14,7 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; @InventoryContainer @@ -95,7 +95,7 @@ public class ContainerFermentingBarrel extends Container{ if(currentStack.getItem() != null){ if(slot <= hotbarEnd && slot >= inventoryStart){ - if(currentStack.getItem() == InitItems.itemBucketCanolaOil){ + if(FluidContainerRegistry.containsFluid(currentStack, new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME))){ this.mergeItemStack(newStack, 0, 1, false); } if(currentStack.getItem() == Items.bucket){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java index fbe538a00..b367c9d33 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerOilGenerator.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.inventory.slot.SlotOutput; -import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; import invtweaks.api.container.InventoryContainer; @@ -15,6 +14,7 @@ import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidContainerRegistry; import net.minecraftforge.fluids.FluidStack; @InventoryContainer @@ -93,7 +93,7 @@ public class ContainerOilGenerator extends Container{ if(currentStack.getItem() != null){ if(slot <= hotbarEnd && slot >= inventoryStart){ - if(currentStack.getItem() == InitItems.itemBucketOil){ + if(FluidContainerRegistry.containsFluid(currentStack, new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME))){ this.mergeItemStack(newStack, 0, 1, false); } } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java index 80afcb98a..5134b91a5 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java @@ -67,7 +67,7 @@ public class GuiCanolaPress extends GuiContainer{ this.func_146283_a(Collections.singletonList(text1), x, y); } - String text2 = this.press.tank.getFluidAmount() + "/" + this.press.tank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaOil"); + String text2 = this.press.tank.getFluidAmount() + "/" + this.press.tank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaoil"); if(x >= guiLeft+117 && y >= guiTop+6 && x <= guiLeft+132 && y <= guiTop+88){ this.func_146283_a(Collections.singletonList(text2), x, y); } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java index f15245136..919fcb97d 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java @@ -62,7 +62,7 @@ public class GuiFermentingBarrel extends GuiContainer{ public void drawScreen(int x, int y, float f){ super.drawScreen(x, y, f); - String text1 = this.press.canolaTank.getFluidAmount() + "/" + this.press.canolaTank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaOil"); + String text1 = this.press.canolaTank.getFluidAmount() + "/" + this.press.canolaTank.getCapacity() + " mB " +StatCollector.translateToLocal("fluid.canolaoil"); if(x >= guiLeft+61 && y >= guiTop+6 && x <= guiLeft+76 && y <= guiTop+88){ this.func_146283_a(Collections.singletonList(text1), x, y); } diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 5c44e0ddd..4b2ea4ce5 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -46,8 +46,11 @@ public class InitItems{ public static Item itemHoeObsidian; public static Item itemHairyBall; + public static Item itemRiceSeed; public static Item itemCanolaSeed; + public static Item itemFlaxSeed; + public static Item itemResonantRice; public static Item itemBucketOil; public static Item itemBucketCanolaOil; @@ -119,6 +122,10 @@ public class InitItems{ ItemUtil.register(itemCanolaSeed); FactoryRegistry.sendMessage("registerPlantable", itemCanolaSeed); + itemFlaxSeed = new ItemSeed("itemFlaxSeed", InitBlocks.blockFlax, Blocks.grass, EnumPlantType.Plains, new ItemStack(Items.string)); + ItemUtil.register(itemFlaxSeed); + FactoryRegistry.sendMessage("registerPlantable", itemFlaxSeed); + itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); itemShovelEmerald = new ItemShovelAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemShovelEmerald", EnumRarity.rare); diff --git a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java index b45733aec..6a8ecaa91 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java @@ -32,6 +32,7 @@ public class NEIActuallyAdditionsConfig implements IConfigureNEI{ API.hideItem(new ItemStack(InitBlocks.blockRice)); API.hideItem(new ItemStack(InitBlocks.blockCanola)); + API.hideItem(new ItemStack(InitBlocks.blockFlax)); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java index ad3741758..a83769942 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java @@ -66,13 +66,13 @@ public class GrinderRecipeRegistry{ } else{ if(ConfigBoolValues.DO_CRUSHER_SPAM.isEnabled()) - ModUtil.AA_LOGGER.log(Level.INFO, "Couldn't register Crusher Recipe! An Item with OreDictionary Registry '" + inputWithDustPrefix + "' doesn't exist! It should correspond to '" + inputName + "'! This is not an Error, just a bit sad :("); + ModUtil.LOGGER.log(Level.INFO, "Couldn't register Crusher Recipe! An Item with OreDictionary Registry '" + inputWithDustPrefix + "' doesn't exist! It should correspond to '" + inputName + "'! This is not an Error, just a bit sad :("); } } else{ if(ConfigBoolValues.DO_CRUSHER_SPAM.isEnabled()) - ModUtil.AA_LOGGER.log(Level.WARN, "Couldn't register Crusher Recipe! Didn't find Items registered as '" + inputName + "'! This shouldn't happen as there is something registered as '" + inputName + "' that doesn't exist!"); + ModUtil.LOGGER.log(Level.WARN, "Couldn't register Crusher Recipe! Didn't find Items registered as '" + inputName + "'! This shouldn't happen as there is something registered as '" + inputName + "' that doesn't exist!"); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java index 3f6b01e37..f4ddc7716 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/HairyBallHandler.java @@ -18,9 +18,9 @@ public class HairyBallHandler{ addReturn(new ItemStack(Items.diamond), 2); addReturn(new ItemStack(Items.name_tag), 1); addReturn(new ItemStack(Items.fish), 80); - addReturn(new ItemStack(Items.fish, 1), 60); - addReturn(new ItemStack(Items.fish, 2), 10); - addReturn(new ItemStack(Items.fish, 3), 40); + addReturn(new ItemStack(Items.fish, 1, 1), 60); + addReturn(new ItemStack(Items.fish, 1, 2), 10); + addReturn(new ItemStack(Items.fish, 1, 3), 40); addReturn(new ItemStack(Items.feather), 60); addReturn(new ItemStack(Items.leather), 30); addReturn(new ItemStack(Items.dye), 70); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index 54bf485cb..3fa3d43dc 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -38,6 +38,7 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityPhantomPlacer.TileEntityPhantomBreaker.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBreaker"); GameRegistry.registerTileEntity(TileEntityFluidCollector.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidCollector"); GameRegistry.registerTileEntity(TileEntityFluidCollector.TileEntityFluidPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidPlacer"); + GameRegistry.registerTileEntity(TileEntityLavaFactoryController.class, ModUtil.MOD_ID_LOWER + ":tileEntityLavaFactoryController"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index f2f868780..757fb4e5b 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -113,7 +113,7 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return slot == 2 && stack.getItem() == InitItems.itemBucketCanolaOil; + return slot == 2 && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME)); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java index 2768d8a72..18d3315ce 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -42,7 +42,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen } else this.currentProcessTime = 0; - if(this.slots[0] != null && this.slots[0].getItem() == InitItems.itemBucketCanolaOil && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ + if(this.slots[0] != null && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME)) && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ if(FluidContainerRegistry.BUCKET_VOLUME <= this.canolaTank.getCapacity()-this.canolaTank.getFluidAmount()){ if(this.slots[1] == null) this.slots[1] = new ItemStack(Items.bucket); else this.slots[1].stackSize++; @@ -101,7 +101,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i == 0 && stack.getItem() == InitItems.itemBucketCanolaOil) || (i == 2 && stack.getItem() == Items.bucket); + return (i == 0 && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME))) || (i == 2 && stack.getItem() == Items.bucket); } @Override @@ -111,7 +111,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return (slot == 1 && stack.getItem() == Items.bucket) || (slot == 3 && stack.getItem() == InitItems.itemBucketOil); + return (slot == 1 && stack.getItem() == Items.bucket) || (slot == 3 && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME))); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java index b42cf8589..79550c999 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java @@ -159,7 +159,7 @@ public class TileEntityFluidCollector extends TileEntityInventoryBase implements } if(this.tank.getFluidAmount() > 0 && !this.isPlacer){ - WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.tank); + WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.getOrientation(worldObj.getBlockMetadata(xCoord, yCoord, zCoord)).getOpposite(), this.tank); } if(amountBefore != this.tank.getFluidAmount()){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java index 9b7439bf4..cdd0f7364 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java @@ -1,14 +1,10 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import ellpeck.actuallyadditions.util.FakePlayerUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockAir; import net.minecraft.block.BlockGrass; import net.minecraft.block.IGrowable; -import net.minecraft.init.Items; -import net.minecraft.item.ItemDye; -import net.minecraft.item.ItemStack; import net.minecraft.util.ChunkCoordinates; import java.util.Random; @@ -25,14 +21,14 @@ public class TileEntityGreenhouseGlass extends TileEntityBase{ if(worldObj.canBlockSeeTheSky(xCoord, yCoord, zCoord) && worldObj.isDaytime()){ ChunkCoordinates blockToFert = this.blockToFertilize(); if(blockToFert != null){ - Random rand = new Random(); if(this.timeUntilNextFert > 0){ this.timeUntilNextFert--; if(timeUntilNextFert <= 0){ - this.applyBonemealEffect(blockToFert); + worldObj.getBlock(blockToFert.posX, blockToFert.posY, blockToFert.posZ).updateTick(worldObj, blockToFert.posX, blockToFert.posY, blockToFert.posZ, worldObj.rand); + worldObj.playAuxSFX(2005, blockToFert.posX, blockToFert.posY, blockToFert.posZ, 0); } } - else this.timeUntilNextFert = this.timeUntilNextFertToSet + rand.nextInt(this.timeUntilNextFertToSet/2); + else this.timeUntilNextFert = this.timeUntilNextFertToSet+new Random().nextInt(this.timeUntilNextFertToSet); } } } @@ -51,7 +47,4 @@ public class TileEntityGreenhouseGlass extends TileEntityBase{ return null; } - public boolean applyBonemealEffect(ChunkCoordinates coords){ - return ItemDye.applyBonemeal(new ItemStack(Items.dye, 1, 15), worldObj, coords.posX, coords.posY, coords.posZ, FakePlayerUtil.newFakePlayer(worldObj)); - } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java new file mode 100644 index 000000000..22bdcab53 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java @@ -0,0 +1,102 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import ellpeck.actuallyadditions.blocks.BlockMisc; +import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import net.minecraft.block.Block; +import net.minecraft.block.BlockAir; +import net.minecraft.init.Blocks; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityLavaFactoryController extends TileEntityBase implements IEnergyReceiver{ + + public EnergyStorage storage = new EnergyStorage(3000000, energyNeededToProduceLava*2); + + public static int energyNeededToProduceLava = ConfigIntValues.LAVA_FACTORY_ENERGY_USED.getValue(); + + private final int maxWorkTime = ConfigIntValues.LAVA_FACTORY_TIME.getValue(); + private int currentWorkTime; + + @Override + @SuppressWarnings("unchecked") + public void updateEntity(){ + if(!worldObj.isRemote){ + int isMulti = this.isMultiblock(); + + if(isMulti == HAS_AIR && this.storage.getEnergyStored() >= energyNeededToProduceLava){ + this.currentWorkTime++; + if(this.currentWorkTime >= this.maxWorkTime){ + this.currentWorkTime = 0; + worldObj.setBlock(xCoord, yCoord+1, zCoord, Blocks.lava); + this.storage.extractEnergy(energyNeededToProduceLava, false); + } + } + else this.currentWorkTime = 0; + } + } + + public int isMultiblock(){ + Block blockNorth = worldObj.getBlock(xCoord+ForgeDirection.NORTH.offsetX, yCoord+1, zCoord+ForgeDirection.NORTH.offsetZ); + Block blockEast = worldObj.getBlock(xCoord+ForgeDirection.EAST.offsetX, yCoord+1, zCoord+ForgeDirection.EAST.offsetZ); + Block blockSouth = worldObj.getBlock(xCoord+ForgeDirection.SOUTH.offsetX, yCoord+1, zCoord+ForgeDirection.SOUTH.offsetZ); + Block blockWest = worldObj.getBlock(xCoord+ForgeDirection.WEST.offsetX, yCoord+1, zCoord+ForgeDirection.WEST.offsetZ); + int metaNorth = worldObj.getBlockMetadata(xCoord+ForgeDirection.NORTH.offsetX, yCoord+1, zCoord+ForgeDirection.NORTH.offsetZ); + int metaEast = worldObj.getBlockMetadata(xCoord+ForgeDirection.EAST.offsetX, yCoord+1, zCoord+ForgeDirection.EAST.offsetZ); + int metaSouth = worldObj.getBlockMetadata(xCoord+ForgeDirection.SOUTH.offsetX, yCoord+1, zCoord+ForgeDirection.SOUTH.offsetZ); + int metaWest = worldObj.getBlockMetadata(xCoord+ForgeDirection.WEST.offsetX, yCoord+1, zCoord+ForgeDirection.WEST.offsetZ); + int metaNeeded = TheMiscBlocks.LAVA_FACTORY_CASE.ordinal(); + + if(blockNorth instanceof BlockMisc && blockEast instanceof BlockMisc && blockSouth instanceof BlockMisc && blockWest instanceof BlockMisc){ + if(metaNorth == metaNeeded && metaEast == metaNeeded && metaSouth == metaNeeded && metaWest == metaNeeded){ + if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == Blocks.lava || worldObj.getBlock(xCoord, yCoord+1, zCoord) == Blocks.flowing_lava){ + return HAS_LAVA; + } + if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == null || worldObj.getBlock(xCoord, yCoord+1, zCoord) instanceof BlockAir){ + return HAS_AIR; + } + } + } + return NOT_MULTI; + } + + public static final int NOT_MULTI = 0; + public static final int HAS_LAVA = 1; + public static final int HAS_AIR = 2; + + @Override + public void writeToNBT(NBTTagCompound compound){ + this.storage.writeToNBT(compound); + compound.setInteger("WorkTime", this.currentWorkTime); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.storage.readFromNBT(compound); + this.currentWorkTime = compound.getInteger("WorkTime"); + super.readFromNBT(compound); + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return from != ForgeDirection.UP ? this.storage.receiveEnergy(maxExtract, simulate) : 0; + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return from != ForgeDirection.UP ? this.storage.getEnergyStored() : 0; + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return from != ForgeDirection.UP ? this.storage.getMaxEnergyStored() : 0; + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return from != ForgeDirection.UP; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index d536e2c7e..e69445a7a 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -6,7 +6,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -48,7 +47,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I } } - if(this.slots[0] != null && this.slots[0].getItem() == InitItems.itemBucketOil && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ + if(this.slots[0] != null && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME)) && (this.slots[1] == null || (this.slots[1].stackSize < this.slots[1].getMaxStackSize()))){ if(FluidContainerRegistry.BUCKET_VOLUME <= this.tank.getCapacity()-this.tank.getFluidAmount()){ if(this.slots[1] == null) this.slots[1] = new ItemStack(Items.bucket); else this.slots[1].stackSize++; @@ -103,7 +102,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return stack.getItem() == InitItems.itemBucketOil && i == 0; + return FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME)) && i == 0; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java index 730717533..d96162836 100644 --- a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java @@ -81,7 +81,7 @@ public class UpdateChecker{ Util.logInfo("Update Check done!"); } catch(Exception e){ - ModUtil.AA_LOGGER.log(Level.ERROR, "Update Check failed!"); + ModUtil.LOGGER.log(Level.ERROR, "Update Check failed!"); checkFailed = true; e.printStackTrace(); } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 73e0741d5..f0580000b 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -11,6 +11,6 @@ public class ModUtil{ public static final String NAME = "Actually Additions"; public static final String MOD_ID_LOWER = MOD_ID.toLowerCase(); - public static final Logger AA_LOGGER = LogManager.getLogger(MOD_ID); + public static final Logger LOGGER = LogManager.getLogger(MOD_ID); } diff --git a/src/main/java/ellpeck/actuallyadditions/util/Util.java b/src/main/java/ellpeck/actuallyadditions/util/Util.java index 64e5b464a..10afb9096 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/Util.java +++ b/src/main/java/ellpeck/actuallyadditions/util/Util.java @@ -11,7 +11,7 @@ public class Util{ public static final int WILDCARD = OreDictionary.WILDCARD_VALUE; public static void logInfo(String text){ - ModUtil.AA_LOGGER.log(Level.INFO, text); + ModUtil.LOGGER.log(Level.INFO, text); } public static void registerEvent(Object o){ diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 6352ca447..94485205f 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -85,7 +85,7 @@ public class WorldUtil{ return stack; } catch(Exception e){ - ModUtil.AA_LOGGER.log(Level.ERROR, "Something that places Blocks at "+x+", "+y+", "+z+" in World "+world.provider.dimensionId+" threw an Exception! Don't let that happen again!"); + ModUtil.LOGGER.log(Level.ERROR, "Something that places Blocks at "+x+", "+y+", "+z+" in World "+world.provider.dimensionId+" threw an Exception! Don't let that happen again!"); } } return stack; diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index b4292fae7..62f45993b 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -2,7 +2,7 @@ itemGroup.actuallyadditions=Actually Additions achievement.page.actuallyadditions=Actually Additions fluid.oil=Oil -fluid.canolaOil=Canola Oil +fluid.canolaoil=Canola Oil tile.actuallyadditions.blockCompost.name=Compost tile.actuallyadditions.blockMiscOreBlackQuartz.name=Black Quartz Ore @@ -74,6 +74,14 @@ tile.actuallyadditions.blockPhantomBreaker.name=Phantom Breaker tooltip.actuallyadditions.blockPhantomBreaker.desc.1=Breaks Blocks from a distance! Connect me with a Phantom Connector! tooltip.actuallyadditions.blockPhantomBreaker.desc.2=Sneak-Right-Click with an empty hand to see its Connections! +tile.actuallyadditions.blockLavaFactoryController.name=Lava Factory Controller +tooltip.actuallyadditions.blockLavaFactoryController.desc.1=Place Lava Factory Casings around in the right way to produce Lava: +tooltip.actuallyadditions.blockLavaFactoryController.desc.2=Go one block up above the Controller, that's where Lava is going to land +tooltip.actuallyadditions.blockLavaFactoryController.desc.3=Place 4 Casings around that empty space so that it is encased + +tile.actuallyadditions.blockMiscLavaFactoryCase.name=Lava Factory Casing +tooltip.actuallyadditions.blockMiscLavaFactoryCase.desc=Helps the Lava Factory Controller generate Lava + tile.actuallyadditions.blockFluidPlacer.name=Fluid Placer tooltip.actuallyadditions.blockFluidPlacer.desc=Places Fluids stored inside it @@ -143,6 +151,9 @@ tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to Block at %s, tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to Block at %s, %s, %s but it is not in Range! tooltip.actuallyadditions.phantom.notConnected.desc=This isn't connected to anything! +tooltip.actuallyadditions.factory.notPart.desc=The Controller isn't part of the right Multi-Block! Look at the Controller's Description! +tooltip.actuallyadditions.factory.works.desc=This Lava Factory is complete and can produce Lava! + item.actuallyadditions.itemMiscMashedFood.name=Mashed Food item.actuallyadditions.itemFertilizer.name=Fertilizer item.actuallyadditions.itemMiscDough.name=Dough @@ -242,6 +253,8 @@ tooltip.actuallyadditions.itemUpgradeSpeed.desc.3=-Double Furnace tooltip.actuallyadditions.itemUpgradeSpeed.desc.4=-Crusher tooltip.actuallyadditions.itemUpgradeSpeed.desc.5=-Double Crusher +tooltip.actuallyadditions.blockPhantomRange.desc=Range + tooltip.actuallyadditions.blockCompost.desc=Used to make Fertilizer with Mashed Food tooltip.actuallyadditions.blockMiscOreBlackQuartz.desc=The darkest form of Quartz. tooltip.actuallyadditions.blockMiscBlackQuartz.desc=Black, eerie Quartz! Nice for decorating. diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryController.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryController.png new file mode 100644 index 0000000000000000000000000000000000000000..808eecb19087cc466325ed8383267d7d73263069 GIT binary patch literal 773 zcmV+g1N!`lP)WFU8GbZ8()Nlj2>E@cM*00L=AL_t(I%UzPqZd^qW zMo(4soqKH~B3OW*g0VDX*%K$&EXYG37Cee~tl07}EG#69aD+kxNGu|D5kmaPgPqLZ z?d~cTcQQ!yvKOWAobQt_zxX_^u5akNj)&7Do<9GXaOZR~=DTMouy0h#?Q0A;SyYJNEYWDJ7$taCb_{1W-%C-2tK0iq57-!^KiCGgJ*T#ms1$1_&$}O*2A8 zNKJ#90r2=_g1zCApnBc;ST0vouL$xVjvC0|BLbdWJi;El^X}#EfBZ?f(~J^c0~Nu{SiD}+ z?RDEW1d+i_$(dXVf8Wm0k~4kZ6A|Q19uP`_2->!#@B3Y)Z*VL%)LLlU7QHw-q1H;@ zXG*QqT0o%I3K8U7sQ>dZjBLdD>==9R{lm+bFMmT-2R0uXsO}J8D)c#TS1Lp>3~94r zes@n=tybjP<6f!jHEla$u~^c!Bh1oPu<+{DJqP;-JJC7!bX`aKaCXdkvjGOHUwwUz zi16|G8CTagm>K7@W4`_VIjYKRGUl77ξfPLKE(?x0L+O5KFM00000NkvXXu0mjf D5W!ZJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryControllerTop.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockLavaFactoryControllerTop.png new file mode 100644 index 0000000000000000000000000000000000000000..b8719b608de6bcd0b83d299f1bf9590fc3cadc0e GIT binary patch literal 780 zcmV+n1M~ceP)0s$1{9{*fmPg2Wcms2$sM z96M6T9+}*NTe}Sq}NHO zk5>n~19zHaY&N$TBkk>9Y(KtdxPH%M_#24=0x1~+xK~bB2c*yTW5F&^O;f|<~%mC2i z!zJMk64Y=a1XW?yz`TP=1A8rqD4_`?{!5#$Pak6I%PS&ayBV0wrW6k%lz+M}h*aph zmQfNxLeyN)Ea8t&~_bmvO47Q z)oXIjh${2>3{@i`yD9@+*J5Tw>>^j)731Y-zie&8DYo8#EcXg9x{uJ~5lls9vcasb3OqSkakjo7rNqh6KEGaGp{g7%7reN5i3hA6e96D{NnGiFLXHOj0000< KMNUMnLSTa4Urj;) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscLavaFactoryCase.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscLavaFactoryCase.png new file mode 100644 index 0000000000000000000000000000000000000000..808eecb19087cc466325ed8383267d7d73263069 GIT binary patch literal 773 zcmV+g1N!`lP)WFU8GbZ8()Nlj2>E@cM*00L=AL_t(I%UzPqZd^qW zMo(4soqKH~B3OW*g0VDX*%K$&EXYG37Cee~tl07}EG#69aD+kxNGu|D5kmaPgPqLZ z?d~cTcQQ!yvKOWAobQt_zxX_^u5akNj)&7Do<9GXaOZR~=DTMouy0h#?Q0A;SyYJNEYWDJ7$taCb_{1W-%C-2tK0iq57-!^KiCGgJ*T#ms1$1_&$}O*2A8 zNKJ#90r2=_g1zCApnBc;ST0vouL$xVjvC0|BLbdWJi;El^X}#EfBZ?f(~J^c0~Nu{SiD}+ z?RDEW1d+i_$(dXVf8Wm0k~4kZ6A|Q19uP`_2->!#@B3Y)Z*VL%)LLlU7QHw-q1H;@ zXG*QqT0o%I3K8U7sQ>dZjBLdD>==9R{lm+bFMmT-2R0uXsO}J8D)c#TS1Lp>3~94r zes@n=tybjP<6f!jHEla$u~^c!Bh1oPu<+{DJqP;-JJC7!bX`aKaCXdkvjGOHUwwUz zi16|G8CTagm>K7@W4`_VIjYKRGUl77ξfPLKE(?x0L+O5KFM00000NkvXXu0mjf D5W!ZJ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png deleted file mode 100644 index e345b3db8319f60e2229227e5118c0000ef5127b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 610 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+L6~vJ#O${~L5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqf`b4#s{7* zjv*CsZ_hhs9dQs~Ir#U#^k4C6ffGxXIEc%$`G_A$eJQee{{DBrKY#uE%%XDPvMYDq z%$18hev;dC>9e%=UtU=G#jVgZHLqUoe!cLMlkdu%H?3`V^-UJf@;ZC=-ph-nbM^!T zXXSnK>tFZyN$aej;?3n%C9>-JSEkIG{r2+Wx|jY_X9WenPWvs_uV=dpC>mvc`+G&n z%Zp2wUAeOB=Dy>Lz5De{moB?@_M5F-Y*oohP1CJ;+unbCacQx)@5+^>n``^sr_04= zdHJrL{kGa>*OwPT!C6^%|K$G4fY<`$dI4P(5Yhv5oF>pDpdH+T*H^`xZ#{qUC8 zg%}RD-@-;yi!R(VX`656n9V+mh5CK{cTF8bk4X2jTWb0(!1Tc2>FVdQ&MBb@08|MS A$N&HU From 2c6bcd72cf5631ca1ef995dfdad0314dfb94dd27 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 12 Jun 2015 19:12:06 +0200 Subject: [PATCH 12/29] -Phantom Booster -Coffee Machine -Paxels --- build.gradle | 18 +- .../actuallyadditions/ActuallyAdditions.java | 2 +- .../ellpeck/actuallyadditions/PLANNED.txt | 20 +- .../blocks/BlockCoffeeMachine.java | 139 ++++++++++ .../blocks/BlockFurnaceSolar.java | 6 +- .../actuallyadditions/blocks/BlockMisc.java | 6 +- .../blocks/BlockPhantomBooster.java | 109 ++++++++ .../blocks/BlockPhantomface.java | 7 +- .../actuallyadditions/blocks/InitBlocks.java | 79 ++++-- .../blocks/metalists/TheMiscBlocks.java | 3 +- .../blocks/render/ModelBaseAA.java | 9 + .../blocks/render/ModelCoffeeMachine.java | 137 ++++++++++ .../blocks/render/ModelCompost.java | 11 +- .../blocks/render/ModelPhantomBooster.java | 148 ++++++++++ .../blocks/render/RenderTileEntity.java | 14 +- .../config/values/ConfigBoolValues.java | 3 +- .../config/values/ConfigCrafting.java | 11 +- .../config/values/ConfigIntValues.java | 12 +- .../crafting/BlockCrafting.java | 41 ++- .../crafting/ItemCrafting.java | 56 +++- .../creative/CreativeTab.java | 14 + .../event/BucketFillEvent.java | 19 +- .../event/RenderPlayerEventAA.java | 7 + .../event/WorldDecorationEvent.java | 1 + .../gadget/RenderSpecial.java | 2 +- .../inventory/ContainerCoffeeMachine.java | 138 ++++++++++ .../inventory/ContainerInputter.java | 29 +- .../inventory/GuiHandler.java | 111 ++++---- .../inventory/{ => gui}/GuiBreaker.java | 3 +- .../inventory/{ => gui}/GuiCanolaPress.java | 3 +- .../inventory/{ => gui}/GuiCoalGenerator.java | 3 +- .../inventory/gui/GuiCoffeeMachine.java | 109 ++++++++ .../inventory/{ => gui}/GuiCrafter.java | 3 +- .../inventory/{ => gui}/GuiDropper.java | 3 +- .../inventory/{ => gui}/GuiFeeder.java | 3 +- .../{ => gui}/GuiFermentingBarrel.java | 3 +- .../{ => gui}/GuiFluidCollector.java | 3 +- .../inventory/{ => gui}/GuiFurnaceDouble.java | 3 +- .../inventory/{ => gui}/GuiGiantChest.java | 3 +- .../inventory/{ => gui}/GuiGrinder.java | 3 +- .../inventory/{ => gui}/GuiInputter.java | 70 +++-- .../inventory/{ => gui}/GuiOilGenerator.java | 3 +- .../inventory/{ => gui}/GuiPhantomPlacer.java | 3 +- .../inventory/{ => gui}/GuiRepairer.java | 3 +- .../inventory/slot/SlotFilter.java | 1 + .../actuallyadditions/items/InitItems.java | 30 +++ .../actuallyadditions/items/ItemCoffee.java | 253 ++++++++++++++++++ .../items/ItemCoffeeBean.java | 57 ++++ .../actuallyadditions/items/ItemDust.java | 8 +- .../actuallyadditions/items/ItemFoods.java | 30 ++- .../actuallyadditions/items/ItemJams.java | 28 +- .../actuallyadditions/items/ItemMisc.java | 8 +- .../items/ItemPhantomConnector.java | 32 ++- .../items/ItemPotionRing.java | 29 +- .../items/ItemSpecialDrop.java | 21 +- .../items/metalists/TheMiscItems.java | 3 +- .../items/metalists/ThePotionRings.java | 40 +-- .../items/tools/ItemAllToolAA.java | 133 +++++++++ .../nei/CoffeeMachineRecipeHandler.java | 152 +++++++++++ .../nei/CompostRecipeHandler.java | 4 +- .../nei/CrusherRecipeHandler.java | 6 +- .../nei/HairyBallRecipeHandler.java | 4 +- .../nei/NEIActuallyAdditionsConfig.java | 7 +- .../network/PacketHandler.java | 3 +- .../network/PacketTileEntityFeeder.java | 2 +- .../network/gui/IButtonReactor.java | 8 + .../PacketGuiButton.java} | 24 +- .../actuallyadditions/proxy/ClientProxy.java | 10 +- .../actuallyadditions/recipe/FuelHandler.java | 20 +- .../tile/TileEntityBase.java | 1 + .../tile/TileEntityBreaker.java | 9 - .../tile/TileEntityCanolaPress.java | 2 +- .../tile/TileEntityCoalGenerator.java | 11 +- .../tile/TileEntityCoffeeMachine.java | 169 ++++++++++++ .../tile/TileEntityFermentingBarrel.java | 2 +- .../tile/TileEntityFluidCollector.java | 4 +- .../tile/TileEntityFurnaceDouble.java | 2 +- .../tile/TileEntityFurnaceSolar.java | 2 +- .../tile/TileEntityGrinder.java | 11 +- .../tile/TileEntityHeatCollector.java | 2 +- .../tile/TileEntityInputter.java | 53 ++-- .../tile/TileEntityItemRepairer.java | 2 +- .../tile/TileEntityLavaFactoryController.java | 2 +- .../tile/TileEntityOilGenerator.java | 6 +- .../tile/TileEntityPhantomBooster.java | 5 + .../tile/TileEntityPhantomPlacer.java | 5 +- .../tile/TileEntityPhantomface.java | 154 +++++------ .../tile/TileEntityXPSolidifier.java | 67 +++++ .../actuallyadditions/util/ModUtil.java | 2 +- .../waila/WailaDataProvider.java | 3 +- .../assets/actuallyadditions/lang/en_US.lang | 87 ++++-- .../textures/blocks/blockCoffeeStage1.png | Bin 0 -> 291 bytes .../textures/blocks/blockCoffeeStage2.png | Bin 0 -> 325 bytes .../textures/blocks/blockCoffeeStage3.png | Bin 0 -> 312 bytes .../textures/blocks/blockCoffeeStage4.png | Bin 0 -> 366 bytes .../textures/blocks/blockCoffeeStage5.png | Bin 0 -> 383 bytes .../textures/blocks/blockCoffeeStage6.png | Bin 0 -> 399 bytes .../textures/blocks/blockFlaxStage1.png | Bin 0 -> 308 bytes .../textures/blocks/blockFlaxStage2.png | Bin 0 -> 354 bytes .../textures/blocks/blockFlaxStage3.png | Bin 0 -> 377 bytes .../textures/blocks/blockFlaxStage4.png | Bin 0 -> 407 bytes .../textures/blocks/blockFlaxStage5.png | Bin 0 -> 433 bytes .../textures/blocks/blockFlaxStage6.png | Bin 0 -> 454 bytes .../textures/blocks/blockMiscEnderCasing.png | Bin 0 -> 749 bytes .../blocks/models/modelCoffeeMachine.png | Bin 0 -> 552 bytes .../blocks/models/modelPhantomBooster.png | Bin 0 -> 343 bytes .../blocks/models/special/modelLordi.png | Bin 0 -> 1267 bytes .../textures/gui/guiCoffeeMachine.png | Bin 0 -> 2553 bytes .../textures/gui/guiInputterAdvanced.png | Bin 3020 -> 1942 bytes .../textures/gui/guiNEICoffeeMachine.png | Bin 0 -> 2387 bytes .../textures/items/diamondPaxel.png | Bin 0 -> 354 bytes .../textures/items/emeraldPaxel.png | Bin 0 -> 326 bytes .../textures/items/goldPaxel.png | Bin 0 -> 351 bytes .../textures/items/ironPaxel.png | Bin 0 -> 340 bytes .../textures/items/itemCoffee.png | Bin 0 -> 265 bytes .../textures/items/itemCoffeeBeans.png | Bin 0 -> 273 bytes .../textures/items/itemCoffeeSeed.png | Bin 0 -> 284 bytes .../textures/items/itemFlaxSeed.png | Bin 0 -> 269 bytes .../textures/items/itemMiscCup.png | Bin 0 -> 250 bytes .../textures/items/obsidianPaxel.png | Bin 0 -> 334 bytes .../textures/items/stonePaxel.png | Bin 0 -> 336 bytes .../textures/items/woodenPaxel.png | Bin 0 -> 338 bytes src/main/resources/mcmod.info | 4 +- 123 files changed, 2418 insertions(+), 473 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCoffeeMachine.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/render/ModelPhantomBooster.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiBreaker.java (93%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiCanolaPress.java (96%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiCoalGenerator.java (95%) create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiCrafter.java (91%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiDropper.java (93%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiFeeder.java (96%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiFermentingBarrel.java (96%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiFluidCollector.java (95%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiFurnaceDouble.java (95%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiGiantChest.java (92%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiGrinder.java (96%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiInputter.java (64%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiOilGenerator.java (96%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiPhantomPlacer.java (93%) rename src/main/java/ellpeck/actuallyadditions/inventory/{ => gui}/GuiRepairer.java (95%) create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java create mode 100644 src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java create mode 100644 src/main/java/ellpeck/actuallyadditions/network/gui/IButtonReactor.java rename src/main/java/ellpeck/actuallyadditions/network/{PacketInputterButton.java => gui/PacketGuiButton.java} (66%) create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage1.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage2.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage3.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage4.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage5.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage6.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage1.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage2.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage3.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage4.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage5.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage6.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockMiscEnderCasing.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/models/modelCoffeeMachine.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/models/modelPhantomBooster.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiCoffeeMachine.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiNEICoffeeMachine.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/diamondPaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/emeraldPaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/goldPaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/ironPaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemCoffee.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemCoffeeBeans.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemCoffeeSeed.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemFlaxSeed.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/itemMiscCup.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/obsidianPaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/stonePaxel.png create mode 100644 src/main/resources/assets/actuallyadditions/textures/items/woodenPaxel.png diff --git a/build.gradle b/build.gradle index 6bbc56aff..6c119de8a 100644 --- a/build.gradle +++ b/build.gradle @@ -18,12 +18,12 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.3" +version = "1.7.10-0.0.5.4" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" minecraft { - version = "1.7.10-10.13.3.1395-1710ls" + version = "1.7.10-10.13.3.1428-1.7.10" runDir = "idea" } @@ -39,16 +39,10 @@ repositories { } dependencies { - compile "mcp.mobius.waila:Waila:1.5.6_1.7.10" -} - -task copyChickenBones(type: Copy, dependsOn: "extractUserDev") { - from { configurations.compile } - include "**/*Chicken*.jar", "**/*NotEnoughItems*.jar" - exclude "**/CodeChickenLib*" - into file("./run/mods") - mustRunAfter "deobfBinJar" - mustRunAfter "repackMinecraft" + compile "mcp.mobius.waila:Waila:1.5.10_1.7.10" + compile "codechicken:CodeChickenLib:1.7.10-1.1.1.99:dev" + compile "codechicken:CodeChickenCore:1.7.10-1.0.4.29:dev" + compile "codechicken:NotEnoughItems:1.7.10-1.0.3.74:dev" } processResources{ diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index e22cfa268..b8568fb64 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -39,8 +39,8 @@ public class ActuallyAdditions{ public void preInit(FMLPreInitializationEvent event){ Util.logInfo("Starting PreInitialization Phase..."); - PacketHandler.init(); ConfigurationHandler.init(event.getSuggestedConfigurationFile()); + PacketHandler.init(); InitItemMaterials.init(); InitBlocks.init(); InitItems.init(); diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index 2557bf0da..f88cf0aa5 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -14,7 +14,6 @@ -Attracts/Repulses Mobs -Has an aggressive and a friendly version -Maybe for Items - -Crafted with an Ender Casing -Void Bag -Sucks up picked up Items @@ -83,7 +82,18 @@ -Ring of Water Absorption: Removes Water around -Ring of Striptease (Or something like that): Attacker lose parts of their Armor --Coffee - -Coffee Machine - -Coffee Cup - -Bedrockium Coffee Cup +-Food Cannon + -Shoots Food Items + -Damage varies with Food + +-Furniture + -Can be put into a Crafting Table with a Banner to give it a pattern (1.8!) + -Parts of the furniture can have different types (eg. Wood, Stone etc.) -> Via Crafting or Tool? + +-Tinker's Concrete + -Customizable with Items in Concrete Mixer + -(eg. Redstone->Speed Glowstone->Light etc.) + +-XP Solidifier + -Block that creates Solidified Experience from Player's Levels + -Has a GUI with Buttons diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java new file mode 100644 index 000000000..6ab49eeef --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java @@ -0,0 +1,139 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.util.MathHelper; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockCoffeeMachine extends BlockContainerBase implements INameableItem{ + + public BlockCoffeeMachine(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + + float f = 1/16F; + this.setBlockBounds(f, 0F, f, 1F-f, 1F-2*f, 1F-f); + } + + @Override + public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase player, ItemStack stack){ + int rotation = MathHelper.floor_double((double)(player.rotationYaw*4.0F/360.0F)+0.5D) & 3; + + if(rotation == 0) world.setBlockMetadataWithNotify(x, y, z, 2, 0); + if(rotation == 1) world.setBlockMetadataWithNotify(x, y, z, 1, 3); + if(rotation == 2) world.setBlockMetadataWithNotify(x, y, z, 0, 2); + if(rotation == 3) world.setBlockMetadataWithNotify(x, y, z, 3, 3); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int f6, float f7, float f8, float f9){ + if(!world.isRemote){ + TileEntityCoffeeMachine machine = (TileEntityCoffeeMachine)world.getTileEntity(x, y, z); + if (machine != null) player.openGui(ActuallyAdditions.instance, GuiHandler.COFFEE_MACHINE_ID, world, x, y, z); + return true; + } + return true; + } + + @Override + public IIcon getIcon(int side, int metadata){ + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = Blocks.coal_block.getIcon(0, 0); + } + + @Override + public boolean isOpaqueCube(){ + return false; + } + + @Override + public boolean renderAsNormalBlock(){ + return false; + } + + @Override + public int getRenderType(){ + return RenderingRegistry.getNextAvailableRenderId(); + } + + @Override + public TileEntity createNewTileEntity(World world, int meta){ + return new TileEntityCoffeeMachine(); + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return "blockCoffeeMachine"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 5, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java index 0c2ae5542..36949cd77 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java @@ -23,10 +23,10 @@ import java.util.List; public class BlockFurnaceSolar extends BlockContainerBase implements INameableItem{ public BlockFurnaceSolar(){ - super(Material.wood); - this.setHarvestLevel("axe", 0); + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); this.setHardness(1.0F); - this.setStepSound(soundTypeWood); + this.setStepSound(soundTypeStone); this.setBlockBounds(0F, 0F, 0F, 1F, 3F/16F, 1F); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java index 1bb1a2594..513a52bcc 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java @@ -45,7 +45,7 @@ public class BlockMisc extends Block implements INameableItem{ @Override public IIcon getIcon(int side, int metadata){ - return textures[metadata]; + return metadata >= textures.length ? null : textures[metadata]; } @Override @@ -79,12 +79,12 @@ public class BlockMisc extends Block implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allMiscBlocks[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allMiscBlocks.length ? EnumRarity.common : allMiscBlocks[stack.getItemDamage()].rarity; } @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allMiscBlocks[stack.getItemDamage()].getName(); + return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscBlocks.length ? " ERROR!" : allMiscBlocks[stack.getItemDamage()].getName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java new file mode 100644 index 000000000..268276d99 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java @@ -0,0 +1,109 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.client.registry.RenderingRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.tile.TileEntityPhantomBooster; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockPhantomBooster extends BlockContainerBase implements INameableItem{ + + public BlockPhantomBooster(){ + super(Material.rock); + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + + float f = 1F/16F; + this.setBlockBounds(3*f, 0F, 3*f, 1-3*f, 1F, 1-3*f); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public boolean isOpaqueCube(){ + return false; + } + + @Override + public boolean renderAsNormalBlock(){ + return false; + } + + @Override + public int getRenderType(){ + return RenderingRegistry.getNextAvailableRenderId(); + } + + @Override + public IIcon getIcon(int side, int metadata){ + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = Blocks.lapis_block.getIcon(0, 0); + } + + @Override + public String getName(){ + return "blockPhantomBooster"; + } + + @Override + public TileEntity createNewTileEntity(World world, int i){ + return new TileEntityPhantomBooster(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 2, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index 85407eaec..06b5c994f 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -63,9 +63,10 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte if(tile != null){ if(tile instanceof TileEntityPhantomface){ TileEntityPhantomface phantom = (TileEntityPhantomface)tile; + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + phantom.range)); if(phantom.hasBoundTile()){ - if(phantom.isBoundTileInRage()) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); - else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundTile.xCoord, phantom.boundTile.yCoord, phantom.boundTile.zCoord))); + if(phantom.isBoundTileInRage()) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); + else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); } else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notConnected.desc"))); } @@ -73,6 +74,7 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte else if(tile instanceof TileEntityPhantomPlacer){ if(player.isSneaking()){ TileEntityPhantomPlacer phantom = (TileEntityPhantomPlacer)tile; + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + phantom.range)); if(phantom.hasBoundPosition()){ if(phantom.isBoundPositionInRange()) player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedBlock.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connectedNoRange.desc", phantom.boundPosition.posX, phantom.boundPosition.posY, phantom.boundPosition.posZ))); @@ -159,7 +161,6 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte if(((BlockPhantomface)this.theBlock).type == LIQUIFACE){ list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.5")); } list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 599857a19..7b20e5acf 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -1,12 +1,14 @@ package ellpeck.actuallyadditions.blocks; import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.item.EnumRarity; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; +import org.apache.logging.log4j.Level; import powercrystals.minefactoryreloaded.api.FactoryRegistry; public class InitBlocks{ @@ -34,6 +36,7 @@ public class InitBlocks{ public static Block blockRice; public static Block blockCanola; public static Block blockFlax; + public static Block blockCoffee; public static Fluid fluidCanolaOil; public static Block blockCanolaOil; @@ -56,6 +59,9 @@ public class InitBlocks{ public static Block blockFluidCollector; public static Block blockLavaFactoryController; + public static Block blockCoffeeMachine; + + public static Block blockPhantomBooster; public static void init(){ Util.logInfo("Initializing Blocks..."); @@ -63,20 +69,6 @@ public class InitBlocks{ blockLavaFactoryController = new BlockLavaFactoryController(); BlockUtil.register(blockLavaFactoryController, BlockLavaFactoryController.TheItemBlock.class); - fluidCanolaOil = new FluidAA("canolaoil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); - FluidRegistry.registerFluid(fluidCanolaOil); - fluidCanolaOil = FluidRegistry.getFluid(fluidCanolaOil.getName()); - - blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); - BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); - - fluidOil = new FluidAA("oil").setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); - FluidRegistry.registerFluid(fluidOil); - fluidOil = FluidRegistry.getFluid(fluidOil.getName()); - - blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); - BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); - blockCanolaPress = new BlockCanolaPress(); BlockUtil.register(blockCanolaPress, BlockCanolaPress.TheItemBlock.class); @@ -115,10 +107,15 @@ public class InitBlocks{ FactoryRegistry.sendMessage("registerFertilizable", blockCanola); blockFlax = new BlockPlant("blockFlax", 6, 2, 4); - BlockUtil.register(blockFlax, BlockPlant.TheItemBlock.class); + BlockUtil.register(blockFlax, BlockPlant.TheItemBlock.class, false); FactoryRegistry.sendMessage("registerHarvestable", blockFlax); FactoryRegistry.sendMessage("registerFertilizable", blockFlax); + blockCoffee = new BlockPlant("blockCoffee", 6, 2, 2); + BlockUtil.register(blockCoffee, BlockPlant.TheItemBlock.class, false); + FactoryRegistry.sendMessage("registerHarvestable", blockCoffee); + FactoryRegistry.sendMessage("registerFertilizable", blockCoffee); + blockCompost = new BlockCompost(); BlockUtil.register(blockCompost, BlockCompost.TheItemBlock.class); @@ -175,5 +172,57 @@ public class InitBlocks{ blockFluidCollector = new BlockFluidCollector(false); BlockUtil.register(blockFluidCollector, BlockFluidCollector.TheItemBlock.class); + + blockCoffeeMachine = new BlockCoffeeMachine(); + BlockUtil.register(blockCoffeeMachine, BlockCoffeeMachine.TheItemBlock.class); + + blockPhantomBooster = new BlockPhantomBooster(); + BlockUtil.register(blockPhantomBooster, BlockPhantomBooster.TheItemBlock.class); + + registerFluids(); + } + + public static void registerFluids(){ + String canolaOil = "canolaoil"; + if(!FluidRegistry.isFluidRegistered(canolaOil)){ + fluidCanolaOil = new FluidAA(canolaOil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); + FluidRegistry.registerFluid(fluidCanolaOil); + } + else{ + errorAlreadyRegistered("Canola Oil Fluid"); + } + fluidCanolaOil = FluidRegistry.getFluid(canolaOil); + + if(fluidCanolaOil.getBlock() == null){ + blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); + BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); + } + else{ + errorAlreadyRegistered("Canola Oil Block"); + } + blockCanolaOil = fluidCanolaOil.getBlock(); + + String oil = "oil"; + if(!FluidRegistry.isFluidRegistered(oil)){ + fluidOil = new FluidAA(oil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); + FluidRegistry.registerFluid(fluidOil); + } + else{ + errorAlreadyRegistered("Oil Fluid"); + } + fluidOil = FluidRegistry.getFluid(oil); + + if(fluidOil.getBlock() == null){ + blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); + BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); + } + else{ + errorAlreadyRegistered("Oil Block"); + } + blockOil = fluidOil.getBlock(); + } + + public static void errorAlreadyRegistered(String str){ + ModUtil.LOGGER.log(Level.WARN, str + " from Actually Additions is not getting used as it has already been registered by another Mod! Issues may (but shouldn't) occur!"); } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java index 1eb1dfa4d..fe6ac9a7a 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheMiscBlocks.java @@ -13,7 +13,8 @@ public enum TheMiscBlocks implements INameableItem{ STONE_CASING("StoneCasing", EnumRarity.uncommon, "blockCasingStone"), CHARCOAL_BLOCK("Charcoal", EnumRarity.common, "blockCharcoal"), ENDERPEARL_BLOCK("Enderpearl", EnumRarity.rare, "blockEnderpearl"), - LAVA_FACTORY_CASE("LavaFactoryCase", EnumRarity.uncommon, "blockLavaFactoryCase"); + LAVA_FACTORY_CASE("LavaFactoryCase", EnumRarity.uncommon, "blockLavaFactoryCase"), + ENDER_CASING("EnderCasing", EnumRarity.epic, "blockEnderCasing"); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelBaseAA.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelBaseAA.java index a8b698739..ead226a1b 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelBaseAA.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelBaseAA.java @@ -1,6 +1,7 @@ package ellpeck.actuallyadditions.blocks.render; import net.minecraft.client.model.ModelBase; +import net.minecraft.tileentity.TileEntity; public class ModelBaseAA extends ModelBase{ @@ -11,4 +12,12 @@ public class ModelBaseAA extends ModelBase{ public String getName(){ return null; } + + public void renderExtra(float f, TileEntity tile){ + + } + + public boolean doesRotate(){ + return false; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCoffeeMachine.java new file mode 100644 index 000000000..38eb0d2bc --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCoffeeMachine.java @@ -0,0 +1,137 @@ +package ellpeck.actuallyadditions.blocks.render; + +import net.minecraft.client.model.ModelRenderer; + +public class ModelCoffeeMachine extends ModelBaseAA{ + + ModelRenderer p1; + ModelRenderer p2; + ModelRenderer p3; + ModelRenderer p4; + ModelRenderer p5; + ModelRenderer p6; + ModelRenderer p7; + ModelRenderer p8; + ModelRenderer p9; + ModelRenderer p10; + ModelRenderer p11; + ModelRenderer p12; + ModelRenderer p13; + + public ModelCoffeeMachine(){ + textureWidth = 128; + textureHeight = 128; + + p1 = new ModelRenderer(this, 0, 0); + p1.addBox(0F, 0F, 0F, 10, 1, 14); + p1.setRotationPoint(-5F, 23F, -7F); + p1.setTextureSize(128, 128); + p1.mirror = true; + setRotation(p1, 0F, 0F, 0F); + p2 = new ModelRenderer(this, 49, 0); + p2.addBox(0F, 0F, 0F, 10, 8, 6); + p2.setRotationPoint(-5F, 15F, 1F); + p2.setTextureSize(128, 128); + p2.mirror = true; + setRotation(p2, 0F, 0F, 0F); + p3 = new ModelRenderer(this, 0, 16); + p3.addBox(0F, 0F, 0F, 10, 2, 11); + p3.setRotationPoint(-5F, 13F, -4F); + p3.setTextureSize(128, 128); + p3.mirror = true; + setRotation(p3, 0F, 0F, 0F); + p4 = new ModelRenderer(this, 43, 16); + p4.addBox(0F, 0F, 0F, 8, 3, 8); + p4.setRotationPoint(-4F, 10F, -1F); + p4.setTextureSize(128, 128); + p4.mirror = true; + setRotation(p4, 0F, 0F, 0F); + p5 = new ModelRenderer(this, 0, 30); + p5.addBox(0F, 0F, 0F, 2, 1, 2); + p5.setRotationPoint(-1F, 15F, -3.5F); + p5.setTextureSize(128, 128); + p5.mirror = true; + setRotation(p5, 0F, 0F, 0F); + p6 = new ModelRenderer(this, 82, 0); + p6.addBox(0F, 0F, 0F, 4, 5, 1); + p6.setRotationPoint(-2F, 17F, -1F); + p6.setTextureSize(128, 128); + p6.mirror = true; + setRotation(p6, 0F, 0F, 0F); + p7 = new ModelRenderer(this, 82, 0); + p7.addBox(0F, 0F, 0F, 4, 5, 1); + p7.setRotationPoint(-2F, 17F, -6F); + p7.setTextureSize(128, 128); + p7.mirror = true; + setRotation(p7, 0F, 0F, 0F); + p8 = new ModelRenderer(this, 82, 0); + p8.addBox(0F, 0F, 0F, 4, 5, 1); + p8.setRotationPoint(2F, 17F, -1F); + p8.setTextureSize(128, 128); + p8.mirror = true; + setRotation(p8, 0F, 1.570796F, 0F); + p9 = new ModelRenderer(this, 82, 0); + p9.addBox(0F, 0F, 0F, 4, 5, 1); + p9.setRotationPoint(-3F, 17F, -1F); + p9.setTextureSize(128, 128); + p9.mirror = true; + setRotation(p9, 0F, 1.570796F, 0F); + p10 = new ModelRenderer(this, 93, 0); + p10.addBox(0F, 0F, 0F, 4, 1, 4); + p10.setRotationPoint(-2F, 22F, -5F); + p10.setTextureSize(128, 128); + p10.mirror = true; + setRotation(p10, 0F, 0F, 0F); + p11 = new ModelRenderer(this, 82, 7); + p11.addBox(0F, 0F, 0F, 1, 1, 2); + p11.setRotationPoint(-4F, 18F, -4F); + p11.setTextureSize(128, 128); + p11.mirror = true; + setRotation(p11, 0F, 0F, 0F); + p12 = new ModelRenderer(this, 82, 7); + p12.addBox(0F, 0F, 0F, 1, 1, 2); + p12.setRotationPoint(-4F, 21F, -4F); + p12.setTextureSize(128, 128); + p12.mirror = true; + setRotation(p12, 0F, 0F, 0F); + p13 = new ModelRenderer(this, 89, 7); + p13.addBox(0F, 0F, 0F, 1, 2, 2); + p13.setRotationPoint(-5F, 19F, -4F); + p13.setTextureSize(128, 128); + p13.mirror = true; + setRotation(p13, 0F, 0F, 0F); + } + + @Override + public void render(float f){ + p1.render(f); + p2.render(f); + p3.render(f); + p4.render(f); + p5.render(f); + p6.render(f); + p7.render(f); + p8.render(f); + p9.render(f); + p10.render(f); + p11.render(f); + p12.render(f); + p13.render(f); + } + + private void setRotation(ModelRenderer model, float x, float y, float z){ + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } + + @Override + public String getName(){ + return "modelCoffeeMachine"; + } + + @Override + public boolean doesRotate(){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCompost.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCompost.java index 6dfc64af0..1277e985e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelCompost.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.blocks.render; import ellpeck.actuallyadditions.tile.TileEntityCompost; import net.minecraft.client.model.ModelRenderer; +import net.minecraft.tileentity.TileEntity; public class ModelCompost extends ModelBaseAA{ @@ -43,15 +44,17 @@ public class ModelCompost extends ModelBaseAA{ this.innerDone.addBox(0.0F, 0.0F, 0.0F, 12, 13, 12, 0.0F); } - public void renderExtra(float f, TileEntityCompost tile){ + @Override + public void renderExtra(float f, TileEntity tile){ + TileEntityCompost tileCompost = (TileEntityCompost)tile; int meta = tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord); - if(meta > 0 && meta <= tile.amountNeededToConvert){ - int heightToDisplay = meta*13/tile.amountNeededToConvert; + if(meta > 0 && meta <= tileCompost.amountNeededToConvert){ + int heightToDisplay = meta*13/tileCompost.amountNeededToConvert; if(heightToDisplay > 13) heightToDisplay = 13; this.innerRawList[heightToDisplay-1].render(f); } - if(meta == tile.amountNeededToConvert+1){ + if(meta == tileCompost.amountNeededToConvert+1){ this.innerDone.render(f); } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelPhantomBooster.java new file mode 100644 index 000000000..5f11ef016 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/ModelPhantomBooster.java @@ -0,0 +1,148 @@ +package ellpeck.actuallyadditions.blocks.render; + +import net.minecraft.client.model.ModelRenderer; + +public class ModelPhantomBooster extends ModelBaseAA{ + + ModelRenderer s1; + ModelRenderer s2; + ModelRenderer s3; + ModelRenderer s4; + ModelRenderer s5; + ModelRenderer s6; + ModelRenderer s7; + ModelRenderer s8; + ModelRenderer s9; + ModelRenderer s10; + ModelRenderer s11; + ModelRenderer s12; + ModelRenderer s13; + ModelRenderer s14; + ModelRenderer s15; + + public ModelPhantomBooster(){ + textureWidth = 128; + textureHeight = 128; + + s1 = new ModelRenderer(this, 0, 0); + s1.addBox(0F, 0F, 0F, 4, 16, 4); + s1.setRotationPoint(-2F, 8F, -2F); + s1.setTextureSize(128, 128); + s1.mirror = true; + setRotation(s1, 0F, 0F, 0F); + s2 = new ModelRenderer(this, 17, 0); + s2.addBox(0F, 0F, 0F, 6, 1, 6); + s2.setRotationPoint(-3F, 9F, -3F); + s2.setTextureSize(128, 128); + s2.mirror = true; + setRotation(s2, 0F, 0F, 0F); + s3 = new ModelRenderer(this, 17, 0); + s3.addBox(0F, 0F, 0F, 6, 1, 6); + s3.setRotationPoint(-3F, 22F, -3F); + s3.setTextureSize(128, 128); + s3.mirror = true; + setRotation(s3, 0F, 0F, 0F); + s4 = new ModelRenderer(this, 17, 8); + s4.addBox(0F, 0F, 0F, 6, 2, 1); + s4.setRotationPoint(-3F, 10F, -4F); + s4.setTextureSize(128, 128); + s4.mirror = true; + setRotation(s4, 0F, 0F, 0F); + s5 = new ModelRenderer(this, 17, 8); + s5.addBox(0F, 0F, 0F, 6, 2, 1); + s5.setRotationPoint(-3F, 10F, 3F); + s5.setTextureSize(128, 128); + s5.mirror = true; + setRotation(s5, 0F, 0F, 0F); + s6 = new ModelRenderer(this, 17, 8); + s6.addBox(0F, 0F, 0F, 6, 2, 1); + s6.setRotationPoint(-4F, 10F, 3F); + s6.setTextureSize(128, 128); + s6.mirror = true; + setRotation(s6, 0F, 1.579523F, 0F); + s7 = new ModelRenderer(this, 17, 8); + s7.addBox(0F, 0F, 0F, 6, 2, 1); + s7.setRotationPoint(3F, 10F, 3F); + s7.setTextureSize(128, 128); + s7.mirror = true; + setRotation(s7, 0F, 1.579523F, 0F); + s8 = new ModelRenderer(this, 17, 12); + s8.addBox(0F, 0F, 0F, 6, 8, 1); + s8.setRotationPoint(-3F, 12F, -5F); + s8.setTextureSize(128, 128); + s8.mirror = true; + setRotation(s8, 0F, 0F, 0F); + s9 = new ModelRenderer(this, 17, 12); + s9.addBox(0F, 0F, 0F, 6, 8, 1); + s9.setRotationPoint(-3F, 12F, 4F); + s9.setTextureSize(128, 128); + s9.mirror = true; + setRotation(s9, 0F, 0F, 0F); + s10 = new ModelRenderer(this, 17, 12); + s10.addBox(0F, 0F, 0F, 6, 8, 1); + s10.setRotationPoint(-5F, 12F, 3F); + s10.setTextureSize(128, 128); + s10.mirror = true; + setRotation(s10, 0F, 1.579523F, 0F); + s11 = new ModelRenderer(this, 17, 12); + s11.addBox(0F, 0F, 0F, 6, 8, 1); + s11.setRotationPoint(4F, 12F, 3F); + s11.setTextureSize(128, 128); + s11.mirror = true; + setRotation(s11, 0F, 1.579523F, 0F); + s12 = new ModelRenderer(this, 17, 8); + s12.addBox(0F, 0F, 0F, 6, 2, 1); + s12.setRotationPoint(-4F, 20F, 3F); + s12.setTextureSize(128, 128); + s12.mirror = true; + setRotation(s12, 0F, 1.579523F, 0F); + s13 = new ModelRenderer(this, 17, 8); + s13.addBox(0F, 0F, 0F, 6, 2, 1); + s13.setRotationPoint(-3F, 20F, 3F); + s13.setTextureSize(128, 128); + s13.mirror = true; + setRotation(s13, 0F, 0F, 0F); + s14 = new ModelRenderer(this, 17, 8); + s14.addBox(0F, 0F, 0F, 6, 2, 1); + s14.setRotationPoint(3F, 20F, 3F); + s14.setTextureSize(128, 128); + s14.mirror = true; + setRotation(s14, 0F, 1.579523F, 0F); + s15 = new ModelRenderer(this, 17, 8); + s15.addBox(0F, 0F, 0F, 6, 2, 1); + s15.setRotationPoint(-3F, 20F, -4F); + s15.setTextureSize(128, 128); + s15.mirror = true; + setRotation(s15, 0F, 0F, 0F); + } + + @Override + public void render(float f){ + s1.render(f); + s2.render(f); + s3.render(f); + s4.render(f); + s5.render(f); + s6.render(f); + s7.render(f); + s8.render(f); + s9.render(f); + s10.render(f); + s11.render(f); + s12.render(f); + s13.render(f); + s14.render(f); + s15.render(f); + } + + @Override + public String getName(){ + return "modelPhantomBooster"; + } + + private void setRotation(ModelRenderer model, float x, float y, float z){ + model.rotateAngleX = x; + model.rotateAngleY = y; + model.rotateAngleZ = z; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/render/RenderTileEntity.java b/src/main/java/ellpeck/actuallyadditions/blocks/render/RenderTileEntity.java index b500f1088..0a86843e9 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/render/RenderTileEntity.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/render/RenderTileEntity.java @@ -1,6 +1,5 @@ package ellpeck.actuallyadditions.blocks.render; -import ellpeck.actuallyadditions.tile.TileEntityCompost; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; @@ -9,7 +8,7 @@ import org.lwjgl.opengl.GL11; public class RenderTileEntity extends TileEntitySpecialRenderer{ - ModelBaseAA theModel; + public ModelBaseAA theModel; public RenderTileEntity(ModelBaseAA model){ this.theModel = model; @@ -22,9 +21,16 @@ public class RenderTileEntity extends TileEntitySpecialRenderer{ GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); GL11.glTranslatef(0.0F, -2.0F, 0.0F); this.bindTexture(new ResourceLocation(ModUtil.MOD_ID_LOWER, "textures/blocks/models/" + this.theModel.getName() + ".png")); - theModel.render(0.0625F); - if(tile instanceof TileEntityCompost && theModel instanceof ModelCompost) ((ModelCompost)theModel).renderExtra(0.0625F, (TileEntityCompost)tile); + if(theModel.doesRotate()){ + int meta = tile.getWorldObj().getBlockMetadata(tile.xCoord, tile.yCoord, tile.zCoord); + if(meta == 0) GL11.glRotatef(180F, 0F, 1F, 0F); + if(meta == 1) GL11.glRotatef(90F, 0F, 1F, 0F); + if(meta == 3) GL11.glRotatef(270F, 0F, 1F, 0F); + } + + theModel.render(0.0625F); + theModel.renderExtra(0.0625F, tile); GL11.glPopMatrix(); } diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java index 0d400efbb..260536f75 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java @@ -27,7 +27,8 @@ public enum ConfigBoolValues{ DO_RICE_GEN("Rice Gen", ConfigCategories.WORLD_GEN, true, "If Rice should generate in the World"), DO_CANOLA_GEN("Canola Gen", ConfigCategories.WORLD_GEN, true, "If Canola should generate in the World"), - DO_FLAX_GEN("Flax Gen", ConfigCategories.WORLD_GEN, true, "If Flax should generate in the World"); + DO_FLAX_GEN("Flax Gen", ConfigCategories.WORLD_GEN, true, "If Flax should generate in the World"), + DO_COFFEE_GEN("Coffee Gen", ConfigCategories.WORLD_GEN, true, "If Coffee should generate in the World"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java index fb0fbcd9b..58449b28f 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java @@ -60,7 +60,6 @@ public enum ConfigCrafting{ RING_WATER_BREATHING("Water Breathing Ring", ConfigCategories.POTION_RING_CRAFTING), RING_INVISIBILITY("Invisibility Ring", ConfigCategories.POTION_RING_CRAFTING), RING_NIGHT_VISION("Night Vision Ring", ConfigCategories.POTION_RING_CRAFTING), - RING_SATURATION("Saturation Ring", ConfigCategories.POTION_RING_CRAFTING, false), DOUGH("Dough", ConfigCategories.ITEMS_CRAFTING), PAPER_CONE("Paper Cone", ConfigCategories.ITEMS_CRAFTING), @@ -87,7 +86,15 @@ public enum ConfigCrafting{ PHANTOM_PLACER("Phantom Placer", ConfigCategories.BLOCKS_CRAFTING), PHANTOM_BREAKER("Phantom Breaker", ConfigCategories.BLOCKS_CRAFTING), LIQUID_PLACER("Liquid Placer", ConfigCategories.BLOCKS_CRAFTING), - LIQUID_BREAKER("Liquid Collector", ConfigCategories.BLOCKS_CRAFTING); + LIQUID_BREAKER("Liquid Collector", ConfigCategories.BLOCKS_CRAFTING), + + CUP("Cup", ConfigCategories.ITEMS_CRAFTING), + PAXELS("Paxels", ConfigCategories.ITEMS_CRAFTING), + + ENDER_CASING("Ender Casing", ConfigCategories.BLOCKS_CRAFTING), + PHANTOM_BOOSTER("Phantom Booster", ConfigCategories.BLOCKS_CRAFTING), + COFFEE_MACHINE("Coffee Machine", ConfigCategories.BLOCKS_CRAFTING), + LAVA_FACTORY("Lava Factory", ConfigCategories.BLOCKS_CRAFTING); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index fe3b2b4d8..bb671f483 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -52,7 +52,8 @@ public enum ConfigIntValues{ RICE_AMOUNT("Rice Amount", ConfigCategories.WORLD_GEN, 15, 1, 100, "The Chance of Rice generating"), CANOLA_AMOUNT("Canola Amount", ConfigCategories.WORLD_GEN, 10, 1, 50, "The Chance of Canola generating"), - FLAX_AMOUNT("Flax Amount", ConfigCategories.WORLD_GEN, 5, 1, 50, "The Chance of Flax generating"), + FLAX_AMOUNT("Flax Amount", ConfigCategories.WORLD_GEN, 8, 1, 50, "The Chance of Flax generating"), + COFFEE_AMOUNT("Coffee Amount", ConfigCategories.WORLD_GEN, 4, 1, 50, "The Chance of Coffee generating"), GRINDER_ENERGY_USED("Energy Use: Crusher", ConfigCategories.MACHINE_VALUES, 40, 1, 500, "The Amount of Energy used by the Crusher per Tick"), GRINDER_DOUBLE_ENERGY_USED("Energy Use: Double Crusher", ConfigCategories.MACHINE_VALUES, 60, 1, 500, "The Amount of Energy used by the Double Crusher per Tick"), @@ -79,7 +80,14 @@ public enum ConfigIntValues{ PHANTOM_PLACER_RANGE("Phantom Placer and Breaker: Range", ConfigCategories.MACHINE_VALUES, 3, 1, 100, "The Default Range of the Phantom Placer/Breaker"), LAVA_FACTORY_ENERGY_USED("Lava Factory: Energy Used", ConfigCategories.MACHINE_VALUES, 150000, 10, 3000000, "The amount of Energy used by the Lava Factory per Bucket of Lava produced"), - LAVA_FACTORY_TIME("Lava Factory: Production Time", ConfigCategories.MACHINE_VALUES, 200, 5, 10000, "The amount of time it takes for the Lava Factory to produce one Bucket"); + LAVA_FACTORY_TIME("Lava Factory: Production Time", ConfigCategories.MACHINE_VALUES, 200, 5, 10000, "The amount of time it takes for the Lava Factory to produce one Bucket"), + + COFFEE_MACHINE_ENERGY_USED("Coffee Machine: Energy Used", ConfigCategories.MACHINE_VALUES, 150, 10, 3000, "The amount of Energy used by the Coffee Machine per Tick"), + COFFEE_CACHE_ADDED_PER_ITEM("Coffee Machine: Coffee added per Item", ConfigCategories.MACHINE_VALUES, 1, 1, 300, "The amount of Coffee added by one Coffee Item in the Coffee Machine"), + COFFEE_CACHE_USED_PER_ITEM("Coffee Machine: Coffee used per Item", ConfigCategories.MACHINE_VALUES, 10, 1, 300, "The amount of Coffee used to brew one Coffee in the Coffee Machine"), + COFFEE_MACHINE_TIME_USED("Coffee Machine: Time to Brew", ConfigCategories.MACHINE_VALUES, 500, 10, 10000, "The amount of time the Coffee Machine takes to brew a Coffee"), + + COFFEE_DRINK_AMOUNT("Coffee: Drink Amount", ConfigCategories.OTHER, 4, 1, 100, "How often a Coffee can be drunk from"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index 43bc0c64c..a01f4814d 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -39,6 +39,45 @@ public class BlockCrafting{ 'R', "dustRedstone", 'S', "stickWood")); + //Ender Casing + if(ConfigCrafting.ENDER_CASING.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ENDER_CASING.ordinal()), + "WSW", "SRS", "WSW", + 'W', TheMiscBlocks.ENDERPEARL_BLOCK.getOredictName(), + 'R', TheMiscBlocks.QUARTZ.getOredictName(), + 'S', Blocks.obsidian)); + + //Phantom Booster + if(ConfigCrafting.PHANTOM_BOOSTER.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockPhantomBooster), + "RDR", "DCD", "RDR", + 'R', "dustRedstone", + 'D', "gemDiamond", + 'C', TheMiscBlocks.ENDER_CASING.getOredictName())); + + //Coffee Machine + if(ConfigCrafting.COFFEE_MACHINE.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockCoffeeMachine), + " C ", " S ", "A A", + 'C', ((INameableItem)InitItems.itemCoffeeBean).getOredictName(), + 'S', TheMiscBlocks.STONE_CASING.getOredictName(), + 'A', TheMiscItems.COIL.getOredictName())); + + //Lava Factory + if(ConfigCrafting.LAVA_FACTORY.isEnabled()){ + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockLavaFactoryController), + " C ", "ISI", " L ", + 'C', TheMiscBlocks.STONE_CASING.getOredictName(), + 'S', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'I', "blockIron", + 'L', Items.lava_bucket)); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 4, TheMiscBlocks.LAVA_FACTORY_CASE.ordinal()), + "ICI", + 'C', TheMiscBlocks.STONE_CASING.getOredictName(), + 'I', "blockIron")); + } + //Canola Press if(ConfigCrafting.CANOLA_PRESS.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockCanolaPress), @@ -256,7 +295,7 @@ public class BlockCrafting{ GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockGreenhouseGlass), "GSG", "SDS", "GSG", 'G', "blockGlass", - 'D', "gemDiamond", + 'D', Blocks.obsidian, 'S', "treeSapling")); //Placer diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java index 5fae3d929..ecbfd8be2 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java @@ -6,6 +6,7 @@ import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; import ellpeck.actuallyadditions.config.values.ConfigCrafting; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.*; +import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -50,6 +51,59 @@ public class ItemCrafting{ 'I', "ingotIron", 'R', "dustRedstone")); + //Cup + if(ConfigCrafting.CUP.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), + "S S", "SCS", "SSS", + 'S', "stone", + 'C', ((INameableItem)InitItems.itemCoffeeBean).getOredictName())); + + //Paxels + if(ConfigCrafting.PAXELS.isEnabled()){ + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.woodenPaxel), + new ItemStack(Items.wooden_axe), + new ItemStack(Items.wooden_pickaxe), + new ItemStack(Items.wooden_shovel), + new ItemStack(Items.wooden_sword), + new ItemStack(Items.wooden_hoe))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.stonePaxel), + new ItemStack(Items.stone_axe), + new ItemStack(Items.stone_pickaxe), + new ItemStack(Items.stone_shovel), + new ItemStack(Items.stone_sword), + new ItemStack(Items.stone_hoe))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.ironPaxel), + new ItemStack(Items.iron_axe), + new ItemStack(Items.iron_pickaxe), + new ItemStack(Items.iron_shovel), + new ItemStack(Items.iron_sword), + new ItemStack(Items.iron_hoe))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.goldPaxel), + new ItemStack(Items.golden_axe), + new ItemStack(Items.golden_pickaxe), + new ItemStack(Items.golden_shovel), + new ItemStack(Items.golden_sword), + new ItemStack(Items.golden_hoe))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.diamondPaxel), + new ItemStack(Items.diamond_axe), + new ItemStack(Items.diamond_pickaxe), + new ItemStack(Items.diamond_shovel), + new ItemStack(Items.diamond_sword), + new ItemStack(Items.diamond_hoe))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.emeraldPaxel), + new ItemStack(InitItems.itemAxeEmerald), + new ItemStack(InitItems.itemPickaxeEmerald), + new ItemStack(InitItems.itemSwordEmerald), + new ItemStack(InitItems.itemShovelEmerald), + new ItemStack(InitItems.itemHoeEmerald))); + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.obsidianPaxel), + new ItemStack(InitItems.itemAxeObsidian), + new ItemStack(InitItems.itemPickaxeObsidian), + new ItemStack(InitItems.itemSwordObsidian), + new ItemStack(InitItems.itemShovelObsidian), + new ItemStack(InitItems.itemHoeObsidian))); + } + //Resonant Rice if(ConfigCrafting.RESONANT_RICE.isEnabled()) GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.itemResonantRice), @@ -164,8 +218,6 @@ public class ItemCrafting{ if(ConfigCrafting.RING_WATER_BREATHING.isEnabled()) addRingRecipeWithStack(ThePotionRings.WATER_BREATHING.craftingItem, ThePotionRings.WATER_BREATHING.ordinal()); if(ConfigCrafting.RING_INVISIBILITY.isEnabled()) addRingRecipeWithStack(ThePotionRings.INVISIBILITY.craftingItem, ThePotionRings.INVISIBILITY.ordinal()); if(ConfigCrafting.RING_NIGHT_VISION.isEnabled()) addRingRecipeWithStack(ThePotionRings.NIGHT_VISION.craftingItem, ThePotionRings.NIGHT_VISION.ordinal()); - if(ConfigCrafting.RING_SATURATION.isEnabled()) addRingRecipeWithStack(ThePotionRings.SATURATION.craftingItem, ThePotionRings.SATURATION.ordinal()); - } public static void addRingRecipeWithStack(ItemStack mainStack, int meta){ diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 7f7d1b70e..d601fa893 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -31,6 +31,8 @@ public class CreativeTab extends CreativeTabs{ this.addBlock(InitBlocks.blockPhantomLiquiface); this.addBlock(InitBlocks.blockPhantomPlacer); this.addBlock(InitBlocks.blockPhantomBreaker); + this.addBlock(InitBlocks.blockPhantomBooster); + this.addBlock(InitBlocks.blockCoffeeMachine); this.addBlock(InitBlocks.blockInputter); this.addBlock(InitBlocks.blockInputterAdvanced); @@ -63,6 +65,8 @@ public class CreativeTab extends CreativeTabs{ this.addItem(InitItems.itemBucketCanolaOil); this.addItem(InitItems.itemBucketOil); + this.addItem(InitItems.itemCoffeeSeed); + this.addItem(InitItems.itemCoffeeBean); this.addItem(InitItems.itemRiceSeed); this.addItem(InitItems.itemCanolaSeed); this.addItem(InitItems.itemFlaxSeed); @@ -70,6 +74,8 @@ public class CreativeTab extends CreativeTabs{ this.addItem(InitItems.itemMisc); this.addItem(InitItems.itemResonantRice); this.addItem(InitItems.itemFertilizer); + + this.addItem(InitItems.itemCoffee); this.addItem(InitItems.itemFoods); this.addItem(InitItems.itemKnife); this.addItem(InitItems.itemCrafterOnAStick); @@ -78,6 +84,14 @@ public class CreativeTab extends CreativeTabs{ this.addItem(InitItems.itemLeafBlower); this.addItem(InitItems.itemLeafBlowerAdvanced); + this.addItem(InitItems.woodenPaxel); + this.addItem(InitItems.stonePaxel); + this.addItem(InitItems.ironPaxel); + this.addItem(InitItems.goldPaxel); + this.addItem(InitItems.diamondPaxel); + this.addItem(InitItems.emeraldPaxel); + this.addItem(InitItems.obsidianPaxel); + this.addItem(InitItems.itemPickaxeEmerald); this.addItem(InitItems.itemSwordEmerald); this.addItem(InitItems.itemAxeEmerald); diff --git a/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java b/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java index 953bed198..791ff6795 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java +++ b/src/main/java/ellpeck/actuallyadditions/event/BucketFillEvent.java @@ -2,7 +2,6 @@ package ellpeck.actuallyadditions.event; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import ellpeck.actuallyadditions.blocks.BlockFluidFlowing; import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.items.InitItems; import net.minecraft.block.Block; @@ -14,16 +13,14 @@ public class BucketFillEvent{ @SubscribeEvent public void onBucketFilled(FillBucketEvent event){ Block block = event.world.getBlock(event.target.blockX, event.target.blockY, event.target.blockZ); - - if(block instanceof BlockFluidFlowing){ - if(block == InitBlocks.blockCanolaOil){ - event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); - event.result = new ItemStack(InitItems.itemBucketCanolaOil); - } - if(block == InitBlocks.blockOil){ - event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); - event.result = new ItemStack(InitItems.itemBucketOil); - } + if(block == InitBlocks.blockCanolaOil){ + event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); + event.result = new ItemStack(InitItems.itemBucketCanolaOil); + event.setResult(Event.Result.ALLOW); + } + if(block == InitBlocks.blockOil){ + event.world.setBlockToAir(event.target.blockX, event.target.blockY, event.target.blockZ); + event.result = new ItemStack(InitItems.itemBucketOil); event.setResult(Event.Result.ALLOW); } } diff --git a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java index e5d0b7037..644fff2fc 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java +++ b/src/main/java/ellpeck/actuallyadditions/event/RenderPlayerEventAA.java @@ -15,6 +15,7 @@ public class RenderPlayerEventAA{ private RenderSpecial hoseRender = new RenderSpecial(new ModelTorch()); //private RenderSpecial paktoRender = new RenderSpecial(new ModelStandardBlock("Pakto")); private RenderSpecial glenRender = new RenderSpecial(new ModelStandardBlock("Glenthor")); + private RenderSpecial lordiRender = new RenderSpecial(new ModelStandardBlock("Lordi")); @SubscribeEvent(priority = EventPriority.HIGHEST) public void RenderPlayerEvent(RenderPlayerEvent.Pre event){ @@ -40,6 +41,12 @@ public class RenderPlayerEventAA{ //dqmhose if(event.entityPlayer.getUniqueID().equals(UUID.fromString("cb7b293a-5031-484e-b5be-b4f2f4e92726"))){ hoseRender.render(event.entityPlayer, event.partialRenderTick, 0.5F, 1.3F); + return; + } + + //Lordi + if(event.entityPlayer.getUniqueID().equals(UUID.fromString("990ecf6d-15dd-442c-b91b-323a6420c78e"))){ + lordiRender.render(event.entityPlayer, event.partialRenderTick, 0.3F, 1F); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java index 4c3ff7cda..f78511e11 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java +++ b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java @@ -38,6 +38,7 @@ public class WorldDecorationEvent{ this.genPlantNormally(InitBlocks.blockCanola, ConfigIntValues.CANOLA_AMOUNT.getValue(), ConfigBoolValues.DO_CANOLA_GEN.isEnabled(), Material.grass, event); this.genPlantNormally(InitBlocks.blockFlax, ConfigIntValues.FLAX_AMOUNT.getValue(), ConfigBoolValues.DO_FLAX_GEN.isEnabled(), Material.grass, event); + this.genPlantNormally(InitBlocks.blockCoffee, ConfigIntValues.COFFEE_AMOUNT.getValue(), ConfigBoolValues.DO_COFFEE_GEN.isEnabled(), Material.grass, event); } public void genPlantNormally(Block plant, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event){ diff --git a/src/main/java/ellpeck/actuallyadditions/gadget/RenderSpecial.java b/src/main/java/ellpeck/actuallyadditions/gadget/RenderSpecial.java index d2ca7e8ec..861358e1b 100644 --- a/src/main/java/ellpeck/actuallyadditions/gadget/RenderSpecial.java +++ b/src/main/java/ellpeck/actuallyadditions/gadget/RenderSpecial.java @@ -42,7 +42,7 @@ public class RenderSpecial{ GL11.glRotatef(180F, 1.0F, 0.0F, 1.0F); GL11.glScalef(size, size, size); - if(!(time-(bobHeight/2) < lastTimeForBobbing)){ + if(time-(bobHeight/2) >= lastTimeForBobbing){ GL11.glTranslated(0, ((double)time-this.lastTimeForBobbing)/100, 0); } else{ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java new file mode 100644 index 000000000..3fb6596b1 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java @@ -0,0 +1,138 @@ +package ellpeck.actuallyadditions.inventory; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +@InventoryContainer +public class ContainerCoffeeMachine extends Container{ + + private TileEntityCoffeeMachine machine; + + private int lastCoffeeAmount; + private int lastEnergyAmount; + private int lastBrewTime; + + public ContainerCoffeeMachine(InventoryPlayer inventory, TileEntityBase tile){ + this.machine = (TileEntityCoffeeMachine)tile; + + this.addSlotToContainer(new Slot(machine, TileEntityCoffeeMachine.SLOT_COFFEE_BEANS, 37, 6)); + this.addSlotToContainer(new Slot(machine, TileEntityCoffeeMachine.SLOT_INPUT, 80, 42)); + this.addSlotToContainer(new SlotOutput(machine, TileEntityCoffeeMachine.SLOT_OUTPUT, 80, 73)); + + for (int i = 0; i < 4; i++){ + for (int j = 0; j < 2; j++){ + this.addSlotToContainer(new Slot(machine, j+i*2+3, 125+j*18, 6+i*18){ + @Override + public int getSlotStackLimit(){ + return 1; + } + + }); + } + } + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.machine.storage.getEnergyStored()); + iCraft.sendProgressBarUpdate(this, 1, this.machine.coffeeCacheAmount); + iCraft.sendProgressBarUpdate(this, 2, this.machine.brewTime); + + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyAmount != this.machine.storage.getEnergyStored()) iCraft.sendProgressBarUpdate(this, 0, this.machine.storage.getEnergyStored()); + if(this.lastCoffeeAmount != this.machine.coffeeCacheAmount) iCraft.sendProgressBarUpdate(this, 1, this.machine.coffeeCacheAmount); + if(this.lastBrewTime != this.machine.brewTime) iCraft.sendProgressBarUpdate(this, 2, this.machine.brewTime); + } + + this.lastEnergyAmount = this.machine.storage.getEnergyStored(); + this.lastCoffeeAmount = this.machine.coffeeCacheAmount; + this.lastBrewTime = this.machine.brewTime; + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.machine.storage.setEnergyStored(par2); + if(par1 == 1) this.machine.coffeeCacheAmount = par2; + if(par1 == 2) this.machine.brewTime = par2; + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.machine.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 11; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() == InitItems.itemCoffeeBean){ + this.mergeItemStack(newStack, TileEntityCoffeeMachine.SLOT_COFFEE_BEANS, TileEntityCoffeeMachine.SLOT_COFFEE_BEANS+1, false); + } + if(currentStack.getItem() == InitItems.itemMisc && currentStack.getItemDamage() == TheMiscItems.CUP.ordinal()){ + this.mergeItemStack(newStack, TileEntityCoffeeMachine.SLOT_INPUT, TileEntityCoffeeMachine.SLOT_INPUT+1, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java index b11a6ebc0..8b20a09f0 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.inventory; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.gui.GuiInputter; import ellpeck.actuallyadditions.inventory.slot.SlotFilter; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityInputter; @@ -24,6 +25,8 @@ public class ContainerInputter extends Container{ private int lastSlotToPull; private int lastPlaceToPutSlotAmount; private int lastPlaceToPullSlotAmount; + private int lastIsPullWhitelist; + private int lastIsPutWhitelist; private boolean isAdvanced; @@ -35,22 +38,21 @@ public class ContainerInputter extends Container{ if(isAdvanced){ for(int i = 0; i < 2; i++){ - this.addSlotToContainer(new SlotFilter(this.tileInputter, 1+i*6, 20+i*84, 6)); - this.addSlotToContainer(new SlotFilter(this.tileInputter, 2+i*6, 38+i*84, 6)); - this.addSlotToContainer(new SlotFilter(this.tileInputter, 3+i*6, 56+i*84, 6)); - this.addSlotToContainer(new SlotFilter(this.tileInputter, 4+i*6, 20+i*84, 24)); - this.addSlotToContainer(new SlotFilter(this.tileInputter, 5+i*6, 38+i*84, 24)); - this.addSlotToContainer(new SlotFilter(this.tileInputter, 6+i*6, 56+i*84, 24)); + for(int x = 0; x < 3; x++){ + for(int y = 0;y < 4; y++){ + this.addSlotToContainer(new SlotFilter(this.tileInputter, 1+y+x*4+i*12, 20+i*84+x*18, 6+y*18)); + } + } } } for(int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ - this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18 + (isAdvanced ? 12 : 0))); + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18 + (isAdvanced ? 12+GuiInputter.OFFSET_ADVANCED : 0))); } } for(int i = 0; i < 9; i++){ - this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155 + (isAdvanced ? 12 : 0))); + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155 + (isAdvanced ? 12+GuiInputter.OFFSET_ADVANCED : 0))); } } @@ -63,6 +65,8 @@ public class ContainerInputter extends Container{ iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.slotToPull); iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.placeToPullSlotAmount); iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.placeToPutSlotAmount); + iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.isPullWhitelist ? 1 : 0); + iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.isPutWhitelist ? 1 : 0); } @Override @@ -76,13 +80,18 @@ public class ContainerInputter extends Container{ if(this.lastSlotToPull != this.tileInputter.slotToPull) iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.slotToPull); if(this.lastPlaceToPullSlotAmount != this.tileInputter.placeToPullSlotAmount) iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.placeToPullSlotAmount); if(this.lastPlaceToPutSlotAmount != this.tileInputter.placeToPutSlotAmount) iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.placeToPutSlotAmount); + if(this.lastIsPullWhitelist != (this.tileInputter.isPullWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.isPullWhitelist ? 1 : 0); + if(this.lastIsPutWhitelist != (this.tileInputter.isPutWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.isPutWhitelist ? 1 : 0); } + this.lastSideToPut = this.tileInputter.sideToPut; this.lastSlotToPut = this.tileInputter.slotToPut; this.lastSideToPull = this.tileInputter.sideToPull; this.lastSlotToPull = this.tileInputter.slotToPull; this.lastPlaceToPullSlotAmount = this.tileInputter.placeToPullSlotAmount; this.lastPlaceToPutSlotAmount = this.tileInputter.placeToPutSlotAmount; + this.lastIsPutWhitelist = this.tileInputter.isPutWhitelist ? 1 : 0; + this.lastIsPullWhitelist = this.tileInputter.isPullWhitelist ? 1 : 0; } @@ -95,6 +104,8 @@ public class ContainerInputter extends Container{ if(par1 == 3) this.tileInputter.slotToPull = par2; if(par1 == 4) this.tileInputter.placeToPullSlotAmount = par2; if(par1 == 5) this.tileInputter.placeToPutSlotAmount = par2; + if(par1 == 6) this.tileInputter.isPullWhitelist = par2 == 1; + if(par1 == 7) this.tileInputter.isPutWhitelist = par2 == 1; } @Override @@ -104,7 +115,7 @@ public class ContainerInputter extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = this.isAdvanced ? 13 : 1; + final int inventoryStart = this.isAdvanced ? 25 : 1; final int inventoryEnd = inventoryStart+26; final int hotbarStart = inventoryEnd+1; final int hotbarEnd = hotbarStart+8; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index a78570fcf..61ce9c16c 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -3,8 +3,8 @@ package ellpeck.actuallyadditions.inventory; import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.NetworkRegistry; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.gui.*; import ellpeck.actuallyadditions.tile.TileEntityBase; -import ellpeck.actuallyadditions.tile.TileEntityGrinder; import ellpeck.actuallyadditions.util.Util; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.world.World; @@ -13,57 +13,47 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ + TileEntityBase tile = null; + if(id != CRAFTER_ID){ + tile = (TileEntityBase)world.getTileEntity(x, y, z); + } switch(id){ case FEEDER_ID: - TileEntityBase tileFeeder = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerFeeder(entityPlayer.inventory, tileFeeder); + return new ContainerFeeder(entityPlayer.inventory, tile); case GIANT_CHEST_ID: - TileEntityBase tileChest = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerGiantChest(entityPlayer.inventory, tileChest); + return new ContainerGiantChest(entityPlayer.inventory, tile); case CRAFTER_ID: return new ContainerCrafter(entityPlayer); case GRINDER_ID: - TileEntityBase tileGrinder = (TileEntityGrinder)world.getTileEntity(x, y, z); - return new ContainerGrinder(entityPlayer.inventory, tileGrinder, false); + return new ContainerGrinder(entityPlayer.inventory, tile, false); case GRINDER_DOUBLE_ID: - TileEntityBase tileGrinderDouble = (TileEntityGrinder)world.getTileEntity(x, y, z); - return new ContainerGrinder(entityPlayer.inventory, tileGrinderDouble, true); + return new ContainerGrinder(entityPlayer.inventory, tile, true); case FURNACE_DOUBLE_ID: - TileEntityBase tileFurnace = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerFurnaceDouble(entityPlayer.inventory, tileFurnace); + return new ContainerFurnaceDouble(entityPlayer.inventory, tile); case INPUTTER_ID: - TileEntityBase tileInputter = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerInputter(entityPlayer.inventory, tileInputter, false); + return new ContainerInputter(entityPlayer.inventory, tile, false); case INPUTTER_ADVANCED_ID: - TileEntityBase tileInputterAdvanced = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerInputter(entityPlayer.inventory, tileInputterAdvanced, true); + return new ContainerInputter(entityPlayer.inventory, tile, true); case REPAIRER_ID: - TileEntityBase tileRepairer = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerRepairer(entityPlayer.inventory, tileRepairer); + return new ContainerRepairer(entityPlayer.inventory, tile); case BREAKER_ID: - TileEntityBase tileBreaker = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerBreaker(entityPlayer.inventory, tileBreaker); + return new ContainerBreaker(entityPlayer.inventory, tile); case DROPPER_ID: - TileEntityBase tileDropper = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerDropper(entityPlayer.inventory, tileDropper); + return new ContainerDropper(entityPlayer.inventory, tile); case CANOLA_PRESS_ID: - TileEntityBase tilePress = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerCanolaPress(entityPlayer.inventory, tilePress); + return new ContainerCanolaPress(entityPlayer.inventory, tile); case FERMENTING_BARREL_ID: - TileEntityBase tileBarrel = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerFermentingBarrel(entityPlayer.inventory, tileBarrel); + return new ContainerFermentingBarrel(entityPlayer.inventory, tile); case COAL_GENERATOR_ID: - TileEntityBase tileGenerator = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerCoalGenerator(entityPlayer.inventory, tileGenerator); + return new ContainerCoalGenerator(entityPlayer.inventory, tile); case OIL_GENERATOR_ID: - TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerOilGenerator(entityPlayer.inventory, tileOilGen); + return new ContainerOilGenerator(entityPlayer.inventory, tile); case PHANTOM_PLACER_ID: - TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerPhantomPlacer(entityPlayer.inventory, tilePlacer); + return new ContainerPhantomPlacer(entityPlayer.inventory, tile); case FLUID_COLLECTOR_ID: - TileEntityBase tileCollector = (TileEntityBase)world.getTileEntity(x, y, z); - return new ContainerFluidCollector(entityPlayer.inventory, tileCollector); + return new ContainerFluidCollector(entityPlayer.inventory, tile); + case COFFEE_MACHINE_ID: + return new ContainerCoffeeMachine(entityPlayer.inventory, tile); default: return null; } @@ -71,57 +61,47 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getClientGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ + TileEntityBase tile = null; + if(id != CRAFTER_ID){ + tile = (TileEntityBase)world.getTileEntity(x, y, z); + } switch(id){ case FEEDER_ID: - TileEntityBase tileFeeder = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiFeeder(entityPlayer.inventory, tileFeeder); + return new GuiFeeder(entityPlayer.inventory, tile); case GIANT_CHEST_ID: - TileEntityBase tileChest = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiGiantChest(entityPlayer.inventory, tileChest); + return new GuiGiantChest(entityPlayer.inventory, tile); case CRAFTER_ID: return new GuiCrafter(entityPlayer); case GRINDER_ID: - TileEntityBase tileGrinder = (TileEntityGrinder)world.getTileEntity(x, y, z); - return new GuiGrinder(entityPlayer.inventory, tileGrinder, false); + return new GuiGrinder(entityPlayer.inventory, tile, false); case GRINDER_DOUBLE_ID: - TileEntityBase tileGrinderDouble = (TileEntityGrinder)world.getTileEntity(x, y, z); - return new GuiGrinder(entityPlayer.inventory, tileGrinderDouble, true); + return new GuiGrinder(entityPlayer.inventory, tile, true); case FURNACE_DOUBLE_ID: - TileEntityBase tileFurnace = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiFurnaceDouble(entityPlayer.inventory, tileFurnace); + return new GuiFurnaceDouble(entityPlayer.inventory, tile); case INPUTTER_ID: - TileEntityBase tileInputter = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiInputter(entityPlayer.inventory, tileInputter, x, y, z, world, false); + return new GuiInputter(entityPlayer.inventory, tile, x, y, z, world, false); case INPUTTER_ADVANCED_ID: - TileEntityBase tileInputterAdvanced = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiInputter(entityPlayer.inventory, tileInputterAdvanced, x, y, z, world, true); + return new GuiInputter(entityPlayer.inventory, tile, x, y, z, world, true); case REPAIRER_ID: - TileEntityBase tileRepairer = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiRepairer(entityPlayer.inventory, tileRepairer); + return new GuiRepairer(entityPlayer.inventory, tile); case BREAKER_ID: - TileEntityBase tileBreaker = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiBreaker(entityPlayer.inventory, tileBreaker); + return new GuiBreaker(entityPlayer.inventory, tile); case DROPPER_ID: - TileEntityBase tileDropper = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiDropper(entityPlayer.inventory, tileDropper); + return new GuiDropper(entityPlayer.inventory, tile); case CANOLA_PRESS_ID: - TileEntityBase tilePress = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiCanolaPress(entityPlayer.inventory, tilePress); + return new GuiCanolaPress(entityPlayer.inventory, tile); case FERMENTING_BARREL_ID: - TileEntityBase tileBarrel = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiFermentingBarrel(entityPlayer.inventory, tileBarrel); + return new GuiFermentingBarrel(entityPlayer.inventory, tile); case COAL_GENERATOR_ID: - TileEntityBase tileGenerator = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiCoalGenerator(entityPlayer.inventory, tileGenerator); + return new GuiCoalGenerator(entityPlayer.inventory, tile); case OIL_GENERATOR_ID: - TileEntityBase tileOilGen = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiOilGenerator(entityPlayer.inventory, tileOilGen); + return new GuiOilGenerator(entityPlayer.inventory, tile); case PHANTOM_PLACER_ID: - TileEntityBase tilePlacer = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiPhantomPlacer(entityPlayer.inventory, tilePlacer); + return new GuiPhantomPlacer(entityPlayer.inventory, tile); case FLUID_COLLECTOR_ID: - TileEntityBase tileCollector = (TileEntityBase)world.getTileEntity(x, y, z); - return new GuiFluidCollector(entityPlayer.inventory, tileCollector); + return new GuiFluidCollector(entityPlayer.inventory, tile); + case COFFEE_MACHINE_ID: + return new GuiCoffeeMachine(entityPlayer.inventory, tile, x, y, z, world); default: return null; } @@ -144,6 +124,7 @@ public class GuiHandler implements IGuiHandler{ public static final int OIL_GENERATOR_ID = 14; public static final int PHANTOM_PLACER_ID = 15; public static final int FLUID_COLLECTOR_ID = 16; + public static final int COFFEE_MACHINE_ID = 17; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiBreaker.java similarity index 93% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiBreaker.java index 0fc2dfa5a..7f6fdad35 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiBreaker.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerBreaker; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityBreaker; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCanolaPress.java similarity index 96% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCanolaPress.java index 5134b91a5..bc5a498d3 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCanolaPress.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerCanolaPress; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityCanolaPress; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoalGenerator.java similarity index 95% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoalGenerator.java index 17ac5d93d..17e60df8b 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoalGenerator.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerCoalGenerator; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityCoalGenerator; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java new file mode 100644 index 000000000..be2fc918f --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java @@ -0,0 +1,109 @@ +package ellpeck.actuallyadditions.inventory.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerCoffeeMachine; +import ellpeck.actuallyadditions.network.PacketHandler; +import ellpeck.actuallyadditions.network.gui.PacketGuiButton; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; +import ellpeck.actuallyadditions.util.AssetUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiCoffeeMachine extends GuiContainer{ + + private TileEntityCoffeeMachine machine; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiCoffeeMachine"); + + private int x; + private int y; + private int z; + private World world; + + public GuiCoffeeMachine(InventoryPlayer inventory, TileEntityBase tile, int x, int y, int z, World world){ + super(new ContainerCoffeeMachine(inventory, tile)); + this.machine = (TileEntityCoffeeMachine)tile; + this.xSize = 176; + this.ySize = 93+86; + this.x = x; + this.y = y; + this.z = z; + this.world = world; + } + + @SuppressWarnings("unchecked") + @Override + public void initGui(){ + super.initGui(); + + GuiButton buttonOkay = new GuiButton(0, guiLeft+60, guiTop+11, 58, 20, "OK"); + this.buttonList.add(buttonOkay); + } + + @Override + public void actionPerformed(GuiButton button){ + PacketHandler.theNetwork.sendToServer(new PacketGuiButton(x, y, z, world, button.id, Minecraft.getMinecraft().thePlayer)); + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.machine.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.machine.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.machine.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+17, this.guiTop+89-i, 176, 0, 16, i); + } + + if(this.machine.coffeeCacheAmount > 0){ + int i = this.machine.getCoffeeScaled(30); + drawTexturedModalRect(this.guiLeft+41, this.guiTop+56-i, 192, 0, 8, i); + } + + if(this.machine.brewTime > 0){ + int i = this.machine.getBrewScaled(23); + drawTexturedModalRect(this.guiLeft+53, this.guiTop+42, 192, 30, i, 16); + + int j = this.machine.getBrewScaled(26); + drawTexturedModalRect(this.guiLeft+99+25-j, this.guiTop+44, 192+25-j, 46, j, 12); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + + String text1 = this.machine.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.machine.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+16 && y >= guiTop+5 && x <= guiLeft+33 && y <= guiTop+89){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + + String text2 = this.machine.coffeeCacheAmount + "/" + this.machine.coffeeCacheMaxAmount+" "+StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.coffee"); + if(x >= guiLeft+40 && y >= guiTop+25 && x <= guiLeft+49 && y <= guiTop+56){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCrafter.java similarity index 91% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCrafter.java index f8a21ba64..7df2aaf70 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiCrafter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCrafter.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerCrafter; import ellpeck.actuallyadditions.util.AssetUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.gui.inventory.GuiContainer; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDropper.java similarity index 93% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDropper.java index 1a79f8281..877fb0333 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDropper.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerDropper; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityDropper; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java similarity index 96% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java index 74537ae62..aee9220ef 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerFeeder; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityFeeder; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFermentingBarrel.java similarity index 96% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFermentingBarrel.java index 919fcb97d..90a0649e0 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFermentingBarrel.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerFermentingBarrel; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFluidCollector.java similarity index 95% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFluidCollector.java index d308d6dbc..e319b43ad 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFluidCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFluidCollector.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerFluidCollector; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFurnaceDouble.java similarity index 95% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFurnaceDouble.java index acb2fafee..96637d3f7 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFurnaceDouble.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerFurnaceDouble; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityFurnaceDouble; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGiantChest.java similarity index 92% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGiantChest.java index e030b9d03..d163f9f19 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGiantChest.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerGiantChest; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityGiantChest; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGrinder.java similarity index 96% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGrinder.java index 4bd6eb59c..bcbe38416 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiGrinder.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerGrinder; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityGrinder; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java similarity index 64% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java index 22b5c166c..ad2fb619d 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java @@ -1,13 +1,15 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerInputter; import ellpeck.actuallyadditions.network.PacketHandler; -import ellpeck.actuallyadditions.network.PacketInputterButton; +import ellpeck.actuallyadditions.network.gui.PacketGuiButton; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityInputter; import ellpeck.actuallyadditions.util.AssetUtil; import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; @@ -19,6 +21,8 @@ import net.minecraft.util.StatCollector; import net.minecraft.world.World; import org.lwjgl.opengl.GL11; +import java.util.Collections; + @SideOnly(Side.CLIENT) public class GuiInputter extends GuiContainer{ @@ -37,8 +41,13 @@ public class GuiInputter extends GuiContainer{ private SmallerButton buttonSlotPutM; private SmallerButton buttonSlotPullM; + private SmallerButton whitelistPut; + private SmallerButton whitelistPull; + private boolean isAdvanced; + public static final int OFFSET_ADVANCED = 35; + public static final String[] sideString = new String[]{ StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.disabled"), StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.up"), @@ -56,7 +65,7 @@ public class GuiInputter extends GuiContainer{ this.z = z; this.world = world; this.xSize = 176; - this.ySize = 93+86 + (isAdvanced ? 12 : 0); + this.ySize = 93+86 + (isAdvanced ? 12+OFFSET_ADVANCED : 0); this.isAdvanced = isAdvanced; } @@ -70,15 +79,18 @@ public class GuiInputter extends GuiContainer{ public void initGui(){ super.initGui(); - SmallerButton buttonSidePutP = new SmallerButton(0, guiLeft + 70, guiTop + 43 + (isAdvanced ? 12 : 0), ">"); - SmallerButton buttonSidePutM = new SmallerButton(1, guiLeft + 5, guiTop + 43 + (isAdvanced ? 12 : 0), "<"); - buttonSlotPutP = new SmallerButton(2, guiLeft + 70, guiTop + 64 + (isAdvanced ? 12 : 0), "+"); - buttonSlotPutM = new SmallerButton(3, guiLeft + 5, guiTop + 64 + (isAdvanced ? 12 : 0), "-"); + SmallerButton buttonSidePutP = new SmallerButton(0, guiLeft + 155, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), ">"); + SmallerButton buttonSidePutM = new SmallerButton(1, guiLeft + 90, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "<"); + buttonSlotPutP = new SmallerButton(2, guiLeft+ 155, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "+"); + buttonSlotPutM = new SmallerButton(3, guiLeft + 90, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "-"); - SmallerButton buttonSidePullP = new SmallerButton(4, guiLeft + 155, guiTop + 43 + (isAdvanced ? 12 : 0), ">"); - SmallerButton buttonSidePullM = new SmallerButton(5, guiLeft + 90, guiTop + 43 + (isAdvanced ? 12 : 0), "<"); - buttonSlotPullP = new SmallerButton(6, guiLeft+ 155, guiTop + 64 + (isAdvanced ? 12 : 0), "+"); - buttonSlotPullM = new SmallerButton(7, guiLeft + 90, guiTop + 64 + (isAdvanced ? 12 : 0), "-"); + SmallerButton buttonSidePullP = new SmallerButton(4, guiLeft + 70, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), ">"); + SmallerButton buttonSidePullM = new SmallerButton(5, guiLeft + 5, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "<"); + buttonSlotPullP = new SmallerButton(6, guiLeft + 70, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "+"); + buttonSlotPullM = new SmallerButton(7, guiLeft + 5, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "-"); + + whitelistPull = new SmallerButton(TileEntityInputter.WHITELIST_PULL_BUTTON_ID, guiLeft+3, guiTop+16, ""); + whitelistPut = new SmallerButton(TileEntityInputter.WHITELIST_PUT_BUTTON_ID, guiLeft+157, guiTop+16, ""); this.buttonList.add(buttonSidePutP); this.buttonList.add(buttonSlotPutP); @@ -88,6 +100,10 @@ public class GuiInputter extends GuiContainer{ this.buttonList.add(buttonSlotPutM); this.buttonList.add(buttonSidePullM); this.buttonList.add(buttonSlotPullM); + if(this.isAdvanced){ + this.buttonList.add(whitelistPut); + this.buttonList.add(whitelistPull); + } } @Override @@ -95,19 +111,19 @@ public class GuiInputter extends GuiContainer{ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); - this.drawTexturedModalRect(this.guiLeft, this.guiTop+93 + (isAdvanced ? 12 : 0), 0, 0, 176, 86); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 0, 0, 176, 86); this.mc.getTextureManager().bindTexture(this.isAdvanced ? resLocAdvanced : resLoc); - this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93 + (isAdvanced ? 12 : 0)); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93 + (isAdvanced ? 12+OFFSET_ADVANCED : 0)); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.put"), guiLeft + 22 + 3, guiTop + 32 + (isAdvanced ? 12 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.pull"), guiLeft + 107 + 3, guiTop + 32 + (isAdvanced ? 12 : 0), 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.pull"), guiLeft + 22 + 3, guiTop + 32 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.put"), guiLeft + 107 + 3, guiTop + 32 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 4210752); - this.fontRendererObj.drawString(sideString[tileInputter.sideToPut+1], guiLeft + 24 + 1, guiTop + 45 + 3 + (isAdvanced ? 12 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPut).toString(), guiLeft + 24 + 3, guiTop + 66 + 3 + (isAdvanced ? 12 : 0), 4210752); + this.fontRendererObj.drawString(sideString[tileInputter.sideToPull+1], guiLeft + 24 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPull).toString(), guiLeft + 24 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); - this.fontRendererObj.drawString(sideString[tileInputter.sideToPull+1], guiLeft + 109 + 1, guiTop + 45 + 3 + (isAdvanced ? 12 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPull == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPull).toString(), guiLeft + 109 + 3, guiTop + 66 + 3 + (isAdvanced ? 12 : 0), 4210752); + this.fontRendererObj.drawString(sideString[tileInputter.sideToPut+1], guiLeft + 109 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPut).toString(), guiLeft + 109 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); } @Override @@ -119,11 +135,25 @@ public class GuiInputter extends GuiContainer{ this.buttonSlotPutP.enabled = this.tileInputter.placeToPutSlotAmount > 0; this.buttonSlotPutM.enabled = this.tileInputter.placeToPutSlotAmount > 0; + + this.whitelistPull.displayString = this.tileInputter.isPullWhitelist ? "O" : "X"; + this.whitelistPut.displayString = this.tileInputter.isPutWhitelist ? "O" : "X"; + + if(this.isAdvanced){ + String text1 = this.tileInputter.isPullWhitelist ? StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.whitelist") : StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.blacklist"); + if(x >= guiLeft+3 && y >= guiTop+16 && x <= guiLeft+18 && y <= guiTop+31){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + String text2 = this.tileInputter.isPutWhitelist ? StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.whitelist") : StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.blacklist"); + if(x >= guiLeft+157 && y >= guiTop+16 && x <= guiLeft+172 && y <= guiTop+31){ + this.func_146283_a(Collections.singletonList(text2), x, y); + } + } } @Override public void actionPerformed(GuiButton button){ - PacketHandler.theNetwork.sendToServer(new PacketInputterButton(x, y, z, world, button.id)); + PacketHandler.theNetwork.sendToServer(new PacketGuiButton(x, y, z, world, button.id, Minecraft.getMinecraft().thePlayer)); } public class SmallerButton extends GuiButton{ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiOilGenerator.java similarity index 96% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiOilGenerator.java index 864722db6..7d0fe4bf2 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiOilGenerator.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerOilGenerator; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityOilGenerator; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiPhantomPlacer.java similarity index 93% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiPhantomPlacer.java index 9c0a99f9e..18d04955f 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiPhantomPlacer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiPhantomPlacer.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiRepairer.java similarity index 95% rename from src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java rename to src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiRepairer.java index 435af2cf9..2cbb5e84a 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiRepairer.java @@ -1,7 +1,8 @@ -package ellpeck.actuallyadditions.inventory; +package ellpeck.actuallyadditions.inventory.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerRepairer; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityItemRepairer; import ellpeck.actuallyadditions.util.AssetUtil; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotFilter.java b/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotFilter.java index ab1be1320..873ab776e 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotFilter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotFilter.java @@ -13,4 +13,5 @@ public class SlotFilter extends Slot{ public int getSlotStackLimit(){ return 1; } + } diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 4b2ea4ce5..d3f758f23 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -50,6 +50,7 @@ public class InitItems{ public static Item itemRiceSeed; public static Item itemCanolaSeed; public static Item itemFlaxSeed; + public static Item itemCoffeeSeed; public static Item itemResonantRice; public static Item itemBucketOil; @@ -57,6 +58,17 @@ public class InitItems{ public static Item itemPhantomConnector; + public static Item itemCoffeeBean; + public static Item itemCoffee; + + public static Item woodenPaxel; + public static Item stonePaxel; + public static Item ironPaxel; + public static Item diamondPaxel; + public static Item goldPaxel; + public static Item emeraldPaxel; + public static Item obsidianPaxel; + public static void init(){ Util.logInfo("Initializing Items..."); @@ -114,6 +126,9 @@ public class InitItems{ ItemUtil.register(itemHairyBall); HairyBallHandler.init(); + itemCoffeeBean = new ItemCoffeeBean(); + ItemUtil.register(itemCoffeeBean); + itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, new ItemStack(itemFoods, 1, TheFoods.RICE.ordinal())); ItemUtil.register(itemRiceSeed); FactoryRegistry.sendMessage("registerPlantable", itemRiceSeed); @@ -126,6 +141,10 @@ public class InitItems{ ItemUtil.register(itemFlaxSeed); FactoryRegistry.sendMessage("registerPlantable", itemFlaxSeed); + itemCoffeeSeed = new ItemSeed("itemCoffeeSeed", InitBlocks.blockCoffee, Blocks.grass, EnumPlantType.Plains, new ItemStack(itemCoffeeBean)); + ItemUtil.register(itemCoffeeSeed); + FactoryRegistry.sendMessage("registerPlantable", itemCoffeeSeed); + itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); itemShovelEmerald = new ItemShovelAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemShovelEmerald", EnumRarity.rare); @@ -140,5 +159,16 @@ public class InitItems{ itemHoeObsidian = new ItemHoeAA(InitItemMaterials.toolMaterialObsidian, new ItemStack(Blocks.obsidian), "itemHoeObsidian", EnumRarity.uncommon); ItemUtil.registerItems(new Item[]{itemPickaxeObsidian, itemAxeObsidian, itemShovelObsidian, itemSwordObsidian, itemHoeObsidian}); + woodenPaxel = new ItemAllToolAA(Item.ToolMaterial.WOOD, new ItemStack(Blocks.planks), "woodenPaxel", EnumRarity.uncommon); + stonePaxel = new ItemAllToolAA(Item.ToolMaterial.STONE, new ItemStack(Blocks.stone), "stonePaxel", EnumRarity.uncommon); + ironPaxel = new ItemAllToolAA(Item.ToolMaterial.IRON, new ItemStack(Items.iron_ingot), "ironPaxel", EnumRarity.rare); + goldPaxel = new ItemAllToolAA(Item.ToolMaterial.GOLD, new ItemStack(Items.gold_ingot), "goldPaxel", EnumRarity.rare); + diamondPaxel = new ItemAllToolAA(Item.ToolMaterial.EMERALD, new ItemStack(Items.diamond), "diamondPaxel", EnumRarity.epic); + emeraldPaxel = new ItemAllToolAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "emeraldPaxel", EnumRarity.epic); + obsidianPaxel = new ItemAllToolAA(InitItemMaterials.toolMaterialObsidian, new ItemStack(Blocks.obsidian), "obsidianPaxel", EnumRarity.epic); + ItemUtil.registerItems(new Item[]{woodenPaxel, stonePaxel, ironPaxel, goldPaxel, diamondPaxel, emeraldPaxel, obsidianPaxel}); + + itemCoffee = new ItemCoffee(); + ItemUtil.register(itemCoffee); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java new file mode 100644 index 000000000..b3c92331b --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -0,0 +1,253 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; +import net.minecraft.item.EnumAction; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.Potion; +import net.minecraft.potion.PotionEffect; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; + +public class ItemCoffee extends ItemFood implements INameableItem{ + + public static ArrayList ingredients = new ArrayList(); + + public void initIngredients(){ + this.registerIngredient(new Ingredient(new ItemStack(Items.milk_bucket), null){ + @Override + public void effect(ItemStack stack){ + PotionEffect[] effects = getEffectsFromStack(stack); + ArrayList effectsNew = new ArrayList(); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + if(effect.getAmplifier() > 0) effectsNew.add(new PotionEffect(effect.getPotionID(), effect.getDuration()+150, effect.getAmplifier()-1)); + } + stack.setTagCompound(new NBTTagCompound()); + if(effectsNew.size() > 0){ + this.effects = effectsNew.toArray(new PotionEffect[effectsNew.size()]); + ItemCoffee.addEffectToStack(stack, this); + } + } + } + @Override + public String getExtraText(){ + return StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.extra.milk"); + } + }); + this.registerIngredient(new Ingredient(new ItemStack(Items.sugar), new PotionEffect[]{new PotionEffect(Potion.moveSpeed.getId(), 30, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.magma_cream), new PotionEffect[]{new PotionEffect(Potion.fireResistance.getId(), 10, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.fish, 1, 3), new PotionEffect[]{new PotionEffect(Potion.waterBreathing.getId(), 15, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.golden_carrot), new PotionEffect[]{new PotionEffect(Potion.nightVision.getId(), 60, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.ghast_tear), new PotionEffect[]{new PotionEffect(Potion.regeneration.getId(), 10, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.blaze_powder), new PotionEffect[]{new PotionEffect(Potion.damageBoost.getId(), 15, 0)})); + this.registerIngredient(new Ingredient(new ItemStack(Items.fermented_spider_eye), new PotionEffect[]{new PotionEffect(Potion.invisibility.getId(), 25, 0)})); + } + + public ItemCoffee(){ + super(2, 2.0F, false); + this.setMaxDamage(ConfigIntValues.COFFEE_DRINK_AMOUNT.getValue()-1); + this.setAlwaysEdible(); + this.setMaxStackSize(1); + this.initIngredients(); + } + + public static Ingredient getIngredientFromStack(ItemStack stack){ + for(Ingredient ingredient : ingredients){ + if(ingredient.ingredient.isItemEqual(stack)) return ingredient; + } + return null; + } + + public static void addEffectProperties(ItemStack stack, PotionEffect effect, boolean addDur, boolean addAmp){ + PotionEffect[] effects = getEffectsFromStack(stack); + stack.setTagCompound(new NBTTagCompound()); + for(int i = 0; i < effects.length; i++){ + if(effects[i].getPotionID() == effect.getPotionID()){ + effects[i] = new PotionEffect(effects[i].getPotionID(), effects[i].getDuration()+(addDur ? effect.getDuration() : 0), effects[i].getAmplifier()+(addAmp ? (effect.getAmplifier() > 0 ? effect.getAmplifier() : 1) : 0)); + } + addEffectToStack(stack, effects[i]); + } + } + + public static void addEffectToStack(ItemStack stack, PotionEffect effect){ + NBTTagCompound tag = stack.getTagCompound(); + if(tag == null) tag = new NBTTagCompound(); + + int prevCounter = tag.getInteger("Counter"); + NBTTagCompound compound = new NBTTagCompound(); + compound.setInteger("ID", effect.getPotionID()); + compound.setInteger("Duration", effect.getDuration()); + compound.setInteger("Amplifier", effect.getAmplifier()); + + int counter = prevCounter+1; + tag.setTag(counter+"", compound); + tag.setInteger("Counter", counter); + + stack.setTagCompound(tag); + } + + public static void addEffectToStack(ItemStack stack, Ingredient ingredient){ + if(ingredient != null){ + PotionEffect[] effects = ingredient.getEffects(); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + if(hasEffect(stack, effect)) addEffectProperties(stack, effect, false, true); + else addEffectToStack(stack, effect); + } + } + } + } + + public static PotionEffect[] getEffectsFromStack(ItemStack stack){ + ArrayList effects = new ArrayList(); + NBTTagCompound tag = stack.getTagCompound(); + if(tag != null){ + int counter = tag.getInteger("Counter"); + while(counter > 0){ + NBTTagCompound compound = (NBTTagCompound)tag.getTag(counter + ""); + PotionEffect effect = new PotionEffect(compound.getInteger("ID"), compound.getInteger("Duration"), compound.getByte("Amplifier")); + if(effect.getPotionID() > 0){ + effects.add(effect); + } + counter--; + } + } + return effects.size() > 0 ? effects.toArray(new PotionEffect[effects.size()]) : null; + } + + public static boolean hasEffect(ItemStack stack, PotionEffect effect){ + PotionEffect[] effectsStack = getEffectsFromStack(stack); + if(effectsStack != null && effectsStack.length > 0){ + for(PotionEffect effectStack : effectsStack){ + if(effect.getPotionID() == effectStack.getPotionID()) return true; + } + } + return false; + } + + public static void applyPotionEffectsFromStack(ItemStack stack, EntityPlayer player){ + PotionEffect[] effects = getEffectsFromStack(stack); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + player.addPotionEffect(new PotionEffect(effect.getPotionID(), effect.getDuration()*20, effect.getAmplifier())); + } + } + } + + @Override + public boolean getShareTag(){ + return true; + } + + @Override + public EnumAction getItemUseAction(ItemStack stack){ + return EnumAction.drink; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + public int getMetadata(int damage){ + return damage; + } + + @Override + public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player){ + ItemStack theStack = stack.copy(); + super.onEaten(stack, world, player); + applyPotionEffectsFromStack(stack, player); + theStack.setItemDamage(theStack.getItemDamage()+1); + if(theStack.getMaxDamage()-theStack.getItemDamage() < 0) return new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()); + else return theStack; + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); + list.add(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2", this.getMaxDamage()+1)); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+this.func_150905_g(stack)); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+this.func_150906_h(stack)); + list.add(""); + + PotionEffect[] effects = getEffectsFromStack(stack); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + list.add(StatCollector.translateToLocal(effect.getEffectName())+" "+(effect.getAmplifier()+1)+ " (" + Potion.getDurationString(new PotionEffect(0, effect.getDuration()*20, 0)) + ")"); + } + } + else list.add("No Effects"); + } + else list.add(ItemUtil.shiftForInfo()); + } + + @Override + public IIcon getIconFromDamage(int par1){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "itemCoffee"; + } + + public void registerIngredient(Ingredient ingredient){ + ingredients.add(ingredient); + } + + public static class Ingredient{ + + public ItemStack ingredient; + protected PotionEffect[] effects; + + public Ingredient(ItemStack ingredient, PotionEffect[] effects){ + this.ingredient = ingredient.copy(); + this.effects = effects; + } + + public String getExtraText(){ + return null; + } + + public PotionEffect[] getEffects(){ + return this.effects; + } + + public void effect(ItemStack stack){ + ItemCoffee.addEffectToStack(stack, this); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java new file mode 100644 index 000000000..08a55cd57 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java @@ -0,0 +1,57 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemFood; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import java.util.List; + +public class ItemCoffeeBean extends ItemFood implements INameableItem{ + + public ItemCoffeeBean(){ + super(1, 1F, false); + this.setMaxDamage(0); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + ItemUtil.addInformation(this, list, 1, ""); + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return "itemCoffeeBeans"; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java index 97e9b7dfd..d81f4d634 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java @@ -41,7 +41,7 @@ public class ItemDust extends Item implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allDusts[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allDusts.length ? EnumRarity.common : allDusts[stack.getItemDamage()].rarity; } @SuppressWarnings("all") @@ -54,14 +54,14 @@ public class ItemDust extends Item implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allDusts[stack.getItemDamage()].name; + return this.getUnlocalizedName() + (stack.getItemDamage() >= allDusts.length ? " ERROR!" : allDusts[stack.getItemDamage()].getName()); } @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - ItemUtil.addInformation(this, list, 1, allDusts[stack.getItemDamage()].getName()); + if(stack.getItemDamage() < allDusts.length) ItemUtil.addInformation(this, list, 1, allDusts[stack.getItemDamage()].getName()); } @Override @@ -72,7 +72,7 @@ public class ItemDust extends Item implements INameableItem{ @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack stack, int pass){ - return allDusts[stack.getItemDamage()].color; + return stack.getItemDamage() >= allDusts.length ? 0 : allDusts[stack.getItemDamage()].color; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java index 0492eb531..5f1578bb6 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java @@ -37,27 +37,27 @@ public class ItemFoods extends ItemFood implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allFoods[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allFoods.length ? EnumRarity.common : allFoods[stack.getItemDamage()].rarity; } @Override public int func_150905_g(ItemStack stack){ - return allFoods[stack.getItemDamage()].healAmount; + return stack.getItemDamage() >= allFoods.length ? 0 : allFoods[stack.getItemDamage()].healAmount; } @Override public float func_150906_h(ItemStack stack){ - return allFoods[stack.getItemDamage()].saturation; + return stack.getItemDamage() >= allFoods.length ? 0 : allFoods[stack.getItemDamage()].saturation; } @Override public EnumAction getItemUseAction(ItemStack stack){ - return allFoods[stack.getItemDamage()].getsDrunken ? EnumAction.drink : EnumAction.eat; + return stack.getItemDamage() >= allFoods.length ? EnumAction.eat : (allFoods[stack.getItemDamage()].getsDrunken ? EnumAction.drink : EnumAction.eat); } @Override public int getMaxItemUseDuration(ItemStack stack){ - return allFoods[stack.getItemDamage()].useDuration; + return stack.getItemDamage() >= allFoods.length ? 0 : allFoods[stack.getItemDamage()].useDuration; } @Override @@ -75,14 +75,14 @@ public class ItemFoods extends ItemFood implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allFoods[stack.getItemDamage()].getName(); + return this.getUnlocalizedName() + (stack.getItemDamage() >= allFoods.length ? " ERROR!" : allFoods[stack.getItemDamage()].getName()); } @Override public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player){ ItemStack stackToReturn = super.onEaten(stack, world, player); - ItemStack returnItem = allFoods[stack.getItemDamage()].returnItem; - if (returnItem != null){ + ItemStack returnItem = stack.getItemDamage() >= allFoods.length ? null : allFoods[stack.getItemDamage()].returnItem; + if(returnItem != null){ if(!player.inventory.addItemStackToInventory(returnItem.copy())){ if(!world.isRemote){ EntityItem entityItem = new EntityItem(player.worldObj, player.posX, player.posY, player.posZ, returnItem.copy()); @@ -98,17 +98,19 @@ public class ItemFoods extends ItemFood implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + allFoods[stack.getItemDamage()].getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".hunger.desc") + ": " + allFoods[stack.getItemDamage()].healAmount); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".saturation.desc") + ": " + allFoods[stack.getItemDamage()].saturation); + if(stack.getItemDamage() < allFoods.length){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allFoods[stack.getItemDamage()].getName()+".desc")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allFoods[stack.getItemDamage()].healAmount); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allFoods[stack.getItemDamage()].saturation); + } + else list.add(ItemUtil.shiftForInfo()); } - else list.add(ItemUtil.shiftForInfo()); } @Override public IIcon getIconFromDamage(int par1){ - return textures[par1]; + return par1 >= textures.length ? null : textures[par1]; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java index 5ce347cd3..5a98848a4 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java @@ -41,17 +41,17 @@ public class ItemJams extends ItemFood implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allJams[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allJams.length ? EnumRarity.common : allJams[stack.getItemDamage()].rarity; } @Override public int func_150905_g(ItemStack stack){ - return allJams[stack.getItemDamage()].healAmount; + return stack.getItemDamage() >= allJams.length ? 0 : allJams[stack.getItemDamage()].healAmount; } @Override public float func_150906_h(ItemStack stack){ - return allJams[stack.getItemDamage()].saturation; + return stack.getItemDamage() >= allJams.length ? 0 : allJams[stack.getItemDamage()].saturation; } @Override @@ -69,20 +69,20 @@ public class ItemJams extends ItemFood implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allJams[stack.getItemDamage()].getName(); + return this.getUnlocalizedName() + (stack.getItemDamage() >= allJams.length ? " ERROR!" : allJams[stack.getItemDamage()].getName()); } @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack stack, int pass){ - return pass > 0 ? allJams[stack.getItemDamage()].color : super.getColorFromItemStack(stack, pass); + return pass > 0 ? (stack.getItemDamage() >= allJams.length ? 0 : allJams[stack.getItemDamage()].color) : super.getColorFromItemStack(stack, pass); } @Override public ItemStack onEaten(ItemStack stack, World world, EntityPlayer player){ ItemStack stackToReturn = super.onEaten(stack, world, player); - if(!world.isRemote){ + if(!world.isRemote && stack.getItemDamage() < allJams.length){ PotionEffect firstEffectToGet = new PotionEffect(allJams[stack.getItemDamage()].firstEffectToGet, 200); player.addPotionEffect(firstEffectToGet); @@ -103,14 +103,16 @@ public class ItemJams extends ItemFood implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc.1")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + allJams[stack.getItemDamage()].getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc.2")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".hunger.desc") + ": " + allJams[stack.getItemDamage()].healAmount); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".saturation.desc") + ": " + allJams[stack.getItemDamage()].saturation); + if(stack.getItemDamage() < allJams.length){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allJams[stack.getItemDamage()].getName()+".desc")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allJams[stack.getItemDamage()].healAmount); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allJams[stack.getItemDamage()].saturation); + } + else list.add(ItemUtil.shiftForInfo()); } - else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java index 2cf6110b6..fd77272e5 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java @@ -37,7 +37,7 @@ public class ItemMisc extends Item implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allMiscItems[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allMiscItems.length ? EnumRarity.common : allMiscItems[stack.getItemDamage()].rarity; } @Override @@ -55,19 +55,19 @@ public class ItemMisc extends Item implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allMiscItems[stack.getItemDamage()].name; + return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscItems.length ? " ERROR!" : allMiscItems[stack.getItemDamage()].getName()); } @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - ItemUtil.addInformation(this, list, 1, allMiscItems[stack.getItemDamage()].getName()); + if(stack.getItemDamage() < allMiscItems.length) ItemUtil.addInformation(this, list, 1, allMiscItems[stack.getItemDamage()].getName()); } @Override public IIcon getIconFromDamage(int par1){ - return textures[par1]; + return par1 >= textures.length ? null : textures[par1]; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index e69386905..04a3e66f9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -39,24 +39,22 @@ public class ItemPhantomConnector extends Item implements INameableItem{ if(tile != null){ //Passing to Face if(tile instanceof TileEntityPhantomface){ - if(this.checkHasConnection(stack, player)){ - ChunkCoordinates coords = this.getStoredPosition(stack); - TileEntity toStore = this.getStoredWorld(stack).getTileEntity(coords.posX, coords.posY, coords.posZ); - if(toStore != null && ((TileEntityPhantomface)tile).canConnectTo(toStore)){ - ((TileEntityPhantomface)tile).boundTile = toStore; - this.clearStorage(stack); - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); - return true; - } - else player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.notInventory.desc"))); + if(this.checkHasConnection(stack, player, tile)){ + ((TileEntityPhantomface)tile).boundPosition = this.getStoredPosition(stack); + ((TileEntityPhantomface)tile).boundWorld = this.getStoredWorld(stack); + TileEntityPhantomface.updateAround(tile); + this.clearStorage(stack); + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); + return true; } return false; } //Passing to Placer else if(tile instanceof TileEntityPhantomPlacer){ - if(this.checkHasConnection(stack, player)){ + if(this.checkHasConnection(stack, player, tile)){ ((TileEntityPhantomPlacer)tile).boundPosition = this.getStoredPosition(stack); ((TileEntityPhantomPlacer)tile).boundWorld = this.getStoredWorld(stack); + tile.markDirty(); this.clearStorage(stack); player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".phantom.connected.desc"))); return true; @@ -71,12 +69,20 @@ public class ItemPhantomConnector extends Item implements INameableItem{ return true; } - public boolean checkHasConnection(ItemStack stack, EntityPlayer player){ + public boolean checkHasConnection(ItemStack stack, EntityPlayer player, TileEntity tile){ if(this.getStoredPosition(stack) != null && this.getStoredWorld(stack) != null){ return true; } else{ - player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.noBound.desc"))); + if(tile instanceof TileEntityPhantomPlacer){ + ((TileEntityPhantomPlacer)tile).boundWorld = null; + ((TileEntityPhantomPlacer)tile).boundPosition = null; + } + if(tile instanceof TileEntityPhantomface){ + ((TileEntityPhantomface)tile).boundWorld = null; + ((TileEntityPhantomface)tile).boundPosition = null; + } + player.addChatComponentMessage(new ChatComponentText(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".phantom.unbound.desc"))); return false; } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java index 785608fd1..db3fe422c 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java @@ -3,7 +3,9 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.ThePotionRings; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.Entity; @@ -40,7 +42,7 @@ public class ItemPotionRing extends Item implements INameableItem{ public void onUpdate(ItemStack stack, World world, Entity player, int par4, boolean par5){ super.onUpdate(stack, world, player, par4, par5); - if(!world.isRemote){ + if(!world.isRemote && stack.getItemDamage() < allRings.length){ if(player instanceof EntityPlayer){ EntityPlayer thePlayer = (EntityPlayer)player; ItemStack equippedStack = ((EntityPlayer)player).getCurrentEquippedItem(); @@ -71,7 +73,7 @@ public class ItemPotionRing extends Item implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allRings[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allRings.length ? EnumRarity.common : allRings[stack.getItemDamage()].rarity; } @SuppressWarnings("all") @@ -84,20 +86,15 @@ public class ItemPotionRing extends Item implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allRings[stack.getItemDamage()].name; + return this.getUnlocalizedName() + (stack.getItemDamage() >= allRings.length ? " ERROR!" : allRings[stack.getItemDamage()].getName()); } @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - ItemUtil.addInformation(this, list, 2, ""); - - if(KeyUtil.isShiftPressed()){ - if(stack.getItemDamage() == ThePotionRings.SATURATION.ordinal()){ - list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemPotionRing.desc.off.1")); - list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemPotionRing.desc.off.2")); - } + if(stack.getItemDamage() < allRings.length){ + ItemUtil.addInformation(this, list, 2, ""); } } @@ -109,7 +106,7 @@ public class ItemPotionRing extends Item implements INameableItem{ @Override @SideOnly(Side.CLIENT) public int getColorFromItemStack(ItemStack stack, int pass){ - return allRings[stack.getItemDamage()].color; + return stack.getItemDamage() >= allRings.length ? 0 : allRings[stack.getItemDamage()].color; } @Override @@ -121,8 +118,10 @@ public class ItemPotionRing extends Item implements INameableItem{ @Override public String getItemStackDisplayName(ItemStack stack){ String standardName = StatCollector.translateToLocal(this.getUnlocalizedName() + ".name"); - String name = allRings[stack.getItemDamage()].getName(); - String effect = StatCollector.translateToLocal("effect." + ModUtil.MOD_ID_LOWER + "." + name.substring(0, 1).toLowerCase() + name.substring(1) + ".name"); - return standardName + " " + effect; + if(stack.getItemDamage() < allRings.length){ + String effect = StatCollector.translateToLocal(allRings[stack.getItemDamage()].getName()); + return standardName+" "+effect; + } + return standardName; } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java index 200273019..22a758de4 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java @@ -17,10 +17,11 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.List; -import java.util.Random; public class ItemSpecialDrop extends Item implements INameableItem{ + public static final int SOLID_XP_AMOUNT = 8; + public static final TheSpecialDrops[] allDrops = TheSpecialDrops.values(); public IIcon[] textures = new IIcon[allDrops.length]; @@ -32,8 +33,14 @@ public class ItemSpecialDrop extends Item implements INameableItem{ public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ if(!world.isRemote){ if(stack.getItemDamage() == TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()){ - world.spawnEntityInWorld(new EntityXPOrb(world, player.posX+0.5, player.posY+0.5, player.posZ+0.5, 5+new Random().nextInt(6))); - if(!player.capabilities.isCreativeMode) stack.stackSize--; + if(!player.isSneaking()){ + world.spawnEntityInWorld(new EntityXPOrb(world, player.posX+0.5, player.posY+0.5, player.posZ+0.5, SOLID_XP_AMOUNT)); + if(!player.capabilities.isCreativeMode) stack.stackSize--; + } + else{ + world.spawnEntityInWorld(new EntityXPOrb(world, player.posX+0.5, player.posY+0.5, player.posZ+0.5, SOLID_XP_AMOUNT*stack.stackSize)); + if(!player.capabilities.isCreativeMode) stack.stackSize = 0; + } } } return stack; @@ -46,7 +53,7 @@ public class ItemSpecialDrop extends Item implements INameableItem{ @Override public EnumRarity getRarity(ItemStack stack){ - return allDrops[stack.getItemDamage()].rarity; + return stack.getItemDamage() >= allDrops.length ? EnumRarity.common : allDrops[stack.getItemDamage()].rarity; } @Override @@ -69,19 +76,19 @@ public class ItemSpecialDrop extends Item implements INameableItem{ @Override public String getUnlocalizedName(ItemStack stack){ - return this.getUnlocalizedName() + allDrops[stack.getItemDamage()].name; + return this.getUnlocalizedName() + (stack.getItemDamage() >= allDrops.length ? " ERROR!" : allDrops[stack.getItemDamage()].getName()); } @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - ItemUtil.addInformation(this, list, 1, allDrops[stack.getItemDamage()].getName()); + if(stack.getItemDamage() < allDrops.length) ItemUtil.addInformation(this, list, stack.getItemDamage() == TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal() ? 2 : 1, allDrops[stack.getItemDamage()].getName()); } @Override public IIcon getIconFromDamage(int par1){ - return textures[par1]; + return par1 >= textures.length ? null : textures[par1]; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java index b678244ec..d1a819731 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/TheMiscItems.java @@ -18,7 +18,8 @@ public enum TheMiscItems implements INameableItem{ TINY_COAL("TinyCoal", EnumRarity.common, "itemTinyCoal"), TINY_CHAR("TinyCharcoal", EnumRarity.common, "itemTinyChar"), RICE_SLIME("RiceSlime", EnumRarity.uncommon, "slimeball"), - CANOLA("Canola", EnumRarity.uncommon, "itemCanola"); + CANOLA("Canola", EnumRarity.uncommon, "itemCanola"), + CUP("Cup", EnumRarity.uncommon, "itemCup"); public final String name; public final String oredictName; diff --git a/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java b/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java index a5904b898..e79f599b2 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java +++ b/src/main/java/ellpeck/actuallyadditions/items/metalists/ThePotionRings.java @@ -5,32 +5,32 @@ import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemStack; +import net.minecraft.potion.Potion; public enum ThePotionRings implements INameableItem{ - SPEED("Speed", 8171462, 1, 0, 1, 10, false, EnumRarity.uncommon, new ItemStack(Items.sugar)), - //TODO Slowness - HASTE("Haste", 14270531, 3, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.repeater)), - //TODO Mining Fatigue - STRENGTH("Strength", 9643043, 5, 0, 1, 10, false, EnumRarity.rare, new ItemStack(Items.blaze_powder)), + SPEED(Potion.moveSpeed.getName(), 8171462, Potion.moveSpeed.getId(), 0, 1, 10, false, EnumRarity.uncommon, new ItemStack(Items.sugar)), + //Slowness + HASTE(Potion.digSpeed.getName(), 14270531, Potion.digSpeed.getId(), 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.repeater)), + //Mining Fatigue + STRENGTH(Potion.damageBoost.getName(), 9643043, Potion.damageBoost.getId(), 0, 1, 10, false, EnumRarity.rare, new ItemStack(Items.blaze_powder)), //Health (Not Happening) - //TODO Damage - JUMP_BOOST("JumpBoost", 7889559, 8, 0, 1, 10, false, EnumRarity.rare, new ItemStack(Blocks.piston)), - //TODO Nausea - REGEN("Regen", 13458603, 10, 0, 1, 50, true, EnumRarity.rare, new ItemStack(Items.ghast_tear)), - RESISTANCE("Resistance", 10044730, 11, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.slime_ball)), - FIRE_RESISTANCE("FireResistance", 14981690, 12, 0, 0, 10, false, EnumRarity.uncommon, new ItemStack(Items.magma_cream)), - WATER_BREATHING("WaterBreathing", 3035801, 13, 0, 0, 10, false, EnumRarity.rare, new ItemStack(Items.fish, 1, 3)), - INVISIBILITY("Invisibility", 8356754, 14, 0, 0, 10, false, EnumRarity.epic, new ItemStack(Items.fermented_spider_eye)), - //TODO Blindness - NIGHT_VISION("NightVision", 2039713, 16, 0, 0, 300, false, EnumRarity.rare, new ItemStack(Items.golden_carrot)), - //TODO Hunger - //TODO Weakness - //TODO Poison - //TODO Withering + //Damage + JUMP_BOOST(Potion.jump.getName(), 7889559, Potion.jump.getId(), 0, 1, 10, false, EnumRarity.rare, new ItemStack(Blocks.piston)), + //Nausea + REGEN(Potion.regeneration.getName(), 13458603, Potion.regeneration.getId(), 0, 1, 50, true, EnumRarity.rare, new ItemStack(Items.ghast_tear)), + RESISTANCE(Potion.resistance.getName(), 10044730, Potion.resistance.getId(), 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.slime_ball)), + FIRE_RESISTANCE(Potion.fireResistance.getName(), 14981690, Potion.fireResistance.getId(), 0, 0, 10, false, EnumRarity.uncommon, new ItemStack(Items.magma_cream)), + WATER_BREATHING(Potion.waterBreathing.getName(), 3035801, Potion.waterBreathing.getId(), 0, 0, 10, false, EnumRarity.rare, new ItemStack(Items.fish, 1, 3)), + INVISIBILITY(Potion.invisibility.getName(), 8356754, Potion.invisibility.getId(), 0, 0, 10, false, EnumRarity.epic, new ItemStack(Items.fermented_spider_eye)), + //Blindness + NIGHT_VISION(Potion.nightVision.getName(), 2039713, Potion.nightVision.getId(), 0, 0, 300, false, EnumRarity.rare, new ItemStack(Items.golden_carrot)); + //Hunger + //Weakness + //Poison + //Withering //Health Boost (Not Happening) //Absorption (Not Happening) - SATURATION("Saturation", 16262179, 23, 0, 1, 10, false, EnumRarity.epic, new ItemStack(Items.cooked_beef)); public final String name; public final int color; diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java new file mode 100644 index 000000000..e6cb47d7e --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java @@ -0,0 +1,133 @@ +package ellpeck.actuallyadditions.items.tools; +import com.google.common.collect.Sets; +import cpw.mods.fml.common.eventhandler.Event; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemStack; +import net.minecraft.item.ItemTool; +import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.player.UseHoeEvent; + +import java.util.List; +import java.util.Set; + +@SuppressWarnings("unchecked") +public class ItemAllToolAA extends ItemTool implements INameableItem{ + + private static final Set axeSet = Sets.newHashSet(Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin); + private static final Set pickSet = Sets.newHashSet(Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail); + private static final Set shovelSet = Sets.newHashSet(Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium); + + private static final Set allSet = Sets.newHashSet(); + static{ + allSet.addAll(axeSet); + allSet.addAll(pickSet); + allSet.addAll(shovelSet); + } + + private String name; + private EnumRarity rarity; + private ItemStack repairItem; + private String oredictName; + + public ItemAllToolAA(ToolMaterial toolMat, ItemStack repairItem, String unlocalizedName, EnumRarity rarity){ + super(5.0F, toolMat, allSet); + + this.repairItem = repairItem; + this.name = unlocalizedName; + this.oredictName = unlocalizedName; + this.rarity = rarity; + + this.setMaxDamage(this.getMaxDamage()*4); + } + + @Override + public float func_150893_a(ItemStack stack, Block block){ + return block.getMaterial() != Material.iron && block.getMaterial() != Material.anvil && block.getMaterial() != Material.rock && block.getMaterial() != Material.wood && block.getMaterial() != Material.plants && block.getMaterial() != Material.vine ? super.func_150893_a(stack, block) : this.efficiencyOnProperMaterial; + } + + @Override + public boolean func_150897_b(Block block){ + return block == Blocks.snow_layer || block == Blocks.snow || (block == Blocks.obsidian ? this.toolMaterial.getHarvestLevel() == 3 : (block != Blocks.diamond_block && block != Blocks.diamond_ore ? (block != Blocks.emerald_ore && block != Blocks.emerald_block ? (block != Blocks.gold_block && block != Blocks.gold_ore ? (block != Blocks.iron_block && block != Blocks.iron_ore ? (block != Blocks.lapis_block && block != Blocks.lapis_ore ? (block != Blocks.redstone_ore && block != Blocks.lit_redstone_ore ? (block.getMaterial() == Material.rock || (block.getMaterial() == Material.iron || block.getMaterial() == Material.anvil)) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 1) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2) : this.toolMaterial.getHarvestLevel() >= 2)); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".paxel.desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ){ + if (!player.canPlayerEdit(x, y, z, side, stack)) return false; + else{ + UseHoeEvent event = new UseHoeEvent(player, stack, world, x, y, z); + if(MinecraftForge.EVENT_BUS.post(event)) return false; + if(event.getResult() == Event.Result.ALLOW){ + stack.damageItem(1, player); + return true; + } + Block block = world.getBlock(x, y, z); + if(side != 0 && world.getBlock(x, y + 1, z).isAir(world, x, y + 1, z) && (block == Blocks.grass || block == Blocks.dirt)){ + Block block1 = Blocks.farmland; + world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume() + 1.0F) / 2.0F, block1.stepSound.getPitch() * 0.8F); + if (world.isRemote) return true; + else{ + world.setBlock(x, y, z, block1); + stack.damageItem(1, player); + return true; + } + } + else return false; + } + } + + @Override + public boolean getIsRepairable(ItemStack itemToRepair, ItemStack stack){ + return stack.getItem() == repairItem.getItem(); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return this.rarity; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return name; + } + + @Override + public String getOredictName(){ + return oredictName; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java new file mode 100644 index 000000000..7f21916a1 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java @@ -0,0 +1,152 @@ +package ellpeck.actuallyadditions.nei; + +import codechicken.lib.gui.GuiDraw; +import codechicken.nei.NEIServerUtils; +import codechicken.nei.PositionedStack; +import codechicken.nei.recipe.RecipeInfo; +import codechicken.nei.recipe.TemplateRecipeHandler; +import ellpeck.actuallyadditions.inventory.gui.GuiCoffeeMachine; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.ItemCoffee; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; +import org.lwjgl.opengl.GL11; + +import java.awt.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ + + public static final String NAME = "actuallyadditions.coffee"; + + public CoffeeMachineRecipeHandler(){ + super(); + RecipeInfo.setGuiOffset(this.getGuiClass(), 32, 3); + } + + public class CachedCoffee extends CachedRecipe{ + + public PositionedStack cup; + public PositionedStack coffeeBeans; + public PositionedStack result; + public PositionedStack ingredientStack; + public String extraText; + + public CachedCoffee(ItemCoffee.Ingredient ingredient){ + this.cup = new PositionedStack(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), 45, 39); + this.coffeeBeans = new PositionedStack(new ItemStack(InitItems.itemCoffeeBean), 2, 39); + this.ingredientStack = new PositionedStack(ingredient.ingredient, 90, 21); + this.setupResult(ingredient); + this.extraText = ingredient.getExtraText(); + } + + public void setupResult(ItemCoffee.Ingredient ingredient){ + ItemStack result = new ItemStack(InitItems.itemCoffee); + ItemCoffee.addEffectToStack(result, ingredient); + this.result = new PositionedStack(result.copy(), 45, 70); + } + + @Override + public List getIngredients(){ + ArrayList list = new ArrayList(); + list.add(this.ingredientStack); + list.add(this.cup); + list.add(this.coffeeBeans); + return list; + } + + @Override + public PositionedStack getResult(){ + return result; + } + } + + @Override + public int recipiesPerPage(){ + return 1; + } + + @Override + public void loadTransferRects(){ + transferRects.add(new RecipeTransferRect(new Rectangle(21, 39, 22, 16), NAME)); + transferRects.add(new RecipeTransferRect(new Rectangle(67, 42, 22, 10), NAME)); + } + + @Override + public Class getGuiClass(){ + return GuiCoffeeMachine.class; + } + + @Override + public String getRecipeName(){ + return StatCollector.translateToLocal("container.nei." + NAME + ".name"); + } + + @Override + public void loadCraftingRecipes(String outputId, Object... results){ + if(outputId.equals(NAME) && getClass() == CoffeeMachineRecipeHandler.class){ + ArrayList ingredients = ItemCoffee.ingredients; + for(ItemCoffee.Ingredient ingredient : ingredients){ + arecipes.add(new CachedCoffee(ingredient)); + } + } + else super.loadCraftingRecipes(outputId, results); + } + + @Override + public void loadCraftingRecipes(ItemStack result){ + ArrayList ingredients = ItemCoffee.ingredients; + for(ItemCoffee.Ingredient ingredient : ingredients){ + if(result.getItem() instanceof ItemCoffee) arecipes.add(new CachedCoffee(ingredient)); + } + } + + @Override + public void loadUsageRecipes(ItemStack ingredient){ + + ArrayList ingredients = ItemCoffee.ingredients; + for(ItemCoffee.Ingredient ingr : ingredients){ + if(NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemCoffeeBean), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(ingr.ingredient, ingredient)){ + CachedCoffee theRecipe = new CachedCoffee(ingr); + theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.ingredientStack), ingredient); + arecipes.add(theRecipe); + } + } + } + + @Override + public String getGuiTexture(){ + return ModUtil.MOD_ID_LOWER + ":textures/gui/guiNEICoffeeMachine.png"; + } + + @Override + public void drawBackground(int recipeIndex){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GuiDraw.changeTexture(getGuiTexture()); + GuiDraw.drawTexturedModalRect(0, 0, 0, 0, 126, 88); + } + + @Override + public void drawExtras(int recipe){ + drawProgressBar(21, 39, 126, 0, 21, 16, 48, 0); + drawProgressBar(63, 42, 125, 16, 24, 12, 48, 2); + + CachedCoffee cache = (CachedCoffee)this.arecipes.get(recipe); + if(cache.extraText != null){ + GuiDraw.drawString(StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.special"), 2, 6, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + GuiDraw.drawString(cache.extraText, 2, 18, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + } + GuiDraw.drawString("[SHIFT]!", 1, 75, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + } + + @Override + public String getOverlayIdentifier(){ + return NAME; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java index 4111dbba9..4bb42739a 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CompostRecipeHandler.java @@ -19,7 +19,7 @@ import java.util.Collections; public class CompostRecipeHandler extends TemplateRecipeHandler{ - public static final String NAME = "compost"; + public static final String NAME = "actuallyadditions.compost"; public CompostRecipeHandler(){ super(); @@ -60,7 +60,7 @@ public class CompostRecipeHandler extends TemplateRecipeHandler{ @Override public String getRecipeName(){ - return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); + return StatCollector.translateToLocal("container.nei." + NAME + ".name"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java index bbb50f5c9..9680388bd 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java @@ -5,7 +5,7 @@ import codechicken.nei.NEIServerUtils; import codechicken.nei.PositionedStack; import codechicken.nei.recipe.RecipeInfo; import codechicken.nei.recipe.TemplateRecipeHandler; -import ellpeck.actuallyadditions.inventory.GuiGrinder; +import ellpeck.actuallyadditions.inventory.gui.GuiGrinder; import ellpeck.actuallyadditions.recipe.GrinderRecipes; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.StringUtil; @@ -21,7 +21,7 @@ import java.util.List; public class CrusherRecipeHandler extends TemplateRecipeHandler{ - public static final String NAME = "crushing"; + public static final String NAME = "actuallyadditions.crushing"; public CrusherRecipeHandler(){ super(); @@ -78,7 +78,7 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public String getRecipeName(){ - return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); + return StatCollector.translateToLocal("container.nei." + NAME + ".name"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java index 950afc0ef..1456c5a67 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/HairyBallRecipeHandler.java @@ -19,7 +19,7 @@ import java.util.Collections; public class HairyBallRecipeHandler extends TemplateRecipeHandler{ - public static final String NAME = "ballOfHair"; + public static final String NAME = "actuallyadditions.ballOfHair"; public HairyBallRecipeHandler(){ super(); @@ -61,7 +61,7 @@ public class HairyBallRecipeHandler extends TemplateRecipeHandler{ @Override public String getRecipeName(){ - return StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".nei." + NAME + ".name"); + return StatCollector.translateToLocal("container.nei." + NAME + ".name"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java index 6a8ecaa91..a6ccb00a6 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java @@ -4,7 +4,7 @@ import codechicken.nei.api.API; import codechicken.nei.api.IConfigureNEI; import codechicken.nei.recipe.DefaultOverlayHandler; import ellpeck.actuallyadditions.blocks.InitBlocks; -import ellpeck.actuallyadditions.inventory.GuiCrafter; +import ellpeck.actuallyadditions.inventory.gui.GuiCrafter; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.item.ItemStack; @@ -30,9 +30,14 @@ public class NEIActuallyAdditionsConfig implements IConfigureNEI{ API.registerRecipeHandler(compostRecipeHandler); API.registerUsageHandler(compostRecipeHandler); + CoffeeMachineRecipeHandler coffeeMachineRecipeHandler = new CoffeeMachineRecipeHandler(); + API.registerRecipeHandler(coffeeMachineRecipeHandler); + API.registerUsageHandler(coffeeMachineRecipeHandler); + API.hideItem(new ItemStack(InitBlocks.blockRice)); API.hideItem(new ItemStack(InitBlocks.blockCanola)); API.hideItem(new ItemStack(InitBlocks.blockFlax)); + API.hideItem(new ItemStack(InitBlocks.blockCoffee)); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java index 0884085e9..23daabe01 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.network; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; +import ellpeck.actuallyadditions.network.gui.PacketGuiButton; import ellpeck.actuallyadditions.util.ModUtil; public class PacketHandler{ @@ -13,7 +14,7 @@ public class PacketHandler{ theNetwork = NetworkRegistry.INSTANCE.newSimpleChannel(ModUtil.MOD_ID_LOWER); theNetwork.registerMessage(PacketTileEntityFeeder.Handler.class, PacketTileEntityFeeder.class, 0, Side.CLIENT); - theNetwork.registerMessage(PacketInputterButton.Handler.class, PacketInputterButton.class, 1, Side.SERVER); + theNetwork.registerMessage(PacketGuiButton.Handler.class, PacketGuiButton.class, 1, Side.SERVER); theNetwork.registerMessage(PacketFluidCollectorToClient.Handler.class, PacketFluidCollectorToClient.class, 2, Side.CLIENT); } } diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java b/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java index 5f172baca..94fc10258 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java @@ -6,7 +6,7 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.inventory.GuiFeeder; +import ellpeck.actuallyadditions.inventory.gui.GuiFeeder; import ellpeck.actuallyadditions.tile.TileEntityFeeder; import io.netty.buffer.ByteBuf; import net.minecraft.client.Minecraft; diff --git a/src/main/java/ellpeck/actuallyadditions/network/gui/IButtonReactor.java b/src/main/java/ellpeck/actuallyadditions/network/gui/IButtonReactor.java new file mode 100644 index 000000000..6f67de9d6 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/network/gui/IButtonReactor.java @@ -0,0 +1,8 @@ +package ellpeck.actuallyadditions.network.gui; + +import net.minecraft.entity.player.EntityPlayer; + +public interface IButtonReactor{ + + void onButtonPressed(int buttonID, EntityPlayer player); +} diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketInputterButton.java b/src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiButton.java similarity index 66% rename from src/main/java/ellpeck/actuallyadditions/network/PacketInputterButton.java rename to src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiButton.java index 231201764..ace4444c7 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketInputterButton.java +++ b/src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiButton.java @@ -1,33 +1,35 @@ -package ellpeck.actuallyadditions.network; +package ellpeck.actuallyadditions.network.gui; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import ellpeck.actuallyadditions.tile.TileEntityInputter; import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; -public class PacketInputterButton implements IMessage{ +public class PacketGuiButton implements IMessage{ private int tileX; private int tileY; private int tileZ; private int worldID; private int buttonID; + private int playerID; @SuppressWarnings("unused") - public PacketInputterButton(){ + public PacketGuiButton(){ } - public PacketInputterButton(int x, int y, int z, World world, int buttonID){ + public PacketGuiButton(int x, int y, int z, World world, int buttonID, EntityPlayer player){ this.tileX = x; this.tileY = y; this.tileZ = z; this.worldID = world.provider.dimensionId; this.buttonID = buttonID; + this.playerID = player.getEntityId(); } @Override @@ -37,6 +39,7 @@ public class PacketInputterButton implements IMessage{ this.tileZ = buf.readInt(); this.worldID = buf.readInt(); this.buttonID = buf.readInt(); + this.playerID = buf.readInt(); } @Override @@ -46,18 +49,19 @@ public class PacketInputterButton implements IMessage{ buf.writeInt(this.tileZ); buf.writeInt(this.worldID); buf.writeInt(this.buttonID); + buf.writeInt(this.playerID); } - public static class Handler implements IMessageHandler{ + public static class Handler implements IMessageHandler{ @Override - public IMessage onMessage(PacketInputterButton message, MessageContext ctx){ + public IMessage onMessage(PacketGuiButton message, MessageContext ctx){ World world = DimensionManager.getWorld(message.worldID); TileEntity tile = world.getTileEntity(message.tileX, message.tileY, message.tileZ); - if(tile instanceof TileEntityInputter){ - TileEntityInputter inputter = (TileEntityInputter)tile; - inputter.onButtonPressed(message.buttonID); + if(tile instanceof IButtonReactor){ + IButtonReactor reactor = (IButtonReactor)tile; + reactor.onButtonPressed(message.buttonID, (EntityPlayer)world.getEntityByID(message.playerID)); } return null; diff --git a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java index d304b006c..8c3ccc31d 100644 --- a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java +++ b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java @@ -8,9 +8,7 @@ import ellpeck.actuallyadditions.blocks.render.*; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.event.RenderPlayerEventAA; -import ellpeck.actuallyadditions.tile.TileEntityCompost; -import ellpeck.actuallyadditions.tile.TileEntityFishingNet; -import ellpeck.actuallyadditions.tile.TileEntityFurnaceSolar; +import ellpeck.actuallyadditions.tile.*; import ellpeck.actuallyadditions.update.UpdateChecker; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; @@ -43,6 +41,12 @@ public class ClientProxy implements IProxy{ ClientRegistry.bindTileEntitySpecialRenderer(TileEntityFurnaceSolar.class, new RenderTileEntity(new ModelFurnaceSolar())); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.blockFurnaceSolar), new RenderItems(new ModelFurnaceSolar())); + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCoffeeMachine.class, new RenderTileEntity(new ModelCoffeeMachine())); + MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.blockCoffeeMachine), new RenderItems(new ModelCoffeeMachine())); + + ClientRegistry.bindTileEntitySpecialRenderer(TileEntityPhantomBooster.class, new RenderTileEntity(new ModelPhantomBooster())); + MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.blockPhantomBooster), new RenderItems(new ModelPhantomBooster())); + VillagerRegistry.instance().registerVillagerSkin(ConfigIntValues.JAM_VILLAGER_ID.getValue(), new ResourceLocation(ModUtil.MOD_ID_LOWER, "textures/entity/villager/jamVillager.png")); Util.registerEvent(new RenderPlayerEventAA()); diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java b/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java index 8fe8d7311..9b10c7853 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/FuelHandler.java @@ -19,6 +19,12 @@ public class FuelHandler implements IFuelHandler{ private static HashMap, Integer> fuelList = new HashMap, Integer>(); + public static void setFuelValues(){ + addFuel(InitItems.itemMisc, TheMiscItems.TINY_CHAR.ordinal(), 200); + addFuel(InitItems.itemMisc, TheMiscItems.TINY_COAL.ordinal(), 200); + addFuel(InitBlocks.blockMisc, TheMiscBlocks.CHARCOAL_BLOCK.ordinal(), 16000); + } + public static void init(){ Util.logInfo("Initializing Fuelstuffs..."); @@ -31,28 +37,14 @@ public class FuelHandler implements IFuelHandler{ return getFuelValue(fuel); } - public static void setFuelValues(){ - addFuel(InitItems.itemMisc, TheMiscItems.TINY_CHAR.ordinal(), 200); - addFuel(InitItems.itemMisc, TheMiscItems.TINY_COAL.ordinal(), 200); - addFuel(InitBlocks.blockMisc, TheMiscBlocks.CHARCOAL_BLOCK.ordinal(), 16000); - } - private static void addFuel(Item item, int metadata, int value){ fuelList.put(Pair.of(item, metadata), value); } - private static void addFuel(Item item, int value){ - addFuel(item, 0, value); - } - private static void addFuel(Block block, int metadata, int value){ addFuel(Item.getItemFromBlock(block), metadata, value); } - private static void addFuel(Block block, int value){ - addFuel(Item.getItemFromBlock(block), 0, value); - } - private static int getFuelValue(ItemStack stack){ if(stack != null && stack.getItem() != null){ Pair pair = Pair.of(stack.getItem(), stack.getItemDamage()); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index 3fa3d43dc..b65949634 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -39,6 +39,7 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityFluidCollector.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidCollector"); GameRegistry.registerTileEntity(TileEntityFluidCollector.TileEntityFluidPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidPlacer"); GameRegistry.registerTileEntity(TileEntityLavaFactoryController.class, ModUtil.MOD_ID_LOWER + ":tileEntityLavaFactoryController"); + GameRegistry.registerTileEntity(TileEntityCoffeeMachine.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoffeeMachine"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index 2c6e8e5ef..8f0d2c28a 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -39,15 +39,6 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - - //TODO Remove after some Updating - if(this.isPlacer && this.getClass() != TileEntityPlacer.class){ - ItemStack[] theSlots = this.slots.clone(); - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityPlacer()); - ((TileEntityPlacer)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); - } - if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ if(this.currentTime > 0){ this.currentTime--; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index 757fb4e5b..195384333 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -17,7 +17,7 @@ import net.minecraftforge.fluids.*; public class TileEntityCanolaPress extends TileEntityInventoryBase implements IEnergyReceiver, IFluidHandler{ - public EnergyStorage storage = new EnergyStorage(40000, energyUsedPerTick+50); + public EnergyStorage storage = new EnergyStorage(40000); public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java index 18ba7ffb8..03f242f1e 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java @@ -13,7 +13,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityCoalGenerator extends TileEntityInventoryBase implements IEnergyProvider{ - public EnergyStorage storage = new EnergyStorage(60000, energyProducedPerTick+50); + public EnergyStorage storage = new EnergyStorage(60000); public static int energyProducedPerTick = ConfigIntValues.COAL_GEN_ENERGY_PRODUCED.getValue(); @@ -34,10 +34,11 @@ public class TileEntityCoalGenerator extends TileEntityInventoryBase implements this.storage.receiveEnergy(energyProducedPerTick, false); } - if(energyProducedPerTick*100 <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ - if(this.currentBurnTime <= 0 && this.slots[0] != null && TileEntityFurnace.getItemBurnTime(this.slots[0]) > 0){ - this.maxBurnTime = TileEntityFurnace.getItemBurnTime(this.slots[0]); - this.currentBurnTime = this.maxBurnTime; + if(this.currentBurnTime <= 0 && this.slots[0] != null && TileEntityFurnace.getItemBurnTime(this.slots[0]) > 0){ + int burnTime = TileEntityFurnace.getItemBurnTime(this.slots[0]); + if(energyProducedPerTick*burnTime <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + this.maxBurnTime = burnTime; + this.currentBurnTime = burnTime; this.slots[0].stackSize--; if(this.slots[0].stackSize == 0) this.slots[0] = this.slots[0].getItem().getContainerItem(this.slots[0]); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java new file mode 100644 index 000000000..10cd318e3 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java @@ -0,0 +1,169 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyReceiver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.ItemCoffee; +import ellpeck.actuallyadditions.items.metalists.TheMiscItems; +import ellpeck.actuallyadditions.network.gui.IButtonReactor; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements IButtonReactor, IEnergyReceiver{ + + public static final int SLOT_COFFEE_BEANS = 0; + public static final int SLOT_INPUT = 1; + public static final int SLOT_OUTPUT = 2; + + public EnergyStorage storage = new EnergyStorage(300000); + + public static int energyUsePerTick = ConfigIntValues.COFFEE_MACHINE_ENERGY_USED.getValue(); + + public final int coffeeCacheMaxAmount = 300; + public final int coffeeCacheAddPerItem = ConfigIntValues.COFFEE_CACHE_ADDED_PER_ITEM.getValue(); + public final int coffeeCacheUsePerItem = ConfigIntValues.COFFEE_CACHE_USED_PER_ITEM.getValue(); + public int coffeeCacheAmount; + + public final int maxBrewTime = ConfigIntValues.COFFEE_MACHINE_TIME_USED.getValue(); + public int brewTime; + + public TileEntityCoffeeMachine(){ + super(11, "coffeeMachine"); + } + + @Override + public void updateEntity(){ + if(!worldObj.isRemote){ + this.storeCoffee(); + + if(this.brewTime > 0 || worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ + this.brew(); + } + } + } + + public void storeCoffee(){ + if(this.slots[SLOT_COFFEE_BEANS] != null && this.slots[SLOT_COFFEE_BEANS].getItem() == InitItems.itemCoffeeBean){ + if(this.coffeeCacheAddPerItem <= this.coffeeCacheMaxAmount-this.coffeeCacheAmount){ + this.slots[SLOT_COFFEE_BEANS].stackSize--; + if(this.slots[SLOT_COFFEE_BEANS].stackSize <= 0) this.slots[SLOT_COFFEE_BEANS] = null; + this.coffeeCacheAmount += this.coffeeCacheAddPerItem; + } + } + } + + public void brew(){ + if(!worldObj.isRemote){ + if(this.slots[SLOT_INPUT] != null && this.slots[SLOT_INPUT].getItem() == InitItems.itemMisc && this.slots[SLOT_INPUT].getItemDamage() == TheMiscItems.CUP.ordinal() && this.slots[SLOT_OUTPUT] == null && this.storage.getEnergyStored() >= energyUsePerTick && this.coffeeCacheAmount >= this.coffeeCacheUsePerItem){ + this.brewTime++; + if(this.brewTime >= this.maxBrewTime){ + this.brewTime = 0; + ItemStack output = new ItemStack(InitItems.itemCoffee); + while(getFirstAvailIngredient() > 0){ + int ingr = this.getFirstAvailIngredient(); + ItemCoffee.Ingredient ingredient = ItemCoffee.getIngredientFromStack(this.slots[ingr]); + if(ingredient != null){ + ingredient.effect(output); + } + this.slots[ingr].stackSize--; + if(this.slots[ingr].stackSize <= 0) this.slots[ingr] = this.slots[ingr].getItem().getContainerItem(this.slots[ingr]); + } + this.slots[SLOT_OUTPUT] = output.copy(); + this.slots[SLOT_INPUT].stackSize--; + if(this.slots[SLOT_INPUT].stackSize <= 0) this.slots[SLOT_INPUT] = null; + this.coffeeCacheAmount -= this.coffeeCacheUsePerItem; + } + } + else this.brewTime = 0; + + if(this.brewTime > 0) this.storage.extractEnergy(energyUsePerTick, false); + } + } + + public int getFirstAvailIngredient(){ + for(int i = 3; i < this.slots.length; i++){ + if(this.slots[i] != null && this.slots[i].stackSize == 1 && ItemCoffee.getIngredientFromStack((this.slots[i])) != null){ + return i; + } + } + return 0; + } + + @SideOnly(Side.CLIENT) + public int getCoffeeScaled(int i){ + return this.coffeeCacheAmount * i / this.coffeeCacheMaxAmount; + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @SideOnly(Side.CLIENT) + public int getBrewScaled(int i){ + return this.brewTime * i / this.maxBrewTime; + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + super.writeToNBT(compound); + this.storage.writeToNBT(compound); + compound.setInteger("Cache", this.coffeeCacheAmount); + compound.setInteger("Time", this.brewTime); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + super.readFromNBT(compound); + this.storage.readFromNBT(compound); + this.coffeeCacheAmount = compound.getInteger("Cache"); + this.brewTime = compound.getInteger("Time"); + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return (i >= 3 && ItemCoffee.getIngredientFromStack(stack) != null && (this.slots[i] == null || this.slots[i].stackSize < 1)) || (i == SLOT_COFFEE_BEANS && stack.getItem() == InitItems.itemCoffeeBean) || (i == SLOT_INPUT && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CUP.ordinal()); + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == SLOT_OUTPUT || (slot >= 3 && ItemCoffee.getIngredientFromStack(stack) == null); + } + + @Override + public void onButtonPressed(int buttonID, EntityPlayer player){ + if(buttonID == 0 && this.brewTime <= 0){ + this.brew(); + } + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java index 18d3315ce..3198d74c1 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFermentingBarrel.java @@ -101,7 +101,7 @@ public class TileEntityFermentingBarrel extends TileEntityInventoryBase implemen @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i == 0 && FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME))) || (i == 2 && stack.getItem() == Items.bucket); + return (i == 0 && FluidContainerRegistry.containsFluid(stack, new FluidStack(InitBlocks.fluidCanolaOil, FluidContainerRegistry.BUCKET_VOLUME))) || (i == 2 && stack.getItem() == Items.bucket); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java index 79550c999..9e51d1ce4 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFluidCollector.java @@ -49,12 +49,12 @@ public class TileEntityFluidCollector extends TileEntityInventoryBase implements @Override public boolean canFill(ForgeDirection from, Fluid fluid){ - return this.isPlacer && from != ForgeDirection.DOWN; + return this.isPlacer; } @Override public boolean canDrain(ForgeDirection from, Fluid fluid){ - return !this.isPlacer && from != ForgeDirection.UP; + return !this.isPlacer; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java index 05bd9747c..1c30689b2 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java @@ -17,7 +17,7 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements public static final int SLOT_INPUT_2 = 2; public static final int SLOT_OUTPUT_2 = 3; - public EnergyStorage storage = new EnergyStorage(30000, energyUsePerTick+30); + public EnergyStorage storage = new EnergyStorage(30000); public static int energyUsePerTick = ConfigIntValues.FURNACE_ENERGY_USED.getValue(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java index 236cd7dc7..14292535c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceSolar.java @@ -29,7 +29,7 @@ public class TileEntityFurnaceSolar extends TileEntityBase implements IEnergyPro return from != ForgeDirection.UP; } - public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + public EnergyStorage storage = new EnergyStorage(30000); public static int energyProducedPerTick = ConfigIntValues.FURNACE_SOLAR_ENERGY_PRODUCED.getValue(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index a62170ef3..19d4fcf0c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -14,7 +14,7 @@ import java.util.Random; public class TileEntityGrinder extends TileEntityInventoryBase implements IEnergyReceiver{ - public EnergyStorage storage = new EnergyStorage(60000, energyUsePerTick+20); + public EnergyStorage storage = new EnergyStorage(60000); @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ @@ -78,15 +78,6 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - - //TODO Remove after some Updating - if(this.isDouble && this.getClass() != TileEntityGrinderDouble.class){ - ItemStack[] theSlots = this.slots.clone(); - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityGrinderDouble()); - ((TileEntityGrinderDouble)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); - } - boolean canCrushOnFirst = this.canCrushOn(SLOT_INPUT_1, SLOT_OUTPUT_1_1, SLOT_OUTPUT_1_2); boolean canCrushOnSecond = false; if(this.isDouble) canCrushOnSecond = this.canCrushOn(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java index de73f6523..c383a7837 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityHeatCollector.java @@ -17,7 +17,7 @@ public class TileEntityHeatCollector extends TileEntityBase implements IEnergyPr private int randomChance = ConfigIntValues.HEAT_COLLECTOR_LAVA_CHANCE.getValue(); private int blocksNeeded = ConfigIntValues.HEAT_COLLECTOR_BLOCKS.getValue(); - public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + public EnergyStorage storage = new EnergyStorage(30000); public static int energyProducedPerTick = ConfigIntValues.HEAT_COLLECTOR_ENERGY_PRODUCED.getValue(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java index 7cb0f5ff6..7f8e91165 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java @@ -1,25 +1,30 @@ package ellpeck.actuallyadditions.tile; +import ellpeck.actuallyadditions.network.gui.IButtonReactor; import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityInputter extends TileEntityInventoryBase{ +public class TileEntityInputter extends TileEntityInventoryBase implements IButtonReactor{ public static class TileEntityInputterAdvanced extends TileEntityInputter{ public TileEntityInputterAdvanced(){ - super(13, "inputterAdvanced"); + super(25, "inputterAdvanced"); this.isAdvanced = true; } } - public static final int PUT_FILTER_START = 1; - public static final int PULL_FILTER_START = 7; + public static final int PUT_FILTER_START = 13; + public static final int PULL_FILTER_START = 1; + + public static final int WHITELIST_PULL_BUTTON_ID = 87; + public static final int WHITELIST_PUT_BUTTON_ID = 88; public int sideToPut = -1; public int slotToPut = -1; @@ -33,6 +38,9 @@ public class TileEntityInputter extends TileEntityInventoryBase{ public boolean isAdvanced; + public boolean isPullWhitelist = true; + public boolean isPutWhitelist = true; + public TileEntityInputter(int slots, String name){ super(slots, name); } @@ -45,15 +53,6 @@ public class TileEntityInputter extends TileEntityInventoryBase{ @Override public void updateEntity(){ if(!worldObj.isRemote){ - - //TODO Remove after some Updating - if(this.isAdvanced && this.getClass() != TileEntityInputterAdvanced.class){ - ItemStack[] theSlots = this.slots.clone(); - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityInputterAdvanced()); - ((TileEntityInputterAdvanced)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); - } - this.initVars(); if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ @@ -80,7 +79,7 @@ public class TileEntityInputter extends TileEntityInventoryBase{ if(tempStack.getMaxStackSize() < this.getInventoryStackLimit()) maxSize = tempStack.getMaxStackSize(); else maxSize = this.getInventoryStackLimit(); } - if(tempStack != null && (this.slots[0] == null || (tempStack.isItemEqual(this.slots[0]) && this.slots[0].stackSize < maxSize)) && this.checkFilters(tempStack, true)){ + if(tempStack != null && (this.slots[0] == null || (tempStack.isItemEqual(this.slots[0]) && this.slots[0].stackSize < maxSize)) && this.checkFilters(tempStack, true, isPullWhitelist)){ if(theSided != null){ for(int j = 0; j < 5; j++){ if(theSided.canExtractItem(i, tempStack, j)){ @@ -138,7 +137,7 @@ public class TileEntityInputter extends TileEntityInventoryBase{ if(tempStack.getMaxStackSize() < theInventory.getInventoryStackLimit()) maxSize = tempStack.getMaxStackSize(); else maxSize = theInventory.getInventoryStackLimit(); } - if((tempStack == null || (theInventory.isItemValidForSlot(i, this.slots[0]) && tempStack.isItemEqual(this.slots[0]) && tempStack.stackSize < maxSize)) && this.checkFilters(this.slots[0], false)){ + if((tempStack == null || (theInventory.isItemValidForSlot(i, this.slots[0]) && tempStack.isItemEqual(this.slots[0]) && tempStack.stackSize < maxSize)) && this.checkFilters(this.slots[0], false, isPutWhitelist)){ if(theSided != null){ for(int j = 0; j < 5; j++){ if(theSided.canInsertItem(i, this.slots[0], j)){ @@ -182,16 +181,16 @@ public class TileEntityInputter extends TileEntityInventoryBase{ } } - public boolean checkFilters(ItemStack stack, boolean isPull){ + public boolean checkFilters(ItemStack stack, boolean isPull, boolean isWhitelist){ if(!this.isAdvanced) return true; int slotStart = isPull ? PULL_FILTER_START : PUT_FILTER_START; - int slotStop = slotStart+6; + int slotStop = slotStart+12; for(int i = slotStart; i < slotStop; i++){ - if(this.slots[i] != null && this.slots[i].isItemEqual(stack)) return true; + if(this.slots[i] != null && this.slots[i].isItemEqual(stack)) return isWhitelist; } - return false; + return !isWhitelist; } public void initVars(){ @@ -216,7 +215,17 @@ public class TileEntityInputter extends TileEntityInventoryBase{ } } - public void onButtonPressed(int buttonID){ + @Override + public void onButtonPressed(int buttonID, EntityPlayer player){ + if(buttonID == WHITELIST_PULL_BUTTON_ID){ + this.isPullWhitelist = !this.isPullWhitelist; + return; + } + if(buttonID == WHITELIST_PUT_BUTTON_ID){ + this.isPutWhitelist = !this.isPutWhitelist; + return; + } + if(buttonID == 0) this.sideToPut++; if(buttonID == 1) this.sideToPut--; if(buttonID == 2) this.slotToPut++; @@ -244,6 +253,8 @@ public class TileEntityInputter extends TileEntityInventoryBase{ compound.setInteger("SlotToPut", this.slotToPut); compound.setInteger("SideToPull", this.sideToPull); compound.setInteger("SlotToPull", this.slotToPull); + compound.setBoolean("PullWhitelist", this.isPullWhitelist); + compound.setBoolean("PutWhitelist", this.isPutWhitelist); } @Override @@ -252,6 +263,8 @@ public class TileEntityInputter extends TileEntityInventoryBase{ this.slotToPut = compound.getInteger("SlotToPut"); this.sideToPull = compound.getInteger("SideToPull"); this.slotToPull = compound.getInteger("SlotToPull"); + this.isPullWhitelist = compound.getBoolean("PullWhitelist"); + this.isPutWhitelist = compound.getBoolean("PutWhitelist"); super.readFromNBT(compound); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java index b51bee937..05dddf589 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityItemRepairer.java @@ -14,7 +14,7 @@ public class TileEntityItemRepairer extends TileEntityInventoryBase implements I public static final int SLOT_INPUT = 0; public static final int SLOT_OUTPUT = 1; - public EnergyStorage storage = new EnergyStorage(300000, energyUsePerTick+100); + public EnergyStorage storage = new EnergyStorage(300000); private final int speedSlowdown = ConfigIntValues.REPAIRER_SPEED_SLOWDOWN.getValue(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java index 22bdcab53..339fab3b8 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java @@ -13,7 +13,7 @@ import net.minecraftforge.common.util.ForgeDirection; public class TileEntityLavaFactoryController extends TileEntityBase implements IEnergyReceiver{ - public EnergyStorage storage = new EnergyStorage(3000000, energyNeededToProduceLava*2); + public EnergyStorage storage = new EnergyStorage(3000000); public static int energyNeededToProduceLava = ConfigIntValues.LAVA_FACTORY_ENERGY_USED.getValue(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index e69445a7a..a8218c9d3 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -15,7 +15,7 @@ import net.minecraftforge.fluids.*; public class TileEntityOilGenerator extends TileEntityInventoryBase implements IEnergyProvider, IFluidHandler{ - public EnergyStorage storage = new EnergyStorage(30000, energyProducedPerTick+50); + public EnergyStorage storage = new EnergyStorage(30000); public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); @@ -40,7 +40,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I this.storage.receiveEnergy(energyProducedPerTick, false); } - if(energyProducedPerTick*this.maxBurnTime/2 <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ + if(energyProducedPerTick*this.maxBurnTime <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN)){ if(this.currentBurnTime <= 0 && this.tank.getFluidAmount() >= this.fuelUsedPerBurnup){ this.currentBurnTime = this.maxBurnTime; this.tank.drain(this.fuelUsedPerBurnup, true); @@ -102,7 +102,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return FluidContainerRegistry.containsFluid(this.slots[0], new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME)) && i == 0; + return FluidContainerRegistry.containsFluid(stack, new FluidStack(InitBlocks.fluidOil, FluidContainerRegistry.BUCKET_VOLUME)) && i == 0; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java new file mode 100644 index 000000000..536335006 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomBooster.java @@ -0,0 +1,5 @@ +package ellpeck.actuallyadditions.tile; + +public class TileEntityPhantomBooster extends TileEntityBase{ + +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java index f5ebc4f3b..3f826e385 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java @@ -29,7 +29,8 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ public int currentTime; public final int timeNeeded = ConfigIntValues.PHANTOM_PLACER_TIME.getValue(); - public final int range = ConfigIntValues.PHANTOM_PLACER_RANGE.getValue(); + public final int defaultRange = ConfigIntValues.PHANTOM_PLACER_RANGE.getValue(); + public int range; public boolean isBreaker; @@ -45,6 +46,7 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ @Override public void updateEntity(){ if(!worldObj.isRemote){ + this.range = TileEntityPhantomface.upgradeRange(defaultRange, worldObj, xCoord, yCoord, zCoord); if(!this.hasBoundPosition()){ this.boundPosition = null; @@ -134,6 +136,7 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ if(x != 0 && y != 0 && z != 0){ this.boundPosition = new ChunkCoordinates(x, y, z); this.boundWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); + this.markDirty(); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index aea8715ae..e9c031d52 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -4,14 +4,17 @@ import cofh.api.energy.IEnergyHandler; import cofh.api.energy.IEnergyProvider; import cofh.api.energy.IEnergyReceiver; import ellpeck.actuallyadditions.blocks.BlockPhantomface; +import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.ISidedInventory; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.ChunkCoordinates; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.util.ForgeDirection; @@ -22,25 +25,43 @@ import net.minecraftforge.fluids.IFluidHandler; public class TileEntityPhantomface extends TileEntityInventoryBase{ - public TileEntity boundTile; + public ChunkCoordinates boundPosition; + public World boundWorld; public int type; - public final int range = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); + public final int defaultRange = ConfigIntValues.PHANTOMFACE_RANGE.getValue(); + public int range; public TileEntityPhantomface(String name){ super(0, name); } - public boolean canConnectTo(TileEntity tile){ - return false; + public static int upgradeRange(int defaultRange, World world, int x, int y, int z){ + int newRange = defaultRange; + for(int i = 0; i < 3; i++){ + Block block = world.getBlock(x, y+1+i, z); + if(block == InitBlocks.blockPhantomBooster) newRange = newRange*2; + else break; + } + return newRange; + } + + public static void updateAround(TileEntity tile){ + tile.getWorldObj().markBlockForUpdate(tile.xCoord+1, tile.yCoord, tile.zCoord); + tile.getWorldObj().markBlockForUpdate(tile.xCoord-1, tile.yCoord, tile.zCoord); + tile.getWorldObj().markBlockForUpdate(tile.xCoord, tile.yCoord+1, tile.zCoord); + tile.getWorldObj().markBlockForUpdate(tile.xCoord, tile.yCoord-1, tile.zCoord); + tile.getWorldObj().markBlockForUpdate(tile.xCoord, tile.yCoord, tile.zCoord+1); + tile.getWorldObj().markBlockForUpdate(tile.xCoord, tile.yCoord, tile.zCoord-1); + tile.markDirty(); } public boolean isBoundTileInRage(){ if(this.hasBoundTile()){ - int xDif = this.boundTile.xCoord-this.xCoord; - int yDif = this.boundTile.yCoord-this.yCoord; - int zDif = this.boundTile.zCoord-this.zCoord; + int xDif = this.boundPosition.posX-this.xCoord; + int yDif = this.boundPosition.posY-this.yCoord; + int zDif = this.boundPosition.posZ-this.zCoord; if(xDif >= -this.range && xDif <= this.range){ if(yDif >= -this.range && yDif <= this.range){ @@ -54,34 +75,23 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ @Override public void updateEntity(){ if(!worldObj.isRemote){ + this.range = upgradeRange(defaultRange, worldObj, xCoord, yCoord, zCoord); - //TODO Remove after some Updating - if(this.type == BlockPhantomface.FACE && this.getClass() != TileEntityPhantomItemface.class){ - ItemStack[] theSlots = this.slots.clone(); - worldObj.removeTileEntity(xCoord, yCoord, zCoord); - worldObj.setTileEntity(xCoord, yCoord, zCoord, new TileEntityPhantomItemface()); - ((TileEntityPhantomItemface)worldObj.getTileEntity(xCoord, yCoord, zCoord)).slots = theSlots.clone(); - } - - if(!this.hasBoundTile()) this.boundTile = null; - - if(this.tempX > 0 || this.tempY > 0 || this.tempZ > 0){ - this.boundTile = tempWorld.getTileEntity(tempX, tempY, tempZ); - this.tempX = 0; - this.tempY = 0; - this.tempZ = 0; - this.tempWorld = null; + if(!this.hasBoundTile()){ + this.boundPosition = null; + this.boundWorld = null; } } } public boolean hasBoundTile(){ - if(this.boundTile != null){ - if(this.xCoord == this.boundTile.xCoord && this.yCoord == this.boundTile.yCoord && this.zCoord == this.boundTile.zCoord && this.worldObj == this.boundTile.getWorldObj()){ - this.boundTile = null; + if(this.boundPosition != null && this.boundWorld != null){ + if(this.boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ) instanceof TileEntityPhantomface || (this.xCoord == this.boundPosition.posX && this.yCoord == this.boundPosition.posY && this.zCoord == this.boundPosition.posZ && this.worldObj == this.boundWorld)){ + this.boundPosition = null; + this.boundWorld = null; return false; } - return boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord) == boundTile && boundTile.getWorldObj() == this.worldObj; + return this.boundWorld == this.worldObj; } return false; } @@ -90,25 +100,24 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); if(this.hasBoundTile()){ - compound.setInteger("XCoordOfTileStored", boundTile.xCoord); - compound.setInteger("YCoordOfTileStored", boundTile.yCoord); - compound.setInteger("ZCoordOfTileStored", boundTile.zCoord); - compound.setInteger("WorldOfTileStored", boundTile.getWorldObj().provider.dimensionId); + compound.setInteger("XCoordOfTileStored", boundPosition.posX); + compound.setInteger("YCoordOfTileStored", boundPosition.posY); + compound.setInteger("ZCoordOfTileStored", boundPosition.posZ); + compound.setInteger("WorldOfTileStored", boundWorld.provider.dimensionId); } } - public int tempX; - public int tempY; - public int tempZ; - public World tempWorld; - @Override public void readFromNBT(NBTTagCompound compound){ super.readFromNBT(compound); - this.tempX = compound.getInteger("XCoordOfTileStored"); - this.tempY = compound.getInteger("YCoordOfTileStored"); - this.tempZ = compound.getInteger("ZCoordOfTileStored"); - this.tempWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); + int x = compound.getInteger("XCoordOfTileStored"); + int y = compound.getInteger("YCoordOfTileStored"); + int z = compound.getInteger("ZCoordOfTileStored"); + if(x != 0 && y != 0 && z != 0){ + this.boundPosition = new ChunkCoordinates(x, y, z); + this.boundWorld = DimensionManager.getWorld(compound.getInteger("WorldOfTileStored")); + this.markDirty(); + } } @Override @@ -133,7 +142,7 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ super.updateEntity(); if(!worldObj.isRemote){ - if(this.isBoundTileInRage() && this.getHandler() != null){ + if(worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord) && this.isBoundTileInRage() && this.getHandler() != null){ this.pushFluid(ForgeDirection.UP); this.pushFluid(ForgeDirection.DOWN); this.pushFluid(ForgeDirection.NORTH); @@ -165,23 +174,18 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } @Override - public boolean canConnectTo(TileEntity tile){ - return tile instanceof IFluidHandler; + public boolean isBoundTileInRage(){ + return super.isBoundTileInRage() && this.boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ) instanceof IFluidHandler; } public IFluidHandler getHandler(){ - TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); - if(tile != null && tile instanceof IFluidHandler){ - return (IFluidHandler)tile; + if(this.boundPosition != null && this.boundWorld != null){ + TileEntity tile = boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + if(tile instanceof IFluidHandler) return (IFluidHandler)tile; } return null; } - @Override - public boolean hasBoundTile(){ - return super.hasBoundTile() && this.boundTile instanceof IFluidHandler; - } - @Override public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ if(this.isBoundTileInRage()) return this.getHandler().fill(from, resource, doFill); @@ -224,6 +228,11 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ this.type = BlockPhantomface.ENERGYFACE; } + @Override + public boolean isBoundTileInRage(){ + return super.isBoundTileInRage() && (this.boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ) instanceof IEnergyReceiver || this.boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ) instanceof IEnergyProvider); + } + @Override public void updateEntity(){ super.updateEntity(); @@ -252,32 +261,22 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ } } - @Override - public boolean canConnectTo(TileEntity tile){ - return tile instanceof IEnergyProvider || tile instanceof IEnergyReceiver; - } - public IEnergyProvider getProvider(){ - TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); - if(tile != null && tile instanceof IEnergyProvider){ - return (IEnergyProvider)tile; + if(this.boundPosition != null && this.boundWorld != null){ + TileEntity tile = boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + if(tile instanceof IEnergyProvider) return (IEnergyProvider)tile; } return null; } public IEnergyReceiver getReceiver(){ - TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); - if(tile != null && tile instanceof IEnergyReceiver){ - return (IEnergyReceiver)tile; + if(this.boundPosition != null && this.boundWorld != null){ + TileEntity tile = boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + if(tile instanceof IEnergyReceiver) return (IEnergyReceiver)tile; } return null; } - @Override - public boolean hasBoundTile(){ - return super.hasBoundTile() && (this.boundTile instanceof IEnergyReceiver || this.boundTile instanceof IEnergyProvider); - } - @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ return this.isBoundTileInRage() && this.getReceiver() != null ? this.getReceiver().receiveEnergy(from, maxReceive, simulate) : 0; @@ -323,24 +322,19 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ this.type = BlockPhantomface.FACE; } - @Override - public boolean canConnectTo(TileEntity tile){ - return tile instanceof IInventory; - } - - @Override - public boolean hasBoundTile(){ - return super.hasBoundTile() && this.boundTile instanceof IInventory; - } - public IInventory getInventory(){ - TileEntity tile = boundTile.getWorldObj().getTileEntity(boundTile.xCoord, boundTile.yCoord, boundTile.zCoord); - if(tile != null && tile instanceof IInventory){ - return (IInventory)tile; + if(this.boundPosition != null && this.boundWorld != null){ + TileEntity tile = boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ); + if(tile instanceof IInventory) return (IInventory)tile; } return null; } + @Override + public boolean isBoundTileInRage(){ + return super.isBoundTileInRage() && this.boundWorld.getTileEntity(boundPosition.posX, boundPosition.posY, boundPosition.posZ) instanceof IInventory; + } + public ISidedInventory getSided(){ return this.getInventory() instanceof ISidedInventory ? (ISidedInventory)this.getInventory() : null; } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java new file mode 100644 index 000000000..6cceea975 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java @@ -0,0 +1,67 @@ +package ellpeck.actuallyadditions.tile; + +import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.ItemSpecialDrop; +import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; +import ellpeck.actuallyadditions.network.gui.IButtonReactor; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; + +public class TileEntityXPSolidifier extends TileEntityInventoryBase implements IButtonReactor{ + + public TileEntityXPSolidifier(){ + super(12, "xpSolidifier"); + } + + public int getFirstSlot(int itemsNeeded){ + for(int i = 0; i < this.slots.length; i++){ + if(this.slots[i] == null || this.slots[i].stackSize <= this.slots[i].getMaxStackSize()-itemsNeeded){ + return i; + } + } + return -1; + } + + @Override + public boolean canUpdate(){ + return false; + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return false; + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return this.isItemValidForSlot(slot, stack); + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return true; + } + + @Override + public void onButtonPressed(int buttonID, EntityPlayer player){ + if(!player.worldObj.isRemote){ + if(buttonID == 0 && player.experienceTotal >= ItemSpecialDrop.SOLID_XP_AMOUNT){ + int slot = this.getFirstSlot(1); + if(slot >= 0){ + if(this.slots[slot] != null){ + this.slots[slot].stackSize++; + } + else this.slots[slot] = new ItemStack(InitItems.itemSpecialDrop, 1, TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()); + player.addExperience(ItemSpecialDrop.SOLID_XP_AMOUNT); + } + } + else if(buttonID == 1 && player.experienceTotal >= 64*ItemSpecialDrop.SOLID_XP_AMOUNT){ + int slot = this.getFirstSlot(64); + if(slot >= 0){ + this.slots[slot] = new ItemStack(InitItems.itemSpecialDrop, 64, TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()); + player.addExperience(64*ItemSpecialDrop.SOLID_XP_AMOUNT); + } + } + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index f0580000b..77b97f7b0 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.3"; + public static final String VERSION = "1.7.10-0.0.5.4"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java index 0b6e54cff..880ac2225 100644 --- a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java +++ b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java @@ -8,6 +8,7 @@ import mcp.mobius.waila.api.IWailaDataAccessor; import mcp.mobius.waila.api.IWailaDataProvider; import mcp.mobius.waila.api.IWailaRegistrar; import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -47,7 +48,7 @@ public class WailaDataProvider implements IWailaDataProvider{ } @Override - public NBTTagCompound getNBTData(TileEntity te, NBTTagCompound tag, World world, int x, int y, int z){ + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, int y, int z){ return tag; } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 62f45993b..12c6a1558 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -61,10 +61,9 @@ tooltip.actuallyadditions.blockPhantomEnergyface.desc.2=Put RF through me! tile.actuallyadditions.blockPhantomLiquiface.name=Phantom Liquiface tooltip.actuallyadditions.blockPhantomLiquiface.desc.1=Like a Pipe, only Wireless! Connect me with a Phantom Connector! -tooltip.actuallyadditions.blockPhantomLiquiface.desc.2=Put Fluids through me! Auto-Outputs too! -tooltip.actuallyadditions.blockPhantomLiquiface.desc.3=Important: When having a linked Fluid Container that can input and output -tooltip.actuallyadditions.blockPhantomLiquiface.desc.4=the same Fluid, set possible Pipes to Input/Output Only Mode, -tooltip.actuallyadditions.blockPhantomLiquiface.desc.5=otherwise fluids will flow back and forward indefinitely! +tooltip.actuallyadditions.blockPhantomLiquiface.desc.2=Put Fluids through me! Apply Redstone Power to Auto-Output! +tooltip.actuallyadditions.blockPhantomLiquiface.desc.3=Important: Watch out when setting the Liquiface to Auto-Output! Doing that +tooltip.actuallyadditions.blockPhantomLiquiface.desc.4=could produce Fluids flowing back and forward indefinitely in some cases! tile.actuallyadditions.blockPhantomPlacer.name=Phantom Placer tooltip.actuallyadditions.blockPhantomPlacer.desc.1=Places Blocks from a distance! Connect me with a Phantom Connector! @@ -85,13 +84,42 @@ tooltip.actuallyadditions.blockMiscLavaFactoryCase.desc=Helps the Lava Factory C tile.actuallyadditions.blockFluidPlacer.name=Fluid Placer tooltip.actuallyadditions.blockFluidPlacer.desc=Places Fluids stored inside it +tooltip.actuallyadditions.paxel.desc=It's an Axe, Shovel, Sword, Hoe and Pickaxe! Combined! +item.actuallyadditions.woodenPaxel.name=Wooden Paxel +item.actuallyadditions.stonePaxel.name=Stone Paxel +item.actuallyadditions.ironPaxel.name=Iron Paxel +item.actuallyadditions.goldPaxel.name=Golden Paxel +item.actuallyadditions.diamondPaxel.name=Diamond Paxel +item.actuallyadditions.emeraldPaxel.name=Emerald Paxel +item.actuallyadditions.obsidianPaxel.name=Obsidian Paxel + tile.actuallyadditions.blockFluidCollector.name=Fluid Collector tooltip.actuallyadditions.blockFluidCollector.desc=Stores Fluids in front of it inside it +tile.actuallyadditions.blockPhantomBooster.name=Phantom Booster +tooltip.actuallyadditions.blockPhantomBooster.desc.1=When placed above a Phantom Machine, it doubles its Range +tooltip.actuallyadditions.blockPhantomBooster.desc.2=(Max Amount above one Phantom Machine: 3) + item.actuallyadditions.itemPhantomConnector.name=Phantom Connector tooltip.actuallyadditions.itemPhantomConnector.desc.1=Connects a Phantom Face to any Inventory Block! tooltip.actuallyadditions.itemPhantomConnector.desc.2=Hold ALT to clear the stored TileEntity +item.actuallyadditions.itemMiscCup.name=Empty Cup +tooltip.actuallyadditions.itemMiscCup.desc=Used to make Coffee in a Coffee Machine! + +item.actuallyadditions.itemCoffee.name=Cup with Coffee +tooltip.actuallyadditions.itemCoffee.desc.1=Brewed in a Coffee Machine! See Effects below! +tooltip.actuallyadditions.itemCoffee.desc.2=You can drink me %s times! + +item.actuallyadditions.itemCoffeeSeed.name=Coffee Seeds +tooltip.actuallyadditions.itemCoffeeSeed.desc=Grows Coffee on Grass Blocks + +tile.actuallyadditions.blockCoffee.name=Coffee Plant +tooltip.actuallyadditions.blockCoffee.desc=Grows Coffee! Noms! + +item.actuallyadditions.itemCoffeeBeans.name=Coffee Beans +tooltip.actuallyadditions.itemCoffeeBeans.desc=Used in a Coffee Machine... delicious! + item.actuallyadditions.itemCanolaSeed.name=Canola Seeds tooltip.actuallyadditions.itemCanolaSeed.desc=Grows on Grass! item.actuallyadditions.itemMiscCanola.name=Canola @@ -141,14 +169,16 @@ tile.actuallyadditions.blockInputter.add.13.name=Efficient Sucking Dilettant tile.actuallyadditions.blockInputter.add.14.name=Extreme Sand Digger tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO +tile.actuallyadditions.blockMiscEnderCasing.name=Ender Casing +tooltip.actuallyadditions.blockMiscEnderCasing.desc=Extremely sturdy casing, used for crafting + tooltip.actuallyadditions.phantom.connected.desc= tooltip.actuallyadditions.phantom.stored.desc= -tooltip.actuallyadditions.phantom.noBound.desc=The Connector has no Information stored! -tooltip.actuallyadditions.phantom.notInventory.desc=The stored Block is not the right type of Inventory! +tooltip.actuallyadditions.phantom.unbound.desc=The Connection was cleared! tooltip.actuallyadditions.phantom.inWorld.desc=In World tooltip.actuallyadditions.phantom.boundTo.desc=Bound to tooltip.actuallyadditions.phantom.connectedBlock.desc=Connected to Block at %s, %s, %s -tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to Block at %s, %s, %s but it is not in Range! +tooltip.actuallyadditions.phantom.connectedNoRange.desc=Connected to Block at %s, %s, %s but it is not in Range, not loaded or not the right type of Inventory! tooltip.actuallyadditions.phantom.notConnected.desc=This isn't connected to anything! tooltip.actuallyadditions.factory.notPart.desc=The Controller isn't part of the right Multi-Block! Look at the Controller's Description! @@ -218,6 +248,13 @@ item.actuallyadditions.itemSpecialHeartPart.name=Part of a Heart item.actuallyadditions.itemSpecialPearlShard.name=Ender Pearl Shard item.actuallyadditions.itemSpecialEmeraldShard.name=Emerald Shard +tile.actuallyadditions.blockCoffeeMachine.name=Coffee Machine +tooltip.actuallyadditions.blockCoffeeMachine.desc.1=Makes endless different Coffee Combinations! +tooltip.actuallyadditions.blockCoffeeMachine.desc.2=Just add Coffee Beans and a Cup and the Ingredients: +tooltip.actuallyadditions.blockCoffeeMachine.desc.3=There's a lot of ingredients that add different Effects +tooltip.actuallyadditions.blockCoffeeMachine.desc.4=to the Coffee! Just put them into the slots on the right +tooltip.actuallyadditions.blockCoffeeMachine.desc.5=in the desired Order! It'll be your CUSTOM COFFEE! + item.actuallyadditions.itemDustIron.name=Crushed Iron item.actuallyadditions.itemDustGold.name=Crushed Gold item.actuallyadditions.itemDustDiamond.name=Crushed Diamond @@ -284,6 +321,11 @@ tooltip.actuallyadditions.blockHeatCollector.desc.2=Needs a bunch of Lava around tooltip.actuallyadditions.blockHeatCollector.desc.3=Occasionally steals the Lava. Watch out! tooltip.actuallyadditions.blockItemRepairer.desc=Repairs Tools and Armor automatically +tile.actuallyadditions.blockFlax.name=Flax Plant +tooltip.actuallyadditions.blockFlax.desc=Gives you String when grown! Yay! +item.actuallyadditions.itemFlaxSeed.name=Flax Seeds +tooltip.actuallyadditions.itemFlaxSeed.desc=Grows Plants that give you String! + tooltip.actuallyadditions.blockBreaker.desc=Breaks Blocks and stores them in its internal Inventory tooltip.actuallyadditions.blockPlacer.desc=Places Blocks stored in its internal Inventory tooltip.actuallyadditions.blockDropper.desc=Drops Items automatically (Without spewing them all over the Place!) @@ -304,8 +346,6 @@ tooltip.actuallyadditions.blockCrafter.desc=Automatically crafts Items without n tooltip.actuallyadditions.itemPotionRing.desc.1=Gives Potion Effect of Level 1 tooltip.actuallyadditions.itemPotionRing.desc.2=Needs to be held in Hand -tooltip.actuallyadditions.itemPotionRing.desc.off.1=Crafting Recipe of this particular Potion Effect is turned OFF by default -tooltip.actuallyadditions.itemPotionRing.desc.off.2=as it is extremely overpowered! Turn it on in the Config File if needed. tooltip.actuallyadditions.itemMiscCoil.desc=Lower Tier Coil, used for Crafting tooltip.actuallyadditions.itemMiscCoilAdvanced.desc=Higher Tier Coil, used for Crafting @@ -348,7 +388,8 @@ tooltip.actuallyadditions.itemFoodPumpkinStew.desc=Like Mushroom Stew or Rabbit tooltip.actuallyadditions.itemFoodCheese.desc=Cheese. tooltip.actuallyadditions.itemSpecialUnknownSubstance.desc=Dropped by Skeletons. BETA INFO: Useless as of yet. -tooltip.actuallyadditions.itemSpecialSolidifiedExperience.desc=Dropped by everyone. Right-Click to get XP. +tooltip.actuallyadditions.itemSpecialSolidifiedExperience.desc.1=Dropped by everyone. Right-Click to get XP. +tooltip.actuallyadditions.itemSpecialSolidifiedExperience.desc.2=Sneak-Right-Click to consume the whole Stack. tooltip.actuallyadditions.itemSpecialBloodFragment.desc=Dropped by everyone. BETA INFO: Useless as of yet. tooltip.actuallyadditions.itemSpecialHeartPart.desc=Dropped by everyone. BETA INFO: Useless as of yet. tooltip.actuallyadditions.itemSpecialPearlShard.desc=Dropped by Endermen. 3x3 Crafting to an Ender Pearl @@ -378,22 +419,13 @@ info.actuallyadditions.gui.all=All info.actuallyadditions.gui.slot=Slot info.actuallyadditions.gui.put=Put info.actuallyadditions.gui.pull=Pull +info.actuallyadditions.gui.whitelist=Whitelist +info.actuallyadditions.gui.blacklist=Blacklist +info.actuallyadditions.gui.coffee=Coffee tooltip.actuallyadditions.uses.desc=Uses tooltip.actuallyadditions.produces.desc=Produces -effect.actuallyadditions.speed.name=Speed -effect.actuallyadditions.haste.name=Haste -effect.actuallyadditions.strength.name=Strength -effect.actuallyadditions.jumpBoost.name=Jump Boost -effect.actuallyadditions.regen.name=Regeneration -effect.actuallyadditions.resistance.name=Resistance -effect.actuallyadditions.fireResistance.name=Fire Resistance -effect.actuallyadditions.waterBreathing.name=Water Breathing -effect.actuallyadditions.invisibility.name=Invisibility -effect.actuallyadditions.nightVision.name=Night Vision -effect.actuallyadditions.saturation.name=Saturation - container.actuallyadditions.inputter.name=ESD container.actuallyadditions.inputterAdvanced.name=Advanced ESD container.actuallyadditions.grinder.name=Crusher @@ -417,10 +449,15 @@ container.actuallyadditions.liquiface.name=Liquiface container.actuallyadditions.energyface.name=Energyface container.actuallyadditions.fluidPlacer.name=Fluid Placer container.actuallyadditions.fluidCollector.name=Fluid Collector +container.actuallyadditions.coffeeMachine.name=Coffee Machine -container.actuallyadditions.nei.crushing.name=Crusher -container.actuallyadditions.nei.ballOfHair.name=Ball Of Hair Usage -container.actuallyadditions.nei.compost.name=Compost +container.nei.actuallyadditions.crushing.name=Crusher +container.nei.actuallyadditions.ballOfHair.name=Ball Of Hair Usage +container.nei.actuallyadditions.compost.name=Compost + +container.nei.actuallyadditions.coffee.name=Coffee Machine +container.nei.actuallyadditions.coffee.special=Special Feature: +container.nei.actuallyadditions.coffee.extra.milk=+02:30, -1 Level info.actuallyadditions.update.generic.desc=[{"text":"There is an "},{"text":"Update ","bold":"true"},{"text":"for ","bold":"false"},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"available!","color":"none","bold":"false"}] info.actuallyadditions.update.versionComp.desc=[{"text":"You have Version "},{"text":"%s","color":"dark_red","italic":"false"},{"text":", the newest one is ","color":"none","italic":"false"},{"text":"%s","color":"dark_green","underlined":"false"},{"text":"!","color":"none","underlined":"false"}] diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage1.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage1.png new file mode 100644 index 0000000000000000000000000000000000000000..6e893add6db867ce1abcf702b817683c1a0a717e GIT binary patch literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0yIHyDi6D6euK7;u=vBoS#-wo>-L1P>`6JSE84f zTB2a0XP{@A+G>;vRMY3_;uvD#pDe-J%=zd4e|gr)JSWT=M0z8xCW#(l+_37XnuOJT z0iR}v2QG*IKlJW7kdu?Ok&Erjm4t#f(-Il7{^UogeUi`Mh>)2bwWdkI*DbUr;kNGU zBN7f0EE`rH)#BJBn9`BHo$W@Mfb?{b3hBAGrwGPHtl$+pzD#Vlf(Qfeulf6rik~{X dY+55D!;6kz4o9@VMFL&M;OXk;vd$@?2>>SGV1NJs literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage2.png new file mode 100644 index 0000000000000000000000000000000000000000..8a5e090ddb7ccd7b37e110f0e8ece31374bbad34 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0yHg{n5KW1wbK*64!{5;QX|b^2DN4hJwV*yb`^< z)Di^~Jp(<{)K;TZpqdSyE{-7<{!1qsavgFIaQ)5_Ht7^IM;M!qj;^jw&{K&rF|nNv zTKx(YEbqVHwO=Ff#Pl^^%?+D>XKK_ugC+}H<4EikxYm)V_eiDX@#=oX(@OJO3o71t zM}M+bnt0x+V$QCTS>}F=4(IBs17$Aw{;d_gZF{EkM7pBPyxkdg=WpM5r}$*E#IqtU z{tspQ>uuu|WB#@7?|ZS<*S*A4exr#SQ~l)gNfBE77r)kan*UT;%0HjKkM~r~IuD@R O89ZJ6T-G@yGywoe7jzT= literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage3.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage3.png new file mode 100644 index 0000000000000000000000000000000000000000..61bc39cc0f3f791d29bc02c74cf123de57ca413e GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0yHYRD%C}5l~2?#5JNMI6tkVJh3R1p&&6cuS72| zwM4;0&p^*KwbdvUsAjRJi(`m|fAWw2|Lt8RRww)rQf4b@@Rj9A7Uh|f!EyB%LlSf7 z#Egd2xf0FE+j&l?{`WoY@~=6j1+0W6(`eNr=G%NmJWrHzUO52uKXA(3kaj+gcf(r+ z=M5{F6W=sBFch(#V3_b$!EBe5#4)W78SWHTr4wOYOoA*LTrL6!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0yHK-nS$|5hx^4;u=vBoS#-wo>-L1P>`6JSE84f zTB2a0XP{@A+G>;vRCCkQ#WBRff9WJ!zC#8)t;I}gM~*N~n6cu>ffFYVTRU}#X# z=qJP2sa#?qMJW!s-$zy4gF*VJ*QNjvVI?~4BC%&l+oy?O2L*_CVR9=Q6| zov~qNMa7y!8>5Xo17>utIiI8u(6Z#&zK%IbJ|Wdc@Asa_h`*g-RXY2|T&2Kp-W%uN zs)_~jt8rbB&D$Nt!;^y+|~WbkzLb6Mw< G&;$UzD2PP> literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage5.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage5.png new file mode 100644 index 0000000000000000000000000000000000000000..e2cbbc9298ea82bae193b53d6c0fe0e7568151c4 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0yHW$Zykyn?NCn64!{5;QX|b^2DN4hJwV*yb`^< z)Di^~Jp(<{)K;TZpqf{nE{-7<{!1s>axobSv=%dIZxq@lx+Z4BhAmq*+&GndBQm0* zaji|$1HnD_XXvLLQaRJKq0v3=-oBqFQ<^)@G-=1(tIe4HoVoQ){^=cme|)&}bOS^G zI(wlzyZsCf^Y@2Z^krKK3SFM~D=LKD*D0Vre#xuI)iqHZA@U-JvuFD(FPyyUa^R)K zY;Q_eA5c2h+Q|~K{W|lUso{-Wzqwd8Roex0taZ2=>AYkS-^AaOFZ|Mpndo56yd!Jv zb}Nl#X%6kVlbm!`SeY{aW?C@8tLOB&1-zRIT!lvI6;>1s;*b z3=G_YAk0{w5<>&kwgm0#G*>Ye|&NkAcq64!{5;QX|b^2DN4hJwV*yb`^< z)Di^~Jp(<{)K;TZpqgKvE{-7<{!1qr@*OhZaV=(2JJNDRw6imer>BR9XRZaCv@^Tj zg-&IKLYBS*dwb$nC@<#<5}dg2)8o3^_I}MBe_E41d|7e0Vrq%P#J8#IZntmWes+S` zgH^Kv7Od8CKdlC-@qe?xzJ*U2?H`@hUyR^UXh2hiNmKcKzY0xn#orOPTj@H=o7y pk_9p{)5Ioz{wz`Hsjl>px5PKBdb5L|127aAJYD@<);T3K0RRjDl!*WU literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage1.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage1.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf284b955701ba60c856a467cb1dc707d10d343 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$Op+-*7LqCg>u64!{5;QX|b z^2DN4hJwV*yb`^<)Di^~Jp(<{)K;TZpqfdZE{-7<{>c)oiy5Rj=4AYkKcynqa?U)Z z;LWr|j`*Z6_qX^wv7gX(N`R9oEz3Y6^kZZ0_BF!H7Xu_Y7$O;%6-*_>8gf`YE6TDP zR2|zCm?yBF&~w?&kfZFul)})%JC%u9K>lXy3$X^)Ik%?>n(16=JLSNj$SvU@wV>{J s7LfITVa12~e`4_({K5&Rj13qV{F8$mc0^VD2D*;H)78&qol`;+05Hc|mH+?% literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage2.png new file mode 100644 index 0000000000000000000000000000000000000000..cea1ba434497b4ebcd8245c27472d56233401b61 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$O}>W|+2DF6ydl(rIsj|=o#plrnVZT0@WPwba4!^@K65n|G&Mf#A*diEZE46tx=fw zAd|+Y8zP4oJZwt#DK;l>=W+fawD|wBRHgroCNcaG@^czlCggI>Sa~oZ1+1h1^R`-)78&qol`;+0Nv+y9{>OV literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage3.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage3.png new file mode 100644 index 0000000000000000000000000000000000000000..892529aa2208a637ae2ea257c08f5da89fd929d2 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$OJq7wY)i-1BBC9V-A!TD(= z<%vb93~dIox?sjWt-KsDDrT^vI!{FeqAaxobS+!2rHoI3Yx<5k&+ zh_0!v4@4gsztPdr$z8W;i_k&!ANx%=t0{`Rt5|HvxiNF@$)_%%|Fx`iG{I=4+%50i z$?=Cm)Ne=YcIWBrc3-^ta6qhiAQ#8Xb3A6(y=FZ=5c7Pw;I8=B>V|VA5AYri4WFs) zG3`i68iV=-g+nt{fuasuZ2Xgws^{M-n%5%7AosVHdAooB$21n%S{IA@-`tr(C0_&| z&Jot(v^sy>-?W**{nfvn+l+lbd6a%++iC2rwTtn?#3vW$uinG3`0+6jroyiGKrb?Q My85}Sb4q9e033jYA^-pY literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage4.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage4.png new file mode 100644 index 0000000000000000000000000000000000000000..56e5e111bc1282015c09ded8e4c13dcc60b5f8b7 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$M@^1dYzia;TW64!{5;QX|b z^2DN4hJwV*yb`^<)Di^~Jp(<{)K;TZpqj6qE{-7<{!0T5xehr9+!2rHoI2O{fEFXS z_r^^EK8j^Oo94Q5dCv}+7N+!s)9zsXTJzbr9~Z6jC`j13`{vG>XIp3dTyJzzF?Evj zDV6pR{->tm&!!t(yZCS3=e+aR zRH-9`BQ~&K5TBnD$eDTgX zYKfr>`nS$L5F3zj*sDpe_Km^8?fV7P9n))PSuE$(=Cu0qHL*~Pxi#C1x%zW?r9*j5 vUaGv>hm(^s=04^OvQsEyvzuh|%jUB5(%(0Vgi^ynfyChH>gTe~DWM4f&5oBM literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage5.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage5.png new file mode 100644 index 0000000000000000000000000000000000000000..df74ddd419ca708a864b2b635de0372b5aa3b3fe GIT binary patch literal 433 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to$O3LVlYr+yn|ql(rIsj|=o#plrnVZT0`1}Vba4!^@LxJnm+z2+KV%M0RVvVRtCXXklmx zNvNLtDz&IHrBF(8_qE)q$@7|ppFXO2u&jis!1eR48LO;aEGF`|S%@|$cWD&xs~?!d zkzT@(fmwfhaHzWwV6xTTxHqTc#vuCkG%{Bx60r4{qS1<2h#(m`O8k# z#ELojJqUPy_|Y0Bp6Dw~-%6O?%z4F7UXfSwUTwwPs~7Em`zfw7W}GT0yWDEl_awXI X-|tx*OSVh}1|Nf`tDnm{r-UW|oOq>$ literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage6.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage6.png new file mode 100644 index 0000000000000000000000000000000000000000..65f70d2592135a08bab0eff731cc3138e7fd8746 GIT binary patch literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85p>QK$!8;-MT+OLG}_)Usv|~to*`eR`2}JO#%u@l(rIsj|=o#plrnVZT0_{=pba4!^@ZUN~vCqj+pskuo#PQ*^32T~I z8t<%en$VzNv5tZ3Ba0AY(;62+p}r074@_bfeUbig+JURjbJo6Z|DVmD`K(nUIqvdH z&D`(BnP;Crf3Z`BCk7*IhzhQy*NoDtVem#PiJm2D!iu?3U;Mv46|`UZmF8WyPGN(Jb`5cP+D}@V_?) u!@sLdaeLrPx#1ZP1_K>z@;j|==^1poj532;bRa{vGf5&!@T5&_cPe*6Fc00(qQO+^Ra1Ox#m z4r$@Qm;e9(7<5HgbW?9;ba!ELWdLwtX>N2bZe?^JG%heMHD!e|WdHyIOG!jQR5(vP zQcG_VQ5Yqe0cK#BdoLCkdDP)q99o!`@+hTRKt|gVtyNKow#NEsjB(>*uZcS~F)SMm zaiy^?Ozft{x~qvx_x=~pWf~@DlJkAvJ@dYlO&~XcDVq*ER$OPDs15KzdsND{%Y*L2A|Y& z$`woPb=WqK!ld-1!{_tkZW!@MzW4J>Yxj-uY{#nIh6j+XMbGN8dSi{<<=0ahMoJKP z5$hg&N+|k<(cP#>ts0`F*TMCSg^!Eg`n_L#_1smP6$@FxND8^M zIGquv)2`ACG_qCqZM0Q2KuCZK7-PM|J^fzKF2jb9(S@lv2wsy~3-sEGBoTBE0^XC> zhquawC9#-`1hPm#NT1@!=-|%MjG0=65}Z=q0TGI}ZD*w*WD}{$*<%eJ$tK3P;H2Ll zLD2!c5WKlgI!#xlAfkYbo`@Fglu(bel*j4z@SR;PQo^Ts*Ba8fntO51IcJDQ3Kw%2 zN%X+mteP*LZXWHA1v*kvF1O|LODIlmRh4$#bEfR7n8=f?G?I_*Si`~ce1BBKXwnE^ z(ij{xYNx67FX{LDr=RS=i9?;e_qUF|cYl0FPkEOJ!D49$0D;Yo@b+~O>*L_!w_!47 z+Wzk0*XrOUAz@xL=7&wRHH?94igE%=iUkW#OxXee$KX^HJ_jr|Z`5c>`S8I<0FP2S fG4}9Pr<4By%8YwIy;$�NkvXXu0mjfm}O9n literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/modelCoffeeMachine.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/modelCoffeeMachine.png new file mode 100644 index 0000000000000000000000000000000000000000..99aac9c1904b465985155970547ef36edc675b9c GIT binary patch literal 552 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSY)RhkE)4%caKYZ?lYt_f1s;*b z3=DjSL74G){)!Z!AbW|YuPgg~Hf|mX&3%6Ts~8v%*8ZDb5|6Dz-$ePR={U>YxlQZt5zl5wPjqeL71V* znYV#q!Q|qGb=5ECR2RIkWB!x!p~UL0MzoGtx8J;bzR$Ox$}u~wH~Y&v?j08O-LGfw z?&y%%CYYFuhy2znahW!Pm2~bLP)ImSNGc`0?Y8j`QJ0FPY@z<&ysWkxGqp zb2;+%@8qfHQn^7I=lLZ45#*RZ^TD;GbU}u(<`=I;Z;^R;(%G zV=VX@QIEb#JgtAaGh`4=h#O+*wh=q^#2FTjO2-z zdi7%64Yc?hc%v#9WWICPv+gNoJyV+dK(d3c0RkBm7&sW14opc;D7Tt*XcBY4r{nxU d_mU2@zA${NG%ex`C^`qy?CI*~vd$@?2>`tuXV(A# literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png b/src/main/resources/assets/actuallyadditions/textures/blocks/models/special/modelLordi.png new file mode 100644 index 0000000000000000000000000000000000000000..05cdffccfee7e02d19abe86ac55707bf87a61950 GIT binary patch literal 1267 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!SkfJR9T^xl_H+M9WMyDrW(e>J zaRrM1XSf3-N5NBe`EuO;P33Jz$Cy~;1OBOz`%D9gc)~C z%zg_LlqhkHC<)F_D=AMbN@XZW%*-p%%S$a$Fwry6GfizZN(HKk^mK6yiEw{=#gOlS z0?*Na9sd^wEA5m#70}sx;+~z?{TqVw)p(PxJzFF6g0o9YZDpC%iRH+nHXgK7)oE#pMt5Ob;9|A!rEd?_! z$!Zi~K`0U9xS^b7G7f zT{QrJh7--f4FE_HLO=znfLqnx9tuE(Q?5_|c#-#wECdYz63{PuP!&9hM6$HBw6d}? z^22!8>3e#5#)kRE$H%i+tY--c9XMQec6Lrq4x7!+&CTU-I9x6_FE5YB;}sMXbar-j zb#--jclY%4^!E0OM54aFzS-H?&CSiNt*!0tZJA8Av$G?Y%XfEo6>ojDuL}I96bR~g zU$nOcbZ%p@kw4Xs4@+vsDm#9!-HHCn1Ss`N2`BZ9;$<0R4yw@(0ARGswE6 z7>2U3l+WB=vKd98%G9o={CxQib>4$XtZ8FM>La8M1vSb^f=fcLU@{tG{{y7T0~QF3 z86Fl)lL~sZe!T*eBCs8csIfhep*;3L9i4zQ=LTCNs#fj|7|6G0RG>k?F(@8U*D-u- z+SqePZGI3g76WGnWlp8y9J0zF9>rXN=FtBAhP-Rk2LgDDXarN!Pi7TrM%0CN=j;!F z#C#tigHvPWZ`&ssiJXvZe2+A#WOE-e2xDZ*!2|r!(>%Jc{Zak1l@Zm|(dQ;>;q~IV%unfMRG8o| z{joV}s;%)BE)x!V#D6taCBNDA@XcLb24W#>5oI?O7$9d5g1jVY&CLtJ>{FzUAi>jx ziDfatvCp}~Oiw}i(|wqr@jeE8Z-Z+&#KfHHqH8#rFwdKsRWPd+EeVR`L-*yJN_ zuNIFWqz|Ntit}V7m zE@nEBm|90&r#wMpgDd5i2H|6hYngBWcPsA6ffMJkdRJ~jjvZA)g<5;bKsKr+Ozb+J z^=BY4#cSA8Ejq|$+&TkA4-K|MtW7%31>#|2!_%t~c=#`x@T>}rgW~Ba zW?$9pIK12bZU&t}&XE4zpvK)2CtzKK1a)gek~~f``gL~4G?rjCP2K>6GOYTLhFNQx zGx(##j?i$pY__h+7!RAXQM|BxFk*tSFQp=AFKOV0wkmEwA1e3xTKrdp*CJ8sPs2_x TC`x*?gyvlA3JvJ|Ns9$sZlT*0>e85*2MkE2W6C!AirQ> znjgu4A^1DHDloP=3p^r=85sE1gD_*Epz}MRphSslL`iUdT1k0gQ7S`0VrE{6US4X6 zf{C7io@r{UQ7Qui(;rV4$B>G+w>K~5-3kz3OPuBK@NfK#Rc}um(-Y&qXJz>R%vr6D z&6Yopuom%Mf1PL_``bE(fBN4q@+^GSzkcgKuWPhtc)s_`&zpK5q#NE^XDBzwfA%}G z(RzJBh2lNaZg}ox3``sczAc=0+VAyEO(3V>{WcZ> z2L{F)b|t@lGrU`NN?RswMf&rw`3;qJf>lo+TdhrB4$`vswh&MiOTzC9vrc~!P3zG& z&MxbF%h({_E*8K3y^JtWaz}YI6Nkb9`~7KWFV9|TpLF)z#r1w$|oMKlUN4a$wl@UI88i<%~br zYYq8qyUN8MUs%G+SZ8-};}6NG{UzQF$$R^a7}&M$#%du4PTg!^NcDR$?NL7P@p0!W zhSk&a*bAQB-+a{Ki^jd!9_Q`393O09VQ`22!NC+H(<@9OPqi;fW#9|>^(wy!Y!1hP zmF%1fKzo41@;sFMg{vd$@?2>=tGWv2iD literal 3020 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/diamondPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/diamondPaxel.png new file mode 100644 index 0000000000000000000000000000000000000000..a4732da1436bfe6b170f189f223e0bc2775ed5bb GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjGL736~_k^`TL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@p2c9mD zAr}5qC+_BDG8AypS6AEnMMqF6@Sv*77Dm|s<|z)mE+&o+nj#xBu9;u^!Jf2q;`w_s zk0p4iQ#pHZS{U`hlMMZIyUGzI9oBc z#2-6l_eYYUT_)E3n!yn{qr03}BG^90GCFav9gStl6gVUj&uAdX)Vz=7n}~X&{%>xM z!#z_I?|n=1d@!G(_Vv=aUguYNhj46>*}ZXj$nU$i^p2lwZg??wOH)Wy!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pBc3jf zAr}5qCmiHDbtywfiK)?v?Bx3l5_5K~ysq%Qn?W|A*D;K%LE;gY^6&LWZJ*i)IEXF#qVurrwK#?c&XL#WE*9q;3j~VB=dT>Tmz4vd(SaXGG&2NVL3(Y+` TkA2Yq`iH^O)z4*}Q$iB}(fxn) literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/goldPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/goldPaxel.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd40009d2e4405c97607da6202daae242bfc2ea GIT binary patch literal 351 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pyPhtN zAr}5qCvN0rG8AC3S6BNh67ImNrob>UkZFq(e}~tE6%3tL92pNU%!|yfoIlYbv-JJv zcYE&J{|UBCU%bKW^R;PGq35sPE3JQ1Bg>Sr=bl+!%ZDDzUq3f}`m4v#>MQElQpzax zDA2UyTZ%M?RRT^YhebT&QYtzNLjZkkk)E6}41p00i_>zopr0IOt!(f|Me literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/ironPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/ironPaxel.png new file mode 100644 index 0000000000000000000000000000000000000000..c3729110c7a000fe92b6957bb83ce42099ec77ed GIT binary patch literal 340 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pOP(%{ zAr}5qCmiHGWWeKE{rt?19Zsp}OsL)Dy4|qG+`ed%)RF0Hj=cN7K5u%x zNV14nm7r}}&dvY&9_(Mj^T5jB1QqZTS^@U;t9?dB#xYX{-K;0FIXRMj=kPe2IPbW9^ZBac zsjM=sn%1uwCbTYibt9C0N9_4eRWT+U9e>s5i5%E&`+jxH*CmYS>KvsSvaeSPJ8qqO hCHKSG7oIND%vWA2zp1ye*c9kH22WQ%mvv4FO#oL8fDHfu literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemCoffee.png b/src/main/resources/assets/actuallyadditions/textures/items/itemCoffee.png new file mode 100644 index 0000000000000000000000000000000000000000..63cefb7fac420173754aff3fb937841cf5b7a343 GIT binary patch literal 265 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjGL736~_k^`TL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pc25__ z5DWjMeHVEf6a<_-|CI3wmnVotI#0LX*)mUEWa^KPlY(wJ2~3O+C}zp(E3kj^SlEtR zFVLxQuBu+JbN&;d$alvb-T%nG;M4f$di6v8(M7wNed^^_bU!Ff@Ls9O``3Z}2FC@S z4RX>6%CCMd`s$Ms*!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&os5wC>5xt-_yl0 z#KOOK!b#o+10I&l7Pg9ujP|n@{I}}S*>dejp^%(%C;U*{}kEU z!v8n?J{C~B*ks~Xje?9NC!Ysa22V(w+2k}&PbK4AxaW2Sos+lPbM;wRvxLOAn#}?_ Ojlt8^&t;ucLK6T?t6%p3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemCoffeeSeed.png b/src/main/resources/assets/actuallyadditions/textures/items/itemCoffeeSeed.png new file mode 100644 index 0000000000000000000000000000000000000000..8afdc027cdf670b591d927f050e82d9937856658 GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&os5wC>5w?mZytj zh=u>u-h+b81_I1?Ie4E;<@>R;^Gketv(094$@_*MA~vLW=I#CN{^tGLAAi4=%v{K% z`gi~Q@QjTj4HLMS{`<(Rn*Qfaq+9ZXSE_9n=FN37+C2TkA3n8(3_H?V>@_xvw2HSF zMf%;_q2O`x@Kkl(q@SyL^q=T5A8MXbyG4mFa)P2fo6+{>cRTIv{6uZCXSA$n5?xt2 b|6ZM&cjj&XnvA(XS2B3I`njxgN@xNA4mWAz literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemFlaxSeed.png b/src/main/resources/assets/actuallyadditions/textures/items/itemFlaxSeed.png new file mode 100644 index 0000000000000000000000000000000000000000..f0feb7fa0ec80994f5450b22a8c549ec90823c27 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=Dh+K$tP>S|=w^P@=>&q9iy!t)x7$D3zfgF*C13FE6!3!9>qM&os5wC>5xt+tbA{ z#KM1V|3%&g1s<1~Hw^z23&^_uEtx+{IVO0ciARm6vg&nr-~GjT)2BR^5Lk2iq1Ub_ z67!bdo$B(5eae)u&L>?R8I@a}NUn+C-gTXggTe~DWM4fw;^HA literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/itemMiscCup.png b/src/main/resources/assets/actuallyadditions/textures/items/itemMiscCup.png new file mode 100644 index 0000000000000000000000000000000000000000..7fc88085de9b5a882039cca6a05728336fb21926 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjGL736~_k^`TL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@p3Qrfu z5DWjUJ%M};3Ovp`r`~Z}w{ZIWgcmb53v_&Z+`4WHuhJ*ZtaT1&Md!KOx!=&qSk$&n zLUZp#wM{nXCimU2zaaa;@%`;Tf1{WW%Khhmqj^zjhLl9_6rKxm(h15(H@m)FdE!!k s#E1Sp-{RbOt7`ZHidnPHDL-WT&yclwzu>ZcKsPXWy85}Sb4q9e0J^VR8vp!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pGoCJv zAr}5qCv4<9&0SubC8nSDa!n{)Iqg>OzB=;*>~m(^(a16`S#5q{)~>7n#doyrk`9>3`hIG^ zMsl`W%*XEEsa@Yc&v0}4(Oqb!|PXY6@)zN cxKYD!=DEt5ImT+DKz}iKy85}Sb4q9e0Izp~y8r+H literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/stonePaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/stonePaxel.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe99d046c3a5cccca108c60cbc395d8064e64cb GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@pbDl1a zAr}5qCmQlGEAp_c_n-Ui)`zA&4QjsoCVJR3&EgOE5b1t;5~aD+YCcm&i{`P2ZpL>7c}xm2uar6rgcmp)oOLXjci5gmqN#9S z(YZ>7xl9U|woY_(u+V3CK4(GSO9sOg@?V4moL&e>JX1LRhm+&+tQS0sFY`Q%e(!T2 za>k|IPX$d`u3lTlcHnj8^e>fH6cm2>YOp+e_5Z;4z1_F-O%L4VF=X6R_PJE>ikq~7 ewC-Aln{{^O72E65&U*lT#^CAd=d#Wzp$P!5NP;o| literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/actuallyadditions/textures/items/woodenPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/woodenPaxel.png new file mode 100644 index 0000000000000000000000000000000000000000..9fbf1f372dce6d58fb1228d7b685309c92963525 GIT binary patch literal 338 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DkxK$!8B)5ZfpL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33J=4@yqg0@p3!W~H zAr}5qCs^|xG7xaNeECAa1(u5+b~4B`bg^~v@ijOsddB53=T?SUUB=@I$DS=kWwxK+ z?D*+^`>RFZtKdzk8u?$o?$KHE?)c2Fp$x~4XXd$0-DjG$ zrN;l0YnagUbn5xtnfxKF9vAjbT%hoUnc?8N*Humb9QQL>H16XGdZ?e#F>^!M8KG)> z#;pdQHosE-rTx5cguG!3B4Y hHC&R& Date: Fri, 12 Jun 2015 21:29:21 +0200 Subject: [PATCH 13/29] -Fixed some tiny Bugs --- .../actuallyadditions/ActuallyAdditions.java | 2 ++ .../blocks/BlockCoffeeMachine.java | 1 + .../crafting/BlockCrafting.java | 3 ++- .../inventory/gui/GuiInputter.java | 2 +- .../actuallyadditions/items/ItemCoffee.java | 26 +++++++++---------- .../nei/CoffeeMachineRecipeHandler.java | 4 +-- .../tile/TileEntityBase.java | 1 + .../tile/TileEntityCoffeeMachine.java | 4 +-- 8 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index b8568fb64..4f4141b1e 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -18,6 +18,7 @@ import ellpeck.actuallyadditions.gen.InitVillager; import ellpeck.actuallyadditions.gen.OreGen; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.ItemCoffee; import ellpeck.actuallyadditions.material.InitItemMaterials; import ellpeck.actuallyadditions.network.PacketHandler; import ellpeck.actuallyadditions.proxy.IProxy; @@ -74,6 +75,7 @@ public class ActuallyAdditions{ Util.logInfo("Starting PostInitialization Phase..."); GrinderCrafting.init(); + ItemCoffee.initIngredients(); proxy.postInit(); Util.logInfo("PostInitialization Finished."); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java index 6ab49eeef..c0dcaf928 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java @@ -129,6 +129,7 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 5, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityCoffeeMachine.energyUsePerTick); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index a01f4814d..23cc69130 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -7,6 +7,7 @@ import ellpeck.actuallyadditions.config.values.ConfigCrafting; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; @@ -159,7 +160,7 @@ public class BlockCrafting{ "CRC", "CBC", "CRC", 'C', "cobblestone", 'R', TheMiscBlocks.STONE_CASING.getOredictName(), - 'B', "coal")); + 'B', new ItemStack(Items.coal, 1, Util.WILDCARD))); //Enderpearl Block GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockMisc, 1, TheMiscBlocks.ENDERPEARL_BLOCK.ordinal()), diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java index ad2fb619d..ce76bf0e9 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java @@ -120,7 +120,7 @@ public class GuiInputter extends GuiContainer{ this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.put"), guiLeft + 107 + 3, guiTop + 32 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 4210752); this.fontRendererObj.drawString(sideString[tileInputter.sideToPull+1], guiLeft + 24 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPull).toString(), guiLeft + 24 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPull == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPull).toString(), guiLeft + 24 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); this.fontRendererObj.drawString(sideString[tileInputter.sideToPut+1], guiLeft + 109 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPut).toString(), guiLeft + 109 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java index b3c92331b..13a59170a 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -29,8 +29,8 @@ public class ItemCoffee extends ItemFood implements INameableItem{ public static ArrayList ingredients = new ArrayList(); - public void initIngredients(){ - this.registerIngredient(new Ingredient(new ItemStack(Items.milk_bucket), null){ + public static void initIngredients(){ + registerIngredient(new Ingredient(new ItemStack(Items.milk_bucket), null){ @Override public void effect(ItemStack stack){ PotionEffect[] effects = getEffectsFromStack(stack); @@ -45,19 +45,20 @@ public class ItemCoffee extends ItemFood implements INameableItem{ ItemCoffee.addEffectToStack(stack, this); } } + this.effects = null; } @Override public String getExtraText(){ return StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.extra.milk"); } }); - this.registerIngredient(new Ingredient(new ItemStack(Items.sugar), new PotionEffect[]{new PotionEffect(Potion.moveSpeed.getId(), 30, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.magma_cream), new PotionEffect[]{new PotionEffect(Potion.fireResistance.getId(), 10, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.fish, 1, 3), new PotionEffect[]{new PotionEffect(Potion.waterBreathing.getId(), 15, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.golden_carrot), new PotionEffect[]{new PotionEffect(Potion.nightVision.getId(), 60, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.ghast_tear), new PotionEffect[]{new PotionEffect(Potion.regeneration.getId(), 10, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.blaze_powder), new PotionEffect[]{new PotionEffect(Potion.damageBoost.getId(), 15, 0)})); - this.registerIngredient(new Ingredient(new ItemStack(Items.fermented_spider_eye), new PotionEffect[]{new PotionEffect(Potion.invisibility.getId(), 25, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.sugar), new PotionEffect[]{new PotionEffect(Potion.moveSpeed.getId(), 30, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.magma_cream), new PotionEffect[]{new PotionEffect(Potion.fireResistance.getId(), 10, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.fish, 1, 3), new PotionEffect[]{new PotionEffect(Potion.waterBreathing.getId(), 15, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.golden_carrot), new PotionEffect[]{new PotionEffect(Potion.nightVision.getId(), 60, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.ghast_tear), new PotionEffect[]{new PotionEffect(Potion.regeneration.getId(), 10, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.blaze_powder), new PotionEffect[]{new PotionEffect(Potion.damageBoost.getId(), 15, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.fermented_spider_eye), new PotionEffect[]{new PotionEffect(Potion.invisibility.getId(), 25, 0)})); } public ItemCoffee(){ @@ -65,12 +66,11 @@ public class ItemCoffee extends ItemFood implements INameableItem{ this.setMaxDamage(ConfigIntValues.COFFEE_DRINK_AMOUNT.getValue()-1); this.setAlwaysEdible(); this.setMaxStackSize(1); - this.initIngredients(); } public static Ingredient getIngredientFromStack(ItemStack stack){ for(Ingredient ingredient : ingredients){ - if(ingredient.ingredient.isItemEqual(stack)) return ingredient; + if(ingredient.ingredient.copy().isItemEqual(stack)) return ingredient; } return null; } @@ -224,13 +224,13 @@ public class ItemCoffee extends ItemFood implements INameableItem{ return "itemCoffee"; } - public void registerIngredient(Ingredient ingredient){ + public static void registerIngredient(Ingredient ingredient){ ingredients.add(ingredient); } public static class Ingredient{ - public ItemStack ingredient; + public final ItemStack ingredient; protected PotionEffect[] effects; public Ingredient(ItemStack ingredient, PotionEffect[] effects){ diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java index 7f21916a1..cd1cf50b6 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java @@ -41,7 +41,7 @@ public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ public CachedCoffee(ItemCoffee.Ingredient ingredient){ this.cup = new PositionedStack(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), 45, 39); this.coffeeBeans = new PositionedStack(new ItemStack(InitItems.itemCoffeeBean), 2, 39); - this.ingredientStack = new PositionedStack(ingredient.ingredient, 90, 21); + this.ingredientStack = new PositionedStack(ingredient.ingredient.copy(), 90, 21); this.setupResult(ingredient); this.extraText = ingredient.getExtraText(); } @@ -112,7 +112,7 @@ public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ ArrayList ingredients = ItemCoffee.ingredients; for(ItemCoffee.Ingredient ingr : ingredients){ - if(NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemCoffeeBean), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(ingr.ingredient, ingredient)){ + if(NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(new ItemStack(InitItems.itemCoffeeBean), ingredient) || NEIServerUtils.areStacksSameTypeCrafting(ingr.ingredient.copy(), ingredient)){ CachedCoffee theRecipe = new CachedCoffee(ingr); theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.ingredientStack), ingredient); arecipes.add(theRecipe); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index b65949634..f4c698971 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -40,6 +40,7 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityFluidCollector.TileEntityFluidPlacer.class, ModUtil.MOD_ID_LOWER + ":tileEntityFluidPlacer"); GameRegistry.registerTileEntity(TileEntityLavaFactoryController.class, ModUtil.MOD_ID_LOWER + ":tileEntityLavaFactoryController"); GameRegistry.registerTileEntity(TileEntityCoffeeMachine.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoffeeMachine"); + GameRegistry.registerTileEntity(TileEntityPhantomBooster.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBooster"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java index 10cd318e3..a0a445880 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java @@ -41,7 +41,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements if(!worldObj.isRemote){ this.storeCoffee(); - if(this.brewTime > 0 || worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ + if(this.brewTime > 0){ this.brew(); } } @@ -127,7 +127,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i >= 3 && ItemCoffee.getIngredientFromStack(stack) != null && (this.slots[i] == null || this.slots[i].stackSize < 1)) || (i == SLOT_COFFEE_BEANS && stack.getItem() == InitItems.itemCoffeeBean) || (i == SLOT_INPUT && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CUP.ordinal()); + return (i == SLOT_COFFEE_BEANS && stack.getItem() == InitItems.itemCoffeeBean) || (i == SLOT_INPUT && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CUP.ordinal()); } @Override From 3c8b3a7bfcdd02e5f712961664deb0af5268b7d2 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sat, 13 Jun 2015 12:52:22 +0200 Subject: [PATCH 14/29] -Changed Coffee Machine -Changed Machines not to lose Progress when Power is low --- .../inventory/ContainerCoffeeMachine.java | 12 ++-- .../actuallyadditions/items/ItemCoffee.java | 3 +- .../tile/TileEntityCanolaPress.java | 21 +++--- .../tile/TileEntityCoffeeMachine.java | 51 ++++++------- .../tile/TileEntityFurnaceDouble.java | 19 +++-- .../tile/TileEntityGrinder.java | 20 +++--- .../tile/TileEntityXPSolidifier.java | 67 ------------------ .../textures/blocks/blockCoffeeStage1.png | Bin 291 -> 220 bytes .../textures/blocks/blockCoffeeStage2.png | Bin 325 -> 294 bytes .../textures/blocks/blockCoffeeStage3.png | Bin 312 -> 354 bytes .../textures/blocks/blockCoffeeStage4.png | Bin 366 -> 396 bytes .../textures/blocks/blockCoffeeStage5.png | Bin 383 -> 474 bytes .../textures/blocks/blockCoffeeStage6.png | Bin 399 -> 562 bytes .../textures/blocks/blockFlaxStage1.png | Bin 308 -> 252 bytes .../textures/blocks/blockFlaxStage2.png | Bin 354 -> 274 bytes .../textures/blocks/blockFlaxStage3.png | Bin 377 -> 337 bytes .../textures/blocks/blockFlaxStage4.png | Bin 407 -> 388 bytes .../textures/blocks/blockFlaxStage5.png | Bin 433 -> 418 bytes .../textures/blocks/blockFlaxStage6.png | Bin 454 -> 436 bytes .../textures/items/itemCoffeeBeans.png | Bin 273 -> 490 bytes 20 files changed, 58 insertions(+), 135 deletions(-) delete mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java index 3fb6596b1..23ba136db 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.inventory.slot.SlotOutput; import ellpeck.actuallyadditions.items.InitItems; +import ellpeck.actuallyadditions.items.ItemCoffee; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; @@ -33,13 +34,7 @@ public class ContainerCoffeeMachine extends Container{ for (int i = 0; i < 4; i++){ for (int j = 0; j < 2; j++){ - this.addSlotToContainer(new Slot(machine, j+i*2+3, 125+j*18, 6+i*18){ - @Override - public int getSlotStackLimit(){ - return 1; - } - - }); + this.addSlotToContainer(new Slot(machine, j+i*2+3, 125+j*18, 6+i*18)); } } @@ -111,6 +106,9 @@ public class ContainerCoffeeMachine extends Container{ if(currentStack.getItem() == InitItems.itemMisc && currentStack.getItemDamage() == TheMiscItems.CUP.ordinal()){ this.mergeItemStack(newStack, TileEntityCoffeeMachine.SLOT_INPUT, TileEntityCoffeeMachine.SLOT_INPUT+1, false); } + if(ItemCoffee.getIngredientFromStack(newStack) != null){ + this.mergeItemStack(newStack, 3, 10, false); + } } if(slot <= hotbarEnd && slot >= hotbarStart){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java index 13a59170a..222ac2470 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -62,10 +62,11 @@ public class ItemCoffee extends ItemFood implements INameableItem{ } public ItemCoffee(){ - super(2, 2.0F, false); + super(8, 5.0F, false); this.setMaxDamage(ConfigIntValues.COFFEE_DRINK_AMOUNT.getValue()-1); this.setAlwaysEdible(); this.setMaxStackSize(1); + this.setNoRepair(); } public static Ingredient getIngredientFromStack(ItemStack stack){ diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java index 195384333..31fbf5d2c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCanolaPress.java @@ -35,16 +35,19 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - if(this.isCanola(0) && this.storage.getEnergyStored() >= energyUsedPerTick && this.mbProducedPerCanola <= this.tank.getCapacity()-this.tank.getFluidAmount()){ - this.currentProcessTime++; - if(this.currentProcessTime >= this.maxTimeProcessing){ - this.currentProcessTime = 0; + if(this.isCanola(0) && this.mbProducedPerCanola <= this.tank.getCapacity()-this.tank.getFluidAmount()){ + if(this.storage.getEnergyStored() >= energyUsedPerTick){ + this.currentProcessTime++; + this.storage.extractEnergy(energyUsedPerTick, false); + if(this.currentProcessTime >= this.maxTimeProcessing){ + this.currentProcessTime = 0; - this.slots[0].stackSize--; - if(this.slots[0].stackSize == 0) this.slots[0] = null; + this.slots[0].stackSize--; + if(this.slots[0].stackSize == 0) this.slots[0] = null; - this.tank.fill(new FluidStack(InitBlocks.fluidCanolaOil, mbProducedPerCanola), true); - this.markDirty(); + this.tank.fill(new FluidStack(InitBlocks.fluidCanolaOil, mbProducedPerCanola), true); + this.markDirty(); + } } } else this.currentProcessTime = 0; @@ -58,8 +61,6 @@ public class TileEntityCanolaPress extends TileEntityInventoryBase implements IE } } - if(this.currentProcessTime > 0) this.storage.extractEnergy(energyUsedPerTick, false); - if(this.tank.getFluidAmount() > 0){ WorldUtil.pushFluid(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, this.tank); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java index a0a445880..64de879ad 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java @@ -41,7 +41,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements if(!worldObj.isRemote){ this.storeCoffee(); - if(this.brewTime > 0){ + if(this.brewTime > 0 || this.worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ this.brew(); } } @@ -59,41 +59,34 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements public void brew(){ if(!worldObj.isRemote){ - if(this.slots[SLOT_INPUT] != null && this.slots[SLOT_INPUT].getItem() == InitItems.itemMisc && this.slots[SLOT_INPUT].getItemDamage() == TheMiscItems.CUP.ordinal() && this.slots[SLOT_OUTPUT] == null && this.storage.getEnergyStored() >= energyUsePerTick && this.coffeeCacheAmount >= this.coffeeCacheUsePerItem){ - this.brewTime++; - if(this.brewTime >= this.maxBrewTime){ - this.brewTime = 0; - ItemStack output = new ItemStack(InitItems.itemCoffee); - while(getFirstAvailIngredient() > 0){ - int ingr = this.getFirstAvailIngredient(); - ItemCoffee.Ingredient ingredient = ItemCoffee.getIngredientFromStack(this.slots[ingr]); - if(ingredient != null){ - ingredient.effect(output); + if(this.slots[SLOT_INPUT] != null && this.slots[SLOT_INPUT].getItem() == InitItems.itemMisc && this.slots[SLOT_INPUT].getItemDamage() == TheMiscItems.CUP.ordinal() && this.slots[SLOT_OUTPUT] == null && this.coffeeCacheAmount >= this.coffeeCacheUsePerItem){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ + this.brewTime++; + this.storage.extractEnergy(energyUsePerTick, false); + if(this.brewTime >= this.maxBrewTime){ + this.brewTime = 0; + ItemStack output = new ItemStack(InitItems.itemCoffee); + for(int i = 3; i < this.slots.length; i++){ + if(this.slots[i] != null && ItemCoffee.getIngredientFromStack((this.slots[i])) != null){ + ItemCoffee.Ingredient ingredient = ItemCoffee.getIngredientFromStack(this.slots[i]); + if(ingredient != null){ + ingredient.effect(output); + } + this.slots[i].stackSize--; + if(this.slots[i].stackSize <= 0) this.slots[i] = this.slots[i].getItem().getContainerItem(this.slots[i]); + } } - this.slots[ingr].stackSize--; - if(this.slots[ingr].stackSize <= 0) this.slots[ingr] = this.slots[ingr].getItem().getContainerItem(this.slots[ingr]); + this.slots[SLOT_OUTPUT] = output.copy(); + this.slots[SLOT_INPUT].stackSize--; + if(this.slots[SLOT_INPUT].stackSize <= 0) this.slots[SLOT_INPUT] = null; + this.coffeeCacheAmount -= this.coffeeCacheUsePerItem; } - this.slots[SLOT_OUTPUT] = output.copy(); - this.slots[SLOT_INPUT].stackSize--; - if(this.slots[SLOT_INPUT].stackSize <= 0) this.slots[SLOT_INPUT] = null; - this.coffeeCacheAmount -= this.coffeeCacheUsePerItem; } } else this.brewTime = 0; - - if(this.brewTime > 0) this.storage.extractEnergy(energyUsePerTick, false); } } - public int getFirstAvailIngredient(){ - for(int i = 3; i < this.slots.length; i++){ - if(this.slots[i] != null && this.slots[i].stackSize == 1 && ItemCoffee.getIngredientFromStack((this.slots[i])) != null){ - return i; - } - } - return 0; - } - @SideOnly(Side.CLIENT) public int getCoffeeScaled(int i){ return this.coffeeCacheAmount * i / this.coffeeCacheMaxAmount; @@ -127,7 +120,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i == SLOT_COFFEE_BEANS && stack.getItem() == InitItems.itemCoffeeBean) || (i == SLOT_INPUT && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CUP.ordinal()); + return (i >= 3 && ItemCoffee.getIngredientFromStack(stack) != null) || (i == SLOT_COFFEE_BEANS && stack.getItem() == InitItems.itemCoffeeBean) || (i == SLOT_INPUT && stack.getItem() == InitItems.itemMisc && stack.getItemDamage() == TheMiscItems.CUP.ordinal()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java index 1c30689b2..5cc3552f9 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java @@ -38,31 +38,30 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements boolean canSmeltOnFirst = this.canSmeltOn(SLOT_INPUT_1, SLOT_OUTPUT_1); boolean canSmeltOnSecond = this.canSmeltOn(SLOT_INPUT_2, SLOT_OUTPUT_2); - if(this.storage.getEnergyStored() >= energyUsePerTick){ - if(canSmeltOnFirst){ + + if(canSmeltOnFirst){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ this.firstSmeltTime++; if(this.firstSmeltTime >= maxBurnTime){ this.finishBurning(SLOT_INPUT_1, SLOT_OUTPUT_1); this.firstSmeltTime = 0; } } - else this.firstSmeltTime = 0; + } + else this.firstSmeltTime = 0; - if(canSmeltOnSecond){ + if(canSmeltOnSecond){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ this.secondSmeltTime++; if(this.secondSmeltTime >= maxBurnTime){ this.finishBurning(SLOT_INPUT_2, SLOT_OUTPUT_2); this.secondSmeltTime = 0; } } - else this.secondSmeltTime = 0; - } - else{ - this.firstSmeltTime = 0; - this.secondSmeltTime = 0; } + else this.secondSmeltTime = 0; - if(this.firstSmeltTime > 0 || this.secondSmeltTime > 0) this.storage.extractEnergy(energyUsePerTick, false); + if(this.storage.getEnergyStored() >= energyUsePerTick && this.firstSmeltTime > 0 || this.secondSmeltTime > 0) this.storage.extractEnergy(energyUsePerTick, false); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index 19d4fcf0c..f6ec5bc46 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -82,33 +82,31 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg boolean canCrushOnSecond = false; if(this.isDouble) canCrushOnSecond = this.canCrushOn(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2); - if(this.storage.getEnergyStored() >= energyUsePerTick){ - if(canCrushOnFirst){ + if(canCrushOnFirst){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ this.firstCrushTime++; if(this.firstCrushTime >= maxCrushTime){ this.finishCrushing(SLOT_INPUT_1, SLOT_OUTPUT_1_1, SLOT_OUTPUT_1_2); this.firstCrushTime = 0; } } - else this.firstCrushTime = 0; + } + else this.firstCrushTime = 0; - if(this.isDouble){ - if(canCrushOnSecond){ + if(this.isDouble){ + if(canCrushOnSecond){ + if(this.storage.getEnergyStored() >= energyUsePerTick){ this.secondCrushTime++; if(this.secondCrushTime >= maxCrushTime){ this.finishCrushing(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2); this.secondCrushTime = 0; } } - else this.secondCrushTime = 0; } - } - else{ - this.firstCrushTime = 0; - this.secondCrushTime = 0; + else this.secondCrushTime = 0; } - if(this.firstCrushTime > 0 || this.secondCrushTime > 0) this.storage.extractEnergy(energyUsePerTick, false); + if(this.storage.getEnergyStored() >= energyUsePerTick && this.firstCrushTime > 0 || this.secondCrushTime > 0) this.storage.extractEnergy(energyUsePerTick, false); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java deleted file mode 100644 index 6cceea975..000000000 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityXPSolidifier.java +++ /dev/null @@ -1,67 +0,0 @@ -package ellpeck.actuallyadditions.tile; - -import ellpeck.actuallyadditions.items.InitItems; -import ellpeck.actuallyadditions.items.ItemSpecialDrop; -import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; -import ellpeck.actuallyadditions.network.gui.IButtonReactor; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -public class TileEntityXPSolidifier extends TileEntityInventoryBase implements IButtonReactor{ - - public TileEntityXPSolidifier(){ - super(12, "xpSolidifier"); - } - - public int getFirstSlot(int itemsNeeded){ - for(int i = 0; i < this.slots.length; i++){ - if(this.slots[i] == null || this.slots[i].stackSize <= this.slots[i].getMaxStackSize()-itemsNeeded){ - return i; - } - } - return -1; - } - - @Override - public boolean canUpdate(){ - return false; - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack stack){ - return false; - } - - @Override - public boolean canInsertItem(int slot, ItemStack stack, int side){ - return this.isItemValidForSlot(slot, stack); - } - - @Override - public boolean canExtractItem(int slot, ItemStack stack, int side){ - return true; - } - - @Override - public void onButtonPressed(int buttonID, EntityPlayer player){ - if(!player.worldObj.isRemote){ - if(buttonID == 0 && player.experienceTotal >= ItemSpecialDrop.SOLID_XP_AMOUNT){ - int slot = this.getFirstSlot(1); - if(slot >= 0){ - if(this.slots[slot] != null){ - this.slots[slot].stackSize++; - } - else this.slots[slot] = new ItemStack(InitItems.itemSpecialDrop, 1, TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()); - player.addExperience(ItemSpecialDrop.SOLID_XP_AMOUNT); - } - } - else if(buttonID == 1 && player.experienceTotal >= 64*ItemSpecialDrop.SOLID_XP_AMOUNT){ - int slot = this.getFirstSlot(64); - if(slot >= 0){ - this.slots[slot] = new ItemStack(InitItems.itemSpecialDrop, 64, TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal()); - player.addExperience(64*ItemSpecialDrop.SOLID_XP_AMOUNT); - } - } - } - } -} diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage1.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage1.png index 6e893add6db867ce1abcf702b817683c1a0a717e..52a8b8b8296f30744f665dc45c3aa7d3940d4560 100644 GIT binary patch delta 192 zcmZ3?bcb<*NFdgV zpN)r)U;3@*wrrq~Y-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$4itCr zba4!^IGvmz!MZp>M1ZBrG3o!-L$3cH2On;-yxwBZ^S|EcPwJ87Eu8aJ{#U!X^~Imz mN!i^nb@o)pFXD0X1`G`GC%OGInY27Wws^YwxvX)2bwWdkI*DbUr;kNGUBN7f0EE`rH)#BJBn9`BHo$W@M zfb?{b3hBAGrwGPHtl$+pzD#Vlf(Qfeulf6rik~{XY+55D!;6kz4o9@VMFO41;OXk; Kvd$@iu?YaqLS8rk diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage2.png index 8a5e090ddb7ccd7b37e110f0e8ece31374bbad34..90274425f8c24b3c99179ef793949e32ee5245bf 100644 GIT binary patch delta 267 zcmX@gw2WzjNFdgV zpN)r)UsXqA^#P!eY-UJAiF1B#Zfaf$kjuc}T$GwvlA5AWo>`Ki;O^-gkfN8$4ixY5 zba4!^IQ@2lE!QCj377lt)OSZ@Tu@rR;gia|`U8h=-tc%Qn0-+Bhxi8W7kQtaGTn68 zB~tlTx-BswEsbl&lpFFzv42~St10Q;IY0m28>P?-9YMOvW?HWmPO_S*?h)(|aPp4a zbLK_U>!+EUqCSMxIm_Qr)ZF@LUq!=RL;3HF4X0&pyD{#Vd+*ltmkh0ol-{vqJ8T8H O*VEO{g=L*nLK6U0^<+!{ delta 298 zcmV+_0oDGd0>uK5B!2{FK}|sb0I`n?{9y$E000SaNLh0L01FWS01FWTe`H^g00007 zbV*G`2j2w`6bmQf?)-270009VKdcbs zHR}$1*gXEsd?ra!lMvPjVT};hh+!_`B!uIuk0Hw`PnnJ0g+KLU^3IbecC# zqQh-1CnBGP&`te)727?`iO6Rm9G<&qKF{0O?jhu}80K;c5Ab%se?4CzT>gc>j_9pT wM|3qGu{1^keL0B=I^00e?B zfW=|>08m`1DDAb2Xh0oFgYL-LnPg@bs89i5zYe3BPxgx=a1~SoxNII;E!UCVWs7Pt zL&^!t1k8{ySa_t<8alEW34~4tl>;mxND`>W`movrc5Xlj4k$vZa-@uK+}+AoIP9-X zJ{hDEu!KNjlR)}w;mNo|{b~E#eK_}6sRSQHJcA4iPjBV3(>9<|BYxnx7APw`=k;Ct Zg*VCTJuL24+IIi|002ovPDHLkV1lOzdK3Tv delta 285 zcmaFFw1a7aNV~B-+ z@{j-j?Oi2SC;SjnW-Dp%mE}kl<(ZSgarGEOQay9%#Egd2xf0FE+j&l?{`WoY@~=6j z1+0c8(`eNr=G%NmJWrHzUO4~_c;J+~A?XUtaxBiS?-@E_+ d{}+>FSgn|Kc0;SeR-l6!JYD@<);T3K0RTinVmJT* diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage4.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage4.png index b456db29d879fe9b936ecb851f36bddb1a372c2c..60fb42c24eb987542a6bfe42975e509edf957fe6 100644 GIT binary patch delta 369 zcmV-%0gnFe0*nKYB!32COGiWiHUK&R7kv#A*Z=?k32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`G}lI8QFe82|tP9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0PsmfK~y-)?UA8U!(b4Ezx)3*X<9OvreKiFFn^$Ms5)K&i>Tn47&K3V z1;+!B!Gr;tCi!!RPnZ-GhLyWJcYC++kH3d}M;@7 za-ExOjm4`ct{?D#x@IibWvQ zhSr9kc(RR07-|FwQX#KZxRn5e|S$jHFZiDR%aFn@4?P8wh zS`}&|J^A(Z`KNAzh|Gd3UfxZpkLLr0>~BjAKi)ofDJ{U&^+y4KnRs}t!m(R3iBOn{ ztj}T~P=uuBzKEP+OjLU^@4d)qU)yLpb(`3oB2iZj*w5`H7Euo-3eX*HyIKqcVE+P% zM9&8bu^s3-X-tWER633=(ZUr;^mah3y}gHwu^rS!3bCN;#hD87X diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage5.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoffeeStage5.png index e2cbbc9298ea82bae193b53d6c0fe0e7568151c4..794403d4d1b287a1544bfc498424c3e1ab3d56cb 100644 GIT binary patch delta 448 zcmV;x0YCo#0@?$RB!32COGiWiHUK&R7kv#A*Z=?k32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`G}m216CpEC2ui9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0X|7YK~y-)?UK7rRZ$RzzgcVT%V7f@+e0AMJgfSK3Sa@~3 zdk+%sIwcxO6@L-ocC!!=q!nbT?B<%J%Cax41q6lpO~ueCKl@Dit=Ir=!%;1usys<- z{R-RJvza~4dknDA&}5{j#0}V5Ili4-%36Sk;6zA`(O$!g)r`&u@NnBILtU6W;@8tl zIp2?e7Tbk`MN2yhsTj>xU_iN;=l}ZyfDdo?>_;70&N-C)T=LoHtLo8T_U2u0uiy7J qr3q8XIyj0>H<<*?x*BwH0R95Mn}SwQcu@bfwtX#0Lw6w6;%467BSbundtvrI@5xn1+FJ{6d z%!06iM_%5(`N?F1h|Gd3Ufz9Zm*)e8>~G7s{rK?Q<*)#cu0ImoyG}5}506zij%zv* z64R0TT2u#3LQsESr0Q9#d|C)p9~8rDn@p#1ld98E(xV3Kb*sQ4#)XLlRJYdyoRwFB z3i}EKvU@&Ih+VBf)mcNNq7IS!lhFDsT#-OK1Gs9fw>l`MWcF$$Z4-6|NnLGm#xOALQ z%Y-PgXi$6>2&Iw_JSP_{Ll@}m#Jqm^RmL3%L@FG`9)B^0aNxPQJIkzbrv+ZMMjR(+ z7jZg+cTe_2HrtATmddRUbD)rUC22;KBhSZHpt~UOV#*rdKK>?RVC(6g*dRQ=IK+7Y z1GZ+dv6=tV{?tnZxN&<)e;k&C2=Wz~c!mFrE7#h(alNfo8dvoh#TM(Ui&O$?Nd%$N b06zgv&=Q?Xl|s%^00000NkvXXu0mjfe~IAx delta 372 zcmV-)0gL{!1djudB!2{FK}|sb0I`n?{9y$E000SaNLh0L01FWS01FWTe`H^g00007 zbV*G`2j2w`6E-^TPtKA6000d5s|*~<9^#ePJ@X2g<|mZsKa=bbRd!KWv<(Yx3|rZ7T~IyP@tzS*hHR9o4fo()~|GntIIt)Aw5hp(l(K<3jIQOTZ*Lh?I8xV{XE)7O># zJ{u3Ok%Gyal`DWkvY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=}J5W5q z)5S5w;&gI?1nc623g*Wy7yqkOD*cy~kdQbNX?*nm>TCpPMc|M~rK{>%IJY;Bus^CeCiHMCCdZ0r=Qk6>gl*eRA? T%2y6_H3NgEtDnm{r-UW|1=CI2 delta 281 zcmeyvxP@tgNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x37`TN%nDNrx zx<5cc_7YEDSN8j?{35*EZ8_$mKp}||*NBqf{Irtt#G+J&g2c?c61}|C5(N`I13lB! zR-;s)nn|86jv*HQ$r7xK8KgPpWc-jnr6Si-f6hFm;LWr|j`*Z6_qX^wv7gX(N`R9o zEz3Y6^kZZ0_BF!H7Xu_Y7$O;%6-*_>8gf`YE6TDPR2|zCm?yBF&~w?&kfZFul)})% zJC%u9K>lXy3$X^)Ik%?>n(16=JLSNj$SvU@wV>{J7LfITVa12~e`4_({K5&Rj13qV Z{F8-(9Ck!i{06#@!PC{xWt~$(69C&uSdah! diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage2.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage2.png index cea1ba434497b4ebcd8245c27472d56233401b61..9a48e693b7abfa41a8d957cd5c4b2ea62e5859db 100644 GIT binary patch delta 246 zcmaFFG>K_~N{XE)7O># zJ{u3Op>o@a)fa(6vY8S|xv6<2KrRD=b5UwyNotBhd1gt5g1e`0K#E=}J5apL z)5S5w;`G}I8@ZYTcwGHIzj~zdY1%K|xwrU^=GO~;5q`D2Tp;lCqbnC1Sk2Fi>@aT^ zu&}h8R9?LKe$4i%xnEPXB|c5Ot}b;T#P5w*i^2*uhLGI-2|x5+@SL}s)pEMNen)w$ s?XQeD_dN!x9^Jd&b8m{_2><^_G-|D!XwYGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x37`TN%nDNrx zx<5cc_7YEDSN8j?{36`ykKX+$018QzxJHx&=ckpFCl;kL6eMQmmFVTAmMEC$8R(g& zwi=}Z)g172aSXBWPyX@$zrCx(Y6VR&u7@!ow2>QIqcHD5CXG)wL=G`{*p%#3Y);8U;J93yZ8+LK* zXWWs~#JJ$k|3A9>63l$~Bjk<&6<^eAU@V!Pz_6S9pD_c&DNoP&)7R|13-k?xr>mdK II;Vst0QOaM3;+NC diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage3.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage3.png index 892529aa2208a637ae2ea257c08f5da89fd929d2..0b4544dd166b18a01188f646a10ce740ba1d8f87 100644 GIT binary patch delta 310 zcmey#bdhO-N{XE)7O># zJ{u3Ofd&VoGe}4_GbEzKIX^cyHLnE7WngeFN=+yU%MoU=z+SQIBr2->hY)FZb(IX_+VMnvRK0q@;Ek_|MgpQIffaZC&q|T})3S%OCJ6UofqBs%H%LoTsaw%Q~lo FCIA>bcAWqK delta 350 zcmcb}^pk0VNGZx^prw85kH?(j9#r85lP9bN@+X1@buyJR*x37`TN%nDNrx zx<5cc_7YEDSN8j?{34v968z_jfI<=_t`Q}{`DrEPiAAXl1&Nt?C3<V|VA5AYri4WFs)G3`i68iV=-g+nt{fuasuZ2Xgw zs>A2sDw@|K#~}B&mU+8?0LL^I*;*Hi`rq7{LM2}WAI=fh;j}t`+~2gB!Tr_0o!g9k tKY5gXWZP-%t+k8s!^9^S=da$wu=w#Y5vIbf_driFc)I$ztaD0e0sw@VgM0u0 diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage4.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage4.png index 56e5e111bc1282015c09ded8e4c13dcc60b5f8b7..a9aff1f149f8d7d6bf0d2967ceb26c360dc9db50 100644 GIT binary patch delta 361 zcmV-v0ha!k1B3&RB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`G`@COi01zyJUM9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0O(0XK~y-)?U6A`15pr$zj^DjB%lNgkzlog5P!>%(oO;u=WbVrbumr delta 380 zcmV-?0fYX81D6AkB!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000XT z000XT0n*)m`~Uy|2XskIMF-yn4-^C+O>|fx0000ObVXQnQ*UN;cVTj60B~VxZgehg zWpp4kE-)@NWrZ?j0002>NklE*MHBBIn{^<^fBNGl(6xtu0pRiKZxo4{RAXv0c^E`97U z!MDE6}BEyQ~&?~9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0R~A#K~y-)-I2RWgFz65zuA9L3o#lI5p6<1L4WXqqD{J7zz}R~?b2GP zh2SGt*$9@tkqDyCVBv-2mn4v^I~F0)K>kgzbgJc?IcLu7!2hdKC944C(yIQ(EBQ4o z7Y8u_Gax?5>c>h9z{~zCg~Lo=5HB|QTxxK%yP?4Zx#Q)2!`9i{&-*;Bo0q9@0)Tp| z!S+d70jxw0V1MsoL5&k0uj(?=;OVv|-gO5V+e0;exOtahiOn!jMA$i<@3foV0=Tx$ zB&{q-#CmmBC#NHf?Y7)szm1=u=j>V@^_nOS8a&_CL<}GjyqXD--YM$z?*{r6`lT@p m#0q{y0vjZ!glHl-gKra!Pf(P}2KoR1002ovPDHLkU;%>BfuxuK delta 407 zcmV;I0cifB1F-{;B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000XT z000XT0n*)m`~Uy|2XskIMF-yn4-^3sPO{M10000ObVXQnQ*UN;cVTj60B~VxZgehg zWpp4kE-)@NWrZ?j0003GNkllLU% zR3I@G4H892I08rDG+biXH|<-t?IIc`ne5Me^WJo8MC7jwUiQi0WuI&u()4AQCeY3- zdyCICqFwZpb!1t7IkUS(W?78Q{t?UkI25}o><2({XoLWSRA76Z>Sc0?WN{i9yVh-$ zW1fQ(<>Gwcrhjw-a7FXFn5sKOIFS#AI2C{+iYRaoC%~KtV2D!zK&$ga9WiclpJ_8d zxYG$M19hy`1h#>}0-gB10Kv5%+fDH6FZcrBLZ7C}d|ehoPT)}I!{V$03|rI!_H+X5 zoaz8~cy4s>Ca9g&(Lei6A+9q4l@T4MI-2)lK4bgu1Q0=Vw3Pq=002ovPDHLkV1leX BqoM!+ diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage6.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockFlaxStage6.png index 65f70d2592135a08bab0eff731cc3138e7fd8746..d899281660a53b1dda1d2b1acc9ea00521c6448a 100644 GIT binary patch delta 410 zcmV;L0cHNi1GEE>B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`G`;BLvekhyVZp9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0T@X{K~y-)t&+h?0#Ou(|8qyIg^QT6r)V+bM1Q?dE6KqKqD6(aaN8y# z2r_cf#;~C0h!W{7O5H@LGxN8&rh|4(rL(%6bN=t1|8Ri+jN4L!Kkw_KIw$LQl_wg- zHz)UW^EUmWLjc&^&$3p2U{dTC9o9}C&5-JGonFBv0Bjv(>F(O2W-o9?@R{KSV^LC& zGlBI*&jKz}!jB>;f!!*wG5{lh6h>#8GRPj@Rz=NJ<&=N~c`Knn%_p2Pm928DgI zbukq-cGj5ASWrV7&u8!RPoU=p!mk*NXcW%`yj8m*GG64u001C?Xu#zFZr)}*Amop` zF#?*GZ5gftUg9DbvY=7|MqGXe)`}pts_=TzHahtRk`o+gDZEoCr~m)}07*qoM6N<$ Eg7j;ue*gdg delta 428 zcmV;d0aO081I7c8B!2;OQb$4nuFf3k00004XF*Lt006O%3;baP00009a7bBm000XT z000XT0n*)m`~Uy|2XskIMF-yn4-+;z?oZB=0000ObVXQnQ*UN;cVTj60B~VxZgehg zWpp4kE-)@NWrZ?j0003bNklZ5QcjK6hYzEkbkU#1cBVFLXdzUIIaK+ z@dOe9f~-Ul5{|G(;51yK^c(ogKnjjYn!fh`=AW77g&1RA)9EQ~_j75@=jZ6T90=?6 zqv)3y)^>a6!g${fKbvNl96M$JV6+QBaU@~@X9mMv%PvXoEgNC<*S@7)D^?X;G_F(C z@(9_WyQteme}B`8sf&P#I`SY~GJoLAfQpC+`lb@FIsz%M27r%>RHM zQLqO&&;AGYZTE5}fr>f0WbcM0_p>hB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`G`q7gm(M!TfWL4P0`+WQI7 z6hwcZ$uZg*8=9ILTa1W?E_k8T4tYWIbPk^LwFOZ`Lu1eS!UONi3;#$zg^Q_#aAJ{} ziL!rqBK=yhvAQTarj1s;hW6Sf6B|eId9k}>b`FlDZw1?%YvQh0B^eo^-qtz0xJDUJ zxGxk@dS&7hBY)gi>#QuK5yE0Odn|nj)|cl*kL;mTQEArdJU3b_C1adlJ)n0@!l5Dj z-hLj{20_I`DBxvwD$3SgR3L8w0Uom#o=@H!nNCWD;j?zp@yNdE`^L*4;s=Y9;1sm)OU0000;TIJEM5ofPpn0gqpNd{`wfu>*u%gcf+{vig2SO0+f#!!8uG?BF^aA>5- v=TUi6kYSmELY^)pXwFwjw;(LZ+J|i~1O;jm7qvE;00000NkvXXu0mjfy=h&W From d22e36a215436a794f7173718b848d0759f96097 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sat, 13 Jun 2015 14:39:46 +0200 Subject: [PATCH 15/29] -Updated Version Checking --- .../ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java | 2 +- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index a8218c9d3..4daeb5946 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -15,7 +15,7 @@ import net.minecraftforge.fluids.*; public class TileEntityOilGenerator extends TileEntityInventoryBase implements IEnergyProvider, IFluidHandler{ - public EnergyStorage storage = new EnergyStorage(30000); + public EnergyStorage storage = new EnergyStorage(50000); public FluidTank tank = new FluidTank(2*FluidContainerRegistry.BUCKET_VOLUME); diff --git a/update/changelog.txt b/update/changelog.txt index 880dbac5f..202f6eb82 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Fluid Breakers & Placers and Phantom Energyface, Liquiface, Breaker & Placer \ No newline at end of file +Phantom Boosters, Coffee, a Lava Factory and Flax \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index 14ed8b098..e7fde1fa6 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.3 \ No newline at end of file +1.7.10-0.0.5.4 \ No newline at end of file From fffa40e90b71c9409d3a4c8a8e5815c7e66ff24c Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sat, 13 Jun 2015 20:39:54 +0200 Subject: [PATCH 16/29] -Made the Coffee Machine less OP --- build.gradle | 2 +- .../config/values/ConfigIntValues.java | 6 +-- .../crafting/MiscCrafting.java | 2 +- .../actuallyadditions/items/ItemCoffee.java | 52 ++++++++++++------- .../nei/CoffeeMachineRecipeHandler.java | 12 +++-- .../tile/TileEntityCoffeeMachine.java | 9 ++-- .../actuallyadditions/util/ModUtil.java | 2 +- .../assets/actuallyadditions/lang/en_US.lang | 6 ++- src/main/resources/mcmod.info | 2 +- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 11 files changed, 60 insertions(+), 37 deletions(-) diff --git a/build.gradle b/build.gradle index 6c119de8a..ce3772547 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.4" +version = "1.7.10-0.0.5.5" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index bb671f483..f5b9fab72 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -82,9 +82,9 @@ public enum ConfigIntValues{ LAVA_FACTORY_ENERGY_USED("Lava Factory: Energy Used", ConfigCategories.MACHINE_VALUES, 150000, 10, 3000000, "The amount of Energy used by the Lava Factory per Bucket of Lava produced"), LAVA_FACTORY_TIME("Lava Factory: Production Time", ConfigCategories.MACHINE_VALUES, 200, 5, 10000, "The amount of time it takes for the Lava Factory to produce one Bucket"), - COFFEE_MACHINE_ENERGY_USED("Coffee Machine: Energy Used", ConfigCategories.MACHINE_VALUES, 150, 10, 3000, "The amount of Energy used by the Coffee Machine per Tick"), - COFFEE_CACHE_ADDED_PER_ITEM("Coffee Machine: Coffee added per Item", ConfigCategories.MACHINE_VALUES, 1, 1, 300, "The amount of Coffee added by one Coffee Item in the Coffee Machine"), - COFFEE_CACHE_USED_PER_ITEM("Coffee Machine: Coffee used per Item", ConfigCategories.MACHINE_VALUES, 10, 1, 300, "The amount of Coffee used to brew one Coffee in the Coffee Machine"), + COFFEE_MACHINE_ENERGY_USED("Coffee Machine: Energy Use", ConfigCategories.MACHINE_VALUES, 150, 10, 3000, "The amount of Energy used by the Coffee Machine per Tick"), + COFFEE_CACHE_ADDED_PER_ITEM("Coffee Machine: Coffee added per Cup", ConfigCategories.MACHINE_VALUES, 1, 1, 300, "The amount of Coffee added by one Coffee Item in the Coffee Machine"), + COFFEE_CACHE_USED_PER_ITEM("Coffee Machine: Coffee used per Cup", ConfigCategories.MACHINE_VALUES, 10, 1, 300, "The amount of Coffee used to brew one Coffee in the Coffee Machine"), COFFEE_MACHINE_TIME_USED("Coffee Machine: Time to Brew", ConfigCategories.MACHINE_VALUES, 500, 10, 10000, "The amount of time the Coffee Machine takes to brew a Coffee"), COFFEE_DRINK_AMOUNT("Coffee: Drink Amount", ConfigCategories.OTHER, 4, 1, 100, "How often a Coffee can be drunk from"); diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java index 0ae0905ce..bcfcebe14 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/MiscCrafting.java @@ -39,7 +39,7 @@ public class MiscCrafting{ //Knife Blade if(ConfigCrafting.KNIFE_BLADE.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.KNIFE_BLADE.ordinal()), - "KF", + "K", "F", 'K', "ingotIron", 'F', new ItemStack(Items.flint))); } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java index 222ac2470..17c36aaf2 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -30,14 +30,14 @@ public class ItemCoffee extends ItemFood implements INameableItem{ public static ArrayList ingredients = new ArrayList(); public static void initIngredients(){ - registerIngredient(new Ingredient(new ItemStack(Items.milk_bucket), null){ + registerIngredient(new Ingredient(new ItemStack(Items.milk_bucket), null, 0){ @Override - public void effect(ItemStack stack){ + public boolean effect(ItemStack stack){ PotionEffect[] effects = getEffectsFromStack(stack); ArrayList effectsNew = new ArrayList(); if(effects != null && effects.length > 0){ for(PotionEffect effect : effects){ - if(effect.getAmplifier() > 0) effectsNew.add(new PotionEffect(effect.getPotionID(), effect.getDuration()+150, effect.getAmplifier()-1)); + if(effect.getAmplifier() > 0) effectsNew.add(new PotionEffect(effect.getPotionID(), effect.getDuration()+120, effect.getAmplifier()-1)); } stack.setTagCompound(new NBTTagCompound()); if(effectsNew.size() > 0){ @@ -46,19 +46,20 @@ public class ItemCoffee extends ItemFood implements INameableItem{ } } this.effects = null; + return true; } @Override public String getExtraText(){ return StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.extra.milk"); } }); - registerIngredient(new Ingredient(new ItemStack(Items.sugar), new PotionEffect[]{new PotionEffect(Potion.moveSpeed.getId(), 30, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.magma_cream), new PotionEffect[]{new PotionEffect(Potion.fireResistance.getId(), 10, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.fish, 1, 3), new PotionEffect[]{new PotionEffect(Potion.waterBreathing.getId(), 15, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.golden_carrot), new PotionEffect[]{new PotionEffect(Potion.nightVision.getId(), 60, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.ghast_tear), new PotionEffect[]{new PotionEffect(Potion.regeneration.getId(), 10, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.blaze_powder), new PotionEffect[]{new PotionEffect(Potion.damageBoost.getId(), 15, 0)})); - registerIngredient(new Ingredient(new ItemStack(Items.fermented_spider_eye), new PotionEffect[]{new PotionEffect(Potion.invisibility.getId(), 25, 0)})); + registerIngredient(new Ingredient(new ItemStack(Items.sugar), new PotionEffect[]{new PotionEffect(Potion.moveSpeed.getId(), 30, 0)}, 4)); + registerIngredient(new Ingredient(new ItemStack(Items.magma_cream), new PotionEffect[]{new PotionEffect(Potion.fireResistance.getId(), 20, 0)}, 1)); + registerIngredient(new Ingredient(new ItemStack(Items.fish, 1, 3), new PotionEffect[]{new PotionEffect(Potion.waterBreathing.getId(), 10, 0)}, 1)); + registerIngredient(new Ingredient(new ItemStack(Items.golden_carrot), new PotionEffect[]{new PotionEffect(Potion.nightVision.getId(), 30, 0)}, 1)); + registerIngredient(new Ingredient(new ItemStack(Items.ghast_tear), new PotionEffect[]{new PotionEffect(Potion.regeneration.getId(), 5, 0)}, 3)); + registerIngredient(new Ingredient(new ItemStack(Items.blaze_powder), new PotionEffect[]{new PotionEffect(Potion.damageBoost.getId(), 15, 0)}, 4)); + registerIngredient(new Ingredient(new ItemStack(Items.fermented_spider_eye), new PotionEffect[]{new PotionEffect(Potion.invisibility.getId(), 25, 0)}, 1)); } public ItemCoffee(){ @@ -104,16 +105,27 @@ public class ItemCoffee extends ItemFood implements INameableItem{ stack.setTagCompound(tag); } - public static void addEffectToStack(ItemStack stack, Ingredient ingredient){ + public static boolean addEffectToStack(ItemStack stack, Ingredient ingredient){ + boolean worked = false; if(ingredient != null){ PotionEffect[] effects = ingredient.getEffects(); if(effects != null && effects.length > 0){ for(PotionEffect effect : effects){ - if(hasEffect(stack, effect)) addEffectProperties(stack, effect, false, true); - else addEffectToStack(stack, effect); + PotionEffect effectHas = getSameEffectFromStack(stack, effect); + if(effectHas != null){ + if(effectHas.getAmplifier() < ingredient.maxAmplifier-1){ + addEffectProperties(stack, effect, false, true); + worked = true; + } + } + else{ + addEffectToStack(stack, effect); + worked = true; + } } } } + return worked; } public static PotionEffect[] getEffectsFromStack(ItemStack stack){ @@ -133,14 +145,14 @@ public class ItemCoffee extends ItemFood implements INameableItem{ return effects.size() > 0 ? effects.toArray(new PotionEffect[effects.size()]) : null; } - public static boolean hasEffect(ItemStack stack, PotionEffect effect){ + public static PotionEffect getSameEffectFromStack(ItemStack stack, PotionEffect effect){ PotionEffect[] effectsStack = getEffectsFromStack(stack); if(effectsStack != null && effectsStack.length > 0){ for(PotionEffect effectStack : effectsStack){ - if(effect.getPotionID() == effectStack.getPotionID()) return true; + if(effect.getPotionID() == effectStack.getPotionID()) return effectStack; } } - return false; + return null; } public static void applyPotionEffectsFromStack(ItemStack stack, EntityPlayer player){ @@ -233,10 +245,12 @@ public class ItemCoffee extends ItemFood implements INameableItem{ public final ItemStack ingredient; protected PotionEffect[] effects; + public final int maxAmplifier; - public Ingredient(ItemStack ingredient, PotionEffect[] effects){ + public Ingredient(ItemStack ingredient, PotionEffect[] effects, int maxAmplifier){ this.ingredient = ingredient.copy(); this.effects = effects; + this.maxAmplifier = maxAmplifier; } public String getExtraText(){ @@ -247,8 +261,8 @@ public class ItemCoffee extends ItemFood implements INameableItem{ return this.effects; } - public void effect(ItemStack stack){ - ItemCoffee.addEffectToStack(stack, this); + public boolean effect(ItemStack stack){ + return ItemCoffee.addEffectToStack(stack, this); } } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java index cd1cf50b6..1d134e88e 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CoffeeMachineRecipeHandler.java @@ -37,6 +37,7 @@ public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ public PositionedStack result; public PositionedStack ingredientStack; public String extraText; + public int maxAmp; public CachedCoffee(ItemCoffee.Ingredient ingredient){ this.cup = new PositionedStack(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CUP.ordinal()), 45, 39); @@ -44,6 +45,7 @@ public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ this.ingredientStack = new PositionedStack(ingredient.ingredient.copy(), 90, 21); this.setupResult(ingredient); this.extraText = ingredient.getExtraText(); + this.maxAmp = ingredient.maxAmplifier; } public void setupResult(ItemCoffee.Ingredient ingredient){ @@ -139,10 +141,14 @@ public class CoffeeMachineRecipeHandler extends TemplateRecipeHandler{ CachedCoffee cache = (CachedCoffee)this.arecipes.get(recipe); if(cache.extraText != null){ - GuiDraw.drawString(StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.special"), 2, 6, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); - GuiDraw.drawString(cache.extraText, 2, 18, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + GuiDraw.drawString(StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.special") + ":", 2, 4, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + GuiDraw.drawString(cache.extraText, 2, 16, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + } + GuiDraw.drawString(StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.shift"), 1, 75, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); + + if(cache.maxAmp > 0){ + GuiDraw.drawString(StatCollector.translateToLocal("container.nei." + ModUtil.MOD_ID_LOWER + ".coffee.maxAmount") + ": " + cache.maxAmp, 2, 28, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); } - GuiDraw.drawString("[SHIFT]!", 1, 75, StringUtil.DECIMAL_COLOR_GRAY_TEXT, false); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java index 64de879ad..75a9950e6 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java @@ -67,13 +67,14 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements this.brewTime = 0; ItemStack output = new ItemStack(InitItems.itemCoffee); for(int i = 3; i < this.slots.length; i++){ - if(this.slots[i] != null && ItemCoffee.getIngredientFromStack((this.slots[i])) != null){ + if(this.slots[i] != null){ ItemCoffee.Ingredient ingredient = ItemCoffee.getIngredientFromStack(this.slots[i]); if(ingredient != null){ - ingredient.effect(output); + if(ingredient.effect(output)){ + this.slots[i].stackSize--; + if(this.slots[i].stackSize <= 0) this.slots[i] = this.slots[i].getItem().getContainerItem(this.slots[i]); + } } - this.slots[i].stackSize--; - if(this.slots[i].stackSize <= 0) this.slots[i] = this.slots[i].getItem().getContainerItem(this.slots[i]); } } this.slots[SLOT_OUTPUT] = output.copy(); diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 77b97f7b0..886a6a91e 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.4"; + public static final String VERSION = "1.7.10-0.0.5.5"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 12c6a1558..308f4baf9 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -456,8 +456,10 @@ container.nei.actuallyadditions.ballOfHair.name=Ball Of Hair Usage container.nei.actuallyadditions.compost.name=Compost container.nei.actuallyadditions.coffee.name=Coffee Machine -container.nei.actuallyadditions.coffee.special=Special Feature: -container.nei.actuallyadditions.coffee.extra.milk=+02:30, -1 Level +container.nei.actuallyadditions.coffee.special=Special Feature +container.nei.actuallyadditions.coffee.maxAmount=Max Amount +container.nei.actuallyadditions.coffee.shift=[SHIFT]! +container.nei.actuallyadditions.coffee.extra.milk=+01:00, -1 Level info.actuallyadditions.update.generic.desc=[{"text":"There is an "},{"text":"Update ","bold":"true"},{"text":"for ","bold":"false"},{"text":"Actually Additions ","color":"dark_green","bold":"true"},{"text":"available!","color":"none","bold":"false"}] info.actuallyadditions.update.versionComp.desc=[{"text":"You have Version "},{"text":"%s","color":"dark_red","italic":"false"},{"text":", the newest one is ","color":"none","italic":"false"},{"text":"%s","color":"dark_green","underlined":"false"},{"text":"!","color":"none","underlined":"false"}] diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index 29582c687..c3fd7d4bb 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -3,7 +3,7 @@ "modid": "ActuallyAdditions", "name": "Actually Additions", "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.5.4", + "version": "0.0.5.5", "mcversion": "1.7.10", "url": "https://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", diff --git a/update/changelog.txt b/update/changelog.txt index 202f6eb82..5af4fe492 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Phantom Boosters, Coffee, a Lava Factory and Flax \ No newline at end of file +Made the Coffee Machine less OP :P \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index e7fde1fa6..c931343ef 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.4 \ No newline at end of file +1.7.10-0.0.5.5 \ No newline at end of file From 9e5edfe2f8dbc972410099fc8f2661ec95c96fd9 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Mon, 15 Jun 2015 22:06:07 +0200 Subject: [PATCH 17/29] -Made a Manual! Changed all Things! --- build.gradle | 2 +- .../blocks/BlockBreaker.java | 10 - .../blocks/BlockCanolaPress.java | 1 - .../blocks/BlockCoalGenerator.java | 3 +- .../blocks/BlockCoffeeMachine.java | 11 - .../blocks/BlockCompost.java | 8 - .../blocks/BlockDropper.java | 10 - .../actuallyadditions/blocks/BlockFeeder.java | 10 - .../blocks/BlockFermentingBarrel.java | 10 - .../blocks/BlockFishingNet.java | 11 - .../blocks/BlockFluidCollector.java | 10 - .../blocks/BlockFluidFlowing.java | 11 - .../blocks/BlockFurnaceDouble.java | 10 - .../blocks/BlockFurnaceSolar.java | 3 +- .../blocks/BlockGiantChest.java | 10 - .../blocks/BlockGreenhouseGlass.java | 11 - .../blocks/BlockGrinder.java | 11 - .../blocks/BlockHeatCollector.java | 3 +- .../blocks/BlockInputter.java | 18 +- .../blocks/BlockItemRepairer.java | 1 - .../blocks/BlockLavaFactoryController.java | 14 - .../actuallyadditions/blocks/BlockMisc.java | 9 - .../blocks/BlockOilGenerator.java | 3 +- .../blocks/BlockPhantomBooster.java | 11 - .../blocks/BlockPhantomface.java | 14 +- .../actuallyadditions/blocks/BlockPlant.java | 9 - .../creative/CreativeTab.java | 147 +++---- .../actuallyadditions/event/InitEvents.java | 3 + .../inventory/GuiHandler.java | 12 +- .../inventory/gui/GuiInputter.java | 4 +- .../actuallyadditions/items/InitItems.java | 5 + .../actuallyadditions/items/ItemBucketAA.java | 10 - .../actuallyadditions/items/ItemCoffee.java | 23 +- .../items/ItemCoffeeBean.java | 11 - .../items/ItemCrafterOnAStick.java | 10 - .../actuallyadditions/items/ItemDrill.java | 364 ++++++++++++++++++ .../items/ItemDrillUpgrade.java | 55 +++ .../actuallyadditions/items/ItemDust.java | 9 - .../items/ItemFertilizer.java | 10 - .../actuallyadditions/items/ItemFoods.java | 10 +- .../items/ItemHairyBall.java | 9 - .../actuallyadditions/items/ItemJams.java | 19 - .../actuallyadditions/items/ItemKnife.java | 11 +- .../items/ItemLeafBlower.java | 17 +- .../actuallyadditions/items/ItemMisc.java | 9 - .../items/ItemPhantomConnector.java | 2 - .../items/ItemPotionRing.java | 10 - .../items/ItemResonantRice.java | 15 +- .../actuallyadditions/items/ItemSeed.java | 9 - .../items/ItemSpecialDrop.java | 8 - .../items/tools/ItemAllToolAA.java | 33 +- .../items/tools/ItemAxeAA.java | 17 - .../items/tools/ItemHoeAA.java | 8 +- .../items/tools/ItemPickaxeAA.java | 8 +- .../items/tools/ItemShovelAA.java | 8 +- .../items/tools/ItemSwordAA.java | 8 +- .../manual/ContainerManual.java | 232 +++++++++++ .../actuallyadditions/manual/GuiManual.java | 115 ++++++ .../manual/InventoryEvents.java | 56 +++ .../actuallyadditions/manual/ManualItems.java | 77 ++++ .../manual/PacketOpenManual.java | 35 ++ .../manual/SlotImmovable.java | 23 ++ .../network/PacketHandler.java | 2 + .../actuallyadditions/proxy/ClientProxy.java | 8 +- .../tile/TileEntityBase.java | 16 + .../tile/TileEntityPhantomface.java | 2 - .../actuallyadditions/util/BlockUtil.java | 14 +- .../actuallyadditions/util/ItemUtil.java | 17 - .../actuallyadditions/util/WorldUtil.java | 28 +- .../assets/actuallyadditions/lang/en_US.lang | 6 +- .../textures/gui/guiManual.png | Bin 0 -> 2012 bytes 71 files changed, 1154 insertions(+), 565 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java create mode 100644 src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java create mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png diff --git a/build.gradle b/build.gradle index ce3772547..b3797a3db 100644 --- a/build.gradle +++ b/build.gradle @@ -23,7 +23,7 @@ group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" minecraft { - version = "1.7.10-10.13.3.1428-1.7.10" + version = "1.7.10-10.13.4.1448-1.7.10" runDir = "idea" } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java index e46eb1296..d4379a444 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityBreaker; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -22,8 +21,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; - public class BlockBreaker extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -120,13 +117,6 @@ public class BlockBreaker extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java index 16ca12ff4..167bf6a02 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java @@ -100,7 +100,6 @@ public class BlockCanolaPress extends BlockContainerBase implements INameableIte @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerUsageInfo(list, TileEntityCanolaPress.energyUsedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java index b57296420..030e05169 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java @@ -99,8 +99,7 @@ public class BlockCoalGenerator extends BlockContainerBase implements INameableI @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ BlockUtil.addPowerProductionInfo(list, TileEntityCoalGenerator.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java index c0dcaf928..309231119 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java @@ -6,7 +6,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -22,8 +21,6 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; -import java.util.List; - public class BlockCoffeeMachine extends BlockContainerBase implements INameableItem{ public BlockCoffeeMachine(){ @@ -124,14 +121,6 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 5, ""); - BlockUtil.addPowerUsageInfo(list, TileEntityCoffeeMachine.energyUsePerTick); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java index 8953a197e..9fda45de0 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java @@ -8,7 +8,6 @@ import ellpeck.actuallyadditions.items.ItemFertilizer; import ellpeck.actuallyadditions.items.ItemMisc; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.tile.TileEntityCompost; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -149,13 +148,6 @@ public class BlockCompost extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java index 7779a84eb..d4737dfdb 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityDropper; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -22,8 +21,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; - public class BlockDropper extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -117,13 +114,6 @@ public class BlockDropper extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java index e135def6d..a72632581 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFeeder; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -19,8 +18,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class BlockFeeder extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -96,13 +93,6 @@ public class BlockFeeder extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java index 68ab2eb43..3ac6685dc 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -19,8 +18,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class BlockFermentingBarrel extends BlockContainerBase implements INameableItem{ private IIcon iconTop; @@ -96,13 +93,6 @@ public class BlockFermentingBarrel extends BlockContainerBase implements INameab return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java index d6cd5edcd..37b3b7ca6 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java @@ -4,12 +4,10 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityFishingNet; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; @@ -18,8 +16,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class BlockFishingNet extends BlockContainerBase implements INameableItem{ public BlockFishingNet(){ @@ -92,13 +88,6 @@ public class BlockFishingNet extends BlockContainerBase implements INameableItem return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java index 5c7ec84af..5cc8ba797 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -22,8 +21,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; - public class BlockFluidCollector extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -120,13 +117,6 @@ public class BlockFluidCollector extends BlockContainerBase implements INameable return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java index c60c1f7a4..02b11aff4 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java @@ -2,13 +2,11 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -18,8 +16,6 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; -import java.util.List; - public class BlockFluidFlowing extends BlockFluidClassic implements INameableItem{ private String name; @@ -88,13 +84,6 @@ public class BlockFluidFlowing extends BlockFluidClassic implements INameableIte return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java index a0986d1c9..958d16555 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFurnaceDouble; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -22,7 +21,6 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; import java.util.Random; public class BlockFurnaceDouble extends BlockContainerBase implements INameableItem{ @@ -166,14 +164,6 @@ public class BlockFurnaceDouble extends BlockContainerBase implements INameableI return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - BlockUtil.addPowerUsageInfo(list, TileEntityFurnaceDouble.energyUsePerTick); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java index 36949cd77..071b520e1 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java @@ -95,8 +95,7 @@ public class BlockFurnaceSolar extends BlockContainerBase implements INameableIt @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ BlockUtil.addPowerProductionInfo(list, TileEntityFurnaceSolar.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java index 509dca6fe..2238fed2a 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityGiantChest; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -19,8 +18,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class BlockGiantChest extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -98,13 +95,6 @@ public class BlockGiantChest extends BlockContainerBase implements INameableItem return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java index 60f0291cf..a2699b179 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java @@ -3,13 +3,11 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityGreenhouseGlass; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -19,8 +17,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; - public class BlockGreenhouseGlass extends BlockContainerBase implements INameableItem{ public BlockGreenhouseGlass(){ @@ -100,13 +96,6 @@ public class BlockGreenhouseGlass extends BlockContainerBase implements INameabl return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java index 1c63f53f6..0a159ad7e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java @@ -3,10 +3,8 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; -import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityGrinder; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -21,7 +19,6 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import java.util.List; import java.util.Random; public class BlockGrinder extends BlockContainerBase implements INameableItem{ @@ -130,14 +127,6 @@ public class BlockGrinder extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, ((BlockGrinder)theBlock).isDouble ? 3 : 4, ""); - BlockUtil.addPowerUsageInfo(list, ((BlockGrinder)theBlock).isDouble ? ConfigIntValues.GRINDER_DOUBLE_ENERGY_USED.getValue() : ConfigIntValues.GRINDER_ENERGY_USED.getValue()); - } - @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java index c026c01dd..2b5cf366a 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java @@ -83,8 +83,7 @@ public class BlockHeatCollector extends BlockContainerBase implements INameableI @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 3, ""); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ BlockUtil.addPowerProductionInfo(list, TileEntityHeatCollector.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java index 5f9495cde..5030fe972 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java @@ -5,7 +5,8 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityInputter; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -18,7 +19,6 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import java.util.List; import java.util.Random; public class BlockInputter extends BlockContainerBase implements INameableItem{ @@ -115,20 +115,6 @@ public class BlockInputter extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocalFormatted("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + 1, StringUtil.OBFUSCATED, StringUtil.LIGHT_GRAY)); - for(int i = 1; i < 6; i++){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + (i + 1))); - } - if((((BlockInputter)theBlock).isAdvanced)) list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)theBlock).getName() + ".desc")); - } - else list.add(ItemUtil.shiftForInfo()); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java index 10be6b9a1..81db9ff99 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java @@ -121,7 +121,6 @@ public class BlockItemRepairer extends BlockContainerBase implements INameableIt @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerUsageInfo(list, TileEntityItemRepairer.energyUsePerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java index 782eb30f2..55fde2db3 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java @@ -3,9 +3,7 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityLavaFactoryController; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -20,8 +18,6 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import java.util.List; - public class BlockLavaFactoryController extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -100,16 +96,6 @@ public class BlockLavaFactoryController extends BlockContainerBase implements IN return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 3, ""); - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".uses.desc") + " " + TileEntityLavaFactoryController.energyNeededToProduceLava + " RF/B"); - } - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java index 513a52bcc..5fa59a537 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java @@ -3,14 +3,12 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; @@ -87,13 +85,6 @@ public class BlockMisc extends Block implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscBlocks.length ? " ERROR!" : allMiscBlocks[stack.getItemDamage()].getName()); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, allMiscBlocks[stack.getItemDamage()].getName()); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java index 28e8d6568..3af1ded7e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java @@ -99,8 +99,7 @@ public class BlockOilGenerator extends BlockContainerBase implements INameableIt @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ BlockUtil.addPowerProductionInfo(list, TileEntityOilGenerator.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java index 268276d99..ae6835f3c 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java @@ -4,12 +4,10 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityPhantomBooster; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; @@ -18,8 +16,6 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class BlockPhantomBooster extends BlockContainerBase implements INameableItem{ public BlockPhantomBooster(){ @@ -94,13 +90,6 @@ public class BlockPhantomBooster extends BlockContainerBase implements INameable return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 2, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index 06b5c994f..148a9a573 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -7,7 +7,8 @@ import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -155,15 +156,8 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 2, ""); - if(KeyUtil.isShiftPressed()){ - if(((BlockPhantomface)this.theBlock).type == LIQUIFACE){ - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); - list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); - } - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); - } + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index f9298b9ac..ea2402abb 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -3,13 +3,11 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.ItemSeed; -import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; @@ -133,13 +131,6 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar return this.getUnlocalizedName(); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, ""); - } - @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index d601fa893..9a718cc65 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -26,88 +26,89 @@ public class CreativeTab extends CreativeTabs{ public void displayAllReleventItems(List list){ this.list = list; - this.addBlock(InitBlocks.blockPhantomface); - this.addBlock(InitBlocks.blockPhantomEnergyface); - this.addBlock(InitBlocks.blockPhantomLiquiface); - this.addBlock(InitBlocks.blockPhantomPlacer); - this.addBlock(InitBlocks.blockPhantomBreaker); - this.addBlock(InitBlocks.blockPhantomBooster); - this.addBlock(InitBlocks.blockCoffeeMachine); - this.addBlock(InitBlocks.blockInputter); - this.addBlock(InitBlocks.blockInputterAdvanced); + addBlock(InitBlocks.blockPhantomface); + addBlock(InitBlocks.blockPhantomEnergyface); + addBlock(InitBlocks.blockPhantomLiquiface); + addBlock(InitBlocks.blockPhantomPlacer); + addBlock(InitBlocks.blockPhantomBreaker); + addBlock(InitBlocks.blockPhantomBooster); + addBlock(InitBlocks.blockCoffeeMachine); + addBlock(InitBlocks.blockInputter); + addBlock(InitBlocks.blockInputterAdvanced); - this.addBlock(InitBlocks.blockGreenhouseGlass); - this.addBlock(InitBlocks.blockGrinder); - this.addBlock(InitBlocks.blockGrinderDouble); - this.addBlock(InitBlocks.blockFurnaceDouble); - this.addBlock(InitBlocks.blockLavaFactoryController); + addBlock(InitBlocks.blockGreenhouseGlass); + addBlock(InitBlocks.blockGrinder); + addBlock(InitBlocks.blockGrinderDouble); + addBlock(InitBlocks.blockFurnaceDouble); + addBlock(InitBlocks.blockLavaFactoryController); - this.addBlock(InitBlocks.blockFurnaceSolar); - this.addBlock(InitBlocks.blockHeatCollector); - this.addBlock(InitBlocks.blockCoalGenerator); - this.addBlock(InitBlocks.blockOilGenerator); - this.addBlock(InitBlocks.blockItemRepairer); - this.addBlock(InitBlocks.blockFishingNet); - this.addBlock(InitBlocks.blockBreaker); - this.addBlock(InitBlocks.blockPlacer); - this.addBlock(InitBlocks.blockDropper); - this.addBlock(InitBlocks.blockFluidPlacer); - this.addBlock(InitBlocks.blockFluidCollector); + addBlock(InitBlocks.blockFurnaceSolar); + addBlock(InitBlocks.blockHeatCollector); + addBlock(InitBlocks.blockCoalGenerator); + addBlock(InitBlocks.blockOilGenerator); + addBlock(InitBlocks.blockItemRepairer); + addBlock(InitBlocks.blockFishingNet); + addBlock(InitBlocks.blockBreaker); + addBlock(InitBlocks.blockPlacer); + addBlock(InitBlocks.blockDropper); + addBlock(InitBlocks.blockFluidPlacer); + addBlock(InitBlocks.blockFluidCollector); - this.addBlock(InitBlocks.blockMisc); - this.addBlock(InitBlocks.blockFeeder); - this.addBlock(InitBlocks.blockCompost); - this.addBlock(InitBlocks.blockGiantChest); - this.addBlock(InitBlocks.blockCanolaPress); - this.addBlock(InitBlocks.blockFermentingBarrel); + addBlock(InitBlocks.blockMisc); + addBlock(InitBlocks.blockFeeder); + addBlock(InitBlocks.blockCompost); + addBlock(InitBlocks.blockGiantChest); + addBlock(InitBlocks.blockCanolaPress); + addBlock(InitBlocks.blockFermentingBarrel); - this.addItem(InitItems.itemPhantomConnector); - this.addItem(InitItems.itemBucketCanolaOil); - this.addItem(InitItems.itemBucketOil); + addItem(InitItems.itemDrill); + addItem(InitItems.itemPhantomConnector); + addItem(InitItems.itemBucketCanolaOil); + addItem(InitItems.itemBucketOil); - this.addItem(InitItems.itemCoffeeSeed); - this.addItem(InitItems.itemCoffeeBean); - this.addItem(InitItems.itemRiceSeed); - this.addItem(InitItems.itemCanolaSeed); - this.addItem(InitItems.itemFlaxSeed); - this.addItem(InitItems.itemHairyBall); - this.addItem(InitItems.itemMisc); - this.addItem(InitItems.itemResonantRice); - this.addItem(InitItems.itemFertilizer); + addItem(InitItems.itemCoffeeSeed); + addItem(InitItems.itemCoffeeBean); + addItem(InitItems.itemRiceSeed); + addItem(InitItems.itemCanolaSeed); + addItem(InitItems.itemFlaxSeed); + addItem(InitItems.itemHairyBall); + addItem(InitItems.itemMisc); + addItem(InitItems.itemResonantRice); + addItem(InitItems.itemFertilizer); - this.addItem(InitItems.itemCoffee); - this.addItem(InitItems.itemFoods); - this.addItem(InitItems.itemKnife); - this.addItem(InitItems.itemCrafterOnAStick); - this.addItem(InitItems.itemDust); - this.addItem(InitItems.itemSpecialDrop); - this.addItem(InitItems.itemLeafBlower); - this.addItem(InitItems.itemLeafBlowerAdvanced); + addItem(InitItems.itemCoffee); + addItem(InitItems.itemFoods); + addItem(InitItems.itemKnife); + addItem(InitItems.itemCrafterOnAStick); + addItem(InitItems.itemDust); + addItem(InitItems.itemSpecialDrop); + addItem(InitItems.itemLeafBlower); + addItem(InitItems.itemLeafBlowerAdvanced); - this.addItem(InitItems.woodenPaxel); - this.addItem(InitItems.stonePaxel); - this.addItem(InitItems.ironPaxel); - this.addItem(InitItems.goldPaxel); - this.addItem(InitItems.diamondPaxel); - this.addItem(InitItems.emeraldPaxel); - this.addItem(InitItems.obsidianPaxel); + addItem(InitItems.woodenPaxel); + addItem(InitItems.stonePaxel); + addItem(InitItems.ironPaxel); + addItem(InitItems.goldPaxel); + addItem(InitItems.diamondPaxel); + addItem(InitItems.emeraldPaxel); + addItem(InitItems.obsidianPaxel); - this.addItem(InitItems.itemPickaxeEmerald); - this.addItem(InitItems.itemSwordEmerald); - this.addItem(InitItems.itemAxeEmerald); - this.addItem(InitItems.itemShovelEmerald); - this.addItem(InitItems.itemHoeEmerald); + addItem(InitItems.itemPickaxeEmerald); + addItem(InitItems.itemSwordEmerald); + addItem(InitItems.itemAxeEmerald); + addItem(InitItems.itemShovelEmerald); + addItem(InitItems.itemHoeEmerald); - this.addItem(InitItems.itemPickaxeObsidian); - this.addItem(InitItems.itemSwordObsidian); - this.addItem(InitItems.itemAxeObsidian); - this.addItem(InitItems.itemShovelObsidian); - this.addItem(InitItems.itemHoeObsidian); + addItem(InitItems.itemPickaxeObsidian); + addItem(InitItems.itemSwordObsidian); + addItem(InitItems.itemAxeObsidian); + addItem(InitItems.itemShovelObsidian); + addItem(InitItems.itemHoeObsidian); - this.addItem(InitItems.itemPotionRing); - this.addItem(InitItems.itemPotionRingAdvanced); + addItem(InitItems.itemPotionRing); + addItem(InitItems.itemPotionRingAdvanced); - this.addItem(InitItems.itemJams); + addItem(InitItems.itemJams); } @Override @@ -121,10 +122,10 @@ public class CreativeTab extends CreativeTabs{ } private void addItem(Item item){ - item.getSubItems(item, this, list); + item.getSubItems(item, instance, list); } private void addBlock(Block block){ - block.getSubBlocks(new ItemStack(block).getItem(), this, list); + block.getSubBlocks(new ItemStack(block).getItem(), instance, list); } } diff --git a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java index 638251ebc..64d78776f 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java +++ b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java @@ -1,5 +1,6 @@ package ellpeck.actuallyadditions.event; +import ellpeck.actuallyadditions.manual.InventoryEvents; import ellpeck.actuallyadditions.util.Util; public class InitEvents{ @@ -15,6 +16,8 @@ public class InitEvents{ Util.registerEvent(new EntityLivingEvent()); Util.registerEvent(new WorldDecorationEvent()); Util.registerEvent(new BucketFillEvent()); + Util.registerEvent(new InventoryEvents.InitGuiEvent()); + Util.registerEvent(new InventoryEvents.ButtonPressedEvent()); } } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index 61ce9c16c..fc898626e 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -4,6 +4,8 @@ import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.NetworkRegistry; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.gui.*; +import ellpeck.actuallyadditions.manual.ContainerManual; +import ellpeck.actuallyadditions.manual.GuiManual; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.util.Util; import net.minecraft.entity.player.EntityPlayer; @@ -14,7 +16,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ TileEntityBase tile = null; - if(id != CRAFTER_ID){ + if(id != CRAFTER_ID && id != DRILL_ID && id != MANUAL_ID){ tile = (TileEntityBase)world.getTileEntity(x, y, z); } switch(id){ @@ -54,6 +56,8 @@ public class GuiHandler implements IGuiHandler{ return new ContainerFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new ContainerCoffeeMachine(entityPlayer.inventory, tile); + case MANUAL_ID: + return new ContainerManual(); default: return null; } @@ -62,7 +66,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getClientGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ TileEntityBase tile = null; - if(id != CRAFTER_ID){ + if(id != CRAFTER_ID && id != DRILL_ID && id != MANUAL_ID){ tile = (TileEntityBase)world.getTileEntity(x, y, z); } switch(id){ @@ -102,6 +106,8 @@ public class GuiHandler implements IGuiHandler{ return new GuiFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new GuiCoffeeMachine(entityPlayer.inventory, tile, x, y, z, world); + case MANUAL_ID: + return new GuiManual(); default: return null; } @@ -125,6 +131,8 @@ public class GuiHandler implements IGuiHandler{ public static final int PHANTOM_PLACER_ID = 15; public static final int FLUID_COLLECTOR_ID = 16; public static final int COFFEE_MACHINE_ID = 17; + public static final int DRILL_ID = 18; + public static final int MANUAL_ID = 19; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java index ce76bf0e9..e5570d9c1 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java @@ -156,9 +156,9 @@ public class GuiInputter extends GuiContainer{ PacketHandler.theNetwork.sendToServer(new PacketGuiButton(x, y, z, world, button.id, Minecraft.getMinecraft().thePlayer)); } - public class SmallerButton extends GuiButton{ + public static class SmallerButton extends GuiButton{ - private final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiInputter"); + public final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiInputter"); public SmallerButton(int id, int x, int y, String display){ super(id, x, y, 16, 16, display); diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index d3f758f23..ead653068 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -69,9 +69,14 @@ public class InitItems{ public static Item emeraldPaxel; public static Item obsidianPaxel; + public static Item itemDrill; + public static void init(){ Util.logInfo("Initializing Items..."); + itemDrill = new ItemDrill(); + ItemUtil.register(itemDrill); + itemBucketOil = new ItemBucketAA(InitBlocks.blockOil, "itemBucketOil"); ItemUtil.register(itemBucketOil); FluidContainerRegistry.registerFluidContainer(InitBlocks.fluidOil, new ItemStack(itemBucketOil), FluidContainerRegistry.EMPTY_BUCKET); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java index 6c106c564..ac429ce64 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java @@ -3,19 +3,15 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBucket; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import java.util.List; - public class ItemBucketAA extends ItemBucket implements INameableItem{ private String name; @@ -31,12 +27,6 @@ public class ItemBucketAA extends ItemBucket implements INameableItem{ return EnumRarity.uncommon; } - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 1, ""); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java index 17c36aaf2..9c9b80818 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -5,8 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -203,22 +201,17 @@ public class ItemCoffee extends ItemFood implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); - list.add(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2", this.getMaxDamage()+1)); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+this.func_150905_g(stack)); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+this.func_150906_h(stack)); - list.add(""); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+this.func_150905_g(stack)); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+this.func_150906_h(stack)); + list.add(""); - PotionEffect[] effects = getEffectsFromStack(stack); - if(effects != null && effects.length > 0){ - for(PotionEffect effect : effects){ - list.add(StatCollector.translateToLocal(effect.getEffectName())+" "+(effect.getAmplifier()+1)+ " (" + Potion.getDurationString(new PotionEffect(0, effect.getDuration()*20, 0)) + ")"); - } + PotionEffect[] effects = getEffectsFromStack(stack); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + list.add(StatCollector.translateToLocal(effect.getEffectName())+" "+(effect.getAmplifier()+1)+ " (" + Potion.getDurationString(new PotionEffect(0, effect.getDuration()*20, 0)) + ")"); } - else list.add("No Effects"); } - else list.add(ItemUtil.shiftForInfo()); + else list.add("No Effects"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java index 08a55cd57..1deb06518 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java @@ -3,17 +3,13 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import java.util.List; - public class ItemCoffeeBean extends ItemFood implements INameableItem{ public ItemCoffeeBean(){ @@ -31,13 +27,6 @@ public class ItemCoffeeBean extends ItemFood implements INameableItem{ return EnumRarity.rare; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - ItemUtil.addInformation(this, list, 1, ""); - } - @Override @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int pass){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java index 04e43ba5d..ed99912d9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -15,21 +14,12 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class ItemCrafterOnAStick extends Item implements INameableItem{ public ItemCrafterOnAStick(){ this.setMaxStackSize(1); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 1, ""); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java new file mode 100644 index 000000000..ef7b9baae --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -0,0 +1,364 @@ +package ellpeck.actuallyadditions.items; + +import cofh.api.energy.ItemEnergyContainer; +import com.google.common.collect.Multimap; +import com.google.common.collect.Sets; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.items.tools.ItemAllToolAA; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.enchantment.Enchantment; +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.SharedMonsterAttributes; +import net.minecraft.entity.ai.attributes.AttributeModifier; +import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.IIcon; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@SuppressWarnings("unchecked") +public class ItemDrill extends ItemEnergyContainer implements INameableItem{ + + private static final Set allSet = Sets.newHashSet(); + static{ + allSet.addAll(ItemAllToolAA.pickSet); + allSet.addAll(ItemAllToolAA.shovelSet); + } + + public ItemDrill(){ + super(3000000); + this.setMaxStackSize(1); + this.setHasSubtypes(true); + } + + public static float defaultEfficiency = 8.0F; + + public int energyUsePerBlockOrHit = 100; + public float efficiency = defaultEfficiency; + + @Override + public double getDurabilityForDisplay(ItemStack stack){ + double energyDif = getMaxEnergyStored(stack)-getEnergyStored(stack); + double maxAmount = getMaxEnergyStored(stack); + return energyDif/maxAmount; + } + + @Override + public boolean showDurabilityBar(ItemStack itemStack){ + return true; + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player){ + this.setEnergy(stack, 0); + } + + @Override + public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5){ + boolean hasSilkTouch = this.hasEnchantment(stack, Enchantment.silkTouch) >= 0; + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)){ + if(!hasSilkTouch){ + //TODO Add more Energy Use as Variable Change (Like Efficiency!) + stack.addEnchantment(Enchantment.silkTouch, 1); + } + } + else if(hasSilkTouch) this.removeEnchantment(stack, Enchantment.silkTouch); + + boolean hasFortune = this.hasEnchantment(stack, Enchantment.fortune) >= 0; + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE)){ + if(!hasFortune){ + //TODO Add more Energy Use as Variable Change (Like Efficiency!) + stack.addEnchantment(Enchantment.fortune, this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1); + } + } + else if(hasFortune) this.removeEnchantment(stack, Enchantment.fortune); + } + + public void removeEnchantment(ItemStack stack, Enchantment ench){ + NBTTagList list = stack.getEnchantmentTagList(); + if(list != null){ + int hasEnchantment = this.hasEnchantment(stack, ench); + if(hasEnchantment >= 0){ + list.removeTag(hasEnchantment); + } + } + } + + public int hasEnchantment(ItemStack stack, Enchantment ench){ + NBTTagList list = stack.getEnchantmentTagList(); + if(list != null){ + for(int i = 0; i < list.tagCount(); i++){ + NBTTagCompound compound = list.getCompoundTagAt(i); + short id = compound.getShort("id"); + if(id == ench.effectId){ + return i; + } + } + } + return -1; + } + + @Override + @SideOnly(Side.CLIENT) + public boolean hasEffect(ItemStack stack, int pass){ + return false; + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.epic; + } + + public boolean getHasUpgrade(ItemStack stack, ItemDrillUpgrade.UpgradeType upgrade){ + if(upgrade == ItemDrillUpgrade.UpgradeType.SILK_TOUCH) return true; + if(upgrade == ItemDrillUpgrade.UpgradeType.THREE_BY_THREE) return true; + + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) return false; + + ItemStack[] slots = this.getSlotsFromNBT(stack); + if(slots != null && slots.length > 0){ + for(ItemStack slotStack : slots){ + if(slotStack != null && slotStack.getItem() instanceof ItemDrillUpgrade){ + if(((ItemDrillUpgrade)slotStack.getItem()).type == upgrade) return true; + } + } + } + return false; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + public void setEnergy(ItemStack stack, int energy){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) compound = new NBTTagCompound(); + compound.setInteger("Energy", energy); + stack.setTagCompound(compound); + } + + public void writeSlotsToNBT(ItemStack[] slots, ItemStack stack){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) compound = new NBTTagCompound(); + + if(slots != null && slots.length > 0){ + compound.setInteger("SlotAmount", slots.length); + NBTTagList tagList = new NBTTagList(); + for(int currentIndex = 0; currentIndex < slots.length; currentIndex++){ + if(slots[currentIndex] != null){ + NBTTagCompound tagCompound = new NBTTagCompound(); + tagCompound.setByte("Slot", (byte)currentIndex); + slots[currentIndex].writeToNBT(tagCompound); + tagList.appendTag(tagCompound); + } + } + compound.setTag("Items", tagList); + } + stack.setTagCompound(compound); + } + + @Override + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list){ + ItemStack stackFull = new ItemStack(this); + this.setEnergy(stackFull, this.getMaxEnergyStored(stackFull)); + list.add(stackFull); + + ItemStack stackEmpty = new ItemStack(this); + this.setEnergy(stackEmpty, 0); + list.add(stackEmpty); + } + + public ItemStack[] getSlotsFromNBT(ItemStack stack){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) return null; + + int slotAmount = compound.getInteger("SlotAmount"); + ItemStack[] slots = new ItemStack[slotAmount]; + + if(slots.length > 0){ + NBTTagList tagList = compound.getTagList("Items", 10); + for(int i = 0; i < tagList.tagCount(); i++){ + NBTTagCompound tagCompound = tagList.getCompoundTagAt(i); + byte slotIndex = tagCompound.getByte("Slot"); + if(slotIndex >= 0 && slotIndex < slots.length){ + slots[slotIndex] = ItemStack.loadItemStackFromNBT(tagCompound); + } + } + } + return slots; + } + + public void breakBlocks(ItemStack stack, int radius, World world, int x, int y, int z, Entity entity){ + int xRange = radius; + int yRange = radius; + int zRange = 0; + + MovingObjectPosition pos = WorldUtil.raytraceEntity(world, entity, 4.5D); + if(pos != null){ + int side = pos.sideHit; + if(side == 0 || side == 1){ + zRange = radius; + yRange = 0; + } + if(side == 4 || side == 5){ + xRange = 0; + zRange = radius; + } + + for(int xPos = x-xRange; xPos <= x+xRange; xPos++){ + for(int yPos = y-yRange; yPos <= y+yRange; yPos++){ + for(int zPos = z-zRange; zPos <= z+zRange; zPos++){ + if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ + Block block = world.getBlock(xPos, yPos, zPos); + float hardness = block.getBlockHardness(world, xPos, yPos, zPos); + if(!(xPos == x && yPos == y && zPos == z) && hardness > -1.0F && this.canHarvestBlock(block, stack)){ + this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + + ArrayList drops = new ArrayList(); + int meta = world.getBlockMetadata(xPos, yPos, zPos); + + if(block.canSilkHarvest(world, (EntityPlayer)entity, xPos, yPos, zPos, meta) && EnchantmentHelper.getSilkTouchModifier((EntityPlayer)entity)){ + drops.add(new ItemStack(block, 1, meta)); + } + else{ + drops.addAll(block.getDrops(world, xPos, yPos, zPos, meta, EnchantmentHelper.getFortuneModifier((EntityPlayer)entity))); + block.dropXpOnBlockBreak(world, x, y, z, block.getExpDrop(world, meta, EnchantmentHelper.getFortuneModifier((EntityPlayer)entity))); + } + + world.playAuxSFX(2001, xPos, yPos, zPos, Block.getIdFromBlock(block)+(meta << 12)); + world.setBlockToAir(xPos, yPos, zPos); + for(ItemStack theDrop : drops){ + world.spawnEntityInWorld(new EntityItem(world, xPos+0.5, yPos+0.5, zPos+0.5, theDrop)); + } + } + } + else return; + } + } + } + } + } + + @Override + public String getName(){ + return "itemDrill"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){ + if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ + this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + if(!world.isRemote){ + if(!living.isSneaking()){ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)){ + this.breakBlocks(stack, 2, world, x, y, z, living); + } + else this.breakBlocks(stack, 1, world, x, y, z, living); + } + } + } + } + return true; + } + + @Override + public float func_150893_a(ItemStack stack, Block block){ + if(this.getEnergyStored(stack) < this.energyUsePerBlockOrHit) return 0.0F; + if(block.getMaterial() == Material.iron || block.getMaterial() == Material.anvil || block.getMaterial() == Material.rock || allSet.contains(block)) return efficiency; + else return super.func_150893_a(stack, block); + } + + @Override + public boolean hitEntity(ItemStack stack, EntityLivingBase entity1, EntityLivingBase entity2){ + if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ + this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + } + return true; + } + + @Override + public boolean canHarvestBlock(Block block, ItemStack stack){ + return this.func_150893_a(stack, block) > super.func_150893_a(stack, block); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(!world.isRemote && player.isSneaking()) player.openGui(ActuallyAdditions.instance, GuiHandler.DRILL_ID, world, (int)player.posX, (int)player.posY, (int)player.posZ); + return stack; + } + + @Override + public int getHarvestLevel(ItemStack stack, String toolClass){ + return ToolMaterial.EMERALD.getHarvestLevel(); + } + + @Override + public Set getToolClasses(ItemStack stack){ + HashSet hashSet = new HashSet(); + hashSet.add("pickaxe"); + hashSet.add("shovel"); + return hashSet; + } + + @Override + public float getDigSpeed(ItemStack stack, Block block, int meta){ + return this.func_150893_a(stack, block); + } + + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(this.getEnergyStored(stack) + "/" + this.getMaxEnergyStored(stack) + " RF"); + } + } + + @Override + public Multimap getAttributeModifiers(ItemStack stack){ + Multimap map = super.getAttributeModifiers(stack); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit ? 8.0F : 0.0F, 0)); + return map; + } + + @Override + public boolean getShareTag(){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java new file mode 100644 index 000000000..9afd3848a --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java @@ -0,0 +1,55 @@ +package ellpeck.actuallyadditions.items; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +public class ItemDrillUpgrade extends Item implements INameableItem{ + + public enum UpgradeType{ + SPEED, + SPEED_II, + SPEED_III, + SILK_TOUCH, //Done + FORTUNE, //Done + FORTUNE_II, //Done + THREE_BY_THREE, //Done + FIVE_BY_FIVE, //Done + VEIN, + PLACER + } + + public UpgradeType type; + public String unlocalizedName; + + public ItemDrillUpgrade(UpgradeType type, String unlocName){ + this.type = type; + this.unlocalizedName = unlocName; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getName(){ + return this.unlocalizedName; + } + + @Override + public String getOredictName(){ + return this.getName(); + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java index d81f4d634..321f8126b 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java @@ -4,11 +4,9 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheDusts; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -57,13 +55,6 @@ public class ItemDust extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allDusts.length ? " ERROR!" : allDusts[stack.getItemDamage()].getName()); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(stack.getItemDamage() < allDusts.length) ItemUtil.addInformation(this, list, 1, allDusts[stack.getItemDamage()].getName()); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java b/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java index 6d535bc9d..33495fe50 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java @@ -3,7 +3,6 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -14,8 +13,6 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import java.util.List; - public class ItemFertilizer extends Item implements INameableItem{ @Override @@ -32,13 +29,6 @@ public class ItemFertilizer extends Item implements INameableItem{ return EnumRarity.rare; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 1, ""); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java index 5f1578bb6..6991d913f 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java @@ -4,8 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheFoods; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -99,12 +97,8 @@ public class ItemFoods extends ItemFood implements INameableItem{ @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ if(stack.getItemDamage() < allFoods.length){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allFoods[stack.getItemDamage()].getName()+".desc")); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allFoods[stack.getItemDamage()].healAmount); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allFoods[stack.getItemDamage()].saturation); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allFoods[stack.getItemDamage()].healAmount); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allFoods[stack.getItemDamage()].saturation); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java index 8ce79fdd3..f67c61872 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.recipe.HairyBallHandler; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; @@ -16,7 +15,6 @@ import net.minecraft.util.IIcon; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; -import java.util.List; import java.util.Random; public class ItemHairyBall extends Item implements INameableItem{ @@ -45,13 +43,6 @@ public class ItemHairyBall extends Item implements INameableItem{ return EnumRarity.epic; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 2, ""); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java index 5a98848a4..60d06c079 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java @@ -4,8 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheJams; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -18,7 +16,6 @@ import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.List; @@ -99,22 +96,6 @@ public class ItemJams extends ItemFood implements INameableItem{ return stackToReturn; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(stack.getItemDamage() < allJams.length){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allJams[stack.getItemDamage()].getName()+".desc")); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2")); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allJams[stack.getItemDamage()].healAmount); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allJams[stack.getItemDamage()].saturation); - } - else list.add(ItemUtil.shiftForInfo()); - } - } - @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamageForRenderPass(int damage, int pass){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java b/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java index a73b250a2..63d86a0e3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java @@ -4,8 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -51,13 +49,8 @@ public class ItemKnife extends Item implements INameableItem{ @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); - + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java b/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java index 945a1ae9b..4cd3e93f3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java @@ -4,7 +4,8 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockBush; import net.minecraft.block.BlockLeavesBase; @@ -17,11 +18,9 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.ArrayList; -import java.util.List; public class ItemLeafBlower extends Item implements INameableItem{ @@ -101,18 +100,6 @@ public class ItemLeafBlower extends Item implements INameableItem{ return this.isAdvanced ? EnumRarity.epic : EnumRarity.rare; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc." + 1)); - list.add(StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemLeafBlower.desc.2")); - list.add(StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemLeafBlower.desc.3")); - } - else list.add(ItemUtil.shiftForInfo()); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java index fd77272e5..28835adaa 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java @@ -4,11 +4,9 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -58,13 +56,6 @@ public class ItemMisc extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscItems.length ? " ERROR!" : allMiscItems[stack.getItemDamage()].getName()); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(stack.getItemDamage() < allMiscItems.length) ItemUtil.addInformation(this, list, 1, allMiscItems[stack.getItemDamage()].getName()); - } - @Override public IIcon getIconFromDamage(int par1){ return par1 >= textures.length ? null : textures[par1]; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index 04a3e66f9..ffcdfd9e9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -5,7 +5,6 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; @@ -144,7 +143,6 @@ public class ItemPhantomConnector extends Item implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 2, ""); ChunkCoordinates coords = this.getStoredPosition(stack); World world = this.getStoredWorld(stack); if(coords != null && world != null){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java index db3fe422c..8ee3b8566 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.ThePotionRings; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -89,15 +88,6 @@ public class ItemPotionRing extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allRings.length ? " ERROR!" : allRings[stack.getItemDamage()].getName()); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(stack.getItemDamage() < allRings.length){ - ItemUtil.addInformation(this, list, 2, ""); - } - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java index 79e956b5a..6350b6db8 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java @@ -2,18 +2,15 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; import net.minecraft.world.World; -import net.minecraftforge.oredict.OreDictionary; - -import java.util.List; public class ItemResonantRice extends Item implements INameableItem{ @@ -31,14 +28,6 @@ public class ItemResonantRice extends Item implements INameableItem{ return EnumRarity.epic; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 1, ""); - if(KeyUtil.isShiftPressed() && OreDictionary.getOres("nuggetEnderium").size() == 0) list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemResonantRice.uncraftable.desc")); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java index 7f5d1c7d6..b52c6f05d 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.BlockPlant; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -25,8 +24,6 @@ import net.minecraftforge.event.ForgeEventFactory; import powercrystals.minefactoryreloaded.api.IFactoryPlantable; import powercrystals.minefactoryreloaded.api.ReplacementBlock; -import java.util.List; - public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlantable{ public Block plant; @@ -89,12 +86,6 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta return EnumRarity.rare; } - @Override - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - ItemUtil.addInformation(this, list, 1, ""); - } - @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java index 22a758de4..29935517a 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java @@ -4,7 +4,6 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -79,13 +78,6 @@ public class ItemSpecialDrop extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allDrops.length ? " ERROR!" : allDrops[stack.getItemDamage()].getName()); } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - if(stack.getItemDamage() < allDrops.length) ItemUtil.addInformation(this, list, stack.getItemDamage() == TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal() ? 2 : 1, allDrops[stack.getItemDamage()].getName()); - } - @Override public IIcon getIconFromDamage(int par1){ return par1 >= textures.length ? null : textures[par1]; diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java index e6cb47d7e..500f39c3d 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java @@ -1,11 +1,10 @@ package ellpeck.actuallyadditions.items.tools; + import com.google.common.collect.Sets; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -21,15 +20,16 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.UseHoeEvent; +import java.util.HashSet; import java.util.List; import java.util.Set; @SuppressWarnings("unchecked") public class ItemAllToolAA extends ItemTool implements INameableItem{ - private static final Set axeSet = Sets.newHashSet(Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin); - private static final Set pickSet = Sets.newHashSet(Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail); - private static final Set shovelSet = Sets.newHashSet(Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium); + public static final Set axeSet = Sets.newHashSet(Blocks.planks, Blocks.bookshelf, Blocks.log, Blocks.log2, Blocks.chest, Blocks.pumpkin, Blocks.lit_pumpkin); + public static final Set pickSet = Sets.newHashSet(Blocks.cobblestone, Blocks.double_stone_slab, Blocks.stone_slab, Blocks.stone, Blocks.sandstone, Blocks.mossy_cobblestone, Blocks.iron_ore, Blocks.iron_block, Blocks.coal_ore, Blocks.gold_block, Blocks.gold_ore, Blocks.diamond_ore, Blocks.diamond_block, Blocks.ice, Blocks.netherrack, Blocks.lapis_ore, Blocks.lapis_block, Blocks.redstone_ore, Blocks.lit_redstone_ore, Blocks.rail, Blocks.detector_rail, Blocks.golden_rail, Blocks.activator_rail); + public static final Set shovelSet = Sets.newHashSet(Blocks.grass, Blocks.dirt, Blocks.sand, Blocks.gravel, Blocks.snow_layer, Blocks.snow, Blocks.clay, Blocks.farmland, Blocks.soul_sand, Blocks.mycelium); private static final Set allSet = Sets.newHashSet(); static{ @@ -68,16 +68,12 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".paxel.desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ){ - if (!player.canPlayerEdit(x, y, z, side, stack)) return false; + if(!player.canPlayerEdit(x, y, z, side, stack)) return false; else{ UseHoeEvent event = new UseHoeEvent(player, stack, world, x, y, z); if(MinecraftForge.EVENT_BUS.post(event)) return false; @@ -86,10 +82,10 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ return true; } Block block = world.getBlock(x, y, z); - if(side != 0 && world.getBlock(x, y + 1, z).isAir(world, x, y + 1, z) && (block == Blocks.grass || block == Blocks.dirt)){ + if(side != 0 && world.getBlock(x, y+1, z).isAir(world, x, y+1, z) && (block == Blocks.grass || block == Blocks.dirt)){ Block block1 = Blocks.farmland; - world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume() + 1.0F) / 2.0F, block1.stepSound.getPitch() * 0.8F); - if (world.isRemote) return true; + world.playSoundEffect((double)((float)x+0.5F), (double)((float)y+0.5F), (double)((float)z+0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume()+1.0F)/2.0F, block1.stepSound.getPitch()*0.8F); + if(world.isRemote) return true; else{ world.setBlock(x, y, z, block1); stack.damageItem(1, player); @@ -130,4 +126,13 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ public String getOredictName(){ return oredictName; } + + @Override + public Set getToolClasses(ItemStack stack){ + HashSet hashSet = new HashSet(); + hashSet.add("pickaxe"); + hashSet.add("shovel"); + hashSet.add("axe"); + return hashSet; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java index 6287b62f6..7d993bb59 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java @@ -3,18 +3,12 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.util.StatCollector; - -import java.util.List; public class ItemAxeAA extends ItemAxe implements INameableItem{ @@ -31,17 +25,6 @@ public class ItemAxeAA extends ItemAxe implements INameableItem{ this.oredictName = name; } - @Override - @SuppressWarnings("unchecked") - @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); - } - @Override public boolean getIsRepairable(ItemStack itemToRepair, ItemStack stack){ return stack.getItem() == repairItem.getItem(); diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java index 4adf9cf67..a7c6f8ca4 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java @@ -3,8 +3,6 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -35,11 +33,7 @@ public class ItemHoeAA extends ItemHoe implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java index 04bf68c14..0307eb6ff 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java @@ -3,8 +3,6 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -35,11 +33,7 @@ public class ItemPickaxeAA extends ItemPickaxe implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java index f805278c0..0ebf051c9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java @@ -3,8 +3,6 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -35,11 +33,7 @@ public class ItemShovelAA extends ItemSpade implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java index 2b4a84b32..482c1d442 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java @@ -3,8 +3,6 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ItemUtil; -import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -35,11 +33,7 @@ public class ItemSwordAA extends ItemSword implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); - } - else list.add(ItemUtil.shiftForInfo()); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java b/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java new file mode 100644 index 000000000..c7d6f0f14 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java @@ -0,0 +1,232 @@ +package ellpeck.actuallyadditions.manual; + +import cpw.mods.fml.relauncher.ReflectionHelper; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraftforge.oredict.ShapedOreRecipe; +import net.minecraftforge.oredict.ShapelessOreRecipe; + +import java.util.ArrayList; +import java.util.List; + +public class ContainerManual extends Container{ + + TheInventory inventory = new TheInventory(); + + public ContainerManual(){ + this.addSlotToContainer(new SlotImmovable(this.inventory, 0, 199, 41)); + + for(int i = 0; i < 13; i++){ + for(int j = 0; j < 4; j++){ + this.addSlotToContainer(new SlotImmovable(this.inventory, 1+j+(i*4), 5+j*18, 5+i*18)); + } + } + for(int i = 0; i < 3; i++){ + for(int j = 0; j < 3; j++){ + this.addSlotToContainer(new SlotImmovable(this.inventory, 1+13*4+j+(i*3), 105+j*18, 23+i*18)); + } + } + + for(int i = 1; i < ManualItems.list.size()+1; i++){ + if(i < 1+13*4){ + this.inventory.setInventorySlotContents(i, ManualItems.list.get(i-1).stack.copy()); + } + } + } + + public void scrollTo(float f){ + if(this.needsScrollBars()){ + int i = ManualItems.list.size()/4-13; + int j = (int)((double)(f*(float)i)+0.5D); + + if(j < 0) j = 0; + for(int k = 0; k < 13; ++k){ + for(int l = 0; l < 4; ++l){ + int i1 = l+(k+j)*4; + + if(i1 >= 0 && i1 < ManualItems.list.size()){ + this.inventory.setInventorySlotContents(1+l+k*4, ManualItems.list.get(i1).stack.copy()); + } + else this.inventory.setInventorySlotContents(1+l+k*4, null); + } + } + } + } + + public boolean needsScrollBars(){ + return ManualItems.list.size() > 9*13; + } + + @Override + @SuppressWarnings("unchecked") + public ItemStack slotClick(int slot, int par2, int par3, EntityPlayer player){ + if(slot > 0 && slot < 1+13*4){ + Slot theSlot = this.getSlot(slot); + if(theSlot.getStack() != null){ + this.inventory.setInventorySlotContents(0, theSlot.getStack().copy()); + + for(int i = 0; i < 9; i++) this.inventory.setInventorySlotContents(1+13*4+i, null); + List list = CraftingManager.getInstance().getRecipeList(); + for(IRecipe iRec: list){ + if(iRec instanceof ShapedOreRecipe){ + ShapedOreRecipe recipe = (ShapedOreRecipe)iRec; + if(theSlot.getStack().isItemEqual(recipe.getRecipeOutput())){ + + int width = ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, recipe, 4); + int height = ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, recipe, 5); + for(int x = 0; x < width; x++){ + for(int y = 0; y < height; y++){ + int i = y*width+x; + ItemStack stack = null; + Object input = recipe.getInput()[i]; + if(input instanceof ItemStack) stack = ((ItemStack)input).copy(); + if(input instanceof ItemStack[]) stack = ((ItemStack[])input)[0]; + if(input instanceof List) stack = ((List)input).get(0); + + int k = 0; + if(x == 0){ + if(y == 0) k = 0; + if(y == 1) k = 3; + if(y == 2) k = 6; + } + if(x == 1){ + if(y == 0) k = 1; + if(y == 1) k = 4; + if(y == 2) k = 7; + } + if(x == 2){ + if(y == 0) k = 2; + if(y == 1) k = 5; + if(y == 2) k = 8; + } + this.inventory.setInventorySlotContents(1+13*4+k, stack); + } + } + break; + } + } + if(iRec instanceof ShapelessOreRecipe){ + ShapelessOreRecipe recipe = (ShapelessOreRecipe)iRec; + if(theSlot.getStack().isItemEqual(recipe.getRecipeOutput())){ + ArrayList ingredients = recipe.getInput(); + for(int i = 0; i < ingredients.size(); i++){ + ItemStack stack = null; + if(ingredients.get(i) instanceof ItemStack) stack = ((ItemStack)ingredients.get(i)).copy(); + if(ingredients.get(i) instanceof ItemStack[]) stack = ((ItemStack[])ingredients.get(i))[0]; + if(ingredients.get(i) instanceof List) stack = ((List)ingredients.get(i)).get(0); + + this.inventory.setInventorySlotContents(1+13*4+i, stack); + } + break; + } + } + } + } + } + return null; + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.inventory.isUseableByPlayer(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + return null; + } + + public static class TheInventory implements IInventory{ + + public ItemStack[] slots = new ItemStack[13*4+10]; + + @Override + public void setInventorySlotContents(int i, ItemStack stack){ + this.slots[i] = stack; + this.markDirty(); + } + + @Override + public int getSizeInventory(){ + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i){ + if(i < this.getSizeInventory()){ + return slots[i]; + } + return null; + } + + @Override + public ItemStack decrStackSize(int i, int j){ + if (slots[i] != null){ + ItemStack stackAt; + if(slots[i].stackSize <= j){ + stackAt = slots[i]; + slots[i] = null; + this.markDirty(); + return stackAt; + } + else{ + stackAt = slots[i].splitStack(j); + if (slots[i].stackSize == 0) slots[i] = null; + this.markDirty(); + return stackAt; + } + } + return null; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i){ + return getStackInSlot(i); + } + + @Override + public String getInventoryName(){ + return "Actually Additions Manual"; + } + + @Override + public boolean hasCustomInventoryName(){ + return false; + } + + @Override + public int getInventoryStackLimit(){ + return 1; + } + + @Override + public void markDirty(){ + + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player){ + return true; + } + + @Override + public void openInventory(){ + + } + + @Override + public void closeInventory(){ + + } + + @Override + public boolean isItemValidForSlot(int i, ItemStack stack){ + return false; + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java b/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java new file mode 100644 index 000000000..58a120c70 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java @@ -0,0 +1,115 @@ +package ellpeck.actuallyadditions.manual; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.AssetUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; +import net.minecraft.client.gui.FontRenderer; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.input.Mouse; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiManual extends GuiContainer{ + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiManual"); + + private FontRenderer infoTextRenderer; + + private float currentScroll; + private boolean isScrolling; + private boolean wasClicking; + + public GuiManual(){ + super(new ContainerManual()); + + this.xSize = 256; + this.ySize = 244; + } + + @Override + public void drawScreen(int x, int y, float f){ + if(((ContainerManual)this.inventorySlots).needsScrollBars()){ + boolean flag = Mouse.isButtonDown(0); + int k = this.guiLeft; + int l = this.guiTop; + int i1 = k+78; + int j1 = l+5; + int k1 = i1+12; + int l1 = j1+232; + + if(!this.wasClicking && flag && x >= i1 && y >= j1 && x < k1 && y < l1) this.isScrolling = true; + if(!flag) this.isScrolling = false; + this.wasClicking = flag; + + if(this.isScrolling){ + this.currentScroll = ((float)(y-j1)-7.5F)/((float)(l1-j1)-15.0F); + if(this.currentScroll < 0.0F){ + this.currentScroll = 0.0F; + } + if(this.currentScroll > 1.0F){ + this.currentScroll = 1.0F; + } + ((ContainerManual)this.inventorySlots).scrollTo(this.currentScroll); + } + } + super.drawScreen(x, y, f); + } + + @Override + public void handleMouseInput(){ + super.handleMouseInput(); + if(((ContainerManual)this.inventorySlots).needsScrollBars()){ + int i = Mouse.getEventDWheel(); + + if(i != 0){ + int j = ((ContainerManual)this.inventorySlots).inventory.slots.length/4-13; + + if(i > 0) i = 1; + if(i < 0) i = -1; + this.currentScroll = (float)((double)this.currentScroll-(double)i/(double)j); + if(this.currentScroll < 0.0F) this.currentScroll = 0.0F; + + if(this.currentScroll > 1.0F) this.currentScroll = 1.0F; + ((ContainerManual)this.inventorySlots).scrollTo(this.currentScroll); + } + } + } + + @Override + public void initGui(){ + super.initGui(); + this.infoTextRenderer = new FontRenderer(this.mc.gameSettings, new ResourceLocation("textures/font/ascii.png"), this.mc.renderEngine, true); + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, this.xSize, -10, "container."+ModUtil.MOD_ID_LOWER+".manual"); + + ManualItems.InfoTab tab = ManualItems.getTabFromStack(this.inventorySlots.getSlot(0).getStack()); + if(tab != null){ + this.drawCenterString(tab.title, 160, 8); + this.fontRendererObj.drawSplitString(tab.extraForRecipe, 95, 80, 155, StringUtil.DECIMAL_COLOR_GRAY_TEXT); + + this.infoTextRenderer.drawSplitString(tab.text, 95, (tab.extraForRecipe == null || tab.extraForRecipe.length() <= 0 ? 80 : 100), 155, StringUtil.DECIMAL_COLOR_GRAY_TEXT); + } + } + + private void drawCenterString(String text, int xPos, int yPos){ + this.fontRendererObj.drawString(text, xPos - this.fontRendererObj.getStringWidth(text)/2, yPos, StringUtil.DECIMAL_COLOR_GRAY_TEXT); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.mc.getTextureManager().bindTexture(resLoc); + int k = (this.width - this.xSize) / 2; + int l = (this.height - this.ySize) / 2; + this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); + + this.mc.getTextureManager().bindTexture(new ResourceLocation("textures/gui/container/creative_inventory/tabs.png")); + this.drawTexturedModalRect(this.guiLeft+78, this.guiTop+5 + (int)((float)(this.guiTop+5+232-this.guiTop+5-25) * this.currentScroll), 232+(((ContainerManual)this.inventorySlots).needsScrollBars() ? 0 : 12), 0, 12, 15); + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java b/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java new file mode 100644 index 000000000..79eb9352c --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java @@ -0,0 +1,56 @@ +package ellpeck.actuallyadditions.manual; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import ellpeck.actuallyadditions.inventory.gui.GuiInputter; +import ellpeck.actuallyadditions.network.PacketHandler; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.inventory.GuiInventory; +import net.minecraft.util.StatCollector; +import net.minecraftforge.client.event.GuiScreenEvent; + +public class InventoryEvents{ + + private static final int MANUAL_BUTTON_ID = 123782; + + public static class InitGuiEvent{ + @SubscribeEvent + @SuppressWarnings("unchecked") + public void onInitGuiEvent(GuiScreenEvent.InitGuiEvent.Post event){ + if(event.gui instanceof GuiInventory && !Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode){ + int k = (event.gui.width-176)/2; + int l = (event.gui.height-166)/2; + + ManualButton button = new ManualButton(MANUAL_BUTTON_ID, k+160, l+166, "!"); + event.buttonList.add(button); + } + } + } + + public static class ButtonPressedEvent{ + @SubscribeEvent + public void onButtonPressedEvent(GuiScreenEvent.ActionPerformedEvent.Post event){ + if(event.gui instanceof GuiInventory && event.button.id == MANUAL_BUTTON_ID){ + PacketHandler.theNetwork.sendToServer(new PacketOpenManual()); + } + } + } + + public static class ManualButton extends GuiInputter.SmallerButton{ + + public ManualButton(int id, int x, int y, String display){ + super(id, x, y, display); + } + + @Override + public void drawButton(Minecraft mc, int x, int y){ + super.drawButton(mc, x, y); + boolean hovering = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width && y < this.yPosition + this.height; + if(this.getHoverState(hovering) == 2){ + String manual = StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".manual.name"); + mc.fontRenderer.drawString(manual, this.xPosition+this.width/2-mc.fontRenderer.getStringWidth(manual)/2 , this.yPosition+this.height+5, StringUtil.DECIMAL_COLOR_WHITE); + } + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java b/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java new file mode 100644 index 000000000..76cc79bf9 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java @@ -0,0 +1,77 @@ +package ellpeck.actuallyadditions.manual; + +import ellpeck.actuallyadditions.blocks.InitBlocks; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; + +import java.util.ArrayList; + +public class ManualItems{ + + public static ArrayList list = new ArrayList(); + + static{ + addBlock(InitBlocks.blockPhantomface, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch", "OreDictionary!"); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockBreaker, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockCoalGenerator, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomPlacer, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockFeeder, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockCanolaPress, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockFluidCollector, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomLiquiface, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockBreaker, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); + + } + + private static void addItem(Item item, String text, String extraForRecipe){ + addStack(new ItemStack(item), text, extraForRecipe); + } + + private static void addBlock(Block block, String text, String extraForRecipe){ + addStack(new ItemStack(block), text, extraForRecipe); + } + + private static void addStack(ItemStack stack, String text, String extraForRecipe){ + list.add(new InfoTab(stack.copy(), text, extraForRecipe)); + } + + public static InfoTab getTabFromStack(ItemStack stack){ + for(InfoTab tab : list){ + if(stack != null && tab.stack != null && stack.isItemEqual(tab.stack)) return tab; + } + return null; + } + + public static class InfoTab{ + public ItemStack stack; + public String text; + public String title; + public String extraForRecipe; + + public InfoTab(ItemStack stack, String text, String extraForRecipe){ + this.stack = stack; + this.title = stack.getDisplayName(); + this.text = text; + this.extraForRecipe = extraForRecipe; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java b/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java new file mode 100644 index 000000000..b94c9fab4 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java @@ -0,0 +1,35 @@ +package ellpeck.actuallyadditions.manual; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import io.netty.buffer.ByteBuf; + +public class PacketOpenManual implements IMessage{ + + @SuppressWarnings("unused") + public PacketOpenManual(){ + + } + + @Override + public void fromBytes(ByteBuf buf){ + + } + + @Override + public void toBytes(ByteBuf buf){ + + } + + public static class Handler implements IMessageHandler{ + + @Override + public IMessage onMessage(PacketOpenManual message, MessageContext ctx){ + ctx.getServerHandler().playerEntity.openGui(ActuallyAdditions.instance, GuiHandler.MANUAL_ID, ctx.getServerHandler().playerEntity.worldObj, (int)ctx.getServerHandler().playerEntity.posX, (int)ctx.getServerHandler().playerEntity.posY, (int)ctx.getServerHandler().playerEntity.posZ); + return null; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java b/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java new file mode 100644 index 000000000..651cd5024 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java @@ -0,0 +1,23 @@ +package ellpeck.actuallyadditions.manual; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotImmovable extends Slot{ + + public SlotImmovable(IInventory inventory, int id, int x, int y){ + super(inventory, id, x, y); + } + + @Override + public boolean isItemValid(ItemStack stack){ + return false; + } + + @Override + public boolean canTakeStack(EntityPlayer player){ + return false; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java index 23daabe01..ce741d06b 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.network; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; +import ellpeck.actuallyadditions.manual.PacketOpenManual; import ellpeck.actuallyadditions.network.gui.PacketGuiButton; import ellpeck.actuallyadditions.util.ModUtil; @@ -16,5 +17,6 @@ public class PacketHandler{ theNetwork.registerMessage(PacketTileEntityFeeder.Handler.class, PacketTileEntityFeeder.class, 0, Side.CLIENT); theNetwork.registerMessage(PacketGuiButton.Handler.class, PacketGuiButton.class, 1, Side.SERVER); theNetwork.registerMessage(PacketFluidCollectorToClient.Handler.class, PacketFluidCollectorToClient.class, 2, Side.CLIENT); + theNetwork.registerMessage(PacketOpenManual.Handler.class, PacketOpenManual.class, 3, Side.SERVER); } } diff --git a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java index 8c3ccc31d..aef05af84 100644 --- a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java +++ b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java @@ -22,16 +22,16 @@ public class ClientProxy implements IProxy{ @Override public void preInit(){ Util.logInfo("PreInitializing ClientProxy..."); + + if(ConfigBoolValues.DO_UPDATE_CHECK.isEnabled()){ + new UpdateChecker().init(); + } } @Override public void init(){ Util.logInfo("Initializing ClientProxy..."); - if(ConfigBoolValues.DO_UPDATE_CHECK.isEnabled()){ - new UpdateChecker().init(); - } - ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCompost.class, new RenderTileEntity(new ModelCompost())); MinecraftForgeClient.registerItemRenderer(Item.getItemFromBlock(InitBlocks.blockCompost), new RenderItems(new ModelCompost())); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index f4c698971..870ab38ea 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -4,11 +4,27 @@ import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.NetworkManager; +import net.minecraft.network.Packet; +import net.minecraft.network.play.server.S35PacketUpdateTileEntity; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; public class TileEntityBase extends TileEntity{ + @Override + public Packet getDescriptionPacket(){ + NBTTagCompound tag = new NBTTagCompound(); + this.writeToNBT(tag); + return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, tag); + } + + @Override + public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity pkt){ + this.readFromNBT(pkt.func_148857_g()); + } + public static void init(){ Util.logInfo("Registering TileEntities..."); GameRegistry.registerTileEntity(TileEntityCompost.class, ModUtil.MOD_ID_LOWER + ":tileEntityCompost"); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index e9c031d52..b0bb6e74b 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -164,7 +164,6 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ if(receive != null){ int actualReceive = ((IFluidHandler)tile).fill(side.getOpposite(), receive, true); this.drain(side, new FluidStack(receive.getFluid(), actualReceive), true); - worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); } } } @@ -256,7 +255,6 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ int receive = this.extractEnergy(side, Math.min(((IEnergyReceiver)tile).getMaxEnergyStored(ForgeDirection.UNKNOWN)-((IEnergyReceiver)tile).getEnergyStored(ForgeDirection.UNKNOWN), this.getEnergyStored(ForgeDirection.UNKNOWN)), true); int actualReceive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), receive, false); this.extractEnergy(side, actualReceive, false); - worldObj.markBlockForUpdate(xCoord+side.offsetX, yCoord+side.offsetY, zCoord+side.offsetZ); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java index ff35bbba2..966e20dc5 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java @@ -17,16 +17,6 @@ public class BlockUtil{ return ModUtil.MOD_ID_LOWER + "." + ((INameableItem)block).getName(); } - @SuppressWarnings("unchecked") - public static void addInformation(Block block, List list, int lines, String extraName){ - if(KeyUtil.isShiftPressed()){ - for(int i = 0; i < lines; i++){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)block).getName() + extraName + ".desc" + (lines > 1 ? "." +(i+1) : ""))); - } - } - else list.add(ItemUtil.shiftForInfo()); - } - @SuppressWarnings("unchecked") public static void addPowerUsageInfo(List list, int usage){ if(KeyUtil.isShiftPressed()){ @@ -36,9 +26,7 @@ public class BlockUtil{ @SuppressWarnings("unchecked") public static void addPowerProductionInfo(List list, int produce){ - if(KeyUtil.isShiftPressed()){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".produces.desc") + " " + produce + " RF/t"); - } + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".produces.desc") + " " + produce + " RF/t"); } public static final ArrayList wailaRegisterList = new ArrayList(); diff --git a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java index b38dd0e51..19473d002 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java @@ -4,23 +4,10 @@ import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.creative.CreativeTab; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; -import java.util.List; - public class ItemUtil{ - @SuppressWarnings("unchecked") - public static void addInformation(Item item, List list, int lines, String extraName){ - if(KeyUtil.isShiftPressed()){ - for(int i = 0; i < lines; i++){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)item).getName() + extraName + ".desc" + (lines > 1 ? "." +(i+1) : ""))); - } - } - else list.add(shiftForInfo()); - } - public static void registerItems(Item[] items){ for(Item item : items){ register(item); @@ -50,8 +37,4 @@ public class ItemUtil{ public static String createUnlocalizedName(Item item){ return ModUtil.MOD_ID_LOWER + "." + ((INameableItem)item).getName(); } - - public static String shiftForInfo(){ - return StringUtil.GREEN + StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".shiftForInfo.desc"); - } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 94485205f..788a79906 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -3,11 +3,17 @@ package ellpeck.actuallyadditions.util; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import net.minecraft.block.Block; +import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; +import net.minecraft.util.MathHelper; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; @@ -39,18 +45,36 @@ public class WorldUtil{ if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); storage.extractEnergy(receive, false); - world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } } } + public static MovingObjectPosition raytraceEntity(World world, Entity player, double range){ + float f1 = player.prevRotationPitch+(player.rotationPitch-player.prevRotationPitch)*1.0F; + float f2 = player.prevRotationYaw+(player.rotationYaw-player.prevRotationYaw)*1.0F; + double d0 = player.prevPosX+(player.posX-player.prevPosX)*1.0D; + double d1 = player.prevPosY+(player.posY-player.prevPosY)*1.0D; + if(!world.isRemote && player instanceof EntityPlayer) d1 += 1.62D; + double d2 = player.prevPosZ+(player.posZ-player.prevPosZ)*1.0D; + Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); + float f3 = MathHelper.cos(-f2*0.017453292F-(float)Math.PI); + float f4 = MathHelper.sin(-f2*0.017453292F-(float)Math.PI); + float f5 = -MathHelper.cos(-f1*0.017453292F); + float f6 = MathHelper.sin(-f1*0.017453292F); + float f7 = f4*f5; + float f8 = f3*f5; + double d3 = range; + if(player instanceof EntityPlayerMP) d3 = ((EntityPlayerMP)player).theItemInWorldManager.getBlockReachDistance(); + Vec3 vec31 = vec3.addVector((double)f7*d3, (double)f6*d3, (double)f8*d3); + return world.func_147447_a(vec3, vec31, false, true, false); + } + public static void pushFluid(World world, int x, int y, int z, ForgeDirection side, FluidTank tank){ TileEntity tile = getTileEntityFromSide(side, world, x, y, z); if(tile != null && tank.getFluid() != null && tile instanceof IFluidHandler){ if(((IFluidHandler)tile).canFill(side.getOpposite(), tank.getFluid().getFluid())){ int receive = ((IFluidHandler)tile).fill(side.getOpposite(), tank.getFluid(), true); tank.drain(receive, true); - world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } } } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 308f4baf9..edfb1c215 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -134,7 +134,7 @@ tooltip.actuallyadditions.itemResonantRice.uncraftable.desc=Uncraftable because tile.actuallyadditions.blockCanolaPress.name=Canola Press tooltip.actuallyadditions.blockCanolaPress.desc=Makes Canola Oil from Canola tile.actuallyadditions.blockFermentingBarrel.name=Fermenting Barrel -tooltip.actuallyadditions.blockFermentingBarrel.desc=Ferments Canola Oil made in a Press to Canola +tooltip.actuallyadditions.blockFermentingBarrel.desc=Ferments Canola Oil made in a Press to Oil tile.actuallyadditions.blockCanolaOil.name=Canola Oil tooltip.actuallyadditions.blockCanolaOil.desc=Oil made from Canola @@ -264,7 +264,8 @@ item.actuallyadditions.itemDustQuartz.name=Crushed Quartz item.actuallyadditions.itemDustCoal.name=Crushed Coal item.actuallyadditions.itemDustQuartzBlack.name=Crushed Black Quartz -tooltip.actuallyadditions.shiftForInfo.desc=Press Shift for Info +tooltip.actuallyadditions.moreInfo.desc.1=Open the Actually Additions Manual +tooltip.actuallyadditions.moreInfo.desc.2=with the Button in your Inventory! tooltip.actuallyadditions.hunger.desc=Fills tooltip.actuallyadditions.saturation.desc=Saturation tooltip.actuallyadditions.durability.desc=Durability @@ -450,6 +451,7 @@ container.actuallyadditions.energyface.name=Energyface container.actuallyadditions.fluidPlacer.name=Fluid Placer container.actuallyadditions.fluidCollector.name=Fluid Collector container.actuallyadditions.coffeeMachine.name=Coffee Machine +container.actuallyadditions.manual.name=Actually Additions Manual container.nei.actuallyadditions.crushing.name=Crusher container.nei.actuallyadditions.ballOfHair.name=Ball Of Hair Usage diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png new file mode 100644 index 0000000000000000000000000000000000000000..2c18e219155591bae1410b64a60488bf0b019af3 GIT binary patch literal 2012 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~62^QA&dRf`N&DBm;)v@9e6; zXy+{Oh%9Dc;M)qqjLC&FP5=cZN?apKg7ec#$`gxH8440J^GfvcQcDy}^bGV&Q(KKv zfdz__r;B4qMcmsPfklrD1Y84|PX3$zM(|Uxw5QyoR|#HQ-u-n9Op2b4q=v>AH%hy=GugGIy5MXrpU;O6x-~W>w8NM8j-5<}}z;Mq{u;|`L z2YrSM>1nSQt2wP_xFCA%hJ0h&(%q{>#21LYSf|Cxwt{8XYOjfma;!jVA)_3Kw~^7T z@!hH*1%}$l2kiXH>2S8YJnkI;K2S)1W~t z`)=sc9Sl{WKxzYnFOYo9urKrMxj)Z18$S23S1~p`(~tIPsj>EF+>+hqil`u|kpCHud4o(6jsxHlhI-#J&fT9@I=6w~Lj=Xn_z!WiyvNlUN$%yOXe zc=6`_4cmm(oSeU%>pw67R98U30_A81h6Sy_`XMTUfraUVZ+6);^Z8s0I?ss-E8gd0 zV91!t?BFkH0aFj8OH#mbki={tn3b&bwM7gsG@02EiW>TI7#SMG!g3hYoN___ z09q2t$6%ZK0HKEA!bDvLh6{(fcn`R&=tHs_h&!_;V0!Y6&AqMnK;!(B)r7Oo= zPHYG2k9x{*A(##5NjQ+b2~2UiYi=<3wA`A(@v{t=;#SK5L;V0|kcmn^NEKdKF)i>Vo=KPqVyKSh1Xjc7hKO|c36Lz hts!oCZc#((Pxh&`X?9FCDm5Snc)I$ztaD0e0ss{sTbcj> literal 0 HcmV?d00001 From 9568befa4ba750eb3d28fa6c6dfbad80f9d21c38 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 17 Jun 2015 22:11:20 +0200 Subject: [PATCH 18/29] -Hotfix because Friky --- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/update/changelog.txt b/update/changelog.txt index 5af4fe492..eb24747a5 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Made the Coffee Machine less OP :P \ No newline at end of file +Fixed a Bug with the Phantom Liquiface crashing with missing TankInfos \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index c931343ef..c7e9f866a 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.5 \ No newline at end of file +1.7.10-0.0.5.6 \ No newline at end of file From 9f11e8d73a309635cab357c4ae269437b8ac8091 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 18 Jun 2015 13:14:57 +0200 Subject: [PATCH 19/29] Updates! :D --- build.gradle | 4 +- .../blocks/BlockBreaker.java | 10 + .../blocks/BlockCanolaPress.java | 1 + .../blocks/BlockCoalGenerator.java | 3 +- .../blocks/BlockCoffeeMachine.java | 11 + .../blocks/BlockCompost.java | 8 + .../blocks/BlockContainerBase.java | 41 ++-- .../blocks/BlockDropper.java | 10 + .../actuallyadditions/blocks/BlockFeeder.java | 10 + .../blocks/BlockFermentingBarrel.java | 10 + .../blocks/BlockFishingNet.java | 11 + .../blocks/BlockFluidCollector.java | 10 + .../blocks/BlockFluidFlowing.java | 11 + .../blocks/BlockFurnaceDouble.java | 10 + .../blocks/BlockFurnaceSolar.java | 3 +- .../blocks/BlockGiantChest.java | 10 + .../blocks/BlockGreenhouseGlass.java | 11 + .../blocks/BlockGrinder.java | 11 + .../blocks/BlockHeatCollector.java | 3 +- .../blocks/BlockInputter.java | 18 +- .../blocks/BlockItemRepairer.java | 1 + .../blocks/BlockLavaFactoryController.java | 14 ++ .../actuallyadditions/blocks/BlockMisc.java | 9 + .../blocks/BlockOilGenerator.java | 3 +- .../blocks/BlockPhantomBooster.java | 11 + .../blocks/BlockPhantomface.java | 14 +- .../actuallyadditions/blocks/BlockPlant.java | 9 + .../actuallyadditions/blocks/InitBlocks.java | 11 +- .../config/ConfigCategories.java | 3 +- .../config/ConfigurationHandler.java | 2 + .../config/values/ConfigBoolValues.java | 11 +- .../crafting/InitCrafting.java | 1 - .../crafting/ItemCrafting.java | 2 +- .../creative/CreativeTab.java | 2 +- .../actuallyadditions/event/InitEvents.java | 3 - .../gen/VillageComponentJamHouse.java | 2 +- .../inventory/GuiHandler.java | 11 +- .../actuallyadditions/items/InitItems.java | 6 +- .../actuallyadditions/items/ItemBucketAA.java | 10 + .../actuallyadditions/items/ItemCoffee.java | 23 +- .../items/ItemCoffeeBean.java | 11 + .../items/ItemCrafterOnAStick.java | 10 + .../actuallyadditions/items/ItemDrill.java | 67 ++--- .../items/ItemDrillUpgrade.java | 26 +- .../actuallyadditions/items/ItemDust.java | 9 + .../items/ItemFertilizer.java | 10 + .../actuallyadditions/items/ItemFoods.java | 10 +- .../items/ItemHairyBall.java | 9 + .../actuallyadditions/items/ItemJams.java | 19 ++ .../actuallyadditions/items/ItemKnife.java | 11 +- .../items/ItemLeafBlower.java | 17 +- .../actuallyadditions/items/ItemMisc.java | 9 + .../items/ItemPhantomConnector.java | 2 + .../items/ItemPotionRing.java | 10 + .../items/ItemResonantRice.java | 15 +- .../actuallyadditions/items/ItemSeed.java | 9 + .../items/ItemSpecialDrop.java | 8 + .../items/tools/ItemAllToolAA.java | 27 +- .../items/tools/ItemAxeAA.java | 17 ++ .../items/tools/ItemHoeAA.java | 8 +- .../items/tools/ItemPickaxeAA.java | 8 +- .../items/tools/ItemShovelAA.java | 8 +- .../items/tools/ItemSwordAA.java | 8 +- .../manual/ContainerManual.java | 232 ------------------ .../actuallyadditions/manual/GuiManual.java | 115 --------- .../manual/InventoryEvents.java | 56 ----- .../actuallyadditions/manual/ManualItems.java | 77 ------ .../manual/PacketOpenManual.java | 35 --- .../manual/SlotImmovable.java | 23 -- .../network/PacketHandler.java | 2 - .../tile/TileEntityGreenhouseGlass.java | 3 +- .../tile/TileEntityLavaFactoryController.java | 11 +- .../tile/TileEntityPhantomface.java | 2 +- .../actuallyadditions/util/BlockUtil.java | 14 +- .../actuallyadditions/util/ItemUtil.java | 17 ++ .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 46 ++-- .../waila/WailaDataProvider.java | 2 +- .../assets/actuallyadditions/lang/en_US.lang | 6 +- .../textures/gui/guiManual.png | Bin 2012 -> 1859 bytes .../textures/items/diamondPaxel.png | Bin 354 -> 442 bytes .../textures/items/emeraldPaxel.png | Bin 326 -> 477 bytes .../textures/items/goldPaxel.png | Bin 351 -> 486 bytes .../textures/items/ironPaxel.png | Bin 340 -> 473 bytes .../textures/items/obsidianPaxel.png | Bin 334 -> 456 bytes .../textures/items/stonePaxel.png | Bin 336 -> 465 bytes .../textures/items/woodenPaxel.png | Bin 338 -> 467 bytes .../actuallyadditions/textures/logo.png | Bin 19812 -> 64063 bytes .../actuallyadditions/textures/logoBig.png | Bin 158789 -> 156607 bytes .../actuallyadditions/textures/logoSquare.png | Bin 28536 -> 2921 bytes src/main/resources/mcmod.info | 14 +- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 93 files changed, 620 insertions(+), 723 deletions(-) delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java delete mode 100644 src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java diff --git a/build.gradle b/build.gradle index b3797a3db..03d308b69 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.5" +version = "1.7.10-0.0.5.7" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" @@ -53,7 +53,7 @@ processResources{ from(sourceSets.main.resources.srcDirs) { include 'mcmod.info' - expand 'update':project.version, 'mcversion':project.minecraft.version + expand 'version':project.version, 'mcversion':project.minecraft.version } from(sourceSets.main.resources.srcDirs) { diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java index d4379a444..e46eb1296 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockBreaker.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityBreaker; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -21,6 +22,8 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; + public class BlockBreaker extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -117,6 +120,13 @@ public class BlockBreaker extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java index 167bf6a02..16ca12ff4 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCanolaPress.java @@ -100,6 +100,7 @@ public class BlockCanolaPress extends BlockContainerBase implements INameableIte @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerUsageInfo(list, TileEntityCanolaPress.energyUsedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java index 030e05169..b57296420 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java @@ -99,7 +99,8 @@ public class BlockCoalGenerator extends BlockContainerBase implements INameableI @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerProductionInfo(list, TileEntityCoalGenerator.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java index 309231119..c0dcaf928 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoffeeMachine.java @@ -6,6 +6,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityCoffeeMachine; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -21,6 +22,8 @@ import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; +import java.util.List; + public class BlockCoffeeMachine extends BlockContainerBase implements INameableItem{ public BlockCoffeeMachine(){ @@ -121,6 +124,14 @@ public class BlockCoffeeMachine extends BlockContainerBase implements INameableI return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 5, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityCoffeeMachine.energyUsePerTick); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java index 9fda45de0..8953a197e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCompost.java @@ -8,6 +8,7 @@ import ellpeck.actuallyadditions.items.ItemFertilizer; import ellpeck.actuallyadditions.items.ItemMisc; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.tile.TileEntityCompost; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -148,6 +149,13 @@ public class BlockCompost extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java index 001823ba0..d7de4dbf3 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java @@ -19,27 +19,30 @@ public abstract class BlockContainerBase extends BlockContainer{ super(mat); } - public TileEntityInventoryBase dropInventory(World world, int x, int y, int z){ - TileEntityInventoryBase tileEntity = (TileEntityInventoryBase)world.getTileEntity(x, y, z); - for (int i = 0; i < tileEntity.getSizeInventory(); i++){ - ItemStack itemStack = tileEntity.getStackInSlot(i); - if (itemStack != null && itemStack.stackSize > 0) { - Random rand = new Random(); - float dX = rand.nextFloat() * 0.8F + 0.1F; - float dY = rand.nextFloat() * 0.8F + 0.1F; - float dZ = rand.nextFloat() * 0.8F + 0.1F; - EntityItem entityItem = new EntityItem(world, x + dX, y + dY, z + dZ, itemStack.copy()); - if (itemStack.hasTagCompound()) - entityItem.getEntityItem().setTagCompound((NBTTagCompound) itemStack.getTagCompound().copy()); - float factor = 0.05F; - entityItem.motionX = rand.nextGaussian() * factor; - entityItem.motionY = rand.nextGaussian() * factor + 0.2F; - entityItem.motionZ = rand.nextGaussian() * factor; - world.spawnEntityInWorld(entityItem); - itemStack.stackSize = 0; + public void dropInventory(World world, int x, int y, int z){ + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityInventoryBase){ + TileEntityInventoryBase tileEntity = (TileEntityInventoryBase)tile; + if(tileEntity.getSizeInventory() > 0){ + for(int i = 0; i < tileEntity.getSizeInventory(); i++){ + ItemStack itemStack = tileEntity.getStackInSlot(i); + if(itemStack != null && itemStack.stackSize > 0){ + Random rand = new Random(); + float dX = rand.nextFloat()*0.8F+0.1F; + float dY = rand.nextFloat()*0.8F+0.1F; + float dZ = rand.nextFloat()*0.8F+0.1F; + EntityItem entityItem = new EntityItem(world, x+dX, y+dY, z+dZ, itemStack.copy()); + if(itemStack.hasTagCompound()) entityItem.getEntityItem().setTagCompound((NBTTagCompound)itemStack.getTagCompound().copy()); + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian()*factor; + entityItem.motionY = rand.nextGaussian()*factor+0.2F; + entityItem.motionZ = rand.nextGaussian()*factor; + world.spawnEntityInWorld(entityItem); + itemStack.stackSize = 0; + } + } } } - return tileEntity; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java index d4737dfdb..7779a84eb 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockDropper.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityDropper; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -21,6 +22,8 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; + public class BlockDropper extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -114,6 +117,13 @@ public class BlockDropper extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java index a72632581..e135def6d 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFeeder.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFeeder; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -18,6 +19,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class BlockFeeder extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -93,6 +96,13 @@ public class BlockFeeder extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java index 3ac6685dc..68ab2eb43 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFermentingBarrel.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFermentingBarrel; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -18,6 +19,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class BlockFermentingBarrel extends BlockContainerBase implements INameableItem{ private IIcon iconTop; @@ -93,6 +96,13 @@ public class BlockFermentingBarrel extends BlockContainerBase implements INameab return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java index 37b3b7ca6..d6cd5edcd 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFishingNet.java @@ -4,10 +4,12 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityFishingNet; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; @@ -16,6 +18,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class BlockFishingNet extends BlockContainerBase implements INameableItem{ public BlockFishingNet(){ @@ -88,6 +92,13 @@ public class BlockFishingNet extends BlockContainerBase implements INameableItem return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java index 5cc8ba797..5c7ec84af 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidCollector.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFluidCollector; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -21,6 +22,8 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; + public class BlockFluidCollector extends BlockContainerBase implements INameableItem{ private IIcon frontIcon; @@ -117,6 +120,13 @@ public class BlockFluidCollector extends BlockContainerBase implements INameable return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java index 02b11aff4..c60c1f7a4 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFluidFlowing.java @@ -2,11 +2,13 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -16,6 +18,8 @@ import net.minecraft.world.World; import net.minecraftforge.fluids.BlockFluidClassic; import net.minecraftforge.fluids.Fluid; +import java.util.List; + public class BlockFluidFlowing extends BlockFluidClassic implements INameableItem{ private String name; @@ -84,6 +88,13 @@ public class BlockFluidFlowing extends BlockFluidClassic implements INameableIte return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java index 958d16555..a0986d1c9 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFurnaceDouble; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -21,6 +22,7 @@ import net.minecraft.util.MathHelper; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; import java.util.Random; public class BlockFurnaceDouble extends BlockContainerBase implements INameableItem{ @@ -164,6 +166,14 @@ public class BlockFurnaceDouble extends BlockContainerBase implements INameableI return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + BlockUtil.addPowerUsageInfo(list, TileEntityFurnaceDouble.energyUsePerTick); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java index 071b520e1..36949cd77 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceSolar.java @@ -95,7 +95,8 @@ public class BlockFurnaceSolar extends BlockContainerBase implements INameableIt @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerProductionInfo(list, TileEntityFurnaceSolar.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java index 2238fed2a..509dca6fe 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGiantChest.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityGiantChest; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -18,6 +19,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class BlockGiantChest extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -95,6 +98,13 @@ public class BlockGiantChest extends BlockContainerBase implements INameableItem return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java index a2699b179..60f0291cf 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGreenhouseGlass.java @@ -3,11 +3,13 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityGreenhouseGlass; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -17,6 +19,8 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; + public class BlockGreenhouseGlass extends BlockContainerBase implements INameableItem{ public BlockGreenhouseGlass(){ @@ -96,6 +100,13 @@ public class BlockGreenhouseGlass extends BlockContainerBase implements INameabl return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java index 0a159ad7e..1c63f53f6 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGrinder.java @@ -3,8 +3,10 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityGrinder; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; @@ -19,6 +21,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; +import java.util.List; import java.util.Random; public class BlockGrinder extends BlockContainerBase implements INameableItem{ @@ -127,6 +130,14 @@ public class BlockGrinder extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, ((BlockGrinder)theBlock).isDouble ? 3 : 4, ""); + BlockUtil.addPowerUsageInfo(list, ((BlockGrinder)theBlock).isDouble ? ConfigIntValues.GRINDER_DOUBLE_ENERGY_USED.getValue() : ConfigIntValues.GRINDER_ENERGY_USED.getValue()); + } + @Override public int getMetadata(int meta){ return meta; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java index 2b5cf366a..c026c01dd 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockHeatCollector.java @@ -83,7 +83,8 @@ public class BlockHeatCollector extends BlockContainerBase implements INameableI @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 3, ""); BlockUtil.addPowerProductionInfo(list, TileEntityHeatCollector.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java index 5030fe972..5f9495cde 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java @@ -5,8 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityInputter; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -19,6 +18,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; import java.util.Random; public class BlockInputter extends BlockContainerBase implements INameableItem{ @@ -115,6 +115,20 @@ public class BlockInputter extends BlockContainerBase implements INameableItem{ return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocalFormatted("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + 1, StringUtil.OBFUSCATED, StringUtil.LIGHT_GRAY)); + for(int i = 1; i < 6; i++){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + (i + 1))); + } + if((((BlockInputter)theBlock).isAdvanced)) list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)theBlock).getName() + ".desc")); + } + else list.add(ItemUtil.shiftForInfo()); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java index 81db9ff99..10be6b9a1 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java @@ -121,6 +121,7 @@ public class BlockItemRepairer extends BlockContainerBase implements INameableIt @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerUsageInfo(list, TileEntityItemRepairer.energyUsePerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java index 55fde2db3..782eb30f2 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockLavaFactoryController.java @@ -3,7 +3,9 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityLavaFactoryController; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -18,6 +20,8 @@ import net.minecraft.util.IIcon; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import java.util.List; + public class BlockLavaFactoryController extends BlockContainerBase implements INameableItem{ private IIcon topIcon; @@ -96,6 +100,16 @@ public class BlockLavaFactoryController extends BlockContainerBase implements IN return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 3, ""); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".uses.desc") + " " + TileEntityLavaFactoryController.energyNeededToProduceLava + " RF/B"); + } + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java index 5fa59a537..513a52bcc 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java @@ -3,12 +3,14 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; @@ -85,6 +87,13 @@ public class BlockMisc extends Block implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscBlocks.length ? " ERROR!" : allMiscBlocks[stack.getItemDamage()].getName()); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, allMiscBlocks[stack.getItemDamage()].getName()); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java index 3af1ded7e..28e8d6568 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java @@ -99,7 +99,8 @@ public class BlockOilGenerator extends BlockContainerBase implements INameableIt @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); BlockUtil.addPowerProductionInfo(list, TileEntityOilGenerator.energyProducedPerTick); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java index ae6835f3c..268276d99 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomBooster.java @@ -4,10 +4,12 @@ import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityPhantomBooster; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBlock; @@ -16,6 +18,8 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class BlockPhantomBooster extends BlockContainerBase implements INameableItem{ public BlockPhantomBooster(){ @@ -90,6 +94,13 @@ public class BlockPhantomBooster extends BlockContainerBase implements INameable return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 2, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java index 148a9a573..06b5c994f 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPhantomface.java @@ -7,8 +7,7 @@ import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -156,8 +155,15 @@ public class BlockPhantomface extends BlockContainerBase implements INameableIte @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 2, ""); + if(KeyUtil.isShiftPressed()){ + if(((BlockPhantomface)this.theBlock).type == LIQUIFACE){ + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.3")); + list.add(StringUtil.ORANGE+StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomLiquiface.desc.4")); + } + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".blockPhantomRange.desc") + ": " + ((BlockPhantomface)theBlock).range); + } } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index ea2402abb..f9298b9ac 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -3,11 +3,13 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.ItemSeed; +import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.BlockCrops; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; @@ -131,6 +133,13 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar return this.getUnlocalizedName(); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + @Override public int getMetadata(int damage){ return damage; diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 7b20e5acf..6044ab5df 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -1,5 +1,6 @@ package ellpeck.actuallyadditions.blocks; +import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; @@ -184,7 +185,7 @@ public class InitBlocks{ public static void registerFluids(){ String canolaOil = "canolaoil"; - if(!FluidRegistry.isFluidRegistered(canolaOil)){ + if(!FluidRegistry.isFluidRegistered(canolaOil) || ConfigBoolValues.PREVENT_CANOLA_OVERRIDE.isEnabled()){ fluidCanolaOil = new FluidAA(canolaOil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); FluidRegistry.registerFluid(fluidCanolaOil); } @@ -193,7 +194,7 @@ public class InitBlocks{ } fluidCanolaOil = FluidRegistry.getFluid(canolaOil); - if(fluidCanolaOil.getBlock() == null){ + if(fluidCanolaOil.getBlock() == null || ConfigBoolValues.PREVENT_CANOLA_BLOCK_OVERRIDE.isEnabled()){ blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); } @@ -203,7 +204,7 @@ public class InitBlocks{ blockCanolaOil = fluidCanolaOil.getBlock(); String oil = "oil"; - if(!FluidRegistry.isFluidRegistered(oil)){ + if(!FluidRegistry.isFluidRegistered(oil) || ConfigBoolValues.PREVENT_OIL_OVERRIDE.isEnabled()){ fluidOil = new FluidAA(oil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); FluidRegistry.registerFluid(fluidOil); } @@ -212,7 +213,7 @@ public class InitBlocks{ } fluidOil = FluidRegistry.getFluid(oil); - if(fluidOil.getBlock() == null){ + if(fluidOil.getBlock() == null || ConfigBoolValues.PREVENT_OIL_BLOCK_OVERRIDE.isEnabled()){ blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); } @@ -223,6 +224,6 @@ public class InitBlocks{ } public static void errorAlreadyRegistered(String str){ - ModUtil.LOGGER.log(Level.WARN, str + " from Actually Additions is not getting used as it has already been registered by another Mod! Issues may (but shouldn't) occur!"); + ModUtil.LOGGER.log(Level.WARN, str + " from Actually Additions is not getting used as it has already been registered by another Mod! If this causes Issues (which it shouldn't!), you can turn this off in the Config File!"); } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java b/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java index eab30ea58..fac93403a 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java +++ b/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java @@ -11,7 +11,8 @@ public enum ConfigCategories{ MOB_DROPS("mob drops"), WORLD_GEN("world gen"), POTION_RING_CRAFTING("ring crafting"), - OTHER("other"); + OTHER("other"), + FLUIDS("fluids"); public final String name; diff --git a/src/main/java/ellpeck/actuallyadditions/config/ConfigurationHandler.java b/src/main/java/ellpeck/actuallyadditions/config/ConfigurationHandler.java index 735f1ce90..dd9ff7cf2 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/ConfigurationHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/config/ConfigurationHandler.java @@ -7,6 +7,8 @@ import java.io.File; public class ConfigurationHandler{ + public static final String ISSUES_WARNING = " [THIS COULD CAUSE ISSUES, CHANGE AT YOUR OWN RISK!]"; + public static void init(File configFile){ Util.logInfo("Grabbing Configurations..."); Configuration config = new Configuration(configFile); diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java index 260536f75..b33a7f454 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigBoolValues.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.config.values; import ellpeck.actuallyadditions.config.ConfigCategories; import ellpeck.actuallyadditions.config.ConfigValues; +import ellpeck.actuallyadditions.config.ConfigurationHandler; public enum ConfigBoolValues{ @@ -20,15 +21,21 @@ public enum ConfigBoolValues{ PEARL_SHARD_DROP("Ender Pearl Shard", ConfigCategories.MOB_DROPS, true, "If the Ender Pearl Shard drops from Mobs"), EMERALD_SHARD_CROP("Emerald Shard", ConfigCategories.MOB_DROPS, true, "If the Emerald Shard drops from Mobs"), + DO_WAILA_INFO("Waila Display Info", ConfigCategories.OTHER, true, "If the Shift Description should display in Waila too"), + DO_UPDATE_CHECK("Do Update Check", ConfigCategories.OTHER, true, "If Actually Additions should check for an Update on joining a World"), DO_CRUSHER_SPAM("Crusher Debug", ConfigCategories.OTHER, false, "Print out Crusher Recipe Initializing Debug"), DO_CAT_DROPS("Do Cat Drops", ConfigCategories.OTHER, true, "If Cats drop Hairy Balls on Occasion"), - DO_WAILA_INFO("Waila Display Info", ConfigCategories.OTHER, true, "If the Shift Description should display in Waila too"), DO_RICE_GEN("Rice Gen", ConfigCategories.WORLD_GEN, true, "If Rice should generate in the World"), DO_CANOLA_GEN("Canola Gen", ConfigCategories.WORLD_GEN, true, "If Canola should generate in the World"), DO_FLAX_GEN("Flax Gen", ConfigCategories.WORLD_GEN, true, "If Flax should generate in the World"), - DO_COFFEE_GEN("Coffee Gen", ConfigCategories.WORLD_GEN, true, "If Coffee should generate in the World"); + DO_COFFEE_GEN("Coffee Gen", ConfigCategories.WORLD_GEN, true, "If Coffee should generate in the World"), + + PREVENT_OIL_OVERRIDE("Oil Fluid Override", ConfigCategories.FLUIDS, false, "If not registering Oil Fluids from Actually Additions if other Oil is already registered should be prevented"+ConfigurationHandler.ISSUES_WARNING), + PREVENT_CANOLA_OVERRIDE("Canola Oil Fluid Override", ConfigCategories.FLUIDS, false, "If not registering Canola Oil Fluids from Actually Additions if other Canola Oil is already registered should be prevented"+ConfigurationHandler.ISSUES_WARNING), + PREVENT_OIL_BLOCK_OVERRIDE("Oil Block Override", ConfigCategories.FLUIDS, false, "If not registering Oil Blocks from Actually Additions if other Oil is already registered should be prevented"+ConfigurationHandler.ISSUES_WARNING), + PREVENT_CANOLA_BLOCK_OVERRIDE("Canola Oil Block Override", ConfigCategories.FLUIDS, false, "If not registering Canola Oil Blocks from Actually Additions if other Canola Oil is already registered should be prevented"+ConfigurationHandler.ISSUES_WARNING); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/InitCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/InitCrafting.java index e52c97ae2..9697c3a98 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/InitCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/InitCrafting.java @@ -12,7 +12,6 @@ public class InitCrafting { MiscCrafting.init(); FoodCrafting.init(); ToolCrafting.init(); - } } diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java index ecbfd8be2..5cde60751 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java @@ -35,7 +35,7 @@ public class ItemCrafting{ 'B', new ItemStack(Items.potionitem))); } - //Leaf Blower + //Leaf Blower if(ConfigCrafting.LEAF_BLOWER.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemLeafBlower), " F", "IP", "IC", diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 9a718cc65..156f8d699 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -61,7 +61,7 @@ public class CreativeTab extends CreativeTabs{ addBlock(InitBlocks.blockCanolaPress); addBlock(InitBlocks.blockFermentingBarrel); - addItem(InitItems.itemDrill); + //addItem(InitItems.itemDrill); addItem(InitItems.itemPhantomConnector); addItem(InitItems.itemBucketCanolaOil); addItem(InitItems.itemBucketOil); diff --git a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java index 64d78776f..638251ebc 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java +++ b/src/main/java/ellpeck/actuallyadditions/event/InitEvents.java @@ -1,6 +1,5 @@ package ellpeck.actuallyadditions.event; -import ellpeck.actuallyadditions.manual.InventoryEvents; import ellpeck.actuallyadditions.util.Util; public class InitEvents{ @@ -16,8 +15,6 @@ public class InitEvents{ Util.registerEvent(new EntityLivingEvent()); Util.registerEvent(new WorldDecorationEvent()); Util.registerEvent(new BucketFillEvent()); - Util.registerEvent(new InventoryEvents.InitGuiEvent()); - Util.registerEvent(new InventoryEvents.ButtonPressedEvent()); } } diff --git a/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java b/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java index e2fda48a1..7241492df 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java @@ -50,7 +50,7 @@ public class VillageComponentJamHouse extends StructureVillagePieces.House1{ for (int i = 0; i < xSize; i++){ for(int j = 0; j < zSize; j++){ this.clearCurrentPositionBlocksUpwards(world, j, ySize, i, sbb); - this.func_151554_b(world, Blocks.cobblestone, 0, j, -1, i, sbb); + this.func_151554_b(world, Blocks.cobblestone, 0, j, 0, i, sbb); } } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index fc898626e..ef5d7ad73 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -4,8 +4,6 @@ import cpw.mods.fml.common.network.IGuiHandler; import cpw.mods.fml.common.network.NetworkRegistry; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.gui.*; -import ellpeck.actuallyadditions.manual.ContainerManual; -import ellpeck.actuallyadditions.manual.GuiManual; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.util.Util; import net.minecraft.entity.player.EntityPlayer; @@ -16,7 +14,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getServerGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ TileEntityBase tile = null; - if(id != CRAFTER_ID && id != DRILL_ID && id != MANUAL_ID){ + if(id != CRAFTER_ID && id != DRILL_ID){ tile = (TileEntityBase)world.getTileEntity(x, y, z); } switch(id){ @@ -56,8 +54,6 @@ public class GuiHandler implements IGuiHandler{ return new ContainerFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new ContainerCoffeeMachine(entityPlayer.inventory, tile); - case MANUAL_ID: - return new ContainerManual(); default: return null; } @@ -66,7 +62,7 @@ public class GuiHandler implements IGuiHandler{ @Override public Object getClientGuiElement(int id, EntityPlayer entityPlayer, World world, int x, int y, int z){ TileEntityBase tile = null; - if(id != CRAFTER_ID && id != DRILL_ID && id != MANUAL_ID){ + if(id != CRAFTER_ID && id != DRILL_ID){ tile = (TileEntityBase)world.getTileEntity(x, y, z); } switch(id){ @@ -106,8 +102,6 @@ public class GuiHandler implements IGuiHandler{ return new GuiFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new GuiCoffeeMachine(entityPlayer.inventory, tile, x, y, z, world); - case MANUAL_ID: - return new GuiManual(); default: return null; } @@ -132,7 +126,6 @@ public class GuiHandler implements IGuiHandler{ public static final int FLUID_COLLECTOR_ID = 16; public static final int COFFEE_MACHINE_ID = 17; public static final int DRILL_ID = 18; - public static final int MANUAL_ID = 19; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index ead653068..1f48e906a 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -69,13 +69,13 @@ public class InitItems{ public static Item emeraldPaxel; public static Item obsidianPaxel; - public static Item itemDrill; + //public static Item itemDrill; public static void init(){ Util.logInfo("Initializing Items..."); - itemDrill = new ItemDrill(); - ItemUtil.register(itemDrill); + //itemDrill = new ItemDrill(); + //ItemUtil.register(itemDrill); itemBucketOil = new ItemBucketAA(InitBlocks.blockOil, "itemBucketOil"); ItemUtil.register(itemBucketOil); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java index ac429ce64..6c106c564 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemBucketAA.java @@ -3,15 +3,19 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemBucket; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.List; + public class ItemBucketAA extends ItemBucket implements INameableItem{ private String name; @@ -27,6 +31,12 @@ public class ItemBucketAA extends ItemBucket implements INameableItem{ return EnumRarity.uncommon; } + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java index 9c9b80818..17c36aaf2 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffee.java @@ -5,6 +5,8 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -201,17 +203,22 @@ public class ItemCoffee extends ItemFood implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+this.func_150905_g(stack)); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+this.func_150906_h(stack)); - list.add(""); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); + list.add(StatCollector.translateToLocalFormatted("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2", this.getMaxDamage()+1)); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+this.func_150905_g(stack)); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+this.func_150906_h(stack)); + list.add(""); - PotionEffect[] effects = getEffectsFromStack(stack); - if(effects != null && effects.length > 0){ - for(PotionEffect effect : effects){ - list.add(StatCollector.translateToLocal(effect.getEffectName())+" "+(effect.getAmplifier()+1)+ " (" + Potion.getDurationString(new PotionEffect(0, effect.getDuration()*20, 0)) + ")"); + PotionEffect[] effects = getEffectsFromStack(stack); + if(effects != null && effects.length > 0){ + for(PotionEffect effect : effects){ + list.add(StatCollector.translateToLocal(effect.getEffectName())+" "+(effect.getAmplifier()+1)+ " (" + Potion.getDurationString(new PotionEffect(0, effect.getDuration()*20, 0)) + ")"); + } } + else list.add("No Effects"); } - else list.add("No Effects"); + else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java index 1deb06518..08a55cd57 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCoffeeBean.java @@ -3,13 +3,17 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import java.util.List; + public class ItemCoffeeBean extends ItemFood implements INameableItem{ public ItemCoffeeBean(){ @@ -27,6 +31,13 @@ public class ItemCoffeeBean extends ItemFood implements INameableItem{ return EnumRarity.rare; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + ItemUtil.addInformation(this, list, 1, ""); + } + @Override @SideOnly(Side.CLIENT) public IIcon getIcon(ItemStack stack, int pass){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java b/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java index ed99912d9..04e43ba5d 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemCrafterOnAStick.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -14,12 +15,21 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class ItemCrafterOnAStick extends Item implements INameableItem{ public ItemCrafterOnAStick(){ this.setMaxStackSize(1); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index ef7b9baae..1e7923346 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -8,10 +8,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.items.tools.ItemAllToolAA; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.KeyUtil; -import ellpeck.actuallyadditions.util.ModUtil; -import ellpeck.actuallyadditions.util.WorldUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -48,14 +45,14 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } public ItemDrill(){ - super(3000000); + super(500000); this.setMaxStackSize(1); this.setHasSubtypes(true); } public static float defaultEfficiency = 8.0F; + public static int energyUsePerBlockOrHit = 100; - public int energyUsePerBlockOrHit = 100; public float efficiency = defaultEfficiency; @Override @@ -77,23 +74,29 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5){ - boolean hasSilkTouch = this.hasEnchantment(stack, Enchantment.silkTouch) >= 0; - if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)){ - if(!hasSilkTouch){ - //TODO Add more Energy Use as Variable Change (Like Efficiency!) - stack.addEnchantment(Enchantment.silkTouch, 1); - } - } - else if(hasSilkTouch) this.removeEnchantment(stack, Enchantment.silkTouch); + this.addEnchantFromUpgrade(Enchantment.silkTouch, ItemDrillUpgrade.UpgradeType.SILK_TOUCH, stack, 1); + this.addEnchantFromUpgrade(Enchantment.fortune, ItemDrillUpgrade.UpgradeType.FORTUNE, stack, this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1); + } - boolean hasFortune = this.hasEnchantment(stack, Enchantment.fortune) >= 0; - if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE)){ - if(!hasFortune){ - //TODO Add more Energy Use as Variable Change (Like Efficiency!) - stack.addEnchantment(Enchantment.fortune, this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1); + public void addEnchantFromUpgrade(Enchantment enchantment, ItemDrillUpgrade.UpgradeType upgrade, ItemStack stack, int level){ + boolean hasEnchant = this.hasEnchantment(stack, enchantment) >= 0; + if(this.getHasUpgrade(stack, upgrade)){ + if(!hasEnchant){ + stack.addEnchantment(enchantment, level); } } - else if(hasFortune) this.removeEnchantment(stack, Enchantment.fortune); + else if(hasEnchant) this.removeEnchantment(stack, enchantment); + } + + public int getEnergyUsePerBlock(ItemStack stack){ + int use = energyUsePerBlockOrHit; + ItemDrillUpgrade.UpgradeType[] types = ItemDrillUpgrade.UpgradeType.values(); + for(ItemDrillUpgrade.UpgradeType type : types){ + if(this.getHasUpgrade(stack, type)){ + use += type.extraEnergy; + } + } + return use; } public void removeEnchantment(ItemStack stack, Enchantment ench){ @@ -132,8 +135,8 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } public boolean getHasUpgrade(ItemStack stack, ItemDrillUpgrade.UpgradeType upgrade){ - if(upgrade == ItemDrillUpgrade.UpgradeType.SILK_TOUCH) return true; if(upgrade == ItemDrillUpgrade.UpgradeType.THREE_BY_THREE) return true; + if(upgrade == ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE) return true; NBTTagCompound compound = stack.getTagCompound(); if(compound == null) return false; @@ -224,7 +227,7 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ int yRange = radius; int zRange = 0; - MovingObjectPosition pos = WorldUtil.raytraceEntity(world, entity, 4.5D); + MovingObjectPosition pos = WorldUtil.raytraceBlocksFromEntity(world, entity, 4.5D); if(pos != null){ int side = pos.sideHit; if(side == 0 || side == 1){ @@ -239,11 +242,12 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ for(int xPos = x-xRange; xPos <= x+xRange; xPos++){ for(int yPos = y-yRange; yPos <= y+yRange; yPos++){ for(int zPos = z-zRange; zPos <= z+zRange; zPos++){ - if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ + int use = this.getEnergyUsePerBlock(stack); + if(this.getEnergyStored(stack) >= use){ Block block = world.getBlock(xPos, yPos, zPos); float hardness = block.getBlockHardness(world, xPos, yPos, zPos); if(!(xPos == x && yPos == y && zPos == z) && hardness > -1.0F && this.canHarvestBlock(block, stack)){ - this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + this.extractEnergy(stack, use, false); ArrayList drops = new ArrayList(); int meta = world.getBlockMetadata(xPos, yPos, zPos); @@ -282,8 +286,9 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){ - if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ - this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + int use = this.getEnergyUsePerBlock(stack); + if(this.getEnergyStored(stack) >= use){ + this.extractEnergy(stack, use, false); if(!world.isRemote){ if(!living.isSneaking()){ if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ @@ -300,15 +305,16 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public float func_150893_a(ItemStack stack, Block block){ - if(this.getEnergyStored(stack) < this.energyUsePerBlockOrHit) return 0.0F; + if(this.getEnergyStored(stack) < this.getEnergyUsePerBlock(stack)) return 0.0F; if(block.getMaterial() == Material.iron || block.getMaterial() == Material.anvil || block.getMaterial() == Material.rock || allSet.contains(block)) return efficiency; else return super.func_150893_a(stack, block); } @Override public boolean hitEntity(ItemStack stack, EntityLivingBase entity1, EntityLivingBase entity2){ - if(this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit){ - this.extractEnergy(stack, this.energyUsePerBlockOrHit, false); + int use = this.getEnergyUsePerBlock(stack); + if(this.getEnergyStored(stack) >= use){ + this.extractEnergy(stack, use, false); } return true; } @@ -348,12 +354,13 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(KeyUtil.isShiftPressed()){ list.add(this.getEnergyStored(stack) + "/" + this.getMaxEnergyStored(stack) + " RF"); } + else list.add(ItemUtil.shiftForInfo()); } @Override public Multimap getAttributeModifiers(ItemStack stack){ Multimap map = super.getAttributeModifiers(stack); - map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", this.getEnergyStored(stack) >= this.energyUsePerBlockOrHit ? 8.0F : 0.0F, 0)); + map.put(SharedMonsterAttributes.attackDamage.getAttributeUnlocalizedName(), new AttributeModifier(field_111210_e, "Tool modifier", this.getEnergyStored(stack) >= energyUsePerBlockOrHit ? 8.0F : 0.0F, 0)); return map; } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java index 9afd3848a..9d355c990 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java @@ -12,16 +12,22 @@ import net.minecraft.util.IIcon; public class ItemDrillUpgrade extends Item implements INameableItem{ public enum UpgradeType{ - SPEED, - SPEED_II, - SPEED_III, - SILK_TOUCH, //Done - FORTUNE, //Done - FORTUNE_II, //Done - THREE_BY_THREE, //Done - FIVE_BY_FIVE, //Done - VEIN, - PLACER + SPEED(10), + SPEED_II(20), + SPEED_III(30), + SILK_TOUCH(20), //Done + FORTUNE(40), //Done + FORTUNE_II(60), //Done + THREE_BY_THREE(5), //Done + FIVE_BY_FIVE(5), //Done + VEIN(30), + PLACER(0); + + public int extraEnergy; + + UpgradeType(int extraEnergy){ + this.extraEnergy = extraEnergy; + } } public UpgradeType type; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java index 321f8126b..d81f4d634 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDust.java @@ -4,9 +4,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheDusts; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -55,6 +57,13 @@ public class ItemDust extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allDusts.length ? " ERROR!" : allDusts[stack.getItemDamage()].getName()); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(stack.getItemDamage() < allDusts.length) ItemUtil.addInformation(this, list, 1, allDusts[stack.getItemDamage()].getName()); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java b/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java index 33495fe50..6d535bc9d 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemFertilizer.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -13,6 +14,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; +import java.util.List; + public class ItemFertilizer extends Item implements INameableItem{ @Override @@ -29,6 +32,13 @@ public class ItemFertilizer extends Item implements INameableItem{ return EnumRarity.rare; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java index 6991d913f..5f1578bb6 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemFoods.java @@ -4,6 +4,8 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheFoods; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -97,8 +99,12 @@ public class ItemFoods extends ItemFood implements INameableItem{ @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ if(stack.getItemDamage() < allFoods.length){ - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allFoods[stack.getItemDamage()].healAmount); - list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allFoods[stack.getItemDamage()].saturation); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allFoods[stack.getItemDamage()].getName()+".desc")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allFoods[stack.getItemDamage()].healAmount); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allFoods[stack.getItemDamage()].saturation); + } + else list.add(ItemUtil.shiftForInfo()); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java index f67c61872..8ce79fdd3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemHairyBall.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.recipe.HairyBallHandler; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.item.EntityItem; @@ -15,6 +16,7 @@ import net.minecraft.util.IIcon; import net.minecraft.util.WeightedRandom; import net.minecraft.world.World; +import java.util.List; import java.util.Random; public class ItemHairyBall extends Item implements INameableItem{ @@ -43,6 +45,13 @@ public class ItemHairyBall extends Item implements INameableItem{ return EnumRarity.epic; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 2, ""); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java index 60d06c079..5a98848a4 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemJams.java @@ -4,6 +4,8 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheJams; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -16,6 +18,7 @@ import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; import net.minecraft.potion.PotionEffect; import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.List; @@ -96,6 +99,22 @@ public class ItemJams extends ItemFood implements INameableItem{ return stackToReturn; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(stack.getItemDamage() < allJams.length){ + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.1")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+allJams[stack.getItemDamage()].getName()+".desc")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+"."+this.getName()+".desc.2")); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".hunger.desc")+": "+allJams[stack.getItemDamage()].healAmount); + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".saturation.desc")+": "+allJams[stack.getItemDamage()].saturation); + } + else list.add(ItemUtil.shiftForInfo()); + } + } + @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamageForRenderPass(int damage, int pass){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java b/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java index 63d86a0e3..a73b250a2 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemKnife.java @@ -4,6 +4,8 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -49,8 +51,13 @@ public class ItemKnife extends Item implements INameableItem{ @Override @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); + } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java b/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java index 4cd3e93f3..945a1ae9b 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemLeafBlower.java @@ -4,8 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.block.Block; import net.minecraft.block.BlockBush; import net.minecraft.block.BlockLeavesBase; @@ -18,9 +17,11 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; import java.util.ArrayList; +import java.util.List; public class ItemLeafBlower extends Item implements INameableItem{ @@ -100,6 +101,18 @@ public class ItemLeafBlower extends Item implements INameableItem{ return this.isAdvanced ? EnumRarity.epic : EnumRarity.rare; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc." + 1)); + list.add(StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemLeafBlower.desc.2")); + list.add(StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemLeafBlower.desc.3")); + } + else list.add(ItemUtil.shiftForInfo()); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java index 28835adaa..fd77272e5 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemMisc.java @@ -4,9 +4,11 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -56,6 +58,13 @@ public class ItemMisc extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allMiscItems.length ? " ERROR!" : allMiscItems[stack.getItemDamage()].getName()); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(stack.getItemDamage() < allMiscItems.length) ItemUtil.addInformation(this, list, 1, allMiscItems[stack.getItemDamage()].getName()); + } + @Override public IIcon getIconFromDamage(int par1){ return par1 >= textures.length ? null : textures[par1]; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java index ffcdfd9e9..04a3e66f9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPhantomConnector.java @@ -5,6 +5,7 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.tile.TileEntityPhantomPlacer; import ellpeck.actuallyadditions.tile.TileEntityPhantomface; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; @@ -143,6 +144,7 @@ public class ItemPhantomConnector extends Item implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 2, ""); ChunkCoordinates coords = this.getStoredPosition(stack); World world = this.getStoredWorld(stack); if(coords != null && world != null){ diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java index 8ee3b8566..db3fe422c 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemPotionRing.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.ThePotionRings; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -88,6 +89,15 @@ public class ItemPotionRing extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allRings.length ? " ERROR!" : allRings[stack.getItemDamage()].getName()); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(stack.getItemDamage() < allRings.length){ + ItemUtil.addInformation(this, list, 2, ""); + } + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java index 6350b6db8..79e956b5a 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java @@ -2,15 +2,18 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.util.INameableItem; -import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.*; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import net.minecraftforge.oredict.OreDictionary; + +import java.util.List; public class ItemResonantRice extends Item implements INameableItem{ @@ -28,6 +31,14 @@ public class ItemResonantRice extends Item implements INameableItem{ return EnumRarity.epic; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + if(KeyUtil.isShiftPressed() && OreDictionary.getOres("nuggetEnderium").size() == 0) list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemResonantRice.uncraftable.desc")); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java index b52c6f05d..7f5d1c7d6 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.blocks.BlockPlant; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -24,6 +25,8 @@ import net.minecraftforge.event.ForgeEventFactory; import powercrystals.minefactoryreloaded.api.IFactoryPlantable; import powercrystals.minefactoryreloaded.api.ReplacementBlock; +import java.util.List; + public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlantable{ public Block plant; @@ -86,6 +89,12 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta return EnumRarity.rare; } + @Override + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + ItemUtil.addInformation(this, list, 1, ""); + } + @Override public IIcon getIcon(ItemStack stack, int pass){ return this.itemIcon; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java index 29935517a..22a758de4 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSpecialDrop.java @@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.items.metalists.TheSpecialDrops; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; @@ -78,6 +79,13 @@ public class ItemSpecialDrop extends Item implements INameableItem{ return this.getUnlocalizedName() + (stack.getItemDamage() >= allDrops.length ? " ERROR!" : allDrops[stack.getItemDamage()].getName()); } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + if(stack.getItemDamage() < allDrops.length) ItemUtil.addInformation(this, list, stack.getItemDamage() == TheSpecialDrops.SOLIDIFIED_EXPERIENCE.ordinal() ? 2 : 1, allDrops[stack.getItemDamage()].getName()); + } + @Override public IIcon getIconFromDamage(int par1){ return par1 >= textures.length ? null : textures[par1]; diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java index 500f39c3d..a5818d41e 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java @@ -1,10 +1,11 @@ package ellpeck.actuallyadditions.items.tools; - import com.google.common.collect.Sets; import cpw.mods.fml.common.eventhandler.Event; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; @@ -20,7 +21,6 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.UseHoeEvent; -import java.util.HashSet; import java.util.List; import java.util.Set; @@ -68,12 +68,16 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".paxel.desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); } @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ){ - if(!player.canPlayerEdit(x, y, z, side, stack)) return false; + if (!player.canPlayerEdit(x, y, z, side, stack)) return false; else{ UseHoeEvent event = new UseHoeEvent(player, stack, world, x, y, z); if(MinecraftForge.EVENT_BUS.post(event)) return false; @@ -82,10 +86,10 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ return true; } Block block = world.getBlock(x, y, z); - if(side != 0 && world.getBlock(x, y+1, z).isAir(world, x, y+1, z) && (block == Blocks.grass || block == Blocks.dirt)){ + if(side != 0 && world.getBlock(x, y + 1, z).isAir(world, x, y + 1, z) && (block == Blocks.grass || block == Blocks.dirt)){ Block block1 = Blocks.farmland; - world.playSoundEffect((double)((float)x+0.5F), (double)((float)y+0.5F), (double)((float)z+0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume()+1.0F)/2.0F, block1.stepSound.getPitch()*0.8F); - if(world.isRemote) return true; + world.playSoundEffect((double)((float)x + 0.5F), (double)((float)y + 0.5F), (double)((float)z + 0.5F), block1.stepSound.getStepResourcePath(), (block1.stepSound.getVolume() + 1.0F) / 2.0F, block1.stepSound.getPitch() * 0.8F); + if (world.isRemote) return true; else{ world.setBlock(x, y, z, block1); stack.damageItem(1, player); @@ -126,13 +130,4 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ public String getOredictName(){ return oredictName; } - - @Override - public Set getToolClasses(ItemStack stack){ - HashSet hashSet = new HashSet(); - hashSet.add("pickaxe"); - hashSet.add("shovel"); - hashSet.add("axe"); - return hashSet; - } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java index 7d993bb59..6287b62f6 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAxeAA.java @@ -3,12 +3,18 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.ItemAxe; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; + +import java.util.List; public class ItemAxeAA extends ItemAxe implements INameableItem{ @@ -25,6 +31,17 @@ public class ItemAxeAA extends ItemAxe implements INameableItem{ this.oredictName = name; } + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); + } + @Override public boolean getIsRepairable(ItemStack itemToRepair, ItemStack stack){ return stack.getItem() == repairItem.getItem(); diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java index a7c6f8ca4..4adf9cf67 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemHoeAA.java @@ -3,6 +3,8 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -33,7 +35,11 @@ public class ItemHoeAA extends ItemHoe implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java index 0307eb6ff..04bf68c14 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemPickaxeAA.java @@ -3,6 +3,8 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -33,7 +35,11 @@ public class ItemPickaxeAA extends ItemPickaxe implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java index 0ebf051c9..f805278c0 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemShovelAA.java @@ -3,6 +3,8 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -33,7 +35,11 @@ public class ItemShovelAA extends ItemSpade implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java index 482c1d442..2b4a84b32 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemSwordAA.java @@ -3,6 +3,8 @@ package ellpeck.actuallyadditions.items.tools; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; @@ -33,7 +35,11 @@ public class ItemSwordAA extends ItemSword implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + this.getName() + ".desc")); + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".durability.desc") + ": " + (this.getMaxDamage()-this.getDamage(stack)) + "/" + this.getMaxDamage()); + } + else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java b/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java deleted file mode 100644 index c7d6f0f14..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/ContainerManual.java +++ /dev/null @@ -1,232 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import cpw.mods.fml.relauncher.ReflectionHelper; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Container; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraftforge.oredict.ShapedOreRecipe; -import net.minecraftforge.oredict.ShapelessOreRecipe; - -import java.util.ArrayList; -import java.util.List; - -public class ContainerManual extends Container{ - - TheInventory inventory = new TheInventory(); - - public ContainerManual(){ - this.addSlotToContainer(new SlotImmovable(this.inventory, 0, 199, 41)); - - for(int i = 0; i < 13; i++){ - for(int j = 0; j < 4; j++){ - this.addSlotToContainer(new SlotImmovable(this.inventory, 1+j+(i*4), 5+j*18, 5+i*18)); - } - } - for(int i = 0; i < 3; i++){ - for(int j = 0; j < 3; j++){ - this.addSlotToContainer(new SlotImmovable(this.inventory, 1+13*4+j+(i*3), 105+j*18, 23+i*18)); - } - } - - for(int i = 1; i < ManualItems.list.size()+1; i++){ - if(i < 1+13*4){ - this.inventory.setInventorySlotContents(i, ManualItems.list.get(i-1).stack.copy()); - } - } - } - - public void scrollTo(float f){ - if(this.needsScrollBars()){ - int i = ManualItems.list.size()/4-13; - int j = (int)((double)(f*(float)i)+0.5D); - - if(j < 0) j = 0; - for(int k = 0; k < 13; ++k){ - for(int l = 0; l < 4; ++l){ - int i1 = l+(k+j)*4; - - if(i1 >= 0 && i1 < ManualItems.list.size()){ - this.inventory.setInventorySlotContents(1+l+k*4, ManualItems.list.get(i1).stack.copy()); - } - else this.inventory.setInventorySlotContents(1+l+k*4, null); - } - } - } - } - - public boolean needsScrollBars(){ - return ManualItems.list.size() > 9*13; - } - - @Override - @SuppressWarnings("unchecked") - public ItemStack slotClick(int slot, int par2, int par3, EntityPlayer player){ - if(slot > 0 && slot < 1+13*4){ - Slot theSlot = this.getSlot(slot); - if(theSlot.getStack() != null){ - this.inventory.setInventorySlotContents(0, theSlot.getStack().copy()); - - for(int i = 0; i < 9; i++) this.inventory.setInventorySlotContents(1+13*4+i, null); - List list = CraftingManager.getInstance().getRecipeList(); - for(IRecipe iRec: list){ - if(iRec instanceof ShapedOreRecipe){ - ShapedOreRecipe recipe = (ShapedOreRecipe)iRec; - if(theSlot.getStack().isItemEqual(recipe.getRecipeOutput())){ - - int width = ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, recipe, 4); - int height = ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, recipe, 5); - for(int x = 0; x < width; x++){ - for(int y = 0; y < height; y++){ - int i = y*width+x; - ItemStack stack = null; - Object input = recipe.getInput()[i]; - if(input instanceof ItemStack) stack = ((ItemStack)input).copy(); - if(input instanceof ItemStack[]) stack = ((ItemStack[])input)[0]; - if(input instanceof List) stack = ((List)input).get(0); - - int k = 0; - if(x == 0){ - if(y == 0) k = 0; - if(y == 1) k = 3; - if(y == 2) k = 6; - } - if(x == 1){ - if(y == 0) k = 1; - if(y == 1) k = 4; - if(y == 2) k = 7; - } - if(x == 2){ - if(y == 0) k = 2; - if(y == 1) k = 5; - if(y == 2) k = 8; - } - this.inventory.setInventorySlotContents(1+13*4+k, stack); - } - } - break; - } - } - if(iRec instanceof ShapelessOreRecipe){ - ShapelessOreRecipe recipe = (ShapelessOreRecipe)iRec; - if(theSlot.getStack().isItemEqual(recipe.getRecipeOutput())){ - ArrayList ingredients = recipe.getInput(); - for(int i = 0; i < ingredients.size(); i++){ - ItemStack stack = null; - if(ingredients.get(i) instanceof ItemStack) stack = ((ItemStack)ingredients.get(i)).copy(); - if(ingredients.get(i) instanceof ItemStack[]) stack = ((ItemStack[])ingredients.get(i))[0]; - if(ingredients.get(i) instanceof List) stack = ((List)ingredients.get(i)).get(0); - - this.inventory.setInventorySlotContents(1+13*4+i, stack); - } - break; - } - } - } - } - } - return null; - } - - @Override - public boolean canInteractWith(EntityPlayer player){ - return this.inventory.isUseableByPlayer(player); - } - - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - return null; - } - - public static class TheInventory implements IInventory{ - - public ItemStack[] slots = new ItemStack[13*4+10]; - - @Override - public void setInventorySlotContents(int i, ItemStack stack){ - this.slots[i] = stack; - this.markDirty(); - } - - @Override - public int getSizeInventory(){ - return slots.length; - } - - @Override - public ItemStack getStackInSlot(int i){ - if(i < this.getSizeInventory()){ - return slots[i]; - } - return null; - } - - @Override - public ItemStack decrStackSize(int i, int j){ - if (slots[i] != null){ - ItemStack stackAt; - if(slots[i].stackSize <= j){ - stackAt = slots[i]; - slots[i] = null; - this.markDirty(); - return stackAt; - } - else{ - stackAt = slots[i].splitStack(j); - if (slots[i].stackSize == 0) slots[i] = null; - this.markDirty(); - return stackAt; - } - } - return null; - } - - @Override - public ItemStack getStackInSlotOnClosing(int i){ - return getStackInSlot(i); - } - - @Override - public String getInventoryName(){ - return "Actually Additions Manual"; - } - - @Override - public boolean hasCustomInventoryName(){ - return false; - } - - @Override - public int getInventoryStackLimit(){ - return 1; - } - - @Override - public void markDirty(){ - - } - - @Override - public boolean isUseableByPlayer(EntityPlayer player){ - return true; - } - - @Override - public void openInventory(){ - - } - - @Override - public void closeInventory(){ - - } - - @Override - public boolean isItemValidForSlot(int i, ItemStack stack){ - return false; - } - } -} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java b/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java deleted file mode 100644 index 58a120c70..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/GuiManual.java +++ /dev/null @@ -1,115 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.util.AssetUtil; -import ellpeck.actuallyadditions.util.ModUtil; -import ellpeck.actuallyadditions.util.StringUtil; -import net.minecraft.client.gui.FontRenderer; -import net.minecraft.client.gui.inventory.GuiContainer; -import net.minecraft.util.ResourceLocation; -import org.lwjgl.input.Mouse; -import org.lwjgl.opengl.GL11; - -@SideOnly(Side.CLIENT) -public class GuiManual extends GuiContainer{ - - private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiManual"); - - private FontRenderer infoTextRenderer; - - private float currentScroll; - private boolean isScrolling; - private boolean wasClicking; - - public GuiManual(){ - super(new ContainerManual()); - - this.xSize = 256; - this.ySize = 244; - } - - @Override - public void drawScreen(int x, int y, float f){ - if(((ContainerManual)this.inventorySlots).needsScrollBars()){ - boolean flag = Mouse.isButtonDown(0); - int k = this.guiLeft; - int l = this.guiTop; - int i1 = k+78; - int j1 = l+5; - int k1 = i1+12; - int l1 = j1+232; - - if(!this.wasClicking && flag && x >= i1 && y >= j1 && x < k1 && y < l1) this.isScrolling = true; - if(!flag) this.isScrolling = false; - this.wasClicking = flag; - - if(this.isScrolling){ - this.currentScroll = ((float)(y-j1)-7.5F)/((float)(l1-j1)-15.0F); - if(this.currentScroll < 0.0F){ - this.currentScroll = 0.0F; - } - if(this.currentScroll > 1.0F){ - this.currentScroll = 1.0F; - } - ((ContainerManual)this.inventorySlots).scrollTo(this.currentScroll); - } - } - super.drawScreen(x, y, f); - } - - @Override - public void handleMouseInput(){ - super.handleMouseInput(); - if(((ContainerManual)this.inventorySlots).needsScrollBars()){ - int i = Mouse.getEventDWheel(); - - if(i != 0){ - int j = ((ContainerManual)this.inventorySlots).inventory.slots.length/4-13; - - if(i > 0) i = 1; - if(i < 0) i = -1; - this.currentScroll = (float)((double)this.currentScroll-(double)i/(double)j); - if(this.currentScroll < 0.0F) this.currentScroll = 0.0F; - - if(this.currentScroll > 1.0F) this.currentScroll = 1.0F; - ((ContainerManual)this.inventorySlots).scrollTo(this.currentScroll); - } - } - } - - @Override - public void initGui(){ - super.initGui(); - this.infoTextRenderer = new FontRenderer(this.mc.gameSettings, new ResourceLocation("textures/font/ascii.png"), this.mc.renderEngine, true); - } - - @Override - public void drawGuiContainerForegroundLayer(int x, int y){ - AssetUtil.displayNameString(this.fontRendererObj, this.xSize, -10, "container."+ModUtil.MOD_ID_LOWER+".manual"); - - ManualItems.InfoTab tab = ManualItems.getTabFromStack(this.inventorySlots.getSlot(0).getStack()); - if(tab != null){ - this.drawCenterString(tab.title, 160, 8); - this.fontRendererObj.drawSplitString(tab.extraForRecipe, 95, 80, 155, StringUtil.DECIMAL_COLOR_GRAY_TEXT); - - this.infoTextRenderer.drawSplitString(tab.text, 95, (tab.extraForRecipe == null || tab.extraForRecipe.length() <= 0 ? 80 : 100), 155, StringUtil.DECIMAL_COLOR_GRAY_TEXT); - } - } - - private void drawCenterString(String text, int xPos, int yPos){ - this.fontRendererObj.drawString(text, xPos - this.fontRendererObj.getStringWidth(text)/2, yPos, StringUtil.DECIMAL_COLOR_GRAY_TEXT); - } - - @Override - public void drawGuiContainerBackgroundLayer(float f, int x, int y){ - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.mc.getTextureManager().bindTexture(resLoc); - int k = (this.width - this.xSize) / 2; - int l = (this.height - this.ySize) / 2; - this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize); - - this.mc.getTextureManager().bindTexture(new ResourceLocation("textures/gui/container/creative_inventory/tabs.png")); - this.drawTexturedModalRect(this.guiLeft+78, this.guiTop+5 + (int)((float)(this.guiTop+5+232-this.guiTop+5-25) * this.currentScroll), 232+(((ContainerManual)this.inventorySlots).needsScrollBars() ? 0 : 12), 0, 12, 15); - } -} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java b/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java deleted file mode 100644 index 79eb9352c..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/InventoryEvents.java +++ /dev/null @@ -1,56 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import ellpeck.actuallyadditions.inventory.gui.GuiInputter; -import ellpeck.actuallyadditions.network.PacketHandler; -import ellpeck.actuallyadditions.util.ModUtil; -import ellpeck.actuallyadditions.util.StringUtil; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.inventory.GuiInventory; -import net.minecraft.util.StatCollector; -import net.minecraftforge.client.event.GuiScreenEvent; - -public class InventoryEvents{ - - private static final int MANUAL_BUTTON_ID = 123782; - - public static class InitGuiEvent{ - @SubscribeEvent - @SuppressWarnings("unchecked") - public void onInitGuiEvent(GuiScreenEvent.InitGuiEvent.Post event){ - if(event.gui instanceof GuiInventory && !Minecraft.getMinecraft().thePlayer.capabilities.isCreativeMode){ - int k = (event.gui.width-176)/2; - int l = (event.gui.height-166)/2; - - ManualButton button = new ManualButton(MANUAL_BUTTON_ID, k+160, l+166, "!"); - event.buttonList.add(button); - } - } - } - - public static class ButtonPressedEvent{ - @SubscribeEvent - public void onButtonPressedEvent(GuiScreenEvent.ActionPerformedEvent.Post event){ - if(event.gui instanceof GuiInventory && event.button.id == MANUAL_BUTTON_ID){ - PacketHandler.theNetwork.sendToServer(new PacketOpenManual()); - } - } - } - - public static class ManualButton extends GuiInputter.SmallerButton{ - - public ManualButton(int id, int x, int y, String display){ - super(id, x, y, display); - } - - @Override - public void drawButton(Minecraft mc, int x, int y){ - super.drawButton(mc, x, y); - boolean hovering = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width && y < this.yPosition + this.height; - if(this.getHoverState(hovering) == 2){ - String manual = StatCollector.translateToLocal("container." + ModUtil.MOD_ID_LOWER + ".manual.name"); - mc.fontRenderer.drawString(manual, this.xPosition+this.width/2-mc.fontRenderer.getStringWidth(manual)/2 , this.yPosition+this.height+5, StringUtil.DECIMAL_COLOR_WHITE); - } - } - } -} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java b/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java deleted file mode 100644 index 76cc79bf9..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/ManualItems.java +++ /dev/null @@ -1,77 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import ellpeck.actuallyadditions.blocks.InitBlocks; -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -import java.util.ArrayList; - -public class ManualItems{ - - public static ArrayList list = new ArrayList(); - - static{ - addBlock(InitBlocks.blockPhantomface, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch", "OreDictionary!"); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockBreaker, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockCoalGenerator, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomPlacer, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockFeeder, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockCanolaPress, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockFluidCollector, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomLiquiface, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockBreaker, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - addBlock(InitBlocks.blockPhantomBooster, "The Phantomface is a Block that is very nice and amazing and can transmit stuff if you connect it with stuff this is a text message so I don't care anyways bla bla bla bla bla Penis ficken arsch also das hier ist eine echt lange Message und ich weiß nicht was ich hier weiter schrieben soll das kommt eh späüter alles in die Lang datei", ""); - - } - - private static void addItem(Item item, String text, String extraForRecipe){ - addStack(new ItemStack(item), text, extraForRecipe); - } - - private static void addBlock(Block block, String text, String extraForRecipe){ - addStack(new ItemStack(block), text, extraForRecipe); - } - - private static void addStack(ItemStack stack, String text, String extraForRecipe){ - list.add(new InfoTab(stack.copy(), text, extraForRecipe)); - } - - public static InfoTab getTabFromStack(ItemStack stack){ - for(InfoTab tab : list){ - if(stack != null && tab.stack != null && stack.isItemEqual(tab.stack)) return tab; - } - return null; - } - - public static class InfoTab{ - public ItemStack stack; - public String text; - public String title; - public String extraForRecipe; - - public InfoTab(ItemStack stack, String text, String extraForRecipe){ - this.stack = stack; - this.title = stack.getDisplayName(); - this.text = text; - this.extraForRecipe = extraForRecipe; - } - } -} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java b/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java deleted file mode 100644 index b94c9fab4..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/PacketOpenManual.java +++ /dev/null @@ -1,35 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import cpw.mods.fml.common.network.simpleimpl.IMessage; -import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; -import cpw.mods.fml.common.network.simpleimpl.MessageContext; -import ellpeck.actuallyadditions.ActuallyAdditions; -import ellpeck.actuallyadditions.inventory.GuiHandler; -import io.netty.buffer.ByteBuf; - -public class PacketOpenManual implements IMessage{ - - @SuppressWarnings("unused") - public PacketOpenManual(){ - - } - - @Override - public void fromBytes(ByteBuf buf){ - - } - - @Override - public void toBytes(ByteBuf buf){ - - } - - public static class Handler implements IMessageHandler{ - - @Override - public IMessage onMessage(PacketOpenManual message, MessageContext ctx){ - ctx.getServerHandler().playerEntity.openGui(ActuallyAdditions.instance, GuiHandler.MANUAL_ID, ctx.getServerHandler().playerEntity.worldObj, (int)ctx.getServerHandler().playerEntity.posX, (int)ctx.getServerHandler().playerEntity.posY, (int)ctx.getServerHandler().playerEntity.posZ); - return null; - } - } -} diff --git a/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java b/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java deleted file mode 100644 index 651cd5024..000000000 --- a/src/main/java/ellpeck/actuallyadditions/manual/SlotImmovable.java +++ /dev/null @@ -1,23 +0,0 @@ -package ellpeck.actuallyadditions.manual; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.IInventory; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; - -public class SlotImmovable extends Slot{ - - public SlotImmovable(IInventory inventory, int id, int x, int y){ - super(inventory, id, x, y); - } - - @Override - public boolean isItemValid(ItemStack stack){ - return false; - } - - @Override - public boolean canTakeStack(EntityPlayer player){ - return false; - } -} diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java index ce741d06b..23daabe01 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java @@ -3,7 +3,6 @@ package ellpeck.actuallyadditions.network; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; -import ellpeck.actuallyadditions.manual.PacketOpenManual; import ellpeck.actuallyadditions.network.gui.PacketGuiButton; import ellpeck.actuallyadditions.util.ModUtil; @@ -17,6 +16,5 @@ public class PacketHandler{ theNetwork.registerMessage(PacketTileEntityFeeder.Handler.class, PacketTileEntityFeeder.class, 0, Side.CLIENT); theNetwork.registerMessage(PacketGuiButton.Handler.class, PacketGuiButton.class, 1, Side.SERVER); theNetwork.registerMessage(PacketFluidCollectorToClient.Handler.class, PacketFluidCollectorToClient.class, 2, Side.CLIENT); - theNetwork.registerMessage(PacketOpenManual.Handler.class, PacketOpenManual.class, 3, Side.SERVER); } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java index cdd0f7364..9dbe59b54 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGreenhouseGlass.java @@ -2,7 +2,6 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import net.minecraft.block.Block; -import net.minecraft.block.BlockAir; import net.minecraft.block.BlockGrass; import net.minecraft.block.IGrowable; import net.minecraft.util.ChunkCoordinates; @@ -37,7 +36,7 @@ public class TileEntityGreenhouseGlass extends TileEntityBase{ public ChunkCoordinates blockToFertilize(){ for(int i = yCoord-1; i > 0; i--){ Block block = worldObj.getBlock(xCoord, i, zCoord); - if(block != null && !(block instanceof BlockAir)){ + if(block != null && !(worldObj.isAirBlock(xCoord, i, zCoord))){ if(block instanceof IGrowable && !(block instanceof BlockGrass)){ return new ChunkCoordinates(xCoord, i, zCoord); } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java index 339fab3b8..7ebae8bde 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityLavaFactoryController.java @@ -2,11 +2,10 @@ package ellpeck.actuallyadditions.tile; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; -import ellpeck.actuallyadditions.blocks.BlockMisc; +import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.blocks.metalists.TheMiscBlocks; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import net.minecraft.block.Block; -import net.minecraft.block.BlockAir; import net.minecraft.init.Blocks; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -24,9 +23,7 @@ public class TileEntityLavaFactoryController extends TileEntityBase implements I @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ - int isMulti = this.isMultiblock(); - - if(isMulti == HAS_AIR && this.storage.getEnergyStored() >= energyNeededToProduceLava){ + if(this.storage.getEnergyStored() >= energyNeededToProduceLava && this.isMultiblock() == HAS_AIR){ this.currentWorkTime++; if(this.currentWorkTime >= this.maxWorkTime){ this.currentWorkTime = 0; @@ -49,12 +46,12 @@ public class TileEntityLavaFactoryController extends TileEntityBase implements I int metaWest = worldObj.getBlockMetadata(xCoord+ForgeDirection.WEST.offsetX, yCoord+1, zCoord+ForgeDirection.WEST.offsetZ); int metaNeeded = TheMiscBlocks.LAVA_FACTORY_CASE.ordinal(); - if(blockNorth instanceof BlockMisc && blockEast instanceof BlockMisc && blockSouth instanceof BlockMisc && blockWest instanceof BlockMisc){ + if(blockNorth == InitBlocks.blockMisc && blockEast == InitBlocks.blockMisc && blockSouth == InitBlocks.blockMisc && blockWest == InitBlocks.blockMisc){ if(metaNorth == metaNeeded && metaEast == metaNeeded && metaSouth == metaNeeded && metaWest == metaNeeded){ if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == Blocks.lava || worldObj.getBlock(xCoord, yCoord+1, zCoord) == Blocks.flowing_lava){ return HAS_LAVA; } - if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == null || worldObj.getBlock(xCoord, yCoord+1, zCoord) instanceof BlockAir){ + if(worldObj.getBlock(xCoord, yCoord+1, zCoord) == null || worldObj.isAirBlock(xCoord, yCoord+1, zCoord)){ return HAS_AIR; } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java index b0bb6e74b..8dc80323f 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomface.java @@ -155,7 +155,7 @@ public class TileEntityPhantomface extends TileEntityInventoryBase{ private void pushFluid(ForgeDirection side){ TileEntity tile = WorldUtil.getTileEntityFromSide(side, worldObj, xCoord, yCoord, zCoord); - if(tile != null && tile instanceof IFluidHandler){ + if(tile != null && tile instanceof IFluidHandler && this.getTankInfo(side) != null && this.getTankInfo(side).length > 0 && ((IFluidHandler)tile).getTankInfo(side.getOpposite()) != null && ((IFluidHandler)tile).getTankInfo(side.getOpposite()).length > 0){ for(FluidTankInfo myInfo : this.getTankInfo(side)){ for(FluidTankInfo hisInfo : ((IFluidHandler)tile).getTankInfo(side.getOpposite())){ if(myInfo != null && hisInfo != null && myInfo.fluid != null && myInfo.fluid.getFluid() != null){ diff --git a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java index 966e20dc5..ff35bbba2 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java @@ -17,6 +17,16 @@ public class BlockUtil{ return ModUtil.MOD_ID_LOWER + "." + ((INameableItem)block).getName(); } + @SuppressWarnings("unchecked") + public static void addInformation(Block block, List list, int lines, String extraName){ + if(KeyUtil.isShiftPressed()){ + for(int i = 0; i < lines; i++){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)block).getName() + extraName + ".desc" + (lines > 1 ? "." +(i+1) : ""))); + } + } + else list.add(ItemUtil.shiftForInfo()); + } + @SuppressWarnings("unchecked") public static void addPowerUsageInfo(List list, int usage){ if(KeyUtil.isShiftPressed()){ @@ -26,7 +36,9 @@ public class BlockUtil{ @SuppressWarnings("unchecked") public static void addPowerProductionInfo(List list, int produce){ - list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".produces.desc") + " " + produce + " RF/t"); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".produces.desc") + " " + produce + " RF/t"); + } } public static final ArrayList wailaRegisterList = new ArrayList(); diff --git a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java index 19473d002..b38dd0e51 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java @@ -4,10 +4,23 @@ import cpw.mods.fml.common.registry.GameRegistry; import ellpeck.actuallyadditions.creative.CreativeTab; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.StatCollector; import net.minecraftforge.oredict.OreDictionary; +import java.util.List; + public class ItemUtil{ + @SuppressWarnings("unchecked") + public static void addInformation(Item item, List list, int lines, String extraName){ + if(KeyUtil.isShiftPressed()){ + for(int i = 0; i < lines; i++){ + list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)item).getName() + extraName + ".desc" + (lines > 1 ? "." +(i+1) : ""))); + } + } + else list.add(shiftForInfo()); + } + public static void registerItems(Item[] items){ for(Item item : items){ register(item); @@ -37,4 +50,8 @@ public class ItemUtil{ public static String createUnlocalizedName(Item item){ return ModUtil.MOD_ID_LOWER + "." + ((INameableItem)item).getName(); } + + public static String shiftForInfo(){ + return StringUtil.GREEN + StringUtil.ITALIC + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".shiftForInfo.desc"); + } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 886a6a91e..4f213e233 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.5"; + public static final String VERSION = "1.7.10-0.0.5.7"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 788a79906..5da1c84d1 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -28,28 +28,7 @@ public class WorldUtil{ return new ChunkCoordinates(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } - public static void breakBlockAtSide(ForgeDirection side, World world, int x, int y, int z){ - if(side == ForgeDirection.UNKNOWN){ - world.setBlockToAir(x, y, z); - return; - } - ChunkCoordinates c = getCoordsFromSide(side, x, y, z); - if(c != null){ - world.setBlockToAir(c.posX, c.posY, c.posZ); - } - } - - public static void pushEnergy(World world, int x, int y, int z, ForgeDirection side, EnergyStorage storage){ - TileEntity tile = getTileEntityFromSide(side, world, x, y, z); - if(tile != null && tile instanceof IEnergyReceiver && storage.getEnergyStored() > 0){ - if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ - int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); - storage.extractEnergy(receive, false); - } - } - } - - public static MovingObjectPosition raytraceEntity(World world, Entity player, double range){ + public static MovingObjectPosition raytraceBlocksFromEntity(World world, Entity player, double range){ float f1 = player.prevRotationPitch+(player.rotationPitch-player.prevRotationPitch)*1.0F; float f2 = player.prevRotationYaw+(player.rotationYaw-player.prevRotationYaw)*1.0F; double d0 = player.prevPosX+(player.posX-player.prevPosX)*1.0D; @@ -69,12 +48,35 @@ public class WorldUtil{ return world.func_147447_a(vec3, vec31, false, true, false); } + public static void breakBlockAtSide(ForgeDirection side, World world, int x, int y, int z){ + if(side == ForgeDirection.UNKNOWN){ + world.setBlockToAir(x, y, z); + return; + } + ChunkCoordinates c = getCoordsFromSide(side, x, y, z); + if(c != null){ + world.setBlockToAir(c.posX, c.posY, c.posZ); + } + } + + public static void pushEnergy(World world, int x, int y, int z, ForgeDirection side, EnergyStorage storage){ + TileEntity tile = getTileEntityFromSide(side, world, x, y, z); + if(tile != null && tile instanceof IEnergyReceiver && storage.getEnergyStored() > 0){ + if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ + int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); + storage.extractEnergy(receive, false); + world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); + } + } + } + public static void pushFluid(World world, int x, int y, int z, ForgeDirection side, FluidTank tank){ TileEntity tile = getTileEntityFromSide(side, world, x, y, z); if(tile != null && tank.getFluid() != null && tile instanceof IFluidHandler){ if(((IFluidHandler)tile).canFill(side.getOpposite(), tank.getFluid().getFluid())){ int receive = ((IFluidHandler)tile).fill(side.getOpposite(), tank.getFluid(), true); tank.drain(receive, true); + world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java index 880ac2225..2ef1ef830 100644 --- a/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java +++ b/src/main/java/ellpeck/actuallyadditions/waila/WailaDataProvider.java @@ -60,4 +60,4 @@ public class WailaDataProvider implements IWailaDataProvider{ registrar.registerHeadProvider(provider, theBlock.getClass()); } } -} \ No newline at end of file +} diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index edfb1c215..308f4baf9 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -134,7 +134,7 @@ tooltip.actuallyadditions.itemResonantRice.uncraftable.desc=Uncraftable because tile.actuallyadditions.blockCanolaPress.name=Canola Press tooltip.actuallyadditions.blockCanolaPress.desc=Makes Canola Oil from Canola tile.actuallyadditions.blockFermentingBarrel.name=Fermenting Barrel -tooltip.actuallyadditions.blockFermentingBarrel.desc=Ferments Canola Oil made in a Press to Oil +tooltip.actuallyadditions.blockFermentingBarrel.desc=Ferments Canola Oil made in a Press to Canola tile.actuallyadditions.blockCanolaOil.name=Canola Oil tooltip.actuallyadditions.blockCanolaOil.desc=Oil made from Canola @@ -264,8 +264,7 @@ item.actuallyadditions.itemDustQuartz.name=Crushed Quartz item.actuallyadditions.itemDustCoal.name=Crushed Coal item.actuallyadditions.itemDustQuartzBlack.name=Crushed Black Quartz -tooltip.actuallyadditions.moreInfo.desc.1=Open the Actually Additions Manual -tooltip.actuallyadditions.moreInfo.desc.2=with the Button in your Inventory! +tooltip.actuallyadditions.shiftForInfo.desc=Press Shift for Info tooltip.actuallyadditions.hunger.desc=Fills tooltip.actuallyadditions.saturation.desc=Saturation tooltip.actuallyadditions.durability.desc=Durability @@ -451,7 +450,6 @@ container.actuallyadditions.energyface.name=Energyface container.actuallyadditions.fluidPlacer.name=Fluid Placer container.actuallyadditions.fluidCollector.name=Fluid Collector container.actuallyadditions.coffeeMachine.name=Coffee Machine -container.actuallyadditions.manual.name=Actually Additions Manual container.nei.actuallyadditions.crushing.name=Crusher container.nei.actuallyadditions.ballOfHair.name=Ball Of Hair Usage diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png index 2c18e219155591bae1410b64a60488bf0b019af3..8e9d776c0ba9c59522eeef67676f2ce455799ff5 100644 GIT binary patch delta 731 zcmcb^f0%DW2n*LH1_r)OjE1Im+b74dsMRyA^mK6ysfc@f<6_<;0}6?XKP=|Gxq&AwK>iE{>4-VXEvbjda&sqx;igRxN5%OExVeN^D}jrjSLgq*D)}hSj5Dj z(9OlrptI^ecY@NDG^H!snHe0yq8W-#9l-F}TsT|oYFi7;e}?x3-`$~Fl@TTG$EJ`s2B`^HM7OdkEa#DdsbFZZDPm=C5WBjQ(Wm8>Ps^_|pf|F(9sDFM;7S-Op8)+- zud}L{c?QSUnH*o=GB8ZID%LQ^r~skn(+N=qhRBfTYzBf^#)7YIGcqWw)@86veSlE% zWTH0Ei7U?W5)m{H_WQPciw0_+$8eb~p{U`ttV_bqJL@lRW73(vCOzlxpXs3q_pVKk zXI#eTuo+!P=@Wd*2GPBO<_zfmSJS-t*XF(3|boFyt=akR{02(X> AQ~&?~ delta 885 zcmX@icZYvN2n*L%1_r*ZjLC&FPE3wtQLATm@^o-n1|8rk_5)=V|=@Yr)^<*8MMUcptet?(%bm zz5my5n;o~E@9h=yT`x76(;2oelfUm*yO{sSVI~GRaB$zoz~I2m&A_l_0|N(3L47p4 z3;)kDyYKo7&e{rIsy=^};n&Qy$>lcN%j;O?l-roYbu!$4Sk@Pv%eY|q8q4<;c?=8! zj1K>c-~9gjf084^m&399<9Qnx?imUe-TUaE&u}30zu5gP|%ENNr&71(J^$_GO+u_vaaB z!{wd%okU7(>;mSwQJm|DV=tyk!3u&(mPf0{7?x z>pSNPSL-r-nPU1}_B<~GLm0#TEotd>pIHu69xvX!zhRrOnv?UlbNvSqgc^nm6LlFFE*$FO zJ>asUw{t>1Q2&-wz?kBZK~iM33GBFyj59d48VY`T%fQeOW?2vPW+O8~6*PTln=uG4 zG*ffhCkr%Ji@jls8jWlK=Ha?It#cA);KrwkW@*?``J1KFFvWT(64 z27^z_tr;9Y%YeylwG1%e51<5E95~cOr5~gUFRb$Rm)yZ*kjvo1SFo2^XZr8gTT~mK zF8bQD^#1=zEYEcJ{$w#IWq46~i{ZlSEsP7UXEHmizs%MUw>-C~A@wKw)Y>#VrW%zR PkPAFr{an^LB{Ts5?65&Y diff --git a/src/main/resources/assets/actuallyadditions/textures/items/diamondPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/diamondPaxel.png index a4732da1436bfe6b170f189f223e0bc2775ed5bb..6c809a31277dcec74c4846fdb32b12c24fe4a8bd 100644 GIT binary patch delta 416 zcmV;R0bl;&0=ff`B!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD+0b@j|^#A|>9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0Uk+2K~y-)oszLj!$1_qe-~pxf~87?k|A!Tn}51EyEwRX^bc?lM|al> z4vtQOsGEa(p&%4T7c)x7qT*0XskFotJcl!pCfAGhn~wMH_rC9VCzwU+6&WArW`fU; zV66i8kJxz*iGsFB;LaQPWq{Ox7(6|M!4Uc%s^0Abs9p^3A4AXkd!zffxZ=iak z5DN1Ue!@-jH-8Zza-#$6ZbQL_FoN5=1kMi7XlHXpHliiitHGC4gX$OX+7$p+9=uv! zpxS$ZlPd+MWSQWtjb&QFJ5QbA)TFk_`Lgjm36~bZvdjsL&P7LU!xa0V=F6(@WVhkD zlIEGjbEP)HpWa+_G)2#qc0000< KMNUMnLSTZ#u(4tQ delta 327 zcmV-N0l5CU1L6XZB!2{FK}|sb0I`n?{9y$E000SaNLh0L01mwX01mwYNBfYi0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002sNkl7&FvK1* z-3ioK2Ju}1LI?)MT?AH79J{fnR6zUP+Ahb*gMjFrw1QN6fzx5MFs?knGeXLcDjOSNErQCBDw$dURx21~ Z!w0o0pUI6%2FL&a002ovPDHLkV1i6?e~bVC diff --git a/src/main/resources/assets/actuallyadditions/textures/items/emeraldPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/emeraldPaxel.png index ffd4c58c5136ccb534279ca330765f94ba63bdf3..e184b240074f4eb0072246ca6b1a0f08d2e28fe9 100644 GIT binary patch delta 451 zcmV;!0X+W30^I|UB!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD*FmFV>$)qhZcR z=WiXbOvVrq5uPB-IWieXj6}m{-rY#+x%8m#HKd{Rm^_))(oi}uK`%4U#3uYjX(%lX t^{4aiyMe{k@{SHX>_MU(^ghRb^aVw#kTxd#W|RN`002ovPDHLkV1koo#bp2h delta 299 zcmV+`0o4B81I7Z7B!2{FK}|sb0I`n?{9y$E000SaNLh0L01mzY01mzZ>O!%=0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002QNklE&|eY!5D)%iWKsvF*`(+|*v)3V2wdm3V;~m3M2ck#XaReP(T)@^ep{}3}#^!!ZW~l+1lf__aL7TAq;8x xS5f!tV25Gj0VJM9NC{Ya?@xeetkeRm`vBjeH%N)b^e6xT002ovPDHLkV1jrzef0nU diff --git a/src/main/resources/assets/actuallyadditions/textures/items/goldPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/goldPaxel.png index 6fd40009d2e4405c97607da6202daae242bfc2ea..c0750f43da2714139c2f6bc3027e791a5b49c86a 100644 GIT binary patch delta 460 zcmV;-0W<#J0_FpdB!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD+4Qle`-T(jq9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0ZK_kK~y-)osvCB!%!53&r6e-r=a);(xFZX;(t~I*JO2Z=%zU7U?<%> z=peYpL1!01mv(h+S0~3(p@>GY#MZyY{z!5i#86EdW6$#7zWcp%?t7160O2{wH#ijv`*?Xh!Pw{;fE>gy@bqjIoo*SA_ANXQux%GWg8=w& zCX+*{*kY^~&VT3k;L#hp-3r?63s`p@kOw#pL6*PP1M|sG1OP0~ zvkwOj2-DKyG`$Zuv9mh~*Ci;5fQ|JBTva|800@7fA(s!4sFfA@wK>kX4aH)DwPg5RIxKl%jCTAMk^GL7p10000O!%=0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002pNklsO4yxul$gz$_x`uVc*{Vo87O%*|ebpaaUQ8kFpefYls48f>JMhM4N zPzXSgu0{p{;kp5&lng4X0%A}v^d|ssAOwbKkm`N{!Z4#Vj7~EO&pPV@qA*Km%_S-X z`i$M!Q?2!KZat^N!h?Y5okT&Z{(<9mv^35~e2$2)TCD&CV7Xk^B!5j)@;oQYGHSINo6UydaQK^OCxNwAbvm8G;q-bv9LHh1-R{5u>e$d8 z?>$Msn)Lg9@;t|NU3}kXu~;Yo=NNo*eZl%;#$YhOb=|!hrwo3$yW;KrlUckzn6z5v z{PLRYz@Fz(sZ`1nlsRjysn_e}JwHD+<+gdbcN1JnYLB!2{FK}|sb0I`n?{9y$E000SaNLh0L01mzY01mzZ>O!%=0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002eNklxs+7XM zCX8s@woQ#F+%e}2asdz?+9HTB7hprs7{tlv@OJ=)U>sM@Id`B#07SYqG6)F!2@paM z)ZXnN2Duf3E+D1UATW$Umiq|^V@;e4Lo`FU+u7%;bCm@gg(*Ah0FZ^C>ey8WxLwck zdR#OJi2Wy?6f(fKJ@2c8^`rsLenA?5Yu9-bLA9OKZSc+LNko=6snU1ZF0pep00000 LNkvXXu0mjf}f9B!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD*5ohR#&;S4c9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0W3*GK~y-)osrE>!ax*-zuRf61>F#d1rs!JV}D$U3sx>%xN+li_*OoK zTc5zVbZLylgrLDlTckhNg(-mo1-Z#2lbQ3~bMB0=K{-xE^S#*wK4_fd*jq%S0ro0~ zyy7^N9FC$-Jg)|Wm)Qn6xL-ddPDUij2!Je07zRBBCUE!tkvI-Trs1Z4hH6HV{17J* zX*vc#HA4^-Wq%m-CW!!KRdj%AWe-aXnWh9`e*yzo#W{=Xs$C@r`+s6F?C$s&I7xZw!MvI+2u3e z-n8_jRh|0{V_a?eZJmC=nFQ<1>^R>1p)sx+<1TeBY9|*S9O!%=0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002YNkl_Cn(0SP3lDp}e zbr~QbqG>!QWl)cKHvlknDoA1705>6OjhvdJ{|TTekyciShv{}a-3>gXHS)a*ka4M& z+Ks+`H^2v+nA|98Gjyvr(3-l{{};H1x*JfL1@D!QC}V3zT=9$hWs3Lnm_|bUO+aOa zc`JN9<~YsUG%TpszIeqHx3>uj;=3}#uc!)eROX1-d;rYnB+Q&MCKUhx002ovPDHLk FV1hDrfVThu diff --git a/src/main/resources/assets/actuallyadditions/textures/items/stonePaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/stonePaxel.png index cbe99d046c3a5cccca108c60cbc395d8064e64cb..449737ee18a65818b9a2d14fe6ef5d2d53918e50 100644 GIT binary patch delta 439 zcmV;o0Z9JP0?`AIB!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD+H?00VYybcN9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0X0cPK~y-)osltX!ax{?pG!O>EiOF+natY7p?^z8>Dr~gqm%!@LHrpG zf}^Wo*N%cqK`dQU>QGD^ge-^nbxKgwD8AEichCF2-<{$Hg<&Z9+Pwwt^?LZe&tkEl zaw#EK9LFk$=kqzuW|PrqbZC%+?RJ|aNm#8`hzMDh0SHjQolb{1j+NSnyWK9g_sYqc7VmOd;czG? h53i8g2lr>YR{yiPnfG#%OCkUO002ovPDHLkV1fb&!zTa$ delta 309 zcmV-50m}Z-1JDAHB!2{FK}|sb0I`n?{9y$E000SaNLh0L01mzY01mzZ>O!%=0000O zbVXQnQ*UN;cVTj60B~VxZgehgWpp4kE-)@NWrZ?j0002aNkl#xJc61JQ1Dqt%dyD7`J}95`D}JaglzxFdw(x1%p$d|(nejSlv*jJ zI-de)gek^YivjL%ZUP`2>LQ3R6QDyd%|UdY!#@BRf^oib&UpZx0wB`0kwHK>F97G9 zppNMPF{mH(5)eY@5E$kl%lrul-Bp diff --git a/src/main/resources/assets/actuallyadditions/textures/items/woodenPaxel.png b/src/main/resources/assets/actuallyadditions/textures/items/woodenPaxel.png index 9fbf1f372dce6d58fb1228d7b685309c92963525..d808766612e71481e0b8c145d92eeda433253b68 100644 GIT binary patch delta 441 zcmV;q0Y?7P0@DMKB!32COGiWii2!E+C#@#|QUCw|32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra1`rD=7ds_Wr~m)}9cffpbVF}#ZDnqB0000007G(RVRU6=Aa`kWXdp*P zO;BVmWd{HN0XIoRK~y-)osqpx0zni;&z)UXM+g!U3|oMWg@2(lCMHG-OKfb^M=oVEQY*0JOXh+Shob;v!&l^>f j`nZH74i3K}`D=o2nn081U}Glc00000NkvXXu0mjfk<+;> delta 311 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 Ur%iEKbN~PV07*qoM6N<$g42Oo2><{9 literal 19812 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 P00000NkvXXu0mjf92~+v diff --git a/src/main/resources/assets/actuallyadditions/textures/logoBig.png b/src/main/resources/assets/actuallyadditions/textures/logoBig.png index 4931ee3595e6ad6e21275cde883c3cf174934997..6059f0e6a36148fe340abea41aeed67bb3c57b1d 100644 GIT binary patch literal 156607 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 literal 158789 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 z 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 z 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 diff --git a/src/main/resources/assets/actuallyadditions/textures/logoSquare.png b/src/main/resources/assets/actuallyadditions/textures/logoSquare.png index f0d7e8095ae32af274f7864fba2a03151d1e6534..6b5cce0a0c5c2df9ac62894d9951a5cb4030e89a 100644 GIT binary patch literal 2921 zcmeHJdrVVz6ut{vrZ5nNQd;PP7J1nRAZQgR4|$3_RUQhhfStGs2(kzkaF3V?h#jcy zrsy_>Fii$x-|4U7fHtKj?N5+kst`UQ}|;oV*S5&jTVFEr7nyaz!>Q1qrP zLB^&OV>7CW`N|K>9ZXj^nOZoTSvr|ng4M+gvuc?Y2%0&DZVpx~-Q1e7+?u%p=eiu{ zwgT^Jfp@dOuePxDu(Vx`A%N8rLs)|$dSZxcF(fZ6c^#I#9&6`iZMPmr^|q$?;3&TM zl_31^_Wm{wAOdV0HrO}@+B$5obqpjrZy-1Y5uAbvP9X%RP@)TnFrv#w(yDMW5)l+e zIGMJIOp74XBFXe93O(A65kq0dQd~DvUANl1#jSKtz{fx~u@E5vB5s4osgNBHqGmw$ zdm)Eh$f*FTt)SN(V_X!uUKF{to^o$JwYsB*-BIH!uk*jr7}VVu+|v}^)4cH}65+So zBm3K<`a2@~JEHDfi@tL$=5E*4k?y3CUy?@qIm&+S`0%dB!|4;Mk0w<7rz*bsw+zta z|3Ck&4jgYacLWtL-5Z*?4}#3vk?%Xr<@|AQ(K_rn7Hx8!lghX!hC@fg1tBZsedTq?#MYj^mn(rw+z9Y$uV$_ERi z-jn#g#MrSSzi@%~o!{fS3(quOxbVpPX&X#cIEs5{TuxhKL2gTvWOx3!x({xLVFh2b zmXRgh_eVK#3>D+bXH=g)RNRw~g&e3t#bx0w;j>Uwq?2k$=oDkU?98@>G)0ZLjy96e zR!Cx>l#BK=mN9dt&T8_mt8b3>xJCN1@w#VPumBB!$V2p?(*XcZ!hUOkBe33mh$K9rScwJVZz6%$_6N=3WAy#oXBZ)?B4rn7T(MVq^};#-%1oLmH5_7t@06GynnMbE|TgN6_-dt2owZ zb!)q%u0)i$$>o9+Z=mf|sk}m63`-SJVlGXzTydDE@-5|E6EU7BWJEeqP{NN#!7NgI zBOAS<2GBUQ!eeQ=h7s_=SJS+q0g$)Rk6Y`{rf zC4(kPgK958Ly$fgJdYS2>4V;Vh!sQPKpzZ_zbrg8u|Ls;#F@X;JSW;EuE7@1&Z~!H ztj65>BdiF}>@#q$R}Co9p9C|BI=ijapaDtRk>7a9XNE|ppaFia180<*jOBA2J zG+W^2nqqM8VrAe2DU}rg?nR)dZ_P;rvqS1*aC|8}c_-|pn6^?jOHLf5^`(W2g-lX2 zm|%?lsYQ5Y_IzEXnjpV`lNAH zUPNqLgU%msWv}J}zf1N^4u6{v45Zb7y@Qb@^F0$kn9SpWb4 literal 28536 zcmV*YKv%zsP)N2bZe?^J zG%heMHD!e|WdHzf_DMuRRCr$Py=Rjg$(Ej(-3_2nD3sP(>p~T(fI>lQtz`qPwN`iT zC|=HRxnjs&4#}mhk-KKJ{X6>?_(%3LKkVcFo;d05nT4uG_Z{Qf?rSf~G9x2ABK$mY zTtsA|Hh#Ky@K~qZ(s{6LpoJy!$X1tpbm(yK@L@j1hg%NfzOJMAaOXjD*TJ#Vy?EeQ zCvNFD(9&`6NPo-NP7fa5>cZ{Ahh?p)ow5#o=ipmfXlssy)%q6OkF9NQte-k`^Z;f_ zM^D>)VbT9y`;EwTnaT2Rg=DRXD3njL%F?&bM|SYVA2R zxE{{>;E{LQM_RGA8rkmdnmWRnj-2S$@pn!h!Q*FphmLpQzNPl@GrgG7dOF(12fL3~ z>g#GBic&dvd1^2%#|v4W8d3>(WTwA+puKOjYx≷?`tK`+?5hqf;v*oqb39Mp!u0 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 diff --git a/src/main/resources/mcmod.info b/src/main/resources/mcmod.info index c3fd7d4bb..97204162e 100644 --- a/src/main/resources/mcmod.info +++ b/src/main/resources/mcmod.info @@ -2,15 +2,13 @@ { "modid": "ActuallyAdditions", "name": "Actually Additions", - "description": "Actually Additions is a Mod that offers a bunch of things from Machines for Automation and tons of food to advanced Hopper Mechanisms and Effect Rings!", - "version": "0.0.5.5", - "mcversion": "1.7.10", - "url": "https://github.com/Ellpeck/ActuallyAdditions", + "description": "Do you want Automation? Wireless Transport? Better Machines? A cup o' Coffee? Chests? Better Hoppers? Leaf Blowers? Faster Growth? Plants? Well, Actually Additions has all that and a lot more!", + "version": "${version}", + "mcversion": "${mcversion}", + "url": "http://github.com/Ellpeck/ActuallyAdditions", "updateUrl": "", - "authorList": [ - "Ellpeck" - ], - "credits": "xdqmhose, GlenthorLP, Lordhallo, canitzp", + "authorList": [ "Ellpeck" ], + "credits": "Author: Ellpeck; Thanks to: xdqmhose, GlenthorLP, Lordhallo, canitzp", "logoFile": "assets/actuallyadditions/textures/logo.png", "screenshots": [ ], diff --git a/update/changelog.txt b/update/changelog.txt index eb24747a5..bc3039296 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Fixed a Bug with the Phantom Liquiface crashing with missing TankInfos \ No newline at end of file +Fixed a Bug caused by fixing the last Bug... Whoops... \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index c7e9f866a..f5e6e48fe 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.6 \ No newline at end of file +1.7.10-0.0.5.7 \ No newline at end of file From 0f5f2c5241a086f468b23270aa713614f61659cf Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 18 Jun 2015 23:49:18 +0200 Subject: [PATCH 20/29] -Updated License --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 43d0c7d31..eae6d1e39 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,12 @@ All Rights Reserved What that means? I can decide what I want to do with the License myself. - ### YOU MAY - Fork and modify the Code - Submit Pull Requests - Copy Parts of the Code for other Projects - Make a Review/Spotlight of the Mod or use it in a Modpack +- Make Let's Play (and similar) Videos containing my Mod ### YOU CAN NOT @@ -26,3 +26,5 @@ What that means? I can decide what I want to do with the License myself. - Always credit me. Don't be a jerk and copy entire portions of the code and claim they're yours. - When it comes to the code, always link back to this Repository. - When it comes to the Mod, always link back to the the Forum Thread linked above. + +Note: The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected in this Mod. From ec8d5303e521445d80af9c617c7a8e51065d9c8f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 18 Jun 2015 23:53:01 +0200 Subject: [PATCH 21/29] Updates! :D --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index eae6d1e39..36056bc70 100644 --- a/README.md +++ b/README.md @@ -27,4 +27,7 @@ What that means? I can decide what I want to do with the License myself. - When it comes to the code, always link back to this Repository. - When it comes to the Mod, always link back to the the Forum Thread linked above. -Note: The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected in this Mod. +### NOTES +- The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected. +- Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. + From fb535bb9ec34fda648459021242f8a66400e689f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 21 Jun 2015 02:28:49 +0200 Subject: [PATCH 22/29] -Update 0.0.6.0 --- build.gradle | 2 +- .../actuallyadditions/ActuallyAdditions.java | 12 +- .../ellpeck/actuallyadditions/PLANNED.txt | 12 ++ .../blocks/BlockCoalGenerator.java | 14 ++ .../blocks/BlockEnergizer.java | 122 +++++++++++ .../blocks/BlockFurnaceDouble.java | 3 +- .../blocks/BlockItemRepairer.java | 12 +- .../blocks/BlockOilGenerator.java | 14 ++ .../actuallyadditions/blocks/BlockPlant.java | 42 ++-- .../actuallyadditions/blocks/InitBlocks.java | 9 + .../config/ConfigCategories.java | 3 +- .../config/values/ConfigCrafting.java | 13 +- .../config/values/ConfigFloatValues.java | 4 +- .../config/values/ConfigIntValues.java | 19 +- .../crafting/BlockCrafting.java | 16 ++ .../crafting/GrinderCrafting.java | 39 ++-- .../crafting/ItemCrafting.java | 101 ++++++++- .../creative/CreativeTab.java | 162 ++++++++------- .../gen/JamVillagerTradeHandler.java | 2 +- .../inventory/ContainerDrill.java | 195 ++++++++++++++++++ .../inventory/ContainerEnergizer.java | 109 ++++++++++ .../inventory/ContainerEnervator.java | 109 ++++++++++ .../inventory/ContainerGrinder.java | 2 +- .../inventory/GuiHandler.java | 14 ++ .../inventory/gui/GuiDrill.java | 39 ++++ .../inventory/gui/GuiEnergizer.java | 60 ++++++ .../inventory/gui/GuiEnervator.java | 60 ++++++ .../inventory/slot/SlotImmovable.java | 24 +++ .../actuallyadditions/items/InitItems.java | 45 +++- .../actuallyadditions/items/ItemBattery.java | 107 ++++++++++ .../actuallyadditions/items/ItemDrill.java | 178 +++++++++------- .../items/ItemDrillUpgrade.java | 75 +++++-- .../items/ItemResonantRice.java | 2 +- .../actuallyadditions/items/ItemSeed.java | 3 +- .../items/tools/ItemAllToolAA.java | 10 + .../nei/CrusherRecipeHandler.java | 6 +- .../recipe/GrinderRecipeRegistry.java | 22 +- .../recipe/GrinderRecipes.java | 36 ++-- .../tile/TileEntityBase.java | 2 + .../tile/TileEntityBreaker.java | 2 +- .../tile/TileEntityCoalGenerator.java | 10 + .../tile/TileEntityEnergizer.java | 82 ++++++++ .../tile/TileEntityEnervator.java | 92 +++++++++ .../tile/TileEntityFurnaceDouble.java | 17 +- .../tile/TileEntityGrinder.java | 38 ++-- .../tile/TileEntityOilGenerator.java | 10 + .../tile/TileEntityPhantomPlacer.java | 2 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 28 --- .../assets/actuallyadditions/lang/en_US.lang | 55 ++++- .../textures/blocks/blockCoalGeneratorTop.png | Bin 550 -> 509 bytes .../textures/blocks/blockGrinderOn.png | Bin 447 -> 1509 bytes .../textures/blocks/blockItemRepairerOn.png | Bin 807 -> 0 bytes .../textures/blocks/blockOilGeneratorTop.png | Bin 537 -> 509 bytes .../textures/gui/guiManual.png | Bin 1859 -> 0 bytes update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 57 files changed, 1687 insertions(+), 354 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockEnergizer.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerDrill.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnervator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDrill.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnergizer.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnervator.java create mode 100644 src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotImmovable.java create mode 100644 src/main/java/ellpeck/actuallyadditions/items/ItemBattery.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java create mode 100644 src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java delete mode 100644 src/main/resources/assets/actuallyadditions/textures/blocks/blockItemRepairerOn.png delete mode 100644 src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png diff --git a/build.gradle b/build.gradle index 03d308b69..12d0a25d9 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.5.7" +version = "1.7.10-0.0.6.0" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index 4f4141b1e..2c7456d48 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -13,6 +13,7 @@ import ellpeck.actuallyadditions.blocks.InitBlocks; import ellpeck.actuallyadditions.config.ConfigurationHandler; import ellpeck.actuallyadditions.crafting.GrinderCrafting; import ellpeck.actuallyadditions.crafting.InitCrafting; +import ellpeck.actuallyadditions.crafting.ItemCrafting; import ellpeck.actuallyadditions.event.InitEvents; import ellpeck.actuallyadditions.gen.InitVillager; import ellpeck.actuallyadditions.gen.OreGen; @@ -36,7 +37,7 @@ public class ActuallyAdditions{ @SidedProxy(clientSide = "ellpeck.actuallyadditions.proxy.ClientProxy", serverSide = "ellpeck.actuallyadditions.proxy.ServerProxy") public static IProxy proxy; - @EventHandler() + @EventHandler public void preInit(FMLPreInitializationEvent event){ Util.logInfo("Starting PreInitialization Phase..."); @@ -52,8 +53,7 @@ public class ActuallyAdditions{ Util.logInfo("PreInitialization Finished."); } - @SuppressWarnings("unused") - @EventHandler() + @EventHandler public void init(FMLInitializationEvent event){ Util.logInfo("Starting Initialization Phase..."); @@ -69,13 +69,13 @@ public class ActuallyAdditions{ Util.logInfo("Initialization Finished."); } - @SuppressWarnings("unused") - @EventHandler() + @EventHandler public void postInit(FMLPostInitializationEvent event){ Util.logInfo("Starting PostInitialization Phase..."); - GrinderCrafting.init(); ItemCoffee.initIngredients(); + GrinderCrafting.init(); + ItemCrafting.initMashedFoodRecipes(); proxy.postInit(); Util.logInfo("PostInitialization Finished."); diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index f88cf0aa5..b3e7fb03f 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -97,3 +97,15 @@ -XP Solidifier -Block that creates Solidified Experience from Player's Levels -Has a GUI with Buttons + +-Alarm + -Gets triggered when Mobs are in the Area + -Configurable Range + -Configurable Mobs + +-Industrial Fertilizer + -Grows the whole Plant with one Click + +-Dog Bones + -Breed Dogs faster + -Makes them have Babies too diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java index b57296420..637beffdb 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockCoalGenerator.java @@ -20,6 +20,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.List; +import java.util.Random; public class BlockCoalGenerator extends BlockContainerBase implements INameableItem{ @@ -30,6 +31,19 @@ public class BlockCoalGenerator extends BlockContainerBase implements INameableI this.setHarvestLevel("pickaxe", 0); this.setHardness(1.0F); this.setStepSound(soundTypeStone); + this.setTickRandomly(true); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand){ + int meta = world.getBlockMetadata(x, y, z); + + if (meta == 1){ + for(int i = 0; i < 5; i++){ + world.spawnParticle("smoke", (double)x+0.5F, (double)y + 1.0F, (double)z+0.5F, 0.0D, 0.0D, 0.0D); + } + } } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockEnergizer.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockEnergizer.java new file mode 100644 index 000000000..872c55f45 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockEnergizer.java @@ -0,0 +1,122 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.inventory.GuiHandler; +import ellpeck.actuallyadditions.tile.TileEntityEnergizer; +import ellpeck.actuallyadditions.tile.TileEntityEnervator; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockEnergizer extends BlockContainerBase implements INameableItem{ + + private IIcon topIcon; + private IIcon sideIcon; + private boolean isEnergizer; + + public BlockEnergizer(boolean isEnergizer){ + super(Material.rock); + this.isEnergizer = isEnergizer; + this.setHarvestLevel("pickaxe", 0); + this.setHardness(2.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + public TileEntity createNewTileEntity(World world, int par2){ + return this.isEnergizer ? new TileEntityEnergizer() : new TileEntityEnervator(); + } + + @Override + public IIcon getIcon(int side, int meta){ + return side == 1 ? this.topIcon : (side == 0 ? this.blockIcon : this.sideIcon); + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); + this.sideIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Side"); + } + + @Override + public boolean onBlockActivated(World world, int x, int y, int z, EntityPlayer player, int par6, float par7, float par8, float par9){ + if(!world.isRemote){ + if(this.isEnergizer){ + TileEntityEnergizer energizer = (TileEntityEnergizer)world.getTileEntity(x, y, z); + if(energizer != null) player.openGui(ActuallyAdditions.instance, GuiHandler.ENERGIZER_ID, world, x, y, z); + } + else{ + TileEntityEnervator energizer = (TileEntityEnervator)world.getTileEntity(x, y, z); + if(energizer != null) player.openGui(ActuallyAdditions.instance, GuiHandler.ENERVATOR_ID, world, x, y, z); + } + return true; + } + return true; + } + + @Override + public void breakBlock(World world, int x, int y, int z, Block block, int par6){ + this.dropInventory(world, x, y, z); + super.breakBlock(world, x, y, z, block, par6); + } + + @Override + public String getName(){ + return this.isEnergizer ? "blockEnergizer" : "blockEnervator"; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 2, ""); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java index a0986d1c9..f6f4901c3 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockFurnaceDouble.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.tile.TileEntityFurnaceDouble; import ellpeck.actuallyadditions.util.BlockUtil; @@ -171,7 +172,7 @@ public class BlockFurnaceDouble extends BlockContainerBase implements INameableI @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { BlockUtil.addInformation(theBlock, list, 1, ""); - BlockUtil.addPowerUsageInfo(list, TileEntityFurnaceDouble.energyUsePerTick); + BlockUtil.addPowerUsageInfo(list, ConfigIntValues.FURNACE_ENERGY_USED.getValue()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java index 10be6b9a1..905b3d0ce 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockItemRepairer.java @@ -21,12 +21,10 @@ import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import java.util.List; -import java.util.Random; public class BlockItemRepairer extends BlockContainerBase implements INameableItem{ private IIcon topIcon; - private IIcon onIcon; private IIcon bottomIcon; public BlockItemRepairer(){ @@ -54,24 +52,16 @@ public class BlockItemRepairer extends BlockContainerBase implements INameableIt @Override public IIcon getIcon(int side, int meta){ - if(side == 1 && meta != 1) return this.topIcon; - if(side == 1) return this.onIcon; + if(side == 1) return this.topIcon; if(side == 0) return this.bottomIcon; return this.blockIcon; } - @Override - @SideOnly(Side.CLIENT) - public void randomDisplayTick(World world, int x, int y, int z, Random rand){ - - } - @Override @SideOnly(Side.CLIENT) public void registerBlockIcons(IIconRegister iconReg){ this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); this.topIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Top"); - this.onIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "On"); this.bottomIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName() + "Bottom"); } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java index 28e8d6568..6fc338596 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockOilGenerator.java @@ -20,6 +20,7 @@ import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.List; +import java.util.Random; public class BlockOilGenerator extends BlockContainerBase implements INameableItem{ @@ -30,6 +31,19 @@ public class BlockOilGenerator extends BlockContainerBase implements INameableIt this.setHarvestLevel("pickaxe", 0); this.setHardness(1.0F); this.setStepSound(soundTypeStone); + this.setTickRandomly(true); + } + + @Override + @SideOnly(Side.CLIENT) + public void randomDisplayTick(World world, int x, int y, int z, Random rand){ + int meta = world.getBlockMetadata(x, y, z); + + if (meta == 1){ + for(int i = 0; i < 5; i++){ + world.spawnParticle("smoke", (double)x+0.5F, (double)y + 1.0F, (double)z+0.5F, 0.0D, 0.0D, 0.0D); + } + } } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index f9298b9ac..a0acb372e 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -21,7 +21,6 @@ import powercrystals.minefactoryreloaded.api.HarvestType; import powercrystals.minefactoryreloaded.api.IFactoryFertilizable; import powercrystals.minefactoryreloaded.api.IFactoryHarvestable; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; @@ -31,7 +30,8 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar private IIcon[] textures; private String name; public Item seedItem; - public ItemStack returnItem; + public Item returnItem; + public int returnMeta; private int minDropAmount; private int addDropAmount; @@ -48,25 +48,8 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar } @Override - public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune){ - ArrayList ret = super.getDrops(world, x, y, z, metadata, fortune); - if(metadata >= 7){ - for(int i = 0; i < 3; ++i){ - if(world.rand.nextInt(6) == 0) ret.add(new ItemStack(this.seedItem)); - } - - ItemStack stack = this.returnItem.copy(); - stack.stackSize = new Random().nextInt(addDropAmount)+minDropAmount; - ret.add(stack); - } - else ret.add(new ItemStack(this.seedItem)); - - return ret; - } - - @Override - public Item getItemDropped(int meta, Random rand, int i){ - return null; + public int quantityDropped(int meta, int fortune, Random random){ + return random.nextInt(addDropAmount)+minDropAmount; } @Override @@ -89,9 +72,24 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar return this.seedItem; } + @Override + public Item getItemDropped(int meta, Random rand, int par3){ + return meta >= 7 ? this.func_149865_P() : this.func_149866_i(); + } + @Override public Item func_149865_P(){ - return this.returnItem.getItem(); + return this.returnItem; + } + + @Override + public int damageDropped(int meta){ + return this.returnMeta; + } + + @Override + public int getDamageValue(World world, int x, int y, int z){ + return 0; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 6044ab5df..713d56dc8 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -64,9 +64,18 @@ public class InitBlocks{ public static Block blockPhantomBooster; + public static Block blockEnergizer; + public static Block blockEnervator; + public static void init(){ Util.logInfo("Initializing Blocks..."); + blockEnergizer = new BlockEnergizer(true); + BlockUtil.register(blockEnergizer, BlockEnergizer.TheItemBlock.class); + + blockEnervator = new BlockEnergizer(false); + BlockUtil.register(blockEnervator, BlockEnergizer.TheItemBlock.class); + blockLavaFactoryController = new BlockLavaFactoryController(); BlockUtil.register(blockLavaFactoryController, BlockLavaFactoryController.TheItemBlock.class); diff --git a/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java b/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java index fac93403a..dc14d923a 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java +++ b/src/main/java/ellpeck/actuallyadditions/config/ConfigCategories.java @@ -12,7 +12,8 @@ public enum ConfigCategories{ WORLD_GEN("world gen"), POTION_RING_CRAFTING("ring crafting"), OTHER("other"), - FLUIDS("fluids"); + FLUIDS("fluids"), + DRILL_VALUES("drill values"); public final String name; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java index 58449b28f..530c36472 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigCrafting.java @@ -94,7 +94,18 @@ public enum ConfigCrafting{ ENDER_CASING("Ender Casing", ConfigCategories.BLOCKS_CRAFTING), PHANTOM_BOOSTER("Phantom Booster", ConfigCategories.BLOCKS_CRAFTING), COFFEE_MACHINE("Coffee Machine", ConfigCategories.BLOCKS_CRAFTING), - LAVA_FACTORY("Lava Factory", ConfigCategories.BLOCKS_CRAFTING); + LAVA_FACTORY("Lava Factory", ConfigCategories.BLOCKS_CRAFTING), + + DRILL("Drill", ConfigCategories.ITEMS_CRAFTING), + DRILL_SPEED("Drill Speed Upgrades", ConfigCategories.ITEMS_CRAFTING), + DRILL_FORTUNE("Drill Fortune Upgrades", ConfigCategories.ITEMS_CRAFTING), + DRILL_SIZE("Drill Size Upgrades", ConfigCategories.ITEMS_CRAFTING), + DRILL_PLACING("Drill Placing Upgrade", ConfigCategories.ITEMS_CRAFTING), + DRILL_SILK_TOUCH("Drill Silk Touch Upgrade", ConfigCategories.ITEMS_CRAFTING), + BATTERY("Battery", ConfigCategories.ITEMS_CRAFTING), + + ENERGIZER("Energizer", ConfigCategories.BLOCKS_CRAFTING), + ENERVATOR("Enervator", ConfigCategories.BLOCKS_CRAFTING); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigFloatValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigFloatValues.java index 1af7ea863..e8d94df86 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigFloatValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigFloatValues.java @@ -9,7 +9,9 @@ public enum ConfigFloatValues{ EMERALD_MAX_DAMAGE("Emerald: Damage", ConfigCategories.TOOL_VALUES, 5.0F, 0.1F, 50.0F, "How much damage an Emerald Tool deals"), OBSIDIAN_SPEED("Obsidian: Efficiency", ConfigCategories.TOOL_VALUES, 4.0F, 1.0F, 20.0F, "How fast Obsidian Tools are"), - OBSIDIAN_MAX_DAMAGE("Obsidian: Damage", ConfigCategories.TOOL_VALUES, 2.0F, 0.1F, 50.0F, "How much damage an Obsidian Tool deals"); + OBSIDIAN_MAX_DAMAGE("Obsidian: Damage", ConfigCategories.TOOL_VALUES, 2.0F, 0.1F, 50.0F, "How much damage an Obsidian Tool deals"), + + DRILL_DAMAGE("Drill: Default Damage", ConfigCategories.DRILL_VALUES, 8.0F, 1.0F, 30.0F, "How much Damage the Drill does to an Entity"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index f5b9fab72..5a2e05617 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -41,7 +41,7 @@ public enum ConfigIntValues{ REPAIRER_SPEED_SLOWDOWN("Repairer: Speed Slowdown", ConfigCategories.MACHINE_VALUES, 2, 1, 100, "How much slower the Item Repairer repairs"), HEAT_COLLECTOR_BLOCKS("Heat Collector: Blocks Needed", ConfigCategories.MACHINE_VALUES, 4, 1, 5, "How many Blocks are needed for the Heat Collector to power Machines above it"), - HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 10000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), + HEAT_COLLECTOR_LAVA_CHANCE("Heat Collector: Random Chance", ConfigCategories.MACHINE_VALUES, 15000, 10, 100000, "The Chance of the Heat Collector destroying a Lava Block around (Default Value 2000 meaning a 1/2000 Chance!)"), GLASS_TIME_NEEDED("Greenhouse Glass: Time", ConfigCategories.MACHINE_VALUES, 300, 1, 10000, "Time Needed for the Greenhouse Glass to grow a Plant below it"), @@ -53,12 +53,12 @@ public enum ConfigIntValues{ RICE_AMOUNT("Rice Amount", ConfigCategories.WORLD_GEN, 15, 1, 100, "The Chance of Rice generating"), CANOLA_AMOUNT("Canola Amount", ConfigCategories.WORLD_GEN, 10, 1, 50, "The Chance of Canola generating"), FLAX_AMOUNT("Flax Amount", ConfigCategories.WORLD_GEN, 8, 1, 50, "The Chance of Flax generating"), - COFFEE_AMOUNT("Coffee Amount", ConfigCategories.WORLD_GEN, 4, 1, 50, "The Chance of Coffee generating"), + COFFEE_AMOUNT("Coffee Amount", ConfigCategories.WORLD_GEN, 6, 1, 50, "The Chance of Coffee generating"), GRINDER_ENERGY_USED("Energy Use: Crusher", ConfigCategories.MACHINE_VALUES, 40, 1, 500, "The Amount of Energy used by the Crusher per Tick"), GRINDER_DOUBLE_ENERGY_USED("Energy Use: Double Crusher", ConfigCategories.MACHINE_VALUES, 60, 1, 500, "The Amount of Energy used by the Double Crusher per Tick"), FURNACE_SOLAR_ENERGY_PRODUCED("Energy Production: Furnace Solar", ConfigCategories.MACHINE_VALUES, 15, 1, 500, "The Amount of Energy produced by the Solar per Tick"), - HEAT_COLLECTOR_ENERGY_PRODUCED("Energy Production: Heat Collector", ConfigCategories.MACHINE_VALUES, 30, 1, 500, "The Amount of Energy produced by the Heat Collector per Tick"), + HEAT_COLLECTOR_ENERGY_PRODUCED("Energy Production: Heat Collectors", ConfigCategories.MACHINE_VALUES, 60, 1, 500, "The Amount of Energy produced by the Heat Collector per Tick"), REPAIRER_ENERGY_USED("Energy Use: Repairer", ConfigCategories.MACHINE_VALUES, 1250, 1, 5000, "The Amount of Energy used by the Repairer per Tick"), FURNACE_ENERGY_USED("Energy Use: Double Furnace", ConfigCategories.MACHINE_VALUES, 25, 1, 500, "The Amount of Energy used by the Double Furnace per Tick"), @@ -87,7 +87,18 @@ public enum ConfigIntValues{ COFFEE_CACHE_USED_PER_ITEM("Coffee Machine: Coffee used per Cup", ConfigCategories.MACHINE_VALUES, 10, 1, 300, "The amount of Coffee used to brew one Coffee in the Coffee Machine"), COFFEE_MACHINE_TIME_USED("Coffee Machine: Time to Brew", ConfigCategories.MACHINE_VALUES, 500, 10, 10000, "The amount of time the Coffee Machine takes to brew a Coffee"), - COFFEE_DRINK_AMOUNT("Coffee: Drink Amount", ConfigCategories.OTHER, 4, 1, 100, "How often a Coffee can be drunk from"); + COFFEE_DRINK_AMOUNT("Coffee: Drink Amount", ConfigCategories.OTHER, 4, 1, 100, "How often a Coffee can be drunk from"), + + DRILL_ENERGY_USE("Drill: Energy Use Per Block or Hit", ConfigCategories.DRILL_VALUES, 100, 5, 10000, "How much Energy the Drill uses per Block"), + + DRILL_SPEED_EXTRA_USE("Speed Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 50, 0, 10000, "How much extra Energy the Speed Upgrade uses"), + DRILL_SPEED_II_EXTRA_USE("Speed II Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 75, 0, 10000, "How much extra Energy the Speed II Upgrade uses"), + DRILL_SPEED_III_EXTRA_USE("Speed III Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 175, 0, 10000, "How much extra Energy the Speed III Upgrade uses"), + DRILL_SILK_EXTRA_USE("Silk Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 30, 0, 10000, "How much extra Energy the Silk Upgrade uses"), + DRILL_FORTUNE_EXTRA_USE("Fortune Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 40, 0, 10000, "How much extra Energy the Fortune Upgrade uses"), + DRILL_FORTUNE_II_EXTRA_USE("Fortune II Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 60, 0, 10000, "How much extra Energy the Fortune II Upgrade uses"), + DRILL_THREE_BY_THREE_EXTRA_USE("3x3 Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 10, 0, 10000, "How much extra Energy the 3x3 Upgrade uses"), + DRILL_FIVE_BY_FIVE_EXTRA_USE("5x5 Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 30, 0, 10000, "How much extra Energy the 5x5 Upgrade uses"); public final String name; public final String category; diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java index 23cc69130..5814ccdfb 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/BlockCrafting.java @@ -64,6 +64,22 @@ public class BlockCrafting{ 'S', TheMiscBlocks.STONE_CASING.getOredictName(), 'A', TheMiscItems.COIL.getOredictName())); + //Energizer + if(ConfigCrafting.ENERGIZER.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockEnergizer), + "I I", "CAC", "I I", + 'I', "ingotIron", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'A', TheMiscBlocks.STONE_CASING.getOredictName())); + + //Energizer + if(ConfigCrafting.ENERVATOR.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockEnervator), + " I ", "CAC", " I ", + 'I', "ingotIron", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'A', TheMiscBlocks.STONE_CASING.getOredictName())); + //Lava Factory if(ConfigCrafting.LAVA_FACTORY.isEnabled()){ GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitBlocks.blockLavaFactoryController), diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index 3ef1a8d0b..28a62a506 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -13,34 +13,31 @@ import net.minecraft.item.ItemStack; public class GrinderCrafting{ - private static GrinderRecipeRegistry grindRecReg = GrinderRecipeRegistry.instance(); - private static GrinderRecipes grindRec = GrinderRecipes.instance(); - public static void init(){ Util.logInfo("Initializing Crusher Recipes..."); - grindRec.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10)); - grindRec.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal())); - grindRec.registerRecipe(new ItemStack(Items.coal), new ItemStack(InitItems.itemDust, 1, TheDusts.COAL.ordinal())); - grindRec.registerRecipe(new ItemStack(Blocks.coal_block), new ItemStack(InitItems.itemDust, 9, TheDusts.COAL.ordinal())); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10)); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal())); + GrinderRecipes.registerRecipe(new ItemStack(Items.coal), new ItemStack(InitItems.itemDust, 1, TheDusts.COAL.ordinal())); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.coal_block), new ItemStack(InitItems.itemDust, 9, TheDusts.COAL.ordinal())); - grindRec.registerRecipe(new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.sand)); - grindRec.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); - grindRec.registerRecipe(new ItemStack(Blocks.stone), new ItemStack(Blocks.cobblestone)); - grindRec.registerRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal()), new ItemStack(Items.sugar, 2)); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.sand)); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); + GrinderRecipes.registerRecipe(new ItemStack(Blocks.stone), new ItemStack(Blocks.cobblestone)); + GrinderRecipes.registerRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal()), new ItemStack(Items.sugar, 2)); - grindRec.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); - grindRec.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); + GrinderRecipes.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); + GrinderRecipes.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); - grindRecReg.searchCases.add(new SearchCase("oreNether", 6)); - grindRecReg.searchCases.add(new SearchCase("denseore", 8)); - grindRecReg.searchCases.add(new SearchCase("ingot", 1)); - grindRecReg.searchCases.add(new SearchCase("gem", 1)); - grindRecReg.searchCases.add(new SearchCase("ore", 2)); + GrinderRecipeRegistry.searchCases.add(new SearchCase("oreNether", 6)); + GrinderRecipeRegistry.searchCases.add(new SearchCase("denseore", 8)); + GrinderRecipeRegistry.searchCases.add(new SearchCase("gem", 1)); + GrinderRecipeRegistry.searchCases.add(new SearchCase("ingot", 1)); + GrinderRecipeRegistry.searchCases.add(new SearchCase("ore", 2)); - grindRecReg.exceptions.add("ingotBrick"); - grindRecReg.exceptions.add("ingotBrickNether"); + GrinderRecipeRegistry.exceptions.add("ingotBrick"); + GrinderRecipeRegistry.exceptions.add("ingotBrickNether"); - grindRecReg.registerFinally(); + GrinderRecipeRegistry.registerFinally(); } } diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java index 5cde60751..b09a62682 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java @@ -8,11 +8,13 @@ import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.*; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.Util; +import net.minecraft.block.IGrowable; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.Item; import net.minecraft.item.ItemFood; import net.minecraft.item.ItemStack; +import net.minecraftforge.common.IPlantable; import net.minecraftforge.oredict.ShapedOreRecipe; import net.minecraftforge.oredict.ShapelessOreRecipe; @@ -44,6 +46,91 @@ public class ItemCrafting{ 'P', new ItemStack(Blocks.piston), 'C', TheMiscItems.COIL_ADVANCED.getOredictName())); + //Drill + if(ConfigCrafting.DRILL.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrill), + "DDD", "CRC", "III", + 'D', "gemDiamond", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName(), + 'R', "dustRedstone", + 'I', "blockIron")); + + //Drill Speed + if(ConfigCrafting.DRILL_SPEED.isEnabled()){ + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeSpeed), + "ISI", "SRS", "ISI", + 'I', "ingotIron", + 'S', Items.sugar, + 'R', "dustRedstone")); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeSpeedII), + "ISI", "SCS", "ISI", + 'I', "ingotIron", + 'S', Items.sugar, + 'C', Items.cake)); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeSpeedIII), + "ISI", "SFS", "ISI", + 'I', "ingotIron", + 'S', Items.sugar, + 'F', "gemDiamond")); + } + + //Drill Fortune + if(ConfigCrafting.DRILL_FORTUNE.isEnabled()){ + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeFortune), + "ISI", "SRS", "ISI", + 'I', Blocks.glowstone, + 'S', Items.redstone, + 'R', Blocks.diamond_block)); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeFortuneII), + "ISI", "SRS", "ISI", + 'I', Blocks.glowstone, + 'S', Items.redstone, + 'R', TheMiscBlocks.ENDER_CASING.getOredictName())); + } + + //Drill Size + if(ConfigCrafting.DRILL_SIZE.isEnabled()){ + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeThreeByThree), + "DID", "ICI", "DID", + 'I', "ingotIron", + 'D', "gemDiamond", + 'C', TheMiscItems.COIL.getOredictName())); + + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeFiveByFive), + "DID", "ICI", "DID", + 'I', "ingotIron", + 'D', "gemDiamond", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName())); + } + + //Drill Silk Touch + if(ConfigCrafting.DRILL_SILK_TOUCH.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeSilkTouch), + "DSD", "SCS", "DSD", + 'D', "gemEmerald", + 'S', "gemDiamond", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName())); + + //Drill Placing + if(ConfigCrafting.DRILL_PLACING.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemDrillUpgradeBlockPlacing), + "CEC", "RAR", "CEC", + 'C', "cobblestone", + 'E', Items.ender_pearl, + 'A', TheMiscItems.COIL.getOredictName(), + 'R', "ingotIron")); + + //Battery + if(ConfigCrafting.BATTERY.isEnabled()) + GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemBattery), + " R ", "ICI", "III", + 'R', "dustRedstone", + 'I', "ingotIron", + 'C', TheMiscItems.COIL_ADVANCED.getOredictName())); + //Coil if(ConfigCrafting.COIL.isEnabled()) GameRegistry.addRecipe(new ShapedOreRecipe(new ItemStack(InitItems.itemMisc, 1, TheMiscItems.COIL.ordinal()), @@ -174,10 +261,6 @@ public class ItemCrafting{ GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemCanolaSeed), new ItemStack(InitItems.itemMisc, 1, TheMiscItems.CANOLA.ordinal())); - //Mashed Food - if(ConfigCrafting.MASHED_FOOD.isEnabled()) - initMashedFoodRecipes(); - //Rings initPotionRingRecipes(); @@ -226,10 +309,12 @@ public class ItemCrafting{ } public static void initMashedFoodRecipes(){ - for(Object nextIterator : Item.itemRegistry){ - if(nextIterator instanceof ItemFood){ - ItemStack ingredient = new ItemStack((Item)nextIterator, 1, Util.WILDCARD); - GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 12, TheMiscItems.MASHED_FOOD.ordinal()), ingredient, ingredient, ingredient, ingredient, new ItemStack(InitItems.itemKnife, 1, Util.WILDCARD)); + if(ConfigCrafting.MASHED_FOOD.isEnabled()){ + for(Object nextIterator : Item.itemRegistry){ + if(nextIterator instanceof ItemFood || nextIterator instanceof IPlantable || nextIterator instanceof IGrowable){ + ItemStack ingredient = new ItemStack((Item)nextIterator, 1, Util.WILDCARD); + GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 8, TheMiscItems.MASHED_FOOD.ordinal()), ingredient, ingredient, ingredient, ingredient, new ItemStack(InitItems.itemKnife, 1, Util.WILDCARD)); + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index 156f8d699..aa6dea2ba 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -26,89 +26,103 @@ public class CreativeTab extends CreativeTabs{ public void displayAllReleventItems(List list){ this.list = list; - addBlock(InitBlocks.blockPhantomface); - addBlock(InitBlocks.blockPhantomEnergyface); - addBlock(InitBlocks.blockPhantomLiquiface); - addBlock(InitBlocks.blockPhantomPlacer); - addBlock(InitBlocks.blockPhantomBreaker); - addBlock(InitBlocks.blockPhantomBooster); - addBlock(InitBlocks.blockCoffeeMachine); - addBlock(InitBlocks.blockInputter); - addBlock(InitBlocks.blockInputterAdvanced); + add(InitBlocks.blockPhantomface); + add(InitBlocks.blockPhantomEnergyface); + add(InitBlocks.blockPhantomLiquiface); + add(InitBlocks.blockPhantomPlacer); + add(InitBlocks.blockPhantomBreaker); + add(InitBlocks.blockPhantomBooster); + add(InitBlocks.blockCoffeeMachine); + add(InitBlocks.blockInputter); + add(InitBlocks.blockInputterAdvanced); - addBlock(InitBlocks.blockGreenhouseGlass); - addBlock(InitBlocks.blockGrinder); - addBlock(InitBlocks.blockGrinderDouble); - addBlock(InitBlocks.blockFurnaceDouble); - addBlock(InitBlocks.blockLavaFactoryController); + add(InitBlocks.blockGreenhouseGlass); + add(InitBlocks.blockGrinder); + add(InitBlocks.blockGrinderDouble); + add(InitBlocks.blockFurnaceDouble); + add(InitBlocks.blockLavaFactoryController); - addBlock(InitBlocks.blockFurnaceSolar); - addBlock(InitBlocks.blockHeatCollector); - addBlock(InitBlocks.blockCoalGenerator); - addBlock(InitBlocks.blockOilGenerator); - addBlock(InitBlocks.blockItemRepairer); - addBlock(InitBlocks.blockFishingNet); - addBlock(InitBlocks.blockBreaker); - addBlock(InitBlocks.blockPlacer); - addBlock(InitBlocks.blockDropper); - addBlock(InitBlocks.blockFluidPlacer); - addBlock(InitBlocks.blockFluidCollector); + add(InitBlocks.blockEnergizer); + add(InitBlocks.blockEnervator); - addBlock(InitBlocks.blockMisc); - addBlock(InitBlocks.blockFeeder); - addBlock(InitBlocks.blockCompost); - addBlock(InitBlocks.blockGiantChest); - addBlock(InitBlocks.blockCanolaPress); - addBlock(InitBlocks.blockFermentingBarrel); + add(InitBlocks.blockFurnaceSolar); + add(InitBlocks.blockHeatCollector); + add(InitBlocks.blockCoalGenerator); + add(InitBlocks.blockOilGenerator); + add(InitBlocks.blockItemRepairer); + add(InitBlocks.blockFishingNet); + add(InitBlocks.blockBreaker); + add(InitBlocks.blockPlacer); + add(InitBlocks.blockDropper); + add(InitBlocks.blockFluidPlacer); + add(InitBlocks.blockFluidCollector); - //addItem(InitItems.itemDrill); - addItem(InitItems.itemPhantomConnector); - addItem(InitItems.itemBucketCanolaOil); - addItem(InitItems.itemBucketOil); + add(InitBlocks.blockMisc); + add(InitBlocks.blockFeeder); + add(InitBlocks.blockCompost); + add(InitBlocks.blockGiantChest); + add(InitBlocks.blockCanolaPress); + add(InitBlocks.blockFermentingBarrel); - addItem(InitItems.itemCoffeeSeed); - addItem(InitItems.itemCoffeeBean); - addItem(InitItems.itemRiceSeed); - addItem(InitItems.itemCanolaSeed); - addItem(InitItems.itemFlaxSeed); - addItem(InitItems.itemHairyBall); - addItem(InitItems.itemMisc); - addItem(InitItems.itemResonantRice); - addItem(InitItems.itemFertilizer); + add(InitItems.itemDrill); + add(InitItems.itemDrillUpgradeSpeed); + add(InitItems.itemDrillUpgradeSpeedII); + add(InitItems.itemDrillUpgradeSpeedIII); + add(InitItems.itemDrillUpgradeSilkTouch); + add(InitItems.itemDrillUpgradeFortune); + add(InitItems.itemDrillUpgradeFortuneII); + add(InitItems.itemDrillUpgradeThreeByThree); + add(InitItems.itemDrillUpgradeFiveByFive); + add(InitItems.itemDrillUpgradeBlockPlacing); + add(InitItems.itemBattery); + + add(InitItems.itemPhantomConnector); + add(InitItems.itemBucketCanolaOil); + add(InitItems.itemBucketOil); - addItem(InitItems.itemCoffee); - addItem(InitItems.itemFoods); - addItem(InitItems.itemKnife); - addItem(InitItems.itemCrafterOnAStick); - addItem(InitItems.itemDust); - addItem(InitItems.itemSpecialDrop); - addItem(InitItems.itemLeafBlower); - addItem(InitItems.itemLeafBlowerAdvanced); + add(InitItems.itemCoffeeSeed); + add(InitItems.itemCoffeeBean); + add(InitItems.itemRiceSeed); + add(InitItems.itemCanolaSeed); + add(InitItems.itemFlaxSeed); + add(InitItems.itemHairyBall); + add(InitItems.itemMisc); + add(InitItems.itemResonantRice); + add(InitItems.itemFertilizer); - addItem(InitItems.woodenPaxel); - addItem(InitItems.stonePaxel); - addItem(InitItems.ironPaxel); - addItem(InitItems.goldPaxel); - addItem(InitItems.diamondPaxel); - addItem(InitItems.emeraldPaxel); - addItem(InitItems.obsidianPaxel); + add(InitItems.itemCoffee); + add(InitItems.itemFoods); + add(InitItems.itemKnife); + add(InitItems.itemCrafterOnAStick); + add(InitItems.itemDust); + add(InitItems.itemSpecialDrop); + add(InitItems.itemLeafBlower); + add(InitItems.itemLeafBlowerAdvanced); - addItem(InitItems.itemPickaxeEmerald); - addItem(InitItems.itemSwordEmerald); - addItem(InitItems.itemAxeEmerald); - addItem(InitItems.itemShovelEmerald); - addItem(InitItems.itemHoeEmerald); + add(InitItems.woodenPaxel); + add(InitItems.stonePaxel); + add(InitItems.ironPaxel); + add(InitItems.goldPaxel); + add(InitItems.diamondPaxel); + add(InitItems.emeraldPaxel); + add(InitItems.obsidianPaxel); - addItem(InitItems.itemPickaxeObsidian); - addItem(InitItems.itemSwordObsidian); - addItem(InitItems.itemAxeObsidian); - addItem(InitItems.itemShovelObsidian); - addItem(InitItems.itemHoeObsidian); + add(InitItems.itemPickaxeEmerald); + add(InitItems.itemSwordEmerald); + add(InitItems.itemAxeEmerald); + add(InitItems.itemShovelEmerald); + add(InitItems.itemHoeEmerald); - addItem(InitItems.itemPotionRing); - addItem(InitItems.itemPotionRingAdvanced); + add(InitItems.itemPickaxeObsidian); + add(InitItems.itemSwordObsidian); + add(InitItems.itemAxeObsidian); + add(InitItems.itemShovelObsidian); + add(InitItems.itemHoeObsidian); - addItem(InitItems.itemJams); + add(InitItems.itemPotionRing); + add(InitItems.itemPotionRingAdvanced); + + add(InitItems.itemJams); } @Override @@ -121,11 +135,11 @@ public class CreativeTab extends CreativeTabs{ return new ItemStack(this.getTabIconItem()); } - private void addItem(Item item){ + private void add(Item item){ item.getSubItems(item, instance, list); } - private void addBlock(Block block){ + private void add(Block block){ block.getSubBlocks(new ItemStack(block).getItem(), instance, list); } } diff --git a/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java b/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java index 8cee0c841..e3b287914 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/JamVillagerTradeHandler.java @@ -55,7 +55,7 @@ public class JamVillagerTradeHandler implements VillagerRegistry.IVillageTradeHa } public void addWants(String oredictName, int minSize, int maxSize){ - ArrayList stacks = OreDictionary.getOres(oredictName); + ArrayList stacks = (ArrayList)OreDictionary.getOres(oredictName, false); trades.add(new Trade(stacks, minSize, maxSize)); } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDrill.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDrill.java new file mode 100644 index 000000000..5d5281aa7 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerDrill.java @@ -0,0 +1,195 @@ +package ellpeck.actuallyadditions.inventory; + +import ellpeck.actuallyadditions.inventory.slot.SlotImmovable; +import ellpeck.actuallyadditions.items.ItemDrill; +import ellpeck.actuallyadditions.items.ItemDrillUpgrade; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +@InventoryContainer +public class ContainerDrill extends Container{ + + private static final int SLOT_AMOUNT = 5; + + private InventoryDrill drillInventory = new InventoryDrill(); + private InventoryPlayer inventory; + + public ContainerDrill(InventoryPlayer inventory){ + this.inventory = inventory; + + for(int i = 0; i < SLOT_AMOUNT; i++){ + this.addSlotToContainer(new Slot(drillInventory, i, 44+i*18, 19){ + @Override + public boolean isItemValid(ItemStack stack){ + return stack.getItem() instanceof ItemDrillUpgrade; + } + }); + } + + for(int i = 0; i < 3; i++){ + for(int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j+i*9+9, 8+j*18, 58+i*18)); + } + } + for(int i = 0; i < 9; i++){ + if(i == inventory.currentItem) this.addSlotToContainer(new SlotImmovable(inventory, i, 8+i*18, 116)); + else this.addSlotToContainer(new Slot(inventory, i, 8+i*18, 116)); + } + + ItemStack stack = inventory.getCurrentItem(); + if(stack != null && stack.getItem() instanceof ItemDrill){ + ItemStack[] slots = ((ItemDrill)stack.getItem()).getSlotsFromNBT(inventory.getCurrentItem()); + if(slots != null && slots.length > 0) this.drillInventory.slots = slots; + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.drillInventory.isUseableByPlayer(player); + } + + @Override + public void onContainerClosed(EntityPlayer player){ + ItemStack stack = inventory.getCurrentItem(); + if(stack != null && stack.getItem() instanceof ItemDrill){ + ((ItemDrill)stack.getItem()).writeSlotsToNBT(this.drillInventory.slots, inventory.getCurrentItem()); + } + super.onContainerClosed(player); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 5; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(currentStack.getItem() != null){ + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() instanceof ItemDrillUpgrade){ + this.mergeItemStack(newStack, 0, SLOT_AMOUNT, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + } + return null; + } + + public static class InventoryDrill implements IInventory{ + + public ItemStack[] slots = new ItemStack[SLOT_AMOUNT]; + + @Override + public String getInventoryName(){ + return "drill"; + } + + @Override + public boolean hasCustomInventoryName(){ + return false; + } + + @Override + public int getInventoryStackLimit(){ + return 64; + } + + @Override + public void markDirty(){ + + } + + @Override + public void openInventory(){ + + } + + @Override + public void closeInventory(){ + + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack){ + return true; + } + + @Override + public boolean isUseableByPlayer(EntityPlayer player){ + return true; + } + + @Override + public ItemStack getStackInSlotOnClosing(int i){ + return getStackInSlot(i); + } + + @Override + public void setInventorySlotContents(int i, ItemStack stack){ + this.slots[i] = stack; + this.markDirty(); + } + + @Override + public int getSizeInventory(){ + return slots.length; + } + + @Override + public ItemStack getStackInSlot(int i){ + if(i < this.getSizeInventory()){ + return slots[i]; + } + return null; + } + + @Override + public ItemStack decrStackSize(int i, int j){ + if (slots[i] != null){ + ItemStack stackAt; + if(slots[i].stackSize <= j){ + stackAt = slots[i]; + slots[i] = null; + this.markDirty(); + return stackAt; + } + else{ + stackAt = slots[i].splitStack(j); + if (slots[i].stackSize == 0) slots[i] = null; + this.markDirty(); + return stackAt; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java new file mode 100644 index 000000000..c050deaea --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java @@ -0,0 +1,109 @@ +package ellpeck.actuallyadditions.inventory; + +import cofh.api.energy.IEnergyContainerItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityEnergizer; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +@InventoryContainer +public class ContainerEnergizer extends Container{ + + private TileEntityEnergizer energizer; + + private int lastEnergyStored; + + public ContainerEnergizer(InventoryPlayer inventory, TileEntityBase tile){ + this.energizer = (TileEntityEnergizer)tile; + + this.addSlotToContainer(new Slot(this.energizer, 0, 76, 73)); + this.addSlotToContainer(new SlotOutput(this.energizer, 1, 76, 42)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.energizer.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.energizer.getEnergyStored(ForgeDirection.UNKNOWN)); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyStored != this.energizer.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.energizer.getEnergyStored(ForgeDirection.UNKNOWN)); + } + + this.lastEnergyStored = this.energizer.getEnergyStored(ForgeDirection.UNKNOWN); + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.energizer.storage.setEnergyStored(par2); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 2; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() instanceof IEnergyContainerItem){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnervator.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnervator.java new file mode 100644 index 000000000..b9497be95 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnervator.java @@ -0,0 +1,109 @@ +package ellpeck.actuallyadditions.inventory; + +import cofh.api.energy.IEnergyContainerItem; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.slot.SlotOutput; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityEnervator; +import invtweaks.api.container.InventoryContainer; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.common.util.ForgeDirection; + +@InventoryContainer +public class ContainerEnervator extends Container{ + + private TileEntityEnervator enervator; + + private int lastEnergyStored; + + public ContainerEnervator(InventoryPlayer inventory, TileEntityBase tile){ + this.enervator = (TileEntityEnervator)tile; + + this.addSlotToContainer(new Slot(this.enervator, 0, 76, 73)); + this.addSlotToContainer(new SlotOutput(this.enervator, 1, 76, 42)); + + for (int i = 0; i < 3; i++){ + for (int j = 0; j < 9; j++){ + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); + } + } + for (int i = 0; i < 9; i++){ + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155)); + } + } + + @Override + public boolean canInteractWith(EntityPlayer player){ + return this.enervator.isUseableByPlayer(player); + } + + @Override + public void addCraftingToCrafters(ICrafting iCraft){ + super.addCraftingToCrafters(iCraft); + iCraft.sendProgressBarUpdate(this, 0, this.enervator.getEnergyStored(ForgeDirection.UNKNOWN)); + } + + @Override + public void detectAndSendChanges(){ + super.detectAndSendChanges(); + for(Object crafter : this.crafters){ + ICrafting iCraft = (ICrafting)crafter; + + if(this.lastEnergyStored != this.enervator.getEnergyStored(ForgeDirection.UNKNOWN)) iCraft.sendProgressBarUpdate(this, 0, this.enervator.getEnergyStored(ForgeDirection.UNKNOWN)); + } + + this.lastEnergyStored = this.enervator.getEnergyStored(ForgeDirection.UNKNOWN); + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2){ + if(par1 == 0) this.enervator.storage.setEnergyStored(par2); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer player, int slot){ + final int inventoryStart = 2; + final int inventoryEnd = inventoryStart+26; + final int hotbarStart = inventoryEnd+1; + final int hotbarEnd = hotbarStart+8; + + Slot theSlot = (Slot)this.inventorySlots.get(slot); + if(theSlot.getHasStack()){ + ItemStack currentStack = theSlot.getStack(); + ItemStack newStack = currentStack.copy(); + + if(slot <= hotbarEnd && slot >= inventoryStart){ + if(currentStack.getItem() instanceof IEnergyContainerItem){ + this.mergeItemStack(newStack, 0, 1, false); + } + } + + if(slot <= hotbarEnd && slot >= hotbarStart){ + this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); + } + + else if(slot <= inventoryEnd && slot >= inventoryStart){ + this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); + } + + else if(slot < inventoryStart){ + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + } + + if(newStack.stackSize == 0) theSlot.putStack(null); + else theSlot.onSlotChanged(); + if(newStack.stackSize == currentStack.stackSize) return null; + theSlot.onPickupFromSlot(player, newStack); + + return currentStack; + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java index 9047d05d0..e81b1d0af 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java @@ -104,7 +104,7 @@ public class ContainerGrinder extends Container{ if(currentStack.getItem() != null){ if(slot <= hotbarEnd && slot >= inventoryStart){ - if(GrinderRecipes.instance().getOutput(currentStack, false) != null){ + if(GrinderRecipes.getOutput(currentStack, false) != null){ this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_1, TileEntityGrinder.SLOT_INPUT_1+1, false); if(this.isDouble) this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_2, TileEntityGrinder.SLOT_INPUT_2+1, false); } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java index ef5d7ad73..74204e0e7 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/GuiHandler.java @@ -54,6 +54,12 @@ public class GuiHandler implements IGuiHandler{ return new ContainerFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new ContainerCoffeeMachine(entityPlayer.inventory, tile); + case DRILL_ID: + return new ContainerDrill(entityPlayer.inventory); + case ENERGIZER_ID: + return new ContainerEnergizer(entityPlayer.inventory, tile); + case ENERVATOR_ID: + return new ContainerEnervator(entityPlayer.inventory, tile); default: return null; } @@ -102,6 +108,12 @@ public class GuiHandler implements IGuiHandler{ return new GuiFluidCollector(entityPlayer.inventory, tile); case COFFEE_MACHINE_ID: return new GuiCoffeeMachine(entityPlayer.inventory, tile, x, y, z, world); + case DRILL_ID: + return new GuiDrill(entityPlayer.inventory); + case ENERGIZER_ID: + return new GuiEnergizer(entityPlayer.inventory, tile); + case ENERVATOR_ID: + return new GuiEnervator(entityPlayer.inventory, tile); default: return null; } @@ -126,6 +138,8 @@ public class GuiHandler implements IGuiHandler{ public static final int FLUID_COLLECTOR_ID = 16; public static final int COFFEE_MACHINE_ID = 17; public static final int DRILL_ID = 18; + public static final int ENERGIZER_ID = 19; + public static final int ENERVATOR_ID = 20; public static void init(){ Util.logInfo("Initializing GuiHandler..."); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDrill.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDrill.java new file mode 100644 index 000000000..3c63f9f75 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiDrill.java @@ -0,0 +1,39 @@ +package ellpeck.actuallyadditions.inventory.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerDrill; +import ellpeck.actuallyadditions.util.AssetUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import org.lwjgl.opengl.GL11; + +@SideOnly(Side.CLIENT) +public class GuiDrill extends GuiContainer{ + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiDrill"); + + public GuiDrill(InventoryPlayer inventory){ + super(new ContainerDrill(inventory)); + this.xSize = 176; + this.ySize = 54+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, "container."+ModUtil.MOD_ID_LOWER+".drill"); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+54, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 54); + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnergizer.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnergizer.java new file mode 100644 index 000000000..19cc34336 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnergizer.java @@ -0,0 +1,60 @@ +package ellpeck.actuallyadditions.inventory.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerEnergizer; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityEnergizer; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiEnergizer extends GuiContainer{ + + private TileEntityEnergizer energizer; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiEnergizer"); + + public GuiEnergizer(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerEnergizer(inventory, tile)); + this.energizer = (TileEntityEnergizer)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.energizer.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.energizer.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.energizer.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+57, this.guiTop+89-i, 176, 0, 16, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + String text1 = this.energizer.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.energizer.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+57 && y >= guiTop+6 && x <= guiLeft+72 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnervator.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnervator.java new file mode 100644 index 000000000..215fe9909 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiEnervator.java @@ -0,0 +1,60 @@ +package ellpeck.actuallyadditions.inventory.gui; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.inventory.ContainerEnervator; +import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.tile.TileEntityEnervator; +import ellpeck.actuallyadditions.util.AssetUtil; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.util.ResourceLocation; +import net.minecraftforge.common.util.ForgeDirection; +import org.lwjgl.opengl.GL11; + +import java.util.Collections; + +@SideOnly(Side.CLIENT) +public class GuiEnervator extends GuiContainer{ + + private TileEntityEnervator enervator; + + private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiEnergizer"); + + public GuiEnervator(InventoryPlayer inventory, TileEntityBase tile){ + super(new ContainerEnervator(inventory, tile)); + this.enervator = (TileEntityEnervator)tile; + this.xSize = 176; + this.ySize = 93+86; + } + + @Override + public void drawGuiContainerForegroundLayer(int x, int y){ + AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.enervator.getInventoryName()); + } + + @Override + public void drawGuiContainerBackgroundLayer(float f, int x, int y){ + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + + this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93, 0, 0, 176, 86); + + this.mc.getTextureManager().bindTexture(resLoc); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93); + + if(this.enervator.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + int i = this.enervator.getEnergyScaled(83); + drawTexturedModalRect(this.guiLeft+57, this.guiTop+89-i, 176, 0, 16, i); + } + } + + @Override + public void drawScreen(int x, int y, float f){ + super.drawScreen(x, y, f); + String text1 = this.enervator.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.enervator.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; + if(x >= guiLeft+57 && y >= guiTop+6 && x <= guiLeft+72 && y <= guiTop+88){ + this.func_146283_a(Collections.singletonList(text1), x, y); + } + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotImmovable.java b/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotImmovable.java new file mode 100644 index 000000000..5a84544b4 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/inventory/slot/SlotImmovable.java @@ -0,0 +1,24 @@ +package ellpeck.actuallyadditions.inventory.slot; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class SlotImmovable extends Slot{ + + public SlotImmovable(IInventory inventory, int id, int x, int y){ + super(inventory, id, x, y); + } + + @Override + public boolean canTakeStack(EntityPlayer player){ + return false; + } + + @Override + public boolean isItemValid(ItemStack stack){ + return false; + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 1f48e906a..8340eb3c9 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -69,13 +69,38 @@ public class InitItems{ public static Item emeraldPaxel; public static Item obsidianPaxel; - //public static Item itemDrill; + public static Item itemDrill; + public static Item itemDrillUpgradeSpeed; + public static Item itemDrillUpgradeSpeedII; + public static Item itemDrillUpgradeSpeedIII; + public static Item itemDrillUpgradeSilkTouch; + public static Item itemDrillUpgradeFortune; + public static Item itemDrillUpgradeFortuneII; + public static Item itemDrillUpgradeThreeByThree; + public static Item itemDrillUpgradeFiveByFive; + public static Item itemDrillUpgradeBlockPlacing; + + public static Item itemBattery; public static void init(){ Util.logInfo("Initializing Items..."); - //itemDrill = new ItemDrill(); - //ItemUtil.register(itemDrill); + itemDrill = new ItemDrill(); + ItemUtil.register(itemDrill); + + itemBattery = new ItemBattery(); + ItemUtil.register(itemBattery); + + itemDrillUpgradeSpeed = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.SPEED, "itemDrillUpgradeSpeed"); + itemDrillUpgradeSpeedII = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.SPEED_II, "itemDrillUpgradeSpeedII"); + itemDrillUpgradeSpeedIII = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.SPEED_III, "itemDrillUpgradeSpeedIII"); + itemDrillUpgradeSilkTouch = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.SILK_TOUCH, "itemDrillUpgradeSilkTouch"); + itemDrillUpgradeFortune = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.FORTUNE, "itemDrillUpgradeFortune"); + itemDrillUpgradeFortuneII = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.FORTUNE_II, "itemDrillUpgradeFortuneII"); + itemDrillUpgradeThreeByThree = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.THREE_BY_THREE, "itemDrillUpgradeThreeByThree"); + itemDrillUpgradeFiveByFive = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE, "itemDrillUpgradeFiveByFive"); + itemDrillUpgradeBlockPlacing = new ItemDrillUpgrade(ItemDrillUpgrade.UpgradeType.PLACER, "itemDrillUpgradeBlockPlacing"); + ItemUtil.registerItems(new Item[]{itemDrillUpgradeSpeed, itemDrillUpgradeSpeedII, itemDrillUpgradeSpeedIII, itemDrillUpgradeSilkTouch, itemDrillUpgradeFortune, itemDrillUpgradeFortuneII, itemDrillUpgradeThreeByThree, itemDrillUpgradeFiveByFive, itemDrillUpgradeBlockPlacing}); itemBucketOil = new ItemBucketAA(InitBlocks.blockOil, "itemBucketOil"); ItemUtil.register(itemBucketOil); @@ -88,6 +113,9 @@ public class InitItems{ itemFertilizer = new ItemFertilizer(); ItemUtil.register(itemFertilizer); + itemCoffee = new ItemCoffee(); + ItemUtil.register(itemCoffee); + itemPhantomConnector = new ItemPhantomConnector(); ItemUtil.register(itemPhantomConnector); @@ -134,19 +162,19 @@ public class InitItems{ itemCoffeeBean = new ItemCoffeeBean(); ItemUtil.register(itemCoffeeBean); - itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, new ItemStack(itemFoods, 1, TheFoods.RICE.ordinal())); + itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, itemFoods, TheFoods.RICE.ordinal()); ItemUtil.register(itemRiceSeed); FactoryRegistry.sendMessage("registerPlantable", itemRiceSeed); - itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Plains, new ItemStack(itemMisc, 1, TheMiscItems.CANOLA.ordinal())); + itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Plains, itemMisc, TheMiscItems.CANOLA.ordinal()); ItemUtil.register(itemCanolaSeed); FactoryRegistry.sendMessage("registerPlantable", itemCanolaSeed); - itemFlaxSeed = new ItemSeed("itemFlaxSeed", InitBlocks.blockFlax, Blocks.grass, EnumPlantType.Plains, new ItemStack(Items.string)); + itemFlaxSeed = new ItemSeed("itemFlaxSeed", InitBlocks.blockFlax, Blocks.grass, EnumPlantType.Plains, Items.string, 0); ItemUtil.register(itemFlaxSeed); FactoryRegistry.sendMessage("registerPlantable", itemFlaxSeed); - itemCoffeeSeed = new ItemSeed("itemCoffeeSeed", InitBlocks.blockCoffee, Blocks.grass, EnumPlantType.Plains, new ItemStack(itemCoffeeBean)); + itemCoffeeSeed = new ItemSeed("itemCoffeeSeed", InitBlocks.blockCoffee, Blocks.grass, EnumPlantType.Plains, itemCoffeeBean, 0); ItemUtil.register(itemCoffeeSeed); FactoryRegistry.sendMessage("registerPlantable", itemCoffeeSeed); @@ -172,8 +200,5 @@ public class InitItems{ emeraldPaxel = new ItemAllToolAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "emeraldPaxel", EnumRarity.epic); obsidianPaxel = new ItemAllToolAA(InitItemMaterials.toolMaterialObsidian, new ItemStack(Blocks.obsidian), "obsidianPaxel", EnumRarity.epic); ItemUtil.registerItems(new Item[]{woodenPaxel, stonePaxel, ironPaxel, goldPaxel, diamondPaxel, emeraldPaxel, obsidianPaxel}); - - itemCoffee = new ItemCoffee(); - ItemUtil.register(itemCoffee); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemBattery.java b/src/main/java/ellpeck/actuallyadditions/items/ItemBattery.java new file mode 100644 index 000000000..80df95194 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemBattery.java @@ -0,0 +1,107 @@ +package ellpeck.actuallyadditions.items; + +import cofh.api.energy.ItemEnergyContainer; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; + +import java.util.List; + +public class ItemBattery extends ItemEnergyContainer implements INameableItem{ + + public ItemBattery(){ + super(1000000, 10000); + this.setMaxStackSize(1); + this.setHasSubtypes(true); + } + + @Override + public double getDurabilityForDisplay(ItemStack stack){ + double energyDif = getMaxEnergyStored(stack)-getEnergyStored(stack); + double maxAmount = getMaxEnergyStored(stack); + return energyDif/maxAmount; + } + + @Override + public boolean showDurabilityBar(ItemStack itemStack){ + return true; + } + + @Override + public void onCreated(ItemStack stack, World world, EntityPlayer player){ + this.setEnergy(stack, 0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.rare; + } + + @Override + public IIcon getIcon(ItemStack stack, int pass){ + return this.itemIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerIcons(IIconRegister iconReg){ + this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + public void setEnergy(ItemStack stack, int energy){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) compound = new NBTTagCompound(); + compound.setInteger("Energy", energy); + stack.setTagCompound(compound); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void getSubItems(Item item, CreativeTabs tabs, List list){ + ItemStack stackFull = new ItemStack(this); + this.setEnergy(stackFull, this.getMaxEnergyStored(stackFull)); + list.add(stackFull); + + ItemStack stackEmpty = new ItemStack(this); + this.setEnergy(stackEmpty, 0); + list.add(stackEmpty); + } + + @Override + public String getName(){ + return "itemBattery"; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + ItemUtil.addInformation(this, list, 1, ""); + if(KeyUtil.isShiftPressed()){ + list.add(this.getEnergyStored(stack) + "/" + this.getMaxEnergyStored(stack) + " RF"); + } + } + + @Override + public boolean getShareTag(){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index 1e7923346..e12140994 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -6,29 +6,34 @@ import com.google.common.collect.Sets; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; +import ellpeck.actuallyadditions.config.values.ConfigFloatValues; +import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.inventory.GuiHandler; import ellpeck.actuallyadditions.items.tools.ItemAllToolAA; -import ellpeck.actuallyadditions.util.*; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; +import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; -import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.entity.Entity; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.SharedMonsterAttributes; import net.minecraft.entity.ai.attributes.AttributeModifier; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import net.minecraft.util.ChatComponentText; import net.minecraft.util.IIcon; import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; +import org.apache.logging.log4j.Level; import java.util.ArrayList; import java.util.HashSet; @@ -45,15 +50,13 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } public ItemDrill(){ - super(500000); + super(500000, 5000); this.setMaxStackSize(1); this.setHasSubtypes(true); } - public static float defaultEfficiency = 8.0F; - public static int energyUsePerBlockOrHit = 100; - - public float efficiency = defaultEfficiency; + public static float defaultEfficiency = ConfigFloatValues.DRILL_DAMAGE.getValue(); + public static int energyUsePerBlockOrHit = ConfigIntValues.DRILL_ENERGY_USE.getValue(); @Override public double getDurabilityForDisplay(ItemStack stack){ @@ -62,6 +65,37 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ return energyDif/maxAmount; } + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int hitSide, float hitX, float hitY, float hitZ){ + ItemStack upgrade = this.getHasUpgradeAsStack(stack, ItemDrillUpgrade.UpgradeType.PLACER); + if(upgrade != null){ + int slot = ItemDrillUpgrade.getSlotToPlaceFrom(upgrade); + if(slot >= 0 && slot < InventoryPlayer.getHotbarSize() && slot != player.inventory.currentItem){ + ItemStack equip = player.inventory.getStackInSlot(slot); + if(equip != null){ + if(!world.isRemote){ + boolean placed = false; + try{ + placed = equip.tryPlaceItemIntoWorld(player, world, x, y, z, hitSide, hitX, hitY, hitZ); + } + catch(Exception e){ + player.addChatComponentMessage(new ChatComponentText("Ouch! That really hurt! You must have done something wrong, don't do that again please!")); + ModUtil.LOGGER.log(Level.ERROR, "Player "+player.getDisplayName()+" who should place a Block using a Drill at "+player.posX+", "+player.posY+", "+player.posZ+" in World "+world.provider.dimensionId+" threw an Exception! Don't let that happen again!"); + } + + if(placed){ + player.inventory.setInventorySlotContents(slot, equip.stackSize <= 0 ? null : equip.copy()); + player.inventoryContainer.detectAndSendChanges(); + return true; + } + } + else return true; + } + } + } + return false; + } + @Override public boolean showDurabilityBar(ItemStack itemStack){ return true; @@ -72,57 +106,44 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ this.setEnergy(stack, 0); } - @Override - public void onUpdate(ItemStack stack, World world, Entity entity, int par4, boolean par5){ - this.addEnchantFromUpgrade(Enchantment.silkTouch, ItemDrillUpgrade.UpgradeType.SILK_TOUCH, stack, 1); - this.addEnchantFromUpgrade(Enchantment.fortune, ItemDrillUpgrade.UpgradeType.FORTUNE, stack, this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1); - } - - public void addEnchantFromUpgrade(Enchantment enchantment, ItemDrillUpgrade.UpgradeType upgrade, ItemStack stack, int level){ - boolean hasEnchant = this.hasEnchantment(stack, enchantment) >= 0; - if(this.getHasUpgrade(stack, upgrade)){ - if(!hasEnchant){ - stack.addEnchantment(enchantment, level); + public float getEfficiencyFromUpgrade(ItemStack stack){ + float efficiency = defaultEfficiency; + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED)){ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED_II)){ + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED_III)) efficiency += 37.0F; + else efficiency += 28.0F; } + else efficiency += 15.0F; } - else if(hasEnchant) this.removeEnchantment(stack, enchantment); + return efficiency; } public int getEnergyUsePerBlock(ItemStack stack){ int use = energyUsePerBlockOrHit; - ItemDrillUpgrade.UpgradeType[] types = ItemDrillUpgrade.UpgradeType.values(); - for(ItemDrillUpgrade.UpgradeType type : types){ - if(this.getHasUpgrade(stack, type)){ - use += type.extraEnergy; + + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED)){ + use += ConfigIntValues.DRILL_SPEED_EXTRA_USE.getValue(); + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED_II)){ + use += ConfigIntValues.DRILL_SPEED_II_EXTRA_USE.getValue(); + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SPEED_III)) use += ConfigIntValues.DRILL_SPEED_III_EXTRA_USE.getValue(); } } + + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)) use += ConfigIntValues.DRILL_SILK_EXTRA_USE.getValue(); + + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE)){ + use += ConfigIntValues.DRILL_FORTUNE_EXTRA_USE.getValue(); + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II)) use += ConfigIntValues.DRILL_FORTUNE_II_EXTRA_USE.getValue(); + } + + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ + use += ConfigIntValues.DRILL_THREE_BY_THREE_EXTRA_USE.getValue(); + if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)) use += ConfigIntValues.DRILL_FIVE_BY_FIVE_EXTRA_USE.getValue(); + } + return use; } - public void removeEnchantment(ItemStack stack, Enchantment ench){ - NBTTagList list = stack.getEnchantmentTagList(); - if(list != null){ - int hasEnchantment = this.hasEnchantment(stack, ench); - if(hasEnchantment >= 0){ - list.removeTag(hasEnchantment); - } - } - } - - public int hasEnchantment(ItemStack stack, Enchantment ench){ - NBTTagList list = stack.getEnchantmentTagList(); - if(list != null){ - for(int i = 0; i < list.tagCount(); i++){ - NBTTagCompound compound = list.getCompoundTagAt(i); - short id = compound.getShort("id"); - if(id == ench.effectId){ - return i; - } - } - } - return -1; - } - @Override @SideOnly(Side.CLIENT) public boolean hasEffect(ItemStack stack, int pass){ @@ -135,21 +156,22 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } public boolean getHasUpgrade(ItemStack stack, ItemDrillUpgrade.UpgradeType upgrade){ - if(upgrade == ItemDrillUpgrade.UpgradeType.THREE_BY_THREE) return true; - if(upgrade == ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE) return true; + return this.getHasUpgradeAsStack(stack, upgrade) != null; + } + public ItemStack getHasUpgradeAsStack(ItemStack stack, ItemDrillUpgrade.UpgradeType upgrade){ NBTTagCompound compound = stack.getTagCompound(); - if(compound == null) return false; + if(compound == null) return null; ItemStack[] slots = this.getSlotsFromNBT(stack); if(slots != null && slots.length > 0){ for(ItemStack slotStack : slots){ if(slotStack != null && slotStack.getItem() instanceof ItemDrillUpgrade){ - if(((ItemDrillUpgrade)slotStack.getItem()).type == upgrade) return true; + if(((ItemDrillUpgrade)slotStack.getItem()).type == upgrade) return slotStack; } } } - return false; + return null; } @Override @@ -222,12 +244,12 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ return slots; } - public void breakBlocks(ItemStack stack, int radius, World world, int x, int y, int z, Entity entity){ + public void breakBlocks(ItemStack stack, int radius, World world, int x, int y, int z, EntityPlayer player){ int xRange = radius; int yRange = radius; int zRange = 0; - MovingObjectPosition pos = WorldUtil.raytraceBlocksFromEntity(world, entity, 4.5D); + MovingObjectPosition pos = this.getMovingObjectPositionFromPlayer(world, player, false); if(pos != null){ int side = pos.sideHit; if(side == 0 || side == 1){ @@ -246,24 +268,29 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(this.getEnergyStored(stack) >= use){ Block block = world.getBlock(xPos, yPos, zPos); float hardness = block.getBlockHardness(world, xPos, yPos, zPos); - if(!(xPos == x && yPos == y && zPos == z) && hardness > -1.0F && this.canHarvestBlock(block, stack)){ + if(hardness > -1.0F && this.canHarvestBlock(block, stack)){ this.extractEnergy(stack, use, false); ArrayList drops = new ArrayList(); int meta = world.getBlockMetadata(xPos, yPos, zPos); - if(block.canSilkHarvest(world, (EntityPlayer)entity, xPos, yPos, zPos, meta) && EnchantmentHelper.getSilkTouchModifier((EntityPlayer)entity)){ + if(block.canSilkHarvest(world, player, xPos, yPos, zPos, meta) && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)){ drops.add(new ItemStack(block, 1, meta)); } else{ - drops.addAll(block.getDrops(world, xPos, yPos, zPos, meta, EnchantmentHelper.getFortuneModifier((EntityPlayer)entity))); - block.dropXpOnBlockBreak(world, x, y, z, block.getExpDrop(world, meta, EnchantmentHelper.getFortuneModifier((EntityPlayer)entity))); + int fortune = this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE) ? (this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1) : 0; + drops.addAll(block.getDrops(world, xPos, yPos, zPos, meta, fortune)); + block.dropXpOnBlockBreak(world, x, y, z, block.getExpDrop(world, meta, fortune)); } - world.playAuxSFX(2001, xPos, yPos, zPos, Block.getIdFromBlock(block)+(meta << 12)); + if(!(x == xPos && y == yPos && z == zPos)){ + world.playAuxSFX(2001, xPos, yPos, zPos, Block.getIdFromBlock(block)+(meta << 12)); + } world.setBlockToAir(xPos, yPos, zPos); for(ItemStack theDrop : drops){ - world.spawnEntityInWorld(new EntityItem(world, xPos+0.5, yPos+0.5, zPos+0.5, theDrop)); + EntityItem item = new EntityItem(world, xPos+0.5, yPos+0.5, zPos+0.5, theDrop); + item.delayBeforeCanPickup = 10; + world.spawnEntityInWorld(item); } } } @@ -286,17 +313,18 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public boolean onBlockDestroyed(ItemStack stack, World world, Block block, int x, int y, int z, EntityLivingBase living){ - int use = this.getEnergyUsePerBlock(stack); - if(this.getEnergyStored(stack) >= use){ - this.extractEnergy(stack, use, false); - if(!world.isRemote){ - if(!living.isSneaking()){ - if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ + if(living instanceof EntityPlayer){ + EntityPlayer player = (EntityPlayer)living; + int use = this.getEnergyUsePerBlock(stack); + if(this.getEnergyStored(stack) >= use){ + if(!world.isRemote){ + if(!living.isSneaking() && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)){ - this.breakBlocks(stack, 2, world, x, y, z, living); + this.breakBlocks(stack, 2, world, x, y, z, player); } - else this.breakBlocks(stack, 1, world, x, y, z, living); + else this.breakBlocks(stack, 1, world, x, y, z, player); } + else this.breakBlocks(stack, 0, world, x, y, z, player); } } } @@ -306,7 +334,7 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public float func_150893_a(ItemStack stack, Block block){ if(this.getEnergyStored(stack) < this.getEnergyUsePerBlock(stack)) return 0.0F; - if(block.getMaterial() == Material.iron || block.getMaterial() == Material.anvil || block.getMaterial() == Material.rock || allSet.contains(block)) return efficiency; + if(block.getMaterial() == Material.iron || block.getMaterial() == Material.anvil || block.getMaterial() == Material.rock || allSet.contains(block)) return this.getEfficiencyFromUpgrade(stack); else return super.func_150893_a(stack, block); } @@ -326,7 +354,9 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ - if(!world.isRemote && player.isSneaking()) player.openGui(ActuallyAdditions.instance, GuiHandler.DRILL_ID, world, (int)player.posX, (int)player.posY, (int)player.posZ); + if(!world.isRemote && player.isSneaking()){ + player.openGui(ActuallyAdditions.instance, GuiHandler.DRILL_ID, world, (int)player.posX, (int)player.posY, (int)player.posZ); + } return stack; } @@ -350,11 +380,11 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override @SideOnly(Side.CLIENT) - public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + ItemUtil.addInformation(this, list, 3, ""); if(KeyUtil.isShiftPressed()){ list.add(this.getEnergyStored(stack) + "/" + this.getMaxEnergyStored(stack) + " RF"); } - else list.add(ItemUtil.shiftForInfo()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java index 9d355c990..c73f60e41 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrillUpgrade.java @@ -3,31 +3,32 @@ package ellpeck.actuallyadditions.items; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ItemUtil; +import ellpeck.actuallyadditions.util.KeyUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.IIcon; +import net.minecraft.util.StatCollector; +import net.minecraft.world.World; + +import java.util.List; public class ItemDrillUpgrade extends Item implements INameableItem{ public enum UpgradeType{ - SPEED(10), - SPEED_II(20), - SPEED_III(30), - SILK_TOUCH(20), //Done - FORTUNE(40), //Done - FORTUNE_II(60), //Done - THREE_BY_THREE(5), //Done - FIVE_BY_FIVE(5), //Done - VEIN(30), - PLACER(0); - - public int extraEnergy; - - UpgradeType(int extraEnergy){ - this.extraEnergy = extraEnergy; - } + SPEED, + SPEED_II, + SPEED_III, + SILK_TOUCH, + FORTUNE, + FORTUNE_II, + THREE_BY_THREE, + FIVE_BY_FIVE, + PLACER } public UpgradeType type; @@ -36,6 +37,32 @@ public class ItemDrillUpgrade extends Item implements INameableItem{ public ItemDrillUpgrade(UpgradeType type, String unlocName){ this.type = type; this.unlocalizedName = unlocName; + this.setMaxStackSize(1); + } + + @Override + public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ + if(!world.isRemote && this.type == UpgradeType.PLACER){ + this.setSlotToPlaceFrom(stack, player.inventory.currentItem); + } + return stack; + } + + public void setSlotToPlaceFrom(ItemStack stack, int slot){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound == null) compound = new NBTTagCompound(); + + compound.setInteger("SlotToPlaceFrom", slot+1); + + stack.setTagCompound(compound); + } + + public static int getSlotToPlaceFrom(ItemStack stack){ + NBTTagCompound compound = stack.getTagCompound(); + if(compound != null){ + return compound.getInteger("SlotToPlaceFrom")-1; + } + return -1; } @Override @@ -58,4 +85,20 @@ public class ItemDrillUpgrade extends Item implements INameableItem{ public String getOredictName(){ return this.getName(); } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld){ + ItemUtil.addInformation(this, list, this.type == UpgradeType.PLACER ? 3 : 1, ""); + if(KeyUtil.isShiftPressed()){ + list.add(StatCollector.translateToLocal("tooltip."+ModUtil.MOD_ID_LOWER+".itemDrillUpgrade.desc")); + if(this.type == UpgradeType.PLACER){ + int slot = getSlotToPlaceFrom(stack); + if(slot >= 0){ + list.add(StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.slot")+": "+(slot+1)); + } + } + } + } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java index 79e956b5a..b1f1eff50 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemResonantRice.java @@ -36,7 +36,7 @@ public class ItemResonantRice extends Item implements INameableItem{ @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { ItemUtil.addInformation(this, list, 1, ""); - if(KeyUtil.isShiftPressed() && OreDictionary.getOres("nuggetEnderium").size() == 0) list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemResonantRice.uncraftable.desc")); + if(KeyUtil.isShiftPressed() && OreDictionary.getOres("nuggetEnderium", false).size() <= 0) list.add(StringUtil.RED + StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".itemResonantRice.uncraftable.desc")); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java index 7f5d1c7d6..fa2b6d5cf 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -34,7 +34,7 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta public EnumPlantType type; public String name; - public ItemSeed(String name, Block plant, Block soilBlock, EnumPlantType type, ItemStack returnItem){ + public ItemSeed(String name, Block plant, Block soilBlock, EnumPlantType type, Item returnItem, int returnMeta){ super(plant, soilBlock); this.name = name; this.plant = plant; @@ -42,6 +42,7 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta this.type = type; ((BlockPlant)this.plant).seedItem = this; ((BlockPlant)this.plant).returnItem = returnItem; + ((BlockPlant)this.plant).returnMeta = returnMeta; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java index a5818d41e..fd8484ff7 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java +++ b/src/main/java/ellpeck/actuallyadditions/items/tools/ItemAllToolAA.java @@ -21,6 +21,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.UseHoeEvent; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -130,4 +131,13 @@ public class ItemAllToolAA extends ItemTool implements INameableItem{ public String getOredictName(){ return oredictName; } + + @Override + public Set getToolClasses(ItemStack stack){ + HashSet hashSet = new HashSet(); + hashSet.add("pickaxe"); + hashSet.add("axe"); + hashSet.add("shovel"); + return hashSet; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java index 9680388bd..b8c70d382 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java @@ -84,7 +84,7 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public void loadCraftingRecipes(String outputId, Object... results){ if(outputId.equals(NAME) && getClass() == CrusherRecipeHandler.class){ - ArrayList recipes = GrinderRecipes.instance().recipes; + ArrayList recipes = GrinderRecipes.recipes; for(GrinderRecipes.GrinderRecipe recipe : recipes){ arecipes.add(new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance)); } @@ -94,7 +94,7 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public void loadCraftingRecipes(ItemStack result){ - ArrayList recipes = GrinderRecipes.instance().recipes; + ArrayList recipes = GrinderRecipes.recipes; for(GrinderRecipes.GrinderRecipe recipe : recipes){ if(NEIServerUtils.areStacksSameType(recipe.firstOutput, result) || NEIServerUtils.areStacksSameType(recipe.secondOutput, result)) arecipes.add(new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance)); } @@ -102,7 +102,7 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public void loadUsageRecipes(ItemStack ingredient){ - ArrayList recipes = GrinderRecipes.instance().recipes; + ArrayList recipes = GrinderRecipes.recipes; for(GrinderRecipes.GrinderRecipe recipe : recipes){ if(NEIServerUtils.areStacksSameTypeCrafting(recipe.input, ingredient)){ CachedCrush theRecipe = new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance); diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java index a83769942..f61a6e74f 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java @@ -10,14 +10,8 @@ import java.util.ArrayList; public class GrinderRecipeRegistry{ - private static final GrinderRecipeRegistry instance = new GrinderRecipeRegistry(); - - public static GrinderRecipeRegistry instance(){ - return instance; - } - - public ArrayList searchCases = new ArrayList(); - public ArrayList exceptions = new ArrayList(); + public static ArrayList searchCases = new ArrayList(); + public static ArrayList exceptions = new ArrayList(); public static class SearchCase{ @@ -30,11 +24,11 @@ public class GrinderRecipeRegistry{ } } - public void registerFinally(){ + public static void registerFinally(){ String[] names = OreDictionary.getOreNames(); for(String inputName : names){ - if(!this.exceptions.contains(inputName)){ + if(!exceptions.contains(inputName)){ int resultAmount = 1; String inputNameWithoutPrefix = null; @@ -49,8 +43,8 @@ public class GrinderRecipeRegistry{ if(inputNameWithoutPrefix != null){ String inputWithDustPrefix = "dust" + inputNameWithoutPrefix; - ArrayList allOresOfInitialInputName = OreDictionary.getOres(inputName); - ArrayList allOresWithDustPrefix = OreDictionary.getOres(inputWithDustPrefix); + ArrayList allOresOfInitialInputName = (ArrayList)OreDictionary.getOres(inputName, false); + ArrayList allOresWithDustPrefix = (ArrayList)OreDictionary.getOres(inputWithDustPrefix, false); if(allOresOfInitialInputName != null && allOresOfInitialInputName.size() > 0){ if(allOresWithDustPrefix != null && allOresWithDustPrefix.size() > 0){ for(ItemStack theInput : allOresOfInitialInputName){ @@ -58,8 +52,8 @@ public class GrinderRecipeRegistry{ ItemStack input = theInput.copy(); ItemStack output = theDust.copy(); output.stackSize = resultAmount; - if(!GrinderRecipes.instance().hasRecipe(input, output)){ - GrinderRecipes.instance().registerRecipe(input, output, null, 0); + if(!GrinderRecipes.hasRecipe(input, output)){ + GrinderRecipes.registerRecipe(input, output, null, 0); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java index da55d9e4e..89131880d 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java @@ -7,22 +7,16 @@ import java.util.ArrayList; public class GrinderRecipes{ - private static final GrinderRecipes instance = new GrinderRecipes(); + public static ArrayList recipes = new ArrayList(); - public ArrayList recipes = new ArrayList(); - - public static GrinderRecipes instance(){ - return instance; + public static void registerRecipe(ItemStack input, ItemStack outputOne, ItemStack outputTwo, int secondChance){ + recipes.add(new GrinderRecipe(input, outputOne, outputTwo, secondChance)); } - public void registerRecipe(ItemStack input, ItemStack outputOne, ItemStack outputTwo, int secondChance){ - this.recipes.add(new GrinderRecipe(input, outputOne, outputTwo, secondChance)); - } - - public void registerRecipe(String input, String outputOne, String outputTwo, int secondChance, int outputAmount){ - ArrayList inputStacks = OreDictionary.getOres(input); - ArrayList outputOneStacks = OreDictionary.getOres(outputOne); - ArrayList outputTwoStacks = OreDictionary.getOres(outputTwo); + public static void registerRecipe(String input, String outputOne, String outputTwo, int secondChance, int outputAmount){ + ArrayList inputStacks = (ArrayList)OreDictionary.getOres(input, false); + ArrayList outputOneStacks = (ArrayList)OreDictionary.getOres(outputOne, false); + ArrayList outputTwoStacks = (ArrayList)OreDictionary.getOres(outputTwo, false); if(inputStacks != null && !inputStacks.isEmpty()){ for(ItemStack anInput : inputStacks){ @@ -34,21 +28,21 @@ public class GrinderRecipes{ if(outputTwoStacks != null && !outputTwoStacks.isEmpty()){ for(ItemStack anOutputTwo : outputTwoStacks){ ItemStack theOutputTwo = anOutputTwo.copy(); - this.registerRecipe(theInput, theOutputOne, theOutputTwo, secondChance); + registerRecipe(theInput, theOutputOne, theOutputTwo, secondChance); } } - else this.registerRecipe(theInput, theOutputOne, null, 0); + else registerRecipe(theInput, theOutputOne, null, 0); } } } } } - public void registerRecipe(ItemStack input, ItemStack outputOne){ - this.registerRecipe(input, outputOne, null, 0); + public static void registerRecipe(ItemStack input, ItemStack outputOne){ + registerRecipe(input, outputOne, null, 0); } - public ItemStack getOutput(ItemStack input, boolean wantSecond){ + public static ItemStack getOutput(ItemStack input, boolean wantSecond){ for(GrinderRecipe recipe : recipes){ if(recipe.input.isItemEqual(input)){ return wantSecond ? recipe.secondOutput : recipe.firstOutput; @@ -57,14 +51,14 @@ public class GrinderRecipes{ return null; } - public boolean hasRecipe(ItemStack input, ItemStack outputOne){ + public static boolean hasRecipe(ItemStack input, ItemStack outputOne){ for(GrinderRecipe recipe : recipes){ if(recipe.input.isItemEqual(input) && recipe.firstOutput.isItemEqual(outputOne)) return true; } return false; } - public int getSecondChance(ItemStack input){ + public static int getSecondChance(ItemStack input){ for(GrinderRecipe recipe : recipes){ if(recipe.input.isItemEqual(input)){ return recipe.secondChance; @@ -73,7 +67,7 @@ public class GrinderRecipes{ return 0; } - public class GrinderRecipe{ + public static class GrinderRecipe{ public final ItemStack input; public final ItemStack firstOutput; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java index 870ab38ea..b6bf4319e 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBase.java @@ -57,6 +57,8 @@ public class TileEntityBase extends TileEntity{ GameRegistry.registerTileEntity(TileEntityLavaFactoryController.class, ModUtil.MOD_ID_LOWER + ":tileEntityLavaFactoryController"); GameRegistry.registerTileEntity(TileEntityCoffeeMachine.class, ModUtil.MOD_ID_LOWER + ":tileEntityCoffeeMachine"); GameRegistry.registerTileEntity(TileEntityPhantomBooster.class, ModUtil.MOD_ID_LOWER + ":tileEntityPhantomBooster"); + GameRegistry.registerTileEntity(TileEntityEnergizer.class, ModUtil.MOD_ID_LOWER + ":tileEntityEnergizer"); + GameRegistry.registerTileEntity(TileEntityEnervator.class, ModUtil.MOD_ID_LOWER + ":tileEntityEnervator"); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java index 8f0d2c28a..4a799dce7 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityBreaker.java @@ -63,7 +63,7 @@ public class TileEntityBreaker extends TileEntityInventoryBase{ else if(this.isPlacer && worldObj.getBlock(coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ).isReplaceable(worldObj, coordsBlock.posX, coordsBlock.posY, coordsBlock.posZ)){ int theSlot = testInventory(this.slots); this.setInventorySlotContents(theSlot, WorldUtil.placeBlockAtSide(sideToManipulate, worldObj, xCoord, yCoord, zCoord, this.slots[theSlot])); - if(this.slots[0] != null && this.slots[0].stackSize <= 0) this.slots[0] = null; + if(this.slots[theSlot] != null && this.slots[theSlot].stackSize <= 0) this.slots[theSlot] = null; } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java index 03f242f1e..cad145cc6 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoalGenerator.java @@ -28,6 +28,7 @@ public class TileEntityCoalGenerator extends TileEntityInventoryBase implements @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + boolean flag = this.currentBurnTime > 0; if(this.currentBurnTime > 0){ this.currentBurnTime--; @@ -52,6 +53,15 @@ public class TileEntityCoalGenerator extends TileEntityInventoryBase implements WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); } + + if(flag != this.currentBurnTime > 0){ + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + if(meta == 1){ + if(!(this.currentBurnTime <= 0 && this.slots[0] != null && TileEntityFurnace.getItemBurnTime(this.slots[0]) > 0 && energyProducedPerTick*TileEntityFurnace.getItemBurnTime(this.slots[0]) <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN))) + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); + } + else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java new file mode 100644 index 000000000..4103c6008 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java @@ -0,0 +1,82 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyContainerItem; +import cofh.api.energy.IEnergyReceiver; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityEnergizer extends TileEntityInventoryBase implements IEnergyReceiver{ + + public EnergyStorage storage = new EnergyStorage(500000); + + public TileEntityEnergizer(){ + super(2, "energizer"); + } + + @Override + public void updateEntity(){ + if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ + if(this.storage.getEnergyStored() > 0){ + int received = ((IEnergyContainerItem)this.slots[0].getItem()).receiveEnergy(this.slots[0], this.storage.getEnergyStored(), false); + this.storage.extractEnergy(received, false); + } + + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) >= ((IEnergyContainerItem)this.slots[0].getItem()).getMaxEnergyStored(this.slots[0])){ + this.slots[1] = this.slots[0].copy(); + this.slots[0].stackSize--; + if(this.slots[0].stackSize <= 0) this.slots[0] = null; + } + } + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + this.storage.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.storage.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return slot == 0 && stack.getItem() instanceof IEnergyContainerItem; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == 1; + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @Override + public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ + return this.storage.receiveEnergy(maxReceive, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java new file mode 100644 index 000000000..936635337 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java @@ -0,0 +1,92 @@ +package ellpeck.actuallyadditions.tile; + +import cofh.api.energy.EnergyStorage; +import cofh.api.energy.IEnergyContainerItem; +import cofh.api.energy.IEnergyProvider; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.WorldUtil; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.ForgeDirection; + +public class TileEntityEnervator extends TileEntityInventoryBase implements IEnergyProvider{ + + public EnergyStorage storage = new EnergyStorage(500000); + + public TileEntityEnervator(){ + super(2, "enervator"); + } + + @Override + public void updateEntity(){ + if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) > 0){ + int toReceive = ((IEnergyContainerItem)this.slots[0].getItem()).extractEnergy(this.slots[0], this.storage.getMaxEnergyStored()-this.storage.getEnergyStored(), false); + this.storage.receiveEnergy(toReceive, false); + } + + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) <= 0){ + this.slots[1] = this.slots[0].copy(); + this.slots[0].stackSize--; + if(this.slots[0].stackSize <= 0) this.slots[0] = null; + } + } + + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); + } + } + + @Override + public void writeToNBT(NBTTagCompound compound){ + this.storage.writeToNBT(compound); + super.writeToNBT(compound); + } + + @Override + public void readFromNBT(NBTTagCompound compound){ + this.storage.readFromNBT(compound); + super.readFromNBT(compound); + } + + @Override + public int extractEnergy(ForgeDirection from, int maxExtract, boolean simulate){ + return this.storage.extractEnergy(maxExtract, simulate); + } + + @Override + public int getEnergyStored(ForgeDirection from){ + return this.storage.getEnergyStored(); + } + + @Override + public int getMaxEnergyStored(ForgeDirection from){ + return this.storage.getMaxEnergyStored(); + } + + @Override + public boolean canConnectEnergy(ForgeDirection from){ + return true; + } + + @SideOnly(Side.CLIENT) + public int getEnergyScaled(int i){ + return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); + } + + @Override + public boolean canInsertItem(int slot, ItemStack stack, int side){ + return slot == 0 && stack.getItem() instanceof IEnergyContainerItem; + } + + @Override + public boolean canExtractItem(int slot, ItemStack stack, int side){ + return slot == 1; + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java index 5cc3552f9..ccfc31aa1 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityFurnaceDouble.java @@ -19,9 +19,9 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements public EnergyStorage storage = new EnergyStorage(30000); - public static int energyUsePerTick = ConfigIntValues.FURNACE_ENERGY_USED.getValue(); + public int energyUsePerTick = ConfigIntValues.FURNACE_ENERGY_USED.getValue(); - public int maxBurnTime = this.getStandardSpeed(); + public int maxBurnTime = ConfigIntValues.FURNACE_DOUBLE_SMELT_TIME.getValue(); public int firstSmeltTime; public int secondSmeltTime; @@ -34,6 +34,7 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + boolean flag = this.firstSmeltTime > 0 || this.secondSmeltTime > 0; boolean canSmeltOnFirst = this.canSmeltOn(SLOT_INPUT_1, SLOT_OUTPUT_1); boolean canSmeltOnSecond = this.canSmeltOn(SLOT_INPUT_2, SLOT_OUTPUT_2); @@ -62,6 +63,14 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements else this.secondSmeltTime = 0; if(this.storage.getEnergyStored() >= energyUsePerTick && this.firstSmeltTime > 0 || this.secondSmeltTime > 0) this.storage.extractEnergy(energyUsePerTick, false); + + if(flag != (this.firstSmeltTime > 0 || this.secondSmeltTime > 0)){ + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + if(meta > 3){ + if(!this.canSmeltOn(SLOT_INPUT_1, SLOT_OUTPUT_1) && !this.canSmeltOn(SLOT_INPUT_2, SLOT_OUTPUT_2)) worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta-4, 2); + } + else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, meta+4, 2); + } } } @@ -135,10 +144,6 @@ public class TileEntityFurnaceDouble extends TileEntityInventoryBase implements return slot == SLOT_OUTPUT_1 || slot == SLOT_OUTPUT_2; } - public int getStandardSpeed(){ - return ConfigIntValues.FURNACE_DOUBLE_SMELT_TIME.getValue(); - } - @Override public int receiveEnergy(ForgeDirection from, int maxReceive, boolean simulate){ return this.storage.receiveEnergy(maxReceive, simulate); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index f6ec5bc46..8eb4df417 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -41,7 +41,7 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg public TileEntityGrinderDouble(){ super(6, "grinderDouble"); this.isDouble = true; - this.maxCrushTime = this.getStandardSpeed(); + this.maxCrushTime = ConfigIntValues.GRINDER_DOUBLE_CRUSH_TIME.getValue(); energyUsePerTick = ConfigIntValues.GRINDER_DOUBLE_ENERGY_USED.getValue(); } @@ -54,7 +54,7 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg public static final int SLOT_OUTPUT_2_1 = 4; public static final int SLOT_OUTPUT_2_2 = 5; - public static int energyUsePerTick; + public int energyUsePerTick; public int maxCrushTime; @@ -70,7 +70,7 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg public TileEntityGrinder(){ super(3, "grinder"); this.isDouble = false; - this.maxCrushTime = this.getStandardSpeed(); + this.maxCrushTime = ConfigIntValues.GRINDER_CRUSH_TIME.getValue(); energyUsePerTick = ConfigIntValues.GRINDER_ENERGY_USED.getValue(); } @@ -78,6 +78,8 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + boolean flag = this.firstCrushTime > 0 || this.secondCrushTime > 0; + boolean canCrushOnFirst = this.canCrushOn(SLOT_INPUT_1, SLOT_OUTPUT_1_1, SLOT_OUTPUT_1_2); boolean canCrushOnSecond = false; if(this.isDouble) canCrushOnSecond = this.canCrushOn(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2); @@ -107,13 +109,21 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg } if(this.storage.getEnergyStored() >= energyUsePerTick && this.firstCrushTime > 0 || this.secondCrushTime > 0) this.storage.extractEnergy(energyUsePerTick, false); + + if(flag != (this.firstCrushTime > 0 || this.secondCrushTime > 0)){ + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + if(meta == 1){ + if(!this.canCrushOn(SLOT_INPUT_1, SLOT_OUTPUT_1_1, SLOT_OUTPUT_1_2) && (!this.isDouble || !this.canCrushOn(SLOT_INPUT_2, SLOT_OUTPUT_2_1, SLOT_OUTPUT_2_2))) worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); + } + else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + } } } public boolean canCrushOn(int theInput, int theFirstOutput, int theSecondOutput){ if(this.slots[theInput] != null){ - ItemStack outputOne = GrinderRecipes.instance().getOutput(this.slots[theInput], false); - ItemStack outputTwo = GrinderRecipes.instance().getOutput(this.slots[theInput], true); + ItemStack outputOne = GrinderRecipes.getOutput(this.slots[theInput], false); + ItemStack outputTwo = GrinderRecipes.getOutput(this.slots[theInput], true); if(this.slots[theInput] != null){ if(outputOne != null){ if((this.slots[theFirstOutput] == null || (this.slots[theFirstOutput].isItemEqual(outputOne) && this.slots[theFirstOutput].stackSize <= this.slots[theFirstOutput].getMaxStackSize()-outputOne.stackSize)) && (outputTwo == null || (this.slots[theSecondOutput] == null || (this.slots[theSecondOutput].isItemEqual(outputTwo) && this.slots[theSecondOutput].stackSize <= this.slots[theSecondOutput].getMaxStackSize()-outputTwo.stackSize)))){ @@ -126,12 +136,14 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg } public void finishCrushing(int theInput, int theFirstOutput, int theSecondOutput){ - ItemStack outputOnFirst = GrinderRecipes.instance().getOutput(this.slots[theInput], false); - if (this.slots[theFirstOutput] == null) this.slots[theFirstOutput] = outputOnFirst.copy(); - else if(this.slots[theFirstOutput].getItem() == outputOnFirst.getItem()) this.slots[theFirstOutput].stackSize += outputOnFirst.stackSize; + ItemStack outputOnFirst = GrinderRecipes.getOutput(this.slots[theInput], false); + if(outputOnFirst != null){ + if(this.slots[theFirstOutput] == null) this.slots[theFirstOutput] = outputOnFirst.copy(); + else if(this.slots[theFirstOutput].getItem() == outputOnFirst.getItem()) this.slots[theFirstOutput].stackSize += outputOnFirst.stackSize; + } - int chance = GrinderRecipes.instance().getSecondChance(this.slots[theInput]); - ItemStack outputOnSecond = GrinderRecipes.instance().getOutput(this.slots[theInput], true); + int chance = GrinderRecipes.getSecondChance(this.slots[theInput]); + ItemStack outputOnSecond = GrinderRecipes.getOutput(this.slots[theInput], true); if(outputOnSecond != null){ int rand = new Random().nextInt(100) + 1; if(rand <= chance){ @@ -177,7 +189,7 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipes.instance().getOutput(stack, false) != null; + return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipes.getOutput(stack, false) != null; } @Override @@ -189,8 +201,4 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg public boolean canExtractItem(int slot, ItemStack stack, int side){ return slot == SLOT_OUTPUT_1_1 || slot == SLOT_OUTPUT_1_2 || slot == SLOT_OUTPUT_2_1 || slot == SLOT_OUTPUT_2_2; } - - public int getStandardSpeed(){ - return this.isDouble ? ConfigIntValues.GRINDER_DOUBLE_CRUSH_TIME.getValue() : ConfigIntValues.GRINDER_CRUSH_TIME.getValue(); - } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java index 4daeb5946..78e01fa16 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityOilGenerator.java @@ -34,6 +34,7 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I @SuppressWarnings("unchecked") public void updateEntity(){ if(!worldObj.isRemote){ + boolean flag = this.currentBurnTime > 0; if(this.currentBurnTime > 0){ this.currentBurnTime--; @@ -64,6 +65,15 @@ public class TileEntityOilGenerator extends TileEntityInventoryBase implements I WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); } + + if(flag != this.currentBurnTime > 0){ + int meta = worldObj.getBlockMetadata(xCoord, yCoord, zCoord); + if(meta == 1){ + if(!(energyProducedPerTick*this.maxBurnTime <= this.getMaxEnergyStored(ForgeDirection.UNKNOWN)-this.getEnergyStored(ForgeDirection.UNKNOWN) && FluidContainerRegistry.BUCKET_VOLUME <= this.tank.getCapacity()-this.tank.getFluidAmount())) + worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 0, 2); + } + else worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 1, 2); + } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java index 3f826e385..4a02b47f9 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityPhantomPlacer.java @@ -77,7 +77,7 @@ public class TileEntityPhantomPlacer extends TileEntityInventoryBase{ if(boundWorld.getBlock(boundPosition.posX, boundPosition.posY, boundPosition.posZ).isReplaceable(boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ)){ int theSlot = TileEntityBreaker.testInventory(this.slots); this.setInventorySlotContents(theSlot, WorldUtil.placeBlockAtSide(ForgeDirection.UNKNOWN, boundWorld, boundPosition.posX, boundPosition.posY, boundPosition.posZ, this.slots[theSlot])); - if(this.slots[0] != null && this.slots[0].stackSize <= 0) this.slots[0] = null; + if(this.slots[theSlot] != null && this.slots[theSlot].stackSize <= 0) this.slots[theSlot] = null; } } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 4f213e233..2bfa54782 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.5.7"; + public static final String VERSION = "1.7.10-0.0.6.0"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 5da1c84d1..97924e489 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -3,17 +3,11 @@ package ellpeck.actuallyadditions.util; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import net.minecraft.block.Block; -import net.minecraft.entity.Entity; import net.minecraft.entity.item.EntityItem; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.ChunkCoordinates; -import net.minecraft.util.MathHelper; -import net.minecraft.util.MovingObjectPosition; -import net.minecraft.util.Vec3; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; @@ -28,26 +22,6 @@ public class WorldUtil{ return new ChunkCoordinates(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } - public static MovingObjectPosition raytraceBlocksFromEntity(World world, Entity player, double range){ - float f1 = player.prevRotationPitch+(player.rotationPitch-player.prevRotationPitch)*1.0F; - float f2 = player.prevRotationYaw+(player.rotationYaw-player.prevRotationYaw)*1.0F; - double d0 = player.prevPosX+(player.posX-player.prevPosX)*1.0D; - double d1 = player.prevPosY+(player.posY-player.prevPosY)*1.0D; - if(!world.isRemote && player instanceof EntityPlayer) d1 += 1.62D; - double d2 = player.prevPosZ+(player.posZ-player.prevPosZ)*1.0D; - Vec3 vec3 = Vec3.createVectorHelper(d0, d1, d2); - float f3 = MathHelper.cos(-f2*0.017453292F-(float)Math.PI); - float f4 = MathHelper.sin(-f2*0.017453292F-(float)Math.PI); - float f5 = -MathHelper.cos(-f1*0.017453292F); - float f6 = MathHelper.sin(-f1*0.017453292F); - float f7 = f4*f5; - float f8 = f3*f5; - double d3 = range; - if(player instanceof EntityPlayerMP) d3 = ((EntityPlayerMP)player).theItemInWorldManager.getBlockReachDistance(); - Vec3 vec31 = vec3.addVector((double)f7*d3, (double)f6*d3, (double)f8*d3); - return world.func_147447_a(vec3, vec31, false, true, false); - } - public static void breakBlockAtSide(ForgeDirection side, World world, int x, int y, int z){ if(side == ForgeDirection.UNKNOWN){ world.setBlockToAir(x, y, z); @@ -65,7 +39,6 @@ public class WorldUtil{ if(((IEnergyReceiver)tile).canConnectEnergy(side.getOpposite())){ int receive = ((IEnergyReceiver)tile).receiveEnergy(side.getOpposite(), Math.min(storage.getMaxExtract(), storage.getEnergyStored()), false); storage.extractEnergy(receive, false); - world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } } } @@ -76,7 +49,6 @@ public class WorldUtil{ if(((IFluidHandler)tile).canFill(side.getOpposite(), tank.getFluid().getFluid())){ int receive = ((IFluidHandler)tile).fill(side.getOpposite(), tank.getFluid(), true); tank.drain(receive, true); - world.markBlockForUpdate(x+side.offsetX, y+side.offsetY, z+side.offsetZ); } } } diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 308f4baf9..45416c690 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -19,10 +19,22 @@ tile.actuallyadditions.blockFurnaceSolar.name=Solar Panel tile.actuallyadditions.blockHeatCollector.name=Heat Collector tile.actuallyadditions.blockItemRepairer.name=Item Repairer +item.actuallyadditions.itemDrill.name=Drill +tooltip.actuallyadditions.itemDrill.desc.1=Mines all the Blocks! +tooltip.actuallyadditions.itemDrill.desc.2=Powered by RF! Charge in an Energizer! Discharge in an Enervator! +tooltip.actuallyadditions.itemDrill.desc.3=Drill Upgrades can be applied through Sneak-Right-Clicking! + tile.actuallyadditions.blockMiscWoodCasing.name=Wood Casing tile.actuallyadditions.blockMiscStoneCasing.name=Stone Casing tile.actuallyadditions.blockGreenhouseGlass.name=Greenhouse Glass +tile.actuallyadditions.blockEnergizer.name=Energizer +tooltip.actuallyadditions.blockEnergizer.desc.1=A "Charger", if you will +tooltip.actuallyadditions.blockEnergizer.desc.2=Charges Items that can hold RF +tile.actuallyadditions.blockEnervator.name=Enervator +tooltip.actuallyadditions.blockEnervator.desc.1=A "Discharger", if you will +tooltip.actuallyadditions.blockEnervator.desc.2=Discharges Items that can hold RF + tile.actuallyadditions.blockRice.name=Rice Plant tooltip.actuallyadditions.blockRice.desc=It's growing... kind of.. item.actuallyadditions.itemFoodRice.name=Rice @@ -43,6 +55,9 @@ tooltip.actuallyadditions.blockMiscCharcoal.desc=Crafted from Charcoal item.actuallyadditions.itemMiscRiceSlime.name=Rice Slimeball tooltip.actuallyadditions.itemMiscRiceSlime.desc=It's sticky... and smells kinda good... +item.actuallyadditions.itemBattery.name=Battery +tooltip.actuallyadditions.itemBattery.desc=Stores RF! Charge in an Energizer! Discharge in an Enervator! + tile.actuallyadditions.blockCoalGenerator.name=Coal Generator tooltip.actuallyadditions.blockCoalGenerator.desc=Produces Energy from Coal and other flammable Materials @@ -85,13 +100,13 @@ tile.actuallyadditions.blockFluidPlacer.name=Fluid Placer tooltip.actuallyadditions.blockFluidPlacer.desc=Places Fluids stored inside it tooltip.actuallyadditions.paxel.desc=It's an Axe, Shovel, Sword, Hoe and Pickaxe! Combined! -item.actuallyadditions.woodenPaxel.name=Wooden Paxel -item.actuallyadditions.stonePaxel.name=Stone Paxel -item.actuallyadditions.ironPaxel.name=Iron Paxel -item.actuallyadditions.goldPaxel.name=Golden Paxel -item.actuallyadditions.diamondPaxel.name=Diamond Paxel -item.actuallyadditions.emeraldPaxel.name=Emerald Paxel -item.actuallyadditions.obsidianPaxel.name=Obsidian Paxel +item.actuallyadditions.woodenPaxel.name=Wooden Paxelordoe +item.actuallyadditions.stonePaxel.name=Stone Paxelordoe +item.actuallyadditions.ironPaxel.name=Iron Paxelordoe +item.actuallyadditions.goldPaxel.name=Golden Paxelordoe +item.actuallyadditions.diamondPaxel.name=Diamond Paxelordoe +item.actuallyadditions.emeraldPaxel.name=Emerald Paxelordoe +item.actuallyadditions.obsidianPaxel.name=Obsidian Paxelordoe tile.actuallyadditions.blockFluidCollector.name=Fluid Collector tooltip.actuallyadditions.blockFluidCollector.desc=Stores Fluids in front of it inside it @@ -169,6 +184,29 @@ tile.actuallyadditions.blockInputter.add.13.name=Efficient Sucking Dilettant tile.actuallyadditions.blockInputter.add.14.name=Extreme Sand Digger tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO +item.actuallyadditions.itemDrillUpgradeSpeed.name=Drill Speed I Augment +item.actuallyadditions.itemDrillUpgradeSpeedII.name=Drill Speed II Augment +item.actuallyadditions.itemDrillUpgradeSpeedIII.name=Drill Speed III Augment +item.actuallyadditions.itemDrillUpgradeSilkTouch.name=Drill Silk Touch Augment +item.actuallyadditions.itemDrillUpgradeFortune.name=Drill Fortune I Augment +item.actuallyadditions.itemDrillUpgradeFortuneII.name=Drill Fortune II Augment +item.actuallyadditions.itemDrillUpgradeBlockPlacing.name=Drill Block Placing Augment +item.actuallyadditions.itemDrillUpgradeThreeByThree.name=Drill Three By Three Mining Augment +item.actuallyadditions.itemDrillUpgradeFiveByFive.name=Drill Five By Five Mining Augment + +tooltip.actuallyadditions.itemDrillUpgradeSpeed.desc=Makes the Drill faster! +tooltip.actuallyadditions.itemDrillUpgradeSpeedII.desc=Makes the Drill even faster! Requires Tier 1. +tooltip.actuallyadditions.itemDrillUpgradeSpeedIII.desc=Insta-Mine! Requires Tier 1 and 2. +tooltip.actuallyadditions.itemDrillUpgradeSilkTouch.desc=Makes the Drill silky. +tooltip.actuallyadditions.itemDrillUpgradeFortune.desc=Gives the Drill Fortune I. +tooltip.actuallyadditions.itemDrillUpgradeFortuneII.desc=Gives the Drill Fortune III! Requires Tier 1. +tooltip.actuallyadditions.itemDrillUpgradeBlockPlacing.desc.1=Places Blocks from your Hotbar when Right-Clicking with the Drill! +tooltip.actuallyadditions.itemDrillUpgradeBlockPlacing.desc.2=You can define the Slot on your Hotbar to place from! +tooltip.actuallyadditions.itemDrillUpgradeBlockPlacing.desc.3=Sneak-Right-Click this Upgrade in the desired Slot to store it! +tooltip.actuallyadditions.itemDrillUpgradeThreeByThree.desc=Lets you mine a 3x3 Area! +tooltip.actuallyadditions.itemDrillUpgradeFiveByFive.desc=Lets you mine a 5x5 Area! Requires the 3x3 Upgrade. +tooltip.actuallyadditions.itemDrillUpgrade.desc=Sneak-Right-Click the Drill to apply Upgrades! + tile.actuallyadditions.blockMiscEnderCasing.name=Ender Casing tooltip.actuallyadditions.blockMiscEnderCasing.desc=Extremely sturdy casing, used for crafting @@ -450,6 +488,9 @@ container.actuallyadditions.energyface.name=Energyface container.actuallyadditions.fluidPlacer.name=Fluid Placer container.actuallyadditions.fluidCollector.name=Fluid Collector container.actuallyadditions.coffeeMachine.name=Coffee Machine +container.actuallyadditions.drill.name=Drill +container.actuallyadditions.energizer.name=Energizer +container.actuallyadditions.enervator.name=Enervator container.nei.actuallyadditions.crushing.name=Crusher container.nei.actuallyadditions.ballOfHair.name=Ball Of Hair Usage diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGeneratorTop.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockCoalGeneratorTop.png index deef7462dd24f68b26551a8296fc3b9d06eb9a27..85181259b5d1592dc692a8441a111fbf2976de4c 100644 GIT binary patch delta 410 zcmV;L0cHNC1pNb$NgcZY01mqW$N1DX00007bV*G`2j2q*7A!WSR{*1tQzw60Nklqj$;J!3-o`Y&QG-zN#wq9}K(*fR&EyFbs)cBIbNP z7e!$j7z4OougXJ*+A&}bASoqDf*PfxLtvp4kdlhj^E{2}MyV`IYZ&rfmxU5To}?q> z!LVMhrL=oEoldZ0{M1GVvVtJco!Aa-+hWk75sd~u)#3eqTLTY<%jI&SO;eT!=&Z!2 zX{uIq=%Br`Cqa1{HBlBA^2bx+YPzng>za`;oQK1q@B7#5 zh4g;E%Rsta641>X`v8%eOqu_`RqPbzRP4VEkh!k=3)SG9bNxXv`2YX_07*qoM6N<$ Ef-)h*aR2}S delta 452 zcmV;#0XzQv1EvI!NeaUN01m?e$8V@)k!B}&Qo2k<$-~N|pU;e_*Xtp+EGwJM%A4p6 zr_%`ro#4tI8NJTu^TlF8s&>1Lg%h_1LX^l7aTAM1^@s67+?BV00006VoOIv0RI600RN!9r<0LBAAbcB4kjiB z0YB{k00nYML_t(Y$L*F&Y#Y}VhQE7SO+Mt5EIu?Wyz76uGtk+jS1iXv%ZHUZk8Y2p;#Btc>&X^ZrcNQxzz)KDZv4oOij zlQVN~7nBqWt(_D>yC`}#bAN%EbM86!-1E&Z(&@AY$Ye5Pvsolv6YMv=^HjHd3n0?z zw4R!pqEWXA1Ok*-Ru~9{sFX^WrVqz)F-;#MsWDv7V{?0(dcDCwILzGK95R#1P+BQ6 zl1Q+%zD|23B1I5?A{V4Ch{U#gh>-6>Y(P%a~l}_V$9SlBP z5mu~aT*u+v+1c(p0e_T=MFM^ksTBqqADTC^zvR&${{#SuW;*j-u4bP_3W;g@&D!6_tYgG$Xvih;2}^#qJW9XN%U?PMpI*G z1c}iUS6;k~hs52v)Q*r`%|6R?<~t}UIT}ykGfn(~o^A#TSSgnoj>YJ>9z(GNo;2{J z0e~kYo-}yng@4No$CF6YN-ISG zlB1(^92bq?%MU)t%}$3>xy;!3#HSl3c541t!z4cII7>dG{bzVkuT_z^@IdYGz{>wK z4`eo*MJYwmvS`+A3^cV$8Ld2g+N1wKFR9~qQL&a$u75*5mm?AmGdw)pJ+oVRpd5#i zRiM{2iI1i*wBk@Cf>s`e@+f~24_0<~u-T~5tdtl#emB8jh_z}N1I0jSfVyqpo(Jcq z9|EOVTPcHswO|MXYr>FM70 z)uP2;-+#Hr()kH)F5wYnwj@?d*&gK|EH*Xhu*YkR#8Mh;{6{S1wy=snnn zR%*{@F9QRO@?7GhV>Bx(Y}6_|{JrnfvTMBY(u+irDMCkvKuT`R&mm2dO0AB#C!N+4 zW1}=}o2G5k>o?hK)Hs&D2cg03bZ|YF!u16_x_^^76i;yC)L)E3`V1@wbt;E zga(Ibwbodg|A2w$FbBhj|2-ZEDXH5wo{(7i8*Dqy|9S9V=Yde(J{~N7T74jP^g+Py z=S2DxRV&X%YmEcJ5GY0SPWoV%2Zr)kuU0^HHNx1jxj(Ht{BeEeg5&}uSq`U@ET07%K7X0I_6Pk#J+-<|FB{a*sr zO?~nGKXUika{!E=x|jEU`Xp_w@q`3n?0@+f!_nvy0n;QD3}UZVC@##=EEgF+buS0| zgM9SociG(9COR>RK+>q&98DwgTqJh2%IjBNMhfxCJed32U&viw=+-MG{T@e# f@TBp-%7cFZFRjy<@G-dK00000NkvXXu0mjfq#x6D delta 434 zcmV;j0Zsnp3%>)97k>~40ssI2kdbIM00001b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^ z1poj532;bRa{vGiy8r+Vy8*}e)HVPB00(qQO+^Ra0|pl$Fy}*ntpET37<5HgbW?9; zba!ELWdLwtX>N2bZe?^JG%heMHD!e|WdHyH9Z5t%R5(v{l7BIagFq04@BajZbT&2t zu@#RfiXei8f}q4E*a>zv0gL;)_nEh>UN|2ZW@o-PyG-WGd260$1!uCrW@y_s%d)a8 zgCIzf#Pht{?WW(Vs>qY{eLs%l&44wEqUZB@zuztTeYq6ZD}gdaQ2>Nt2)x}ul;^q7 zx~{vfgHF>_v43pKvNTO&p7eM;ls$4b&{eeS``#F+k)kFE{cr-fu4@cxK-TK@7J;?t z!Mj0^kwAamk_Vb9W7rM2H5O`WZw;nLno20CodoWFU8GbZ8()Nlj2>E@cM*00N6iL_t(I%Vm9+M{JwjC=NxhE`c+-*?IV{jP%4$k=L+O=Ir=yE z!14V<030aiI5IK_ zfQkyFsq6q$Ba3bk^F0Ml-+sWvg;P{2zX{?9EE7Le)Rt>4!vfXFb}S@`1tI_qCvMCz zdFc!}*I}U=puW|xGd6FlJ~~oly0U<7YC0AS&|sJbFQ%s$8!iJdJ~F_uecJ#S+f!op z$@6v}($wex)<>Bn2^-HFUp z8OOW5TW4a3p5UkW9 lw2WEx6e?9{okH5&-9LlJ1vQuQY0m%v002ovPDHLkV1mZ-S5N=| diff --git a/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGeneratorTop.png b/src/main/resources/assets/actuallyadditions/textures/blocks/blockOilGeneratorTop.png index 5d560937edc6f61776aee0b067d9da5bf378e7ac..85181259b5d1592dc692a8441a111fbf2976de4c 100644 GIT binary patch delta 424 zcmV;Z0ayN+1pNb$Bnkm@Qb$4nuFf3kks%u$y8r+Vy8*}e)HVPB00(qQO+^Ra0|pi> zHltSnqmf1@e_KgJK~y+TO_Du}gFqOBZLYMixXLoWBTZVXASprwArLSYNgzeUA|Vho zLGc8Or18Jr*2*5LnMBs?cvTU_l zZMWMWgFMf7yWMiRd^{ev+bxb`1o8|9d{Gn~kH^pFe>0!Y7mEesIN5AA`~AMED)k=> zya<4mj_fcDiC`k;d_EUNVHy|%xL&WyLxskuaQx!=dl{*XxD!e!t5=x?K{`%^Ujwk(x}I|G!o26y{XyzYUPNuKNqs;GA>) SK{5FN0000&Y4#EKyC`y2lW+#7_NklJN(F*wVgWkSG&`Nn z`W zfa!EfhVghjnM@EDi^U%WBCFL3i)OP48)iy|K%ofw{XR8t7X(4K+udw7mjx*E1S*A zo9GOu(+LKh;L08uz0T+J#bQCKcDs#*7Vtwb7z~&_C=?0^XjG2OfMO6J6Kh=(v*()e zaV=E5SvgYD@pu$LoI!f$;thI$YTGs)lTExp?Ejt;-j~aTDY0TEvgh;3+d-9V&~Pu; xB>{PPC66IN*(4+XU#mouP*c(0Hh^Xr#xIqC+`uAT;?@8F002ovPDHLkV1lv5*5m*H diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiManual.png deleted file mode 100644 index 8e9d776c0ba9c59522eeef67676f2ce455799ff5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1859 zcmeAS@N?(olHy`uVBq!ia0y~yU<5K58911MRQ8&P5Fo{p?&#~tz_78O`%fY(0|PTd zfKP}kP~62^QA&dRf`N&DBm;)v@9e6; zXy+{Oh%9Dc;M)YkjE1Im+kt`-C9V-A!TD(=<%vb93~dIox?sjWt- z3=B*wJzX3_D&pSWxS03IK*TkW?biSQPkcDqZy&3aj0`S#yfr>4GH|Yr!>V_wk$RuE zt;ydXWA{Aw_m9o>94EnZ{7UAFxpRY2h$GI+HY^) z{J)_8BMDTjLBI*+a0Z5yKt_fMuB;DS7`7j8coAJ|z5l!Pg=@Bgr*`MRWh^?sv7E0j z?x(QDoxgA9#*4soHtf4@`;Os8F5?N!e!g;h<_XgG1c7p94dFg5ZEPoUo~@oggCq6( z1p$W2X<6ImJKTRQSI+Qe8^e<+?(MthGoIjm&vAg8vG2dB&1v5EFQzg$v%yUM(A9Zi z!d3GHZ`swHoS&(~gc&BduVY|1v51L5p__}LL1)!{?gXVPX-ZeNGc!1ZMKctgI)LG? zxzYz*R-AQNksT|nbJH4 z;e}?x3-`$~Fl@TTG$EJ`s1^zw`^HIJdGYEa#DdsbFZZDPm=C z5WBjQ(Wm8>Ps^_|pf9qx9sDFM;7S-OpMbqo%shi*>r9TXZy6XSTor4WV^n}p^67*q z(1jt-*$f1;j0IoaW@J!Ut;=AU`T(Ki$wY0S3s;=uB_d!R?DuW?77f%skKr;~LQ%tO z*@T^U)?ePnq%(a@dd}ZJ(?b*PU7H@yxQx$X-DNg~>zT|GUTbP0l+XkKv#%gT diff --git a/update/changelog.txt b/update/changelog.txt index bc3039296..e4b0687d2 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Fixed a Bug caused by fixing the last Bug... Whoops... \ No newline at end of file +Drills, Drill Upgrades, Energizer, Enervator, Batteries \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index f5e6e48fe..4846cf078 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.5.7 \ No newline at end of file +1.7.10-0.0.6.0 \ No newline at end of file From 7e4ca127933dc591b0d54542287f816e9794150e Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Mon, 22 Jun 2015 18:09:00 +0200 Subject: [PATCH 23/29] -Update 0.0.6.0 --- README.md | 4 +-- .../ellpeck/actuallyadditions/PLANNED.txt | 4 +++ .../actuallyadditions/blocks/BlockPlant.java | 2 +- .../actuallyadditions/blocks/InitBlocks.java | 2 +- .../crafting/ItemCrafting.java | 4 +-- .../inventory/ContainerEnergizer.java | 4 +-- .../actuallyadditions/items/ItemDrill.java | 24 ++++++------- .../tile/TileEntityEnergizer.java | 20 ++++++----- .../tile/TileEntityEnervator.java | 36 ++++++++++--------- 9 files changed, 52 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 36056bc70..4d7b16a71 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ What that means? I can decide what I want to do with the License myself. ### YOU MAY - Fork and modify the Code - Submit Pull Requests -- Copy Parts of the Code for other Projects +- Copy (SMALL!) Parts of the Code for other Projects - Make a Review/Spotlight of the Mod or use it in a Modpack - Make Let's Play (and similar) Videos containing my Mod @@ -20,7 +20,7 @@ What that means? I can decide what I want to do with the License myself. ### YOU CAN NOT - Copy the entire Code or claim it is yours. - Reupload the Code or Mod to another website or claim you made it. - +- Copy entire Classes, Methods or other big Parts of Code. ### YOU HAVE TO - Always credit me. Don't be a jerk and copy entire portions of the code and claim they're yours. diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index b3e7fb03f..2e145b832 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -109,3 +109,7 @@ -Dog Bones -Breed Dogs faster -Makes them have Babies too + +-Testificate Bucks + -Village House that has a Coffee Machine + -Villager who sells Coffee and Cookies diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index a0acb372e..e04e805df 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -49,7 +49,7 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar @Override public int quantityDropped(int meta, int fortune, Random random){ - return random.nextInt(addDropAmount)+minDropAmount; + return meta >= 7 ? super.quantityDropped(meta, fortune, random) : random.nextInt(addDropAmount)+minDropAmount; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 713d56dc8..821a6a463 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -219,7 +219,7 @@ public class InitBlocks{ } else{ errorAlreadyRegistered("Oil Fluid"); - } + } fluidOil = FluidRegistry.getFluid(oil); if(fluidOil.getBlock() == null || ConfigBoolValues.PREVENT_OIL_BLOCK_OVERRIDE.isEnabled()){ diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java index b09a62682..076feb3d5 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/ItemCrafting.java @@ -242,10 +242,10 @@ public class ItemCrafting{ //Crafter on a Stick if(ConfigCrafting.STICK_CRAFTER.isEnabled()) - GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemCrafterOnAStick), + GameRegistry.addRecipe(new ShapelessOreRecipe(new ItemStack(InitItems.itemCrafterOnAStick), new ItemStack(Blocks.crafting_table), new ItemStack(Items.sign), - new ItemStack(Items.slime_ball)); + "slimeball")); //Tiny Coal GameRegistry.addShapelessRecipe(new ItemStack(InitItems.itemMisc, 8, TheMiscItems.TINY_COAL.ordinal()), diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java index c050deaea..fd54376ef 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerEnergizer.java @@ -88,13 +88,11 @@ public class ContainerEnergizer extends Container{ if(slot <= hotbarEnd && slot >= hotbarStart){ this.mergeItemStack(newStack, inventoryStart, inventoryEnd+1, false); } - else if(slot <= inventoryEnd && slot >= inventoryStart){ this.mergeItemStack(newStack, hotbarStart, hotbarEnd+1, false); } - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); + this.mergeItemStack(newStack, inventoryStart, hotbarEnd+1, false); } if(newStack.stackSize == 0) theSlot.putStack(null); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index e12140994..1298809c3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -70,24 +70,22 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ ItemStack upgrade = this.getHasUpgradeAsStack(stack, ItemDrillUpgrade.UpgradeType.PLACER); if(upgrade != null){ int slot = ItemDrillUpgrade.getSlotToPlaceFrom(upgrade); - if(slot >= 0 && slot < InventoryPlayer.getHotbarSize() && slot != player.inventory.currentItem){ - ItemStack equip = player.inventory.getStackInSlot(slot); - if(equip != null){ + if(slot >= 0 && slot < InventoryPlayer.getHotbarSize()){ + ItemStack anEquip =player.inventory.getStackInSlot(slot); + if(anEquip != null && anEquip != stack){ + ItemStack equip = anEquip.copy(); if(!world.isRemote){ - boolean placed = false; try{ - placed = equip.tryPlaceItemIntoWorld(player, world, x, y, z, hitSide, hitX, hitY, hitZ); + if(equip.tryPlaceItemIntoWorld(player, world, x, y, z, hitSide, hitX, hitY, hitZ)){ + if(!player.capabilities.isCreativeMode) player.inventory.setInventorySlotContents(slot, equip.stackSize <= 0 ? null : equip.copy()); + player.inventoryContainer.detectAndSendChanges(); + return true; + } } catch(Exception e){ player.addChatComponentMessage(new ChatComponentText("Ouch! That really hurt! You must have done something wrong, don't do that again please!")); ModUtil.LOGGER.log(Level.ERROR, "Player "+player.getDisplayName()+" who should place a Block using a Drill at "+player.posX+", "+player.posY+", "+player.posZ+" in World "+world.provider.dimensionId+" threw an Exception! Don't let that happen again!"); } - - if(placed){ - player.inventory.setInventorySlotContents(slot, equip.stackSize <= 0 ? null : equip.copy()); - player.inventoryContainer.detectAndSendChanges(); - return true; - } } else return true; } @@ -320,7 +318,7 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(!world.isRemote){ if(!living.isSneaking() && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)){ - this.breakBlocks(stack, 2, world, x, y, z, player); + this.breakBlocks(stack, 30, world, x, y, z, player); } else this.breakBlocks(stack, 1, world, x, y, z, player); } @@ -354,7 +352,7 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ @Override public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ - if(!world.isRemote && player.isSneaking()){ + if(!world.isRemote && player.isSneaking() && stack == player.getCurrentEquippedItem()){ player.openGui(ActuallyAdditions.instance, GuiHandler.DRILL_ID, world, (int)player.posX, (int)player.posY, (int)player.posZ); } return stack; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java index 4103c6008..62f7d0f1d 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnergizer.java @@ -19,16 +19,18 @@ public class TileEntityEnergizer extends TileEntityInventoryBase implements IEne @Override public void updateEntity(){ - if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ - if(this.storage.getEnergyStored() > 0){ - int received = ((IEnergyContainerItem)this.slots[0].getItem()).receiveEnergy(this.slots[0], this.storage.getEnergyStored(), false); - this.storage.extractEnergy(received, false); - } + if(!worldObj.isRemote){ + if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ + if(this.storage.getEnergyStored() > 0){ + int received = ((IEnergyContainerItem)this.slots[0].getItem()).receiveEnergy(this.slots[0], this.storage.getEnergyStored(), false); + this.storage.extractEnergy(received, false); + } - if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) >= ((IEnergyContainerItem)this.slots[0].getItem()).getMaxEnergyStored(this.slots[0])){ - this.slots[1] = this.slots[0].copy(); - this.slots[0].stackSize--; - if(this.slots[0].stackSize <= 0) this.slots[0] = null; + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) >= ((IEnergyContainerItem)this.slots[0].getItem()).getMaxEnergyStored(this.slots[0])){ + this.slots[1] = this.slots[0].copy(); + this.slots[0].stackSize--; + if(this.slots[0].stackSize <= 0) this.slots[0] = null; + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java index 936635337..a26b71c78 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityEnervator.java @@ -20,27 +20,29 @@ public class TileEntityEnervator extends TileEntityInventoryBase implements IEne @Override public void updateEntity(){ - if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ - if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) > 0){ - int toReceive = ((IEnergyContainerItem)this.slots[0].getItem()).extractEnergy(this.slots[0], this.storage.getMaxEnergyStored()-this.storage.getEnergyStored(), false); - this.storage.receiveEnergy(toReceive, false); + if(!worldObj.isRemote){ + if(this.slots[0] != null && this.slots[0].getItem() instanceof IEnergyContainerItem && this.slots[1] == null){ + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) > 0){ + int toReceive = ((IEnergyContainerItem)this.slots[0].getItem()).extractEnergy(this.slots[0], this.storage.getMaxEnergyStored()-this.storage.getEnergyStored(), false); + this.storage.receiveEnergy(toReceive, false); + } + + if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) <= 0){ + this.slots[1] = this.slots[0].copy(); + this.slots[0].stackSize--; + if(this.slots[0].stackSize <= 0) this.slots[0] = null; + } } - if(((IEnergyContainerItem)this.slots[0].getItem()).getEnergyStored(this.slots[0]) <= 0){ - this.slots[1] = this.slots[0].copy(); - this.slots[0].stackSize--; - if(this.slots[0].stackSize <= 0) this.slots[0] = null; + if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); + WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); } } - - if(this.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.UP, storage); - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.DOWN, storage); - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.NORTH, storage); - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.EAST, storage); - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.SOUTH, storage); - WorldUtil.pushEnergy(worldObj, xCoord, yCoord, zCoord, ForgeDirection.WEST, storage); - } } @Override From 9b6d68e02d0e3145d15e548a4ef4744b98df1206 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 26 Jun 2015 15:57:35 +0200 Subject: [PATCH 24/29] -Update 0.0.6.0 --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4d7b16a71..062e40bf6 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,7 @@ It's a Minecraft Mod! For more information, visit the main Minecraft Forum Thread at http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/2374910-actually-additions-a-bunch-of-awesome-gadgets - -### LICENSE: +##### LICENSE: All Rights Reserved What that means? I can decide what I want to do with the License myself. @@ -29,5 +28,4 @@ What that means? I can decide what I want to do with the License myself. ### NOTES - The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected. -- Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. - +- Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. \ No newline at end of file From 3bada06e797c7b315cf18469129eb3b6ca9ec8a3 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 26 Jun 2015 16:00:48 +0200 Subject: [PATCH 25/29] -License Format Changes --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 062e40bf6..140421383 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,12 @@ It's a Minecraft Mod! For more information, visit the main Minecraft Forum Thread at http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/2374910-actually-additions-a-bunch-of-awesome-gadgets -##### LICENSE: -All Rights Reserved +LICENSE: +======== -What that means? I can decide what I want to do with the License myself. +##### All Rights Reserved + +What that means? The License can be customized by me: ### YOU MAY - Fork and modify the Code From 63dbb5a0476a59064e5c9c6bac58e2e1ed5c7b01 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 26 Jun 2015 18:58:12 +0200 Subject: [PATCH 26/29] -More Infos --- InterModCommsInfo.md | 31 +++++++++++++++++++++++++++++++ README.md | 7 +++++-- 2 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 InterModCommsInfo.md diff --git a/InterModCommsInfo.md b/InterModCommsInfo.md new file mode 100644 index 000000000..35b55309d --- /dev/null +++ b/InterModCommsInfo.md @@ -0,0 +1,31 @@ +Adding Custom Recipes (For Modders only!): +===== + +Actually Additions adds an InterModCommunications Feature that allows you to add custom Crafting Recipes using Items from your Mods. + +To use these Features, just send an InterModComms Message in your preInit or init like this: +FMLInterModComms.sendMessage("ActuallyAdditions", [X], [Y]); +The two Brackets will have to get replaced with one of the parts of Information below. + +##### Crusher Recipes +- Create an NBTTagCompound +- To the Compound, add an NBTTagCompound with the name "input" that contains the Input ItemStack saved to NBT (To do this, just use ItemStack.saveToNBT) +- To the Compound, add an NBTTagCompound with the name "outputOne" that contains the first Output saved to NBT +- To the Compound, add an NBTTagCompound with the name "outputTwo" that contains the second Output saved to NBT +- To the Compound, add an int with the name "secondChance" that contains the Chance for the second Output to appear +- Send the Message with "registerCrusherRecipe" as the [X] Argument, the Compound as the [Y] Argument. + +##### Coffee Machine Recipes +- Create an NBTTagCompound +- To the Compound, add an NBTTagCompound with the name "input" that contains the Input ItemStack saved to NBT (To do this, just use ItemStack.saveToNBT) +- To the Compound, add an int with the name "id" that contains the ID of the Effect the Coffee should have (Look up the Effects in Minecraft's Potion Class!) +- To the Compound, add an int with the name "duration" that contains the Duration the Effect should have +- To the Compound, add an int with the name "amplifier" that contains the Amplifier the Effect should have (Remember: 0 = Level 1!) +- To the Compound, add an int with the name "maxAmp" that contains the maximal Amplifier the Effect can have +- Send the Message with "registerCoffeeMachineRecipe" as the [X] Argument, the Compound as the [Y] Argument. + +##### Ball of Hair Recipes +- Create an NBTTagCompound +- To the Compound, add an NBTTagCompound with the name "output" that contains the Input ItemStack saved to NBT (To do this, just use ItemStack.saveToNBT) +- To the Compound, add an int with the name "chance" that contains the Chance of the Item appearing +- Send the Message with "registerBallOfHairRecipe" as the [X] Argument, the Compound as the [Y] Argument. diff --git a/README.md b/README.md index 140421383..96205611e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,9 @@ -It's a Minecraft Mod! +##It's a Minecraft Mod! For more information, visit the main Minecraft Forum Thread at http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/2374910-actually-additions-a-bunch-of-awesome-gadgets +###If you want to see Information on how you can use my Mod and its InterModComms Feature in your own Mod, see the InterModCommsInfo.md File! + LICENSE: ======== @@ -30,4 +32,5 @@ What that means? The License can be customized by me: ### NOTES - The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected. -- Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. \ No newline at end of file +- Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. + From 48cb15d2e94f7f0594ff7fd6b0a69cacb6b54674 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Fri, 26 Jun 2015 18:58:54 +0200 Subject: [PATCH 27/29] -Fixed more stuff --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 96205611e..3790246ae 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ For more information, visit the main Minecraft Forum Thread at http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/2374910-actually-additions-a-bunch-of-awesome-gadgets -###If you want to see Information on how you can use my Mod and its InterModComms Feature in your own Mod, see the InterModCommsInfo.md File! +If you want to see Information on how you can use my Mod and its InterModComms Feature in your own Mod, see the InterModCommsInfo.md File! LICENSE: From 9607128e15bf83a9aab9bd47b85bf761a5df8941 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Sun, 28 Jun 2015 03:12:32 +0200 Subject: [PATCH 28/29] -Update 0.0.6.1 --- README.md | 2 +- build.gradle | 2 +- .../actuallyadditions/ActuallyAdditions.java | 8 + .../ellpeck/actuallyadditions/PLANNED.txt | 4 + .../blocks/BlockContainerBase.java | 40 ++-- .../blocks/BlockGeneric.java | 85 ++++++++ .../blocks/BlockInputter.java | 2 +- .../actuallyadditions/blocks/BlockMisc.java | 2 +- .../actuallyadditions/blocks/BlockPlant.java | 73 +------ .../actuallyadditions/blocks/BlockSlabs.java | 129 +++++++++++ .../actuallyadditions/blocks/BlockStair.java | 69 ++++++ .../blocks/BlockWildPlant.java | 118 ++++++++++ .../actuallyadditions/blocks/InitBlocks.java | 42 +++- .../blocks/metalists/TheWildPlants.java | 36 ++++ .../communication/InterModCommunications.java | 70 ++++++ .../config/values/ConfigIntValues.java | 3 +- .../crafting/GrinderCrafting.java | 42 ++-- .../creative/CreativeTab.java | 15 +- .../event/WorldDecorationEvent.java | 31 +-- .../actuallyadditions/gen/InitVillager.java | 37 ++-- .../gen/VillageComponentJamHouse.java | 12 +- .../inventory/ContainerCoffeeMachine.java | 16 +- .../inventory/ContainerGrinder.java | 4 +- .../inventory/ContainerInputter.java | 88 ++++---- .../inventory/gui/GuiCoffeeMachine.java | 15 +- .../inventory/gui/GuiFeeder.java | 2 +- .../inventory/gui/GuiInputter.java | 202 +++++++++++++----- .../actuallyadditions/items/InitItems.java | 21 +- .../actuallyadditions/items/ItemDrill.java | 18 +- .../actuallyadditions/items/ItemSeed.java | 95 +------- .../nei/CrusherRecipeHandler.java | 14 +- .../nei/NEIActuallyAdditionsConfig.java | 1 + .../network/PacketHandler.java | 2 + .../network/PacketTileEntityFeeder.java | 8 +- .../network/gui/INumberReactor.java | 8 + .../network/gui/PacketGuiNumber.java | 74 +++++++ ...ry.java => GrinderRecipeAutoRegistry.java} | 6 +- ....java => GrinderRecipeManualRegistry.java} | 2 +- .../tile/TileEntityCoffeeMachine.java | 63 +++++- .../tile/TileEntityGiantChest.java | 32 --- .../tile/TileEntityGrinder.java | 14 +- .../tile/TileEntityInputter.java | 118 +++++----- .../actuallyadditions/util/BlockUtil.java | 24 ++- .../actuallyadditions/util/CompatUtil.java | 27 +++ .../actuallyadditions/util/ItemUtil.java | 20 +- .../actuallyadditions/util/ModUtil.java | 2 +- .../actuallyadditions/util/WorldUtil.java | 13 ++ .../api/FactoryRegistry.java | 113 ---------- .../api/FertilizerType.java | 29 --- .../minefactoryreloaded/api/HarvestType.java | 56 ----- .../api/IDeepStorageUnit.java | 35 --- .../api/IFactoryFertilizable.java | 58 ----- .../api/IFactoryFertilizer.java | 32 --- .../api/IFactoryFruit.java | 106 --------- .../api/IFactoryGrindable.java | 44 ---- .../api/IFactoryHarvestable.java | 106 --------- .../api/IFactoryLaserSource.java | 24 --- .../api/IFactoryLaserTarget.java | 36 ---- .../api/IFactoryPlantable.java | 94 -------- .../api/IFactoryRanchable.java | 34 --- .../api/ILiquidDrinkHandler.java | 16 -- .../minefactoryreloaded/api/IMFRHammer.java | 11 - .../api/IMobEggHandler.java | 23 -- .../api/IMobSpawnHandler.java | 35 --- .../minefactoryreloaded/api/INeedleAmmo.java | 16 -- .../api/IRandomMobProvider.java | 19 -- .../api/ISafariNetHandler.java | 35 --- .../minefactoryreloaded/api/ISyringe.java | 64 ------ .../minefactoryreloaded/api/MobDrop.java | 21 -- .../minefactoryreloaded/api/RanchedItem.java | 68 ------ .../minefactoryreloaded/api/RandomMob.java | 28 --- .../api/ReplacementBlock.java | 137 ------------ .../minefactoryreloaded/api/ValuedItem.java | 72 ------- .../api/rednet/IRedNetInfo.java | 28 --- .../api/rednet/IRedNetInputNode.java | 51 ----- .../api/rednet/IRedNetLogicCircuit.java | 19 -- .../api/rednet/IRedNetLogicPoint.java | 36 ---- .../api/rednet/IRedNetNetworkContainer.java | 32 --- .../api/rednet/IRedNetOmniNode.java | 22 -- .../api/rednet/IRedNetOutputNode.java | 50 ----- .../connectivity/IRedNetConnection.java | 26 --- .../connectivity/IRedNetDecorative.java | 11 - .../connectivity/IRedNetNoConnection.java | 13 -- .../rednet/connectivity/IRedstoneAlike.java | 10 - .../connectivity/RedNetConnectionType.java | 86 -------- .../assets/actuallyadditions/lang/en_US.lang | 40 ++-- .../textures/gui/guiCoffeeMachine.png | Bin 2553 -> 2563 bytes .../textures/gui/guiInputter.png | Bin 2642 -> 3496 bytes .../textures/gui/guiInputterAdvanced.png | Bin 1942 -> 1997 bytes update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 91 files changed, 1237 insertions(+), 2214 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockGeneric.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockSlabs.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockStair.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/BlockWildPlant.java create mode 100644 src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheWildPlants.java create mode 100644 src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java create mode 100644 src/main/java/ellpeck/actuallyadditions/network/gui/INumberReactor.java create mode 100644 src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiNumber.java rename src/main/java/ellpeck/actuallyadditions/recipe/{GrinderRecipeRegistry.java => GrinderRecipeAutoRegistry.java} (93%) rename src/main/java/ellpeck/actuallyadditions/recipe/{GrinderRecipes.java => GrinderRecipeManualRegistry.java} (98%) create mode 100644 src/main/java/ellpeck/actuallyadditions/util/CompatUtil.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java delete mode 100644 src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java diff --git a/README.md b/README.md index 3790246ae..6cbe6e357 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,6 @@ What that means? The License can be customized by me: - When it comes to the Mod, always link back to the the Forum Thread linked above. ### NOTES -- The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API, the InventoryTweaks API and the MineFactoryReloaded API) have their own License that is being respected. +- The above License only applies for Code I wrote myself, any APIs used (such as the CoFH API and the InventoryTweaks API) have their own License that is being respected. - Almost all of the Assets used in this Mod are made by Glenthor and are owned by me. You are not allowed to copy them for any other Project without my Permission. diff --git a/build.gradle b/build.gradle index 12d0a25d9..887dc9aa2 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.6.0" +version = "1.7.10-0.0.6.1" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index 2c7456d48..5e5da37a6 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -10,6 +10,7 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import ellpeck.actuallyadditions.achievement.InitAchievements; import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.communication.InterModCommunications; import ellpeck.actuallyadditions.config.ConfigurationHandler; import ellpeck.actuallyadditions.crafting.GrinderCrafting; import ellpeck.actuallyadditions.crafting.InitCrafting; @@ -24,6 +25,7 @@ import ellpeck.actuallyadditions.material.InitItemMaterials; import ellpeck.actuallyadditions.network.PacketHandler; import ellpeck.actuallyadditions.proxy.IProxy; import ellpeck.actuallyadditions.recipe.FuelHandler; +import ellpeck.actuallyadditions.recipe.HairyBallHandler; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; @@ -76,8 +78,14 @@ public class ActuallyAdditions{ ItemCoffee.initIngredients(); GrinderCrafting.init(); ItemCrafting.initMashedFoodRecipes(); + HairyBallHandler.init(); proxy.postInit(); Util.logInfo("PostInitialization Finished."); } + + @EventHandler + public void onIMCReceived(FMLInterModComms.IMCEvent event){ + InterModCommunications.processIMC(event.getMessages()); + } } diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index 2e145b832..f8ec91d38 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -113,3 +113,7 @@ -Testificate Bucks -Village House that has a Coffee Machine -Villager who sells Coffee and Cookies + +-Inventory Emitter + -Emits a Redstone Signal dependant on the Amount of a specified Item in it + -Items are configurable in the GUI diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java index d7de4dbf3..1160e5652 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockContainerBase.java @@ -20,25 +20,27 @@ public abstract class BlockContainerBase extends BlockContainer{ } public void dropInventory(World world, int x, int y, int z){ - TileEntity tile = world.getTileEntity(x, y, z); - if(tile instanceof TileEntityInventoryBase){ - TileEntityInventoryBase tileEntity = (TileEntityInventoryBase)tile; - if(tileEntity.getSizeInventory() > 0){ - for(int i = 0; i < tileEntity.getSizeInventory(); i++){ - ItemStack itemStack = tileEntity.getStackInSlot(i); - if(itemStack != null && itemStack.stackSize > 0){ - Random rand = new Random(); - float dX = rand.nextFloat()*0.8F+0.1F; - float dY = rand.nextFloat()*0.8F+0.1F; - float dZ = rand.nextFloat()*0.8F+0.1F; - EntityItem entityItem = new EntityItem(world, x+dX, y+dY, z+dZ, itemStack.copy()); - if(itemStack.hasTagCompound()) entityItem.getEntityItem().setTagCompound((NBTTagCompound)itemStack.getTagCompound().copy()); - float factor = 0.05F; - entityItem.motionX = rand.nextGaussian()*factor; - entityItem.motionY = rand.nextGaussian()*factor+0.2F; - entityItem.motionZ = rand.nextGaussian()*factor; - world.spawnEntityInWorld(entityItem); - itemStack.stackSize = 0; + if(!world.isRemote){ + TileEntity tile = world.getTileEntity(x, y, z); + if(tile instanceof TileEntityInventoryBase){ + TileEntityInventoryBase tileEntity = (TileEntityInventoryBase)tile; + if(tileEntity.getSizeInventory() > 0){ + for(int i = 0; i < tileEntity.getSizeInventory(); i++){ + ItemStack itemStack = tileEntity.getStackInSlot(i); + if(itemStack != null && itemStack.stackSize > 0){ + Random rand = new Random(); + float dX = rand.nextFloat()*0.8F+0.1F; + float dY = rand.nextFloat()*0.8F+0.1F; + float dZ = rand.nextFloat()*0.8F+0.1F; + EntityItem entityItem = new EntityItem(world, x+dX, y+dY, z+dZ, itemStack.copy()); + if(itemStack.hasTagCompound()) entityItem.getEntityItem().setTagCompound((NBTTagCompound)itemStack.getTagCompound().copy()); + float factor = 0.05F; + entityItem.motionX = rand.nextGaussian()*factor; + entityItem.motionY = rand.nextGaussian()*factor+0.2F; + entityItem.motionZ = rand.nextGaussian()*factor; + world.spawnEntityInWorld(entityItem); + itemStack.stackSize = 0; + } } } } diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockGeneric.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGeneric.java new file mode 100644 index 000000000..f908f34aa --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockGeneric.java @@ -0,0 +1,85 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import ellpeck.actuallyadditions.util.ModUtil; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.client.renderer.texture.IIconRegister; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; + +import java.util.List; + +public class BlockGeneric extends Block implements INameableItem{ + + public String name; + + public BlockGeneric(String name){ + super(Material.rock); + this.name = name; + this.setHarvestLevel("pickaxe", 0); + this.setHardness(1.0F); + this.setStepSound(soundTypeStone); + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public IIcon getIcon(int side, int meta){ + return this.blockIcon; + } + + @Override + @SideOnly(Side.CLIENT) + public void registerBlockIcons(IIconRegister iconReg){ + this.blockIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int meta){ + return meta; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java index 5f9495cde..9f5fa7856 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockInputter.java @@ -121,7 +121,7 @@ public class BlockInputter extends BlockContainerBase implements INameableItem{ public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { if(KeyUtil.isShiftPressed()){ list.add(StatCollector.translateToLocalFormatted("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + 1, StringUtil.OBFUSCATED, StringUtil.LIGHT_GRAY)); - for(int i = 1; i < 6; i++){ + for(int i = 1; i < 7; i++){ list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + ".blockInputter.desc." + (i + 1))); } if((((BlockInputter)theBlock).isAdvanced)) list.add(StatCollector.translateToLocal("tooltip." + ModUtil.MOD_ID_LOWER + "." + ((INameableItem)theBlock).getName() + ".desc")); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java index 513a52bcc..8ceeed77b 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockMisc.java @@ -91,7 +91,7 @@ public class BlockMisc extends Block implements INameableItem{ @SuppressWarnings("unchecked") @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { - BlockUtil.addInformation(theBlock, list, 1, allMiscBlocks[stack.getItemDamage()].getName()); + if(stack.getItemDamage() < allMiscBlocks.length) BlockUtil.addInformation(theBlock, list, 1, allMiscBlocks[stack.getItemDamage()].getName()); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java index e04e805df..f48af25a9 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockPlant.java @@ -2,7 +2,6 @@ package ellpeck.actuallyadditions.blocks; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; -import ellpeck.actuallyadditions.items.ItemSeed; import ellpeck.actuallyadditions.util.BlockUtil; import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ModUtil; @@ -16,16 +15,11 @@ import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; import net.minecraft.world.World; -import powercrystals.minefactoryreloaded.api.FertilizerType; -import powercrystals.minefactoryreloaded.api.HarvestType; -import powercrystals.minefactoryreloaded.api.IFactoryFertilizable; -import powercrystals.minefactoryreloaded.api.IFactoryHarvestable; import java.util.List; -import java.util.Map; import java.util.Random; -public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHarvestable, IFactoryFertilizable{ +public class BlockPlant extends BlockCrops implements INameableItem{ private IIcon[] textures; private String name; @@ -42,19 +36,9 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar this.addDropAmount = addDropAmount; } - @Override - public boolean canBlockStay(World world, int x, int y, int z){ - return y > 0 && y < 256 && world.getBlock(x, y-1, z).getMaterial() == ((ItemSeed)this.seedItem).soilBlock.getMaterial(); - } - @Override public int quantityDropped(int meta, int fortune, Random random){ - return meta >= 7 ? super.quantityDropped(meta, fortune, random) : random.nextInt(addDropAmount)+minDropAmount; - } - - @Override - public boolean canPlaceBlockOn(Block block){ - return block == ((ItemSeed)this.seedItem).soilBlock; + return meta >= 7 ? random.nextInt(addDropAmount)+minDropAmount : super.quantityDropped(meta, fortune, random); } @Override @@ -143,57 +127,4 @@ public class BlockPlant extends BlockCrops implements INameableItem, IFactoryHar return damage; } } - - @Override - public Block getPlant(){ - return this; - } - - @Override - public boolean canFertilize(World world, int x, int y, int z, FertilizerType fertilizerType){ - return true; - } - - @Override - public boolean fertilize(World world, Random rand, int x, int y, int z, FertilizerType fertilizerType){ - if (this.func_149851_a(world, x, y, z, world.isRemote)){ - if(!world.isRemote){ - if(this.func_149852_a(world, world.rand, x, y, z)){ - this.func_149853_b(world, world.rand, x, y, z); - return true; - } - } - } - return false; - } - - @Override - public HarvestType getHarvestType(){ - return HarvestType.Normal; - } - - @Override - public boolean breakBlock(){ - return true; - } - - @Override - public boolean canBeHarvested(World world, Map harvesterSettings, int x, int y, int z){ - return world.getBlockMetadata(x, y, z) >= 7; - } - - @Override - public List getDrops(World world, Random rand, Map harvesterSettings, int x, int y, int z){ - return this.getDrops(world, x, y, z, world.getBlockMetadata(x, y, z), 0); - } - - @Override - public void preHarvest(World world, int x, int y, int z){ - - } - - @Override - public void postHarvest(World world, int x, int y, int z){ - - } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockSlabs.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockSlabs.java new file mode 100644 index 000000000..ab02e09b0 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockSlabs.java @@ -0,0 +1,129 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.block.material.Material; +import net.minecraft.entity.Entity; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.AxisAlignedBB; +import net.minecraft.util.IIcon; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; + +import java.util.List; + +public class BlockSlabs extends Block implements INameableItem{ + + private String name; + private Block fullBlock; + + public BlockSlabs(String name, Block fullBlock){ + super(Material.rock); + this.fullBlock = fullBlock; + this.name = name; + } + + @Override + public void addCollisionBoxesToList(World world, int x, int y, int z, AxisAlignedBB axis, List list, Entity entity){ + this.setBlockBoundsBasedOnState(world, x, y, z); + super.addCollisionBoxesToList(world, x, y, z, axis, list, entity); + } + + @Override + public void setBlockBoundsForItemRender(){ + this.setBlockBounds(0.0F, 0.0F, 0.0F, 1.0F, 0.5F, 1.0F); + } + + @Override + public void setBlockBoundsBasedOnState(IBlockAccess world, int x, int y, int z){ + int meta = world.getBlockMetadata(x, y, z); + float minY = meta == 1 ? 0.5F : 0.0F; + float maxY = meta == 1 ? 1.0F : 0.5F; + this.setBlockBounds(0.0F, minY, 0F, 1.0F, maxY, 1.0F); + } + + @Override + public int onBlockPlaced(World par1World, int blockX, int blockY, int blockZ, int side, float hitX, float hitY, float hitZ, int meta){ + if (side == 1) return meta; + if (side == 0 || hitY >= 0.5F) return meta+1; + return meta; + } + + @Override + public boolean isOpaqueCube(){ + return false; + } + + @Override + public boolean renderAsNormalBlock(){ + return false; + } + + @Override + @SideOnly(Side.CLIENT) + public IIcon getIcon(int side, int meta){ + return this.fullBlock.getIcon(0, 0); + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int meta){ + return meta; + } + + @Override + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ){ + if(world.getBlock(x, y, z) == this.theBlock && ((side == 1 && world.getBlockMetadata(x, y, z) == 0) || (side == 0 && world.getBlockMetadata(x, y, z) == 1))){ + if(world.setBlock(x, y, z, ((BlockSlabs)this.theBlock).fullBlock, 0, 3)){ + world.playSoundEffect(x+0.5F, y+0.5F, z+0.5F, this.theBlock.stepSound.getBreakSound(), (this.theBlock.stepSound.getVolume()+1.0F)/2.0F, this.theBlock.stepSound.getPitch()*0.8F); + stack.stackSize--; + return true; + } + } + return super.onItemUse(stack, player, world, x, y, z, side, hitX, hitY, hitZ); + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockStair.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockStair.java new file mode 100644 index 000000000..97da40c66 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockStair.java @@ -0,0 +1,69 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.block.BlockStairs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; + +import java.util.List; + +public class BlockStair extends BlockStairs implements INameableItem{ + + private String name; + + public BlockStair(Block block, String name){ + super(block, 0); + this.name = name; + this.setLightOpacity(0); + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.getName(); + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(false); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return EnumRarity.uncommon; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName(); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + BlockUtil.addInformation(theBlock, list, 1, ""); + } + + @Override + public int getMetadata(int meta){ + return meta; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/BlockWildPlant.java b/src/main/java/ellpeck/actuallyadditions/blocks/BlockWildPlant.java new file mode 100644 index 000000000..93e88aa18 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/BlockWildPlant.java @@ -0,0 +1,118 @@ +package ellpeck.actuallyadditions.blocks; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import ellpeck.actuallyadditions.blocks.metalists.TheWildPlants; +import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.block.BlockBush; +import net.minecraft.block.material.Material; +import net.minecraft.creativetab.CreativeTabs; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.EnumRarity; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.item.ItemStack; +import net.minecraft.util.IIcon; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; + +import java.util.ArrayList; +import java.util.List; + +public class BlockWildPlant extends BlockBush implements INameableItem{ + + public static final TheWildPlants[] allWildPlants = TheWildPlants.values(); + public IIcon[] textures = new IIcon[allWildPlants.length]; + + public BlockWildPlant(){ + this.setStepSound(soundTypeGrass); + } + + @Override + public boolean canBlockStay(World world, int x, int y, int z){ + return world.getBlockMetadata(x, y, z) == TheWildPlants.RICE.ordinal() ? world.getBlock(x, y-1, z).getMaterial() == Material.water : world.getBlock(x, y - 1, z).canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, this); + } + + @Override + public boolean canSilkHarvest(){ + return false; + } + + @SuppressWarnings("all") + @SideOnly(Side.CLIENT) + public void getSubBlocks(Item item, CreativeTabs tab, List list){ + for (int j = 0; j < allWildPlants.length; j++){ + list.add(new ItemStack(item, 1, j)); + } + } + + @Override + public ArrayList getDrops(World world, int x, int y, int z, int metadata, int fortune){ + return metadata >= allWildPlants.length ? null : allWildPlants[metadata].wildVersionOf.getDrops(world, x, y, z, 7, fortune); + } + + @Override + public IIcon getIcon(int side, int metadata){ + return metadata >= allWildPlants.length ? null : allWildPlants[metadata].wildVersionOf.getIcon(0, 7); + } + + @Override + public String getName(){ + return "blockWild"; + } + + @Override + @SideOnly(Side.CLIENT) + public Item getItem(World world, int x, int y, int z){ + int meta = world.getBlockMetadata(x, y, z); + return meta >= allWildPlants.length ? null : ((BlockPlant)allWildPlants[meta].wildVersionOf).seedItem; + } + + @Override + public String getOredictName(){ + return ""; + } + + public static class TheItemBlock extends ItemBlock{ + + private Block theBlock; + + public TheItemBlock(Block block){ + super(block); + this.theBlock = block; + this.setHasSubtypes(true); + this.setMaxDamage(0); + } + + @Override + public EnumRarity getRarity(ItemStack stack){ + return stack.getItemDamage() >= allWildPlants.length ? EnumRarity.common : allWildPlants[stack.getItemDamage()].rarity; + } + + @Override + public String getUnlocalizedName(ItemStack stack){ + return this.getUnlocalizedName() + (stack.getItemDamage() >= allWildPlants.length ? " ERROR!" : allWildPlants[stack.getItemDamage()].getName()); + } + + @Override + @SuppressWarnings("unchecked") + @SideOnly(Side.CLIENT) + public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean isHeld) { + if(stack.getItemDamage() < allWildPlants.length) BlockUtil.addInformation(theBlock, list, 1, allWildPlants[stack.getItemDamage()].getName()); + } + + @Override + public int getMetadata(int damage){ + return damage; + } + + @SideOnly(Side.CLIENT) + @Override + public IIcon getIconFromDamage(int meta){ + return this.theBlock.getIcon(0, meta); + } + + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java index 821a6a463..53f03e35b 100644 --- a/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java +++ b/src/main/java/ellpeck/actuallyadditions/blocks/InitBlocks.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.blocks; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.util.BlockUtil; +import ellpeck.actuallyadditions.util.CompatUtil; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; @@ -10,12 +11,12 @@ import net.minecraft.item.EnumRarity; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; import org.apache.logging.log4j.Level; -import powercrystals.minefactoryreloaded.api.FactoryRegistry; public class InitBlocks{ public static Block blockCompost; public static Block blockMisc; + public static Block blockWildPlant; public static Block blockFeeder; public static Block blockGiantChest; @@ -67,9 +68,29 @@ public class InitBlocks{ public static Block blockEnergizer; public static Block blockEnervator; + public static Block blockTestifiBucksGreenWall; + public static Block blockTestifiBucksWhiteWall; + public static Block blockTestifiBucksGreenStairs; + public static Block blockTestifiBucksWhiteStairs; + public static Block blockTestifiBucksGreenSlab; + public static Block blockTestifibucksWhiteSlab; + public static void init(){ Util.logInfo("Initializing Blocks..."); + blockTestifiBucksGreenWall = new BlockGeneric("blockTestifiBucksGreenWall"); + BlockUtil.register(blockTestifiBucksGreenWall, BlockGeneric.TheItemBlock.class); + blockTestifiBucksWhiteWall = new BlockGeneric("blockTestifiBucksWhiteWall"); + BlockUtil.register(blockTestifiBucksWhiteWall, BlockGeneric.TheItemBlock.class); + blockTestifiBucksGreenStairs = new BlockStair(blockTestifiBucksGreenWall, "blockTestifiBucksGreenStairs"); + BlockUtil.register(blockTestifiBucksGreenStairs, BlockStair.TheItemBlock.class); + blockTestifiBucksWhiteStairs = new BlockStair(blockTestifiBucksWhiteWall, "blockTestifiBucksWhiteStairs"); + BlockUtil.register(blockTestifiBucksWhiteStairs, BlockStair.TheItemBlock.class); + blockTestifiBucksGreenSlab = new BlockSlabs("blockTestifiBucksGreenSlab", blockTestifiBucksGreenWall); + BlockUtil.register(blockTestifiBucksGreenSlab, BlockSlabs.TheItemBlock.class); + blockTestifibucksWhiteSlab = new BlockSlabs("blockTestifibucksWhiteSlab", blockTestifiBucksWhiteWall); + BlockUtil.register(blockTestifibucksWhiteSlab, BlockSlabs.TheItemBlock.class); + blockEnergizer = new BlockEnergizer(true); BlockUtil.register(blockEnergizer, BlockEnergizer.TheItemBlock.class); @@ -108,23 +129,19 @@ public class InitBlocks{ blockRice = new BlockPlant("blockRice", 6, 1, 2); BlockUtil.register(blockRice, BlockPlant.TheItemBlock.class, false); - FactoryRegistry.sendMessage("registerHarvestable", blockRice); - FactoryRegistry.sendMessage("registerFertilizable", blockRice); + CompatUtil.registerMFRPlant(blockRice); blockCanola = new BlockPlant("blockCanola", 4, 3, 3); BlockUtil.register(blockCanola, BlockPlant.TheItemBlock.class, false); - FactoryRegistry.sendMessage("registerHarvestable", blockCanola); - FactoryRegistry.sendMessage("registerFertilizable", blockCanola); + CompatUtil.registerMFRPlant(blockCanola); blockFlax = new BlockPlant("blockFlax", 6, 2, 4); BlockUtil.register(blockFlax, BlockPlant.TheItemBlock.class, false); - FactoryRegistry.sendMessage("registerHarvestable", blockFlax); - FactoryRegistry.sendMessage("registerFertilizable", blockFlax); + CompatUtil.registerMFRPlant(blockFlax); blockCoffee = new BlockPlant("blockCoffee", 6, 2, 2); BlockUtil.register(blockCoffee, BlockPlant.TheItemBlock.class, false); - FactoryRegistry.sendMessage("registerHarvestable", blockCoffee); - FactoryRegistry.sendMessage("registerFertilizable", blockCoffee); + CompatUtil.registerMFRPlant(blockCoffee); blockCompost = new BlockCompost(); BlockUtil.register(blockCompost, BlockCompost.TheItemBlock.class); @@ -189,10 +206,14 @@ public class InitBlocks{ blockPhantomBooster = new BlockPhantomBooster(); BlockUtil.register(blockPhantomBooster, BlockPhantomBooster.TheItemBlock.class); + blockWildPlant = new BlockWildPlant(); + BlockUtil.register(blockWildPlant, BlockWildPlant.TheItemBlock.class, false, BlockWildPlant.allWildPlants); + registerFluids(); } public static void registerFluids(){ + //Canola Fluid String canolaOil = "canolaoil"; if(!FluidRegistry.isFluidRegistered(canolaOil) || ConfigBoolValues.PREVENT_CANOLA_OVERRIDE.isEnabled()){ fluidCanolaOil = new FluidAA(canolaOil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); @@ -203,6 +224,7 @@ public class InitBlocks{ } fluidCanolaOil = FluidRegistry.getFluid(canolaOil); + //Canola Block if(fluidCanolaOil.getBlock() == null || ConfigBoolValues.PREVENT_CANOLA_BLOCK_OVERRIDE.isEnabled()){ blockCanolaOil = new BlockFluidFlowing(fluidCanolaOil, Material.water, "blockCanolaOil"); BlockUtil.register(blockCanolaOil, BlockFluidFlowing.TheItemBlock.class, false); @@ -212,6 +234,7 @@ public class InitBlocks{ } blockCanolaOil = fluidCanolaOil.getBlock(); + //Oil Fluid String oil = "oil"; if(!FluidRegistry.isFluidRegistered(oil) || ConfigBoolValues.PREVENT_OIL_OVERRIDE.isEnabled()){ fluidOil = new FluidAA(oil).setDensity(1200).setViscosity(1500).setTemperature(300).setRarity(EnumRarity.uncommon); @@ -222,6 +245,7 @@ public class InitBlocks{ } fluidOil = FluidRegistry.getFluid(oil); + //Oil Block if(fluidOil.getBlock() == null || ConfigBoolValues.PREVENT_OIL_BLOCK_OVERRIDE.isEnabled()){ blockOil = new BlockFluidFlowing(fluidOil, Material.water, "blockOil"); BlockUtil.register(blockOil, BlockFluidFlowing.TheItemBlock.class, false); diff --git a/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheWildPlants.java b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheWildPlants.java new file mode 100644 index 000000000..8d1a03e5c --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/blocks/metalists/TheWildPlants.java @@ -0,0 +1,36 @@ +package ellpeck.actuallyadditions.blocks.metalists; + +import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.util.INameableItem; +import net.minecraft.block.Block; +import net.minecraft.item.EnumRarity; + +public enum TheWildPlants implements INameableItem{ + + CANOLA("Canola", EnumRarity.rare, "blockCanolaWild", InitBlocks.blockCanola), + FLAX("Flax", EnumRarity.rare, "blockFlaxWild", InitBlocks.blockFlax), + RICE("Rice", EnumRarity.rare, "blockRiceWild", InitBlocks.blockRice), + COFFEE("Coffee", EnumRarity.rare, "blockCoffeeWild", InitBlocks.blockCoffee); + + public final String name; + public final String oredictName; + public final EnumRarity rarity; + public final Block wildVersionOf; + + TheWildPlants(String name, EnumRarity rarity, String oredictName, Block wildVersionOf){ + this.name = name; + this.rarity = rarity; + this.oredictName = oredictName; + this.wildVersionOf = wildVersionOf; + } + + @Override + public String getName(){ + return this.name; + } + + @Override + public String getOredictName(){ + return this.oredictName; + } +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java b/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java new file mode 100644 index 000000000..3fa551e59 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/communication/InterModCommunications.java @@ -0,0 +1,70 @@ +package ellpeck.actuallyadditions.communication; + +import cpw.mods.fml.common.event.FMLInterModComms; +import ellpeck.actuallyadditions.items.ItemCoffee; +import ellpeck.actuallyadditions.recipe.GrinderRecipeManualRegistry; +import ellpeck.actuallyadditions.recipe.HairyBallHandler; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.Util; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.potion.PotionEffect; +import org.apache.logging.log4j.Level; + +import java.util.List; + +public class InterModCommunications{ + + public static void processIMC(List messages){ + for(FMLInterModComms.IMCMessage message : messages){ + if(message.key.equalsIgnoreCase("registerCrusherRecipe")){ + NBTTagCompound compound = message.getNBTValue(); + if(compound != null){ + ItemStack input = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("input")); + ItemStack outputOne = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("outputOne")); + ItemStack outputTwo = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("outputTwo")); + int secondChance = compound.getInteger("secondChance"); + + if(input != null && outputOne != null){ + GrinderRecipeManualRegistry.registerRecipe(input, outputOne, outputTwo, secondChance); + Util.logInfo("Crusher Recipe that was sent from Mod " + message.getSender() + " has been registered successfully: " + input.toString() + " -> " + outputOne.toString() + (outputTwo != null ? " + " + outputTwo.toString() + ", Second Chance: " + secondChance : "")); + } + else ModUtil.LOGGER.log(Level.ERROR, "Crusher Recipe that was sent from Mod " + message.getSender() + " could not be registered: It's missing an Input or an Output!"); + } + } + + if(message.key.equalsIgnoreCase("registerCoffeeMachineRecipe")){ + NBTTagCompound compound = message.getNBTValue(); + if(compound != null){ + ItemStack input = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("input")); + int potionID = compound.getInteger("id"); + int duration = compound.getInteger("duration"); + int amplifier = compound.getInteger("amplifier"); + int maxAmp = compound.getInteger("maxAmp"); + + if(input != null && potionID > 0 && duration > 0 && maxAmp > 0){ + PotionEffect effect = new PotionEffect(potionID, duration, amplifier); + ItemCoffee.registerIngredient(new ItemCoffee.Ingredient(input, new PotionEffect[]{effect}, maxAmp)); + Util.logInfo("Coffee Machine Recipe that was sent from Mod " + message.getSender() + " has been registered successfully: " + input.toString() + " -> " + effect.toString()); + } + else ModUtil.LOGGER.log(Level.ERROR, "Coffee Machine Recipe that was sent from Mod " + message.getSender() + " could not be registered: It's missing an Input, a Potion ID, a Duration or a max Amplifier!"); + } + } + + if(message.key.equalsIgnoreCase("registerBallOfHairRecipe")){ + NBTTagCompound compound = message.getNBTValue(); + if(compound != null){ + ItemStack output = ItemStack.loadItemStackFromNBT(compound.getCompoundTag("output")); + int chance = compound.getInteger("chance"); + + if(output != null && chance > 0){ + HairyBallHandler.addReturn(output, chance); + Util.logInfo("Ball Of Hair Recipe that was sent from Mod " + message.getSender() + " has been registered successfully: " + output.toString() + ", Chance: " + chance); + } + else ModUtil.LOGGER.log(Level.ERROR, "Ball Of Hair Recipe that was sent from Mod " + message.getSender() + " could not be registered: It's missing an Output or a Chance!"); + } + } + } + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java index 5a2e05617..2ed8f077e 100644 --- a/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java +++ b/src/main/java/ellpeck/actuallyadditions/config/values/ConfigIntValues.java @@ -2,6 +2,7 @@ package ellpeck.actuallyadditions.config.values; import ellpeck.actuallyadditions.config.ConfigCategories; import ellpeck.actuallyadditions.config.ConfigValues; +import net.minecraftforge.fluids.FluidContainerRegistry; public enum ConfigIntValues{ @@ -86,9 +87,9 @@ public enum ConfigIntValues{ COFFEE_CACHE_ADDED_PER_ITEM("Coffee Machine: Coffee added per Cup", ConfigCategories.MACHINE_VALUES, 1, 1, 300, "The amount of Coffee added by one Coffee Item in the Coffee Machine"), COFFEE_CACHE_USED_PER_ITEM("Coffee Machine: Coffee used per Cup", ConfigCategories.MACHINE_VALUES, 10, 1, 300, "The amount of Coffee used to brew one Coffee in the Coffee Machine"), COFFEE_MACHINE_TIME_USED("Coffee Machine: Time to Brew", ConfigCategories.MACHINE_VALUES, 500, 10, 10000, "The amount of time the Coffee Machine takes to brew a Coffee"), + COFFEE_MACHINE_WATER_USED("Coffee Machine: Water Used per Cup", ConfigCategories.MACHINE_VALUES, 500, 1, 4*FluidContainerRegistry.BUCKET_VOLUME, "The amount of Water the Coffee Machine uses per Cup"), COFFEE_DRINK_AMOUNT("Coffee: Drink Amount", ConfigCategories.OTHER, 4, 1, 100, "How often a Coffee can be drunk from"), - DRILL_ENERGY_USE("Drill: Energy Use Per Block or Hit", ConfigCategories.DRILL_VALUES, 100, 5, 10000, "How much Energy the Drill uses per Block"), DRILL_SPEED_EXTRA_USE("Speed Upgrade: Extra Energy Use", ConfigCategories.DRILL_VALUES, 50, 0, 10000, "How much extra Energy the Speed Upgrade uses"), diff --git a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java index 28a62a506..092df6a4f 100644 --- a/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java +++ b/src/main/java/ellpeck/actuallyadditions/crafting/GrinderCrafting.java @@ -3,9 +3,9 @@ package ellpeck.actuallyadditions.crafting; import ellpeck.actuallyadditions.items.InitItems; import ellpeck.actuallyadditions.items.metalists.TheDusts; import ellpeck.actuallyadditions.items.metalists.TheFoods; -import ellpeck.actuallyadditions.recipe.GrinderRecipeRegistry; -import ellpeck.actuallyadditions.recipe.GrinderRecipeRegistry.SearchCase; -import ellpeck.actuallyadditions.recipe.GrinderRecipes; +import ellpeck.actuallyadditions.recipe.GrinderRecipeAutoRegistry; +import ellpeck.actuallyadditions.recipe.GrinderRecipeAutoRegistry.SearchCase; +import ellpeck.actuallyadditions.recipe.GrinderRecipeManualRegistry; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; import net.minecraft.init.Items; @@ -16,28 +16,28 @@ public class GrinderCrafting{ public static void init(){ Util.logInfo("Initializing Crusher Recipes..."); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10)); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal())); - GrinderRecipes.registerRecipe(new ItemStack(Items.coal), new ItemStack(InitItems.itemDust, 1, TheDusts.COAL.ordinal())); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.coal_block), new ItemStack(InitItems.itemDust, 9, TheDusts.COAL.ordinal())); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.redstone_ore), new ItemStack(Items.redstone, 10)); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.lapis_ore), new ItemStack(InitItems.itemDust, 12, TheDusts.LAPIS.ordinal())); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Items.coal), new ItemStack(InitItems.itemDust, 1, TheDusts.COAL.ordinal())); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.coal_block), new ItemStack(InitItems.itemDust, 9, TheDusts.COAL.ordinal())); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.sand)); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); - GrinderRecipes.registerRecipe(new ItemStack(Blocks.stone), new ItemStack(Blocks.cobblestone)); - GrinderRecipes.registerRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal()), new ItemStack(Items.sugar, 2)); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.cobblestone), new ItemStack(Blocks.sand)); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.gravel), new ItemStack(Items.flint)); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(Blocks.stone), new ItemStack(Blocks.cobblestone)); + GrinderRecipeManualRegistry.registerRecipe(new ItemStack(InitItems.itemFoods, 1, TheFoods.RICE.ordinal()), new ItemStack(Items.sugar, 2)); - GrinderRecipes.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); - GrinderRecipes.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); + GrinderRecipeManualRegistry.registerRecipe("oreNickel", "dustNickel", "dustPlatinum", 30, 2); + GrinderRecipeManualRegistry.registerRecipe("oreIron", "dustIron", "dustGold", 20, 2); - GrinderRecipeRegistry.searchCases.add(new SearchCase("oreNether", 6)); - GrinderRecipeRegistry.searchCases.add(new SearchCase("denseore", 8)); - GrinderRecipeRegistry.searchCases.add(new SearchCase("gem", 1)); - GrinderRecipeRegistry.searchCases.add(new SearchCase("ingot", 1)); - GrinderRecipeRegistry.searchCases.add(new SearchCase("ore", 2)); + GrinderRecipeAutoRegistry.searchCases.add(new SearchCase("oreNether", 6)); + GrinderRecipeAutoRegistry.searchCases.add(new SearchCase("denseore", 8)); + GrinderRecipeAutoRegistry.searchCases.add(new SearchCase("gem", 1)); + GrinderRecipeAutoRegistry.searchCases.add(new SearchCase("ingot", 1)); + GrinderRecipeAutoRegistry.searchCases.add(new SearchCase("ore", 2)); - GrinderRecipeRegistry.exceptions.add("ingotBrick"); - GrinderRecipeRegistry.exceptions.add("ingotBrickNether"); + GrinderRecipeAutoRegistry.exceptions.add("ingotBrick"); + GrinderRecipeAutoRegistry.exceptions.add("ingotBrickNether"); - GrinderRecipeRegistry.registerFinally(); + GrinderRecipeAutoRegistry.registerFinally(); } } diff --git a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java index aa6dea2ba..541f64054 100644 --- a/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java +++ b/src/main/java/ellpeck/actuallyadditions/creative/CreativeTab.java @@ -31,10 +31,10 @@ public class CreativeTab extends CreativeTabs{ add(InitBlocks.blockPhantomLiquiface); add(InitBlocks.blockPhantomPlacer); add(InitBlocks.blockPhantomBreaker); - add(InitBlocks.blockPhantomBooster); - add(InitBlocks.blockCoffeeMachine); add(InitBlocks.blockInputter); add(InitBlocks.blockInputterAdvanced); + add(InitBlocks.blockPhantomBooster); + add(InitBlocks.blockCoffeeMachine); add(InitBlocks.blockGreenhouseGlass); add(InitBlocks.blockGrinder); @@ -64,6 +64,13 @@ public class CreativeTab extends CreativeTabs{ add(InitBlocks.blockCanolaPress); add(InitBlocks.blockFermentingBarrel); + add(InitBlocks.blockTestifiBucksGreenWall); + add(InitBlocks.blockTestifiBucksWhiteWall); + add(InitBlocks.blockTestifiBucksGreenStairs); + add(InitBlocks.blockTestifiBucksWhiteStairs); + add(InitBlocks.blockTestifiBucksGreenSlab); + add(InitBlocks.blockTestifibucksWhiteSlab); + add(InitItems.itemDrill); add(InitItems.itemDrillUpgradeSpeed); add(InitItems.itemDrillUpgradeSpeedII); @@ -119,10 +126,10 @@ public class CreativeTab extends CreativeTabs{ add(InitItems.itemShovelObsidian); add(InitItems.itemHoeObsidian); + add(InitItems.itemJams); + add(InitItems.itemPotionRing); add(InitItems.itemPotionRingAdvanced); - - add(InitItems.itemJams); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java index f78511e11..0fa3acaba 100644 --- a/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java +++ b/src/main/java/ellpeck/actuallyadditions/event/WorldDecorationEvent.java @@ -2,11 +2,12 @@ package ellpeck.actuallyadditions.event; import cpw.mods.fml.common.eventhandler.SubscribeEvent; import ellpeck.actuallyadditions.blocks.InitBlocks; +import ellpeck.actuallyadditions.blocks.metalists.TheWildPlants; import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; +import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.block.Block; import net.minecraft.block.material.Material; -import net.minecraft.world.World; import net.minecraftforge.event.terraingen.DecorateBiomeEvent; import java.util.ArrayList; @@ -24,11 +25,11 @@ public class WorldDecorationEvent{ int genY = event.world.getTopSolidOrLiquidBlock(genX, genZ); if(event.world.getBlock(genX, genY, genZ).getMaterial() == Material.water){ - ArrayList blocksAroundBottom = this.getMaterialsAround(event.world, genX, genY, genZ); - ArrayList blocksAroundTop = this.getMaterialsAround(event.world, genX, genY+1, genZ); + ArrayList blocksAroundBottom = WorldUtil.getMaterialsAround(event.world, genX, genY, genZ); + ArrayList blocksAroundTop = WorldUtil.getMaterialsAround(event.world, genX, genY+1, genZ); if(blocksAroundBottom.contains(Material.grass) || blocksAroundBottom.contains(Material.ground) || blocksAroundBottom.contains(Material.rock) || blocksAroundBottom.contains(Material.sand)){ - if(!blocksAroundTop.contains(Material.water) && !blocksAroundTop.contains(Material.water) && !blocksAroundTop.contains(Material.water) && event.world.getBlock(genX, genY+1, genZ).getMaterial() == Material.air){ - event.world.setBlock(genX, genY+1, genZ, InitBlocks.blockRice, event.rand.nextInt(8), 2); + if(!blocksAroundTop.contains(Material.water) && event.world.getBlock(genX, genY+1, genZ).getMaterial() == Material.air){ + event.world.setBlock(genX, genY+1, genZ, InitBlocks.blockWildPlant, TheWildPlants.RICE.ordinal(), 2); } } } @@ -36,12 +37,12 @@ public class WorldDecorationEvent{ } } - this.genPlantNormally(InitBlocks.blockCanola, ConfigIntValues.CANOLA_AMOUNT.getValue(), ConfigBoolValues.DO_CANOLA_GEN.isEnabled(), Material.grass, event); - this.genPlantNormally(InitBlocks.blockFlax, ConfigIntValues.FLAX_AMOUNT.getValue(), ConfigBoolValues.DO_FLAX_GEN.isEnabled(), Material.grass, event); - this.genPlantNormally(InitBlocks.blockCoffee, ConfigIntValues.COFFEE_AMOUNT.getValue(), ConfigBoolValues.DO_COFFEE_GEN.isEnabled(), Material.grass, event); + this.genPlantNormally(InitBlocks.blockWildPlant, TheWildPlants.CANOLA.ordinal(), ConfigIntValues.CANOLA_AMOUNT.getValue(), ConfigBoolValues.DO_CANOLA_GEN.isEnabled(), Material.grass, event); + this.genPlantNormally(InitBlocks.blockWildPlant, TheWildPlants.FLAX.ordinal(), ConfigIntValues.FLAX_AMOUNT.getValue(), ConfigBoolValues.DO_FLAX_GEN.isEnabled(), Material.grass, event); + this.genPlantNormally(InitBlocks.blockWildPlant, TheWildPlants.COFFEE.ordinal(), ConfigIntValues.COFFEE_AMOUNT.getValue(), ConfigBoolValues.DO_COFFEE_GEN.isEnabled(), Material.grass, event); } - public void genPlantNormally(Block plant, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event){ + public void genPlantNormally(Block plant, int meta, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event){ if(doIt){ for(int i = 0; i < amount; i++){ if(new Random().nextInt(100) == 0){ @@ -50,21 +51,11 @@ public class WorldDecorationEvent{ int genY = event.world.getTopSolidOrLiquidBlock(genX, genZ)-1; if(event.world.getBlock(genX, genY, genZ).getMaterial() == blockBelow){ - event.world.setBlock(genX, genY+1, genZ, plant, event.rand.nextInt(8), 2); + event.world.setBlock(genX, genY+1, genZ, plant, meta, 2); } } } } } - public ArrayList getMaterialsAround(World world, int x, int y, int z){ - ArrayList blocks = new ArrayList(); - blocks.add(world.getBlock(x+1, y, z).getMaterial()); - blocks.add(world.getBlock(x-1, y, z).getMaterial()); - blocks.add(world.getBlock(x, y, z+1).getMaterial()); - blocks.add(world.getBlock(x, y, z-1).getMaterial()); - - return blocks; - } - } diff --git a/src/main/java/ellpeck/actuallyadditions/gen/InitVillager.java b/src/main/java/ellpeck/actuallyadditions/gen/InitVillager.java index 3d58b94d7..a35437f9e 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/InitVillager.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/InitVillager.java @@ -13,31 +13,34 @@ import net.minecraft.util.WeightedRandomChestContent; import net.minecraft.world.gen.structure.MapGenStructureIO; import net.minecraftforge.common.ChestGenHooks; -import java.util.Random; - public class InitVillager{ - public static ChestGenHooks jamHouseChest; + public static final String JAM_HOUSE_CHEST_NAME = ModUtil.MOD_ID_LOWER+".jamHouseChest"; public static void init(){ Util.logInfo("Initializing Village Addons..."); if(ConfigBoolValues.JAM_VILLAGER_EXISTS.isEnabled()){ - - int jamID = ConfigIntValues.JAM_VILLAGER_ID.getValue(); - VillagerRegistry.instance().registerVillagerId(jamID); - VillagerRegistry.instance().registerVillageTradeHandler(jamID, new JamVillagerTradeHandler()); - - jamHouseChest = new ChestGenHooks("JamHouse", new WeightedRandomChestContent[0], 5, 20); - for(int i = 0; i < TheJams.values().length; i++){ - jamHouseChest.addItem(new WeightedRandomChestContent(new ItemStack(InitItems.itemJams, new Random().nextInt(5)+1, i), 1, 1, 15)); - } - jamHouseChest.addItem(new WeightedRandomChestContent(new ItemStack(Items.glass_bottle, new Random().nextInt(5)+1), 1, 1, 15)); - jamHouseChest.addItem(new WeightedRandomChestContent(new ItemStack(Items.potionitem, new Random().nextInt(5)+1), 1, 1, 15)); - - VillagerRegistry.instance().registerVillageCreationHandler(new VillageJamHouseHandler()); - MapGenStructureIO.func_143031_a(VillageComponentJamHouse.class, ModUtil.MOD_ID_LOWER + ":jamHouseStructure"); + initJamVillagePart(); } } + private static void initJamVillagePart(){ + int jamID = ConfigIntValues.JAM_VILLAGER_ID.getValue(); + VillagerRegistry.instance().registerVillagerId(jamID); + VillagerRegistry.instance().registerVillageTradeHandler(jamID, new JamVillagerTradeHandler()); + + ChestGenHooks jamHouseChest = ChestGenHooks.getInfo(JAM_HOUSE_CHEST_NAME); + jamHouseChest.setMin(5); + jamHouseChest.setMax(20); + for(int i = 0; i < TheJams.values().length; i++){ + ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(InitItems.itemJams, 1, i), 1, 1, 10)); + } + ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(Items.glass_bottle), 1, 2, 30)); + ChestGenHooks.addItem(JAM_HOUSE_CHEST_NAME, new WeightedRandomChestContent(new ItemStack(Items.potionitem), 1, 1, 20)); + + VillagerRegistry.instance().registerVillageCreationHandler(new VillageJamHouseHandler()); + MapGenStructureIO.func_143031_a(VillageComponentJamHouse.class, ModUtil.MOD_ID_LOWER+":jamHouseStructure"); + } + } diff --git a/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java b/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java index 7241492df..dfc349da1 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/VillageComponentJamHouse.java @@ -10,6 +10,7 @@ import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; import net.minecraft.world.gen.structure.StructureComponent; import net.minecraft.world.gen.structure.StructureVillagePieces; +import net.minecraftforge.common.ChestGenHooks; import java.util.List; import java.util.Random; @@ -49,8 +50,8 @@ public class VillageComponentJamHouse extends StructureVillagePieces.House1{ for (int i = 0; i < xSize; i++){ for(int j = 0; j < zSize; j++){ - this.clearCurrentPositionBlocksUpwards(world, j, ySize, i, sbb); - this.func_151554_b(world, Blocks.cobblestone, 0, j, 0, i, sbb); + this.clearCurrentPositionBlocksUpwards(world, i, ySize, j, sbb); + this.func_151554_b(world, Blocks.cobblestone, 0, i, -1, j, sbb); } } @@ -163,12 +164,9 @@ public class VillageComponentJamHouse extends StructureVillagePieces.House1{ //Loot Chest this.placeBlockAtCurrentPosition(world, Blocks.chest, 0, 8, 1, 6, sbb); - int posX = this.getXWithOffset(8, 6); - int posY = this.getYWithOffset(1); - int posZ = this.getZWithOffset(8, 6); - TileEntity chest = world.getTileEntity(posX, posY, posZ); + TileEntity chest = world.getTileEntity(this.getXWithOffset(8, 6), this.getYWithOffset(1), this.getZWithOffset(8, 6)); if(chest != null && chest instanceof TileEntityChest){ - WeightedRandomChestContent.generateChestContents(rand, InitVillager.jamHouseChest.getItems(rand), (TileEntityChest)chest, InitVillager.jamHouseChest.getCount(rand)); + WeightedRandomChestContent.generateChestContents(rand, ChestGenHooks.getItems(InitVillager.JAM_HOUSE_CHEST_NAME, rand), (TileEntityChest)chest, ChestGenHooks.getCount(InitVillager.JAM_HOUSE_CHEST_NAME, rand)); } //Torches diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java index 23ba136db..cd6c5427a 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerCoffeeMachine.java @@ -15,6 +15,9 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidContainerRegistry; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; @InventoryContainer public class ContainerCoffeeMachine extends Container{ @@ -24,6 +27,7 @@ public class ContainerCoffeeMachine extends Container{ private int lastCoffeeAmount; private int lastEnergyAmount; private int lastBrewTime; + private int lastWaterAmount; public ContainerCoffeeMachine(InventoryPlayer inventory, TileEntityBase tile){ this.machine = (TileEntityCoffeeMachine)tile; @@ -38,6 +42,9 @@ public class ContainerCoffeeMachine extends Container{ } } + this.addSlotToContainer(new Slot(machine, TileEntityCoffeeMachine.SLOT_WATER_INPUT, 26, 73)); + this.addSlotToContainer(new SlotOutput(machine, TileEntityCoffeeMachine.SLOT_WATER_OUTPUT, 45, 73)); + for (int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18)); @@ -54,6 +61,7 @@ public class ContainerCoffeeMachine extends Container{ iCraft.sendProgressBarUpdate(this, 0, this.machine.storage.getEnergyStored()); iCraft.sendProgressBarUpdate(this, 1, this.machine.coffeeCacheAmount); iCraft.sendProgressBarUpdate(this, 2, this.machine.brewTime); + iCraft.sendProgressBarUpdate(this, 3, this.machine.tank.getFluidAmount()); } @@ -66,11 +74,13 @@ public class ContainerCoffeeMachine extends Container{ if(this.lastEnergyAmount != this.machine.storage.getEnergyStored()) iCraft.sendProgressBarUpdate(this, 0, this.machine.storage.getEnergyStored()); if(this.lastCoffeeAmount != this.machine.coffeeCacheAmount) iCraft.sendProgressBarUpdate(this, 1, this.machine.coffeeCacheAmount); if(this.lastBrewTime != this.machine.brewTime) iCraft.sendProgressBarUpdate(this, 2, this.machine.brewTime); + if(this.lastWaterAmount != this.machine.tank.getFluidAmount()) iCraft.sendProgressBarUpdate(this, 3, this.machine.tank.getFluidAmount()); } this.lastEnergyAmount = this.machine.storage.getEnergyStored(); this.lastCoffeeAmount = this.machine.coffeeCacheAmount; this.lastBrewTime = this.machine.brewTime; + this.lastWaterAmount = this.machine.tank.getFluidAmount(); } @Override @@ -79,6 +89,7 @@ public class ContainerCoffeeMachine extends Container{ if(par1 == 0) this.machine.storage.setEnergyStored(par2); if(par1 == 1) this.machine.coffeeCacheAmount = par2; if(par1 == 2) this.machine.brewTime = par2; + if(par1 == 3) this.machine.tank.setFluid(new FluidStack(FluidRegistry.WATER, par2)); } @Override @@ -88,7 +99,7 @@ public class ContainerCoffeeMachine extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = 11; + final int inventoryStart = 13; final int inventoryEnd = inventoryStart+26; final int hotbarStart = inventoryEnd+1; final int hotbarEnd = hotbarStart+8; @@ -109,6 +120,9 @@ public class ContainerCoffeeMachine extends Container{ if(ItemCoffee.getIngredientFromStack(newStack) != null){ this.mergeItemStack(newStack, 3, 10, false); } + if(FluidContainerRegistry.containsFluid(newStack, new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME))){ + this.mergeItemStack(newStack, TileEntityCoffeeMachine.SLOT_WATER_INPUT, TileEntityCoffeeMachine.SLOT_WATER_INPUT+1, false); + } } if(slot <= hotbarEnd && slot >= hotbarStart){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java index e81b1d0af..1eb7a3952 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerGrinder.java @@ -3,7 +3,7 @@ package ellpeck.actuallyadditions.inventory; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.inventory.slot.SlotOutput; -import ellpeck.actuallyadditions.recipe.GrinderRecipes; +import ellpeck.actuallyadditions.recipe.GrinderRecipeManualRegistry; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityGrinder; import invtweaks.api.container.InventoryContainer; @@ -104,7 +104,7 @@ public class ContainerGrinder extends Container{ if(currentStack.getItem() != null){ if(slot <= hotbarEnd && slot >= inventoryStart){ - if(GrinderRecipes.getOutput(currentStack, false) != null){ + if(GrinderRecipeManualRegistry.getOutput(currentStack, false) != null){ this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_1, TileEntityGrinder.SLOT_INPUT_1+1, false); if(this.isDouble) this.mergeItemStack(newStack, TileEntityGrinder.SLOT_INPUT_2, TileEntityGrinder.SLOT_INPUT_2+1, false); } diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java index 8b20a09f0..89893d4aa 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/ContainerInputter.java @@ -20,14 +20,15 @@ public class ContainerInputter extends Container{ private TileEntityInputter tileInputter; private int lastSideToPut; - private int lastSlotToPut; private int lastSideToPull; - private int lastSlotToPull; - private int lastPlaceToPutSlotAmount; - private int lastPlaceToPullSlotAmount; private int lastIsPullWhitelist; private int lastIsPutWhitelist; + private int lastSlotPutStart; + private int lastSlotPutEnd; + private int lastSlotPullStart; + private int lastSlotPullEnd; + private boolean isAdvanced; public ContainerInputter(InventoryPlayer inventory, TileEntityBase tile, boolean isAdvanced){ @@ -48,11 +49,11 @@ public class ContainerInputter extends Container{ for(int i = 0; i < 3; i++){ for (int j = 0; j < 9; j++){ - this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18 + (isAdvanced ? 12+GuiInputter.OFFSET_ADVANCED : 0))); + this.addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 97 + i * 18 + (isAdvanced ? GuiInputter.OFFSET_ADVANCED : 0))); } } for(int i = 0; i < 9; i++){ - this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155 + (isAdvanced ? 12+GuiInputter.OFFSET_ADVANCED : 0))); + this.addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 155 + (isAdvanced ? GuiInputter.OFFSET_ADVANCED : 0))); } } @@ -60,13 +61,14 @@ public class ContainerInputter extends Container{ public void addCraftingToCrafters(ICrafting iCraft){ super.addCraftingToCrafters(iCraft); iCraft.sendProgressBarUpdate(this, 0, this.tileInputter.sideToPut); - iCraft.sendProgressBarUpdate(this, 1, this.tileInputter.slotToPut); - iCraft.sendProgressBarUpdate(this, 2, this.tileInputter.sideToPull); - iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.slotToPull); - iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.placeToPullSlotAmount); - iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.placeToPutSlotAmount); - iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.isPullWhitelist ? 1 : 0); - iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.isPutWhitelist ? 1 : 0); + iCraft.sendProgressBarUpdate(this, 1, this.tileInputter.sideToPull); + iCraft.sendProgressBarUpdate(this, 2, this.tileInputter.isPullWhitelist ? 1 : 0); + iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.isPutWhitelist ? 1 : 0); + + iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.slotToPutStart); + iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.slotToPutEnd); + iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.slotToPullStart); + iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.slotToPullEnd); } @Override @@ -75,37 +77,39 @@ public class ContainerInputter extends Container{ for(Object crafter : this.crafters){ ICrafting iCraft = (ICrafting)crafter; if(this.lastSideToPut != this.tileInputter.sideToPut) iCraft.sendProgressBarUpdate(this, 0, this.tileInputter.sideToPut); - if(this.lastSlotToPut != this.tileInputter.slotToPut) iCraft.sendProgressBarUpdate(this, 1, this.tileInputter.slotToPut); - if(this.lastSideToPull != this.tileInputter.sideToPull) iCraft.sendProgressBarUpdate(this, 2, this.tileInputter.sideToPull); - if(this.lastSlotToPull != this.tileInputter.slotToPull) iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.slotToPull); - if(this.lastPlaceToPullSlotAmount != this.tileInputter.placeToPullSlotAmount) iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.placeToPullSlotAmount); - if(this.lastPlaceToPutSlotAmount != this.tileInputter.placeToPutSlotAmount) iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.placeToPutSlotAmount); - if(this.lastIsPullWhitelist != (this.tileInputter.isPullWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.isPullWhitelist ? 1 : 0); - if(this.lastIsPutWhitelist != (this.tileInputter.isPutWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.isPutWhitelist ? 1 : 0); + if(this.lastSideToPull != this.tileInputter.sideToPull) iCraft.sendProgressBarUpdate(this, 1, this.tileInputter.sideToPull); + if(this.lastIsPullWhitelist != (this.tileInputter.isPullWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 2, this.tileInputter.isPullWhitelist ? 1 : 0); + if(this.lastIsPutWhitelist != (this.tileInputter.isPutWhitelist ? 1 : 0)) iCraft.sendProgressBarUpdate(this, 3, this.tileInputter.isPutWhitelist ? 1 : 0); + + if(this.lastSlotPutStart != this.tileInputter.slotToPutStart) iCraft.sendProgressBarUpdate(this, 4, this.tileInputter.slotToPutStart); + if(this.lastSlotPutEnd != this.tileInputter.slotToPutEnd) iCraft.sendProgressBarUpdate(this, 5, this.tileInputter.slotToPutEnd); + if(this.lastSlotPullStart != this.tileInputter.slotToPullStart) iCraft.sendProgressBarUpdate(this, 6, this.tileInputter.slotToPullStart); + if(this.lastSlotPullEnd != this.tileInputter.slotToPullEnd) iCraft.sendProgressBarUpdate(this, 7, this.tileInputter.slotToPullEnd); } this.lastSideToPut = this.tileInputter.sideToPut; - this.lastSlotToPut = this.tileInputter.slotToPut; this.lastSideToPull = this.tileInputter.sideToPull; - this.lastSlotToPull = this.tileInputter.slotToPull; - this.lastPlaceToPullSlotAmount = this.tileInputter.placeToPullSlotAmount; - this.lastPlaceToPutSlotAmount = this.tileInputter.placeToPutSlotAmount; this.lastIsPutWhitelist = this.tileInputter.isPutWhitelist ? 1 : 0; this.lastIsPullWhitelist = this.tileInputter.isPullWhitelist ? 1 : 0; + this.lastSlotPutStart = this.tileInputter.slotToPutStart; + this.lastSlotPutEnd = this.tileInputter.slotToPutEnd; + this.lastSlotPullStart = this.tileInputter.slotToPullStart; + this.lastSlotPullEnd = this.tileInputter.slotToPullEnd; } @Override @SideOnly(Side.CLIENT) public void updateProgressBar(int par1, int par2){ if(par1 == 0) this.tileInputter.sideToPut = par2; - if(par1 == 1) this.tileInputter.slotToPut = par2; - if(par1 == 2) this.tileInputter.sideToPull = par2; - if(par1 == 3) this.tileInputter.slotToPull = par2; - if(par1 == 4) this.tileInputter.placeToPullSlotAmount = par2; - if(par1 == 5) this.tileInputter.placeToPutSlotAmount = par2; - if(par1 == 6) this.tileInputter.isPullWhitelist = par2 == 1; - if(par1 == 7) this.tileInputter.isPutWhitelist = par2 == 1; + if(par1 == 1) this.tileInputter.sideToPull = par2; + if(par1 == 2) this.tileInputter.isPullWhitelist = par2 == 1; + if(par1 == 3) this.tileInputter.isPutWhitelist = par2 == 1; + + if(par1 == 4) this.tileInputter.slotToPutStart = par2; + if(par1 == 5) this.tileInputter.slotToPutEnd = par2; + if(par1 == 6) this.tileInputter.slotToPullStart = par2; + if(par1 == 7) this.tileInputter.slotToPullEnd = par2; } @Override @@ -115,10 +119,10 @@ public class ContainerInputter extends Container{ @Override public ItemStack transferStackInSlot(EntityPlayer player, int slot){ - final int inventoryStart = this.isAdvanced ? 25 : 1; - final int inventoryEnd = inventoryStart+26; - final int hotbarStart = inventoryEnd+1; - final int hotbarEnd = hotbarStart+8; + final int inventory = this.isAdvanced ? 25 : 1; + final int inventoryEnd = inventory+26; + final int hotbar = inventoryEnd+1; + final int hotbarEnd = hotbar+8; Slot theSlot = (Slot)this.inventorySlots.get(slot); if(theSlot.getHasStack()){ @@ -126,20 +130,20 @@ public class ContainerInputter extends Container{ ItemStack newStack = currentStack.copy(); if(currentStack.getItem() != null){ - if(slot <= hotbarEnd && slot >= inventoryStart){ + if(slot <= hotbarEnd && slot >= inventory){ this.mergeItemStack(newStack, 0, 1, false); } - if(slot <= hotbarEnd && slot >= hotbarStart){ - this.mergeItemStack(newStack, inventoryStart, inventoryEnd, false); + if(slot <= hotbarEnd && slot >= hotbar){ + this.mergeItemStack(newStack, inventory, inventoryEnd, false); } - else if(slot <= inventoryEnd && slot >= inventoryStart){ - this.mergeItemStack(newStack, hotbarStart, hotbarEnd, false); + else if(slot <= inventoryEnd && slot >= inventory){ + this.mergeItemStack(newStack, hotbar, hotbarEnd, false); } - else if(slot < inventoryStart){ - this.mergeItemStack(newStack, inventoryStart, hotbarEnd, false); + else if(slot < inventory){ + this.mergeItemStack(newStack, inventory, hotbarEnd, false); } if(newStack.stackSize == 0) theSlot.putStack(null); diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java index be2fc918f..fb48794bd 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiCoffeeMachine.java @@ -17,6 +17,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.FluidRegistry; import org.lwjgl.opengl.GL11; import java.util.Collections; @@ -49,7 +50,7 @@ public class GuiCoffeeMachine extends GuiContainer{ public void initGui(){ super.initGui(); - GuiButton buttonOkay = new GuiButton(0, guiLeft+60, guiTop+11, 58, 20, "OK"); + GuiButton buttonOkay = new GuiButton(0, guiLeft+60, guiTop+11, 58, 20, StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.ok")); this.buttonList.add(buttonOkay); } @@ -75,7 +76,11 @@ public class GuiCoffeeMachine extends GuiContainer{ if(this.machine.getEnergyStored(ForgeDirection.UNKNOWN) > 0){ int i = this.machine.getEnergyScaled(83); - drawTexturedModalRect(this.guiLeft+17, this.guiTop+89-i, 176, 0, 16, i); + drawTexturedModalRect(this.guiLeft+17, this.guiTop+89-i, 176, 0, 6, i); + } + if(this.machine.tank.getFluidAmount() > 0){ + int i = this.machine.getWaterScaled(64); + drawTexturedModalRect(this.guiLeft+27, this.guiTop+70-i, 182, 0, 6, i); } if(this.machine.coffeeCacheAmount > 0){ @@ -97,9 +102,13 @@ public class GuiCoffeeMachine extends GuiContainer{ super.drawScreen(x, y, f); String text1 = this.machine.getEnergyStored(ForgeDirection.UNKNOWN) + "/" + this.machine.getMaxEnergyStored(ForgeDirection.UNKNOWN) + " RF"; - if(x >= guiLeft+16 && y >= guiTop+5 && x <= guiLeft+33 && y <= guiTop+89){ + if(x >= guiLeft+16 && y >= guiTop+5 && x <= guiLeft+23 && y <= guiTop+89){ this.func_146283_a(Collections.singletonList(text1), x, y); } + String text3 = this.machine.tank.getFluidAmount() + "/" + this.machine.tank.getCapacity() + " mB "+StatCollector.translateToLocal(FluidRegistry.WATER.getUnlocalizedName()); + if(x >= guiLeft+27 && y >= guiTop+5 && x <= guiLeft+33 && y <= guiTop+70){ + this.func_146283_a(Collections.singletonList(text3), x, y); + } String text2 = this.machine.coffeeCacheAmount + "/" + this.machine.coffeeCacheMaxAmount+" "+StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.coffee"); if(x >= guiLeft+40 && y >= guiTop+25 && x <= guiLeft+49 && y <= guiTop+56){ diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java index aee9220ef..e98a4d800 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiFeeder.java @@ -19,7 +19,7 @@ import java.util.Arrays; public class GuiFeeder extends GuiContainer{ private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiFeeder"); - private TileEntityFeeder tileFeeder; + public TileEntityFeeder tileFeeder; public int loveCounter; diff --git a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java index e5570d9c1..846ee6806 100644 --- a/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/inventory/gui/GuiInputter.java @@ -5,20 +5,22 @@ import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.inventory.ContainerInputter; import ellpeck.actuallyadditions.network.PacketHandler; import ellpeck.actuallyadditions.network.gui.PacketGuiButton; +import ellpeck.actuallyadditions.network.gui.PacketGuiNumber; import ellpeck.actuallyadditions.tile.TileEntityBase; import ellpeck.actuallyadditions.tile.TileEntityInputter; import ellpeck.actuallyadditions.util.AssetUtil; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.StringUtil; import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.OpenGlHelper; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import net.minecraft.world.World; +import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; import java.util.Collections; @@ -29,33 +31,34 @@ public class GuiInputter extends GuiContainer{ private static final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiInputter"); private static final ResourceLocation resLocAdvanced = AssetUtil.getGuiLocation("guiInputterAdvanced"); - private TileEntityInputter tileInputter; + public TileEntityInputter tileInputter; private int x; private int y; private int z; private World world; - private SmallerButton buttonSlotPutP; - private SmallerButton buttonSlotPullP; - private SmallerButton buttonSlotPutM; - private SmallerButton buttonSlotPullM; - private SmallerButton whitelistPut; private SmallerButton whitelistPull; + private GuiTextField fieldPutStart; + private GuiTextField fieldPutEnd; + + private GuiTextField fieldPullStart; + private GuiTextField fieldPullEnd; + private boolean isAdvanced; - public static final int OFFSET_ADVANCED = 35; + public static final int OFFSET_ADVANCED = 12+36; public static final String[] sideString = new String[]{ - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.disabled"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.up"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.down"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.north"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.east"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.south"), - StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.west")}; + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.disabled"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.up"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.down"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.north"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.east"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.south"), + StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.west")}; public GuiInputter(InventoryPlayer inventory, TileEntityBase tile, int x, int y, int z, World world, boolean isAdvanced){ super(new ContainerInputter(inventory, tile, isAdvanced)); @@ -65,7 +68,7 @@ public class GuiInputter extends GuiContainer{ this.z = z; this.world = world; this.xSize = 176; - this.ySize = 93+86 + (isAdvanced ? 12+OFFSET_ADVANCED : 0); + this.ySize = 93+86+(isAdvanced ? OFFSET_ADVANCED : 0); this.isAdvanced = isAdvanced; } @@ -74,36 +77,105 @@ public class GuiInputter extends GuiContainer{ AssetUtil.displayNameString(this.fontRendererObj, xSize, -10, this.tileInputter.getInventoryName()); } + @Override + public void updateScreen(){ + super.updateScreen(); + + this.fieldPutStart.updateCursorCounter(); + this.fieldPutEnd.updateCursorCounter(); + this.fieldPullStart.updateCursorCounter(); + this.fieldPullEnd.updateCursorCounter(); + } + @SuppressWarnings("unchecked") @Override public void initGui(){ super.initGui(); - SmallerButton buttonSidePutP = new SmallerButton(0, guiLeft + 155, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), ">"); - SmallerButton buttonSidePutM = new SmallerButton(1, guiLeft + 90, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "<"); - buttonSlotPutP = new SmallerButton(2, guiLeft+ 155, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "+"); - buttonSlotPutM = new SmallerButton(3, guiLeft + 90, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "-"); + this.fieldPullStart = new GuiTextField(this.fontRendererObj, guiLeft+13, guiTop+80+(isAdvanced ? OFFSET_ADVANCED : 0), 27, 8); + this.fieldPullStart.setMaxStringLength(4); + this.fieldPullStart.setEnableBackgroundDrawing(false); + this.fieldPullEnd = new GuiTextField(this.fontRendererObj, guiLeft+50, guiTop+80+(isAdvanced ? OFFSET_ADVANCED : 0), 27, 8); + this.fieldPullEnd.setMaxStringLength(4); + this.fieldPullEnd.setEnableBackgroundDrawing(false); - SmallerButton buttonSidePullP = new SmallerButton(4, guiLeft + 70, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), ">"); - SmallerButton buttonSidePullM = new SmallerButton(5, guiLeft + 5, guiTop + 43 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "<"); - buttonSlotPullP = new SmallerButton(6, guiLeft + 70, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "+"); - buttonSlotPullM = new SmallerButton(7, guiLeft + 5, guiTop + 64 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), "-"); + this.fieldPutStart = new GuiTextField(this.fontRendererObj, guiLeft+98, guiTop+80+(isAdvanced ? OFFSET_ADVANCED : 0), 27, 8); + this.fieldPutStart.setMaxStringLength(4); + this.fieldPutStart.setEnableBackgroundDrawing(false); + this.fieldPutEnd = new GuiTextField(this.fontRendererObj, guiLeft+135, guiTop+80+(isAdvanced ? OFFSET_ADVANCED : 0), 27, 8); + this.fieldPutEnd.setMaxStringLength(4); + this.fieldPutEnd.setEnableBackgroundDrawing(false); + + SmallerButton buttonSidePutP = new SmallerButton(0, guiLeft+155, guiTop+43+(isAdvanced ? OFFSET_ADVANCED : 0), ">"); + SmallerButton buttonSidePutM = new SmallerButton(1, guiLeft+90, guiTop+43+(isAdvanced ? OFFSET_ADVANCED : 0), "<"); + + SmallerButton buttonSidePullP = new SmallerButton(2, guiLeft+70, guiTop+43+(isAdvanced ? OFFSET_ADVANCED : 0), ">"); + SmallerButton buttonSidePullM = new SmallerButton(3, guiLeft+5, guiTop+43+(isAdvanced ? OFFSET_ADVANCED : 0), "<"); whitelistPull = new SmallerButton(TileEntityInputter.WHITELIST_PULL_BUTTON_ID, guiLeft+3, guiTop+16, ""); whitelistPut = new SmallerButton(TileEntityInputter.WHITELIST_PUT_BUTTON_ID, guiLeft+157, guiTop+16, ""); this.buttonList.add(buttonSidePutP); - this.buttonList.add(buttonSlotPutP); this.buttonList.add(buttonSidePullP); - this.buttonList.add(buttonSlotPullP); this.buttonList.add(buttonSidePutM); - this.buttonList.add(buttonSlotPutM); this.buttonList.add(buttonSidePullM); - this.buttonList.add(buttonSlotPullM); if(this.isAdvanced){ this.buttonList.add(whitelistPut); this.buttonList.add(whitelistPull); } + + this.buttonList.add(new TinyButton(TileEntityInputter.OKAY_BUTTON_ID, guiLeft+84, guiTop+80+(isAdvanced ? OFFSET_ADVANCED : 0))); + } + + @Override + protected void mouseClicked(int par1, int par2, int par3){ + this.fieldPutStart.mouseClicked(par1, par2, par3); + this.fieldPutEnd.mouseClicked(par1, par2, par3); + this.fieldPullStart.mouseClicked(par1, par2, par3); + this.fieldPullEnd.mouseClicked(par1, par2, par3); + + super.mouseClicked(par1, par2, par3); + } + + @Override + public void keyTyped(char theChar, int key){ + if((!fieldPutStart.isFocused() && !fieldPutEnd.isFocused() && !fieldPullStart.isFocused() && !fieldPullEnd.isFocused())){ + super.keyTyped(theChar, key); + } + + if(key == Keyboard.KEY_RETURN || key == Keyboard.KEY_NUMPADENTER){ + if(this.fieldPutStart.isFocused()) this.setVariable(this.fieldPutStart, 0); + if(this.fieldPutEnd.isFocused()) this.setVariable(this.fieldPutEnd, 1); + if(this.fieldPullStart.isFocused()) this.setVariable(this.fieldPullStart, 2); + if(this.fieldPullEnd.isFocused()) this.setVariable(this.fieldPullEnd, 3); + } + + if(Character.isDigit(theChar) || key == Keyboard.KEY_BACK || key == Keyboard.KEY_DELETE || key == Keyboard.KEY_LEFT || key == Keyboard.KEY_RIGHT){ + this.fieldPutStart.textboxKeyTyped(theChar, key); + this.fieldPutEnd.textboxKeyTyped(theChar, key); + this.fieldPullStart.textboxKeyTyped(theChar, key); + this.fieldPullEnd.textboxKeyTyped(theChar, key); + } + } + + public void setVariable(GuiTextField field, int sendInt){ + if(!field.getText().isEmpty()){ + this.sendPacket(parse(field.getText()), sendInt); + field.setText(""); + } + } + + private int parse(String theInt){ + try{ + return Integer.parseInt(theInt); + } + catch(Exception e){ + return -1; + } + } + + private void sendPacket(int text, int textID){ + PacketHandler.theNetwork.sendToServer(new PacketGuiNumber(x, y, z, world, text, textID, Minecraft.getMinecraft().thePlayer)); } @Override @@ -111,31 +183,32 @@ public class GuiInputter extends GuiContainer{ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.getTextureManager().bindTexture(AssetUtil.GUI_INVENTORY_LOCATION); - this.drawTexturedModalRect(this.guiLeft, this.guiTop+93 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 0, 0, 176, 86); + this.drawTexturedModalRect(this.guiLeft, this.guiTop+93+(isAdvanced ? OFFSET_ADVANCED : 0), 0, 0, 176, 86); this.mc.getTextureManager().bindTexture(this.isAdvanced ? resLocAdvanced : resLoc); - this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93 + (isAdvanced ? 12+OFFSET_ADVANCED : 0)); + this.drawTexturedModalRect(this.guiLeft, this.guiTop, 0, 0, 176, 93+(isAdvanced ? OFFSET_ADVANCED : 0)); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.pull"), guiLeft + 22 + 3, guiTop + 32 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.put"), guiLeft + 107 + 3, guiTop + 32 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), 4210752); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.pull"), guiLeft+22+3, guiTop+32+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); + this.fontRendererObj.drawString(StatCollector.translateToLocal("info."+ModUtil.MOD_ID_LOWER+".gui.put"), guiLeft+107+3, guiTop+32+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); - this.fontRendererObj.drawString(sideString[tileInputter.sideToPull+1], guiLeft + 24 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPull == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPull).toString(), guiLeft + 24 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); + this.fontRendererObj.drawString(sideString[tileInputter.sideToPull+1], guiLeft+24+1, guiTop+45+3+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); + this.fontRendererObj.drawString(sideString[tileInputter.sideToPut+1], guiLeft+109+1, guiTop+45+3+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); - this.fontRendererObj.drawString(sideString[tileInputter.sideToPut+1], guiLeft + 109 + 1, guiTop + 45 + 3 + (isAdvanced ? 12+36 : 0), 4210752); - this.fontRendererObj.drawString(StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.slot") + " " + (tileInputter.slotToPut == -1 ? StatCollector.translateToLocal("info." + ModUtil.MOD_ID_LOWER + ".gui.all") : tileInputter.slotToPut).toString(), guiLeft + 109 + 3, guiTop + 66 + 3 + (isAdvanced ? 12+OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_GRAY_TEXT); + this.fontRendererObj.drawString(Integer.toString(this.tileInputter.slotToPutStart), guiLeft+99, guiTop+67+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_WHITE); + this.fontRendererObj.drawString(Integer.toString(this.tileInputter.slotToPutEnd), guiLeft+136, guiTop+67+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_WHITE); + this.fontRendererObj.drawString(Integer.toString(this.tileInputter.slotToPullStart), guiLeft+14, guiTop+67+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_WHITE); + this.fontRendererObj.drawString(Integer.toString(this.tileInputter.slotToPullEnd), guiLeft+51, guiTop+67+(isAdvanced ? OFFSET_ADVANCED : 0), StringUtil.DECIMAL_COLOR_WHITE); + + this.fieldPutStart.drawTextBox(); + this.fieldPutEnd.drawTextBox(); + this.fieldPullStart.drawTextBox(); + this.fieldPullEnd.drawTextBox(); } @Override public void drawScreen(int x, int y, float f){ super.drawScreen(x, y, f); - this.buttonSlotPullP.enabled = this.tileInputter.placeToPullSlotAmount > 0; - this.buttonSlotPullM.enabled = this.tileInputter.placeToPullSlotAmount > 0; - - this.buttonSlotPutP.enabled = this.tileInputter.placeToPutSlotAmount > 0; - this.buttonSlotPutM.enabled = this.tileInputter.placeToPutSlotAmount > 0; - this.whitelistPull.displayString = this.tileInputter.isPullWhitelist ? "O" : "X"; this.whitelistPut.displayString = this.tileInputter.isPutWhitelist ? "O" : "X"; @@ -153,7 +226,14 @@ public class GuiInputter extends GuiContainer{ @Override public void actionPerformed(GuiButton button){ - PacketHandler.theNetwork.sendToServer(new PacketGuiButton(x, y, z, world, button.id, Minecraft.getMinecraft().thePlayer)); + if(button.id == TileEntityInputter.OKAY_BUTTON_ID){ + this.setVariable(this.fieldPutStart, 0); + this.setVariable(this.fieldPutEnd, 1); + this.setVariable(this.fieldPullStart, 2); + this.setVariable(this.fieldPullEnd, 3); + } + else + PacketHandler.theNetwork.sendToServer(new PacketGuiButton(x, y, z, world, button.id, Minecraft.getMinecraft().thePlayer)); } public static class SmallerButton extends GuiButton{ @@ -166,11 +246,10 @@ public class GuiInputter extends GuiContainer{ @Override public void drawButton(Minecraft mc, int x, int y){ - if (this.visible){ - FontRenderer renderer = mc.fontRenderer; + if(this.visible){ mc.getTextureManager().bindTexture(resLoc); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - this.field_146123_n = x >= this.xPosition && y >= this.yPosition && x < this.xPosition + this.width && y < this.yPosition + this.height; + this.field_146123_n = x >= this.xPosition && y >= this.yPosition && x < this.xPosition+this.width && y < this.yPosition+this.height; int k = this.getHoverState(this.field_146123_n); GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); @@ -179,13 +258,36 @@ public class GuiInputter extends GuiContainer{ this.mouseDragged(mc, x, y); int color = 14737632; - if (packedFGColour != 0) color = packedFGColour; - else if (!this.enabled) color = 10526880; - else if (this.field_146123_n) color = 16777120; + if(packedFGColour != 0) color = packedFGColour; + else if(!this.enabled) color = 10526880; + else if(this.field_146123_n) color = 16777120; - this.drawCenteredString(renderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height-8) / 2, color); + this.drawCenteredString(mc.fontRenderer, this.displayString, this.xPosition+this.width/2, this.yPosition+(this.height-8)/2, color); } } } + public static class TinyButton extends GuiButton{ + + public final ResourceLocation resLoc = AssetUtil.getGuiLocation("guiInputter"); + + public TinyButton(int id, int x, int y){ + super(id, x, y, 8, 8, ""); + } + + @Override + public void drawButton(Minecraft mc, int x, int y){ + if(this.visible){ + mc.getTextureManager().bindTexture(resLoc); + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + this.field_146123_n = x >= this.xPosition && y >= this.yPosition && x < this.xPosition+this.width && y < this.yPosition+this.height; + int k = this.getHoverState(this.field_146123_n); + GL11.glEnable(GL11.GL_BLEND); + OpenGlHelper.glBlendFunc(770, 771, 1, 0); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + this.drawTexturedModalRect(this.xPosition, this.yPosition, 192, k*8, 8, 8); + this.mouseDragged(mc, x, y); + } + } + } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java index 8340eb3c9..388eca358 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/InitItems.java +++ b/src/main/java/ellpeck/actuallyadditions/items/InitItems.java @@ -5,7 +5,7 @@ import ellpeck.actuallyadditions.items.metalists.TheFoods; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.items.tools.*; import ellpeck.actuallyadditions.material.InitItemMaterials; -import ellpeck.actuallyadditions.recipe.HairyBallHandler; +import ellpeck.actuallyadditions.util.CompatUtil; import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.Util; import net.minecraft.init.Blocks; @@ -13,9 +13,7 @@ import net.minecraft.init.Items; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraftforge.common.EnumPlantType; import net.minecraftforge.fluids.FluidContainerRegistry; -import powercrystals.minefactoryreloaded.api.FactoryRegistry; public class InitItems{ @@ -157,26 +155,25 @@ public class InitItems{ itemHairyBall = new ItemHairyBall(); ItemUtil.register(itemHairyBall); - HairyBallHandler.init(); itemCoffeeBean = new ItemCoffeeBean(); ItemUtil.register(itemCoffeeBean); - itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, Blocks.water, EnumPlantType.Water, itemFoods, TheFoods.RICE.ordinal()); + itemRiceSeed = new ItemSeed("itemRiceSeed", InitBlocks.blockRice, itemFoods, TheFoods.RICE.ordinal()); ItemUtil.register(itemRiceSeed); - FactoryRegistry.sendMessage("registerPlantable", itemRiceSeed); + CompatUtil.registerMFRSeed(itemRiceSeed); - itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, Blocks.grass, EnumPlantType.Plains, itemMisc, TheMiscItems.CANOLA.ordinal()); + itemCanolaSeed = new ItemSeed("itemCanolaSeed", InitBlocks.blockCanola, itemMisc, TheMiscItems.CANOLA.ordinal()); ItemUtil.register(itemCanolaSeed); - FactoryRegistry.sendMessage("registerPlantable", itemCanolaSeed); + CompatUtil.registerMFRSeed(itemCanolaSeed); - itemFlaxSeed = new ItemSeed("itemFlaxSeed", InitBlocks.blockFlax, Blocks.grass, EnumPlantType.Plains, Items.string, 0); + itemFlaxSeed = new ItemSeed("itemFlaxSeed", InitBlocks.blockFlax, Items.string, 0); ItemUtil.register(itemFlaxSeed); - FactoryRegistry.sendMessage("registerPlantable", itemFlaxSeed); + CompatUtil.registerMFRSeed(itemFlaxSeed); - itemCoffeeSeed = new ItemSeed("itemCoffeeSeed", InitBlocks.blockCoffee, Blocks.grass, EnumPlantType.Plains, itemCoffeeBean, 0); + itemCoffeeSeed = new ItemSeed("itemCoffeeSeed", InitBlocks.blockCoffee, itemCoffeeBean, 0); ItemUtil.register(itemCoffeeSeed); - FactoryRegistry.sendMessage("registerPlantable", itemCoffeeSeed); + CompatUtil.registerMFRSeed(itemCoffeeSeed); itemPickaxeEmerald = new ItemPickaxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemPickaxeEmerald", EnumRarity.rare); itemAxeEmerald = new ItemAxeAA(InitItemMaterials.toolMaterialEmerald, new ItemStack(Items.emerald), "itemAxeEmerald", EnumRarity.rare); diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index 1298809c3..98e8171d3 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.items; import cofh.api.energy.ItemEnergyContainer; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import cpw.mods.fml.relauncher.ReflectionHelper; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.ActuallyAdditions; @@ -35,6 +36,7 @@ import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.World; import org.apache.logging.log4j.Level; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -266,14 +268,14 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(this.getEnergyStored(stack) >= use){ Block block = world.getBlock(xPos, yPos, zPos); float hardness = block.getBlockHardness(world, xPos, yPos, zPos); - if(hardness > -1.0F && this.canHarvestBlock(block, stack)){ + if(hardness > -1.0F && ((x == xPos && y == yPos && z == zPos) || this.canHarvestBlock(block, stack))){ this.extractEnergy(stack, use, false); ArrayList drops = new ArrayList(); int meta = world.getBlockMetadata(xPos, yPos, zPos); if(block.canSilkHarvest(world, player, xPos, yPos, zPos, meta) && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.SILK_TOUCH)){ - drops.add(new ItemStack(block, 1, meta)); + addSilkDrops(drops, block, meta, world, player); } else{ int fortune = this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE) ? (this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FORTUNE_II) ? 3 : 1) : 0; @@ -299,6 +301,18 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ } } + public static void addSilkDrops(ArrayList drops, Block block, int meta, World world, EntityPlayer player){ + try{ + Method method = ReflectionHelper.findMethod(Block.class, block, new String[]{"createStackedBlock"}, int.class); + ItemStack silkDrop = (ItemStack)method.invoke(block, meta); + if(silkDrop != null) drops.add(silkDrop); + } + catch(Exception e){ + player.addChatComponentMessage(new ChatComponentText("Oh! That shouldn't have happened! Trying to get and use a private Method here might have bugged! Report this situation to the Mod Author ASAP!")); + ModUtil.LOGGER.log(Level.ERROR, "Player "+player.getDisplayName()+" who should break a Block using a Drill at "+player.posX+", "+player.posY+", "+player.posZ+" in World "+world.provider.dimensionId+" threw an Exception trying to get and use a private Method! Report this to the Mod Author ASAP!"); + } + } + @Override public String getName(){ return "itemDrill"; diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java index fa2b6d5cf..d052b3690 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemSeed.java @@ -7,84 +7,32 @@ import ellpeck.actuallyadditions.util.INameableItem; import ellpeck.actuallyadditions.util.ItemUtil; import ellpeck.actuallyadditions.util.ModUtil; import net.minecraft.block.Block; -import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; import net.minecraft.item.EnumRarity; import net.minecraft.item.Item; import net.minecraft.item.ItemSeeds; import net.minecraft.item.ItemStack; import net.minecraft.util.IIcon; -import net.minecraft.util.MovingObjectPosition; import net.minecraft.world.IBlockAccess; -import net.minecraft.world.World; -import net.minecraftforge.common.EnumPlantType; -import net.minecraftforge.common.util.BlockSnapshot; -import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.ForgeEventFactory; -import powercrystals.minefactoryreloaded.api.IFactoryPlantable; -import powercrystals.minefactoryreloaded.api.ReplacementBlock; import java.util.List; -public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlantable{ +public class ItemSeed extends ItemSeeds implements INameableItem{ public Block plant; - public Block soilBlock; - public EnumPlantType type; public String name; - public ItemSeed(String name, Block plant, Block soilBlock, EnumPlantType type, Item returnItem, int returnMeta){ - super(plant, soilBlock); + public ItemSeed(String name, Block plant, Item returnItem, int returnMeta){ + super(plant, Blocks.farmland); this.name = name; this.plant = plant; - this.soilBlock = soilBlock; - this.type = type; ((BlockPlant)this.plant).seedItem = this; ((BlockPlant)this.plant).returnItem = returnItem; ((BlockPlant)this.plant).returnMeta = returnMeta; } - @Override - public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int hitSide, float hitX, float hitY, float hitZ){ - if(this.type == EnumPlantType.Water || hitSide != 1) return false; - else if(player.canPlayerEdit(x, y, z, hitSide, stack) && player.canPlayerEdit(x, y + 1, z, hitSide, stack)){ - if(((BlockPlant)this.plant).canPlaceBlockOn(world.getBlock(x, y, z)) && world.isAirBlock(x, y + 1, z)){ - world.setBlock(x, y + 1, z, this.plant); - stack.stackSize--; - return true; - } - } - return false; - } - - @Override - public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player){ - if(this.type == EnumPlantType.Water){ - MovingObjectPosition pos = this.getMovingObjectPositionFromPlayer(world, player, true); - if(pos != null){ - if(pos.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK){ - int i = pos.blockX; - int j = pos.blockY; - int k = pos.blockZ; - - if(player.canPlayerEdit(i, j, k, pos.sideHit, stack)){ - if(world.getBlock(i, j, k).getMaterial() == Material.water && world.getBlockMetadata(i, j, k) == 0 && world.isAirBlock(i, j + 1, k)){ - BlockSnapshot snap = BlockSnapshot.getBlockSnapshot(world, i, j+1, k); - world.setBlock(i, j + 1, k, this.plant); - if(ForgeEventFactory.onPlayerBlockPlace(player, snap, ForgeDirection.UP).isCanceled()){ - snap.restore(true, false); - return super.onItemRightClick(stack, world, player); - } - stack.stackSize--; - } - } - } - } - } - return super.onItemRightClick(stack, world, player); - } - @Override public EnumRarity getRarity(ItemStack stack){ return EnumRarity.rare; @@ -107,11 +55,6 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta this.itemIcon = iconReg.registerIcon(ModUtil.MOD_ID_LOWER + ":" + this.getName()); } - @Override - public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z){ - return this.type; - } - @Override public Block getPlant(IBlockAccess world, int x, int y, int z){ return this.plant; @@ -131,34 +74,4 @@ public class ItemSeed extends ItemSeeds implements INameableItem, IFactoryPlanta public String getOredictName(){ return this.getName(); } - - @Override - public Item getSeed(){ - return this; - } - - @Override - public boolean canBePlanted(ItemStack stack, boolean forFermenting){ - return true; - } - - @Override - public ReplacementBlock getPlantedBlock(World world, int x, int y, int z, ItemStack stack){ - return new ReplacementBlock(this.plant); - } - - @Override - public boolean canBePlantedHere(World world, int x, int y, int z, ItemStack stack){ - return world.getBlock(x, y, z).isReplaceable(world, x, y, z) && ((BlockPlant)this.plant).canPlaceBlockOn(world.getBlock(x, y-1, z)); - } - - @Override - public void prePlant(World world, int x, int y, int z, ItemStack stack){ - - } - - @Override - public void postPlant(World world, int x, int y, int z, ItemStack stack){ - - } } \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java index b8c70d382..1d3acfaf8 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/CrusherRecipeHandler.java @@ -6,7 +6,7 @@ import codechicken.nei.PositionedStack; import codechicken.nei.recipe.RecipeInfo; import codechicken.nei.recipe.TemplateRecipeHandler; import ellpeck.actuallyadditions.inventory.gui.GuiGrinder; -import ellpeck.actuallyadditions.recipe.GrinderRecipes; +import ellpeck.actuallyadditions.recipe.GrinderRecipeManualRegistry; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.StringUtil; import net.minecraft.client.gui.inventory.GuiContainer; @@ -84,8 +84,8 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public void loadCraftingRecipes(String outputId, Object... results){ if(outputId.equals(NAME) && getClass() == CrusherRecipeHandler.class){ - ArrayList recipes = GrinderRecipes.recipes; - for(GrinderRecipes.GrinderRecipe recipe : recipes){ + ArrayList recipes = GrinderRecipeManualRegistry.recipes; + for(GrinderRecipeManualRegistry.GrinderRecipe recipe : recipes){ arecipes.add(new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance)); } } @@ -94,16 +94,16 @@ public class CrusherRecipeHandler extends TemplateRecipeHandler{ @Override public void loadCraftingRecipes(ItemStack result){ - ArrayList recipes = GrinderRecipes.recipes; - for(GrinderRecipes.GrinderRecipe recipe : recipes){ + ArrayList recipes = GrinderRecipeManualRegistry.recipes; + for(GrinderRecipeManualRegistry.GrinderRecipe recipe : recipes){ if(NEIServerUtils.areStacksSameType(recipe.firstOutput, result) || NEIServerUtils.areStacksSameType(recipe.secondOutput, result)) arecipes.add(new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance)); } } @Override public void loadUsageRecipes(ItemStack ingredient){ - ArrayList recipes = GrinderRecipes.recipes; - for(GrinderRecipes.GrinderRecipe recipe : recipes){ + ArrayList recipes = GrinderRecipeManualRegistry.recipes; + for(GrinderRecipeManualRegistry.GrinderRecipe recipe : recipes){ if(NEIServerUtils.areStacksSameTypeCrafting(recipe.input, ingredient)){ CachedCrush theRecipe = new CachedCrush(recipe.input, recipe.firstOutput, recipe.secondOutput, recipe.secondChance); theRecipe.setIngredientPermutation(Collections.singletonList(theRecipe.ingredient), ingredient); diff --git a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java index a6ccb00a6..d27279f5c 100644 --- a/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java +++ b/src/main/java/ellpeck/actuallyadditions/nei/NEIActuallyAdditionsConfig.java @@ -38,6 +38,7 @@ public class NEIActuallyAdditionsConfig implements IConfigureNEI{ API.hideItem(new ItemStack(InitBlocks.blockCanola)); API.hideItem(new ItemStack(InitBlocks.blockFlax)); API.hideItem(new ItemStack(InitBlocks.blockCoffee)); + API.hideItem(new ItemStack(InitBlocks.blockWildPlant, 1, Util.WILDCARD)); } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java index 23daabe01..e9e621138 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketHandler.java @@ -4,6 +4,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.network.simpleimpl.SimpleNetworkWrapper; import cpw.mods.fml.relauncher.Side; import ellpeck.actuallyadditions.network.gui.PacketGuiButton; +import ellpeck.actuallyadditions.network.gui.PacketGuiNumber; import ellpeck.actuallyadditions.util.ModUtil; public class PacketHandler{ @@ -16,5 +17,6 @@ public class PacketHandler{ theNetwork.registerMessage(PacketTileEntityFeeder.Handler.class, PacketTileEntityFeeder.class, 0, Side.CLIENT); theNetwork.registerMessage(PacketGuiButton.Handler.class, PacketGuiButton.class, 1, Side.SERVER); theNetwork.registerMessage(PacketFluidCollectorToClient.Handler.class, PacketFluidCollectorToClient.class, 2, Side.CLIENT); + theNetwork.registerMessage(PacketGuiNumber.Handler.class, PacketGuiNumber.class, 3, Side.SERVER); } } diff --git a/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java b/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java index 94fc10258..221667edb 100644 --- a/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java +++ b/src/main/java/ellpeck/actuallyadditions/network/PacketTileEntityFeeder.java @@ -60,10 +60,12 @@ public class PacketTileEntityFeeder implements IMessage{ if(tile instanceof TileEntityFeeder){ TileEntityFeeder tileFeeder = (TileEntityFeeder)tile; tileFeeder.feedAnimal((EntityAnimal)world.getEntityByID(message.animalID)); - } - if(Minecraft.getMinecraft().currentScreen instanceof GuiFeeder){ - ((GuiFeeder)Minecraft.getMinecraft().currentScreen).loveCounter++; + if(Minecraft.getMinecraft().currentScreen instanceof GuiFeeder){ + if(((GuiFeeder)Minecraft.getMinecraft().currentScreen).tileFeeder == tileFeeder){ + ((GuiFeeder)Minecraft.getMinecraft().currentScreen).loveCounter++; + } + } } return null; diff --git a/src/main/java/ellpeck/actuallyadditions/network/gui/INumberReactor.java b/src/main/java/ellpeck/actuallyadditions/network/gui/INumberReactor.java new file mode 100644 index 000000000..98c70a6db --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/network/gui/INumberReactor.java @@ -0,0 +1,8 @@ +package ellpeck.actuallyadditions.network.gui; + +import net.minecraft.entity.player.EntityPlayer; + +public interface INumberReactor{ + + void onNumberReceived(int text, int textID, EntityPlayer player); +} diff --git a/src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiNumber.java b/src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiNumber.java new file mode 100644 index 000000000..2ab2d332d --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/network/gui/PacketGuiNumber.java @@ -0,0 +1,74 @@ +package ellpeck.actuallyadditions.network.gui; + +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.DimensionManager; + +public class PacketGuiNumber implements IMessage{ + + private int tileX; + private int tileY; + private int tileZ; + private int worldID; + private int text; + private int textID; + private int playerID; + + @SuppressWarnings("unused") + public PacketGuiNumber(){ + + } + + public PacketGuiNumber(int x, int y, int z, World world, int text, int textID, EntityPlayer player){ + this.tileX = x; + this.tileY = y; + this.tileZ = z; + this.worldID = world.provider.dimensionId; + this.text = text; + this.textID = textID; + this.playerID = player.getEntityId(); + } + + @Override + public void fromBytes(ByteBuf buf){ + this.tileX = buf.readInt(); + this.tileY = buf.readInt(); + this.tileZ = buf.readInt(); + this.worldID = buf.readInt(); + this.text = buf.readInt(); + this.textID = buf.readInt(); + this.playerID = buf.readInt(); + } + + @Override + public void toBytes(ByteBuf buf){ + buf.writeInt(this.tileX); + buf.writeInt(this.tileY); + buf.writeInt(this.tileZ); + buf.writeInt(this.worldID); + buf.writeInt(this.text); + buf.writeInt(this.textID); + buf.writeInt(this.playerID); + } + + public static class Handler implements IMessageHandler{ + + @Override + public IMessage onMessage(PacketGuiNumber message, MessageContext ctx){ + World world = DimensionManager.getWorld(message.worldID); + TileEntity tile = world.getTileEntity(message.tileX, message.tileY, message.tileZ); + + if(tile instanceof INumberReactor){ + INumberReactor reactor = (INumberReactor)tile; + reactor.onNumberReceived(message.text, message.textID, (EntityPlayer)world.getEntityByID(message.playerID)); + } + + return null; + } + } +} diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeAutoRegistry.java similarity index 93% rename from src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java rename to src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeAutoRegistry.java index f61a6e74f..d0415530f 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeRegistry.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeAutoRegistry.java @@ -8,7 +8,7 @@ import org.apache.logging.log4j.Level; import java.util.ArrayList; -public class GrinderRecipeRegistry{ +public class GrinderRecipeAutoRegistry{ public static ArrayList searchCases = new ArrayList(); public static ArrayList exceptions = new ArrayList(); @@ -52,8 +52,8 @@ public class GrinderRecipeRegistry{ ItemStack input = theInput.copy(); ItemStack output = theDust.copy(); output.stackSize = resultAmount; - if(!GrinderRecipes.hasRecipe(input, output)){ - GrinderRecipes.registerRecipe(input, output, null, 0); + if(!GrinderRecipeManualRegistry.hasRecipe(input, output)){ + GrinderRecipeManualRegistry.registerRecipe(input, output, null, 0); } } } diff --git a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeManualRegistry.java similarity index 98% rename from src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java rename to src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeManualRegistry.java index 89131880d..f4b73cc4f 100644 --- a/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipes.java +++ b/src/main/java/ellpeck/actuallyadditions/recipe/GrinderRecipeManualRegistry.java @@ -5,7 +5,7 @@ import net.minecraftforge.oredict.OreDictionary; import java.util.ArrayList; -public class GrinderRecipes{ +public class GrinderRecipeManualRegistry{ public static ArrayList recipes = new ArrayList(); diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java index 75a9950e6..be3b7c1ab 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityCoffeeMachine.java @@ -10,19 +10,25 @@ import ellpeck.actuallyadditions.items.ItemCoffee; import ellpeck.actuallyadditions.items.metalists.TheMiscItems; import ellpeck.actuallyadditions.network.gui.IButtonReactor; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.*; -public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements IButtonReactor, IEnergyReceiver{ +public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements IButtonReactor, IEnergyReceiver, IFluidHandler{ public static final int SLOT_COFFEE_BEANS = 0; public static final int SLOT_INPUT = 1; public static final int SLOT_OUTPUT = 2; + public static final int SLOT_WATER_INPUT = 11; + public static final int SLOT_WATER_OUTPUT = 12; public EnergyStorage storage = new EnergyStorage(300000); + public FluidTank tank = new FluidTank(4*FluidContainerRegistry.BUCKET_VOLUME); public static int energyUsePerTick = ConfigIntValues.COFFEE_MACHINE_ENERGY_USED.getValue(); + public final int waterUsedPerCoffee = 500; public final int coffeeCacheMaxAmount = 300; public final int coffeeCacheAddPerItem = ConfigIntValues.COFFEE_CACHE_ADDED_PER_ITEM.getValue(); @@ -33,7 +39,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements public int brewTime; public TileEntityCoffeeMachine(){ - super(11, "coffeeMachine"); + super(13, "coffeeMachine"); } @Override @@ -55,18 +61,27 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements this.coffeeCacheAmount += this.coffeeCacheAddPerItem; } } + + if(this.slots[SLOT_WATER_INPUT] != null && FluidContainerRegistry.containsFluid(this.slots[SLOT_WATER_INPUT], new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME)) && (this.slots[SLOT_WATER_OUTPUT] == null || (this.slots[SLOT_WATER_OUTPUT].stackSize < this.slots[SLOT_WATER_OUTPUT].getMaxStackSize()))){ + if(FluidContainerRegistry.BUCKET_VOLUME <= this.tank.getCapacity()-this.tank.getFluidAmount()){ + if(this.slots[SLOT_WATER_OUTPUT] == null) this.slots[SLOT_WATER_OUTPUT] = new ItemStack(Items.bucket); + else this.slots[SLOT_WATER_OUTPUT].stackSize++; + this.slots[SLOT_WATER_INPUT] = null; + this.tank.fill(new FluidStack(FluidRegistry.WATER, FluidContainerRegistry.BUCKET_VOLUME), true); + } + } } public void brew(){ if(!worldObj.isRemote){ - if(this.slots[SLOT_INPUT] != null && this.slots[SLOT_INPUT].getItem() == InitItems.itemMisc && this.slots[SLOT_INPUT].getItemDamage() == TheMiscItems.CUP.ordinal() && this.slots[SLOT_OUTPUT] == null && this.coffeeCacheAmount >= this.coffeeCacheUsePerItem){ + if(this.slots[SLOT_INPUT] != null && this.slots[SLOT_INPUT].getItem() == InitItems.itemMisc && this.slots[SLOT_INPUT].getItemDamage() == TheMiscItems.CUP.ordinal() && this.slots[SLOT_OUTPUT] == null && this.coffeeCacheAmount >= this.coffeeCacheUsePerItem && this.tank.getFluid() != null && this.tank.getFluid().getFluid() == FluidRegistry.WATER && this.tank.getFluidAmount() >= this.waterUsedPerCoffee){ if(this.storage.getEnergyStored() >= energyUsePerTick){ this.brewTime++; this.storage.extractEnergy(energyUsePerTick, false); if(this.brewTime >= this.maxBrewTime){ this.brewTime = 0; ItemStack output = new ItemStack(InitItems.itemCoffee); - for(int i = 3; i < this.slots.length; i++){ + for(int i = 3; i < this.slots.length-2; i++){ if(this.slots[i] != null){ ItemCoffee.Ingredient ingredient = ItemCoffee.getIngredientFromStack(this.slots[i]); if(ingredient != null){ @@ -81,6 +96,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements this.slots[SLOT_INPUT].stackSize--; if(this.slots[SLOT_INPUT].stackSize <= 0) this.slots[SLOT_INPUT] = null; this.coffeeCacheAmount -= this.coffeeCacheUsePerItem; + this.tank.drain(this.waterUsedPerCoffee, true); } } } @@ -93,6 +109,11 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements return this.coffeeCacheAmount * i / this.coffeeCacheMaxAmount; } + @SideOnly(Side.CLIENT) + public int getWaterScaled(int i){ + return this.tank.getFluidAmount() * i / this.tank.getCapacity(); + } + @SideOnly(Side.CLIENT) public int getEnergyScaled(int i){ return this.getEnergyStored(ForgeDirection.UNKNOWN) * i / this.getMaxEnergyStored(ForgeDirection.UNKNOWN); @@ -107,6 +128,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); this.storage.writeToNBT(compound); + this.tank.writeToNBT(compound); compound.setInteger("Cache", this.coffeeCacheAmount); compound.setInteger("Time", this.brewTime); } @@ -115,6 +137,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements public void readFromNBT(NBTTagCompound compound){ super.readFromNBT(compound); this.storage.readFromNBT(compound); + this.tank.readFromNBT(compound); this.coffeeCacheAmount = compound.getInteger("Cache"); this.brewTime = compound.getInteger("Time"); } @@ -131,7 +154,7 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements @Override public boolean canExtractItem(int slot, ItemStack stack, int side){ - return slot == SLOT_OUTPUT || (slot >= 3 && ItemCoffee.getIngredientFromStack(stack) == null); + return slot == SLOT_OUTPUT || (slot >= 3 && slot < this.slots.length-2 && ItemCoffee.getIngredientFromStack(stack) == null) || slot == SLOT_WATER_OUTPUT; } @Override @@ -160,4 +183,34 @@ public class TileEntityCoffeeMachine extends TileEntityInventoryBase implements public boolean canConnectEnergy(ForgeDirection from){ return true; } + + @Override + public int fill(ForgeDirection from, FluidStack resource, boolean doFill){ + return resource.getFluid() == FluidRegistry.WATER && from != ForgeDirection.DOWN ? this.tank.fill(resource, doFill) : 0; + } + + @Override + public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain){ + return null; + } + + @Override + public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain){ + return null; + } + + @Override + public boolean canFill(ForgeDirection from, Fluid fluid){ + return true; + } + + @Override + public boolean canDrain(ForgeDirection from, Fluid fluid){ + return false; + } + + @Override + public FluidTankInfo[] getTankInfo(ForgeDirection from){ + return new FluidTankInfo[]{this.tank.getInfo()}; + } } diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGiantChest.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGiantChest.java index 7d9c0dd33..e0951f09c 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGiantChest.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGiantChest.java @@ -2,8 +2,6 @@ package ellpeck.actuallyadditions.tile; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.nbt.NBTTagList; public class TileEntityGiantChest extends TileEntityInventoryBase{ @@ -11,36 +9,6 @@ public class TileEntityGiantChest extends TileEntityInventoryBase{ super(9*13, "giantChest"); } - @Override - public void writeToNBT(NBTTagCompound compound){ - super.writeToNBT(compound); - NBTTagList tagList = new NBTTagList(); - for(int currentIndex = 0; currentIndex < slots.length; ++currentIndex){ - if (slots[currentIndex] != null){ - NBTTagCompound tagCompound = new NBTTagCompound(); - //Too many slots to get saved as Byte - tagCompound.setShort("Slot", (short)currentIndex); - slots[currentIndex].writeToNBT(tagCompound); - tagList.appendTag(tagCompound); - } - } - compound.setTag("Items", tagList); - } - - @Override - public void readFromNBT(NBTTagCompound compound){ - super.readFromNBT(compound); - NBTTagList tagList = compound.getTagList("Items", 10); - for (int i = 0; i < tagList.tagCount(); ++i){ - NBTTagCompound tagCompound = tagList.getCompoundTagAt(i); - //Too many slots to get saved as Byte - short slotIndex = tagCompound.getShort("Slot"); - if (slotIndex >= 0 && slotIndex < slots.length){ - slots[slotIndex] = ItemStack.loadItemStackFromNBT(tagCompound); - } - } - } - @Override public boolean canUpdate(){ return false; diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java index 8eb4df417..21dbf34cf 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityGrinder.java @@ -5,7 +5,7 @@ import cofh.api.energy.IEnergyReceiver; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.config.values.ConfigIntValues; -import ellpeck.actuallyadditions.recipe.GrinderRecipes; +import ellpeck.actuallyadditions.recipe.GrinderRecipeManualRegistry; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -122,8 +122,8 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg public boolean canCrushOn(int theInput, int theFirstOutput, int theSecondOutput){ if(this.slots[theInput] != null){ - ItemStack outputOne = GrinderRecipes.getOutput(this.slots[theInput], false); - ItemStack outputTwo = GrinderRecipes.getOutput(this.slots[theInput], true); + ItemStack outputOne = GrinderRecipeManualRegistry.getOutput(this.slots[theInput], false); + ItemStack outputTwo = GrinderRecipeManualRegistry.getOutput(this.slots[theInput], true); if(this.slots[theInput] != null){ if(outputOne != null){ if((this.slots[theFirstOutput] == null || (this.slots[theFirstOutput].isItemEqual(outputOne) && this.slots[theFirstOutput].stackSize <= this.slots[theFirstOutput].getMaxStackSize()-outputOne.stackSize)) && (outputTwo == null || (this.slots[theSecondOutput] == null || (this.slots[theSecondOutput].isItemEqual(outputTwo) && this.slots[theSecondOutput].stackSize <= this.slots[theSecondOutput].getMaxStackSize()-outputTwo.stackSize)))){ @@ -136,14 +136,14 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg } public void finishCrushing(int theInput, int theFirstOutput, int theSecondOutput){ - ItemStack outputOnFirst = GrinderRecipes.getOutput(this.slots[theInput], false); + ItemStack outputOnFirst = GrinderRecipeManualRegistry.getOutput(this.slots[theInput], false); if(outputOnFirst != null){ if(this.slots[theFirstOutput] == null) this.slots[theFirstOutput] = outputOnFirst.copy(); else if(this.slots[theFirstOutput].getItem() == outputOnFirst.getItem()) this.slots[theFirstOutput].stackSize += outputOnFirst.stackSize; } - int chance = GrinderRecipes.getSecondChance(this.slots[theInput]); - ItemStack outputOnSecond = GrinderRecipes.getOutput(this.slots[theInput], true); + int chance = GrinderRecipeManualRegistry.getSecondChance(this.slots[theInput]); + ItemStack outputOnSecond = GrinderRecipeManualRegistry.getOutput(this.slots[theInput], true); if(outputOnSecond != null){ int rand = new Random().nextInt(100) + 1; if(rand <= chance){ @@ -189,7 +189,7 @@ public class TileEntityGrinder extends TileEntityInventoryBase implements IEnerg @Override public boolean isItemValidForSlot(int i, ItemStack stack){ - return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipes.getOutput(stack, false) != null; + return (i == SLOT_INPUT_1 || i == SLOT_INPUT_2) && GrinderRecipeManualRegistry.getOutput(stack, false) != null; } @Override diff --git a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java index 7f8e91165..7f307175f 100644 --- a/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java +++ b/src/main/java/ellpeck/actuallyadditions/tile/TileEntityInputter.java @@ -1,6 +1,7 @@ package ellpeck.actuallyadditions.tile; import ellpeck.actuallyadditions.network.gui.IButtonReactor; +import ellpeck.actuallyadditions.network.gui.INumberReactor; import ellpeck.actuallyadditions.util.WorldUtil; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; @@ -9,7 +10,18 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; -public class TileEntityInputter extends TileEntityInventoryBase implements IButtonReactor{ +public class TileEntityInputter extends TileEntityInventoryBase implements IButtonReactor, INumberReactor{ + + @Override + public void onNumberReceived(int text, int textID, EntityPlayer player){ + if(text != -1){ + if(textID == 0) this.slotToPutStart = text; + if(textID == 1) this.slotToPutEnd = text; + if(textID == 2) this.slotToPullStart = text; + if(textID == 3) this.slotToPullEnd = text; + } + this.markDirty(); + } public static class TileEntityInputterAdvanced extends TileEntityInputter{ @@ -25,15 +37,20 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt public static final int WHITELIST_PULL_BUTTON_ID = 87; public static final int WHITELIST_PUT_BUTTON_ID = 88; + public static final int OKAY_BUTTON_ID = 133; public int sideToPut = -1; - public int slotToPut = -1; - public int placeToPutSlotAmount; + + public int slotToPutStart; + public int slotToPutEnd; + public TileEntity placeToPut; public int sideToPull = -1; - public int slotToPull = -1; - public int placeToPullSlotAmount; + + public int slotToPullStart; + public int slotToPullEnd; + public TileEntity placeToPull; public boolean isAdvanced; @@ -56,24 +73,27 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt this.initVars(); if(!worldObj.isBlockIndirectlyGettingPowered(xCoord, yCoord, zCoord)){ - if(!(this.sideToPull == this.sideToPut && this.slotToPull == this.slotToPut)){ - if(sideToPull != -1) this.pull(); - if(sideToPut != -1) this.put(); + if(!(this.sideToPull == this.sideToPut && this.slotToPullStart == this.slotToPutStart && this.slotToPullEnd == this.slotToPutEnd)){ + if(sideToPull != -1 && this.placeToPull instanceof IInventory) this.pull(); + if(sideToPut != -1 && this.placeToPut instanceof IInventory) this.put(); } } } } public void pull(){ - if(this.placeToPullSlotAmount > 0){ - IInventory theInventory = (IInventory)placeToPull; - int theSlotToPull = this.slotToPull; + IInventory theInventory = (IInventory)placeToPull; + if(theInventory.getSizeInventory() > 0){ + int theSlotToPull = this.slotToPullStart; int maxSize = theInventory.getInventoryStackLimit(); ISidedInventory theSided = null; if(theInventory instanceof ISidedInventory) theSided = (ISidedInventory)theInventory; + boolean can = false; ItemStack theStack = null; - for(int i = (theSlotToPull != -1 ? theSlotToPull : 0); i < (theSlotToPull != -1 ? theSlotToPull+1 : placeToPullSlotAmount); i++){ + for(int i = theSlotToPull; i < this.slotToPullEnd; i++){ + if(i >= theInventory.getSizeInventory()) return; + ItemStack tempStack = theInventory.getStackInSlot(i); if(tempStack != null){ if(tempStack.getMaxStackSize() < this.getInventoryStackLimit()) maxSize = tempStack.getMaxStackSize(); @@ -85,6 +105,7 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt if(theSided.canExtractItem(i, tempStack, j)){ theStack = tempStack; theSlotToPull = i; + can = true; break; } } @@ -92,11 +113,12 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt else{ theStack = tempStack; theSlotToPull = i; - break; + can = true; } } + if(can) break; } - if(theStack != null){ + if(can){ if(this.slots[0] != null){ if(theStack.isItemEqual(this.slots[0])){ if(theStack.stackSize <= maxSize - this.slots[0].stackSize){ @@ -121,9 +143,9 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt } public void put(){ - if(this.placeToPutSlotAmount > 0){ - IInventory theInventory = (IInventory)placeToPut; - int theSlotToPut = this.slotToPut; + IInventory theInventory = (IInventory)placeToPut; + if(theInventory.getSizeInventory() > 0){ + int theSlotToPut = this.slotToPutStart; int maxSize = theInventory.getInventoryStackLimit(); ISidedInventory theSided = null; if(theInventory instanceof ISidedInventory) theSided = (ISidedInventory)theInventory; @@ -131,7 +153,9 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt if(this.slots[0] != null){ ItemStack theStack = null; - for(int i = (theSlotToPut != -1 ? theSlotToPut : 0); i < (theSlotToPut != -1 ? theSlotToPut+1 : placeToPutSlotAmount); i++){ + for(int i = theSlotToPut; i < this.slotToPutEnd; i++){ + if(i >= theInventory.getSizeInventory()) return; + ItemStack tempStack = theInventory.getStackInSlot(i); if(tempStack != null){ if(tempStack.getMaxStackSize() < theInventory.getInventoryStackLimit()) maxSize = tempStack.getMaxStackSize(); @@ -152,9 +176,9 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt theStack = tempStack; theSlotToPut = i; can = true; - break; } } + if(can) break; } if(can){ if(theStack != null){ @@ -198,20 +222,11 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt this.placeToPull = WorldUtil.getTileEntityFromSide(WorldUtil.getDirectionByRotatingSide(this.sideToPull), this.worldObj, this.xCoord, this.yCoord, this.zCoord); this.placeToPut = WorldUtil.getTileEntityFromSide(WorldUtil.getDirectionByRotatingSide(this.sideToPut), this.worldObj, this.xCoord, this.yCoord, this.zCoord); - if(this.placeToPull != null && this.placeToPull instanceof IInventory){ - this.placeToPullSlotAmount = ((IInventory)this.placeToPull).getSizeInventory(); + if(this.placeToPull instanceof IInventory){ + if(this.slotToPullEnd <= 0) this.slotToPullEnd = ((IInventory)this.placeToPull).getSizeInventory(); } - else{ - this.placeToPullSlotAmount = 0; - this.slotToPull = -1; - } - - if(this.placeToPut != null && this.placeToPut instanceof IInventory){ - this.placeToPutSlotAmount = ((IInventory)this.placeToPut).getSizeInventory(); - } - else{ - this.placeToPutSlotAmount = 0; - this.slotToPut = -1; + if(this.placeToPut instanceof IInventory){ + if(this.slotToPutEnd <= 0) this.slotToPutEnd = ((IInventory)this.placeToPut).getSizeInventory(); } } @@ -226,33 +241,38 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt return; } + if(buttonID == 0 || buttonID == 1){ + this.slotToPutStart = 0; + this.slotToPutEnd = 0; + } + if(buttonID == 2 || buttonID == 3){ + this.slotToPullStart = 0; + this.slotToPullEnd = 0; + } + if(buttonID == 0) this.sideToPut++; if(buttonID == 1) this.sideToPut--; - if(buttonID == 2) this.slotToPut++; - if(buttonID == 3) this.slotToPut--; - if(buttonID == 4) this.sideToPull++; - if(buttonID == 5) this.sideToPull--; - if(buttonID == 6) this.slotToPull++; - if(buttonID == 7) this.slotToPull--; + if(buttonID == 2) this.sideToPull++; + if(buttonID == 3) this.sideToPull--; if(this.sideToPut >= 6) this.sideToPut = -1; else if(this.sideToPut < -1) this.sideToPut = 5; else if(this.sideToPull >= 6) this.sideToPull = -1; else if(this.sideToPull < -1) this.sideToPull = 5; - else if(this.slotToPut >= this.placeToPutSlotAmount) this.slotToPut = -1; - else if(this.slotToPut < -1) this.slotToPut = this.placeToPutSlotAmount-1; - else if(this.slotToPull >= this.placeToPullSlotAmount) this.slotToPull = -1; - else if(this.slotToPull < -1) this.slotToPull = this.placeToPullSlotAmount-1; + + this.markDirty(); } @Override public void writeToNBT(NBTTagCompound compound){ super.writeToNBT(compound); compound.setInteger("SideToPut", this.sideToPut); - compound.setInteger("SlotToPut", this.slotToPut); + compound.setInteger("SlotToPut", this.slotToPutStart); + compound.setInteger("SlotToPutEnd", this.slotToPutEnd); compound.setInteger("SideToPull", this.sideToPull); - compound.setInteger("SlotToPull", this.slotToPull); + compound.setInteger("SlotToPull", this.slotToPullStart); + compound.setInteger("SlotToPullEnd", this.slotToPullEnd); compound.setBoolean("PullWhitelist", this.isPullWhitelist); compound.setBoolean("PutWhitelist", this.isPutWhitelist); } @@ -260,14 +280,16 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt @Override public void readFromNBT(NBTTagCompound compound){ this.sideToPut = compound.getInteger("SideToPut"); - this.slotToPut = compound.getInteger("SlotToPut"); + this.slotToPutStart = compound.getInteger("SlotToPut"); + this.slotToPutEnd = compound.getInteger("SlotToPutEnd"); this.sideToPull = compound.getInteger("SideToPull"); - this.slotToPull = compound.getInteger("SlotToPull"); + this.slotToPullStart = compound.getInteger("SlotToPull"); + this.slotToPullEnd = compound.getInteger("SlotToPullEnd"); this.isPullWhitelist = compound.getBoolean("PullWhitelist"); this.isPutWhitelist = compound.getBoolean("PutWhitelist"); super.readFromNBT(compound); } - + @Override public boolean isItemValidForSlot(int i, ItemStack stack){ return i == 0; @@ -282,4 +304,4 @@ public class TileEntityInputter extends TileEntityInventoryBase implements IButt public boolean canExtractItem(int slot, ItemStack stack, int side){ return slot == 0; } -} +} \ No newline at end of file diff --git a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java index ff35bbba2..b3fac963e 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/BlockUtil.java @@ -43,27 +43,31 @@ public class BlockUtil{ public static final ArrayList wailaRegisterList = new ArrayList(); - public static void register(Block block, Class itemBlock, Enum[] list){ - block.setCreativeTab(CreativeTab.instance); + public static void register(Block block, Class itemBlock, boolean addTab, Enum[] list){ + if(addTab) block.setCreativeTab(CreativeTab.instance); block.setBlockName(createUnlocalizedName(block)); GameRegistry.registerBlock(block, itemBlock, ((INameableItem)block).getName()); - for(Enum current : list){ - if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(block, 1, current.ordinal())); + if(list != null){ + for(Enum current : list){ + if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(block, 1, current.ordinal())); + } + } + else{ + if(!((INameableItem)block).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)block).getOredictName(), new ItemStack(block, 1, Util.WILDCARD)); } wailaRegisterList.add(block); } + public static void register(Block block, Class itemBlock, Enum[] list){ + register(block, itemBlock, true, list); + } + public static void register(Block block, Class itemBlock){ register(block, itemBlock, true); } public static void register(Block block, Class itemBlock, boolean addTab){ - if(addTab) block.setCreativeTab(CreativeTab.instance); - block.setBlockName(createUnlocalizedName(block)); - GameRegistry.registerBlock(block, itemBlock, ((INameableItem)block).getName()); - if(!((INameableItem)block).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)block).getOredictName(), new ItemStack(block, 1, Util.WILDCARD)); - - wailaRegisterList.add(block); + register(block, itemBlock, addTab, null); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/CompatUtil.java b/src/main/java/ellpeck/actuallyadditions/util/CompatUtil.java new file mode 100644 index 000000000..e62396a11 --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/util/CompatUtil.java @@ -0,0 +1,27 @@ +package ellpeck.actuallyadditions.util; + +import cpw.mods.fml.common.event.FMLInterModComms; +import ellpeck.actuallyadditions.items.ItemSeed; +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +public class CompatUtil{ + + public static void registerMFRPlant(Block block){ + FMLInterModComms.sendMessage("MineFactoryReloaded", "registerHarvestable_Crop", new ItemStack(block, 1, 7)); + + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("plant", Block.blockRegistry.getNameForObject(block)); + FMLInterModComms.sendMessage("MineFactoryReloaded", "registerFertilizable_Crop", compound); + } + + public static void registerMFRSeed(Item item){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("seed", Item.itemRegistry.getNameForObject(item)); + compound.setString("crop", Block.blockRegistry.getNameForObject(((ItemSeed)item).plant)); + FMLInterModComms.sendMessage("MineFactoryReloaded", "registerPlantable_Crop", compound); + } + +} diff --git a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java index b38dd0e51..df6eecfff 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ItemUtil.java @@ -32,18 +32,24 @@ public class ItemUtil{ } public static void register(Item item, boolean addTab){ - if(addTab) item.setCreativeTab(CreativeTab.instance); - item.setUnlocalizedName(createUnlocalizedName(item)); - GameRegistry.registerItem(item, ((INameableItem)item).getName()); - if(!((INameableItem)item).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)item).getOredictName(), new ItemStack(item, 1, Util.WILDCARD)); + register(item, addTab, null); } public static void register(Item item, Enum[] list){ - item.setCreativeTab(CreativeTab.instance); + register(item, true, list); + } + + public static void register(Item item, boolean addTab, Enum[] list){ + if(addTab) item.setCreativeTab(CreativeTab.instance); item.setUnlocalizedName(createUnlocalizedName(item)); GameRegistry.registerItem(item, ((INameableItem)item).getName()); - for(Enum current : list){ - if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(item, 1, current.ordinal())); + if(list != null){ + for(Enum current : list){ + if(!((INameableItem)current).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)current).getOredictName(), new ItemStack(item, 1, current.ordinal())); + } + } + else{ + if(!((INameableItem)item).getOredictName().isEmpty()) OreDictionary.registerOre(((INameableItem)item).getOredictName(), new ItemStack(item, 1, Util.WILDCARD)); } } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index 2bfa54782..b0cb19646 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.6.0"; + public static final String VERSION = "1.7.10-0.0.6.1"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java index 97924e489..f374926bc 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/WorldUtil.java @@ -3,6 +3,7 @@ package ellpeck.actuallyadditions.util; import cofh.api.energy.EnergyStorage; import cofh.api.energy.IEnergyReceiver; import net.minecraft.block.Block; +import net.minecraft.block.material.Material; import net.minecraft.entity.item.EntityItem; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; @@ -15,6 +16,8 @@ import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.*; import org.apache.logging.log4j.Level; +import java.util.ArrayList; + public class WorldUtil{ public static ChunkCoordinates getCoordsFromSide(ForgeDirection side, int x, int y, int z){ @@ -123,4 +126,14 @@ public class WorldUtil{ } } + public static ArrayList getMaterialsAround(World world, int x, int y, int z){ + ArrayList blocks = new ArrayList(); + blocks.add(world.getBlock(x+1, y, z).getMaterial()); + blocks.add(world.getBlock(x-1, y, z).getMaterial()); + blocks.add(world.getBlock(x, y, z+1).getMaterial()); + blocks.add(world.getBlock(x, y, z-1).getMaterial()); + + return blocks; + } + } diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java b/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java deleted file mode 100644 index 804d2999a..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/FactoryRegistry.java +++ /dev/null @@ -1,113 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.event.FMLInterModComms; -import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage; - -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; - -/** - * @author PowerCrystals - * - * Class used to register plants and other farming-related things with MFR. Will do nothing if MFR does not exist. - * - */ -public class FactoryRegistry -{ - /* - * This may be called at any time during pre-init, init or post-init, assuming all blocks and items - * that are being accessed from the registry have been appropriately registered. - * Possible messages: - * - * // Registration: - * addLaserPreferredOre | NBTTag with an ItemStack saved on it, with the color on the "value" attribute, - * | A ValuedItem with item and value set. - * registerAutoSpawnerBlacklist | The String identifier of an entity, - * | A subclass of EntityLivingBase. - * registerFertilizable | An instance of IFactoryFertilizable. - * registerFertilizer | An instance of IFactoryFertilizer. - * registerFruitLog | The String identifier of a block. - * registerGrindable | An instance of IFactoryGrindable. - * registerGrinderBlacklist | A subclass of EntityLivingBase. - * registerHarvestable | An instance of IFactoryHarvestable. - * registerLaserOre | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, - * | A ValuedItem with item and value set. - * registerLiquidDrinkHandler | A ValuedItem with key and object set; ILiquidDrinkHandler expected. - * registerMobEggHandler | An instance of IMobEggHandler. - * registerPickableFruit | An instance of IFactoryFruit. - * registerPlantable | An instance of IFactoryPlantable. - * registerRanchable | An instance of IFactoryRanchable. - * registerRedNetLogicCircuit | An instance of IRedNetLogicCircuit. - * registerRubberTreeBiome | The biomeName field of a biome to white list for rubber trees to spawn in. - * registerSafariNetBlacklist | A subclass of EntityLivingBase. - * registerSafariNetHandler | An instance of ISafariNetHandler. - * registerSludgeDrop | NBTTag with an ItemStack saved on it, with the weight on the "value" attribute, - * | A ValuedItem with item and value set. - * registerSpawnHandler | An instance of IMobSpawnHandler. - * registerVillagerTradeMob | An instance of IRandomMobProvider. - * - * // Simple implementations: - * { Harvestables - * registerHarvestable_Standard | The String identifier of a block. - * registerHarvestable_Log | The String identifier of a block. - * registerHarvestable_Leaves | The String identifier of a block. - * registerHarvestable_Vine | The String identifier of a block. - * registerHarvestable_Shrub | The String identifier of a block. - * registerHarvestable_Mushroom | The String identifier of a block. - * registerHarvestable_Crop | An ItemStack of a block, with a damage value indicating the meta value to harvest at. - * | A ValuedItem with value and object set; Block expected. - * registerHarvestable_Gourd | An NBTTag with the stem and fruit attributes, both String identifiers of blocks. - * } - * { Plantables - * registerPlantable_Standard | An NBTTag with the seed (Item, String identifier), and - * crop (Block, String identifier) attributes set, optionally - * also having the meta (Integer, accepted metadata value of the seed item) attribute set. - * No special checks for location, just sustainability. - * registerPlantable_Crop | An NBTTag with the seed (Item, String identifier), and - * crop (Block, String identifier) attributes set, optionally - * also having the meta (Integer, accepted metadata value of the seed item) attribute set. - * Will automatically hoe dirt and grass into farmland when planting. - * registerPlantable_Sapling | An NBTTag with the sapling (Block, String identifier), and optionally - * the seed (Item, String identifier) attributes set. - * } - * { Fertilizer - * registerFertilizer_Standard | An NBTTag with the fert (Item, String identifier), meta (Integer), and - * type (Integer, index into FertilizerType.values()) attributes set. - * } - * { Fertilizables - * registerFertilizable_Grass | The String identifier of a block. Will bonemeal the block and expect - * tall grass be planted above and around it, must be IGrowable. Works with - * the GrowPlant and Grass type fertilizers, not recommended for crop plants. - * registerFertilizable_Gourd | The String identifier of a block. Must be IGrowable, and expects identical - * behavior to vanilla stems. Works with the GrowPlant fertilizers. - * registerFertilizable_Crop | An NBTTag with the plant (Block, String identifier, IGrowable), and - * meta (Integer, max growth phase) attributes set, optionally also having - * the type (Integer, index into FertilizerType) attribute set. - * registerFertilizable_Cocoa | An NBTTag with the plant (Block, String identifier), and optionally also - * the type (Integer, index into FertilizerType) attributes set. - * Expects metadata of the block to exactly match cocoa pods. - * registerFertilizable_Standard | An NBTTag with the plant (Block, String identifier, IGrowable), and - * optionally also the type (Integer, index into FertilizerType) attributes set. - * Expects the block to change when successfully grown (e.g., saplings). - * } - */ - public static void sendMessage(String message, Object value) - { - if (!Loader.isModLoaded("MineFactoryReloaded") || - Loader.instance().activeModContainer() == null) - return; - try - { - Method m = FMLInterModComms.class.getDeclaredMethod("enqueueMessage", Object.class, String.class, IMCMessage.class); - m.setAccessible(true); - Constructor c = IMCMessage.class.getDeclaredConstructor(String.class, Object.class); - c.setAccessible(true); - m.invoke(null, Loader.instance().activeModContainer(), "MineFactoryReloaded", c.newInstance(message, value)); - } - catch(Exception e) - { - e.printStackTrace(); - } - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java b/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java deleted file mode 100644 index 43af2b656..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/FertilizerType.java +++ /dev/null @@ -1,29 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -/** - * Determines what kind of action a given fertilizer can perform. Your - * IFactoryFertilizable instances should check this before performing any action - * to maintain future compatibility. - * - * @author PowerCrystals - */ -public enum FertilizerType { - - /** - * The fertilizer will fertilize nothing. - */ - None, - /** - * The fertilizer will fertilize grass. - */ - Grass, - /** - * The fertilizer will grow a plant. - */ - GrowPlant, - /** - * The fertilizer will grow magical crops. - */ - GrowMagicalCrop, - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java b/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java deleted file mode 100644 index 85ef23835..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/HarvestType.java +++ /dev/null @@ -1,56 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -/** - * Determines what algorithm the Harvester uses when it encounters this - * IFactoryHarvestable in the world. - * - * @author PowerCrystals - */ -public enum HarvestType { - - /** - * Just break the single block - no special action needed. e.g. Carrots, - * flowers, wheat. - */ - Normal, - /** - * Search for harvestable blocks adjacent to this block but leave this - * block. e.g. Pumpkin, melon - */ - Gourd, - /** - * Search for identical blocks above. - */ - Column, - /** - * Search for identical blocks above but leave the bottom one for the - * future. e.g. Cactus, sugarcane. - */ - LeaveBottom, - /** - * This block is the base of a tree and the harvester should enter - * tree-cutting mode. - */ - Tree, - /** - * This block is the base of the tree and the harvester should enter - * tree-cutting mode. - * The tree is searched for in the negative y axis instead. - */ - TreeFlipped, - /** - * This block is part of a tree as above, but leaves are cut before logs. - * The tree is searched for in the current mode. - *

- * If not in tree-cutting mode, tree-cutting mode will be entered as though - * the type was Tree. - */ - TreeLeaf, - /** - * This block is part of a tree as above, but fruits are cut before logs. - * e.g. cocoa - * The tree is not searched for. - */ - TreeFruit - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java b/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java deleted file mode 100644 index 2ec1f76b3..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IDeepStorageUnit.java +++ /dev/null @@ -1,35 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.ItemStack; - -public interface IDeepStorageUnit { - - /** - * @return A populated ItemStack with stackSize for the full amount of - * materials in the DSU.
- * May have a stackSize > getMaxStackSize(). May have a stackSize of - * 0 (indicating locked contents). - */ - ItemStack getStoredItemType(); - - /** - * Sets the total amount of the item currently being stored, or zero if all - * items are to be removed. - */ - void setStoredItemCount(int amount); - - /** - * Sets the type of the stored item and initializes the number of stored - * items to amount. - *

- * Will overwrite any existing stored items. - */ - void setStoredItemType(ItemStack type, int amount); - - /** - * @return The maximum number of items the DSU can hold.
- * May change based on the current type stored. - */ - int getMaxStoredCount(); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java deleted file mode 100644 index a4b8c8975..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizable.java +++ /dev/null @@ -1,58 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.block.Block; -import net.minecraft.world.World; - -import java.util.Random; - -/** - * Defines a fertilizable block, and the process to fertilize it. You can assume - * that you will never have to check that block matches the one returned by - * getPlant(). - * - * @author PowerCrystals - */ -public interface IFactoryFertilizable { - - /** - * @return The block this instance is managing. - */ - public Block getPlant(); - - /** - * @param world - * The world this block belongs to. - * @param x - * The X coordinate of this block. - * @param y - * The Y coordinate of this block. - * @param z - * The Z coordinate of this block. - * @param fertilizerType - * The kind of fertilizer being used. - * - * @return True if the block at (x,y,z) can be fertilized with the given - * type of fertilizer. - */ - public boolean canFertilize(World world, int x, int y, int z, FertilizerType fertilizerType); - - /** - * @param world - * The world this block belongs to. - * @param rand - * A Random instance to use when fertilizing, if necessary. - * @param x - * The X coordinate of this block. - * @param y - * The Y coordinate of this block. - * @param z - * The Z coordinate of this block. - * @param fertilizerType - * The kind of fertilizer being used. - * - * @return True if fertilization was successful. If false, the Fertilizer - * will not consume a fertilizer item and will not drain power. - */ - public boolean fertilize(World world, Random rand, int x, int y, int z, FertilizerType fertilizerType); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java deleted file mode 100644 index 2f201e68e..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFertilizer.java +++ /dev/null @@ -1,32 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; - -/** - * Defines a fertilizer item for use in the Fertilizer. - * - * @author PowerCrystals - */ -public interface IFactoryFertilizer { - - /** - * @return The ID of this fertilizer item. - */ - Item getFertilizer(); - - /** - * @return The type of fertilizer this is. - */ - FertilizerType getFertilizerType(ItemStack stack); - - /** - * Called when a fertilization is successful. If you set the ItemStack size - * to 0, it will be deleted by the fertilizer. - * - * @param fertilizer - * The ItemStack used to fertilize. - */ - void consume(ItemStack fertilizer); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java deleted file mode 100644 index 2251ee94c..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryFruit.java +++ /dev/null @@ -1,106 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Random; - -/** - * Defines a fruit entry for the Fruit Picker. - * - * @author powercrystals - * - */ -public interface IFactoryFruit { - - /** - * @return The block this fruit has in the world. - */ - public Block getPlant(); - - /** - * Used to determine if this fruit can be picked (is it ripe yet, etc) - * - * @param world - * The world where the fruit is being picked - * @param x - * The x-coordinate of the fruit - * @param y - * The y-coordinate of the fruit - * @param z - * The z-coordinate of the fruit - * - * @return True if the fruit can be picked - */ - public boolean canBePicked(World world, int x, int y, int z); - - /** - * @deprecated This method is no longer called. ReplacementBlock now handles - * interaction. - */ - @Deprecated - public boolean breakBlock(); - - /** - * Called by the Fruit Picker to determine what block to replace the picked - * block with. At the time this method is called, the fruit still exists. - * - * @param world - * The world where the fruit is being picked - * @param x - * The x-coordinate of the fruit - * @param y - * The y-coordinate of the fruit - * @param z - * The z-coordinate of the fruit - * - * @return The block to replace the fruit block with, or null for air. - */ - public ReplacementBlock getReplacementBlock(World world, int x, int y, int z); - - /** - * Called by the Fruit Picker to determine what drops to generate. At the - * time this method is called, the fruit still exists. - * - * @param world - * The world where the fruit is being picked - * @param x - * The x-coordinate of the fruit - * @param y - * The y-coordinate of the fruit - * @param z - * The z-coordinate of the fruit - */ - public List getDrops(World world, Random rand, int x, int y, int z); - - /** - * Called by the Fruit Picker after getDrops, prior to the block being - * replaced/removed. - * - * @param world - * The world where the fruit is being picked - * @param x - * The x-coordinate of the fruit - * @param y - * The y-coordinate of the fruit - * @param z - * The z-coordinate of the fruit - */ - public void prePick(World world, int x, int y, int z); - - /** - * Called by the Fruit Picker after the fruit is picked. - * - * @param world - * The world where the fruit is being picked - * @param x - * The x-coordinate of the fruit - * @param y - * The y-coordinate of the fruit - * @param z - * The z-coordinate of the fruit - */ - public void postPick(World world, int x, int y, int z); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java deleted file mode 100644 index 0ef2149fe..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryGrindable.java +++ /dev/null @@ -1,44 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Random; - -/** - * Defines a grindable entity for the Grinder. - * - * @author PowerCrystals - */ -public interface IFactoryGrindable { - - /** - * @return The class that this grindable instance is handling. This must be - * a subtype of EntityLivingBase or the entity will never - * be noticed by the Grinder. - */ - public Class getGrindableEntity(); - - /** - * @param world - * The world this entity is in. - * @param entity - * The entity instance being ground. - * @param random - * A Random instance. - * - * @return The drops generated when this entity is killed. Only one of these - * will be chosen. - */ - public List grind(World world, EntityLivingBase entity, Random random); - - /** - * @param entity - * The entity instance being ground. - * - * @return Whether this entity has been fully processed or not. (e.g., it is - * already dead) - */ - public boolean processEntity(EntityLivingBase entity); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java deleted file mode 100644 index 2d691aa95..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryHarvestable.java +++ /dev/null @@ -1,106 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.block.Block; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -import java.util.List; -import java.util.Map; -import java.util.Random; - -/** - * Defines a harvestable block for the Harvester. - * - * @author PowerCrystals - */ -public interface IFactoryHarvestable { - - /** - * @return The block this harvestable instance is managing. - */ - public Block getPlant(); - - /** - * @return The type of harvest the Harvester should perform on this block. - */ - public HarvestType getHarvestType(); - - /** - * Used to determine if the harvester should replace this block with air. - * - * @return Whether or not the Harvester should break the block when - * harvesting. If false, no changes will be performed by the - * Harvester itself. - */ - public boolean breakBlock(); - - /** - * Used to determine if this crop can be harvested (is it at a stage that - * drops crops, etc.) - * - * @param world - * The world this block is in. - * @param harvesterSettings - * The harvester's current settings. Do not modify these. - * @param x - * The X coordinate of the block being harvested. - * @param y - * The Y coordinate of the block being harvested. - * @param z - * The Z coordinate of the block being harvested. - * - * @return True if this block can be harvested. - */ - public boolean canBeHarvested(World world, Map harvesterSettings, int x, int y, int z); - - /** - * @param world - * The world this block is in. - * @param rand - * A Random instance to use when generating drops. - * @param harvesterSettings - * The harvester's current settings. Do not modify these. - * @param x - * The X coordinate of the block being harvested. - * @param y - * The Y coordinate of the block being harvested. - * @param z - * The Z coordinate of the block being harvested. - * - * @return The drops generated by breaking this block. For a default - * implementation, calling Block.getDrops() is usually - * sufficient. - */ - public List getDrops(World world, Random rand, Map harvesterSettings, int x, int y, int z); - - /** - * Called before the block is going to be harvested, after getDrops. Usually - * empty. - * - * @param world - * The world this block is in. - * @param x - * The X coordinate of the block being harvested. - * @param y - * The Y coordinate of the block being harvested. - * @param z - * The Z coordinate of the block being harvested. - */ - public void preHarvest(World world, int x, int y, int z); - - /** - * Called after the block is going to be harvested. Used to re-till soil, - * for example. - * - * @param world - * The world this block is in. - * @param x - * The X coordinate of the block being harvested. - * @param y - * The Y coordinate of the block being harvested. - * @param z - * The Z coordinate of the block being harvested. - */ - public void postHarvest(World world, int x, int y, int z); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java deleted file mode 100644 index 4eab9eb66..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserSource.java +++ /dev/null @@ -1,24 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Defines a target for the laser blocks. TileEntities that implement this - * interface will sustain the beam. - * - * @author skyboy - */ -public interface IFactoryLaserSource { - - /** - * Used to determine if laser blocks can remain in the world when emitted - * from from - * - * @param from - * The direction the laser is oriented - * - * @return True if the beam should be sustained from this side - */ - public boolean canFormBeamFrom(ForgeDirection from); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java deleted file mode 100644 index 7fcc41137..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryLaserTarget.java +++ /dev/null @@ -1,36 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Defines a target for the Laser Drill Precharger - * - * @author skyboy - */ -public interface IFactoryLaserTarget { - - /** - * Used to be determined if a laser can be formed on from - * - * @param from - * The direction the laser is coming from - * - * @return True if the precharger can form a beam from this side - */ - public boolean canFormBeamWith(ForgeDirection from); - - /** - * Used to add energy to the tile. - * - * @param from - * The direction the energy is coming from - * @param energy - * The amount of energy being transferred - * @param simulate - * true if this transaction will only be simulated - * - * @return The amount of energy not consumed - */ - public int addEnergy(ForgeDirection from, int energy, boolean simulate); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java deleted file mode 100644 index 1d620b37e..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryPlantable.java +++ /dev/null @@ -1,94 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -/** - * Defines a plantable object for use in the Planter. - * - * @author PowerCrystals - */ -public interface IFactoryPlantable { - - /** - * @return The item this plantable is managing. - */ - public Item getSeed(); - - /** - * @param stack - * The stack being planted. - * @param forFermenting - * True if this stack will be converted to biofuel - * - * @return True if this plantable can be planted (useful for metadata - * items). - */ - public boolean canBePlanted(ItemStack stack, boolean forFermenting); - - /** - * @param world - * The world instance this block or item will be placed into. - * @param x - * The destination X coordinate. - * @param y - * The destination Y coordinate. - * @param z - * The destination Z coordinate. - * @param stack - * The stack being planted. - * - * @return The block that will be placed into the world. - */ - public ReplacementBlock getPlantedBlock(World world, int x, int y, int z, ItemStack stack); - - /** - * @param world - * The world instance this block or item will be placed into. - * @param x - * The destination X coordinate. - * @param y - * The destination Y coordinate. - * @param z - * The destination Z coordinate. - * @param stack - * The stack being planted. - * - * @return True if this plantable can be placed at the provided coordinates. - */ - public boolean canBePlantedHere(World world, int x, int y, int z, ItemStack stack); - - /** - * Called before planting is performed. Used to till soil, for example. - * - * @param world - * The world instance this block or item will be placed into. - * @param x - * The destination X coordinate. - * @param y - * The destination Y coordinate. - * @param z - * The destination Z coordinate. - * @param stack - * The stack being planted. - */ - public void prePlant(World world, int x, int y, int z, ItemStack stack); - - /** - * Called after planting is performed. Usually empty. - * - * @param world - * The world instance this block or item will be placed into. - * @param x - * The destination X coordinate. - * @param y - * The destination Y coordinate. - * @param z - * The destination Z coordinate. - * @param stack - * The stack being planted. - */ - public void postPlant(World world, int x, int y, int z, ItemStack stack); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java b/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java deleted file mode 100644 index 21fc61abc..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IFactoryRanchable.java +++ /dev/null @@ -1,34 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.inventory.IInventory; -import net.minecraft.world.World; - -import java.util.List; - -/** - * Defines a ranchable entity for use in the Rancher. - * - * @author PowerCrystals - */ -public interface IFactoryRanchable { - - /** - * @return The entity being ranched. Must be a subtype of EntityLivingBase. - */ - public Class getRanchableEntity(); - - /** - * @param world - * The world this entity is in. - * @param entity - * The entity instance being ranched. - * @param rancher - * The rancher instance doing the ranching. Used to access the - * Rancher's inventory when milking cows, for example. - * - * @return A list of drops. All Items be dropped, fluids not matching the tank's contents will be discarded. - */ - public List ranch(World world, EntityLivingBase entity, IInventory rancher); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java deleted file mode 100644 index d8d58866a..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/ILiquidDrinkHandler.java +++ /dev/null @@ -1,16 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; - -public interface ILiquidDrinkHandler { - - /** - * Called when an entity has consumed the fluid this manages. - * - * @param entity - * The entity that has consumed the fluid this - * ILiquidDrinkHandler manages - */ - public void onDrink(EntityLivingBase entity); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java deleted file mode 100644 index 4f951dae0..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IMFRHammer.java +++ /dev/null @@ -1,11 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -/** - * Defines a tool that can rotate MFR machines. Implement on an Item class. - * Requires no additional work on your part. - * - * @author PowerCrystals - */ -public interface IMFRHammer { - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java deleted file mode 100644 index 4801feb9f..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IMobEggHandler.java +++ /dev/null @@ -1,23 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityList.EntityEggInfo; -import net.minecraft.item.ItemStack; - -/** - * Defines a class that MFR will use to local egg info for a given mob. This is - * used to color the Safari Net based on the captured mob. - * - * @author PowerCrystals - */ -public interface IMobEggHandler { - - /** - * @param safariNet - * The Safari Net that is looking for egg info. - * - * @return An EntityEggInfo, or null if this instance cannot handle this - * mob. - */ - public EntityEggInfo getEgg(ItemStack safariNet); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java deleted file mode 100644 index 65d2b3031..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IMobSpawnHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; - -/** - * Defines a handler for mob spawns from the autospawner. Added primarily to - * solve item duping on exact spawn & entity inventories - * - * @author skyboy - */ -public interface IMobSpawnHandler { - - /** - * @return The class that this instance is handling. - */ - public Class getMobClass(); - - /** - * Called when a mob has been spawned normally. - * - * @param entity - * The entity instance being spawned. Typically your regular - * spawn code 100% handles this - */ - public void onMobSpawn(EntityLivingBase entity); - - /** - * Called when an exact copy of an entity has been made. - * - * @param entity - * The entity instance being exact-copied. Clear your inventories - * & etc. here - */ - public void onMobExactSpawn(EntityLivingBase entity); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java b/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java deleted file mode 100644 index 38e648205..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/INeedleAmmo.java +++ /dev/null @@ -1,16 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.Entity; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -public interface INeedleAmmo { - - public boolean onHitEntity(ItemStack stac, EntityPlayer owner, Entity hit, double distance); - - public void onHitBlock(ItemStack stac, EntityPlayer owner, World world, int x, int y, int z, int side, double distance); - - public float getSpread(ItemStack stack); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java b/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java deleted file mode 100644 index e72db202c..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/IRandomMobProvider.java +++ /dev/null @@ -1,19 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.world.World; - -import java.util.List; - -public interface IRandomMobProvider { - - /** - * Called to provide random entities to be spawned by mystery SafariNets - * - * @param world - * The world object the entities will be spawned in. - * @return A list of RandomMob instances of entities that are all ready to - * be spawned in the world with no additional method calls. - */ - public List getRandomMobs(World world); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java b/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java deleted file mode 100644 index cb9a0d7ff..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/ISafariNetHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.item.ItemStack; - -import java.util.List; - -/** - * Defines an object that can display information about a captured mob in a - * Safari net. - * - * @author PowerCrystals - */ -public interface ISafariNetHandler { - - /** - * @return The class of mob that this handler applies to. - */ - public Class validFor(); - - /** - * Called to add information regarding a mob contained in a SafariNet. - * - * @param safariNetStack - * The Safari Net that is requesting information. - * @param player - * The player holding the Safari Net. - * @param infoList - * The current list of information strings. Add yours to this. - * @param advancedTooltips - * True if the advanced tooltips option is on. - */ - public void addInformation(ItemStack safariNetStack, EntityPlayer player, List infoList, boolean advancedTooltips); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java b/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java deleted file mode 100644 index b3cbfba9d..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/ISyringe.java +++ /dev/null @@ -1,64 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.EntityLivingBase; -import net.minecraft.item.ItemStack; -import net.minecraft.world.World; - -/** - * Defines a syringe for use in the Vet machine. - * - * @author PowerCrystals - */ -public interface ISyringe { - - /** - * Called when the vet is deciding if it should use this syringe. - * - * @param world - * The world instance. - * @param entity - * The entity being injected. - * @param syringe - * The syringe ItemStack. - * - * @return True if the entity can be injected by this syringe. - */ - public boolean canInject(World world, EntityLivingBase entity, ItemStack syringe); - - /** - * Called to perform an injection. - * - * @param world - * The world instance. - * @param entity - * The entity being injected. - * @param syringe - * The syringe ItemStack. - * - * @return True if injection was successful. - */ - public boolean inject(World world, EntityLivingBase entity, ItemStack syringe); - - /** - * Called to check if a syringe is empty - * - * @param syringe - * The syringe ItemStack. - * - * @return True if the syringe is empty - */ - public boolean isEmpty(ItemStack syringe); - - /** - * Called to get the empty syringe - *

- * Note: this will replace the syringe, max stacksize should be 1 - * - * @param syringe - * The syringe ItemStack. - * - * @return An empty syringe ItemStack - */ - public ItemStack getEmptySyringe(ItemStack syringe); - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java b/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java deleted file mode 100644 index 7f5dd7cc9..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/MobDrop.java +++ /dev/null @@ -1,21 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.ItemStack; -import net.minecraft.util.WeightedRandom; - -public class MobDrop extends WeightedRandom.Item -{ - private ItemStack _stack; - - public MobDrop(int weight, ItemStack stack) - { - super(weight); - _stack = stack; - } - - public ItemStack getStack() - { - if(_stack == null) return null; - return _stack.copy(); - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java b/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java deleted file mode 100644 index 86791cc54..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/RanchedItem.java +++ /dev/null @@ -1,68 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.FluidStack; - -/** - * @author skyboy026 - * - * Defines an ItemStack or a FluidStack that is the result of an entity being ranched - */ -public final class RanchedItem { - private final ItemStack item; - private final FluidStack fluid; - - public RanchedItem(Block item, int amount, int meta) - { - this(new ItemStack(item, amount, meta)); - } - - public RanchedItem(Block item, int amount) - { - this(new ItemStack(item, amount)); - } - - public RanchedItem(Block item) - { - this(new ItemStack(item)); - } - - public RanchedItem(Item item, int amount, int meta) - { - this(new ItemStack(item, amount, meta)); - } - - public RanchedItem(Item item, int amount) - { - this(new ItemStack(item, amount)); - } - - public RanchedItem(Item item) - { - this(new ItemStack(item)); - } - - public RanchedItem(ItemStack item) - { - this.item = item; - fluid = null; - } - - public RanchedItem(FluidStack fluid) - { - this.fluid = fluid; - item = null; - } - - public boolean hasFluid() - { - return item == null & fluid != null; - } - - public Object getResult() - { - return item == null ? fluid : item; - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java b/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java deleted file mode 100644 index 2ffa56b1a..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/RandomMob.java +++ /dev/null @@ -1,28 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.entity.Entity; -import net.minecraft.util.WeightedRandom; - -public class RandomMob extends WeightedRandom.Item -{ - private Entity _mob; - public final boolean shouldInit; - - public RandomMob(Entity savedMob, int weight, boolean init) - { - super(weight); - _mob = savedMob; - shouldInit = init; - } - - public RandomMob(Entity savedMob, int weight) - { - this(savedMob, weight, true); - } - - public Entity getMob() - { - if(_mob == null) return null; - return _mob; - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java b/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java deleted file mode 100644 index 88cd7a86f..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/ReplacementBlock.java +++ /dev/null @@ -1,137 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.block.Block; -import net.minecraft.item.Item; -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; - -public class ReplacementBlock -{ - protected byte _hasMeta; - protected int _meta; - protected final Block _block; - protected final NBTTagCompound _tileTag; - - /** - * Called to replace a block in the world. - * @param world The world object - * @param x The X coord - * @param y The Y coord - * @param z The Z coord - * @param stack The ItemStack being used to replace the block (may be null) - * @return True if the block was set successfully - */ - public boolean replaceBlock(World world, int x, int y, int z, ItemStack stack) - { - int meta = getMeta(world, x, y, z, stack); - if (world.setBlock(x, y, z, _block, meta, 3)) - { - if (hasTag(stack) && _block.hasTileEntity(meta)) - { - TileEntity tile = world.getTileEntity(x, y, z); - if (tile != null) - tile.readFromNBT(getTag(world, x, y, z, stack)); - } - return true; - } - return false; - } - - /** - * Called to get the metadata of the replacement block in the world. - * @param world The world object - * @param x The X coord - * @param y The Y coord - * @param z The Z coord - * @param stack The ItemStack being used to replace the block (may be null) - * @return The metadata of the block - */ - protected int getMeta(World world, int x, int y, int z, ItemStack stack) - { - int m = 0; - if (_hasMeta > 0) - { - if (_hasMeta > 1) - return _meta; - m = stack.getItemDamage(); - Item item = stack.getItem(); - if (item instanceof ItemBlock) - m = ((ItemBlock)item).getMetadata(m); - } - return m; - } - - /** - * Called to set the metdata of this ReplacementBlock to a fixed value - * @param meta The metadata of the block - * @return This instance - */ - public ReplacementBlock setMeta(int meta) - { - if (meta >= 0) - { - _hasMeta = 2; - _meta = meta; - } - return this; - } - - /** - * Called to set the metdata of this ReplacementBlock to a value read from an ItemStack - * @param meta The metadata of the block - * @return This instance - */ - public ReplacementBlock setMeta(boolean hasMeta) - { - _hasMeta = (byte) (hasMeta ? 1 : 0); - return this; - } - - /** - * Called to get the NBTTagCompound a TileEntity will read its state from - * @param world The world object - * @param x The X coord - * @param y The Y coord - * @param z The Z coord - * @param stack The ItemStack being used to replace the block (may be null) - * @return The NBTTagCompound a TileEntity will read its state from - */ - protected NBTTagCompound getTag(World world, int x, int y, int z, ItemStack stack) - { - return _tileTag; - } - - /** - * Called to see if a TileEntity should have its state set - * @param stack The ItemStack being used to replace the block (may be null) - * @return True if the TileEntity should have its state set - */ - protected boolean hasTag(ItemStack stack) - { - return _tileTag != null; - } - - public ReplacementBlock(Item block) - { - this(Block.getBlockFromItem(block)); - } - - public ReplacementBlock(Item block, NBTTagCompound tag) - { - this(Block.getBlockFromItem(block), tag); - } - - public ReplacementBlock(Block block) - { - this(block, null); - } - - public ReplacementBlock(Block block, NBTTagCompound tag) - { - _block = block; - _tileTag = tag; - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java b/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java deleted file mode 100644 index 3d075fa3b..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/ValuedItem.java +++ /dev/null @@ -1,72 +0,0 @@ -package powercrystals.minefactoryreloaded.api; - -import net.minecraft.item.ItemStack; - -public class ValuedItem -{ - public final int value; - public final ItemStack item; - public final String key; - public final Object object; - - public ValuedItem(int v, ItemStack i) - { - value = v; - item = i; - key = null; - object = null; - } - - public ValuedItem(String v, Object i) - { - value = -1; - item = null; - key = v; - object = i; - } - - /** - * Presently unused but included so that if they do get used in the future, - * people including this in their jar and loading before MFR don't destroy everyone - */ - - public ValuedItem(int v, Object i) - { - value = v; - item = null; - key = null; - object = i; - } - - public ValuedItem(String v, ItemStack i) - { - value = -1; - item = i; - key = v; - object = null; - } - - public ValuedItem(int v, String k, ItemStack i) - { - value = v; - item = i; - key = k; - object = null; - } - - public ValuedItem(int v, String k, Object i) - { - value = v; - item = null; - key = k; - object = i; - } - - public ValuedItem(int v, String k, ItemStack i, Object o) - { - value = v; - item = i; - key = k; - object = o; - } -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java deleted file mode 100644 index b6b8a23df..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInfo.java +++ /dev/null @@ -1,28 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.IChatComponent; -import net.minecraft.world.IBlockAccess; -import net.minecraftforge.common.util.ForgeDirection; - -import java.util.List; - -/** - * Defines a Block that can print information about itself using the RedNet Meter. This must be implemented on your Block class. - */ -public interface IRedNetInfo -{ - /** - * This function appends information to a list provided to it. - * - * @param world Reference to the world. - * @param x X coordinate of the block. - * @param y Y coordinate of the block. - * @param z Z coordinate of the block. - * @param side The side of the block that is being queried. - * @param player Player doing the querying - this can be NULL. - * @param info The list that the information should be appended to. - */ - public void getRedNetInfo(IBlockAccess world, int x, int y, int z, - ForgeDirection side, EntityPlayer player, List info); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java deleted file mode 100644 index a0f8b7094..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetInputNode.java +++ /dev/null @@ -1,51 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection; - -/** - * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. - *

- * Note that when you implement this, the RedNet network makes several assumptions about your code - - * It will not clamp values to 0 <= x <= 15. This means you must be able to accept any possible integer - * without crashing, even negatives. It will also assume that calling the onInput(s)Changed() methods - * are sufficient, and will not issue block updates. In Single mode, it will call onInputChanged. - *

- * RedNet cables have their subnets indicated to the user by colored bands on the cable. - * The color of a given subnet is the same as the wool with metadata equal to the subnet number. - *

- * For reference:
- * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, - * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black - */ -public interface IRedNetInputNode extends IRedNetConnection -{ - /** - * Called when the input values to this block change. Only called if your block is connected in "All" mode. - * Do not issue a network value update from inside this method call; it will be ignored. Issue your updates - * on the next tick. - * - * @param world The world this block is in. - * @param x This block's X coordinate. - * @param y This block's Y coordinate. - * @param z This block's Z coordinate. - * @param side The side the input values are being changed on. - * @param inputValues The new set of input values. This array will be 16 elements long. Do not alter or cache. - */ - public void onInputsChanged(World world, int x, int y, int z, ForgeDirection side, int[] inputValues); - - /** - * Called when the input value to this block changes. Only called if your block is connected in "Single" mode. - * Do not issue a network value update from inside this method call; it will be ignored. Issue your updates - * on the next tick. - * - * @param world The world this block is in. - * @param x This block's X coordinate. - * @param y This block's Y coordinate. - * @param z This block's Z coordinate. - * @param side The side the input values are being changed on. - * @param inputValue The new input value - */ - public void onInputChanged(World world, int x, int y, int z, ForgeDirection side, int inputValue); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java deleted file mode 100644 index 981ce06b6..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicCircuit.java +++ /dev/null @@ -1,19 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -import net.minecraft.nbt.NBTTagCompound; - -public interface IRedNetLogicCircuit -{ - public byte getInputCount(); - - public byte getOutputCount(); - - public int[] recalculateOutputValues(long worldTime, int[] inputValues); - - public String getUnlocalizedName(); - public String getInputPinLabel(int pin); - public String getOutputPinLabel(int pin); - - public void readFromNBT(NBTTagCompound tag); - public void writeToNBT(NBTTagCompound tag); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java deleted file mode 100644 index dd05969e9..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetLogicPoint.java +++ /dev/null @@ -1,36 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -/** - * - * @author skyboy - */ -public interface IRedNetLogicPoint -{ - /** - * - * @param out - * @return - */ - public void transformOutput(int[] out); - - /** - * - * @param out - * @return - */ - public void transformOutput(int out); - - /** - * - * @param in - * @return - */ - public int[] transformInput(int[] in); - - /** - * - * @param in - * @return - */ - public int transformInput(int in); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java deleted file mode 100644 index c9fb0bf81..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetNetworkContainer.java +++ /dev/null @@ -1,32 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * - * You should not implement this yourself. Instead, use this to look for cables to notify from your IRedNetOmniNode as this does not - * require a block update. This will be implemented on the cable's Block class. - * - */ -public interface IRedNetNetworkContainer -{ - /** - * Tells the network to recalculate all subnets. - * @param world The world this cable is in. - * @param x The x-coordinate of this cable. - * @param x The y-coordinate of this cable. - * @param x The z-coordinate of this cable. - */ - public void updateNetwork(World world, int x, int y, int z, ForgeDirection from); - - /** - * Tells the network to recalculate a specific subnet. - * @param world The world this cable is in. - * @param x The x-coordinate of this cable. - * @param x The y-coordinate of this cable. - * @param x The z-coordinate of this cable. - * @param subnet The subnet to recalculate. - */ - public void updateNetwork(World world, int x, int y, int z, int subnet, ForgeDirection from); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java deleted file mode 100644 index f2bdf397c..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOmniNode.java +++ /dev/null @@ -1,22 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -/** - * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. - *

- * Note that when you implement this, the RedNet network makes several assumptions about your code - - * It will not clamp values to 0 <= x <= 15. This means you must be able to accept any possible integer - * without crashing, even negatives. It will also assume that calling the onInput(s)Changed() methods - * are sufficient, and will not issue block updates. It will never call the vanilla redstone output - * methods, and will only query the methods contained in this interface. - *

- * RedNet cables have their subnets indicated to the user by colored bands on the cable. - * The color of a given subnet is the same as the wool with metadata equal to the subnet number. - *

- * For reference:
- * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, - * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black - */ -public interface IRedNetOmniNode extends IRedNetInputNode, IRedNetOutputNode -{ - // this is merely provided for convenience -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java deleted file mode 100644 index 8a0b41568..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/IRedNetOutputNode.java +++ /dev/null @@ -1,50 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; -import powercrystals.minefactoryreloaded.api.rednet.connectivity.IRedNetConnection; - -/** - * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. - *

- * Note that when you implement this, the RedNet network makes several assumptions about your code - - * It will never call the vanilla redstone output methods, querying only the methods contained in - * this interface, and will not issue block updates. - *

- * RedNet cables have their subnets indicated to the user by colored bands on the cable. - * The color of a given subnet is the same as the wool with metadata equal to the subnet number. - *

- * For reference:
- * 0:White, 1:Orange, 2:Magenta, 3:LightBlue, 4:Yellow, 5:Lime, 6:Pink, 7:Gray, - * 8:LightGray, 9:Cyan, 10:Purple, 11:Blue, 12:Brown, 13:Green, 14:Red, 15:Black - */ -public interface IRedNetOutputNode extends IRedNetConnection -{ - /** - * Returns the output values of this RedNet node. - * This array must be 16 elements long. - * Only called if your block is connected in "All" mode. - * - * @param world The world this block is in. - * @param x This block's X coordinate. - * @param y This block's Y coordinate. - * @param z This block's Z coordinate. - * @param side The side the output values are required for. - * @return The output values. - */ - public int[] getOutputValues(World world, int x, int y, int z, ForgeDirection side); - - /** - * Returns the output value of this RedNet node for a given subnet. - * Must be the same as getOutputValues(world, x, y, z, side)[subnet]. - * - * @param world The world this block is in. - * @param x This block's X coordinate. - * @param y This block's Y coordinate. - * @param z This block's Z coordinate. - * @param side The side the output value is required for. - * @param subnet The subnet to get the output value for (0-15). - * @return The output value. - */ - public int getOutputValue(World world, int x, int y, int z, ForgeDirection side, int subnet); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java deleted file mode 100644 index 003800d8f..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetConnection.java +++ /dev/null @@ -1,26 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet.connectivity; - -import net.minecraft.world.World; -import net.minecraftforge.common.util.ForgeDirection; - -/** - * Defines a Block that can connect to RedNet cables. This must be implemented on your Block class. - */ -public interface IRedNetConnection -{ - /** - * Returns the connection type of this Block. If this value must be changed - * while the block is alive, it must notify neighbors of a change. - *

- * For nodes that want to interact with rednet, - * see IRedNetInputNode, IRedNetOutputNode, and IRedNetOmniNode - * - * @param world The world this block is in. - * @param x This block's X coordinate. - * @param y This block's Y coordinate. - * @param z This block's Z coordinate. - * @param side The side that connection information is required for. - * @return The connection type. - */ - public RedNetConnectionType getConnectionType(World world, int x, int y, int z, ForgeDirection side); -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java deleted file mode 100644 index 89de12b13..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetDecorative.java +++ /dev/null @@ -1,11 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet.connectivity; - -/** - * This must be implemented on your Block class. - *

- * RedNet cables will treat your block similar to a vanilla block that's not redstone active. - */ -public interface IRedNetDecorative -{ - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java deleted file mode 100644 index 16225a74f..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedNetNoConnection.java +++ /dev/null @@ -1,13 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet.connectivity; - -/** - * This must be implemented on your Block class. - *

- * RedNet cables will not connect to your block. - *
- * This behavior can be overridden in subclasses by IRedNetConnection - */ -public interface IRedNetNoConnection -{ - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java deleted file mode 100644 index f3784cfbf..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/IRedstoneAlike.java +++ /dev/null @@ -1,10 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet.connectivity; - -/** - * This must be implemented on your Block class. - *

- * RedNet cables will treat your block similar to a redstone dust, and subtract one from the power value. - */ -public interface IRedstoneAlike { - -} diff --git a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java b/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java deleted file mode 100644 index 08ba24c1e..000000000 --- a/src/main/java/powercrystals/minefactoryreloaded/api/rednet/connectivity/RedNetConnectionType.java +++ /dev/null @@ -1,86 +0,0 @@ -package powercrystals.minefactoryreloaded.api.rednet.connectivity; - -import java.util.HashMap; -import java.util.Map; - -/** - * Defines how RedNet cable connects to a block - *

- * None: RedNet will never connect to this block (if this is all you want: use IRedNetNoConnection) - *

- * CableSingle: Connections will use the cable renderer with a single band, best used for whole blocks - *
- * PlateSingle: Connections will use the plate renderer with a single band, used for conveyers and rails - *

- * CableAll: Connections permit access to all 16 bands - *
- * PlateAll: Connections permit access to all 16 bands - *

- * Forced connection modes are best used for decoration blocks: RedNet will not connect normally, - * but will if the user forces it. Typically, IRedNetDecorative is desired for this instead - *

- * ForcedCableSingle: Connections permit access to a single band, only when the cable is in forced connection mode - *
- * ForcedPlateSingle: Connections permit access to a single band, only when the cable is in forced connection mode - *

- * ForcedCableAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode - *
- * ForcedPlateAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode - *

- * The decorative nodes are for when you want rednet to decide how to connect to your block, - * but also need to receive full updates from the network. - *

- * DecorativeSingle: Connections permit access to a single band, using standard connection logic - *
- * DecorativeAll: Connections permit access to all 16 bands, using standard connection logic - *
- * ForcedDecorativeSingle: Connections permit access to a single band, only when the cable is in forced connection mode - *
- * ForcedDecorativeAll: Connections permit access to all 16 bands, only when the cable is in forced connection mode - */ -public enum RedNetConnectionType -{ - None, // 0; 0000000 - CableSingle, // 11; 0001011 - PlateSingle, // 13; 0001101 - CableAll, // 19; 0010011 - PlateAll, // 21; 0010101 - ForcedCableSingle, // 43; 0101011 - ForcedPlateSingle, // 45; 0101101 - ForcedCableAll, // 51; 0110011 - ForcedPlateAll, // 53; 0110101 - DecorativeSingle, // NA; 0001001 - DecorativeAll, // NA; 0010001 - ForcedDecorativeSingle, // NA; 0101001 - ForcedDecorativeAll; // NA; 0110001 - - public final boolean isConnected = this.ordinal() != 0; // 0 bit (mask: 1) - public final boolean isSingleSubnet = this.name().endsWith("Single"); // 3 bit (mask: 8) - public final boolean isAllSubnets = this.name().endsWith("All"); // 4 bit (mask: 16) - public final boolean isPlate = this.name().contains("Plate"); // 2 bit (mask: 4) - public final boolean isCable = this.name().contains("Cable"); // 1 bit (mask: 2) - public final boolean isConnectionForced = this.name().startsWith("Forced"); // 5 bit (mask: 32) - public final boolean isDecorative = this.name().contains("Decorative"); - public final short flags = toFlags(isConnected, isCable, isPlate, - isSingleSubnet, isAllSubnets, isConnectionForced); - - public static final RedNetConnectionType fromFlags(short flags) - { - return connections.get(flags); - } - - private static final short toFlags(boolean ...flags) - { - short ret = 0; - for (int i = flags.length; i --> 0;) - ret |= (flags[i] ? 1 : 0) << i; - return ret; - } - - private static final Map connections = new HashMap(); - - static { - for (RedNetConnectionType type : RedNetConnectionType.values()) - connections.put(type.flags, type); - } -} diff --git a/src/main/resources/assets/actuallyadditions/lang/en_US.lang b/src/main/resources/assets/actuallyadditions/lang/en_US.lang index 45416c690..e2594c3db 100644 --- a/src/main/resources/assets/actuallyadditions/lang/en_US.lang +++ b/src/main/resources/assets/actuallyadditions/lang/en_US.lang @@ -44,7 +44,7 @@ tooltip.actuallyadditions.itemMiscRiceDough.desc=It's Dough, but made from Rice item.actuallyadditions.itemFoodRiceBread.name=Rice Bread tooltip.actuallyadditions.itemFoodRiceBread.desc=It's like Bread, but ricey! item.actuallyadditions.itemRiceSeed.name=Rice Seeds -tooltip.actuallyadditions.itemRiceSeed.desc=Grows on Water! +tooltip.actuallyadditions.itemRiceSeed.desc=Grows on Farmland! Makes delicious Rice! item.actuallyadditions.itemMiscTinyCoal.name=Tiny Coal tooltip.actuallyadditions.itemMiscTinyCoal.desc=Crafted from Coal, smelts one Item @@ -127,7 +127,7 @@ tooltip.actuallyadditions.itemCoffee.desc.1=Brewed in a Coffee Machine! See Effe tooltip.actuallyadditions.itemCoffee.desc.2=You can drink me %s times! item.actuallyadditions.itemCoffeeSeed.name=Coffee Seeds -tooltip.actuallyadditions.itemCoffeeSeed.desc=Grows Coffee on Grass Blocks +tooltip.actuallyadditions.itemCoffeeSeed.desc=Grows Coffee on Farmland tile.actuallyadditions.blockCoffee.name=Coffee Plant tooltip.actuallyadditions.blockCoffee.desc=Grows Coffee! Noms! @@ -135,12 +135,21 @@ tooltip.actuallyadditions.blockCoffee.desc=Grows Coffee! Noms! item.actuallyadditions.itemCoffeeBeans.name=Coffee Beans tooltip.actuallyadditions.itemCoffeeBeans.desc=Used in a Coffee Machine... delicious! +tile.actuallyadditions.blockWildCanola.name=Wild Canola +tile.actuallyadditions.blockWildRice.name=Wild Rice +tile.actuallyadditions.blockWildCoffee.name=Wild Coffee +tile.actuallyadditions.blockWildFlax.name=Wild Flax +tooltip.actuallyadditions.blockWildCanola.desc=Grows in the Wild... Gets you Canola Seeds! +tooltip.actuallyadditions.blockWildRice.desc=Grows in the Wild... Gets you Rice Seeds! +tooltip.actuallyadditions.blockWildCoffee.desc=Grows in the Wild... Gets you Coffee Seeds! +tooltip.actuallyadditions.blockWildFlax.desc=Grows in the Wild... Gets you Flax Seeds! + item.actuallyadditions.itemCanolaSeed.name=Canola Seeds -tooltip.actuallyadditions.itemCanolaSeed.desc=Grows on Grass! +tooltip.actuallyadditions.itemCanolaSeed.desc=Grows on Farmland! Makes Canola! item.actuallyadditions.itemMiscCanola.name=Canola tooltip.actuallyadditions.itemMiscCanola.desc=Used to make Oil in a Canola Press tile.actuallyadditions.blockCanola.name=Canola Plant -tooltip.actuallyadditions.blockCanola.desc=It's growing... kind of.. +tooltip.actuallyadditions.blockCanola.desc=It's growing... making Canola.. slowly! item.actuallyadditions.itemResonantRice.name=Resonant Rice tooltip.actuallyadditions.itemResonantRice.desc=Don't know what it does... maybe if you right-click it? @@ -182,17 +191,17 @@ tile.actuallyadditions.blockInputter.add.11.name=Extra-Long Solidifying Dissocia tile.actuallyadditions.blockInputter.add.12.name=Energetic Solo Dancer tile.actuallyadditions.blockInputter.add.13.name=Efficient Sucking Dilettant tile.actuallyadditions.blockInputter.add.14.name=Extreme Sand Digger -tile.actuallyadditions.blockInputter.add.15.name=MISSINGNO +tile.actuallyadditions.blockInputter.add.15.name=Ending Serious Daughter -item.actuallyadditions.itemDrillUpgradeSpeed.name=Drill Speed I Augment -item.actuallyadditions.itemDrillUpgradeSpeedII.name=Drill Speed II Augment -item.actuallyadditions.itemDrillUpgradeSpeedIII.name=Drill Speed III Augment +item.actuallyadditions.itemDrillUpgradeSpeed.name=Drill Speed Augment I +item.actuallyadditions.itemDrillUpgradeSpeedII.name=Drill Speed Augment II +item.actuallyadditions.itemDrillUpgradeSpeedIII.name=Drill Speed Augment III item.actuallyadditions.itemDrillUpgradeSilkTouch.name=Drill Silk Touch Augment -item.actuallyadditions.itemDrillUpgradeFortune.name=Drill Fortune I Augment -item.actuallyadditions.itemDrillUpgradeFortuneII.name=Drill Fortune II Augment +item.actuallyadditions.itemDrillUpgradeFortune.name=Drill Fortune Augment I +item.actuallyadditions.itemDrillUpgradeFortuneII.name=Drill Fortune Augment II (That gives you Fortune III as it says in the tooltip...) item.actuallyadditions.itemDrillUpgradeBlockPlacing.name=Drill Block Placing Augment -item.actuallyadditions.itemDrillUpgradeThreeByThree.name=Drill Three By Three Mining Augment -item.actuallyadditions.itemDrillUpgradeFiveByFive.name=Drill Five By Five Mining Augment +item.actuallyadditions.itemDrillUpgradeThreeByThree.name=Drill Mining Augment I +item.actuallyadditions.itemDrillUpgradeFiveByFive.name=Drill Mining Augment II tooltip.actuallyadditions.itemDrillUpgradeSpeed.desc=Makes the Drill faster! tooltip.actuallyadditions.itemDrillUpgradeSpeedII.desc=Makes the Drill even faster! Requires Tier 1. @@ -350,8 +359,9 @@ tooltip.actuallyadditions.blockInputter.desc.2=Acts like a more advanced Hopper tooltip.actuallyadditions.blockInputter.desc.3=Turn me off with Redstone! tooltip.actuallyadditions.blockInputter.desc.4=Configurable: tooltip.actuallyadditions.blockInputter.desc.5=-Side to Output to and Input from -tooltip.actuallyadditions.blockInputter.desc.6=-Slot in the other Inventory to Output to and Input from -tooltip.actuallyadditions.blockInputterAdvanced.desc=Has an Input and Output Filter! +tooltip.actuallyadditions.blockInputter.desc.6=-A Range of Slots in the other Inventory to Output to and Input from +tooltip.actuallyadditions.blockInputter.desc.7=-> Just input the Minimum and Maximum Slots into the input Fields! +tooltip.actuallyadditions.blockInputterAdvanced.desc=Has an Input and Output Filter! (White- and Blacklist!) tooltip.actuallyadditions.blockFishingNet.desc=Catches Fish automatically when placed above Water tooltip.actuallyadditions.blockFurnaceSolar.desc=Produces RF in Daylight tooltip.actuallyadditions.blockHeatCollector.desc.1=Produces RF @@ -454,12 +464,12 @@ info.actuallyadditions.gui.east=East info.actuallyadditions.gui.south=South info.actuallyadditions.gui.west=West info.actuallyadditions.gui.all=All -info.actuallyadditions.gui.slot=Slot info.actuallyadditions.gui.put=Put info.actuallyadditions.gui.pull=Pull info.actuallyadditions.gui.whitelist=Whitelist info.actuallyadditions.gui.blacklist=Blacklist info.actuallyadditions.gui.coffee=Coffee +info.actuallyadditions.gui.ok=Ok tooltip.actuallyadditions.uses.desc=Uses tooltip.actuallyadditions.produces.desc=Produces diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiCoffeeMachine.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiCoffeeMachine.png index 9a2081ca2a779c744e6c400c524d90d8039dcf0a..338f8beb8c936dccd21787812b92439051539413 100644 GIT binary patch literal 2563 zcmeHI`!m~F6u;jjgrN17U|Tf0%%&>pSvHbZDlB2^*=k8^6sM z&o3`8@9F93?d|RB>+A3D7mLLM0|SGDgL89p>+9J7t7?mOD(y%*0NaG>4c!R;RsE}AS=2~YNXjV| z`$SqCNIj9rWH~V7SXRysjt(wy`A%^FXe9diP(m}K-(S^Z*SKQyU;Oa4lKI`O%TI`{ zl9TV0N~4g4R|P4aP6n>?Gq11K>a3OUcj##S7?d)z_$GacqET~Au_-^WY;VlsHOnJl#KV4s!1$iOoD|j(OC+B*(Z1btZQ&V0;VPeq zDVX&?>hp{JbjIcg9x}9o-UxgVc=EsNl)bdeR;rl!%Gyx+lO*gquA9)k_1x648pk*0 zrMo!h1&t@S%L0t_9Ze%w8h>8ojzzNeHg)lmZ4gT(K2h73k5$3m;B%}MgpDgg(SWNz zUb+iPz{m?)$F1gf1I?Sxg;Uygx{-y5X}j}XOh-|tqC&x z;+S#w+9*Ll5>HtEfnKNF>Cf@z{08d6&3%j^7i5(gBe8+fXAq3*=zwjSoC|3Pf26O* z+UJ&s!pSqmRzMv!Tw)3$$i$aVa^^oXMOQRWVkYs!&co5Qu9NL^;JP+^q04|^XmQ(2 z>c%{t^2tlKhjg5L=VNmGLR#J4$IJG)SwqniZ*OS`*nwQ9cNHBUANG*ac2-*SqlqXl zMFcigGetcI4SuM=SUNxR%#*8Ylee-C9S9?20Xg>YC)}h;6(zz~@ z$SOU(*Lm|z?l29}Y+@rgl-|*+>P1EGbXfW-p|92itxu4S=2F-`Z69(Ez)G=XpA-+( zCM%Fpsw$e{T~EZhL%6X%F0#;CFyg1YYA5E7#TV_7;+q#khz#nRmSVir)}C|Fo4%U0 za5qnQ7|!!7(`zgQZ2HZf7bRkZM((<(;%j%z`{0GM^FbHhg#~O-iV8;^gN8# zLA9X9C}k=Qbi$J~FuqHzwF<~iso_;}gf~e?xvGb#AC>MSJiy5N8)~?!_W%F@ literal 2553 zcmeHJiBHpa6#xEua1BHnMaC*tC>9YZDpC%iRH+nHXgK7)oE#pMt5Ob;9|A!rEd?_! z$!Zi~K`0U9xS^b7G7f zT{QrJh7--f4FE_HLO=znfLqnx9tuE(Q?5_|c#-#wECdYz63{PuP!&9hM6$HBw6d}? z^22!8>3e#5#)kRE$H%i+tY--c9XMQec6Lrq4x7!+&CTU-I9x6_FE5YB;}sMXbar-j zb#--jclY%4^!E0OM54aFzS-H?&CSiNt*!0tZJA8Av$G?Y%XfEo6>ojDuL}I96bR~g zU$nOcbZ%p@kw4Xs4@+vsDm#9!-HHCn1Ss`N2`BZ9;$<0R4yw@(0ARGswE6 z7>2U3l+WB=vKd98%G9o={CxQib>4$XtZ8FM>La8M1vSb^f=fcLU@{tG{{y7T0~QF3 z86Fl)lL~sZe!T*eBCs8csIfhep*;3L9i4zQ=LTCNs#fj|7|6G0RG>k?F(@8U*D-u- z+SqePZGI3g76WGnWlp8y9J0zF9>rXN=FtBAhP-Rk2LgDDXarN!Pi7TrM%0CN=j;!F z#C#tigHvPWZ`&ssiJXvZe2+A#WOE-e2xDZ*!2|r!(>%Jc{Zak1l@Zm|(dQ;>;q~IV%unfMRG8o| z{joV}s;%)BE)x!V#D6taCBNDA@XcLb24W#>5oI?O7$9d5g1jVY&CLtJ>{FzUAi>jx ziDfatvCp}~Oiw}i(|wqr@jeE8Z-Z+&#KfHHqH8#rFwdKsRWPd+EeVR`L-*yJN_ zuNIFWqz|Ntit}V7m zE@nEBm|90&r#wMpgDd5i2H|6hYngBWcPsA6ffMJkdRJ~jjvZA)g<5;bKsKr+Ozb+J z^=BY4#cSA8Ejq|$+&TkA4-K|MtW7%31>#|2!_%t~c=#`x@T>}rgW~Ba zW?$9pIK12bZU&t}&XE4zpvK)2CtzKK1a)gek~~f``gL~4G?rjCP2K>6GOYTLhFNQx zGx(##j?i$pY__h+7!RAXQM|BxFk*tSFQp=AFKOV0wkmEwA1e3xTKrdp*CJ8sPs2_x TC`)=Mg^fF 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 G<$nQdoyvLu diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiInputterAdvanced.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiInputterAdvanced.png index ff204cabc4cf306dcdd922706d1acd228394cee3..8dc118cc9b5711254d0000bfe429c890d6fdbac0 100644 GIT binary patch delta 729 zcmbQnf0loOJ!fcW=z@tw-QC?A{a!OoEMQ}iGAXRsY|AXp$hDS%fp0A%-}{F2$#E=d z^~}beE{-7;ac^%ujJo9@;Fg$m@%R4ZsF#^SO4`yhSRR$1n_qdvAohNecQXI-%Zc`L zUs=!LlmDH`+IV>0zJLASs~U|D{En-t))xQ4lJJ}F7RQ6@dz6dcoKm*gDHz^+cWbeB z!{asm^V}+_E=VRKliF1>y86F&7 z`0Vjt>*FA~bFtHaCVqH2z4FOB-`Cw0DbH_&t#7F0es|9#p7C?tE7^trj{h$2WIq$b$d8LI2Nflx5hm>ZWD`15?4fO(3HfZ`g$te}A@V*4*g5OwaC?et%}PPU`o{ z@|LKpZ$yC77UhvZA2l%K$gi?|lWJzn_RpWiYt5>{4P#suzBsqR8Seu z^kGdVQx4mQuk2gzAKRSw<;SJB3~?r)AT6G*+Q6X9usvD2aQd`Xqhx4wVy{6kqF8II5bE$VY+m6EHX$M^=dre=*^WoQ8o)6!0pXXmY*RA%k z(~W!jI^GXI%ZrTlUhm2XdKm$m>%x<-43=X<~Wys7s=y5X&LhH``aXTLKW zt=AV+DBd&ucIn(&2EWaEQ^PIx1f2I{WD#hn-mcofz{GLj+roLL{pw%e)CBSh-fv?O zaA07(VOR3&H^aMSr?h3_R-``A$f1V5d*u{-B>N;;HjGp46A-Graj6B zK0fYT#jtvM9(%#F`~2CO&qr^zw>id76TA?y85}Sb4q9e0OV#G Date: Sun, 28 Jun 2015 12:42:38 +0200 Subject: [PATCH 29/29] -Update 0.0.6.2 --- build.gradle | 2 +- .../java/ellpeck/actuallyadditions/PLANNED.txt | 2 ++ .../ellpeck/actuallyadditions/gen/OreGen.java | 17 ++++++++++++----- .../actuallyadditions/items/ItemDrill.java | 2 +- .../ellpeck/actuallyadditions/util/ModUtil.java | 2 +- update/changelog.txt | 2 +- update/newestVersion.txt | 2 +- 7 files changed, 19 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 887dc9aa2..df88062ee 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ buildscript { apply plugin: 'forge' apply plugin: 'maven' -version = "1.7.10-0.0.6.1" +version = "1.7.10-0.0.6.2" group = "ellpeck.actuallyadditions" archivesBaseName = "ActuallyAdditions" diff --git a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt index f8ec91d38..84c7e0f5f 100644 --- a/src/main/java/ellpeck/actuallyadditions/PLANNED.txt +++ b/src/main/java/ellpeck/actuallyadditions/PLANNED.txt @@ -117,3 +117,5 @@ -Inventory Emitter -Emits a Redstone Signal dependant on the Amount of a specified Item in it -Items are configurable in the GUI + +-Enderman Teleport Stopper diff --git a/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java b/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java index 92c700067..513548c1c 100644 --- a/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java +++ b/src/main/java/ellpeck/actuallyadditions/gen/OreGen.java @@ -11,6 +11,7 @@ import ellpeck.actuallyadditions.util.Util; import net.minecraft.block.Block; import net.minecraft.init.Blocks; import net.minecraft.world.World; +import net.minecraft.world.WorldType; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.feature.WorldGenMinable; import org.apache.logging.log4j.Level; @@ -21,13 +22,17 @@ public class OreGen implements IWorldGenerator{ @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider){ - switch (world.provider.dimensionId){ + if(world.provider.terrainType == WorldType.FLAT) return; + + switch(world.provider.dimensionId){ case -1: generateNether(world, random, chunkX*16, chunkZ*16); - case 0: - generateSurface(world, random, chunkX*16, chunkZ*16); + //case 0: + // generateSurface(world, random, chunkX*16, chunkZ*16); case 1: generateEnd(world, random, chunkX*16, chunkZ*16); + default: + generateSurface(world, random, chunkX*16, chunkZ*16); } } @@ -37,7 +42,9 @@ public class OreGen implements IWorldGenerator{ } private void generateSurface(World world, Random random, int x, int z){ - if(ConfigBoolValues.GENERATE_QUARTZ.isEnabled()) this.addOreSpawn(InitBlocks.blockMisc, TheMiscBlocks.ORE_QUARTZ.ordinal(), Blocks.stone, world, random, x, z, this.getRandom(ConfigIntValues.BLACK_QUARTZ_BASE_AMOUNT.getValue(), ConfigIntValues.BLACK_QUARTZ_ADD_CHANCE.getValue(), random), ConfigIntValues.BLACK_QUARTZ_CHANCE.getValue(), ConfigIntValues.BLACK_QUARTZ_MIN_HEIGHT.getValue(), ConfigIntValues.BLACK_QUARTZ_MAX_HEIGHT.getValue()); + if(ConfigBoolValues.GENERATE_QUARTZ.isEnabled()){ + this.addOreSpawn(InitBlocks.blockMisc, TheMiscBlocks.ORE_QUARTZ.ordinal(), Blocks.stone, world, random, x, z, this.getRandom(ConfigIntValues.BLACK_QUARTZ_BASE_AMOUNT.getValue(), ConfigIntValues.BLACK_QUARTZ_ADD_CHANCE.getValue(), random), ConfigIntValues.BLACK_QUARTZ_CHANCE.getValue(), ConfigIntValues.BLACK_QUARTZ_MIN_HEIGHT.getValue(), ConfigIntValues.BLACK_QUARTZ_MAX_HEIGHT.getValue()); + } } @SuppressWarnings("unused") @@ -64,6 +71,6 @@ public class OreGen implements IWorldGenerator{ public static void init(){ Util.logInfo("Registering World Generator..."); - GameRegistry.registerWorldGenerator(new OreGen(), 0); + GameRegistry.registerWorldGenerator(new OreGen(), 10); } } diff --git a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java index 98e8171d3..6c99a0359 100644 --- a/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java +++ b/src/main/java/ellpeck/actuallyadditions/items/ItemDrill.java @@ -332,7 +332,7 @@ public class ItemDrill extends ItemEnergyContainer implements INameableItem{ if(!world.isRemote){ if(!living.isSneaking() && this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.THREE_BY_THREE)){ if(this.getHasUpgrade(stack, ItemDrillUpgrade.UpgradeType.FIVE_BY_FIVE)){ - this.breakBlocks(stack, 30, world, x, y, z, player); + this.breakBlocks(stack, 2, world, x, y, z, player); } else this.breakBlocks(stack, 1, world, x, y, z, player); } diff --git a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java index b0cb19646..311925da6 100644 --- a/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java +++ b/src/main/java/ellpeck/actuallyadditions/util/ModUtil.java @@ -5,7 +5,7 @@ import org.apache.logging.log4j.Logger; public class ModUtil{ - public static final String VERSION = "1.7.10-0.0.6.1"; + public static final String VERSION = "1.7.10-0.0.6.2"; public static final String MOD_ID = "ActuallyAdditions"; public static final String NAME = "Actually Additions"; diff --git a/update/changelog.txt b/update/changelog.txt index 336016a25..cb483726c 100644 --- a/update/changelog.txt +++ b/update/changelog.txt @@ -1 +1 @@ -Coffee Machine needs Water, ESD Revamp, Plants grow on Farmland \ No newline at end of file +Really Important Fix for the Drill! \ No newline at end of file diff --git a/update/newestVersion.txt b/update/newestVersion.txt index 6bdb112d2..469a92910 100644 --- a/update/newestVersion.txt +++ b/update/newestVersion.txt @@ -1 +1 @@ -1.7.10-0.0.6.1 \ No newline at end of file +1.7.10-0.0.6.2 \ No newline at end of file