From 6302f065eb0b48288ef2e849736a56561af0c3fd Mon Sep 17 00:00:00 2001 From: Intybyte Date: Fri, 16 Jan 2026 16:53:46 +0100 Subject: [PATCH] More reliable check --- .../java/at/pavlov/cannons/cannon/Cannon.java | 4 ++ .../pavlov/cannons/cannon/CannonBlocks.java | 52 +++++++++++++++++-- .../pavlov/cannons/cannon/CannonManager.java | 9 +++- 3 files changed, 59 insertions(+), 6 deletions(-) diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java index 45e47f77..2c000c77 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/Cannon.java @@ -797,6 +797,10 @@ public boolean isCannonBlock(Block block) { return false; } + if (!design.isAllowedMaterial(block.getType())) { + return false; + } + for (SimpleBlock designBlock : design.getAllCannonBlocks(getCannonDirection())) { if (designBlock.compareMaterialAndLoc(block, getOffset())) { return true; diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonBlocks.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonBlocks.java index fef85f12..a113cbaa 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonBlocks.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonBlocks.java @@ -37,7 +37,7 @@ public boolean isLoadingInterface(Vector loc) { } return false; } - + /** * returns the location off one firing Trigger * @return the firing trigger. (can be null if there is no trigger on the cannon) @@ -45,12 +45,12 @@ public boolean isLoadingInterface(Vector loc) { public Vector getFiringTrigger() { //return one tigger if (rightClickTrigger!= null && !rightClickTrigger.isEmpty()) - return rightClickTrigger.get(0); + return rightClickTrigger.get(0); if (redstoneTrigger != null && !redstoneTrigger.isEmpty()) return redstoneTrigger.get(0); return null; } - + public Vector getRotationCenter() { return rotationCenter; } @@ -154,5 +154,49 @@ public void setDestructibleBlocks(ArrayList destructibleBlocks) { public void addDestructibleBlocks(Vector add) { this.destructibleBlocks.add(add); } - + + + private Vector min = null; + public Vector getMin() { + if (min != null) return min; + calculateMaxMin(); + return min; + } + + private Vector max = null; + public Vector getMax() { + if (max != null) return max; + calculateMaxMin(); + return max; + } + + private void calculateMaxMin() { + Vector minT = allCannonBlocks.get(0).toVector(); + Vector maxT = minT.clone(); + + for (var block : allCannonBlocks) { + Vector vec = block.toVector(); + + minT.setX(Math.min(minT.getX(), vec.getX())); + minT.setY(Math.min(minT.getY(), vec.getY())); + minT.setZ(Math.min(minT.getZ(), vec.getZ())); + + maxT.setX(Math.max(maxT.getX(), vec.getX())); + maxT.setY(Math.max(maxT.getY(), vec.getY())); + maxT.setZ(Math.max(maxT.getZ(), vec.getZ())); + } + + min = minT; + max = maxT; + } + + private double diagonal = -1; + public double getDiagonal() { + if (diagonal < 0) { + calculateMaxMin(); + diagonal = max.distance(min); + } + + return diagonal; + } } \ No newline at end of file diff --git a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonManager.java b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonManager.java index af44a88e..260f652a 100644 --- a/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonManager.java +++ b/cannons-bukkit/src/main/java/at/pavlov/cannons/cannon/CannonManager.java @@ -484,9 +484,14 @@ public static Cannon getCannon(String cannonName) { * @return the cannon at this location */ public Cannon getCannonFromStorage(Location loc) { + Vector vector = loc.toVector(); for (Cannon cannon : cannonList.values()) { - //To make code faster on servers with a lot of cannons we check the distance squared - if (loc.toVector().distanceSquared(cannon.getOffset()) <= 1024 && cannon.isCannonBlock(loc.getBlock())) { + var design = cannon.getCannonDesign(); + var cannonBlocks = design.getCannonBlockMap().get(cannon.getCannonDirection()); + double diagonal = cannonBlocks.getDiagonal(); + if (diagonal < 0 || vector.distance(cannon.getOffset()) >= diagonal) continue; + + if (cannon.isCannonBlock(loc.getBlock())) { return cannon; } }