9
0
mirror of https://github.com/Winds-Studio/Leaf.git synced 2025-12-19 15:09:25 +00:00
Files
Leaf/leaf-archived-patches/removed/1.21.1/sever/0093-Optimize-check-nearby-fire-or-lava-on-entity-move.patch
2025-06-29 23:39:55 +08:00

104 lines
5.4 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Dreeam <61569423+Dreeam-qwq@users.noreply.github.com>
Date: Mon, 15 Jul 2024 22:11:35 +0800
Subject: [PATCH] Optimize check nearby fire or lava on entity move
Removed since 1.21.1, replaced by SpottedLeaf's better solution
Remove stream and remove double Mth.floor() convert
before 1700ms, after 370ms, in massive stacked minecart test
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index 39be345524b621e6ae2eec9af9d46da3291c671b..6fbd848c7f6f3d722b4e8646613ce4f85e09b7f1 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -1337,9 +1337,12 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
}
}
// Gale end - skip negligible planar movement multiplication
- if (this.level().getBlockStatesIfLoaded(this.getBoundingBox().deflate(1.0E-6D)).noneMatch((iblockdata2) -> {
- return iblockdata2.is(BlockTags.FIRE) || iblockdata2.is(Blocks.LAVA);
- })) {
+ // Leaf start - Optimize check nearby fire or lava on entity move
+ if (nearByBlockStateNoneMatch(
+ this.level().getBlockStatesListIfLoaded(this.getBoundingBox().deflate(1.0E-6D), new java.util.ArrayList<>()),
+ iblockdata2 -> iblockdata2.is(BlockTags.FIRE) || iblockdata2.is(Blocks.LAVA)
+ )) {
+ // Leaf end - Optimize check nearby fire or lava on entity move
if (this.remainingFireTicks <= 0) {
this.setRemainingFireTicks(-this.getFireImmuneTicks());
}
@@ -1363,6 +1366,20 @@ public abstract class Entity implements SyncedDataHolder, Nameable, EntityAccess
// Paper end - detailed watchdog information
}
+ // Leaf start - Optimize check nearby fire or lava on entity move
+ private boolean nearByBlockStateNoneMatch(java.util.List<BlockState> into, Predicate<BlockState> predicate) {
+ if (into.isEmpty()) return true;
+
+ for (BlockState iblockdata : into) {
+ if (predicate.test(iblockdata)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+ // Leaf end - Optimize check nearby fire or lava on entity move
+
private boolean isStateClimbable(BlockState state) {
return state.is(BlockTags.CLIMBABLE) || state.is(Blocks.POWDER_SNOW);
}
diff --git a/src/main/java/net/minecraft/world/level/BlockGetter.java b/src/main/java/net/minecraft/world/level/BlockGetter.java
index 0fa131a6c98adb498fc8d534e0e39647e80c6923..b2c9a14c22eade293ff4fee71663001ff0701744 100644
--- a/src/main/java/net/minecraft/world/level/BlockGetter.java
+++ b/src/main/java/net/minecraft/world/level/BlockGetter.java
@@ -55,6 +55,24 @@ public interface BlockGetter extends LevelHeightAccessor {
return BlockPos.betweenClosedStream(box).map(this::getBlockState);
}
+ // Leaf start - Optimize check nearby fire or lava on entity move
+ public default java.util.List<BlockState> getBlockStatesList(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, java.util.List<BlockState> into) {
+ int rangeX = maxX - minX + 1;
+ int rangeY = maxY - minY + 1;
+ int rangeZ = maxZ - minZ + 1;
+
+ for (int x = 0; x < rangeX; x++) {
+ for (int y = 0; y < rangeY; y++) {
+ for (int z = 0; z < rangeZ; z++) {
+ into.add(getBlockState(new BlockPos(minX + x, minY + y, minZ + z)));
+ }
+ }
+ }
+
+ return into;
+ }
+ // Leaf end - Optimize check nearby fire or lava on entity move
+
default BlockHitResult isBlockInLine(ClipBlockStateContext context) {
return (BlockHitResult) BlockGetter.traverseBlocks(context.getFrom(), context.getTo(), context, (clipblockstatecontext1, blockposition) -> {
BlockState iblockdata = this.getBlockState(blockposition);
diff --git a/src/main/java/net/minecraft/world/level/LevelReader.java b/src/main/java/net/minecraft/world/level/LevelReader.java
index 1a4dc4b2561dbaf01246b4fb46266b1ac84008b8..2946890b6d9867d8ad5f8a864f171827f28f9d57 100644
--- a/src/main/java/net/minecraft/world/level/LevelReader.java
+++ b/src/main/java/net/minecraft/world/level/LevelReader.java
@@ -63,6 +63,18 @@ public interface LevelReader extends ca.spottedleaf.moonrise.patches.chunk_syste
return this.hasChunksAt(i, k, m, j, l, n) ? this.getBlockStates(box) : Stream.empty();
}
+ // Leaf start - Optimize check nearby fire or lava on entity move
+ default java.util.List<BlockState> getBlockStatesListIfLoaded(AABB box, java.util.List<BlockState> into) {
+ int i = Mth.floor(box.minX);
+ int j = Mth.floor(box.maxX);
+ int k = Mth.floor(box.minY);
+ int l = Mth.floor(box.maxY);
+ int m = Mth.floor(box.minZ);
+ int n = Mth.floor(box.maxZ);
+ return this.hasChunksAt(i, k, m, j, l, n) ? this.getBlockStatesList(i, k, m, j, l, n , into) : into;
+ }
+ // Leaf end - Optimize check nearby fire or lava on entity move
+
@Override
default int getBlockTint(BlockPos pos, ColorResolver colorResolver) {
return colorResolver.getColor(this.getBiome(pos).value(), (double)pos.getX(), (double)pos.getZ());