Skip to content

Commit 2c2ddb4

Browse files
Switch to modern addon registration
1 parent 154b8a8 commit 2c2ddb4

File tree

2 files changed

+138
-175
lines changed

2 files changed

+138
-175
lines changed

src/main/java/org/skriptlang/skriptworldguard/RegionClasses.java

Lines changed: 0 additions & 144 deletions
This file was deleted.
Lines changed: 138 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,65 @@
11
package org.skriptlang.skriptworldguard;
22

33
import 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;
58
import ch.njol.skript.hooks.regions.GriefPreventionHook;
69
import ch.njol.skript.hooks.regions.PreciousStonesHook;
710
import ch.njol.skript.hooks.regions.ResidenceHook;
811
import ch.njol.skript.hooks.regions.WorldGuardHook;
12+
import ch.njol.skript.lang.ParseContext;
13+
import ch.njol.skript.registrations.Classes;
914
import ch.njol.skript.util.Version;
15+
import ch.njol.yggdrasil.Fields;
1016
import com.sk89q.worldguard.WorldGuard;
17+
import com.sk89q.worldguard.session.MoveType;
18+
import org.bukkit.Bukkit;
19+
import org.bukkit.World;
1120
import org.bukkit.plugin.Plugin;
1221
import 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;
1328
import 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+
"\tsend \"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

Comments
 (0)