Bloc TESR avec blockstates



  • Bonjour, donc je suis en 1.8 et j'ai créé un bloc TESR avec plusieurs blockstates, mais la méthode onTileEntityRendered n'est jamais appelé 😢

    Le bloc :

    
    public class WindMillSupportBlock extends Block {
    
        public static final PropertyEnum VARIANT = PropertyEnum.create("type", EnumSupportType.class);
    
        protected WindMillSupportBlock() {
            super(Material.wood);
            setUnlocalizedName("windmillSupport");
            setCreativeTab(ModElemental.eUtils);
            setDefaultState(getDefaultState().withProperty(VARIANT, EnumSupportType.TUBE));
            setBlockBounds(0.3F, 0F, 0.3F, 0.7F, 1F, 0.7F);
            setHarvestLevel("axe", 0);
            setHardness(8.0F);
            setResistance(17.0F);
        }
    
        public TileEntity createTileEntity(World world, IBlockState state) {
            if(state.getValue(VARIANT) == EnumSupportType.FOOT) {
                return new TileEntityWindMillFoot();
            } else if(state.getValue(VARIANT) == EnumSupportType.TUBE) {
                return new TileEntityWindMillTube();
            } else if(state.getValue(VARIANT) == EnumSupportType.UPPER) {
                return new TileEntityWindMillUpper();
            }
            System.out.println("ERROR : this is not an existing blockstate");
            return null;
        }
    
        public boolean hasTileEntity() {
            return true;
        }
    
        public boolean isOpaqueCube() {
            return false;
        }
    
        public boolean isNormalCube() {
            return false;
        }
    
        @SideOnly(Side.CLIENT)
        public int getRenderType() {
            return -1;
        }
    
        public IBlockState getStateFromMeta(int meta) {
            return getDefaultState().withProperty(VARIANT, EnumSupportType.getStateFromMeta(meta));
        }
    
        public int getMetaFromState(IBlockState state) {
            return ((EnumSupportType) state.getValue(VARIANT)).getMetadata();
        }
    
        protected BlockState createBlockState() {
            return new BlockState(this, new IProperty[]{VARIANT});
        }
    
        public String getUnlocalizedName(int meta) {
            return super.getUnlocalizedName() + "." + EnumSupportType.getStateFromMeta(meta);
        }
    
        public  static enum EnumSupportType implements IStringSerializable {
            FOOT(0, "foot"),
            TUBE(1, "tube"),
            UPPER(2, "upper");
    
            private static final EnumSupportType[] METADATA = new EnumSupportType[values().length];
            private final String name;
            private final int metadata;
    
            private EnumSupportType(int meta, String name) {
                this.metadata = meta;
                this.name = name;
            }
    
            @Override
            public String getName() {
                return name;
            }
    
            public int getMetadata() {
                return metadata;
            }
    
            public String toString() {
                return name;
            }
    
            public static EnumSupportType getStateFromMeta(int meta) {
                if(meta < 0 || meta >= METADATA.length) {
                    meta = 0;
                }
                return METADATA[meta];
            }
    
            static {
                EnumSupportType[] v = values();
                for(int i = 0; i < v.length; i++) {
                    METADATA[v*.getMetadata()] = v*;
                }
            }
        }
    }
    
    

    **Mon ClientProxy :
    **```java
    public class ClientProxy extends CommonProxy {

    public static KeyBinding keybindShowPower;
        private SpecialRendererWindMillSupportTileEntity tesrWMS = new SpecialRendererWindMillSupportTileEntity();

    public ClientProxy() {
            FMLCommonHandler.instance().bus().register(this);
            keybindShowPower = new KeyBinding("keybind.showPowerBar", Keyboard.KEY_RCONTROL, "key.categories.misc");
            ClientRegistry.registerKeyBinding(keybindShowPower);
        }

    @SubscribeEvent
        public void keyInput(KeyInputEvent e) {
            if(keybindShowPower.isPressed()) {
                PowerOverlay.instance.setShowing(!PowerOverlay.instance.isShowing());
            }
        }

    @Override
        public void registerRender() {
            RenderingRegistry.registerEntityRenderingHandler(EntitySnowBoss.class,
                    new RenderSnowBoss(Minecraft.getMinecraft().getRenderManager(), new ModelPlayer(0.0F, false), 0.5F));
            ClientRegistry.bindTileEntitySpecialRenderer(WindLiftTileEntity.class, new SpecialRendererWindLiftTileEntity());
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWindMillFoot.class, tesrWMS);
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWindMillTube.class, tesrWMS);
            ClientRegistry.bindTileEntitySpecialRenderer(TileEntityWindMillUpper.class, tesrWMS);
        }

    @Override
        protected void registerItemTexture(Item item, int metadata, String name) {
            ItemModelMesher mesher = Minecraft.getMinecraft().getRenderItem().getItemModelMesher();
            mesher.register(item, metadata, new ModelResourceLocation("elementalmod:" + name, "inventory"));
        }

    @Override
        protected void registerItemTexture(Item item, String name) {
            registerItemTexture(item, 0, name);
        }

    @Override
        protected void registerBlockTexture(Block block, int metadata, String name) {
            registerItemTexture(Item.getItemFromBlock(block), metadata, name);
        }

    @Override
        protected void registerBlockTexture(Block block, String name) {
            registerBlockTexture(block, 0, name);
        }
    }

    Et mon TESR (qui n'est pas appelé) :
    **```java
    public class SpecialRendererWindMillSupportTileEntity extends
            TileEntitySpecialRenderer {
    
        public static WindMillFootModel model1 = new WindMillFootModel();
        public static WindMillTubeModel model2 = new WindMillTubeModel();
        public static WindMillUpperModel model3 = new WindMillUpperModel();
        public static ResourceLocation texture = new ResourceLocation("elementalmod",
                "textures/models/blocks/wind_mill_support.png");
    
        @Override
        public void renderTileEntityAt(TileEntity tile, double posX,
                double posY, double posZ, float partialRenderTick, int par6) {
            System.out.println("Special rendering…");
            GL11.glPushMatrix();
            GL11.glTranslated(posX + 0.5, posY + 1.5, posZ + 0.5);
            GL11.glRotatef(180F, 0F, 0F, 1F);
            bindTexture(texture);
            if(tile instanceof TileEntityWindMillTube) {
                model2.renderAll();//Tube
            } else if(tile instanceof TileEntityWindMillUpper) {
                model3.renderAll();//Haut
            } else {
                model1.renderAll();//Pied
            }
            GL11.glPopMatrix();
            System.out.println("Special rendered.");
        }
    
    }
    
    

    Merci d'avance.


  • Administrateurs

    Salut,
    Ta fonction hasTileEntity n'est pas bonne. Regardes dans la classe bloc, il faut ajouter block state en argument.



  • OK, c'est bon la méthode est appelée. Mais toujours pas de rendu… 😢


  • Administrateurs

    Ton
    System.out.println("Special rendering…");
    S'affiche dans la console mais tu n'as aucun affichage en jeu ?



  • C'est ça


  • Administrateurs

    Peut-être un problème au niveau du modèle ?



  • Ah oui, j'avais oublié de déplacer le mirror sur deux des trois modèles !
    EDIT : En fait ça change rien…


  • Administrateurs

    À mon avis utiliser le même TileEntitySpecialRenderer pour trois TileEntity différent n'est pas une bonne idée.



  • Ok, ça fonctionne 🙂