|
|
|
@@ -19,7 +19,7 @@ import java.util.*;
|
|
|
|
|
// 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 enum HitboxData {
|
|
|
|
|
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 enum HitboxData {
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|
|
|
|
|