Jump to content

[1.6.4] How to change custom model render based on block metadata


skullywag

Recommended Posts

Hi all,

 

Im trying to add a block that "grows" using metadata (0 = just planted, 1 = slightly grown 2 = full grown). I have a model that contains all the shapes for all the states, I want to pick the ones to show with a switch/if, something like:

 

public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5)
  {
    super.render(entity, f, f1, f2, f3, f4, f5);
    setRotationAngles(f, f1, f2, f3, f4, f5, entity);

    if(meta == 0)
    {
    	MainCrystal.render(f5);
    }
    if(meta == 1)
    {
    MainCrystal1.render(f5);
    OffShoot11.render(f5);
    OffShoot12.render(f5);
    OffShoot13.render(f5);
    }
    if(meta == 2)
    {
    MainCrystal2.render(f5);
    OffShoot21.render(f5);
    OffShoot22.render(f5);
    OffShoot23.render(f5);
    }

 

but im having trouble passing the metadata in from anywhere, Ive tried from my TileEntity Renderer class in the renderTileEntityAt method to no avail. Ive tried NBT, no luck.

 

The problem seems to be that if i print the entity passed in to renderTileEntityAt it seems to know where it is (x,y,z) it know what its blocktype is it however ALWAYS returns 0 for getBlockMetadata and blockMetadata.

 

Once ive solved this issue there is something else id like to ask on this subject but i wont muddy the waters here until this is solved as this is the one thats bugging me.

Link to comment
Share on other sites

You....are not using a render function that is appropriate for blocks, AFAICT.  You should be using either ISimpleBlockRenderingHandler, which has this:

 

 public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelId, RenderBlocks renderer) { }

 

With the world and coordinates you can request the metadata.

 

Or there's TileEntitySpecialRenderer, which has this:

 

public void renderTileEntityAt(TileEntity tileentity, double x, double y, double z, float f) { }

 

Which passes a reference to a TileEntity.

 

In any case, both Entity and TileEntity have a public object worldObj which has a reference to the world where you can request metadata from blocks.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Forgive me if im misunderstanding you but, the start of my renderer looks like this:

 

public class TileEntityCrystalRenderer extends TileEntitySpecialRenderer {
        
        private final ModelCustom model;
        
        public TileEntityCustomRenderer() {
                this.model = new ModelCustom ();
        }
                
        @Override
        public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) 
        {     	
            GL11.glPushMatrix();

 

As per my OP if I put a print statement before that GL11 PushMatrix, both te.getBlockMetadata and te.blockMetadata return 0 all the time, even I place meta 1, 2 or 3. The render method I posted in the OP is in my model class.

 

 

Link to comment
Share on other sites

Dont know what I did but realised I was getting meta 0 even when placing 1 2 or 3 and after id removed the renderer it was still happening, deleted and recreated my block class and now it works, albeit im getting openGL errors (stack overflow) but ill figure them out. (I hope)

 

Edit - ITS ALIVE, (forgot to pop twice in my renderat)

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Not sure what's going on the logs are making even less sense than usual to me. Any help would be much appreciated.   https://paste.ee/p/KBHyP#s=0
    • I have: Minecraft.getInstance().player.sendChatMessage(command); but im getting an error saying: Cannot resolve method 'sendChatMessage' in 'LocalPlayer':49 Now, I know what this error means, but I have no clue how to fix it. I am knew to java and forge modding. I was thinking maybe it was an import issue? here are all my imports:   import net.minecraft.client.Minecraft; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.client.event.ClientChatEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import java.util.Timer; import java.util.TimerTask;     Does anybody know the solution?
    • ROTER88 : Waspada Situs Scam dengan Withdraw Tidak Dibayar Di era digital saat ini, banyak orang yang mencari keberuntungan melalui situs perjudian online. Namun, dibalik gemerlap janji-janji manis kemenangan, ada bahaya yang mengintai. Salah satu situs yang patut diwaspadai adalah ROTER88. Situs ini mendapat reputasi buruk karena banyak laporan dari pengguna yang mengklaim bahwa mereka tidak bisa menarik dana kemenangan mereka. Dalam artikel ini, kita akan membahas mengapa ROTER88 dianggap sebagai situs scam dan bagaimana Anda bisa melindungi diri dari penipuan serupa. Pengalaman Pengguna: Penarikan Tidak Dibayar Beberapa pengguna telah melaporkan pengalaman buruk mereka dengan ROTER88. Mereka mengaku bahwa setelah memenangkan sejumlah uang dan mencoba menariknya, proses penarikan mereka ditolak tanpa alasan yang jelas. Bahkan, beberapa pengguna melaporkan bahwa akun mereka tiba-tiba diblokir setelah mencoba melakukan penarikan, sehingga mereka kehilangan akses ke dana mereka sama sekali.
    • Hello! Im trying to get biome on player's position, if the player is in desert biome the variable "temperature" should increase but it doesn't. am i missing something? package net.mcreator.drowningbelow.procedures; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.event.TickEvent; import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.Entity; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.mcreator.drowningbelow.network.DrowningbelowModVariables; import javax.annotation.Nullable; import net.minecraft.world.level.LevelAccessor; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; import net.minecraft.client.Minecraft; import net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.biome.Biome; import java.io.Console; @Mod.EventBusSubscriber public class TemperaturaProcedure { private static final int TICKS_INTERVAL = 60; // 60 ticks = 3 segundos private static int tickCounter = 0; private static final int TICK_BIOME_INTERVAL = 60; private static int tickBiomeCounter = 0; @SubscribeEvent public static void onPlayerTick(TickEvent.PlayerTickEvent event) { if (event.phase == TickEvent.Phase.END) { tickCounter++; tickBiomeCounter++; if (tickCounter >= TICKS_INTERVAL) { tickCounter = 0; checkAndUpdateTemperature(event.player); } if (tickBiomeCounter >= TICK_BIOME_INTERVAL) { tickBiomeCounter = 0; execute(event, event.player.level(), event.player); } displayTemperature(event.player); } } private static void checkAndUpdateTemperature(Entity entity) { if (entity == null) return; if (entity.isInWaterRainOrBubble()) { double newTemperature = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null) .orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura - 2; entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { capability.Temperatura = newTemperature; capability.syncPlayerVariables(entity); }); } } private static void displayTemperature(Entity entity) { if (entity == null) return; if (entity instanceof Player _player && !_player.level().isClientSide()) { double temperatura = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null) .orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura; _player.displayClientMessage(Component.literal("\u00A76\u00A7l\u2600\u00A7e\u00A7l Temperatura \u00A76\u00A7l\u2600 \u00A7e\u00A7l" + temperatura + "\u00B0"), true); } } private static void execute(@Nullable Event event, LevelAccessor world, Entity entity) { System.out.println("Esto si se mando 2"); if (world.getBiome(BlockPos.containing(entity.getX(), entity.getY(), entity.getX())).is(new ResourceLocation("desert"))) { System.out.println("Esto si se mando 3"); double _setval = (entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).orElse(new DrowningbelowModVariables.PlayerVariables())).Temperatura + 2; entity.getCapability(DrowningbelowModVariables.PLAYER_VARIABLES_CAPABILITY, null).ifPresent(capability -> { capability.Temperatura = _setval; capability.syncPlayerVariables(entity); }); System.out.println("Esto si se mando 4"); } } }  
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.