Skip to content

Commit

Permalink
Fix Rule: playerBlockCollisionUsingCenterFix with incorrect velocit…
Browse files Browse the repository at this point in the history
…y & cleanup
  • Loading branch information
FxMorin committed Apr 8, 2022
1 parent ff61a3b commit fc39b0f
Showing 1 changed file with 21 additions and 17 deletions.
38 changes: 21 additions & 17 deletions src/main/java/carpetfixes/helpers/CenterUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@
public class CenterUtils {

private static final double VELOCITY_AFFECTING_POS_Y_OFFSET = 0.5000001;
private static final double OFFSET = 0.0001;

//TODO: Change some of these to work with consumers, to minimize duplicate code

public static void checkStepOnCollision(Entity entity) {
Box box = entity.getBoundingBox();
BlockPos blockPos = new BlockPos(box.minX + 0.001, box.minY + 0.001, box.minZ + 0.001);
BlockPos blockPos2 = new BlockPos(box.maxX - 0.001, box.maxY - 0.001, box.maxZ - 0.001);
BlockPos blockPos = new BlockPos(box.minX + OFFSET, box.minY + OFFSET, box.minZ + OFFSET);
BlockPos blockPos2 = new BlockPos(box.maxX - OFFSET, box.maxY - OFFSET, box.maxZ - OFFSET);
if (entity.world.isRegionLoaded(blockPos, blockPos2)) {
BlockPos.Mutable mutable = new BlockPos.Mutable();
for(int i = blockPos.getX(); i <= blockPos2.getX(); ++i) {
Expand All @@ -33,8 +34,8 @@ public static void checkStepOnCollision(Entity entity) {

public static void checkEntityLandOnCollision(Entity entity) {
Box box = entity.getBoundingBox();
BlockPos blockPos = new BlockPos(box.minX + 0.001, box.minY + 0.001, box.minZ + 0.001);
BlockPos blockPos2 = new BlockPos(box.maxX - 0.001, box.maxY - 0.001, box.maxZ - 0.001);
BlockPos blockPos = new BlockPos(box.minX + OFFSET, box.minY + OFFSET, box.minZ + OFFSET);
BlockPos blockPos2 = new BlockPos(box.maxX - OFFSET, box.maxY - OFFSET, box.maxZ - OFFSET);
if (entity.world.isRegionLoaded(blockPos, blockPos2)) {
BlockPos.Mutable mutable = new BlockPos.Mutable();
for(int i = blockPos.getX(); i <= blockPos2.getX(); ++i) {
Expand All @@ -49,36 +50,39 @@ public static void checkEntityLandOnCollision(Entity entity) {

public static void checkFallCollision(Entity entity, float fallDistance) {
Box box = entity.getBoundingBox();
BlockPos blockPos = new BlockPos(box.minX + 0.001, box.minY + 0.001, box.minZ + 0.001);
BlockPos blockPos2 = new BlockPos(box.maxX - 0.001, box.maxY - 0.001, box.maxZ - 0.001);
BlockPos blockPos = new BlockPos(box.minX + OFFSET, box.minY + OFFSET, box.minZ + OFFSET);
BlockPos blockPos2 = new BlockPos(box.maxX - OFFSET, box.maxY - OFFSET, box.maxZ - OFFSET);
if (entity.world.isRegionLoaded(blockPos, blockPos2)) {
BlockPos.Mutable mutable = new BlockPos.Mutable();
boolean createdEvent = false;
for(int i = blockPos.getX(); i <= blockPos2.getX(); ++i) {
for(int k = blockPos.getZ(); k <= blockPos2.getZ(); ++k) {
mutable.set(i, blockPos.getY(), k);
BlockState blockState = entity.world.getBlockState(mutable);
blockState.getBlock().onLandedUpon(entity.world, blockState, mutable, entity, fallDistance);
if (!blockState.isAir() && !blockState.isIn(BlockTags.OCCLUDES_VIBRATION_SIGNALS))
BlockState state = entity.world.getBlockState(mutable);
state.getBlock().onLandedUpon(entity.world, state, mutable, entity, fallDistance);
if (!createdEvent && !state.isAir() && !state.isIn(BlockTags.OCCLUDES_VIBRATION_SIGNALS)) {
entity.emitGameEvent(GameEvent.HIT_GROUND);
createdEvent = true;
}
}
}
}
}

public static float checkJumpVelocityOnCollision(Box box, World world) {
BlockPos blockPos = new BlockPos(box.minX + 0.001, box.minY, box.minZ + 0.001);
BlockPos blockPos2 = new BlockPos(box.maxX - 0.001, box.maxY, box.maxZ - 0.001);
BlockPos blockPos = new BlockPos(box.minX + OFFSET, box.minY, box.minZ + OFFSET);
BlockPos blockPos2 = new BlockPos(box.maxX - OFFSET, box.maxY, box.maxZ - OFFSET);
if (world.isRegionLoaded(blockPos, blockPos2)) {
BlockPos.Mutable mutable = new BlockPos.Mutable();
float fastestBlock = 1.0F; //Highest value
float slowestBlock = 1.0F; //Smallest value
for(int i = blockPos.getX(); i <= blockPos2.getX(); ++i) {
for(int k = blockPos.getZ(); k <= blockPos2.getZ(); ++k) {
mutable.set(i, blockPos.getY(), k);
float topBlock = world.getBlockState(mutable).getBlock().getVelocityMultiplier();
float topBlock = world.getBlockState(mutable).getBlock().getJumpVelocityMultiplier();
if ((double)topBlock == 1.0D) {
mutable.set(i, box.minY-VELOCITY_AFFECTING_POS_Y_OFFSET, k);
float affectingBlock = world.getBlockState(mutable).getBlock().getVelocityMultiplier();
float affectingBlock = world.getBlockState(mutable).getBlock().getJumpVelocityMultiplier();
slowestBlock = Math.min(affectingBlock, slowestBlock);
fastestBlock = Math.max(affectingBlock, fastestBlock);
} else {
Expand All @@ -93,8 +97,8 @@ public static float checkJumpVelocityOnCollision(Box box, World world) {
}

public static float checkVelocityOnCollision(Box box, World world) {
BlockPos blockPos = new BlockPos(box.minX + 0.001, box.minY + 0.001, box.minZ + 0.001);
BlockPos blockPos2 = new BlockPos(box.maxX - 0.001, box.maxY - 0.001, box.maxZ - 0.001);
BlockPos blockPos = new BlockPos(box.minX + OFFSET, box.minY + OFFSET, box.minZ + OFFSET);
BlockPos blockPos2 = new BlockPos(box.maxX - OFFSET, box.maxY - OFFSET, box.maxZ - OFFSET);
if (world.isRegionLoaded(blockPos, blockPos2)) {
BlockPos.Mutable mutable = new BlockPos.Mutable();
float fastestBlock = 1.0F; //Highest value
Expand All @@ -103,11 +107,11 @@ public static float checkVelocityOnCollision(Box box, World world) {
for(int k = blockPos.getZ(); k <= blockPos2.getZ(); ++k) {
mutable.set(i, blockPos.getY(), k);
BlockState blockState = world.getBlockState(mutable);
float topBlock = blockState.getBlock().getJumpVelocityMultiplier();
float topBlock = blockState.getBlock().getVelocityMultiplier();
if ((double) topBlock == 1.0D &&
!blockState.isOf(Blocks.WATER) && !blockState.isOf(Blocks.BUBBLE_COLUMN)) {
mutable.set(i, box.minY - VELOCITY_AFFECTING_POS_Y_OFFSET, k);
float affectingBlock = world.getBlockState(mutable).getBlock().getJumpVelocityMultiplier();
float affectingBlock = world.getBlockState(mutable).getBlock().getVelocityMultiplier();
slowestBlock = Math.min(affectingBlock, slowestBlock);
fastestBlock = Math.max(affectingBlock, fastestBlock);
} else {
Expand Down

0 comments on commit fc39b0f

Please sign in to comment.