Skip to content

initial release set up#1

Merged
holty07 merged 17 commits into
mainfrom
claude/minecraft-worker-mod-El91x
May 25, 2026
Merged

initial release set up#1
holty07 merged 17 commits into
mainfrom
claude/minecraft-worker-mod-El91x

Conversation

@holty07

@holty07 holty07 commented May 25, 2026

Copy link
Copy Markdown
Owner

Sets up the full Hard Workers mod with all four worker types and the automated release pipeline.

Workers added

  • Lumberjack (5 tiers) — chops trees, replants saplings, holds tier-matched axe
  • Miner (5 tiers) — digs a 3-block-tall tunnel up to 64 blocks behind the block, tier gates ore access
  • Farmer (5 tiers) — harvests and replants crops in a 5×5 area, hydrates surrounding farmland, accelerates growth at higher tiers
  • Warehouse Worker (5 tiers) — collects items from nearby worker blocks and deposits into a chest-accessible warehouse block

Other changes

  • All blocks are directional (FACING toward player on placement)
  • Per-face textures on all blocks (front/back/top/bottom/side)
  • Workers hold tier-matched tools; warehouse worker carries nothing
  • Blockstates, models, loot tables, recipes, and placeholder textures for all 20 blocks
  • GitHub Actions release workflow: increments version by 0.1 on each PR merge and attaches the built JAR to a GitHub Release

Generated by Claude Code

claude and others added 17 commits April 25, 2026 11:13
The block now acts as both the worker's home and its log storage:

- LumberjackBlockEntity: implements Container (vanilla hopper compat) with
  a single slot capped at 64 items; exposes IItemHandler capability via
  RegisterCapabilitiesEvent so pipes from other mods can extract from any
  face
- LumberjackBlock: now extends BaseEntityBlock (EntityBlock); right-click
  shows "Storage: N/64 <item>" in the action bar; breaking the block drops
  stored logs before discarding the entity
- ChopTreeGoal: instead of Block.dropResources(), harvested logs are
  inserted into the block entity; any overflow is dropped on the ground
- FindTreeGoal: will not search for new trees while the storage is full,
  preventing logs from piling up on the ground
- ModBlockEntities: new DeferredRegister wiring up the block entity type

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
LumberjackBlockEntity:
- Replaced single ItemStack slot with NonNullList<ItemStack> of 27 slots
  (same as a vanilla chest)
- insertItem() does two-pass insertion: merge into existing matching stacks
  first, then fill the next empty slot; handles different log types, saplings,
  apples and any other item in separate slots
- isFull() now checks all 27 slots; getStorageStatus() shows slots used and
  total item count
- NBT uses ContainerHelper.saveAllItems / loadAllItems for slot-indexed
  serialization

ChopTreeGoal:
- collectTreeBlocks() now calls collectLeafBlocks() after the log BFS;
  collectLeafBlocks() scans a bounding box around the log columns (+ 3-block
  margin) and records every leaf block
- After the last log is broken, clearLeaves() runs in the same tick: each
  leaf is evaluated through Block.getDrops() so loot-table chances for
  saplings, apples, and sticks are respected, then removed from the world
- chopNext() also switched from hardcoded new ItemStack(...) to
  Block.getDrops() for consistency with modded logs that may have custom
  loot tables
- depositItems() handles a full List<ItemStack> and falls back to
  Block.popResource() for any overflow the storage can't accept

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
Required for ./gradlew / gradlew.bat to work without a global Gradle install.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
Excludes Gradle cache, build output, and IDE-specific files.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
- ChopTreeGoal: remove LevelEvent import (class absent in 1.21.1), use raw
  int 2001 for block-break particle event; remove PALE_OAK_* constants which
  were only added in 1.21.2
- LumberjackBlock: add required codec() override (BaseEntityBlock made it
  abstract in 1.21.1); update constructor to accept BlockBehaviour.Properties
  as required by simpleCodec
- ModBlocks: pass Properties explicitly to LumberjackBlock constructor

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
NeoForge 21.1.172 puts asm-analysis-9.7 on the JVM module path while
NeoGradle 7.0.145 drags in asm-analysis-9.5 as a transitive dependency on
the classpath. BootstrapLauncher 2.0.2 treats this as a fatal duplicate-
module error and exits with code 1 before Minecraft starts.

Forcing all org.ow2.asm artifacts to 9.7 via resolutionStrategy eliminates
the 9.5 jar from the classpath so there is no conflict.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
LumberjackTier enum defines chop intervals:
  Wood=40t  Stone=30t  Iron=20t  Diamond=12t  Netherite=6t  (ticks/log)

LumberjackBlock now accepts a LumberjackTier at construction time. Each
tier is a separately registered block sharing the same LumberjackBlockEntity
type. A per-tier MapCodec is declared via simpleCodec to satisfy the abstract
codec() requirement from BaseEntityBlock in 1.21.1.

ChopTreeGoal.chopInterval() reads the tier off the home block at runtime so
the speed is always consistent with the placed block, no config needed.
LUMBERJACK_CHOP_INTERVAL removed from config (hardcoded per tier now).

Recipes chain upgrades: each tier consumes the previous block + the matching
axe tier + 7 planks. Pattern:
  WWW / WAW / WWW  (wood — no previous block)
  WWW / WAW / WBW  (stone/iron/diamond/netherite — B = previous tier)

Resources: 5 blockstates, 5 block models, 5 item models, 5 recipe files,
5 loot tables, 5 placeholder textures (colour-coded per tier), updated lang.
Old single-tier lumberjack_block resources removed.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
FindTreeGoal now queries all other LumberjackEntity instances in the
search area and skips any tree-base position they already have claimed,
so each worker independently selects a distinct tree.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
- LumberjackBlock gains a FACING (horizontal) block state so it orients
  toward the player when placed, and supports rotate/mirror for structure
  blocks and data packs
- Blockstate JSONs updated to 4 facing variants (0/90/180/270 y-rotation)
- Block models changed from cube_all to cube with distinct textures for
  front, back, top, bottom, and side faces
- Generated 25 block face templates (16x16 per face per tier) and a
  64x64 entity skin template following the standard Minecraft UV layout;
  edit these in any pixel editor (Aseprite, GIMP, Pixelorama, etc.)
- gen_textures.py included at project root to regenerate templates

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
Places a MinerEntity that digs a 3-block-tall tunnel (Y, Y+1, Y+2)
in the block's facing direction, up to 64 blocks deep. All mined
blocks are deposited into the block's 27-slot storage; hoppers and
mod pipes can extract from it.

Tier restrictions (ore blocks left in place if tier is too low):
  Wood      – skips NEEDS_STONE_TOOL, NEEDS_IRON_TOOL, NEEDS_DIAMOND_TOOL
  Stone     – skips NEEDS_IRON_TOOL, NEEDS_DIAMOND_TOOL
  Iron      – skips NEEDS_DIAMOND_TOOL
  Diamond / Netherite – mines everything except bedrock

Mining intervals match lumberjack: 40 / 30 / 20 / 12 / 6 ticks per block.
Progress (currentDepth) is persisted in entity NBT across world restarts.

Recipes use pickaxes instead of axes, chained through previous tier:
  Wood: planks + wooden_pickaxe
  Stone–Netherite: planks + pickaxe + previous miner block

Includes 26 block texture templates (16x16, 5 tiers × 5 faces + entity
skin 64x64) and full blockstate/model/recipe/loot-table resource files.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
- LumberjackRenderer and MinerRenderer now add ItemInHandLayer so the
  held tool is rendered in the entity's hand
- LumberjackBlock.onPlace calls setTierEquipment() so the entity spawns
  holding the matching axe (wooden → netherite); equipment is persisted
  automatically via mob NBT
- MinerBlock.onPlace calls setTierEquipment() so the entity spawns
  holding the matching pickaxe
- MineForwardGoal now digs in facing.getOpposite() so the drill face
  points toward the player and mining goes into the rock behind the block
- Removed gen_textures.py (textures will be created externally)

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
Farmer blocks (wood→netherite) spawn a FarmerEntity that harvests mature
crops in a 5×5 area, auto-replants them, and keeps surrounding farmland
hydrated without needing a water source. Higher tiers harvest more
frequently and force-trigger randomTick on nearby crops to accelerate
growth. The farmer entity holds a tier-matched hoe.

Supported crops: wheat/carrots/potatoes/beetroot, nether wart, cocoa,
sweet berry bush, melons, and pumpkins.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
…YER_INNER_ARMOR

PLAYER_INNER_ARMOR uses the slim inner-armor layer mesh which lacks the
correct UV mapping for a full player skin, causing visual artifacts.
PLAYER uses the standard player model layer that matches the 64×64 skin texture.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
…BonemealableBlock API

randomTick is protected in BlockBehaviour so it cannot be called from mod code
without an access transformer. CropBlock and StemBlock implement BonemealableBlock,
so performBonemeal() is used instead. NetherWart, Cocoa, and SweetBerry don't
support bonemeal, so their age property is advanced by 1 directly.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
Warehouse blocks (wood→netherite) spawn a WarehouseWorkerEntity that
roams up to 32 blocks to find nearby Lumberjack, Miner, and Farmer
block entities with items, collects from them, and deposits into the
warehouse's 27-slot chest. Right-clicking the warehouse block opens a
chest GUI so players can extract items to central storage.

Higher tiers collect more stacks per trip (4→27) and move faster
(0.25→0.43 speed). The worker carries no visible items. Source
locations are cached to avoid repeated world scans during steady-state
collection. Recipe: 8× material surrounding the previous tier (wood
uses a chest as the center ingredient).

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
On each PR merge to main the workflow:
  1. Increments mod_version by 0.1 (0.9 → 1.0, etc.)
  2. Builds the JAR via ./gradlew build
  3. Commits the version bump back to main
  4. Creates a GitHub release and attaches the JAR

Version starts at 0.0 so the first merge produces 0.1.

https://claude.ai/code/session_01Ko8zQjsoTR3N7dKcVea1uz
@holty07 holty07 merged commit 9effa3a into main May 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants