diff --git a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java
index 15a8ce3cc..8ce4b5e6b 100644
--- a/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java
+++ b/nms/ReflectionProvider/src/net/ess3/nms/refl/ReflUtil.java
@@ -1,5 +1,7 @@
package net.ess3.nms.refl;
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.bukkit.Bukkit;
@@ -10,8 +12,16 @@ import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class ReflUtil {
+ public static final NMSVersion V1_8_R1 = NMSVersion.fromString("v1_8_R1");
+ public static final NMSVersion V1_8_R2 = NMSVersion.fromString("v1_8_R2");
+ public static final NMSVersion V1_8_R3 = NMSVersion.fromString("v1_8_R3");
+ public static final NMSVersion V1_9_R1 = NMSVersion.fromString("v1_9_R1");
+ public static final NMSVersion V1_10_R1 = NMSVersion.fromString("v1_10_R1");
+ private static NMSVersion nmsVersionObject;
private static String nmsVersion;
public static String getNMSVersion() {
@@ -22,6 +32,13 @@ public class ReflUtil {
}
return nmsVersion;
}
+
+ public static NMSVersion getNmsVersionObject() {
+ if (nmsVersionObject == null) {
+ nmsVersionObject = NMSVersion.fromString(getNMSVersion());
+ }
+ return nmsVersionObject;
+ }
public static Class> getNMSClass(String className) {
return getClassCached("net.minecraft.server." + getNMSVersion() + "." + className);
@@ -200,4 +217,104 @@ public class ReflUtil {
return Arrays.deepHashCode(params);
}
}
+
+ /**
+ * https://gist.github.com/SupaHam/dad1db6406596c5f8e4b221ff473831c
+ *
+ * @author SupaHam (https://github.com/SupaHam)
+ */
+ public static class NMSVersion implements Comparable {
+ private static final Pattern VERSION_PATTERN = Pattern.compile("^v(\\d+)_(\\d+)_R(\\d+)");
+ private final int major;
+ private final int minor;
+ private final int release;
+
+ public static NMSVersion fromString(String string) {
+ Preconditions.checkNotNull(string, "string cannot be null.");
+ Matcher matcher = VERSION_PATTERN.matcher(string);
+ Preconditions.checkArgument(matcher.matches(), string + " is not in valid version format. e.g. v1_10_R1");
+ return new NMSVersion(Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2)), Integer.parseInt(matcher.group(3)));
+ }
+
+ private NMSVersion(int major, int minor, int release) {
+ this.major = major;
+ this.minor = minor;
+ this.release = release;
+ }
+
+ public boolean isHigherThan(NMSVersion o) {
+ return compareTo(o) > 0;
+ }
+
+ public boolean isHigherThanOrEqualTo(NMSVersion o) {
+ return compareTo(o) >= 0;
+ }
+
+ public boolean isLowerThan(NMSVersion o) {
+ return compareTo(o) < 0;
+ }
+
+ public boolean isLowerThanOrEqualTo(NMSVersion o) {
+ return compareTo(o) <= 0;
+ }
+
+ public int getMajor() {
+ return major;
+ }
+
+ public int getMinor() {
+ return minor;
+ }
+
+ public int getRelease() {
+ return release;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ NMSVersion that = (NMSVersion) o;
+ return major == that.major &&
+ minor == that.minor &&
+ release == that.release;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(major, minor, release);
+ }
+
+ @Override
+ public String toString() {
+ return "v" + major + "_" + minor + "_R" + release;
+ }
+
+ @Override
+ public int compareTo(NMSVersion o) {
+ if (major < o.major) {
+ return -1;
+ } else if (major > o.major) {
+ return 1;
+ } else { // equal major
+ if (minor < o.minor) {
+ return -1;
+ } else if (minor > o.minor) {
+ return 1;
+ } else { // equal minor
+ if (release < o.release) {
+ return -1;
+ } else if (release > o.release) {
+ return 1;
+ } else {
+ return 0; // o is the same version as this.
+ }
+ }
+ }
+ }
+ }
}
diff --git a/nms/ReflectionProvider/test/net/ess3/nms/refl/NMSVersionTest.java b/nms/ReflectionProvider/test/net/ess3/nms/refl/NMSVersionTest.java
new file mode 100644
index 000000000..636ffd512
--- /dev/null
+++ b/nms/ReflectionProvider/test/net/ess3/nms/refl/NMSVersionTest.java
@@ -0,0 +1,51 @@
+package net.ess3.nms.refl;
+
+import net.ess3.nms.refl.ReflUtil.NMSVersion;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class NMSVersionTest {
+
+ @Test
+ public void testMajor() throws Exception {
+ NMSVersion v2_9_R1 = NMSVersion.fromString("v2_9_R1");
+
+ Assert.assertEquals(2, v2_9_R1.getMajor());
+ Assert.assertEquals(9, v2_9_R1.getMinor());
+ Assert.assertEquals(1, v2_9_R1.getRelease());
+
+ Assert.assertEquals(v2_9_R1.toString(), "v2_9_R1");
+
+ Assert.assertTrue(v2_9_R1.isHigherThan(NMSVersion.fromString("v1_10_R1")));
+ Assert.assertTrue(v2_9_R1.isHigherThanOrEqualTo(NMSVersion.fromString("v1_9_R1")));
+ }
+
+ @Test
+ public void testMinor() throws Exception {
+ NMSVersion v1_10_R1 = NMSVersion.fromString("v1_10_R1");
+
+ Assert.assertEquals(1, v1_10_R1.getMajor());
+ Assert.assertEquals(10, v1_10_R1.getMinor());
+ Assert.assertEquals(1, v1_10_R1.getRelease());
+
+ Assert.assertEquals(v1_10_R1.toString(), "v1_10_R1");
+
+ Assert.assertTrue(NMSVersion.fromString("v1_9_R1").isLowerThan(v1_10_R1));
+ Assert.assertTrue(NMSVersion.fromString("v1_9_R1").isLowerThanOrEqualTo(v1_10_R1));
+ }
+
+ @Test
+ public void testRelease() throws Exception {
+ NMSVersion v1_9_R2 = NMSVersion.fromString("v1_9_R2");
+
+ Assert.assertEquals(1, v1_9_R2.getMajor());
+ Assert.assertEquals(9, v1_9_R2.getMinor());
+ Assert.assertEquals(2, v1_9_R2.getRelease());
+
+ Assert.assertEquals(v1_9_R2.toString(), "v1_9_R2");
+ Assert.assertEquals(v1_9_R2, NMSVersion.fromString("v1_9_R2"));
+
+ Assert.assertTrue(v1_9_R2.isHigherThan(NMSVersion.fromString("v1_9_R1")));
+ }
+}