Jump to content

[Solved] Client-side event when joining a server


Blackop778

Recommended Posts

I want to send a packet to a server whenever I join it. What event should I subscribe to to know when to send the packet? It would be okay if it triggered while joining a single player world too.

 

I considered using an EntityJoinWorldEvent but I only want to trigger it for myself and not for loading other players (would that happen?).

Edited by Blackop778
Link to comment
Share on other sites

What are you sending a packet for?

There's already an event on the server for when a player joins: why is that not sufficient?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

23 minutes ago, Blackop778 said:

I want to send a packet to a server whenever I join it. What event should I subscribe to to know when to send the packet? It would be okay if it triggered while joining a single player world too.

 

Try using FMLNetworkEvent.ClientConnectedToServerEvent. Keep in mind that this is fired on a network thread rather than the main thread, so you need to schedule a task to run on the main thread before you can safely interact with normal Minecraft classes.

 

I'm not entirely sure whether a SimpleNetworkWrapper can be safely used from multiple threads at once.

 

Quote

I considered using an EntityJoinWorldEvent but I only want to trigger it for myself and not for loading other players (would that happen?).

 

You could check that the event's entity is the client player before sending the packet.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

50 minutes ago, Choonster said:

 

Try using FMLNetworkEvent.ClientConnectedToServerEvent. Keep in mind that this is fired on a network thread rather than the main thread, so you need to schedule a task to run on the main thread before you can safely interact with normal Minecraft classes.

 

I'm not entirely sure whether a SimpleNetworkWrapper can be safely used from multiple threads at once.

 

 

You could check that the event's entity is the client player before sending the packet.

Using the code:

@SubscribeEvent
    public void onPlayerJoinedServer(FMLNetworkEvent.ClientConnectedToServerEvent event) {
	Minecraft.getMinecraft().addScheduledTask(new Runnable() {
	    @Override
	    public void run() {
		NETWORKWRAPPER.sendToServer(new HasModMessage());
		MineCalc.LOGGER.info("Joined a server");
	    }
	});
    }

The Logger works but the message never gets received on the server. When I left the server an error is thrown in the client:

Spoiler

[23:59:52] [Client thread/FATAL]: Error executing task
java.util.concurrent.ExecutionException: java.lang.NullPointerException
	at java.util.concurrent.FutureTask.report(FutureTask.java:122) ~[?:1.8.0_121]
	at java.util.concurrent.FutureTask.get(FutureTask.java:192) ~[?:1.8.0_121]
	at net.minecraft.util.Util.runTask(Util.java:26) [Util.class:?]
	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1108) [Minecraft.class:?]
	at net.minecraft.client.Minecraft.run(Minecraft.java:406) [Minecraft.class:?]
	at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_121]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121]
	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_121]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_121]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_121]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_121]
	at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
	at GradleStart.main(GradleStart.java:26) [start/:?]
Caused by: java.lang.NullPointerException
	at net.minecraft.network.play.server.SPacketEntityStatus.getEntity(SPacketEntityStatus.java:56) ~[SPacketEntityStatus.class:?]
	at net.minecraft.client.network.NetHandlerPlayClient.handleEntityStatus(NetHandlerPlayClient.java:1082) ~[NetHandlerPlayClient.class:?]
	at net.minecraft.network.play.server.SPacketEntityStatus.processPacket(SPacketEntityStatus.java:50) ~[SPacketEntityStatus.class:?]
	at net.minecraft.network.play.server.SPacketEntityStatus.processPacket(SPacketEntityStatus.java:12) ~[SPacketEntityStatus.class:?]
	at net.minecraft.network.PacketThreadUtil$1.run(PacketThreadUtil.java:15) ~[PacketThreadUtil$1.class:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_121]
	at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_121]
	at net.minecraft.util.Util.runTask(Util.java:25) ~[Util.class:?]
	... 15 more

 

 

Edited by Blackop778
Link to comment
Share on other sites

It looks like FMLNetworkEvent.ClientConnectedToServerEvent may be too early to send packets, so you should probably use EntityJoinWorldEvent instead.

 

 

19 minutes ago, Blackop778 said:

Caused by: java.lang.NullPointerException
	at net.minecraft.network.play.server.SPacketEntityStatus.getEntity(SPacketEntityStatus.java:56) ~[SPacketEntityStatus.class:?]
	at net.minecraft.client.network.NetHandlerPlayClient.handleEntityStatus(NetHandlerPlayClient.java:1082) ~[NetHandlerPlayClient.class:?]
	at net.minecraft.network.play.server.SPacketEntityStatus.processPacket(SPacketEntityStatus.java:50) ~[SPacketEntityStatus.class:?]
	at net.minecraft.network.play.server.SPacketEntityStatus.processPacket(SPacketEntityStatus.java:12) ~[SPacketEntityStatus.class:?]

 

 

Something is sending an SPacketEntityStatus when there's no client World. Set a breakpoint in the SPacketEntityStatus(Entity, byte) constructor to see where the packet is being sent from.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

Link to comment
Share on other sites

Works great using EntityJoinWorldEvent. I also had that event unregister itself to reduce computation (probably by a minuscule amount) and added it back with 

@SubscribeEvent
    public void onPlayerLeftServer(ClientDisconnectionFromServerEvent event) {
	Minecraft.getMinecraft().addScheduledTask(new Runnable() {
	    @Override
	    public void run() {
		MinecraftForge.EVENT_BUS.register(new ClassThatContainsEntityJoinWorldEventMethod());
	    }
	});
    }

 

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