ChunkTrackingView.java
net.minecraft.server.level.ChunkTrackingView
信息
- 全限定名:net.minecraft.server.level.ChunkTrackingView
- 类型:public interface
- 包:net.minecraft.server.level
- 源码路径:src/main/java/net/minecraft/server/level/ChunkTrackingView.java
- 起始行号:L7
- 职责:
TODO
字段/常量
EMPTY- 类型:
ChunkTrackingView - 修饰符:
public public - 源码定位:
L8 - 说明:
TODO
- 类型:
内部类/嵌套类型
net.minecraft.server.level.ChunkTrackingView.Positioned- 类型:
record - 修饰符:
public - 源码定位:
L80 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
static ChunkTrackingView of(ChunkPos center, int radius) @ L19
- 方法名:of
- 源码定位:L19
- 返回类型:ChunkTrackingView
- 修饰符:static
参数:
- center: ChunkPos
- radius: int
说明:
TODO
static void difference(ChunkTrackingView from, ChunkTrackingView to, Consumer<ChunkPos> onEnter, Consumer<ChunkPos> onLeave) @ L23
- 方法名:difference
- 源码定位:L23
- 返回类型:void
- 修饰符:static
参数:
- from: ChunkTrackingView
- to: ChunkTrackingView
- onEnter: Consumer
- onLeave: Consumer
说明:
TODO
default boolean contains(ChunkPos pos) @ L51
- 方法名:contains
- 源码定位:L51
- 返回类型:boolean
- 修饰符:default
参数:
- pos: ChunkPos
说明:
TODO
default boolean contains(int x, int z) @ L55
- 方法名:contains
- 源码定位:L55
- 返回类型:boolean
- 修饰符:default
参数:
- x: int
- z: int
说明:
TODO
boolean contains(int chunkX, int chunkZ, boolean includeNeighbors) @ L59
- 方法名:contains
- 源码定位:L59
- 返回类型:boolean
- 修饰符:package-private
参数:
- chunkX: int
- chunkZ: int
- includeNeighbors: boolean
说明:
TODO
void forEach(Consumer<ChunkPos> consumer) @ L61
- 方法名:forEach
- 源码定位:L61
- 返回类型:void
- 修饰符:package-private
参数:
- consumer: Consumer
说明:
TODO
default boolean isInViewDistance(int chunkX, int chunkZ) @ L63
- 方法名:isInViewDistance
- 源码定位:L63
- 返回类型:boolean
- 修饰符:default
参数:
- chunkX: int
- chunkZ: int
说明:
TODO
static boolean isInViewDistance(int centerX, int centerZ, int viewDistance, int chunkX, int chunkZ) @ L67
- 方法名:isInViewDistance
- 源码定位:L67
- 返回类型:boolean
- 修饰符:static
参数:
- centerX: int
- centerZ: int
- viewDistance: int
- chunkX: int
- chunkZ: int
说明:
TODO
static boolean isWithinDistance(int centerX, int centerZ, int viewDistance, int chunkX, int chunkZ, boolean includeNeighbors) @ L71
- 方法名:isWithinDistance
- 源码定位:L71
- 返回类型:boolean
- 修饰符:static
参数:
- centerX: int
- centerZ: int
- viewDistance: int
- chunkX: int
- chunkZ: int
- includeNeighbors: boolean
说明:
TODO
代码
public interface ChunkTrackingView {
ChunkTrackingView EMPTY = new ChunkTrackingView() {
@Override
public boolean contains(int chunkX, int chunkZ, boolean includeNeighbors) {
return false;
}
@Override
public void forEach(Consumer<ChunkPos> consumer) {
}
};
static ChunkTrackingView of(ChunkPos center, int radius) {
return new ChunkTrackingView.Positioned(center, radius);
}
static void difference(ChunkTrackingView from, ChunkTrackingView to, Consumer<ChunkPos> onEnter, Consumer<ChunkPos> onLeave) {
if (!from.equals(to)) {
if (from instanceof ChunkTrackingView.Positioned last && to instanceof ChunkTrackingView.Positioned next && last.squareIntersects(next)) {
int minX = Math.min(last.minX(), next.minX());
int minZ = Math.min(last.minZ(), next.minZ());
int maxX = Math.max(last.maxX(), next.maxX());
int maxZ = Math.max(last.maxZ(), next.maxZ());
for (int x = minX; x <= maxX; x++) {
for (int z = minZ; z <= maxZ; z++) {
boolean saw = last.contains(x, z);
boolean sees = next.contains(x, z);
if (saw != sees) {
if (sees) {
onEnter.accept(new ChunkPos(x, z));
} else {
onLeave.accept(new ChunkPos(x, z));
}
}
}
}
} else {
from.forEach(onLeave);
to.forEach(onEnter);
}
}
}
default boolean contains(ChunkPos pos) {
return this.contains(pos.x(), pos.z());
}
default boolean contains(int x, int z) {
return this.contains(x, z, true);
}
boolean contains(int chunkX, int chunkZ, boolean includeNeighbors);
void forEach(Consumer<ChunkPos> consumer);
default boolean isInViewDistance(int chunkX, int chunkZ) {
return this.contains(chunkX, chunkZ, false);
}
static boolean isInViewDistance(int centerX, int centerZ, int viewDistance, int chunkX, int chunkZ) {
return isWithinDistance(centerX, centerZ, viewDistance, chunkX, chunkZ, false);
}
static boolean isWithinDistance(int centerX, int centerZ, int viewDistance, int chunkX, int chunkZ, boolean includeNeighbors) {
int bufferRange = includeNeighbors ? 2 : 1;
long deltaX = Math.max(0, Math.abs(chunkX - centerX) - bufferRange);
long deltaZ = Math.max(0, Math.abs(chunkZ - centerZ) - bufferRange);
long distanceSquared = deltaX * deltaX + deltaZ * deltaZ;
int radiusSquared = viewDistance * viewDistance;
return distanceSquared < radiusSquared;
}
public record Positioned(ChunkPos center, int viewDistance) implements ChunkTrackingView {
private int minX() {
return this.center.x() - this.viewDistance - 1;
}
private int minZ() {
return this.center.z() - this.viewDistance - 1;
}
private int maxX() {
return this.center.x() + this.viewDistance + 1;
}
private int maxZ() {
return this.center.z() + this.viewDistance + 1;
}
@VisibleForTesting
protected boolean squareIntersects(ChunkTrackingView.Positioned other) {
return this.minX() <= other.maxX() && this.maxX() >= other.minX() && this.minZ() <= other.maxZ() && this.maxZ() >= other.minZ();
}
@Override
public boolean contains(int chunkX, int chunkZ, boolean includeNeighbors) {
return ChunkTrackingView.isWithinDistance(this.center.x(), this.center.z(), this.viewDistance, chunkX, chunkZ, includeNeighbors);
}
@Override
public void forEach(Consumer<ChunkPos> consumer) {
for (int x = this.minX(); x <= this.maxX(); x++) {
for (int z = this.minZ(); z <= this.maxZ(); z++) {
if (this.contains(x, z)) {
consumer.accept(new ChunkPos(x, z));
}
}
}
}
}
}引用的其他类
- ChunkPos
- 引用位置:
参数/构造调用 - 关联成员:
ChunkPos()
- 引用位置: