Skip to content

Commit ee63853

Browse files
committed
Fix PDC tag handling for everyone-open lock signs
1 parent 1825c3d commit ee63853

File tree

5 files changed

+65
-1
lines changed

5 files changed

+65
-1
lines changed

src/main/java/me/crafter/mc/lockettepro/BlockPlayerListener.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,14 @@ public void onPlayerQuickLockChest(PlayerInteractEvent event) {
9797
Utils.putSignOn(block, blockface, Config.getDefaultAdditionalString(), "", itemInUse.getType());
9898
Utils.removeASign(player, event.getHand());
9999
Utils.sendMessages(player, Config.getLang("additional-sign-added-quick"));
100+
Utils.refreshLockedContainerPdcTagLater(block);
100101
Dependency.logPlacement(player, block.getRelative(blockface));
101102
} else if (LocketteProAPI.isOwner(block, player)) {
102103
// Locked, (not locked door nearby), is owner of locked block
103104
Utils.putSignOn(block, blockface, Config.getDefaultAdditionalString(), "", itemInUse.getType());
104105
Utils.removeASign(player, event.getHand());
105106
Utils.sendMessages(player, Config.getLang("additional-sign-added-quick"));
107+
Utils.refreshLockedContainerPdcTagLater(block);
106108
Dependency.logPlacement(player, block.getRelative(blockface));
107109
} else {
108110
// Cannot lock this block
@@ -168,13 +170,15 @@ public void onManualLock(SignChangeEvent event) {
168170
event.setLine(0, Config.getLang("sign-error"));
169171
} else {
170172
Utils.sendMessages(player, Config.getLang("additional-sign-added-manual"));
173+
Utils.refreshLockedContainerPdcTagLater(block);
171174
}
172175
} else if (LocketteProAPI.isOwner(block, player)) {
173176
if (LocketteProAPI.isLockString(topline)) {
174177
Utils.sendMessages(player, Config.getLang("block-already-locked-manual"));
175178
event.setLine(0, Config.getLang("sign-error"));
176179
} else {
177180
Utils.sendMessages(player, Config.getLang("additional-sign-added-manual"));
181+
Utils.refreshLockedContainerPdcTagLater(block);
178182
}
179183
} else { // Not possible to fall here except override
180184
Utils.sendMessages(player, Config.getLang("block-already-locked-manual"));

src/main/java/me/crafter/mc/lockettepro/Dependency.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ public static boolean isPermissionGroupOf(String line, Player player) {
6666

6767
public static boolean isScoreboardTeamOf(String line, Player player) {
6868
ScoreboardManager scoreboardManager = Bukkit.getScoreboardManager();
69+
if (scoreboardManager == null) return false;
6970
Team team = scoreboardManager.getMainScoreboard().getEntityTeam(player);
7071
if (team == null) {
7172
return false;

src/main/java/me/crafter/mc/lockettepro/LockettePro.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ public boolean onCommand(@NotNull CommandSender sender, Command cmd, @NotNull St
203203
if (selectedSign != null)
204204
Utils.updateUuidByUsername(selectedSign, Integer.parseInt(args[0]) - 1);
205205
}
206+
Utils.refreshLockedContainerPdcTagLater(LocketteProAPI.getAttachedBlock(block));
206207
break;
207208
}
208209
} else if (LocketteProAPI.isAdditionalSign(block)) {
@@ -222,6 +223,7 @@ public boolean onCommand(@NotNull CommandSender sender, Command cmd, @NotNull St
222223
if (selectedSign != null)
223224
Utils.updateUuidByUsername(selectedSign, Integer.parseInt(args[0]) - 1);
224225
}
226+
Utils.refreshLockedContainerPdcTagLater(LocketteProAPI.getAttachedBlock(block));
225227
break;
226228
}
227229
} else {

src/main/java/me/crafter/mc/lockettepro/LocketteProAPI.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,63 @@ public static boolean isUserSingleBlock(Block block, BlockFace exempt, Player pl
162162
return false;
163163
}
164164

165+
public static boolean isOpenToEveryone(Block block) {
166+
if (block == null) return false;
167+
return isOpenToEveryoneByTag(block);
168+
}
169+
170+
private static boolean isOpenToEveryoneByTag(Block block) {
171+
if (block.getBlockData() instanceof Door) {
172+
Block[] doors = getDoors(block);
173+
if (doors == null) return false;
174+
for (BlockFace doorface : newsfaces) {
175+
Block relative0 = doors[0].getRelative(doorface), relative1 = doors[1].getRelative(doorface);
176+
if (relative0.getType() == doors[0].getType() && relative1.getType() == doors[1].getType()) {
177+
if (isOpenToEveryoneSingleBlock(relative1.getRelative(BlockFace.UP), doorface.getOppositeFace()))
178+
return true;
179+
if (isOpenToEveryoneSingleBlock(relative1, doorface.getOppositeFace())) return true;
180+
if (isOpenToEveryoneSingleBlock(relative0, doorface.getOppositeFace())) return true;
181+
if (isOpenToEveryoneSingleBlock(relative0.getRelative(BlockFace.DOWN), doorface.getOppositeFace()))
182+
return true;
183+
}
184+
}
185+
if (isOpenToEveryoneSingleBlock(doors[1].getRelative(BlockFace.UP), null)) return true;
186+
if (isOpenToEveryoneSingleBlock(doors[1], null)) return true;
187+
if (isOpenToEveryoneSingleBlock(doors[0], null)) return true;
188+
if (isOpenToEveryoneSingleBlock(doors[0].getRelative(BlockFace.DOWN), null)) return true;
189+
} else if (block.getBlockData() instanceof Chest) {
190+
BlockFace chestface = getRelativeChestFace(block);
191+
if (chestface != null) {
192+
Block relativechest = block.getRelative(chestface);
193+
if (isOpenToEveryoneSingleBlock(relativechest, chestface.getOppositeFace())) return true;
194+
}
195+
}
196+
return isOpenToEveryoneSingleBlock(block, null);
197+
}
198+
199+
public static boolean isOpenToEveryoneSingleBlock(Block block, BlockFace exempt) {
200+
for (BlockFace blockface : newsfaces) {
201+
if (blockface == exempt) continue;
202+
Block relativeblock = block.getRelative(blockface);
203+
if (isLockSignOrAdditionalSign(relativeblock) && getFacing(relativeblock) == blockface) {
204+
if (isEveryoneOnSign(relativeblock)) {
205+
return true;
206+
}
207+
}
208+
}
209+
return false;
210+
}
211+
212+
public static boolean isEveryoneOnSign(Block block) { // Requires (isLockSign or isAdditionalSign)
213+
String[] lines = ((Sign) block.getState()).getSide(Side.FRONT).getLines();
214+
for (int i = 1; i < 4; i++) {
215+
if (Config.isEveryoneSignString(lines[i])) {
216+
return true;
217+
}
218+
}
219+
return false;
220+
}
221+
165222
public static boolean isOwnerOfSign(Block block, Player player) { // Requires isSign
166223
Block protectedblock = getAttachedBlock(block);
167224
// Normal situation, that block is just locked by an adjacent sign

src/main/java/me/crafter/mc/lockettepro/Utils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ private static void setLockedContainerPdc(Block block, boolean locked) {
214214
public static void refreshLockedContainerPdcTag(Block block) {
215215
if (block == null) return;
216216

217-
boolean locked = LocketteProAPI.isLocked(block);
217+
boolean locked = LocketteProAPI.isLocked(block) && !LocketteProAPI.isOpenToEveryone(block);
218218
setLockedContainerPdc(block, locked);
219219
syncConnectedContainerPdc(block, locked);
220220
}

0 commit comments

Comments
 (0)