Blackop778 Posted March 2, 2017 Posted March 2, 2017 (edited) 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 March 3, 2017 by Blackop778 Quote
Draco18s Posted March 2, 2017 Posted March 2, 2017 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? Quote 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.
Choonster Posted March 2, 2017 Posted March 2, 2017 On 3/2/2017 at 4:50 AM, 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. Expand 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?). Expand You could check that the event's entity is the client player before sending the packet. Quote 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.
Blackop778 Posted March 2, 2017 Author Posted March 2, 2017 On 3/2/2017 at 5:13 AM, Draco18s said: 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? Expand Quote
Blackop778 Posted March 2, 2017 Author Posted March 2, 2017 (edited) On 3/2/2017 at 5:18 AM, 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. Expand 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: Reveal hidden contents [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 March 2, 2017 by Blackop778 Quote
Choonster Posted March 2, 2017 Posted March 2, 2017 It looks like FMLNetworkEvent.ClientConnectedToServerEvent may be too early to send packets, so you should probably use EntityJoinWorldEvent instead. On 3/2/2017 at 6:07 AM, 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:?] Expand 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. Quote 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.
Blackop778 Posted March 3, 2017 Author Posted March 3, 2017 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()); } }); } Quote
Recommended Posts
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.