Skip to content

Commit

Permalink
Allow dispensers to perform some cauldron recipes, specifically those…
Browse files Browse the repository at this point in the history
… to fill fluid containers
  • Loading branch information
KnightMiner committed Aug 14, 2018
1 parent 237e000 commit e239c2f
Show file tree
Hide file tree
Showing 3 changed files with 182 additions and 0 deletions.
22 changes: 22 additions & 0 deletions src/main/java/knightminer/inspirations/common/Config.java
Expand Up @@ -117,6 +117,23 @@ public class Config {
private static String[] cauldronFire = {
"minecraft:fire"
};
// cauldron - fluid containers
public static boolean enableCauldronDispenser = true;
public static String[] cauldronDispenserRecipes = {
"inspirations:dyed_bottle",
"inspirations:materials:2",
"inspirations:materials:3",
"minecraft:beetroot_soup",
"minecraft:bowl",
"minecraft:glass_bottle",
"minecraft:lingering_potion",
"minecraft:mushroom_stew",
"minecraft:potion",
"minecraft:rabbit_stew",
"minecraft:splash_potion",
"toughasnails:fruit_juice",
"toughasnails:purified_water_bottle"
};
// anvil smashing
public static boolean enableAnvilSmashing = true;
private static String[] anvilSmashing = {
Expand Down Expand Up @@ -340,6 +357,11 @@ public static void preInit(FMLPreInitializationEvent event) {
enableCauldronBrewing = configFile.getBoolean("brewing", "recipes.cauldron.potions", extraBottleRecipes, "Allows cauldrons to perform brewing recipes.") && enableCauldronBrewing;
expensiveCauldronBrewing = configFile.getBoolean("brewingExpensive", "recipes.cauldron.potions", expensiveCauldronBrewing, "Caps brewing at 2 potions per ingredient, requiring 2 ingredients for a full cauldron. Makes the brewing stand still useful and balances better against the bigger cauldron.") && enableCauldronBrewing;
InspirationsRegistry.setConfig("expensiveCauldronBrewing", expensiveCauldronBrewing);

// dispensers
enableCauldronDispenser = configFile.getBoolean("dispenser", "recipes.cauldron", enableCauldronDispenser, "Allows dispensers to perform some recipes in the cauldron. Intended to be used for recipes to fill and empty fluid containers as droppers can already be used for recipes") && enableCauldronRecipes;
cauldronDispenserRecipes = configFile.get("recipes.cauldron.dispenser", "items", cauldronDispenserRecipes,
"List of itemstacks that can be used as to perform cauldron recipes in a dispenser").getStringList();
}

// tools
Expand Down
@@ -1,5 +1,10 @@
package knightminer.inspirations.recipes;

import java.util.Collection;
import java.util.Map;

import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import com.google.common.eventbus.Subscribe;

import knightminer.inspirations.Inspirations;
Expand All @@ -12,8 +17,10 @@
import knightminer.inspirations.library.recipe.cauldron.CauldronDyeRecipe;
import knightminer.inspirations.library.recipe.cauldron.CauldronFluidRecipe;
import knightminer.inspirations.library.recipe.cauldron.FillCauldronRecipe;
import knightminer.inspirations.library.util.RecipeUtil;
import knightminer.inspirations.recipes.block.BlockEnhancedCauldron;
import knightminer.inspirations.recipes.block.BlockSmashingAnvil;
import knightminer.inspirations.recipes.dispenser.DispenseCauldronRecipe;
import knightminer.inspirations.recipes.item.ItemDyedWaterBottle;
import knightminer.inspirations.recipes.recipe.ArmorClearRecipe;
import knightminer.inspirations.recipes.recipe.ArmorDyeingCauldronRecipe;
Expand All @@ -32,6 +39,7 @@
import knightminer.inspirations.shared.InspirationsShared;
import knightminer.inspirations.utility.InspirationsUtility;
import net.minecraft.block.Block;
import net.minecraft.block.BlockDispenser;
import net.minecraft.block.material.Material;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
Expand Down Expand Up @@ -166,6 +174,7 @@ public void init(FMLInitializationEvent event) {
if(Config.enableCauldronRecipes) {
registerCauldronRecipes();
}
registerDispenserBehavior();
}

@Subscribe
Expand Down Expand Up @@ -295,4 +304,29 @@ private void findRecipesFromBrewingRegistry() {
}
}
}

private void registerDispenserBehavior() {
if(Config.enableCauldronDispenser) {
Multimap<Item,Integer> map = HashMultimap.create();
for(String line : Config.cauldronDispenserRecipes) {
ItemStack stack = RecipeUtil.getItemStackFromString(line, true);
map.put(stack.getItem(), stack.getMetadata());
}
for(Map.Entry<Item,Collection<Integer>> entry : map.asMap().entrySet()) {
registerDispenseCauldronLogic(entry.getKey(), toArray(entry.getValue()));
}
}
}

private static int[] toArray(Collection<Integer> list) {
// if there is a wildcard, return an empty list to signify all meta
if(list.contains(OreDictionary.WILDCARD_VALUE)) {
return new int[0];
}
return list.stream().mapToInt(i->i).toArray();
}

private static void registerDispenseCauldronLogic(Item item, int[] meta) {
registerDispenserBehavior(item, new DispenseCauldronRecipe(BlockDispenser.DISPENSE_BEHAVIOR_REGISTRY.getObject(item), meta));
}
}
@@ -0,0 +1,126 @@
package knightminer.inspirations.recipes.dispenser;

import knightminer.inspirations.common.Config;
import knightminer.inspirations.library.InspirationsRegistry;
import knightminer.inspirations.library.recipe.cauldron.ICauldronRecipe;
import knightminer.inspirations.library.recipe.cauldron.ICauldronRecipe.CauldronState;
import knightminer.inspirations.recipes.block.BlockEnhancedCauldron;
import knightminer.inspirations.recipes.tileentity.TileCauldron;
import net.minecraft.block.BlockCauldron;
import net.minecraft.block.BlockDispenser;
import net.minecraft.block.state.IBlockState;
import net.minecraft.dispenser.BehaviorDefaultDispenseItem;
import net.minecraft.dispenser.IBehaviorDispenseItem;
import net.minecraft.dispenser.IBlockSource;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityDispenser;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;

public class DispenseCauldronRecipe extends BehaviorDefaultDispenseItem {
private static final BehaviorDefaultDispenseItem DEFAULT = new BehaviorDefaultDispenseItem();
private IBehaviorDispenseItem fallback;
private int[] validMeta;
public DispenseCauldronRecipe(IBehaviorDispenseItem fallback, int... validMeta) {
this.fallback = fallback;
this.validMeta = validMeta;
}

private boolean isMetaValid(ItemStack stack) {
if(validMeta.length == 0) {
return true;
}
int meta = stack.getMetadata();
for(int i : validMeta) {
if(i == meta) {
return true;
}
}
return false;
}

@Override
protected ItemStack dispenseStack(IBlockSource source, ItemStack stack) {
if(!isMetaValid(stack)) {
return fallback.dispense(source, stack);
}

EnumFacing side = source.getBlockState().getValue(BlockDispenser.FACING);
BlockPos pos = source.getBlockPos().offset(side);
World world = source.getWorld();
IBlockState state = world.getBlockState(pos);
if(!(state.getBlock() instanceof BlockCauldron)) {
return fallback.dispense(source, stack);
}

// grab the TE if extended
TileCauldron cauldron = null;
CauldronState cauldronState = CauldronState.WATER;
boolean boiling = false;
if(Config.enableExtendedCauldron) {
TileEntity te = world.getTileEntity(pos);
if(te instanceof TileCauldron) {
cauldron = (TileCauldron) te;
cauldronState = cauldron.getState();
boiling = state.getValue(BlockEnhancedCauldron.BOILING);
}
} else {
boiling = InspirationsRegistry.isCauldronFire(world.getBlockState(pos.down()));
}

// other properties
int level = BlockEnhancedCauldron.getCauldronLevel(state);

// grab recipe
ICauldronRecipe recipe = InspirationsRegistry.getCauldronResult(stack, boiling, level, cauldronState);
if(recipe == null) {
return DEFAULT.dispense(source, stack);
}
// grab state first since we may need to back out
CauldronState newState = recipe.getState(stack, boiling, level, cauldronState);

// if its not a TE, stop right here and disallow any recipes which do not return water
if(cauldron == null && !CauldronState.WATER.matches(newState)) {
return DEFAULT.dispense(source, stack);
}

// play sound
SoundEvent sound = recipe.getSound(stack, boiling, level, cauldronState);
if(sound != null) {
world.playSound((EntityPlayer)null, pos, sound, SoundCategory.BLOCKS, recipe.getVolume(sound), 1.0F);
}

// update level
int newLevel = recipe.getLevel(level);
if(newLevel != level) {
((BlockCauldron)state.getBlock()).setWaterLevel(world, pos, state, newLevel);
if(newLevel == 0) {
newState = CauldronState.WATER;
}
}

// update the state
if(cauldron != null) {
cauldron.setState(newState, true);
}

// result
ItemStack result = recipe.getResult(stack, boiling, level, cauldronState);
ItemStack remainder = recipe.transformInput(stack, boiling, level, cauldronState);

if(remainder.isEmpty()) {
return result;
}

if(((TileEntityDispenser)source.getBlockTileEntity()).addItemStack(result) < 0) {
DEFAULT.dispense(source, result);
}

return remainder;
}
}

0 comments on commit e239c2f

Please sign in to comment.