No OpenGL context found in the current thread.

Версия Minecraft
1.10.2
101
0
В определенный момент я отправляю пакет на сервер, чтобы получить нужную мне инфу. Далее, после проверок, я отправляю пакет клиенту, чтобы тот вывел надпись на экран.

Код:

Пакет на сервер:
Код:
@Override
    public IMessage onMessage(PacketIsHostile message, MessageContext ctx)
    {
        if(!ctx.getServerHandler().playerEntity.getServerWorld().isRemote)
        {    
               //бла бла бла, тут всякие if-ы
               PacketHandler.INSTANCE.sendTo(new PacketRenderLabel(), ctx.getServerHandler().playerEntity);
        }
        return null;
    }

сам PacketRenderLabel:
Код:
@Override
    public IMessage onMessage(PacketRenderLabel message, MessageContext ctx) {
        if(Minecraft.getMinecraft().thePlayer.worldObj.isRemote)
        {
            System.out.println("yes");
            Minecraft.getMinecraft().fontRendererObj.drawString("Talk to" , 100, 100, 0xffffff, true);
        }
        else
            System.out.println("no");
        return null;
    }

Зарегистрировал в Handler'e как
Код:
        INSTANCE.registerMessage(PacketIsHostile.class, PacketIsHostile.class, 3, Side.SERVER);
        INSTANCE.registerMessage(PacketRenderLabel.class, PacketRenderLabel.class, 4, Side.CLIENT);

С первым пакетом всё нормально, никаких проблем. Далее выводится "yes", но получаю краш

[Netty Client IO #6/ERROR] [FML/]: SimpleChannelHandlerWrapper exception
java.lang.RuntimeException: No OpenGL context found in the current thread.
    at org.lwjgl.opengl.GLContext.getCapabilities(GLContext.java:124) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at org.lwjgl.opengl.GL11.glEnable(GL11.java:1012) ~[lwjgl-2.9.4-nightly-20150209.jar:?]
    at net.minecraft.client.renderer.GlStateManager$BooleanState.setState(GlStateManager.java:932) ~[GlStateManager$BooleanState.class:?]
    at net.minecraft.client.renderer.GlStateManager$BooleanState.setEnabled(GlStateManager.java:921) ~[GlStateManager$BooleanState.class:?]
    at net.minecraft.client.renderer.GlStateManager.enableAlpha(GlStateManager.java:61) ~[GlStateManager.class:?]
    at net.minecraft.client.gui.FontRenderer.enableAlpha(FontRenderer.java:980) ~[FontRenderer.class:?]
    at net.minecraft.client.gui.FontRenderer.drawString(FontRenderer.java:326) ~[FontRenderer.class:?]
    at baubles.common.network.PacketRenderLabel.onMessage(PacketRenderLabel.java:40) ~[PacketRenderLabel.class:?]
    at baubles.common.network.PacketRenderLabel.onMessage(PacketRenderLabel.java:1) ~[PacketRenderLabel.class:?]
    at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:56) ~[SimpleChannelHandlerWrapper.class:?]
    at net.minecraftforge.fml.common.network.simpleimpl.SimpleChannelHandlerWrapper.channelRead0(SimpleChannelHandlerWrapper.java:36) ~[SimpleChannelHandlerWrapper.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) ~[SimpleChannelInboundHandler.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103) [MessageToMessageDecoder.class:4.0.23.Final]
    at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111) [MessageToMessageCodec.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787) [DefaultChannelPipeline.class:4.0.23.Final]
    at io.netty.channel.embedded.EmbeddedChannel.writeInbound(EmbeddedChannel.java:169) [EmbeddedChannel.class:4.0.23.Final]
    at net.minecraftforge.fml.common.network.internal.FMLProxyPacket.processPacket(FMLProxyPacket.java:109) [FMLProxyPacket.class:?]
    at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:156) [NetworkManager.class:?]
    at net.minecraft.network.NetworkManager.channelRead0(NetworkManager.java:51) [NetworkManager.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [SimpleChannelInboundHandler.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.handleClientSideCustomPacket(NetworkDispatcher.java:410) [NetworkDispatcher.class:?]
    at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:276) [NetworkDispatcher.class:?]
    at net.minecraftforge.fml.common.network.handshake.NetworkDispatcher.channelRead0(NetworkDispatcher.java:73) [NetworkDispatcher.class:?]
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105) [SimpleChannelInboundHandler.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) [ByteToMessageDecoder.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) [ByteToMessageDecoder.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:163) [ByteToMessageDecoder.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.handler.timeout.ReadTimeoutHandler.channelRead(ReadTimeoutHandler.java:150) [ReadTimeoutHandler.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319) [AbstractChannelHandlerContext.class:4.0.23.Final]
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787) [DefaultChannelPipeline.class:4.0.23.Final]
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:130) [AbstractNioByteChannel$NioByteUnsafe.class:4.0.23.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511) [NioEventLoop.class:4.0.23.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468) [NioEventLoop.class:4.0.23.Final]
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382) [NioEventLoop.class:4.0.23.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354) [NioEventLoop.class:4.0.23.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116) [SingleThreadEventExecutor$2.class:4.0.23.Final]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_71]

Как я понял, исходя из ответов в гугле, дело в том, что я на серверной стороне использую то, что можно использовать только на клиентской, но не понимаю, как, если я проверяю world.isRemote.

P.S. Если что, 40-ая строка это Minecraft.getMinecraft().fontRendererObj.drawString("Talk to" , 100, 100, 0xffffff, true);
 
Решение
Ты дёргаешь OpenGL из потока чтения пакетов (посмотри стактрейс), а контекст OpenGL привязан к основному потоку майна. По секрету скажу: так делать нельзя. Даже если бы это был основной поток, почитай про основы работы OpenGL, что ли.

Хочешь вывести какую-то строку на экране - ты её на чтении пакета должен куда-то сохранить, позже поймать событие отрисовки, например, худа на экране, и нарисовать там свою строку.

timaxa007

Модератор
5,831
409
672
3,005
192
592
А случаем регистрация пакетов не по другому делается?
network.registerMessage(Packet.Handler.class, packet.class, id, side);
И в пакете с сервера ты отправляешь серверного игрока ctx.getServerHandler().playerEntity, когда рендерить должен для клиента. Minecraft.getMinecraft().player.
 
101
0
timaxa007 написал(а):
То что ты пришлёшь пакетом, не будет постоянно высвечиваться/работать:
Код:
Minecraft.getMinecraft().fontRendererObj.drawString("Talk to" , 100, 100, 0xffffff, true);

Я просто сначала планировал сделать надпись как NameTag у Entity, но думая, что проблема в этом, решил попробовать так и все равно получил ту же ошибку, поэтому и решил спросить здесь)


Doc написал(а):
А случаем регистрация пакетов не по другому делается?
network.registerMessage(Packet.Handler.class, packet.class, id, side);
С пакетами всё нормально, хз.



И в пакете с сервера ты отправляешь серверного игрока ctx.getServerHandler().playerEntity, когда рендерить должен для клиента. Minecraft.getMinecraft().player.

Я не игрока отправляю, а игроку, вроде как.
Не думаю, что проблема в этом, ведь игрок получает своё "yes", значит до него это сообщение доходит.
 
101
0
Dahaka написал(а):
Эм... Рисовать строку в обработчике пакета? И как думаешь, где она выведется? Я не знаю.

Я для проверки сунул это, после того как с тэгом не сработало, думая, что проблема в нём.

При записи в тэг в чем проблема была?


Та же самая - "No OpenGL context found in the current thread" с указанием на первую встреченную строку, где есть GL
 
1,990
18
105
Ты дёргаешь OpenGL из потока чтения пакетов (посмотри стактрейс), а контекст OpenGL привязан к основному потоку майна. По секрету скажу: так делать нельзя. Даже если бы это был основной поток, почитай про основы работы OpenGL, что ли.

Хочешь вывести какую-то строку на экране - ты её на чтении пакета должен куда-то сохранить, позже поймать событие отрисовки, например, худа на экране, и нарисовать там свою строку.
 
Сверху