CommandFramework #107
@ -26,10 +26,10 @@ import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Parameter;
|
||||
import java.lang.reflect.*;
|
||||
import java.util.*;
|
||||
import java.util.function.BiConsumer;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.IntPredicate;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
@ -43,6 +43,8 @@ public abstract class SWCommand {
|
||||
private final List<SubCommand> commandHelpList = new ArrayList<>();
|
||||
private final Map<String, TypeMapper<?>> localTypeMapper = new HashMap<>();
|
||||
|
||||
private BiFunction<String, CommandSender, String> message = (s, commandSender) -> s;
|
||||
|
||||
protected SWCommand(String command) {
|
||||
this(command, new String[0]);
|
||||
}
|
||||
@ -71,6 +73,8 @@ public abstract class SWCommand {
|
||||
unregister();
|
||||
register();
|
||||
|
||||
messageSystem();
|
||||
|
||||
List<Method> methods = methods();
|
||||
for (Method method : methods) {
|
||||
addMapper(Mapper.class, method, i -> i == 0, false, TypeMapper.class, (anno, typeMapper) -> {
|
||||
@ -141,6 +145,26 @@ public abstract class SWCommand {
|
||||
}
|
||||
}
|
||||
|
||||
private void messageSystem() {
|
||||
try {
|
||||
Field field = getClass().getDeclaredField("MESSAGE");
|
||||
if (!field.getType().getTypeName().equals("de.steamwar.message.Message")) {
|
||||
YoyoNow markierte diese Unterhaltung als gelöst
Veraltet
|
||||
return;
|
||||
}
|
||||
Object o = Modifier.isStatic(field.getModifiers()) ? field.get(null) : field.get(this);
|
||||
Method method = o.getClass().getMethod("parse");
|
||||
message = (s, commandSender) -> {
|
||||
try {
|
||||
return (String) method.invoke(o, s, commandSender);
|
||||
} catch (IllegalAccessException | InvocationTargetException e) {
|
||||
return s;
|
||||
}
|
||||
};
|
||||
} catch (NoSuchFieldException | IllegalAccessException | NoSuchMethodException e) {
|
||||
// Ignored
|
||||
}
|
||||
}
|
||||
|
||||
private <T extends Annotation> void add(Class<T> annotation, Method method, IntPredicate parameterTester, boolean firstParameter, Class<?> returnType, BiConsumer<T, Parameter[]> consumer) {
|
||||
T[] anno = SWCommandUtils.getAnnotation(method, annotation);
|
||||
if (anno == null || anno.length == 0) return;
|
||||
|
In neuem Issue referenzieren
Einen Benutzer sperren
Nope nope nope. Lass dir beim Erstellen des Commands ein Message-Objekt übergeben.
Doch, Doch, Doch, weil ich will kein Sache übergeben bekommen! Ich will es auch optional halten usw usw!
Dann nutze einen Setter.
Ist nicht einfach so da, ich will das ich nichts dafür aufrufen oder sonst machen muss! So wie das Register und Mapper und so.
Der Einsatz von Reflections zu diesem Grund ist einfach nur unangemessen. Ein Objekt MESSAGE zur Verfügung zu stellen, ist genauso. Warum nicht einfach message als protected Parameter im SWCommand haben, dann kann das auch einfach problemlos gesetzt werden....
Lixfel dieses System kann man so noch einfach aus dem SpigotCore kopieren und woanders verwenden, wenn ich das verdrahte nicht mehr!
Wohin hast du denn vor, dieses System eins zu eins zu kopieren?
Zeanon verwendet es in einem seiner Projekte.
Njoa, Also das Message-System ist exakt eine Klasse mehr. Ich glaube, es ist komplexer, Support für mit und ohne Message-System vorzuhalten, als einfach das Message-System mit dranzuhängen.