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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • But your Launcher does not find it   Java path is: /run/user/1000/doc/3f910b8/java Checking Java version... Java checker returned some invalid data we don't understand: Check the Azul Zulu site and select your OS and download the latest Java 8 build for Linux https://www.azul.com/downloads/?version=java-8-lts&package=jre#zulu After installation, check the path and put this path into your Launcher Java settings (Java Executable)
    • Try other builds of pehkui and origins++ until you find a working combination
    • Some Create addons are only compatible with Create 6 or Create 5 - so not both versions at the same time Try older builds of Create Stuff and Additions This is the last build before the Create 6 update: https://www.curseforge.com/minecraft/mc-mods/create-stuff-additions/files/6168370
    • ✅ Crobo Coupon Code: 51k3b0je — Get Your \$25 Amazon Gift Card Bonus! If you’re new to Crobo and want to make the most out of your first transaction, you’ve come to the right place. The **Crobo coupon code: 51k3b0je** is a fantastic way to get started. By using this code, you can unlock an exclusive **\$25 Amazon gift card** after completing your first eligible transfer. Let’s dive deep into how the **Crobo coupon code: 51k3b0je** works, why you should use it, and how to claim your reward. --- 🌟 What is Crobo? Crobo is a trusted, modern platform designed for **international money transfers**. It offers fast, secure, and low-cost transactions, making it a favorite choice for individuals and businesses alike. Crobo is committed to transparency, low fees, and competitive exchange rates. And with promo deals like the **Crobo coupon code: 51k3b0je**, it becomes even more attractive. Crobo focuses on providing customers with: * Quick transfer speeds * Minimal fees * Safe, encrypted transactions * Great referral and promo code rewards When you choose Crobo, you’re choosing a platform that values your time, money, and loyalty. And now with the **Crobo coupon code: 51k3b0je**, you can start your Crobo journey with a **bonus reward**! ---# 💥 What is the Crobo Coupon Code: 51k3b0je? The **Crobo coupon code: 51k3b0je** is a **special promotional code** designed for new users. By entering this code during signup, you’ll be eligible for: ✅ A **\$25 Amazon gift card** after your first qualifying transfer. ✅ Access to Crobo’s referral system to earn more rewards. ✅ The ability to combine with future seasonal Crobo discounts. Unlike generic promo codes that just offer small fee reductions, the **Crobo coupon code: 51k3b0je** directly gives you a tangible, valuable reward — perfect for online shopping or gifting. --- ### 🎯 Why Use Crobo Coupon Code: 51k3b0je? There are many reasons why users choose to apply the **Crobo coupon code: 51k3b0je**: 🌟 **Free bonus reward** — Your first transfer can instantly earn you a \$25 Amazon gift card. 🌟 **Trusted platform** — Crobo is known for secure, fast, and affordable transfers. 🌟 **Easy to apply** — Simply enter **Crobo coupon code: 51k3b0je** at signup — no complicated steps. 🌟 **Referral opportunities** — Once you’ve used **Crobo coupon code: 51k3b0je**, you can invite friends and earn more rewards. 🌟 **Stackable savings** — Pair **Crobo coupon code: 51k3b0je** with Crobo’s ongoing offers or holiday deals for even more benefits. --- ### 📝 How to Use Crobo Coupon Code: 51k3b0je Getting started with **Crobo coupon code: 51k3b0je** is quick and easy. Just follow these steps: 1️⃣ **Download the Crobo app** (available on Google Play Store and Apple App Store) or visit the official Crobo website. 2️⃣ **Start the sign-up process** by entering your basic details (name, email, phone number, etc.). 3️⃣ When prompted, enter **Crobo coupon code: 51k3b0je** in the promo code or coupon code field. 4️⃣ Complete your first transaction — be sure to meet the minimum amount required to qualify for the reward (usually specified in Crobo’s promo terms). 5️⃣ After the transaction is verified, receive your **\$25 Amazon gift card** directly via email or within your Crobo account. --- ### 💡 Tips to Maximize Your Crobo Coupon Code: 51k3b0je Bonus 👉 **Transfer the minimum qualifying amount or more** — this ensures you meet the conditions for the gift card. 👉 **Refer friends after your signup** — Crobo allows users who’ve signed up with codes like **Crobo coupon code: 51k3b0je** to share their own code for extra bonuses. 👉 **Check for additional Crobo promotions** — sometimes Crobo offers seasonal or regional deals that stack with the coupon code. 👉 **Complete your transaction soon after signup** — many bonuses have time limits, so act quickly! --- ### 🚀 Frequently Asked Questions about Crobo Coupon Code: 51k3b0je **Q: Can I use Crobo coupon code: 51k3b0je if I already have a Crobo account?** A: No — the **Crobo coupon code: 51k3b0je** is intended for **new users only**. It must be applied during the initial registration process. --- **Q: How long does it take to get the \$25 Amazon gift card after using Crobo coupon code: 51k3b0je?** A: Typically, the gift card is sent **within a few business days** after your first qualifying transfer is completed and verified. --- **Q: Are there hidden fees when using Crobo coupon code: 51k3b0je?** A: No — Crobo is transparent about its fees. The **Crobo coupon code: 51k3b0je** simply adds a bonus reward without increasing your costs. --- **Q: Can I combine Crobo coupon code: 51k3b0je with other promo codes?** A: The **Crobo coupon code: 51k3b0je** is generally applied as a standalone signup bonus. However, Crobo often offers **ongoing promotions** that may apply to future transactions. ---  📌 Reference Crobo promo code: {51k3b0je} Crobo discount code: {51k3b0je} --- # 🌍 Final Thoughts If you want to enjoy safe, fast, and affordable money transfers with an added bonus, **Crobo coupon code: 51k3b0je** is your best option. Not only will you experience excellent service, but you’ll also earn a **\$25 Amazon gift card** — a reward that you can use immediately for shopping or gifts. 👉 **Don’t wait — sign up today using Crobo coupon code: 51k3b0je and claim your bonus!**
  • Topics

×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.