9
0
mirror of https://github.com/Dreeam-qwq/Gale.git synced 2025-12-23 00:39:22 +00:00
Files
Gale/patches/server/0054-Reduce-hopper-item-checks.patch
Martijn Muijsers 1dd6a05bfe Fixes for 1.19.4
2023-03-21 20:19:56 +01:00

299 lines
14 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Martijn Muijsers <martijnmuijsers@live.nl>
Date: Thu, 24 Nov 2022 23:03:52 +0100
Subject: [PATCH] Reduce hopper item checks
License: AGPL-3.0 (https://www.gnu.org/licenses/agpl-3.0.html)
Gale - https://galemc.org
This patch is based on the following patch:
"Improve Hopper Performance"
By: Aikar <aikar@aikar.co>
As part of: EmpireCraft (https://github.com/starlis/empirecraft)
Licensed under: MIT (https://opensource.org/licenses/MIT)
* EmpireCraft description *
Only do an item "suck in" action once per second
diff --git a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
index 036d7d29d7c85390b9658ddd70f17447648c265a..b77d112f74046cd35f17bada00a22402cb716482 100644
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
@@ -15,11 +15,13 @@ import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MoverType;
import net.minecraft.world.entity.TraceableEntity;
import net.minecraft.world.entity.player.Player;
+import net.minecraft.world.entity.vehicle.MinecartHopper;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.gameevent.GameEvent;
+import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
@@ -208,11 +210,31 @@ public class ItemEntity extends Entity implements TraceableEntity {
}
// CraftBukkit end
this.discard();
+ return; // Gale - EMC - reduce hopper item checks
}
+ this.markNearbyHopperCartsAsImmune(); // Gale - EMC - reduce hopper item checks
}
}
+ // Gale start - EMC - reduce hopper item checks
+ private void markNearbyHopperCartsAsImmune() {
+ var config = level.galeConfig().smallOptimizations.reducedIntervals.checkNearbyItem.hopper.minecart;
+ // No need to mark hopper minecarts as immune if they can pull every tick anyway
+ if (config.interval <= 1) {
+ return;
+ }
+ if (config.temporaryImmunity.duration > 0 && this.isAlive() && this.onGround && !this.isRemoved() && (config.temporaryImmunity.nearbyItemMaxAge == -1 || this.age <= config.temporaryImmunity.nearbyItemMaxAge) && this.age % Math.max(1, config.temporaryImmunity.checkForMinecartNearItemInterval) == 0 && config.temporaryImmunity.maxItemHorizontalDistance >= 0 && config.temporaryImmunity.maxItemVerticalDistance >= 0) {
+ AABB aabb = this.getBoundingBox().inflate(config.temporaryImmunity.maxItemHorizontalDistance, config.temporaryImmunity.maxItemVerticalDistance, config.temporaryImmunity.maxItemHorizontalDistance);
+ for (Entity entity : this.level.getEntities(this, aabb)) {
+ if (entity instanceof MinecartHopper) {
+ ((MinecartHopper) entity).pickupImmunity = MinecraftServer.currentTick + config.temporaryImmunity.duration;
+ }
+ }
+ }
+ }
+ // Gale end - EMC - reduce hopper item checks
+
// Spigot start - copied from above
@Override
public void inactiveTick() {
@@ -232,7 +254,13 @@ public class ItemEntity extends Entity implements TraceableEntity {
}
// CraftBukkit end
this.discard();
+ return; // Gale - EMC - reduce hopper item checks
+ }
+ // Gale start - EMC - reduce hopper item checks
+ if (level.galeConfig().smallOptimizations.reducedIntervals.checkNearbyItem.hopper.minecart.temporaryImmunity.checkForMinecartNearItemWhileInactive) {
+ this.markNearbyHopperCartsAsImmune();
}
+ // Gale end - EMC - reduce hopper item checks
}
// Spigot end
diff --git a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java
index 1b8f22805af87dc08e0dea9fd93a5f93c0b05107..36c2da765ef520d0cbe239892b8234b81b1b8012 100644
--- a/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java
+++ b/src/main/java/net/minecraft/world/entity/vehicle/MinecartHopper.java
@@ -17,6 +17,7 @@ import net.minecraft.world.level.block.state.BlockState;
public class MinecartHopper extends AbstractMinecartContainer implements Hopper {
private boolean enabled = true;
+ public int pickupImmunity = 0; // Gale - EMC - reduce hopper item checks
public MinecartHopper(EntityType<? extends MinecartHopper> type, Level world) {
super(type, world);
@@ -132,4 +133,12 @@ public class MinecartHopper extends AbstractMinecartContainer implements Hopper
}
// Paper end
+ // Gale start - EMC - reduce hopper item checks
+ private long tickAttempts = 0;
+ @Override
+ public long getAndIncrementAttemptCounter() {
+ return tickAttempts++;
+ }
+ // Gale end EMC - - reduce hopper item checks
+
}
diff --git a/src/main/java/net/minecraft/world/level/block/entity/Hopper.java b/src/main/java/net/minecraft/world/level/block/entity/Hopper.java
index a05acf709735b40ca86f978508c63a86065fd405..3752b4ba7fb0d680d4b4a61bf44d54d5ab11815c 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/Hopper.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/Hopper.java
@@ -14,6 +14,8 @@ public interface Hopper extends Container {
return SUCK;
}
+ long getAndIncrementAttemptCounter(); // Gale - EMC - reduce hopper item checks
+
double getLevelX();
double getLevelY();
diff --git a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
index b925173cba818e740f490e5b9f21ffafb043a217..81ad831d878c303efe62cc0f9b24f55bc0d5b1d7 100644
--- a/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
+++ b/src/main/java/net/minecraft/world/level/block/entity/HopperBlockEntity.java
@@ -11,6 +11,7 @@ import net.minecraft.core.Direction;
import net.minecraft.core.NonNullList;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.chat.Component;
+import net.minecraft.server.MinecraftServer;
import net.minecraft.world.CompoundContainer;
import net.minecraft.world.Container;
import net.minecraft.world.ContainerHelper;
@@ -501,7 +502,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
}
// Paper end
});
- } else {
+ } else if (shouldSuckIn(world, hopper)) { // Gale - EMC - reduce hopper item checks
Iterator iterator = HopperBlockEntity.getItemsAtAndAbove(world, hopper).iterator();
ItemEntity entityitem;
@@ -516,6 +517,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
return true;
}
+ return false; // Gale - EMC - reduce hopper item checks
}
@io.papermc.paper.annotation.DoNotUse // Paper - method unused as logic is inlined above
@@ -805,6 +807,31 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
return !first.is(second.getItem()) ? false : (first.getDamageValue() != second.getDamageValue() ? false : (first.getCount() > first.getMaxStackSize() ? false : ItemStack.tagMatches(first, second)));
}
+ // Gale start - EMC - reduce hopper item checks
+ private long tickAttempts = 0;
+ @Override
+ public long getAndIncrementAttemptCounter() {
+ return tickAttempts++;
+ }
+ private static boolean shouldSuckIn(Level world, Hopper hopper) {
+ int suckInterval;
+ if (hopper instanceof MinecartHopper minecartHopper) {
+ if (minecartHopper.pickupImmunity > MinecraftServer.currentTick) {
+ return true;
+ }
+ suckInterval = world.galeConfig().smallOptimizations.reducedIntervals.checkNearbyItem.hopper.minecart.interval;
+ } else {
+ suckInterval = world.galeConfig().smallOptimizations.reducedIntervals.checkNearbyItem.hopper.interval;
+ }
+ if (suckInterval <= 1) {
+ return true;
+ }
+
+ final int hopperId = (int) hopper.getLevelX() + (int) hopper.getLevelY() + (int) hopper.getLevelZ();
+ return (hopper.getAndIncrementAttemptCounter() + hopperId) % suckInterval == 0;
+ }
+ // Gale end - EMC - reduce hopper item checks
+
@Override
public double getLevelX() {
return (double) this.worldPosition.getX() + 0.5D;
diff --git a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
index ccc36bb32b99de79ccc157a695fd83f007e7d86a..0f2f14b0612f764a2780bc244c89db548997b2c1 100644
--- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
+++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
@@ -130,6 +130,112 @@ public class GaleWorldConfiguration extends ConfigurationPart {
public int checkStuckInWall = 10;
// Gale end - Pufferfish - reduce in wall checks
+ public CheckNearbyItem checkNearbyItem;
+ public class CheckNearbyItem extends ConfigurationPart {
+
+ // Gale start - EMC - reduce hopper item checks
+ public Hopper hopper;
+ public class Hopper extends ConfigurationPart {
+
+ /**
+ * Frequency with which hoppers check for items to pickup.
+ * Given in ticks.
+ * Any value <= 0 behaves like 1.
+ * <ul>
+ * <li><i>Default</i>: 20 (1 second)</li>
+ * <li><i>Vanilla</i>: 1</li>
+ * </ul>
+ */
+ public int interval = 20;
+
+ public Minecart minecart;
+ public class Minecart extends ConfigurationPart {
+
+ /**
+ * Frequency with which hopper minecarts check for items to pickup.
+ * Given in ticks.
+ * Any value <= 0 behaves like 1.
+ * <ul>
+ * <li><i>Default</i>: 20 (1 second)</li>
+ * <li><i>Vanilla</i>: 1</li>
+ * </ul>
+ */
+ public int interval = 20;
+
+ public TemporaryImmunity temporaryImmunity;
+ public class TemporaryImmunity extends ConfigurationPart {
+
+ /**
+ * Duration for which hopper minecarts have immunity from being affected by {@link Minecart#interval}
+ * after being made immune.
+ * Given in ticks.
+ * Any value <= 0 means hopper minecarts never have immunity.
+ * <ul>
+ * <li><i>Default</i>: 200 (10 seconds)</li>
+ * </ul>
+ */
+ public int duration = 100;
+
+ /**
+ * Items with an age higher than this value will not cause nearby hopper minecarts to become immune.
+ * Given in ticks.
+ * Any value < 0 means no age limit: all items can give nearby hopper minecarts
+ * temporary immunity to pick up items.
+ * <ul>
+ * <li><i>Default</i>: 1200 (1 minute)</li>
+ * </ul>
+ */
+ public int nearbyItemMaxAge = 1200;
+
+ /**
+ * How often to check for hopper minecarts near items, to give the minecarts temporary immunity
+ * to pick up items.
+ * Given in ticks.
+ * Any value <= 0 behaves like 1.
+ * <ul>
+ * <li><i>Default</i>: 20</li>
+ * </ul>
+ */
+ public int checkForMinecartNearItemInterval = 20;
+
+ /**
+ * Whether to check for hopper minecarts near items that are inactive, to give the minecarts
+ * temporary immunity to pick up items.
+ * <ul>
+ * <li><i>Default</i>: true</li>
+ * </ul>
+ */
+ public boolean checkForMinecartNearItemWhileInactive = true;
+
+ /**
+ * The maximum distance a dropped item can be to give hopper minecarts temporary immunity
+ * to pick up items.
+ * Any value < 0 means hopper minecarts never have immunity.
+ * <ul>
+ * <li><i>Default</i>: 24.0</li>
+ * </ul>
+ */
+ public double maxItemHorizontalDistance = 24.0;
+
+ /**
+ * The maximum distance a dropped item can be to give hopper minecarts temporary immunity
+ * to pick up items.
+ * Any value < 0 means hopper minecarts never have immunity.
+ * <ul>
+ * <li><i>Default</i>: 4.0</li>
+ * </ul>
+ */
+ public double maxItemVerticalDistance = 4.0;
+
+ }
+
+ }
+
+ }
+ // Gale end - EMC - reduce hopper item checks
+
+ }
+
}
}