EntityHitboxDebugRenderer.java

net.minecraft.client.renderer.debug.EntityHitboxDebugRenderer

信息

  • 全限定名:net.minecraft.client.renderer.debug.EntityHitboxDebugRenderer
  • 类型:public class
  • 包:net.minecraft.client.renderer.debug
  • 源码路径:src/main/java/net/minecraft/client/renderer/debug/EntityHitboxDebugRenderer.java
  • 起始行号:L25
  • 实现:DebugRenderer.SimpleDebugRenderer
  • 职责:

    TODO

字段/常量

  • minecraft
    • 类型: Minecraft
    • 修饰符: final
    • 源码定位: L26
    • 说明:

      TODO

内部类/嵌套类型

构造器

public EntityHitboxDebugRenderer(Minecraft minecraft) @ L28

  • 构造器名:EntityHitboxDebugRenderer
  • 源码定位:L28
  • 修饰符:public

参数:

  • minecraft: Minecraft

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) @ L32

  • 方法名:emitGizmos
  • 源码定位:L32
  • 返回类型:void
  • 修饰符:public

参数:

  • camX: double
  • camY: double
  • camZ: double
  • debugValues: DebugValueAccess
  • frustum: Frustum
  • partialTicks: float

说明:

TODO

private Entity getServerEntity(Entity entity) @ L60

  • 方法名:getServerEntity
  • 源码定位:L60
  • 返回类型:Entity
  • 修饰符:private

参数:

  • entity: Entity

说明:

TODO

private void showHitboxes(Entity entity, float partialTicks, boolean isServerEntity) @ L72

  • 方法名:showHitboxes
  • 源码定位:L72
  • 返回类型:void
  • 修饰符:private

参数:

  • entity: Entity
  • partialTicks: float
  • isServerEntity: boolean

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class EntityHitboxDebugRenderer implements DebugRenderer.SimpleDebugRenderer {
    final Minecraft minecraft;
 
    public EntityHitboxDebugRenderer(Minecraft minecraft) {
        this.minecraft = minecraft;
    }
 
    @Override
    public void emitGizmos(double camX, double camY, double camZ, DebugValueAccess debugValues, Frustum frustum, float partialTicks) {
        if (this.minecraft.level != null) {
            for (Entity entity : this.minecraft.level.entitiesForRendering()) {
                if (!entity.isInvisible()
                    && frustum.isVisible(entity.getBoundingBox())
                    && (entity != this.minecraft.getCameraEntity() || this.minecraft.options.getCameraType() != CameraType.FIRST_PERSON)) {
                    float entityPartialTicks = this.minecraft
                        .getDeltaTracker()
                        .getGameTimeDeltaPartialTick(!this.minecraft.level.tickRateManager().isEntityFrozen(entity));
                    this.showHitboxes(entity, entityPartialTicks, false);
                    if (SharedConstants.DEBUG_SHOW_LOCAL_SERVER_ENTITY_HIT_BOXES) {
                        Entity serverEntity = this.getServerEntity(entity);
                        if (serverEntity != null) {
                            this.showHitboxes(entity, entityPartialTicks, true);
                        } else {
                            Gizmos.billboardText(
                                "Missing Server Entity",
                                entity.getPosition(entityPartialTicks).add(0.0, entity.getBoundingBox().getYsize() + 1.5, 0.0),
                                TextGizmo.Style.forColorAndCentered(-65536)
                            );
                        }
                    }
                }
            }
        }
    }
 
    private @Nullable Entity getServerEntity(Entity entity) {
        IntegratedServer server = this.minecraft.getSingleplayerServer();
        if (server != null) {
            ServerLevel level = server.getLevel(entity.level().dimension());
            if (level != null) {
                return level.getEntity(entity.getId());
            }
        }
 
        return null;
    }
 
    private void showHitboxes(Entity entity, float partialTicks, boolean isServerEntity) {
        Vec3 latestPosition = entity.position();
        Vec3 currentPosition = entity.getPosition(partialTicks);
        Vec3 offset = currentPosition.subtract(latestPosition);
        int mainColor = isServerEntity ? -16711936 : -1;
        Gizmos.cuboid(entity.getBoundingBox().move(offset), GizmoStyle.stroke(mainColor));
        Gizmos.point(currentPosition, mainColor, 2.0F);
        Entity vehicle = entity.getVehicle();
        if (vehicle != null) {
            float width = Math.min(vehicle.getBbWidth(), entity.getBbWidth()) / 2.0F;
            float height = 0.0625F;
            Vec3 position = vehicle.getPassengerRidingPosition(entity).add(offset);
            Gizmos.cuboid(
                new AABB(position.x - width, position.y, position.z - width, position.x + width, position.y + 0.0625, position.z + width),
                GizmoStyle.stroke(-256)
            );
        }
 
        if (entity instanceof LivingEntity) {
            AABB bb = entity.getBoundingBox().move(offset);
            float padding = 0.01F;
            Gizmos.cuboid(
                new AABB(bb.minX, bb.minY + entity.getEyeHeight() - 0.01F, bb.minZ, bb.maxX, bb.minY + entity.getEyeHeight() + 0.01F, bb.maxZ),
                GizmoStyle.stroke(-65536)
            );
        }
 
        if (entity instanceof EnderDragon dragon) {
            for (EnderDragonPart subEntity : dragon.getSubEntities()) {
                Vec3 latestSubPosition = subEntity.position();
                Vec3 currentSubPosition = subEntity.getPosition(partialTicks);
                Vec3 subOffset = currentSubPosition.subtract(latestSubPosition);
                Gizmos.cuboid(subEntity.getBoundingBox().move(subOffset), GizmoStyle.stroke(ARGB.colorFromFloat(1.0F, 0.25F, 1.0F, 0.0F)));
            }
        }
 
        Vec3 eyePosition = currentPosition.add(0.0, entity.getEyeHeight(), 0.0);
        Vec3 viewVector = entity.getViewVector(partialTicks);
        Gizmos.arrow(eyePosition, eyePosition.add(viewVector.scale(2.0)), -16776961);
        if (isServerEntity) {
            Vec3 deltaMovement = entity.getDeltaMovement();
            Gizmos.arrow(currentPosition, currentPosition.add(deltaMovement), -256);
        }
    }
}

引用的其他类

  • Minecraft

    • 引用位置: 参数/字段
  • Frustum

    • 引用位置: 参数
  • DebugRenderer

    • 引用位置: 实现
  • GizmoStyle

    • 引用位置: 方法调用
    • 关联成员: GizmoStyle.stroke()
  • Gizmos

    • 引用位置: 方法调用
    • 关联成员: Gizmos.arrow(), Gizmos.billboardText(), Gizmos.cuboid(), Gizmos.point()
  • TextGizmo

    • 引用位置: 方法调用
    • 关联成员: TextGizmo.Style.forColorAndCentered()
  • ARGB

    • 引用位置: 方法调用
    • 关联成员: ARGB.colorFromFloat()
  • DebugValueAccess

    • 引用位置: 参数
  • Entity

    • 引用位置: 参数/返回值
  • AABB

    • 引用位置: 构造调用
    • 关联成员: AABB()