136 lines
3.7 KiB
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);
|
|
}
|
|
}
|
|
}
|