11package org .skriptlang .skriptworldguard ;
22
33import ch .njol .skript .Skript ;
4- import ch .njol .skript .SkriptAddon ;
4+ import ch .njol .skript .classes .ClassInfo ;
5+ import ch .njol .skript .classes .EnumClassInfo ;
6+ import ch .njol .skript .classes .Parser ;
7+ import ch .njol .skript .classes .Serializer ;
58import ch .njol .skript .hooks .regions .GriefPreventionHook ;
69import ch .njol .skript .hooks .regions .PreciousStonesHook ;
710import ch .njol .skript .hooks .regions .ResidenceHook ;
811import ch .njol .skript .hooks .regions .WorldGuardHook ;
12+ import ch .njol .skript .lang .ParseContext ;
13+ import ch .njol .skript .registrations .Classes ;
914import ch .njol .skript .util .Version ;
15+ import ch .njol .yggdrasil .Fields ;
1016import com .sk89q .worldguard .WorldGuard ;
17+ import com .sk89q .worldguard .session .MoveType ;
18+ import org .bukkit .Bukkit ;
19+ import org .bukkit .World ;
1120import org .bukkit .plugin .Plugin ;
1221import org .bukkit .plugin .java .JavaPlugin ;
22+ import org .jetbrains .annotations .NotNull ;
23+ import org .jetbrains .annotations .Nullable ;
24+ import org .skriptlang .skript .addon .AddonModule ;
25+ import org .skriptlang .skript .addon .SkriptAddon ;
26+ import org .skriptlang .skript .util .ClassLoader ;
27+ import org .skriptlang .skriptworldguard .worldguard .RegionUtils ;
1328import org .skriptlang .skriptworldguard .worldguard .WorldGuardEventHandler .Factory ;
29+ import org .skriptlang .skriptworldguard .worldguard .WorldGuardRegion ;
1430
15- import java .io .IOException ;
31+ import java .io .StreamCorruptedException ;
32+ import java .util .regex .Matcher ;
33+ import java .util .regex .Pattern ;
1634
17- public class SkriptWorldGuard extends JavaPlugin {
35+ public class SkriptWorldGuard extends JavaPlugin implements AddonModule {
1836
1937 private static SkriptWorldGuard instance ;
2038
39+ public static SkriptWorldGuard getInstance () {
40+ return instance ;
41+ }
42+
2143 @ Override
22- public void onEnable () {
44+ public void onLoad () {
45+ // Disable all regions hooks so that Skript doesn't load any of its region syntax
46+ Skript .disableHookRegistration (GriefPreventionHook .class , PreciousStonesHook .class ,
47+ ResidenceHook .class , WorldGuardHook .class );
48+ }
2349
50+ @ Override
51+ public void onEnable () {
2452 // Dependency Searching
25-
2653 Plugin skript = getServer ().getPluginManager ().getPlugin ("Skript" );
2754 if (skript == null || !skript .isEnabled ()) {
2855 getLogger ().severe ("Could not find Skript! Make sure you have it installed and that it properly loaded. Disabling..." );
2956 getServer ().getPluginManager ().disablePlugin (this );
3057 return ;
31- } else if (Skript .getVersion ().isSmallerThan (new Version (2 , 12 , 0 ))) {
58+ } else if (Skript .getVersion ().isSmallerThan (new Version ("2.12.0-pre1" ))) {
3259 getLogger ().severe ("You are running an unsupported version of Skript. Please update to at least Skript 2.10.0. Disabling..." );
3360 getServer ().getPluginManager ().disablePlugin (this );
3461 return ;
3562 }
36-
3763 Plugin worldGuard = getServer ().getPluginManager ().getPlugin ("WorldGuard" );
3864 if (worldGuard == null || !worldGuard .isEnabled ()) {
3965 getLogger ().severe ("Could not find WorldGuard! Make sure you have it installed and that it properly loaded. Disabling..." );
@@ -45,37 +71,118 @@ public void onEnable() {
4571 return ;
4672 }
4773
48- // Initialize WorldGuard Event Handler
49- WorldGuard .getInstance ().getPlatform ().getSessionManager ().registerHandler (new Factory (), null );
50-
5174 // Start Initialization
52-
5375 instance = this ;
5476
55- // Register with Skript
56-
57- SkriptAddon addon = Skript .registerAddon (this );
58- try {
59- addon .setLanguageFileDirectory ("lang" ); // Register ClassInfo lang definitions with Skript
60- new RegionClasses (); // Register ClassInfos with Skript
61- addon .loadClasses ("org.skriptlang.skriptworldguard.elements" );
62- } catch (IOException e ) {
63- getLogger ().severe ("An error occurred while trying to register and load the addon with Skript. Disabling..." );
64- getLogger ().severe ("Printing StackTrace:" );
65- e .printStackTrace ();
66- getServer ().getPluginManager ().disablePlugin (this );
67- }
77+ // Initialize WorldGuard Event Handler
78+ WorldGuard .getInstance ().getPlatform ().getSessionManager ().registerHandler (new Factory (), null );
6879
69- // Skript hooks are disabled in a delayed startup task so this should be okay to do now
70- // Disable all regions hooks so that Skript doesn't load any of its region syntax
71- Skript . disableHookRegistration (
72- GriefPreventionHook . class , PreciousStonesHook . class , ResidenceHook . class , WorldGuardHook . class
73- );
80+ // Register with Skript
81+ SkriptAddon addon = Skript . instance (). registerAddon ( SkriptWorldGuard . class , "skript-worldguard" );
82+ addon . localizer (). setSourceDirectories ( "lang" , null );
83+ addon . loadModules ( this );
84+ }
7485
86+ @ Override
87+ public void init (SkriptAddon addon ) {
88+ Classes .registerClass (new ClassInfo <>(WorldGuardRegion .class , "worldguardregion" )
89+ .user ("worldguard ?regions?" )
90+ .name ("Region" )
91+ .description ("A WorldGuard region." )
92+ .examples ("region \" region\" in world(\" world\" " )
93+ .requiredPlugins ("WorldGuard 7" )
94+ .since ("1.0" )
95+ .parser (new Parser <>() {
96+ // TODO maybe we should do something else here... perhaps make use of SkriptParser methods?
97+ final Pattern regionPattern = Pattern .compile (
98+ "(?:the )?(?:worldguard )?region (?:with (?:the )?(?:name|id) |named )?\" (.+)\" (?:in|of) (?:(?:the )?world )?\" (.+)\" "
99+ );
100+
101+ @ Override
102+ public @ Nullable WorldGuardRegion parse (@ NotNull String input , @ NotNull ParseContext context ) {
103+ if (context == ParseContext .EVENT || context == ParseContext .COMMAND ) {
104+ Matcher matcher = regionPattern .matcher (input );
105+ if (matcher .matches ()) {
106+ String id = matcher .group (1 );
107+ World world = Bukkit .getWorld (matcher .group (2 ));
108+ return world == null ? null : RegionUtils .getRegion (world , id );
109+ }
110+ }
111+ return null ;
112+ }
113+
114+ @ Override
115+ public boolean canParse (@ NotNull ParseContext context ) {
116+ return context == ParseContext .EVENT || context == ParseContext .COMMAND ;
117+ }
118+
119+ @ Override
120+ public @ NotNull String toString (WorldGuardRegion region , int flags ) {
121+ return region .toString ();
122+ }
123+
124+ @ Override
125+ public @ NotNull String toVariableNameString (WorldGuardRegion region ) {
126+ return "worldguardregion:" + region ;
127+ }
128+ })
129+ .serializer (new Serializer <>() {
130+ @ Override
131+ public @ NotNull Fields serialize (WorldGuardRegion region ) {
132+ Fields fields = new Fields ();
133+ fields .putObject ("world" , region .getWorld ());
134+ fields .putObject ("id" , region .getRegion ().getId ());
135+ return fields ;
136+ }
137+
138+ @ Override
139+ public void deserialize (WorldGuardRegion region , @ NotNull Fields fields ) {
140+ assert false ;
141+ }
142+
143+ @ Override
144+ protected WorldGuardRegion deserialize (@ NotNull Fields fields ) throws StreamCorruptedException {
145+ World world = fields .getObject ("world" , World .class );
146+ String id = fields .getObject ("id" , String .class );
147+ if (world == null || id == null ) {
148+ throw new StreamCorruptedException ();
149+ }
150+ WorldGuardRegion region = RegionUtils .getRegion (world , id );
151+ if (region == null ) {
152+ throw new StreamCorruptedException ("The " + RegionUtils .toString (world , id ) + " from WorldGuard could not be found. Does it still exist?" );
153+ }
154+ return region ;
155+ }
156+
157+ @ Override
158+ public boolean mustSyncDeserialization () {
159+ return true ;
160+ }
161+
162+ @ Override
163+ protected boolean canBeInstantiated () {
164+ return false ;
165+ }
166+ }));
167+
168+ Classes .registerClass (new EnumClassInfo <>(MoveType .class , "worldguardmovetype" , "worldguard move types" )
169+ .user ("worldguard ?move ?types?" )
170+ .name ("WorldGuard Move Type" )
171+ .description ("The move type in a WorldGuard enter/leave event." )
172+ .requiredPlugins ("WorldGuard 7" )
173+ .examples ("on region enter:" ,
174+ "\t send \" The move type is %the move type%\" " )
175+ .since ("1.0" ));
75176 }
76177
77- public static SkriptWorldGuard getInstance () {
78- return instance ;
178+ @ Override
179+ public void load (SkriptAddon addon ) {
180+ ClassLoader .builder ()
181+ .basePackage ("org.skriptlang.skriptworldguard.elements" )
182+ .deep (true )
183+ .initialize (true )
184+ .build ()
185+ .loadClasses (SkriptWorldGuard .class , getFile ());
79186 }
80187
81188}
0 commit comments