Add implementation for paper (paper really likes to do crap)

This commit is contained in:
Roman Zhuravlev 2025-09-03 19:34:08 +05:00
parent 4fc4f7fdd3
commit fd161ddef1

View file

@ -4,25 +4,46 @@ import dev.frankheijden.minecraftreflection.MinecraftReflection;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.regex.Pattern; import dev.frankheijden.minecraftreflection.exceptions.MinecraftReflectionException;
import net.frankheijden.serverutils.bukkit.ServerUtils;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.PluginLoader;
import org.bukkit.plugin.SimplePluginManager;
public class RSimplePluginManager { public class RSimplePluginManager {
private static final MinecraftReflection reflection = MinecraftReflection.of(Bukkit.getPluginManager().getClass());
private static final MinecraftReflection paperPluginManagerReflection;
private static final MinecraftReflection paperInstanceManagerReflection;
private static final MinecraftReflection reflection = MinecraftReflection.of(SimplePluginManager.class); static {
MinecraftReflection pluginManagerReflection;
MinecraftReflection instanceManagerReflection;
try {
pluginManagerReflection =
MinecraftReflection.of("io.papermc.paper.plugin.manager.PaperPluginManagerImpl");
instanceManagerReflection =
MinecraftReflection.of("io.papermc.paper.plugin.manager.PaperPluginInstanceManager");
} catch (MinecraftReflectionException e) {
pluginManagerReflection = null;
instanceManagerReflection = null;
}
paperPluginManagerReflection = pluginManagerReflection;
paperInstanceManagerReflection = instanceManagerReflection;
}
public static MinecraftReflection getReflection() { public static MinecraftReflection getReflection() {
return reflection; return reflection;
} }
public static Map<Pattern, PluginLoader> getFileAssociations(Object manager) throws IllegalAccessException { /**
return reflection.get(manager, "fileAssociations"); * Gets a list of plugins.
} * @param manager The SimplePluginManager instance to get plugins from.
* @return list of plugins.
*/
public static List<Plugin> getPlugins(Object manager) { public static List<Plugin> getPlugins(Object manager) {
return reflection.get(manager, "plugins"); if (paperPluginManagerReflection == null) {
return reflection.get(manager, "plugins");
}
return paperInstanceManagerReflection.get(getInstanceManager(manager), "plugins");
} }
/** /**
@ -32,9 +53,23 @@ public class RSimplePluginManager {
* @param name The name of the plugin to remove. * @param name The name of the plugin to remove.
*/ */
public static void removeLookupName(Object manager, String name) { public static void removeLookupName(Object manager, String name) {
Map<String, Plugin> lookupNames = reflection.get(manager, "lookupNames"); Map<String, Plugin> lookupNames;
if (lookupNames == null) return; if (paperPluginManagerReflection == null) {
lookupNames = reflection.get(manager, "lookupNames");
} else {
lookupNames = paperInstanceManagerReflection.get(getInstanceManager(manager), "lookupNames");
}
if (lookupNames == null) {
ServerUtils.getInstance().getLogger()
.warning("Cannot remove lookup name '" + name + "' because lookupNames is null");
return;
}
lookupNames.remove(name.replace(' ', '_')); lookupNames.remove(name.replace(' ', '_'));
lookupNames.remove(name.replace(' ', '_').toLowerCase(Locale.ENGLISH)); // Paper lookupNames.remove(name.replace(' ', '_').toLowerCase(Locale.ENGLISH)); // Paper
} }
private static Object getInstanceManager(Object manager) {
Object paperPluginManager = reflection.get(manager, "paperPluginManager");
return paperPluginManagerReflection.get(paperPluginManager, "instanceManager");
}
} }