/******************************************************************************* * 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.common.blocks; import java.util.Random; import net.minecraft.block.Block; import net.minecraft.block.BlockBreakable; import net.minecraft.block.BlockPortal; import net.minecraft.block.material.Material; import net.minecraft.block.properties.PropertyEnum; import net.minecraft.block.state.BlockStateContainer; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.init.Blocks; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockRenderLayer; import net.minecraft.util.EnumFacing; import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import com.shinoow.abyssalcraft.api.block.ACBlocks; import com.shinoow.abyssalcraft.common.world.TeleporterAC; import com.shinoow.abyssalcraft.lib.ACAchievements; import com.shinoow.abyssalcraft.lib.ACConfig; import com.shinoow.abyssalcraft.lib.ACLib; public class BlockDreadlandsPortal extends BlockBreakable { public static final PropertyEnum<EnumFacing.Axis> AXIS = PropertyEnum.<EnumFacing.Axis>create("axis", EnumFacing.Axis.class, new EnumFacing.Axis[] {EnumFacing.Axis.X, EnumFacing.Axis.Z}); protected static final AxisAlignedBB field_185683_b = new AxisAlignedBB(0.0D, 0.0D, 0.375D, 1.0D, 1.0D, 0.625D); protected static final AxisAlignedBB field_185684_c = new AxisAlignedBB(0.375D, 0.0D, 0.0D, 0.625D, 1.0D, 1.0D); protected static final AxisAlignedBB field_185685_d = new AxisAlignedBB(0.375D, 0.0D, 0.375D, 0.625D, 1.0D, 0.625D); public BlockDreadlandsPortal() { super(Material.PORTAL , false); setDefaultState(blockState.getBaseState().withProperty(AXIS, EnumFacing.Axis.X)); setTickRandomly(true); setHardness(-1.0F); setLightLevel(0.75F); } @Override public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) { switch (state.getValue(AXIS)) { case X: return field_185683_b; case Y: default: return field_185685_d; case Z: return field_185684_c; } } @Override public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) { return NULL_AABB; } public static int getMetaForAxis(EnumFacing.Axis axis) { return axis == EnumFacing.Axis.X ? 1 : axis == EnumFacing.Axis.Z ? 2 : 0; } @Override public boolean isFullCube(IBlockState state) { return false; } public static boolean tryToCreatePortal(World par1World, BlockPos pos) { BlockDreadlandsPortal.Size blockportal$size = new BlockDreadlandsPortal.Size(par1World, pos, EnumFacing.Axis.X); if (blockportal$size.func_150860_b() && blockportal$size.field_150864_e == 0) { blockportal$size.func_150859_c(); return true; } else { BlockDreadlandsPortal.Size blockportal$size1 = new BlockDreadlandsPortal.Size(par1World, pos, EnumFacing.Axis.Z); if (blockportal$size1.func_150860_b() && blockportal$size1.field_150864_e == 0) { blockportal$size1.func_150859_c(); return true; } else return false; } } @Override public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block neighborBlock, BlockPos pos2) { EnumFacing.Axis enumfacing$axis = state.getValue(AXIS); if (enumfacing$axis == EnumFacing.Axis.X) { BlockDreadlandsPortal.Size blockportal$size = new BlockDreadlandsPortal.Size(worldIn, pos, EnumFacing.Axis.X); if (!blockportal$size.func_150860_b() || blockportal$size.field_150864_e < blockportal$size.field_150868_h * blockportal$size.field_150862_g) worldIn.setBlockState(pos, Blocks.AIR.getDefaultState()); } else if (enumfacing$axis == EnumFacing.Axis.Z) { BlockDreadlandsPortal.Size blockportal$size1 = new BlockDreadlandsPortal.Size(worldIn, pos, EnumFacing.Axis.Z); if (!blockportal$size1.func_150860_b() || blockportal$size1.field_150864_e < blockportal$size1.field_150868_h * blockportal$size1.field_150862_g) worldIn.setBlockState(pos, Blocks.AIR.getDefaultState()); } } @Override @SideOnly(Side.CLIENT) public boolean shouldSideBeRendered(IBlockState state, IBlockAccess worldIn, BlockPos pos, EnumFacing side) { EnumFacing.Axis enumfacing$axis = null; if (state.getBlock() == this) { enumfacing$axis = state.getValue(AXIS); if (enumfacing$axis == null) return false; if (enumfacing$axis == EnumFacing.Axis.Z && side != EnumFacing.EAST && side != EnumFacing.WEST) return false; if (enumfacing$axis == EnumFacing.Axis.X && side != EnumFacing.SOUTH && side != EnumFacing.NORTH) return false; } boolean flag = worldIn.getBlockState(pos.west()).getBlock() == this && worldIn.getBlockState(pos.west(2)).getBlock() != this; boolean flag1 = worldIn.getBlockState(pos.east()).getBlock() == this && worldIn.getBlockState(pos.east(2)).getBlock() != this; boolean flag2 = worldIn.getBlockState(pos.north()).getBlock() == this && worldIn.getBlockState(pos.north(2)).getBlock() != this; boolean flag3 = worldIn.getBlockState(pos.south()).getBlock() == this && worldIn.getBlockState(pos.south(2)).getBlock() != this; boolean flag4 = flag || flag1 || enumfacing$axis == EnumFacing.Axis.X; boolean flag5 = flag2 || flag3 || enumfacing$axis == EnumFacing.Axis.Z; return flag4 && side == EnumFacing.WEST ? true : flag4 && side == EnumFacing.EAST ? true : flag5 && side == EnumFacing.NORTH ? true : flag5 && side == EnumFacing.SOUTH; } @Override public int quantityDropped(Random par1Random) { return 0; } @Override public void onEntityCollidedWithBlock(World par1World, BlockPos pos, IBlockState state, Entity par5Entity) { if (!par5Entity.isRiding() && !par5Entity.isBeingRidden() && par5Entity instanceof EntityPlayerMP) { EntityPlayerMP thePlayer = (EntityPlayerMP)par5Entity; thePlayer.addStat(ACAchievements.enter_dreadlands, 1); if (thePlayer.timeUntilPortal > 0) thePlayer.timeUntilPortal = thePlayer.getPortalCooldown(); else if (thePlayer.dimension != ACLib.dreadlands_id) { thePlayer.timeUntilPortal = ACConfig.portalCooldown; thePlayer.mcServer.getPlayerList().transferPlayerToDimension(thePlayer, ACLib.dreadlands_id, new TeleporterAC(thePlayer.mcServer.worldServerForDimension(ACLib.dreadlands_id), this, ACBlocks.dreadstone)); } else { thePlayer.timeUntilPortal = ACConfig.portalCooldown; thePlayer.mcServer.getPlayerList().transferPlayerToDimension(thePlayer, ACLib.abyssal_wasteland_id, new TeleporterAC(thePlayer.mcServer.worldServerForDimension(ACLib.abyssal_wasteland_id), this, ACBlocks.dreadstone)); } } } @Override @SideOnly(Side.CLIENT) public ItemStack getItem(World par1World, BlockPos pos, IBlockState state) { return ItemStack.EMPTY; } @Override @SideOnly(Side.CLIENT) public BlockRenderLayer getBlockLayer() { return BlockRenderLayer.TRANSLUCENT; } @Override public IBlockState getStateFromMeta(int meta) { return getDefaultState().withProperty(AXIS, (meta & 3) == 2 ? EnumFacing.Axis.Z : EnumFacing.Axis.X); } @Override public int getMetaFromState(IBlockState state) { return getMetaForAxis(state.getValue(AXIS)); } @Override protected BlockStateContainer createBlockState() { return new BlockStateContainer.Builder(this).add(AXIS).build(); } public static class Size { private final World world; private final EnumFacing.Axis axis; private final EnumFacing field_150866_c; private final EnumFacing field_150863_d; private int field_150864_e = 0; private BlockPos field_150861_f; private int field_150862_g; private int field_150868_h; public Size(World worldIn, BlockPos p_i45694_2_, EnumFacing.Axis p_i45694_3_) { world = worldIn; axis = p_i45694_3_; if (p_i45694_3_ == EnumFacing.Axis.X) { field_150863_d = EnumFacing.EAST; field_150866_c = EnumFacing.WEST; } else { field_150863_d = EnumFacing.NORTH; field_150866_c = EnumFacing.SOUTH; } for (BlockPos blockpos = p_i45694_2_; p_i45694_2_.getY() > blockpos.getY() - 21 && p_i45694_2_.getY() > 0 && func_150857_a(worldIn.getBlockState(p_i45694_2_.down()).getBlock()); p_i45694_2_ = p_i45694_2_.down()) ; int i = func_180120_a(p_i45694_2_, field_150863_d) - 1; if (i >= 0) { field_150861_f = p_i45694_2_.offset(field_150863_d, i); field_150868_h = func_180120_a(field_150861_f, field_150866_c); if (field_150868_h < 2 || field_150868_h > 21) { field_150861_f = null; field_150868_h = 0; } } if (field_150861_f != null) field_150862_g = func_150858_a(); } protected int func_180120_a(BlockPos p_180120_1_, EnumFacing p_180120_2_) { int i; for (i = 0; i < 22; ++i) { BlockPos blockpos = p_180120_1_.offset(p_180120_2_, i); if (!func_150857_a(world.getBlockState(blockpos).getBlock()) || world.getBlockState(blockpos.down()).getBlock() != ACBlocks.dreadstone) break; } Block block = world.getBlockState(p_180120_1_.offset(p_180120_2_, i)).getBlock(); return block == ACBlocks.dreadstone ? i : 0; } public int func_181100_a() { return field_150862_g; } public int func_181101_b() { return field_150868_h; } protected int func_150858_a() { label24: for (field_150862_g = 0; field_150862_g < 21; ++field_150862_g) for (int i = 0; i < field_150868_h; ++i) { BlockPos blockpos = field_150861_f.offset(field_150866_c, i).up(field_150862_g); Block block = world.getBlockState(blockpos).getBlock(); if (!func_150857_a(block)) break label24; if (block == ACBlocks.dreaded_gateway) ++field_150864_e; if (i == 0) { block = world.getBlockState(blockpos.offset(field_150863_d)).getBlock(); if (block != ACBlocks.dreadstone) break label24; } else if (i == field_150868_h - 1) { block = world.getBlockState(blockpos.offset(field_150866_c)).getBlock(); if (block != ACBlocks.dreadstone) break label24; } } for (int j = 0; j < field_150868_h; ++j) if (world.getBlockState(field_150861_f.offset(field_150866_c, j).up(field_150862_g)).getBlock() != ACBlocks.dreadstone) { field_150862_g = 0; break; } if (field_150862_g <= 21 && field_150862_g >= 3) return field_150862_g; else { field_150861_f = null; field_150868_h = 0; field_150862_g = 0; return 0; } } protected boolean func_150857_a(Block p_150857_1_) { return p_150857_1_.getMaterial(p_150857_1_.getDefaultState()) == Material.AIR || p_150857_1_ == ACBlocks.dreaded_fire || p_150857_1_ == ACBlocks.dreaded_gateway; } public boolean func_150860_b() { return field_150861_f != null && field_150868_h >= 2 && field_150868_h <= 21 && field_150862_g >= 3 && field_150862_g <= 21; } public void func_150859_c() { for (int i = 0; i < field_150868_h; ++i) { BlockPos blockpos = field_150861_f.offset(field_150866_c, i); for (int j = 0; j < field_150862_g; ++j) world.setBlockState(blockpos.up(j), ACBlocks.dreaded_gateway.getDefaultState().withProperty(BlockPortal.AXIS, axis), 2); } } } }