[1.7.2]Обновление рендера

Статус
В этой теме нельзя размещать новые ответы.
771
5
Есть рендер, который рендерит мою модель и предмет в слоте тайла.

Код:
public class TileEntityRelicRenderer extends TileEntitySpecialRenderer{

    private ModelRelic relicModel;
    private RenderItem renderItems;
    private Minecraft mc;

    public TileEntityRelicRenderer(){
        relicModel = new ModelRelic();
        mc = FMLClientHandler.instance().getClient();
        renderItems  = new RenderItem();
        renderItems.setRenderManager(RenderManager.instance);    
    }

    public void renderTileEntityAt(TileEntity tileEntity, double x, double y, double z, float partialTick) {
        if(tileEntity == null || !(tileEntity instanceof TileEntityRelic)) {
            return;
        }
        TileEntityRelic relic = (TileEntityRelic)tileEntity;
        renderRelic(relic, x, y, z);
        renderStackInSlot(relic, x, y, z);
    }

    public void renderStackInSlot(TileEntityRelic relic, double x, double y, double z){
        if(relic.getWorldObj().getBlock(relic.xCoord, relic.yCoord + 1, relic.zCoord) == Blocks.air && relic.getWorldObj().getClosestPlayer(relic.xCoord, relic.yCoord, relic.zCoord, 15) != null && !mc.isGamePaused()){
            ItemStack toRender;
            if(relic.getStackInSlot(0) == null){
                return;
            }
            toRender = relic.getStackInSlot(0).copy();
            toRender.stackSize = 1;
            EntityItem entityItem = new EntityItem(relic.getWorldObj(), relic.xCoord, relic.yCoord + 1, relic.zCoord, toRender);
            entityItem.hoverStart = 0f;
            if(!EsotericConfigurationMisc.relicFancyRenderer){
                GL11.glPushMatrix();
                switch(relic.getBlockMetadata()){
                    case 0: 
                        GL11.glTranslated(x + 0.5, y + 0.9, z + 0.32); 
                        break;
                    case 1: 
                        GL11.glTranslated(x + 0.68, y + 0.9, z + 0.5);
                        GL11.glRotated(-90, 0, 1, 0); 
                        break;
                    case 2: 
                        GL11.glTranslated(x + 0.5, y + 0.9, z + 0.68);
                        GL11.glRotated(-180, 0, 1, 0); 
                        break;
                    case 3: 
                        GL11.glTranslated(x + 0.32, y + 0.9, z + 0.5);
                        GL11.glRotated(-270, 0, 1, 0); 
                        break;
                }
                RenderItem.renderInFrame = true;
                GL11.glRotatef(180, 0, 1, 1);
                RenderManager.instance.renderEntityWithPosYaw(entityItem, 0.0D, 0.0D, 0.0D, 0.0F, 0.0F);
                RenderItem.renderInFrame = false;
                GL11.glPopMatrix();    
            }else{
                GL11.glPushMatrix();
                GL11.glTranslated(x + 0.5, y + 0.9, z + 0.5);
                float rotational = (Minecraft.getSystemTime()) / (3000.0F) * 300.0F;
                GL11.glPushMatrix();
                GL11.glRotatef(rotational / EsotericConfigurationMisc.relicSpeedFactor, 0F, 1.0F, 0F);
                renderItems.doRender(entityItem, 0, 0, 0, 0, 0);
                GL11.glPopMatrix();
                GL11.glPopMatrix();
            }
        }
    }

    public void renderRelic(TileEntityRelic relic, double x, double y, double z){
        GL11.glPushMatrix();
        GL11.glTranslated(x + 0.5, y + 1.5, z + 0.5);
        mc.renderEngine.bindTexture(new ResourceLocation(Esoteric.MOD_ID.toLowerCase(), "textures/blocks/relic.png"));
        GL11.glPushMatrix();
        GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F);
        int angle = relic.getBlockMetadata() * 90;
        GL11.glRotatef(angle, 0.0F, 1.0F, 0.0F);
        relicModel.render((Entity)null, 0.0F, 0.0F, -0.1F, 0.0F, 0.0F, 0.0625F);
        GL11.glPopMatrix();
        GL11.glPopMatrix();
    }
}

У меня тайл сам через определенное время кладет в слот предмет.
Так вот, когда в слоте уже есть предмет, то рендер его не рендерит, надо открыть гуи и только потом рендерится предмет.
Аналогично и если предмет был в гуи и его вытянули, то рендер не обновляется.
Что тут нужно делать?
 
771
5
Добавил вот такие пакетики в тайл и при перезаходе пашет(рендерится предмет, не надо лазить в гуи).

Код:
public Packet getDescriptionPacket(){
        S35PacketUpdateTileEntity packet = (S35PacketUpdateTileEntity)super.getDescriptionPacket();
        NBTTagCompound dataTag = packet != null ? packet.func_148857_g() : new NBTTagCompound();
        writeToNBT(dataTag);
        return new S35PacketUpdateTileEntity(xCoord, yCoord, zCoord, 1, dataTag);
    }

    public void onDataPacket(NetworkManager net, S35PacketUpdateTileEntity packet){
        super.onDataPacket(net, packet);
        NBTTagCompound tag = packet != null ? packet.func_148857_g() : new NBTTagCompound();
        readFromNBT(tag);
    }

Но как мне отправлять такие вот пакеты когда мне нужно?
 
905
5
Зайди в печку и сам посмотри, код проще некуда.
 
905
5
Там автоматическая отправка пакетов, лолка. Зри в корень, и корень позрит в тебя.
 
771
5
А лаз совсем не то плел.
Добавил в методы markDirty, decrStackSize и onDataPacket вот это и все заработало:
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
Закрывайте тему.
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху