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

I've added brick and stone fireplaces to the Rye kit. You can build a small
hearth or widen it with matching pieces and add your own surround.

- Light the firebox with flint and steel. Sneak and right-click with both hands
empty to put it out.
- Run flues side by side so fireplaces on different floors can share a stack.
Each pot smokes when the fire below it is lit.
- Leave the flue open or finish it with a pot or vented cap. Use a clay roof
collar where the stack passes through a straight slope.


0.1.12.110021 - Alpha

I've tidied up the eaves on the Rye cottages. The grain now runs along the fascia
Expand Down
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ 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.

## Fireplaces and chimneys

Build a small brick hearth or a wider stone inglenook with separate jambs and lintels.
Light the firebox with flint and steel. Run straight flues side by side to carry smoke
from fireplaces on different floors through one stack, with a separate outlet for each fire.
Clay tile collars carry the roof slope up to the sides of the stack.

## Overhanging upper floors

Projecting upper storeys, known as jetties, are a central part of the kit. Half-depth walls,
Expand All @@ -52,7 +59,7 @@ can be joined back together. Item tooltips give a reminder while you build.

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,
brackets and roofs.
brackets, roofs and fireplaces.

## Building through the ages

Expand Down
44 changes: 41 additions & 3 deletions docs/BUILDING-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
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.12.110021 contains raw and limewashed cob blocks,
Version 0.1.13.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 526 visible
variants including the wood and finish choices. Architecture remains standalone.
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.

## Wattle and daub

Expand Down Expand Up @@ -127,6 +127,27 @@ power next changes, just like a wooden door. A powered window blocked from openi
tries again when the obstruction is removed. Windows open instantly through 90 degrees.
Breaking a section, including through its open pane, returns its intact window item.

## Fireplaces and chimneys

Start with a firebox at floor level. Set matching hearth pieces beside it to widen the
hearth, with every piece facing the room. Jambs and lintels are separate, so you can build
a compact fireplace or frame a wide inglenook with your own masonry around it.

Right-click the firebox with flint and steel to light it. Sneak and right-click with
both hands empty to put it out. The fire gives off light and sometimes crackles. It
burns without fuel and stays contained in the firebox.

Build a straight run of flue blocks directly above each firebox. Offset the upstairs
firebox by one block so its flue can run alongside the lower one. Matching brick or stone
flues join visually, while each column carries smoke from its own firebox. Leave an open
flue at the top or finish it with a pot or slab cap. Pots need air above them and slab
caps need a clear side vent. Keep the run continuous and the outlet within 32 blocks of
the firebox.

On a straight clay slope, use a roof collar in place of the slope where the flue crosses
the roof. Place it facing up the slope just like a roof tile. The collar follows the same
pitch and continues the flue.

## Crafting

Start with a few base materials, then shape them into the pieces you need. Match the wood,
Expand Down Expand Up @@ -203,6 +224,21 @@ or six from L-shaped corners. Either inside/outside pattern can be recovered thi
alone to get the slope back. Two full panels vertically make four thin panels.
Two thin panels side by side rejoin into one full panel.

### Fireplaces

Use brick blocks or plain stone bricks throughout each recipe.

| Piece | Recipe |
| --- | --- |
| Four hearths | Two masonry blocks on a diagonal |
| Firebox | One hearth and one iron bars block |
| Four jambs | Three masonry blocks vertically |
| Four lintels | Two masonry blocks side by side |
| Four flues | Two columns of three masonry blocks with the middle column empty |
| Pot cap | One flue and a flower pot |
| Slab cap | One flue and a stone slab |
| Roof collar | One flue and a clay roof slope |

### Limewashing

Every raw cob, daub or timber-and-daub piece can be limewashed after shaping. Use one piece
Expand Down Expand Up @@ -241,6 +277,8 @@ All content families are enabled by default. Framed panels require the cob famil
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, hanging panels and iron guttering.
The `blocks.fireplaces` switch controls the fireplace kit in Late Medieval & Tudor.
Clay tiles also need to be enabled to use roof collars.
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.
Expand Down
9 changes: 7 additions & 2 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,9 +189,14 @@ other building families switched off. Guttering checks cover fitting and recover
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.

Fireplace checks cover saved state and canonical drops, firebox light and interaction, independent
flues across a chunk border, blocked and disconnected runs, the three outlets and roof collar pitch.
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 Eaves Preview, checks mesh and material variants and both
creative tabs, captures dry and rain views of the cottage row, then shuts down.
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.
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.12.110021
mod_version=0.1.13.110021
mod_group=zone.moddev.mc
mod_id=ironagearchitecture
mod_name=Iron Age Architecture
Expand Down
25 changes: 25 additions & 0 deletions scripts/generate-resources.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,31 @@ 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';
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'
};
for (const [material,label,texture] of [['brick','Brick','brick'],['stone','Stone','stonebrick']]) {
const mesh = `fireplace_${material}_mesh`;
model(mesh,{parent:'minecraft:block/block',textures:{particle:`minecraft:blocks/${texture}`},elements:[]});
for (const [kind,part] of Object.entries(fireplaceParts)) {
const name = `fireplace_${material}_${kind}`, variants = {};
for (const facing of Object.keys(facings)) for (const lit of [false,true])
variants[`facing=${facing},lit=${lit}`] = {model:`${ns}:${mesh}`};
state(name,variants); item(name,mesh);
lang[`tile.${ns}.${name}.name`] = `${label} ${part}`;
}
}
for (const [kind,hint] of Object.entries({
hearth:'Place beside a matching hearth or firebox for a wider fireplace.',
firebox:'Light with flint and steel. Sneak and right-click with empty hands to put it out.',
jamb:'Place beside the opening to frame the fireplace.',
lintel:'Span the opening with matching lintels.',
flue:'Stack directly above a firebox. Each column has its own smoke path.',
collar:'Place facing uphill on a straight clay slope. Stack the flue through it.',
pot_cap:'Place on top of a flue and leave the mouth clear.',
slab_cap:'Place on top of a flue and leave a side vent clear.'
})) lang[`hint.${ns}.fireplace.${kind}`] = hint;
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');
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-eaves-0.1.12\native-client-verified',
[string]$PreviewName='Rye Eaves Preview',
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\rye-fireplaces-0.1.13\native-client-verified',
[string]$PreviewName='Rye Fireplace Preview',
[string]$ServerTemplate='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\core',
[string]$GradleHome='D:\GradleCaches\minecraft-mods-shared',
[string]$AssetsDirectory='',
Expand Down
3 changes: 2 additions & 1 deletion 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','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-eaves-0.1.12',
[string]$RuntimeRoot='D:\IronAgeArchitecture\manual-testing\rye-fireplaces-0.1.13',
[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 @@ -72,6 +72,7 @@ blocks {
B:thatch=false
B:slate=false
B:clayTiles=$clayTiles
B:fireplaces=false
}
"@ | Set-Content -LiteralPath (Join-Path $folder 'config/ironagearchitecture.cfg') -Encoding ascii
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ public static List<FrameBlock> meshes() {
List<FrameBlock> result=new ArrayList<>(WALLS);result.addAll(PARTIALS);result.addAll(FLOORS);return result;
}
public static FrameBlock DAUB;
public static final List<FireplaceBlock> FIREPLACES = new ArrayList<>();
public static final List<RoofBlock> ROOFS = new ArrayList<>();
public static TileHangingBlock CLAY_HANGING, CLAY_HANGING_THIN;
public static FasciaBlock CLAY_FASCIA, CLAY_FASCIA_LINED;
Expand Down Expand Up @@ -132,8 +133,27 @@ public static void register() {
SOFFIT.setUnlocalizedName(IronAgeArchitecture.MODID + ".dark_oak_soffit");
GameRegistry.register(SOFFIT);
}
if (ArchitectureConfig.fireplaces) registerFireplaces();
EraCatalog.assignPrimaryTabs();
}
private static void registerFireplaces() {
for (FireplaceBlock.Masonry masonry : FireplaceBlock.Masonry.values()) {
for (FireplaceBlock.Kind kind : FireplaceBlock.Kind.values()) {
if (kind == FireplaceBlock.Kind.COLLAR && !ArchitectureConfig.clayTiles) continue;
String name = "fireplace_" + masonry.key + "_" + kind.name().toLowerCase(java.util.Locale.ROOT);
FireplaceBlock part = block(new FireplaceBlock(masonry, kind), name);
item(part, new FireplaceItem(part));
FIREPLACES.add(part);
}
}
}

public static FireplaceBlock fireplace(FireplaceBlock.Masonry masonry, FireplaceBlock.Kind kind) {
for (FireplaceBlock block : FIREPLACES)
if (block.masonry == masonry && block.kind == kind) return block;
throw new IllegalArgumentException("Unregistered fireplace part " + masonry + " " + kind);
}

private static GutterItem gutter(String name, boolean outlet) {
GutterItem item = new GutterItem(outlet);
item.setRegistryName(new ResourceLocation(IronAgeArchitecture.MODID, name));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

/** Complete content-family switches. Framed panels require the cob family. */
public final class ArchitectureConfig {
public static boolean cob, frames, thatch, slate, windows, clayTiles;
public static boolean cob, frames, thatch, slate, windows, clayTiles, fireplaces;
public static EraSelection survivalEras=EraSelection.parse("all");
private ArchitectureConfig() { }
public static void load(File file) {
Expand All @@ -17,6 +17,7 @@ public static void load(File file) {
thatch = config.getBoolean("thatch", "blocks", true, "Thatch slopes and ridge caps.");
slate = config.getBoolean("slate", "blocks", true, "Crafted slate slopes and ridge caps.");
clayTiles = config.getBoolean("clayTiles", "blocks", true, "Clay tile roofs, ridge caps and hanging tiles.");
fireplaces = config.getBoolean("fireplaces", "blocks", true, "Hearths, fireboxes, surrounds and chimney parts.");
net.minecraftforge.common.config.Property eras=config.get("recipes","survivalEras",new String[]{"all"},
"Allowed survival palettes: all, iron_age, late_medieval_tudor. Select one or more IDs. An empty list disables Architecture recipes. Shared materials stay craftable when any selected era uses them. Does not hide creative items or remove existing blocks. Restart required.");
eras.setRequiresMcRestart(true);
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.fireplaces) registerFireplaces();
if (ArchitectureConfig.clayTiles) {
registerGuttering();
shaped(new ItemStack(ArchitectureBlocks.SOFFIT, 4), "D", "D", 'D', new ItemStack(Blocks.WOODEN_SLAB, 1, 5));
Expand Down Expand Up @@ -56,6 +57,25 @@ public static void register() {
}
}
}
private static void registerFireplaces() {
for (FireplaceBlock.Masonry masonry : FireplaceBlock.Masonry.values()) {
Block material = masonry == FireplaceBlock.Masonry.BRICK ? Blocks.BRICK_BLOCK : Blocks.STONEBRICK;
FireplaceBlock hearth = ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.HEARTH);
FireplaceBlock flue = ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.FLUE);
shaped(new ItemStack(hearth, 4), "M ", " M", 'M', material);
shaped(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.JAMB), 4), "M", "M", 'M', material);
shaped(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.LINTEL), 4), "MM", 'M', material);
shaped(new ItemStack(flue, 4), "M M", "M M", "M M", 'M', material);
shapeless(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.FIREBOX)), hearth, Blocks.IRON_BARS);
shapeless(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.POT_CAP)), flue, Items.FLOWER_POT);
shapeless(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.SLAB_CAP)), flue, new ItemStack(Blocks.STONE_SLAB));
if (ArchitectureConfig.clayTiles) {
Block claySlope = Block.getBlockFromName(IronAgeArchitecture.MODID + ":clay_tile_roof");
shapeless(new ItemStack(ArchitectureBlocks.fireplace(masonry, FireplaceBlock.Kind.COLLAR)), flue, claySlope);
}
}
}

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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;

/** Permanent building components in the Iron Age series. */
@Mod(modid = IronAgeArchitecture.MODID, name = "Iron Age Architecture", version = "0.1.12.110021",
@Mod(modid = IronAgeArchitecture.MODID, name = "Iron Age Architecture", version = "0.1.13.110021",
acceptedMinecraftVersions = "[1.10.2]", dependencies = "required-after:Forge@[12.18.3.2511,)")
public final class IronAgeArchitecture {
public static final String MODID = "ironagearchitecture";
Expand Down
Loading
Loading