From 26d804bf930b743e2b4b1438cc6e4028b26e02ad Mon Sep 17 00:00:00 2001 From: HaHaWTH <102713261+HaHaWTH@users.noreply.github.com> Date: Tue, 30 Sep 2025 18:38:46 +0800 Subject: [PATCH] Fix radix sort leak sync changes from 1.21.8 --- .../dreeam/leaf/util/FastBitRadixSort.java | 51 +++++++------------ 1 file changed, 19 insertions(+), 32 deletions(-) diff --git a/leaf-server/src/main/java/org/dreeam/leaf/util/FastBitRadixSort.java b/leaf-server/src/main/java/org/dreeam/leaf/util/FastBitRadixSort.java index 598ed57a..36a564e4 100644 --- a/leaf-server/src/main/java/org/dreeam/leaf/util/FastBitRadixSort.java +++ b/leaf-server/src/main/java/org/dreeam/leaf/util/FastBitRadixSort.java @@ -2,45 +2,32 @@ package org.dreeam.leaf.util; import net.minecraft.world.entity.Entity; -import java.lang.reflect.Array; // Required for Array.newInstance -import java.util.List; +public final class FastBitRadixSort { -public class FastBitRadixSort { + private static final int SMALL_ARRAY_THRESHOLD = 6; + private static final long[] LONGS = new long[0]; + private long[] bitsBuffer = LONGS; - private static final int SMALL_ARRAY_THRESHOLD = 2; - private Entity[] entityBuffer = new Entity[0]; - private long[] bitsBuffer = new long[0]; - - @SuppressWarnings("unchecked") - public T[] sort(List entities, T_REF referenceEntity, Class entityClass) { - int size = entities.size(); + public void sort(Object[] entities, int size, net.minecraft.core.Position target) { if (size <= 1) { - T[] resultArray = (T[]) Array.newInstance(entityClass, size); - return entities.toArray(resultArray); + return; } - if (this.entityBuffer.length < size) { - this.entityBuffer = new Entity[size]; + if (this.bitsBuffer.length < size) { this.bitsBuffer = new long[size]; } + double tx = target.x(); + double ty = target.y(); + double tz = target.z(); for (int i = 0; i < size; i++) { - this.entityBuffer[i] = entities.get(i); - this.bitsBuffer[i] = Double.doubleToRawLongBits( - referenceEntity.distanceToSqr(entities.get(i)) - ); + this.bitsBuffer[i] = Double.doubleToRawLongBits(((Entity) entities[i]).distanceToSqr(tx, ty, tz)); } - fastRadixSort(this.entityBuffer, this.bitsBuffer, 0, size - 1, 62); - - T[] resultArray = (T[]) Array.newInstance(entityClass, size); - for (int i = 0; i < size; i++) { - resultArray[i] = entityClass.cast(this.entityBuffer[i]); - } - return resultArray; + fastRadixSort(entities, this.bitsBuffer, 0, size - 1, 62); } - private void fastRadixSort( - Entity[] ents, + private static void fastRadixSort( + Object[] ents, long[] bits, int low, int high, @@ -79,15 +66,15 @@ public class FastBitRadixSort { } } - private void insertionSort( - Entity[] ents, + private static void insertionSort( + Object[] ents, long[] bits, int low, int high ) { for (int i = low + 1; i <= high; i++) { int j = i; - Entity currentEntity = ents[j]; + Object currentEntity = ents[j]; long currentBits = bits[j]; while (j > low && bits[j - 1] > currentBits) { @@ -100,8 +87,8 @@ public class FastBitRadixSort { } } - private void swap(Entity[] ents, long[] bits, int a, int b) { - Entity tempEntity = ents[a]; + private static void swap(Object[] ents, long[] bits, int a, int b) { + Object tempEntity = ents[a]; ents[a] = ents[b]; ents[b] = tempEntity;