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

136 lines
3.7 KiB
Java

package de.mrbesen.cppplugins;
import lombok.AllArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.event.Event;
import org.bukkit.event.EventException;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.plugin.*;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
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) {
System.out.println("register Listener for: " + plugin.getName());
CppPlugin.CppListener[] listener = ((CppPlugin) plugin).getListener();
Map<Class<? extends Event>, Set<RegisteredListener>> out = new HashMap<>();
System.out.println("found " + listener.length + " Events");
for(CppPlugin.CppListener lis : listener) {
if(lis.functionid == 0) continue;
//search for Class
Class clas = findClass(lis.eventfilter);
if(clas == null) {
System.out.println("Class " + lis.eventfilter + " is unknown event");
continue;
}
System.out.println("register event " + clas.getName() + " for function: " + lis.functionid );
AdapterExecutor adapt = new AdapterExecutor((CppPlugin) plugin, lis.functionid);
Bukkit.getPluginManager().registerEvent(clas, lis, EventPriority.NORMAL, adapt, plugin, true);
Set<RegisteredListener> lisset = out.getOrDefault(clas, new HashSet<>());
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();
createRegisteredListeners(null, plugin);
}
@Override
public void disablePlugin(Plugin plugin) {
plugin.onDisable();
}
@AllArgsConstructor
private class AdapterExecutor implements EventExecutor {
CppPlugin plugin;
long functionid;
@Override
public void execute(Listener listener, Event event) throws EventException {
//cppify event
CppEvent cppe = CppEvent.cppify(event);
System.out.println("fire event " + cppe.getName() + " in function " + functionid);
cppe = plugin.fireEvent(cppe, functionid);
//uncppify
CppEvent.uncppify(cppe, event);
}
}
}