Paper icon indicating copy to clipboard operation
Paper copied to clipboard

Unable to use non-legacy Random Number Generator Algorithms

Open Aaron2550 opened this issue 1 year ago • 7 comments

Expected behavior

  • Using an RNG Algorithm like Xoroshiro128PlusPlus works fine
RandomGenerator rng = RandomGenerator.of("Xoroshiro128PlusPlus");
Bukkit.getLogger().info("Number: " + rng.nextInt());

Observed/Actual behavior

  • Using an RNG Algorithm like Xoroshiro128PlusPlus does not work
  • Only the Legacy Algorithms like Random and SplittableRandom work

Steps/models to reproduce

  • Create Basic Plugin
  • Run Server
  • See Error
[08:56:32 ERROR]: Error occurred while enabling TestRandom v1.0-SNAPSHOT (Is it up to date?)
java.lang.IllegalArgumentException: No implementation of the random number generator algorithm "Xoroshiro128PlusPlus" is available
	at java.util.random.RandomGeneratorFactory.findProvider(RandomGeneratorFactory.java:226) ~[?:?]
	at java.util.random.RandomGeneratorFactory.of(RandomGeneratorFactory.java:254) ~[?:?]
	at java.util.random.RandomGenerator.of(RandomGenerator.java:123) ~[?:?]
	at org.test.testrandom.TestRandomPlugin.onEnable(TestRandomPlugin.java:12) ~[TestRandom-1.0-SNAPSHOT.jar:?]
	at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:281) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
	at io.papermc.paper.plugin.manager.PaperPluginInstanceManager.enablePlugin(PaperPluginInstanceManager.java:190) ~[paper-1.20.4.jar:git-Paper-370]
	at io.papermc.paper.plugin.manager.PaperPluginManagerImpl.enablePlugin(PaperPluginManagerImpl.java:104) ~[paper-1.20.4.jar:git-Paper-370]
	at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:507) ~[paper-api-1.20.4-R0.1-SNAPSHOT.jar:?]
	at org.bukkit.craftbukkit.v1_20_R3.CraftServer.enablePlugin(CraftServer.java:637) ~[paper-1.20.4.jar:git-Paper-370]
	at org.bukkit.craftbukkit.v1_20_R3.CraftServer.enablePlugins(CraftServer.java:548) ~[paper-1.20.4.jar:git-Paper-370]
	at net.minecraft.server.MinecraftServer.loadWorld0(MinecraftServer.java:673) ~[paper-1.20.4.jar:git-Paper-370]
	at net.minecraft.server.MinecraftServer.loadLevel(MinecraftServer.java:433) ~[paper-1.20.4.jar:git-Paper-370]
	at net.minecraft.server.dedicated.DedicatedServer.initServer(DedicatedServer.java:308) ~[paper-1.20.4.jar:git-Paper-370]
	at net.minecraft.server.MinecraftServer.runServer(MinecraftServer.java:1132) ~[paper-1.20.4.jar:git-Paper-370]
	at net.minecraft.server.MinecraftServer.lambda$spin$0(MinecraftServer.java:321) ~[paper-1.20.4.jar:git-Paper-370]
	at java.lang.Thread.run(Thread.java:840) ~[?:?]
[08:56:32 INFO]: [TestRandom] Disabling TestRandom v1.0-SNAPSHOT

Plugin and Datapack List

  • The Test Plugin

Paper version

This server is running Paper version git-Paper-370 (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 1fa48d1)

Other

  • Tested with OpenJDK 21, OpenJDK 17 and Temurin 17 on Arch Linux and Temurin 17 on Windows 11
  • Works fine on Fabric and in a Console Program
  • https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/random/package-summary.html#algorithms

Aaron2550 avatar Jan 03 '24 08:01 Aaron2550

if I had to guess, I would imagine that this is generally down to how the program is bootstrapped, i.e. plugins and MC itself are launched in their own classloader which doesn't inherit the app/system/whatever it's called now classloader

electronicboy avatar Jan 03 '24 08:01 electronicboy

afaik this is only an issue when the server is ran through paperclip and not with the bundler jar, but at the same time craftbukkit's jar bootstrapping mechanism does not align with vanilla's (by using the app's CL) whereas paperclip's does (by using the app's parent CL)

emilyy-dev avatar Jan 03 '24 14:01 emilyy-dev

I tried with both, jpenilla's run-server gradle plugin, and just java <...> -jar <downloaded paper jar>, both of those are/use paperclip then, i assume...

Aaron2550 avatar Jan 03 '24 14:01 Aaron2550

@emilyy-dev Tried bundler jar but no luck.

skbeh avatar Jan 15 '24 13:01 skbeh

the bundler jar won't change anything, the bootstrappers do not pass in the full classloaders as those java APIs expect

electronicboy avatar Jan 15 '24 13:01 electronicboy

@electronicboy Then why not?

skbeh avatar Jan 15 '24 13:01 skbeh

Because that is how mojang designed it and how it's worked for years now afaik

electronicboy avatar Jan 15 '24 13:01 electronicboy