Commits
Cross-checked every hardcoded vanilla texture path across all
renderers against what's actually shipped in the game jar:
- Witch had no valid texture at all - pointing at
"textures/entity/witch.png", which doesn't exist (vanilla moved it
into textures/entity/witch/witch.png and this was never updated)
- Rabbit skin selection did nothing: the switch checked
CONFIG.activePet (always literally "rabbit") instead of
CONFIG.rabbitSkin, so no case ever matched and every rabbit rendered
as the same brown fallback no matter what skin you picked
- The "brown" rabbit skin's own path was also wrong (missing the
"rabbit_" prefix every other file has), and horse's "dark brown"
skin was silently reusing plain "brown" instead of its own texture
- Cat's "ocelot" skin pointed at a file with an extra "cat_" prefix
that doesn't exist
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Continued the shulker/wolf audit across the renderers that use if/else
chains instead of switch statements, since those weren't covered by
the earlier switch-vs-enum diff:
- Parrot's "cyan" skin (the name used everywhere except the renderer,
which only recognized vanilla's real internal name "yellow") did
nothing when selected - fixed to match what every other file calls it
- Parrot's "gray" skin pointed at a texture file that doesn't exist -
vanilla spells it "grey" for parrots specifically, unlike every
other gray texture in the game
- bee/chicken/copper golem/squid/strider had no fallback branch in
their if/else chains, so an unrecognized or corrupted skin value
left the texture path unset instead of defaulting like the
switch-based renderers already do
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The formation anchor's forward direction was driven entirely by head
yaw, which never holds perfectly still even during a dead-straight
sprint - ordinary camera micro-movement was enough to swing the whole
anchor point (and the pet chasing it) side to side. Blended in the
owner's smoothed movement direction as the dominant signal, matching
the balance already used for the normal (non-sprint) follow lead,
which fixed the same class of jitter there previously.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ClientTropicalFish and its 10-skin enum already existed but were never
connected to PetList, Central.java's summon/despawn/species/skin/name
commands, updateSuggestions(), or a client renderer - completely
unreachable in-game despite being fully coded.
Skin rendering reuses vanilla's own TropicalFishPatternLayer and
dual small/large models wholesale (computed fresh from the config skin
name each frame, no synced entity data needed since this is entirely
client-side). The 10 named skins are matched against the real
predefined variants vanilla spawns tropical fish as, verified against
the wiki's variant table rather than guessed. Also fixed two typos in
the skin enum along the way (chichlid, cotten_candy_betta).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Finally got a real error body instead of a bare curl exit code: HTTP 400,
"Invalid character '-' in base62 encoding" on project_id. MODRINTH_ID
holds the slug "pets-and-pals" - mc-publish (26.1/26.2) resolves that
flexibly, but this raw API call needs the actual project id. Every
"flaky" failure this whole time was this same bug; resolve the real id
via a lookup instead of trusting the secret's exact format.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Systematically diffed every species' skin enum against its renderer's
switch statement and /petskin's command switch to find real mismatches
instead of guessing at "some pets not working":
- ClientShulkerRenderer was missing blue/gray/green entirely (silently
fell back to the default undyed texture); /petskin's own shulker list
was separately missing "blue"
- wolfSkin was the only skin field left out of checkForNullObjects(),
so Advanced Settings' unconditional CONFIG.wolfSkin.replaceAll(...)
NPE'd on any wolf that never had an explicit skin set - looked
exactly like the earlier "racoon" bug, same root cause
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Failed 3/3 retries this time with no visible reason (curl -f just gives
exit 22). Dropped -f so a real failure prints the actual response body
next time, and added a proper User-Agent - a bare "curl/x.y" string is
a common reason APIs quietly reject or throttle a request.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.28.0's stranding fix required the raft to reach a spot it structurally
never actually settles on - it always tracks the water surface, never
dry ground - so it could sit forever a couple blocks short of the owner
instead of ever releasing. Back to releasing as soon as you're on land,
but release() now moves the pet to the nearest dry spot next to you if
it's still sitting in water when that happens, reusing the same
stuck-pet rescue logic as repositionToOwner().
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same request succeeds immediately on a plain manual retry both times, so
this is a transient hiccup on this step rather than a payload problem.
Retrying automatically beats a manual re-upload every release.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Raft rides at the actual water surface in boat-tow mode instead of the
boat's own position, which sits lower than the waterline
- Ferry raft won't release a pet over open water anymore, even once the
owner's already ashore - waits for the raft itself to reach land too
- Menagerie naming page: golden dandelion no longer overlaps the Cancel
button, backdrop panel resized to match
- Fixed "Advanced settings" throwing on every open (hardcoded default
referenced "racoon", removed from the roster in 0.17.0)
- Menagerie: added a Skin button that cycles the active pet's skins
in place, reusing /petskin's own command path rather than touching
its fragile per-species switch
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The tow rope drew straight through both hull centers before; now it
reads the real-time boat/raft positions and pins the endpoints to the
back of the boat and the front of the raft.
The ferry raft used to release the moment its own next step found any
dry ground, which could be a mid-lake island rather than where the
owner actually was - dropping the pet mid-crossing, which then swam
into the next body of water and got re-rafted immediately. It now only
lets go once the owner themself is on dry land.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mc-publish kept failing with "at least one game version should be
specified" for 26.3-snapshot-3 even with game-versions set explicitly.
Upload straight through Modrinth's API instead, same request shape
confirmed working for the 0.26.0 manual upload.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vanilla's own leash renderer already supports a sagging curve
(LeashFeatureRenderer respects LeashState.slack), it was just never
turned on. Sets it for the raft's leash regardless of whether
LeadPhysics is installed - no need for a dedicated physics mod just to
get a rope that isn't a dead straight line. If LeadPhysics (or a
similar mod) is present, its own render hook takes over the same way
it would for any other leashed entity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same as 26.2 - LeadPhysics only has published builds for 26.1.x.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Moved from recommends to depends at the user's explicit request - the
mod will now refuse to load without LeadPhysics installed separately.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Checked upstream petsmod's full history (every version branch, 1.17
through the latest) for any LeadPhysics integration - there isn't one,
and LeadPhysics' own description says it doesn't change vanilla lead
physics (it's a client-side rendering mod that replaces the straight
leash line with a sagging rope curve). Added as a soft "recommends" in
fabric.mod.json rather than a hard dependency, since it's a separately-
distributed third-party mod and purely cosmetic.
The raft itself: kept the correctness fix from the rigid attachment
(the target position is still recomputed fresh off the boat's own
transform every tick, so it can't drift or desync like the old
independently-simulated rope did) but blends toward that target with a
spring lerp instead of an instant position lock, so it has some visible
give/chase to its motion again instead of teleport-following exactly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The rope/spring physics simulation could never perfectly track a
moving, turning, accelerating boat - every tuning pass still left it
drifting, lagging behind, or floating loose somewhere. Replaced with a
direct position lock: every tick, the raft's position is copied
straight off the boat's own transform (offset behind the stern), so it
cannot desync, drift, or detach. Only the visual yaw still eases in on
sharp turns; position is always exact.
Also found a second copy of the raw-velocity jitter bug, this time in
predictedOwnerTarget() (added earlier this session for normal, non-
sprint following): it read the owner's velocity directly rather than
the already-smoothed value now computed once per tick, so the
predicted lead point flipped by a few degrees every tick and made the
pet's heading zigzag between two nearby diagonal directions instead of
holding a straight line. Both steerLead and predictedOwnerTarget now
share one continuously-smoothed velocity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Leashable.getLeashOffset() defaults to anchoring at getEyeHeight(),
inherited from FallingBlockEntity's normal ~1-block hitbox - nowhere
near the raft's actual thin deck. That's the rope floating up in the
air instead of connecting cleanly. Anchored at deck level instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of the persistent "raft lead is broken" reports: AbstractBoat
pushes away any nearby entity where canBeCollidedWith() or isPushable()
is true, every tick. PetRaft never overrode either, so the boat has been
shoving the raft away the whole time, fighting directly against its own
tow physics. Fixed on both the raft and the pet itself, which also
covers "shouldn't be a disadvantage to play with the mod" - neither
physically blocks or gets pushed by the owner, other entities, or boats.
Pets can now range further before being reeled back in when standing
somewhere with open sky (fields, beaches) - no walls to get lost behind
out there, so the tight indoor/underground leash loosens.
Menagerie: browse arrows now hide during naming, matching the rest of
the catalog controls, instead of floating over the naming panel.
Advanced settings button now logs instead of silently doing nothing if
building the YACL screen throws (skin-enum mismatch for the active pet).
PetFollowOwnerGoal: the sprint-alongside look-ahead point used the pet's
own raw delta movement, which jittered every tick (jump-bob, edge
nudges) and made the head visibly twitch in first person even after
smoothing the steering lead - now looks toward the already-smoothed
steer target instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shadows snapped visibly around under the pet whenever the catch-up
logic repositioned/teleported it, which looked worse than no shadow.
The sprint-alongside steering lead used the owner's raw per-tick
velocity multiplied by up to 5x - small natural velocity noise while
sprinting (bobbing, edge collisions) got amplified into a visible
first-person twitch. Smoothed with the same lerp pattern already used
for the anchor point and speed boost.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same fix as 26.2: ROPE_LENGTH 2.8 -> 1.6 to close the visible gap
between the boat's stern and the raft, and water-surface search now
uses the raft's own Y instead of the boat's to avoid misreading
uneven terrain as "no water" and stalling the tow.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Boats and rafts already share one code path (both are AbstractBoat),
so towing already worked for both - the actual complaint was feel.
The tow rope was noticeably twitchier than the ferry despite using
the same momentum model; matched its drag so both glide the same way.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PetFollowOwnerGoal: normal (non-alongside) catch-up now leads the
owner's position using travel direction blended with crosshair
direction, so long catch-up paths route toward where the owner is
heading instead of always chasing a half-second-stale position.
PetOrb: the sprint-alongside anchor placed the nether star 2.6 blocks
in front of the owner using camera yaw - the opposite of what combat
withdrawal is for. Now sits behind the shoulder using body yaw, same
as the non-sprint anchor and the perched-flyer offset.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Baby/Adult button flips the existing CONFIG.isBaby rendering flag
(previously only reachable via /petskin baby or the old YACL screen)
and starts a 20-minute growth timer. Dragging the golden dandelion
onto the pet stage - same drag gesture as the name tag - locks the
timer so the pet stays a baby indefinitely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26.3's PetsConfigScreen was a stub whose getAdvancedConfigScreenFactory
returned MenagerieScreen::new instead of the real YACL config, so the
button silently did nothing useful. Ported the full screen from 26.2
and fixed the two call sites that assumed the old Function<Screen,
Screen> stub signature instead of ConfigScreenFactory's create().
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dead weight carried over from the original petsmod fork; a Pets&Pals
identity shouldn't be hijacking the vanilla main menu logo by default,
and the toggle was clutter in advanced settings.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sprint run-alongside catch-up used to take almost twice as long when
the owner was looking at the pet vs not - backwards from the intent, and
the actual cause of pets seeming to need a camera nudge to 'unstick'.
Catch-up is now a single uniform path: burst every laggy tick, force into
formation after half a second, regardless of view direction.
Also ships the second half of the Menagerie redesign: a dedicated naming
page (Name Tag... button) where you type a name and drag the tag icon
onto the pet to apply it, with a small settling swing on drop, and the
whole screen now fades to black on close instead of cutting instantly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
These files only ever existed on this branch (never tracked identically
on 26.1/26.2), so the cherry-picked diff couldn't remove them.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deleted the entity classes, renderers, skin enums, registrations, and
command wiring for every species that isn't backed by a vanilla mob type -
the original petsmod additions (duck/racoon/penguin/koi/stingray/dumbo
octopus/floating head) and every April Fools joke mob (ray tracing,
smiling creeper, nerd creeper, mega spud, moon cow, batato, diamond
chicken, love golem, pink wither, plaguewhale slab, poisonous potato
zombie, potato husk, redstone bug, toxifin slab, traitor, angry ghast).
Also cleaned up the now-orphaned textures, sounds, and lang entries, and
fixed the default-pet fallback (was hardcoded to the now-gone duck).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
First half of the Menagerie v3 redesign - the anvil naming page comes next.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Land pets can't hover, so combat now tucks them into the orb (which holds
until the fight ends) instead of the floating perch. Flyers skip the boat
raft entirely. The raft got hull physics - bow follows the taut rope, turn
rate scales with speed - plus a renderer that rotates the model with the
hull and scales the deck to the passenger.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cushion textures are 64x64 box unwraps - the model was stretching the whole
sheet over each face. Faces now sample their unwrap regions. Public builds
unlock copper golem/fox/cat/bee; a .pnp_testing marker file opens the full
catalog with a glyph on the unfinished ones.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of the snapshot spawn loop: ClientLevel never implements
getNextEntityId(), so every locally spawned entity got id 0 and each
addEntity() deleted the previous one. Ids now come from our own negative
counter. Also: live raft preview in the Menagerie (hover the raft/cushion
buttons), cushion None option, poplar wood, cushion color actually applied
to the raft, stair-friendly drop probing, >3-block pit rule, and mid-sprint
re-entry from behind the camera.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every ground-placement helper (spawn dwelling, reposition, orb reform, sprint
entrances) now rejects columns with fluid - underwater sea floor counted as
standable ground, which caused fox spawn bushes under the sea, spawn loops,
and raft flicker while flying over water. Keybind default is now semicolon
(P is the vanilla social screen). The Menagerie preview map no longer caches
empty before the first summon. Mega spud hidden from the catalog.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26.3-snapshot-3 added unguarded ServerLevel casts inside PathfindingContext
and PathNavigation, killing client-side pathfinding entirely - pets never
walked, so the lost-pet system teleported them in a loop. Normal following
now falls back to move-control steering (same probe-and-hop as sprint mode)
whenever moveTo fails or yields no path, and the moveTo call is exception-
guarded. Applies to all versions as a resilience layer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The boat-raft branch had no rafted guard, so a fresh PetRaft spawned every
tick - they stacked invisibly under the old glued-anchor movement, but the
rope physics let them drift apart and fight over the pet's position. Also:
ferries now hold position beside a swimming owner rather than releasing the
pet into open water and immediately re-triggering.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same story as YACL - Mod Menu's TitleScreen mixin calls an API the snapshot
removed. The snapshot build no longer implements ModMenuApi or declares the
entrypoint; the Menagerie opens via the keybind. Both come back when the
libraries ship snapshot builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
YACL 26.1/26.2 mixins target Minecraft.destroy, which the snapshot renamed -
it crashes the game at class transformation, so it cannot be carried forward
with a dependency override. This branch drops the hard dependency: enums keep
getDisplayName as plain methods, the advanced YACL screen is disabled (button
hidden unless YACL is present), and the Menagerie is the config surface.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The snapshot ships cushions as entities, so their per-dye textures live under
textures/entity/cushion/ - an atlases/blocks.json extension merges that
directory into the block atlas, and 192 generated wood x dye raft models
cover every combination. Favorite cushion color is a new config option with
a Menagerie cycler; boat rafts and ferries both use it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New branch for the current snapshot: fabric-api 0.154.3+26.3, all 12 raft
wood styles now use the Mk2 model with the snapshot's cushion on deck, and
the four layer renderers updated for the slimmed submitModel signature.
Cushion texture path is a best guess pending a look inside the snapshot jar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cross-checked every hardcoded vanilla texture path across all
renderers against what's actually shipped in the game jar:
- Witch had no valid texture at all - pointing at
"textures/entity/witch.png", which doesn't exist (vanilla moved it
into textures/entity/witch/witch.png and this was never updated)
- Rabbit skin selection did nothing: the switch checked
CONFIG.activePet (always literally "rabbit") instead of
CONFIG.rabbitSkin, so no case ever matched and every rabbit rendered
as the same brown fallback no matter what skin you picked
- The "brown" rabbit skin's own path was also wrong (missing the
"rabbit_" prefix every other file has), and horse's "dark brown"
skin was silently reusing plain "brown" instead of its own texture
- Cat's "ocelot" skin pointed at a file with an extra "cat_" prefix
that doesn't exist
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Continued the shulker/wolf audit across the renderers that use if/else
chains instead of switch statements, since those weren't covered by
the earlier switch-vs-enum diff:
- Parrot's "cyan" skin (the name used everywhere except the renderer,
which only recognized vanilla's real internal name "yellow") did
nothing when selected - fixed to match what every other file calls it
- Parrot's "gray" skin pointed at a texture file that doesn't exist -
vanilla spells it "grey" for parrots specifically, unlike every
other gray texture in the game
- bee/chicken/copper golem/squid/strider had no fallback branch in
their if/else chains, so an unrecognized or corrupted skin value
left the texture path unset instead of defaulting like the
switch-based renderers already do
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The formation anchor's forward direction was driven entirely by head
yaw, which never holds perfectly still even during a dead-straight
sprint - ordinary camera micro-movement was enough to swing the whole
anchor point (and the pet chasing it) side to side. Blended in the
owner's smoothed movement direction as the dominant signal, matching
the balance already used for the normal (non-sprint) follow lead,
which fixed the same class of jitter there previously.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ClientTropicalFish and its 10-skin enum already existed but were never
connected to PetList, Central.java's summon/despawn/species/skin/name
commands, updateSuggestions(), or a client renderer - completely
unreachable in-game despite being fully coded.
Skin rendering reuses vanilla's own TropicalFishPatternLayer and
dual small/large models wholesale (computed fresh from the config skin
name each frame, no synced entity data needed since this is entirely
client-side). The 10 named skins are matched against the real
predefined variants vanilla spawns tropical fish as, verified against
the wiki's variant table rather than guessed. Also fixed two typos in
the skin enum along the way (chichlid, cotten_candy_betta).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Finally got a real error body instead of a bare curl exit code: HTTP 400,
"Invalid character '-' in base62 encoding" on project_id. MODRINTH_ID
holds the slug "pets-and-pals" - mc-publish (26.1/26.2) resolves that
flexibly, but this raw API call needs the actual project id. Every
"flaky" failure this whole time was this same bug; resolve the real id
via a lookup instead of trusting the secret's exact format.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Systematically diffed every species' skin enum against its renderer's
switch statement and /petskin's command switch to find real mismatches
instead of guessing at "some pets not working":
- ClientShulkerRenderer was missing blue/gray/green entirely (silently
fell back to the default undyed texture); /petskin's own shulker list
was separately missing "blue"
- wolfSkin was the only skin field left out of checkForNullObjects(),
so Advanced Settings' unconditional CONFIG.wolfSkin.replaceAll(...)
NPE'd on any wolf that never had an explicit skin set - looked
exactly like the earlier "racoon" bug, same root cause
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Failed 3/3 retries this time with no visible reason (curl -f just gives
exit 22). Dropped -f so a real failure prints the actual response body
next time, and added a proper User-Agent - a bare "curl/x.y" string is
a common reason APIs quietly reject or throttle a request.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
0.28.0's stranding fix required the raft to reach a spot it structurally
never actually settles on - it always tracks the water surface, never
dry ground - so it could sit forever a couple blocks short of the owner
instead of ever releasing. Back to releasing as soon as you're on land,
but release() now moves the pet to the nearest dry spot next to you if
it's still sitting in water when that happens, reusing the same
stuck-pet rescue logic as repositionToOwner().
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Raft rides at the actual water surface in boat-tow mode instead of the
boat's own position, which sits lower than the waterline
- Ferry raft won't release a pet over open water anymore, even once the
owner's already ashore - waits for the raft itself to reach land too
- Menagerie naming page: golden dandelion no longer overlaps the Cancel
button, backdrop panel resized to match
- Fixed "Advanced settings" throwing on every open (hardcoded default
referenced "racoon", removed from the roster in 0.17.0)
- Menagerie: added a Skin button that cycles the active pet's skins
in place, reusing /petskin's own command path rather than touching
its fragile per-species switch
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The tow rope drew straight through both hull centers before; now it
reads the real-time boat/raft positions and pins the endpoints to the
back of the boat and the front of the raft.
The ferry raft used to release the moment its own next step found any
dry ground, which could be a mid-lake island rather than where the
owner actually was - dropping the pet mid-crossing, which then swam
into the next body of water and got re-rafted immediately. It now only
lets go once the owner themself is on dry land.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
mc-publish kept failing with "at least one game version should be
specified" for 26.3-snapshot-3 even with game-versions set explicitly.
Upload straight through Modrinth's API instead, same request shape
confirmed working for the 0.26.0 manual upload.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vanilla's own leash renderer already supports a sagging curve
(LeashFeatureRenderer respects LeashState.slack), it was just never
turned on. Sets it for the raft's leash regardless of whether
LeadPhysics is installed - no need for a dedicated physics mod just to
get a rope that isn't a dead straight line. If LeadPhysics (or a
similar mod) is present, its own render hook takes over the same way
it would for any other leashed entity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Checked upstream petsmod's full history (every version branch, 1.17
through the latest) for any LeadPhysics integration - there isn't one,
and LeadPhysics' own description says it doesn't change vanilla lead
physics (it's a client-side rendering mod that replaces the straight
leash line with a sagging rope curve). Added as a soft "recommends" in
fabric.mod.json rather than a hard dependency, since it's a separately-
distributed third-party mod and purely cosmetic.
The raft itself: kept the correctness fix from the rigid attachment
(the target position is still recomputed fresh off the boat's own
transform every tick, so it can't drift or desync like the old
independently-simulated rope did) but blends toward that target with a
spring lerp instead of an instant position lock, so it has some visible
give/chase to its motion again instead of teleport-following exactly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The rope/spring physics simulation could never perfectly track a
moving, turning, accelerating boat - every tuning pass still left it
drifting, lagging behind, or floating loose somewhere. Replaced with a
direct position lock: every tick, the raft's position is copied
straight off the boat's own transform (offset behind the stern), so it
cannot desync, drift, or detach. Only the visual yaw still eases in on
sharp turns; position is always exact.
Also found a second copy of the raw-velocity jitter bug, this time in
predictedOwnerTarget() (added earlier this session for normal, non-
sprint following): it read the owner's velocity directly rather than
the already-smoothed value now computed once per tick, so the
predicted lead point flipped by a few degrees every tick and made the
pet's heading zigzag between two nearby diagonal directions instead of
holding a straight line. Both steerLead and predictedOwnerTarget now
share one continuously-smoothed velocity.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Leashable.getLeashOffset() defaults to anchoring at getEyeHeight(),
inherited from FallingBlockEntity's normal ~1-block hitbox - nowhere
near the raft's actual thin deck. That's the rope floating up in the
air instead of connecting cleanly. Anchored at deck level instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of the persistent "raft lead is broken" reports: AbstractBoat
pushes away any nearby entity where canBeCollidedWith() or isPushable()
is true, every tick. PetRaft never overrode either, so the boat has been
shoving the raft away the whole time, fighting directly against its own
tow physics. Fixed on both the raft and the pet itself, which also
covers "shouldn't be a disadvantage to play with the mod" - neither
physically blocks or gets pushed by the owner, other entities, or boats.
Pets can now range further before being reeled back in when standing
somewhere with open sky (fields, beaches) - no walls to get lost behind
out there, so the tight indoor/underground leash loosens.
Menagerie: browse arrows now hide during naming, matching the rest of
the catalog controls, instead of floating over the naming panel.
Advanced settings button now logs instead of silently doing nothing if
building the YACL screen throws (skin-enum mismatch for the active pet).
PetFollowOwnerGoal: the sprint-alongside look-ahead point used the pet's
own raw delta movement, which jittered every tick (jump-bob, edge
nudges) and made the head visibly twitch in first person even after
smoothing the steering lead - now looks toward the already-smoothed
steer target instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Shadows snapped visibly around under the pet whenever the catch-up
logic repositioned/teleported it, which looked worse than no shadow.
The sprint-alongside steering lead used the owner's raw per-tick
velocity multiplied by up to 5x - small natural velocity noise while
sprinting (bobbing, edge collisions) got amplified into a visible
first-person twitch. Smoothed with the same lerp pattern already used
for the anchor point and speed boost.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Boats and rafts already share one code path (both are AbstractBoat),
so towing already worked for both - the actual complaint was feel.
The tow rope was noticeably twitchier than the ferry despite using
the same momentum model; matched its drag so both glide the same way.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PetFollowOwnerGoal: normal (non-alongside) catch-up now leads the
owner's position using travel direction blended with crosshair
direction, so long catch-up paths route toward where the owner is
heading instead of always chasing a half-second-stale position.
PetOrb: the sprint-alongside anchor placed the nether star 2.6 blocks
in front of the owner using camera yaw - the opposite of what combat
withdrawal is for. Now sits behind the shoulder using body yaw, same
as the non-sprint anchor and the perched-flyer offset.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The Baby/Adult button flips the existing CONFIG.isBaby rendering flag
(previously only reachable via /petskin baby or the old YACL screen)
and starts a 20-minute growth timer. Dragging the golden dandelion
onto the pet stage - same drag gesture as the name tag - locks the
timer so the pet stays a baby indefinitely.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26.3's PetsConfigScreen was a stub whose getAdvancedConfigScreenFactory
returned MenagerieScreen::new instead of the real YACL config, so the
button silently did nothing useful. Ported the full screen from 26.2
and fixed the two call sites that assumed the old Function<Screen,
Screen> stub signature instead of ConfigScreenFactory's create().
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The sprint run-alongside catch-up used to take almost twice as long when
the owner was looking at the pet vs not - backwards from the intent, and
the actual cause of pets seeming to need a camera nudge to 'unstick'.
Catch-up is now a single uniform path: burst every laggy tick, force into
formation after half a second, regardless of view direction.
Also ships the second half of the Menagerie redesign: a dedicated naming
page (Name Tag... button) where you type a name and drag the tag icon
onto the pet to apply it, with a small settling swing on drop, and the
whole screen now fades to black on close instead of cutting instantly.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Deleted the entity classes, renderers, skin enums, registrations, and
command wiring for every species that isn't backed by a vanilla mob type -
the original petsmod additions (duck/racoon/penguin/koi/stingray/dumbo
octopus/floating head) and every April Fools joke mob (ray tracing,
smiling creeper, nerd creeper, mega spud, moon cow, batato, diamond
chicken, love golem, pink wither, plaguewhale slab, poisonous potato
zombie, potato husk, redstone bug, toxifin slab, traitor, angry ghast).
Also cleaned up the now-orphaned textures, sounds, and lang entries, and
fixed the default-pet fallback (was hardcoded to the now-gone duck).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Land pets can't hover, so combat now tucks them into the orb (which holds
until the fight ends) instead of the floating perch. Flyers skip the boat
raft entirely. The raft got hull physics - bow follows the taut rope, turn
rate scales with speed - plus a renderer that rotates the model with the
hull and scales the deck to the passenger.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Cushion textures are 64x64 box unwraps - the model was stretching the whole
sheet over each face. Faces now sample their unwrap regions. Public builds
unlock copper golem/fox/cat/bee; a .pnp_testing marker file opens the full
catalog with a glyph on the unfinished ones.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Root cause of the snapshot spawn loop: ClientLevel never implements
getNextEntityId(), so every locally spawned entity got id 0 and each
addEntity() deleted the previous one. Ids now come from our own negative
counter. Also: live raft preview in the Menagerie (hover the raft/cushion
buttons), cushion None option, poplar wood, cushion color actually applied
to the raft, stair-friendly drop probing, >3-block pit rule, and mid-sprint
re-entry from behind the camera.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Every ground-placement helper (spawn dwelling, reposition, orb reform, sprint
entrances) now rejects columns with fluid - underwater sea floor counted as
standable ground, which caused fox spawn bushes under the sea, spawn loops,
and raft flicker while flying over water. Keybind default is now semicolon
(P is the vanilla social screen). The Menagerie preview map no longer caches
empty before the first summon. Mega spud hidden from the catalog.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
26.3-snapshot-3 added unguarded ServerLevel casts inside PathfindingContext
and PathNavigation, killing client-side pathfinding entirely - pets never
walked, so the lost-pet system teleported them in a loop. Normal following
now falls back to move-control steering (same probe-and-hop as sprint mode)
whenever moveTo fails or yields no path, and the moveTo call is exception-
guarded. Applies to all versions as a resilience layer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The boat-raft branch had no rafted guard, so a fresh PetRaft spawned every
tick - they stacked invisibly under the old glued-anchor movement, but the
rope physics let them drift apart and fight over the pet's position. Also:
ferries now hold position beside a swimming owner rather than releasing the
pet into open water and immediately re-triggering.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Same story as YACL - Mod Menu's TitleScreen mixin calls an API the snapshot
removed. The snapshot build no longer implements ModMenuApi or declares the
entrypoint; the Menagerie opens via the keybind. Both come back when the
libraries ship snapshot builds.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
YACL 26.1/26.2 mixins target Minecraft.destroy, which the snapshot renamed -
it crashes the game at class transformation, so it cannot be carried forward
with a dependency override. This branch drops the hard dependency: enums keep
getDisplayName as plain methods, the advanced YACL screen is disabled (button
hidden unless YACL is present), and the Menagerie is the config surface.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The snapshot ships cushions as entities, so their per-dye textures live under
textures/entity/cushion/ - an atlases/blocks.json extension merges that
directory into the block atlas, and 192 generated wood x dye raft models
cover every combination. Favorite cushion color is a new config option with
a Menagerie cycler; boat rafts and ferries both use it.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New branch for the current snapshot: fabric-api 0.154.3+26.3, all 12 raft
wood styles now use the Mk2 model with the snapshot's cushion on deck, and
the four layer renderers updated for the slimmed submitModel signature.
Cushion texture path is a best guess pending a look inside the snapshot jar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>