Jump to content

Recommended Posts

Posted (edited)

Edit 3 ======================================================

In general, the answer is:

FMLCommonHandler.instance().getMinecraftServerInstance()

Credits to VoidWalker for this bit of code

End Edit 3 ==================================================

 

 

If I wanted the integrated server instance on a client, I could use this:

Minecraft.getMinecraft().getIntegratedServer()

But for a dedicated server, I cannot find any way to obtain the currently running server instance.

This train of thought spawned from trying to get the dedicated server and integrated server player lists.

Which spawned from trying to determine whether an entity is a player or not WITHOUT using this:

    public static boolean isPlayer(Entity entity)
    {
        Minecraft.getMinecraft().getIntegratedServer()
        return entity instanceof EntityPlayer;
    }

 

Honestly, for the mod I'm making right now, instanceof (though slow) is good enough, but for the future, I would really like to know how to get the running server instance.  Apparently, there used to be a static accessor:

MinecraftServer.getServer()

But it no longer seems to exist!  There IS a non-static accessor (in MinecraftServer.java):

public MinecraftServer getServer()
{
	return this;
}

But obviously in order to use it, you already need the instance!  Isn't this pointless?  My best guess is that someone mistakenly changed the static method to a non-static method?  Am I missing something here?

 

Sorry for the excitement.  Hopefully I'm just missing something obvious.  My current forge version is 14.23.5.2768.

 

 

Edit 1 ======================================================================

With a bit more snooping around in MinecraftServer.java, I found this line (line 976), along with several others similar to it:

return MinecraftServer.this.profiler.profilingEnabled ? MinecraftServer.this.profiler.getNameOfLastSection() : "N/A (disabled)";

 

Notice where it says "MinecraftServer.this...."

I'm guessing someone did a find and replace on a static field that used to exist within MinecraftServer which used to reference a field containing the MinecraftServer instance, which would have been set in its constructor?  I don't know, but it's really triggering my OCD after looking around for the last few hours.

 

Edit 2 =====================================================================

I also found out that the DedicatedServer constructor is only ever called once, inside the main() method of MinecraftServer, assigned to a method-scoped variable and inaccessible from anywhere else, so how on earth are you supposed to access eg. DedicatedServer::getPlayerList()?  I'm really not seeing any way for modders to access the server or playerlist in general?

Edited by Laike_Endaril
Posted (edited)
  public static boolean isPlayer(Entity entity)
    {
        Minecraft.getMinecraft().getIntegratedServer()
        return entity instanceof EntityPlayer;
    }

Uhh... fitst of all this code doesn't even compile. Secondly there is exactly zero need to get a server to determine whether the entity is a player. Even in this snippet you've provided getting the server does absolutely nothing.

 

  On 11/4/2018 at 11:14 PM, Laike_Endaril said:

instanceof (though slow) is good enough

Expand  

instanceof in java8+ is one of the fastest operations the JVM can perform.

 

  On 11/4/2018 at 11:14 PM, Laike_Endaril said:

But obviously in order to use it, you already need the instance!  Isn't this pointless?  My best guess is that someone mistakenly changed the static method to a non-static method?  Am I missing something here?

Expand  

It is kinda useless for the MinecraftServer class itself but different implementations of that class may override the method to do something else.

 

If you want the DedicatedServer you can use FMLServerHandler#getServer, that one is pretty much guaranteed to return a DedicatedServer. However remember that DedicatedServer class only exists on the physical server, so if you access it in any way you need to do it in your server proxy. In a lot of cases a simple MinecraftServer will suffice and you can get that through FMLCommonHander#getMinecraftServerInstance which will return either an IntegratedServer(client) or a DedicatedServer(server). 

Again though, you do not need a server instance for your issue.

 

  On 11/4/2018 at 11:14 PM, Laike_Endaril said:

Notice where it says "MinecraftServer.this...."

I'm guessing someone did a find and replace on a static field that used to exist within MinecraftServer which used to reference a field containing the MinecraftServer instance, which would have been set in its constructor?  I don't know, but it's really triggering my OCD after looking around for the last few hours.

Expand  

Object.this has nothing to do with what you are talking about, it's just a way to access the parent instance of inner non-static class instances. 

Edited by V0idWa1k3r
Posted
  On 11/4/2018 at 11:27 PM, V0idWa1k3r said:

Uhh... fitst of all this code doesn't even compile. Secondly there is exactly zero need to get a server to determine whether the entity is a player. Even in this snippet you've provided getting the server does absolutely nothing.

Expand  

Sorry, part of that code should have been removed, I was only using the first line to exploit intellJ's Ctrl+B lookup.  The actual code there should be:

public static boolean isPlayer(Entity entity)
{
	return entity instanceof EntityPlayer;
}

 

  On 11/4/2018 at 11:27 PM, V0idWa1k3r said:

instanceof in java8+ is one of the fastest operations the JVM can perform.

Expand  

That is wonderful news.  Honestly it's been a while since I did much java, and it used to be horrendously slow, so that makes me feel a bit better.

 

  On 11/4/2018 at 11:27 PM, V0idWa1k3r said:

If you want the DedicatedServer you can use FMLServerHandler#getServer, that one is pretty much guaranteed to return a DedicatedServer. However remember that DedicatedServer class only exists on the physical server, so if you access it in any way you need to do it in your server proxy. In a lot of cases a simple MinecraftServer will suffice and you can get that through FMLCommonHander#getMinecraftServerInstance which will return either an IntegratedServer(client) or a DedicatedServer(server). 

Again though, you do not need a server instance for your issue.

Expand  

This is extremely helpful, so thank you!  I have a lot to say about forge's naming sense though.  Anyone using an IDE class lookup will be searching the word "server" and "FMLCommonHandler" is most certainly not going to appear.  Was that covered in the forge documentation somewhere?  In any case, that's what I was looking for, so thanks again.

 

  On 11/4/2018 at 11:27 PM, V0idWa1k3r said:

Object.this has nothing to do with what you are talking about, it's just a way to access the parent instance of inner non-static class instances.

Expand  

Right, I meant that the functionality of "MinecraftServer.this" would have been identical accessing a theoretically-once-existed-but-no-longer-does static field within MinecraftServer containing the parent instance.

 

Thanks again!

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

    • Cracked Launchers are not supported
    • Hi, I have a problem in minecraft java (only in forge 1.20.1), When I start the game after a moment the game crashed with code 1 this only in forge 1.20.1 , I tried to reinstall java, Upgrade java to 17, update the drivers to the latest version, downgrade the drivers to the pervious version, deleting .minecraft and reinstall it , but none of these ways working.   here is the log:   [Launcher] Launching Minecraft... I'm hiding! mods after C:\Users\Windows\AppData\Roaming\.minecraft\mods\tl_skin_cape_forge_1.20_1.20.1-1.32.jar [InnerMinecraftServersImpl]  search changers of the servers read servers from servers.dat [] [InnerMinecraftServersImpl]  prepare inner servers save servers to servers.dat [Launcher] Game skin type: TLAUNCHER [Launcher] Starting Minecraft Forge 1.20.1... [Launcher] Launching in: C:\Users\Windows\AppData\Roaming\.minecraft Starting garbage collector: 96 / 227 MB Garbage collector completed: 60 / 214 MB [Launcher] Processing post-launch actions. Assist launch: true =============================================================================================== [05:29:03] [main/INFO]: ModLauncher running: args [--username, *********, --version, Forge 1.20.1, --gameDir, C:\Users\Windows\AppData\Roaming\.minecraft, --assetsDir, C:\Users\Windows\AppData\Roaming\.minecraft\assets, --assetIndex, 5, --uuid, *************************************, --accessToken, вќ„вќ„вќ„вќ„вќ„вќ„вќ„вќ„, --clientId, null, --xuid, null, --userType, mojang, --versionType, modified, --width, 925, --height, 530, --launchTarget, forgeclient, --fml.forgeVersion, 47.3.22, --fml.mcVersion, 1.20.1, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20230612.114412] [05:29:04] [main/INFO]: ModLauncher 10.0.9+10.0.9+main.dcd20f30 starting: java version 17.0.12 by Oracle Corporation; OS Windows 10 arch amd64 version 10.0 [05:29:15] [main/INFO]: Loading ImmediateWindowProvider fmlearlywindow [05:29:24] [main/INFO]: Trying GL version 4.6 [05:29:60] [main/INFO]: Requested GL version 4.6 got version 4.6 [05:29:67] [main/INFO]: SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/Windows/AppData/Roaming/.minecraft/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%23100!/ Service=ModLauncher Env=CLIENT FATAL ERROR in native method: Thread[pool-2-thread-1,5,main]: No context is current or a function that is not available in the current context was called. The JVM will abort execution.     at org.lwjgl.opengl.GL11C.nglGetString(org.lwjgl.opengl@3.3.1+7/Native Method)     at org.lwjgl.opengl.GL11C.glGetString(org.lwjgl.opengl@3.3.1+7/GL11C.java:978)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.initRender(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:209)     at net.minecraftforge.fml.earlydisplay.DisplayWindow.lambda$start$5(fmlearlydisplay@1.20.1-47.3.22/DisplayWindow.java:292)     at net.minecraftforge.fml.earlydisplay.DisplayWindow$$Lambda$437/0x000001fab120a618.run(fmlearlydisplay@1.20.1-47.3.22/Unknown Source)     at java.util.concurrent.Executors$RunnableAdapter.call(java.base@17.0.12/Executors.java:539)     at java.util.concurrent.FutureTask.run(java.base@17.0.12/FutureTask.java:264)     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(java.base@17.0.12/ScheduledThreadPoolExecutor.java:304)     at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.12/ThreadPoolExecutor.java:1136)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.12/ThreadPoolExecutor.java:635)     at java.lang.Thread.run(java.base@17.0.12/Thread.java:842) Here I am! [VersionManager] Refreshing versions locally... [VersionManager] Versions has been refreshed (6 ms) [Launcher] Launcher exited. [Launcher] Minecraft closed with exit code: 1 flush now [Launcher] [Crash] Signature "Bad video drivers" matches! [Crash] Signature "Bad video drivers" matches! [Launcher] [Crash] Crash has been recognized! [Crash] Crash has been recognized! flush now
    • https://mclo.gs/9Byd16j Hi, I've had my BetterMC world for a couple days now (1.19.2 vers & Fabric loader) but recently whenever I try to open the profile the minecraft launcher crashes and provides this error code. I've checked both this forum and google and haven't found any similar problems or solution to my problem. I'm not the best at reading crash logs but I gathered that there's an issue with fabric possibly, so I re-downloaded the same one on the modpack, then the latest version for 1.19.2 fabric and the issue still occurred. What can I do now?
    • it works now but idk why lmao. i removed terrablender and it didnt work. i then left it for a couple of days and, when i came back, updated the mods that needed updating because "what's the worst that could happen". i then tried launching it and now it works. i genuenly have no clue what i did to make it work, othen than updating the mods. so, thanks for your help
  • Topics

×
×
  • Create New...

Important Information

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