Packet for turning off a screen, start working on schema stuff

This commit is contained in:
GiantLuigi4 2023-09-27 21:36:35 -04:00
parent 3548b5806c
commit a4f8b630ef
8 changed files with 282 additions and 153 deletions

Binary file not shown.

View File

@ -85,6 +85,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.handler.CefDisplayHandler; import org.cef.handler.CefDisplayHandler;
import org.cef.network.CefRequest;
import org.joml.Vector3d; import org.joml.Vector3d;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@ -262,16 +263,21 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS
@Override @Override
public void onCefInit(/*CefInitEvent event*/) { public void onCefInit(/*CefInitEvent event*/) {
MinecraftForge.EVENT_BUS.register(this); MinecraftForge.EVENT_BUS.register(this);
// if (mcef != null)
// mcef.registerScheme("wd", WDScheme.class, true, false, false, true, true, false, false); if (!MCEF.isInitialized()) return;
MCEF.getApp().getHandle().registerSchemeHandlerFactory(
"webdisplays", "",
(browser, frame, url, request) -> {
// TODO: check if it's a webdisplays browser?
return new WDScheme(request.getURL());
}
);
// jsDispatcher = new JSQueryDispatcher(this); // jsDispatcher = new JSQueryDispatcher(this);
minePadRenderer = new MinePadRenderer(); minePadRenderer = new MinePadRenderer();
laserPointerRenderer = new LaserPointerRenderer(); laserPointerRenderer = new LaserPointerRenderer();
// if (mcef == null)
// throw new RuntimeException("MCEF is missing");
MCEF.getClient().addDisplayHandler(this); MCEF.getClient().addDisplayHandler(this);
// mcef.registerJSQueryHandler(this); // mcef.registerJSQueryHandler(this);
findAdvancementToProgressField(); findAdvancementToProgressField();

View File

@ -1,149 +1,196 @@
///* /*
// * Copyright (C) 2018 BARBOTIN Nicolas * Copyright (C) 2018 BARBOTIN Nicolas
// */ */
//
//package net.montoyo.wd.client; package net.montoyo.wd.client;
//
//import net.montoyo.mcef.api.IScheme; import net.montoyo.wd.miniserv.Constants;
//import net.montoyo.mcef.api.ISchemeResponseData; import net.montoyo.wd.miniserv.client.Client;
//import net.montoyo.mcef.api.ISchemeResponseHeaders; import net.montoyo.wd.miniserv.client.ClientTaskGetFile;
//import net.montoyo.mcef.api.SchemePreResponse; import net.montoyo.wd.utilities.Log;
//import net.montoyo.wd.WebDisplays; import net.montoyo.wd.utilities.Util;
//import net.montoyo.wd.miniserv.Constants; import org.cef.callback.CefCallback;
//import net.montoyo.wd.miniserv.client.Client; import org.cef.handler.CefResourceHandler;
//import net.montoyo.wd.miniserv.client.ClientTaskGetFile; import org.cef.misc.IntRef;
//import net.montoyo.wd.utilities.Log; import org.cef.misc.StringRef;
//import net.montoyo.wd.utilities.Util; import org.cef.network.CefRequest;
// import org.cef.network.CefResponse;
//import java.io.UnsupportedEncodingException;
//import java.net.URLDecoder; import java.io.UnsupportedEncodingException;
//import java.util.UUID; import java.net.URLDecoder;
// import java.util.UUID;
//public class WDScheme implements IScheme {
// public class WDScheme implements CefResourceHandler {
// private static final String ERROR_PAGE = "<!DOCTYPE html><html><head></head><body><h1>%d %s</h1><hr /><i>Miniserv powered by WebDisplays</i></body></html>";
// private ClientTaskGetFile task; private static final String ERROR_PAGE = "<!DOCTYPE html><html><head></head><body><h1>%d %s</h1><hr /><i>Miniserv powered by WebDisplays</i></body></html>";
// private boolean isErrorPage; private ClientTaskGetFile task;
// private boolean isErrorPage;
// @Override
// public SchemePreResponse processRequest(String url) { String url;
// url = url.substring("wd://".length());
// public WDScheme(String url) {
// int pos = url.indexOf('/'); this.url = url;
// if(pos < 0) }
// return SchemePreResponse.NOT_HANDLED;
// @Override
// String uuidStr = url.substring(0, pos); public boolean processRequest(CefRequest cefRequest, CefCallback cefCallback) {
// String fileStr = url.substring(pos + 1); url = cefRequest.getURL();
//
// try { int pos = url.indexOf('/');
// fileStr = URLDecoder.decode(fileStr, "UTF-8"); if(pos < 0)
// } catch(UnsupportedEncodingException ex) { return false;
// Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex);
// } String uuidStr = url.substring(0, pos);
// String fileStr = url.substring(pos + 1);
// if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr))
// return SchemePreResponse.NOT_HANDLED; try {
// fileStr = URLDecoder.decode(fileStr, "UTF-8");
// UUID uuid; } catch(UnsupportedEncodingException ex) {
// try { Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex);
// uuid = UUID.fromString(uuidStr); }
// } catch(IllegalArgumentException ex) {
// return SchemePreResponse.NOT_HANDLED; //Invalid UUID if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr))
// } return false;
//
// task = new ClientTaskGetFile(uuid, fileStr); UUID uuid;
// return Client.getInstance().addTask(task) ? SchemePreResponse.HANDLED_CONTINUE : SchemePreResponse.NOT_HANDLED; try {
// } uuid = UUID.fromString(uuidStr);
// } catch(IllegalArgumentException ex) {
// @Override return false; //Invalid UUID
// public void getResponseHeaders(ISchemeResponseHeaders resp) { }
// Log.info("Waiting for response...");
// int status = task.waitForResponse(); task = new ClientTaskGetFile(uuid, fileStr);
// Log.info("Got response %d", status); return Client.getInstance().addTask(task) ? true : false;
// }
// if(status == 0) {
// //OK @Override
// int extPos = task.getFileName().lastIndexOf('.'); public void getResponseHeaders(CefResponse cefResponse, IntRef intRef, StringRef stringRef) {
// if(extPos >= 0) { Log.info("Waiting for response...");
// String mime = ((ClientProxy) WebDisplays.PROXY).getMCEF().mimeTypeFromExtension(task.getFileName().substring(extPos + 1)); int status = task.waitForResponse();
// Log.info("Got response %d", status);
// if(mime != null)
// resp.setMimeType(mime); if(status == 0) {
// } //OK
// int extPos = task.getFileName().lastIndexOf('.');
// resp.setStatus(200); if(extPos >= 0) {
// resp.setStatusText("OK"); String mime = mapMime(task.getFileName().substring(extPos + 1));
// resp.setResponseLength(-1);
// return; if(mime != null)
// } cefResponse.setMimeType(mime);
// }
// int errCode;
// String errStr; cefResponse.setStatus(200);
// cefResponse.setStatusText("OK");
// if(status == Constants.GETF_STATUS_NOT_FOUND) { cefResponse.setHeaderByName("content-length", "" + -1, true);
// errCode = 404; return;
// errStr = "Not Found"; }
// } else {
// errCode = 500; int errCode;
// errStr = "Internal Server Error"; String errStr;
// }
// if(status == Constants.GETF_STATUS_NOT_FOUND) {
// resp.setStatus(errCode); errCode = 404;
// resp.setStatusText(errStr); errStr = "Not Found";
// } else {
// try { errCode = 500;
// dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); errStr = "Internal Server Error";
// dataOffset = 0; }
// amountToWrite = dataToWrite.length;
// isErrorPage = true; cefResponse.setStatus(errCode);
// resp.setResponseLength(amountToWrite); cefResponse.setStatusText(errStr);
// } catch(UnsupportedEncodingException ex) {
// resp.setResponseLength(0); try {
// } dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8");
// } dataOffset = 0;
// amountToWrite = dataToWrite.length;
// private byte[] dataToWrite; isErrorPage = true;
// private int dataOffset; cefResponse.setHeaderByName("content-length", "" + amountToWrite, true);
// private int amountToWrite; } catch(UnsupportedEncodingException ex) {
// cefResponse.setHeaderByName("content-length", "" + 0, true);
// @Override // cefResponse.setResponseLength(0);
// public boolean readResponse(ISchemeResponseData data) { }
// if(dataToWrite == null) { }
// if(isErrorPage) {
private byte[] dataToWrite;
private int dataOffset;
private int amountToWrite;
@Override
public boolean readResponse(byte[] bytes, int i, IntRef intRef, CefCallback cefCallback) {
if(dataToWrite == null) {
if(isErrorPage) {
// data.setAmountRead(0); // data.setAmountRead(0);
// return false; return false;
// } }
//
// dataToWrite = task.waitForData(); dataToWrite = task.waitForData();
// dataOffset = 3; //packet ID + size dataOffset = 3; //packet ID + size
// amountToWrite = task.getDataLength(); amountToWrite = task.getDataLength();
//
// if(amountToWrite <= 0) { if(amountToWrite <= 0) {
// dataToWrite = null; dataToWrite = null;
// data.setAmountRead(0); // data.setAmountRead(0);
// return false; return false;
// } }
// } }
//
// int toWrite = data.getBytesToRead(); // int toWrite = data.getBytesToRead();
// if(toWrite > amountToWrite) // if(toWrite > amountToWrite)
// toWrite = amountToWrite; // toWrite = amountToWrite;
//
// System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite); // System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite);
// data.setAmountRead(toWrite); // data.setAmountRead(toWrite);
//
// dataOffset += toWrite; // dataOffset += toWrite;
// amountToWrite -= toWrite; // amountToWrite -= toWrite;
//
// if(amountToWrite <= 0) { if(amountToWrite <= 0) {
// if(!isErrorPage) if(!isErrorPage)
// task.nextData(); task.nextData();
//
// dataToWrite = null; dataToWrite = null;
// } }
//
// return true; return true;
// } }
//
//} @Override
public void cancel() {
}
public static String mapMime(String ext) {
switch (ext) {
case "htm":
case "html":
return "text/html";
case "css":
return "text/css";
case "js":
return "text/javascript";
case "png":
return "image/png";
case "jpg":
case "jpeg":
return "image/jpeg";
case "gif":
return "image/gif";
case "svg":
return "image/svg+xml";
case "xml":
return "text/xml";
case "txt":
return "text/plain";
default:
return null;
}
}
}

View File

@ -110,12 +110,12 @@ public class ControlGroup extends Container {
RenderSystem.enableBlend(); RenderSystem.enableBlend();
RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
double x1 = (double) x; double x1 = x;
double y1 = (double) y; double y1 = y;
double x2 = (double) (x + width); double x2 = (x + width);
double y2 = (double) (y + height); double y2 = (y + height);
double bp = 4.0; double bp = 4.0;
double lw = (double) labelW; double lw = labelW;
x1 += bp; x1 += bp;
y1 += bp; y1 += bp;

View File

@ -63,6 +63,7 @@ public class ScreenControlRegistry {
register(ManageRightsAndUpdgradesControl.id, new ScreenControlType<>(ManageRightsAndUpdgradesControl.class, ManageRightsAndUpdgradesControl::new)); register(ManageRightsAndUpdgradesControl.id, new ScreenControlType<>(ManageRightsAndUpdgradesControl.class, ManageRightsAndUpdgradesControl::new));
register(ClickControl.id, new ScreenControlType<>(ClickControl.class, ClickControl::new)); register(ClickControl.id, new ScreenControlType<>(ClickControl.class, ClickControl::new));
register(OwnerControl.id, new ScreenControlType<>(OwnerControl.class, OwnerControl::new)); register(OwnerControl.id, new ScreenControlType<>(OwnerControl.class, OwnerControl::new));
register(TurnOffControl.id, new ScreenControlType<>(TurnOffControl.class, (buf) -> TurnOffControl.INSTANCE));
} }
public static ScreenControl parse(FriendlyByteBuf buf) { public static ScreenControl parse(FriendlyByteBuf buf) {

View File

@ -0,0 +1,49 @@
package net.montoyo.wd.controls.builtin;
import net.minecraft.core.BlockPos;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.network.NetworkEvent;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.controls.ScreenControl;
import net.montoyo.wd.core.MissingPermissionException;
import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.utilities.BlockSide;
import net.montoyo.wd.utilities.NameUUIDPair;
import java.util.function.Function;
public class TurnOffControl extends ScreenControl {
public static final ResourceLocation id = new ResourceLocation("webdisplays:deactivate");
public static final TurnOffControl INSTANCE = new TurnOffControl();
public TurnOffControl() {
super(id);
}
@Override
public void write(FriendlyByteBuf buf) {
}
@Override
public void handleServer(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx, Function<Integer, Boolean> permissionChecker) throws MissingPermissionException {
throw new RuntimeException("Cannot handle deactivation packet from server");
}
@Override
@OnlyIn(Dist.CLIENT)
public void handleClient(BlockPos pos, BlockSide side, TileEntityScreen tes, NetworkEvent.Context ctx) {
if (side != null) {
WebDisplays.PROXY.closeGui(pos, side);
tes.disableScreen(side);
} else {
for (BlockSide value : BlockSide.values()) {
WebDisplays.PROXY.closeGui(pos, value);
tes.disableScreen(value);
}
}
}
}

View File

@ -64,7 +64,7 @@ public class TileEntityScreen extends BlockEntity {
public TileEntityScreen(BlockPos arg2, BlockState arg3) { public TileEntityScreen(BlockPos arg2, BlockState arg3) {
super(TileInit.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); super(TileInit.SCREEN_BLOCK_ENTITY.get(), arg2, arg3);
} }
public static class Screen { public static class Screen {
public BlockSide side; public BlockSide side;
@ -1140,7 +1140,27 @@ public class TileEntityScreen extends BlockEntity {
scr.upgrades.clear(); scr.upgrades.clear();
} }
WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), new S2CMessageCloseGui(getBlockPos())); WDNetworkRegistry.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), S2CMessageScreenUpdate.turnOff(getBlockPos(), null));
}
public void disableScreen(BlockSide side) {
Screen remove = null;
for (Screen screen : screens) {
if (screen.side == side) {
remove = screen;
break;
}
}
if (remove == null) return;
if (level != null && !level.isClientSide) {
final Screen scrn = remove;
remove.upgrades.forEach(is -> dropUpgrade(is, scrn.side, null));
}
remove.upgrades.clear();
screens.remove(remove);
} }
public void setOwner(BlockSide side, Player newOwner) { public void setOwner(BlockSide side, Player newOwner) {

View File

@ -86,7 +86,13 @@ public class S2CMessageScreenUpdate extends Packet {
screenUpdate.control = new OwnerControl(owner); screenUpdate.control = new OwnerControl(owner);
return screenUpdate; return screenUpdate;
} }
public static S2CMessageScreenUpdate turnOff(BlockPos blockPos, BlockSide side) {
S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(blockPos, side);
screenUpdate.control = TurnOffControl.INSTANCE;
return screenUpdate;
}
@Override @Override
public void write(FriendlyByteBuf buf) { public void write(FriendlyByteBuf buf) {
buf.writeBlockPos(pos); buf.writeBlockPos(pos);