Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Read README.md and docs/DEVELOPMENT.md before changing this mod.
- This is an independent member of the series. Do not introduce a Furniture dependency.
- Keep shared behaviour in focused base classes; roof rendering and collision share RoofGeometry.
- Metadata is limited to four bits. Spend models before block IDs; do not add tile entities for simple variants.
- Keep fresh Automatic registration economical for the 1.10–1.12 ID limit. Check actual registry counts and spare metadata before adding another block ID. Retain old identities through the compatibility setting.
- Edit the resource generator, then run it explicitly. Its --check mode must never rewrite resources.
- Keep common code free of client classes. Keep src/probe code outside player artifacts and ordinary Eclipse launches.
- Use disposable worlds. Do not alter Furniture worlds, checkouts, configs or existing qualification evidence.
Expand Down
16 changes: 16 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,19 @@
0.1.14.110021 - Alpha

I've added smart wattle and daub so you can build a house with a much smaller
inventory. The posts, rails and braces follow the walls and their openings.

- Automatic is the default. Build with smart walls, or choose Hybrid to use the
individual posts, rails and braces alongside them. Manual is still available.
- New Automatic setups leave out the manual wall block IDs. Smart corners now
share a block ID with full walls. Existing configs keep the older IDs so saved
buildings still load.
- The kit comes in all six woods, with raw and limewashed finishes and full
or half-depth walls. Thin panels can join into corners.
- Manual posts, rails and braces guide the smart framing in Hybrid.
- Smart panels can be glazed with the existing leaded panes.
- Tidied up the timber and plaster joins to stop the surfaces flickering.

0.1.13.110021 - Alpha

I've added brick and stone fireplaces to the Rye kit. You can build a small
Expand Down
22 changes: 18 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,17 @@ match the timber and daub to your walls, then stack sections to make taller case
They swing outwards with a right-click or redstone, and each column opens separately.
Full and half-depth surrounds fit both ordinary walls and projecting upper floors.

## Smart walls

Build the wall, add doors and windows, and let smart wattle and daub arrange the timber.
Posts frame the openings, rails follow the storeys and braces fill the solid bays.
Different sizes and openings give the houses different framing.

Automatic is the default building mode. You build with smart walls, and the manual
wall patterns stay out of the inventory and registry. Choose Hybrid to add deliberate
posts, rails and braces alongside the smart walls, or Manual for the individual pieces.
Existing configurations keep their selected mode and retain the older block IDs for saved buildings.

## Fireplaces and chimneys

Build a small brick hearth or a wider stone inglenook with separate jambs and lintels.
Expand All @@ -52,10 +63,13 @@ ingredients, and the main content families can be enabled or disabled in the con
See the [CurseForge files](https://www.curseforge.com/minecraft/mc-mods/ironagearchitecture/files/all)
for downloads and the [changelog](CHANGELOG.txt) for what's changed since the first alpha.

Start with plain wattle and daub, surround it with matching planks to make post panels,
then arrange those panels into rails, studs, braces and corners. The same patterns work
for full walls, thin walls and short pieces. Paired designs swap one-for-one, and offcuts
can be joined back together. Item tooltips give a reminder while you build.
Start with plain wattle and daub and surround it with four matching planks to make four
smart walls. Build the house and leave openings for doors and windows. Cut full panels
into thin ones for half-block overhangs, then sneak-use two thin panels together to turn
a corner. Item tooltips give a reminder while you build.

In Hybrid and Manual, the same starting recipe makes post panels. Shape those into
rails, studs, braces and corners. Paired designs swap one-for-one, and offcuts can be joined back together.

You can limewash pieces before or after shaping, singly or in batches of eight. The
[crafting guide](docs/BUILDING-GUIDE.md#crafting) covers the wall patterns, floors,
Expand Down
55 changes: 52 additions & 3 deletions docs/BUILDING-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,16 @@
Permanent building components for the Iron Age series, starting on Minecraft 1.10.2 Forge.
Architecture runs independently of Iron Age Furniture.

Version 0.1.13.110021 contains raw and limewashed cob blocks,
Version 0.1.14.110021 contains raw and limewashed cob blocks,
stairs and slabs; modular wattle-and-daub walls in all six vanilla woods; and smooth
thatch, slate and clay tile roofs with automatic corners and separate ridge caps, plus jettied-storey walls,
timber floors, support brackets, hanging clay tiles, openable leaded windows, and brick and
stone fireplaces. There are 542 visible variants including the wood and finish choices.
stone fireplaces. There are 158 visible variants in Automatic, or 566 in Hybrid,
including the wood and finish choices.

## Wattle and daub
## Manual wattle and daub

These individual patterns are available in Hybrid and Manual modes.

Build filled daub walls with principal posts, corner/end posts, sill/head rails, narrow
studs or close studding, and deliberate left/right diagonals. Plain infill has no border.
Expand All @@ -31,6 +34,52 @@ All modules are ordinary wall blocks with raw or limewashed infill. The connecti
derived from neighbouring blocks, so there are no wall tile entities or ticking components.
The original timber_frame block IDs and four item subtypes remain readable.

## Smart wattle and daub

Automatic is the default. Four matching planks around full daub make four smart walls.
Build your walls with it, leaving openings for doors and windows. The framing adjusts
as the building takes shape. Floors divide the storeys, and stepped wall outlines form
gables. Posts and braces follow each facade, including the returns around corners.

All six woods and both finishes are available. Two full smart panels vertically make
four thin panels. Two thin panels side by side rejoin into a full panel. Limewashing
works singly and in batches of eight, just like the ordinary walls.

Thin panels inherit the occupied half of a neighbouring thin wall or window. Sneak
to choose another plane. Sneak-use another thin panel on the end of a thin smart wall
to turn a corner. Mining that joined corner returns both panels. Full walls keep their
full footprint as their framing changes.

In Hybrid, add a stick to a full post panel to make a smart wall. Use the individual wall pieces to guide the result. A principal post
anchors a bay, rails set a horizontal line, and a diagonal asks the smart wall to continue
that brace. Craft a smart full panel alone to recover a matching principal post.

A leaded pane and a matching smart full or thin wall also make a window. Place floors,
roofs, windows and the other building pieces in the usual way.

Set `building.mode` in `config/ironagearchitecture.cfg` and restart.

| Mode | Wall kit |
| --- | --- |
| `manual` | The individual wall patterns and their original recipes |
| `hybrid` | Both kits, with manual pieces guiding smart framing |
| `automatic` | Smart framing. Four matching planks around full daub make four smart walls |

Automatic leaves the manual wall patterns out of registration on new installations,
saving block IDs as well as keeping the inventory smaller. The rest of the building
kit remains available. Client and server need matching registration settings and a restart.

When upgrading an existing configuration, `building.retainLegacyWallIds` is enabled
to keep older manual walls and smart corners readable. Leave it enabled for your existing
villages. For a new world or modpack, Automatic with this setting `false` uses the smaller
registry. Changing the mode does not convert placed walls. A world that needs an omitted
wall ID will refuse to load and tell you to turn compatibility back on.

Smart walls reconsider nearby sections after a building edit. Saved framing is retained
while an adjoining chunk is unavailable. A section can span up to 48 blocks horizontally
and 32 vertically. Larger uninterrupted sections use the simple provisional framing;
corners and floor levels divide ordinary houses into smaller sections.

## Jettied storeys

Thin walls are a full block high and half a block deep. Short walls are also half a block
Expand Down
52 changes: 47 additions & 5 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Roof blocks save facing. Clay verges also save which half overhangs the gable.
Inner/outer corners and ridge caps derive from same-material neighbours.
Slopes rise one block per block; ridge caps rise half a block and belong one row above the adjacent slopes.
The roof mesh is smooth; collision is a conservative approximation within 1/16 of the surface.
No architectural block needs a tile entity or scheduled ticking.
No architectural block needs a tile entity. Smart wall edits are coalesced into bounded end-of-tick work.

WindowBlock is a separate light-transmitting family. Metadata is horizontal facing in
bits 0-1, open in bit 2 and cached power in bit 3. Wood, finish, depth and leading live
Expand Down Expand Up @@ -101,6 +101,8 @@ rather than the canonical inventory block's default shape.

SurfaceGeometry clips buried faces from the shared solid parts. At coplanar intersections,
boards, posts and rails have deterministic ownership; braces sit slightly behind the main frame.
Diagonal covers are subtracted as convex prisms, so their end caps replace the plaster
they occupy without cutting rectangular holes around the sloping timber.
The collision union continues to use the solid parts. Horizontal ties reverse their reflected
mesh winding so the exposed underside remains visible.
One-sided automatic rails are clipped against the timber outlines at the rail's height.
Expand Down Expand Up @@ -128,6 +130,45 @@ outlines turn the entire extrusion inside out, exposing the back of the attachme
and making the support appear hollow. Unit tests and the native client check the actual
bracket face winding; the native check covers both reaches and every saved direction.

## Smart walls

SmartWallBlock keeps its wood, finish and full/half/corner footprint independent of its
appearance. The two visible profiles have canonical items. Joining two half panels
creates an L footprint which drops both original panels. Each wood uses two block IDs.
The full ID packs facing in bits 0-1, finish in bit 2 and the L footprint in bit 3,
using all 16 metadata values. The thin ID retains facing and finish in bits 0-2.
Its old low-eight values and the full wall's old low-eight values keep their meanings.
Separate smart-corner IDs only register with building.retainLegacyWallIds.

SmartFacade is a deterministic, coordinate-independent grammar over an occupied facade
with explicit openings and manual anchors. SmartWallPlanner surveys loaded coplanar
sections, including window ownership cells, independently on each elevation. Floors
split the survey into storeys. It caps a section at 2,048 cells, 48 columns and 32 rows.
An incomplete or oversized survey retains its saved framing. Bare sections use a simple
frame until their surroundings are known. Manual pieces contribute constraints in Hybrid.

SmartWallData saves four eight-bit face descriptors per wall in per-dimension WorldSavedData.
SmartWallEvents coalesces changes and repairs loaded chunk borders. Idle walls do no survey
work. Chunk-watch snapshots and changed descriptors are sent to the client; render workers
read only the cached descriptors. No tile entities, render-thread world scans or forced
chunk loads are used. Automatic is the fresh-install default and omits all 144 manual
framed-wall IDs. Hybrid and Manual register them. Plain daub, floors and brackets remain
independent of that choice. Existing configs default retainLegacyWallIds to true; a fresh
config defaults it to false. The missing-mapping handler fails affected world loads rather
than letting Forge discard omitted walls, including with automatic query confirmation.
Client recipe lists and creative browsing follow the server mode and
return to the local setting after disconnecting.

With all content families enabled, packaged registry checks measure 320 block IDs
for fresh Automatic, 464 for fresh Hybrid/Manual, or 470 with legacy wall retention.
The 150-ID saving consists of 144 manual wall IDs and six separate smart-corner IDs.
Count actual registry entries when checking the 1.10–1.12 budget; creative variants,
unlisted framing descriptors and baked meshes do not each consume a block ID.

The shared WallGeometry and SurfaceGeometry path clips the timber members. Smart occupancy
supplies collision, targeting, placement clearance and jetty support. Both depths can craft
leaded windows. Recipe accounting preserves framing quantity separately from glazing.

## Era membership

EraCatalog supplies both creative membership and survival recipe eligibility. Basic cob,
Expand Down Expand Up @@ -164,7 +205,7 @@ resource generator and item tooltips.

Run scripts/invoke-runtime-probe.ps1 after prepareProbe. Modes cover core, reload, furniture,
disabled, windows-disabled, legacy, legacy-daub, legacy-jetties, iron-age, late-medieval,
mixed-eras, no-eras, invalid-era, clay-disabled, clay-only and legacy-fascia.
mixed-eras, no-eras, invalid-era, clay-disabled, clay-only, manual, automatic, legacy-fascia and legacy-fireplaces.
Only Forge/server libraries and the explicitly named Furniture JAR are read from retained runtimes;
no existing worlds or configs are copied or changed. Each mode has an isolated runtime except reload,
which verifies the saved core world. Servers bind to loopback. Keep failed logs when correcting failures.
Expand Down Expand Up @@ -194,9 +235,10 @@ flues across a chunk border, blocked and disconnected runs, the three outlets an
The core reload checks that the fires still draw from the correct floor.

The optional client probe requires iaa.probe=true, iaa.clientProbe=true and iaa.keepRunning=true.
It creates its own Rye Fireplace Preview, checks mesh and material variants and both
creative tabs, captures the interiors and the stack with one fire and then both lit,
then shuts down. With fireplaces disabled it captures the eaves and guttering instead.
It creates its own Smart Walls Preview, checks mesh and material variants and both
creative tabs, captures the three smart houses and their jetties, then shuts down.
The houses use 7, 9 and 11 block widths, different windows, both jetty depths and a
manual anchor. Server/client descriptor equality is checked before capture.
Every visible item must also provide a translated crafting hint without tooltip errors.
The client script's PreviewName argument selects a separate save without replacing an earlier preview.
After verification copy the preview save into the ordinary run/saves directory and launch without the probe.
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ org.gradle.parallel=false
net.minecraftforge.gradle.merge-source-sets=false
minecraft_version=1.10.2
forge_version=12.18.3.2511
mod_version=0.1.13.110021
mod_version=0.1.14.110021
mod_group=zone.moddev.mc
mod_id=ironagearchitecture
mod_name=Iron Age Architecture
Expand Down
20 changes: 20 additions & 0 deletions scripts/generate-resources.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,26 @@ model('dark_oak_soffit',{parent:'minecraft:block/block',textures:{wood:'minecraf
['down','up','north','south','west','east'].map(face=>[face,{texture:'#wood'}]))}]});
item('dark_oak_soffit','dark_oak_soffit');
lang[`item.${ns}.dark_oak_soffit.name`] = 'Dark Oak Soffit';
for(const [woodIndex,wood] of woods.entries()) {
const mesh=`smart_daub_mesh_${wood}`;
model(mesh,{parent:'minecraft:block/block',textures:{particle:`${ns}:blocks/limewashed_cob`},elements:[]});
for(const profile of ['full','thin','corner']) {
// Full panels 2/3 are packed L footprints. Keep separate corner models for old saves.
const name=`smart_daub_${profile}_${wood}`,variants={};
for(const facing of Object.keys(facings)) for(let panel=0;panel<4;panel++)
variants[`facing=${facing},panel=${panel}`]={model:`${ns}:${mesh}`};
state(name,variants);
if(profile==='corner') continue;
for(let finish=0;finish<2;finish++) {
item(name+'_'+finish,mesh);
lang[`tile.${ns}.${name}.${finish}.name`]=`${finish?'Limewashed ':''}${names[woodIndex]} Smart ${profile==='thin'?'Thin ':''}Wattle and Daub`;
}
}
}
lang[`hint.${ns}.smart.place`]='Build the wall; its posts, rails and braces follow the facade and openings.';
lang[`hint.${ns}.smart.corner`]='Sneak-use a thin panel on another thin smart wall to form a corner.';
lang[`hint.${ns}.smart.craft`]='Hybrid: matching post panel + stick. Cut and rejoin full and thin panels.';
lang[`hint.${ns}.smart.craft.auto`]='Four matching planks around full daub make four smart full walls.';
const fireplaceParts = {
hearth:'Hearth', firebox:'Firebox', jamb:'Fireplace Jamb', lintel:'Fireplace Lintel',
flue:'Chimney Flue', collar:'Clay Roof Collar', pot_cap:'Chimney Pot', slab_cap:'Vented Chimney Cap'
Expand Down
6 changes: 4 additions & 2 deletions scripts/invoke-client-preview.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
param(
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\rye-fireplaces-0.1.13\native-client-verified',
[string]$PreviewName='Rye Fireplace Preview',
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\smart-walls-auto-0.1.14\native-client-reviewed',
[string]$PreviewName='Automatic Walls Preview',
[switch]$SurfaceCheck,
[string]$ServerTemplate='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\core',
[string]$GradleHome='D:\GradleCaches\minecraft-mods-shared',
[string]$AssetsDirectory='',
Expand Down Expand Up @@ -61,6 +62,7 @@ $args=@('-Xmx2G',('-Djava.library.path='+(Join-Path $slime 'natives')),'-Diaa.pr
'net.minecraft.launchwrapper.Launch','--tweakClass','net.minecraftforge.fml.common.launcher.FMLTweaker',
'--username','ArchitecturePreview','--version','1.10.2','--gameDir',$Runtime,'--assetsDir',$AssetsDirectory,
'--assetIndex','1.10','--uuid','00000000000000000000000000000001','--accessToken','0','--userType','legacy','--versionType','release','--width','1280','--height','800')
if($SurfaceCheck) {$args=@('-Diaa.surfacePreview=true')+$args}
Push-Location $Runtime
try {
& $Java8 @args *> 'native-client-console.log'
Expand Down
Loading
Loading