Scissors/patches/server/0025-Limit-amount-of-vehicle-collision-checks-to-3-and-di.patch

110 lines
5.8 KiB
Diff
Raw Normal View History

2022-07-28 03:57:50 +00:00
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2022-12-11 06:04:11 +00:00
From: Telesphoreo <me@telesphoreo.me>
Date: Sat, 10 Dec 2022 23:44:05 -0600
2022-07-28 03:57:50 +00:00
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
2022-12-11 06:04:11 +00:00
index eec7d7a5b558830111831792c42665724613af23..79f296388a7f86944f33b9a783ab81b3a9e4d4dc 100644
2022-07-28 03:57:50 +00:00
--- 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;
2022-12-11 06:04:11 +00:00
@@ -105,6 +106,7 @@ public abstract class AbstractMinecart extends Entity {
2022-07-28 03:57:50 +00:00
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
2022-12-11 06:04:11 +00:00
@@ -431,8 +433,10 @@ public abstract class AbstractMinecart extends Entity {
2022-07-28 03:57:50 +00:00
if (this.getMinecartType() == AbstractMinecart.Type.RIDEABLE && this.getDeltaMovement().horizontalDistanceSqr() > 0.01D) {
List<Entity> 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()) {
2022-12-11 06:04:11 +00:00
@@ -459,6 +463,16 @@ public abstract class AbstractMinecart extends Entity {
2022-07-28 03:57:50 +00:00
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
2022-12-11 06:04:11 +00:00
index 85e1892866cd2ee0cec1552b8541c1f800bdf68c..2950f60e068cbeb945cfe38972eaf65b79e3a4f1 100644
2022-07-28 03:57:50 +00:00
--- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java
+++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java
2022-12-11 06:04:11 +00:00
@@ -5,6 +5,7 @@ import com.google.common.collect.UnmodifiableIterator;
2022-07-28 03:57:50 +00:00
import java.util.Iterator;
import java.util.List;
2022-12-11 06:04:11 +00:00
import java.util.function.IntFunction;
2022-07-28 03:57:50 +00:00
+import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
import net.minecraft.BlockUtil;
import net.minecraft.core.BlockPos;
2022-12-11 06:04:11 +00:00
@@ -108,6 +109,7 @@ public class Boat extends Entity implements VariantHolder<Boat.Type> {
2022-07-28 03:57:50 +00:00
public double unoccupiedDeceleration = -1;
public boolean landBoats = false;
// CraftBukkit end
+ private long lastLargeCollision = 0L; // Scissors - Add a collision debounce
public Boat(EntityType<? extends Boat> type, Level world) {
super(type, world);
2022-12-11 06:04:11 +00:00
@@ -417,10 +419,12 @@ public class Boat extends Entity implements VariantHolder<Boat.Type> {
2022-07-28 03:57:50 +00:00
this.checkInsideBlocks();
List<Entity> 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)) {
2022-12-11 06:04:11 +00:00
@@ -431,6 +435,16 @@ public class Boat extends Entity implements VariantHolder<Boat.Type> {
2022-07-28 03:57:50 +00:00
}
}
}
+
+ // 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();
+ }
}
}