Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

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


Arsleust
 Share

Recommended Posts

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 ?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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

 Share



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Im trying to make a moddes server with my friends but every single time we get same error https://pastebin.com/UP6P6YSd Is there a way to fix it? Thanks for solutions
    • Take a break, go for a walk. Then try again. 🙂
    • Where did you see that? Sorry if I am being a bother, it's just that I have been staring at this mod for a long time and I'm probably looking over a lot of things
    • Taking a look at AbstractContainerScreen.renderSlot() I got the following code: Method created in my AbstractContainerScreen class: private void renderCustomSlot(PoseStack poseStack,ItemStack itemstack,int x, int y) { boolean visible = true; boolean hover = false; this.setBlitOffset(100); this.itemRenderer.blitOffset = 100.0F; if (visible) { if (hover) { //Draw a rectangle behind the item fill(poseStack, x, y, x + 16, y + 16, -2130706433); } //Render item icon RenderSystem.enableDepthTest(); this.itemRenderer.renderAndDecorateItem(this.minecraft.player, itemstack, x, y, x + y * this.imageWidth); //Render item string count PoseStack posestack = new PoseStack(); if (itemstack.getCount() != 1) { String s = String.valueOf(itemstack.getCount()); posestack.translate(0.0D, 0.0D, itemRenderer.blitOffset + 200.0F); MultiBufferSource.BufferSource multibuffersource$buffersource = MultiBufferSource.immediate(Tesselator.getInstance().getBuilder()); /* float scale; if (s.length()<3){ scale=1f; }else if (s.length()<4){ scale = 0.75f; }else { scale=0.5f; s = s.substring(0,s.length()-3)+"k"; } float compensatingScale = 1/scale; float stringX = (x + 19f - 2 - font.width(s)*scale)*compensatingScale; float stringY =(y + 6f + 3)*compensatingScale; posestack.scale(scale,scale,scale); */ float stringX = (x + 19f - 2 - font.width(s)); float stringY =(y + 6f + 3); font.drawInBatch(s,stringX,stringY,16777215, true, posestack.last().pose(), multibuffersource$buffersource, false, 0, 15728880); //posestack.scale(compensatingScale,compensatingScale,compensatingScale); multibuffersource$buffersource.endBatch(); } } this.itemRenderer.blitOffset = 0.0F; this.setBlitOffset(0); } Now it works correctly: Thanks to warjort for the tip!
    • Hello, I am currently trying to get a forge server setup so I can play the Pixelmon mod with some friends on a private server and have run into some issues with launching my forge server file, I downloaded the forge 12.2.2-14.23.5.2859 installer, downloaded it into a folder on my desktop, ran the Mc server file, agreed to Eula, made a run.bat file to launch the forge server at 6GBs, and when I try launching I get this issue: Pixelmon Server>java -Xmx6144M -Xms6144M -jar forge-1.12.2-14.23.5.2859-universal.jar --nogui We appear to be missing one or more essential library files. You will need to add them to your server before FML and Forge will run successfully.java.lang.ClassNotFoundException: org.objectweb.asm.Type         at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:636)         at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:182)         at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:519)         at java.base/java.lang.Class.forName0(Native Method)         at java.base/java.lang.Class.forName(Class.java:466)         at net.minecraftforge.fml.relauncher.ServerLaunchWrapper.run(ServerLaunchWrapper.java:53)         at net.minecraftforge.fml.relauncher.ServerLaunchWrapper.main(ServerLaunchWrapper.java:34)   I've tried using another minecraft server jar file from a different source to see if that would solve anything but its still coming up with this issue. Any help is greatly appreciated, thanks for your help in advance.
  • Topics

×
×
  • Create New...

Important Information

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