mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-09 04:09:54 +01:00
180 lines
8.9 KiB
Diff
180 lines
8.9 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: William Blake Galbreath <blake.galbreath@gmail.com>
|
||
|
Date: Sun, 23 Aug 2020 20:59:00 +0200
|
||
|
Subject: [PATCH] Climbing should not bypass cramming gamerule
|
||
|
|
||
|
|
||
|
diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||
|
index 5a451cc855de57f79a57670ba38e3af2343cb510..7d3207a9af8360ddad228281d6aa65e1a0d24157 100644
|
||
|
--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||
|
+++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
|
||
|
@@ -712,4 +712,9 @@ public class PaperWorldConfig {
|
||
|
wanderingTraderSpawnChanceMin = getInt("wandering-trader.spawn-chance-min", wanderingTraderSpawnChanceMin);
|
||
|
wanderingTraderSpawnChanceMax = getInt("wandering-trader.spawn-chance-max", wanderingTraderSpawnChanceMax);
|
||
|
}
|
||
|
+
|
||
|
+ public boolean fixClimbingBypassingCrammingRule = false;
|
||
|
+ private void fixClimbingBypassingCrammingRule() {
|
||
|
+ fixClimbingBypassingCrammingRule = getBoolean("fix-climbing-bypassing-cramming-rule", fixClimbingBypassingCrammingRule);
|
||
|
+ }
|
||
|
}
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
index 90e9797cc1f3a4aa0a2bee28dca364e6f6dd0c0b..ec98f5f59ca2b4cb58eb00ed8cdfa364f8bacd88 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
|
||
|
@@ -1573,6 +1573,12 @@ public abstract class Entity implements Nameable, CommandSource, net.minecraft.s
|
||
|
}
|
||
|
|
||
|
public boolean isPushable() {
|
||
|
+ // Paper start
|
||
|
+ return isCollidable(false);
|
||
|
+ }
|
||
|
+
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) {
|
||
|
+ // Paper end
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/EntitySelector.java b/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||
|
index 8ce62148ebaeac9988e7c9d4b2f7ee57f58d883e..8d1e24c2fa844971908ae7ac918a8950026b40a6 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/EntitySelector.java
|
||
|
@@ -51,11 +51,17 @@ public final class EntitySelector {
|
||
|
}
|
||
|
|
||
|
public static Predicate<Entity> pushableBy(Entity entity) {
|
||
|
+ // Paper start - ignoreClimbing param
|
||
|
+ return pushable(entity, false);
|
||
|
+ }
|
||
|
+
|
||
|
+ public static Predicate<Entity> pushable(Entity entity, boolean ignoreClimbing) {
|
||
|
+ // Paper end
|
||
|
Team scoreboardteambase = entity.getTeam();
|
||
|
Team.CollisionRule scoreboardteambase_enumteampush = scoreboardteambase == null ? Team.CollisionRule.ALWAYS : scoreboardteambase.getCollisionRule();
|
||
|
|
||
|
return (Predicate) (scoreboardteambase_enumteampush == Team.CollisionRule.NEVER ? Predicates.alwaysFalse() : EntitySelector.NO_SPECTATORS.and((entity1) -> {
|
||
|
- if (!entity1.canCollideWithCb(entity) || !entity.canCollideWithCb(entity1)) { // CraftBukkit - collidable API
|
||
|
+ if (!entity1.isCollidable(ignoreClimbing) || !entity1.canCollideWithCb(entity) || !entity.canCollideWithCb(entity1)) { // CraftBukkit - collidable API // Paper - isCollidable
|
||
|
return false;
|
||
|
} else if (entity.level.isClientSide && (!(entity1 instanceof Player) || !((Player) entity1).isLocalPlayer())) {
|
||
|
return false;
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
index 9724d4222311345a44aa101ec47523a1909fbe8f..57b933afdbb2136ed48170da6945eb2b92edb4db 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java
|
||
|
@@ -134,7 +134,6 @@ import org.bukkit.event.entity.EntityTeleportEvent;
|
||
|
import org.bukkit.event.player.PlayerItemConsumeEvent;
|
||
|
// CraftBukkit end
|
||
|
|
||
|
-import co.aikar.timings.MinecraftTimings; // Paper
|
||
|
|
||
|
public abstract class LivingEntity extends Entity {
|
||
|
|
||
|
@@ -2956,7 +2955,7 @@ public abstract class LivingEntity extends Entity {
|
||
|
return;
|
||
|
}
|
||
|
// Paper - end don't run getEntities if we're not going to use its result
|
||
|
- List<Entity> list = this.level.getEntities(this, this.getBoundingBox(), EntitySelector.pushableBy(this));
|
||
|
+ List<Entity> list = this.level.getEntities(this, this.getBoundingBox(), EntitySelector.pushable(this, level.paperConfig.fixClimbingBypassingCrammingRule)); // Paper - fix climbing bypassing cramming rule
|
||
|
|
||
|
if (!list.isEmpty()) {
|
||
|
// Paper - move up
|
||
|
@@ -3094,9 +3093,16 @@ public abstract class LivingEntity extends Entity {
|
||
|
return !this.removed && this.collides; // CraftBukkit
|
||
|
}
|
||
|
|
||
|
+ // Paper start
|
||
|
@Override
|
||
|
public boolean isPushable() {
|
||
|
- return this.isAlive() && !this.isSpectator() && !this.onClimbable() && this.collides; // CraftBukkit
|
||
|
+ return this.isCollidable(level.paperConfig.fixClimbingBypassingCrammingRule);
|
||
|
+ }
|
||
|
+
|
||
|
+ @Override
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) {
|
||
|
+ return this.isAlive() && !this.isSpectator() && (ignoreClimbing || !this.onClimbable()) && this.collides; // CraftBukkit
|
||
|
+ // Paper end
|
||
|
}
|
||
|
|
||
|
// CraftBukkit start - collidable API
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/ambient/Bat.java b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
||
|
index e56c575d744e1efe9a7512f337b781dc3715f6be..8e02e3a4464ab4096637fc69c03d083988bb426e 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/ambient/Bat.java
|
||
|
@@ -75,7 +75,7 @@ public class Bat extends AmbientCreature {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/animal/Parrot.java b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
|
||
|
index 918628c0ed8fb32d44c034fddf045f08659c10f8..d6a9d0e94d80f1924cedef913829d15762456537 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/animal/Parrot.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/animal/Parrot.java
|
||
|
@@ -368,8 +368,8 @@ public class Parrot extends ShoulderRidingEntity implements FlyingAnimal {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
- return super.isPushable(); // CraftBukkit - collidable API
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
+ return super.isCollidable(ignoreClimbing); // CraftBukkit - collidable API // Paper
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
|
||
|
index d9bfc754d7544a54ff214b41b4f6c0a6bc66df28..b298bcfb665b1036cd21445cec1518069eb08f06 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java
|
||
|
@@ -226,7 +226,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener,
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
return !this.isVehicle();
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
||
|
index 5714aa450ac09788bcf1c2790d4f1581c9a7c28b..a89573670f7dccfd8f0c81fcd95673b6faf3fc10 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/decoration/ArmorStand.java
|
||
|
@@ -358,7 +358,7 @@ public class ArmorStand extends LivingEntity {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||
|
index 1257a740a4ab79870fe89057782e8ffc6c658c14..9cbde70787d8044f0edeb3d459231dd7fbb79584 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java
|
||
|
@@ -144,7 +144,7 @@ public abstract class AbstractMinecart extends Entity {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java
|
||
|
index bddc51c656f04f25744ec29cabab31d465cf8bce..4f82c6797fe9bbb1a29420ea15277be50e44808c 100644
|
||
|
--- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java
|
||
|
+++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java
|
||
|
@@ -149,7 +149,7 @@ public class Boat extends Entity {
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
- public boolean isPushable() {
|
||
|
+ public boolean isCollidable(boolean ignoreClimbing) { // Paper
|
||
|
return true;
|
||
|
}
|
||
|
|