1414
1515public class LocketteProAPI {
1616
17+ private static final String ENTITY_REDSTONE = "#redstone" ;
18+
1719 public static BlockFace [] newsfaces = {BlockFace .NORTH , BlockFace .EAST , BlockFace .SOUTH , BlockFace .WEST };
1820 public static BlockFace [] allfaces = {BlockFace .NORTH , BlockFace .EAST , BlockFace .SOUTH , BlockFace .WEST , BlockFace .UP , BlockFace .DOWN };
1921
@@ -323,6 +325,72 @@ private static boolean hasContainerBypassTagOnSign(Block block) {
323325 return false ;
324326 }
325327
328+ public static boolean hasRedstoneBypassTag (Block block ) {
329+ if (block == null ) return false ;
330+ if (ContainerPdcLockManager .isContainerBlock (block )) {
331+ ContainerPdcLockManager .LockData data = ContainerPdcLockManager .getLockData (block );
332+ if (data .hasPdcData ()) {
333+ return data .isLocked () && ContainerPdcLockManager .hasRedstoneBypassTag (block );
334+ }
335+ }
336+ if (block .getBlockData () instanceof Door ) {
337+ Block [] doors = getDoors (block );
338+ if (doors == null ) return false ;
339+ for (BlockFace doorface : newsfaces ) {
340+ Block relative0 = doors [0 ].getRelative (doorface ), relative1 = doors [1 ].getRelative (doorface );
341+ if (relative0 .getType () == doors [0 ].getType () && relative1 .getType () == doors [1 ].getType ()) {
342+ if (hasRedstoneBypassTagSingleBlock (relative1 .getRelative (BlockFace .UP ), doorface .getOppositeFace ()))
343+ return true ;
344+ if (hasRedstoneBypassTagSingleBlock (relative1 , doorface .getOppositeFace ())) return true ;
345+ if (hasRedstoneBypassTagSingleBlock (relative0 , doorface .getOppositeFace ())) return true ;
346+ if (hasRedstoneBypassTagSingleBlock (relative0 .getRelative (BlockFace .DOWN ), doorface .getOppositeFace ()))
347+ return true ;
348+ }
349+ }
350+ if (hasRedstoneBypassTagSingleBlock (doors [1 ].getRelative (BlockFace .UP ), null )) return true ;
351+ if (hasRedstoneBypassTagSingleBlock (doors [1 ], null )) return true ;
352+ if (hasRedstoneBypassTagSingleBlock (doors [0 ], null )) return true ;
353+ if (hasRedstoneBypassTagSingleBlock (doors [0 ].getRelative (BlockFace .DOWN ), null )) return true ;
354+ } else if (block .getBlockData () instanceof Chest ) {
355+ BlockFace chestface = getRelativeChestFace (block );
356+ if (chestface != null ) {
357+ Block relativechest = block .getRelative (chestface );
358+ if (hasRedstoneBypassTagSingleBlock (relativechest , chestface .getOppositeFace ())) return true ;
359+ }
360+ }
361+ return hasRedstoneBypassTagSingleBlock (block , null );
362+ }
363+
364+ private static boolean hasRedstoneBypassTagSingleBlock (Block block , BlockFace exempt ) {
365+ for (BlockFace blockface : newsfaces ) {
366+ if (blockface == exempt ) continue ;
367+ Block relativeblock = block .getRelative (blockface );
368+ if (isLockSignOrAdditionalSign (relativeblock ) && getFacing (relativeblock ) == blockface ) {
369+ if (hasRedstoneBypassTagOnSign (relativeblock )) {
370+ return true ;
371+ }
372+ }
373+ }
374+ return false ;
375+ }
376+
377+ private static boolean hasRedstoneBypassTagOnSign (Block block ) {
378+ String [] lines = ((Sign ) block .getState ()).getSide (Side .FRONT ).getLines ();
379+ for (int i = 1 ; i < 4 ; i ++) {
380+ String line = lines [i ] == null ? "" : lines [i ].trim ();
381+ if (ENTITY_REDSTONE .equalsIgnoreCase (line )) {
382+ return true ;
383+ }
384+ if (PermissionGroupStore .isGroupReference (line )) {
385+ String groupName = PermissionGroupStore .extractGroupName (line );
386+ if (groupName != null && PermissionGroupStore .groupAllowsEntity (groupName , ENTITY_REDSTONE )) {
387+ return true ;
388+ }
389+ }
390+ }
391+ return false ;
392+ }
393+
326394 public static boolean shouldBypassContainerRestriction (Block block ) {
327395 if (block == null ) return false ;
328396 if (ContainerPdcLockManager .isContainerBlock (block )) {
@@ -345,6 +413,17 @@ public static boolean shouldBypassContainerTransferRestriction(Block block) {
345413 return hasContainerBypassTag (block );
346414 }
347415
416+ public static boolean shouldBypassContainerRedstoneRestriction (Block block ) {
417+ if (block == null ) return false ;
418+ if (ContainerPdcLockManager .isContainerBlock (block )) {
419+ ContainerPdcLockManager .LockData data = ContainerPdcLockManager .getLockData (block );
420+ if (data .hasPdcData ()) {
421+ return data .isLocked () && ContainerPdcLockManager .hasRedstoneBypassTag (block );
422+ }
423+ }
424+ return hasRedstoneBypassTag (block );
425+ }
426+
348427 public static boolean isContainerEffectivelyLocked (Block block ) {
349428 if (block == null ) return false ;
350429 if (ContainerPdcLockManager .isContainerBlock (block )) {
@@ -367,6 +446,17 @@ public static boolean isContainerTransferEffectivelyLocked(Block block) {
367446 return isLocked (block ) && !shouldBypassContainerTransferRestriction (block );
368447 }
369448
449+ public static boolean isContainerRedstoneEffectivelyLocked (Block block ) {
450+ if (block == null ) return false ;
451+ if (ContainerPdcLockManager .isContainerBlock (block )) {
452+ ContainerPdcLockManager .LockData data = ContainerPdcLockManager .getLockData (block );
453+ if (data .hasPdcData ()) {
454+ return data .isLocked () && !ContainerPdcLockManager .hasRedstoneBypassTag (block );
455+ }
456+ }
457+ return isLocked (block ) && !shouldBypassContainerRedstoneRestriction (block );
458+ }
459+
370460 public static boolean isOwnerOfSign (Block block , Player player ) { // Requires isSign
371461 Block protectedblock = getAttachedBlock (block );
372462 // Normal situation, that block is just locked by an adjacent sign
0 commit comments