Skip to content

Commit bd42eb6

Browse files
Expand parent region syntax
1 parent 8ad1ac8 commit bd42eb6

File tree

2 files changed

+132
-6
lines changed

2 files changed

+132
-6
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package org.skriptlang.skriptworldguard.elements.conditions;
2+
3+
import ch.njol.skript.conditions.base.PropertyCondition;
4+
import ch.njol.skript.conditions.base.PropertyCondition.PropertyType;
5+
import ch.njol.skript.doc.Description;
6+
import ch.njol.skript.doc.Example;
7+
import ch.njol.skript.doc.Name;
8+
import ch.njol.skript.doc.Since;
9+
import ch.njol.skript.lang.Condition;
10+
import ch.njol.skript.lang.Expression;
11+
import ch.njol.skript.lang.SkriptParser.ParseResult;
12+
import ch.njol.skript.lang.util.SimpleExpression;
13+
import ch.njol.util.Kleenean;
14+
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
15+
import org.bukkit.event.Event;
16+
import org.jetbrains.annotations.Nullable;
17+
import org.skriptlang.skript.registration.SyntaxRegistry;
18+
import org.skriptlang.skriptworldguard.worldguard.WorldGuardRegion;
19+
20+
@Name("Is Parent Region")
21+
@Description("A condition to test whether a region is a parent region of another.")
22+
@Example("""
23+
command /printchildren <text>:
24+
trigger:
25+
set {_parent} to the region text-argument
26+
message "Children of %{_parent}%:"
27+
loop all regions:
28+
if {_parent} is a parent region of loop-region:
29+
message "- %loop-region%"
30+
""")
31+
@Since("1.0")
32+
public class CondIsParentRegion extends Condition {
33+
34+
public static void register(SyntaxRegistry registry) {
35+
registry.register(SyntaxRegistry.CONDITION, PropertyCondition.infoBuilder(CondIsParentRegion.class, PropertyType.BE,
36+
"a parent region[s] of %worldguardregions%", "worldguardregions")
37+
.supplier(CondIsParentRegion::new)
38+
.build()
39+
);
40+
}
41+
42+
private Expression<WorldGuardRegion> parents;
43+
private Expression<WorldGuardRegion> children;
44+
45+
@Override
46+
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
47+
//noinspection unchecked
48+
parents = (Expression<WorldGuardRegion>) expressions[0];
49+
//noinspection unchecked
50+
children = (Expression<WorldGuardRegion>) expressions[1];
51+
setNegated(matchedPattern == 1);
52+
return true;
53+
}
54+
55+
@Override
56+
public boolean check(Event event) {
57+
WorldGuardRegion[] children = this.children.getArray(event);
58+
return parents.check(event, parent -> SimpleExpression.check(children,
59+
child -> isParent(parent, child), false, this.children.getAnd()), isNegated());
60+
}
61+
62+
private boolean isParent(WorldGuardRegion parent, WorldGuardRegion child) {
63+
ProtectedRegion childRegion = child.region();
64+
while (childRegion != null) {
65+
childRegion = childRegion.getParent();
66+
if (childRegion == parent.region()) {
67+
return true;
68+
}
69+
}
70+
return false;
71+
}
72+
73+
@Override
74+
public String toString(@Nullable Event event, boolean debug) {
75+
String property = "a parent region" + (parents.isSingle() ? "" : "s") + " of ";
76+
return PropertyCondition.toString(this, PropertyType.BE, event, debug, parents,
77+
property + children.toString(event, debug));
78+
}
79+
80+
}

src/main/java/org/skriptlang/skriptworldguard/elements/expressions/ExprRegionParent.java

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,83 @@
11
package org.skriptlang.skriptworldguard.elements.expressions;
22

3+
import ch.njol.skript.Skript;
34
import ch.njol.skript.classes.Changer.ChangeMode;
45
import ch.njol.skript.doc.Description;
56
import ch.njol.skript.doc.Example;
67
import ch.njol.skript.doc.Name;
78
import ch.njol.skript.doc.Since;
89
import ch.njol.skript.expressions.base.SimplePropertyExpression;
10+
import ch.njol.skript.lang.Expression;
11+
import ch.njol.skript.lang.SkriptParser.ParseResult;
12+
import ch.njol.util.Kleenean;
913
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
1014
import com.sk89q.worldguard.protection.regions.ProtectedRegion.CircularInheritanceException;
1115
import org.bukkit.event.Event;
1216
import org.jetbrains.annotations.Nullable;
1317
import org.skriptlang.skript.registration.SyntaxRegistry;
1418
import org.skriptlang.skriptworldguard.worldguard.WorldGuardRegion;
1519

20+
import java.util.ArrayList;
21+
import java.util.List;
22+
1623
@Name("Region Parent")
1724
@Description({
18-
"An expression to obtain and change the parent of a region.",
25+
"An expression to obtain and change the direct parent of a region.",
26+
"It is also possible to obtain all parents of a region (e.g., including a parent region's parent region).",
1927
"When a region has a parent, it inherits the parents members, owners, and flags (that aren't defined on the child)."
2028
})
2129
@Example("""
22-
command /setparent <text>:
30+
command /setparent <text> <text>:
2331
trigger:
24-
set the parents of the regions at the player to the region text-argument
32+
set the parent of the region text-argument-1 to the region text-argument-2
2533
""")
34+
@Example("if any of all of the parent regions of {_region} are global")
2635
@Since("1.0")
2736
public class ExprRegionParent extends SimplePropertyExpression<WorldGuardRegion, WorldGuardRegion> {
2837

2938
public static void register(SyntaxRegistry registry) {
3039
registry.register(SyntaxRegistry.EXPRESSION, infoBuilder(ExprRegionParent.class, WorldGuardRegion.class,
31-
"[region] parent[s]", "worldguardregions", false)
40+
"parent region[s]", "worldguardregions", false)
3241
.supplier(ExprRegionParent::new)
42+
.addPattern("all [[of] the] parent regions of %worldguardregions%")
3343
.build());
3444
}
3545

46+
private boolean isAll;
47+
48+
@Override
49+
public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
50+
isAll = matchedPattern == 2;
51+
return super.init(expressions, matchedPattern, isDelayed, parseResult);
52+
}
53+
54+
@Override
55+
protected WorldGuardRegion[] get(Event event, WorldGuardRegion[] regions) {
56+
if (isAll) {
57+
List<WorldGuardRegion> parents = new ArrayList<>();
58+
for (WorldGuardRegion region : regions) {
59+
ProtectedRegion parent = region.region().getParent();
60+
while (parent != null) {
61+
parents.add(new WorldGuardRegion(region.world(), parent));
62+
parent = parent.getParent();
63+
}
64+
}
65+
return parents.toArray(new WorldGuardRegion[0]);
66+
}
67+
return super.get(event, regions);
68+
}
69+
3670
@Override
3771
public WorldGuardRegion convert(WorldGuardRegion region) {
3872
return new WorldGuardRegion(region.world(), region.region().getParent());
3973
}
4074

4175
@Override
4276
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
77+
if (isAll) {
78+
Skript.error("It is not possible to change all the parents of a region");
79+
return null;
80+
}
4381
return switch (mode) {
4482
case SET, DELETE, RESET -> new Class[]{WorldGuardRegion.class};
4583
default -> null;
@@ -60,14 +98,22 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
6098
}
6199
}
62100

101+
@Override
102+
public Class<? extends WorldGuardRegion> getReturnType() {
103+
return WorldGuardRegion.class;
104+
}
105+
63106
@Override
64107
protected String getPropertyName() {
65108
return "parent";
66109
}
67110

68111
@Override
69-
public Class<? extends WorldGuardRegion> getReturnType() {
70-
return WorldGuardRegion.class;
112+
public String toString(@Nullable Event event, boolean debug) {
113+
if (isAll) {
114+
return "all the parent regions of " + getExpr().toString(event, debug);
115+
}
116+
return super.toString(event, debug);
71117
}
72118

73119
}

0 commit comments

Comments
 (0)