2011-05-15 19:33:03 +02:00
|
|
|
package com.Acrobot.ChestShop.Utils;
|
|
|
|
|
2012-06-08 15:28:36 +02:00
|
|
|
import com.Acrobot.Breeze.Utils.BlockUtil;
|
2018-10-23 20:04:18 +02:00
|
|
|
import com.Acrobot.ChestShop.Configuration.Properties;
|
2012-06-08 15:28:36 +02:00
|
|
|
import com.Acrobot.ChestShop.Signs.ChestShopSign;
|
2018-11-19 21:10:48 +01:00
|
|
|
import org.bukkit.Location;
|
2011-05-15 19:33:03 +02:00
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.block.BlockFace;
|
2018-10-23 20:04:18 +02:00
|
|
|
import org.bukkit.block.BlockState;
|
|
|
|
import org.bukkit.block.Container;
|
2011-05-15 19:33:03 +02:00
|
|
|
import org.bukkit.block.Sign;
|
2020-10-30 22:45:16 +01:00
|
|
|
import org.bukkit.block.DoubleChest;
|
2018-08-29 21:57:48 +02:00
|
|
|
import org.bukkit.block.data.BlockData;
|
|
|
|
import org.bukkit.block.data.type.Chest;
|
2019-04-30 22:31:24 +02:00
|
|
|
import org.bukkit.block.data.type.WallSign;
|
2018-10-23 20:04:18 +02:00
|
|
|
import org.bukkit.inventory.InventoryHolder;
|
2011-05-15 19:33:03 +02:00
|
|
|
|
2020-10-30 22:45:16 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.List;
|
|
|
|
|
2021-01-28 17:18:42 +01:00
|
|
|
import static com.Acrobot.Breeze.Utils.ImplementationAdapter.getState;
|
|
|
|
|
2011-05-15 19:33:03 +02:00
|
|
|
/**
|
|
|
|
* @author Acrobot
|
|
|
|
*/
|
2011-07-05 19:08:55 +02:00
|
|
|
public class uBlock {
|
2012-09-12 12:35:48 +02:00
|
|
|
public static final BlockFace[] CHEST_EXTENSION_FACES = {BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
|
|
|
|
public static final BlockFace[] SHOP_FACES = {BlockFace.SELF, BlockFace.DOWN, BlockFace.UP, BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
|
2018-01-11 18:28:45 +01:00
|
|
|
@Deprecated
|
2012-09-12 12:35:48 +02:00
|
|
|
public static final BlockFace[] NEIGHBOR_FACES = {BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH};
|
2012-08-10 18:59:10 +02:00
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
public static Sign getConnectedSign(BlockState blockState) {
|
|
|
|
return getConnectedSign(blockState.getBlock());
|
2012-08-10 18:59:10 +02:00
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-01-11 18:28:45 +01:00
|
|
|
public static Sign getConnectedSign(Block block) {
|
|
|
|
Sign sign = uBlock.findAnyNearbyShopSign(block);
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-01-11 18:28:45 +01:00
|
|
|
if (sign == null) {
|
|
|
|
Block neighbor = findNeighbor(block);
|
|
|
|
if (neighbor != null) {
|
|
|
|
sign = uBlock.findAnyNearbyShopSign(neighbor);
|
2012-08-10 18:59:10 +02:00
|
|
|
}
|
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-01-11 18:28:45 +01:00
|
|
|
return sign;
|
2012-08-10 18:59:10 +02:00
|
|
|
}
|
2011-05-15 19:33:03 +02:00
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
/**
|
|
|
|
* @deprecated Use {@link #findConnectedContainer(Sign)}
|
|
|
|
*/
|
|
|
|
@Deprecated
|
2018-08-29 21:57:48 +02:00
|
|
|
public static org.bukkit.block.Chest findConnectedChest(Sign sign) {
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(sign.getBlock())) {
|
|
|
|
return null;
|
|
|
|
}
|
2018-01-11 18:28:45 +01:00
|
|
|
BlockFace signFace = null;
|
2019-04-30 22:31:24 +02:00
|
|
|
BlockData data = sign.getBlockData();
|
|
|
|
if (data instanceof WallSign) {
|
|
|
|
signFace = ((WallSign) data).getFacing().getOppositeFace();
|
2018-01-11 18:28:45 +01:00
|
|
|
}
|
|
|
|
return findConnectedChest(sign.getBlock(), signFace);
|
2011-05-15 19:33:03 +02:00
|
|
|
}
|
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
/**
|
|
|
|
* @deprecated Use {@link #findConnectedContainer(Block)}
|
|
|
|
*/
|
|
|
|
@Deprecated
|
2018-08-29 21:57:48 +02:00
|
|
|
public static org.bukkit.block.Chest findConnectedChest(Block block) {
|
2018-01-11 18:28:45 +01:00
|
|
|
BlockFace signFace = null;
|
|
|
|
if (BlockUtil.isSign(block)) {
|
2019-04-30 22:31:24 +02:00
|
|
|
BlockData data = block.getBlockData();
|
|
|
|
if (data instanceof WallSign) {
|
|
|
|
signFace = ((WallSign) data).getFacing().getOppositeFace();
|
2018-01-11 18:28:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return findConnectedChest(block, signFace);
|
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
/**
|
2018-11-19 21:10:48 +01:00
|
|
|
* @deprecated Use {@link #findConnectedContainer(Location, BlockFace)}
|
2018-10-23 20:04:18 +02:00
|
|
|
*/
|
|
|
|
@Deprecated
|
2018-08-29 21:57:48 +02:00
|
|
|
private static org.bukkit.block.Chest findConnectedChest(Block block, BlockFace signFace) {
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(block)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-05-07 16:32:51 +02:00
|
|
|
if (signFace != null) {
|
2018-01-11 18:28:45 +01:00
|
|
|
Block faceBlock = block.getRelative(signFace);
|
2013-03-16 19:27:24 +01:00
|
|
|
if (BlockUtil.isChest(faceBlock)) {
|
2018-08-29 21:57:48 +02:00
|
|
|
return (org.bukkit.block.Chest) faceBlock.getState();
|
2012-05-10 16:32:25 +02:00
|
|
|
}
|
2011-05-15 19:33:03 +02:00
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-01-11 18:28:45 +01:00
|
|
|
for (BlockFace bf : SHOP_FACES) {
|
|
|
|
if (bf != signFace) {
|
|
|
|
Block faceBlock = block.getRelative(bf);
|
|
|
|
if (BlockUtil.isChest(faceBlock)) {
|
2018-08-29 21:57:48 +02:00
|
|
|
return (org.bukkit.block.Chest) faceBlock.getState();
|
2018-01-11 18:28:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-05-15 19:33:03 +02:00
|
|
|
return null;
|
|
|
|
}
|
2012-03-17 15:00:25 +01:00
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
public static Container findConnectedContainer(Sign sign) {
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(sign.getBlock())) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
BlockFace signFace = null;
|
2019-04-30 22:31:24 +02:00
|
|
|
BlockData data = sign.getBlockData();
|
|
|
|
if (data instanceof WallSign) {
|
|
|
|
signFace = ((WallSign) data).getFacing().getOppositeFace();
|
2018-10-23 20:04:18 +02:00
|
|
|
}
|
2018-11-19 21:10:48 +01:00
|
|
|
return findConnectedContainer(sign.getLocation(), signFace);
|
2018-10-23 20:04:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static Container findConnectedContainer(Block block) {
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(block)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-10-23 20:04:18 +02:00
|
|
|
BlockFace signFace = null;
|
2019-04-30 22:31:24 +02:00
|
|
|
BlockData data = block.getBlockData();
|
|
|
|
if (data instanceof WallSign) {
|
|
|
|
signFace = ((WallSign) data).getFacing().getOppositeFace();
|
2018-10-23 20:04:18 +02:00
|
|
|
}
|
2018-11-19 21:10:48 +01:00
|
|
|
return findConnectedContainer(block.getLocation(), signFace);
|
2018-10-23 20:04:18 +02:00
|
|
|
}
|
|
|
|
|
2018-11-19 21:10:48 +01:00
|
|
|
private static Container findConnectedContainer(Location location, BlockFace signFace) {
|
2018-10-23 20:04:18 +02:00
|
|
|
if (signFace != null) {
|
2018-11-19 21:10:48 +01:00
|
|
|
Block faceBlock = location.clone().add(signFace.getModX(), signFace.getModY(), signFace.getModZ()).getBlock();
|
2018-10-23 20:04:18 +02:00
|
|
|
if (uBlock.couldBeShopContainer(faceBlock)) {
|
|
|
|
return (Container) faceBlock.getState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (BlockFace bf : SHOP_FACES) {
|
|
|
|
if (bf != signFace) {
|
2018-11-19 21:10:48 +01:00
|
|
|
Block faceBlock = location.clone().add(bf.getModX(), bf.getModY(), bf.getModZ()).getBlock();
|
2018-10-23 20:04:18 +02:00
|
|
|
if (uBlock.couldBeShopContainer(faceBlock)) {
|
|
|
|
return (Container) faceBlock.getState();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2021-06-21 17:07:42 +02:00
|
|
|
@Deprecated
|
2012-05-10 16:32:25 +02:00
|
|
|
public static Sign findValidShopSign(Block block, String originalName) {
|
|
|
|
Sign ownerShopSign = null;
|
2011-05-15 19:33:03 +02:00
|
|
|
|
2012-06-08 15:28:36 +02:00
|
|
|
for (BlockFace bf : SHOP_FACES) {
|
2011-12-01 14:02:58 +01:00
|
|
|
Block faceBlock = block.getRelative(bf);
|
2012-05-10 16:32:25 +02:00
|
|
|
|
2012-06-08 15:28:36 +02:00
|
|
|
if (!BlockUtil.isSign(faceBlock)) {
|
2012-05-10 16:32:25 +02:00
|
|
|
continue;
|
2011-12-01 14:02:58 +01:00
|
|
|
}
|
2012-05-10 16:32:25 +02:00
|
|
|
|
|
|
|
Sign sign = (Sign) faceBlock.getState();
|
|
|
|
|
2012-06-08 15:28:36 +02:00
|
|
|
if (ChestShopSign.isValid(sign) && signIsAttachedToBlock(sign, block)) {
|
2012-05-10 16:32:25 +02:00
|
|
|
if (!sign.getLine(0).equals(originalName)) {
|
|
|
|
return sign;
|
|
|
|
} else if (ownerShopSign == null) {
|
|
|
|
ownerShopSign = sign;
|
|
|
|
}
|
2011-10-11 13:15:53 +02:00
|
|
|
}
|
|
|
|
}
|
2012-05-10 16:32:25 +02:00
|
|
|
|
|
|
|
return ownerShopSign;
|
2011-10-11 13:15:53 +02:00
|
|
|
}
|
|
|
|
|
2020-10-30 22:45:16 +01:00
|
|
|
public static List<Sign> findConnectedShopSigns(InventoryHolder chestShopInventoryHolder) {
|
|
|
|
List<Sign> result = new ArrayList<>();
|
|
|
|
|
|
|
|
if (chestShopInventoryHolder instanceof DoubleChest) {
|
|
|
|
BlockState leftChestSide = (BlockState) ((DoubleChest) chestShopInventoryHolder).getLeftSide();
|
|
|
|
BlockState rightChestSide = (BlockState) ((DoubleChest) chestShopInventoryHolder).getRightSide();
|
|
|
|
|
|
|
|
if (leftChestSide == null || rightChestSide == null) {
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
Block leftChest = leftChestSide.getBlock();
|
|
|
|
Block rightChest = rightChestSide.getBlock();
|
|
|
|
|
|
|
|
if (ChestShopSign.isShopBlock(leftChest)) {
|
|
|
|
result.addAll(uBlock.findConnectedShopSigns(leftChest));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ChestShopSign.isShopBlock(rightChest)) {
|
|
|
|
result.addAll(uBlock.findConnectedShopSigns(rightChest));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (chestShopInventoryHolder instanceof BlockState) {
|
|
|
|
Block chestBlock = ((BlockState) chestShopInventoryHolder).getBlock();
|
|
|
|
|
|
|
|
if (ChestShopSign.isShopBlock(chestBlock)) {
|
|
|
|
result.addAll(uBlock.findConnectedShopSigns(chestBlock));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static List<Sign> findConnectedShopSigns(Block chestBlock) {
|
|
|
|
List<Sign> result = new ArrayList<>();
|
|
|
|
|
|
|
|
for (BlockFace bf : SHOP_FACES) {
|
|
|
|
Block faceBlock = chestBlock.getRelative(bf);
|
|
|
|
|
|
|
|
if (!BlockUtil.isSign(faceBlock)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
Sign sign = (Sign) faceBlock.getState();
|
|
|
|
|
|
|
|
Container signContainer = findConnectedContainer(sign);
|
2023-03-01 18:14:18 +01:00
|
|
|
if (signContainer == null || !chestBlock.equals(signContainer.getBlock())) {
|
2020-10-30 22:45:16 +01:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ChestShopSign.isValid(sign)) {
|
|
|
|
result.add(sign);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2012-05-10 16:32:25 +02:00
|
|
|
public static Sign findAnyNearbyShopSign(Block block) {
|
2012-06-08 15:28:36 +02:00
|
|
|
for (BlockFace bf : SHOP_FACES) {
|
2011-07-23 21:00:47 +02:00
|
|
|
Block faceBlock = block.getRelative(bf);
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(faceBlock)) {
|
|
|
|
continue;
|
|
|
|
}
|
2012-05-10 16:32:25 +02:00
|
|
|
|
2021-06-21 17:07:42 +02:00
|
|
|
BlockData data = faceBlock.getBlockData();
|
|
|
|
if (data instanceof WallSign) {
|
|
|
|
if (((WallSign) data).getFacing() != bf
|
|
|
|
&& couldBeShopContainer(faceBlock.getRelative(((WallSign) data).getFacing().getOppositeFace()))) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
} else if (!(data instanceof org.bukkit.block.data.type.Sign)) {
|
2012-05-10 16:32:25 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2021-01-28 17:18:42 +01:00
|
|
|
Sign sign = (Sign) getState(faceBlock, false);
|
2012-05-10 16:32:25 +02:00
|
|
|
|
2012-06-08 15:28:36 +02:00
|
|
|
if (ChestShopSign.isValid(sign)) {
|
2012-05-10 16:32:25 +02:00
|
|
|
return sign;
|
2011-05-15 19:33:03 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-08-29 21:57:48 +02:00
|
|
|
public static org.bukkit.block.Chest findNeighbor(org.bukkit.block.Chest chest) {
|
2018-01-11 18:28:45 +01:00
|
|
|
Block neighbor = findNeighbor(chest.getBlock());
|
2018-08-29 21:57:48 +02:00
|
|
|
return neighbor != null ? (org.bukkit.block.Chest) neighbor.getState() : null;
|
2018-01-11 18:28:45 +01:00
|
|
|
}
|
2018-05-07 16:32:51 +02:00
|
|
|
|
2018-01-11 18:28:45 +01:00
|
|
|
public static Block findNeighbor(Block block) {
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(block)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-08-29 21:57:48 +02:00
|
|
|
BlockData blockData = block.getBlockData();
|
|
|
|
if (!(blockData instanceof Chest)) {
|
|
|
|
return null;
|
|
|
|
}
|
2013-03-16 19:27:24 +01:00
|
|
|
|
2018-08-29 21:57:48 +02:00
|
|
|
Chest chestData = (Chest) blockData;
|
|
|
|
if (chestData.getType() == Chest.Type.SINGLE) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
BlockFace chestFace = chestData.getFacing();
|
|
|
|
// we have to rotate is to get the adjacent chest
|
|
|
|
// west, right -> south
|
|
|
|
// west, left -> north
|
|
|
|
if (chestFace == BlockFace.WEST) {
|
|
|
|
chestFace = BlockFace.NORTH;
|
|
|
|
} else if (chestFace == BlockFace.NORTH) {
|
|
|
|
chestFace = BlockFace.EAST;
|
|
|
|
} else if (chestFace == BlockFace.EAST) {
|
|
|
|
chestFace = BlockFace.SOUTH;
|
|
|
|
} else if (chestFace == BlockFace.SOUTH) {
|
|
|
|
chestFace = BlockFace.WEST;
|
|
|
|
}
|
|
|
|
if (chestData.getType() == Chest.Type.RIGHT) {
|
|
|
|
chestFace = chestFace.getOppositeFace();
|
|
|
|
}
|
|
|
|
|
|
|
|
Block neighborBlock = block.getRelative(chestFace);
|
2021-09-01 17:30:14 +02:00
|
|
|
if (!BlockUtil.isLoaded(neighborBlock)) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-08-29 21:57:48 +02:00
|
|
|
if (neighborBlock.getType() == block.getType()) {
|
|
|
|
return neighborBlock;
|
2011-05-29 13:25:25 +02:00
|
|
|
}
|
2013-03-23 14:08:21 +01:00
|
|
|
|
2011-08-13 12:08:34 +02:00
|
|
|
return null;
|
2011-05-29 13:25:25 +02:00
|
|
|
}
|
2011-06-19 23:52:36 +02:00
|
|
|
|
2012-05-10 16:32:25 +02:00
|
|
|
private static boolean signIsAttachedToBlock(Sign sign, Block block) {
|
2014-04-12 13:28:37 +02:00
|
|
|
return sign.getBlock().equals(block) || BlockUtil.getAttachedBlock(sign).equals(block);
|
2011-06-19 23:52:36 +02:00
|
|
|
}
|
2018-10-23 20:04:18 +02:00
|
|
|
|
|
|
|
public static boolean couldBeShopContainer(Block block) {
|
2021-09-01 17:30:14 +02:00
|
|
|
return block != null && BlockUtil.isLoaded(block) && Properties.SHOP_CONTAINERS.contains(block.getType());
|
2018-10-23 20:04:18 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public static boolean couldBeShopContainer(InventoryHolder holder) {
|
|
|
|
return holder instanceof Container && couldBeShopContainer(((Container) holder).getBlock());
|
|
|
|
}
|
2011-05-15 19:33:03 +02:00
|
|
|
}
|