fix(naturalist): draw the three missing item icons
Deploy Addons / deploy (push) Failing after 0s

frog_leg, cooked_frog_leg and snake_egg_block are declared in the behavior
pack and mapped in item_texture.json, but the PNGs were never present, so all
three rendered as missing-texture wherever they appeared. All three already
had lang names, so only the art was absent.

Drawn through scripts/build-textures.py to match the pack's existing style --
small sprite on transparency, muted natural palette, single highlight. The
frog legs share one drumstick routine, raw carrying a green skin tint along
the top contour and cooked a browned crust. snake_egg_block is a clutch of
three eggs reusing the palette of the pack's existing single snake_egg.png,
so the block form reads as a group of the item.

RP bumped to 1.0.3 and mya's pin updated to match, otherwise clients keep
serving the cached pack and never fetch the new files.

Note: naturalist-lite-addon is absent from deploy.yml's PATHS, so CI never
deploys it -- this was applied to the host by hand. That absence is also why
the host sat on RP 1.0.1 while main was already at 1.0.2.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Gf1kZypRDfPL1YiWUS1LC
This commit is contained in:
sysadmin
2026-08-28 13:14:49 +01:00
co-authored by Claude Opus 5
parent efac50aba7
commit 75219f9d1d
5 changed files with 90 additions and 3 deletions
@@ -4,14 +4,26 @@
"name": "Naturalist Lite Resources",
"description": "Textures, models, and animations for Naturalist Lite mobs.",
"uuid": "de1b016a-3cf3-4f75-8076-5a5508ab8b74",
"version": [1, 0, 2],
"min_engine_version": [1, 21, 0]
"version": [
1,
0,
3
],
"min_engine_version": [
1,
21,
0
]
},
"modules": [
{
"type": "resources",
"uuid": "29da80f3-cffc-4c3b-997d-34f0820cc65b",
"version": [1, 0, 2]
"version": [
1,
0,
3
]
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 177 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 204 B

+75
View File
@@ -534,6 +534,77 @@ def portal_frame():
return img
# ── Naturalist Lite: three items shipped without icons ─────
# frog_leg, cooked_frog_leg and snake_egg_block are declared in the BP and
# mapped in item_texture.json, but the PNGs were never present, so they
# rendered as missing-texture. Drawn to match the pack's existing style:
# small sprite on transparency, muted natural palette, single highlight.
FROG_RAW = (176, 122, 128)
FROG_RAW_HI = (214, 164, 168)
FROG_RAW_SH = (126, 82, 92)
FROG_SKIN = (122, 148, 96)
FROG_COOK = (156, 104, 56)
FROG_COOK_HI = (198, 146, 88)
FROG_COOK_SH = (104, 64, 32)
BONE = (232, 226, 206)
BONE_SH = (176, 170, 152)
EGG_SHELL = (222, 214, 196)
EGG_SHELL_HI = (244, 240, 228)
EGG_SHELL_SH = (170, 162, 144)
EGG_SPOT = (150, 138, 112)
def _frog_leg(meat, hi, sh, skin=None):
"""Drumstick: meat mass upper-left, bone stub lower-right."""
img = Image.new("RGBA", (16, 16), (0, 0, 0, 0))
# meat mass
rect(img, 4, 2, 10, 8, meat)
rect(img, 3, 3, 3, 7, meat)
rect(img, 11, 3, 11, 7, meat)
rect(img, 5, 1, 9, 1, meat)
rect(img, 5, 9, 9, 9, meat)
# shading
rect(img, 4, 8, 10, 9, sh)
rect(img, 11, 4, 11, 7, sh)
# highlight
rect(img, 5, 2, 7, 3, hi)
px(img, 5, 4, hi)
# raw frog keeps a green tinge along the top contour rather than a patch,
# so it reads as skin on the meat instead of a floating square
if skin:
for sx, sy in ((6, 1), (7, 1), (8, 1), (9, 2), (10, 3), (5, 2)):
px(img, sx, sy, skin)
px(img, 8, 2, (140, 166, 112))
# bone stub running to lower-right
rect(img, 9, 10, 10, 11, BONE)
rect(img, 11, 12, 12, 13, BONE)
px(img, 12, 14, BONE)
px(img, 10, 11, BONE_SH)
px(img, 12, 13, BONE_SH)
px(img, 13, 14, BONE_SH)
return img
def frog_leg(): return _frog_leg(FROG_RAW, FROG_RAW_HI, FROG_RAW_SH, FROG_SKIN)
def cooked_frog_leg(): return _frog_leg(FROG_COOK, FROG_COOK_HI, FROG_COOK_SH)
def snake_egg_block():
"""A clutch of eggs, so it reads as the block form of the single egg item."""
img = Image.new("RGBA", (16, 16), (0, 0, 0, 0))
def egg(cx, cy, w, h):
rect(img, cx, cy, cx + w, cy + h, EGG_SHELL)
rect(img, cx, cy + h, cx + w, cy + h, EGG_SHELL_SH)
rect(img, cx + w, cy + 1, cx + w, cy + h, EGG_SHELL_SH)
px(img, cx + 1, cy + 1, EGG_SHELL_HI)
egg(2, 6, 4, 6)
egg(9, 5, 4, 6)
egg(5, 8, 4, 5)
# speckles
for sx, sy in ((3, 9), (11, 8), (6, 11), (4, 7), (12, 10)):
px(img, sx, sy, EGG_SPOT)
return img
def main() -> None:
save(smart_crafting_table(), "smart-crafting-addon/smart_crafting_RP/textures/blocks/smart_crafting_table.png")
save(post_office_block(), "postal-service-addon/postal_service_RP/textures/blocks/post_office.png")
@@ -546,6 +617,10 @@ def main() -> None:
save(portal_mya(), "lobby-addon/lobby_transfer_RP/textures/blocks/portal_mya.png")
save(redstone_link_tx(), "redstone-link-addon/redstone_link_RP/textures/blocks/redstone_link_tx.png")
save(redstone_link_rx(), "redstone-link-addon/redstone_link_RP/textures/blocks/redstone_link_rx.png")
NAT = "naturalist-lite-addon/naturalist_lite_RP/textures/sf/nba/items/"
save(frog_leg(), NAT + "frog_leg.png")
save(cooked_frog_leg(), NAT + "cooked_frog_leg.png")
save(snake_egg_block(), NAT + "snake_egg_block.png")
if __name__ == "__main__":