Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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.

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.

  • 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.

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.

  • 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;	
			    }
		    }   			    
		}
	}
}
}

  • 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?

  • 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;
			}
		}
	}
}
}

 

15d2e7b.png

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.