2018-10-16 11:49:30 +02:00
|
|
|
package de.ellpeck.naturesaura.events;
|
|
|
|
|
|
|
|
import de.ellpeck.naturesaura.Helper;
|
|
|
|
import de.ellpeck.naturesaura.blocks.ModBlocks;
|
2018-10-27 01:49:57 +02:00
|
|
|
import de.ellpeck.naturesaura.blocks.Multiblocks;
|
2018-10-16 11:49:30 +02:00
|
|
|
import de.ellpeck.naturesaura.blocks.tiles.TileEntityWoodStand;
|
|
|
|
import de.ellpeck.naturesaura.recipes.TreeRitualRecipe;
|
|
|
|
import net.minecraft.block.state.IBlockState;
|
|
|
|
import net.minecraft.item.ItemStack;
|
2018-10-27 01:49:57 +02:00
|
|
|
import net.minecraft.tileentity.TileEntity;
|
|
|
|
import net.minecraft.util.Rotation;
|
2018-10-16 11:49:30 +02:00
|
|
|
import net.minecraft.util.math.BlockPos;
|
|
|
|
import net.minecraft.world.World;
|
|
|
|
import net.minecraftforge.event.terraingen.SaplingGrowTreeEvent;
|
|
|
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
2018-10-27 01:49:57 +02:00
|
|
|
import org.apache.commons.lang3.mutable.MutableBoolean;
|
|
|
|
import org.apache.commons.lang3.mutable.MutableObject;
|
2018-10-16 11:49:30 +02:00
|
|
|
|
2018-10-27 01:49:57 +02:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import java.util.List;
|
2018-10-16 11:49:30 +02:00
|
|
|
|
|
|
|
public class TerrainGenEvents {
|
|
|
|
|
|
|
|
@SubscribeEvent
|
|
|
|
public void onTreeGrow(SaplingGrowTreeEvent event) {
|
|
|
|
World world = event.getWorld();
|
|
|
|
BlockPos pos = event.getPos();
|
|
|
|
if (!world.isRemote) {
|
2018-10-27 12:24:12 +02:00
|
|
|
if (Multiblocks.TREE_RITUAL.forEachMatcher(world, pos, Rotation.NONE, (char) 0, (start, actionPos, x, y, z, ch, matcher) ->
|
2018-11-04 17:41:29 +01:00
|
|
|
ch == 'W' || Multiblocks.TREE_RITUAL.test(world, start, x, y, z, Rotation.NONE))) {
|
2018-10-16 11:49:30 +02:00
|
|
|
IBlockState sapling = world.getBlockState(pos);
|
|
|
|
ItemStack saplingStack = sapling.getBlock().getItem(world, pos, sapling);
|
|
|
|
if (!saplingStack.isEmpty()) {
|
2018-10-22 00:14:52 +02:00
|
|
|
for (TreeRitualRecipe recipe : TreeRitualRecipe.RECIPES.values()) {
|
2018-10-27 01:49:57 +02:00
|
|
|
if (recipe.saplingType.isItemEqual(saplingStack)) {
|
|
|
|
List<ItemStack> required = new ArrayList<>(Arrays.asList(recipe.items));
|
|
|
|
MutableBoolean tooMuch = new MutableBoolean();
|
|
|
|
MutableObject<TileEntityWoodStand> toPick = new MutableObject<>();
|
2018-10-16 11:49:30 +02:00
|
|
|
|
2018-10-27 01:49:57 +02:00
|
|
|
Multiblocks.TREE_RITUAL.forEach(world, pos, Rotation.NONE, 'W', tilePos -> {
|
|
|
|
TileEntity tile = world.getTileEntity(tilePos);
|
|
|
|
if (tile instanceof TileEntityWoodStand) {
|
|
|
|
TileEntityWoodStand stand = (TileEntityWoodStand) tile;
|
|
|
|
ItemStack stack = stand.items.getStackInSlot(0);
|
|
|
|
if (!stack.isEmpty()) {
|
|
|
|
int index = Helper.getItemIndex(required, stack);
|
|
|
|
if (index >= 0) {
|
|
|
|
required.remove(index);
|
2018-10-16 11:49:30 +02:00
|
|
|
|
2018-10-27 01:49:57 +02:00
|
|
|
if (toPick.getValue() == null) {
|
|
|
|
toPick.setValue(stand);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
tooMuch.setTrue();
|
|
|
|
}
|
2018-10-16 11:49:30 +02:00
|
|
|
}
|
|
|
|
}
|
2018-10-27 01:49:57 +02:00
|
|
|
});
|
2018-10-16 11:49:30 +02:00
|
|
|
|
2018-10-27 01:49:57 +02:00
|
|
|
if (tooMuch.isFalse() && required.isEmpty()) {
|
|
|
|
toPick.getValue().setRitual(pos, recipe);
|
2018-10-16 17:48:36 +02:00
|
|
|
break;
|
|
|
|
}
|
2018-10-16 11:49:30 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|