Fix versioning not working on b1.7.3

This commit is contained in:
天クマ 2026-05-25 18:27:54 -03:00
commit df450e1f9b
15 changed files with 362 additions and 123 deletions

2
.gitignore vendored
View file

@ -12,3 +12,5 @@ out/
build
run/
*.log

View file

@ -1 +0,0 @@
org.adrianvictor.lib.impl.r1_21.R1_21Registrar

View file

@ -4,7 +4,7 @@ plugins {
}
group = "org.adrianvictor"
version = System.getenv("VERSION") ?: "unknown"
version = "2.0"
val buildEnv = System.getenv("BUILD_CHANNEL")
?: if (System.getenv("JITPACK") != null) "jitpack" else "local"
@ -60,8 +60,8 @@ mcVersions.forEach { ver ->
/* ----------------------------------------- */
dependencies {
add("compileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT")
add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.10-R0.1-SNAPSHOT")
add("compileOnly", "io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
add("r1_21CompileOnly", "io.papermc.paper:paper-api:1.21.1-R0.1-SNAPSHOT")
add("b1_7_3CompileOnly", files("libs/craftbukkit-1060.jar"))
}
@ -103,22 +103,43 @@ val prepareServiceFiles = tasks.register("prepareServiceFiles") {
doLast {
val registrars = mutableSetOf<String>()
inputFiles.forEach { file ->
println("Checking file: ${file.absolutePath}, exists: ${file.exists()}")
if (file.exists()) {
val lines = file.readLines().filter { it.isNotBlank() }
println("Found lines: $lines")
registrars.addAll(lines)
file.readLines().forEach { line ->
val trimmed = line.trim()
if (trimmed.isNotEmpty()) {
registrars.add(trimmed)
}
}
}
}
val mergedFile = outputDir.get().file(serviceFile).asFile
mergedFile.parentFile.mkdirs()
mergedFile.writeText(registrars.joinToString("\n"))
mergedFile.writeText(registrars.joinToString("\n") + "\n")
println("Merged service file content: \n${registrars.joinToString("\n")}")
}
}
tasks.named<Jar>("jar") {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from(sourceSets["main"].output)
mcVersions.forEach { ver ->
from(sourceSets[ver].output) {
exclude("META-INF/services/org.adrianvictor.lib.versioning.VersionedServiceRegistrar")
}
}
from(prepareServiceFiles)
manifest {
attributes(
"Implemented-Versions" to mcVersions.joinToString(",")
)
}
}
tasks.register<Jar>("bundleAll") {
dependsOn("jar")
// This is now redundant but we keep it for compatibility with previous instructions
from(sourceSets["main"].output)
mcVersions.forEach { ver ->
from(sourceSets[ver].output) {
@ -127,7 +148,7 @@ tasks.register<Jar>("bundleAll") {
}
// Include the merged service file
from(prepareServiceFiles.get().outputs.files.singleFile)
from(prepareServiceFiles)
duplicatesStrategy = DuplicatesStrategy.EXCLUDE

View file

@ -1,20 +1,27 @@
package org.adrianvictor.lib.impl.b1_7_3;
import org.adrianvictor.lib.impl.b1_7_3.logging.Logger;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
import org.adrianvictor.lib.versioning.VersionedServiceRegistrar;
import org.adrianvictor.lib.configuration.provider.ConfigurationProvider;
import org.adrianvictor.lib.impl.b1_7_3.configuration.Configuration;
import org.adrianvictor.lib.text.provider.TextColorProvider;
import org.adrianvictor.lib.impl.b1_7_3.text.TextColor;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class B1_7_3Registrar implements VersionedServiceRegistrar {
private JavaPlugin plugin;
public void setPlugin(JavaPlugin plugin) {
this.plugin = plugin;
}
@Override
public void register(VersionedServiceFactory factory) {
Logger.setPlugin(this.plugin);
factory.register(ConfigurationProvider.class, "b1_7_3", Configuration::new);
factory.register(TextColorProvider.class, "b1_7_3", TextColor::new);
// Register for b1_8_compat as well, assuming compatibility
factory.register(ConfigurationProvider.class, "b1_8_compat", Configuration::new);
factory.register(TextColorProvider.class, "b1_8_compat", TextColor::new);
factory.register(LoggerProvider.class, "b1_7_3", Logger::new);
}
}

View file

@ -0,0 +1,38 @@
package org.adrianvictor.lib.impl.b1_7_3.logging;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class Logger implements LoggerProvider {
private static JavaPlugin plugin;
private java.util.logging.Logger logger;
private String prefix = "[tenkumaLib] ";
public static void setPlugin(JavaPlugin p) {
plugin = p;
}
public Logger() {
if (plugin != null) {
logger = plugin.getServer().getLogger();
prefix = "[" + plugin.getDescription().getName() + "] ";
} else {
logger = java.util.logging.Logger.getLogger("Minecraft");
}
}
@Override
public void info(String text) {
logger.info(prefix + text);
}
@Override
public void warning(String text) {
logger.warning(prefix + text);
}
@Override
public void error(String text) {
logger.severe(prefix + text);
}
}

View file

@ -1,60 +1,113 @@
package org.adrianvictor.lib;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.adrianvictor.lib.versioning.DefaultVersionedServiceFactory;
import org.adrianvictor.lib.versioning.MinecraftVersion;
import org.adrianvictor.lib.versioning.VersionMatcher;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
import org.adrianvictor.lib.versioning.VersionedServiceRegistrar;
import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import java.util.ServiceLoader;
import java.util.logging.Logger;
public class Main extends JavaPlugin {
static {
System.out.println("Main class loaded!");
}
private static Logger globalLogger;
private static LoggerProvider pluginLogger;
private static DefaultVersionedServiceFactory versionedServiceFactory;
private static VersionedServiceFactory versionedServiceFactory;
private static VersionMatcher versionMatcher;
public static VersionedServiceFactory getServiceFactory() {
return versionedServiceFactory;
}
@Override
public void onEnable() {
versionMatcher = new VersionMatcher();
globalLogger = Bukkit.getServer().getLogger();
globalLogger.info("[tenkumaLib] Enabling tenkumaLib v2.0...");
VersionMatcher versionMatcher = new VersionMatcher();
versionedServiceFactory = new DefaultVersionedServiceFactory(versionMatcher);
ClassLoader cl = getClassLoader();
getLogger().info("Plugin ClassLoader: " + cl.getClass().getName());
String serviceFile = "META-INF/services/org.adrianvictor.lib.versioning.VersionedServiceRegistrar";
java.net.URL res = cl.getResource(serviceFile);
getLogger().info("Service file resource: " + res);
MinecraftVersion version = MinecraftVersion.detect();
globalLogger.info("[tenkumaLib] Detected Minecraft Version: " + version);
ServiceLoader<VersionedServiceRegistrar> registrars = ServiceLoader.load(VersionedServiceRegistrar.class, cl);
int count = 0;
for (VersionedServiceRegistrar registrar : registrars) {
registrar.register(versionedServiceFactory);
getLogger().info("Registered registrar: " + registrar.getClass().getName());
count++;
boolean registered = false;
// 1. Load core registrar based on version mapping
String coreRegistrar = version.getRegistrarClass();
if (coreRegistrar != null) {
if (loadRegistrar(coreRegistrar)) {
registered = true;
}
}
getLogger().info("Registered " + count + " version-specific registrars.");
String serverVersion = versionMatcher.getServerVersion();
java.util.List<String> suffixes = versionMatcher.getClassSuffixes(serverVersion);
getLogger().info("Server Version: " + serverVersion);
getLogger().info("Applicable suffixes: " + suffixes);
// 2. Load registrars via ServiceLoader for extensibility
try {
java.util.ServiceLoader<VersionedServiceRegistrar> loader = java.util.ServiceLoader.load(VersionedServiceRegistrar.class, getClassLoader());
for (VersionedServiceRegistrar registrar : loader) {
String registrarName = registrar.getClass().getName();
// Skip if already registered as core
if (registrarName.equals(coreRegistrar)) continue;
getLogger().info("tenkumaLib has been enabled!");
if (registerRegistrar(registrar)) {
registered = true;
}
}
} catch (Throwable t) {
// ServiceLoader failure is expected on some legacy platforms
}
if (!registered) {
globalLogger.warning("[tenkumaLib] No registrars were loaded! Services might not be available.");
}
try {
org.adrianvictor.lib.logging.Logger.create(versionedServiceFactory);
pluginLogger = versionedServiceFactory.getService(LoggerProvider.class);
pluginLogger.info("tenkumaLib has been successfully enabled!");
} catch (Exception e) {
globalLogger.severe("[tenkumaLib] Failed to initialize plugin logger: " + e.getMessage());
e.printStackTrace();
}
}
private boolean loadRegistrar(String className) {
try {
Class<?> clazz = Class.forName(className, true, getClassLoader());
VersionedServiceRegistrar registrar = (VersionedServiceRegistrar) clazz.getDeclaredConstructor().newInstance();
return registerRegistrar(registrar);
} catch (NoClassDefFoundError e) {
globalLogger.info("[tenkumaLib] Skipping registrar " + className + " (incompatible server version)");
} catch (Throwable t) {
globalLogger.warning("[tenkumaLib] Failed to load registrar " + className + ": " + t.toString());
}
return false;
}
private boolean registerRegistrar(VersionedServiceRegistrar registrar) {
String registrarName = registrar.getClass().getName();
try {
try {
java.lang.reflect.Method setPlugin = registrar.getClass().getMethod("setPlugin", JavaPlugin.class);
setPlugin.invoke(registrar, this);
} catch (NoSuchMethodException ignored) {}
registrar.register(versionedServiceFactory);
globalLogger.info("[tenkumaLib] Registered " + registrarName);
return true;
} catch (NoClassDefFoundError e) {
globalLogger.info("[tenkumaLib] Skipping registrar " + registrarName + " (incompatible server version)");
} catch (Throwable t) {
globalLogger.warning("[tenkumaLib] Failed to register " + registrarName + ": " + t.toString());
}
return false;
}
@Override
public void onDisable() {
getLogger().info("tenkumaLib has been disabled!");
if (pluginLogger != null) {
pluginLogger.info("tenkumaLib has been disabled!");
}
public static VersionedServiceFactory getVersionedServiceFactory() {
return versionedServiceFactory;
}
public static VersionMatcher getVersionMatcher() {
return versionMatcher;
}
}

View file

@ -0,0 +1,8 @@
package org.adrianvictor.lib.loading;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
import org.bukkit.plugin.java.JavaPlugin;
public interface ModernRegistrarLoader {
void load(VersionedServiceFactory factory, JavaPlugin plugin);
}

View file

@ -0,0 +1,8 @@
package org.adrianvictor.lib.loading;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
import org.bukkit.plugin.java.JavaPlugin;
public interface RegistrarBridge {
void load(VersionedServiceFactory factory, JavaPlugin plugin);
}

View file

@ -0,0 +1,10 @@
package org.adrianvictor.lib.logging;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
public class Logger {
public static LoggerProvider create(VersionedServiceFactory factory) {
return factory.getService(LoggerProvider.class);
}
}

View file

@ -0,0 +1,7 @@
package org.adrianvictor.lib.logging.provider;
public interface LoggerProvider {
void info(String text);
void warning(String text);
void error(String text);
}

View file

@ -0,0 +1,91 @@
package org.adrianvictor.lib.versioning;
import org.bukkit.Bukkit;
public enum MinecraftVersion {
B1_7_3(0, "b1_7_3", "org.adrianvictor.lib.impl.b1_7_3.B1_7_3Registrar"),
V1_1(1, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_2(2, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_3(3, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_4(4, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_5(5, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_6(6, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_7(7, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_8(8, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_9(9, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_10(10, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_11(11, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_12(12, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_13(13, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_14(14, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_15(15, "r1_1", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_16(16, "r1_16_5", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_17(17, "r1_16_5", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_18(18, "r1_16_5", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_19(19, "r1_16_5", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_20(20, "r1_16_5", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
V1_21(21, "r1_21", "org.adrianvictor.lib.impl.r1_21.R1_21Registrar"),
UNKNOWN(-1, "unknown");
private final int versionId;
private final String suffix;
private final String registrarClass;
MinecraftVersion(int versionId, String suffix) {
this(versionId, suffix, null);
}
MinecraftVersion(int versionId, String suffix, String registrarClass) {
this.versionId = versionId;
this.suffix = suffix;
this.registrarClass = registrarClass;
}
public int getVersionId() {
return versionId;
}
public String getSuffix() {
return suffix;
}
public String getRegistrarClass() {
return registrarClass;
}
public boolean isAtLeast(MinecraftVersion other) {
return this.versionId >= other.versionId;
}
public static MinecraftVersion detect() {
String version = Bukkit.getVersion();
if (version.contains("1.7.3")) return B1_7_3;
String bukkitVersion = Bukkit.getBukkitVersion();
String mcVer = bukkitVersion.split("-")[0];
if (mcVer.startsWith("1.21")) return V1_21;
if (mcVer.startsWith("1.20")) return V1_20;
if (mcVer.startsWith("1.19")) return V1_19;
if (mcVer.startsWith("1.18")) return V1_18;
if (mcVer.startsWith("1.17")) return V1_17;
if (mcVer.startsWith("1.16")) return V1_16;
if (mcVer.startsWith("1.15")) return V1_15;
if (mcVer.startsWith("1.14")) return V1_14;
if (mcVer.startsWith("1.13")) return V1_13;
if (mcVer.startsWith("1.12")) return V1_12;
if (mcVer.startsWith("1.11")) return V1_11;
if (mcVer.startsWith("1.10")) return V1_10;
if (mcVer.startsWith("1.9")) return V1_9;
if (mcVer.startsWith("1.8")) return V1_8;
if (mcVer.startsWith("1.7")) return V1_7;
if (mcVer.startsWith("1.6")) return V1_6;
if (mcVer.startsWith("1.5")) return V1_5;
if (mcVer.startsWith("1.4")) return V1_4;
if (mcVer.startsWith("1.3")) return V1_3;
if (mcVer.startsWith("1.2")) return V1_2;
if (mcVer.startsWith("1.1")) return V1_1;
return UNKNOWN;
}
}

View file

@ -1,91 +1,39 @@
package org.adrianvictor.lib.versioning;
import org.bukkit.Bukkit;
import java.util.Comparator;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.List;
public class VersionMatcher {
public VersionMatcher() {}
private record Entry(String pattern, String classSuffix, int minMajor, int minMinor, int maxMajor, int maxMinor) {}
public List<String> getClassSuffixes(String serverVersion) {
if (serverVersion == null) {
MinecraftVersion version = MinecraftVersion.detect();
if (version == MinecraftVersion.UNKNOWN) {
return Collections.emptyList();
}
List<Entry> entries = populateEntries();
List<Entry> applicableEntries = new ArrayList<>();
List<String> suffixes = new ArrayList<>();
int[] parsedServerVersion = parseVersion(serverVersion);
int serverMajor = parsedServerVersion[0];
int serverMinor = parsedServerVersion[1];
for (Entry entry : entries) {
Pattern p = Pattern.compile(entry.pattern());
if (p.matcher(serverVersion).matches()) {
if (serverMajor > entry.minMajor() || (serverMajor == entry.minMajor() && serverMinor >= entry.minMinor())) {
if (serverMajor < entry.maxMajor() || (serverMajor == entry.maxMajor() && serverMinor <= entry.maxMinor())) {
applicableEntries.add(entry);
// Add suffixes in order of specificity (newest/most specific first)
if (version.isAtLeast(MinecraftVersion.V1_21)) {
suffixes.add("r1_21");
}
if (version.isAtLeast(MinecraftVersion.V1_16)) {
suffixes.add("r1_16_5");
}
if (version.isAtLeast(MinecraftVersion.V1_1)) {
suffixes.add("r1_1");
}
if (version == MinecraftVersion.B1_7_3) {
suffixes.add("b1_7_3");
}
applicableEntries.sort((a, b) -> {
if (a.minMajor() != b.minMajor()) {
return Integer.compare(b.minMajor(), a.minMajor());
}
return Integer.compare(b.minMinor(), a.minMinor());
});
return applicableEntries.stream()
.map(Entry::classSuffix)
.toList();
return suffixes;
}
public String getServerVersion() {
String rawVersion = null;
try {
rawVersion = Bukkit.getMinecraftVersion();
} catch (NoSuchMethodError ignored) {}
if (rawVersion == null || rawVersion.isEmpty()) {
String v = Bukkit.getVersion();
int start = v.lastIndexOf("MC: ");
if (start != -1) {
rawVersion = v.substring(start + 4, v.length() - 1);
} else {
rawVersion = "unknown";
}
}
return rawVersion;
}
private List<Entry> populateEntries() {
return List.of(
new Entry("^1\\.7\\.3$", "b1_7_3", 1, 7, 1, 7),
// r1_1 covers versions 1.1 and above
new Entry("^1\\.\\d+(\\.\\d+)*$", "r1_1", 1, 1, Integer.MAX_VALUE, Integer.MAX_VALUE),
// r1_16_5 covers versions 1.16.5 and above
new Entry("^1\\.(16\\.[5-9]|1[7-9]|[2-9]\\d)(\\.\\d+)*$", "r1_16_5", 1, 16, Integer.MAX_VALUE, Integer.MAX_VALUE),
// r1_21 covers 1.21 and above
new Entry("^1\\.([2-9]\\d)(\\.\\d+)*$", "r1_21", 1, 21, Integer.MAX_VALUE, Integer.MAX_VALUE)
);
}
private int[] parseVersion(String versionString) {
Matcher matcher = Pattern.compile("^(\\d+)\\.(\\d+).*").matcher(versionString);
if (matcher.find()) {
return new int[]{Integer.parseInt(matcher.group(1)), Integer.parseInt(matcher.group(2))};
}
return new int[]{0, 0}; // Default for unknown format
return MinecraftVersion.detect().name();
}
}

View file

@ -5,4 +5,4 @@ main: org.adrianvictor.lib.Main
startup: startup
url: https://adrianvic.github.io
version: '2.0'
api-version: '1.13'
api-version: '1.21'

View file

@ -1,16 +1,27 @@
package org.adrianvictor.lib.impl.r1_21;
import org.adrianvictor.lib.impl.r1_21.logging.Logger;
import org.adrianvictor.lib.versioning.VersionedServiceFactory;
import org.adrianvictor.lib.versioning.VersionedServiceRegistrar;
import org.adrianvictor.lib.configuration.provider.ConfigurationProvider;
import org.adrianvictor.lib.impl.r1_21.configuration.Configuration;
import org.adrianvictor.lib.text.provider.TextColorProvider;
import org.adrianvictor.lib.impl.r1_21.text.TextColor;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class R1_21Registrar implements VersionedServiceRegistrar {
private JavaPlugin plugin;
public void setPlugin(JavaPlugin plugin) {
this.plugin = plugin;
}
@Override
public void register(VersionedServiceFactory factory) {
Logger.setPlugin(this.plugin);
factory.register(ConfigurationProvider.class, "r1_1", Configuration::new);
factory.register(TextColorProvider.class, "r1_16_5", TextColor::new);
factory.register(LoggerProvider.class, "r1_21", Logger::new);
}
}

View file

@ -0,0 +1,36 @@
package org.adrianvictor.lib.impl.r1_21.logging;
import org.adrianvictor.lib.logging.provider.LoggerProvider;
import org.bukkit.plugin.java.JavaPlugin;
public class Logger implements LoggerProvider {
private static JavaPlugin plugin;
private java.util.logging.Logger logger;
public static void setPlugin(JavaPlugin p) {
plugin = p;
}
public Logger() {
if (plugin != null) {
logger = plugin.getLogger();
} else {
logger = java.util.logging.Logger.getLogger("Minecraft");
}
}
@Override
public void info(String text) {
logger.info(text);
}
@Override
public void warning(String text) {
logger.warning(text);
}
@Override
public void error(String text) {
logger.severe(text);
}
}