9
0
mirror of https://github.com/Samsuik/Sakura.git synced 2025-12-19 14:59:30 +00:00

Fix pearling underneath a ceiling

This commit is contained in:
Samsuik
2025-09-28 15:59:09 +01:00
parent e2666accc4
commit d09338cb20
4 changed files with 46 additions and 11 deletions

1
.gitignore vendored
View File

@@ -3,6 +3,7 @@
.idea/
build/
run/
run
# macos
.DS_Store

View File

@@ -153,7 +153,7 @@ index e96d4dee14c05f2fa329bfb1588ec795d4e3d730..ba9393e474ae213316c693d73ef2641e
if (this.entity instanceof LivingEntity) {
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
index 706941df21621080b70cc7d8c84d1ec7b7ddc483..4b9a0327251a54d752409021cb7a10f890f1f131 100644
index f6d92a85190ccb5794fe49693d36263b556399ed..87192b70b9fb9e182853e1004e9a2a627a2c56e3 100644
--- a/net/minecraft/world/entity/Entity.java
+++ b/net/minecraft/world/entity/Entity.java
@@ -3638,7 +3638,7 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
@@ -196,10 +196,10 @@ index 2420999c5399333bed122ee0a1f252ac894adfcb..2e7f6e3941b34323768e43870541c8e4
public int getFuse() {
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
index 5cacbc07ee0f6ef2f47f7e0e8f6267d82ea94501..6160c684b712742b6ce565afb043c03badb705b2 100644
index 4a0c69b45f9805644f214fcc973a72e50d95f3ea..e896610d02cb0193cf74d6a1de571ccb601c8da9 100644
--- a/net/minecraft/world/entity/player/Player.java
+++ b/net/minecraft/world/entity/player/Player.java
@@ -701,7 +701,7 @@ public abstract class Player extends LivingEntity {
@@ -708,7 +708,7 @@ public abstract class Player extends LivingEntity {
public void increaseScore(int score) {
int score1 = this.getScore();

View File

@@ -8,17 +8,24 @@
// CraftBukkit start
public boolean fauxSleeping;
@@ -229,6 +_,18 @@
@@ -229,6 +_,25 @@
return (org.bukkit.craftbukkit.entity.CraftHumanEntity) super.getBukkitEntity();
}
// CraftBukkit end
+ // Sakura start - prevent players glitching through blocks
+ public final boolean isInsideAnyCollision() {
+ return this.insideAnyCollisionAt(this.level(), this.position());
+ return this.insideAnyCollisionAt(this.level(), this.position(), Pose.STANDING);
+ }
+
+ public final boolean insideAnyCollisionAt(final Level level, final Vec3 position) {
+ final EntityDimensions entityDimensions = this.getDimensions(Pose.STANDING);
+ final Pose pose = this.getVehicle() != null || !this.level().sakuraConfig().players.posesShrinkCollisionBox
+ ? Pose.STANDING
+ : Pose.SWIMMING;
+ return this.insideAnyCollisionAt(level, position, pose);
+ }
+
+ public final boolean insideAnyCollisionAt(final Level level, final Vec3 position, final Pose pose) {
+ final EntityDimensions entityDimensions = this.getDimensions(pose);
+ final AABB entityBB = entityDimensions.makeBoundingBox(position);
+ return !level.noCollision(this, entityBB.deflate(1.0e-7))
+ || !level.getWorldBorder().isWithinBounds(entityBB);
@@ -27,6 +34,15 @@
public Player(Level level, GameProfile gameProfile) {
super(EntityType.PLAYER, level);
@@ -471,7 +_,7 @@
this.yCloak += d1 * 0.25;
}
- protected void updatePlayerPose() {
+ public void updatePlayerPose() {
if (this.canPlayerFitWithinBlocksAndEntitiesWhen(Pose.SWIMMING)) {
Pose desiredPose = this.getDesiredPose();
Pose pose;
@@ -866,6 +_,10 @@
public boolean isInvulnerableTo(ServerLevel level, DamageSource damageSource) {
if (super.isInvulnerableTo(level, damageSource)) {

View File

@@ -1,21 +1,39 @@
--- a/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
+++ b/net/minecraft/world/entity/projectile/ThrownEnderpearl.java
@@ -118,6 +_,15 @@
@@ -118,6 +_,21 @@
if (owner != null && isAllowedToTeleportOwner(owner, serverLevel)) {
Vec3 vec3 = this.oldPosition();
if (owner instanceof ServerPlayer serverPlayer) {
+ // Sakura start - prevent ender pearls teleporting inside blocks
+ if (this.level().sakuraConfig().entity.enderPearl.preventTeleportingInsideBlocks && serverPlayer.insideAnyCollisionAt(serverLevel, vec3)) {
+ vec3 = Vec3.atBottomCenterOf(BlockPos.containing(vec3)); // teleportation position
+ if (serverPlayer.insideAnyCollisionAt(serverLevel, vec3)) {
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT);
+ return;
+ for (int offset = 0;; ++offset) {
+ vec3 = Vec3.atBottomCenterOf(BlockPos.containing(vec3.subtract(0, offset, 0))); // teleportation position
+ if (!serverPlayer.insideAnyCollisionAt(serverLevel, vec3)) {
+ break;
+ }
+
+ if (offset == 1) {
+ this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT);
+ return;
+ }
+ }
+ }
+ // Sakura end - prevent ender pearls teleporting inside blocks
if (serverPlayer.connection.isAcceptingMessages()) {
// CraftBukkit start
// Store pre teleportation position as the teleport has been moved up.
@@ -163,6 +_,11 @@
if (entity != null) {
entity.resetFallDistance();
}
+ // Sakura start - prevent ender pearls teleporting inside blocks
+ if (entity instanceof net.minecraft.world.entity.player.Player player) {
+ player.updatePlayerPose();
+ }
+ // Sakura end - prevent ender pearls teleporting inside blocks
this.playSound(serverLevel, vec3);
}
@@ -181,6 +_,13 @@
return entity.canUsePortal(true);
}