only search nearby regions
This commit is contained in:
parent
e9308d7e70
commit
709822ef47
@ -85,13 +85,32 @@ public final class CachedWorld implements IBlockTypeAccess {
|
|||||||
return region.getBlock(x & 511, y, z & 511);
|
return region.getBlock(x & 511, y, z & 511);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final LinkedList<BlockPos> getLocationsOf(String block) {
|
public final LinkedList<BlockPos> getLocationsOf(String block, int minimum, int maxRegionDistanceSq) {
|
||||||
LinkedList<BlockPos> res = new LinkedList<>();
|
LinkedList<BlockPos> res = new LinkedList<>();
|
||||||
this.cachedRegions.values().forEach(region -> {
|
int playerRegionX = playerFeet().getX() >> 9;
|
||||||
if (region != null)
|
int playerRegionZ = playerFeet().getZ() >> 9;
|
||||||
for (BlockPos pos : region.getLocationsOf(block))
|
|
||||||
res.add(pos);
|
int searchRadius = 0;
|
||||||
});
|
while (searchRadius <= maxRegionDistanceSq) {
|
||||||
|
for (int xoff = -searchRadius; xoff <= searchRadius; xoff++) {
|
||||||
|
for (int zoff = -searchRadius; zoff <= searchRadius; zoff++) {
|
||||||
|
double distance = xoff * xoff + zoff * zoff;
|
||||||
|
if (distance != searchRadius) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int regionX = xoff + playerRegionX;
|
||||||
|
int regionZ = zoff + playerRegionZ;
|
||||||
|
CachedRegion region = getOrCreateRegion(regionX, regionZ);
|
||||||
|
if (region != null)
|
||||||
|
for (BlockPos pos : region.getLocationsOf(block))
|
||||||
|
res.add(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res.size() >= minimum) {
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
searchRadius++;
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,7 +158,7 @@ public final class CachedWorld implements IBlockTypeAccess {
|
|||||||
* @param regionZ The region Z coordinate
|
* @param regionZ The region Z coordinate
|
||||||
* @return The region located at the specified coordinates
|
* @return The region located at the specified coordinates
|
||||||
*/
|
*/
|
||||||
private CachedRegion getOrCreateRegion(int regionX, int regionZ) {
|
private synchronized CachedRegion getOrCreateRegion(int regionX, int regionZ) {
|
||||||
return cachedRegions.computeIfAbsent(getRegionID(regionX, regionZ), id -> {
|
return cachedRegions.computeIfAbsent(getRegionID(regionX, regionZ), id -> {
|
||||||
CachedRegion newRegion = new CachedRegion(regionX, regionZ);
|
CachedRegion newRegion = new CachedRegion(regionX, regionZ);
|
||||||
newRegion.load(this.directory);
|
newRegion.load(this.directory);
|
||||||
|
@ -120,7 +120,7 @@ public class ExampleBaritoneControl extends Behavior {
|
|||||||
}
|
}
|
||||||
if (msg.toLowerCase().startsWith("find")) {
|
if (msg.toLowerCase().startsWith("find")) {
|
||||||
String blockType = msg.toLowerCase().substring(4).trim();
|
String blockType = msg.toLowerCase().substring(4).trim();
|
||||||
LinkedList<BlockPos> locs = WorldProvider.INSTANCE.getCurrentWorld().cache.getLocationsOf(blockType);
|
LinkedList<BlockPos> locs = WorldProvider.INSTANCE.getCurrentWorld().cache.getLocationsOf(blockType, 1, 4);
|
||||||
displayChatMessageRaw("Have " + locs.size() + " locations");
|
displayChatMessageRaw("Have " + locs.size() + " locations");
|
||||||
for (BlockPos pos : locs) {
|
for (BlockPos pos : locs) {
|
||||||
Block actually = BlockStateInterface.get(pos).getBlock();
|
Block actually = BlockStateInterface.get(pos).getBlock();
|
||||||
@ -133,7 +133,7 @@ public class ExampleBaritoneControl extends Behavior {
|
|||||||
}
|
}
|
||||||
if (msg.toLowerCase().startsWith("mine")) {
|
if (msg.toLowerCase().startsWith("mine")) {
|
||||||
String blockType = msg.toLowerCase().substring(4).trim();
|
String blockType = msg.toLowerCase().substring(4).trim();
|
||||||
List<BlockPos> locs = new ArrayList<>(WorldProvider.INSTANCE.getCurrentWorld().cache.getLocationsOf(blockType));
|
List<BlockPos> locs = new ArrayList<>(WorldProvider.INSTANCE.getCurrentWorld().cache.getLocationsOf(1, 1));
|
||||||
if (locs.isEmpty()) {
|
if (locs.isEmpty()) {
|
||||||
displayChatMessageRaw("No locations known");
|
displayChatMessageRaw("No locations known");
|
||||||
event.cancel();
|
event.cancel();
|
||||||
@ -148,9 +148,9 @@ public class ExampleBaritoneControl extends Behavior {
|
|||||||
.filter(pos -> !ChunkPacker.blockToString(BlockStateInterface.get(pos).getBlock()).equalsIgnoreCase(blockType))
|
.filter(pos -> !ChunkPacker.blockToString(BlockStateInterface.get(pos).getBlock()).equalsIgnoreCase(blockType))
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList()));
|
||||||
|
|
||||||
if (locs.size() > 10) {
|
if (locs.size() > 30) {
|
||||||
displayChatMessageRaw("Pathing to any of closest 10");
|
displayChatMessageRaw("Pathing to any of closest 30");
|
||||||
locs = locs.subList(0, 10);
|
locs = locs.subList(0, 30);
|
||||||
}
|
}
|
||||||
PathingBehavior.INSTANCE.setGoal(new GoalComposite(locs.stream().map(GoalTwoBlocks::new).toArray(Goal[]::new)));
|
PathingBehavior.INSTANCE.setGoal(new GoalComposite(locs.stream().map(GoalTwoBlocks::new).toArray(Goal[]::new)));
|
||||||
PathingBehavior.INSTANCE.path();
|
PathingBehavior.INSTANCE.path();
|
||||||
|
Loading…
Reference in New Issue
Block a user