add legacy forge mod and new forge mod support

This commit is contained in:
Lee 2024-04-10 14:03:35 +01:00
parent 63a3587586
commit cd3738a2b9
5 changed files with 110 additions and 57 deletions

@ -2,6 +2,7 @@ package cc.fascinated.model.mojang;
import cc.fascinated.model.server.JavaMinecraftServer; import cc.fascinated.model.server.JavaMinecraftServer;
import cc.fascinated.model.server.MinecraftServer; import cc.fascinated.model.server.MinecraftServer;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
@ -23,14 +24,19 @@ public final class JavaServerStatusToken {
private final MinecraftServer.Players players; private final MinecraftServer.Players players;
/** /**
* The mods running on the server. * The mods running on this server.
*/ */
private final MinecraftServer.Mod[] mods; @SerializedName("modinfo")
private JavaMinecraftServer.ForgeModInfo modInfo;
/** /**
* The plugins running on the server. * The mods running on this server.
* <p>
* This is only used for servers
* running 1.13 and above.
* </p>
*/ */
private final MinecraftServer.Plugin[] plugins; private JavaMinecraftServer.ForgeData forgeData;
/** /**
* The motd of the server. * The motd of the server.

@ -5,10 +5,8 @@ import cc.fascinated.common.JavaMinecraftVersion;
import cc.fascinated.common.ServerUtils; import cc.fascinated.common.ServerUtils;
import cc.fascinated.config.Config; import cc.fascinated.config.Config;
import cc.fascinated.model.mojang.JavaServerStatusToken; import cc.fascinated.model.mojang.JavaServerStatusToken;
import lombok.AllArgsConstructor; import com.google.gson.annotations.SerializedName;
import lombok.Getter; import lombok.*;
import lombok.NonNull;
import lombok.Setter;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.chat.ComponentSerializer; import net.md_5.bungee.chat.ComponentSerializer;
@ -29,14 +27,18 @@ public final class JavaMinecraftServer extends MinecraftServer {
private Favicon favicon; private Favicon favicon;
/** /**
* The mods of the server. * The mods running on this server.
*/ */
private MinecraftServer.Mod[] mods; private ForgeModInfo modInfo;
/** /**
* The plugins of the server. * The mods running on this server.
* <p>
* This is only used for servers
* running 1.13 and above.
* </p>
*/ */
private MinecraftServer.Plugin[] plugins; private ForgeData forgeData;
/** /**
* The mojang banned status of the server. * The mojang banned status of the server.
@ -44,12 +46,12 @@ public final class JavaMinecraftServer extends MinecraftServer {
private boolean mojangBanned; private boolean mojangBanned;
public JavaMinecraftServer(String hostname, String ip, int port, MOTD motd, Players players, public JavaMinecraftServer(String hostname, String ip, int port, MOTD motd, Players players,
@NonNull Version version, Favicon favicon, Mod[] mods, Plugin[] plugins) { @NonNull Version version, Favicon favicon, ForgeModInfo modInfo, ForgeData forgeData) {
super(hostname, ip, port, motd, players); super(hostname, ip, port, motd, players);
this.version = version; this.version = version;
this.favicon = favicon; this.favicon = favicon;
this.mods = mods; this.modInfo = modInfo;
this.plugins = plugins; this.forgeData = forgeData;
} }
/** /**
@ -75,8 +77,8 @@ public final class JavaMinecraftServer extends MinecraftServer {
token.getPlayers(), token.getPlayers(),
token.getVersion().detailedCopy(), token.getVersion().detailedCopy(),
JavaMinecraftServer.Favicon.create(token.getFavicon(), ServerUtils.getAddress(hostname, port)), JavaMinecraftServer.Favicon.create(token.getFavicon(), ServerUtils.getAddress(hostname, port)),
token.getMods(), token.getModInfo(),
token.getPlugins() token.getForgeData()
); );
} }
@ -151,4 +153,81 @@ public final class JavaMinecraftServer extends MinecraftServer {
return new Favicon(base64, Config.INSTANCE.getWebPublicUrl() + "/server/icon/%s".formatted(address)); return new Favicon(base64, Config.INSTANCE.getWebPublicUrl() + "/server/icon/%s".formatted(address));
} }
} }
/**
* Forge mod information for a server.
*/
@AllArgsConstructor @Getter @ToString
public static class ForgeModInfo {
/**
* The type of modded server this is.
*/
@NonNull private final String type;
/**
* The list of mods on this server, null or empty if none.
*/
private final ForgeMod[] modList;
/**
* A forge mod for a server.
*/
@AllArgsConstructor @Getter @ToString
private static class ForgeMod {
/**
* The id of this mod.
*/
@NonNull @SerializedName("modid") private final String name;
/**
* The version of this mod.
*/
private final String version;
}
}
@AllArgsConstructor @Getter
public static class ForgeData {
/**
* The list of mod channels on this server, null or empty if none.
*/
private final Channel[] channels;
/**
* The list of mods on this server, null or empty if none.
*/
private final Mod[] mods;
@AllArgsConstructor @Getter
public static class Channel {
/**
* The id of this mod channel.
*/
@NonNull @SerializedName("res") private final String name;
/**
* The version of this mod channel.
*/
private final String version;
/**
* Whether this mod channel is required to join.
*/
private boolean required;
}
@AllArgsConstructor @Getter
public static class Mod {
/**
* The id of this mod.
*/
@NonNull @SerializedName("modId") private final String name;
/**
* The version of this mod.
*/
@SerializedName("modmarker") private final String version;
}
}
} }

@ -141,40 +141,4 @@ public class MinecraftServer {
@NonNull private final String name; @NonNull private final String name;
} }
} }
/**
* Mod data for a server.
*/
@AllArgsConstructor @Getter
public static final class Mod {
/**
* The name of the mod.
*/
private final String name;
/**
* The version of the mod.
*/
private final String version;
}
/**
* Plugin data for a server.
*/
@AllArgsConstructor @Getter
public static final class Plugin {
/**
* The name of the plugin.
*/
private final String name;
/**
* The version of the plugin.
*/
private final String version;
}
} }

@ -47,6 +47,7 @@ public final class JavaMinecraftServerPinger implements MinecraftServerPinger<Ja
// Send the status request to the server, and await back the response // Send the status request to the server, and await back the response
JavaPacketStatusInStart packetStatusInStart = new JavaPacketStatusInStart(); JavaPacketStatusInStart packetStatusInStart = new JavaPacketStatusInStart();
packetStatusInStart.process(inputStream, outputStream); packetStatusInStart.process(inputStream, outputStream);
System.out.println(packetStatusInStart.getResponse());
JavaServerStatusToken token = Main.GSON.fromJson(packetStatusInStart.getResponse(), JavaServerStatusToken.class); JavaServerStatusToken token = Main.GSON.fromJson(packetStatusInStart.getResponse(), JavaServerStatusToken.class);
return JavaMinecraftServer.create(hostname, ip, port, token); return JavaMinecraftServer.create(hostname, ip, port, token);
} }

@ -3,9 +3,9 @@ server:
port: 80 port: 80
servlet: servlet:
context-path: / context-path: /
error:
whitelabel: # The public URL of the application
enabled: false public-url: http://localhost:80
# Spring Configuration # Spring Configuration
spring: spring:
@ -17,4 +17,7 @@ spring:
database: 0 database: 0
auth: "" # Leave blank for no auth auth: "" # Leave blank for no auth
public-url: http://localhost:80 # Don't serialize null values
jackson:
default-property-inclusion: non_null