From 6cfe71da9b18bd3fca327d6de63d681c64829b50 Mon Sep 17 00:00:00 2001 From: Axionize <154778082+Axionize@users.noreply.github.com> Date: Wed, 22 Jan 2025 00:45:27 -0500 Subject: [PATCH] Refactor HitboxData.getBlockHitbox() to include isTargetBlock as parameter (#1957) Also fixes a rare NPE in LOSP --- .../grimac/checks/type/BlockPlaceCheck.java | 2 +- .../events/packets/CheckManagerListener.java | 2 +- .../utils/anticheat/update/BlockBreak.java | 2 +- .../grimac/utils/collisions/HitboxData.java | 95 ++++++++++--------- .../blocks/connecting/DynamicHitboxFence.java | 2 +- .../blocks/connecting/DynamicHitboxPane.java | 2 +- .../blocks/connecting/DynamicHitboxWall.java | 2 +- .../collisions/datatypes/HitBoxFactory.java | 2 +- 8 files changed, 58 insertions(+), 51 deletions(-) diff --git a/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java b/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java index 0247e5a14d..909544e58c 100644 --- a/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java +++ b/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java @@ -69,7 +69,7 @@ protected boolean shouldCancel() { protected SimpleCollisionBox getCombinedBox(final BlockPlace place) { // Alright, instead of skidding AACAdditionsPro, let's just use bounding boxes Vector3i clicked = place.getPlacedAgainstBlockLocation(); - CollisionBox placedOn = HitboxData.getBlockHitbox(player, place.getMaterial(), player.getClientVersion(), player.compensatedWorld.getWrappedBlockStateAt(clicked), clicked.getX(), clicked.getY(), clicked.getZ()); + CollisionBox placedOn = HitboxData.getBlockHitbox(player, place.getMaterial(), player.getClientVersion(), player.compensatedWorld.getWrappedBlockStateAt(clicked), true, clicked.getX(), clicked.getY(), clicked.getZ()); int size = placedOn.downCast(boxes); diff --git a/src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java b/src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java index c8adea7c3a..145285fb86 100644 --- a/src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java +++ b/src/main/java/ac/grim/grimac/events/packets/CheckManagerListener.java @@ -814,7 +814,7 @@ private static HitData getNearestHitResult(GrimPlayer player, StateType heldItem return null; } - CollisionBox data = HitboxData.getBlockHitbox(player, heldItem, player.getClientVersion(), block, vector3i.getX(), vector3i.getY(), vector3i.getZ()); + CollisionBox data = HitboxData.getBlockHitbox(player, heldItem, player.getClientVersion(), block, false, vector3i.getX(), vector3i.getY(), vector3i.getZ()); List boxes = new ArrayList<>(); data.downCast(boxes); diff --git a/src/main/java/ac/grim/grimac/utils/anticheat/update/BlockBreak.java b/src/main/java/ac/grim/grimac/utils/anticheat/update/BlockBreak.java index fa25377b4b..ce1b0d4758 100644 --- a/src/main/java/ac/grim/grimac/utils/anticheat/update/BlockBreak.java +++ b/src/main/java/ac/grim/grimac/utils/anticheat/update/BlockBreak.java @@ -37,7 +37,7 @@ public void cancel() { } public SimpleCollisionBox getCombinedBox() { - CollisionBox placedOn = HitboxData.getBlockHitbox(player, player.getInventory().getHeldItem().getType().getPlacedType(), player.getClientVersion(), block, position.x, position.y, position.z); + CollisionBox placedOn = HitboxData.getBlockHitbox(player, player.getInventory().getHeldItem().getType().getPlacedType(), player.getClientVersion(), block, true, position.x, position.y, position.z); List boxes = new ArrayList<>(); placedOn.downCast(boxes); diff --git a/src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java b/src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java index fe4e7e2ae2..d758d6754d 100644 --- a/src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java +++ b/src/main/java/ac/grim/grimac/utils/collisions/HitboxData.java @@ -19,7 +19,7 @@ // Expansion to the CollisionData class, which is different than regular ray tracing hitboxes public enum HitboxData { - RAILS((player, item, version, data, x, y, z) -> { + RAILS((player, item, version, data, isTargetBlock, x, y, z) -> { return switch (data.getShape()) { case ASCENDING_NORTH, ASCENDING_SOUTH, ASCENDING_EAST, ASCENDING_WEST -> { if (version.isOlderThan(ClientVersion.V_1_8)) { @@ -45,7 +45,7 @@ public enum HitboxData { }; }, BlockTags.RAILS.getStates().toArray(new StateType[0])), - END_PORTAL((player, item, version, data, x, y, z) -> { + END_PORTAL((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isOlderThan(ClientVersion.V_1_9)) { return new SimpleCollisionBox(0.0D, 0.0D, 0.0D, 1.0D, 0.0625D, 1.0D); } else if (version.isOlderThan(ClientVersion.V_1_17)) { @@ -54,7 +54,7 @@ public enum HitboxData { return new HexCollisionBox(0.0D, 6.0D, 0.0D, 16.0D, 12.0D, 16.0D); }, StateTypes.END_PORTAL), - FENCE_GATE((player, item, version, data, x, y, z) -> { + FENCE_GATE((player, item, version, data, isTargetBlock, x, y, z) -> { // This technically should be taken from the block data/made multi-version/run block updates... but that's too far even for me // This way is so much easier and works unless the magic stick wand is used boolean isInWall; @@ -81,7 +81,7 @@ public enum HitboxData { PANE(new DynamicHitboxPane(), Materials.getPanes().toArray(new StateType[0])), - LEVER(((player, item, version, data, x, y, z) -> { + LEVER(((player, item, version, data, isTargetBlock, x, y, z) -> { Face face = data.getFace(); BlockFace facing = data.getFacing(); if (version.isOlderThan(ClientVersion.V_1_13)) { @@ -133,7 +133,7 @@ public enum HitboxData { }; }), StateTypes.LEVER), - BUTTON((player, item, version, data, x, y, z) -> { + BUTTON((player, item, version, data, isTargetBlock, x, y, z) -> { final Face face = data.getFace(); final BlockFace facing = data.getFacing(); final boolean powered = data.isPowered(); @@ -178,7 +178,7 @@ public enum HitboxData { case CEILING: // ViaVersion shows lever if (player.getClientVersion().isOlderThan(ClientVersion.V_1_8)) { - return LEVER.dynamic.fetch(player, item, version, data, x, y, z); + return LEVER.dynamic.fetch(player, item, version, data, isTargetBlock, x, y, z); } // x axis if (facing == BlockFace.EAST || facing == BlockFace.WEST) { @@ -189,7 +189,7 @@ public enum HitboxData { case FLOOR: // ViaVersion shows lever if (player.getClientVersion().isOlderThan(ClientVersion.V_1_8)) { - return LEVER.dynamic.fetch(player, item, version, data, x, y, z); + return LEVER.dynamic.fetch(player, item, version, data, isTargetBlock, x, y, z); } // x axis if (facing == BlockFace.EAST || facing == BlockFace.WEST) { @@ -204,7 +204,7 @@ public enum HitboxData { WALL(new DynamicHitboxWall(), BlockTags.WALLS.getStates().toArray(new StateType[0])), - WALL_SIGN((player, item, version, data, x, y, z) -> { + WALL_SIGN((player, item, version, data, isTargetBlock, x, y, z) -> { return switch (data.getFacing()) { case NORTH -> new HexCollisionBox(0.0, 4.5, 14.0, 16.0, 12.5, 16.0); case SOUTH -> new HexCollisionBox(0.0, 4.5, 0.0, 16.0, 12.5, 2.0); @@ -214,7 +214,7 @@ public enum HitboxData { }; }, BlockTags.WALL_SIGNS.getStates().toArray(new StateType[0])), - WALL_HANGING_SIGN((player, item, version, data, x, y, z) -> { + WALL_HANGING_SIGN((player, item, version, data, isTargetBlock, x, y, z) -> { return switch (data.getFacing()) { case NORTH, SOUTH -> new ComplexCollisionBox(2, new HexCollisionBox(0.0D, 14.0D, 6.0D, 16.0D, 16.0D, 10.0D), @@ -225,7 +225,7 @@ public enum HitboxData { }; }, BlockTags.WALL_HANGING_SIGNS.getStates().toArray(new StateType[0])), - STANDING_SIGN((player, item, version, data, x, y, z) -> + STANDING_SIGN((player, item, version, data, isTargetBlock, x, y, z) -> new HexCollisionBox(4.0, 0.0, 4.0, 12.0, 16.0, 12.0), BlockTags.STANDING_SIGNS.getStates().toArray(new StateType[0])), @@ -241,10 +241,10 @@ public enum HitboxData { StateTypes.LIGHT_GRAY_BANNER, StateTypes.CYAN_BANNER, StateTypes.PURPLE_BANNER, StateTypes.BLUE_BANNER, StateTypes.BROWN_BANNER, StateTypes.GREEN_BANNER, StateTypes.RED_BANNER, StateTypes.BLACK_BANNER), - WALL_BANNER((player, item, version, data, x, y, z) -> { + WALL_BANNER((player, item, version, data, isTargetBlock, x, y, z) -> { // ViaVersion replacement block if (version.isOlderThan(ClientVersion.V_1_8)) { - return WALL_SIGN.dynamic.fetch(player, item, version, data, x, y, z); + return WALL_SIGN.dynamic.fetch(player, item, version, data, isTargetBlock, x, y, z); } return switch (data.getFacing()) { @@ -260,9 +260,16 @@ public enum HitboxData { StateTypes.CYAN_WALL_BANNER, StateTypes.PURPLE_WALL_BANNER, StateTypes.BLUE_WALL_BANNER, StateTypes.BROWN_WALL_BANNER, StateTypes.GREEN_WALL_BANNER, StateTypes.RED_WALL_BANNER, StateTypes.BLACK_WALL_BANNER), - BREWING_STAND((player, item, version, block, x, y, z) -> { + BREWING_STAND((player, item, version, block, isTargetBlock, x, y, z) -> { // BEWARE OF https://bugs.mojang.com/browse/MC-85109 FOR 1.8 PLAYERS + // 1.8 Brewing Stand hitbox is a fullblock until it is hit sometimes, can be caused be restarting client and joining server if (version.isOlderThan(ClientVersion.V_1_13)) { + if (isTargetBlock && block.getType() == StateTypes.BREWING_STAND && player.getClientVersion().equals(ClientVersion.V_1_8)) { + return new ComplexCollisionBox(2, + new SimpleCollisionBox(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F), + new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true) + ); + } return new SimpleCollisionBox(0.0F, 0.0F, 0.0F, 1.0F, 0.125F, 1.0F); } else { return new ComplexCollisionBox(2, @@ -271,14 +278,14 @@ public enum HitboxData { } }, StateTypes.BREWING_STAND), - SMALL_FLOWER((player, item, version, data, x, y, z) -> player.getClientVersion().isOlderThan(ClientVersion.V_1_13) + SMALL_FLOWER((player, item, version, data, isTargetBlock, x, y, z) -> player.getClientVersion().isOlderThan(ClientVersion.V_1_13) ? new SimpleCollisionBox(0.3125D, 0.0D, 0.3125D, 0.6875D, 0.625D, 0.6875D) : new OffsetCollisionBox(data.getType(), 0.3125D, 0.0D, 0.3125D, 0.6875D, 0.625D, 0.6875D), BlockTags.SMALL_FLOWERS.getStates().toArray(new StateType[0])), TALL_FLOWERS(new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true), BlockTags.TALL_FLOWERS.getStates().toArray(new StateType[0])), - FIRE((player, item, version, data, x, y, z) -> { + FIRE((player, item, version, data, isTargetBlock, x, y, z) -> { // Since 1.16 fire has a small hitbox if (version.isNewerThanOrEquals(ClientVersion.V_1_16)) { return new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0D, 1.0D, 16.0D); @@ -292,7 +299,7 @@ public enum HitboxData { SOUL_SAND(new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true), StateTypes.SOUL_SAND), - CACTUS((player, item, version, data, x, y, z) -> { + CACTUS((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isOlderThan(ClientVersion.V_1_13)) { // https://bugs.mojang.com/browse/MC-59610 return new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true); @@ -300,11 +307,11 @@ public enum HitboxData { return new HexCollisionBox(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D); }, StateTypes.CACTUS), - SNOW((player, item, version, data, x, y, z) -> { + SNOW((player, item, version, data, isTargetBlock, x, y, z) -> { return new SimpleCollisionBox(0, 0, 0, 1, data.getLayers() * 0.125, 1); }, StateTypes.SNOW), - LECTERN_BLOCK((player, item, version, data, x, y, z) -> { + LECTERN_BLOCK((player, item, version, data, isTargetBlock, x, y, z) -> { ComplexCollisionBox common = new ComplexCollisionBox(5, new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0D, 2.0D, 16.0D), new HexCollisionBox(4.0D, 2.0D, 4.0D, 12.0D, 14.0D, 12.0D)); @@ -330,7 +337,7 @@ public enum HitboxData { return common; }, StateTypes.LECTERN), - GLOW_LICHEN_SCULK_VEIN((player, item, version, data, x, y, z) -> { + GLOW_LICHEN_SCULK_VEIN((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isNewerThan(ClientVersion.V_1_16_4)) { ComplexCollisionBox box = new ComplexCollisionBox(6); @@ -359,7 +366,7 @@ public enum HitboxData { } }, StateTypes.GLOW_LICHEN, StateTypes.SCULK_VEIN), - SPORE_BLOSSOM((player, item, version, data, x, y, z) -> { + SPORE_BLOSSOM((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isNewerThan(ClientVersion.V_1_16_4)) { return new HexCollisionBox(2.0D, 13.0D, 2.0D, 14.0D, 16.0D, 14.0D); } else { // ViaVersion replacement is a Peony @@ -367,7 +374,7 @@ public enum HitboxData { } }, StateTypes.SPORE_BLOSSOM), - PITCHER_CROP((player, item, version, data, x, y, z) -> { + PITCHER_CROP((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isNewerThan(ClientVersion.V_1_19_4)) { final SimpleCollisionBox FULL_UPPER_SHAPE = new HexCollisionBox(3.0D, 0.0D, 3.0D, 13.0D, 15.0D, 13.0D); final SimpleCollisionBox FULL_LOWER_SHAPE = new HexCollisionBox(3.0D, -1.0D, 3.0D, 13.0D, 16.0D, 13.0D); @@ -382,19 +389,19 @@ public enum HitboxData { } }, StateTypes.PITCHER_CROP), - WHEAT_BEETROOTS((player, item, version, data, x, y, z) -> { + WHEAT_BEETROOTS((player, item, version, data, isTargetBlock, x, y, z) -> { return new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0D, (data.getAge() + 1) * 2, 16.0D); }, StateTypes.WHEAT, StateTypes.BEETROOTS), - CARROT_POTATOES((player, item, version, data, x, y, z) -> { + CARROT_POTATOES((player, item, version, data, isTargetBlock, x, y, z) -> { return new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0D, data.getAge() + 2, 16.0D); }, StateTypes.CARROTS, StateTypes.POTATOES), - NETHER_WART((player, item, version, data, x, y, z) -> { + NETHER_WART((player, item, version, data, isTargetBlock, x, y, z) -> { return new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0, 5 + (data.getAge() * 3), 16.0D); }, StateTypes.NETHER_WART), - ATTACHED_PUMPKIN_STEM((player, item, version, data, x, y, z) -> { + ATTACHED_PUMPKIN_STEM((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isOlderThan(ClientVersion.V_1_13)) return new HexCollisionBox(7.0D, 0.0D, 7.0D, 9.0D, 16.0D, 9.0D); @@ -406,12 +413,12 @@ public enum HitboxData { }; }, StateTypes.ATTACHED_MELON_STEM, StateTypes.ATTACHED_PUMPKIN_STEM), - PUMPKIN_STEM((player, item, version, data, x, y, z) -> { + PUMPKIN_STEM((player, item, version, data, isTargetBlock, x, y, z) -> { return new HexCollisionBox(7, 0, 7, 9, 2 * (data.getAge() + 1), 9); }, StateTypes.PUMPKIN_STEM, StateTypes.MELON_STEM), // Hitbox/Outline is Same as Collision - COCOA_BEANS((player, item, version, data, x, y, z) -> { + COCOA_BEANS((player, item, version, data, isTargetBlock, x, y, z) -> { return CollisionData.getCocoa(version, data.getAge(), data.getFacing()); }, StateTypes.COCOA), @@ -420,7 +427,7 @@ public enum HitboxData { // Redstone wire is very complex with its collision shapes and has many de-syncs REDSTONE_WIRE(NoCollisionBox.INSTANCE, StateTypes.REDSTONE_WIRE), - SWEET_BERRY((player, item, version, data, x, y, z) -> { + SWEET_BERRY((player, item, version, data, isTargetBlock, x, y, z) -> { if (data.getAge() == 0) { return new HexCollisionBox(3.0D, 0.0D, 3.0D, 13.0D, 8.0D, 13.0D); } else if (data.getAge() < 3) { @@ -431,7 +438,7 @@ public enum HitboxData { CORAL_FAN(new HexCollisionBox(2.0D, 0.0D, 2.0D, 14.0D, 4.0D, 14.0D), BlockTags.CORALS.getStates().toArray(new StateType[0])), - TORCHFLOWER_CROP((player, item, version, data, x, y, z) -> { + TORCHFLOWER_CROP((player, item, version, data, isTargetBlock, x, y, z) -> { if (data.getAge() == 0) { return new HexCollisionBox(5.0D, 0.0D, 5.0D, 11.0D, 6.0D, 11.0D); } @@ -447,7 +454,7 @@ public enum HitboxData { HANGING_ROOTS(new HexCollisionBox(2.0D, 10.0D, 2.0D, 14.0D, 16.0D, 14.0D), StateTypes.HANGING_ROOTS), - GRASS_FERN((player, item, version, data, x ,y, z) -> { + GRASS_FERN((player, item, version, data, isTargetBlock, x ,y, z) -> { if (version.isOlderThan(ClientVersion.V_1_13)) { return new SimpleCollisionBox(0.1F, 0.0F, 0.1F, 0.9F, 0.8F, 0.9F); } @@ -465,29 +472,29 @@ public enum HitboxData { CAVE_VINES(new HexCollisionBox(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D), StateTypes.CAVE_VINES, StateTypes.CAVE_VINES_PLANT), // Then your enum entries become: - TWISTING_VINES_BLOCK((player, item, version, data, x, y, z) -> + TWISTING_VINES_BLOCK((player, item, version, data, isTargetBlock, x, y, z) -> getVineCollisionBox(version, false, true), StateTypes.TWISTING_VINES), - WEEPING_VINES_BLOCK((player, item, version, data, x, y, z) -> + WEEPING_VINES_BLOCK((player, item, version, data, isTargetBlock, x, y, z) -> getVineCollisionBox(version, true, true), StateTypes.WEEPING_VINES), - TWISTING_VINES((player, item, version, data, x, y, z) -> + TWISTING_VINES((player, item, version, data, isTargetBlock, x, y, z) -> getVineCollisionBox(version, false, false), StateTypes.TWISTING_VINES_PLANT), - WEEPING_VINES((player, item, version, data, x, y, z) -> + WEEPING_VINES((player, item, version, data, isTargetBlock, x, y, z) -> getVineCollisionBox(version, true, false), StateTypes.WEEPING_VINES_PLANT), TALL_PLANT(new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true), StateTypes.TALL_GRASS, StateTypes.LARGE_FERN), - BAMBOO((player, item, version, data, x, y, z) -> data.getLeaves() == Leaves.LARGE + BAMBOO((player, item, version, data, isTargetBlock, x, y, z) -> data.getLeaves() == Leaves.LARGE ? new HexOffsetCollisionBox(data.getType(), 3.0, 0.0, 3.0, 13.0, 16.0, 13.0) : new HexOffsetCollisionBox(data.getType(), 5.0, 0.0, 5.0, 11.0, 16.0, 11.0), StateTypes.BAMBOO), - BAMBOO_SAPLING((player, item, version, data, x, y, z) -> { + BAMBOO_SAPLING((player, item, version, data, isTargetBlock, x, y, z) -> { return new HexOffsetCollisionBox(data.getType(), 4.0D, 0.0D, 4.0D, 12.0D, 12.0D, 12.0D); }, StateTypes.BAMBOO_SAPLING), - SCAFFOLDING((player, item, version, data, x, y, z) -> { + SCAFFOLDING((player, item, version, data, isTargetBlock, x, y, z) -> { // If is holding scaffolding or Via replacement - hay bale if (item == StateTypes.SCAFFOLDING || version.isOlderThan(ClientVersion.V_1_14)) { return new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true); @@ -511,7 +518,7 @@ public enum HitboxData { return box; }, StateTypes.SCAFFOLDING), - DRIPLEAF((player, item, version, data, x, y, z) -> { + DRIPLEAF((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isOlderThanOrEquals(ClientVersion.V_1_16_4)) return new SimpleCollisionBox(0, 0, 0, 1, 1, 1, true); @@ -537,7 +544,7 @@ public enum HitboxData { }, StateTypes.BIG_DRIPLEAF), - PINK_PETALS_BLOCK((player, item, version, data, x, y, z) -> { + PINK_PETALS_BLOCK((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isNewerThan(ClientVersion.V_1_20_2)) { int flowerAmount = data.getFlowerAmount(); int horizontalIndex = getHorizontalID(data.getFacing()); @@ -564,10 +571,10 @@ public enum HitboxData { } else if (version.isNewerThan(ClientVersion.V_1_12_2)) { return CORAL_FAN.box.copy(); } - return GRASS_FERN.dynamic.fetch(player, item, version, data, x, y, z); + return GRASS_FERN.dynamic.fetch(player, item, version, data, isTargetBlock, x, y, z); }, StateTypes.PINK_PETALS), - MANGROVE_PROPAGULE(((player, item, version, data, x, y, z) -> { + MANGROVE_PROPAGULE(((player, item, version, data, isTargetBlock, x, y, z) -> { if (data.isHanging()) { return new HexOffsetCollisionBox(data.getType(), 7.0, 0.0, 7.0, 9.0, 16.0, 9.0); } else { @@ -575,7 +582,7 @@ public enum HitboxData { } }), StateTypes.MANGROVE_PROPAGULE), - FROGSPAWN((player, item, version, data, x, y, z) -> { + FROGSPAWN((player, item, version, data, isTargetBlock, x, y, z) -> { if (version.isNewerThan(ClientVersion.V_1_18_2)) { return new HexCollisionBox(0.0D, 0.0D, 0.0D, 16.0D, 1.5D, 16.0D); } else { // ViaVersion just replaces this with... nothing @@ -618,7 +625,7 @@ public static HitboxData getData(StateType material) { return lookup.get(material); } - public static CollisionBox getBlockHitbox(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, int x, int y, int z) { + public static CollisionBox getBlockHitbox(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, boolean isTargetBlock, int x, int y, int z) { HitboxData data = getData(block.getType()); if (data == null) { @@ -632,7 +639,7 @@ public static CollisionBox getBlockHitbox(GrimPlayer player, StateType heldItem, // Allow this class to override collision boxes when they aren't the same as regular boxes HitBoxFactory hitBoxFactory = data.dynamic; - CollisionBox collisionBox = hitBoxFactory.fetch(player, heldItem, version, block, x, y, z); + CollisionBox collisionBox = hitBoxFactory.fetch(player, heldItem, version, block, isTargetBlock, x, y, z); collisionBox.offset(x, y, z); return collisionBox; } diff --git a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxFence.java b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxFence.java index 255e789b9d..4e520674cf 100644 --- a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxFence.java +++ b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxFence.java @@ -43,7 +43,7 @@ public class DynamicHitboxFence extends DynamicConnecting implements HitBoxFacto } @Override - public CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, int x, int y, int z) { + public CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, boolean isTargetBlock, int x, int y, int z) { boolean east; boolean north; boolean south; diff --git a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxPane.java b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxPane.java index b8c98a1d93..e794a7b980 100644 --- a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxPane.java +++ b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxPane.java @@ -18,7 +18,7 @@ public class DynamicHitboxPane extends DynamicConnecting implements HitBoxFactor private static final CollisionBox[] COLLISION_BOXES = makeShapes(1.0F, 1.0F, 16.0F, 0.0F, 16.0F, true, 1); @Override - public CollisionBox fetch(GrimPlayer player, StateType item, ClientVersion version, WrappedBlockState block, int x, int y, int z) { + public CollisionBox fetch(GrimPlayer player, StateType item, ClientVersion version, WrappedBlockState block, boolean isTargetBlock, int x, int y, int z) { boolean east, north, south, west; // 1.13+ servers on 1.13+ clients send the full fence data diff --git a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxWall.java b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxWall.java index 4c3f1fc3d9..f087c6cef9 100644 --- a/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxWall.java +++ b/src/main/java/ac/grim/grimac/utils/collisions/blocks/connecting/DynamicHitboxWall.java @@ -14,7 +14,7 @@ public class DynamicHitboxWall extends DynamicConnecting implements HitBoxFactory { @Override - public CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState state, int x, int y, int z) { + public CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState state, boolean isTargetBlock, int x, int y, int z) { int[] connections = getConnections(player, version, state, x, y, z); int north = connections[0], south = connections[1], west = connections[2], east = connections[3], up = connections[4]; diff --git a/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HitBoxFactory.java b/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HitBoxFactory.java index 09bf6f83a5..59dee25bbc 100644 --- a/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HitBoxFactory.java +++ b/src/main/java/ac/grim/grimac/utils/collisions/datatypes/HitBoxFactory.java @@ -6,5 +6,5 @@ import com.github.retrooper.packetevents.protocol.world.states.type.StateType; public interface HitBoxFactory { - CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, int x, int y, int z); + CollisionBox fetch(GrimPlayer player, StateType heldItem, ClientVersion version, WrappedBlockState block, boolean isTargetBlock, int x, int y, int z); }