Fixed almost all sync issues except one

This commit is contained in:
Mysticpasta1 2023-03-07 11:15:24 -06:00
parent a4f9fdca7a
commit 26f6aa5de4
10 changed files with 249 additions and 27 deletions

View File

@ -72,6 +72,7 @@ import net.montoyo.wd.utilities.*;
import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.lang.reflect.Field;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
@ -89,7 +90,13 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
private long lastURLSent;
private PadData(String url, int id) {
view = mcef.createBrowser(WebDisplays.applyBlacklist(url));
String webUrl;
try {
webUrl = TileEntityScreen.url(url);
} catch (IOException e) {
throw new RuntimeException(e);
}
view = mcef.createBrowser(WebDisplays.applyBlacklist(webUrl));
view.resize((int) WebDisplays.INSTANCE.padResX, (int) WebDisplays.INSTANCE.padResY);
isInHotbar = true;
this.id = id;
@ -165,6 +172,8 @@ public class ClientProxy extends SharedProxy implements IDisplayHandler, IJSQuer
mcef.registerDisplayHandler(this);
//mcef.registerJSQueryHandler(this); //TODO why crashing on this method!
findAdvancementToProgressField();
String url = "https://www.google.com";
new ScreenRenderer(url);
}
@Override

View File

@ -16,6 +16,8 @@ import net.montoyo.wd.client.ClientProxy;
import net.montoyo.wd.client.gui.controls.Button;
import net.montoyo.wd.client.gui.controls.TextField;
import net.montoyo.wd.client.gui.loading.FillControl;
import net.montoyo.wd.client.renderers.ScreenRenderer;
import net.montoyo.wd.entity.ServerEventHandler;
import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.init.ItemInit;
import net.montoyo.wd.net.Messages;
@ -119,8 +121,9 @@ public class GuiSetURL2 extends WDScreen {
if(held.getItem().equals(ItemInit.itemMinePad.get()) && held.getTag() != null && held.getTag().contains("PadID")) {
ClientProxy.PadData pd = ((ClientProxy) WebDisplays.PROXY).getPadByID(held.getTag().getInt("PadID"));
if(pd != null && pd.view != null)
if(pd != null && pd.view != null) {
pd.view.loadURL(WebDisplays.applyBlacklist(url));
}
}
} else
Messages.INSTANCE.sendToServer(SMessageScreenCtrl.setURL(tileEntity, screenSide, url, remoteLocation));

View File

@ -7,6 +7,7 @@ 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;
@ -15,7 +16,9 @@ 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;
@ -27,6 +30,14 @@ import static org.lwjgl.opengl.GL11.*;
public class ScreenRenderer implements BlockEntityRenderer<TileEntityScreen> {
private String url;
public ScreenRenderer(String url) {
this.url = url;
}
public ScreenRenderer() {}
public static class ScreenRendererProvider implements BlockEntityRendererProvider<TileEntityScreen> {
@Override
public @NotNull BlockEntityRenderer<TileEntityScreen> create(@NotNull Context arg) {
@ -52,7 +63,7 @@ public class ScreenRenderer implements BlockEntityRenderer<TileEntityScreen> {
TileEntityScreen.Screen scr = te.getScreen(i);
if(scr.browser == null) {
if(WebDisplays.PROXY instanceof ClientProxy clientProxy) {
scr.browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(scr.url));
scr.browser = clientProxy.getMCEF().createBrowser(WebDisplays.applyBlacklist(this.url != null ? this.url : "https://www.google.com"));
if (scr.rotation.isVertical)
scr.browser.resize(scr.resolution.y, scr.resolution.x);

View File

@ -0,0 +1,32 @@
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.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<ServerPlayer, ScreenRenderer> playerScreens = new HashMap<>();
@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);
// store the ScreenRenderer instance in the playerScreens map
playerScreens.put(player, screen);
}
@SubscribeEvent
public void onPlayerDisconnect(PlayerEvent.PlayerLoggedOutEvent event) {
// remove the ScreenRenderer instance for the player
ServerPlayer player = (ServerPlayer) event.getEntity();
playerScreens.remove(player);
}
}

View File

@ -4,10 +4,18 @@
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;
@ -23,8 +31,10 @@ 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;
import net.montoyo.wd.core.DefaultUpgrade;
import net.montoyo.wd.core.IUpgrade;
import net.montoyo.wd.core.JSServerRequest;
@ -33,21 +43,21 @@ 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.CMessageAddScreen;
import net.montoyo.wd.net.client.CMessageCloseGui;
import net.montoyo.wd.net.client.CMessageJSResponse;
import net.montoyo.wd.net.client.CMessageScreenUpdate;
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.ArrayList;
import java.util.Collections;
import java.util.UUID;
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;
@ -370,17 +380,17 @@ public class TileEntityScreen extends BlockEntity {
}
public static String url(String url) throws IOException {
MinecraftServer server = WebDisplays.PROXY.getServer();
System.setProperty("http.proxyHost", server.getLocalIp());
System.setProperty("http.proxyPort", String.valueOf(server.getPort()));
Proxy webProxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(InetAddress.getByName(server.getLocalIp()), server.getPort()));
URL weburl1 = new URL(url);
HttpURLConnection webProxyConnection = (HttpURLConnection) weburl1.openConnection(webProxy);
return webProxyConnection.getURL().toString();
System.out.println("URL received: " + url);
if (!(WebDisplays.PROXY instanceof ClientProxy)) {
List<ServerPlayer> 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 {
@ -403,9 +413,6 @@ public class TileEntityScreen extends BlockEntity {
Messages.INSTANCE.send(PacketDistributor.NEAR.with(() -> point(level, getBlockPos())), CMessageScreenUpdate.setURL(this, side, weburl));
setChanged();
}
System.setProperty("http.proxyHost", null);
System.setProperty("http.proxyPort", null);
}
public void removeScreen(BlockSide side) {
@ -714,6 +721,12 @@ 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
scr.videoType = VideoType.getTypeFromURL(scr.url);

View File

@ -0,0 +1,51 @@
package net.montoyo.wd.miniserv;
import com.mojang.math.Vector3d;
import net.minecraft.core.RegistryAccess;
import net.minecraft.network.Connection;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.PacketFlow;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Player;
import net.minecraftforge.network.NetworkDirection;
import net.minecraftforge.network.PacketDistributor;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.net.Messages;
import net.montoyo.wd.net.server.SMessageGetUrl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SyncPlugin {
private static final Map<ServerPlayer, List<ServerPlayer>> syncedPlayers = new HashMap<>();
private static final Map<ServerPlayer, String> URL = new HashMap<>();
public static void syncPlayers(List<ServerPlayer> players) {
for (ServerPlayer player : players) {
List<ServerPlayer> syncedPlayersList = new ArrayList<>(players);
syncedPlayersList.remove(player);
syncedPlayers.put(player, syncedPlayersList);
}
}
public static String getPlayerString(ServerPlayer player) {
if(URL.get(player) == null) {
return "https://www.google.com";
}
return URL.get(player);
}
public static void setPlayerString(ServerPlayer player, String value) {
URL.put(player, value);
List<ServerPlayer> syncedPlayersList = syncedPlayers.get(player);
if (syncedPlayersList != null) {
for (ServerPlayer syncedPlayer : syncedPlayersList) {
if(!syncedPlayer.hasDisconnected()) {
Messages.INSTANCE.sendToServer(new SMessageGetUrl(URL.get(syncedPlayer)));
}
}
}
}
}

View File

@ -4,18 +4,28 @@
package net.montoyo.wd.net;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.AttributeKey;
import net.minecraft.core.Holder;
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.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
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.simple.SimpleChannel;
import net.montoyo.wd.net.client.*;
import net.montoyo.wd.net.server.*;
import java.lang.reflect.InvocationTargetException;
import java.util.function.Supplier;
@Mod.EventBusSubscriber
public class Messages {
@ -44,5 +54,7 @@ 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);
}
}

View File

@ -0,0 +1,41 @@
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<NetworkEvent.Context> contextSupplier) {
contextSupplier.get().enqueueWork(() -> {
int connectTime = Objects.requireNonNull(Objects.requireNonNull(contextSupplier.get().getSender()).getServer()).getTickCount() - Objects.requireNonNull(contextSupplier.get().getSender()).connection.player.tickCount;
if(Objects.requireNonNull(contextSupplier.get().getSender()).connection.getConnection().isConnected() && connectTime > 20) {
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);
}
}

View File

@ -12,8 +12,10 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.network.NetworkEvent;
import net.montoyo.wd.WebDisplays;
import net.montoyo.wd.entity.TileEntityScreen;
import net.montoyo.wd.init.ItemInit;
import java.io.IOException;
import java.util.function.Supplier;
public class SMessagePadCtrl implements Runnable {
@ -54,7 +56,13 @@ public class SMessagePadCtrl implements Runnable {
if(!is.getTag().contains("PadID"))
is.getTag().putInt("PadID", WebDisplays.getNextAvailablePadID());
is.getTag().putString("PadURL", WebDisplays.applyBlacklist(url));
String webUrl;
try {
webUrl = TileEntityScreen.url(url);
} catch (IOException e) {
throw new RuntimeException(e);
}
is.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl));
}
}
} else {
@ -71,8 +79,15 @@ public class SMessagePadCtrl implements Runnable {
if(target == null && matchesMinePadID(player.getInventory().offhand.get(0)))
target = player.getInventory().offhand.get(0);
if(target != null)
target.getTag().putString("PadURL", WebDisplays.applyBlacklist(url));
if(target != null) {
String webUrl;
try {
webUrl = TileEntityScreen.url(url);
} catch (IOException e) {
throw new RuntimeException(e);
}
target.getTag().putString("PadURL", WebDisplays.applyBlacklist(webUrl));
}
}
}

View File

@ -0,0 +1,35 @@
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<NetworkEvent.Context> contextSupplier) {
contextSupplier.get().setPacketHandled(true);
}
}