Fixed almost all sync issues except one
This commit is contained in:
parent
a4f9fdca7a
commit
26f6aa5de4
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
32
src/main/java/net/montoyo/wd/entity/ServerEventHandler.java
Normal file
32
src/main/java/net/montoyo/wd/entity/ServerEventHandler.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
51
src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java
Normal file
51
src/main/java/net/montoyo/wd/miniserv/SyncPlugin.java
Normal 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)));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
41
src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java
Normal file
41
src/main/java/net/montoyo/wd/net/server/SMessageGetUrl.java
Normal 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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
35
src/main/java/net/montoyo/wd/net/server/URLMessage.java
Normal file
35
src/main/java/net/montoyo/wd/net/server/URLMessage.java
Normal 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);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user