From b7098efcfb9e240248e55b1134b3b6d033c12e13 Mon Sep 17 00:00:00 2001 From: eerussianguy Date: Sun, 3 Nov 2024 18:24:26 -0500 Subject: [PATCH] - Made behavior of uninsulated top ovens more consistent. Now they will heat items, but only to half the requested temperature. - Added a note about the max greenhouse size to the book. - Replaced uses of the Empty Jar With Lid item with a tag internally. --- CHANGELOG.md | 6 ++--- resources/constants.py | 2 +- resources/data.py | 2 +- resources/generate_book.py | 2 ++ resources/lang/en_us.json | 1 + resources/recipes.py | 2 +- .../JarringStationBlockEntity.java | 6 ++--- .../blockentities/OvenTopBlockEntity.java | 17 +++++++++--- .../common/blockentities/VatBlockEntity.java | 3 +-- .../common/blocks/AbstractOvenBlock.java | 2 +- .../common/blocks/JarringStationBlock.java | 4 +-- .../firmalife/common/blocks/OvenTopBlock.java | 25 ------------------ .../firmalife/common/blocks/VatBlock.java | 4 +-- .../assets/firmalife/lang/en_us.json | 2 +- .../textures/block/clay_oven_top.png | Bin 836 -> 859 bytes .../entries/firmalife/climate_station.json | 4 +++ 16 files changed, 37 insertions(+), 45 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9a2f96b..f5280f51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ ### Changes -- Buff rennet drops -- Add config for classic sprinkler behavior -- Disallow knapping with rotten pumpkins \ No newline at end of file +- Made behavior of uninsulated top ovens more consistent. Now they will heat items, but only to half the requested temperature. +- Added a note about the max greenhouse size to the book. +- Replaced uses of the Empty Jar With Lid item with a tag internally. \ No newline at end of file diff --git a/resources/constants.py b/resources/constants.py index 7b2ee62d..8ec29522 100644 --- a/resources/constants.py +++ b/resources/constants.py @@ -297,7 +297,7 @@ class Wood(NamedTuple): 'firmalife.jade.cook_left': '%s: %s', 'firmalife.jade.cook_left_temp': '%s: %s (%s)', 'firmalife.jade.boiling': 'Boiling', - 'firmalife.jade.not_insulated': 'Not insulated!', + 'firmalife.jade.not_insulated': 'Not insulated! Items can only heat half as hot!', 'firmalife.jade.no_chimney': 'Missing chimney!', 'firmalife.jade.needs_peel': 'Needs peel item to safely remove goods', 'firmalife.jade.has_firepit': 'Has an eligible firepit', diff --git a/resources/data.py b/resources/data.py index 26fc328f..723eb8ef 100644 --- a/resources/data.py +++ b/resources/data.py @@ -204,7 +204,7 @@ def generate(rm: ResourceManager): ### MISC DATA ### global_loot_modifiers(rm, 'firmalife:fruit_leaf', 'firmalife:rennet', 'firmalife:rennet_three', 'firmalife:ice_shavings') - global_loot_modifier(rm, 'rennet', 'firmalife:add_item', {'item': item_stack-_codec('4 firmalife:rennet')}, match_entity_tag('firmalife:drops_rennet')) + global_loot_modifier(rm, 'rennet', 'firmalife:add_item', {'item': item_stack_codec('4 firmalife:rennet')}, match_entity_tag('firmalife:drops_rennet')) global_loot_modifier(rm, 'rennet_three', 'firmalife:add_item', {'item': item_stack_codec('6 firmalife:rennet')}, match_entity_tag('firmalife:drops_three_rennet')) global_loot_modifier(rm, 'fruit_leaf', 'firmalife:add_item', {'item': item_stack_codec('firmalife:fruit_leaf'), 'chance': 0.5}, match_block_ingredient('firmalife:drops_fruit_leaf')) global_loot_modifier(rm, 'ice_shavings', 'firmalife:add_item', {'item': item_stack_codec('firmalife:ice_shavings')}, match_block_ingredient('firmalife:drops_ice_shavings')) diff --git a/resources/generate_book.py b/resources/generate_book.py index eab9ab2a..abc1ea02 100644 --- a/resources/generate_book.py +++ b/resources/generate_book.py @@ -106,6 +106,8 @@ def make_book(rm: ResourceManager, i18n: I18n, local_instance: bool = False, rev multimultiblock('The climate station in its valid and invalid state.', *[block_spotlight('', '', 'firmalife:climate_station[stasis=%s]' % b) for b in ('true', 'false')]), text('$(li)It updates periodically on its own, or when placed/broken.$()$(li)When a climate station updates, it tells all the blocks inside the multiblock that they can operate. For example, it lets $(l:firmalife/cheese)Cheese$() begin aging.$()$(li)Press $(item)$(k:key.use)$() to force update the Climate Station and the blocks inside the multiblock.', 'Climate Station Tips'), crafting('firmalife:crafting/climate_station', text_contents='The climate station is crafted like this.'), + text('A note about greenhouse construction: The largest greenhouse is 31x31x31, centered on the climate station, or 15 blocks in each direction. Centering the climate station in the greenhouse will allow you to take advantage of the full size range. You can also internally subdivide a greenhouse into multiple by using walls and multiple climate stations to make it larger.'), + empty_last_page(), )), entry('cellar', 'Cellars', 'firmalife:sealed_bricks', pages=( text('The $(thing)Cellar$() is a multiblock device controlled by a $(l:firmalife/climate_station)Climate Station$(). The Cellar multiblock\'s only requirement is that it be in an enclosed area surrounded by $(thing)Sealed Bricks$() or $(thing)Sealed Brick Doors$() on all sides. The Climate Station must be placed on the first level of the cellar, touching a wall.'), diff --git a/resources/lang/en_us.json b/resources/lang/en_us.json index 61f302ac..c9100427 100644 --- a/resources/lang/en_us.json +++ b/resources/lang/en_us.json @@ -23,6 +23,7 @@ "$(li)It updates periodically on its own, or when placed/broken.$()$(li)When a climate station updates, it tells all the blocks inside the multiblock that they can operate. For example, it lets $(l:firmalife/cheese)Cheese$() begin aging.$()$(li)Press $(item)$(k:key.use)$() to force update the Climate Station and the blocks inside the multiblock.": "$(li)It updates periodically on its own, or when placed/broken.$()$(li)When a climate station updates, it tells all the blocks inside the multiblock that they can operate. For example, it lets $(l:firmalife/cheese)Cheese$() begin aging.$()$(li)Press $(item)$(k:key.use)$() to force update the Climate Station and the blocks inside the multiblock.", "Climate Station Tips": "Climate Station Tips", "The climate station is crafted like this.": "The climate station is crafted like this.", + "A note about greenhouse construction: The largest greenhouse is 31x31x31, centered on the climate station, or 15 blocks in each direction. Centering the climate station in the greenhouse will allow you to take advantage of the full size range. You can also internally subdivide a greenhouse into multiple by using walls and multiple climate stations to make it larger.": "A note about greenhouse construction: The largest greenhouse is 31x31x31, centered on the climate station, or 15 blocks in each direction. Centering the climate station in the greenhouse will allow you to take advantage of the full size range. You can also internally subdivide a greenhouse into multiple by using walls and multiple climate stations to make it larger.", "Cellars": "Cellars", "The $(thing)Cellar$() is a multiblock device controlled by a $(l:firmalife/climate_station)Climate Station$(). The Cellar multiblock's only requirement is that it be in an enclosed area surrounded by $(thing)Sealed Bricks$() or $(thing)Sealed Brick Doors$() on all sides. The Climate Station must be placed on the first level of the cellar, touching a wall.": "The $(thing)Cellar$() is a multiblock device controlled by a $(l:firmalife/climate_station)Climate Station$(). The Cellar multiblock's only requirement is that it be in an enclosed area surrounded by $(thing)Sealed Bricks$() or $(thing)Sealed Brick Doors$() on all sides. The Climate Station must be placed on the first level of the cellar, touching a wall.", "An Example Cellar": "An Example Cellar", diff --git a/resources/recipes.py b/resources/recipes.py index 6c6c1ebf..80372949 100644 --- a/resources/recipes.py +++ b/resources/recipes.py @@ -175,7 +175,7 @@ def chisel_stair_slab(name: str, ingredient: str): for jar, remainder, ing in JARS: make_jar(rm, jar, remainder, ing) for fruit in FL_FRUITS: - ing = not_rotten(has_trait('firmalife:food/%s' % fruit, 'firmalife:dried', True)) + ing = not_rotten(lacks_trait('firmalife:food/%s' % fruit, 'firmalife:dried')) vat_recipe(rm, '%s_jar' % fruit, ing, '500 firmalife:sugar_water', jar='firmalife:jar/%s' % fruit, output_texture='firmalife:block/jar/%s' % fruit) for count in (2, 3, 4): rm.recipe(('pot', 'jam_%s_%s' % (fruit, count)), 'tfc:pot_jam', { diff --git a/src/main/java/com/eerussianguy/firmalife/common/blockentities/JarringStationBlockEntity.java b/src/main/java/com/eerussianguy/firmalife/common/blockentities/JarringStationBlockEntity.java index faf5c03f..418be83e 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blockentities/JarringStationBlockEntity.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blockentities/JarringStationBlockEntity.java @@ -11,9 +11,9 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.items.ItemStackHandler; +import net.dries007.tfc.common.TFCTags; import net.dries007.tfc.common.blockentities.TickableInventoryBlockEntity; import net.dries007.tfc.common.capabilities.PartialItemHandler; -import net.dries007.tfc.common.items.TFCItems; import net.dries007.tfc.util.Helpers; public class JarringStationBlockEntity extends TickableInventoryBlockEntity @@ -30,7 +30,7 @@ public static void tick(Level level, BlockPos pos, BlockState state, JarringStat final ItemStack jars = vat.getOutput(); for (int i = 0; i < SLOTS; i++) { - if (station.inventory.getStackInSlot(i).getItem() == TFCItems.EMPTY_JAR_WITH_LID.get()) + if (Helpers.isItem(station.inventory.getStackInSlot(i).getItem(), TFCTags.Items.EMPTY_JAR_WITH_LID)) { Helpers.playSound(level, pos, SoundEvents.BOTTLE_FILL); station.inventory.setStackInSlot(i, jars.split(1)); @@ -70,7 +70,7 @@ public void setAndUpdateSlots(int slot) @Override public boolean isItemValid(int slot, ItemStack stack) { - return Helpers.isItem(stack, TFCItems.EMPTY_JAR_WITH_LID.get()); + return Helpers.isItem(stack, TFCTags.Items.EMPTY_JAR_WITH_LID); } @Override diff --git a/src/main/java/com/eerussianguy/firmalife/common/blockentities/OvenTopBlockEntity.java b/src/main/java/com/eerussianguy/firmalife/common/blockentities/OvenTopBlockEntity.java index 2834e8e5..d516b0f3 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blockentities/OvenTopBlockEntity.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blockentities/OvenTopBlockEntity.java @@ -1,5 +1,6 @@ package com.eerussianguy.firmalife.common.blockentities; +import com.eerussianguy.firmalife.common.blocks.OvenTopBlock; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; @@ -64,6 +65,7 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, OvenT if (level.getGameTime() % updateInterval == 0) { OvenLike.regularBlockUpdate(level, pos, state, oven, cured, updateInterval); + oven.isInsulated = ((OvenTopBlock) state.getBlock()).isInsulated(level, pos, state); } oven.tickTemperature(); if ((level.getGameTime() + 20) % 40 == 0) @@ -80,10 +82,11 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, OvenT { inputStack.getCapability(HeatCapability.CAPABILITY).ifPresent(cap -> { // Always heat up the item regardless if it is melting or not - if (cap.getTemperature() < oven.temperature) + final float targetTemp = oven.isInsulated ? oven.temperature : oven.temperature * 0.5f; + if (cap.getTemperature() < targetTemp) { - final float modifier = FoodCapability.hasTrait(inputStack, FLFoodTraits.OVEN_BAKED) ? 2f : 2 + oven.temperature + 0.0025f; // Breaks even at 400 C - HeatCapability.addTemp(cap, oven.temperature, modifier); + final float modifier = FoodCapability.hasTrait(inputStack, FLFoodTraits.OVEN_BAKED) ? 2f : 2 + targetTemp + 0.0025f; // Breaks even at 400 C + HeatCapability.addTemp(cap, targetTemp, modifier); } final WrappedHeatingRecipe recipe = oven.cachedRecipes[slot]; @@ -120,6 +123,7 @@ public static void serverTick(Level level, BlockPos pos, BlockState state, OvenT private final WrappedHeatingRecipe[] cachedRecipes; private int[] cookTicks; private int cureTicks; + private boolean isInsulated = false; public OvenTopBlockEntity(BlockPos pos, BlockState state) { @@ -138,6 +142,7 @@ public void loadAdditional(CompoundTag nbt) { cookTicks = nbt.getIntArray("cookTicks"); cureTicks = nbt.getInt("cureTicks"); + isInsulated = nbt.getBoolean("isInsulated"); needsRecipeUpdate = true; super.loadAdditional(nbt); } @@ -147,6 +152,7 @@ public void saveAdditional(CompoundTag nbt) { nbt.putIntArray("cookTicks", cookTicks); nbt.putInt("cureTicks", cureTicks); + nbt.putBoolean("isInsulated", isInsulated); super.saveAdditional(nbt); } @@ -242,6 +248,11 @@ public void extinguish() targetTemperatureStabilityTicks = 0; } + public void setInsulated(boolean insulated) + { + this.isInsulated = insulated; + } + public int getTicksLeft(int slot) { assert level != null; diff --git a/src/main/java/com/eerussianguy/firmalife/common/blockentities/VatBlockEntity.java b/src/main/java/com/eerussianguy/firmalife/common/blockentities/VatBlockEntity.java index ca9f9a7c..1de670b3 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blockentities/VatBlockEntity.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blockentities/VatBlockEntity.java @@ -23,7 +23,6 @@ import net.dries007.tfc.common.blockentities.InventoryBlockEntity; import net.dries007.tfc.common.capabilities.InventoryFluidTank; import net.dries007.tfc.common.capabilities.PartialItemHandler; -import net.dries007.tfc.common.items.TFCItems; import net.dries007.tfc.util.Helpers; public class VatBlockEntity extends BoilingBlockEntity @@ -126,7 +125,7 @@ public void handleJarring() { final FluidStack fluid = inventory.getFluidInTank(0); final ItemStack stack = inventory.getStackInSlot(0); - if (fluid.hasTag() && fluid.getTag().contains("fruit", Tag.TAG_COMPOUND) && Helpers.isItem(stack, TFCItems.EMPTY_JAR_WITH_LID.get())) + if (fluid.hasTag() && fluid.getTag().contains("fruit", Tag.TAG_COMPOUND) && Helpers.isItem(stack, TFCTags.Items.EMPTY_JAR_WITH_LID)) { final int jars = stack.getCount(); final int maxFill = fluid.getAmount() / 500; diff --git a/src/main/java/com/eerussianguy/firmalife/common/blocks/AbstractOvenBlock.java b/src/main/java/com/eerussianguy/firmalife/common/blocks/AbstractOvenBlock.java index a583679c..eeee2fc5 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blocks/AbstractOvenBlock.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blocks/AbstractOvenBlock.java @@ -115,7 +115,7 @@ public void animateTick(BlockState state, Level level, BlockPos pos, RandomSourc pos = pos.offset(Helpers.triangle(random, 3), random.nextInt(3), Helpers.triangle(random, 3)); if (level.getBlockState(pos).isAir()) { - FLClientHelpers.randomParticle(ParticleTypes.CAMPFIRE_COSY_SMOKE, random, pos, level, 0.3f); + FLClientHelpers.randomParticle(ParticleTypes.CAMPFIRE_COSY_SMOKE, random, pos, level, 0.05f); } } } diff --git a/src/main/java/com/eerussianguy/firmalife/common/blocks/JarringStationBlock.java b/src/main/java/com/eerussianguy/firmalife/common/blocks/JarringStationBlock.java index 3f345241..e88a1ad4 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blocks/JarringStationBlock.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blocks/JarringStationBlock.java @@ -15,8 +15,8 @@ import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; +import net.dries007.tfc.common.TFCTags; import net.dries007.tfc.common.blocks.ExtendedProperties; -import net.dries007.tfc.common.items.TFCItems; import net.dries007.tfc.util.Helpers; public class JarringStationBlock extends FourWayDeviceBlock @@ -38,7 +38,7 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player { return FLHelpers.takeOneAny(level, 0, JarringStationBlockEntity.SLOTS - 1, inv, player); } - else if (Helpers.isItem(item, TFCItems.EMPTY_JAR_WITH_LID.get())) + else if (Helpers.isItem(item, TFCTags.Items.EMPTY_JAR_WITH_LID)) { return FLHelpers.insertOneAny(level, item, 0, JarringStationBlockEntity.SLOTS - 1, inv, player); } diff --git a/src/main/java/com/eerussianguy/firmalife/common/blocks/OvenTopBlock.java b/src/main/java/com/eerussianguy/firmalife/common/blocks/OvenTopBlock.java index 9e91aa69..75c7d3bc 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blocks/OvenTopBlock.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blocks/OvenTopBlock.java @@ -5,7 +5,6 @@ import com.eerussianguy.firmalife.common.items.FinishItem; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; -import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; @@ -13,7 +12,6 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockGetter; import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; @@ -94,21 +92,6 @@ public void animateTick(BlockState state, Level level, BlockPos pos, RandomSourc } } - @Override - @SuppressWarnings("deprecation") - public BlockState updateShape(BlockState state, Direction facing, BlockState facingState, LevelAccessor level, BlockPos currentPos, BlockPos facingPos) - { - extinguish(level, currentPos, state); - return super.updateShape(state, facing, facingState, level, currentPos, facingPos); - } - - @Override - @SuppressWarnings("deprecation") - public void randomTick(BlockState state, ServerLevel level, BlockPos pos, RandomSource rand) - { - extinguish(level, pos, state); - } - @Override public void cure(Level level, BlockState state, BlockPos pos) { @@ -117,12 +100,4 @@ public void cure(Level level, BlockState state, BlockPos pos) OvenTopBlockEntity.cure(level, state, getCured().defaultBlockState(), pos); } } - - private void extinguish(LevelAccessor level, BlockPos pos, BlockState state) - { - if (!isInsulated(level, pos, state)) - { - level.getBlockEntity(pos, FLBlockEntities.OVEN_TOP.get()).ifPresent(OvenTopBlockEntity::extinguish); - } - } } diff --git a/src/main/java/com/eerussianguy/firmalife/common/blocks/VatBlock.java b/src/main/java/com/eerussianguy/firmalife/common/blocks/VatBlock.java index b29e4409..32ac56f6 100644 --- a/src/main/java/com/eerussianguy/firmalife/common/blocks/VatBlock.java +++ b/src/main/java/com/eerussianguy/firmalife/common/blocks/VatBlock.java @@ -20,11 +20,11 @@ import net.minecraftforge.items.ItemHandlerHelper; import net.dries007.tfc.client.particle.TFCParticles; +import net.dries007.tfc.common.TFCTags; import net.dries007.tfc.common.blocks.ExtendedProperties; import net.dries007.tfc.common.blocks.devices.SealableDeviceBlock; import net.dries007.tfc.common.capabilities.Capabilities; import net.dries007.tfc.common.fluids.FluidHelpers; -import net.dries007.tfc.common.items.TFCItems; import net.dries007.tfc.util.Helpers; public class VatBlock extends SealableDeviceBlock @@ -92,7 +92,7 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player { if (vat.hasOutput()) { - if (stack.getItem() == TFCItems.EMPTY_JAR_WITH_LID.get()) + if (Helpers.isItem(stack, TFCTags.Items.EMPTY_JAR_WITH_LID)) { stack.shrink(1); ItemHandlerHelper.giveItemToPlayer(player, vat.takeOutput()); diff --git a/src/main/resources/assets/firmalife/lang/en_us.json b/src/main/resources/assets/firmalife/lang/en_us.json index 020e51a8..d5fe08dc 100644 --- a/src/main/resources/assets/firmalife/lang/en_us.json +++ b/src/main/resources/assets/firmalife/lang/en_us.json @@ -846,7 +846,7 @@ "firmalife.jade.cook_left": "%s: %s", "firmalife.jade.cook_left_temp": "%s: %s (%s)", "firmalife.jade.boiling": "Boiling", - "firmalife.jade.not_insulated": "Not insulated!", + "firmalife.jade.not_insulated": "Not insulated! Items can only heat half as hot!", "firmalife.jade.no_chimney": "Missing chimney!", "firmalife.jade.needs_peel": "Needs peel item to safely remove goods", "firmalife.jade.has_firepit": "Has an eligible firepit", diff --git a/src/main/resources/assets/firmalife/textures/block/clay_oven_top.png b/src/main/resources/assets/firmalife/textures/block/clay_oven_top.png index 971cb77b8eee855232e60fc2eb157e4d5fc8875b..f21bce12037362b56c0d1c692a739d866314f9e9 100644 GIT binary patch delta 434 zcmV;j0ZsnI2HOU(v;lvTNkl{w!`t?yXe=3SJ}a%7;dd~q^Sg8u~_gozAk^4-Cb2ELSr=hV&tppC{li`W-fXaC4R>xfwiX7_y1DxKi{s(iw{CrIlD!R|Q+QiyPEJoz zg`)iSona!lyg2VY^$Q<9T|Jbm#-cGz4uL0IXa7qExV$*;og6&}=t2y(C40O(d)pgC zV4cM}+h!1n&fhkWeiwkCs@KZf3i!KK4Z&J*H+W89oh2&i$2$uo{TS;k!F)E|nGDU& c%x6;`0g>me1dzg?V*mgE07*qoM6N<$g8Q7)X#fBK delta 411 zcmV;M0c8H$2E+!iv;lv6Nkl# z?3-OK(Ia$`Y=SS7wR43e#WO@`WOqgocOhApoREa}t!C!U|K@*he(&e6t1UoY7)Bw) zN5|~2F{WMTg<+OSNaQENtN3P5R0%QG2MIfr$Yvgsn2X0@7ZRKI`yg3@aLw1`?xB=MdXb%(*u^U4@j zYfD}jK7JVXJg=J94*5|C!J#LB-%3%MTHvQymUt-F~MqWA+9|E%reQ@>50b+xV&C$OF!&o=I4bW zFAUb%SBnA8PES1XRB?ZI&#unbTA{V#^JM&LaaUxPNvyM2XX`nT2fy$ZlvZTT9Qcpb zUirNO7w11bnMxi?TU+=a`0bqktH86_e diff --git a/src/main/resources/assets/tfc/patchouli_books/field_guide/en_us/entries/firmalife/climate_station.json b/src/main/resources/assets/tfc/patchouli_books/field_guide/en_us/entries/firmalife/climate_station.json index 11a001f7..8d8139eb 100644 --- a/src/main/resources/assets/tfc/patchouli_books/field_guide/en_us/entries/firmalife/climate_station.json +++ b/src/main/resources/assets/tfc/patchouli_books/field_guide/en_us/entries/firmalife/climate_station.json @@ -49,6 +49,10 @@ "type": "patchouli:crafting", "recipe": "firmalife:crafting/climate_station", "text": "The climate station is crafted like this." + }, + { + "type": "patchouli:text", + "text": "A note about greenhouse construction: The largest greenhouse is 31x31x31, centered on the climate station, or 15 blocks in each direction. Centering the climate station in the greenhouse will allow you to take advantage of the full size range. You can also internally subdivide a greenhouse into multiple by using walls and multiple climate stations to make it larger." } ], "read_by_default": true,