mirror of
https://github.com/Dreeam-qwq/Gale.git
synced 2025-12-28 02:59:12 +00:00
Updated to latest commit in Paper 1.20.6 branch. This update didn't include backport from latest Gale branch, we recommend to use 1.21.1, or update to 1.21.3 later
224 lines
11 KiB
Diff
224 lines
11 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: GPL-3.0 (https://www.gnu.org/licenses/gpl-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 8fd3845c4965843be9c37498760d93f1ebdff541..8a5cbe95022a3ae41283f4f884d8b2f7eae0cd34 100644
|
|
--- a/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
+++ b/src/main/java/net/minecraft/world/entity/item/ItemEntity.java
|
|
@@ -22,11 +22,13 @@ import net.minecraft.world.entity.EntityType;
|
|
import net.minecraft.world.entity.MoverType;
|
|
import net.minecraft.world.entity.SlotAccess;
|
|
import net.minecraft.world.entity.TraceableEntity;
|
|
+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;
|
|
// CraftBukkit start
|
|
import net.minecraft.server.MinecraftServer;
|
|
@@ -234,11 +236,31 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
}
|
|
// CraftBukkit end
|
|
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
|
+ 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() {
|
|
@@ -258,7 +280,13 @@ public class ItemEntity extends Entity implements TraceableEntity {
|
|
}
|
|
// CraftBukkit end
|
|
this.discard(EntityRemoveEvent.Cause.DESPAWN); // CraftBukkit - add Bukkit remove cause
|
|
+ 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 d7f8464bf3eed0e42a5fc7f14a5b243d171f8b5e..7b69243130829334c1a592026adf8fce3609f25c 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);
|
|
@@ -136,4 +137,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 5f042e294db605827000123252b0df646968f897..e1cc15f28fe8da23b74ff4504c5b2da2236fda3f 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
|
|
@@ -11,6 +11,8 @@ public interface Hopper extends Container {
|
|
return SUCK_AABB;
|
|
}
|
|
|
|
+ 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 d78f87f7f9c02dc91e74520e9b0095527e14fc5e..f221b185ca56be07ed55bf777e91d7a69968c59f 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.NonNullList;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.network.chat.Component;
|
|
import net.minecraft.tags.BlockTags;
|
|
+import net.minecraft.server.MinecraftServer;
|
|
import net.minecraft.world.CompoundContainer;
|
|
import net.minecraft.world.Container;
|
|
import net.minecraft.world.ContainerHelper;
|
|
@@ -20,6 +21,7 @@ import net.minecraft.world.entity.Entity;
|
|
import net.minecraft.world.entity.EntitySelector;
|
|
import net.minecraft.world.entity.item.ItemEntity;
|
|
import net.minecraft.world.entity.player.Player;
|
|
+import net.minecraft.world.entity.vehicle.MinecartHopper;
|
|
import net.minecraft.world.inventory.AbstractContainerMenu;
|
|
import net.minecraft.world.inventory.HopperMenu;
|
|
import net.minecraft.world.item.ItemStack;
|
|
@@ -594,7 +596,7 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
|
} else {
|
|
boolean flag = hopper.isGridAligned() && iblockdata.isCollisionShapeFullBlock(world, blockposition) && !iblockdata.is(BlockTags.DOES_NOT_BLOCK_HOPPERS);
|
|
|
|
- if (!flag) {
|
|
+ if (!flag && shouldSuckIn(world, hopper)) { // Gale - EMC - reduce hopper item checks
|
|
Iterator iterator = HopperBlockEntity.getItemsAtAndAbove(world, hopper).iterator();
|
|
|
|
while (iterator.hasNext()) {
|
|
@@ -907,6 +909,31 @@ public class HopperBlockEntity extends RandomizableContainerBlockEntity implemen
|
|
return first.getCount() < first.getMaxStackSize() && ItemStack.isSameItemSameComponents(first, second); // Paper - Perf: Optimize Hoppers; used to return true for full itemstacks?!
|
|
}
|
|
|
|
+ // 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 00a327bd0e4e0f2def0bb29d5ecff4f0ec4ba1eb..c869a559b67ecdfb8f9617e1f54fb9c28bb3c766 100644
|
|
--- a/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
|
|
+++ b/src/main/java/org/galemc/gale/configuration/GaleWorldConfiguration.java
|
|
@@ -57,6 +57,37 @@ public class GaleWorldConfiguration extends ConfigurationPart {
|
|
public int acquirePoiForStuckEntity = 60; // Gale - Airplane - reduce acquire POI for stuck entities
|
|
public int checkStuckInWall = 10; // Gale - 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 {
|
|
+
|
|
+ public int interval = 20;
|
|
+
|
|
+ public Minecart minecart;
|
|
+ public class Minecart extends ConfigurationPart {
|
|
+
|
|
+ public int interval = 20;
|
|
+
|
|
+ public TemporaryImmunity temporaryImmunity;
|
|
+ public class TemporaryImmunity extends ConfigurationPart {
|
|
+ public int duration = 100;
|
|
+ public int nearbyItemMaxAge = 1200;
|
|
+ public int checkForMinecartNearItemInterval = 20;
|
|
+ public boolean checkForMinecartNearItemWhileInactive = true;
|
|
+ public double maxItemHorizontalDistance = 24.0;
|
|
+ public double maxItemVerticalDistance = 4.0;
|
|
+ }
|
|
+
|
|
+ }
|
|
+
|
|
+ }
|
|
+ // Gale end - EMC - reduce hopper item checks
|
|
+
|
|
+ }
|
|
+
|
|
}
|
|
|
|
}
|