From 5292e97a8fa8cf91c94cb86979ee741154345ca1 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Sat, 25 Nov 2023 16:29:04 -0500 Subject: [PATCH] start work on pointer lock api --- .../net/montoyo/wd/client/ClientProxy.java | 78 +++++------------- .../wd/client/gui/camera/KeyboardCamera.java | 4 +- .../wd/client/handlers/DisplayHandler.java | 82 +++++++++++++++++++ .../wd/client/{ => handlers}/js/WDRouter.java | 6 +- .../assets/webdisplays/js/pointer_lock.js | 16 ++++ 5 files changed, 122 insertions(+), 64 deletions(-) create mode 100644 src/main/java/net/montoyo/wd/client/handlers/DisplayHandler.java rename src/main/java/net/montoyo/wd/client/{ => handlers}/js/WDRouter.java (94%) create mode 100644 src/main/resources/assets/webdisplays/js/pointer_lock.js diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index e1a9e66..9da60e9 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -61,7 +61,8 @@ import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.ScreenBlock; import net.montoyo.wd.client.gui.*; import net.montoyo.wd.client.gui.loading.GuiLoader; -import net.montoyo.wd.client.js.WDRouter; +import net.montoyo.wd.client.handlers.DisplayHandler; +import net.montoyo.wd.client.handlers.js.WDRouter; import net.montoyo.wd.client.renderers.*; import net.montoyo.wd.core.HasAdvancement; import net.montoyo.wd.data.GuiData; @@ -86,9 +87,7 @@ import org.cef.CefSettings; import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; import org.cef.browser.CefMessageRouter; -import org.cef.callback.CefQueryCallback; import org.cef.handler.CefDisplayHandler; -import org.cef.handler.CefMessageRouterHandlerAdapter; import org.cef.misc.CefCursorType; import org.joml.Vector3d; import org.lwjgl.glfw.GLFW; @@ -103,7 +102,7 @@ import java.util.*; import java.util.stream.Stream; @Mod.EventBusSubscriber(modid = "webdisplays", value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD) -public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJSQueryHandler*/, ResourceManagerReloadListener { +public class ClientProxy extends SharedProxy implements ResourceManagerReloadListener { private static ClientProxy INSTANCE; @@ -188,12 +187,20 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS ci.cancel(); } - + + public List getScreens() { + return screenTracking; + } + + public List getPads() { + return padList; + } + public class PadData { public CefBrowser view; + public final UUID id; private boolean isInHotbar; - private final UUID id; private long lastURLSent; public int activeCursor; @@ -215,6 +222,14 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS isInHotbar = true; this.id = id; } + + public void updateTime() { + lastURLSent = System.currentTimeMillis(); + } + + public long lastSent() { + return lastURLSent; + } } private Minecraft mc; @@ -285,7 +300,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS ); // jsDispatcher = new JSQueryDispatcher(this); - MCEF.getClient().addDisplayHandler(this); + MCEF.getClient().addDisplayHandler(DisplayHandler.INSTANCE); // mcef.registerJSQueryHandler(this); MCEF.getClient().getHandle().addMessageRouter(CefMessageRouter.create(WDRouter.INSTANCE)); @@ -525,55 +540,6 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS GuiLoader.clearCache(); } - /**************************************** DISPLAY HANDLER METHODS ****************************************/ - - - @Override - public void onAddressChange(CefBrowser browser, CefFrame cefFrame, String url) { - if (browser != null) { - long t = System.currentTimeMillis(); - - for (PadData pd : padList) { - if (pd.view == browser && t - pd.lastURLSent >= 1000) { - if (WebDisplays.isSiteBlacklisted(url)) - pd.view.loadURL(WebDisplays.BLACKLIST_URL); - else { - pd.lastURLSent = t; //Avoid spamming the server with porn URLs - WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(pd.id, url)); - } - - break; - } - } - - for (ScreenBlockEntity tes : screenTracking) - tes.updateClientSideURL(browser, url); - } - } - - @Override - public void onTitleChange(CefBrowser cefBrowser, String s) { - } - - @Override - public boolean onTooltip(CefBrowser cefBrowser, String s) { - return false; - } - - @Override - public void onStatusMessage(CefBrowser cefBrowser, String s) { - } - - @Override - public boolean onConsoleMessage(CefBrowser cefBrowser, CefSettings.LogSeverity logSeverity, String s, String s1, int i) { - return false; - } - - @Override - public boolean onCursorChange(CefBrowser cefBrowser, int i) { - return false; - } - /**************************************** JS HANDLER METHODS ****************************************/ // @Override diff --git a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java index 1ed933a..9621fdc 100644 --- a/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java +++ b/src/main/java/net/montoyo/wd/client/gui/camera/KeyboardCamera.java @@ -9,12 +9,10 @@ import net.minecraft.world.phys.Vec2; import net.minecraft.world.phys.Vec3; import net.minecraftforge.client.event.ViewportEvent; import net.minecraftforge.event.TickEvent; -import net.montoyo.wd.client.js.WDRouter; -import net.montoyo.wd.config.CommonConfig; +import net.montoyo.wd.client.handlers.js.WDRouter; import net.montoyo.wd.entity.ScreenBlockEntity; import net.montoyo.wd.entity.ScreenData; import net.montoyo.wd.utilities.data.BlockSide; -import net.montoyo.wd.utilities.data.Rotation; public class KeyboardCamera { private static ScreenBlockEntity tes; diff --git a/src/main/java/net/montoyo/wd/client/handlers/DisplayHandler.java b/src/main/java/net/montoyo/wd/client/handlers/DisplayHandler.java new file mode 100644 index 0000000..0a4da80 --- /dev/null +++ b/src/main/java/net/montoyo/wd/client/handlers/DisplayHandler.java @@ -0,0 +1,82 @@ +package net.montoyo.wd.client.handlers; + +import net.montoyo.wd.WebDisplays; +import net.montoyo.wd.client.ClientProxy; +import net.montoyo.wd.entity.ScreenBlockEntity; +import net.montoyo.wd.net.WDNetworkRegistry; +import net.montoyo.wd.net.server_bound.C2SMessageMinepadUrl; +import org.cef.CefSettings; +import org.cef.browser.CefBrowser; +import org.cef.browser.CefFrame; +import org.cef.handler.CefDisplayHandler; + +import java.io.InputStream; + +public class DisplayHandler implements CefDisplayHandler { + + + public static final CefDisplayHandler INSTANCE = new DisplayHandler(); + + private static final String pointerLock; + + static { + try { + InputStream is = DisplayHandler.class.getClassLoader().getResourceAsStream("assets/webdisplays/js/pointer_lock.js"); + pointerLock = new String(is.readAllBytes()); + is.close(); + } catch (Throwable err) { + throw new RuntimeException(err); + } + } + + @Override + public void onAddressChange(CefBrowser browser, CefFrame cefFrame, String url) { + ClientProxy proxy = ((ClientProxy) WebDisplays.PROXY); + + if (browser != null) { + long t = System.currentTimeMillis(); + + for (ClientProxy.PadData pd : proxy.getPads()) { + if (pd.view == browser && t - pd.lastSent() >= 1000) { + if (WebDisplays.isSiteBlacklisted(url)) + pd.view.loadURL(WebDisplays.BLACKLIST_URL); + else { + pd.updateTime(); //Avoid spamming the server with porn URLs + WDNetworkRegistry.INSTANCE.sendToServer(new C2SMessageMinepadUrl(pd.id, url)); + } + + break; + } + } + + for (ScreenBlockEntity tes : proxy.getScreens()) + tes.updateClientSideURL(browser, url); + } + + // enables a custom pointer lock api + browser.executeJavaScript(pointerLock, "WebDisplays", 0); + } + + @Override + public void onTitleChange(CefBrowser cefBrowser, String s) { + } + + @Override + public boolean onTooltip(CefBrowser cefBrowser, String s) { + return false; + } + + @Override + public void onStatusMessage(CefBrowser cefBrowser, String s) { + } + + @Override + public boolean onConsoleMessage(CefBrowser cefBrowser, CefSettings.LogSeverity logSeverity, String s, String s1, int i) { + return false; + } + + @Override + public boolean onCursorChange(CefBrowser cefBrowser, int i) { + return false; + } +} diff --git a/src/main/java/net/montoyo/wd/client/js/WDRouter.java b/src/main/java/net/montoyo/wd/client/handlers/js/WDRouter.java similarity index 94% rename from src/main/java/net/montoyo/wd/client/js/WDRouter.java rename to src/main/java/net/montoyo/wd/client/handlers/js/WDRouter.java index 42c1b48..16cb612 100644 --- a/src/main/java/net/montoyo/wd/client/js/WDRouter.java +++ b/src/main/java/net/montoyo/wd/client/handlers/js/WDRouter.java @@ -1,20 +1,16 @@ -package net.montoyo.wd.client.js; +package net.montoyo.wd.client.handlers.js; import com.google.gson.Gson; import com.google.gson.JsonObject; -import net.minecraft.client.Minecraft; -import net.montoyo.wd.entity.ScreenData; import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; import org.cef.callback.CefQueryCallback; -import org.cef.handler.CefMessageRouterHandler; import org.cef.handler.CefMessageRouterHandlerAdapter; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Function; public class WDRouter extends CefMessageRouterHandlerAdapter { public static final WDRouter INSTANCE = new WDRouter(); diff --git a/src/main/resources/assets/webdisplays/js/pointer_lock.js b/src/main/resources/assets/webdisplays/js/pointer_lock.js new file mode 100644 index 0000000..4963afa --- /dev/null +++ b/src/main/resources/assets/webdisplays/js/pointer_lock.js @@ -0,0 +1,16 @@ +{ + const elemRef = { element: undefined }; + + Document.prototype.__defineGetter__("pointerLockElement", () => elemRef['element']); + Document.prototype.__defineSetter__("pointerLockElement", (v) => {}); + + Element.prototype.requestPointerLock = function(unadjustedMovement = false) { + elemRef['element'] = this; + document.pointerLockElement = elemRef['element']; + document.dispatchEvent(new Event("pointerlockchange")); + } + Document.prototype.exitPointerLock = () => { + elemRef['element'] = undefined; + document.pointerLockElement = elemRef['element']; + } +}