start work on pointer lock api
This commit is contained in:
parent
f843376f7a
commit
5292e97a8f
|
|
@ -61,7 +61,8 @@ import net.montoyo.wd.WebDisplays;
|
||||||
import net.montoyo.wd.block.ScreenBlock;
|
import net.montoyo.wd.block.ScreenBlock;
|
||||||
import net.montoyo.wd.client.gui.*;
|
import net.montoyo.wd.client.gui.*;
|
||||||
import net.montoyo.wd.client.gui.loading.GuiLoader;
|
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.client.renderers.*;
|
||||||
import net.montoyo.wd.core.HasAdvancement;
|
import net.montoyo.wd.core.HasAdvancement;
|
||||||
import net.montoyo.wd.data.GuiData;
|
import net.montoyo.wd.data.GuiData;
|
||||||
|
|
@ -86,9 +87,7 @@ import org.cef.CefSettings;
|
||||||
import org.cef.browser.CefBrowser;
|
import org.cef.browser.CefBrowser;
|
||||||
import org.cef.browser.CefFrame;
|
import org.cef.browser.CefFrame;
|
||||||
import org.cef.browser.CefMessageRouter;
|
import org.cef.browser.CefMessageRouter;
|
||||||
import org.cef.callback.CefQueryCallback;
|
|
||||||
import org.cef.handler.CefDisplayHandler;
|
import org.cef.handler.CefDisplayHandler;
|
||||||
import org.cef.handler.CefMessageRouterHandlerAdapter;
|
|
||||||
import org.cef.misc.CefCursorType;
|
import org.cef.misc.CefCursorType;
|
||||||
import org.joml.Vector3d;
|
import org.joml.Vector3d;
|
||||||
import org.lwjgl.glfw.GLFW;
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
@ -103,7 +102,7 @@ import java.util.*;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@Mod.EventBusSubscriber(modid = "webdisplays", value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
|
@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;
|
private static ClientProxy INSTANCE;
|
||||||
|
|
||||||
|
|
@ -188,12 +187,20 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
||||||
|
|
||||||
ci.cancel();
|
ci.cancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ScreenBlockEntity> getScreens() {
|
||||||
|
return screenTracking;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<PadData> getPads() {
|
||||||
|
return padList;
|
||||||
|
}
|
||||||
|
|
||||||
public class PadData {
|
public class PadData {
|
||||||
|
|
||||||
public CefBrowser view;
|
public CefBrowser view;
|
||||||
|
public final UUID id;
|
||||||
private boolean isInHotbar;
|
private boolean isInHotbar;
|
||||||
private final UUID id;
|
|
||||||
private long lastURLSent;
|
private long lastURLSent;
|
||||||
|
|
||||||
public int activeCursor;
|
public int activeCursor;
|
||||||
|
|
@ -215,6 +222,14 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
||||||
isInHotbar = true;
|
isInHotbar = true;
|
||||||
this.id = id;
|
this.id = id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void updateTime() {
|
||||||
|
lastURLSent = System.currentTimeMillis();
|
||||||
|
}
|
||||||
|
|
||||||
|
public long lastSent() {
|
||||||
|
return lastURLSent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Minecraft mc;
|
private Minecraft mc;
|
||||||
|
|
@ -285,7 +300,7 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
||||||
);
|
);
|
||||||
|
|
||||||
// jsDispatcher = new JSQueryDispatcher(this);
|
// jsDispatcher = new JSQueryDispatcher(this);
|
||||||
MCEF.getClient().addDisplayHandler(this);
|
MCEF.getClient().addDisplayHandler(DisplayHandler.INSTANCE);
|
||||||
// mcef.registerJSQueryHandler(this);
|
// mcef.registerJSQueryHandler(this);
|
||||||
|
|
||||||
MCEF.getClient().getHandle().addMessageRouter(CefMessageRouter.create(WDRouter.INSTANCE));
|
MCEF.getClient().getHandle().addMessageRouter(CefMessageRouter.create(WDRouter.INSTANCE));
|
||||||
|
|
@ -525,55 +540,6 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
|
||||||
GuiLoader.clearCache();
|
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 ****************************************/
|
/**************************************** JS HANDLER METHODS ****************************************/
|
||||||
|
|
||||||
// @Override
|
// @Override
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,10 @@ import net.minecraft.world.phys.Vec2;
|
||||||
import net.minecraft.world.phys.Vec3;
|
import net.minecraft.world.phys.Vec3;
|
||||||
import net.minecraftforge.client.event.ViewportEvent;
|
import net.minecraftforge.client.event.ViewportEvent;
|
||||||
import net.minecraftforge.event.TickEvent;
|
import net.minecraftforge.event.TickEvent;
|
||||||
import net.montoyo.wd.client.js.WDRouter;
|
import net.montoyo.wd.client.handlers.js.WDRouter;
|
||||||
import net.montoyo.wd.config.CommonConfig;
|
|
||||||
import net.montoyo.wd.entity.ScreenBlockEntity;
|
import net.montoyo.wd.entity.ScreenBlockEntity;
|
||||||
import net.montoyo.wd.entity.ScreenData;
|
import net.montoyo.wd.entity.ScreenData;
|
||||||
import net.montoyo.wd.utilities.data.BlockSide;
|
import net.montoyo.wd.utilities.data.BlockSide;
|
||||||
import net.montoyo.wd.utilities.data.Rotation;
|
|
||||||
|
|
||||||
public class KeyboardCamera {
|
public class KeyboardCamera {
|
||||||
private static ScreenBlockEntity tes;
|
private static ScreenBlockEntity tes;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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.Gson;
|
||||||
import com.google.gson.JsonObject;
|
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.CefBrowser;
|
||||||
import org.cef.browser.CefFrame;
|
import org.cef.browser.CefFrame;
|
||||||
import org.cef.callback.CefQueryCallback;
|
import org.cef.callback.CefQueryCallback;
|
||||||
import org.cef.handler.CefMessageRouterHandler;
|
|
||||||
import org.cef.handler.CefMessageRouterHandlerAdapter;
|
import org.cef.handler.CefMessageRouterHandlerAdapter;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
import java.util.function.BiConsumer;
|
import java.util.function.BiConsumer;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
public class WDRouter extends CefMessageRouterHandlerAdapter {
|
public class WDRouter extends CefMessageRouterHandlerAdapter {
|
||||||
public static final WDRouter INSTANCE = new WDRouter();
|
public static final WDRouter INSTANCE = new WDRouter();
|
||||||
16
src/main/resources/assets/webdisplays/js/pointer_lock.js
Normal file
16
src/main/resources/assets/webdisplays/js/pointer_lock.js
Normal 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'];
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user