From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Sun, 1 May 2022 14:23:35 -0500 Subject: [PATCH] Limit amount of vehicle collision checks to 3 and discard vehicles if they collide with more than 15 other entities 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 3f31a3c17ecca6e93b794478129b95ecff4e1a9c..1db184c47880a3527e6c83666c90b7d9a9bd3ad7 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/AbstractMinecart.java @@ -8,6 +8,7 @@ import com.mojang.datafixers.util.Pair; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import net.minecraft.BlockUtil; import net.minecraft.Util; @@ -106,6 +107,7 @@ public abstract class AbstractMinecart extends Entity { private double flyingX = 0.949999988079071D; // Paper - restore vanilla precision private double flyingY = 0.949999988079071D; // Paper - restore vanilla precision private double flyingZ = 0.949999988079071D; // Paper - restore vanilla precision + private long lastLargeCollision = 0L; // Scissors - Add a collision debounce public double maxSpeed = 0.4D; // CraftBukkit end @@ -424,8 +426,10 @@ public abstract class AbstractMinecart extends Entity { if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) { List list = this.level.getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D), EntitySelector.pushableBy(this)); - if (!list.isEmpty()) { - for (int l = 0; l < list.size(); ++l) { + // Scissors - Add a collision debounce + if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Using TimeUnit for better code readability + // Scissors - Limit amount of vehicle collision checks to 3 maximum + for (int l = 0; l < Math.min(3, list.size()); ++l) { Entity entity = (Entity) list.get(l); if (!(entity instanceof Player) && !(entity instanceof IronGolem) && !(entity instanceof AbstractMinecart) && !this.isVehicle() && !entity.isPassenger()) { @@ -452,6 +456,16 @@ public abstract class AbstractMinecart extends Entity { entity.push(this); } } + + // Scissors - Add a collision debounce + if (list.size() > 3) { + lastLargeCollision = System.currentTimeMillis(); + } + + // Scissors - Delete entity if the collision amount is over 15 + if (list.size() > 15) { + this.discard(); + } } } else { Iterator iterator = this.level.getEntities(this, this.getBoundingBox().inflate(0.20000000298023224D, 0.0D, 0.20000000298023224D)).iterator(); 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 eb753323f67badb1bed28405c07b03078e322b44..8e1855ae99ce0a1c098a67c7e0fead87c061eb4f 100644 --- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.UnmodifiableIterator; import java.util.Iterator; import java.util.List; +import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; import net.minecraft.BlockUtil; import net.minecraft.core.BlockPos; @@ -106,6 +107,7 @@ public class Boat extends Entity { public double unoccupiedDeceleration = -1; public boolean landBoats = false; // CraftBukkit end + private long lastLargeCollision = 0L; // Scissors - Add a collision debounce public Boat(EntityType type, Level world) { super(type, world); @@ -403,10 +405,12 @@ public class Boat extends Entity { this.checkInsideBlocks(); List list = this.level.getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, -0.009999999776482582D, 0.20000000298023224D), EntitySelector.pushableBy(this)); - if (!list.isEmpty()) { + // Scissors - Add collision debounce + if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Using TimeUnit for better code readability boolean flag = !this.level.isClientSide && !(this.getControllingPassenger() instanceof Player); - for (int j = 0; j < list.size(); ++j) { + // Scissors - Limit amount of vehicle collision checks to 3 maximum + for (int j = 0; j < Math.min(3, list.size()); ++j) { Entity entity = (Entity) list.get(j); if (!entity.hasPassenger((Entity) this)) { @@ -417,6 +421,16 @@ public class Boat extends Entity { } } } + + // Scissors - Add collision debounce + if (list.size() > 3) { + lastLargeCollision = System.currentTimeMillis(); + } + + // Scissors - Delete entity if the collision amount is over 15 + if (list.size() > 15) { + this.discard(); + } } }