package net.minecraft.server; import java.util.Random; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit public class BlockCommand extends BlockTileEntity { private static final Logger LOGGER = LogManager.getLogger(); public static final BlockStateDirection a = BlockDirectional.FACING; public static final BlockStateBoolean b = BlockProperties.c; public BlockCommand(Block.Info block_info) { super(block_info); this.p((IBlockData) ((IBlockData) ((IBlockData) this.blockStateList.getBlockData()).set(BlockCommand.a, EnumDirection.NORTH)).set(BlockCommand.b, false)); } @Override public TileEntity createTile(IBlockAccess iblockaccess) { TileEntityCommand tileentitycommand = new TileEntityCommand(); tileentitycommand.b(this == Blocks.CHAIN_COMMAND_BLOCK); return tileentitycommand; } @Override public void doPhysics(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1, boolean flag) { if (!world.isClientSide) { TileEntity tileentity = world.getTileEntity(blockposition); if (tileentity instanceof TileEntityCommand) { TileEntityCommand tileentitycommand = (TileEntityCommand) tileentity; boolean flag1 = world.isBlockIndirectlyPowered(blockposition); boolean flag2 = tileentitycommand.f(); // CraftBukkit start org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); int old = flag2 ? 15 : 0; int current = flag1 ? 15 : 0; BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, old, current); world.getServer().getPluginManager().callEvent(eventRedstone); flag1 = eventRedstone.getNewCurrent() > 0; // CraftBukkit end tileentitycommand.a(flag1); if (!flag2 && !tileentitycommand.g() && tileentitycommand.m() != TileEntityCommand.Type.SEQUENCE) { if (flag1) { tileentitycommand.k(); world.getBlockTickList().a(blockposition, this, this.a((IWorldReader) world)); } } } } } @Override public void tick(IBlockData iblockdata, WorldServer worldserver, BlockPosition blockposition, Random random) { TileEntity tileentity = worldserver.getTileEntity(blockposition); if (tileentity instanceof TileEntityCommand) { TileEntityCommand tileentitycommand = (TileEntityCommand) tileentity; CommandBlockListenerAbstract commandblocklistenerabstract = tileentitycommand.getCommandBlock(); boolean flag = !UtilColor.b(commandblocklistenerabstract.getCommand()); TileEntityCommand.Type tileentitycommand_type = tileentitycommand.m(); boolean flag1 = tileentitycommand.j(); if (tileentitycommand_type == TileEntityCommand.Type.AUTO) { tileentitycommand.k(); if (flag1) { this.a(iblockdata, worldserver, blockposition, commandblocklistenerabstract, flag); } else if (tileentitycommand.x()) { commandblocklistenerabstract.a(0); } if (tileentitycommand.f() || tileentitycommand.g()) { worldserver.getBlockTickList().a(blockposition, this, this.a((IWorldReader) worldserver)); } } else if (tileentitycommand_type == TileEntityCommand.Type.REDSTONE) { if (flag1) { this.a(iblockdata, worldserver, blockposition, commandblocklistenerabstract, flag); } else if (tileentitycommand.x()) { commandblocklistenerabstract.a(0); } } worldserver.updateAdjacentComparators(blockposition, this); } } private void a(IBlockData iblockdata, World world, BlockPosition blockposition, CommandBlockListenerAbstract commandblocklistenerabstract, boolean flag) { if (flag) { commandblocklistenerabstract.a(world); } else { commandblocklistenerabstract.a(0); } a(world, blockposition, (EnumDirection) iblockdata.get(BlockCommand.a)); } @Override public int a(IWorldReader iworldreader) { return 1; } @Override public EnumInteractionResult interact(IBlockData iblockdata, World world, BlockPosition blockposition, EntityHuman entityhuman, EnumHand enumhand, MovingObjectPositionBlock movingobjectpositionblock) { TileEntity tileentity = world.getTileEntity(blockposition); if (tileentity instanceof TileEntityCommand && entityhuman.isCreativeAndOp()) { entityhuman.a((TileEntityCommand) tileentity); return EnumInteractionResult.SUCCESS; } else { return EnumInteractionResult.PASS; } } @Override public boolean isComplexRedstone(IBlockData iblockdata) { return true; } @Override public int a(IBlockData iblockdata, World world, BlockPosition blockposition) { TileEntity tileentity = world.getTileEntity(blockposition); return tileentity instanceof TileEntityCommand ? ((TileEntityCommand) tileentity).getCommandBlock().i() : 0; } @Override public void postPlace(World world, BlockPosition blockposition, IBlockData iblockdata, EntityLiving entityliving, ItemStack itemstack) { TileEntity tileentity = world.getTileEntity(blockposition); if (tileentity instanceof TileEntityCommand) { TileEntityCommand tileentitycommand = (TileEntityCommand) tileentity; CommandBlockListenerAbstract commandblocklistenerabstract = tileentitycommand.getCommandBlock(); if (itemstack.hasName()) { commandblocklistenerabstract.setName(itemstack.getName()); } if (!world.isClientSide) { if (itemstack.b("BlockEntityTag") == null) { commandblocklistenerabstract.a(world.getGameRules().getBoolean(GameRules.SEND_COMMAND_FEEDBACK)); tileentitycommand.b(this == Blocks.CHAIN_COMMAND_BLOCK); } if (tileentitycommand.m() == TileEntityCommand.Type.SEQUENCE) { boolean flag = world.isBlockIndirectlyPowered(blockposition); tileentitycommand.a(flag); } } } } @Override public EnumRenderType c(IBlockData iblockdata) { return EnumRenderType.MODEL; } @Override public IBlockData a(IBlockData iblockdata, EnumBlockRotation enumblockrotation) { return (IBlockData) iblockdata.set(BlockCommand.a, enumblockrotation.a((EnumDirection) iblockdata.get(BlockCommand.a))); } @Override public IBlockData a(IBlockData iblockdata, EnumBlockMirror enumblockmirror) { return iblockdata.a(enumblockmirror.a((EnumDirection) iblockdata.get(BlockCommand.a))); } @Override protected void a(BlockStateList.a<Block, IBlockData> blockstatelist_a) { blockstatelist_a.a(BlockCommand.a, BlockCommand.b); } @Override public IBlockData getPlacedState(BlockActionContext blockactioncontext) { return (IBlockData) this.getBlockData().set(BlockCommand.a, blockactioncontext.d().opposite()); } private static void a(World world, BlockPosition blockposition, EnumDirection enumdirection) { BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(blockposition); GameRules gamerules = world.getGameRules(); IBlockData iblockdata; int i; for (i = gamerules.getInt(GameRules.MAX_COMMAND_CHAIN_LENGTH); i-- > 0; enumdirection = (EnumDirection) iblockdata.get(BlockCommand.a)) { blockposition_mutableblockposition.c(enumdirection); iblockdata = world.getType(blockposition_mutableblockposition); Block block = iblockdata.getBlock(); if (block != Blocks.CHAIN_COMMAND_BLOCK) { break; } TileEntity tileentity = world.getTileEntity(blockposition_mutableblockposition); if (!(tileentity instanceof TileEntityCommand)) { break; } TileEntityCommand tileentitycommand = (TileEntityCommand) tileentity; if (tileentitycommand.m() != TileEntityCommand.Type.SEQUENCE) { break; } if (tileentitycommand.f() || tileentitycommand.g()) { CommandBlockListenerAbstract commandblocklistenerabstract = tileentitycommand.getCommandBlock(); if (tileentitycommand.k()) { if (!commandblocklistenerabstract.a(world)) { break; } world.updateAdjacentComparators(blockposition_mutableblockposition, block); } else if (tileentitycommand.x()) { commandblocklistenerabstract.a(0); } } } if (i <= 0) { int j = Math.max(gamerules.getInt(GameRules.MAX_COMMAND_CHAIN_LENGTH), 0); BlockCommand.LOGGER.warn("Command Block chain tried to execute more than {} steps!", j); } } }