Context handlers

This commit is contained in:
DanLT 2021-08-15 15:12:08 -08:00
parent d71393cead
commit 61a313f24b
9 changed files with 165 additions and 8 deletions

View File

@ -195,6 +195,10 @@ public class Iris extends VolmitPlugin implements Listener {
return v; return v;
} }
public static KList<Object> initialize(String s) {
return initialize(s, null);
}
private void fixShading() { private void fixShading() {
ShadeFix.fix(ComponentSerializer.class); ShadeFix.fix(ComponentSerializer.class);
} }

View File

@ -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<T> {
static KMap<Class<?>, DecreeContextHandler<?>> contextHandlers = buildContextHandlers();
static KMap<Class<?>, DecreeContextHandler<?>> buildContextHandlers() {
KMap<Class<?>, 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<T> getType();
T handle(VolmitSender sender);
}

View File

@ -98,4 +98,8 @@ public class DecreeParameter {
return f.getRandom(); return f.getRandom();
} }
public boolean isContextual() {
return param.contextual();
}
} }

View File

@ -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. * 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 ""; String[] aliases() default "";
/**
* Attempts to dynamically pull context from the player, default data or something else for supported types
*/
boolean contextual() default false;
} }

View File

@ -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<IrisBiome> {
public Class<IrisBiome> 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;
}
}

View File

@ -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<IrisDimension> {
public Class<IrisDimension> 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;
}
}

View File

@ -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<IrisRegion> {
public Class<IrisRegion> 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;
}
}

View File

@ -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<World> {
public Class<World> getType(){return World.class;}
public World handle(VolmitSender sender)
{
return sender.isPlayer() ? sender.player().getWorld() : null;
}
}

View File

@ -22,10 +22,7 @@ import com.volmit.iris.Iris;
import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.IrisSettings;
import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KList;
import com.volmit.iris.util.collection.KMap; import com.volmit.iris.util.collection.KMap;
import com.volmit.iris.util.decree.DecreeContext; import com.volmit.iris.util.decree.*;
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.annotations.Decree; import com.volmit.iris.util.decree.annotations.Decree;
import com.volmit.iris.util.decree.exceptions.DecreeParsingException; import com.volmit.iris.util.decree.exceptions.DecreeParsingException;
import com.volmit.iris.util.decree.exceptions.DecreeWhichException; 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 com.volmit.iris.util.scheduling.J;
import lombok.Data; import lombok.Data;
import lombok.Getter; import lombok.Getter;
import org.apache.logging.log4j.core.impl.ThrowableFormatOptions;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException; 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."); value = ch.handle(sender);
return false;
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; params[vm] = value;