From 86eab590182e399d0653e7ad832dec96c8e9c02a Mon Sep 17 00:00:00 2001
From: kickash32 <kickash32@gmail.com>
Date: Sat, 27 Jun 2020 12:44:50 -0400
Subject: [PATCH 1/5] someone left this in?

---
 scripts/importmcdev.sh | 1 -
 1 file changed, 1 deletion(-)

diff --git a/scripts/importmcdev.sh b/scripts/importmcdev.sh
index 06ad7ab9b9..269f68bcd4 100755
--- a/scripts/importmcdev.sh
+++ b/scripts/importmcdev.sh
@@ -94,7 +94,6 @@ done
 
 # import FileName
 
-import VoxelShapeSpliterator
 
 ########################################################
 ########################################################

From c438e9cf0e91dbd62569b7eeec92bc9f6669aca0 Mon Sep 17 00:00:00 2001
From: kickash32 <kickash32@gmail.com>
Date: Sat, 27 Jun 2020 14:35:52 -0400
Subject: [PATCH 2/5] port 4 patches

---
 .../Add-permission-for-command-blocks.patch   |  79 +++++++++++
 ...sure-Entity-AABB-s-are-never-invalid.patch | 129 ++++++++++++++++++
 ...mit-lightning-strike-effect-distance.patch |  93 +++++++++++++
 ...WorldBorder-collision-checks-and-air.patch |  63 +++++++++
 4 files changed, 364 insertions(+)
 create mode 100644 Spigot-Server-Patches/Add-permission-for-command-blocks.patch
 create mode 100644 Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
 create mode 100644 Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
 create mode 100644 Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch

diff --git a/Spigot-Server-Patches/Add-permission-for-command-blocks.patch b/Spigot-Server-Patches/Add-permission-for-command-blocks.patch
new file mode 100644
index 0000000000..950a10be1b
--- /dev/null
+++ b/Spigot-Server-Patches/Add-permission-for-command-blocks.patch
@@ -0,0 +1,79 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kickash32 <kickash32@gmail.com>
+Date: Sat, 27 Jun 2020 13:15:53 -0400
+Subject: [PATCH] Add permission for command blocks
+
+
+diff --git a/src/main/java/net/minecraft/server/BlockCommand.java b/src/main/java/net/minecraft/server/BlockCommand.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/BlockCommand.java
++++ b/src/main/java/net/minecraft/server/BlockCommand.java
+@@ -0,0 +0,0 @@ public class BlockCommand extends BlockTileEntity {
+     public EnumInteractionResult interact(IBlockData iblockdata, World world, BlockPosition blockposition, EntityHuman entityhuman, EnumHand enumhand, MovingObjectPositionBlock movingobjectpositionblock) {
+         TileEntity tileentity = world.getTileEntity(blockposition);
+ 
+-        if (tileentity instanceof TileEntityCommand && entityhuman.isCreativeAndOp()) {
++        if (tileentity instanceof TileEntityCommand && (entityhuman.isCreativeAndOp() || (entityhuman.isCreative() && entityhuman.getBukkitEntity().hasPermission("minecraft.commandblock")))) { // Paper - command block permission
+             entityhuman.a((TileEntityCommand) tileentity);
+             return EnumInteractionResult.a(world.isClientSide);
+         } else {
+diff --git a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
++++ b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java
+@@ -0,0 +0,0 @@ public abstract class CommandBlockListenerAbstract implements ICommandListener {
+     }
+ 
+     public EnumInteractionResult a(EntityHuman entityhuman) {
+-        if (!entityhuman.isCreativeAndOp()) {
++        if (!entityhuman.isCreativeAndOp() && !entityhuman.isCreative() && !entityhuman.getBukkitEntity().hasPermission("minecraft.commandblock")) { // Paper - command block permission
+             return EnumInteractionResult.PASS;
+         } else {
+             if (entityhuman.getWorld().isClientSide) {
+diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/PlayerConnection.java
++++ b/src/main/java/net/minecraft/server/PlayerConnection.java
+@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn {
+         PlayerConnectionUtils.ensureMainThread(packetplayinsetcommandblock, this, this.player.getWorldServer());
+         if (!this.minecraftServer.getEnableCommandBlock()) {
+             this.player.sendMessage(new ChatMessage("advMode.notEnabled"), SystemUtils.b);
+-        } else if (!this.player.isCreativeAndOp()) {
++        } else if (!this.player.isCreativeAndOp() && !this.player.isCreative() && !this.player.getBukkitEntity().hasPermission("minecraft.commandblock")) { // Paper - command block permission
+             this.player.sendMessage(new ChatMessage("advMode.notAllowed"), SystemUtils.b);
+         } else {
+             CommandBlockListenerAbstract commandblocklistenerabstract = null;
+@@ -0,0 +0,0 @@ public class PlayerConnection implements PacketListenerPlayIn {
+         PlayerConnectionUtils.ensureMainThread(packetplayinsetcommandminecart, this, this.player.getWorldServer());
+         if (!this.minecraftServer.getEnableCommandBlock()) {
+             this.player.sendMessage(new ChatMessage("advMode.notEnabled"), SystemUtils.b);
+-        } else if (!this.player.isCreativeAndOp()) {
++        } else if (!this.player.isCreativeAndOp() && !this.player.isCreative() && !this.player.getBukkitEntity().hasPermission("minecraft.commandblock")) { // Paper - command block permission
+             this.player.sendMessage(new ChatMessage("advMode.notAllowed"), SystemUtils.b);
+         } else {
+             CommandBlockListenerAbstract commandblocklistenerabstract = packetplayinsetcommandminecart.a(this.player.world);
+diff --git a/src/main/java/net/minecraft/server/PlayerInteractManager.java b/src/main/java/net/minecraft/server/PlayerInteractManager.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/PlayerInteractManager.java
++++ b/src/main/java/net/minecraft/server/PlayerInteractManager.java
+@@ -0,0 +0,0 @@ public class PlayerInteractManager {
+             TileEntity tileentity = this.world.getTileEntity(blockposition);
+             Block block = iblockdata.getBlock();
+ 
+-            if ((block instanceof BlockCommand || block instanceof BlockStructure || block instanceof BlockJigsaw) && !this.player.isCreativeAndOp()) {
++            if ((block instanceof BlockCommand || block instanceof BlockStructure || block instanceof BlockJigsaw) && !this.player.isCreativeAndOp() && !(block instanceof BlockCommand && (this.player.isCreative() && this.player.getBukkitEntity().hasPermission("minecraft.commandblock")))) { // Paper - command block permission
+                 this.world.notify(blockposition, iblockdata, iblockdata, 3);
+                 return false;
+             } else if (this.player.a((World) this.world, blockposition, this.gamemode)) {
+diff --git a/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java b/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
++++ b/src/main/java/org/bukkit/craftbukkit/util/permissions/CraftDefaultPermissions.java
+@@ -0,0 +0,0 @@ public final class CraftDefaultPermissions {
+         DefaultPermissions.registerPermission(ROOT + ".nbt.copy", "Gives the user the ability to copy NBT in creative", org.bukkit.permissions.PermissionDefault.TRUE, parent);
+         DefaultPermissions.registerPermission(ROOT + ".debugstick", "Gives the user the ability to use the debug stick in creative", org.bukkit.permissions.PermissionDefault.OP, parent);
+         DefaultPermissions.registerPermission(ROOT + ".debugstick.always", "Gives the user the ability to use the debug stick in all game modes", org.bukkit.permissions.PermissionDefault.FALSE, parent);
++        DefaultPermissions.registerPermission(ROOT + ".commandblock", "Gives the user the ability to use command blocks.", org.bukkit.permissions.PermissionDefault.OP, parent); // Paper
+         // Spigot end
+         parent.recalculatePermissibles();
+     }
diff --git a/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch b/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
new file mode 100644
index 0000000000..c791b1fbe6
--- /dev/null
+++ b/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
@@ -0,0 +1,129 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kickash32 <kickash32@gmail.com>
+Date: Sat, 27 Jun 2020 13:32:39 -0400
+Subject: [PATCH] Ensure Entity AABB's are never invalid
+
+
+diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/Entity.java
++++ b/src/main/java/net/minecraft/server/Entity.java
+@@ -0,0 +0,0 @@
+ package net.minecraft.server;
+ 
++import co.aikar.timings.MinecraftTimings;
++import co.aikar.timings.Timing;
+ import com.google.common.collect.Iterables;
+ import com.google.common.collect.Lists;
+ import com.google.common.collect.Sets;
+ import it.unimi.dsi.fastutil.objects.Object2DoubleArrayMap;
+ import it.unimi.dsi.fastutil.objects.Object2DoubleMap;
+-import java.util.Arrays;
+-import java.util.Collection;
+-import java.util.Collections;
+-import java.util.Iterator;
+-import java.util.List;
+-import java.util.Locale;
+-import java.util.Optional;
+-import java.util.Random;
+-import java.util.Set;
+-import java.util.UUID;
+-import java.util.concurrent.atomic.AtomicInteger;
+-import java.util.stream.Stream;
+-import javax.annotation.Nullable;
+ import org.apache.logging.log4j.LogManager;
+ import org.apache.logging.log4j.Logger;
+-
+-// CraftBukkit start
+ import org.bukkit.Bukkit;
+ import org.bukkit.Server;
+ import org.bukkit.block.BlockFace;
+ import org.bukkit.command.CommandSender;
+-import org.bukkit.entity.Hanging;
+-import org.bukkit.entity.LivingEntity;
+-import org.bukkit.entity.Vehicle;
+-import co.aikar.timings.MinecraftTimings; // Paper
+-import co.aikar.timings.Timing; // Paper
+-import org.bukkit.event.entity.EntityCombustByEntityEvent;
+-import org.bukkit.event.hanging.HangingBreakByEntityEvent;
+-import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
+-import org.bukkit.event.vehicle.VehicleEnterEvent;
+-import org.bukkit.event.vehicle.VehicleExitEvent;
+ import org.bukkit.craftbukkit.CraftWorld;
+ import org.bukkit.craftbukkit.entity.CraftEntity;
+ import org.bukkit.craftbukkit.entity.CraftPlayer;
+ import org.bukkit.craftbukkit.event.CraftEventFactory;
++import org.bukkit.entity.Hanging;
++import org.bukkit.entity.LivingEntity;
+ import org.bukkit.entity.Pose;
++import org.bukkit.entity.Vehicle;
+ import org.bukkit.event.entity.EntityAirChangeEvent;
++import org.bukkit.event.entity.EntityCombustByEntityEvent;
+ import org.bukkit.event.entity.EntityCombustEvent;
+ import org.bukkit.event.entity.EntityDropItemEvent;
+ import org.bukkit.event.entity.EntityPortalEvent;
+ import org.bukkit.event.entity.EntityPoseChangeEvent;
++import org.bukkit.event.hanging.HangingBreakByEntityEvent;
+ import org.bukkit.event.player.PlayerTeleportEvent;
++import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
++import org.bukkit.event.vehicle.VehicleEnterEvent;
++import org.bukkit.event.vehicle.VehicleExitEvent;
+ import org.bukkit.plugin.PluginManager;
++
++import javax.annotation.Nullable;
++import java.util.Arrays;
++import java.util.Collection;
++import java.util.Collections;
++import java.util.Iterator;
++import java.util.List;
++import java.util.Locale;
++import java.util.Optional;
++import java.util.Random;
++import java.util.Set;
++import java.util.UUID;
++import java.util.concurrent.atomic.AtomicInteger;
++import java.util.stream.Stream;
++
++// CraftBukkit start
+ // CraftBukkit end
+ 
+ public abstract class Entity implements INamableTileEntity, ICommandListener, KeyedObject { // Paper
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+ 
+     public void setPosition(double d0, double d1, double d2) {
+         this.setPositionRaw(d0, d1, d2);
+-        float f = this.size.width / 2.0F;
+-        float f1 = this.size.height;
++        // Paper start - move into setPositionRaw
++        //float f = this.size.width / 2.0F;
++        //float f1 = this.size.height;
+ 
+-        this.a(new AxisAlignedBB(d0 - (double) f, d1, d2 - (double) f, d0 + (double) f, d1 + (double) f1, d2 + (double) f));
++        //this.a(new AxisAlignedBB(d0 - (double) f, d1, d2 - (double) f, d0 + (double) f, d1 + (double) f1, d2 + (double) f));
++        // Paper end
+         if (valid) ((WorldServer) world).chunkCheck(this); // CraftBukkit
+     }
+ 
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+         return new AxisAlignedBB(vec3d, vec3d1);
+     }
+ 
++    public final void setBoundingBox(AxisAlignedBB axisalignedbb) { a(axisalignedbb); } // Paper - OBFHELPER
+     public void a(AxisAlignedBB axisalignedbb) {
+         // CraftBukkit start - block invalid bounding boxes
+         double minX = axisalignedbb.minX,
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+     }
+ 
+     public void setPositionRaw(double d0, double d1, double d2) {
++        // Paper start - never allow AABB to become desynced from position
++        // hanging has its own special logic
++        if (!(this instanceof EntityHanging) && (this.loc.x != d0 || this.loc.y != d1 || this.loc.z != d2)) {
++            float f = this.size.width / 2.0F;
++            float f1 = this.size.height;
++            this.setBoundingBox(new AxisAlignedBB(d0 - (double) f, d1, d2 - (double) f, d0 + (double) f, d1 + (double) f1, d2 + (double) f));
++        }
++        // Paper end
+         if (this.loc.x != d0 || this.loc.y != d1 || this.loc.z != d2) {
+             this.loc = new Vec3D(d0, d1, d2);
+             int i = MathHelper.floor(d0);
diff --git a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
new file mode 100644
index 0000000000..f8a714ef2d
--- /dev/null
+++ b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
@@ -0,0 +1,93 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kickash32 <kickash32@gmail.com>
+Date: Sat, 27 Jun 2020 12:37:58 -0400
+Subject: [PATCH] Limit lightning strike effect distance
+
+
+diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
++++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
+@@ -0,0 +0,0 @@
+ package com.destroystokyo.paper;
+ 
+-import java.util.Arrays;
+-import java.util.EnumMap;
+-import java.util.HashMap;
+-import java.util.List;
+-import java.util.Map;
+-
+ import com.destroystokyo.paper.antixray.ChunkPacketBlockControllerAntiXray.EngineMode;
+ import org.bukkit.Bukkit;
+ import org.bukkit.Material;
+@@ -0,0 +0,0 @@ import org.bukkit.configuration.ConfigurationSection;
+ import org.bukkit.configuration.file.YamlConfiguration;
+ import org.spigotmc.SpigotWorldConfig;
+ 
++import java.util.Arrays;
++import java.util.EnumMap;
++import java.util.HashMap;
++import java.util.List;
++import java.util.Map;
++
+ import static com.destroystokyo.paper.PaperConfig.log;
+ import static com.destroystokyo.paper.PaperConfig.logError;
+ 
+@@ -0,0 +0,0 @@ public class PaperWorldConfig {
+             delayChunkUnloadsBy *= 20;
+         }
+     }
++
++    public double sqrMaxThunderDistance;
++    public double sqrMaxLightningImpactSoundDistance;
++    public double maxLightningFlashDistance;
++    private void lightningStrikeDistanceLimit() {
++        sqrMaxThunderDistance = getInt("lightning-strike-distance-limit.sound", -1);
++        if (sqrMaxThunderDistance > 0) {
++            sqrMaxThunderDistance *= sqrMaxThunderDistance;
++        }
++
++        sqrMaxLightningImpactSoundDistance = getInt("lightning-strike-distance-limit.impact-sound", -1);
++        if (sqrMaxLightningImpactSoundDistance < 0) {
++            sqrMaxLightningImpactSoundDistance = 32 * 32; //Vanilla value
++        } else {
++            sqrMaxLightningImpactSoundDistance *= sqrMaxLightningImpactSoundDistance;
++        }
++
++        maxLightningFlashDistance = getInt("lightning-strike-distance-limit.flash", -1);
++        if (maxLightningFlashDistance < 0) {
++            maxLightningFlashDistance = 512; // Vanilla value
++        }
++    }
+ }
+diff --git a/src/main/java/net/minecraft/server/EntityLightning.java b/src/main/java/net/minecraft/server/EntityLightning.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/EntityLightning.java
++++ b/src/main/java/net/minecraft/server/EntityLightning.java
+@@ -0,0 +0,0 @@ public class EntityLightning extends Entity {
+                 double deltaX = this.locX() - player.locX();
+                 double deltaZ = this.locZ() - player.locZ();
+                 double distanceSquared = deltaX * deltaX + deltaZ * deltaZ;
++                // Paper start - Limit lightning strike effect distance
++                if (distanceSquared <= this.world.paperConfig.sqrMaxLightningImpactSoundDistance) {
++                    player.playerConnection.sendPacket(new PacketPlayOutNamedSoundEffect(SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT,
++                        SoundCategory.WEATHER, this.locX(), this.locY(), this.locZ(), 2.0f, 0.5F + this.random.nextFloat() * 0.2F));
++                }
++
++                if (world.paperConfig.sqrMaxThunderDistance != -1 && distanceSquared >= world.paperConfig.sqrMaxThunderDistance) {
++                    continue;
++                }
++
++                // Paper end
+                 if (distanceSquared > viewDistance * viewDistance) {
+                     double deltaLength = Math.sqrt(distanceSquared);
+                     double relativeX = player.locX() + (deltaX / deltaLength) * viewDistance;
+@@ -0,0 +0,0 @@ public class EntityLightning extends Entity {
+                 }
+             }
+             // CraftBukkit end
+-            this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F);
++//            this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F); // Paper
+         }
+ 
+         --this.lifeTicks;
diff --git a/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch b/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch
new file mode 100644
index 0000000000..9b2c2ce091
--- /dev/null
+++ b/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch
@@ -0,0 +1,63 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: kickash32 <kickash32@gmail.com>
+Date: Sat, 27 Jun 2020 14:23:16 -0400
+Subject: [PATCH] Optimize WorldBorder collision checks and air
+
+
+diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/Entity.java
++++ b/src/main/java/net/minecraft/server/Entity.java
+@@ -0,0 +0,0 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke
+         AxisAlignedBB axisalignedbb = this.getBoundingBox();
+         VoxelShapeCollision voxelshapecollision = VoxelShapeCollision.a(this);
+         VoxelShape voxelshape = this.world.getWorldBorder().c();
+-        Stream<VoxelShape> stream = VoxelShapes.c(voxelshape, VoxelShapes.a(axisalignedbb.shrink(1.0E-7D)), OperatorBoolean.AND) ? Stream.empty() : Stream.of(voxelshape);
++        Stream<VoxelShape> stream = !this.world.getWorldBorder().isInBounds(axisalignedbb) ? Stream.empty() : Stream.of(voxelshape); // Paper
+         Stream<VoxelShape> stream1 = this.world.c(this, axisalignedbb.b(vec3d), (entity) -> {
+             return true;
+         });
+diff --git a/src/main/java/net/minecraft/server/VoxelShapeSpliterator.java b/src/main/java/net/minecraft/server/VoxelShapeSpliterator.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/VoxelShapeSpliterator.java
++++ b/src/main/java/net/minecraft/server/VoxelShapeSpliterator.java
+@@ -0,0 +0,0 @@ public class VoxelShapeSpliterator extends AbstractSpliterator<VoxelShape> {
+         AxisAlignedBB axisalignedbb = this.a.getBoundingBox();
+ 
+         if (!a(worldborder, axisalignedbb)) {
+-            VoxelShape voxelshape = worldborder.c();
+-
+-            if (!b(voxelshape, axisalignedbb) && a(voxelshape, axisalignedbb)) {
+-                consumer.accept(voxelshape);
++            // Paper start
++            if (worldborder.isInBounds(axisalignedbb.shrink(1.0E-7D)) && !worldborder.isInBounds(axisalignedbb.grow(1.0E-7D))) {
++                consumer.accept(worldborder.asVoxelShape());
++            // Paper end
+                 return true;
+             }
+         }
+diff --git a/src/main/java/net/minecraft/server/VoxelShapes.java b/src/main/java/net/minecraft/server/VoxelShapes.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/VoxelShapes.java
++++ b/src/main/java/net/minecraft/server/VoxelShapes.java
+@@ -0,0 +0,0 @@ public final class VoxelShapes {
+                                 IBlockData iblockdata = iworldreader.getTypeIfLoaded(blockposition_mutableblockposition); // Paper
+                                 if (iblockdata == null) return 0.0D; // Paper
+ 
+-                                if ((k2 != 1 || iblockdata.d()) && (k2 != 2 || iblockdata.a(Blocks.MOVING_PISTON))) {
++                                if (!iblockdata.isAir() && (k2 != 1 || iblockdata.d()) && (k2 != 2 || iblockdata.a(Blocks.MOVING_PISTON))) { // Paper
+                                     d0 = iblockdata.b((IBlockAccess) iworldreader, blockposition_mutableblockposition, voxelshapecollision).a(enumdirection_enumaxis2, axisalignedbb.d((double) (-blockposition_mutableblockposition.getX()), (double) (-blockposition_mutableblockposition.getY()), (double) (-blockposition_mutableblockposition.getZ())), d0);
+                                     if (Math.abs(d0) < 1.0E-7D) {
+                                         return 0.0D;
+diff --git a/src/main/java/net/minecraft/server/WorldBorder.java b/src/main/java/net/minecraft/server/WorldBorder.java
+index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
+--- a/src/main/java/net/minecraft/server/WorldBorder.java
++++ b/src/main/java/net/minecraft/server/WorldBorder.java
+@@ -0,0 +0,0 @@ public class WorldBorder {
+         return (double) chunkcoordintpair.f() > this.e() && (double) chunkcoordintpair.d() < this.g() && (double) chunkcoordintpair.g() > this.f() && (double) chunkcoordintpair.e() < this.h();
+     }
+ 
++    public final boolean isInBounds(AxisAlignedBB aabb) { return this.a(aabb); } // Paper - OBFHELPER
+     public boolean a(AxisAlignedBB axisalignedbb) {
+         return axisalignedbb.maxX > this.e() && axisalignedbb.minX < this.g() && axisalignedbb.maxZ > this.f() && axisalignedbb.minZ < this.h();
+     }

From 76f7b1fde778a06d8572c665e2bd1e1462091b3b Mon Sep 17 00:00:00 2001
From: kickash32 <kickash32@gmail.com>
Date: Sat, 27 Jun 2020 14:38:26 -0400
Subject: [PATCH 3/5] fix headers

---
 .../Add-permission-for-command-blocks.patch                 | 4 ++--
 .../Ensure-Entity-AABB-s-are-never-invalid.patch            | 4 ++--
 .../Limit-lightning-strike-effect-distance.patch            | 6 +++---
 .../Optimize-WorldBorder-collision-checks-and-air.patch     | 4 ++--
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/Spigot-Server-Patches/Add-permission-for-command-blocks.patch b/Spigot-Server-Patches/Add-permission-for-command-blocks.patch
index 950a10be1b..1aac314e43 100644
--- a/Spigot-Server-Patches/Add-permission-for-command-blocks.patch
+++ b/Spigot-Server-Patches/Add-permission-for-command-blocks.patch
@@ -1,6 +1,6 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kickash32 <kickash32@gmail.com>
-Date: Sat, 27 Jun 2020 13:15:53 -0400
+From: Mariell Hoversholm <proximyst@proximyst.com>
+Date: Sat, 16 May 2020 10:05:30 +0200
 Subject: [PATCH] Add permission for command blocks
 
 
diff --git a/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch b/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
index c791b1fbe6..77f5bba843 100644
--- a/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
+++ b/Spigot-Server-Patches/Ensure-Entity-AABB-s-are-never-invalid.patch
@@ -1,6 +1,6 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kickash32 <kickash32@gmail.com>
-Date: Sat, 27 Jun 2020 13:32:39 -0400
+From: Aikar <aikar@aikar.co>
+Date: Sun, 10 May 2020 22:12:46 -0400
 Subject: [PATCH] Ensure Entity AABB's are never invalid
 
 
diff --git a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
index f8a714ef2d..92dea53027 100644
--- a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
+++ b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
@@ -1,7 +1,7 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kickash32 <kickash32@gmail.com>
-Date: Sat, 27 Jun 2020 12:37:58 -0400
-Subject: [PATCH] Limit lightning strike effect distance
+From: Aikar <aikar@aikar.co>
+Date: Mon, 17 Sep 2018 23:05:31 -0400
+Subject: [PATCH] Support Overriding World Seeds
 
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
diff --git a/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch b/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch
index 9b2c2ce091..415bd8ddbc 100644
--- a/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch
+++ b/Spigot-Server-Patches/Optimize-WorldBorder-collision-checks-and-air.patch
@@ -1,6 +1,6 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: kickash32 <kickash32@gmail.com>
-Date: Sat, 27 Jun 2020 14:23:16 -0400
+From: Spottedleaf <Spottedleaf@users.noreply.github.com>
+Date: Sun, 10 May 2020 22:49:05 -0400
 Subject: [PATCH] Optimize WorldBorder collision checks and air
 
 

From f496665f6790ccf985a4dec3234a8c9e171f58dd Mon Sep 17 00:00:00 2001
From: kickash32 <kickash32@gmail.com>
Date: Sat, 27 Jun 2020 15:02:40 -0400
Subject: [PATCH 4/5] fixup

---
 ...mit-lightning-strike-effect-distance.patch | 31 ++-----------------
 1 file changed, 3 insertions(+), 28 deletions(-)

diff --git a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
index 92dea53027..92f46a1ca5 100644
--- a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
+++ b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
@@ -1,38 +1,13 @@
 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
-From: Aikar <aikar@aikar.co>
-Date: Mon, 17 Sep 2018 23:05:31 -0400
-Subject: [PATCH] Support Overriding World Seeds
+From: Trigary <trigary0@gmail.com>
+Date: Fri, 14 Sep 2018 17:42:08 +0200
+Subject: [PATCH] Limit lightning strike effect distance
 
 
 diff --git a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 index 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644
 --- a/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
 +++ b/src/main/java/com/destroystokyo/paper/PaperWorldConfig.java
-@@ -0,0 +0,0 @@
- package com.destroystokyo.paper;
- 
--import java.util.Arrays;
--import java.util.EnumMap;
--import java.util.HashMap;
--import java.util.List;
--import java.util.Map;
--
- import com.destroystokyo.paper.antixray.ChunkPacketBlockControllerAntiXray.EngineMode;
- import org.bukkit.Bukkit;
- import org.bukkit.Material;
-@@ -0,0 +0,0 @@ import org.bukkit.configuration.ConfigurationSection;
- import org.bukkit.configuration.file.YamlConfiguration;
- import org.spigotmc.SpigotWorldConfig;
- 
-+import java.util.Arrays;
-+import java.util.EnumMap;
-+import java.util.HashMap;
-+import java.util.List;
-+import java.util.Map;
-+
- import static com.destroystokyo.paper.PaperConfig.log;
- import static com.destroystokyo.paper.PaperConfig.logError;
- 
 @@ -0,0 +0,0 @@ public class PaperWorldConfig {
              delayChunkUnloadsBy *= 20;
          }

From 5ead0fc8e0ff64487edd40eb3c628b978117c4bf Mon Sep 17 00:00:00 2001
From: Omer Uddin <kickash32@gmail.com>
Date: Sat, 27 Jun 2020 16:00:08 -0400
Subject: [PATCH 5/5] Fix comment mistake

---
 .../Limit-lightning-strike-effect-distance.patch                | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
index 92f46a1ca5..1fe55e6757 100644
--- a/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
+++ b/Spigot-Server-Patches/Limit-lightning-strike-effect-distance.patch
@@ -62,7 +62,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
              }
              // CraftBukkit end
 -            this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F);
-+//            this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F); // Paper
++//            this.world.playSound((EntityHuman) null, this.locX(), this.locY(), this.locZ(), SoundEffects.ENTITY_LIGHTNING_BOLT_IMPACT, SoundCategory.WEATHER, 2.0F, 0.5F + this.random.nextFloat() * 0.2F); // Paper - Limit lightning strike effect distance (the packet is now sent from inside the loop)
          }
  
          --this.lifeTicks;