ItemGraph

A server-side forensic moderation mod for NeoForge 1.21.1. Reconstructs item movement, stack splits, and transformations through time from authoritative evidence.
Back to Files

ItemGraph 0.4.0-beta.2 (NeoForge 1.21.1)

File nameitemgraph-0.4.0-beta.2-neoforge.jar
Uploader
dwurdydwurdy
Uploaded
Oct 10, 2026
Downloads
10
Size
14.8 MB
Mod Loaders
NeoForge
File ID
9122363
Type
B
Beta
Supported game versions
  • 1.21.1

Curse Maven Snippet

NeoForge

implementation "curse.maven:itemgraph-1699446:9122363"

Learn more about Curse Maven

What's new

[0.4.0-beta.2] — 2026-10-10

Second public beta of the ItemGraph 0.4 line. Ships the inspection-mode consumption and async-query feedback fixes, the Fabric drop settle-position correction, the promised retirement of the -grieflogger-compatible artifacts (only the two standard jars are published), and the M11 reader-facing documentation rewrite.

Added

  • Entity attacks are consumed in inspection mode (issue #187). While /ig inspect is active — or inside the five-tick consumed-packet window — entity left-clicks are denied before damage runs, so a predicted hit can no longer damage, knock back, or pop the inspected entity. The denial is audit evidence: ATTACK_ENTITY_DENIED records carry the target UUID, hand, and held-item fingerprint on both loaders. NeoForge cancels AttackEntityEvent at HIGHEST priority and its LOWEST audit handler attributes the denial to INSPECTION_MODE, INSPECTION_WINDOW, or LOADER_CALLBACK_CANCELED; Fabric returns FAIL from AttackEntityCallback at ServerPlayer.attack HEAD. Denied attacks resync the held stacks plus the target's pairing state the same way denied interactions do. Accepted non-lethal attacks still record no separate event; that evidence gap is issue #56's lifecycle scope.
  • Inspection packet coverage (issue #178). A consumed or denied inspection right-click now consumes its whole packet set: the off-hand useItemOn and the item-use twin (RightClickItem on NeoForge, UseItemCallback on Fabric) can no longer place blocks, throw pearls, or use food on the inspected scene — including the revocation-detecting click whose twin arrives after the mode cleared (InspectionService.markInteractionConsumed).
  • Entity interactions are consumed in inspection mode (issue #185). While /ig inspect is active, entity right-clicks — armor-stand equipping, shearing, milking, leashing, name tags — are denied and consumed instead of mutating the scene. The denied attempt is still audit evidence: INTERACT_ENTITY_DENIED records carry the target UUID, hand, and held-item fingerprint on both loaders. NeoForge cancels EntityInteract / EntityInteractSpecific at HIGHEST priority with InteractionResult.FAIL; Fabric returns FAIL from UseEntityCallback, which covers both interact and interactAt packets; the listener-recorded denial suppresses the aggregate callback decorator's duplicate denial row. The same five-tick consumed-interaction marker covers entity packets that arrive just after the mode cleared, and consumed interactions resync the held stacks plus the target's entity data so client-predicted state reverts to server truth.
  • Copy and affordance polish (UX audit F6+F7+F10). /ig inspect on now repeats the disable hint from the toggle path; [Go to ...] links disclose their teleport consequence on hover; result sets past the eight-link cap end with a "…N more locations not shown" line; and an unknown /ig help topic suggests the closest topic names instead of dumping all 36.
  • Player-facing async query feedback (UX audit F1+F2+F4). /ig text queries now acknowledge acceptance in chat; the dispatcher's five-second deadline is reported as a query timeout or a queue wait instead of leaking JDBC cancellation text; and a permission revoked before delivery replaces the result with an explicit notice on every async path.
  • Documented accepted UX limits (UX audit F8+F9, issue #177). docs/QUERY_MODEL.md now records the one-line-per-row chat-density trade-off (with the designated summary-mode remedy) and that /ig page requires a player entity for saved-session continuation — console/RCON sources can still page directly via /ig lookup page. docs/CONFIGURATION.md records the localization scope precisely: 217 catalog keys per locale but only the nine source.* hover labels are translated — help topic bodies and overview lines ship English under nl_nl/zh_tw by design.
  • Visible flow-browser loading state (UX audit F5). While a page turn or detail open is in flight, the open flow-browser menu now shows the pending state: the page label gains the (loading) suffix and the paging arrows are greyed out, so controls no longer look live while clicks are gated. GUI data queries now share the five-second deadline used by text queries, and a rejected, failed, stale, or timed-out load restores the previous page rather than leaving the menu stuck greyed. The browser.loading_suffix catalog value now carries its intended leading space via a \ escape.

Fixed

  • Fabric drops record the entity's rest position, not its spawn position (issue #166). finishItemDropCapture read the ItemEntity coordinates at ServerPlayer.drop return — eye height plus throw offset — so a dropped- then-recovered stack produced DROP_ITEM and PICKUP_ITEM rows on GROUND nodes one block apart and the correlation bridge's node-equality filter could never pair them. Fabric now queues a bounded pending drop like the NeoForge listener and emits at the settle position (onGround, near-zero delta movement, removal at last known position, or TTL expiry); a pickup that overtakes a still-pending drop emits it at the shared pickup position, and death-drop replays and deferred /give ground outputs settle the same way. Fabric drop/pickup rows now also feed ItemEntityTracker so the entity-UUID continuity match that NeoForge already uses can rank Fabric candidates. Evicted or requeued pending entries stay DROP_UNRESOLVED/DEATH_DROP_UNRESOLVED to UNKNOWN with the eviction reason — never a fabricated ground transfer.
  • Inspection-mode denial and revocation handling (docs/UX_AUDIT.md finding F3). On both NeoForge and Fabric, a click that detects a revoked itemgraph.command.inspect grant now disables inspection, reports "Inspection disabled: the itemgraph.command.inspect permission was revoked.", and is consumed instead of falling through to vanilla — previously that click could break the block being inspected. Requests denied for a missing downstream grant (itemgraph.audit, or itemgraph.gui on containers) are now consumed for left-clicks and non-container right-clicks so a denied inspection never mutates the scene; container right-clicks still fall through so vanilla chest access is preserved, and transient rejections (queue full, database unavailable) still preserve ordinary interaction.

Added

  • Admin-facing UX audit (docs/UX_AUDIT.md). Flux-UX review of the /ig command tree, in-game help, async query feedback, flow browser, in-world inspection, permission denials, paging/location actions, localization, and the operator docs. Records ten findings with implementation evidence — including silent acceptance/timeout/revocation gaps in the async query path and an inspect-mode revocation fall-through — plus a prioritized follow-up backlog. No behavior changes.

Changed

  • Reader-facing documentation reorganized around audiences (issues #191–#195). docs/WRITING.md records the writing contract: named audiences, define-before-use, validator-pinned literals, and the protected evidence-ledger list. The README and admin quick start now lead with install, capture verification, and incident-to-command routing for first-time admins; the evidence, query, taxonomy, permission, configuration, GriefLogger-migration, and API docs name their audience and front-load reading maps or checklists; the contributor docs gain navigation signposts; and /ig help commands labels each route with the question it answers (ITEM LOST?, CHEST?, NEARBY?, WHY LINKED?). No command, permission, event, or schema contract changed.

Removed

  • GriefLogger-compatible artifact variants retired. ItemGraph replaces GriefLogger and no longer ships -grieflogger-compatible jars or declares the GriefLogger mod a usable companion. Both loaders now declare the GriefLogger mod a hard conflict (NeoForge type="incompatible", Fabric breaks), store listings mark the relation incompatible, and releases publish only the two standard jars. Migration path: remove the GriefLogger mod jar, keep its database.db, and use the unchanged opt-in read-only import (grieflogger_integration_enabled + grieflogger_database_path).