Jump to content

[1.12.2] [Solved] Event for connect to singlerplayer world, server world


Recommended Posts

Posted (edited)

I'm trying to make a mod that requires me to detect when the Client joins a Singleplayer world, and when the Client joins a Multiplayer world. I've used PlayerLoggedInEvent, and have checked if world.isRemote (that being said, I'm not sure I fully understand what isRemote is, as it was false every time I connected to a singleplayer world and was never true even when connecting to a server), and that works fine for singleplayer worlds. When I connect to a server, though, the event doesn't even seem to be called. Here's the code I've been testing:
 

@SubscribeEvent
  public void onLogin(PlayerLoggedInEvent event) {
  MCDRP.logger.info("WORKING");
  World world = event.player.getEntityWorld();
  if (!world.isRemote) {
    MCDRP.logger.info("World loaded.");
    // Do stuff for singleplayer world
	return;
  }
  MCDRP.logger.info("Server loaded.");
  System.out.println(world.getMinecraftServer().getName());
}

@SubscribeEvent
public void onLogout(PlayerLoggedOutEvent event) {
  // Handle leaving the server / exiting the world
}

 

What events do I use to separate the singleplayer load from the multiplayer connect?

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted
1 hour ago, FireController1847 said:

(that being said, I'm not sure I fully understand what isRemote is, as it was false every time I connected to a singleplayer world and was never true even when connecting to a server)

isRemote is the difference between the logical client and the logical server. Even single player there is still a server thread (the Integrated Server) with 1 player connected.

PlayerLoggedIn only fires on the logical server.

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.

Posted
Just now, Draco18s said:

isRemote is the difference between the logical client and the logical server. Even single player there is still a server thread (the Integrated Server) with 1 player connected.

PlayerLoggedIn only fires on the logical server.

Ahh, okay, that makes sense. So now my question is what events would I use to be able to seperate the two? I can use PlayerLoggedInEvent for singleplayer, obviously, as it seems to only happen during singleplayer, but what other event will run for first time login on multiplayer? I can't use WorldEvent.Load, as that fires also on changing dimension (as far as I've read & tested), as well as being unable to fetch the player within that event.

I am on my journey of making a remake of matmos, as explained here.

Posted
1 minute ago, FireController1847 said:

as well as being unable to fetch the player within that event.

If you're on the client you can always get access to the client player: Minecraft.getMinecraft().getPlayer()

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.

Posted (edited)

There is no .getPlayer() and .player is null when the event gets called.

 

x4aso.png

This also doesn't solve my issue of the PlayerLoggedInEvent not being called when I connect to a server.

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted

Also, if I were to use WorldEvent.Load, how would I detect if it's a singleplayer world vs a multiplayer world, as it seems the event fires multiple times on the client, as well as having world.isRemote true at one point. Another issue with the WorldEvent.Load is how would I be able to filter out changing dimension? Why can't I just use PlayerLoggedInEvent? :(

I am on my journey of making a remake of matmos, as explained here.

Posted
8 hours ago, FireController1847 said:

There is no .getPlayer() and .player is null when the event gets called.

 

x4aso.png

This also doesn't solve my issue of the PlayerLoggedInEvent not being called when I connect to a server.

Of Course .player is null, The player entity is only being constructed on this event or later

Posted

 Is it possible to get the world and player from the ClientConnectedToServerEvent? Both mc.player and mc.world are null. I need to get the UUID and I want to send a chat message on launch (a client side chat message, I'm making a mostly client side mod).

I am on my journey of making a remake of matmos, as explained here.

Posted (edited)
4 minutes ago, diesieben07 said:

No, you'd have to use WorldEvent.Load for that.

Hmm, okay. That would bring me back to my original question then: 

 

15 hours ago, FireController1847 said:

Also, if I were to use WorldEvent.Load, how would I detect if it's a singleplayer world vs a multiplayer world, as it seems the event fires multiple times on the client, as well as having world.isRemote true at one point. Another issue with the WorldEvent.Load is how would I be able to filter out changing dimension? Why can't I just use PlayerLoggedInEvent? :(

 

I could work up some kind of contraption to set a variable to true on connect and then disable it after world load, but I just want to see if there's an easier way first :P

^ While doing so, it turns out that mc.player is also null on the first world load event.

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted (edited)

As you posted that I was writing this reply! Haha. Here's my entire file of what I've tried. I am making a Discord Rich Presence bot, that when connected to Singleplayer it will show that you're playing singleplayer, and disable the "Ask to join" and "Spectate" buttons, and for a server I want to be able to add "Ask to join" and "Spectate" buttons as well as download the server icon for the rich presence box. To do so, though, I need the UUID of the user and the server IP that way when a user hits the "Ask to join" button it works correctly.

 

Spoiler

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onLogin(PlayerLoggedInEvent event) {
  MCDRP.logger.info("CLIENT LOGIN EVENT");
  World world = event.player.getEntityWorld();
  String worldName = world.getWorldInfo().getWorldName();
  DiscordRichPresence presence = new DiscordRichPresence();
  presence.startTimestamp = System.currentTimeMillis() / 1000;
  presence.state = "Singeplayer";
  presence.largeImageKey = "unknown";
  presence.largeImageText = worldName;
  presence.smallImageKey = "crafting_small";
  presence.smallImageText = Display.getTitle();
  MCDRP.DRPC.setPresence(presence);
  event.player.sendMessage(new TextComponentString(Reference.MOD_PREFIX + "Now broadcasting your world on "
                                                   + TextFormatting.DARK_AQUA + "Discord" + TextFormatting.RESET + " as " + TextFormatting.GOLD + worldName
                                                   + TextFormatting.RESET + "."));
}

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void connectToServerEvent(ClientConnectedToServerEvent event) {
  ServerData data = Minecraft.getMinecraft().getCurrentServerData();
  if (data == null)
    return; // Disable singleplayer load as that's handled above
  Reference.initialConnect = true;
  DiscordRichPresence presence = new DiscordRichPresence();
  presence.startTimestamp = System.currentTimeMillis() / 1000;
  presence.state = "Multiplayer";
  presence.largeImageKey = "unknown";
  presence.largeImageText = (data.serverMOTD != null ? StringUtils.stripControlCodes(data.serverMOTD) : "Unknown Server");
  presence.smallImageKey = "crafting_small";
  presence.smallImageText = Display.getTitle();
  presence.joinSecret = "";
  MCDRP.DRPC.setPresence(presence);
}

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onWorldLoad(WorldEvent.Load event) {
  if (Reference.initialConnect == true) {
    System.out.println(event.getWorld()); // Returns world client
    System.out.println(Minecraft.getMinecraft().player); // Returns null
    Reference.initialConnect = false;
    return;
  }
}

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void disconnectFromServerEvent(ClientDisconnectionFromServerEvent event) {
  DiscordRichPresence presence = new DiscordRichPresence();
  presence.state = "Main Menu";
  presence.largeImageKey = "crafting_large";
  presence.largeImageText = Display.getTitle();
  MCDRP.DRPC.setPresence(presence);
}

 

 

 

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted (edited)
6 hours ago, FireController1847 said:

I could do that, but that still doesn't solve my "getting the Player & World" issue

You mean this?

Minecraft mc = Minecraft.getMinecraft();

EntityPlayer playerIn = mc.thePlayer;
World worldIn = playerIn.world;

 

Edited by Differentiation
Posted
15 hours ago, Differentiation said:

You mean this?


Minecraft mc = Minecraft.getMinecraft();

EntityPlayer playerIn = mc.thePlayer;
World worldIn = playerIn.world;

 

Yea, so when I do something like this:

@SubscribeEvent
@SideOnly(Side.CLIENT)
public void connectToServerEvent(ClientConnectedToServerEvent event) {
  ServerData data = Minecraft.getMinecraft().getCurrentServerData();
  if (data == null)
    return; // Disable singleplayer load as that's handled above
  // Handle stuff
  Minecraft.getMinecraft().player // This is null
  Minecraft.getMinecraft().world // This is null
}

Both .player and .world are null on this event, and I need to get the data from the player.

I am on my journey of making a remake of matmos, as explained here.

Posted

That's because the player doesn't exist yet, that event fires before the connection is finalized and the server creates the player in the world and sends the world information to the client.

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.

Posted (edited)
2 hours ago, Draco18s said:

That's because the player doesn't exist yet, that event fires before the connection is finalized and the server creates the player in the world and sends the world information to the client.

Hence why I would have my issue. I need an event (or some other way way) that does that exact same thing as ClientConnectedToServerEvent, but AFTER the world and player are set.

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted

I don't understand why you try to handle that event for this.

 

Your stated aim is to show something in a GUI right? So just check at the time you draw the GUI. GUI is client side and will have Minecraft.getMinecraft() instance where you can check it it is single player with the isSinglePlayer() and then get the player and world.

 

Why are you checking before you need the information?

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted (edited)

That's not what I'm doing at all, actually, as seen in this video on my YouTube channel, it explains what I am trying to do. (Read this after watching): As you can see, I need to get the player for the "Ask to Join" buttons and "Spectate" buttons. The reason being is the encrypted code I need to set for Discord is "UUID_MODID_SERVERIP", so I need the user for the UUID. I can get the server data, that's easy. I'm not making a GUI whatsoever.

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted

So your video says you want to make a GUI. Any time you're talking about a button, for spectate or join or whatever, that is a GUI. 

 

Maybe I'm crazy but I think you are saying you want to enable different buttons based on whether the game is multiplayer or single player, and maybe other information. Are you not trying to change buttons?

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Posted
10 hours ago, jabelar said:

So your video says you want to make a GUI. Any time you're talking about a button, for spectate or join or whatever, that is a GUI. 

 

Maybe I'm crazy but I think you are saying you want to enable different buttons based on whether the game is multiplayer or single player, and maybe other information. Are you not trying to change buttons?

I have a feeling he wants to create a button on the main menu that will send a message to a particular server, and if the admin of that server replies with a "yes" then the client automatically connects to that server.

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.

Posted (edited)

Nonono, okay, I am making nothing that has to do with a GUI xD

Discord has these things called "games" that when you're playing a game, under your username it will say "Playing <game name>". Recently, though, Discord added this thing called "Rich Presence", that allows game creators (or modders, like me) to give more information about the game, so instead of it just saying "Playing <game name>" it can show up with something like seen in the video. (With the server icon as the big square, and the crafting table as the small logo).

In this menu, Discord allows game creators to add two buttons: "Ask to Join" and "Spectate". The Ask to Join button can be seen on a profile when someone is playing the game (they have an example of it here). When someone clicks the Ask to Join button, it will launch Minecraft and put them directly into the same server as the user. The issue is, the Ask to Join button requires an encrypted code to match up players to the correct servers. This code I need to make is a mix between the player's UUID, the mod ID, and the IP of the server, hence why I said UUID_MODID_SERVERIP. When another user on Discord sees your profile and clicks "Ask to Join", it will take the code, put it in the launch options of THEIR game, and then I need to decode it into where I can add the player to the server.

For the Spectate button, it's the same issue. I need the UUID_MODID_SERVERIP-"SPECTATE" to be my "encrypted code", where it will force the user into spectate mode. I am making nothing that has to do with the Minecraft title screen or GUI, but integration with Discord (the chat engine)'s Rich Presence, which you can click here for the link to the Rich Presence Documentation.

Although, yes, you did get what happens on the Ask to Join part correct. It will send a client side message where the user can say yes or no, and then it connects them to the game (although I'm still not 100% sure how the Ask to Join button works).

Here's some images of what I'm talking about.

Spoiler

Normal Game

dE0eHkx.png

 

Rich Presence

VtdU6yU.png

 

Spectate and Ask to Join buttons

ieTTcNv.png

Normal Game & Profile

ov064tU.gif

 

Rich Presence & Profile

UMupDpC.gif

 

Edited by FireController1847

I am on my journey of making a remake of matmos, as explained here.

Posted
13 hours ago, FireController1847 said:

Nonono, okay, I am making nothing that has to do with a GUI xD

... In this menu, Discord allows game creators to add two buttons: "Ask to Join" and "Spectate". ...  to give more information about the game, so instead of it just saying "Playing <game name>" it can show up with something like seen in the video. (With the server icon as the big square, and the crafting table as the small logo).

Okay, all that stuff (buttons, showing information, icons and logos) are in fact a GUI. But what you're saying is that that GUI is outside minecraft and you want to send information to the interface that maintains that GUI.

 

The problem with the events you were trying to use is they didn't have the information you needed. So as diesieben07 is recommending you can basically "poll" until the information is available in a tick event (with the client tick being the most obvious choice).

 

 

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

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.