116 lines
5.7 KiB
Java
116 lines
5.7 KiB
Java
/*
|
|
* Copyright (C) filoghost and contributors
|
|
*
|
|
* SPDX-License-Identifier: GPL-3.0-or-later
|
|
*/
|
|
package me.filoghost.holographicdisplays.core;
|
|
|
|
import me.filoghost.fcommons.logging.ErrorCollector;
|
|
import me.filoghost.holographicdisplays.nms.common.NMSManager;
|
|
import org.bukkit.Bukkit;
|
|
|
|
import java.util.regex.Matcher;
|
|
import java.util.regex.Pattern;
|
|
|
|
/**
|
|
* The package name used by version-dependent Bukkit classes and NMS classes (before 1.17), for example "v1_13_R2".
|
|
* Different versions usually imply internal changes that require multiple implementations.
|
|
*/
|
|
public enum NMSVersion {
|
|
|
|
// Not using shorter method reference syntax here because it initializes the class, causing a ClassNotFoundException
|
|
|
|
/* 1.8 - 1.8.2 */ v1_8_R1(NMSManagerFactory.outdatedVersion("1.8.4")),
|
|
/* 1.8.3 */ v1_8_R2(NMSManagerFactory.outdatedVersion("1.8.4")),
|
|
/* 1.8.4 - 1.8.9 */ v1_8_R3(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_8_R3.VersionNMSManager(errorCollector)),
|
|
/* 1.9 - 1.9.3 */ v1_9_R1(NMSManagerFactory.outdatedVersion("1.9.4")),
|
|
/* 1.9.4 */ v1_9_R2(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_9_R2.VersionNMSManager(errorCollector)),
|
|
/* 1.10 - 1.10.2 */ v1_10_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_10_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.11 - 1.11.2 */ v1_11_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_11_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.12 - 1.12.2 */ v1_12_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_12_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.13 */ v1_13_R1(NMSManagerFactory.outdatedVersion("1.13.1")),
|
|
/* 1.13.1 - 1.13.2 */ v1_13_R2(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_13_R2.VersionNMSManager(errorCollector)),
|
|
/* 1.14 - 1.14.4 */ v1_14_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_14_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.15 - 1.15.2 */ v1_15_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_15_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.16 - 1.16.1 */ v1_16_R1(NMSManagerFactory.outdatedVersion("1.16.4")),
|
|
/* 1.16.2 - 1.16.3 */ v1_16_R2(NMSManagerFactory.outdatedVersion("1.16.4")),
|
|
/* 1.16.4 - 1.16.5 */ v1_16_R3(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_16_R3.VersionNMSManager(errorCollector)),
|
|
/* 1.17 */ v1_17_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_17_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.18 - 1.18.1 */ v1_18_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_18_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.18.2 */ v1_18_R2(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_18_R2.VersionNMSManager(errorCollector)),
|
|
/* 1.19 - 1.19.2 */ v1_19_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_19_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.19.3 */ v1_19_R2(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_19_R2.VersionNMSManager(errorCollector)),
|
|
/* 1.19.4 */ v1_19_R3(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_19_R3.VersionNMSManager(errorCollector)),
|
|
/* 1.20 - 1.20.1 */ v1_20_R1(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_20_R1.VersionNMSManager(errorCollector)),
|
|
/* 1.20.2 */ v1_20_R2(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_20_R2.VersionNMSManager(errorCollector)),
|
|
/* 1.20.3 - 1.20.4 */ v1_20_R3(errorCollector -> new me.filoghost.holographicdisplays.nms.v1_20_R3.VersionNMSManager(errorCollector)),
|
|
/* Other versions */ UNKNOWN(NMSManagerFactory.unknownVersion());
|
|
|
|
private static final NMSVersion CURRENT_VERSION = detectCurrentVersion();
|
|
|
|
private final NMSManagerFactory nmsManagerFactory;
|
|
|
|
NMSVersion(NMSManagerFactory nmsManagerFactory) {
|
|
this.nmsManagerFactory = nmsManagerFactory;
|
|
}
|
|
|
|
public NMSManager createNMSManager(ErrorCollector errorCollector) throws OutdatedVersionException, UnknownVersionException {
|
|
return nmsManagerFactory.create(errorCollector);
|
|
}
|
|
|
|
public static NMSVersion getCurrent() {
|
|
return CURRENT_VERSION;
|
|
}
|
|
|
|
private static NMSVersion detectCurrentVersion() {
|
|
Matcher matcher = Pattern.compile("v\\d+_\\d+_R\\d+").matcher(Bukkit.getServer().getClass().getPackage().getName());
|
|
if (!matcher.find()) {
|
|
return UNKNOWN;
|
|
}
|
|
|
|
String nmsVersionName = matcher.group();
|
|
try {
|
|
return valueOf(nmsVersionName);
|
|
} catch (IllegalArgumentException e) {
|
|
return UNKNOWN;
|
|
}
|
|
}
|
|
|
|
|
|
@FunctionalInterface
|
|
private interface NMSManagerFactory {
|
|
|
|
NMSManager create(ErrorCollector errorCollector) throws UnknownVersionException, OutdatedVersionException;
|
|
|
|
static NMSManagerFactory unknownVersion() {
|
|
return errorCollector -> {
|
|
throw new UnknownVersionException();
|
|
};
|
|
}
|
|
|
|
static NMSManagerFactory outdatedVersion(String minimumSupportedVersion) {
|
|
return errorCollector -> {
|
|
throw new OutdatedVersionException(minimumSupportedVersion);
|
|
};
|
|
}
|
|
|
|
}
|
|
|
|
public static class UnknownVersionException extends Exception {}
|
|
|
|
public static class OutdatedVersionException extends Exception {
|
|
|
|
private final String minimumSupportedVersion;
|
|
|
|
public OutdatedVersionException(String minimumSupportedVersion) {
|
|
this.minimumSupportedVersion = minimumSupportedVersion;
|
|
}
|
|
|
|
public String getMinimumSupportedVersion() {
|
|
return minimumSupportedVersion;
|
|
}
|
|
|
|
}
|
|
|
|
}
|