【问题标题】:TileEntitySpecialRenderer’s isGlobalRenderer() method is ignoredTileEntitySpecialRenderer 的 isGlobalRenderer() 方法被忽略
【发布时间】:2021-11-06 11:09:46
【问题描述】:

我正在为 Minecraft 1.12 制作一个模组。在其中,我有一个包含块位置列表的图块实体。我想在这个列表中指定的每个位置渲染一个盒子,有点像结构块显示空气块的方式。

我设法通过复制 TileEntityStructureRenderer 中的相关代码来渲染框,但是每当与 tile 实体关联的块退出屏幕时,所有框都会停止渲染。我在一些论坛和 TileEntityStructureRenderer 的代码中看到我应该重写 isGlobalRenderer() 方法并使其返回 true。所以我做到了,但问题仍然存在,我完全不知道为什么。我查阅了 Forge 的文档,但找不到任何相关信息。

我错过了什么吗?也许我注册渲染器的方式不对?

这是我在我的模组类中注册我的 tile 实体及其渲染器的方法(我删除了不相关的代码):


@Mod(modid = NaissanceE.MODID, name = NaissanceE.NAME, version = NaissanceE.VERSION)
public class NaissanceE {
  public static final String MODID = "naissancee";
  public static final String NAME = "NaissanceE";
  public static final String VERSION = "1.0";

  @Mod.EventHandler
  public void preInit(FMLPreInitializationEvent event) {
    if (event.getSide() == Side.CLIENT) {
      ClientRegistry.bindTileEntitySpecialRenderer(TileEntityLightOrbController.class, new TileEntityLightOrbControllerRenderer());
    }
  }

  @Mod.EventBusSubscriber
  static class EventsHandler {
    @SubscribeEvent
    public static void registerBlocks(RegistryEvent.Register<Block> event) {
      GameRegistry.registerTileEntity(TileEntityLightOrbController.class, new ResourceLocation(MODID, "light_orb_controller"));
    }
}

以及渲染器的代码(为清楚起见删除了导入):

@SideOnly(Side.CLIENT)
public class TileEntityLightOrbControllerRenderer extends TileEntitySpecialRenderer<TileEntityLightOrbController> {
  @Override
  public void render(TileEntityLightOrbController te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
    EntityPlayer player = Minecraft.getMinecraft().player;

    if ((player.canUseCommandBlock() || player.isSpectator())
        && (player.getHeldItemMainhand().getItem() == ModItems.LIGHT_ORB_TWEAKER
        || player.getHeldItemOffhand().getItem() == ModItems.LIGHT_ORB_TWEAKER)) {
      Tessellator tessellator = Tessellator.getInstance();
      BufferBuilder bufferbuilder = tessellator.getBuffer();
      GlStateManager.disableFog();
      GlStateManager.disableLighting();
      GlStateManager.disableTexture2D();
      GlStateManager.enableBlend();
      GlStateManager.tryBlendFuncSeparate(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA, GlStateManager.SourceFactor.ONE, GlStateManager.DestFactor.ZERO);
      this.setLightmapDisabled(true);

      List<PathCheckpoint> checkpoints = te.getCheckpoints();
      for (int i = 0, size = checkpoints.size(); i < size; i++) {
        PathCheckpoint checkpoint = checkpoints.get(i);
        this.renderCheckpoint(te, x, y, z, checkpoint, tessellator, bufferbuilder);
      }

      this.setLightmapDisabled(false);
      GlStateManager.glLineWidth(1F);
      GlStateManager.enableLighting();
      GlStateManager.enableTexture2D();
      GlStateManager.enableDepth();
      GlStateManager.depthMask(true);
      GlStateManager.enableFog();
    }
  }

  private void renderCheckpoint(TileEntityLightOrbController te, double x, double y, double z, PathCheckpoint checkpoint, Tessellator tessellator, BufferBuilder bufferBuilder) {
    GlStateManager.glLineWidth(3f);
    bufferBuilder.begin(3, DefaultVertexFormats.POSITION_COLOR);
    BlockPos tePos = te.getPos();
    BlockPos checkpointPos = checkpoint.getPos();

    final double size = 0.25;
    double start = 0.5 - size;
    double end = 0.5 + size;
    double x1 = checkpointPos.getX() - tePos.getX() + start + x;
    double y1 = checkpointPos.getY() - tePos.getY() + start + y;
    double z1 = checkpointPos.getZ() - tePos.getZ() + start + z;
    double x2 = checkpointPos.getX() - tePos.getX() + end + x;
    double y2 = checkpointPos.getY() - tePos.getY() + end + y;
    double z2 = checkpointPos.getZ() - tePos.getZ() + end + z;

    int r = 0, g = 0, b = 0;
    if (checkpoint.isStop()) {
      r = 1;
    } else {
      g = 1;
    }

    RenderGlobal.drawBoundingBox(bufferBuilder, x1, y1, z1, x2, y2, z2, r, g, b, 1);

    tessellator.draw();
  }

  // FIXME ignored
  @Override
  public boolean isGlobalRenderer(TileEntityLightOrbController te) {
    return true;
  }
}

完整代码可在here获取。

【问题讨论】:

    标签: java minecraft minecraft-forge


    【解决方案1】:

    所以,我刚刚发现,由于某种原因,当我通过 Intellij 运行游戏时它似乎无法正常工作,但在通过官方 laucher 启动游戏时却运行良好......

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 2012-03-16
      相关资源
      最近更新 更多