Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ plugins {
}

group = "com.bitaspire"
version = "1.2.1"
version = "1.2.3"

repositories {
mavenLocal()
Expand Down
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
4 changes: 3 additions & 1 deletion gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip
networkTimeout=10000
retries=0
retryBackOffMs=500
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
7 changes: 2 additions & 5 deletions gradlew

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

32 changes: 10 additions & 22 deletions gradlew.bat

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file modified libraries/CyberCore-2.0.0.jar
Binary file not shown.
45 changes: 34 additions & 11 deletions src/main/java/com/bitaspire/cyberlevels/command/CLVTabComplete.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,18 @@ public class CLVTabComplete implements TabCompleter {

private static final String PLAYER_PREFIX = "CyberLevels.player.";
private static final String ADMIN_PREFIX = "CyberLevels.admin.";

private static final Map<String, String> COMMAND_PERMISSIONS = new HashMap<>();
private static final long PLAYER_NAME_CACHE_MILLIS = 5000L;

private static final List<String> EXP_AMOUNT_SUGGESTIONS = Collections.unmodifiableList(
Arrays.asList("<amount>", "5", "100", "250", "1000")
);
private static final List<String> LEVEL_AMOUNT_SUGGESTIONS = Collections.unmodifiableList(
Arrays.asList("<amount>", "1", "2", "5")
);
private static final Set<String> MUTATION_COMMANDS = Collections.unmodifiableSet(new HashSet<>(
Arrays.asList("addexp", "setexp", "removeexp", "addlevel", "setlevel", "removelevel")
));
private static final Map<String, String> COMMAND_PERMISSIONS = new LinkedHashMap<>();

static {
COMMAND_PERMISSIONS.put("about", PLAYER_PREFIX + "about");
Expand All @@ -48,6 +58,9 @@ public class CLVTabComplete implements TabCompleter {
}

private final CyberLevels main;
private long playerNamesCachedAt = 0L;
private boolean playerNamesCachedOfflineMode = false;
private List<String> cachedPlayerNames = Collections.emptyList();

/**
* Produces context-aware tab completions for the CyberLevels command set.
Expand Down Expand Up @@ -84,16 +97,14 @@ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Comman
break;

case "addexp": case "setexp": case "removeexp":
return partialMatch(args[1], Arrays.asList("<amount>", "5", "100", "250", "1000"));
return partialMatch(args[1], EXP_AMOUNT_SUGGESTIONS);

case "addlevel": case "setlevel": case "removelevel":
return partialMatch(args[1], Arrays.asList("<amount>", "1", "2", "5"));
return partialMatch(args[1], LEVEL_AMOUNT_SUGGESTIONS);
}
}

if (args.length == 3 &&
Arrays.asList("addexp", "setexp", "removeexp", "addlevel", "setlevel", "removelevel")
.contains(args[0].toLowerCase()))
if (args.length == 3 && MUTATION_COMMANDS.contains(args[0].toLowerCase(Locale.ENGLISH)))
{
List<String> suggestions = new ArrayList<>();
suggestions.add("[<player>]");
Expand All @@ -105,9 +116,16 @@ public List<String> onTabComplete(@NotNull CommandSender sender, @NotNull Comman
}

private List<String> getPlayerNames() {
List<String> players = new ArrayList<>();
boolean offlineMode = main.cache().config().isTabCompleteLoadOfflineUsers();
long now = System.currentTimeMillis();

if (offlineMode == playerNamesCachedOfflineMode &&
now - playerNamesCachedAt <= PLAYER_NAME_CACHE_MILLIS)
return cachedPlayerNames;

LinkedHashSet<String> players = new LinkedHashSet<>();

if (main.cache().config().isTabCompleteLoadOfflineUsers()) {
if (offlineMode) {
for (OfflinePlayer p : Bukkit.getOfflinePlayers()) {
String name = p.getName();
if (name != null) players.add(name);
Expand All @@ -118,13 +136,18 @@ private List<String> getPlayerNames() {
}
}

return players;
List<String> snapshot = new ArrayList<>(players);
snapshot.sort(String.CASE_INSENSITIVE_ORDER);
cachedPlayerNames = snapshot;
playerNamesCachedOfflineMode = offlineMode;
playerNamesCachedAt = now;
return cachedPlayerNames;
}

private List<String> partialMatch(String input, List<String> options) {
List<String> matches = new ArrayList<>();
StringUtil.copyPartialMatches(input, options, matches);
Collections.sort(matches);
matches.sort(String.CASE_INSENSITIVE_ORDER);
return matches;
}
}
23 changes: 12 additions & 11 deletions src/main/java/com/bitaspire/cyberlevels/hook/HookManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,33 +82,33 @@ public HookManager(CyberLevels main) {
"ms&7.", "");
}

private synchronized boolean loadAxHoesIfReady() {
if (axHoesLoaded) return false;
if (!main.isEnabled("AxHoes")) return false;
private synchronized void loadAxHoesIfReady() {
if (axHoesLoaded || !main.isEnabled("AxHoes")) return;

final long l = System.currentTimeMillis();
long l = System.currentTimeMillis();
AxHoesHook hook = new AxHoesHook(main, this);
hooks.add(hook);

// Only register here if the global register() pass has already run; otherwise it'll be
// picked up by hooks.forEach(Hook::register) later. Registering twice would attach the
// listener twice and double-count every PlayerXPGainEvent.
if (globalRegistered) hook.register();

axHoesLoaded = true;
main.logger("&7Loaded &eAxHoes&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7.");
return true;
}

private synchronized boolean loadAxPickIfReady() {
if (axPickLoaded) return false;
if (!main.isEnabled("AxPickaxes")) return false;
private synchronized void loadAxPickIfReady() {
if (axPickLoaded || !main.isEnabled("AxPickaxes")) return;

final long l = System.currentTimeMillis();
long l = System.currentTimeMillis();
AxPickHook hook = new AxPickHook(main, this);
hooks.add(hook);

if (globalRegistered) hook.register();

axPickLoaded = true;
main.logger("&7Loaded &eAxPickaxes&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7.");
return true;
}

void sendExp(Player player, ExpSource source, String item) {
Expand Down Expand Up @@ -150,7 +150,8 @@ public double externalMultiplier(Player player) {
if (player == null) return 1D;

double multiplier = 1D;
if (axBoostersHook != null) multiplier *= axBoostersHook.getMultiplier(player);
if (axBoostersHook != null)
multiplier *= axBoostersHook.getMultiplier(player);
return multiplier;
}

Expand Down
Loading