Jump to content

[1.7.10] Event handler to prevent falling out of the world.


Recommended Posts

Posted

So I wrote a snip of code to catch players falling out of the neither and overworld, and place them back someplace safe. Now I haven't had a lot of falling out of world problems since 1.6.4. But it was on my list of things to solve when I got around to modding.

 

For starters, I realize there MUST be better ways of doing this. This is functional, and after trying to get the world in some global variable, and thinking of calling several player "safe spawn" functions, I went with this hack.

 

My concern is... This is called for every LivingUpdateEvent (yuck).

It has to hook the correct variables (I'd prefer to use some constants.)

I call some random dimension checks. (Getting the correct player dim based on bed, seems to be some NBT Forge hack.)

 

 

So other than the things I hate about it, it's functional, and gets rid of a long standing pet peeve of mine... Falling out of a world for no good reason.

 

What changes/functions would streamline this?

 

 

	@SubscribeEvent
public void checkUpdate(LivingUpdateEvent event) {
	if (event.entityLiving instanceof EntityPlayer && event.entity.posY < -60.0D) {
		if(!(event.entityLiving.dimension == 0 || event.entityLiving.dimension == -1)){
			return;
		}
		OverWorld = DimensionManager.getWorld(0);
		spawn = OverWorld.getSpawnPoint();
		EntityPlayerMP playerMP = (EntityPlayerMP) event.entity;
		if (((EntityPlayer) event.entityLiving).getBedLocation(0) != null) {
			spawn = ((EntityPlayer) event.entityLiving).getBedLocation(0);
		}
		System.out.println("Saving the day!");
		event.entityLiving.fallDistance = 0;
		if (event.entity.worldObj != OverWorld) {
			playerMP.mcServer.getConfigurationManager().transferPlayerToDimension(playerMP, 0);
		}
		event.entityLiving.setPositionAndUpdate(spawn.posX, spawn.posY + .1, spawn.posZ);

 

Posted

1st of all - if you are dealing with players, you don't use LivingUpdateEvent (unless you need mid-tick). PlayerTickEvent FTW!

 

Two ways:

 

1. Use PlayerTickEvent.

* Pick tick phase (event.phase == Phase.START)

* Do everything else like you did.

 

// Note: This alredy cuts your tick-checks by about few thousand since you are only checking Players.

 

2. Use LivingHurtEvent

* Check if event.source is type of DamageSource.outOfWorld which can only happen precisely when you fall out.

* Cancel damage (event) and do everything else like you did.

 

// Note: This cuts whole ticking part, yet LivingHurtEvent will check hurting of any EntityLivingBase.

 

Numbers:

Say you got 100 players and 2000 entities.

In:

1. You do 2000 position checks per second.

2. I can't imagine having more than 2000 LivingHurtEvents fired per second, unless someone deals damage per tick.

 

Verdict:

"Premature optimization is the root of all evil!"

 

Any of those if better than LivingUpdateEvent.

Anyway - you obviously have NO idea how much MC does in one tick. Your code is NOTHING compared to rest.

It doesn't matter how much code you'd execute in that event, this:

player.posY < -60.0D

...alredy cuts out literally everything.

1.7.10 is no longer supported by forge, you are on your own.

Posted

I agree with Ernio. Checking things every tick is sometimes necessary if a condition can occur in any tick and you need to handle it immediately. The game already does a bazillion things per tick so a few position checks isn't going to be noticeable. As Ernio mentioned though it is unnecessary to check every living tick but instead use player tick.

 

If you're really worried about it, profile the time it takes to execute. I'm sure you'll find it is trivial.

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

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.