diff --git a/src/main/java/com/volmit/iris/Iris.java b/src/main/java/com/volmit/iris/Iris.java index fb786ab0e..25547a991 100644 --- a/src/main/java/com/volmit/iris/Iris.java +++ b/src/main/java/com/volmit/iris/Iris.java @@ -195,6 +195,10 @@ public class Iris extends VolmitPlugin implements Listener { return v; } + public static KList initialize(String s) { + return initialize(s, null); + } + private void fixShading() { ShadeFix.fix(ComponentSerializer.class); } diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java b/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java new file mode 100644 index 000000000..139a9ceca --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/DecreeContextHandler.java @@ -0,0 +1,31 @@ +package com.volmit.iris.util.decree; + +import com.volmit.iris.Iris; +import com.volmit.iris.util.collection.KMap; +import com.volmit.iris.util.plugin.VolmitSender; + +public interface DecreeContextHandler { + static KMap, DecreeContextHandler> contextHandlers = buildContextHandlers(); + + static KMap, DecreeContextHandler> buildContextHandlers() { + KMap, DecreeContextHandler> contextHandlers = new KMap<>(); + + try + { + Iris.initialize("com.volmit.iris.util.decree.handlers.context").forEach((i) + -> contextHandlers.put(((DecreeContextHandler)i).getType(), (DecreeContextHandler)i)); + } + + catch(Throwable e) + { + Iris.reportError(e); + e.printStackTrace(); + } + + return contextHandlers; + } + + Class getType(); + + T handle(VolmitSender sender); +} diff --git a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java index 4bf5291ae..d327effa6 100644 --- a/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java +++ b/src/main/java/com/volmit/iris/util/decree/DecreeParameter.java @@ -98,4 +98,8 @@ public class DecreeParameter { return f.getRandom(); } + + public boolean isContextual() { + return param.contextual(); + } } diff --git a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java index aba076a73..f885fe02e 100644 --- a/src/main/java/com/volmit/iris/util/decree/annotations/Param.java +++ b/src/main/java/com/volmit/iris/util/decree/annotations/Param.java @@ -55,4 +55,9 @@ public @interface Param { * If someone uses /plugin foo bar=baz and you specify alias="b" here, /plugin foo b=baz will do the exact same. */ String[] aliases() default ""; + + /** + * Attempts to dynamically pull context from the player, default data or something else for supported types + */ + boolean contextual() default false; } diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/context/BiomeContextHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/context/BiomeContextHandler.java new file mode 100644 index 000000000..0009627dd --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/context/BiomeContextHandler.java @@ -0,0 +1,23 @@ +package com.volmit.iris.util.decree.handlers.context; + +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.engine.object.dimensional.IrisDimension; +import com.volmit.iris.util.decree.DecreeContextHandler; +import com.volmit.iris.util.plugin.VolmitSender; + +public class BiomeContextHandler implements DecreeContextHandler { + public Class getType(){return IrisBiome.class;} + + public IrisBiome handle(VolmitSender sender) + { + if(sender.isPlayer() + && IrisToolbelt.isIrisWorld(sender.player().getWorld()) + && IrisToolbelt.access(sender.player().getWorld()).getEngine() != null) + { + return IrisToolbelt.access(sender.player().getWorld()).getEngine().getBiome(sender.player().getLocation()); + } + + return null; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/context/DimensionContextHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/context/DimensionContextHandler.java new file mode 100644 index 000000000..6c9f54ee5 --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/context/DimensionContextHandler.java @@ -0,0 +1,24 @@ +package com.volmit.iris.util.decree.handlers.context; + +import com.volmit.iris.Iris; +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.dimensional.IrisDimension; +import com.volmit.iris.util.decree.DecreeContextHandler; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.World; + +public class DimensionContextHandler implements DecreeContextHandler { + public Class getType(){return IrisDimension.class;} + + public IrisDimension handle(VolmitSender sender) + { + if(sender.isPlayer() + && IrisToolbelt.isIrisWorld(sender.player().getWorld()) + && IrisToolbelt.access(sender.player().getWorld()).getEngine() != null) + { + return IrisToolbelt.access(sender.player().getWorld()).getEngine().getDimension(); + } + + return null; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/context/RegionContextHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/context/RegionContextHandler.java new file mode 100644 index 000000000..dbd34af1b --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/context/RegionContextHandler.java @@ -0,0 +1,23 @@ +package com.volmit.iris.util.decree.handlers.context; + +import com.volmit.iris.core.tools.IrisToolbelt; +import com.volmit.iris.engine.object.biome.IrisBiome; +import com.volmit.iris.engine.object.regional.IrisRegion; +import com.volmit.iris.util.decree.DecreeContextHandler; +import com.volmit.iris.util.plugin.VolmitSender; + +public class RegionContextHandler implements DecreeContextHandler { + public Class getType(){return IrisRegion.class;} + + public IrisRegion handle(VolmitSender sender) + { + if(sender.isPlayer() + && IrisToolbelt.isIrisWorld(sender.player().getWorld()) + && IrisToolbelt.access(sender.player().getWorld()).getEngine() != null) + { + return IrisToolbelt.access(sender.player().getWorld()).getEngine().getRegion(sender.player().getLocation()); + } + + return null; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/handlers/context/WorldContextHandler.java b/src/main/java/com/volmit/iris/util/decree/handlers/context/WorldContextHandler.java new file mode 100644 index 000000000..509e63cce --- /dev/null +++ b/src/main/java/com/volmit/iris/util/decree/handlers/context/WorldContextHandler.java @@ -0,0 +1,14 @@ +package com.volmit.iris.util.decree.handlers.context; + +import com.volmit.iris.util.decree.DecreeContextHandler; +import com.volmit.iris.util.plugin.VolmitSender; +import org.bukkit.World; + +public class WorldContextHandler implements DecreeContextHandler { + public Class getType(){return World.class;} + + public World handle(VolmitSender sender) + { + return sender.isPlayer() ? sender.player().getWorld() : null; + } +} diff --git a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java index a2d732ee9..2095a5ef4 100644 --- a/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java +++ b/src/main/java/com/volmit/iris/util/decree/virtual/VirtualDecreeCommand.java @@ -22,10 +22,7 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; -import com.volmit.iris.util.decree.DecreeContext; -import com.volmit.iris.util.decree.DecreeNode; -import com.volmit.iris.util.decree.DecreeParameter; -import com.volmit.iris.util.decree.DecreeSystem; +import com.volmit.iris.util.decree.*; import com.volmit.iris.util.decree.annotations.Decree; import com.volmit.iris.util.decree.exceptions.DecreeParsingException; import com.volmit.iris.util.decree.exceptions.DecreeWhichException; @@ -35,6 +32,7 @@ import com.volmit.iris.util.plugin.VolmitSender; import com.volmit.iris.util.scheduling.J; import lombok.Data; import lombok.Getter; +import org.apache.logging.log4j.core.impl.ThrowableFormatOptions; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; @@ -490,13 +488,44 @@ public class VirtualDecreeCommand { } } - if(value == null) + if(i.isContextual() && value == null) { - if(i.isRequired()) + DecreeContextHandler ch = DecreeContextHandler.contextHandlers.get(i.getType()); + + if(ch != null) { - sender.sendMessage("Missing: " + i.getName() + " (" + i.getType().getSimpleName() + ") as the " + Form.getNumberSuffixThStRd(vm+1) + " argument."); - return false; + value = ch.handle(sender); + + if(value != null) + { + Iris.debug("Null Parameter " + i.getName() + " derived a value of " + i.getHandler().toStringForce(value) + " from " + ch.getClass().getSimpleName()); + } + + else + { + Iris.debug("Null Parameter " + i.getName() + " could not derive a value from " + ch.getClass().getSimpleName()); + } } + + else + { + Iris.debug("Null Parameter " + i.getName() + " is contextual but has no context handler for " + i.getType().getCanonicalName()); + } + } + + if(i.hasDefault() && value == null) + { + try { + Iris.debug("Null Parameter " + i.getName() + " is using default value " + i.getParam().defaultValue()); + value = i.getDefaultValue(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + if(i.isRequired() && value == null) { + sender.sendMessage("Missing: " + i.getName() + " (" + i.getType().getSimpleName() + ") as the " + Form.getNumberSuffixThStRd(vm + 1) + " argument."); + return false; } params[vm] = value;