Compare commits

...
4 Commits
Author SHA1 Message Date
Guillaume Mercier cf8f2f54c5 Add fertilizer registry (#112) 2026-04-01 20:02:06 +02:00
4844bc937b Fix alveary climate change calculations (#109)
Co-authored-by: Martin Robertz <[email protected]>
Co-authored-by: UltraProdigy <[email protected]>
2026-03-14 08:12:51 +00:00
Alexdoru 88f50d91e1 BFS leaf decay (#111) 2026-03-13 16:50:52 +01:00
Alexdoru 3bc6720dec Prevent loading chunks while ticking blocks (#110) 2026-03-12 21:33:00 +01:00
16 changed files with 182 additions and 234 deletions

No files matched your search

+1
View File
@@ -1,6 +1,7 @@
// Add your dependencies here
dependencies {
api("com.github.GTNewHorizons:GTNHLib:0.9.41:dev")
api('curse.maven:cofh-lib-220333:2388748')
compileOnlyApi('com.github.GTNewHorizons:Angelica:1.0.0-beta68a:api')
devOnlyNonPublishable('com.github.GTNewHorizons:NotEnoughItems:2.8.70-GTNH:dev')
+2 -1
View File
@@ -57,7 +57,8 @@ import forestry.plugins.PluginManager;
name = Constants.MOD,
version = Constants.VERSION,
guiFactory = "forestry.core.config.ForestryGuiConfigFactory",
dependencies = "required-after:Forge@[10.13.4.1566,);" + "after:Buildcraft|Core@[6.1.7,);"
dependencies = "required-after:Forge@[10.13.4.1566,);" + "required-after:gtnhlib@[0.9.41,);"
+ "after:Buildcraft|Core@[6.1.7,);"
+ "after:ExtrabiomesXL;"
+ "after:BiomesOPlenty;"
+ "after:IC2@[2.0.140,);"
@@ -0,0 +1,40 @@
package forestry.api.multiblock;
import java.util.Collection;
import net.minecraft.item.ItemStack;
public interface IFarmFertilizerRegistry {
/**
* Gets a list of all fertilizer stacks in the registry.
*
* @return The current fertilizer registry.
*/
Collection<ItemStack> getFertilizers();
/**
* Adds a new fertilizer to the registry.
*
* @apiNote The stack size doesn't matter it always consumes 1.
* @apiNote You can use OreDictionary.WILDCARD_VALUE to specific that any meta of the item will be ok.
*
* @param itemstack The item to add to the registry.
*/
void addFertilizer(ItemStack itemstack);
/**
* Removes a fertilizer from the fretilizer registry.
*
* @param itemstack The item to remove from the registry.
*/
void removeFertilizer(ItemStack itemstack);
/**
* Checks if an item is a usable multi-farm fertilizer.
*
* @param itemstack - The stack to check with.
* @return True if the item is a fertilizer item.
*/
boolean isFertilizer(ItemStack itemstack);
}
@@ -8,4 +8,6 @@ package forestry.api.multiblock;
public class MultiblockManager {
public static IMultiblockLogicFactory logicFactory;
public static IFarmFertilizerRegistry farmFertilizerRegistry;
}
@@ -250,8 +250,9 @@ public class AlvearyController extends RectangularMultiblockControllerBase
private float applyChange(float base, float currentChange, float extraChange, float boundaryDown,
float boundaryUp) {
float boundedNewChange = Math.max(boundaryDown, Math.min(base + currentChange + (extraChange * 20), boundaryUp))
- base;
float boundedNewChange = Math.round(
(Math.max(boundaryDown, Math.min(base + currentChange + (extraChange * 20), boundaryUp)) - base) * 100)
/ 100.0f;
if (extraChange > 0) {
return Math.max(currentChange, boundedNewChange);
} else {
@@ -355,12 +356,13 @@ public class AlvearyController extends RectangularMultiblockControllerBase
@Override
public float getExactTemperature() {
ChunkCoordinates coords = getReferenceCoord();
return getBiome().getFloatTemperature(coords.posX, coords.posY, coords.posZ) + tempChange;
return Math.round((getBiome().getFloatTemperature(coords.posX, coords.posY, coords.posZ) + tempChange) * 100)
/ 100.0f;
}
@Override
public float getExactHumidity() {
return getBiome().rainfall + humidChange;
return Math.round((getBiome().rainfall + humidChange) * 100) / 100.0f;
}
@Override
@@ -1,145 +0,0 @@
package forestry.arboriculture;
import net.minecraft.block.Block;
import net.minecraft.block.BlockLeaves;
import net.minecraft.world.World;
/** Based on vanilla leaf decay, but accepts leaves that are connected further from a trunk */
public abstract class LeafDecayHelper {
private static final short SUSTAINS_LEAVES = 0;
private static final short NOT_SUSTAINS_LEAVES = -1;
private static final short IS_LEAVES = -2;
private static int[] leafDecayValues;
public static void leafDecay(BlockLeaves leaves, World world, int x, int y, int z) {
if (world.isRemote) {
return;
}
int leafMeta = world.getBlockMetadata(x, y, z);
if ((leafMeta & 8) != 0 && (leafMeta & 4) == 0) {
byte radius = 4;
byte yArrayMult = 32;
int xArrayMult = yArrayMult * yArrayMult;
int arrayOffset = yArrayMult / 2;
if (leafDecayValues == null) {
leafDecayValues = new int[yArrayMult * yArrayMult * yArrayMult];
}
int radius1 = radius + 1;
if (world.checkChunksExist(x - radius1, y - radius1, z - radius1, x + radius1, y + radius1, z + radius1)) {
for (int xOffset = -radius; xOffset <= radius; ++xOffset) {
for (int yOffset = -radius; yOffset <= radius; ++yOffset) {
for (int zOffset = -radius; zOffset <= radius; ++zOffset) {
Block block = world.getBlock(x + xOffset, y + yOffset, z + zOffset);
if (!block.canSustainLeaves(world, x + xOffset, y + yOffset, z + zOffset)) {
if (block.isLeaves(world, x + xOffset, y + yOffset, z + zOffset)) {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] = IS_LEAVES;
} else {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] = NOT_SUSTAINS_LEAVES;
}
} else {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] = SUSTAINS_LEAVES;
}
}
}
}
for (int sustainedValue = 1; sustainedValue <= 8; ++sustainedValue) {
for (int xOffset = -radius; xOffset <= radius; ++xOffset) {
for (int yOffset = -radius; yOffset <= radius; ++yOffset) {
for (int zOffset = -radius; zOffset <= radius; ++zOffset) {
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] == sustainedValue - 1) {
if (leafDecayValues[(xOffset + arrayOffset - 1) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset - 1) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] = sustainedValue;
}
if (leafDecayValues[(xOffset + arrayOffset + 1) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset + 1) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset] = sustainedValue;
}
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset - 1) * yArrayMult
+ zOffset
+ arrayOffset] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset - 1) * yArrayMult
+ zOffset
+ arrayOffset] = sustainedValue;
}
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset + 1) * yArrayMult
+ zOffset
+ arrayOffset] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset + 1) * yArrayMult
+ zOffset
+ arrayOffset] = sustainedValue;
}
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ (zOffset + arrayOffset - 1)] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ (zOffset + arrayOffset - 1)] = sustainedValue;
}
if (leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset
+ 1] == IS_LEAVES) {
leafDecayValues[(xOffset + arrayOffset) * xArrayMult
+ (yOffset + arrayOffset) * yArrayMult
+ zOffset
+ arrayOffset
+ 1] = sustainedValue;
}
}
}
}
}
}
}
int sustainValue = leafDecayValues[(arrayOffset * xArrayMult) + (arrayOffset * yArrayMult) + arrayOffset];
if (sustainValue >= 0) {
world.setBlockMetadataWithNotify(x, y, z, leafMeta & -9, 4); // stop trying to decay
} else {
leaves.dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
world.setBlockToAir(x, y, z);
}
}
}
}
@@ -34,6 +34,7 @@ import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import com.gtnewhorizon.gtnhlib.blocks.util.BFSLeafDecay;
import com.mojang.authlib.GameProfile;
import cpw.mods.fml.relauncher.Side;
@@ -48,7 +49,6 @@ import forestry.api.core.Tabs;
import forestry.api.lepidopterology.ButterflyManager;
import forestry.api.lepidopterology.EnumFlutterType;
import forestry.api.lepidopterology.IButterfly;
import forestry.arboriculture.LeafDecayHelper;
import forestry.arboriculture.genetics.TreeDefinition;
import forestry.arboriculture.items.ItemBlockLeaves;
import forestry.arboriculture.render.TextureLeaves;
@@ -230,7 +230,12 @@ public class BlockForestryLeaves extends BlockNewLeaf implements ITileEntityProv
return;
}
LeafDecayHelper.leafDecay(this, world, x, y, z);
if (!world.isRemote) {
final int meta = world.getBlockMetadata(x, y, z);
if ((meta & 8) != 0 && (meta & 4) == 0) {
BFSLeafDecay.handleDecayChecked(this, world, x, y, z, meta, 4);
}
}
// check leaves tile again because they can decay in super.updateTick
if (tileLeaves.isInvalid()) {
@@ -36,29 +36,29 @@ public class BlockFruitPod extends BlockCocoa {
}
public static TileFruitPod getPodTile(IBlockAccess world, int x, int y, int z) {
TileEntity tile = world.getTileEntity(x, y, z);
if (!(tile instanceof TileFruitPod)) {
return null;
final TileEntity tile = world.getTileEntity(x, y, z);
if (tile instanceof TileFruitPod) {
return (TileFruitPod) tile;
}
return (TileFruitPod) tile;
return null;
}
@Override
public void updateTick(World world, int x, int y, int z, Random rand) {
if (!world.checkChunksExist(x - 1, y, z - 1, x + 1, y, z + 1)) {
return;
}
if (!canBlockStay(world, x, y, z)) {
dropBlockAsItem(world, x, y, z, world.getBlockMetadata(x, y, z), 0);
final int meta = world.getBlockMetadata(x, y, z);
this.dropBlockAsItem(world, x, y, z, meta, 0);
world.setBlockToAir(x, y, z);
return;
}
TileFruitPod tile = getPodTile(world, x, y, z);
if (tile == null) {
return;
final TileFruitPod tile = getPodTile(world, x, y, z);
if (tile != null) {
tile.onBlockTick();
}
tile.onBlockTick();
}
@SuppressWarnings("deprecation")
@@ -84,31 +84,26 @@ public class BlockSoil extends Block implements IItemTyped {
}
@Override
public void updateTick(World world, int i, int j, int k, Random random) {
public void updateTick(World world, int x, int y, int z, Random random) {
if (world.isRemote) {
return;
}
int meta = world.getBlockMetadata(i, j, k);
int meta = world.getBlockMetadata(x, y, z);
SoilType type = getTypeFromMeta(meta);
if (type == SoilType.HUMUS) {
updateTickHumus(world, i, j, k);
if (world.checkChunksExist(x - 1, y + 1, z - 1, x + 1, y + 1, z + 1)) {
if (isEnrooted(world, x, y, z)) {
degradeSoil(world, x, y, z);
}
}
} else if (type == SoilType.BOG_EARTH) {
updateTickBogEarth(world, i, j, k);
}
}
private static void updateTickHumus(World world, int i, int j, int k) {
if (isEnrooted(world, i, j, k)) {
degradeSoil(world, i, j, k);
}
}
private static void updateTickBogEarth(World world, int i, int j, int k) {
if (isMoistened(world, i, j, k)) {
matureBog(world, i, j, k);
if (world.checkChunksExist(x - 2, y, z - 2, x + 2, y, z + 2)) {
if (isMoistened(world, x, y, z)) {
matureBog(world, x, y, z);
}
}
}
}
@@ -122,7 +117,6 @@ public class BlockSoil extends Block implements IItemTyped {
}
}
}
return false;
}
@@ -156,7 +150,6 @@ public class BlockSoil extends Block implements IItemTyped {
}
private static boolean isMoistened(World world, int x, int y, int z) {
for (int i = -2; i < 3; i++) {
for (int j = -2; j < 3; j++) {
Block block = world.getBlock(x + i, y, z + j);
@@ -165,7 +158,6 @@ public class BlockSoil extends Block implements IItemTyped {
}
}
}
return false;
}
@@ -193,7 +193,7 @@ public class BlockForestryFluid extends BlockFluidClassic {
super.updateTick(world, x, y, z, rand);
// Start fires if the fluid is lava-like
if (getMaterial() == Material.lava) {
if (getMaterial() == Material.lava && world.checkChunksExist(x - 4, y, z - 4, x + 4, y, z + 4)) {
int rangeUp = rand.nextInt(3);
for (int i = 0; i < rangeUp; ++i) {
@@ -72,51 +72,54 @@ public class BlockMushroom extends BlockSapling implements IItemTyped {
}
@Override
public void updateTick(World world, int i, int j, int k, Random random) {
public void updateTick(World world, int x, int y, int z, Random random) {
if (world.isRemote) {
return;
}
int meta = world.getBlockMetadata(i, j, k);
MushroomType type = getTypeFromMeta(meta);
int maturity = meta >> 2;
final int meta = world.getBlockMetadata(x, y, z);
final MushroomType type = getTypeFromMeta(meta);
final int maturity = meta >> 2;
tickGermling(world, i, j, k, random, type, maturity);
tickGermling(world, x, y, z, random, type, maturity);
}
private void tickGermling(World world, int i, int j, int k, Random random, MushroomType type, int maturity) {
int lightvalue = world.getBlockLightValue(i, j + 1, k);
private void tickGermling(World world, int x, int y, int z, Random random, MushroomType type, int maturity) {
if (random.nextInt(2) != 0) {
return;
}
if (maturity != 3) {
maturity = 3;
int matX = maturity << 2;
int meta = (matX | type.ordinal());
world.setBlockMetadataWithNotify(i, j, k, meta, Constants.FLAG_BLOCK_SYNCH);
} else if (lightvalue <= 7) {
func_149878_d(world, i, j, k, random);
final int matX = maturity << 2;
final int meta = (matX | type.ordinal());
world.setBlockMetadataWithNotify(x, y, z, meta, Constants.FLAG_BLOCK_SYNCH);
} else {
if (world.checkChunksExist(x - 1, y, z - 1, x + 1, y, z + 1)) {
final int lightvalue = world.getBlockLightValue(x, y + 1, z);
if (lightvalue <= 7) {
func_149878_d(world, x, y, z, random);
}
}
}
}
@Override
public void func_149878_d(World world, int i, int j, int k, Random random) {
MushroomType type = getTypeFromMeta(world.getBlockMetadata(i, j, k));
public void func_149878_d(World world, int x, int y, int z, Random random) {
MushroomType type = getTypeFromMeta(world.getBlockMetadata(x, y, z));
world.setBlockToAir(i, j, k);
if (!generators[type.ordinal()].generate(world, random, i, j, k)) {
world.setBlock(i, j, k, this, type.ordinal(), 0);
world.setBlockToAir(x, y, z);
if (!generators[type.ordinal()].generate(world, random, x, y, z)) {
world.setBlock(x, y, z, this, type.ordinal(), 0);
}
}
@Override
public MushroomType getTypeFromMeta(int meta) {
meta %= MushroomType.values().length;
return MushroomType.values()[meta];
return switch (meta % 2) {
case 0 -> MushroomType.BROWN;
case 1 -> MushroomType.RED;
default -> throw new IllegalStateException("Unexpected value: " + meta);
};
}
/* ICONS */
@@ -135,15 +138,10 @@ public class BlockMushroom extends BlockSapling implements IItemTyped {
@SideOnly(Side.CLIENT)
@Override
public IIcon getIcon(int side, int meta) {
MushroomType type = getTypeFromMeta(meta);
switch (type) {
case BROWN:
return Blocks.brown_mushroom.getIcon(side, meta);
case RED:
return Blocks.red_mushroom.getIcon(side, meta);
default:
return null;
}
final MushroomType type = getTypeFromMeta(meta);
return switch (type) {
case BROWN -> Blocks.brown_mushroom.getIcon(side, meta);
case RED -> Blocks.red_mushroom.getIcon(side, meta);
};
}
}
@@ -0,0 +1,50 @@
package forestry.farming.multiblock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import net.minecraft.item.ItemStack;
import forestry.api.multiblock.IFarmFertilizerRegistry;
import forestry.core.utils.ItemStackUtil;
public class FarmFertilizerRegistry implements IFarmFertilizerRegistry {
// the current list isn't big enough to require a hash map, and is faster as a list.
private final List<ItemStack> fertilizers = new ArrayList<>(5);
@Override
public Collection<ItemStack> getFertilizers() {
return fertilizers;
}
@Override
public void addFertilizer(ItemStack itemstack) {
// maybe throw warn? but could also be nice to leave as no warn for easier/cleaner optional mod dependencies
if (itemstack == null || itemstack.getItem() == null || itemstack.stackSize <= 0) return;
fertilizers.add(itemstack);
}
@Override
public void removeFertilizer(ItemStack itemstack) {
// maybe throw warn? but could also be nice to leave as no warn for easier/cleaner optional mod dependencies
if (itemstack == null || itemstack.getItem() == null) return;
fertilizers.removeIf(fert -> {
// in stack first so it wild card can be used for a wild-card clear.
return ItemStackUtil.isIdenticalItem(itemstack, fert);
});
}
@Override
public boolean isFertilizer(ItemStack itemstack) {
if (itemstack == null) return false;
for (ItemStack fert : this.fertilizers) {
// fert first to allow for wild card checks
if (ItemStackUtil.isIdenticalItem(fert, itemstack)) {
return true;
}
}
return false;
}
}
@@ -12,7 +12,6 @@ import java.util.Deque;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.fluids.Fluid;
@@ -21,6 +20,7 @@ import forestry.api.farming.FarmDirection;
import forestry.api.farming.IFarmInventory;
import forestry.api.farming.IFarmLogic;
import forestry.api.farming.IFarmable;
import forestry.api.multiblock.MultiblockManager;
import forestry.core.fluids.FluidHelper;
import forestry.core.fluids.TankManager;
import forestry.core.inventory.InventoryAdapterRestricted;
@@ -28,9 +28,6 @@ import forestry.core.inventory.wrappers.InventoryMapper;
import forestry.core.utils.InventoryUtil;
import forestry.core.utils.PlayerUtil;
import forestry.core.utils.SlotUtil;
import forestry.plugins.PluginCore;
import forestry.plugins.PluginManager;
import ic2.api.item.IC2Items;
public class InventoryFarm extends InventoryAdapterRestricted implements IFarmInventory {
@@ -134,18 +131,8 @@ public class InventoryFarm extends InventoryAdapterRestricted implements IFarmIn
@Override
public boolean acceptsAsFertilizer(ItemStack itemstack) {
if (itemstack == null) {
return false;
}
Item item = itemstack.getItem();
if (PluginManager.Module.INDUSTRIALCRAFT.isEnabled()) {
Item ic2fert = IC2Items.getItem("fertilizer").getItem();
if (ic2fert == item) {
return true;
}
}
return PluginCore.items.fertilizerCompound == item;
// check if it's a fertilizer
return MultiblockManager.farmFertilizerRegistry.isFertilizer(itemstack);
}
@Override
@@ -55,6 +55,7 @@ import forestry.core.recipes.RecipeUtil;
import forestry.core.tiles.MachineDefinition;
import forestry.core.utils.ClimateUtil;
import forestry.core.utils.ForestryModEnvWarningCallable;
import forestry.farming.multiblock.FarmFertilizerRegistry;
@Plugin(
pluginID = "Core",
@@ -85,6 +86,7 @@ public class PluginCore extends ForestryPlugin {
AlleleHelper.instance = new AlleleHelper();
MultiblockManager.logicFactory = new MultiblockLogicFactory();
MultiblockManager.farmFertilizerRegistry = new FarmFertilizerRegistry();
}
@Override
@@ -20,6 +20,7 @@ import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.oredict.OreDictionary;
import cpw.mods.fml.common.SidedProxy;
import cpw.mods.fml.common.event.FMLInterModComms.IMCMessage;
@@ -30,6 +31,7 @@ import forestry.api.circuits.CircuitSocketType;
import forestry.api.circuits.ICircuitLayout;
import forestry.api.farming.Farmables;
import forestry.api.farming.IFarmable;
import forestry.api.multiblock.MultiblockManager;
import forestry.core.circuits.Circuit;
import forestry.core.circuits.CircuitLayout;
import forestry.core.config.Constants;
@@ -402,5 +404,8 @@ public class PluginFarming extends ForestryPlugin {
layoutManual,
PluginCore.items.tubes.get(EnumElectronTube.LAPIS, 1),
Circuit.farmCocoaManual);
MultiblockManager.farmFertilizerRegistry
.addFertilizer(new ItemStack(PluginCore.items.fertilizerCompound, 1, OreDictionary.WILDCARD_VALUE));
}
}
@@ -32,6 +32,7 @@ import forestry.api.core.ForestryAPI;
import forestry.api.farming.Farmables;
import forestry.api.fuels.EngineBronzeFuel;
import forestry.api.fuels.FuelManager;
import forestry.api.multiblock.MultiblockManager;
import forestry.api.recipes.RecipeManagers;
import forestry.api.storage.BackpackManager;
import forestry.api.storage.IBackpackDefinition;
@@ -94,6 +95,7 @@ public class PluginIC2 extends ForestryPlugin {
private static ItemStack silver;
private static ItemStack brass;
private static ItemStack uuMatter;
private static ItemStack fertilizer;
public static ItemStack resin;
public static ItemStack rubberwood;
@@ -162,11 +164,13 @@ public class PluginIC2 extends ForestryPlugin {
brass = IC2Items.getItem("bronzeIngot");
uran238 = IC2Items.getItem("Uran238");
fertilizer = IC2Items.getItem("fertilizer");
Circuit.farmRubberManual = new CircuitFarmLogic("manualRubber", FarmLogicRubber.class);
ICircuitLayout layoutEngineTin = new CircuitLayout("engine.tin", CircuitSocketType.ELECTRIC_ENGINE);
ChipsetManager.circuitRegistry.registerLayout(layoutEngineTin);
}
@Override
@@ -378,6 +382,10 @@ public class PluginIC2 extends ForestryPlugin {
'V',
Blocks.piston);
}
if (PluginManager.Module.FARMING.isEnabled() && fertilizer != null) {
MultiblockManager.farmFertilizerRegistry.addFertilizer(fertilizer);
}
}
/**