Skip to content

Commit

Permalink
Massively improve tabcomplete performance
Browse files Browse the repository at this point in the history
  • Loading branch information
T14D3 committed Jan 16, 2025
1 parent 451554c commit 54d6dcf
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 17 deletions.
7 changes: 7 additions & 0 deletions src/main/java/de/t14d3/zones/Zones.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ public final class Zones extends JavaPlugin {
private static Zones instance;
private CommandListener commandListener;
private PaperBootstrap bootstrap;
private Utils utils;

public Zones(PaperBootstrap bootstrap) {
this.bootstrap = bootstrap;
Expand All @@ -56,6 +57,8 @@ public void onEnable() {
this.beaconUtils = new BeaconUtils(this);
this.particleHandler = new ParticleHandler(this);
particleHandler.particleScheduler();
this.utils = new Utils(this);
utils.populatePlayers();

// Load regions from regions.yml
regionManager.loadRegions();
Expand Down Expand Up @@ -142,6 +145,10 @@ public Types getTypes() {
return this.types;
}

public Utils getUtils() {
return utils;
}

public Utils.SavingModes getSavingMode() {
return Utils.SavingModes.fromString(this.getConfig().getString("zone-saving.mode", "MODIFIED"));
}
Expand Down
21 changes: 10 additions & 11 deletions src/main/java/de/t14d3/zones/brigadier/Command.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@
import de.t14d3.zones.Region;
import de.t14d3.zones.Zones;
import de.t14d3.zones.utils.Flags;
import de.t14d3.zones.utils.Utils;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands;
import io.papermc.paper.command.brigadier.MessageComponentSerializer;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;

import java.util.ArrayList;
Expand Down Expand Up @@ -92,22 +91,22 @@ public LiteralCommandNode<CommandSourceStack> node() {
return builder.buildFuture();
}
if (arg(ctx, 1).equalsIgnoreCase("SET")) {
for (OfflinePlayer offlinePlayer : Bukkit.getOfflinePlayers()) {
if (ctx.getInput().split(" ").length <= 3 || (offlinePlayer.getName() != null ? offlinePlayer.getName() : offlinePlayer.getUniqueId().toString()).toLowerCase().startsWith(arg(ctx, 3).toLowerCase())) {
builder.suggest(offlinePlayer.getName());
Utils.getPlayerNames().forEach(name -> {
if (ctx.getInput().split(" ").length <= 3 || name.toLowerCase().startsWith(arg(ctx, 3).toLowerCase())) {
builder.suggest(name);
}
}
});
boolean perm = ctx.getSource().getSender().hasPermission("zones.info.other");
for (Map.Entry<String, Region> region : Zones.getInstance().getRegionManager().regions().entrySet()) {
String[] args = ctx.getInput().split(" ");
if (args.length <= 2 || !args[2].equalsIgnoreCase(region.getKey())) {
continue;
}
if (ctx.getSource().getSender().hasPermission("zones.info.other")
|| (ctx.getSource().getSender() instanceof Player player && region.getValue().isAdmin(player.getUniqueId()))) {
if (perm || (ctx.getSource().getSender() instanceof Player player && region.getValue().isAdmin(player.getUniqueId()))) {
region.getValue().getGroupNames().forEach(group -> {
List<String> groupMembers = new ArrayList<>();
region.getValue().getGroupMembers(group).forEach(val -> {
groupMembers.add(Bukkit.getOfflinePlayer(UUID.fromString(val)).getName());
groupMembers.add(Utils.getPlayerName(UUID.fromString(val)));
});
if (ctx.getInput().split(" ").length <= 3
|| group.toLowerCase().startsWith(arg(ctx, 3).toLowerCase())
Expand Down Expand Up @@ -152,12 +151,12 @@ public LiteralCommandNode<CommandSourceStack> node() {
case "IGNITE" -> types = List.of("TRUE", "FALSE");
case "GROUP" -> {
types = new ArrayList<>();
boolean perm = ctx.getSource().getSender().hasPermission("zones.info.other");
for (Map.Entry<String, Region> region : Zones.getInstance().getRegionManager().regions().entrySet()) {
if (!ctx.getInput().split(" ")[2].equalsIgnoreCase(region.getKey())) {
continue;
}
if (ctx.getSource().getSender().hasPermission("zones.info.other")
|| (ctx.getSource().getSender() instanceof Player player && region.getValue().isAdmin(player.getUniqueId()))) {
if (perm || (ctx.getSource().getSender() instanceof Player player && region.getValue().isAdmin(player.getUniqueId()))) {
types.addAll(region.getValue().getGroupNames());
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/de/t14d3/zones/brigadier/RegionKeyArgument.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
import de.t14d3.zones.Region;
import de.t14d3.zones.Zones;
import de.t14d3.zones.utils.Messages;
import de.t14d3.zones.utils.Utils;
import io.papermc.paper.command.brigadier.argument.CustomArgumentType;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.NamedTextColor;
import net.kyori.adventure.text.minimessage.MiniMessage;
import org.bukkit.Bukkit;
import org.jetbrains.annotations.NotNull;

import java.util.Map;
Expand Down Expand Up @@ -58,7 +58,7 @@ public static Component regionInfo(Map.Entry<String, Region> entry) {
for (Map.Entry<String, Map<String, String>> member : entry.getValue().getMembers().entrySet()) {
String playerName = null;
try {
playerName = Bukkit.getOfflinePlayer(UUID.fromString(member.getKey())).getName();
playerName = Utils.getPlayerName(UUID.fromString(member.getKey()));
} catch (IllegalArgumentException ignored) {
}
if (playerName == null) {
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/de/t14d3/zones/listeners/CommandListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -283,14 +283,15 @@ public void handleListCommand(CommandSender sender) {
if (sender instanceof Player) {
player = (Player) sender;
}
boolean perm = sender.hasPermission("zones.info.other");
for (Map.Entry<String, Region> entry : regions.entrySet()) {
if (!sender.hasPermission("zones.info.other") && (player != null && !entry.getValue().isMember(player.getUniqueId()))) {
if (!perm && (player != null && !entry.getValue().isMember(player.getUniqueId()))) {
continue;
}

Component hoverText = regionInfo(
entry,
(sender.hasPermission("zones.info.other") ||
(perm ||
(player != null && this.plugin.getPermissionManager().isAdmin(player.getUniqueId().toString(), regions.get(entry.getKey())))))
.join();
var mm = MiniMessage.miniMessage();
Expand Down
44 changes: 42 additions & 2 deletions src/main/java/de/t14d3/zones/utils/Utils.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package de.t14d3.zones.utils;

import de.t14d3.zones.Zones;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.OfflinePlayer;
import org.bukkit.block.BlockState;
import org.bukkit.block.Container;
import org.bukkit.block.data.BlockData;
Expand All @@ -10,8 +12,7 @@
import org.bukkit.persistence.PersistentDataContainer;
import org.bukkit.persistence.PersistentDataType;

import java.util.HashMap;
import java.util.Map;
import java.util.*;

/**
* Utility methods for the plugin.
Expand All @@ -21,6 +22,9 @@
public class Utils {
private final Zones plugin;

public static List<OfflinePlayer> offlinePlayers = new ArrayList<>();
public static Map<UUID, String> playerNames = new HashMap<>();

/**
* Constructor for Utility methods.
*
Expand Down Expand Up @@ -75,4 +79,40 @@ public static Map<String, String> defaultFlags() {
flags.put("group", "Add a group to the player");
return flags;
}

public void populatePlayers() {
offlinePlayers.addAll(Arrays.asList(Bukkit.getOfflinePlayers()));
for (OfflinePlayer player : offlinePlayers) {
playerNames.put(player.getUniqueId(), player.getName());
}
}

public static OfflinePlayer getOfflinePlayer(UUID uuid) {
for (OfflinePlayer player : offlinePlayers) {
if (player.getUniqueId().equals(uuid)) {
return player;
}
}
offlinePlayers.add(Bukkit.getOfflinePlayer(uuid));
return Bukkit.getOfflinePlayer(uuid);
}

public static String getPlayerName(UUID uuid) {
if (playerNames.containsKey(uuid)) {
return playerNames.get(uuid);
}
OfflinePlayer player = getOfflinePlayer(uuid);
playerNames.put(uuid, player.getName());
return player.getName();
}

public static List<OfflinePlayer> getOfflinePlayers() {
return offlinePlayers;
}

public static List<String> getPlayerNames() {
return new ArrayList<>(playerNames.values());
}


}

0 comments on commit 54d6dcf

Please sign in to comment.