- Lore Codex storable in Chiseled Bookshelves -- the Codex can now be placed alongside regular lore books via the
minecraft:bookshelf_booksitem tag. - Lore Codex placeable on Lecterns -- right-click an empty lectern while holding the Codex to place it. Right-clicking a Codex-holding lectern opens the Codex GUI instead of vanilla's empty-book reader (the Codex has no
pagesNBT). The GUI shows the interacting player's own synced collection, consistent with in-handLoreCodexItem#use.
- Data-generation scaffolding --
ModItemTagsProvidernow also emitsrpg_lore:lore_codexintominecraft:bookshelf_books. Hand-written JSON remains authoritative (datagen still blocked by the pre-existing Curios mixin/mappings clash).
- Chiseled Bookshelf storage -- lore books can now be placed in vanilla Chiseled Bookshelves and displayed alongside regular written books. Implemented via the
minecraft:bookshelf_booksitem tag; comparator output and book rendering work naturally. - Lectern placement -- lore books can now be placed on vanilla Lecterns. Right-click an empty lectern while holding a lore book to place it; right-click the filled lectern to open the reader UI. Reading, dropping, and comparator output all work unchanged. Implemented via a
PlayerInteractEvent.RightClickBlockhandler that replicatesLecternBlock.placeBook, since vanillaLecternBlock#isBookis hardcoded toItems.WRITTEN_BOOK/Items.WRITABLE_BOOKwith no tag or extension point.
- Stricter
lore_idvalidation on pickup --CodexEventHandler.onItemPickupnow rejects NBT wherelore_idis missing, wrong type, or empty, preventing ghost entries from malformed/gived books. - Blank lore books no longer glint --
LoreBookItem#isFoilnow returnsfalsewhen NBT is absent, so/give rpg_lore:lore_bookwithout annbtargument produces a plain template book instead of a shimmering blank.
- Translation keys for all
/rpglorecommand output -- 18 new keys inen_us.jsoncoverreload,give,list,collection, and allcodexadmin subcommands; allComponent.literal(...)call sites inRpgLoreCommandsreplaced withComponent.translatable(...). Admin feedback is now consistent with the 60-language localization pass shipped in 2.0.1. - CodexService threading contract documented --
instanceis nowvolatile, and Javadoc spells out the main-thread-only rule and thectx.enqueueWork(...)requirement for packet handlers. No behavioral change in 1.20.1 (all handlers already comply), but the contract is now explicit. - Data-generation scaffolding -- added
DataGenerators,ModBlockTagsProvider, andModItemTagsProviderundercom.rpglore.data. The item-tags provider emitsminecraft:bookshelf_bookscontainingrpg_lore:lore_bookwhen./gradlew runDatais run. (Note:runDatacurrently errors in this environment due to a pre-existing Curios mixin/mappings clash; the hand-written tag JSON remains authoritative until that is resolved.)
- First-join Codex grant no longer lost when inventory is full -- the Codex is now dropped on the ground if inventory is full, and only marked as granted after successful delivery
maxBooksPerKillnow enforced across all drop types -- books withbase_chanceare no longer exempt from the per-kill cap; the combined total from both override and global-pool books respectsMAX_BOOKS_PER_KILL- Codex progress counts can no longer exceed total -- collected counts now use
collected ∩ eligibleinstead of the raw saved ID set; books switched tocodex_exclude=trueare properly pruned from collections - Soulbound death handling no longer deletes extra Codices -- fixed early return that skipped Curios slot check, added
add()result validation for Curios restoration, movedinvalidateCaps()into afinallyblock
- Copying from Codex with a full inventory -- now rejects the copy with an error message instead of dropping an unpickable book on the ground
CODEX_ENABLEDnow fully disables the Codex -- the item no longer appears in the creative tab,use()shows a disabled message, and commands are guarded when the config is off- Client notification/sound configs now work -- collection feedback is sent via a dedicated clientbound packet so the client can respect
showCollectionNotificationandplayCollectionSoundsettings /rpglore reloadnow prunes and resyncs -- stale entries are pruned and all online players' Codex items and UI caches are refreshed after a reload- Admin
/rpglore codex addrejects excluded books -- books withcodex_exclude=truecan no longer be injected into Codex data via commands - Input validation strengthened --
base_chanceclamped to [0.0, 1.0],min_y > max_ywarned and swapped, invalid book IDs rejected with error
- Centralized Codex state management -- new
CodexServicehandles all mutations atomically across SavedData, item NBT, and client sync, eliminating tooltip/UI drift after toggles, admin commands, or reloads - Looting enchantment reads from loot context -- uses
LootContextParams.TOOLinstead of always reading the main hand, fixing off-hand and projectile kill scenarios - Curios item tag added -- the Codex slot now has a proper item tag at
data/curios/tags/items/codex.jsonfor reliable slot assignment - Curios compatibility hardened --
findCodexInCurioswrapped withNoClassDefFoundErrorcatch for defensive classloading safety - Sync packet slimmed -- removed unused
authorandcategoryfields from network transmission - Item NBT slimmed -- removed full
codex_collectedID list from item NBT; only lightweight tooltip fields are cached - Localization pass -- moved Codex tooltip text to translation keys; added
rpg_lore.codex.tooltip.description,rpg_lore.codex.tooltip.hint,rpg_lore.codex.disabled, andrpg_lore.codex.copy.inventory_full - Mod metadata -- added
updateJSONURLto mods.toml
- Removed dead
codex_ownerNBT tag (was written but never enforced) - Removed copied Forge source files from repository root (
net/directory) - Replaced
ConcurrentHashMapwithHashMapin tracking data classes (all access is main-thread)
- Protocol version bumped from
1to2(clients and servers must match)
- Lore Codex item -- a soul-bound personal collection tracker that stores your lore books directly
- Books stored in the Codex -- when you pick up a new lore book, it goes into the Codex instead of your inventory; the physical item is consumed and the book is accessible from the Codex GUI
- Copy mechanic -- create physical copies of any collected book from the Codex into your inventory (copies always go to inventory, generation incremented)
- Auto-collection -- picking up a lore book for the first time automatically stores it in your Codex
- Soul-binding -- the Codex is granted on first login and persists through death; cannot be dropped when soul-bound
- Browsable GUI -- custom parchment-styled screen using the codex.png texture, with paginated book list, collection counter (n/N), and per-book Read/Copy actions
- Duplicate prevention toggle -- when enabled, prevents picking up lore books already stored in the Codex
- Codex commands --
/rpglore codex give/reset/add/remove/statusfor server administration - Self-service collection view --
/rpglore collection(no OP required) shows your own collected books - Full networking -- Forge SimpleChannel with server-authoritative data; client never modifies tracking
- 7 server config options -- enable/disable Codex, soul-binding, auto-collect, first-join grant, copy, duplicate prevention, reveal uncollected names
- 2 client config options -- collection notification and sound toggles
- Optional Curios integration -- the Codex can be equipped in a dedicated "codex" Curios slot (soft dependency; mod works without Curios)
- Codex slot -- registers a custom "codex" slot type for players via Curios data pack
- Full compatibility -- auto-collection, soul-binding, and all Codex features work with the Codex in either inventory or Curios slot
show_glint(bool) -- per-book enchantment glint toggle (default: true)category(string) -- optional category for grouping books in the Codex and/rpglore listcodex_exclude(bool) -- exclude a book from appearing in the Codex
- Added 58 language files covering 60 locales total, including all European languages, top 10 Asian languages, top 10 African languages, plus Japanese, Korean, Filipino, and Traditional Chinese
- Updated Lore Book item texture
- Updated Lore Codex item texture
- Custom codex.png GUI texture for the Codex screen (leather-bound parchment with page navigation sprites)
- Drop chance redesign --
base_chancenow truly overrides the global drop chance instead of stacking multiplicatively with it; books withoutbase_chancestill use the global chance - Tracking order fix -- per-player copy tracking now records after the book is confirmed added to loot, not before
- Generation validation --
generationfield is now clamped to 0-3 with a warning on invalid values - JSON escaping -- replaced manual string escaping with Gson programmatic JSON building, fixing edge cases with special characters
- Biome fallback logging -- null biome IDs now log a warning instead of silently defaulting to
minecraft:plains - Copy limit validation --
max_copies_per_playervalues below -1 are now warned and normalized to -1
/rpglore giveno longer tracks by default -- admin gives no longer count against per-player copy limits; use the optionaltrackargument to opt in- Extracted LoreBookRegistry -- book registry, query methods, and tracking delegation split out from BooksConfigLoader for cleaner architecture
- DropCondition converted to record -- consistent with DropConditionContext and LoreBookDefinition
- Weighted selection short-circuit -- skips unnecessary weighted sampling when all candidates fit within the max
- Page count limit -- books are now capped at 200 pages with a warning
- Title length warning -- titles exceeding 48 characters produce a log warning
- Creative tab -- Lore Book and Lore Codex now appear in the Tools & Utilities creative tab
- Mod metadata -- added
displayURLto mods.toml - Code documentation -- hardcoded vanilla layout constants and fragile shadow fields are now documented with version-upgrade notes
- Enchantment glint is now configurable per-book via the
show_glintfield (default: true, preserving existing behavior) /rpglore listnow shows book categories when present- Tooltip separator extracted to a named constant
- Fixed per-player copy limit logic --
max_copies_per_playernow works correctly for all values, not just 1 - Fixed
/rpglore reloaderasing per-player copy tracking data - Fixed page navigation desync in lore book screen when rapidly clicking forward on the last page
- Fixed loot modifier creating a new
Randominstance per mob kill -- now uses the loot context's seeded random
- Per-player copy tracking now persists across server restarts via world SavedData
/rpglore givenow records against per-player copy limits for consistency- Book weight is now validated at load time -- zero or negative weights are clamped to 0.01 with a warning
- Per-player tracking data is thread-safe (ConcurrentHashMap)
- Default author color on the book screen unified to dark gray (consistent with tooltip)
- Removed unused
showPickupToastandglintColorclient config options (were never implemented)
- Data-driven lore books defined via JSON config files
- Configurable mob drop conditions (entity type, biome, dimension, time, weather, Y-level)
- Custom book GUI with auto-generated title page
- Styled tooltips with colored title, author, generation, and description
- In-game commands:
/rpglore reload,/rpglore give,/rpglore list - Server and client configuration via Forge config spec
- Looting enchantment scaling support