forked from ChestShop-authors/ChestShop-3
-
Notifications
You must be signed in to change notification settings - Fork 2
/
uBlock.java
112 lines (97 loc) · 3.94 KB
/
uBlock.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package com.Acrobot.ChestShop.Utils;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Chest;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.type.WallSign;
import com.Acrobot.Breeze.Utils.BlockUtil;
import com.Acrobot.ChestShop.Signs.ChestShopSign;
/**
* @author Acrobot
*/
public class uBlock {
public static final BlockFace[] CHEST_EXTENSION_FACES = { BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH };
public static final BlockFace[] SHOP_FACES = { BlockFace.DOWN, BlockFace.UP, BlockFace.EAST, BlockFace.NORTH, BlockFace.WEST, BlockFace.SOUTH };
public static Sign getConnectedSign(Block chestBlock) {
return getConnectedSign(chestBlock, null);
}
public static Sign getConnectedSign(Block chestBlock, Block ignoredSign) {
Sign sign = uBlock.findAnyNearbyShopSign(chestBlock, ignoredSign);
if (sign == null) {
Block neighbour = getConnectedChest(chestBlock);
if (neighbour != null) {
sign = uBlock.findAnyNearbyShopSign(neighbour, ignoredSign);
}
}
return sign;
}
public static Block getConnectedChest(Block chestBlock) {
BlockData blockData = chestBlock.getBlockData();
if (!(blockData instanceof org.bukkit.block.data.type.Chest)) {
return null;
}
org.bukkit.block.data.type.Chest chestData = (org.bukkit.block.data.type.Chest) blockData;
if (chestData.getType() != org.bukkit.block.data.type.Chest.Type.SINGLE) {
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() == org.bukkit.block.data.type.Chest.Type.RIGHT) {
chestFace = chestFace.getOppositeFace();
}
Block face = chestBlock.getRelative(chestFace);
// They're placing it beside a chest, check if it's already
// protected
if (face.getType() == chestBlock.getType()) {
return face;
}
}
return null;
}
public static Chest findConnectedChest(Sign sign) {
Block block = sign.getBlock();
BlockFace signFace = null;
BlockData data = sign.getBlockData();
if (data.getMaterial() == Material.WALL_SIGN) {
WallSign signData = (WallSign) data;
signFace = signData.getFacing().getOppositeFace();
Block faceBlock = block.getRelative(signFace);
if (BlockUtil.isChest(faceBlock)) {
return (Chest) faceBlock.getState();
}
}
for (BlockFace bf : SHOP_FACES) {
if (bf != signFace) {
Block faceBlock = block.getRelative(bf);
if (BlockUtil.isChest(faceBlock)) {
return (Chest) faceBlock.getState();
}
}
}
return null;
}
private static Sign findAnyNearbyShopSign(Block block, Block ignoredSign) {
for (BlockFace bf : SHOP_FACES) {
Block faceBlock = block.getRelative(bf);
if ((ignoredSign != null && ignoredSign.equals(faceBlock)) || !BlockUtil.isSign(faceBlock)) {
continue;
}
Sign sign = (Sign) faceBlock.getState();
if (ChestShopSign.isValid(sign)) {
return sign;
}
}
return null;
}
}