Пробовал сейчас несколько способов решения проблемы:
1. добавить в конструктор
this.minecraft = Minecraft.getInstance()
после этого майнкрафт вылетел и пожаловался, что font is null, я добавил в констрктор ещё
this.font = Minecraft.getInstance().font;
после этого игра перестала вылетать, но этот экран стал некорректно открываться, а именно поверх него накладываются несколько пустых слоёв и, пока не закроешь 2-5 пустых экранов нужный не видно, иногда эти экраны не полностью пустые, а являются копиями исходного без заднего фона
2. сделать @Override всех методов где вызывается
shouldRunNarration
@Override
public void handleDelayedNarration() {
}
@Override
public void triggerImmediateNarration(boolean pOnlyNarrateNew) {
}
после этого майнкрафт перестал корректно отрисовывать экран, как и в первом случае и стал вылетать при закрытии экрана, это удалось починить, переписав метод
onClose, используя вместо Screen.minecraft Minecraft.getInstance()
P.S. Посмотрел в логе: пустые экраны появляются, потому что RenderSystem, по только богу известной причине, пытается вызваться в серверного потока, вместо рендер потока
P.S P.S ну конечно оно вызываетcя на сервере я же дурак даже проверку поставил в методе use. В общем я переделал метод в это:
@Override
public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
if(!pLevel.isClientSide && Minecraft.getInstance().player.isShiftKeyDown()){
NetworkHooks.openScreen((ServerPlayer) pPlayer, ((ChromaticLexicon)pPlayer.getItemInHand(pUsedHand).getItem()));
} else { Minecraft.getInstance().setScreen(new LexiconMainPageScreen(LexiconTitle)); }
pPlayer.getCooldowns().addCooldown(this, 20);
return super.use(pLevel, pPlayer, pUsedHand);
}
И теперь всё работает, вроде как
P.S. P.S. P.S. Я проверил, все проблемы с полем Screen.minecraft были следствием вызова клиентского экрана на серверной стороне