start work on pointer lock api

This commit is contained in:
GiantLuigi4 2023-11-25 16:29:04 -05:00
parent f843376f7a
commit 5292e97a8f
5 changed files with 122 additions and 64 deletions

View File

@ -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<ScreenBlockEntity> getScreens() {
return screenTracking;
}
public List<PadData> 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

View File

@ -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;

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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'];
}
}