11package org .skriptlang .skriptworldguard .elements .events ;
22
3+ import ch .njol .skript .config .Node ;
34import ch .njol .skript .lang .Literal ;
45import ch .njol .skript .lang .SkriptEvent ;
56import ch .njol .skript .lang .SkriptParser .ParseResult ;
67import ch .njol .skript .lang .SyntaxStringBuilder ;
8+ import ch .njol .skript .lang .util .SimpleExpression ;
79import ch .njol .skript .registrations .EventValues ;
810import com .sk89q .worldguard .session .MoveType ;
11+ import org .bukkit .Bukkit ;
12+ import org .bukkit .World ;
913import org .bukkit .entity .Player ;
1014import org .bukkit .event .Event ;
1115import org .jetbrains .annotations .Nullable ;
1216import org .skriptlang .skript .bukkit .registration .BukkitRegistryKeys ;
1317import org .skriptlang .skript .bukkit .registration .BukkitSyntaxInfos ;
18+ import org .skriptlang .skript .log .runtime .SyntaxRuntimeErrorProducer ;
1419import org .skriptlang .skript .registration .SyntaxRegistry ;
1520import org .skriptlang .skriptworldguard .worldguard .RegionEnterLeaveEvent ;
21+ import org .skriptlang .skriptworldguard .worldguard .RegionUtils ;
1622import org .skriptlang .skriptworldguard .worldguard .WorldGuardRegion ;
1723
18- public class EvtRegionEnterLeave extends SkriptEvent {
24+ public class EvtRegionEnterLeave extends SkriptEvent implements SyntaxRuntimeErrorProducer {
1925
2026 public static void register (SyntaxRegistry registry ) {
27+ String regionPattern = "[the] [worldguard] region[s] [with [the] (name[s]|id[s])|named] %*strings% (in|of) [[the] world] %*string%" ;
2128 registry .register (BukkitRegistryKeys .EVENT , BukkitSyntaxInfos .Event .builder (EvtRegionEnterLeave .class , "Region Enter/Leave" )
2229 .supplier (EvtRegionEnterLeave ::new )
2330 .addEvent (RegionEnterLeaveEvent .class )
24- .addPatterns ("enter[ing] of ([a] region|%-worldguardregions%) " ,
25- "(region|%-worldguardregions%) enter[ing]" ,
26- "(leav(e|ing)| exit[ing]) of ([a] region|%-worldguardregions% )" ,
27- "(region|%-worldguardregions%) (leav(e|ing)| exit[ing])" )
31+ .addPatterns ("region enter[ing]" ,
32+ "enter[ing] of " + regionPattern ,
33+ "region ( exit[ing]|leav(e|ing) )" ,
34+ "exit[ing] of " + regionPattern )
2835 .addDescription ("Called when a player enters or leaves a region (or the specified region(s))" )
2936 .addExample ("""
3037 on region enter:
@@ -38,39 +45,83 @@ public static void register(SyntaxRegistry registry) {
3845 EventValues .registerEventValue (RegionEnterLeaveEvent .class , MoveType .class , RegionEnterLeaveEvent ::getMoveType );
3946 }
4047
41- private @ Nullable Literal <WorldGuardRegion > regions ;
42- private boolean enter ;
48+ private Node node ;
49+
50+ private @ Nullable Literal <String > regionIds ;
51+ private @ Nullable Literal <String > world ;
52+ private boolean isEntering ;
4353
4454 @ Override
4555 public boolean init (Literal <?>[] args , int matchedPattern , ParseResult parseResult ) {
46- //noinspection unchecked
47- regions = (Literal <WorldGuardRegion >) args [0 ];
48- enter = matchedPattern <= 1 ;
56+ node = getParser ().getNode ();
57+ if (args .length != 0 ) {
58+ //noinspection unchecked
59+ regionIds = (Literal <String >) args [0 ];
60+ //noinspection unchecked
61+ world = (Literal <String >) args [1 ];
62+ }
63+ isEntering = matchedPattern <= 1 ;
4964 return true ;
5065 }
5166
5267 @ Override
5368 public boolean check (Event event ) {
54- return event instanceof RegionEnterLeaveEvent enterLeaveEvent
55- && enterLeaveEvent .isEntering () == enter
56- && (regions == null || regions .check (enterLeaveEvent , region -> region .equals (enterLeaveEvent .getRegion ())));
69+ if (!(event instanceof RegionEnterLeaveEvent enterLeaveEvent ) || enterLeaveEvent .isEntering () != isEntering ) {
70+ return false ;
71+ }
72+ if (regionIds == null ) {
73+ return true ;
74+ }
75+ assert world != null ;
76+
77+ // validate world
78+ World world = Bukkit .getWorld (this .world .getSingle ());
79+ if (world == null ) {
80+ error ("The world '" + this .world .getSingle () + "' does not exist" );
81+ return false ;
82+ }
83+
84+ // map regions
85+ String [] regionIds = this .regionIds .getAll ();
86+ WorldGuardRegion [] regions = new WorldGuardRegion [regionIds .length ];
87+ for (int i = 0 ; i < regionIds .length ; i ++) {
88+ regions [i ] = RegionUtils .getRegion (world , regionIds [i ]);
89+ if (regions [i ] == null ) {
90+ error ("The region '" + regionIds [i ] + "' does not exist in the world '" + world .getName () + "'" );
91+ return false ;
92+ }
93+ }
94+
95+ return SimpleExpression .check (regions , region -> region .equals (enterLeaveEvent .getRegion ()), false , false );
5796 }
5897
5998 @ Override
6099 public String toString (@ Nullable Event event , boolean debug ) {
61100 SyntaxStringBuilder builder = new SyntaxStringBuilder (event , debug );
62- if (enter ) {
63- builder .append ("entering" );
64- } else {
65- builder .append ("leaving" );
101+ if (regionIds == null ) {
102+ builder .append ("region" );
66103 }
67- builder .append ("of" );
68- if (regions == null ) {
69- builder .append ("a region" );
104+ if (isEntering ) {
105+ builder .append ("enter" );
70106 } else {
71- builder .append (regions );
107+ builder .append ("exit" );
108+ }
109+ if (regionIds != null ) {
110+ assert world != null ;
111+ builder .append ("of" );
112+ if (regionIds .isSingle ()) {
113+ builder .append ("region" );
114+ } else {
115+ builder .append ("regions" );
116+ }
117+ builder .append ("named" , regionIds , "in the world" , world );
72118 }
73119 return builder .toString ();
74120 }
75121
122+ @ Override
123+ public Node getNode () {
124+ return node ;
125+ }
126+
76127}
0 commit comments