From a4f8b630efbaf8ac5a7367b5a827cfbc16452427 Mon Sep 17 00:00:00 2001 From: GiantLuigi4 <49770992+GiantLuigi4@users.noreply.github.com> Date: Wed, 27 Sep 2023 21:36:35 -0400 Subject: [PATCH] Packet for turning off a screen, start working on schema stuff --- libs/mcef-2.x.jar | Bin 197581 -> 200767 bytes .../net/montoyo/wd/client/ClientProxy.java | 16 +- .../java/net/montoyo/wd/client/WDScheme.java | 327 ++++++++++-------- .../wd/client/gui/controls/ControlGroup.java | 10 +- .../wd/controls/ScreenControlRegistry.java | 1 + .../wd/controls/builtin/TurnOffControl.java | 49 +++ .../montoyo/wd/entity/TileEntityScreen.java | 24 +- .../client_bound/S2CMessageScreenUpdate.java | 8 +- 8 files changed, 282 insertions(+), 153 deletions(-) create mode 100644 src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java diff --git a/libs/mcef-2.x.jar b/libs/mcef-2.x.jar index ba5160d3f85b2580fa09e4443d1052a51a1cf38b..f4316ec7d38f6c72d24a70947eabf1a591628581 100644 GIT binary patch delta 19476 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

J4#G@|cUBw8%*5eQd{QD4w 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 F{s)XMt@{7~ diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 06fab8f..56ee004 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -85,6 +85,7 @@ import org.cef.CefSettings; import org.cef.browser.CefBrowser; import org.cef.browser.CefFrame; import org.cef.handler.CefDisplayHandler; +import org.cef.network.CefRequest; import org.joml.Vector3d; import org.lwjgl.glfw.GLFW; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -262,16 +263,21 @@ public class ClientProxy extends SharedProxy implements CefDisplayHandler/*, IJS @Override public void onCefInit(/*CefInitEvent event*/) { 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); minePadRenderer = new MinePadRenderer(); laserPointerRenderer = new LaserPointerRenderer(); -// if (mcef == null) -// throw new RuntimeException("MCEF is missing"); - MCEF.getClient().addDisplayHandler(this); // mcef.registerJSQueryHandler(this); findAdvancementToProgressField(); diff --git a/src/main/java/net/montoyo/wd/client/WDScheme.java b/src/main/java/net/montoyo/wd/client/WDScheme.java index 7e21582..40caf0f 100644 --- a/src/main/java/net/montoyo/wd/client/WDScheme.java +++ b/src/main/java/net/montoyo/wd/client/WDScheme.java @@ -1,149 +1,196 @@ -///* -// * Copyright (C) 2018 BARBOTIN Nicolas -// */ -// -//package net.montoyo.wd.client; -// -//import net.montoyo.mcef.api.IScheme; -//import net.montoyo.mcef.api.ISchemeResponseData; -//import net.montoyo.mcef.api.ISchemeResponseHeaders; -//import net.montoyo.mcef.api.SchemePreResponse; -//import net.montoyo.wd.WebDisplays; -//import net.montoyo.wd.miniserv.Constants; -//import net.montoyo.wd.miniserv.client.Client; -//import net.montoyo.wd.miniserv.client.ClientTaskGetFile; -//import net.montoyo.wd.utilities.Log; -//import net.montoyo.wd.utilities.Util; -// -//import java.io.UnsupportedEncodingException; -//import java.net.URLDecoder; -//import java.util.UUID; -// -//public class WDScheme implements IScheme { -// -// private static final String ERROR_PAGE = "

%d %s


Miniserv powered by WebDisplays"; -// private ClientTaskGetFile task; -// private boolean isErrorPage; -// -// @Override -// public SchemePreResponse processRequest(String url) { -// url = url.substring("wd://".length()); -// -// int pos = url.indexOf('/'); -// if(pos < 0) -// return SchemePreResponse.NOT_HANDLED; -// -// String uuidStr = url.substring(0, pos); -// String fileStr = url.substring(pos + 1); -// -// try { -// fileStr = URLDecoder.decode(fileStr, "UTF-8"); -// } catch(UnsupportedEncodingException ex) { -// Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex); -// } -// -// if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) -// return SchemePreResponse.NOT_HANDLED; -// -// UUID uuid; -// try { -// uuid = UUID.fromString(uuidStr); -// } catch(IllegalArgumentException ex) { -// return SchemePreResponse.NOT_HANDLED; //Invalid UUID -// } -// -// task = new ClientTaskGetFile(uuid, fileStr); -// return Client.getInstance().addTask(task) ? SchemePreResponse.HANDLED_CONTINUE : SchemePreResponse.NOT_HANDLED; -// } -// -// @Override -// public void getResponseHeaders(ISchemeResponseHeaders resp) { -// Log.info("Waiting for response..."); -// int status = task.waitForResponse(); -// Log.info("Got response %d", status); -// -// if(status == 0) { -// //OK -// int extPos = task.getFileName().lastIndexOf('.'); -// if(extPos >= 0) { -// String mime = ((ClientProxy) WebDisplays.PROXY).getMCEF().mimeTypeFromExtension(task.getFileName().substring(extPos + 1)); -// -// if(mime != null) -// resp.setMimeType(mime); -// } -// -// resp.setStatus(200); -// resp.setStatusText("OK"); -// resp.setResponseLength(-1); -// return; -// } -// -// int errCode; -// String errStr; -// -// if(status == Constants.GETF_STATUS_NOT_FOUND) { -// errCode = 404; -// errStr = "Not Found"; -// } else { -// errCode = 500; -// errStr = "Internal Server Error"; -// } -// -// resp.setStatus(errCode); -// resp.setStatusText(errStr); -// -// try { -// dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); -// dataOffset = 0; -// amountToWrite = dataToWrite.length; -// isErrorPage = true; -// resp.setResponseLength(amountToWrite); -// } catch(UnsupportedEncodingException ex) { -// resp.setResponseLength(0); -// } -// } -// -// private byte[] dataToWrite; -// private int dataOffset; -// private int amountToWrite; -// -// @Override -// public boolean readResponse(ISchemeResponseData data) { -// if(dataToWrite == null) { -// if(isErrorPage) { +/* + * Copyright (C) 2018 BARBOTIN Nicolas + */ + +package net.montoyo.wd.client; + +import net.montoyo.wd.miniserv.Constants; +import net.montoyo.wd.miniserv.client.Client; +import net.montoyo.wd.miniserv.client.ClientTaskGetFile; +import net.montoyo.wd.utilities.Log; +import net.montoyo.wd.utilities.Util; +import org.cef.callback.CefCallback; +import org.cef.handler.CefResourceHandler; +import org.cef.misc.IntRef; +import org.cef.misc.StringRef; +import org.cef.network.CefRequest; +import org.cef.network.CefResponse; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.util.UUID; + +public class WDScheme implements CefResourceHandler { + + private static final String ERROR_PAGE = "

%d %s


Miniserv powered by WebDisplays"; + private ClientTaskGetFile task; + private boolean isErrorPage; + + String url; + + public WDScheme(String url) { + this.url = url; + } + + @Override + public boolean processRequest(CefRequest cefRequest, CefCallback cefCallback) { + url = cefRequest.getURL(); + + int pos = url.indexOf('/'); + if(pos < 0) + return false; + + String uuidStr = url.substring(0, pos); + String fileStr = url.substring(pos + 1); + + try { + fileStr = URLDecoder.decode(fileStr, "UTF-8"); + } catch(UnsupportedEncodingException ex) { + Log.warningEx("UTF-8 isn't supported... yeah... and I'm a billionaire...", ex); + } + + if(uuidStr.isEmpty() || Util.isFileNameInvalid(fileStr)) + return false; + + UUID uuid; + try { + uuid = UUID.fromString(uuidStr); + } catch(IllegalArgumentException ex) { + return false; //Invalid UUID + } + + task = new ClientTaskGetFile(uuid, fileStr); + return Client.getInstance().addTask(task) ? true : false; + } + + @Override + public void getResponseHeaders(CefResponse cefResponse, IntRef intRef, StringRef stringRef) { + Log.info("Waiting for response..."); + int status = task.waitForResponse(); + Log.info("Got response %d", status); + + if(status == 0) { + //OK + int extPos = task.getFileName().lastIndexOf('.'); + if(extPos >= 0) { + String mime = mapMime(task.getFileName().substring(extPos + 1)); + + if(mime != null) + cefResponse.setMimeType(mime); + } + + cefResponse.setStatus(200); + cefResponse.setStatusText("OK"); + cefResponse.setHeaderByName("content-length", "" + -1, true); + return; + } + + int errCode; + String errStr; + + if(status == Constants.GETF_STATUS_NOT_FOUND) { + errCode = 404; + errStr = "Not Found"; + } else { + errCode = 500; + errStr = "Internal Server Error"; + } + + cefResponse.setStatus(errCode); + cefResponse.setStatusText(errStr); + + try { + dataToWrite = String.format(ERROR_PAGE, errCode, errStr).getBytes("UTF-8"); + dataOffset = 0; + amountToWrite = dataToWrite.length; + isErrorPage = true; + cefResponse.setHeaderByName("content-length", "" + amountToWrite, true); + } catch(UnsupportedEncodingException ex) { + cefResponse.setHeaderByName("content-length", "" + 0, true); +// cefResponse.setResponseLength(0); + } + } + + 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); -// return false; -// } -// -// dataToWrite = task.waitForData(); -// dataOffset = 3; //packet ID + size -// amountToWrite = task.getDataLength(); -// -// if(amountToWrite <= 0) { -// dataToWrite = null; + return false; + } + + dataToWrite = task.waitForData(); + dataOffset = 3; //packet ID + size + amountToWrite = task.getDataLength(); + + if(amountToWrite <= 0) { + dataToWrite = null; // data.setAmountRead(0); -// return false; -// } -// } -// + return false; + } + } + // int toWrite = data.getBytesToRead(); // if(toWrite > amountToWrite) // toWrite = amountToWrite; -// + // System.arraycopy(dataToWrite, dataOffset, data.getDataArray(), 0, toWrite); // data.setAmountRead(toWrite); -// + // dataOffset += toWrite; // amountToWrite -= toWrite; -// -// if(amountToWrite <= 0) { -// if(!isErrorPage) -// task.nextData(); -// -// dataToWrite = null; -// } -// -// return true; -// } -// -//} + + if(amountToWrite <= 0) { + if(!isErrorPage) + task.nextData(); + + dataToWrite = null; + } + + 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; + } + } +} diff --git a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java index ea162f3..ce32abf 100644 --- a/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java +++ b/src/main/java/net/montoyo/wd/client/gui/controls/ControlGroup.java @@ -110,12 +110,12 @@ public class ControlGroup extends Container { RenderSystem.enableBlend(); RenderSystem.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); - double x1 = (double) x; - double y1 = (double) y; - double x2 = (double) (x + width); - double y2 = (double) (y + height); + double x1 = x; + double y1 = y; + double x2 = (x + width); + double y2 = (y + height); double bp = 4.0; - double lw = (double) labelW; + double lw = labelW; x1 += bp; y1 += bp; diff --git a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java index 477baf3..3d85d8e 100644 --- a/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java +++ b/src/main/java/net/montoyo/wd/controls/ScreenControlRegistry.java @@ -63,6 +63,7 @@ public class ScreenControlRegistry { register(ManageRightsAndUpdgradesControl.id, new ScreenControlType<>(ManageRightsAndUpdgradesControl.class, ManageRightsAndUpdgradesControl::new)); register(ClickControl.id, new ScreenControlType<>(ClickControl.class, ClickControl::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) { diff --git a/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java new file mode 100644 index 0000000..13a5d13 --- /dev/null +++ b/src/main/java/net/montoyo/wd/controls/builtin/TurnOffControl.java @@ -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 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); + } + } + } +} diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 24ce5d4..d155b33 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -64,7 +64,7 @@ public class TileEntityScreen extends BlockEntity { public TileEntityScreen(BlockPos arg2, BlockState arg3) { super(TileInit.SCREEN_BLOCK_ENTITY.get(), arg2, arg3); } - + public static class Screen { public BlockSide side; @@ -1140,7 +1140,27 @@ public class TileEntityScreen extends BlockEntity { 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) { diff --git a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java index 94cc668..05c7bf5 100644 --- a/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java +++ b/src/main/java/net/montoyo/wd/net/client_bound/S2CMessageScreenUpdate.java @@ -86,7 +86,13 @@ public class S2CMessageScreenUpdate extends Packet { screenUpdate.control = new OwnerControl(owner); return screenUpdate; } - + + public static S2CMessageScreenUpdate turnOff(BlockPos blockPos, BlockSide side) { + S2CMessageScreenUpdate screenUpdate = new S2CMessageScreenUpdate(blockPos, side); + screenUpdate.control = TurnOffControl.INSTANCE; + return screenUpdate; + } + @Override public void write(FriendlyByteBuf buf) { buf.writeBlockPos(pos);