Skip to content

Commit b0e3a27

Browse files
authored
Merge pull request #101 from Redstoner507/random-warp
Feat : New command and button to teleport to a random warp
2 parents 446cc26 + 9c307ab commit b0e3a27

6 files changed

Lines changed: 88 additions & 2 deletions

File tree

src/main/java/net/buildtheearth/buildteamtools/modules/navigation/components/warps/commands/WarpCommand.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import net.buildtheearth.buildteamtools.modules.network.NetworkModule;
1111
import net.buildtheearth.buildteamtools.modules.network.model.BuildTeam;
1212
import net.buildtheearth.buildteamtools.modules.network.model.Permissions;
13+
import net.buildtheearth.buildteamtools.utils.Utils;
1314
import org.bukkit.command.Command;
1415
import org.bukkit.command.CommandExecutor;
1516
import org.bukkit.command.CommandSender;
@@ -18,6 +19,7 @@
1819
import org.jetbrains.annotations.Nullable;
1920
import org.jspecify.annotations.NonNull;
2021

22+
import java.util.ArrayList;
2123
import java.util.Arrays;
2224
import java.util.Collections;
2325
import java.util.List;
@@ -51,6 +53,10 @@ public boolean onCommand(@NonNull CommandSender sender, @NonNull Command command
5153
return handleMigrateCommand(player, args);
5254
}
5355

56+
if (args[0].equalsIgnoreCase("random")) {
57+
return handleRandomWarpCommand(player, args);
58+
}
59+
5460
return handleWarpTeleport(player, args);
5561
}
5662

@@ -100,6 +106,38 @@ private boolean handleMigrateCommand(@NonNull Player player, String @NonNull []
100106
return true;
101107
}
102108

109+
private boolean handleRandomWarpCommand(@NonNull Player player, String @NonNull [] args) {
110+
111+
if (!player.hasPermission(Permissions.WARP_RANDOM)) {
112+
Utils.sendNoPermissionMessage(player, Permissions.WARP_RANDOM);
113+
return true;
114+
}
115+
116+
if (args.length > 1) {
117+
player.sendMessage(ChatHelper.getErrorComponent("Usage: /warp random"));
118+
return true;
119+
}
120+
121+
BuildTeam buildTeam = NetworkModule.getInstance().getBuildTeam();
122+
if (buildTeam == null) {
123+
return true;
124+
}
125+
126+
List<Warp> warps = buildTeam.getWarpGroups().stream()
127+
.flatMap(group -> group.getWarps().stream())
128+
.toList();
129+
130+
Warp warp = Utils.pickRandom(warps);
131+
if (warp == null) {
132+
player.sendMessage("No warp found");
133+
return true;
134+
}
135+
136+
NavigationModule.getInstance().getWarpsComponent().warpPlayer(player, warp);
137+
138+
return true;
139+
}
140+
103141
private void handleMigrationResult(@NonNull Player player, @NonNull MigrationResult result, @Nullable Throwable throwable) {
104142
if (throwable != null) {
105143
player.sendMessage(ChatHelper.getErrorComponent("Something went wrong while migrating the warps: %s",
@@ -152,14 +190,25 @@ private static boolean checkForWarpUsePermissionAndMessage(@NonNull Player playe
152190
@Override
153191
public @Nullable List<String> onTabComplete(@NonNull CommandSender sender, @NonNull Command command, @NonNull String label, String @NonNull [] args) {
154192
if (args.length == 1) {
193+
List<String> list = new ArrayList<>();
194+
if (sender.hasPermission(Permissions.WARP_CREATE)) list.add("create");
195+
if (sender.hasPermission(Permissions.WARP_MIGRATE)) list.add("migrate");
196+
if (sender.hasPermission(Permissions.WARP_RANDOM)) list.add("random");
197+
155198
String partial = args[0].toLowerCase();
156199
BuildTeam buildTeam = NetworkModule.getInstance().getBuildTeam();
157200
if (buildTeam != null && buildTeam.getWarpGroups() != null) {
158-
return buildTeam.getWarpGroups().stream()
201+
List<String> warps = buildTeam.getWarpGroups().stream()
159202
.flatMap(gr -> gr.getWarps().stream().map(Warp::getName))
160203
.filter(s -> s.toLowerCase().startsWith(partial))
161204
.toList();
205+
206+
list.addAll(warps);
162207
}
208+
209+
return list.stream()
210+
.filter(s -> s.toLowerCase().startsWith(partial))
211+
.toList();
163212
}
164213
return Collections.emptyList();
165214

src/main/java/net/buildtheearth/buildteamtools/modules/navigation/components/warps/menu/WarpMenu.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import net.buildtheearth.buildteamtools.modules.network.model.Permissions;
1010
import net.buildtheearth.buildteamtools.utils.ListUtil;
1111
import net.buildtheearth.buildteamtools.utils.MenuItems;
12+
import net.buildtheearth.buildteamtools.utils.Utils;
1213
import net.buildtheearth.buildteamtools.utils.heads.HeadFactory;
1314
import net.buildtheearth.buildteamtools.utils.heads.HeadTexture;
1415
import net.buildtheearth.buildteamtools.utils.menus.AbstractMenu;
@@ -27,6 +28,7 @@ public class WarpMenu extends AbstractPaginatedMenu {
2728

2829
public static final int BACK_ITEM_SLOT = 27;
2930
public static final int SWITCH_PAGE_ITEM_SLOT = 34;
31+
public static final int RANDOM_ITEM_SLOT = 31;
3032

3133
private final WarpGroup warpGroup;
3234
private final AbstractMenu backMenu;
@@ -47,6 +49,12 @@ public WarpMenu(Player menuPlayer, WarpGroup warpGroup, @Nullable AbstractMenu b
4749

4850
@Override
4951
protected void setMenuItemsAsync() {
52+
if (getMenuPlayer().hasPermission(Permissions.WARP_RANDOM)) {
53+
getMenu().getSlot(RANDOM_ITEM_SLOT).setItem(
54+
HeadFactory.head(HeadTexture.DICE, "§a§lTeleport to a random warp", ListUtil.createList("§8Click here to be teleported to a random warp."))
55+
);
56+
}
57+
5058
if (backMenu != null)
5159
setBackItem(BACK_ITEM_SLOT, backMenu);
5260

@@ -57,6 +65,22 @@ protected void setMenuItemsAsync() {
5765

5866
@Override
5967
protected void setItemClickEventsAsync() {
68+
getMenu().getSlot(RANDOM_ITEM_SLOT).setClickHandler((player, info) -> {
69+
player.closeInventory();
70+
71+
List<Warp> warps = warpGroup.getWarps();
72+
73+
if (warps.isEmpty()) {
74+
player.sendMessage("§cNo warp available.");
75+
return;
76+
}
77+
78+
Warp warp = Utils.pickRandom(warps);
79+
80+
if (warp != null) {
81+
NavigationModule.getInstance().getWarpsComponent().warpPlayer(player, warp);
82+
}
83+
});
6084
if (getSource().size() > 27)
6185
setSwitchPageItemClickEvents(SWITCH_PAGE_ITEM_SLOT);
6286
}

src/main/java/net/buildtheearth/buildteamtools/modules/network/model/Permissions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class Permissions {
2828
public static final String WARP_EDIT = "btt.warp.edit";
2929
public static final String WARP_DELETE = "btt.warp.delete";
3030
public static final String WARP_MIGRATE = "btt.warp.migrate";
31+
public static final String WARP_RANDOM = "btt.warp.random";
3132

3233
public static final String WARP_GROUP_CREATE = "btt.warp.group.create";
3334
public static final String WARP_GROUP_EDIT = "btt.warp.group.edit";

src/main/java/net/buildtheearth/buildteamtools/utils/Utils.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import java.util.ArrayList;
77
import java.util.List;
8+
import java.util.concurrent.ThreadLocalRandom;
89
import java.util.stream.Collectors;
910

1011
public class Utils {
@@ -43,6 +44,13 @@ public static Object pickRandom(Object[] array) {
4344
return array[(int) (Math.random() * array.length)];
4445
}
4546

47+
public static <T> T pickRandom(List<T> list) {
48+
if (list.isEmpty()) {
49+
return null;
50+
}
51+
52+
return list.get(ThreadLocalRandom.current().nextInt(list.size()));
53+
}
4654

4755
/**
4856
* Converts the given Time to a time string

src/main/java/net/buildtheearth/buildteamtools/utils/heads/HeadTexture.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,10 @@ public enum HeadTexture {
225225
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNGU5MTIwMGRmMWNhZTUxYWNjMDcxZjg1YzdmN2Y1Yjg0NDlkMzliYjMyZjM2M2IwYWE1MWRiYzg1ZDEzM2UifX19"),
226226

227227
STONE_LETTER_QUESTION_MARK(
228-
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDIzZWFlZmJkNTgxMTU5Mzg0Mjc0Y2RiYmQ1NzZjZWQ4MmViNzI0MjNmMmVhODg3MTI0ZjllZDMzYTY4NzJjIn19fQ==");
228+
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDIzZWFlZmJkNTgxMTU5Mzg0Mjc0Y2RiYmQ1NzZjZWQ4MmViNzI0MjNmMmVhODg3MTI0ZjllZDMzYTY4NzJjIn19fQ=="),
229+
230+
DICE(
231+
"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjU4OTJmYjc1Nzc2NmUzMjhkODlhMmVmODU5MmE5MjQ4ODFiZDA3ZjIzYmRhNGNiYmRjZmY3OWE4ZGJmOTgxNSJ9fX0=");
229232

230233
private final String base64;
231234

src/main/resources/plugin.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ permissions:
5050
children:
5151
btt.navigator.use: true
5252
btt.warp.use: true
53+
btt.warp.random: true
5354
btt.bp.use: true
5455
btt.global.autotpll: true
5556
btt.permpack.builder:

0 commit comments

Comments
 (0)