@@ -52,7 +52,7 @@ public class WatchersSortingList3D<T extends BucketSorterEntry & XYZAddressable>
5252
5353 private final int intrusiveCollectionId ;
5454 private final Supplier <Collection <EntityPlayer >> playersSupplier ;
55- private int [] playerPositions = new int [0 ];
55+ private long [] playerPositions = new long [0 ];
5656 private int distributingBucket = 0 ;
5757
5858 public WatchersSortingList3D (int intrusiveCollectionId , Supplier <Collection <EntityPlayer >> playersSupplier ) {
@@ -86,7 +86,7 @@ private void updatePlayerPositions() {
8686 Collection <EntityPlayer > players = playersSupplier .get ();
8787 int newSize = players .size () * 3 ;
8888 if (playerPositions .length != newSize ) {
89- playerPositions = new int [newSize ];
89+ playerPositions = new long [newSize ];
9090 }
9191 int i = 0 ;
9292 for (EntityPlayer player : players ) {
@@ -253,36 +253,39 @@ private int computeBucketIdx(T element) {
253253 if (playerPositions .length == 0 ) {
254254 return BUCKET_COUNT - 1 ;
255255 }
256- int x = element .getX ();
257- int y = element .getY ();
258- int z = element .getZ ();
256+ // Note: don't care about performance on 32-bit JVM, nobody should be using that in 2025+
257+ long x = element .getX ();
258+ long y = element .getY ();
259+ long z = element .getZ ();
259260
260- int dx = x - playerPositions [0 ];
261- int dy = y - playerPositions [1 ];
262- int dz = z - playerPositions [2 ];
263- long dx2 = ( long ) dx * ( long ) dx ;
264- long dy2 = ( long ) dy * ( long ) dy ;
265- long dz2 = ( long ) dz * ( long ) dz ;
261+ long dx = x - playerPositions [0 ];
262+ long dy = y - playerPositions [1 ];
263+ long dz = z - playerPositions [2 ];
264+ long dx2 = dx * dx ;
265+ long dy2 = dy * dy ;
266+ long dz2 = dz * dz ;
266267 long masked = dx2 | dy2 | dz2 ;
267- int distSqMin = masked > (long ) Integer .MAX_VALUE ? Integer .MAX_VALUE : dx *dx + dy *dy + dz *dz ;
268+ // Note: we can't just rely on this being long here, Integer.MAX_VALUE * Integer.MAX_VALUE * 3 still overflows a long
269+ long distSqMin = masked > (long ) Integer .MAX_VALUE ? Integer .MAX_VALUE : dx2 + dy2 + dz2 ;
270+
268271 for (int i = 3 ; i < playerPositions .length ; i += 3 ) {
269272 dx = x - playerPositions [i ];
270273 dy = y - playerPositions [i +1 ];
271274 dz = z - playerPositions [i +2 ];
272- dx2 = ( long ) dx * ( long ) dx ;
273- dy2 = ( long ) dy * ( long ) dy ;
274- dz2 = ( long ) dz * ( long ) dz ;
275+ dx2 = dx * dx ;
276+ dy2 = dy * dy ;
277+ dz2 = dz * dz ;
275278 masked = dx2 | dy2 | dz2 ;
276- int distSq = masked > (long ) Integer .MAX_VALUE ? Integer .MAX_VALUE : dx * dx + dy * dy + dz * dz ;
279+ long distSq = masked > (long ) Integer .MAX_VALUE ? Integer .MAX_VALUE : dx2 + dy2 + dz2 ;
277280 if (distSq < distSqMin ) {
278281 distSqMin = distSq ;
279282 }
280283 }
281284 // fast very approximate square root
282- int log2dist = 32 - Integer .numberOfLeadingZeros (distSqMin );
285+ int log2dist = 64 - Long .numberOfLeadingZeros (distSqMin );
283286 int bitsToCutOff = log2dist >> 1 ;
284- int approxDist = distSqMin >> bitsToCutOff ;
285- int min = Math .min (approxDist , BUCKET_COUNT - 1 );
287+ long approxDist = distSqMin >> bitsToCutOff ;
288+ int min = ( int ) Math .min (approxDist , BUCKET_COUNT - 1 );
286289 return min ;
287290 }
288291
0 commit comments