From aa77a66c7673bf249a7d1fdc11b92a0a1e02db3f Mon Sep 17 00:00:00 2001 From: Joe Date: Wed, 22 Jan 2020 14:00:55 +0000 Subject: [PATCH] Port seed selector to fabric --- gradle.properties | 2 +- .../seedselector/mixin/MixinMinecraft.java | 57 ++++++++++++++++++ .../worldgentests/mixin/MixinMinecraft.java | 17 ------ .../{worldgentests => seedselector}/icon.png | Bin src/main/resources/fabric.mod.json | 12 ++-- ...s.mixins.json => seedselector.mixins.json} | 2 +- 6 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 src/main/java/net/earthcomputer/seedselector/mixin/MixinMinecraft.java delete mode 100644 src/main/java/net/earthcomputer/worldgentests/mixin/MixinMinecraft.java rename src/main/resources/assets/{worldgentests => seedselector}/icon.png (100%) rename src/main/resources/{worldgentests.mixins.json => seedselector.mixins.json} (75%) diff --git a/gradle.properties b/gradle.properties index da70b2c..539a51c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -9,5 +9,5 @@ org.gradle.jvmargs=-Xmx1G # Mod Properties mod_version = 1.0.0 maven_group = net.earthcomputer - archives_base_name = world-gen-tests + archives_base_name = seed-selector diff --git a/src/main/java/net/earthcomputer/seedselector/mixin/MixinMinecraft.java b/src/main/java/net/earthcomputer/seedselector/mixin/MixinMinecraft.java new file mode 100644 index 0000000..160db84 --- /dev/null +++ b/src/main/java/net/earthcomputer/seedselector/mixin/MixinMinecraft.java @@ -0,0 +1,57 @@ +package net.earthcomputer.seedselector.mixin; + +import net.minecraft.client.Minecraft; +import net.minecraft.src.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import javax.swing.*; +import java.io.File; + +@Mixin(Minecraft.class) +public abstract class MixinMinecraft { + + @Shadow public static File func_6240_b() { + return null; + } + + @Shadow public abstract void func_6261_a(World var1); + + @Shadow public abstract void func_6263_a(World var1, String var2); + + @Inject(method = "func_6247_b", at = @At("HEAD"), cancellable = true) + private void onRun(String worldName, CallbackInfo ci) { + File levelDat = new File(func_6240_b(), "saves/" + worldName + "/level.dat"); + if (!levelDat.exists()) { + String answer = JOptionPane.showInputDialog(null, "Ender seed (leave blank for no seed)"); + if (answer != null && !answer.isEmpty()) { + long seed; + try { + seed = Long.parseLong(answer); + } catch (NumberFormatException e) { + seed = answer.hashCode(); + } + if (!validSeed(seed)) + JOptionPane.showMessageDialog(null, "Note: this seed could not have been generated normally", "Warning", JOptionPane.WARNING_MESSAGE); + + func_6261_a(null); + System.gc(); + World world = new World(new File(func_6240_b(), "saves"), worldName, seed); + if (world.field_1033_r) { + func_6263_a(world, "Generating level"); + } else { + func_6263_a(world, "Loading level"); + } + + ci.cancel(); + } + } + } + + // https://twitter.com/Geosquare_/status/1169623192153010176 + boolean validSeed(long a){long b=18218081,c=1L<<48,d=7847617,e=((((d*((24667315*(a>>>32)+b*(int)a+67552711)>>32)-b*((-4824621*(a>>>32)+d*(int)a+d)>>32))-11)*0xdfe05bcb1365L)%c);return((((0x5deece66dl*e+11)%c)>>16)<<32)+(int)(((0xbb20b4600a69L*e+0x40942de6baL)%c)>>16)==a;} + +} diff --git a/src/main/java/net/earthcomputer/worldgentests/mixin/MixinMinecraft.java b/src/main/java/net/earthcomputer/worldgentests/mixin/MixinMinecraft.java deleted file mode 100644 index d827c47..0000000 --- a/src/main/java/net/earthcomputer/worldgentests/mixin/MixinMinecraft.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.earthcomputer.worldgentests.mixin; - -import net.minecraft.client.Minecraft; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(Minecraft.class) -public class MixinMinecraft { - - @Inject(method = "run", at = @At("HEAD")) - private void onRun(CallbackInfo ci) { - System.out.println("Hello from a mixin!"); - } - -} diff --git a/src/main/resources/assets/worldgentests/icon.png b/src/main/resources/assets/seedselector/icon.png similarity index 100% rename from src/main/resources/assets/worldgentests/icon.png rename to src/main/resources/assets/seedselector/icon.png diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 55858de..000f5a3 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -1,24 +1,24 @@ { "schemaVersion": 1, - "id": "worldgentests", + "id": "seedselector", "version": "${version}", - "name": "World Gen Tests", - "description": "World Generation Testing to help us find the pack.png seed", + "name": "Seed Selector", + "description": "Allows you to choose the world seed when generating a world", "authors": [ "Earthcomputer" ], "contact": { "homepage": "https://earthcomputer.net/", - "sources": "https://github.com/Earthcomputer/pack-png-mods/world-gen-tests" + "sources": "https://github.com/pack-png-mods/seed-selector" }, "license": "CC0-1.0", - "icon": "assets/worldgentests/icon.png", + "icon": "assets/seedselector/icon.png", "environment": "*", "mixins": [ - "worldgentests.mixins.json" + "seedselector.mixins.json" ], "depends": { diff --git a/src/main/resources/worldgentests.mixins.json b/src/main/resources/seedselector.mixins.json similarity index 75% rename from src/main/resources/worldgentests.mixins.json rename to src/main/resources/seedselector.mixins.json index 8b7f335..e6ef678 100644 --- a/src/main/resources/worldgentests.mixins.json +++ b/src/main/resources/seedselector.mixins.json @@ -1,6 +1,6 @@ { "required": true, - "package": "net.earthcomputer.worldgentests.mixin", + "package": "net.earthcomputer.seedselector.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ ],