diff --git a/src/main/java/me/braydon/mc/common/MinecraftVersion.java b/src/main/java/me/braydon/mc/common/MinecraftVersion.java new file mode 100644 index 0000000..bf43ff5 --- /dev/null +++ b/src/main/java/me/braydon/mc/common/MinecraftVersion.java @@ -0,0 +1,187 @@ +package me.braydon.mc.common; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.ToString; +import lombok.extern.log4j.Log4j2; + +/** + * @author Braydon + * @see Protocol Version Numbers + * @see Spigot NMS (1.16+) + * @see Spigot NMS (1.10 - 1.15) + * @see Spigot NMS (1.8 - 1.9) + */ +@RequiredArgsConstructor @Getter @ToString @Log4j2(topic = "Minecraft Version") +public enum MinecraftVersion { + V1_20_3(765, "v1_20_R3"), // 1.20.3 & 1.20.4 + V1_20_2(764, "v1_20_R2"), // 1.20.2 + V1_20(763, "v1_20_R1"), // 1.20 & 1.20.1 + + V1_19_4(762, "v1_19_R3"), // 1.19.4 + V1_19_3(761, "v1_19_R2"), // 1.19.3 + V1_19_1(760, "v1_19_R1"), // 1.19.1 & 1.19.2 + V1_19(759, "v1_19_R1"), // 1.19 + + V1_18_2(758, "v1_18_R2"), // 1.18.2 + V1_18(757, "v1_18_R1"), // 1.18 & 1.18.1 + + V1_17_1(756, "v1_17_R1"), // 1.17.1 + V1_17(755, "v1_17_R1"), // 1.17 + + V1_16_4(754, "v1_16_R3"), // 1.16.4 & 1.16.5 + V1_16_3(753, "v1_16_R2"), // 1.16.3 + V1_16_2(751, "v1_16_R2"), // 1.16.2 + V1_16_1(736, "v1_16_R1"), // 1.16.1 + V1_16(735, "v1_16_R1"), // 1.16 + + V1_15_2(578, "v1_15_R1"), // 1.15.2 + V1_15_1(575, "v1_15_R1"), // 1.15.1 + V1_15(573, "v1_15_R1"), // 1.15 + + V1_14_4(498, "v1_14_R1"), // 1.14.4 + V1_14_3(490, "v1_14_R1"), // 1.14.3 + V1_14_2(485, "v1_14_R1"), // 1.14.2 + V1_14_1(480, "v1_14_R1"), // 1.14.1 + V1_14(477, "v1_14_R1"), // 1.14 + + V1_13_2(404, "v1_13_R2"), // 1.13.2 + V1_13_1(401, "v1_13_R2"), // 1.13.1 + V1_13(393, "v1_13_R1"), // 1.13 + + V1_12_2(340, "v1_12_R1"), // 1.12.2 + V1_12_1(338, "v1_12_R1"), // 1.12.1 + V1_12(335, "v1_12_R1"), // 1.12 + + V1_11_1(316, "v1_11_R1"), // 1.11.1 & 1.11.2 + V1_11(315, "v1_11_R1"), // 1.11 + + V1_10(210, "v1_10_R1"), // 1.10.x + + V1_9_3(110, "v1_9_R2"), // 1.9.3 & 1.9.4 + V1_9_2(109, "v1_9_R1"), // 1.9.2 + V1_9_1(108, "v1_9_R1"), // 1.9.1 + V1_9(107, "v1_9_R1"), // 1.9 + + V1_8(47, "v1_8_R3"), // 1.8.x + + UNKNOWN(-1, "Unknown"); + + // Game Updates + public static final MinecraftVersion TRAILS_AND_TALES = MinecraftVersion.V1_20; + public static final MinecraftVersion THE_WILD_UPDATE = MinecraftVersion.V1_19; + public static final MinecraftVersion CAVES_AND_CLIFFS_PT_2 = MinecraftVersion.V1_18; + public static final MinecraftVersion CAVES_AND_CLIFFS_PT_1 = MinecraftVersion.V1_17; + public static final MinecraftVersion NETHER_UPDATE = MinecraftVersion.V1_16; + public static final MinecraftVersion BUZZY_BEES = MinecraftVersion.V1_15; + public static final MinecraftVersion VILLAGE_AND_PILLAGE = MinecraftVersion.V1_14; + public static final MinecraftVersion UPDATE_AQUATIC = MinecraftVersion.V1_13; + public static final MinecraftVersion WORLD_OF_COLOR_UPDATE = MinecraftVersion.V1_12; + public static final MinecraftVersion EXPLORATION_UPDATE = MinecraftVersion.V1_11; + public static final MinecraftVersion FROSTBURN_UPDATE = MinecraftVersion.V1_10; + public static final MinecraftVersion THE_COMBAT_UPDATE = MinecraftVersion.V1_9; + public static final MinecraftVersion BOUNTIFUL_UPDATE = MinecraftVersion.V1_8; + + /** + * The protocol number of this version. + */ + private final int protocol; + + /** + * The server version for this version. + */ + private final String nmsVersion; + + /** + * The cached name of this version. + */ + private String name; + + /** + * Get the name of this protocol version. + * + * @return the name + */ + public String getName() { + // We have a name + if (this.name != null) { + return this.name; + } + // Use the server version as the name if unknown + if (this == UNKNOWN) { + this.name = this.getNmsVersion(); + } else { // Parse the name + this.name = name().substring(1); + this.name = this.name.replace("_", "."); + } + return this.name; + } + + /** + * Is this version legacy? + * + * @return whether this version is legacy + */ + public boolean isLegacy() { + return this.isBelow(MinecraftVersion.V1_16); + } + + /** + * Check if this version is + * above the one given. + * + * @param other the other version + * @return true if above, otherwise false + */ + public boolean isAbove(MinecraftVersion other) { + return this.protocol > other.getProtocol(); + } + + /** + * Check if this version is + * or above the one given. + * + * @param other the other version + * @return true if is or above, otherwise false + */ + public boolean isOrAbove(MinecraftVersion other) { + return this.protocol >= other.getProtocol(); + } + + /** + * Check if this version is + * below the one given. + * + * @param other the other version + * @return true if below, otherwise false + */ + public boolean isBelow(MinecraftVersion other) { + return this.protocol < other.getProtocol(); + } + + /** + * Check if this version is + * or below the one given. + * + * @param other the other version + * @return true if is or below, otherwise false + */ + public boolean isOrBelow(MinecraftVersion other) { + return this.protocol <= other.getProtocol(); + } + + /** + * Get the version from the given protocol. + * + * @param protocol the protocol to get the version for + * @return the version, null if none + */ + public static MinecraftVersion byProtocol(int protocol) { + for (MinecraftVersion version : values()) { + if (version.getProtocol() == protocol) { + return version; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/me/braydon/mc/model/server/JavaMinecraftServer.java b/src/main/java/me/braydon/mc/model/server/JavaMinecraftServer.java index 1d637a5..e6868b1 100644 --- a/src/main/java/me/braydon/mc/model/server/JavaMinecraftServer.java +++ b/src/main/java/me/braydon/mc/model/server/JavaMinecraftServer.java @@ -6,6 +6,7 @@ import lombok.Getter; import lombok.NonNull; import lombok.ToString; import me.braydon.mc.RESTfulMC; +import me.braydon.mc.common.MinecraftVersion; import me.braydon.mc.model.MinecraftServer; import me.braydon.mc.model.token.JavaServerStatusToken; import net.md_5.bungee.api.chat.TextComponent; @@ -98,6 +99,11 @@ public final class JavaMinecraftServer extends MinecraftServer { */ private final int protocol; + /** + * The name of the version for the protocol, null if unknown. + */ + private final String protocolName; + /** * Create a more detailed * copy of this object. @@ -113,7 +119,8 @@ public final class JavaMinecraftServer extends MinecraftServer { platform = split[0]; } } - return new Version(name, platform, protocol); + MinecraftVersion minecraftVersion = MinecraftVersion.byProtocol(protocol); + return new Version(name, platform, protocol, minecraftVersion == null ? null : minecraftVersion.getName()); } }