Jump to content
  • Home
  • Files
  • Docs
Topics
  • All Content

  • This Topic
  • This Forum

  • Advanced Search
  • Existing user? Sign In  

    Sign In



    • Not recommended on shared computers


    • Forgot your password?

  • Sign Up
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [Solved] [1.12.2] How to detect when player joins Singleplayer vs Multiplayer?
The update for 1.13 is being worked on - please be patient. (Updated 02/19/19)
1.13 Update Notes for Mod Creators
Sign in to follow this  
Followers 1
FireController1847

[Solved] [1.12.2] How to detect when player joins Singleplayer vs Multiplayer?

Started by FireController1847, June 6, 2018

15 posts in this topic

FireController1847    4

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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

Terrails

Terrails    2

  • Creeper Killer
  • Terrails
  • Members
  • 2
  • 185 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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.

  • Thanks 1

Share this post


Link to post
Share on other sites

jabelar    584

jabelar

jabelar    584

  • Reality Controller
  • jabelar
  • Members
  • 584
  • 3266 posts
  • 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    6114

diesieben07

diesieben07    6114

  • Reality Controller
  • diesieben07
  • Forum Team
  • 6114
  • 40244 posts
  • 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

FireController1847

FireController1847    4

  • Creeper Killer
  • FireController1847
  • Members
  • 4
  • 247 posts
  • 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

Silly511

Silly511    9

  • Creeper Killer
  • Silly511
  • Members
  • 9
  • 176 posts
  • 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.

  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  
Followers 1
Go To Topic Listing Modder Support

  • Recently Browsing

    No registered users viewing this page.

  • Posts

    • MewPixelstarz
      Help Please

      By MewPixelstarz · Posted 6 minutes ago

      It says downloading minecraft server failed invalid e-tag checksum.
    • Cadiboo
      Error when installing forge-1.13.2-25.0.45-installer

      By Cadiboo · Posted 9 minutes ago

      Update it, you’re nearly 200 versions behind
    • MewPixelstarz
      Help Please

      By MewPixelstarz · Posted 9 minutes ago

      It did not work an error popped up
    • RedBullSlurpie
      Error when installing forge-1.13.2-25.0.45-installer

      By RedBullSlurpie · Posted 10 minutes ago

      Java version 1.8.0_31
    • DaemonUmbra
      Help Please

      By DaemonUmbra · Posted 19 minutes ago

      Ok so it's as simple as installing a Forge server into your server folder. Just get the correct installer version, run it, select the option to install a server, and set the location to your server folder.
  • Topics

    • MewPixelstarz
      11
      Help Please

      By MewPixelstarz
      Started 46 minutes ago

    • RedBullSlurpie
      5
      Error when installing forge-1.13.2-25.0.45-installer

      By RedBullSlurpie
      Started 4 hours ago

    • Ankh
      0
      Adding texture for Barrier Blocks?

      By Ankh
      Started 38 minutes ago

    • Benny
      1
      A fatal error has occurred, this connection is terminated.

      By Benny
      Started 1 hour ago

    • kl1230
      1
      1.13 working but 1.12.2 freezes system

      By kl1230
      Started 4 hours ago

  • Who's Online (See full list)

    • cente
    • Cadiboo
    • MewPixelstarz
    • RedBullSlurpie
    • daruskiy
    • Ankh
    • Kaelym
    • nyuppo
    • Stephezcag
    • DaemonUmbra
    • Trhod177
  • All Activity
  • Home
  • Mod Developer Central
  • Modder Support
  • [Solved] [1.12.2] How to detect when player joins Singleplayer vs Multiplayer?
  • Theme
  • Contact Us

Copyright © 2017 ForgeDevelopment LLC Powered by Invision Community