Summary
Several reliability gaps around lifecycle and saves:
- No
onDisable cleanup — DecentHolograms entities / click handlers may linger across /reload
- Async UUID lookup — save path can call
Bukkit.getPlayer(name).getUniqueId() after the player has left → NPE
- Expiration load filter — verify load query truly means “not expired” (
expiration > now)
Suggested approach
- Delete/unregister holograms and clear click maps in
onDisable
- Capture UUID from the
Player at create time and pass it into the async save
- Double-check SQL load predicates for expired rows
Summary
Several reliability gaps around lifecycle and saves:
onDisablecleanup — DecentHolograms entities / click handlers may linger across/reloadBukkit.getPlayer(name).getUniqueId()after the player has left → NPEexpiration > now)Suggested approach
onDisablePlayerat create time and pass it into the async save