Не открывается окошко таблички

Версия Minecraft
1.12.2
5,018
47
783
Здравствуйте. Пилю все таки эту табличку, и тут столкнулся с непреодолимой непонятной ошибкой
В общем то, моя табличка ведет себя как то плохо и неправильно. Во первых табличка ставиться всегда строго на север, а во вторых не ставит подставку. Но это еще полбеды - основное это то, что не открывается меню, где я могу вводить текст. Табличка - полный и абсолютный копипаст ванильной, потому код не кидаю.
Может я что то забыл?
зарегистрировал рендер, зарегистрировал блок, зарегистрировал тайл.
В клиентпрокси: ClientRegistry.bindTileEntitySpecialRenderer(TileEntitySovSign.class, new SovTileEntitySignRender());
В коммонпрокси: GameRegistry.registerTileEntity(TileEntitySovSign.class, "TileEntitySovSign");
Ну и блок. Все как обычно.

Путем опытов было выяснено что в методе executeCommand в тайле Style - null
И честно, я не понимаю почему.
Java:
 for (ITextComponent itextcomponent : this.signText)
        {
            Style style = itextcomponent == null ? null : itextcomponent.getStyle();

            if (style != null && style.getClickEvent() != null)
            {
                ClickEvent clickevent = style.getClickEvent();

                if (clickevent.getAction() == ClickEvent.Action.RUN_COMMAND)
                {
                    playerIn.getServer().getCommandManager().executeCommand(icommandsender, clickevent.getValue());
                }
            }
        }
 
5,018
47
783
Вот этот метод и вызывается в райтклике

Java:
   public boolean executeCommand(final EntityPlayer playerIn)
    {
        ICommandSender icommandsender = new ICommandSender()
        {
            /**
             * Get the name of this object. For players this returns their username
             */
            public String getName()
            {
                return playerIn.getName();
            }
            /**
             * Get the formatted ChatComponent that will be used for the sender's username in chat
             */
            public ITextComponent getDisplayName()
            {
                return playerIn.getDisplayName();
            }
            /**
             * Send a chat message to the CommandSender
             */
            public void sendMessage(ITextComponent component)
            {
            }
            /**
             * Returns {@code true} if the CommandSender is allowed to execute the command, {@code false} if not
             */
            public boolean canUseCommand(int permLevel, String commandName)
            {
                return permLevel <= 2;
            }
            /**
             * Get the position in the world. <b>{@code null} is not allowed!</b> If you are not an entity in the world,
             * return the coordinates 0, 0, 0
             */
            public BlockPos getPosition()
            {
                return TileEntitySovSign.this.pos;
            }
            /**
             * Get the position vector. <b>{@code null} is not allowed!</b> If you are not an entity in the world,
             * return 0.0D, 0.0D, 0.0D
             */
            public Vec3d getPositionVector()
            {
                return new Vec3d((double)TileEntitySovSign.this.pos.getX() + 0.5D, (double)TileEntitySovSign.this.pos.getY() + 0.5D, (double)TileEntitySovSign.this.pos.getZ() + 0.5D);
            }
            /**
             * Get the world, if available. <b>{@code null} is not allowed!</b> If you are not an entity in the world,
             * return the overworld
             */
            public World getEntityWorld()
            {
                return playerIn.getEntityWorld();
            }
            /**
             * Returns the entity associated with the command sender. MAY BE NULL!
             */
            public Entity getCommandSenderEntity()
            {
                return playerIn;
            }
            /**
             * Returns true if the command sender should be sent feedback about executed commands
             */
            public boolean sendCommandFeedback()
            {
                return false;
            }
            public void setCommandStat(CommandResultStats.Type type, int amount)
            {
                if (TileEntitySovSign.this.world != null && !TileEntitySovSign.this.world.isRemote)
                {
                    TileEntitySovSign.this.stats.setCommandStatForSender(TileEntitySovSign.this.world.getMinecraftServer(), this, type, amount);
                }
            }
            /**
             * Get the Minecraft server instance
             */
            public MinecraftServer getServer()
            {
                return playerIn.getServer();
            }
        };

        for (ITextComponent itextcomponent : this.signText)
        {
            Style style = itextcomponent == null ? null : itextcomponent.getStyle();

            if (style != null && style.getClickEvent() != null)
            {
                ClickEvent clickevent = style.getClickEvent();

                if (clickevent.getAction() == ClickEvent.Action.RUN_COMMAND)
                {
                    playerIn.getServer().getCommandManager().executeCommand(icommandsender, clickevent.getValue());
                }
            }
        }

        return true;
    }
 
5,018
47
783
текста там нету еще
Все оказалось еще прозаичней. ITextComponent тоже нулл
Я сейчас так еще подумал - это ведь гуи. А где гуи? Гуи то нету. Этой гуишки вообще не существует.
 
Последнее редактирование:
3,005
192
592
playerIn.getServer().getCommandManager().executeCommand(icommandsender, clickevent.getValue());
Вот этот код, что ты скинул - с style и всем остальным - это код обработки ПКМ по табличке.
Это не как не должно трогать GUI таблички.
А так, это просто запускает команду, которая будет прописана в ITextComponent у таблички.
Например вывести сообщение в чат, тп игрока и тд.
 
5,018
47
783
Так у таблички нет gui, в том то и прикол
Либо я его не нашел. Но нигде, ни в сетблоке, ни в райтклике нету вызова никаких гуи
 
3,005
192
592
5,018
47
783
Спасибо. Чет я постоянно про поиск забываю
Хотя мне и мысли в голову не приходило, что это может быть в классе игрока. Я как бы не умею мыслить как можанговцы)
 
5,018
47
783
Почему то не подгружает кастомную текстуру:
SovFontRenderer fontrenderer = new SovFontRenderer(mc.gameSettings, new ResourceLocation("soviet:textures/font/soviet_font.png"), mc.renderEngine, true); Вроде создал свой фонтрендерер, а он пишет все равно ванильным
 
3,005
192
592
5,018
47
783
Полный код, на всякий
Java:
@SideOnly(Side.CLIENT)
public class SovTileEntitySignRender extends TileEntitySpecialRenderer<TileEntitySovSign>
{
    private static final ResourceLocation SIGN_TEXTURE = new ResourceLocation("soviet:textures/entity/walltile_1.png");
    /** The ModelSign instance for use in this renderer */
    private final ModelSign model = new ModelSign();

    public void render(TileEntitySovSign te, double x, double y, double z, float partialTicks, int destroyStage, float alpha)
    {
        Block block = te.getBlockType();
        GlStateManager.pushMatrix();
        float f = 0.6666667F;

        if (block == Blocks.STANDING_SIGN)
        {
            GlStateManager.translate((float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F);
            float f1 = (float)(te.getBlockMetadata() * 360) / 16.0F;
            GlStateManager.rotate(-f1, 0.0F, 1.0F, 0.0F);
            this.model.signStick.showModel = true;
        }
        else
        {
            int k = te.getBlockMetadata();
            float f2 = 0.0F;

            if (k == 2)
            {
                f2 = 180.0F;
            }

            if (k == 4)
            {
                f2 = 90.0F;
            }

            if (k == 5)
            {
                f2 = -90.0F;
            }

            GlStateManager.translate((float)x + 0.5F, (float)y + 0.5F, (float)z + 0.5F);
            GlStateManager.rotate(-f2, 0.0F, 1.0F, 0.0F);
            GlStateManager.translate(0.0F, -0.3125F, -0.4375F);
            this.model.signStick.showModel = false;
        }

        if (destroyStage >= 0)
        {
            this.bindTexture(DESTROY_STAGES[destroyStage]);
            GlStateManager.matrixMode(5890);
            GlStateManager.pushMatrix();
            GlStateManager.scale(4.0F, 2.0F, 1.0F);
            GlStateManager.translate(0.0625F, 0.0625F, 0.0625F);
            GlStateManager.matrixMode(5888);
        }
        else
        {
            this.bindTexture(SIGN_TEXTURE);
        }

        GlStateManager.enableRescaleNormal();
        GlStateManager.pushMatrix();
        GlStateManager.scale(0.6666667F, -0.6666667F, -0.6666667F);
        this.model.renderSign();
        GlStateManager.popMatrix();
        Minecraft mc = Minecraft.getMinecraft();
        SovFontRenderer fontrenderer = new SovFontRenderer(mc.gameSettings, new ResourceLocation("soviet:textures/font/soviet_font.png"), mc.renderEngine, true);
       
        float f3 = 0.010416667F;
        GlStateManager.translate(0.0F, 0.33333334F, 0.046666667F);
        GlStateManager.scale(0.010416667F, -0.010416667F, 0.010416667F);
        GlStateManager.glNormal3f(0.0F, 0.0F, -0.010416667F);
        GlStateManager.depthMask(false);
        int i = 0;

        if (destroyStage < 0)
        {
            for (int j = 0; j < te.signText.length; ++j)
            {
                if (te.signText[j] != null)
                {
                    ITextComponent itextcomponent = te.signText[j];
                    List<ITextComponent> list = GuiUtilRenderComponents.splitText(itextcomponent, 90, fontrenderer, false, true);
                    String s = list != null && !list.isEmpty() ? ((ITextComponent)list.get(0)).getFormattedText() : "";

                    if (j == te.lineBeingEdited)
                    {
                        s = "[" + s + "]";
                        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, j * 10 - te.signText.length * 6, 0);
                    }
                    else
                    {
                        fontrenderer.drawString(s, -fontrenderer.getStringWidth(s) / 2, j * 10 - te.signText.length * 6, 0);
                    }
                }
            }
        }

        GlStateManager.depthMask(true);
        GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
        GlStateManager.popMatrix();

        if (destroyStage >= 0)
        {
            GlStateManager.matrixMode(5890);
            GlStateManager.popMatrix();
            GlStateManager.matrixMode(5888);
        }
    }
}
 
7,099
324
1,509
5,018
47
783
Обычный унаследованный с конструкторовм
Java:
public class SovFontRenderer extends FontRenderer {

    public SovFontRenderer(GameSettings gameSettingsIn, ResourceLocation location, TextureManager textureManagerIn,
            boolean unicode) {
        super(gameSettingsIn, location, textureManagerIn, unicode);

    }

}
 
5,018
47
783
Нарооод
Все еще актуально. Я вроде как все сделал: создаю новый обьект FontRenderer в клиентпрокси, при регистрации, в нем указываю путь до моей текстурки. Затем вызываю его в рендере. Но он все равно подгружает ванилькину.
 
5,018
47
783
Java:
@Override
    public void init(FMLInitializationEvent event) {
        
        RegBlocks.registerRender();
        RegItems.registerRender();
        fr = new FontRenderer(Minecraft.getMinecraft().gameSettings, new ResourceLocation("soviet:textures/font/soviet_font.png"), Minecraft.getMinecraft().renderEngine, false);
        super.init(event);
    }
 
Сверху