Skip to content

Commit 7f99d7f

Browse files
committed
add warp command
1 parent d4a2d17 commit 7f99d7f

File tree

7 files changed

+309
-0
lines changed

7 files changed

+309
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.uravgcode.modernessentials.command.warp;
2+
3+
import com.mojang.brigadier.Command;
4+
import com.mojang.brigadier.arguments.StringArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.tree.LiteralCommandNode;
7+
import com.uravgcode.modernessentials.command.CommandBuilder;
8+
import com.uravgcode.modernessentials.event.warp.DelWarpEvent;
9+
import com.uravgcode.modernessentials.module.WarpModule;
10+
import io.papermc.paper.command.brigadier.CommandSourceStack;
11+
import io.papermc.paper.command.brigadier.Commands;
12+
13+
@SuppressWarnings("unused")
14+
public final class DelWarpCommand implements CommandBuilder {
15+
16+
@Override
17+
public LiteralCommandNode<CommandSourceStack> build() {
18+
return Commands.literal("delwarp")
19+
.requires(permission("essentials.delwarp"))
20+
.then(Commands.argument("name", StringArgumentType.word())
21+
.suggests(WarpModule::suggestions)
22+
.executes(this::execute))
23+
.build();
24+
}
25+
26+
private int execute(CommandContext<CommandSourceStack> context) {
27+
final var sender = context.getSource().getSender();
28+
final var name = StringArgumentType.getString(context, "name");
29+
sender.getServer().getPluginManager().callEvent(new DelWarpEvent(sender, name));
30+
return Command.SINGLE_SUCCESS;
31+
}
32+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.uravgcode.modernessentials.command.warp;
2+
3+
import com.mojang.brigadier.Command;
4+
import com.mojang.brigadier.arguments.StringArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.tree.LiteralCommandNode;
7+
import com.uravgcode.modernessentials.command.CommandBuilder;
8+
import com.uravgcode.modernessentials.event.warp.SetWarpEvent;
9+
import com.uravgcode.modernessentials.exception.RequiresPlayerException;
10+
import com.uravgcode.modernessentials.module.WarpModule;
11+
import io.papermc.paper.command.brigadier.CommandSourceStack;
12+
import io.papermc.paper.command.brigadier.Commands;
13+
14+
@SuppressWarnings("unused")
15+
public final class SetWarpCommand implements CommandBuilder {
16+
17+
@Override
18+
public LiteralCommandNode<CommandSourceStack> build() {
19+
return Commands.literal("setwarp")
20+
.requires(permission("essentials.setwarp"))
21+
.then(Commands.argument("name", StringArgumentType.word())
22+
.suggests(WarpModule::suggestions)
23+
.executes(this::execute))
24+
.build();
25+
}
26+
27+
private int execute(CommandContext<CommandSourceStack> context) throws RequiresPlayerException {
28+
final var player = player(context);
29+
final var name = StringArgumentType.getString(context, "name");
30+
player.getServer().getPluginManager().callEvent(new SetWarpEvent(player, name));
31+
return Command.SINGLE_SUCCESS;
32+
}
33+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.uravgcode.modernessentials.command.warp;
2+
3+
import com.mojang.brigadier.Command;
4+
import com.mojang.brigadier.arguments.StringArgumentType;
5+
import com.mojang.brigadier.context.CommandContext;
6+
import com.mojang.brigadier.tree.LiteralCommandNode;
7+
import com.uravgcode.modernessentials.command.CommandBuilder;
8+
import com.uravgcode.modernessentials.event.warp.WarpEvent;
9+
import com.uravgcode.modernessentials.exception.RequiresPlayerException;
10+
import com.uravgcode.modernessentials.module.WarpModule;
11+
import io.papermc.paper.command.brigadier.CommandSourceStack;
12+
import io.papermc.paper.command.brigadier.Commands;
13+
14+
@SuppressWarnings("unused")
15+
public final class WarpCommand implements CommandBuilder {
16+
17+
@Override
18+
public LiteralCommandNode<CommandSourceStack> build() {
19+
return Commands.literal("warp")
20+
.requires(permission("essentials.warp"))
21+
.then(Commands.argument("name", StringArgumentType.word())
22+
.suggests(WarpModule::suggestions)
23+
.executes(this::execute))
24+
.build();
25+
}
26+
27+
private int execute(CommandContext<CommandSourceStack> context) throws RequiresPlayerException {
28+
final var player = player(context);
29+
final var name = StringArgumentType.getString(context, "name");
30+
player.getServer().getPluginManager().callEvent(new WarpEvent(player, name));
31+
return Command.SINGLE_SUCCESS;
32+
}
33+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.uravgcode.modernessentials.event.warp;
2+
3+
import org.bukkit.command.CommandSender;
4+
import org.bukkit.event.Event;
5+
import org.bukkit.event.HandlerList;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
public final class DelWarpEvent extends Event {
9+
private static final HandlerList handlers = new HandlerList();
10+
private final String name;
11+
private final CommandSender sender;
12+
13+
public DelWarpEvent(@NotNull CommandSender sender, @NotNull String name) {
14+
this.name = name;
15+
this.sender = sender;
16+
}
17+
18+
public @NotNull String getName() {
19+
return name;
20+
}
21+
22+
public @NotNull CommandSender getSender() {
23+
return sender;
24+
}
25+
26+
@Override
27+
public @NotNull HandlerList getHandlers() {
28+
return handlers;
29+
}
30+
31+
@SuppressWarnings("unused")
32+
public static @NotNull HandlerList getHandlerList() {
33+
return handlers;
34+
}
35+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.uravgcode.modernessentials.event.warp;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.HandlerList;
5+
import org.bukkit.event.player.PlayerEvent;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
public final class SetWarpEvent extends PlayerEvent {
9+
private static final HandlerList handlers = new HandlerList();
10+
private final String name;
11+
12+
public SetWarpEvent(@NotNull Player player, @NotNull String name) {
13+
super(player);
14+
this.name = name;
15+
}
16+
17+
public @NotNull String getName() {
18+
return name;
19+
}
20+
21+
@Override
22+
public @NotNull HandlerList getHandlers() {
23+
return handlers;
24+
}
25+
26+
@SuppressWarnings("unused")
27+
public static @NotNull HandlerList getHandlerList() {
28+
return handlers;
29+
}
30+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.uravgcode.modernessentials.event.warp;
2+
3+
import org.bukkit.entity.Player;
4+
import org.bukkit.event.HandlerList;
5+
import org.bukkit.event.player.PlayerEvent;
6+
import org.jetbrains.annotations.NotNull;
7+
8+
public final class WarpEvent extends PlayerEvent {
9+
private static final HandlerList handlers = new HandlerList();
10+
private final String name;
11+
12+
public WarpEvent(@NotNull Player player, @NotNull String name) {
13+
super(player);
14+
this.name = name;
15+
}
16+
17+
public @NotNull String getName() {
18+
return name;
19+
}
20+
21+
@Override
22+
public @NotNull HandlerList getHandlers() {
23+
return handlers;
24+
}
25+
26+
@SuppressWarnings("unused")
27+
public static @NotNull HandlerList getHandlerList() {
28+
return handlers;
29+
}
30+
}
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package com.uravgcode.modernessentials.module;
2+
3+
import com.mojang.brigadier.context.CommandContext;
4+
import com.mojang.brigadier.suggestion.Suggestions;
5+
import com.mojang.brigadier.suggestion.SuggestionsBuilder;
6+
import com.uravgcode.modernessentials.annotation.CommandModule;
7+
import com.uravgcode.modernessentials.event.warp.DelWarpEvent;
8+
import com.uravgcode.modernessentials.event.warp.SetWarpEvent;
9+
import com.uravgcode.modernessentials.event.warp.WarpEvent;
10+
import io.papermc.paper.command.brigadier.CommandSourceStack;
11+
import net.kyori.adventure.text.Component;
12+
import net.kyori.adventure.text.format.NamedTextColor;
13+
import org.bukkit.Location;
14+
import org.bukkit.configuration.file.YamlConfiguration;
15+
import org.bukkit.event.EventHandler;
16+
import org.bukkit.event.EventPriority;
17+
import org.bukkit.plugin.java.JavaPlugin;
18+
import org.jetbrains.annotations.NotNull;
19+
20+
import java.io.File;
21+
import java.io.IOException;
22+
import java.util.Map;
23+
import java.util.TreeMap;
24+
import java.util.concurrent.CompletableFuture;
25+
26+
@CommandModule(name = "warp")
27+
public final class WarpModule extends PluginModule {
28+
private static final TreeMap<String, Location> warps = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
29+
private final File file;
30+
31+
public WarpModule(@NotNull JavaPlugin plugin) {
32+
super(plugin);
33+
this.file = plugin.getDataPath().resolve("warps.yml").toFile();
34+
}
35+
36+
public static CompletableFuture<Suggestions> suggestions(CommandContext<CommandSourceStack> ignored, SuggestionsBuilder builder) {
37+
final var remaining = builder.getRemainingLowerCase();
38+
for (final var warp : warps.tailMap(remaining).keySet()) {
39+
if (!warp.toLowerCase().startsWith(remaining)) break;
40+
builder.suggest(warp);
41+
}
42+
return builder.buildFuture();
43+
}
44+
45+
@Override
46+
public void reload() {
47+
super.reload();
48+
49+
warps.clear();
50+
final var logger = plugin.getComponentLogger();
51+
final var config = YamlConfiguration.loadConfiguration(file);
52+
53+
for (final var name : config.getKeys(false)) {
54+
final var location = config.getLocation(name);
55+
if (location != null) {
56+
warps.put(name, location);
57+
} else {
58+
logger.warn("Warp '{}' does not contain a valid location", name);
59+
}
60+
}
61+
}
62+
63+
@EventHandler(priority = EventPriority.NORMAL)
64+
public void onWarp(WarpEvent event) {
65+
final var name = event.getName();
66+
final var player = event.getPlayer();
67+
final var location = warps.get(name);
68+
69+
if (location != null) {
70+
player.teleport(location);
71+
} else {
72+
player.sendMessage(Component.text("Warp not found", NamedTextColor.RED));
73+
}
74+
}
75+
76+
@EventHandler(priority = EventPriority.NORMAL)
77+
public void onSetWarp(SetWarpEvent event) {
78+
final var name = event.getName();
79+
final var player = event.getPlayer();
80+
final var location = player.getLocation();
81+
82+
if (warps.put(name, location) == null) {
83+
player.sendMessage("Warp created");
84+
} else {
85+
player.sendMessage("Warp set");
86+
}
87+
88+
saveWarps();
89+
}
90+
91+
@EventHandler(priority = EventPriority.NORMAL)
92+
public void onDelWarp(DelWarpEvent event) {
93+
final var name = event.getName();
94+
final var sender = event.getSender();
95+
96+
if (warps.remove(name) != null) {
97+
sender.sendMessage("Warp deleted");
98+
saveWarps();
99+
} else {
100+
sender.sendMessage(Component.text("Warp not found", NamedTextColor.RED));
101+
}
102+
}
103+
104+
private void saveWarps() {
105+
final var snapshot = Map.copyOf(warps);
106+
CompletableFuture.runAsync(() -> {
107+
try {
108+
final var config = new YamlConfiguration();
109+
snapshot.forEach(config::set);
110+
config.save(file);
111+
} catch (IOException exception) {
112+
plugin.getComponentLogger().error("Could not save warps.yml", exception);
113+
}
114+
});
115+
}
116+
}

0 commit comments

Comments
 (0)