fix wasm shared worlds

This commit is contained in:
EymenWSMC
2026-06-17 15:36:42 +02:00
parent e5d6f44146
commit e2634a6395
6 changed files with 660 additions and 109 deletions
@@ -1,39 +1,56 @@
/*
* Copyright (c) 2022 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
package net.lax1dude.eaglercraft.internal.lwjgl;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import net.lax1dude.eaglercraft.Random;
import org.json.JSONObject;
import net.lax1dude.eaglercraft.EaglercraftVersion;
import net.lax1dude.eaglercraft.Random;
import net.lax1dude.eaglercraft.internal.IClientConfigAdapter;
import net.lax1dude.eaglercraft.internal.IClientConfigAdapterHooks;
import net.lax1dude.eaglercraft.sp.relay.RelayEntry;
/**
* Copyright (c) 2022 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
public class DesktopClientConfigAdapter implements IClientConfigAdapter {
public static final IClientConfigAdapter instance = new DesktopClientConfigAdapter();
public final List<DefaultServer> defaultServers = new ArrayList<>();
private final DesktopClientConfigAdapterHooks hooks = new DesktopClientConfigAdapterHooks();
@Override
public String getDefaultLocale() {
return "en_US";
}
@Override
public List<DefaultServer> getDefaultServerList() {
return defaultServers;
}
@Override
public String getServerToJoin() {
return null;
}
@Override
public String getWorldsDB() {
return "worlds";
@@ -44,16 +61,134 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
return "resourcePacks";
}
@Override
public JSONObject getIntegratedServerOpts() {
return new JSONObject("{\"container\":null,\"worldsDB\":\"worlds\"}");
}
private final List<RelayEntry> relays = new ArrayList<>();
@Override
public List<RelayEntry> getRelays() {
if (relays.isEmpty()) {
int relayId = (new Random()).nextInt(3);
relays.add(new RelayEntry("wss://relay.deev.is/", "lax1dude relay #1", relayId == 0));
relays.add(new RelayEntry("wss://relay.lax1dude.net/", "lax1dude relay #2", relayId == 1));
relays.add(new RelayEntry("wss://relay.shhnowisnottheti.me/", "ayunami relay #1", relayId == 2));
}
return relays;
}
@Override
public boolean isCheckGLErrors() {
return false;
}
@Override
public boolean isCheckShaderGLErrors() {
return false;
}
@Override
public boolean isDemo() {
return EaglercraftVersion.forceDemoMode;
}
@Override
public boolean allowUpdateSvc() {
return false;
}
@Override
public boolean allowUpdateDL() {
return false;
}
@Override
public boolean isEnableDownloadOfflineButton() {
return false;
}
@Override
public String getDownloadOfflineButtonLink() {
return null;
}
@Override
public boolean useSpecialCursors() {
return false;
}
@Override
public boolean isLogInvalidCerts() {
return false;
}
@Override
public boolean isCheckRelaysForUpdates() {
return false;
}
@Override
public boolean isEnableSignatureBadge() {
return false;
}
@Override
public boolean isAllowVoiceClient() {
return false;
}
@Override
public boolean isAllowFNAWSkins() {
return true;
}
@Override
public String getLocalStorageNamespace() {
return EaglercraftVersion.localStorageNamespace;
}
@Override
public boolean isEnableMinceraft() {
return true;
}
@Override
public boolean isEnableServerCookies() {
return true;
}
@Override
public boolean isAllowServerRedirects() {
return true;
}
@Override
public boolean isOpenDebugConsoleOnLaunch() {
return false;
}
@Override
public boolean isForceWebViewSupport() {
return false;
}
@Override
public boolean isEnableWebViewCSP() {
return true;
}
@Override
public boolean isAllowBootMenu() {
return false;
}
@Override
public boolean isForceProfanityFilter() {
return false;
}
@Override
public boolean isEaglerNoDelay() {
return false;
@@ -74,34 +209,6 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
return hooks;
}
@Override
public boolean isEnableServerCookies() {
return false;
}
private final List<RelayEntry> relays = new ArrayList<>();
@Override
public List<RelayEntry> getRelays() {
if (relays.isEmpty()) {
int relayId = (new Random()).nextInt(3);
relays.add(new RelayEntry("wss://relay.deev.is/", "lax1dude relay #1", relayId == 0));
relays.add(new RelayEntry("wss://relay.lax1dude.net/", "lax1dude relay #2", relayId == 1));
relays.add(new RelayEntry("wss://relay.shhnowisnottheti.me/", "ayunami relay #1", relayId == 2));
}
return relays;
}
@Override
public boolean isForceWebViewSupport() {
return false;
}
@Override
public boolean isEnableWebViewCSP() {
return false;
}
private static class DesktopClientConfigAdapterHooks implements IClientConfigAdapterHooks {
@Override
@@ -121,15 +228,10 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter {
@Override
public void callScreenChangedHook(String screenName, int scaledWidth, int scaledHeight, int realWidth,
int realHeight, int scaleFactor) {
int realHeight, int scaleFactor) {
}
}
@Override
public JSONObject getIntegratedServerOpts() {
return null;
}
}
@@ -1,36 +1,100 @@
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
package net.lax1dude.eaglercraft.internal;
import java.util.List;
import net.lax1dude.eaglercraft.sp.relay.RelayEntry;
import org.json.JSONObject;
import java.util.List;
/**
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*/
public interface IClientConfigAdapter {
public static class DefaultServer {
public final String name;
public final String addr;
public final boolean hideAddress;
public DefaultServer(String name, String addr, boolean hideAddress) {
this.name = name;
this.addr = addr;
this.hideAddress = hideAddress;
}
}
String getDefaultLocale();
List<DefaultServer> getDefaultServerList();
String getServerToJoin();
String getWorldsDB();
String getResourcePacksDB();
JSONObject getIntegratedServerOpts();
List<RelayEntry> getRelays();
boolean isCheckGLErrors();
boolean isCheckShaderGLErrors();
boolean isDemo();
boolean allowUpdateSvc();
boolean allowUpdateDL();
boolean isEnableDownloadOfflineButton();
String getDownloadOfflineButtonLink();
boolean useSpecialCursors();
boolean isLogInvalidCerts();
boolean isCheckRelaysForUpdates();
boolean isEnableSignatureBadge();
boolean isAllowVoiceClient();
boolean isAllowFNAWSkins();
String getLocalStorageNamespace();
boolean isEnableMinceraft();
boolean isEnableServerCookies();
boolean isAllowServerRedirects();
boolean isOpenDebugConsoleOnLaunch();
boolean isForceWebViewSupport();
boolean isEnableWebViewCSP();
boolean isAllowBootMenu();
boolean isForceProfanityFilter();
boolean isEaglerNoDelay();
boolean isRamdiskMode();
@@ -39,13 +103,4 @@ public interface IClientConfigAdapter {
IClientConfigAdapterHooks getHooks();
boolean isEnableServerCookies();
List<RelayEntry> getRelays();
boolean isForceWebViewSupport();
boolean isEnableWebViewCSP();
JSONObject getIntegratedServerOpts();
}
@@ -29,7 +29,7 @@ public class GuiScreenLANInfo extends GuiScreen {
public void initGui() {
buttonList.clear();
buttonList.add(new GuiButton(0, this.width / 2 - 100, height / 6 + 168, I18n.format("gui.continue")));
buttonList.add(new GuiButton(0, this.width / 2 - 100, height / 6 + 168, I18n.format("Continue")));
}
public void drawScreen(int par1, int par2, float par3) {
@@ -17,7 +17,7 @@ import java.util.List;
/**
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -28,7 +28,7 @@ import java.util.List;
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*
*/
public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
@@ -89,6 +89,21 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
}
}
@Override
public String getDefaultLocale() {
return "";
}
@Override
public List<DefaultServer> getDefaultServerList() {
return List.of();
}
@Override
public String getServerToJoin() {
return "";
}
@Override
public String getWorldsDB() {
return worldsDB;
@@ -99,11 +114,76 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
return checkGLErrors;
}
@Override
public boolean isCheckShaderGLErrors() {
return false;
}
@Override
public boolean isDemo() {
return false;
}
@Override
public boolean allowUpdateSvc() {
return false;
}
@Override
public boolean allowUpdateDL() {
return false;
}
@Override
public boolean isEnableDownloadOfflineButton() {
return false;
}
@Override
public String getDownloadOfflineButtonLink() {
return "";
}
@Override
public boolean useSpecialCursors() {
return false;
}
@Override
public boolean isLogInvalidCerts() {
return false;
}
@Override
public boolean isCheckRelaysForUpdates() {
return false;
}
@Override
public boolean isEnableSignatureBadge() {
return false;
}
@Override
public boolean isAllowVoiceClient() {
return false;
}
@Override
public boolean isAllowFNAWSkins() {
return false;
}
@Override
public String getLocalStorageNamespace() {
return localStorageNamespace;
}
@Override
public boolean isEnableMinceraft() {
return false;
}
public boolean isForceWebGL1TeaVM() {
return forceWebGL1;
}
@@ -173,6 +253,16 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
return false;
}
@Override
public boolean isAllowServerRedirects() {
return false;
}
@Override
public boolean isOpenDebugConsoleOnLaunch() {
return false;
}
@Override
public boolean isForceWebViewSupport() {
@@ -184,6 +274,16 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
return false;
}
@Override
public boolean isAllowBootMenu() {
return false;
}
@Override
public boolean isForceProfanityFilter() {
return false;
}
@Override
public JSONObject getIntegratedServerOpts() {
return integratedServerOpts;
@@ -204,11 +304,11 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter {
public String getResourcePacksDB() {
return this.resourcePacksDB;
}
public boolean isKeepAliveHackTeaVM() {
return keepAliveHack;
}
public boolean isFinishOnSwapTeaVM() {
return finishOnSwap;
}
@@ -38,7 +38,7 @@ public class PlatformWebRTC {
private static final Logger logger = LogManager.getLogger("PlatformWebRTC");
private static boolean isSupported = false;
private static boolean isSupported = true;
public static void initialize() {
isSupported = supported0();
@@ -1,6 +1,6 @@
/*
* Copyright (c) 2022-2024 lax1dude. All Rights Reserved.
*
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
@@ -11,32 +11,64 @@
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*
*/
package net.lax1dude.eaglercraft.internal.wasm_gc_teavm;
import java.util.ArrayList;
import java.util.List;
import net.lax1dude.eaglercraft.EagRuntime;
import net.lax1dude.eaglercraft.EaglercraftVersion;
import net.lax1dude.eaglercraft.ThreadLocalRandom;
import net.lax1dude.eaglercraft.sp.relay.RelayManager;
import org.json.JSONArray;
import org.json.JSONObject;
import org.teavm.jso.JSObject;
import org.teavm.jso.core.JSArrayReader;
import net.lax1dude.eaglercraft.internal.IClientConfigAdapter;
import net.lax1dude.eaglercraft.internal.IClientConfigAdapterHooks;
import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.opts.JSEaglercraftXOptsHooks;
import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.opts.JSEaglercraftXOptsRelay;
import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.opts.JSEaglercraftXOptsRoot;
import net.lax1dude.eaglercraft.EaglercraftVersion;
import net.lax1dude.eaglercraft.internal.wasm_gc_teavm.opts.JSEaglercraftXOptsServer;
import net.lax1dude.eaglercraft.sp.relay.RelayEntry;
import org.json.JSONObject;
import org.teavm.jso.JSObject;
import java.util.List;
public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
public static final IClientConfigAdapter instance = new WASMGCClientConfigAdapter();
private String defaultLocale = "en_US";
private List<DefaultServer> defaultServers = new ArrayList<>();
private List<RelayEntry> relays = new ArrayList<>();
private String serverToJoin = null;
private String worldsDB = "worlds";
private String resourcePacksDB = "resourcePacks";
private boolean checkGLErrors = false;
private boolean checkShaderGLErrors = false;
private boolean demoMode = EaglercraftVersion.forceDemoMode;
private boolean isEnableDownloadOfflineButton = true;
private String downloadOfflineButtonLink = null;
private boolean useSpecialCursors = false;
private boolean logInvalidCerts = false;
private boolean checkRelaysForUpdates = false;
private boolean enableSignatureBadge = false;
private boolean allowVoiceClient = true;
private boolean allowFNAWSkins = true;
private String localStorageNamespace = "_eaglercraftX";
private final WASMGCClientConfigAdapterHooks hooks = new WASMGCClientConfigAdapterHooks();
private boolean enableMinceraft = true;
private boolean enableServerCookies = true;
private boolean allowServerRedirects = true;
private boolean crashOnUncaughtExceptions = false;
private boolean openDebugConsoleOnLaunch = false;
private boolean fixDebugConsoleUnloadListener = false;
private boolean forceWebViewSupport = false;
private boolean enableWebViewCSP = false;
private boolean autoFixLegacyStyleAttr = false;
private boolean forceProfanityFilter = false;
private boolean forceWebGL1 = false;
private boolean forceWebGL2 = false;
private boolean allowExperimentalWebGL1 = false;
@@ -55,12 +87,32 @@ public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
public void loadNative(JSObject jsObject) {
JSEaglercraftXOptsRoot eaglercraftXOpts = (JSEaglercraftXOptsRoot)jsObject;
defaultLocale = eaglercraftXOpts.getLang("en_US");
serverToJoin = eaglercraftXOpts.getJoinServer(null);
worldsDB = eaglercraftXOpts.getWorldsDB("worlds");
resourcePacksDB = eaglercraftXOpts.getResourcePacksDB("resourcePacks");
checkGLErrors = eaglercraftXOpts.getCheckGLErrors(false);
checkShaderGLErrors = eaglercraftXOpts.getCheckShaderGLErrors(false);
demoMode = EaglercraftVersion.forceDemoMode || eaglercraftXOpts.getDemoMode(false);
isEnableDownloadOfflineButton = eaglercraftXOpts.getEnableDownloadOfflineButton(true);
downloadOfflineButtonLink = eaglercraftXOpts.getDownloadOfflineButtonLink(null);
useSpecialCursors = eaglercraftXOpts.getHtml5CursorSupport(false);
logInvalidCerts = EaglercraftVersion.enableUpdateService && !demoMode && eaglercraftXOpts.getLogInvalidCerts(false);
enableSignatureBadge = eaglercraftXOpts.getEnableSignatureBadge(false);
allowVoiceClient = eaglercraftXOpts.getAllowVoiceClient(true);
allowFNAWSkins = !demoMode && eaglercraftXOpts.getAllowFNAWSkins(true);
localStorageNamespace = eaglercraftXOpts.getLocalStorageNamespace(EaglercraftVersion.localStorageNamespace);
enableMinceraft = eaglercraftXOpts.getEnableMinceraft(true);
enableServerCookies = !demoMode && eaglercraftXOpts.getEnableServerCookies(true);
allowServerRedirects = eaglercraftXOpts.getAllowServerRedirects(true);
crashOnUncaughtExceptions = eaglercraftXOpts.getCrashOnUncaughtExceptions(false);
openDebugConsoleOnLaunch = eaglercraftXOpts.getOpenDebugConsoleOnLaunch(false);
fixDebugConsoleUnloadListener = eaglercraftXOpts.getFixDebugConsoleUnloadListener(false);
forceWebViewSupport = eaglercraftXOpts.getForceWebViewSupport(false);
enableWebViewCSP = eaglercraftXOpts.getEnableWebViewCSP(true);
autoFixLegacyStyleAttr = eaglercraftXOpts.getAutoFixLegacyStyleAttr(true);
forceProfanityFilter = eaglercraftXOpts.getForceProfanityFilter(false);
forceWebGL1 = eaglercraftXOpts.getForceWebGL1(false);
forceWebGL2 = eaglercraftXOpts.getForceWebGL2(false);
allowExperimentalWebGL1 = eaglercraftXOpts.getAllowExperimentalWebGL1(true);
@@ -80,6 +132,83 @@ public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
if(hooksObj != null) {
hooks.loadHooks(hooksObj);
}
defaultServers.clear();
JSArrayReader<JSEaglercraftXOptsServer> serversArray = eaglercraftXOpts.getServers();
if(serversArray != null) {
for(int i = 0, l = serversArray.getLength(); i < l; ++i) {
JSEaglercraftXOptsServer serverEntry = serversArray.get(i);
boolean hideAddr = serverEntry.getHideAddr(false);
String serverAddr = serverEntry.getAddr();
if(serverAddr != null) {
String serverName = serverEntry.getName("Default Server #" + i);
defaultServers.add(new DefaultServer(serverName, serverAddr, hideAddr));
}
}
}
relays.clear();
JSArrayReader<JSEaglercraftXOptsRelay> relaysArray = eaglercraftXOpts.getRelays();
if(relaysArray != null) {
boolean gotAPrimary = false;
for(int i = 0, l = relaysArray.getLength(); i < l; ++i) {
JSEaglercraftXOptsRelay relay = relaysArray.get(i);
String addr = relay.getAddr();
if(addr != null) {
boolean p = relay.getPrimary();
if(p) {
if(gotAPrimary) {
p = false;
}else {
gotAPrimary = true;
}
}
relays.add(new RelayEntry(relay.getAddr(), relay.getComment("Default Relay #" + i), p));
}
}
}
boolean officialUpdates = !demoMode && EaglercraftVersion.updateBundlePackageName.equals("net.lax1dude.eaglercraft.client");
if (relays.size() <= 0) {
int choice = ThreadLocalRandom.current().nextInt(3);
relays.add(new RelayEntry("wss://relay.deev.is/", "lax1dude relay #1", choice == 0));
relays.add(new RelayEntry("wss://relay.lax1dude.net/", "lax1dude relay #2", choice == 1));
relays.add(new RelayEntry("wss://relay.shhnowisnottheti.me/", "ayunami relay #1", choice == 2));
checkRelaysForUpdates = !demoMode && eaglercraftXOpts.getCheckRelaysForUpdates(officialUpdates);
}else {
if(officialUpdates) {
for(int i = 0, l = relays.size(); i < l; ++i) {
String addr = relays.get(i).address;
if(!addr.contains("deev.is") && !addr.contains("lax1dude.net") && !addr.contains("shhnowisnottheti.me")) {
officialUpdates = false;
break;
}
}
}
checkRelaysForUpdates = !demoMode && eaglercraftXOpts.getCheckRelaysForUpdates(officialUpdates);
}
RelayManager.relayManager.load(EagRuntime.getStorage("r"));
if (RelayManager.relayManager.count() <= 0) {
RelayManager.relayManager.loadDefaults();
RelayManager.relayManager.save();
}
}
@Override
public String getDefaultLocale() {
return defaultLocale;
}
@Override
public List<DefaultServer> getDefaultServerList() {
return defaultServers;
}
@Override
public String getServerToJoin() {
return serverToJoin;
}
@Override
@@ -92,16 +221,120 @@ public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
return resourcePacksDB;
}
@Override
public JSONObject getIntegratedServerOpts() {
return null;
}
@Override
public List<RelayEntry> getRelays() {
return relays;
}
@Override
public boolean isCheckGLErrors() {
return checkGLErrors;
}
@Override
public boolean isCheckShaderGLErrors() {
return checkShaderGLErrors;
}
@Override
public boolean isDemo() {
return demoMode;
}
@Override
public boolean allowUpdateSvc() {
return false;
}
@Override
public boolean allowUpdateDL() {
return false;
}
@Override
public boolean isEnableDownloadOfflineButton() {
return isEnableDownloadOfflineButton;
}
@Override
public String getDownloadOfflineButtonLink() {
return downloadOfflineButtonLink;
}
@Override
public boolean useSpecialCursors() {
return useSpecialCursors;
}
@Override
public boolean isLogInvalidCerts() {
return logInvalidCerts;
}
@Override
public boolean isCheckRelaysForUpdates() {
return false;
}
@Override
public boolean isEnableSignatureBadge() {
return enableSignatureBadge;
}
@Override
public boolean isAllowVoiceClient() {
return allowVoiceClient;
}
@Override
public boolean isAllowFNAWSkins() {
return allowFNAWSkins;
}
@Override
public String getLocalStorageNamespace() {
return localStorageNamespace;
}
@Override
public boolean isEnableMinceraft() {
return enableMinceraft;
}
@Override
public boolean isEnableServerCookies() {
return enableServerCookies;
}
@Override
public boolean isAllowServerRedirects() {
return allowServerRedirects;
}
@Override
public boolean isOpenDebugConsoleOnLaunch() {
return openDebugConsoleOnLaunch;
}
public boolean isFixDebugConsoleUnloadListenerTeaVM() {
return fixDebugConsoleUnloadListener;
}
@Override
public boolean isForceWebViewSupport() {
return forceWebViewSupport;
}
@Override
public boolean isEnableWebViewCSP() {
return enableWebViewCSP;
}
public boolean isAutoFixLegacyStyleAttrTeaVM() {
return autoFixLegacyStyleAttr;
}
@@ -146,6 +379,16 @@ public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
return singleThreadMode;
}
@Override
public boolean isAllowBootMenu() {
return false;
}
@Override
public boolean isForceProfanityFilter() {
return forceProfanityFilter;
}
@Override
public boolean isEaglerNoDelay() {
return eaglerNoDelay;
@@ -174,28 +417,79 @@ public class WASMGCClientConfigAdapter implements IClientConfigAdapter {
return hooks;
}
@Override
public boolean isEnableServerCookies() {
return false;
public JSONObject toJSONObject() {
JSONObject jsonObject = new JSONObject();
jsonObject.put("lang", defaultLocale);
jsonObject.put("joinServer", serverToJoin);
jsonObject.put("worldsDB", worldsDB);
jsonObject.put("resourcePacksDB", resourcePacksDB);
jsonObject.put("checkGLErrors", checkGLErrors);
jsonObject.put("checkShaderGLErrors", checkShaderGLErrors);
jsonObject.put("demoMode", demoMode);
jsonObject.put("enableDownloadOfflineButton", isEnableDownloadOfflineButton);
jsonObject.put("downloadOfflineButtonLink", downloadOfflineButtonLink);
jsonObject.put("html5CursorSupport", useSpecialCursors);
jsonObject.put("logInvalidCerts", logInvalidCerts);
jsonObject.put("checkRelaysForUpdates", checkRelaysForUpdates);
jsonObject.put("enableSignatureBadge", enableSignatureBadge);
jsonObject.put("allowVoiceClient", allowVoiceClient);
jsonObject.put("allowFNAWSkins", allowFNAWSkins);
jsonObject.put("localStorageNamespace", localStorageNamespace);
jsonObject.put("enableMinceraft", enableMinceraft);
jsonObject.put("enableServerCookies", enableServerCookies);
jsonObject.put("allowServerRedirects", allowServerRedirects);
jsonObject.put("crashOnUncaughtExceptions", crashOnUncaughtExceptions);
jsonObject.put("openDebugConsoleOnLaunch", openDebugConsoleOnLaunch);
jsonObject.put("fixDebugConsoleUnloadListener", fixDebugConsoleUnloadListener);
jsonObject.put("forceWebViewSupport", forceWebViewSupport);
jsonObject.put("enableWebViewCSP", enableWebViewCSP);
jsonObject.put("autoFixLegacyStyleAttr", autoFixLegacyStyleAttr);
jsonObject.put("forceProfanityFilter", forceProfanityFilter);
jsonObject.put("forceWebGL1", forceWebGL1);
jsonObject.put("forceWebGL2", forceWebGL2);
jsonObject.put("allowExperimentalWebGL1", allowExperimentalWebGL1);
jsonObject.put("useWebGLExt", useWebGLExt);
jsonObject.put("useJOrbisAudioDecoder", useJOrbisAudioDecoder);
jsonObject.put("useXHRFetch", useXHRFetch);
jsonObject.put("useVisualViewport", useVisualViewport);
jsonObject.put("deobfStackTraces", deobfStackTraces);
jsonObject.put("disableBlobURLs", disableBlobURLs);
jsonObject.put("eaglerNoDelay", eaglerNoDelay);
jsonObject.put("ramdiskMode", ramdiskMode);
jsonObject.put("singleThreadMode", singleThreadMode);
jsonObject.put("enforceVSync", enforceVSync);
jsonObject.put("keepAliveHack", keepAliveHack);
jsonObject.put("finishOnSwap", finishOnSwap);
JSONArray serversArr = new JSONArray();
for(int i = 0, l = defaultServers.size(); i < l; ++i) {
DefaultServer srv = defaultServers.get(i);
JSONObject obj = new JSONObject();
obj.put("addr", srv.addr);
obj.put("hideAddr", srv.hideAddress);
obj.put("name", srv.name);
serversArr.put(obj);
}
jsonObject.put("servers", serversArr);
JSONArray relaysArr = new JSONArray();
for(int i = 0, l = relays.size(); i < l; ++i) {
RelayEntry rl = relays.get(i);
JSONObject obj = new JSONObject();
obj.put("addr", rl.address);
obj.put("comment", rl.comment);
obj.put("primary", rl.primary);
relaysArr.put(obj);
}
jsonObject.put("relays", relaysArr);
return jsonObject;
}
@Override
public List<RelayEntry> getRelays() {
return List.of();
public String toString() {
return toJSONObject().toString();
}
@Override
public boolean isForceWebViewSupport() {
return false;
public String toStringFormatted() {
return toJSONObject().toString(4);
}
@Override
public boolean isEnableWebViewCSP() {
return false;
}
@Override
public JSONObject getIntegratedServerOpts() {
return null;
}
}