package emu.grasscutter.scripts; import com.github.davidmoten.rtreemulti.Entry; import com.github.davidmoten.rtreemulti.RTree; import com.github.davidmoten.rtreemulti.geometry.Geometry; import com.github.davidmoten.rtreemulti.geometry.Rectangle; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Function; public class SceneIndexManager { public static RTree buildIndex( int dimensions, Collection elements, Function extractor) { RTree rtree = RTree.dimensions(dimensions).create(); return rtree.add(elements.stream().map(e -> Entry.entry(e, extractor.apply(e))).toList()); } public static List queryNeighbors(RTree tree, double[] position, int range) { var result = new ArrayList(); Rectangle rectangle = Rectangle.create(calRange(position, -range), calRange(position, range)); var queryResult = tree.search(rectangle); queryResult.forEach(q -> result.add(q.value())); return result; } private static double[] calRange(double[] position, int range) { var newPos = position.clone(); for (int i = 0; i < newPos.length; i++) { newPos[i] += range; } return newPos; } }