Jump to content

Recommended Posts

Posted

Hello there friends :) First time posting so forgive my probable posting of this topic in the wrong area.

 

 

I have an issue concerning changing an entities xyz coordinates to values which are associated with an unloaded chunk. For a player, the player in question will teleport but the chunk they are placed in will not load until the game is restarted. For an entity teleporting into an unloaded chunk everything works fine if they are teleporting on the same tick as a player, but if the player unloads the chunk containing their original coordinates and then tries to load the chunk they should now exist in, the entities instead seem to elope into some irretrievable void from which they never return.

 

Being entirely unfamiliar with chunk loading I thought I'd ask you lovely people where I should start with an issue like this.

 

Here are the methods concerned for reference;

 

affectEntity() - Always called from server side

/**@param distance max distance capped at 1*/
@Override
public void affectEntity(Entity potionEntity, Entity throwingEntity, EntityLivingBase affectedEntity, int amplifier, double distance) {
	if(this.getId() == EEMain.mating.getId()) {
		if(affectedEntity instanceof EntityAnimal) {
			((EntityAnimal)affectedEntity).setInLove((throwingEntity instanceof EntityPlayer? (EntityPlayer)throwingEntity:null));
		}
		if(affectedEntity instanceof EntityWolf) {
			((EntityWolf)affectedEntity).setInLove((throwingEntity instanceof EntityPlayer? (EntityPlayer)throwingEntity:null));
		}
		if(affectedEntity instanceof EntityOcelot) {
			((EntityOcelot)affectedEntity).setInLove((throwingEntity instanceof EntityPlayer? (EntityPlayer)throwingEntity:null));
		}
	}

	if(this.getId() == EEMain.recall.getId()) {
		if(throwingEntity instanceof EntityPlayer) {
			EntityPlayer player = (EntityPlayer)throwingEntity;
			if(player.getBedLocation() != null) {
				affectedEntity.worldObj.markBlockForUpdate(new BlockPos(player.getBedLocation().getX(), player.getBedLocation().getY() ,player.getBedLocation().getZ()));
				affectedEntity.setPosition(player.getBedLocation().getX(), player.getBedLocation().getY() ,player.getBedLocation().getZ());
				if(affectedEntity instanceof EntityPlayer) {
					EEMain.network.sendTo(new MessageMovePlayer(player.getBedLocation().getX(), player.getBedLocation().getY() ,player.getBedLocation().getZ()), ((EntityPlayerMP) player));
				}
			}
		}
	}

}

 

@Override
	public IMessage onMessage(final MessageMovePlayer message, final MessageContext ctx) {
		IThreadListener mainThread = Minecraft.getMinecraft();
        mainThread.addScheduledTask(new Runnable() {
            @Override
            public void run() {
                Minecraft.getMinecraft().thePlayer.setPosition(message.xPos, message.yPos, message.zPos);
            }
        });
		return null;
	}

 

Any help would be greatly appreciated <3

 

 

Edit: It's also entirely possible this has nothing to do with chunk loading in which case help is definitely appreciated

Posted

I'm not sure about 1.9 but I believe in 1.8 the position for every entity except the player is handled server side, and client side for the player (hence you can move with key inputs from the client). Testing in game has confirmed this for me, although I may still be wrong.

Posted

I believe I spoke too soon. Changing the method to setPositionAndUpdate from setPosition seems to have fixed the problem of the chunk not loading (Even though the comment for that method clearly states that the only thing being updated is the previous position values :/). Thank you for your help :).

The problem of other entities not teleporting and disappearing from existence or teleporting but not rendering at all on arrival persists however.

Posted

This was my attempt at forcing nearby client players to recognize that a new entity has popped into existence near them, but it doesn't seem to work 100% of the time. However, if the entity doesn't render right away, it does after a few seconds.

 

As for entities teleporting into unloaded chunks, you will have to first load the chunk, teleport to it, and then mark the chunk as needing to save to disk. You should be able to do this even if there aren't any players in that chunk.

Posted

Ah excellent, the client is working perfectly with the teleported entities now. Thank you so much for your help. Now just to wrap my head around chunk loading in 1.8 (A smart system I guess, if not a little convoluted) and I'm all set.

 

 

Also, huge fan of the Legend of Zelda so I have to say that you have developed a marvelous mod.

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.