Anti-Duplication Session Validation (isValid): Implemented a strict live validation check on every tick and before any slot click (Quick-Take, Quick-Deposit, Hand Swap). If a chest block is broken (becomes AIR), if the chested entity dies, or if claim permissions expire, the preview HUD immediately closes and all interactions are blocked. This fully patches a critical item duplication exploit!
Real-time Claims Protection Re-evaluation: Protection hooks are now dynamically re-validated during the active session to block peeking instantly if a player's trust is revoked mid-session.
Allocation-Free Eye Locations: Replaced all `player.getEyeLocation()` calls (which allocate a new `Location` object every tick) with a pre-allocated vector-based approach using `player.getLocation(reusableLoc)` and adding the player's eye height in-place.
Bypassed Redundant Trigonometry: Trigonometric viewport axes calculation (`buildAxes()`) is now run exactly once at the transition to Focus Mode (sneaking), rather than being computed on every single tick.
Raycast Blocks-Only Mode: If `enable-entities` is disabled or the list is empty, the raycast dynamically falls back to `rayTraceBlocks()`, completely skipping expensive entity bounding box queries on the server.
YAML Configuration Memory Cache: Cached all parsed configuration options inside typed memory variables in `StoragePeek.java`. This entirely bypasses nested YAML map traversals (such as `combat-culling.enabled`) on high-frequency raycasting ticks.
Garbage-Free Raycasting Loop: Eliminated loop-level lambda instantiations and computeIfAbsent() map lookups during raycast checking to ensure zero micro-allocations on active ticks.
Batched Visibility Updates (Task Reduction): Batched all initial passenger entity visibility calls (`player.showEntity`) into a single tick-delayed runnable on display generation. This reduces scheduler overhead during chest openings from ~40+ independent runnables down to exactly 1!
Skipped Redundant Animations: Bypassed scheduling individual tick-delayed scale-up runnables for item quantities and durability bars when spawning the display, as they are already handled by the primary batched `animateScaleUp` runnable.
Cached BlockData for Durability Bars: Cached parsed `BlockData` instances for concrete colors (`BLACK_CONCRETE`, `LIME_CONCRETE`, etc.) in the static display data cache, completely eliminating expensive `Bukkit.createBlockData(...)` registry lookups on every inventory update tick.
Cached Double Chest Midpoints: Resolved container center coordinates (including double chest midpoints) once at session creation and cached them in a field, completely bypassing heavy `block.getState()` and left/right side chest state retrievals on active ticks.
Lazy Hand-Held Shulker Evaluation: Raycast checks for hand-held Shulker boxes now evaluate `player.isSneaking()` first, eliminating redundant `getItemInMainHand()` and `getItemInOffHand()` ItemStack wrapper allocations on every tick. Off-hand is lazy-evaluated only if the main hand doesn't contain a shulker.
Unfocused HUD Transformation Culling: Prevented sending redundant HUD scale/rotation update packets (`setTransformation`) during active peeking ticks. When `focus-mode` is inactive, the HUD uses `Billboard.CENTER` to automatically face the player client-side, making server-side transform updates completely obsolete and saving 20 packets/sec per active player!
Cached Disabled Worlds Culling: Redefined the disabled worlds check to use a cached set of loaded World instances (updated dynamically on WorldLoad/WorldUnload events) instead of performing a string conversion `.toLowerCase()` world name check on every tick for every online player, completely eliminating thousands of tick-level string allocations!
Allocation-Free Entity Coordinate Resolution: Optimized the retrieval of entity center locations by utilizing Spigot's non-allocating `entity.getLocation(tempLoc)` signature, avoiding per-tick `Location` object allocations when peeking entity containers.
Precalculated Layout Offset Mapping: Replaced expensive `parent.getTransformation()` lookups with precalculated relative layout offsets during inventory syncing, bypassing reflection/NMS lookups and preventing massive transient JOML vector and quaternion object allocations.
Stationary Player Raycasting Skip: When peeking, if a player is standing still and not rotating their head, the session bypasses the wall-clipping raytrace and look orientation mathematics, drastically saving server CPU while preserving the smooth floating breathing animation.
️ Smarter Claim & Permission Checking (Zero In-Game CPU Waste):
Dynamic Protection Check Caching: The plugin now skips checking claims protection hook checks (`canAccess`) and permission checks (`hasContainerPermission`) if the player is looking at the same block or entity as their active session. Claim status and player permission lookups are now only computed when a session starts.
Eliminated BlockState Snapshot Overhead: When the `hide-when-empty` setting is enabled, the raycasting loop now directly queries the cached session inventory (`isEmpty()`) instead of repeatedly invoking `block.getState()` to construct expensive tile entity snapshot copies on every tick.
Combat Integration & Reflection Caching:
DeluxeCombat Reflection Caching: Cached the `DeluxeCombatAPI` instance to avoid executing `dcApiConstructor.newInstance()` via reflection on every tick, which generated massive GC pressure.
Combat Hook Reflection Caching: Cached intermediate manager classes (`CombatLogX`, `CombatTagPlus`, `PvPManager`) to avoid repeated reflection lookups on high-frequency raycasting ticks.
New Premium Features & Double Chest Centering:
Double Chest Auto-Centering: Dynamic centering of the 3D HUD between the left and right block halves of a Double Chest by resolving their block coordinates midpoint, eliminating offset visual previews.
Hand-held Shulker Box Preview (Hand Peeking): Sneaking while holding a Shulker Box in the main hand or off-hand now spawns a floating 3D preview of its contents in front of the player, without placing it on the ground.
Real-Time Hand Inventory Persistence: Full interactive quick actions support (TAKE, DEPOSIT, swap filter, sorting) on hand-held Shulker previews. Changes are immediately written and serialized back to the held item's NBT block state.
Maintenance & General Cleanup:
Removed Dead Code: Deleted legacy unused classes (`PeekManager.java` and `MathUtils.java`) to slim down the plugin jar size.
Auto-Enable on Join Fix: Added a new config option (`auto-enable-on-join`) to automatically re-enable StoragePeek for players when they join the server, resetting any previous `/storagepeek toggle` disablement, with safe initialization handling.
Startup NullPointerException Fix: Fixed a critical NullPointerException during plugin initialization when `auto-enable-on-join` was enabled. Config cache loading logic has been safely reordered to execute after all manager instantiations (specifically `disabledKey`), ensuring a crash-free startup.
Premium HUD & Particle Customization: Made item quantity displays, durability bars, durability bar colors (high, medium, low thresholds), and particle types/counts for both Ender and Rich themes fully toggleable and customizable inside config.yml.
Combat Culling Bypass Permission: Added support for a new permission storagepeek.bypass.combat which allows admins, moderators, or VIPs to peek containers during active combat.
Disabled Worlds Blacklist: Added a world blacklist option (disabled-worlds) in the configuration to completely deactivate StoragePeek peeking HUDs in specific worlds (e.g., PvP worlds or game lobbies).
Custom Quick-Actions Click Buttons: Introduced config values (quick-actions.left-click / right-click) to customize which mouse button triggers the TAKE vs DEPOSIT quick-actions when aiming at item slots.
Upgrade to StoragePeek v1.1.7 for a lag-free, secure holographic experience! Support us on Discord if you love the plugin!