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
10 changes: 10 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
0.1.11.110021 - Alpha

I've added iron guttering and downpipes to the Rye kit.

- Fit half-round gutters and outlets to the clay fascia. The pieces join along the eaves.
- Use the offsets to tuck a downpipe back under a half-block or full-block overhang.
- Finish the pipe with a short angled shoe so it ends just above the paving and
sends the drips away from the wall.
- In the rain, exposed outlets and the open ends of connected downpipes drip.

0.1.10.110021 - Alpha

I've added the clay tiles and timber roof trim I've been trying out on the Rye cottages.
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ All six vanilla wood types are available. Cob comes in blocks, slabs and stairs,
thatch, slate and clay tile roofs have automatic corners and separate ridge caps.
Clay tiles also come as full and half-depth hanging panels for gables and upper walls.
Finish clay roofs with timber fascia boards at the eaves and matching trim along the gable and ridge.
Fit iron guttering to the fascia and run a downpipe under the overhang. Connected outlets and pipes drip in the rain.

Leaded windows bring some light into the houses. Choose diamond or rectangular leading,
match the timber and daub to your walls, then stack sections to make taller casements.
Expand Down
30 changes: 26 additions & 4 deletions docs/BUILDING-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
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.10.110021 contains raw and limewashed cob blocks,
Version 0.1.11.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 and openable leaded windows. There are 517 visible
timber floors, support brackets, hanging clay tiles and openable leaded windows. There are 525 visible
variants including the wood and finish choices. Architecture remains standalone.

## Wattle and daub
Expand Down Expand Up @@ -75,6 +75,28 @@ Use full hanging tiles to fill the stepped gable beneath a clay roof. Thin hangi
tiles share the half-block plane with straight thin timber panels and thin leaded windows.
Place against one of these pieces to inherit its occupied half. Sneak to choose the half manually.

## Guttering

Use a gutter or outlet on the outside face of a bare clay fascia. Level sections join
and cap their exposed ends. Sneak and use an empty hand on the metal to recover the fitting.

Start a pipe against the underside of the outlet and build down from the pipe end. The
eave offset brings the pipe towards the wall. For a half-block step, use the half-block
offset beneath an outside pipe in a clear bay beside the thin wall. For a full-block jetty,
run the pipe close to the upper wall, place the outer elbow below it and fit the inner elbow
on the wall side of that elbow. Continue down from the inner elbow. To select the position
of a straight pipe by hand, sneak, face the wall and click where you want it to sit.

Three iron ingots across a row make six gutters. Add an ingot to a gutter for an outlet.
Three iron ingots in a column make six pipes. Craft a pipe with a stick for an eave offset.
Craft an offset alone to cycle through the eave, half-block, outer and inner shapes.

Craft a straight downpipe alone to make a shoe. Fit it under the last pipe, in the
block above the paving. The short bend turns out from the wall, with enough room
under its mouth for rain to drip onto the cobbles.

An exposed outlet drips during rain. A connected pipe takes those drips to its open foot.

## Leaded windows

Use full-depth surrounds in full walls and half-depth surrounds in thin walls. Both come
Expand Down Expand Up @@ -213,9 +235,9 @@ switches still apply separately.
All content families are enabled by default. Framed panels require the cob family.
The `blocks.leadedWindows` switch controls both glazing and windows and requires timber
frames and cob. Era recipe filtering is separate from this content switch.
The `blocks.clayTiles` switch controls the clay slopes, ridge caps, trim and both hanging panels.
The `blocks.clayTiles` switch controls the clay slopes, ridge caps, trim, hanging panels and iron guttering.
Thatch and timber-bearing walls burn; plain daub, cob and slate do not. There is no world generation or collapse simulation.

See [development instructions](DEVELOPMENT.md) for builds, Eclipse and disposable runtime checks.
This is an early alpha. Automated checks and manual visual/gameplay review are recorded separately.
The Rye Roof Trim Preview shows how the fascia and gable trim fit on three houses stepping down a cobbled street.
The Rye Downpipe Shoe Preview shows both pipe offsets and the shoe on a cobbled street.
10 changes: 6 additions & 4 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,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 and clay-only.
mixed-eras, no-eras, invalid-era, clay-disabled, clay-only and legacy-fascia.
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 All @@ -185,11 +185,13 @@ entity clearance, owner/helper rays, player passage, harvesting, explosions and
Clay tile checks cover cap joining, four wall orientations, half-depth collision and
placement alongside windows. Roof trim checks cover both verge hands in every facing,
clearance behind the fascia and the ridge end join. The clay-only mode checks that crafting works with the
other building families switched off. Use a fresh runtime root for each candidate.
other building families switched off. Guttering checks cover fitting and recovery, joined
ends, both offsets and the rain path. The legacy-fascia mode opens a copy of the roof trim
preview and verifies the original bare fascias. Use a fresh runtime root for each candidate.

The optional client probe requires iaa.probe=true, iaa.clientProbe=true and iaa.keepRunning=true.
It creates its own Rye Roof Trim Preview, checks mesh and material variants and both
creative tabs, captures three views of the clay tile street and then shuts down.
It creates its own Rye Downpipe Shoe Preview, checks mesh and material variants and both
creative tabs, captures dry and rain views of the cottage row, then shuts down.
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.10.110021
mod_version=0.1.11.110021
mod_group=zone.moddev.mc
mod_id=ironagearchitecture
mod_name=Iron Age Architecture
Expand Down
42 changes: 40 additions & 2 deletions scripts/generate-resources.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,36 @@ for (const [material,label] of [['thatch','Thatch'],['slate','Slate'],['clay_til
for (const [part,label] of [['fascia','Fascia'],['verge','Verge'],['ridge_end','Ridge End']]) {
const name = `clay_tile_${part}`, variants = {};
const mesh = part === 'ridge_end' ? 'clay_tile_cap_mesh' : 'clay_tile_mesh';
for (const facing of Object.keys(facings)) for (const right of [false,true])
variants[`facing=${facing},right=${right}`] = {model:`${ns}:${mesh}`};
for (const facing of Object.keys(facings)) {
if (part === 'fascia') {
for (let ends=0;ends<4;ends++) for (let fitting=0;fitting<3;fitting++)
variants[`ends=${ends},facing=${facing},fitting=${fitting}`] = {model:`${ns}:${mesh}`};
} else for (const right of [false,true])
variants[`facing=${facing},right=${right}`] = {model:`${ns}:${mesh}`};
}
state(name,variants); item(name,mesh);
lang[`tile.${ns}.${name}.name`] = `Clay Tile ${label}`;
}
model('drain_mesh',{parent:'minecraft:block/block',textures:{particle:'minecraft:blocks/iron_block'}});
for (const [name,label] of [['iron_gutter','Iron Gutter'],['iron_gutter_outlet','Iron Gutter Outlet']]) {
item(name,'drain_mesh');
lang[`item.${ns}.${name}.name`] = label;
}
for (const [name,labels] of [
['iron_downpipe',['Iron Downpipe']],
['iron_downpipe_shoe',['Iron Downpipe Shoe']],
['iron_downpipe_offset',['Eave Offset','Half-block Offset','Full-block Outer Elbow','Full-block Inner Elbow']]
]) {
const variants = {};
for (const facing of Object.keys(facings)) for (let profile=0;profile<4;profile++)
variants[`facing=${facing},profile=${profile}`] = {model:`${ns}:drain_mesh`};
state(name,variants);
for (const [i,label] of labels.entries()) {
const suffix = labels.length > 1 ? '_' + i : '';
item(name + suffix,'drain_mesh');
lang[`tile.${ns}.${name}${suffix ? '.' + i : ''}.name`] = label;
}
}
model('clay_tile_hanging',{parent:'minecraft:block/cube_all',textures:{all:`${ns}:blocks/clay_tile`}});
const tileFaces = Object.fromEntries(['down','up','north','south','west','east'].map(face =>
[face, face === 'south' ? {texture:'#tile'} : {texture:'#tile',cullface:face}]));
Expand All @@ -165,6 +190,19 @@ for(const [w,wood] of woods.entries()) for(const finish of [0,1]) for(const thin
}
state('open_window_leaf',Object.fromEntries(Object.keys(facings).map(facing=>[`facing=${facing}`,{model:`${ns}:window_mesh`}])));
for(let meta=0;meta<2;meta++) {item(`leaded_pane_${meta}`,'window_mesh');lang[`item.${ns}.leaded_pane.${meta}.name`]=`${meta?'Rectangular':'Diamond'} Leaded Pane`;}
for (const [key,label] of Object.entries({
'gutter.fit':'Fit to the outside face of a bare clay fascia. Sneak and use an empty hand to recover it.',
'gutter.outlet':'Place a downpipe beneath the outlet to carry rain down.',
'gutter.craft':'Three iron ingots in a row make six gutters. Add an ingot to make an outlet.',
'pipe.place':'Place against a pipe end to line up. Sneak, face the wall and click to pick the depth.',
'pipe.craft':'Three iron ingots in a column make six pipes. Add a stick to make an offset.',
'pipe.offset.0':'Fits under an outlet and brings the pipe back to the wall.',
'pipe.offset.1':'Fits under an outside pipe and brings it half a block in.',
'pipe.offset.2':'Place beneath the upper pipe with its side opening toward the wall.',
'pipe.offset.3':'Place beside the outer elbow, one cell closer to the wall.',
'pipe.cycle':'Craft alone to switch to the next offset shape.',
'pipe.shoe':'Craft a downpipe alone. Fit beneath the last pipe to let rain spill out above the ground.'
})) lang[`hint.${ns}.${key}`] = label;
lang[`hint.${ns}.window.use`]='Right-click to open the casement; redstone operates the whole column.';
lang[`hint.${ns}.window.place`]='Stack to share a hinge; sneak to choose a different alignment.';
lang[`hint.${ns}.window.glaze`]='Craft alone to swap leading. Shape the wall before glazing.';
Expand Down
4 changes: 2 additions & 2 deletions scripts/invoke-client-preview.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
param(
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\rye-roof-trim-0.1.10\native-client',
[string]$PreviewName='Rye Roof Trim Preview',
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\rye-downpipe-shoe-0.1.11\native-client-final',
[string]$PreviewName='Rye Downpipe Shoe Preview',
[string]$ServerTemplate='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\core',
[string]$GradleHome='D:\GradleCaches\minecraft-mods-shared',
[string]$AssetsDirectory='',
Expand Down
14 changes: 11 additions & 3 deletions scripts/invoke-runtime-probe.ps1
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
param(
[ValidateSet('core','reload','furniture','disabled','legacy','legacy-daub','legacy-jetties','iron-age','late-medieval','mixed-eras','no-eras','invalid-era','windows-disabled','clay-disabled','clay-only')][string]$Mode='core',
[string]$RuntimeRoot='D:\IronAgeArchitecture\manual-testing\rye-roof-trim-0.1.10',
[ValidateSet('core','reload','furniture','disabled','legacy','legacy-daub','legacy-jetties','legacy-fascia','iron-age','late-medieval','mixed-eras','no-eras','invalid-era','windows-disabled','clay-disabled','clay-only')][string]$Mode='core',
[string]$RuntimeRoot='D:\IronAgeArchitecture\manual-testing\rye-downpipe-shoe-0.1.11',
[string]$ServerTemplate='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\core',
[string]$FurnitureJar='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\furniture\mods\iron-age-furniture-0.3.0.110021.jar',
[string]$Java8='C:\Users\johnb\.gradle\jdks\temurin-8-amd64-windows.2\bin\java.exe'
Expand Down Expand Up @@ -42,6 +42,13 @@ if($Mode -eq 'legacy-jetties') {
[System.IO.Compression.ZipFile]::ExtractToDirectory('D:\IronAgeArchitecture\candidates\0.1.2.110021-jettied-storeys\Jettied Street Preview.zip',$staging)
Copy-Item -LiteralPath (Join-Path $staging 'Jettied Street Preview') -Destination (Join-Path $folder 'world') -Recurse
}
if($Mode -eq 'legacy-fascia') {
if(Test-Path -LiteralPath (Join-Path $folder 'world')) {throw 'Legacy fascia probe requires a fresh disposable destination'}
Add-Type -AssemblyName System.IO.Compression.FileSystem
$staging=Join-Path $folder 'fascia-preview-source'
[System.IO.Compression.ZipFile]::ExtractToDirectory('D:\IronAgeArchitecture\manual-testing\rye-roof-trim-0.1.10\Rye Roof Trim Preview.zip',$staging)
Copy-Item -LiteralPath (Join-Path $staging 'Rye Roof Trim Preview') -Destination (Join-Path $folder 'world') -Recurse
}
$eraModes=@{'iron-age'=@('iron_age');'late-medieval'=@('late_medieval_tudor');'mixed-eras'=@('iron_age','late_medieval_tudor');'no-eras'=@();'invalid-era'=@('misspelled_era')}
if($eraModes.ContainsKey($Mode)) {
New-Item -ItemType Directory -Force -Path (Join-Path $folder 'config') | Out-Null
Expand Down Expand Up @@ -91,9 +98,10 @@ if($Mode -eq 'reload') {$args+='-Diaa.reload=true'}
if($Mode -eq 'legacy') {$args+='-Diaa.legacy=true'}
if($Mode -eq 'legacy-daub') {$args+='-Diaa.legacyDaub=true'}
if($Mode -eq 'legacy-jetties') {$args+='-Diaa.legacyJetties=true'}
if($Mode -eq 'legacy-fascia') {$args+='-Diaa.legacyFascia=true'}
if($Mode -eq 'core') {$args+=@('-Diaa.eraMatrix=true','-Diaa.recipeMatrix=true')}
if($Mode -eq 'disabled') {$args+='-Diaa.expectedVariants=0'}
if($Mode -eq 'clay-only') {$args+=@('-Diaa.expectedVariants=7','-Diaa.clayOnly=true','-Diaa.recipeMatrix=true')}
if($Mode -eq 'clay-only') {$args+=@('-Diaa.expectedVariants=15','-Diaa.clayOnly=true','-Diaa.recipeMatrix=true')}
$args+=@('-jar',$forge,'nogui')
Push-Location $folder
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,22 @@ public final class ArchitectureBlocks {
public static final List<WindowBlock> WINDOWS = new ArrayList<>();
public static WindowLeafBlock WINDOW_LEAF;
public static LeadedPaneItem LEADED_PANE;
public static GutterItem GUTTER, GUTTER_OUTLET;
public static DownpipeBlock DOWNPIPE, DOWNPIPE_OFFSET, DOWNPIPE_SHOE;

public static int variants(Block block) {
if (block instanceof FrameBlock) return ((FrameBlock)block).variants();
return block == DOWNPIPE_OFFSET ? 4 : 1;
}
public static List<ItemStack> visibleStacks() {
List<ItemStack> result=new ArrayList<>();
for(Block block:VISIBLE) for(int meta=0;meta<(block instanceof FrameBlock?((FrameBlock)block).variants():1);meta++) result.add(new ItemStack(block,1,meta));
for(Block block:VISIBLE) for(int meta=0;meta<variants(block);meta++) result.add(new ItemStack(block,1,meta));
for(JettyBracketItem item:BRACKETS) result.add(new ItemStack(item));
if(LEADED_PANE!=null) {result.add(new ItemStack(LEADED_PANE,1,0));result.add(new ItemStack(LEADED_PANE,1,1));}
if (GUTTER != null) {
result.add(new ItemStack(GUTTER));
result.add(new ItemStack(GUTTER_OUTLET));
}
return result;
}
public static List<FrameBlock> meshes() {
Expand All @@ -51,7 +62,8 @@ public static List<FrameBlock> meshes() {
public static FrameBlock DAUB;
public static final List<RoofBlock> ROOFS = new ArrayList<>();
public static TileHangingBlock CLAY_HANGING, CLAY_HANGING_THIN;
public static TrimmedRoofBlock CLAY_FASCIA, CLAY_VERGE, CLAY_RIDGE_END;
public static FasciaBlock CLAY_FASCIA;
public static TrimmedRoofBlock CLAY_VERGE, CLAY_RIDGE_END;
private ArchitectureBlocks() { }
public static <T extends Block> T block(T block, String name) {
block.setRegistryName(new ResourceLocation(IronAgeArchitecture.MODID, name));
Expand Down Expand Up @@ -97,12 +109,28 @@ public static void register() {
CLAY_HANGING_THIN = block(new TileHangingBlock(true), "clay_tile_hanging_thin");
item(CLAY_HANGING, new TileHangingItem(CLAY_HANGING));
item(CLAY_HANGING_THIN, new TileHangingItem(CLAY_HANGING_THIN));
CLAY_FASCIA = roofTrim("clay_tile_fascia", TrimmedRoofBlock.Kind.FASCIA);
CLAY_FASCIA = block(new FasciaBlock(), "clay_tile_fascia");
item(CLAY_FASCIA, new EraItemBlock(CLAY_FASCIA));
ROOFS.add(CLAY_FASCIA);
CLAY_VERGE = roofTrim("clay_tile_verge", TrimmedRoofBlock.Kind.VERGE);
CLAY_RIDGE_END = roofTrim("clay_tile_ridge_end", TrimmedRoofBlock.Kind.RIDGE_END);
GUTTER = gutter("iron_gutter", false);
GUTTER_OUTLET = gutter("iron_gutter_outlet", true);
DOWNPIPE = block(new DownpipeBlock(DownpipeBlock.Kind.STRAIGHT), "iron_downpipe");
item(DOWNPIPE, new DownpipeItem(DOWNPIPE));
DOWNPIPE_OFFSET = block(new DownpipeBlock(DownpipeBlock.Kind.OFFSET), "iron_downpipe_offset");
item(DOWNPIPE_OFFSET, new DownpipeItem(DOWNPIPE_OFFSET));
DOWNPIPE_SHOE = block(new DownpipeBlock(DownpipeBlock.Kind.SHOE), "iron_downpipe_shoe");
item(DOWNPIPE_SHOE, new DownpipeItem(DOWNPIPE_SHOE));
}
EraCatalog.assignPrimaryTabs();
}
private static GutterItem gutter(String name, boolean outlet) {
GutterItem item = new GutterItem(outlet);
item.setRegistryName(new ResourceLocation(IronAgeArchitecture.MODID, name));
item.setUnlocalizedName(IronAgeArchitecture.MODID + "." + name);
return GameRegistry.register(item);
}
private static void registerWindows() {
WINDOW_LEAF=block(new WindowLeafBlock(),"open_window_leaf");
LEADED_PANE=new LeadedPaneItem();LEADED_PANE.setRegistryName(new ResourceLocation(IronAgeArchitecture.MODID,"leaded_pane"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ public static void register() {
}
}
if(ArchitectureConfig.windows) registerWindows();
if (ArchitectureConfig.clayTiles) registerGuttering();
for(RoofBlock roof:ArchitectureBlocks.ROOFS) if(!roof.isRidge() && !(roof instanceof TrimmedRoofBlock)) {
Object material;
switch (roof.materialKey) {
Expand All @@ -52,6 +53,18 @@ public static void register() {
}
}
}
private static void registerGuttering() {
shaped(new ItemStack(ArchitectureBlocks.GUTTER, 6), "III", 'I', Items.IRON_INGOT);
shapeless(new ItemStack(ArchitectureBlocks.GUTTER_OUTLET), ArchitectureBlocks.GUTTER, Items.IRON_INGOT);
shaped(new ItemStack(ArchitectureBlocks.DOWNPIPE, 6), "I", "I", "I", 'I', Items.IRON_INGOT);
shapeless(new ItemStack(ArchitectureBlocks.DOWNPIPE_OFFSET), ArchitectureBlocks.DOWNPIPE, Items.STICK);
shapeless(new ItemStack(ArchitectureBlocks.DOWNPIPE_SHOE), ArchitectureBlocks.DOWNPIPE);
for (int profile = 0; profile < 4; profile++) {
shapeless(new ItemStack(ArchitectureBlocks.DOWNPIPE_OFFSET, 1, (profile + 1) & 3),
new ItemStack(ArchitectureBlocks.DOWNPIPE_OFFSET, 1, profile));
}
}

private static void registerCob() {
shapeless(new ItemStack(ArchitectureBlocks.COB.get(0),8),Blocks.DIRT,Blocks.DIRT,Blocks.DIRT,Blocks.DIRT,
Items.CLAY_BALL,Items.CLAY_BALL,Items.CLAY_BALL,Items.CLAY_BALL,Items.WHEAT);
Expand Down
Loading
Loading