Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
bddd7c7
GUI refactor
rossnoah Mar 7, 2026
76cbeb0
simple tests
rossnoah Mar 7, 2026
321b3d0
storage tests
rossnoah Mar 7, 2026
60ab993
refactor commands and add tests
rossnoah Mar 7, 2026
0cdce4d
more command refactors
rossnoah Mar 7, 2026
9caf501
fix noisy tests
rossnoah Mar 7, 2026
829c906
Improve Redis error logging and remove unused Maven repo
rossnoah Mar 9, 2026
8aa8d83
Limit CI push trigger to main branch
rossnoah Mar 9, 2026
b2cc93c
Stop import command when KitsX files are missing
rossnoah Mar 9, 2026
cc00860
Handle missing inspect names and tighten UUID resolution
rossnoah Mar 9, 2026
fb7ea5a
Fix grammar in EC slot share error message
rossnoah Mar 9, 2026
ba313b7
Update src/main/java/dev/noah/perplayerkit/commands/admin/PerPlayerKi…
rossnoah Mar 9, 2026
577d482
Refactor player lookup utilities and add inspect/player tests
rossnoah Mar 9, 2026
1c0e471
Use cached offline player lookup for inspect UUID resolution
rossnoah Mar 9, 2026
548cf40
Harden inspect async flow and add player name fallbacks
rossnoah Mar 9, 2026
f48c604
Inline async player data load call in inspect command
rossnoah Mar 9, 2026
c003acc
Fix admin kit tab completion fallback behavior
rossnoah Mar 9, 2026
0a509ab
Prioritize offline UUID fallback before Mojang lookup
rossnoah Mar 9, 2026
d990732
Update notice script to derive copyright years from git
rossnoah Mar 10, 2026
97f116b
Always fall back to offline UUID when inspect lookup misses
rossnoah Mar 10, 2026
5b8a1d7
Return null when no public kit IDs for tab completion
rossnoah Mar 10, 2026
56e9387
Use ConcurrentHashMap for kit storage in KitManager
rossnoah Mar 10, 2026
ba27519
Use dedicated slot constant for public kit loading
rossnoah Mar 10, 2026
b8ad55e
Use command permissions for inspect and show armor indicators
rossnoah Mar 10, 2026
a28c846
Stop inspect offline UUID fallback and centralize kit caching
rossnoah Mar 10, 2026
3da6daa
Remove redundant inspect permission checks
rossnoah Mar 10, 2026
68a3328
Reuse deserialized kit when caching
rossnoah Mar 10, 2026
1f9bd0d
Validate delete/swap kit slots are within 1-9
rossnoah Mar 10, 2026
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 .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: CI

on:
push:
branches: [ "**" ]
branches: [ "main" ]
pull_request:
branches: [ "**" ]

Expand Down
41 changes: 37 additions & 4 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

<properties>
<java.version>1.8</java.version>
<mockito.version>5.15.2</mockito.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Expand Down Expand Up @@ -56,6 +57,10 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<propertiesEncoding>${project.build.sourceEncoding}</propertiesEncoding>
</configuration>
<executions>
<execution>
<id>process-resources</id>
Expand All @@ -74,6 +79,14 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.2</version>
<configuration>
<argLine>-javaagent:${settings.localRepository}/org/mockito/mockito-core/${mockito.version}/mockito-core-${mockito.version}.jar --enable-native-access=ALL-UNNAMED -Xshare:off</argLine>
</configuration>
</plugin>

</plugins>
<resources>
Expand All @@ -85,10 +98,6 @@
</build>

<repositories>
<repository>
<id>papermc-repo</id>
<url>https://papermc.io/repo/repository/maven-public/</url>
</repository>
<repository>
<id>sonatype</id>
<url>https://oss.sonatype.org/content/groups/public/</url>
Expand Down Expand Up @@ -169,5 +178,29 @@
<version>2.11.6</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.11.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>${mockito.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.36</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.49.1.0</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
36 changes: 24 additions & 12 deletions src/main/java/dev/noah/perplayerkit/KitManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,20 @@

import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

public class KitManager {
private static KitManager instance;
private final PerPlayerKit plugin;
private final HashMap<String, ItemStack[]> kitByKitIDMap;
private final Map<String, ItemStack[]> kitByKitIDMap;
private final HashMap<UUID, Integer> lastKitUsedByPlayer;
private final List<PublicKit> publicKitList;

public KitManager(PerPlayerKit plugin) {
this.plugin = plugin;
lastKitUsedByPlayer = new HashMap<>();
publicKitList = new ArrayList<>();
kitByKitIDMap = new HashMap<>();
kitByKitIDMap = new ConcurrentHashMap<>();
Comment thread
cursor[bot] marked this conversation as resolved.
instance = this;
}

Expand All @@ -58,6 +59,15 @@ public ItemStack[] getItemStackArrayById(String id) {
return kitByKitIDMap.get(id);
}

private void cacheKit(String id, ItemStack[] kit) {
if (kit == null) {
kitByKitIDMap.remove(id);
return;
}

kitByKitIDMap.put(id, kit);
}

public List<PublicKit> getPublicKitList() {
return publicKitList;
}
Expand Down Expand Up @@ -104,7 +114,7 @@ public boolean savekit(UUID uuid, int slot, ItemStack[] kit) {
}
}

kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), kit);
cacheKit(IDUtil.getPlayerKitId(uuid, slot), kit);
player.sendMessage(ChatColor.GREEN + "Kit " + slot + " saved!");

Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePlayerKitToDB(uuid, slot));
Expand Down Expand Up @@ -149,7 +159,7 @@ public boolean savePublicKit(Player player, String publickit, ItemStack[] kit) {
}
}

kitByKitIDMap.put(IDUtil.getPublicKitId(publickit), kit);
cacheKit(IDUtil.getPublicKitId(publickit), kit);
player.sendMessage(ChatColor.GREEN + "Public Kit " + publickit + " saved!");

Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePublicKitToDB(publickit));
Expand Down Expand Up @@ -192,7 +202,7 @@ public boolean savePublicKit(String id, ItemStack[] kit) {
}
}

kitByKitIDMap.put(IDUtil.getPublicKitId(id), kit);
cacheKit(IDUtil.getPublicKitId(id), kit);
return true;
}
return false;
Expand All @@ -212,7 +222,7 @@ public boolean saveEC(UUID uuid, int slot, ItemStack[] kit) {
}

if (notEmpty) {
kitByKitIDMap.put(IDUtil.getECId(uuid, slot), kit);
cacheKit(IDUtil.getECId(uuid, slot), kit);
player.sendMessage(ChatColor.GREEN + "Enderchest " + slot + " saved!");
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> saveEnderchestToDB(uuid, slot));
return true;
Expand All @@ -237,7 +247,7 @@ public boolean saveECSilent(UUID uuid, int slot, ItemStack[] kit) {
return false;
}

kitByKitIDMap.put(IDUtil.getECId(uuid, slot), kit);
cacheKit(IDUtil.getECId(uuid, slot), kit);
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> saveEnderchestToDB(uuid, slot));
return true;
}
Expand Down Expand Up @@ -269,7 +279,7 @@ public boolean savekit(UUID uuid, int slot, ItemStack[] kit, boolean silent) {
kit[39] = null;
}

kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(kit));
cacheKit(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(kit));
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> savePlayerKitToDB(uuid, slot));
return true;
} else {
Expand Down Expand Up @@ -436,7 +446,8 @@ public void loadPlayerDataFromDB(UUID uuid) {
if (!data.equalsIgnoreCase("error")) {
try {
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
kitByKitIDMap.put(IDUtil.getPlayerKitId(uuid, slot), ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
cacheKit(IDUtil.getPlayerKitId(uuid, slot),
ItemFilter.get().filterItemStack(kit));
} catch (IOException ignored) {
}
}
Expand All @@ -446,7 +457,8 @@ public void loadPlayerDataFromDB(UUID uuid) {
if (!data.equalsIgnoreCase("error")) {
try {
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
kitByKitIDMap.put(IDUtil.getECId(uuid, slot), ItemFilter.get().filterItemStack(Serializer.itemStackArrayFromBase64(data)));
cacheKit(IDUtil.getECId(uuid, slot),
ItemFilter.get().filterItemStack(kit));
} catch (IOException ignored) {
}
}
Expand Down Expand Up @@ -486,7 +498,7 @@ public void loadPublicKitFromDB(String id) {
if (!data.equalsIgnoreCase("error")) {
try {
ItemStack[] kit = Serializer.itemStackArrayFromBase64(data);
kitByKitIDMap.put(IDUtil.getPublicKitId(id), ItemFilter.get().filterItemStack(kit));
cacheKit(IDUtil.getPublicKitId(id), ItemFilter.get().filterItemStack(kit));
} catch (IOException ignored) {
plugin.getLogger().info("Error loading public kit " + id);
}
Expand Down Expand Up @@ -544,4 +556,4 @@ private void applyKitLoadEffects(Player player, boolean isEnderChest) {
}
}
}
}
}
26 changes: 21 additions & 5 deletions src/main/java/dev/noah/perplayerkit/PerPlayerKit.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,27 @@
*/
package dev.noah.perplayerkit;

import dev.noah.perplayerkit.commands.*;
import dev.noah.perplayerkit.commands.extracommands.HealCommand;
import dev.noah.perplayerkit.commands.extracommands.RepairCommand;
import dev.noah.perplayerkit.commands.tabcompleters.ECSlotTabCompleter;
import dev.noah.perplayerkit.commands.tabcompleters.KitSlotTabCompleter;
import dev.noah.perplayerkit.commands.admin.AboutCommandListener;
import dev.noah.perplayerkit.commands.admin.KitRoomCommand;
import dev.noah.perplayerkit.commands.admin.PerPlayerKitCommand;
import dev.noah.perplayerkit.commands.admin.SavePublicKitCommand;
import dev.noah.perplayerkit.commands.completion.ECSlotTabCompleter;
import dev.noah.perplayerkit.commands.completion.KitSlotTabCompleter;
import dev.noah.perplayerkit.commands.features.HealCommand;
import dev.noah.perplayerkit.commands.features.RegearCommand;
import dev.noah.perplayerkit.commands.features.RepairCommand;
import dev.noah.perplayerkit.commands.inspect.InspectEcCommand;
import dev.noah.perplayerkit.commands.inspect.InspectKitCommand;
import dev.noah.perplayerkit.commands.kits.DeleteKitCommand;
import dev.noah.perplayerkit.commands.kits.EnderchestCommand;
import dev.noah.perplayerkit.commands.kits.MainMenuCommand;
import dev.noah.perplayerkit.commands.kits.PublicKitCommand;
import dev.noah.perplayerkit.commands.kits.SwapKitCommand;
import dev.noah.perplayerkit.commands.share.CopyKitCommand;
import dev.noah.perplayerkit.commands.share.ShareECKitCommand;
import dev.noah.perplayerkit.commands.share.ShareKitCommand;
import dev.noah.perplayerkit.commands.shortcuts.ShortECCommand;
import dev.noah.perplayerkit.commands.shortcuts.ShortKitCommand;
import dev.noah.perplayerkit.listeners.*;
import dev.noah.perplayerkit.listeners.antiexploit.CommandListener;
import dev.noah.perplayerkit.listeners.antiexploit.ShulkerDropItemsListener;
Expand Down
78 changes: 0 additions & 78 deletions src/main/java/dev/noah/perplayerkit/commands/DeleteKitCommand.java

This file was deleted.

Loading
Loading