Reworked compost to accept custom recipes

This commit is contained in:
Ellpeck 2016-05-20 17:55:33 +02:00
parent 93b51eb853
commit b71af53d13
11 changed files with 173 additions and 68 deletions

View file

@ -16,6 +16,7 @@ import de.ellpeck.actuallyadditions.api.internal.IMethodHandler;
import de.ellpeck.actuallyadditions.api.lens.Lens;
import de.ellpeck.actuallyadditions.api.lens.LensConversion;
import de.ellpeck.actuallyadditions.api.recipe.*;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraftforge.oredict.OreDictionary;
@ -29,7 +30,7 @@ public class ActuallyAdditionsAPI{
public static final String MOD_ID = "actuallyadditions";
public static final String API_ID = MOD_ID+"api";
public static final String API_VERSION = "14";
public static final String API_VERSION = "15";
/**
* Use this to handle things that aren't based in the API itself
@ -44,6 +45,7 @@ public class ActuallyAdditionsAPI{
public static final List<LensConversionRecipe> RECONSTRUCTOR_LENS_CONVERSION_RECIPES = new ArrayList<LensConversionRecipe>();
public static final Map<Item, IColorLensChanger> RECONSTRUCTOR_LENS_COLOR_CHANGERS = new HashMap<Item, IColorLensChanger>();
public static final List<CoffeeIngredient> COFFEE_MACHINE_INGREDIENTS = new ArrayList<CoffeeIngredient>();
public static final List<CompostRecipe> COMPOST_RECIPES = new ArrayList<CompostRecipe>();
public static final List<IBookletEntry> BOOKLET_ENTRIES = new ArrayList<IBookletEntry>();
public static final List<BookletPage> BOOKLET_PAGES_WITH_ITEM_DATA = new ArrayList<BookletPage>();
@ -134,6 +136,19 @@ public class ActuallyAdditionsAPI{
}
}
/**
* Adds a new conversion recipe to the compost.
* StackSize is regarded on both input and output and they can be different.
*
* @param input The itemstack to be input into the compost
* @param inputDisplay The block to display when there is input in the compost
* @param output The itemstack to be output from the compost once conversion finishes
* @param outputDisplay The block to display when there is output in the compost
*/
public static void addCompostRecipe(ItemStack input, Block inputDisplay, ItemStack output, Block outputDisplay){
COMPOST_RECIPES.add(new CompostRecipe(input, inputDisplay, output, outputDisplay));
}
/**
* Adds an item to the list of possible items to be returned when right-clicking a Ball Of Fur
*

View file

@ -0,0 +1,30 @@
/*
* This file ("CompostRecipe.java") is part of the Actually Additions mod for Minecraft.
* It is created and owned by Ellpeck and distributed
* under the Actually Additions License to be found at
* http://ellpeck.de/actaddlicense
* View the source code at https://github.com/Ellpeck/ActuallyAdditions
*
* © 2015-2016 Ellpeck
*/
package de.ellpeck.actuallyadditions.api.recipe;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
public class CompostRecipe{
public ItemStack input;
public ItemStack output;
public Block inputDisplay;
public Block outputDisplay;
public CompostRecipe(ItemStack input, Block inputDisplay, ItemStack output, Block outputDisplay){
this.input = input;
this.output = output;
this.inputDisplay = inputDisplay;
this.outputDisplay = outputDisplay;
}
}

View file

@ -10,10 +10,8 @@
package de.ellpeck.actuallyadditions.mod.blocks;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.mod.blocks.base.BlockContainerBase;
import de.ellpeck.actuallyadditions.mod.items.ItemFertilizer;
import de.ellpeck.actuallyadditions.mod.items.ItemMisc;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;
import de.ellpeck.actuallyadditions.mod.tile.TileEntityCompost;
import de.ellpeck.actuallyadditions.mod.util.AssetUtil;
import de.ellpeck.actuallyadditions.mod.util.StringUtil;
@ -57,8 +55,6 @@ public class BlockCompost extends BlockContainerBase implements IHudDisplay{
this.setHardness(0.5F);
this.setResistance(5.0F);
this.setSoundType(SoundType.WOOD);
//this.setBlockBoundsForItemRender();
}
@Nonnull
@ -89,36 +85,59 @@ public class BlockCompost extends BlockContainerBase implements IHudDisplay{
@Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, ItemStack stackPlayer, EnumFacing f6, float f7, float f8, float f9){
if(!world.isRemote){
TileEntityCompost tile = (TileEntityCompost)world.getTileEntity(pos);
if(tile != null){
//Add items to be composted
if(stackPlayer != null && stackPlayer.getItem() instanceof ItemMisc && stackPlayer.getItemDamage() == TheMiscItems.MASHED_FOOD.ordinal() && (tile.slots[0] == null || (!(tile.slots[0].getItem() instanceof ItemFertilizer) && tile.slots[0].stackSize < TileEntityCompost.AMOUNT))){
if(tile.slots[0] == null){
tile.slots[0] = new ItemStack(stackPlayer.getItem(), 1, TheMiscItems.MASHED_FOOD.ordinal());
}
else{
tile.slots[0].stackSize++;
}
if(!player.capabilities.isCreativeMode){
stackPlayer.stackSize--;
}
tile.markDirty();
}
TileEntity tile = world.getTileEntity(pos);
if(tile instanceof TileEntityCompost){
TileEntityCompost compost = (TileEntityCompost)tile;
ItemStack slot = compost.getStackInSlot(0);
CompostRecipe recipeIn = TileEntityCompost.getRecipeForInput(slot);
if(slot == null || recipeIn != null){
if(stackPlayer != null){
CompostRecipe recipeHand = TileEntityCompost.getRecipeForInput(stackPlayer);
if(recipeHand != null && (recipeIn == null || recipeIn == recipeHand)){
int maxAdd = Math.min(recipeHand.input.stackSize, stackPlayer.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(slot == null){
ItemStack stackToAdd = stackPlayer.copy();
stackToAdd.stackSize = maxAdd;
compost.setInventorySlotContents(0, stackToAdd);
player.inventory.decrStackSize(player.inventory.currentItem, maxAdd);
return true;
}
else{
ItemStack stackIn = slot.copy();
if(stackIn.stackSize < recipeHand.input.stackSize){
int sizeAdded = Math.min(maxAdd, recipeHand.input.stackSize-stackIn.stackSize);
stackIn.stackSize+=sizeAdded;
compost.setInventorySlotContents(0, stackIn);
player.inventory.decrStackSize(player.inventory.currentItem, sizeAdded);
return true;
}
}
}
}
}
else{
if(stackPlayer == null){
player.inventory.setInventorySlotContents(player.inventory.currentItem, tile.slots[0].copy());
player.inventory.setInventorySlotContents(player.inventory.currentItem, slot.copy());
compost.setInventorySlotContents(0, null);
return true;
}
else{
stackPlayer.stackSize += tile.slots[0].stackSize;
else if(stackPlayer.isItemEqual(slot)){
int addedStackSize = Math.min(slot.stackSize, stackPlayer.getMaxStackSize()-stackPlayer.stackSize);
ItemStack stackToAdd = stackPlayer.copy();
stackToAdd.stackSize += addedStackSize;
player.inventory.setInventorySlotContents(player.inventory.currentItem, stackToAdd);
compost.decrStackSize(0, addedStackSize);
return true;
}
tile.slots[0] = null;
tile.markDirty();
}
}
}
return true;
else{
return true;
}
return false;
}
@Nonnull

View file

@ -10,13 +10,15 @@
package de.ellpeck.actuallyadditions.mod.blocks.render;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.mod.tile.TileEntityCompost;
import de.ellpeck.actuallyadditions.mod.util.AssetUtil;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import javax.annotation.Nonnull;
@ -27,17 +29,35 @@ public class RenderCompost extends TileEntitySpecialRenderer{
public void renderTileEntityAt(@Nonnull TileEntity te, double x, double y, double z, float partialTicks, int destroyStage){
if(te instanceof TileEntityCompost){
TileEntityCompost compost = (TileEntityCompost)te;
if(compost.getStackInSlot(0) != null){
float i = compost.getAmount()/TileEntityCompost.AMOUNT;
GlStateManager.pushMatrix();
GlStateManager.translate((float)x+0.5F, (float)y+(i/3F)+0.01F, (float)z+0.5F);
//Hehe
if("ShadowfactsDev".equals(Minecraft.getMinecraft().thePlayer.getName())){
GlStateManager.translate(0F, 1F, 0F);
ItemStack slot = compost.getStackInSlot(0);
if(slot != null){
Block display = null;
int maxAmount = 0;
for(CompostRecipe aRecipe : ActuallyAdditionsAPI.COMPOST_RECIPES){
if(slot.isItemEqual(aRecipe.input)){
display = aRecipe.inputDisplay;
maxAmount = aRecipe.input.stackSize;
break;
}
else if(slot.isItemEqual(aRecipe.output)){
display = aRecipe.outputDisplay;
maxAmount = aRecipe.output.stackSize;
break;
}
}
if(display != null){
float i = (float)slot.stackSize/(float)maxAmount;
GlStateManager.pushMatrix();
GlStateManager.translate((float)x+0.5F, (float)y+(i/3F)+0.01F, (float)z+0.5F);
//Hehe
if("ShadowfactsDev".equals(Minecraft.getMinecraft().thePlayer.getName())){
GlStateManager.translate(0F, 1F, 0F);
}
GlStateManager.scale(1.5F, i, 1.5F);
AssetUtil.renderBlockInWorld(display, 0);
GlStateManager.popMatrix();
}
GlStateManager.scale(1.5F, i, 1.5F);
AssetUtil.renderBlockInWorld(Blocks.DIRT, compost.getStackInSlot(0).getItem() == InitItems.itemFertilizer ? 1 : 0);
GlStateManager.popMatrix();
}
}
}

View file

@ -99,7 +99,7 @@ public class InitBooklet{
new BookletChapter("greenhouseGlass", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockGreenhouseGlass), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeGlass));
new BookletChapter("fishingNet", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockFishingNet), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeFisher).setNoText());
new BookletChapter("feeder", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockFeeder), new PageTextOnly(1), new PageCrafting(2, BlockCrafting.recipeFeeder).setNoText());
new BookletChapter("compost", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockCompost), new PageTextOnly(1).setStack(new ItemStack(InitItems.itemFertilizer)).addTextReplacement("<num>", TileEntityCompost.AMOUNT), new PageCrafting(2, BlockCrafting.recipeCompost).setNoText(), new PageCrafting(3, ItemCrafting.recipesMashedFood));
new BookletChapter("compost", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockCompost), new PageTextOnly(1).setStack(new ItemStack(InitItems.itemFertilizer)), new PageCrafting(2, BlockCrafting.recipeCompost).setNoText(), new PageCrafting(3, ItemCrafting.recipesMashedFood));
new BookletChapter("crate", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockGiantChest), new PageCrafting(1, BlockCrafting.recipeCrate), new PageCrafting(2, ItemCrafting.recipeCrateKeeper), new PageCrafting(3, ItemCrafting.recipeChestToCrateUpgrade));
new BookletChapter("rangedCollector", ActuallyAdditionsAPI.entryFunctionalNonRF, new ItemStack(InitBlocks.blockRangedCollector), new PageTextOnly(1).addTextReplacement("<range>", TileEntityRangedCollector.RANGE), new PageCrafting(2, BlockCrafting.recipeRangedCollector).setNoText());

View file

@ -105,12 +105,12 @@ public class CrusherCrafting{
recipeDiamondHorseArmor = RecipeUtil.lastCrusherRecipe();
}
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("oreNether", 6));
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("orePoor", 4, "nugget"));
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("denseore", 8));
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("gem", 1));
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("ingot", 1));
CrusherRecipeRegistry.searchCases.add(new CrusherRecipeRegistry.SearchCase("ore", 2));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("oreNether", 6));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("orePoor", 4, "nugget"));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("denseore", 8));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("gem", 1));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("ingot", 1));
CrusherRecipeRegistry.SEARCH_CASES.add(new CrusherRecipeRegistry.SearchCase("ore", 2));
CrusherRecipeRegistry.registerFinally();
}

View file

@ -10,7 +10,12 @@
package de.ellpeck.actuallyadditions.mod.crafting;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
import net.minecraft.init.Blocks;
import net.minecraft.item.ItemStack;
public class InitCrafting{
@ -22,6 +27,8 @@ public class InitCrafting{
MiscCrafting.init();
FoodCrafting.init();
ToolCrafting.init();
ActuallyAdditionsAPI.addCompostRecipe(new ItemStack(InitItems.itemMisc, 10, TheMiscItems.MASHED_FOOD.ordinal()), Blocks.LEAVES, new ItemStack(InitItems.itemFertilizer, 10), Blocks.DIRT);
}
}

View file

@ -13,6 +13,7 @@ package de.ellpeck.actuallyadditions.mod.gen.cave;
import de.ellpeck.actuallyadditions.mod.config.ConfigValues;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.mod.misc.WorldData;
import de.ellpeck.actuallyadditions.mod.util.ModUtil;
import de.ellpeck.actuallyadditions.mod.util.Util;
import de.ellpeck.actuallyadditions.mod.util.playerdata.PersistentServerData;
import net.minecraft.entity.player.EntityPlayerMP;
@ -36,6 +37,8 @@ public class CaveWorldType extends WorldType{
super("actaddcaveworld");
Util.registerEvent(this);
ModUtil.LOGGER.info("Cave World config enabled! Registering cave world type...");
}
public static boolean isCave(World world){

View file

@ -24,7 +24,7 @@ import java.util.List;
public class CrusherRecipeRegistry{
public static final ArrayList<SearchCase> searchCases = new ArrayList<SearchCase>();
public static final ArrayList<SearchCase> SEARCH_CASES = new ArrayList<SearchCase>();
public static void registerFinally(){
ArrayList<String> oresNoResult = new ArrayList<String>();
@ -32,7 +32,7 @@ public class CrusherRecipeRegistry{
for(String ore : OreDictionary.getOreNames()){
if(!hasException(ore)){
for(SearchCase theCase : searchCases){
for(SearchCase theCase : SEARCH_CASES){
if(ore.length() > theCase.theCase.length()){
if(ore.substring(0, theCase.theCase.length()).equals(theCase.theCase)){
String output = theCase.resultPreString+ore.substring(theCase.theCase.length());

View file

@ -10,7 +10,8 @@
package de.ellpeck.actuallyadditions.mod.tile;
import de.ellpeck.actuallyadditions.mod.items.InitItems;
import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI;
import de.ellpeck.actuallyadditions.api.recipe.CompostRecipe;
import de.ellpeck.actuallyadditions.mod.items.ItemFertilizer;
import de.ellpeck.actuallyadditions.mod.items.ItemMisc;
import de.ellpeck.actuallyadditions.mod.items.metalists.TheMiscItems;
@ -22,7 +23,6 @@ import javax.annotation.Nonnull;
public class TileEntityCompost extends TileEntityInventoryBase{
public static final int AMOUNT = 10;
public int conversionTime;
public TileEntityCompost(){
@ -35,10 +35,6 @@ public class TileEntityCompost extends TileEntityInventoryBase{
compound.setInteger("ConversionTime", this.conversionTime);
}
public float getAmount(){
return this.getStackInSlot(0) != null ? this.getStackInSlot(0).stackSize : 0F;
}
@Override
public boolean shouldSyncSlots(){
return true;
@ -55,27 +51,31 @@ public class TileEntityCompost extends TileEntityInventoryBase{
super.updateEntity();
if(!this.worldObj.isRemote){
boolean theFlag = this.conversionTime > 0;
if(this.slots[0] != null && !(this.slots[0].getItem() instanceof ItemFertilizer) && this.slots[0].stackSize >= AMOUNT){
this.conversionTime++;
if(this.conversionTime >= 2000){
this.slots[0] = new ItemStack(InitItems.itemFertilizer, AMOUNT);
if(this.slots[0] != null){
CompostRecipe recipe = getRecipeForInput(this.slots[0]);
if(recipe != null && this.slots[0].isItemEqual(recipe.input) && this.slots[0].stackSize >= recipe.input.stackSize){
this.conversionTime++;
if(this.conversionTime >= 3000){
this.slots[0] = recipe.output.copy();
this.conversionTime = 0;
this.markDirty();
}
}
else{
this.conversionTime = 0;
}
}
if(theFlag != this.conversionTime > 0){
this.markDirty();
}
}
}
@Override
public int getInventoryStackLimit(){
return AMOUNT;
}
@Override
public boolean isItemValidForSlot(int i, @Nonnull ItemStack stack){
return stack.getItem() instanceof ItemMisc && stack.getItemDamage() == TheMiscItems.MASHED_FOOD.ordinal();
return getRecipeForInput(stack) != null;
}
@Override
@ -91,6 +91,17 @@ public class TileEntityCompost extends TileEntityInventoryBase{
@Override
public boolean canExtractItem(int slot, @Nonnull ItemStack stack, @Nonnull EnumFacing side){
return stack.getItem() instanceof ItemFertilizer;
return getRecipeForInput(stack) == null;
}
public static CompostRecipe getRecipeForInput(ItemStack input){
if(input != null){
for(CompostRecipe recipe : ActuallyAdditionsAPI.COMPOST_RECIPES){
if(input.isItemEqual(recipe.input)){
return recipe;
}
}
}
return null;
}
}

View file

@ -713,7 +713,7 @@ booklet.actuallyadditions.chapter.feeder.name=Feeder
booklet.actuallyadditions.chapter.feeder.text.1=The <item>Feeder<r> is a good alternative to a manual animal farm. Place it in the middle of an animal pen and supply it with some wheat, seeds or carrots, depending on the animal you want to feed, and just wait. It will <imp>automatically feed the animals<r> and if there is enough animals near it, it will <imp>shut off on its own<r> to prevent lag or animal overflow. <n><n><i>Greenpeace approves
booklet.actuallyadditions.chapter.compost.name=Compost and Fertilizer
booklet.actuallyadditions.chapter.compost.text.1=The <item>Compost<r> is used to make <item>Fertilizier<r> from <item>Mashed Food<r>. <item>Fertilizer<r> acts just like Bone Meal, but can be crafted in a much simpler manner just by crafting <item>Mashed Food<r> and then putting <num> of those inside of a <item>Compost<r> and waiting for a bit. When the mashed food is composted, just take it out by right-clicking again.
booklet.actuallyadditions.chapter.compost.text.1=The <item>Compost<r> is used to make <item>Fertilizier<r> from <item>Mashed Food<r>. <item>Fertilizer<r> acts just like Bone Meal, but can be crafted in a much simpler manner just by crafting <item>Mashed Food<r> and then putting 10 of those inside of a <item>Compost<r> and waiting for a bit. When the mashed food is composted, just take it out by right-clicking again. <n><n>This, however, also works for some other items, which will be explained when needed.
booklet.actuallyadditions.chapter.compost.text.3=<item>Mashed Food<r> can be crafted from <imp>any type of food or plantable item<r>.
booklet.actuallyadditions.chapter.crate.name=Storage Crates