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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Oh I forgot to update the title. I figured out the issue and I'm rather embarrassed to say that it was a file path issue. The game already knew I was accessing the achievements so I wasn't suppose to include advancements in the file path. Minecraft file paths have always confused me a little bit... ResourceLocation advancementId = new ResourceLocation( TheDeadRise.MODID,"adventure/spawntrigger");
    • Can someone help my with this? My forge server won't open and I'm not that good with this stuff. It gave me this error message:   C:\Users\apbeu\Desktop\Forge server>java -Xmx4G -Xms1G -jar server.jar nogui 2024-12-11 18:21:01,054 main WARN Advanced terminal features are not available in this environment [18:21:01] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher running: args [--gameDir, ., --launchTarget, fmlserver, --fml.forgeVersion, 36.2.34, --fml.mcpVersion, 20210115.111550, --fml.mcVersion, 1.16.5, --fml.forgeGroup, net.minecraftforge, nogui] [18:21:01] [main/INFO] [cp.mo.mo.Launcher/MODLAUNCHER]: ModLauncher 8.1.3+8.1.3+main-8.1.x.c94d18ec starting: java version 21.0.4 by Oracle Corporation Exception in thread "main" java.lang.IllegalAccessError: class cpw.mods.modlauncher.SecureJarHandler (in unnamed module @0x402e37bc) cannot access class sun.security.util.ManifestEntryVerifier (in module java.base) because module java.base does not export sun.security.util to unnamed module @0x402e37bc         at cpw.mods.modlauncher.SecureJarHandler.lambda$static$1(SecureJarHandler.java:45)         at cpw.mods.modlauncher.api.LamdbaExceptionUtils.uncheck(LamdbaExceptionUtils.java:95)         at cpw.mods.modlauncher.SecureJarHandler.<clinit>(SecureJarHandler.java:45)         at cpw.mods.modlauncher.Launcher.lambda$new$6(Launcher.java:55)         at java.base/java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1708)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:52)         at cpw.mods.modlauncher.api.TypesafeMap.computeIfAbsent(TypesafeMap.java:47)         at cpw.mods.modlauncher.Environment.computePropertyIfAbsent(Environment.java:62)         at cpw.mods.modlauncher.Launcher.<init>(Launcher.java:55)         at cpw.mods.modlauncher.Launcher.main(Launcher.java:66)         at net.minecraftforge.server.ServerMain$Runner.runLauncher(ServerMain.java:63)         at net.minecraftforge.server.ServerMain$Runner.access$100(ServerMain.java:60)         at net.minecraftforge.server.ServerMain.main(ServerMain.java:57) C:\Users\apbeu\Desktop\Forge server>pause
    • Here is the url for the crash report if anyone can help me, please. https://mclo.gs/KGn5LWy  
    • Every single time I try and open my modpack it crashes before the game fully opens and I don't know what is wrong. I open the crash logs but I don't understand what any of it means. What do I do?
    • Hey, sorry I haven't said anything in a while. I was banned on here for sending you straight up crash logs and they banned me for spam... but I learned that these forums are for forge only and I was working with neoforge... but thank you for all the help.
  • Topics

  • Who's Online (See full list)

×
×
  • Create New...

Important Information

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