Protect Bedrock and End Portal/Frames from being destroyed

This fixes exploits that let players destroy bedrock by Pistons, explosions
and Mushrooom/Tree generation.

These blocks are designed to not be broken except by creative players/commands.
So protect them from a multitude of methods of destroying them.

A config is provided if you rather let players use these exploits, and let
them destroy the worlds End Portals and get on top of the nether easy.
This commit is contained in:
Aikar
2020-05-13 23:01:26 -04:00
parent 27979040fd
commit eb626e1176
6 changed files with 156 additions and 52 deletions

View File

@ -53,16 +53,17 @@
}
private ExplosionDamageCalculator makeDamageCalculator(@Nullable Entity entity) {
@@ -135,7 +150,7 @@
@@ -135,7 +150,8 @@
for (float f1 = 0.3F; f > 0.0F; f -= 0.22500001F) {
BlockPos blockposition = BlockPos.containing(d4, d5, d6);
BlockState iblockdata = this.level.getBlockState(blockposition);
- FluidState fluid = this.level.getFluidState(blockposition);
+ if (!iblockdata.isDestroyable()) continue; // Paper - Protect Bedrock and End Portal/Frames from being destroyed
+ FluidState fluid = iblockdata.getFluidState(); // Paper - Perf: Optimize call to getFluid for explosions
if (!this.level.isInWorldBounds(blockposition)) {
break;
@@ -149,6 +164,15 @@
@@ -149,6 +165,15 @@
if (f > 0.0F && this.damageCalculator.shouldBlockExplode(this, this.level, blockposition, iblockdata, f)) {
set.add(blockposition);
@ -78,7 +79,7 @@
}
d4 += d0 * 0.30000001192092896D;
@@ -171,7 +195,7 @@
@@ -171,7 +196,7 @@
int l = Mth.floor(this.center.y + (double) f + 1.0D);
int i1 = Mth.floor(this.center.z - (double) f - 1.0D);
int j1 = Mth.floor(this.center.z + (double) f + 1.0D);
@ -87,7 +88,7 @@
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
@@ -192,10 +216,38 @@
@@ -192,10 +217,38 @@
d3 /= d4;
boolean flag = this.damageCalculator.shouldDamageEntity(this, entity);
float f1 = this.damageCalculator.getKnockbackMultiplier(entity);
@ -128,7 +129,7 @@
}
double d5 = (1.0D - d0) * (double) f2 * (double) f1;
@@ -204,7 +256,7 @@
@@ -204,7 +257,7 @@
if (entity instanceof LivingEntity) {
LivingEntity entityliving = (LivingEntity) entity;
@ -137,7 +138,7 @@
} else {
d6 = d5;
}
@@ -214,11 +266,19 @@
@@ -214,11 +267,19 @@
d3 *= d6;
Vec3 vec3d = new Vec3(d1, d2, d3);
@ -158,7 +159,7 @@
this.hitPlayers.put(entityhuman, vec3d);
}
}
@@ -235,10 +295,62 @@
@@ -235,10 +296,62 @@
List<ServerExplosion.StackCollector> list1 = new ArrayList();
Util.shuffle(positions, this.level.random);
@ -221,7 +222,7 @@
this.level.getBlockState(blockposition).onExplosionHit(this.level, blockposition, this, (itemstack, blockposition1) -> {
ServerExplosion.addOrAppendStack(list1, itemstack, blockposition1);
@@ -262,13 +374,22 @@
@@ -262,13 +375,22 @@
BlockPos blockposition = (BlockPos) iterator.next();
if (this.level.random.nextInt(3) == 0 && this.level.getBlockState(blockposition).isAir() && this.level.getBlockState(blockposition.below()).isSolidRender()) {
@ -245,7 +246,7 @@
this.level.gameEvent(this.source, (Holder) GameEvent.EXPLODE, this.center);
List<BlockPos> list = this.calculateExplodedPositions();
@@ -288,6 +409,7 @@
@@ -288,6 +410,7 @@
}
private static void addOrAppendStack(List<ServerExplosion.StackCollector> droppedItemsOut, ItemStack item, BlockPos pos) {
@ -253,7 +254,7 @@
Iterator iterator = droppedItemsOut.iterator();
do {
@@ -372,4 +494,85 @@
@@ -372,4 +495,85 @@
}
}