Posted December 1, 201410 yr I've made code that uses raytrace to get the actual block the user is looking at. For just blocks it's working fine but for subblocks (like different types of wood) its not working. It seems there is no function for getting the localized name for the vanilla subblocks. I have thought about Item item = Item.getItemFromBlock(anyblock) But then the getUnlocalizedName() name requires me to add a stack. But i do not want to create a new stack because when i create a new stack, the damage must be set manually. And thats just not what i want. I want to retrieve the current damage of the current item so i can get its unlocalized name. How do i retrieve the damage of an item? Or even better, isn't there a better way of retrieving the sub blocks 'full' name? (not just Wood, but Oak Wood) I've tried to take a look in the gui (because of the tool tips) but appearantly the File Search in Eclipse doesn't work for Referenced Libraries. I can't find anything.. even if i set to search delegate.
December 1, 201410 yr Need more code. How are you setting anyblock ? In order to get the "full" name you need the block's metadata. The world has that information, but it entirely depends on what variables you have access to, which requires seeing the whole function. 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.
December 1, 201410 yr Author I created a EntityPlayer class that is registered to Forge's event bus in the Mainclass. This is just temporary code to get the current block. I will change that in the future. public class EntityPlayer { private Block lastBlock; @SubscribeEvent public void onUpdate(LivingUpdateEvent event) { if (event.entity instanceof net.minecraft.entity.player.EntityPlayer) { MovingObjectPosition mop = Minecraft.getMinecraft().renderViewEntity.rayTrace(5, 1.0F); if(mop != null) { int blockHitSide = mop.sideHit; Block block = event.entityLiving.worldObj.getBlock(mop.blockX, mop.blockY, mop.blockZ); if (lastBlock != block) { Main.instance.log.info("--> Player looks at: " + block.getLocalizedName()); lastBlock = block; } } } } } Edit: I added int metaData = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); to the function and now i get the damage value. Now i need to construct the name of the block. Which is (in my opinion) kinda weird. Is there no getLocalizedName() for vanilla subblocks? I tried to find such function but i'm unable to search in the forge reference lib. Even when i'm searching on "block.log.oak.name". Eclipse is just returning "no results" while i know it is in the lang file.
December 1, 201410 yr StatCollector.translateToLocal(block.getUnlocalizedName()) 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.
December 1, 201410 yr Author I ended up doing it like this. It looks ugly to me but it works. public class EntityPlayer { private Block lastBlock; @SubscribeEvent public void onUpdate(LivingUpdateEvent event) { if (event.entity instanceof net.minecraft.entity.player.EntityPlayer) { MovingObjectPosition mop = Minecraft.getMinecraft().renderViewEntity.rayTrace(5, 1.0F); if(mop != null) { World world = event.entityLiving.worldObj; if (!world.isAirBlock(mop.blockX, mop.blockY, mop.blockZ)) { Block block = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); if (lastBlock != block) { int metaData = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); ItemBlock itemBlock = (ItemBlock) ItemBlock.getItemFromBlock(block); String blockName = StatCollector.translateToLocal(itemBlock.getUnlocalizedName(new ItemStack(block, 1, metaData)) + ".name"); Main.instance.log.info("--> Player looks at: " + blockName); lastBlock = block; } } } } } }
December 1, 201410 yr Author Indeed, i noticed that. On just the client it's working but on a server it's not. So my guess now is that i have to use the PlayerTickEvent's world.rayTraceBlocks() method to find the block?
December 1, 201410 yr Author Well i ended up doing it this way. Thanks for the help! public class PlayerEventHandler { private Block lastBlock; @SubscribeEvent public void onPlayerTick(PlayerTickEvent event) { if (event.side == Side.CLIENT) { EntityPlayer player = event.player; World world = player.worldObj; MovingObjectPosition mop = player.rayTrace(5, 1.0F); if (mop != null && mop.typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK && !world.isAirBlock(mop.blockX, mop.blockY, mop.blockZ)) { Block block = world.getBlock(mop.blockX, mop.blockY, mop.blockZ); if (lastBlock != block) { int metaData = world.getBlockMetadata(mop.blockX, mop.blockY, mop.blockZ); Item item = Item.getItemFromBlock(block); String unlocalizedName = item.getUnlocalizedName(new ItemStack(block, 1, metaData)); String blockName = StatCollector.translateToLocal(unlocalizedName + ".name"); Main.instance.log.info("--> Player looks at: " + blockName); lastBlock = block; } } } } }
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.