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()