From a48c25d41d010935835041254ae91c1d684dd687 Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Fri, 2 Oct 2020 21:30:27 -0400 Subject: [PATCH 1/6] Implement Bedrock player collision Unlike fishing rod pulling behavior that is calculated serverside on Bedrock and clientside on Java, Bedrock player "pushing" is nonexistent on Bedrock. This code checks to see if a Geyser player should be moved, and if so applies motion to the player which sends movement packets back. This commit also cleans up the move relative code of villagers so they aren't always checking the chunk cache. --- .../org/geysermc/connector/entity/Entity.java | 42 +++++++++- .../connector/entity/PlayerEntity.java | 9 +++ .../living/merchant/VillagerEntity.java | 77 ++++++++++--------- 3 files changed, 87 insertions(+), 41 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 5e825e89260..2a4919168b2 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -177,6 +177,10 @@ public void moveRelative(GeyserSession session, double relX, double relY, double moveEntityPacket.setTeleported(false); session.sendUpstreamPacket(moveEntityPacket); + + if (relX != 0 || relY != 0 || relZ != 0) { + checkPlayerCollision(session); + } } public void moveAbsolute(GeyserSession session, Vector3f position, float yaw, float pitch, boolean isOnGround, boolean teleported) { @@ -184,6 +188,7 @@ public void moveAbsolute(GeyserSession session, Vector3f position, float yaw, fl } public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rotation, boolean isOnGround, boolean teleported) { + boolean positionChanged = !position.equals(this.position); setPosition(position); setRotation(rotation); setOnGround(isOnGround); @@ -196,10 +201,14 @@ public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rota moveEntityPacket.setTeleported(teleported); session.sendUpstreamPacket(moveEntityPacket); + + if (positionChanged) { + checkPlayerCollision(session); + } } /** - * Teleports an entity to a new location. Used in JavaEntityTeleportTranslator. + * Teleports an entity to a new location. Used in {@link org.geysermc.connector.network.translators.java.entity.JavaEntityTeleportTranslator}. * @param session GeyserSession. * @param position The new position of the entity. * @param yaw The new yaw of the entity. @@ -211,7 +220,7 @@ public void teleport(GeyserSession session, Vector3f position, float yaw, float } /** - * Updates an entity's head position. Used in JavaEntityHeadLookTranslator. + * Updates an entity's head position. Used in {@link org.geysermc.connector.network.translators.java.entity.JavaEntityHeadLookTranslator}. * @param session GeyserSession. * @param headYaw The new head rotation of the entity. */ @@ -220,7 +229,7 @@ public void updateHeadLookRotation(GeyserSession session, float headYaw) { } /** - * Updates an entity's position and rotation. Used in JavaEntityPositionRotationTranslator. + * Updates an entity's position and rotation. Used in {@link org.geysermc.connector.network.translators.java.entity.JavaEntityPositionRotationTranslator}. * @param session GeyserSession * @param moveX The new X offset of the current position. * @param moveY The new Y offset of the current position. @@ -234,7 +243,7 @@ public void updatePositionAndRotation(GeyserSession session, double moveX, doubl } /** - * Updates an entity's rotation. Used in JavaEntityRotationTranslator. + * Updates an entity's rotation. Used in {@link org.geysermc.connector.network.translators.java.entity.JavaEntityRotationTranslator}. * @param session GeyserSession. * @param yaw The new yaw of the entity. * @param pitch The new pitch of the entity. @@ -244,6 +253,31 @@ public void updateRotation(GeyserSession session, float yaw, float pitch, boolea updatePositionAndRotation(session, 0, 0, 0, yaw, pitch, isOnGround); } + /** + * Unlike fishing rod pulling behavior that is calculated serverside on Bedrock and clientside on Java, + * Bedrock player "pushing" is nonexistent on Bedrock. + *
+ * This code checks to see if a Geyser player should be moved, and if so applies motion to the player + * which sends movement packets back. + *
+ * This should be called any time an entity moves position. + * @param session the session of the Bedrock player + */ + public void checkPlayerCollision(GeyserSession session) { + double distanceX = session.getPlayerEntity().getPosition().getX() - this.position.getX(); + double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); + double largestDistance = Math.max(Math.abs(distanceX), Math.abs(distanceZ)); + if (largestDistance <= 0.65) { + double velocityX = (distanceX / 20) / Math.sqrt(largestDistance); + double velocityZ = (distanceZ / 20) / Math.sqrt(largestDistance); + + SetEntityMotionPacket packet = new SetEntityMotionPacket(); + packet.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); + packet.setMotion(Vector3f.from(velocityX, 0, velocityZ)); + session.sendUpstreamPacket(packet); + } + } + public void updateBedrockAttributes(GeyserSession session) { if (!valid) return; diff --git a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java index 390110d1849..e48ff6a61e0 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java @@ -130,6 +130,7 @@ public void sendPlayer(GeyserSession session) { @Override public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rotation, boolean isOnGround, boolean teleported) { + boolean positionChanged = !position.add(0, entityType.getOffset(), 0).equals(this.position); setPosition(position); setRotation(rotation); @@ -153,6 +154,10 @@ public void moveAbsolute(GeyserSession session, Vector3f position, Vector3f rota if (rightParrot != null) { rightParrot.moveAbsolute(session, position, rotation, true, teleported); } + + if (session.getPlayerEntity() != this && positionChanged) { + checkPlayerCollision(session); + } } @Override @@ -175,6 +180,10 @@ public void moveRelative(GeyserSession session, double relX, double relY, double if (rightParrot != null) { rightParrot.moveRelative(session, relX, relY, relZ, rotation, true); } + + if (session.getPlayerEntity() != this && (relX != 0 || relY != 0 || relZ != 0)) { + checkPlayerCollision(session); + } } @Override diff --git a/connector/src/main/java/org/geysermc/connector/entity/living/merchant/VillagerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/living/merchant/VillagerEntity.java index 7ada302c2d2..a9b79112545 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/living/merchant/VillagerEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/living/merchant/VillagerEntity.java @@ -26,19 +26,18 @@ package org.geysermc.connector.entity.living.merchant; import com.github.steveice10.mc.protocol.data.game.entity.metadata.EntityMetadata; -import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position; +import com.github.steveice10.mc.protocol.data.game.entity.metadata.VillagerData; import com.nukkitx.math.vector.Vector3f; import com.nukkitx.protocol.bedrock.data.entity.EntityData; import com.nukkitx.protocol.bedrock.data.entity.EntityFlag; -import com.nukkitx.protocol.bedrock.data.entity.EntityFlags; -import com.nukkitx.protocol.bedrock.packet.*; +import com.nukkitx.protocol.bedrock.packet.MoveEntityAbsolutePacket; import it.unimi.dsi.fastutil.ints.Int2IntMap; import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; import org.geysermc.connector.entity.type.EntityType; import org.geysermc.connector.network.session.GeyserSession; -import org.geysermc.connector.network.translators.world.WorldManager; import org.geysermc.connector.network.translators.world.block.BlockTranslator; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -95,12 +94,17 @@ public void updateBedrockMetadata(EntityMetadata entityMetadata, GeyserSession s @Override public void moveRelative(GeyserSession session, double relX, double relY, double relZ, Vector3f rotation, boolean isOnGround) { + if (!metadata.getFlags().getFlag(EntityFlag.SLEEPING)) { + // No need to worry about extra processing to compensate for sleeping + super.moveRelative(session, relX, relY, relZ, rotation, isOnGround); + return; + } int z = 0; int bedId = 0; float bedPositionSubtractorW = 0; float bedPositionSubtractorN = 0; if (session.getConnector().getConfig().isCacheChunks()) { - Position bedLocation = new Position((int) position.getFloorX(), (int) position.getFloorY(), (int) position.getFloorZ()); + Position bedLocation = new Position(position.getFloorX(), position.getFloorY(), position.getFloorZ()); bedId = session.getConnector().getWorldManager().getBlockAt(session, bedLocation); } String bedRotationZ = BlockTranslator.getJavaIdBlockMap().inverse().get(bedId); @@ -110,42 +114,41 @@ public void moveRelative(GeyserSession session, double relX, double relY, double MoveEntityAbsolutePacket moveEntityPacket = new MoveEntityAbsolutePacket(); moveEntityPacket.setRuntimeEntityId(geyserId); - //Sets Villager position and rotation when sleeping - if (!metadata.getFlags().getFlag(EntityFlag.SLEEPING)) { - moveEntityPacket.setPosition(position); - moveEntityPacket.setRotation(getBedrockRotation()); - } else { - //String Setup - Pattern r = Pattern.compile("facing=([a-z]+)"); - Matcher m = r.matcher(bedRotationZ); - if (m.find()) { - switch (m.group(0)){ - case "facing=south": - //bed is facing south - z = 180; - bedPositionSubtractorW = -.5f; - break; - case "facing=east": - //bed is facing east - z = 90; - bedPositionSubtractorW = -.5f; - break; - case "facing=west": - //bed is facing west - z = 270; - bedPositionSubtractorW = .5f; - break; - case "facing=north": - //rotation does not change because north is 0 - bedPositionSubtractorN = .5f; - break; - } + // Sets Villager position and rotation when sleeping + // String Setup + Pattern r = Pattern.compile("facing=([a-z]+)"); + Matcher m = r.matcher(bedRotationZ); + if (m.find()) { + switch (m.group(0)) { + case "facing=south": + //bed is facing south + z = 180; + bedPositionSubtractorW = -.5f; + break; + case "facing=east": + //bed is facing east + z = 90; + bedPositionSubtractorW = -.5f; + break; + case "facing=west": + //bed is facing west + z = 270; + bedPositionSubtractorW = .5f; + break; + case "facing=north": + //rotation does not change because north is 0 + bedPositionSubtractorN = .5f; + break; } - moveEntityPacket.setRotation(Vector3f.from(0, 0, z)); - moveEntityPacket.setPosition(Vector3f.from(position.getX() + bedPositionSubtractorW, position.getY(), position.getZ() + bedPositionSubtractorN)); } + moveEntityPacket.setRotation(Vector3f.from(0, 0, z)); + moveEntityPacket.setPosition(Vector3f.from(position.getX() + bedPositionSubtractorW, position.getY(), position.getZ() + bedPositionSubtractorN)); moveEntityPacket.setOnGround(isOnGround); moveEntityPacket.setTeleported(false); session.sendUpstreamPacket(moveEntityPacket); + + if (relX != 0 || relY != 0 || relZ != 0) { + checkPlayerCollision(session); + } } } From 71b402374550a9c3b2fff72239a920b324a18b32 Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Fri, 2 Oct 2020 22:09:59 -0400 Subject: [PATCH 2/6] Decrease usage of Math.sqrt --- .../src/main/java/org/geysermc/connector/entity/Entity.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 2a4919168b2..faee0423482 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -268,8 +268,9 @@ public void checkPlayerCollision(GeyserSession session) { double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); double largestDistance = Math.max(Math.abs(distanceX), Math.abs(distanceZ)); if (largestDistance <= 0.65) { - double velocityX = (distanceX / 20) / Math.sqrt(largestDistance); - double velocityZ = (distanceZ / 20) / Math.sqrt(largestDistance); + double largestDistanceSquareRoot = Math.sqrt(largestDistance); + double velocityX = (distanceX / 20) / largestDistanceSquareRoot; + double velocityZ = (distanceZ / 20) / largestDistanceSquareRoot; SetEntityMotionPacket packet = new SetEntityMotionPacket(); packet.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); From 117786e8dbe643084cb50a5ff96297740fb796e0 Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Sat, 3 Oct 2020 16:06:46 -0400 Subject: [PATCH 3/6] Don't collide if the team status says so --- .../org/geysermc/connector/entity/Entity.java | 12 +++++++++++- .../geysermc/connector/entity/PlayerEntity.java | 16 ++++++++++++++++ .../java/scoreboard/JavaTeamTranslator.java | 2 ++ .../org/geysermc/connector/scoreboard/Team.java | 2 ++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index faee0423482..06bc1cf910d 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -267,7 +267,7 @@ public void checkPlayerCollision(GeyserSession session) { double distanceX = session.getPlayerEntity().getPosition().getX() - this.position.getX(); double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); double largestDistance = Math.max(Math.abs(distanceX), Math.abs(distanceZ)); - if (largestDistance <= 0.65) { + if (largestDistance <= 0.65 && canCollideWithPlayer(session)) { double largestDistanceSquareRoot = Math.sqrt(largestDistance); double velocityX = (distanceX / 20) / largestDistanceSquareRoot; double velocityZ = (distanceZ / 20) / largestDistanceSquareRoot; @@ -279,6 +279,16 @@ public void checkPlayerCollision(GeyserSession session) { } } + /** + * Ensure that collision is possible if this entity is a player. Should be overridden for players as their team + * might change the status of this. + * @param session the Bedrock client session + * @return if this entity can collide with the session's player + */ + public boolean canCollideWithPlayer(GeyserSession session) { + return true; + } + public void updateBedrockAttributes(GeyserSession session) { if (!valid) return; diff --git a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java index e48ff6a61e0..b3ced263438 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java @@ -227,6 +227,22 @@ public void updateRotation(GeyserSession session, float yaw, float pitch, boolea } } + @Override + public boolean canCollideWithPlayer(GeyserSession session) { + Team team = session.getWorldCache().getScoreboard().getTeamFor(username); + if (team == null) return true; + switch (team.getCollisionRule()) { + case NEVER: + return false; + case PUSH_OWN_TEAM: + return team.getEntities().contains(session.getPlayerEntity().getUsername()); + case PUSH_OTHER_TEAMS: + return !team.getEntities().contains(session.getPlayerEntity().getUsername()); + default: + return true; + } + } + @Override public void setPosition(Vector3f position) { this.position = position.add(0, entityType.getOffset(), 0); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/scoreboard/JavaTeamTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/scoreboard/JavaTeamTranslator.java index 998e5effe9c..5b0d3fcc7ee 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/scoreboard/JavaTeamTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/scoreboard/JavaTeamTranslator.java @@ -60,6 +60,7 @@ public void translate(ServerTeamPacket packet, GeyserSession session) { case CREATE: scoreboard.registerNewTeam(packet.getTeamName(), toPlayerSet(packet.getPlayers())) .setName(MessageUtils.getBedrockMessage(packet.getDisplayName())) + .setCollisionRule(packet.getCollisionRule()) .setColor(packet.getColor()) .setNameTagVisibility(packet.getNameTagVisibility()) .setPrefix(MessageUtils.getTranslatedBedrockMessage(packet.getPrefix(), session.getClientData().getLanguageCode())) @@ -75,6 +76,7 @@ public void translate(ServerTeamPacket packet, GeyserSession session) { } team.setName(MessageUtils.getBedrockMessage(packet.getDisplayName())) + .setCollisionRule(packet.getCollisionRule()) .setColor(packet.getColor()) .setNameTagVisibility(packet.getNameTagVisibility()) .setPrefix(MessageUtils.getTranslatedBedrockMessage(packet.getPrefix(), session.getClientData().getLanguageCode())) diff --git a/connector/src/main/java/org/geysermc/connector/scoreboard/Team.java b/connector/src/main/java/org/geysermc/connector/scoreboard/Team.java index a073e2e99c7..e529877a562 100644 --- a/connector/src/main/java/org/geysermc/connector/scoreboard/Team.java +++ b/connector/src/main/java/org/geysermc/connector/scoreboard/Team.java @@ -25,6 +25,7 @@ package org.geysermc.connector.scoreboard; +import com.github.steveice10.mc.protocol.data.game.scoreboard.CollisionRule; import com.github.steveice10.mc.protocol.data.game.scoreboard.NameTagVisibility; import com.github.steveice10.mc.protocol.data.game.scoreboard.TeamColor; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; @@ -45,6 +46,7 @@ public class Team { private UpdateType updateType = UpdateType.ADD; private String name; + private CollisionRule collisionRule; private NameTagVisibility nameTagVisibility; private String prefix; private TeamColor color; From 8adaa806b6229eb615c2bc72046909f0fb71e017 Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Mon, 5 Oct 2020 13:37:47 -0400 Subject: [PATCH 4/6] Account for Y coordinate in collision --- .../org/geysermc/connector/entity/Entity.java | 43 +++++++++++++------ .../connector/entity/PlayerEntity.java | 12 +++++- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 06bc1cf910d..83b5a09bba6 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -263,19 +263,21 @@ public void updateRotation(GeyserSession session, float yaw, float pitch, boolea * This should be called any time an entity moves position. * @param session the session of the Bedrock player */ - public void checkPlayerCollision(GeyserSession session) { - double distanceX = session.getPlayerEntity().getPosition().getX() - this.position.getX(); - double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); - double largestDistance = Math.max(Math.abs(distanceX), Math.abs(distanceZ)); - if (largestDistance <= 0.65 && canCollideWithPlayer(session)) { - double largestDistanceSquareRoot = Math.sqrt(largestDistance); - double velocityX = (distanceX / 20) / largestDistanceSquareRoot; - double velocityZ = (distanceZ / 20) / largestDistanceSquareRoot; - - SetEntityMotionPacket packet = new SetEntityMotionPacket(); - packet.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); - packet.setMotion(Vector3f.from(velocityX, 0, velocityZ)); - session.sendUpstreamPacket(packet); + protected void checkPlayerCollision(GeyserSession session) { + if (doesYCoordinateIntersect(session)) { + double distanceX = session.getPlayerEntity().getPosition().getX() - this.position.getX(); + double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); + double largestDistance = Math.max(Math.abs(distanceX), Math.abs(distanceZ)); + if (largestDistance <= 0.65 && canCollideWithPlayer(session)) { + double largestDistanceSquareRoot = Math.sqrt(largestDistance); + double velocityX = (distanceX / 20) / largestDistanceSquareRoot; + double velocityZ = (distanceZ / 20) / largestDistanceSquareRoot; + + SetEntityMotionPacket packet = new SetEntityMotionPacket(); + packet.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); + packet.setMotion(Vector3f.from(velocityX, 0, velocityZ)); + session.sendUpstreamPacket(packet); + } } } @@ -285,10 +287,23 @@ public void checkPlayerCollision(GeyserSession session) { * @param session the Bedrock client session * @return if this entity can collide with the session's player */ - public boolean canCollideWithPlayer(GeyserSession session) { + protected boolean canCollideWithPlayer(GeyserSession session) { return true; } + /** + * @param session the Bedrock client session + * @return true if the Y level of this entity intersect with player entity + */ + protected boolean doesYCoordinateIntersect(GeyserSession session) { + float playerYMin = session.getPlayerEntity().getPosition().getY() - session.getPlayerEntity().getEntityType().getOffset(); + float playerYMax = playerYMin + session.getPlayerEntity().getEntityType().getHeight(); + float entityYMax = this.position.getY() + this.entityType.getHeight(); + float entityYMin = this.position.getY(); + if (entityYMin > playerYMax) return false; // Entity is higher than the player + return !(playerYMin > entityYMax); // Player is higher than the entity + } + public void updateBedrockAttributes(GeyserSession session) { if (!valid) return; diff --git a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java index b3ced263438..ec6d31de939 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/PlayerEntity.java @@ -228,7 +228,7 @@ public void updateRotation(GeyserSession session, float yaw, float pitch, boolea } @Override - public boolean canCollideWithPlayer(GeyserSession session) { + protected boolean canCollideWithPlayer(GeyserSession session) { Team team = session.getWorldCache().getScoreboard().getTeamFor(username); if (team == null) return true; switch (team.getCollisionRule()) { @@ -243,6 +243,16 @@ public boolean canCollideWithPlayer(GeyserSession session) { } } + @Override + protected boolean doesYCoordinateIntersect(GeyserSession session) { + float playerYMin = session.getPlayerEntity().getPosition().getY() - session.getPlayerEntity().getEntityType().getOffset(); + float playerYMax = playerYMin + session.getPlayerEntity().getEntityType().getHeight(); + float thisYMin = this.position.getY() - this.entityType.getOffset(); + float thisYMax = thisYMin + this.entityType.getHeight(); + if (thisYMin > playerYMax) return false; // Entity is higher than the player + return !(playerYMin > thisYMax); // Player is higher than the entity + } + @Override public void setPosition(Vector3f position) { this.position = position.add(0, entityType.getOffset(), 0); From 5bc249c1ef32ca31f4cc6fa643b0a44232a070e9 Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Mon, 5 Oct 2020 13:42:13 -0400 Subject: [PATCH 5/6] Don't do collision if riding the entity --- .../src/main/java/org/geysermc/connector/entity/Entity.java | 1 + 1 file changed, 1 insertion(+) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 83b5a09bba6..87a6fc01c32 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -264,6 +264,7 @@ public void updateRotation(GeyserSession session, float yaw, float pitch, boolea * @param session the session of the Bedrock player */ protected void checkPlayerCollision(GeyserSession session) { + if (session.getRidingVehicleEntity() == this) return; if (doesYCoordinateIntersect(session)) { double distanceX = session.getPlayerEntity().getPosition().getX() - this.position.getX(); double distanceZ = session.getPlayerEntity().getPosition().getZ() - this.position.getZ(); From b3f475c8ae087c01a01512aed8b59881ba82d47a Mon Sep 17 00:00:00 2001 From: DoctorMacc Date: Mon, 5 Oct 2020 13:45:22 -0400 Subject: [PATCH 6/6] typo --- .../src/main/java/org/geysermc/connector/entity/Entity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/connector/src/main/java/org/geysermc/connector/entity/Entity.java b/connector/src/main/java/org/geysermc/connector/entity/Entity.java index 87a6fc01c32..f638b5555a6 100644 --- a/connector/src/main/java/org/geysermc/connector/entity/Entity.java +++ b/connector/src/main/java/org/geysermc/connector/entity/Entity.java @@ -294,7 +294,7 @@ protected boolean canCollideWithPlayer(GeyserSession session) { /** * @param session the Bedrock client session - * @return true if the Y level of this entity intersect with player entity + * @return true if the Y level of this entity intersects with player entity */ protected boolean doesYCoordinateIntersect(GeyserSession session) { float playerYMin = session.getPlayerEntity().getPosition().getY() - session.getPlayerEntity().getEntityType().getOffset();