diff --git a/core/src/mindustry/core/World.java b/core/src/mindustry/core/World.java index d6dacd1431..47a3b46ab4 100644 --- a/core/src/mindustry/core/World.java +++ b/core/src/mindustry/core/World.java @@ -555,6 +555,30 @@ public class World{ } } + public static void raycastEachNoDiagonalWorld(float x0, float y0, float x1, float y1, Raycaster cons){ + raycastEachNoDiagonal(toTile(x0), toTile(y0), toTile(x1), toTile(y1), cons); + } + + public static void raycastEachNoDiagonal(int startX, int startY, int endX, int endY, Raycaster cons){ + int xDist = Math.abs(endX - startX); + int yDist = -Math.abs(endY - startY); + int xStep = (startX < endX ? +1 : -1); + int yStep = (startY < endY ? +1 : -1); + int error = xDist + yDist; + + while(true){ + if(cons.accept(startX, startY) || (startX == endX && startY == endY)) break; + + if(2 * error - yDist > xDist - 2 * error){ + error += yDist; + startX += xStep; + }else{ + error += xDist; + startY += yStep; + } + } + } + public static boolean raycast(int x1, int y1, int x2, int y2, Raycaster cons){ int x = x1, dx = Math.abs(x2 - x), sx = x < x2 ? 1 : -1; int y = y1, dy = Math.abs(y2 - y), sy = y < y2 ? 1 : -1; diff --git a/core/src/mindustry/entities/Damage.java b/core/src/mindustry/entities/Damage.java index 61bc01c95a..c836cdc58a 100644 --- a/core/src/mindustry/entities/Damage.java +++ b/core/src/mindustry/entities/Damage.java @@ -263,7 +263,7 @@ public class Damage{ if(hitter.type.collidesGround && hitter.type.collidesTiles){ seg1.set(x, y); seg2.set(seg1).add(vec); - World.raycastEachWorld(x, y, seg2.x, seg2.y, (cx, cy) -> { + World.raycastEachNoDiagonalWorld(x, y, seg2.x, seg2.y, (cx, cy) -> { Building tile = world.build(cx, cy); boolean collide = tile != null && tile.collide(hitter) && hitter.checkUnderBuild(tile, cx * tilesize, cy * tilesize) && ((tile.team != team && tile.collide(hitter)) || hitter.type.testCollision(hitter, tile)) && collidedBlocks.add(tile.pos());