The More Polite Notifications Patch
The announcement system was always intended as a personal touch—a cozy newspaper to share news and updates directly while you sip your coffee. But your feedback made it clear that 'personal touch' can feel a bit intrusive when you've got two or three hundred other mods vying for your attention. I get it.
This patch is all about handing the controls over to you. Based on some fantastic feedback, I've added a suite of new more accessible options to let you decide exactly how—or if—you see notifications. The goal is to keep the feature useful for those who want it, while making it completely unobtrusive for those who don't.
Added
- Added click-and-drag functionality to the announcement screen scrollbar.
- You can now scroll down on announcements by dragging the scrollbar handle with your mouse, in addition to using the mouse wheel.
- Enhanced control over the announcement system with new UI options and quality-of-life features.
- A new "Enable Announcements" master switch has been added to the config screen, allowing you to control all notification icons at once.
- You can now instantly mark all announcements as read from a new button in the config screen.
- A "Snooze (Session)" button is now available on the announcement screen to temporarily hide all notifications until the game is restarted.
- Holding
Shift
while clicking "Mark As Read" on any announcement will now mark all pending notifications as read.
Changed
- The inventory key now closes the announcement screen.
- Pressing the inventory key (default 'E') while viewing an announcement will now correctly close the screen, mimicking standard Minecraft UI shenanigans.
- Overhauled the announcement screen's action buttons for clarity and control.
- The button layout has been reorganized into two rows and simplified. The old, confusing "Disable These" button has been replaced with a clearer "Disable All" button that permanently turns off the notification icons (this can be undone in the config).
- Patchouli's "Mark All as Read" button now includes announcements.
- The "Mark All as Read" button on the main page of the Hamster Tips guide book now correctly marks all pending announcements as read in both Patchouli's system and mine, so now it behaves exactly as you'd expect it to.
Fixed
- Resolved major UI scaling issues with the announcement screen.
- The entire announcement GUI (background, content, and buttons) now dynamically scales down to fit the available window space, preventing elements from being cut off.
- Attempted fix for a startup crash on NeoForge with large modpacks.
- A
NullPointerException
was reported by one person on game launch, likely caused by a race condition with the new announcement system in heavily modded environments. While I couldn't reproduce the crash myself, I've refactored the system to initialize itself on demand, which should resolve this kind of loading order issue. This change is safe and may prevent similar problems in the future.
- A
- Removed the concept of "mandatory" announcements.
- You are now the master of your own notification destiny. The system no longer distinguishes between optional messages and "mandatory" update notifications, giving you full control to dismiss, snooze, or disable any and all announcements as you see fit.
- Upgraded Fzzy Config library to resolve UI bugs.
- Updated from v0.7.0 to v0.7.3 to fix an issue where nested, collapsed groups in the config screen would incorrectly appear expanded by default. This should make navigating the configuration screen much less overwhelming.
- This Fzzy Config update also resolves a data generation bug that was preventing tooltips from appearing for the "Survival Inventory" and "Creative Inventory" announcement bell icon offset settings.
The Server Sanity Patch
This is a quick but critical hotfix to address a series of unfortunate events that followed the 3.3.0 update, primarily aimed at making dedicated servers not immediately burst into flames.
Long story short: dedicated servers should now launch without issue, and the new announcement system will no longer crash your client for the crime of being too efficient. Your game should be much happier now.
Fixed
- Resolved multiple dedicated server crashes on startup.
- Fixed an
AbstractMethodError
crash by correctly separating the registration of client-side packet handlers from the common registration of packet types. - Fixed an
InvalidMixinException
crash by moving several client-only mixin accessors (ClickableWidgetAccessor
,GuiBookAccessor
, etc.) to the client-specific section of the mixin configuration file.
- Fixed an
- Fixed a
NullPointerException
when dismissing a single announcement.- This occurred when the notification icon was clicked from an inventory screen with only one pending notification. The system now correctly uses the fully initialized virtual
BookEntry
from Patchouli's data, preventing the crash.
- This occurred when the notification icon was clicked from an inventory screen with only one pending notification. The system now correctly uses the fully initialized virtual
- Corrected the "See Changelog" button URL in the announcement screen.
- The URL was missing the required version and loader suffix, causing it to lead to a 404 page on Modrinth. It now generates the correct link for the specific version.
The Patchouli Page-Turner Update
Hamster Tips guide book graduates to Patchouli, and your game now gets a special update notes system that can pull live from my GitHub repo.
THe Hamster Tips guidebook is completely overhauled with Patchouli's built-in tools + my own custom UI, smarter text wrapping, and automatic upgrades from the old guide book. A physics-simulated notification bell (with hamster ears) flags unread notes— all configurable and snoozeable— and virtual entries in Hamster Tips open the new markdown viewer without leaving the game. Under the hood, a new smart ownership algorithm ends pet-on-pet friendly fire, and translators also get a tidier language file.
Added
- New Patchouli Guide Book
- Replaced the original vanilla written book with a comprehensive, feature-rich guide book powered by the Patchouli library.
- Features a completely custom user interface, including a unique book texture and a custom-coded landing page layout with a wrapped, multi-line subtitle for a more polished presentation than what Patchouli offers by default.
- Implemented a dynamic text wrapping and pagination system for entry titles, ensuring that long or translated titles do not render off the edge of the page.
- Includes a robust backwards-compatibility system that automatically detects and upgrades any old guide books found in a player's inventory or any opened container to the new Patchouli version.
- Client-Side Announcement & Update Notification System
- Implemented a robust client-side notification system capable of fetching a
manifest.json
and individual markdown files from a public GitHub repository. - This allows for the delivery of announcements and "What's New" update notes to players without requiring a mod update.
- The system intelligently compares the player's installed mod version against the latest version in the manifest to create "Update Available" notifications, which can be snoozed.
- Implemented a robust client-side notification system capable of fetching a
- Dynamic HUD & GUI Notification Icon
- Added a new notification icon (a bell with hamster ears) that appears on the main game HUD and compatible GUI screens when unread notifications are pending.
- The icon is driven by a custom, render-frame-timed physics animator using a spring-damper model to create organic, natural motion. When moving between positions (e.g., when opening the recipe book), the icon smoothly accelerates and decelerates, with a slight rotational kick and overshoot for a more dynamic feel.
- Upon reaching its destination, it performs a brief "settle wobble" before coming to a rest. The icon also features a periodic idle wiggle animation, and smoothly scales up on hover for satisfying tactile feedback.
- The icon dynamically repositions itself to remain anchored to the corner of inventory screens, organically transitioning to its new location when the GUI shifts, such as when opening or closing the recipe book.
- Its tooltip is dynamic, displaying context-aware text like "New update available," "New announcement," or "What's new in vX.Y.Z."
- Custom Markdown-Powered Announcement Viewer
- Created a new, custom GUI screen for displaying announcement and update content, replacing the standard Patchouli entry page for these notifications.
- The viewer features a full Markdown renderer that supports headings, bold/italic text, lists, code spans, clickable links, and dividers.
- Includes a set of vanilla-style buttons for actions like "Mark as Read," "Remind Me Later" (snooze), "Disable These," and "See Changelog," with dynamic positioning depending on which buttons are present.
- Virtual Patchouli Integration for Notifications
- Virtually injects two new categories ("Announcements" and "Update Notes") and their corresponding entries into the Hamster Tips guide book at runtime.
- This leverages Patchouli's list-rendering and unread-marker system without requiring any physical json files in the mod's JAR.
- Clicking a virtual entry opens the custom announcement GUI instead of the entry (because there is no entry), and mixins have been added to prevent the "Mark All Read" button from affecting these virtual entries, and to prevent them from showing up in main "Entry Index" list.
- New Announcement Icon Configuration Options
- Added extensive new settings to the config to control the announcement system, including toggles for the HUD and in-GUI icons.
- Players can customize the HUD icon's screen position, scale, and offset, as well as the offset for the in-GUI widget icon.
- New
ConfigAction
buttons allow players to reset their entire announcement history or re-enable optional announcements if they were previously disabled.
- New Configuration Options for Health and Mounting
- Added
Wild Hamster Max Health
andTamed Hamster Max Health
settings, allowing players to customize the health pools for both wild and tamed hamsters independently. - Added an
Enable Force-Mount Keybind
option (disabled by default) that, when enabled, allows players to mount a nearby tamed hamster by pressing a dedicated keybind, without needing to hold a specific item. - Added a
Consume Shoulder-Mount Item
toggle (enabled by default) that controls whether the item used to lure a hamster onto the player's shoulder is consumed in the process.
- Added
- Farmer’s Delight Cutting Board Compatibility
- Added cutting board recipe support for cucumbers → sliced cucumbers.
- Thanks to Cashhew for the contribution!
- Smart Pet-Ownership Algorithm (under the hood)
- New logic that recognizes your pets across Minecraft’s many creatures (wolves, cats, parrots, horses—and most modded pals).
- It doesn’t just “check a box” — it can figure out ownership even when a pet only stores a hidden ID instead of a visible owner link.
- Built to prevent friendly-fire even with all the chaos: thrown hamsters, indirect hits, and weird edge-cases from other mods. (See "Fixed" section for more details)
- Designed to be fast and lightweight so it won’t slow your world down.
- Future-proofed: works across loaders and should play nicely with most other mods out of the box.
Changed
- Optimized Language File Generation
- Refactored the data generation process for the
en_us.json
language file to eliminate the creation of redundant, prefixed translation keys for the configuration screen. - This results in a smaller, cleaner, and more efficient language file with no impact on in-game text. Easier translating!
- Refactored the data generation process for the
Fixed
- No More Pet-on-Pet Drama
- Thrown hamsters now bounce off your own tamed pets (wolves, cats, parrots, horses—and most modded pets) instead of hurting them.
- I designed a friendly-fire smart ownership algorithm that figures out who owns what—even when a pet only remembers you by an internal ID.
- Works both ways: your other pets can’t hurt your tamed hamsters either.
- Resolved Server Crash on Hamster Throw
- Fixed a
NullPointerException
that would crash dedicated servers when a player used the "Throw Hamster" keybind. - The crash was caused by server-to-client sound packets being registered only on the client, leading to an error when the server attempted to send them.
- All network packet registrations have been consolidated into a single, common method, ensuring both the server and client are aware of all packet types.
- Fixed a
- Corrected Configuration Synchronization
- Replaced the incorrect
@ClientModifiable
annotation with the appropriate@NonSync
annotation for all client-side settings in the configuration file. - This change prevents a potential issue where clients could modify server-synced settings without permission and ensures that client-only settings (like UI and animation options) are handled correctly.
- Replaced the incorrect
The Multi-Shoulder Hamster & Mega-Configurability Update
Just when you thought your shoulders were safe, I've gone and turned them into a hamster condominium. This update completely overhauls the shoulder pet system, adds a frankly irresponsible amount of configuration, injects a hefty dose of unnecessary realism, and more!
Added
- Multi-Hamster Shoulder & Head Mount System
- Players can now have up to three hamsters mounted simultaneously: one on each shoulder and one on their head.
- The mounting system will automatically place a hamster in the next available slot (Right Shoulder -> Left Shoulder -> Head).
- Shoulder-mounted hamsters will automatically adjust their offset to fit both slim and wide player models, and will sit even further out to rest on top of equipped chestplates.
- A configurable dismount order (
LIFO
/FIFO
) determines which hamster is removed first by the standard dismount key. - Added a client-side hand-swing animation when mounting a hamster to the player's shoulder.
- Dynamic & Reactive Shoulder Hamster Animations
- Shoulder-mounted hamsters are now fully animated using their primary GeckoLib model and no longer use a separate, static vanilla model.
- They dynamically cycle through standing, sitting, and unique, slot-specific "laying down" animations.
- Hamsters now react when the player sprints by entering their "laying down" animation, as if holding on for dear life. A randomized micro-delay ensures each hamster reacts independently.
- Physics-Based Animation for Shoulder Hamsters
- Shoulder-mounted hamsters now have a dynamic, physics-lite simulation applied to them, making them feel more alive.
- Vertical Bounce: Hamsters will bounce on the player's shoulder in response to jumping and falling, with their motion driven by the player's vertical velocity.
- Squash and Stretch: The hamster's model will visually squash and stretch to simulate inertia and impact forces, making jumps and landings feel more impactful.
- Impact Effects: A unique squash effect and a new custom sound effect will now trigger at the moment a hamster lands back on the shoulder after a fall or jump, with the sounds staggered for a more natural feel when multiple hamsters are mounted.
- Configuration Options for Shoulder Hamster Audio
- Added a "Silence Idle Sounds" toggle to mute the ambient squeaks from shoulder hamsters.
- Added a "Silence Physics Sounds in First-Person" toggle to mute the new landing/bounce sound effect specifically when in first-person view.
- Configurable Animation Control for Shoulder Hamsters
- Added a config group for "Animation Settings" to give players full control over shoulder hamster behavior.
- Players can disable the "Dynamic Animations" toggle to force all shoulder hamsters into a single, static pose using the "Forced Animation State" dropdown.
- The duration of each dynamic state can be customized/randomized with "Min/Max Animation State Duration" sliders, controlling how long a hamster will stay in one pose before transitioning.
- Added a
forceLayDownOnWalk
config option (disabled by default) that makes hamsters enter their "laying down" pose during any player movement, not just sprinting.
- Config-Driven Item Tags for All Interactions
- All hardcoded item checks have been replaced with a high-performance, config-driven system, allowing users to customize nearly every hamster interaction.
- Players can now define custom lists of items or item tags for taming, standard feeding, buff foods, shoulder mounting, cheek pouch unlocking, and basically every other hamster interaction.
- This new system includes built-in default compatibility for popular mods like Farmer's Delight and its addon Cultural Delights.
- Conditional Headshake Animations
- Added a new
anim_hamster_moving_headshake
animation. - When a hamster refuses a food item, it will now intelligently play either a stationary or a moving headshake animation depending on whether it is standing still or walking.
- Added a new
- Visual Height Adjustment on Snow Layers
- Hamsters will now render slightly higher when standing on snow layers, preventing their model from sinking into the snow and creating a more realistic and visually polished effect. Now your white hamsters won't be so invisible in snow biomes! Lol.
- Fresh Moves Compatibility for Shoulder Hamsters
- The new shoulder hamster rendering system automatically supports player animation-overhaul resource packs like Fresh Moves, because shoulder hamsters are now anchored directly to the player's animated body parts (arms and head), allowing them to realistically move and bounce along with the player's enhanced walk cycle.
Changed
- AppleSkin Compatibility for Configurable Food
- The
CheeseItem
's properties are now fully dynamic*, ensuring that changes to its nutrition or saturation values in the config are correctly reflected in AppleSkin's "on-eat" HUD preview. *Unfortunately due to major API changes between MC versions, this only works on 1.21.1.
- The
- Shoulder Mounting Behavior
- The logic has been updated to allow players to mount a hamster onto their shoulder with a lure item (like cheese) even while sneaking.
- Wander AI Frequency
- The default chance for a hamster's idle
WanderAroundFarGoal
to activate has been slightly increased, making them a bit more active when not following the player.
- The default chance for a hamster's idle
- Reworked mob fleeing behavior from hamsters.
- Replaced the hardcoded Creeper-fleeing mechanic with a new configurable system. Ravagers and Spiders will now flee from hamsters by default, restoring the unique anti-Creeper role to vanilla cats. These new fleeing behaviors can be individually toggled in the config.
- Hamster Textures
- Increased the saturation of the lavender hamster variant's texture to make it appear more purple and less gray.
- Slightly tweaked two of the white overlay textures to make them look a little bit cuter— very subtle changes here.
Fixed
- Hamster Teleportation
- Fixed a bug on 1.20.1 where hamsters would not teleport to their owner.
- Baby Shoulder Hamster Rendering Offset
- Corrected the vertical offset for baby shoulder-mounted hamsters, ensuring they now move up and down correctly with the player's model when sneaking.
- Hamster Suffocation
- Implemented a "self-rescue" mechanic for hamsters that have been thrown. If they somehow manage to phase inside a block, they will now automatically teleport upwards to the nearest safe block, preventing suffocation deaths.
- AI Goal Visual Flickering
- Resolved a visual glitch where the hamster's head would flicker during its wander animation by preventing the
LookAt
andWander
goals from running at the same time. - The effective range of the
HamsterLookAtEntityGoal
was slightly reduced to prevent the hamster from looking up at an unnatural angle when the player is nearby but not directly adjacent.
- Resolved a visual glitch where the hamster's head would flicker during its wander animation by preventing the
If you’re thinking hey, this changelog looks awfully familiar… you’re not wrong.
This is essentially the same feature set as 3.1.0 — but with one critical difference: these jars are ACTUALLY BUILT CORRECTLY.
Version 3.1.0’s jars (especially for 1.20.1) were missing a bunch of generated data files, because I had just finished implementing a new CI (Continuous Integration; i.e. 'automated workflow that publishes my jar files for me') configuration, and it had a slight but not so slight oversight. I’ve removed that release from Modrinth and CurseForge so nobody new grabs the broken jars. This is the fixed re-release, under a new version number, so everyone’s launcher will properly prompt for an update.
Added
- Sunflower De-Modding Station
- Added a simple shapeless crafting recipe to convert one custom, harvestable sunflower back into one vanilla sunflower. For when you need the original for... reasons.
- Advanced Dismount Engineering
- To prevent accidental hamster ejections when dismounting a horse or building a bridge in the nether (don't ask), the shoulder dismount mechanic is now highly configurable.
- Players can now choose between using the
SNEAK
key or a new, separateCUSTOM_KEYBIND
for dismounting. - Additionally, the action can be set to trigger on a
SINGLE_PRESS
or a quickDOUBLE-TAP
, preventing conflicts with toggle-sneak or bridge-building. For the double-tap setting, the delay is also configurable. Find the new settings in the "Shoulder Hamster Settings" config group.
Changed
- Internal Hamster Wiring Overhaul
- The hamster's entire internal state-tracking system has been refactored. I've packed seventeen separate on/off switches (booleans) into one glorious, hyper-efficient integer using bit-masking. This change is purely under-the-hood but drastically reduces the chances of mod conflicts and crashes related to entity data. This was specifically to address a mod conflict on 1.20.1 with the Sortilege mod. Apparently it's trying to track a lot of data on Entities, and my mod is also doing that, so they had a conflict on slot #41. But even just in general, your hamsters are now more stable and less likely to have an existential crisis when another mod is present.
Fixed
- Publishing Mishap Autopsy
- In 3.1.0, my CI pipeline built jars without running the data generators, so critical JSON assets never made it into the finished files. This slipped by on 1.21.1 because those generated files happened to be present from earlier work, but 1.20.1 exposed the issue immediately with crashes. However, I did not notice these crashes myself because I test with manually built jar files, not the ones that the CI pipeline automatically creates. This has now been fixed at the Gradle level so the problem cannot recur —
runDatagen
is now a build dependency for all relevant jar tasks.
- In 3.1.0, my CI pipeline built jars without running the data generators, so critical JSON assets never made it into the finished files. This slipped by on 1.21.1 because those generated files happened to be present from earlier work, but 1.20.1 exposed the issue immediately with crashes. However, I did not notice these crashes myself because I test with manually built jar files, not the ones that the CI pipeline automatically creates. This has now been fixed at the Gradle level so the problem cannot recur —
- Corrected Overly-Trusting Hamsters
- Hamsters will no longer beg for food from any random player waving a cucumber slice. They will now only perform their adorable begging routine for their rightful owner, as intended. And for that matter, I also fixed a similar issue with the Diamond Stealing, Knocked Out, Diamond Sniff Celebration/Sulking, & Pink Petal Application/Cycling/Removal interactions, all of which were in the wrong spot in my interactMob method, which meant they were sneaking past the "is player the owner?" check.
- NeoForge Composting and Key-bind Registration
- Fixed an issue where compostable items (seeds, crops) were not functional on the NeoForge version of the mod. They now correctly register as compostable.
- The "Throw Hamster" keybind, previously missing on NeoForge, now correctly appears in the Controls menu.
- Resolved Critical Mod Incompatibility Crash
- Fixed a hard crash caused by a
DataTracker
ID collision when running alongside certain other mods (like Sortilege on 1.20.1). The internal wiring overhaul (see "Changed") resolves this issue by significantly reducing the number of data slots the hamster entity occupies.
- Fixed a hard crash caused by a
B.T.S.
Here's how the superbly juicy magnificent and fantastic publish.yml
file works:
- Automatically builds both Fabric/Quilt and NeoForge versions in a single workflow
- Publishes each build to both Modrinth and CurseForge with correct, consistent file names
- Attaches a specific snippet of my changelog content directly from the separate public repository for each release
- Includes explicit dependency listings for both Modrinth and CurseForge to ensure proper mod loading
- Supports multiple Minecraft versions with separate version strings for each loader
- Allows manual or tag-based triggering for flexible release management
- Keeps build and publish logic in one place for easier maintenance and fewer manual steps
Anyway IT'S AWESOME