Jump to content

Recommended Posts

Posted (edited)

SOLVED

For anyone else who has questions like these, here's my working code:

Spoiler

@SubscribeEvent

public static void makePath(LivingUpdateEvent event) {

 

 

if (event.getEntityLiving() != null && event.getEntityLiving() instanceof EntityPlayer)

{

Entity player = event.getEntity();

BlockPos playerLocation = new BlockPos(player.posX, player.posY + player.getYOffset(), player.posZ);

World world = player.getEntityWorld();

IBlockState state = world.getBlockState(playerLocation);

Block block = state.getBlock();

 

 

if (block instanceof BlockGrass)

{

world.setBlockState(playerLocation, Blocks.DIRT.getDefaultState());

}

}

    }

 

Hey guys, I'm back at this trying to figure it all out. Aaaand I'm sure the info I want is posted. somewhere. out there. on the wide interwebz. But I can't find it.

 

I need an event that's triggered when an entity walks, with different effects for different types of vanilla blocks. ie. Redstone Ore lights up when you walk on it via onEntityWalk.

Forge doesn't seem to have a hook for this, or any event that gets called from the blocks themselves, which I guess is understandable given the entity/tile/don't call things from blocks issues.

 

So I guess I need a custom event - either one that utilizes the pretty simple, already-there onEntityWalk, or one that checks if an entity has moved, and then checks what block it's standing on. And I cannot, for the life of me, find a current tutorial on how to do that. There are allusions to it, but any solid information I've found is from many versions ago and no longer accurate.

 

Links? Help? Please?

Thanks!

-T

 

 

PS. If I just missed the Forge Event for this, please point it out to me and feel free to call me an idiot. :)

Edited by T.S.White
SOLVED
Posted (edited)

You can always get a list of available events by looking at the Type Hierarchy for the Event class. Just make sure you open up the subclasses as well because some events have useful sub-events. It is worth going through regularly as new events are added fairly often, plus familiarity usually is helpful when you come up with new modding ideas you already know there are events to hook into.

 

I think you're right that there probably isn't an event specific to what you want. By the way, for things that might be generally interesting that you want added to Forge you can go to the github MinecraftForge project and create an Issue, or even better you can create a Pull Request that fixes the issue.

 

One thing you might be able to do is hook into the block's NeighborNotifyEvent and figure out what caused it. The worst case is just use a tick event and iterate through all the entities in the world (or using the living update event and process that entity) and see what they're standing on. You'd probably find some useful code in the Entity#move() method as it checks thing like whether it can walk on things.

Edited by jabelar
  • Like 1

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted
4 hours ago, jabelar said:

You can always get a list of available events by looking at the Type Hierarchy for the Event class. Just make sure you open up the subclasses as well because some events have useful sub-events. It is worth going through regularly as new events are added fairly often, plus familiarity usually is helpful when you come up with new modding ideas you already know there are events to hook into.

 

I think you're right that there probably isn't an event specific to what you want. By the way, for things that might be generally interesting that you want added to Forge you can go to the github MinecraftForge project and create an Issue, or even better you can create a Pull Request that fixes the issue.

 

One thing you might be able to do is hook into the block's NeighborNotifyEvent and figure out what caused it. The worst case is just use a tick event and iterate through all the entities in the world (or using the living update event and process that entity) and see what they're standing on. You'd probably find some useful code in the Entity#move() method as it checks thing like whether it can walk on things.

Thanks! Looking at the Type Hierarchy was really good advice. I'm still new to Java and didn't even know that existed.
And no, it doesn't look like onEntityWalk or anything similar is pre-packaged and ready to go. If I knew the language better I think I see a way I could copy and extend the Forge Hooks to use onEntityWalk, and that would probably be lighter and more elegant since it already gets called whenever you move...

For now though, it looks like I'll be using the ham-fisted approach of LivingUpdateEvent, check if it's the player (wish it was all the entities but that's a lot for this approach), and then check what the block under their feet is.

 

So, next question, how do I get from a BlockPos to knowing if that block is dirt? From (really old) tutorials, it seems like I need to go through IBlockStates? Or something? Still reading tutorials (including the one you wrote for 1.8) and documentation, but if there's a quicker or more up to date answer I'd be super happy.

Thanks again!

-T

Posted
9 minutes ago, T.S.White said:

So, next question, how do I get from a BlockPos to knowing if that block is dirt? From (really old) tutorials, it seems like I need to go through IBlockStates? Or something? Still reading tutorials (including the one you wrote for 1.8) and documentation, but if there's a quicker or more up to date answer I'd be super happy.

state = world.getBlockState(pos); //this gets you the IBlockState (Block + Metadata combination)

block = state.getBlock(); //this gets the Block (no metadata)

  • Like 1

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.

Posted
43 minutes ago, Draco18s said:

state = world.getBlockState(pos); //this gets you the IBlockState (Block + Metadata combination)

block = state.getBlock(); //this gets the Block (no metadata)

How/Where do I use these?

(It seems like all of my questions when learning new languages are about where I put things... I feel like a little kid playing with one of those put-the-shape-in-the-cutout toys... at least I'm having fun? xD)

Thanks for helping!


current, relevant, probably bad code:

Spoiler

@SubscribeEvent

public static void makePath(LivingUpdateEvent event) {

 

if (event.getEntityLiving() != null && event.getEntityLiving() instanceof EntityPlayer)

{

Entity player = event.getEntity();

BlockPos playerLocation = new BlockPos(player.posX, player.posY - player.getYOffset(), player.posZ);

 

 

if (/*Block @ playerLocation*/ instanceof BlockGrass)

{

System.out.println("Block  is Grass!");

}

}

    }

 

Posted

world = player.getWorld();

//now you have everything you need

  • Like 1

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.

Posted (edited)
1 hour ago, Draco18s said:

world = player.getWorld();

//now you have everything you need

YAY! Thank you so much! I totally get it now.

 

I had some other mistakes to fix, but for those interested here's some working(ish) code that makes grass turn to dirt when you walk on it:

Spoiler

@SubscribeEvent

public static void makePath(LivingUpdateEvent event) {

 

 

if (event.getEntityLiving() != null && event.getEntityLiving() instanceof EntityPlayer)

{

Entity player = event.getEntity();

BlockPos playerLocation = new BlockPos(player.posX, player.posY + player.getYOffset(), player.posZ);

World world = player.getEntityWorld();

IBlockState state = world.getBlockState(playerLocation);

Block block = state.getBlock();

 

 

if (block instanceof BlockGrass)

{

world.setBlockState(playerLocation, Blocks.DIRT.getDefaultState());

}

}

    }

 

Edited by T.S.White

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.

Announcements



×
×
  • Create New...

Important Information

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