public static void check(TileEntity te) { for (SegmentTileEntity segment : segmentsTile.get(te.getClass())) { if (!segment.shouldExist(te)) { ItemStack itemStack = new ItemStack(te.getBlockType(), 1, te.getBlockMetadata()); NBTTagCompound nbt = new NBTTagCompound(); te.writeToNBT(nbt); itemStack.setTagCompound(nbt); WorldUtils.dropAsEntity(te.getWorldObj(), te.xCoord, te.yCoord, te.zCoord, itemStack); te.getWorldObj().setBlock(te.xCoord, te.yCoord, te.zCoord, Blocks.air); te.invalidate(); MyTown.instance.LOG.info("TileEntity {} was ATOMICALLY DISINTEGRATED!", te.toString()); return; } } }
@Command( name = "claim", permission = "mytown.cmd.assistant.claim", parentName = "mytown.cmd", syntax = "/town claim [range]") public static CommandResponse claimCommand(ICommandSender sender, List<String> args) { EntityPlayer player = (EntityPlayer) sender; Resident res = MyTownUniverse.instance.getOrMakeResident(player); Town town = getTownFromResident(res); boolean isFarClaim = false; if (args.size() < 1) { if (town.townBlocksContainer.size() >= town.getMaxBlocks()) throw new MyTownCommandException("mytown.cmd.err.town.maxBlocks", 1); if (getUniverse().blocks.contains(player.dimension, player.chunkCoordX, player.chunkCoordZ)) throw new MyTownCommandException("mytown.cmd.err.claim.already"); if (!checkNearby(player.dimension, player.chunkCoordX, player.chunkCoordZ, town)) { if (town.townBlocksContainer.getFarClaims() >= town.getMaxFarClaims()) throw new MyTownCommandException("mytown.cmd.err.claim.far.notAllowed"); isFarClaim = true; } for (int x = player.chunkCoordX - Config.instance.distanceBetweenTowns.get(); x <= player.chunkCoordX + Config.instance.distanceBetweenTowns.get(); x++) { for (int z = player.chunkCoordZ - Config.instance.distanceBetweenTowns.get(); z <= player.chunkCoordZ + Config.instance.distanceBetweenTowns.get(); z++) { Town nearbyTown = MyTownUtils.getTownAtPosition(player.dimension, x, z); if (nearbyTown != null && nearbyTown != town && !(Boolean) nearbyTown.flagsContainer.getValue(FlagType.NEARBY)) throw new MyTownCommandException( "mytown.cmd.err.claim.tooClose", nearbyTown.getName(), Config.instance.distanceBetweenTowns.get()); } } if (isFarClaim && town.townBlocksContainer.getFarClaims() + 1 > town.getMaxFarClaims()) throw new MyTownCommandException("mytown.cmd.err.claim.far.notAllowed"); int price = (isFarClaim ? Config.instance.costAmountClaimFar.get() : Config.instance.costAmountClaim.get()) + Config.instance.costAdditionClaim.get() * town.townBlocksContainer.size(); makeBankPayment(player, town, price); TownBlock block = getUniverse() .newBlock( player.dimension, player.chunkCoordX, player.chunkCoordZ, isFarClaim, price, town); if (block == null) throw new MyTownCommandException("mytown.cmd.err.claim.failed"); getDatasource().saveBlock(block); res.sendMessage( getLocal() .getLocalization( "mytown.notification.block.added", block.getX() * 16, block.getZ() * 16, block.getX() * 16 + 15, block.getZ() * 16 + 15, town.getName())); } else { if (!StringUtils.tryParseInt(args.get(0))) throw new MyTownCommandException("mytown.cmd.err.notPositiveInteger", args.get(0)); int radius = Integer.parseInt(args.get(0)); List<ChunkPos> chunks = WorldUtils.getChunksInBox( player.dimension, (int) (player.posX - radius * 16), (int) (player.posZ - radius * 16), (int) (player.posX + radius * 16), (int) (player.posZ + radius * 16)); isFarClaim = true; for (Iterator<ChunkPos> it = chunks.iterator(); it.hasNext(); ) { ChunkPos chunk = it.next(); if (checkNearby(player.dimension, chunk.getX(), chunk.getZ(), town)) { isFarClaim = false; } if (getUniverse().blocks.contains(player.dimension, chunk.getX(), chunk.getZ())) it.remove(); for (int x = chunk.getX() - Config.instance.distanceBetweenTowns.get(); x <= chunk.getX() + Config.instance.distanceBetweenTowns.get(); x++) { for (int z = chunk.getZ() - Config.instance.distanceBetweenTowns.get(); z <= chunk.getZ() + Config.instance.distanceBetweenTowns.get(); z++) { Town nearbyTown = MyTownUtils.getTownAtPosition(player.dimension, x, z); if (nearbyTown != null && nearbyTown != town && !(Boolean) nearbyTown.flagsContainer.getValue(FlagType.NEARBY)) throw new MyTownCommandException( "mytown.cmd.err.claim.tooClose", nearbyTown.getName(), Config.instance.distanceBetweenTowns.get()); } } } if (town.townBlocksContainer.size() + chunks.size() > town.getMaxBlocks()) throw new MyTownCommandException("mytown.cmd.err.town.maxBlocks", chunks.size()); if (isFarClaim && town.townBlocksContainer.getFarClaims() + 1 > town.getMaxFarClaims()) throw new MyTownCommandException("mytown.cmd.err.claim.far.notAllowed"); makeBankPayment( player, town, (isFarClaim ? Config.instance.costAmountClaimFar.get() + Config.instance.costAmountClaim.get() * (chunks.size() - 1) : Config.instance.costAmountClaim.get() * chunks.size()) + MathUtils.sumFromNtoM( town.townBlocksContainer.size(), town.townBlocksContainer.size() + chunks.size() - 1) * Config.instance.costAdditionClaim.get()); for (ChunkPos chunk : chunks) { int price = (isFarClaim ? Config.instance.costAmountClaimFar.get() : Config.instance.costAmountClaim.get()) + Config.instance.costAdditionClaim.get() * town.townBlocksContainer.size(); TownBlock block = getUniverse() .newBlock(player.dimension, chunk.getX(), chunk.getZ(), isFarClaim, price, town); // Only one of the block will be a farClaim, rest will be normal claim isFarClaim = false; getDatasource().saveBlock(block); res.sendMessage( getLocal() .getLocalization( "mytown.notification.block.added", block.getX() * 16, block.getZ() * 16, block.getX() * 16 + 15, block.getZ() * 16 + 15, town.getName())); } } return CommandResponse.DONE; }