97 lines
3.4 KiB
Java
97 lines
3.4 KiB
Java
package net.minecraft.client.server;
|
|
|
|
import com.mojang.logging.LogUtils;
|
|
import java.io.IOException;
|
|
import java.net.DatagramPacket;
|
|
import java.net.DatagramSocket;
|
|
import java.net.InetAddress;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
import net.minecraft.DefaultUncaughtExceptionHandler;
|
|
import net.minecraftforge.api.distmarker.Dist;
|
|
import net.minecraftforge.api.distmarker.OnlyIn;
|
|
import org.slf4j.Logger;
|
|
|
|
@OnlyIn(Dist.CLIENT)
|
|
public class LanServerPinger extends Thread {
|
|
private static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0);
|
|
private static final Logger LOGGER = LogUtils.getLogger();
|
|
public static final String MULTICAST_GROUP = "224.0.2.60";
|
|
public static final int PING_PORT = 4445;
|
|
private static final long PING_INTERVAL = 1500L;
|
|
private final String motd;
|
|
private final DatagramSocket socket;
|
|
private boolean isRunning = true;
|
|
private final String serverAddress;
|
|
|
|
public LanServerPinger(String p_120109_, String p_120110_) throws IOException {
|
|
super("LanServerPinger #" + UNIQUE_THREAD_ID.incrementAndGet());
|
|
this.motd = p_120109_;
|
|
this.serverAddress = p_120110_;
|
|
this.setDaemon(true);
|
|
this.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER));
|
|
this.socket = new DatagramSocket();
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
String s = createPingString(this.motd, this.serverAddress);
|
|
byte[] abyte = s.getBytes(StandardCharsets.UTF_8);
|
|
|
|
while (!this.isInterrupted() && this.isRunning) {
|
|
try {
|
|
InetAddress inetaddress = InetAddress.getByName("224.0.2.60");
|
|
DatagramPacket datagrampacket = new DatagramPacket(abyte, abyte.length, inetaddress, 4445);
|
|
this.socket.send(datagrampacket);
|
|
} catch (IOException ioexception) {
|
|
LOGGER.warn("LanServerPinger: {}", ioexception.getMessage());
|
|
break;
|
|
}
|
|
|
|
try {
|
|
sleep(1500L);
|
|
} catch (InterruptedException interruptedexception) {
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void interrupt() {
|
|
super.interrupt();
|
|
this.isRunning = false;
|
|
}
|
|
|
|
public static String createPingString(String p_120114_, String p_120115_) {
|
|
return "[MOTD]" + p_120114_ + "[/MOTD][AD]" + p_120115_ + "[/AD]";
|
|
}
|
|
|
|
public static String parseMotd(String p_120112_) {
|
|
int i = p_120112_.indexOf("[MOTD]");
|
|
if (i < 0) {
|
|
return "missing no";
|
|
} else {
|
|
int j = p_120112_.indexOf("[/MOTD]", i + "[MOTD]".length());
|
|
return j < i ? "missing no" : p_120112_.substring(i + "[MOTD]".length(), j);
|
|
}
|
|
}
|
|
|
|
public static String parseAddress(String p_120117_) {
|
|
int i = p_120117_.indexOf("[/MOTD]");
|
|
if (i < 0) {
|
|
return null;
|
|
} else {
|
|
int j = p_120117_.indexOf("[/MOTD]", i + "[/MOTD]".length());
|
|
if (j >= 0) {
|
|
return null;
|
|
} else {
|
|
int k = p_120117_.indexOf("[AD]", i + "[/MOTD]".length());
|
|
if (k < 0) {
|
|
return null;
|
|
} else {
|
|
int l = p_120117_.indexOf("[/AD]", k + "[AD]".length());
|
|
return l < k ? null : p_120117_.substring(k + "[AD]".length(), l);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |