diff --git a/src/main/java/net/montoyo/wd/client/ClientProxy.java b/src/main/java/net/montoyo/wd/client/ClientProxy.java index 9c78cda..d9eee83 100644 --- a/src/main/java/net/montoyo/wd/client/ClientProxy.java +++ b/src/main/java/net/montoyo/wd/client/ClientProxy.java @@ -90,12 +90,8 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer private long lastURLSent; private PadData(String url, int id) { - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } + Messages.sendUrlUpdate(url); + String webUrl = SyncedUrl.getUrl(); view = mcef.createBrowser(WebDisplays.applyBlacklist(webUrl)); view.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY); isInHotbar = true; diff --git a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java index 680704e..4bca238 100644 --- a/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java +++ b/src/main/java/net/montoyo/wd/client/gui/GuiSetURL2.java @@ -24,6 +24,7 @@ import net.montoyo.wd.net.Messages; import net.montoyo.wd.net.server.SMessagePadCtrl; import net.montoyo.wd.net.server.SMessageScreenCtrl; import net.montoyo.wd.utilities.BlockSide; +import net.montoyo.wd.utilities.SyncedUrl; import net.montoyo.wd.utilities.Util; import net.montoyo.wd.utilities.Vector3i; @@ -105,11 +106,8 @@ public class GuiSetURL2 extends WDScreen { private void validate(String url) { if(!url.isEmpty()) { - try { - TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } + Messages.sendUrlUpdate(url); + url = SyncedUrl.getUrl(); url = Util.addProtocol(url); url = ((ClientProxy) WebDisplays.PROXY).getMCEF().punycode(url); diff --git a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java index b88acd0..e26a38f 100644 --- a/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java +++ b/src/main/java/net/montoyo/wd/client/renderers/ScreenRenderer.java @@ -4,27 +4,21 @@ package net.montoyo.wd.client.renderers; -import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; -import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.blockentity.BlockEntityRenderer; import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider; import net.minecraft.world.phys.AABB; -import net.montoyo.wd.SharedProxy; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.client.ClientProxy; import net.montoyo.wd.entity.ServerEventHandler; import net.montoyo.wd.entity.TileEntityScreen; -import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.utilities.Vector3f; import net.montoyo.wd.utilities.Vector3i; import org.jetbrains.annotations.NotNull; -import java.io.IOException; - import static com.mojang.math.Vector3f.*; import static org.lwjgl.opengl.GL11.*; diff --git a/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java b/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java index 2069e34..567b3d6 100644 --- a/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java +++ b/src/main/java/net/montoyo/wd/entity/ServerEventHandler.java @@ -3,30 +3,38 @@ package net.montoyo.wd.entity; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; import net.montoyo.wd.client.renderers.ScreenRenderer; -import net.montoyo.wd.miniserv.SyncPlugin; - -import java.util.HashMap; -import java.util.Map; - -public class ServerEventHandler extends ScreenRenderer{ - public static final Map playerScreens = new HashMap<>(); +import net.montoyo.wd.net.Messages; +import net.montoyo.wd.utilities.SyncedUrl; +@Mod.EventBusSubscriber(modid = "webdisplays", bus = Mod.EventBusSubscriber.Bus.FORGE) +public class ServerEventHandler { @SubscribeEvent - public void onPlayerConnect(PlayerEvent.PlayerLoggedInEvent event) { - // create a new instance of the ScreenRenderer class for the player - ServerPlayer player = (ServerPlayer) event.getEntity(); - String url = SyncPlugin.getPlayerString(player); - ScreenRenderer screen = new ScreenRenderer(url); + public static void onPlayerLoggedIn(PlayerEvent.PlayerLoggedInEvent event) { + // Send current URL to player + String url = SyncedUrl.getUrl(); - // store the ScreenRenderer instance in the playerScreens map - playerScreens.put(player, screen); + if(event.getEntity() instanceof ServerPlayer serverPlayer) { + new ScreenRenderer(url); + Messages.sendUrlToPlayer(serverPlayer, url); + } } @SubscribeEvent - public void onPlayerDisconnect(PlayerEvent.PlayerLoggedOutEvent event) { - // remove the ScreenRenderer instance for the player - ServerPlayer player = (ServerPlayer) event.getEntity(); - playerScreens.remove(player); + public static void onPlayerLoggedOut(PlayerEvent.PlayerLoggedOutEvent event) { + // Re-sync URL when player logs back in + String url = SyncedUrl.getUrl(); + Messages.sendUrlUpdate(url); + } + + @SubscribeEvent + public static void onPlayerChangedDimension(PlayerEvent.PlayerChangedDimensionEvent event) { + // Send current URL to player + String url = SyncedUrl.getUrl(); + if(event.getEntity() instanceof ServerPlayer serverPlayer) { + new ScreenRenderer(url); + Messages.sendUrlToPlayer(serverPlayer, url); + } } } \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java index 08b51e9..fd7afcb 100644 --- a/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java +++ b/src/main/java/net/montoyo/wd/entity/TileEntityScreen.java @@ -4,19 +4,10 @@ package net.montoyo.wd.entity; -import com.mojang.authlib.minecraft.client.MinecraftClient; -import net.minecraft.client.Minecraft; -import net.minecraft.client.multiplayer.ClientPacketListener; -import net.minecraft.client.multiplayer.PlayerInfo; -import net.minecraft.client.multiplayer.ServerData; -import net.minecraft.client.multiplayer.resolver.ServerAddress; -import net.minecraft.client.player.AbstractClientPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.network.Connection; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerPlayer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; @@ -31,7 +22,6 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.network.PacketDistributor; import net.montoyo.mcef.api.IBrowser; -import net.montoyo.wd.SharedProxy; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.block.BlockScreen; import net.montoyo.wd.client.ClientProxy; @@ -43,21 +33,15 @@ import net.montoyo.wd.data.ScreenConfigData; import net.montoyo.wd.init.BlockInit; import net.montoyo.wd.init.ItemInit; import net.montoyo.wd.init.TileInit; -import net.montoyo.wd.miniserv.SyncPlugin; import net.montoyo.wd.net.Messages; import net.montoyo.wd.net.client.*; -import net.montoyo.wd.net.server.SMessageGetUrl; import net.montoyo.wd.net.server.SMessageRequestTEData; -import net.montoyo.wd.net.server.URLMessage; import net.montoyo.wd.utilities.*; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.io.IOException; -import java.net.*; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.function.Consumer; import static net.montoyo.wd.block.BlockPeripheral.point; @@ -379,20 +363,6 @@ public class TileEntityScreen extends BlockEntity { Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> ep), new CMessageAddScreen(this)); } - public static String url(String url) throws IOException { - System.out.println("URL received: " + url); - if (!(WebDisplays.PROXY instanceof ClientProxy)) { - List serverPlayers = WebDisplays.PROXY.getServer().getPlayerList().getPlayers(); - SyncPlugin.syncPlayers(serverPlayers); - for (ServerPlayer serverPlayer : serverPlayers) { - SyncPlugin.setPlayerString(serverPlayer, url); - } - return url; - } else { - return null; - } - } - public void setScreenURL(BlockSide side, String url) throws IOException { Screen scr = getScreen(side); if (scr == null) { @@ -400,7 +370,8 @@ public class TileEntityScreen extends BlockEntity { return; } - String weburl = url(url); + Messages.sendUrlUpdate(url); + String weburl = SyncedUrl.getUrl(); weburl = WebDisplays.applyBlacklist(weburl); scr.url = weburl; @@ -721,14 +692,10 @@ public class TileEntityScreen extends BlockEntity { public void updateClientSideURL(IBrowser target, String url) { for (Screen scr : screens) { if (scr.browser == target) { - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } - boolean blacklisted = WebDisplays.isSiteBlacklisted(url); - scr.url = blacklisted ? WebDisplays.BLACKLIST_URL : url; //FIXME: This is an invalid fix for something that CANNOT be fixed + Messages.sendUrlUpdate(url); + String weburl = SyncedUrl.getUrl(); + boolean blacklisted = WebDisplays.isSiteBlacklisted(weburl); + scr.url = blacklisted ? WebDisplays.BLACKLIST_URL : weburl; //FIXME: This is an invalid fix for something that CANNOT be fixed scr.videoType = VideoType.getTypeFromURL(scr.url); ytVolume = Float.POSITIVE_INFINITY; //Force volume update diff --git a/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java b/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java deleted file mode 100644 index cd2c33c..0000000 --- a/src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java +++ /dev/null @@ -1,43 +0,0 @@ -package net.montoyo.wd.miniserv; - -import net.minecraft.server.level.ServerPlayer; -import net.montoyo.wd.net.Messages; -import net.montoyo.wd.net.server.SMessageGetUrl; -import net.montoyo.wd.net.server.URLMessage; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class SyncPlugin { - private static final Map> syncedPlayers = new HashMap<>(); - private static final Map URL = new HashMap<>(); - - public static void syncPlayers(List players) { - for (ServerPlayer player : players) { - List syncedPlayersList = new ArrayList<>(players); - syncedPlayersList.remove(player); - syncedPlayers.put(player, syncedPlayersList); - } - } - - public static String getPlayerString(ServerPlayer player) { - if(URL.get(player) == null) { - setPlayerString(player, new URLMessage().getURL()); - } - return URL.get(player); - } - - public static void setPlayerString(ServerPlayer player, String value) { - URL.put(player, value); - List syncedPlayersList = syncedPlayers.get(player); - if (syncedPlayersList != null) { - for (ServerPlayer syncedPlayer : syncedPlayersList) { - if(!syncedPlayer.hasDisconnected()) { - Messages.INSTANCE.sendToServer(new SMessageGetUrl(URL.get(syncedPlayer))); - } - } - } - } -} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/Messages.java b/src/main/java/net/montoyo/wd/net/Messages.java index d55de2c..b2fa6f6 100644 --- a/src/main/java/net/montoyo/wd/net/Messages.java +++ b/src/main/java/net/montoyo/wd/net/Messages.java @@ -7,21 +7,27 @@ package net.montoyo.wd.net; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.util.AttributeKey; +import net.minecraft.client.Minecraft; import net.minecraft.core.Holder; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; import net.minecraftforge.network.NetworkEvent; import net.minecraftforge.network.NetworkRegistry; +import net.minecraftforge.network.PacketDistributor; import net.minecraftforge.network.simple.SimpleChannel; import net.montoyo.wd.net.client.*; import net.montoyo.wd.net.server.*; +import net.montoyo.wd.utilities.SyncedUrl; +import org.jline.utils.Log; import java.lang.reflect.InvocationTargetException; import java.util.function.Supplier; @@ -29,6 +35,8 @@ import java.util.function.Supplier; @Mod.EventBusSubscriber public class Messages { + private static final String CHANNEL_NAME = "webdisplays:packetsystem"; + private static final String PROTOCOL_VERSION = "1"; private static int index = 0; public static final SimpleChannel INSTANCE = NetworkRegistry.newSimpleChannel( @@ -54,7 +62,29 @@ public class Messages { INSTANCE.registerMessage(index++, SMessageScreenCtrl.class, SMessageScreenCtrl::encode, SMessageScreenCtrl::decode, SMessageScreenCtrl::handle); INSTANCE.registerMessage(index++, SMessagePadCtrl.class, SMessagePadCtrl::encode, SMessagePadCtrl::decode, SMessagePadCtrl::handle); INSTANCE.registerMessage(index++, CMessageOpenGui.class, CMessageOpenGui::encode, CMessageOpenGui::decode, CMessageOpenGui::handle); - INSTANCE.registerMessage(index++, SMessageGetUrl.class, SMessageGetUrl::encode, SMessageGetUrl::decode, SMessageGetUrl::handle); - INSTANCE.registerMessage(index++, URLMessage.class, URLMessage::encode, URLMessage::decode, URLMessage::handle); + INSTANCE.registerMessage(index++, SyncedUrlPacket.class, SyncedUrlPacket::encode, SyncedUrlPacket::decode, SyncedUrlPacket::handle); + } + + public static void sendUrlUpdate(String newUrl) { + if (newUrl != null && Minecraft.getInstance().getConnection() != null) { + Messages.INSTANCE.sendToServer(new SyncedUrlPacket(newUrl)); + } + } + + public static void sendUrlToPlayer(ServerPlayer player, String url) { + if(url == null) { + url = "https://www.google.com"; + } + SyncedUrl.setUrl(url); + Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> player), new SyncedUrlPacket(url)); + } + + @SubscribeEvent + public static void onPacketReceived(NetworkEvent.ServerCustomPayloadEvent event) { + if (event.getSource().get().getDirection().getReceptionSide() == LogicalSide.SERVER && CHANNEL_NAME.equals(event.getPayload().readUtf())) { + String newUrl = event.getPayload().readUtf(); + SyncedUrl.updateUrl(newUrl); + Log.debug("Received URL update from client: {}", newUrl); + } } } diff --git a/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java b/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java index f4cae6d..93f3dc5 100644 --- a/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java +++ b/src/main/java/net/montoyo/wd/net/client/CMessageAddScreen.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.entity.TileEntityScreen; +import net.montoyo.wd.net.Messages; import net.montoyo.wd.utilities.*; import java.io.IOException; @@ -105,20 +106,13 @@ public class CMessageAddScreen { for (TileEntityScreen.Screen entry : screens) { TileEntityScreen.Screen scr = tes.addScreen(entry.side, entry.size, entry.resolution, null, false); scr.rotation = entry.rotation; - String webUrl; - - try { - webUrl = TileEntityScreen.url(entry.url); - } catch (IOException e) { - throw new RuntimeException(e); - } - - scr.url = webUrl; + Messages.sendUrlUpdate(entry.url); + scr.url = SyncedUrl.getUrl(); scr.owner = entry.owner; scr.upgrades = entry.upgrades; if (scr.browser != null) - scr.browser.loadURL(webUrl); + scr.browser.loadURL(scr.url); } }); diff --git a/src/main/java/net/montoyo/wd/net/client/SyncedUrlPacket.java b/src/main/java/net/montoyo/wd/net/client/SyncedUrlPacket.java new file mode 100644 index 0000000..4103950 --- /dev/null +++ b/src/main/java/net/montoyo/wd/net/client/SyncedUrlPacket.java @@ -0,0 +1,29 @@ +package net.montoyo.wd.net.client; + +import net.minecraft.network.FriendlyByteBuf; +import net.minecraftforge.network.NetworkEvent; +import net.montoyo.wd.net.Messages; + +import java.util.function.Supplier; + +public class SyncedUrlPacket { + private String url; + + public SyncedUrlPacket(String url) { + this.url = url; + } + + public void encode(FriendlyByteBuf buffer) { + buffer.writeUtf(this.url); + } + + public static SyncedUrlPacket decode(FriendlyByteBuf buffer) { + return new SyncedUrlPacket(buffer.readUtf()); + } + + public void handle(Supplier contextSupplier) { + NetworkEvent.Context context = contextSupplier.get(); + Messages.sendUrlUpdate(this.url); + context.setPacketHandled(true); + } +} \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java b/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java deleted file mode 100644 index 3de051c..0000000 --- a/src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.montoyo.wd.net.server; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; -import net.minecraftforge.network.PacketDistributor; -import net.montoyo.wd.net.Messages; - -import java.util.Objects; -import java.util.function.Supplier; - -public class SMessageGetUrl { - String url; - - public SMessageGetUrl() { - } - - public SMessageGetUrl(String url) { - this.url = url; - } - - public static SMessageGetUrl decode(FriendlyByteBuf buf) { - SMessageGetUrl message = new SMessageGetUrl(); - message.url = buf.readUtf(); - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(url); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().enqueueWork(() -> { - if(Objects.requireNonNull(contextSupplier.get().getSender()).connection.getConnection().isConnected()) { - Messages.INSTANCE.send(PacketDistributor.PLAYER.with(() -> contextSupplier.get().getSender()), new URLMessage(url)); - } - Messages.INSTANCE.send(PacketDistributor.ALL.noArg(), new URLMessage(url)); - }); - contextSupplier.get().setPacketHandled(true); - } -} diff --git a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java b/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java index 09cf3ff..fa5b81e 100644 --- a/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java +++ b/src/main/java/net/montoyo/wd/net/server/SMessagePadCtrl.java @@ -14,6 +14,8 @@ import net.minecraftforge.network.NetworkEvent; import net.montoyo.wd.WebDisplays; import net.montoyo.wd.entity.TileEntityScreen; import net.montoyo.wd.init.ItemInit; +import net.montoyo.wd.net.Messages; +import net.montoyo.wd.utilities.SyncedUrl; import java.io.IOException; import java.util.function.Supplier; @@ -56,12 +58,8 @@ public class SMessagePadCtrl implements Runnable { if(!is.getTag().contains("PadID")) is.getTag().putInt("PadID", WebDisplays.getNextAvailablePadID()); - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } + Messages.sendUrlUpdate(url); + String webUrl = SyncedUrl.getUrl(); is.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); } } @@ -80,12 +78,8 @@ public class SMessagePadCtrl implements Runnable { target = player.getInventory().offhand.get(0); if(target != null) { - String webUrl; - try { - webUrl = TileEntityScreen.url(url); - } catch (IOException e) { - throw new RuntimeException(e); - } + Messages.sendUrlUpdate(url); + String webUrl = SyncedUrl.getUrl(); target.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl)); } } diff --git a/src/main/java/net/montoyo/wd/net/server/URLMessage.java b/src/main/java/net/montoyo/wd/net/server/URLMessage.java deleted file mode 100644 index a3a86ca..0000000 --- a/src/main/java/net/montoyo/wd/net/server/URLMessage.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.montoyo.wd.net.server; - -import net.minecraft.network.FriendlyByteBuf; -import net.minecraftforge.network.NetworkEvent; - -import java.util.function.Supplier; - -public class URLMessage { - - private String url; - - public URLMessage() {} - - public URLMessage(String url) { - this.url = url; - } - - public String getURL() { - return url; - } - - public static URLMessage decode(FriendlyByteBuf buf) { - URLMessage message = new URLMessage(); - message.url = buf.readUtf(); - return message; - } - - public void encode(FriendlyByteBuf buf) { - buf.writeUtf(url); - } - - public void handle(Supplier contextSupplier) { - contextSupplier.get().setPacketHandled(true); - } - } \ No newline at end of file diff --git a/src/main/java/net/montoyo/wd/utilities/SyncedUrl.java b/src/main/java/net/montoyo/wd/utilities/SyncedUrl.java new file mode 100644 index 0000000..0c1dedf --- /dev/null +++ b/src/main/java/net/montoyo/wd/utilities/SyncedUrl.java @@ -0,0 +1,20 @@ +package net.montoyo.wd.utilities; + +import net.montoyo.wd.net.Messages; + +public class SyncedUrl { + private static String url; + + public static String getUrl() { + return url; + } + + public static void setUrl(String newUrl) { + url = newUrl; + Messages.sendUrlUpdate(newUrl); + } + + public static void updateUrl(String newUrl) { + url = newUrl; + } +} \ No newline at end of file