FireController1847 4 Report post Posted June 6, 2018 (edited) Kind of specific situation, but about two hours of googling has come to no-avail (and this website's search system is horrible, no offence intended.) I need an event to detect when the Client has connected to a Singleplayer world and a Multiplayer world. Here are the specific times I need to know: - When the player has connected to a Singleplayer World. - When the player has connected to a LAN World. - When the player has connected to a Dedicated Server. I also need the player's current dimension in all of the above cases. I've tried using PlayerLoggedInEvent as well as EntityJoinWorldEvent. I got PlayerLoggedIn to work for a singleplayer world, but not a dedicated server. EntityJoinWorldEvent works fine, but I can't seem to find a way to limit it only to the current client. I ALSO need to know every time the player changes a dimension, and when the player has exited the end. This is a CLIENT-SIDE only party of the mod. PlayerChangedDimensionEvent and PlayerRespawnEvent both don't work for the dedicated server. Oh, also, while I'm here and this seems like a small thing to make a thread of so I just want to attribute this to my current messages, how do I get the version of Minecraft without doing Minecraft.getMinecraft().getVersion(); ? Edited June 7, 2018 by FireController1847 Share this post Link to post Share on other sites
Terrails 2 Report post Posted June 6, 2018 (edited) To see if the server is dedicated or integrated just use MinecraftServer#isDedicatedServer... for LAN world I think maybe checking if the server is integrated and MinecraftServer#getPlayerList has 2 or more players. I think you will have to use packets to do something on the client for the change dimension and respawn events. For checking the minecraft version use ForgeVersion.mcVersion (I use that but you can also use MinecraftForge.MC_VERSION or Loader.MC_VERSION since it connects to the same thing) Edited June 6, 2018 by Terrails Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 1 hour ago, FireController1847 said: Logical Server Side (Client) What does this even mean?! From the client there is no way to distinguish between what kind of server you are talking to (integrated or dedicated). And you should not need to care. Why do you care? Please describe what you want to achieve. The events you want are purely server-side and not directly possible on the client. Share this post Link to post Share on other sites
FireController1847 4 Report post Posted June 6, 2018 (edited) I am making a Rich Presence mod for Discord, and one of the things the presence will say is if the user is connected to a server or not. If they are, I'll add the ability to ask others to join. If not, disable it. And apologies for using that terminology, I've edited it to make more sense. Edited June 6, 2018 by FireController1847 Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 14 minutes ago, FireController1847 said: I am making a Rich Presence mod for Discord, and one of the things the presence will say is if the user is connected to a server or not. If they are, I'll add the ability to ask others to join. If not, disable it. And you expect that to work... how? There is no way to know if a server is publicly accessible. Minecraft#currentServerData will give you the server you are currently connected to, it also knows if it is a LAN server. However this will not tell you if the server is public or not. Share this post Link to post Share on other sites
FireController1847 4 Report post Posted June 6, 2018 I don't care if the server is public lol. All that really matters is -- well, what it displays is "Playing Single player" or "Playing Multiplayer" Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 5 minutes ago, FireController1847 said: I don't care if the server is public lol. All that really matters is -- well, what it displays is "Playing Single player" or "Playing Multiplayer" Well, a LAN game is still multiplayer. Share this post Link to post Share on other sites
FireController1847 4 Report post Posted June 6, 2018 Yes, and that is all I'm trying to detect. I just need to know if the user is playing Multiplayer, including LAN, and if the player is playing Singleplayer. To set the presence, I need events when the user changes dimensions and first joins the world. The presence displays the current dimension the player is in. So, when the user joins a world, in a server or not, as well as changing their dimension, in a server or not, I need to update the presence. And each time I also detect if the user is in Singleplayer or Multiplayer. And event for when the user begins Open to LAN would be nice too. Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 (edited) There is no way to play Minecraft without joining a server. If you are playing singleplayer, you have a local server running. You need to understand this concept. The client does not necessarily know it's dimension. Minecraft#player.dimension gives you the best thing known on the client. There are no events for this on the client, you need to continually monitor the data you want to display and update when necessary. Edited June 6, 2018 by diesieben07 Share this post Link to post Share on other sites
FireController1847 4 Report post Posted June 6, 2018 (edited) I do understand this concept. I believe my word choice is making this more confusing than it needs to be. But, just to ensure I understand this concept, let me tell you how I understand it: The client has two sides when you enter a Singleplayer world: Two integrated sides, the Server Side, and the Client Side. You recently told me what both sides are for so I won't repeat that. When connecting to a dedicated server, the client still has two sides, but there is now a third side, or the dedicated server. I am still unsure how the dedicated server talks to the client and integrated server. When hosting a LAN world, the server side just becomes public, I believe. When connecting to a LAN world, it's as if you were on a dedicated and there are three sides. Please correct me if I'm wrong in any of these areas, as even after reading the new documentation on sides it is a little confusing for me. Hopefully now with the information you've provided me, I can achieve the effect I want. It is very much past my bedtime at this point, so any responses after this may come late (but if you respond sooner that's fine, I'll read it in the morning). Thanks for your help so far, and have a good night/day/evening or whatever else it is there. Edited June 6, 2018 by FireController1847 Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 8 minutes ago, FireController1847 said: When connecting to a dedicated server, the client still has two sides, but there is now a third side, or the dedicated server. I am still unsure how the dedicated server talks to the client and integrated server. No. There are always two sides, client and server. If playing single player the server is running as an integrated server on your local machine. When connecting to a dedicated server, the server is running as a dedicated server on the remove machine. When you connect via LAN, you are connecting to someone else's integrated server. There are no two servers. 1 Share this post Link to post Share on other sites
jabelar 585 Report post Posted June 6, 2018 As mentioned the MInecraft#currentServerData probably gives you enough info for what you need. It has a boolean to indicate lan and also contains the IP address of the server. I'm thinking (you should test this) that the IP address would always be the loopback local address (127.0.0.1) in single player mode. So if the isOnLan() method returns true, you know you're on LAN. Otherwise check the serverIP field to see if it is 127.0.0.1 (in which case you'd assume single player) and otherwise assume multiplayer. Share this post Link to post Share on other sites
diesieben07 6116 Report post Posted June 6, 2018 To test for single player check Minecraft#isSingleplayer (will return true whenever the integrated server is running). Share this post Link to post Share on other sites
FireController1847 4 Report post Posted June 7, 2018 Okay, one more question. Now that I have my tick loop running every 2 seconds (or however quickly I want it to update) using the ClientTickEvent, how do I detect if the user is hosting a LAN server? Is this even possible from the client? Share this post Link to post Share on other sites
Silly511 9 Report post Posted June 7, 2018 Minecraft#isSingleplayer will return false if the player is connected to a server, and true if the player is in singleplayer or hosting a LAN world. Minecraft#getIntegratedServer().getPublic() will return true if the player is hosting a LAN world but will throw a NullPointerException if the player is connected to a server. So you could use !mc.isSingleplayer() || mc.getIntegratedServer().getPublic() which will be true if the player is connected to a server or hosting a LAN world and false if the player is in a singleplayer world. 1 Share this post Link to post Share on other sites