diff --git a/build.gradle b/build.gradle
index 10f93a3d..f3e42940 100644
--- a/build.gradle
+++ b/build.gradle
@@ -69,7 +69,16 @@ dependencies {
libs "net.raphimc:ViaLegacy:${project.vialegacy_version}"
libs "net.raphimc:ViaAprilFools:${project.viaaprilfools_version}"
- libs "net.raphimc:ViaBedrock:${project.viabedrock_version}"
+
+ libs ("net.raphimc:ViaBedrock:${project.viabedrock_version}") {
+ exclude group: "io.jsonwebtoken", module: "jjwt-api"
+ exclude group: "io.jsonwebtoken", module: "jjwt-impl"
+ exclude group: "io.jsonwebtoken", module: "jjwt-gson"
+ }
+ libs ("net.raphimc:MinecraftAuth:${project.minecraftauth_version}") {
+ exclude group: "com.google.code.gson", module: "gson"
+ exclude group: "org.slf4j", module: "slf4j-api"
+ }
libs "net.lenni0451.mcstructs:text:${project.mcstructs_text_version}"
libs "net.lenni0451:Reflect:${project.reflect_version}"
diff --git a/gradle.properties b/gradle.properties
index cfde8589..134f0fba 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,7 +9,7 @@ loader_version=0.14.17
fabric_api_version=0.76.0+1.19.4
# viafabricplus
-mod_version=2.1.2-ALPHA
+mod_version=2.1.3-ALPHA
maven_group=de.florianmichael
archives_base_name=viafabricplus
@@ -26,10 +26,11 @@ snake_yml_version=2.0
vialegacy_version=2.2.9-SNAPSHOT
viaaprilfools_version=2.0.6
viabedrock_version=0.0.1-SNAPSHOT
+minecraftauth_version=2.0.1
# lenni0451 libs
mcstructs_text_version=2.2.0
reflect_version=1.1.0
# other mods
-mod_menu_version=5.0.0
+mod_menu_version=6.1.0-rc.1
diff --git a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
index 76a66140..57d5ea6b 100644
--- a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
+++ b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
@@ -17,9 +17,12 @@
*/
package de.florianmichael.viafabricplus;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
import de.florianmichael.viafabricplus.definition.ChatLengthDefinition;
import de.florianmichael.viafabricplus.definition.ItemReleaseVersionDefinition;
import de.florianmichael.viafabricplus.definition.PackFormatsDefinition;
+import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountManager;
import de.florianmichael.viafabricplus.definition.c0_30.ClassicItemSelectionScreen;
import de.florianmichael.viafabricplus.definition.c0_30.CustomClassicProtocolExtensions;
import de.florianmichael.viafabricplus.definition.c0_30.command.ClassicProtocolCommands;
@@ -29,18 +32,23 @@ import de.florianmichael.viafabricplus.event.PreLoadCallback;
import de.florianmichael.viafabricplus.information.InformationSystem;
import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.settings.SettingsSystem;
+import net.fabricmc.api.ClientModInitializer;
import java.io.File;
-public class ViaFabricPlus {
+public class ViaFabricPlus implements ClientModInitializer {
+ public final static Gson GSON = new GsonBuilder().setPrettyPrinting().create();
public final static File RUN_DIRECTORY = new File("ViaFabricPlus");
+
public final static ViaFabricPlus INSTANCE = new ViaFabricPlus();
private final SettingsSystem settingsSystem = new SettingsSystem();
private final InformationSystem informationSystem = new InformationSystem();
- public void init() {
+ @Override
+ public void onInitializeClient() {
FinishMinecraftLoadCallback.EVENT.register(() -> {
+ // General settings
settingsSystem.init();
informationSystem.init();
@@ -53,6 +61,9 @@ public class ViaFabricPlus {
ChatLengthDefinition.create();
ClassicItemSelectionScreen.create();
ClassicProtocolCommands.create();
+
+ // Bedrock Stuff
+ BedrockAccountManager.INSTANCE.load();
});
PreLoadCallback.EVENT.invoker().onLoad();
diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java
new file mode 100644
index 00000000..09638063
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/BedrockAccountManager.java
@@ -0,0 +1,72 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/MrLookAtMe (EnZaXD) and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.definition.bedrock;
+
+import com.google.gson.JsonObject;
+import de.florianmichael.viafabricplus.ViaFabricPlus;
+import net.raphimc.mcauth.MinecraftAuth;
+import net.raphimc.mcauth.step.bedrock.StepMCChain;
+
+import java.io.*;
+
+public class BedrockAccountManager {
+ public final static BedrockAccountManager INSTANCE = new BedrockAccountManager();
+
+ private final File ACCOUNT_FILE = new File(ViaFabricPlus.RUN_DIRECTORY, "bedrock.account");
+ private StepMCChain.MCChain account;
+
+ public void load() {
+ if (ACCOUNT_FILE.exists()) {
+ final JsonObject mcChain;
+ try {
+ mcChain = ViaFabricPlus.GSON.fromJson(new FileReader(ACCOUNT_FILE), JsonObject.class).getAsJsonObject();
+ account = MinecraftAuth.Bedrock.Title.MC_CHAIN.fromJson(mcChain);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ Runtime.getRuntime().addShutdownHook(new Thread(this::save));
+ }
+
+ public void save() {
+ if (account != null) {
+ ACCOUNT_FILE.delete();
+ try {
+ ACCOUNT_FILE.createNewFile();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ try (final FileWriter fw = new FileWriter(ACCOUNT_FILE)) {
+ fw.write(ViaFabricPlus.GSON.toJson(account.toJson()));
+ fw.flush();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+
+ public StepMCChain.MCChain getAccount() {
+ return account;
+ }
+
+ public void setAccount(StepMCChain.MCChain account) {
+ this.account = account;
+ }
+}
diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/JoinGameStorage.java b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/JoinGameStorage.java
new file mode 100644
index 00000000..b12ccb1f
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/JoinGameStorage.java
@@ -0,0 +1,56 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/MrLookAtMe (EnZaXD) and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.definition.bedrock;
+
+import com.viaversion.viaversion.api.connection.StoredObject;
+import com.viaversion.viaversion.api.connection.UserConnection;
+
+public class JoinGameStorage extends StoredObject {
+
+ private long seed;
+ private String levelId;
+ private long enchantmentSeed;
+
+ public JoinGameStorage(UserConnection user) {
+ super(user);
+ }
+
+ public long getSeed() {
+ return seed;
+ }
+
+ public void setSeed(long seed) {
+ this.seed = seed;
+ }
+
+ public String getLevelId() {
+ return levelId;
+ }
+
+ public void setLevelId(String levelId) {
+ this.levelId = levelId;
+ }
+
+ public long getEnchantmentSeed() {
+ return enchantmentSeed;
+ }
+
+ public void setEnchantmentSeed(long enchantmentSeed) {
+ this.enchantmentSeed = enchantmentSeed;
+ }
+}
diff --git a/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/ModelFormats.java b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/ModelFormats.java
new file mode 100644
index 00000000..2cb98517
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/definition/bedrock/ModelFormats.java
@@ -0,0 +1,30 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/MrLookAtMe (EnZaXD) and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.definition.bedrock;
+
+import net.raphimc.viabedrock.protocol.data.enums.bedrock.MovementMode;
+
+public class ModelFormats {
+
+ public static String formatMovementMode(final int movementMode) {
+ if (movementMode == MovementMode.CLIENT) return "Client";
+ if (movementMode == MovementMode.SERVER) return "Server";
+
+ return "Server with rewind";
+ }
+}
diff --git a/src/main/java/de/florianmichael/viafabricplus/information/impl/BedrockInformation.java b/src/main/java/de/florianmichael/viafabricplus/information/impl/BedrockInformation.java
index 77068fda..5ba60501 100644
--- a/src/main/java/de/florianmichael/viafabricplus/information/impl/BedrockInformation.java
+++ b/src/main/java/de/florianmichael/viafabricplus/information/impl/BedrockInformation.java
@@ -18,6 +18,8 @@
package de.florianmichael.viafabricplus.information.impl;
import com.viaversion.viaversion.api.connection.UserConnection;
+import de.florianmichael.viafabricplus.definition.bedrock.JoinGameStorage;
+import de.florianmichael.viafabricplus.definition.bedrock.ModelFormats;
import de.florianmichael.viafabricplus.information.AbstractInformationGroup;
import de.florianmichael.viafabricplus.util.ScreenUtil;
import de.florianmichael.vialoadingbase.platform.ProtocolRange;
@@ -28,6 +30,7 @@ import net.raphimc.viabedrock.api.chunk.BedrockChunk;
import net.raphimc.viabedrock.api.model.entity.Entity;
import net.raphimc.viabedrock.protocol.storage.BlobCache;
import net.raphimc.viabedrock.protocol.storage.ChunkTracker;
+import net.raphimc.viabedrock.protocol.storage.GameSessionStorage;
import java.util.List;
import java.util.Map;
@@ -80,5 +83,18 @@ public class BedrockInformation extends AbstractInformationGroup {
output.add("Entity Tracker: " + entities);
}
}
+ final JoinGameStorage joinGameStorage = userConnection.get(JoinGameStorage.class);
+ if (!joinGameStorage.getLevelId().isEmpty() || joinGameStorage.getSeed() != 0 || joinGameStorage.getEnchantmentSeed() != 0) {
+ if (!output.isEmpty()) output.add("");
+ output.add("Join Game:");
+ }
+ if (joinGameStorage.getSeed() != 0) output.add("World Seed: " + joinGameStorage.getSeed());
+ if (!joinGameStorage.getLevelId().isEmpty()) output.add("Level Id: " + joinGameStorage.getLevelId());
+ if (joinGameStorage.getEnchantmentSeed() != 0) output.add("Enchantment Seed: " + joinGameStorage.getEnchantmentSeed());
+
+ final GameSessionStorage gameSessionStorage = userConnection.get(GameSessionStorage.class);
+ if (gameSessionStorage != null) {
+ output.add("Movement mode: " + ModelFormats.formatMovementMode(gameSessionStorage.getMovementMode()));
+ }
}
}
diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMain.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMain.java
index 6465ce9f..60be3c1f 100644
--- a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMain.java
+++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/base/MixinMain.java
@@ -29,6 +29,6 @@ public class MixinMain {
@Inject(method = "main", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/crash/CrashReport;initCrashReport()V"))
private static void preLoad(CallbackInfo ci) {
- ViaFabricPlus.INSTANCE.init();
+// ViaFabricPlus.INSTANCE.init();
}
}
diff --git a/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/jsonwebtoken/MixinClasses.java b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/jsonwebtoken/MixinClasses.java
new file mode 100644
index 00000000..dbd609fc
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/injection/mixin/fixes/jsonwebtoken/MixinClasses.java
@@ -0,0 +1,33 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/MrLookAtMe (EnZaXD) and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus.injection.mixin.fixes.jsonwebtoken;
+
+import io.jsonwebtoken.lang.Classes;
+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.CallbackInfoReturnable;
+
+@Mixin(value = Classes.class, remap = false)
+public class MixinClasses {
+
+ @Inject(method = "forName", at = @At("HEAD"), cancellable = true)
+ private static void fixServicesSupport(String fqcn, CallbackInfoReturnable> cir) throws ClassNotFoundException {
+ cir.setReturnValue((Class