Использование fontRenderer.drawString() при WorldEvent или EntityJoinWorldEvent.

Версия Minecraft
1.12.2
Когда я пытаюсь нарисовать текст при помощи FontRenderer и его метода drawString(...), в эвенте EntityJoinWorldEvent или WorldEvent, то вылетает ошибка: No OpenGL context found in the current thread.

Я понимаю, что эта ошибка связана с OpenGL, потому что идет вызов функции OpenGL из потока в котором нет текущего контекста OpenGL. И, конечно,
после этого я в классе с своими эвентами MTEvents добавил к аннотации @EventBusSubscriber(value = Side.CLIENT, modid = "mts"). То есть по идее Forge должен регистрировать мои эвенты только на клиентской стороне майна, то есть на главном потоку ClientThread, где соответственно есть контекст OpenGL для отрисовки. Но как я и ожидал это не сработало, хотя если использовать кастомный GuiCustom* класс который наследуется от GuiScreen и вызове showGuiScreen(...) это работает. Но мне не нужен сам GuiScreen, мне нужно просто отрендерить текст поверх самой игры.

Если нужен код то вот он:

Код:
@Mod.EventBusSubscriber(value = Side.CLIENT, modid = "mts")
public class MTEvents
{
    @SubscribeEvent
    public static void onJoinWorld(EntityJoinWorldEvent e)
    {
        World world = e.getWorld();
        EntityPlayer player = Minecraft.getMinecraft().player;
        FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
        
        if(player != null && !world.isRemote)
        {
            fontRenderer.drawString("Day: " + MyModClass.dayElapsed + ", Time: " + (int) world.getWorldTime(), 10, 10, 145);
        }
    }
}

Тут все предельно легко, но вот как переключиться на главный поток, или использовать контекст с другого потока? Может ли вообще есть другой способ отрисовки текста поверх игры?

Если вы хотите взглянуть на лог то вот он, хотя он мало что покажет.
Код:
java.lang.RuntimeException: No OpenGL context found in the current thread.
    at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124)
    at org.lwjgl.opengl.GL11.glEnable(GL11.java:1012)
    at net.minecraft.client.renderer.GlStateManager$BooleanState.setState(SourceFile:997)
    at net.minecraft.client.renderer.GlStateManager$BooleanState.setEnabled(SourceFile:990)
    at net.minecraft.client.renderer.GlStateManager.enableAlpha(SourceFile:90)
    at net.minecraft.client.gui.FontRenderer.enableAlpha(FontRenderer.java:870)
    at net.minecraft.client.gui.FontRenderer.drawString(FontRenderer.java:284)
    at net.minecraft.client.gui.FontRenderer.drawString(FontRenderer.java:279)
    at com.kenny.mts.MTEvents.onJoinWorld(MTEvents.java:30)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_8_MTEvents_onJoinWorld_EntityJoinWorldEvent.invoke(.dynamic)
    at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90)
    at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182)
    at net.minecraft.world.WorldServer.loadEntities(WorldServer.java:1065)
    at net.minecraft.world.chunk.Chunk.onLoad(Chunk.java:860)
    at net.minecraftforge.common.chunkio.ChunkIOProvider.syncCallback(ChunkIOProvider.java:109)
    at net.minecraftforge.common.chunkio.ChunkIOExecutor.syncChunkLoad(ChunkIOExecutor.java:94)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:118)
    at net.minecraft.world.gen.ChunkProviderServer.loadChunk(ChunkProviderServer.java:89)
    at net.minecraft.world.gen.ChunkProviderServer.provideChunk(ChunkProviderServer.java:135)
    at net.minecraft.world.World.getChunkFromChunkCoords(World.java:310)
    at net.minecraft.world.World.getChunkFromBlockCoords(World.java:305)
    at net.minecraft.world.World.getBlockState(World.java:911)
    at net.minecraft.world.WorldEntitySpawner.canCreatureTypeSpawnBody(WorldEntitySpawner.java:233)
    at net.minecraft.entity.EntityLiving$SpawnPlacementType.canSpawnAt(EntityLiving.java:1463)
    at net.minecraft.world.WorldEntitySpawner.canCreatureTypeSpawnAtLocation(WorldEntitySpawner.java:226)
    at net.minecraft.world.WorldEntitySpawner.findChunksForSpawning(WorldEntitySpawner.java:135)
    at net.minecraft.world.WorldServer.tick(WorldServer.java:203)
    at net.minecraft.server.MinecraftServer.updateTimeLightAndEntities(MinecraftServer.java:756)
    at net.minecraft.server.MinecraftServer.tick(MinecraftServer.java:668)
    at net.minecraft.server.integrated.IntegratedServer.tick(IntegratedServer.java:185)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:526)
    at java.lang.Thread.run(Unknown Source)
 
124
1
8
Последнее редактирование:

tox1cozZ

aka Agravaine
8,454
598
2,890
Ну перед этим проверить типа if(Minecraft.getMinecraft().world != null && Minecraft.getMinecraft().player != null)
Открой исходники игры и посмотри где вызывается этот ивент, может глупые вопросы задать не будешь.
Он вызывается когда уже есть мир и игрок.
 
Сверху