/******************************************************************************* * AbyssalCraft * Copyright (c) 2012 - 2017 Shinoow. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser Public License v3 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl-3.0.txt * * Contributors: * Shinoow - implementation ******************************************************************************/ package com.shinoow.abyssalcraft.lib.util; import java.util.Map; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import com.google.common.collect.Maps; import com.shinoow.abyssalcraft.api.block.ACBlocks; import com.shinoow.abyssalcraft.api.ritual.RitualRegistry; /** * Utility class used for assembling Ritual grounds. * @author shinoow * */ public class RitualUtil { private static Map<Block, Integer> ritualBlocks = Maps.newHashMap(); private static Map<Block, Integer> altarMeta = Maps.newHashMap(); public static void addBlocks(){ ritualBlocks.put(Blocks.COBBLESTONE, 0); ritualBlocks.put(ACBlocks.darkstone_cobblestone, 0); ritualBlocks.put(ACBlocks.abyssal_cobblestone, 1); ritualBlocks.put(ACBlocks.coralium_cobblestone, 1); ritualBlocks.put(ACBlocks.dreadstone_cobblestone, 2); ritualBlocks.put(ACBlocks.abyssalnite_cobblestone, 2); ritualBlocks.put(ACBlocks.ethaxium_brick, 3); ritualBlocks.put(ACBlocks.dark_ethaxium_brick, 3); altarMeta.put(Blocks.COBBLESTONE, 0); altarMeta.put(ACBlocks.darkstone_cobblestone, 1); altarMeta.put(ACBlocks.abyssal_cobblestone, 2); altarMeta.put(ACBlocks.coralium_cobblestone, 3); altarMeta.put(ACBlocks.dreadstone_cobblestone, 4); altarMeta.put(ACBlocks.abyssalnite_cobblestone, 5); altarMeta.put(ACBlocks.ethaxium_brick, 6); altarMeta.put(ACBlocks.dark_ethaxium_brick, 7); } /** * Checks if an altar can be created * @param world World object * @param x X coordinate * @param y Y coordinate * @param z Z coordinate * @param bookType Level of the current Necronomicon held * @return True if a Ritual Altar can be constructed, otherwise false */ public static boolean tryAltar(World world, BlockPos pos, int bookType){ IBlockState ritualBlock = world.getBlockState(pos); int x = 0; int y = 0; int z = 0; if(ritualBlock != null && ritualBlocks.containsKey(ritualBlock.getBlock())) if(bookType >= ritualBlocks.get(ritualBlock.getBlock())) if(world.getBlockState(pos.add(x -3, y, z)) == ritualBlock && world.getBlockState(pos.add(x, y, z -3)) == ritualBlock && world.getBlockState(pos.add(x + 3, y, z)) == ritualBlock && world.getBlockState(pos.add(x, y, z + 3)) == ritualBlock && world.getBlockState(pos.add(x -2, y,z + 2)) == ritualBlock && world.getBlockState(pos.add(x -2, y, z -2)) == ritualBlock && world.getBlockState(pos.add(x + 2, y, z + 2)) == ritualBlock && world.getBlockState(pos.add(x + 2, y, z -2)) == ritualBlock) if(world.isAirBlock(pos.add(x -3, y, z -1)) && world.isAirBlock(pos.add(x -3, y, z + 1)) && world.isAirBlock(pos.add(x -4, y, z)) && world.isAirBlock(pos.add(x -4, y, z -1)) && world.isAirBlock(pos.add(x -4, y, z + 1)) && world.isAirBlock(pos.add(x -3, y, z -2)) && world.isAirBlock(pos.add(x -3, y, z -3)) && world.isAirBlock(pos.add(x -2, y, z -3)) && world.isAirBlock(pos.add(x -1, y, z -3)) && world.isAirBlock(pos.add(x -1, y, z -4)) && world.isAirBlock(pos.add(x, y, z -4)) && world.isAirBlock(pos.add(x + 1, y, z -4)) && world.isAirBlock(pos.add(x + 1, y, z -3)) && world.isAirBlock(pos.add(x + 2, y, z -3)) && world.isAirBlock(pos.add(x + 3, y, z -3)) && world.isAirBlock(pos.add(x + 3, y, z -2)) && world.isAirBlock(pos.add(x + 3, y, z -1)) && world.isAirBlock(pos.add(x + 4, y, z -1)) && world.isAirBlock(pos.add(x + 4, y, z)) && world.isAirBlock(pos.add(x + 4, y, z + 1)) && world.isAirBlock(pos.add(x + 3, y, z + 1)) && world.isAirBlock(pos.add(x + 3, y, z + 2)) && world.isAirBlock(pos.add(x + 3, y, z + 3)) && world.isAirBlock(pos.add(x + 2, y, z + 3)) && world.isAirBlock(pos.add(x + 1, y, z + 3)) && world.isAirBlock(pos.add(x + 1, y, z + 4)) && world.isAirBlock(pos.add(x, y, z + 4)) && world.isAirBlock(pos.add(x -1, y, z + 4)) && world.isAirBlock(pos.add(x -1, y, z + 3)) && world.isAirBlock(pos.add(x -2, y, z + 3)) && world.isAirBlock(pos.add(x-3, y, z + 3)) && world.isAirBlock(pos.add(x -3, y, z + 2)) && world.isAirBlock(pos.add(x-1, y, z + 0)) && world.isAirBlock(pos.add(x + 1, y, z)) && world.isAirBlock(pos.add(x, y, z -1)) && world.isAirBlock(pos.add(x, y, z + 1)) && world.isAirBlock(pos.add(x-1, y, z + 1)) && world.isAirBlock(pos.add(x -2, y, z)) && world.isAirBlock(pos.add(x-2, y, z)) && world.isAirBlock(pos.add(x -2, y, z -1)) && world.isAirBlock(pos.add(x-1, y, z -1)) && world.isAirBlock(pos.add(x -1, y, z -2)) && world.isAirBlock(pos.add(x, y, z -2)) && world.isAirBlock(pos.add(x + 1, y, z -2)) && world.isAirBlock(pos.add(x + 1, y, z -1)) && world.isAirBlock(pos.add(x + 2, y, z -1)) && world.isAirBlock(pos.add(x + 2, y, z)) && world.isAirBlock(pos.add(x + 2, y, z + 1)) && world.isAirBlock(pos.add(x + 1, y, z + 1)) && world.isAirBlock(pos.add(x + 1, y, z + 2)) && world.isAirBlock(pos.add(x, y, z + 2)) && world.isAirBlock(pos.add(x -1, y, z + 2))) if(RitualRegistry.instance().sameBookType(world.provider.getDimension(), ritualBlocks.get(ritualBlock.getBlock()))){ createAltar(world, pos, ritualBlock.getBlock()); return true; } return false; } /** * Creates the altar * @param world World object * @param x X coordinate * @param y Y coordinate * @param z Z coordinate * @param block Ritual Block */ private static void createAltar(World world, BlockPos pos, Block block){ if(altarMeta.containsKey(block)){ int meta = altarMeta.get(block); int x = 0; int y = 0; int z = 0; world.destroyBlock(pos, false); world.destroyBlock(pos.add(x -3, y, z), false); world.destroyBlock(pos.add(x, y, z -3), false); world.destroyBlock(pos.add(x + 3, y, z), false); world.destroyBlock(pos.add(x, y, z + 3), false); world.destroyBlock(pos.add(x -2, y, z + 2), false); world.destroyBlock(pos.add(x -2, y, z -2), false); world.destroyBlock(pos.add(x + 2, y, z + 2), false); world.destroyBlock(pos.add(x + 2, y, z -2), false); world.setBlockState(pos, ACBlocks.ritual_altar.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x -3, y, z), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x, y, z -3), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x + 3, y, z), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x, y, z + 3), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x -2, y, z + 2), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x -2, y, z -2), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x + 2, y, z + 2), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); world.setBlockState(pos.add(x + 2, y, z -2), ACBlocks.ritual_pedestal.getStateFromMeta(meta), 2); } } }