Posted March 2, 20178 yr 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, 20178 yr by Blackop778
March 2, 20178 yr 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.
March 2, 20178 yr 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.
March 2, 20178 yr Author 18 minutes ago, 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?
March 2, 20178 yr Author 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 March 2, 20178 yr by Blackop778
March 2, 20178 yr 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.
March 3, 20178 yr Author 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()); } }); }
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.