From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Telesphoreo Date: Wed, 8 May 2024 13:00:39 -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 4d7454e5a64fc18e63793a221daa94617f17c666..0ebc9b469d684251ba73989b3f7483522faf48d7 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; @@ -101,6 +102,7 @@ public abstract class AbstractMinecart extends VehicleEntity { private double flyingX = 0.95; private double flyingY = 0.95; private double flyingZ = 0.95; + private long lastLargeCollision = 0L; // Scissors - Add a collision debounce public double maxSpeed = 0.4D; // CraftBukkit end @@ -381,8 +383,8 @@ public abstract class AbstractMinecart extends VehicleEntity { 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()) { - Iterator iterator = list.iterator(); + if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Scissors - add collision debounce, using TimeUnit for better code readability + Iterator iterator = list.size() <= 15 ? list.iterator() : list.subList(0, 15).iterator(); // Scissors while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); @@ -411,6 +413,13 @@ public abstract class AbstractMinecart extends VehicleEntity { entity.push(this); } } + // Scissors start - Add a collision debounce + if (list.size() > 15) { + this.discard(null); + } else if (list.size() > 3) { + lastLargeCollision = System.currentTimeMillis(); + } + // Scissors end } } else { Iterator iterator1 = 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 b068cff9b5aa457d65b679529956e8210296d799..8274154f2ce4a752ea49790c6526ecb353934a04 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 java.util.function.IntFunction; import javax.annotation.Nullable; import net.minecraft.BlockUtil; @@ -107,6 +108,8 @@ public class Boat extends VehicleEntity implements VariantHolder { public boolean landBoats = false; // CraftBukkit end + private long lastLargeCollision = 0L; // Scissors - Add a collision debounce + public Boat(EntityType type, Level world) { super(type, world); this.paddlePositions = new float[2]; @@ -401,9 +404,9 @@ public class Boat extends VehicleEntity implements VariantHolder { this.checkInsideBlocks(); List list = this.level().getEntities((Entity) this, this.getBoundingBox().inflate(0.20000000298023224D, -0.009999999776482582D, 0.20000000298023224D), EntitySelector.pushableBy(this)); - if (!list.isEmpty()) { + if (!list.isEmpty() && (System.currentTimeMillis() - lastLargeCollision) >= TimeUnit.SECONDS.toMillis(5)) { // Scissors - add collision debounce, using TimeUnit for better code readability boolean flag = !this.level().isClientSide && !(this.getControllingPassenger() instanceof Player); - Iterator iterator = list.iterator(); + Iterator iterator = list.size() <= 15 ? list.iterator() : list.subList(0, 15).iterator(); // Scissors while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); @@ -416,6 +419,13 @@ public class Boat extends VehicleEntity implements VariantHolder { } } } + // Scissors start - Add collision debounce + if (list.size() > 15) { + this.discard(null); + } else if (list.size() > 3) { + lastLargeCollision = System.currentTimeMillis(); + } + // Scissors end } }