Jump to content

[1.9.4][SOLVED] Same entity has different worlds depending on the call


Recommended Posts

Posted

Hello, I want to modify the player view point to the one of a custom entity.

 

So i just do :

public class SoulstickEventListener {

@SideOnly(Side.CLIENT)
@SubscribeEvent
public void entityInteract(EntityInteract event) {
	if(event.getTarget() != null) {
		if(event.getTarget() instanceof EntityPhantom) {
			if(event.getItemStack() != null && event.getItemStack().getItem() == ModItems.soulstick) {
				Minecraft.getMinecraft().setRenderViewEntity(event.getTarget());
			}
		}
	}
}

}

 

The viewpoint is correctly change but I can only see the entity face so I want to prevent the render if the pov is from the entity that tries to be rendered. I have a Render class like that :

 

public class RendererPhantom extends RenderBiped<EntityPhantom> {

public static final ResourceLocation PHANTOM_TEXTURES = new ResourceLocation(References.MOD_ID + ":textures/entities/phantom.png");

public RendererPhantom(RenderManager renderManager) {
	super(renderManager, new ModelPlayer(0.0F, false), 0.5F);
}

@Override
protected ResourceLocation getEntityTexture(EntityPhantom entity) {
	return PHANTOM_TEXTURES;
}

@Override
public void doRender(EntityPhantom entity, double x, double y, double z, float entityYaw, float partialTicks) {
	if(!(getRenderManager().renderViewEntity.isEntityEqual(entity))) {
		// DEBUG
		System.out.println(getRenderManager().renderViewEntity);
		System.out.println(entity);
		super.doRender(entity, x, y, z, entityYaw, partialTicks);
	}
}

}

 

Now this is where it gets tricky, this does not prevent the render because i get in the log :

[15:35:04] [Client thread/INFO] [sTDOUT]: [com.arsleust.aimod.renderers.RendererPhantom:doRender:31]: EntityPhantom['entity.aimod.EntityPhantom.name'/502, l='New World', x=1,00, y=70,00, z=5,00]

[15:35:04] [Client thread/INFO] [sTDOUT]: [com.arsleust.aimod.renderers.RendererPhantom:doRender:32]: EntityPhantom['entity.aimod.EntityPhantom.name'/502, l='MpServer', x=1,00, y=70,00, z=5,00]

 

So the first call getRenderManager().renderViewEntity gives the entity but says it is in world "New World" (which is right) but the entity given to my doRender is said to be in world "MpServer" (which is weird).

 

Anyone would know the cause ?

Posted

I think you messed up sides/threads :)

 

In your interaction event you assigned entity of other thread as your render view.

More directly - you set entity owned by server thread as render view which should be client-side entity.

 

Then your render class is using "getRenderManager().renderViewEntity" from server side, but "entity" from client side.

 

I am quite amazed that you didn't get some crash or concurrency.

 

Anyway - when assigning render view - always use client side entity. (world.isRemote)

 

Also - I am not sure on what side (or if both) interaction event is fired, but just make sure you do it from client. If it is fired only by server, then you will need to send packet from server to client saying "please set entity with ID to your renderView".

 

EDIT

 

Now that I think about it - you WILL have to send packet, at least for safety reasons.

 

Proper design/approach: (seriously, you should rewrite)

1. Use your Item (soulItem) class and override #itemInteractionForEntity.

2. ONLY ON SERVER: (!world.isRemote)

3. Check if entity is your EntityPhantom

4. If so - check needed stuff (NBT) and send packet to client (player using item) with entity ID.

5. In packet handler get entity (World#getEntityFromID) and set it as renderView.

 

Note: example of itemInteractionForEntity can be found in ItemShears (sheeps) :)

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

Posted

Thank you for the quick answer, I will try to do like that :)

 

EDIT : About server/client behaviors and my game not crashing, render methods are called only client side and i used @SideOnly(Side.CLIENT) for the listener part.

 

So I still don't get why there are different worlds.

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.