diff --git a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/Comparable.java b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/Comparable.java index 338b033f63..8599cea5e8 100644 --- a/src/main/java/net/aufdemrand/denizen/scripts/commands/core/Comparable.java +++ b/src/main/java/net/aufdemrand/denizen/scripts/commands/core/Comparable.java @@ -412,11 +412,11 @@ public String log(String str) { public String toString() { return (logic != Logic.REGULAR ? "Logic='" + logic.toString() + "', " : "") + "Comparable='" + (comparable == null ? "null'" : (comparable instanceof Double ? "Decimal": - comparable instanceof String ? "Element": (comparable instanceof Long ? "Number": log(comparable.getClass().getSimpleName()))) + comparable instanceof String ? "Element": (comparable instanceof Long ? "Number": (comparable instanceof dList ? "dList" :log(comparable.getClass().getSimpleName())))) + "(" + ChatColor.AQUA + comparable + ChatColor.WHITE + ")'") + ", Operator='" + operator.toString() + "', ComparedTo='" + (comparedto == null ? "null'" : (comparedto instanceof Double ? "Decimal": - comparedto instanceof String ? "Element": (comparedto instanceof Long ? "Number": log(comparedto.getClass().getSimpleName()))) + comparedto instanceof String ? "Element": (comparedto instanceof Long ? "Number": (comparedto instanceof dList ? "dList" :log(comparedto.getClass().getSimpleName())))) + "(" + ChatColor.AQUA + comparedto + ChatColor.WHITE + ")' ") + ChatColor.YELLOW + "--> OUTCOME='" + outcome + "'"; } diff --git a/src/main/java/net/aufdemrand/denizen/tags/Attribute.java b/src/main/java/net/aufdemrand/denizen/tags/Attribute.java index 624c6ae4e8..271149eba6 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/Attribute.java +++ b/src/main/java/net/aufdemrand/denizen/tags/Attribute.java @@ -1,6 +1,8 @@ package net.aufdemrand.denizen.tags; +import net.aufdemrand.denizen.objects.dNPC; +import net.aufdemrand.denizen.objects.dPlayer; import net.aufdemrand.denizen.scripts.ScriptEntry; import net.aufdemrand.denizen.utilities.debugging.dB; import net.minecraft.util.org.apache.commons.lang3.StringUtils; @@ -132,6 +134,18 @@ public boolean hasContext(int attribute) { return text.endsWith("]") && text.contains("["); } + private dPlayer getPlayer() { + if (getScriptEntry() == null) + return null; + return getScriptEntry().getPlayer(); + } + + private dNPC getNPC() { + if (getScriptEntry() == null) + return null; + return getScriptEntry().getNPC(); + } + public String getContext(int attribute) { if (hasContext(attribute)) { @@ -139,7 +153,9 @@ public String getContext(int attribute) { Matcher contextMatcher = CONTEXT_PATTERN.matcher(text); if (contextMatcher.find()) { - return TagManager.CleanOutputFully(text.substring(contextMatcher.start() + 1, contextMatcher.end() - 1)); + return TagManager.CleanOutputFully(TagManager.tag( + getPlayer(), getNPC(), text.substring(contextMatcher.start() + 1, + contextMatcher.end() - 1), false, getScriptEntry())); } } return null; diff --git a/src/main/java/net/aufdemrand/denizen/tags/TagManager.java b/src/main/java/net/aufdemrand/denizen/tags/TagManager.java index cb5d9a38cb..60c475ace1 100644 --- a/src/main/java/net/aufdemrand/denizen/tags/TagManager.java +++ b/src/main/java/net/aufdemrand/denizen/tags/TagManager.java @@ -221,17 +221,26 @@ public static String tag(dPlayer player, dNPC npc, String arg, boolean instant, return CleanOutput(arg); } - // Match all < > brackets that don't contain < > inside them - private static Pattern tagRegex = Pattern.compile("<([^<>]+)>", Pattern.DOTALL | Pattern.MULTILINE); - private static int[] locateTag(String arg) { - // find escaped brackets - - // find tag brackets pattern - Matcher tagMatcher = tagRegex.matcher(arg); - if (tagMatcher.find()) - return new int[]{tagMatcher.start(), tagMatcher.end() - 1}; - // no matching brackets pattern, return null + int first = arg.indexOf('<'); + if (first == -1) + return null; + int len = arg.length(); + int bracks = 0; + int second = -1; + for (int i = first + 1; i < len; i++) { + if (arg.charAt(i) == '<') + bracks++; + else if (arg.charAt(i) == '>') { + bracks--; + if (bracks == -1) { + second = i; + break; + } + } + } + if (first > -1 && second > first) + return new int[]{first, second}; else return null; }