CppPlugins/src/main/java/de/mrbesen/cppplugins/CppLoader.java

117 lines
2.9 KiB
Java

package de.mrbesen.cppplugins;
import org.bukkit.Server;
import org.bukkit.event.*;
import org.bukkit.plugin.*;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Pattern;
public class CppLoader implements PluginLoader {
protected Server serv;
public CppLoader(Server serv) {
this.serv = serv;
}
private static final String[] search = {
//"org.bukkit.event",
"", //needed to support event from other plugins
"org.bukkit.event.block.",
"org.bukkit.event.enchantment.",
"org.bukkit.event.entity.",
"org.bukkit.event.hanging.",
"org.bukkit.event.invnetory.",
"org.bukkit.event.painting.",
"org.bukkit.event.player.",
"org.bukkit.event.server.",
"org.bukkit.event.vehicle.",
"org.bukkit.event.weather.",
"org.bukkit.event.world."
};
@Override
public Plugin loadPlugin(File file) throws InvalidPluginException, UnknownDependencyException {
System.out.println("try to load: " + file.getName());
return new CppPlugin(file, this);
}
@Override
public PluginDescriptionFile getPluginDescription(File file) throws InvalidDescriptionException {
return new PluginDescriptionFile(file.getName(), "1.0", CppPlugin.class.getName());
}
@Override
public Pattern[] getPluginFileFilters() {
//only allow .so files
return new Pattern[]{ Pattern.compile(".*\\.so") };
}
@Override
public Map<Class<? extends Event>, Set<RegisteredListener>> createRegisteredListeners(Listener listenerabcdeg, Plugin plugin) {
CppPlugin.CppListener[] listener = ((CppPlugin) plugin).getListener();
Map<Class<? extends Event>, Set<RegisteredListener>> out = new HashMap<>();
Package bukkitevents = Package.getPackage("org.bukkit.event");
for(CppPlugin.CppListener lis : listener) {
//search for Class
Class clas = findClass(lis.eventfilter);
AdapterExecutor adapt = new AdapterExecutor();
Set<RegisteredListener> lisset = out.getOrDefault(clas, new TreeSet<>());
lisset.add(new RegisteredListener(lis, adapt, EventPriority.NORMAL, plugin, true));
if(lisset.size() == 1) //nur wenn neu
out.put(clas, lisset);
}
return out;
}
/**
* simple name of event -> Class of that event
* @param name
* @return
*/
private Class<? extends Event> findClass(String name) {
for(String prefix : search) {
try {
return (Class<? extends Event>) Class.forName(prefix + name);
} catch (ClassNotFoundException e) {}
}
return null;
}
@Override
public void enablePlugin(Plugin plugin) {
plugin.onEnable();
}
@Override
public void disablePlugin(Plugin plugin) {
plugin.onDisable();
}
private class AdapterExecutor implements EventExecutor {
CppPlugin plugin;
int functionid;
@Override
public void execute(Listener listener, Event event) throws EventException {
//cppify event
CppEvent cppe = CppEvent.cppify(event);
cppe = plugin.fireEvent(cppe, functionid);
//uncppify
CppEvent.uncppify(cppe, event);
}
}
}