Skip to content

Commit 1c0f5e7

Browse files
committed
Fix Tree Farm logic
1 parent a765724 commit 1c0f5e7

9 files changed

Lines changed: 325 additions & 11 deletions

File tree

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.github.gtexpert.gtbm.integration.forestry.farming;
2+
3+
import net.minecraft.item.ItemStack;
4+
5+
import gregtech.common.blocks.MetaBlocks;
6+
7+
import forestry.api.farming.IFarmProperties;
8+
import forestry.farming.logic.FarmLogicArboreal;
9+
10+
public class FarmLogicCEu extends FarmLogicArboreal {
11+
12+
public FarmLogicCEu(IFarmProperties properties, boolean isManual) {
13+
super(properties, isManual);
14+
}
15+
16+
@Override
17+
public String getUnlocalizedName() {
18+
return "gtbm.farm.ceu";
19+
}
20+
21+
@Override
22+
public ItemStack getIconItemStack() {
23+
return new ItemStack(MetaBlocks.RUBBER_SAPLING);
24+
}
25+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.github.gtexpert.gtbm.integration.forestry.farming;
2+
3+
import java.util.Collections;
4+
5+
import javax.annotation.Nullable;
6+
7+
import net.minecraft.block.Block;
8+
import net.minecraft.block.state.IBlockState;
9+
import net.minecraft.entity.player.EntityPlayer;
10+
import net.minecraft.init.Blocks;
11+
import net.minecraft.item.ItemStack;
12+
import net.minecraft.util.EnumActionResult;
13+
import net.minecraft.util.EnumFacing;
14+
import net.minecraft.util.EnumHand;
15+
import net.minecraft.util.math.BlockPos;
16+
import net.minecraft.world.World;
17+
18+
import forestry.api.farming.ICrop;
19+
import forestry.api.farming.IFarmable;
20+
import forestry.api.farming.IFarmableInfo;
21+
import forestry.core.network.packets.PacketFXSignal;
22+
import forestry.core.utils.NetworkUtil;
23+
import forestry.farming.logic.crops.CropDestroy;
24+
25+
public class FarmableGTRubberSapling implements IFarmable {
26+
27+
private final Block saplingBlock;
28+
private final ItemStack germling;
29+
private final ItemStack[] windfall;
30+
31+
public FarmableGTRubberSapling(Block saplingBlock, ItemStack[] windfall) {
32+
this.saplingBlock = saplingBlock;
33+
this.germling = new ItemStack(saplingBlock);
34+
this.windfall = windfall;
35+
}
36+
37+
@Override
38+
public boolean isSaplingAt(World world, BlockPos pos, IBlockState blockState) {
39+
return blockState.getBlock() == saplingBlock;
40+
}
41+
42+
@Nullable
43+
@Override
44+
public ICrop getCropAt(World world, BlockPos pos, IBlockState blockState) {
45+
Block block = blockState.getBlock();
46+
if (!block.isWood(world, pos)) {
47+
return null;
48+
}
49+
return new CropDestroy(world, blockState, pos);
50+
}
51+
52+
@Override
53+
public boolean isGermling(ItemStack itemstack) {
54+
return ItemStack.areItemsEqual(germling, itemstack);
55+
}
56+
57+
@Override
58+
public void addInformation(IFarmableInfo info) {
59+
info.addGermlings(Collections.singletonList(germling));
60+
info.addProducts(windfall);
61+
}
62+
63+
@Override
64+
public boolean isWindfall(ItemStack itemstack) {
65+
for (ItemStack drop : windfall) {
66+
if (drop.isItemEqual(itemstack)) {
67+
return true;
68+
}
69+
}
70+
return false;
71+
}
72+
73+
@Override
74+
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) {
75+
ItemStack copy = germling.copy();
76+
player.setHeldItem(EnumHand.MAIN_HAND, copy);
77+
EnumActionResult result = copy.onItemUse(player, world, pos.down(),
78+
EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
79+
player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY);
80+
if (result == EnumActionResult.SUCCESS) {
81+
PacketFXSignal packet = new PacketFXSignal(
82+
PacketFXSignal.SoundFXType.BLOCK_PLACE, pos,
83+
Blocks.SAPLING.getDefaultState());
84+
NetworkUtil.sendNetworkPacket(packet, pos, world);
85+
return true;
86+
}
87+
return false;
88+
}
89+
}

src/main/java/com/github/gtexpert/gtbm/integration/forestry/loaders/FFMFarmingLoader.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,29 @@
55
import gregtech.common.blocks.MetaBlocks;
66
import gregtech.common.items.MetaItems;
77

8+
import com.github.gtexpert.gtbm.integration.forestry.farming.FarmLogicCEu;
9+
import com.github.gtexpert.gtbm.integration.forestry.farming.FarmableGTRubberSapling;
10+
import com.github.gtexpert.gtbm.integration.forestry.util.ForestryFarmHelper;
11+
812
import forestry.api.core.ForestryAPI;
13+
import forestry.api.farming.IFarmProperties;
914
import forestry.api.farming.IFarmRegistry;
10-
import forestry.farming.logic.farmables.FarmableSapling;
15+
import forestry.core.items.EnumElectronTube;
1116

1217
public class FFMFarmingLoader {
1318

1419
public static void init() {
1520
IFarmRegistry farmRegistry = ForestryAPI.farmRegistry;
1621

17-
// GregTech Rubber Sapling
18-
farmRegistry.registerFarmables("farmArboreal",
19-
new FarmableSapling(new ItemStack(MetaBlocks.RUBBER_SAPLING), new ItemStack[0]));
22+
// GregTech Rubber tree farm
23+
IFarmProperties ceuFarm = ForestryFarmHelper.registerFarmType("farmCEu", FarmLogicCEu::new,
24+
EnumElectronTube.TIN);
25+
26+
String rubberId = "farmCEu.rubber";
27+
ceuFarm.registerFarmables(rubberId);
28+
farmRegistry.registerFarmables(rubberId,
29+
new FarmableGTRubberSapling(MetaBlocks.RUBBER_SAPLING,
30+
new ItemStack[] { MetaItems.STICKY_RESIN.getStackForm() }));
2031

2132
// GregTech Fertilizer
2233
farmRegistry.registerFertilizer(MetaItems.FERTILIZER.getStackForm(), 500);
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.github.gtexpert.gtbm.integration.forestry.util;
2+
3+
import java.util.function.BiFunction;
4+
5+
import net.minecraft.init.Blocks;
6+
import net.minecraft.item.ItemStack;
7+
8+
import forestry.api.circuits.ChipsetManager;
9+
import forestry.api.circuits.ICircuitLayout;
10+
import forestry.api.core.ForestryAPI;
11+
import forestry.api.farming.IFarmLogic;
12+
import forestry.api.farming.IFarmProperties;
13+
import forestry.core.ModuleCore;
14+
import forestry.core.items.EnumElectronTube;
15+
import forestry.farming.circuits.CircuitFarmLogic;
16+
17+
public class ForestryFarmHelper {
18+
19+
public static IFarmProperties registerFarmType(String farmId,
20+
BiFunction<IFarmProperties, Boolean, IFarmLogic> logicFactory,
21+
EnumElectronTube tube) {
22+
IFarmProperties farm = ForestryAPI.farmRegistry.registerLogic(farmId, logicFactory);
23+
farm.registerSoil(new ItemStack(Blocks.DIRT), ModuleCore.getBlocks().humus.getDefaultState());
24+
25+
CircuitFarmLogic managed = new CircuitFarmLogic("managed." + farmId, farm, false);
26+
CircuitFarmLogic manual = new CircuitFarmLogic("manual." + farmId, farm, true);
27+
28+
ICircuitLayout layoutManaged = ChipsetManager.circuitRegistry.getLayout("forestry.farms.managed");
29+
ICircuitLayout layoutManual = ChipsetManager.circuitRegistry.getLayout("forestry.farms.manual");
30+
ItemStack tubeStack = ModuleCore.getItems().tubes.get(tube, 1);
31+
32+
ChipsetManager.solderManager.addRecipe(layoutManaged, tubeStack, managed);
33+
ChipsetManager.solderManager.addRecipe(layoutManual, tubeStack, manual);
34+
35+
return farm;
36+
}
37+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.github.gtexpert.gtbm.integration.gtfo.farming;
2+
3+
import net.minecraft.init.Blocks;
4+
import net.minecraft.item.ItemStack;
5+
6+
import forestry.api.farming.IFarmProperties;
7+
import forestry.farming.logic.FarmLogicArboreal;
8+
9+
public class FarmLogicGTFO extends FarmLogicArboreal {
10+
11+
public FarmLogicGTFO(IFarmProperties properties, boolean isManual) {
12+
super(properties, isManual);
13+
}
14+
15+
@Override
16+
public String getUnlocalizedName() {
17+
return "gtbm.farm.gtfo";
18+
}
19+
20+
@Override
21+
public ItemStack getIconItemStack() {
22+
return new ItemStack(Blocks.SAPLING);
23+
}
24+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package com.github.gtexpert.gtbm.integration.gtfo.farming;
2+
3+
import java.util.Collections;
4+
5+
import javax.annotation.Nullable;
6+
7+
import net.minecraft.block.Block;
8+
import net.minecraft.block.state.IBlockState;
9+
import net.minecraft.entity.player.EntityPlayer;
10+
import net.minecraft.init.Blocks;
11+
import net.minecraft.item.ItemStack;
12+
import net.minecraft.util.EnumActionResult;
13+
import net.minecraft.util.EnumFacing;
14+
import net.minecraft.util.EnumHand;
15+
import net.minecraft.util.math.BlockPos;
16+
import net.minecraft.world.World;
17+
18+
import forestry.api.farming.ICrop;
19+
import forestry.api.farming.IFarmable;
20+
import forestry.api.farming.IFarmableInfo;
21+
import forestry.core.network.packets.PacketFXSignal;
22+
import forestry.core.utils.NetworkUtil;
23+
import forestry.farming.logic.crops.CropDestroy;
24+
25+
public class FarmableGTFOSapling implements IFarmable {
26+
27+
private final Block saplingBlock;
28+
private final ItemStack germling;
29+
private final ItemStack[] windfall;
30+
31+
public FarmableGTFOSapling(Block saplingBlock, int itemDamage, ItemStack[] windfall) {
32+
this.saplingBlock = saplingBlock;
33+
this.germling = new ItemStack(saplingBlock, 1, itemDamage);
34+
this.windfall = windfall;
35+
}
36+
37+
@Override
38+
public boolean isSaplingAt(World world, BlockPos pos, IBlockState blockState) {
39+
return blockState.getBlock() == saplingBlock;
40+
}
41+
42+
@Nullable
43+
@Override
44+
public ICrop getCropAt(World world, BlockPos pos, IBlockState blockState) {
45+
Block block = blockState.getBlock();
46+
if (!block.isWood(world, pos)) {
47+
return null;
48+
}
49+
return new CropDestroy(world, blockState, pos);
50+
}
51+
52+
@Override
53+
public boolean isGermling(ItemStack itemstack) {
54+
return ItemStack.areItemsEqual(germling, itemstack);
55+
}
56+
57+
@Override
58+
public void addInformation(IFarmableInfo info) {
59+
info.addGermlings(Collections.singletonList(germling));
60+
info.addProducts(windfall);
61+
}
62+
63+
@Override
64+
public boolean isWindfall(ItemStack itemstack) {
65+
for (ItemStack drop : windfall) {
66+
if (drop.isItemEqual(itemstack)) {
67+
return true;
68+
}
69+
}
70+
return false;
71+
}
72+
73+
@Override
74+
public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) {
75+
ItemStack copy = germling.copy();
76+
player.setHeldItem(EnumHand.MAIN_HAND, copy);
77+
EnumActionResult result = copy.onItemUse(player, world, pos.down(),
78+
EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0);
79+
player.setHeldItem(EnumHand.MAIN_HAND, ItemStack.EMPTY);
80+
if (result == EnumActionResult.SUCCESS) {
81+
PacketFXSignal packet = new PacketFXSignal(
82+
PacketFXSignal.SoundFXType.BLOCK_PLACE, pos,
83+
Blocks.SAPLING.getDefaultState());
84+
NetworkUtil.sendNetworkPacket(packet, pos, world);
85+
return true;
86+
}
87+
return false;
88+
}
89+
}
Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,62 @@
11
package com.github.gtexpert.gtbm.integration.gtfo.loaders;
22

33
import java.lang.reflect.Field;
4+
import java.lang.reflect.Method;
45
import java.util.List;
56

67
import net.minecraft.block.Block;
78
import net.minecraft.item.ItemStack;
89

10+
import com.github.gtexpert.gtbm.integration.forestry.util.ForestryFarmHelper;
11+
import com.github.gtexpert.gtbm.integration.gtfo.farming.FarmLogicGTFO;
12+
import com.github.gtexpert.gtbm.integration.gtfo.farming.FarmableGTFOSapling;
13+
914
import forestry.api.core.ForestryAPI;
15+
import forestry.api.farming.IFarmProperties;
1016
import forestry.api.farming.IFarmRegistry;
11-
import forestry.farming.logic.farmables.FarmableSapling;
17+
import forestry.core.items.EnumElectronTube;
1218

1319
public class GTFOFarmingLoader {
1420

21+
public static final String FARM_ID = "farmGTFO";
22+
1523
@SuppressWarnings("unchecked")
1624
public static void init() {
17-
IFarmRegistry farmRegistry = ForestryAPI.farmRegistry;
25+
IFarmRegistry registry = ForestryAPI.farmRegistry;
26+
27+
// GTFO Fruit tree farm
28+
IFarmProperties fruitFarm = ForestryFarmHelper.registerFarmType(FARM_ID, FarmLogicGTFO::new,
29+
EnumElectronTube.COPPER);
30+
31+
// Register each GTFO tree under its own identifier for separate JEI display
1832
try {
1933
Class<?> metaBlocksClass = Class.forName("gregtechfoodoption.block.GTFOMetaBlocks");
2034
Field saplingsField = metaBlocksClass.getField("GTFO_SAPLINGS");
2135
List<Block> saplings = (List<Block>) saplingsField.get(null);
22-
for (Block sapling : saplings) {
23-
farmRegistry.registerFarmables("farmArboreal",
24-
new FarmableSapling(new ItemStack(sapling), new ItemStack[0]));
36+
37+
Class<?> treeClass = Class.forName("gregtechfoodoption.worldgen.trees.GTFOTree");
38+
Field treesField = treeClass.getField("TREES");
39+
Field nameField = treeClass.getField("name");
40+
List<?> trees = (List<?>) treesField.get(null);
41+
Method getAppleMethod = treeClass.getMethod("getApple");
42+
43+
for (int i = 0; i < trees.size(); i++) {
44+
Block saplingBlock = saplings.get(i / 8);
45+
int itemDamage = (i % 8) << 1;
46+
47+
Object tree = trees.get(i);
48+
String treeName = (String) nameField.get(tree);
49+
ItemStack apple = (ItemStack) getAppleMethod.invoke(tree);
50+
ItemStack[] windfall = apple.isEmpty() ? new ItemStack[0] : new ItemStack[] { apple };
51+
52+
String subId = FARM_ID + "." + treeName;
53+
fruitFarm.registerFarmables(subId);
54+
registry.registerFarmables(subId,
55+
new FarmableGTFOSapling(saplingBlock, itemDamage, windfall));
2556
}
2657
} catch (ReflectiveOperationException e) {
27-
com.github.gtexpert.gtbm.api.util.ModLog.logger.error("Failed to register GTFO saplings with Forestry farm",
28-
e);
58+
com.github.gtexpert.gtbm.api.util.ModLog.logger.error(
59+
"Failed to register GTFO saplings with Forestry farm", e);
2960
}
3061
}
3162
}

src/main/resources/assets/gtbm/lang/en_us.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ gtbm.bee.label.breeding=Breeding Progress: %s
3232
gtbm.bee.label.not_analyzed=§o§eInsert analyzed bee to see more info
3333
gtbm.bee.label.upgrade_note=§o§7Upgrade changes apply from next cycle
3434

35+
# Multifarm
36+
gtbm.farm.ceu=Rubber Farm
37+
gtbm.farm.gtfo=Fruit Farm
38+
3539
# GUI
3640
gtbm.gui.auto_breeding.tooltip.enabled=Auto-Breeding: ON/nAutomatically puts the princess back after queen death
3741
gtbm.gui.auto_breeding.tooltip.disabled=Auto-Breeding: OFF/nPrincess will remain in the output slot

src/main/resources/assets/gtbm/lang/ja_jp.lang

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ gtbm.bee.label.breeding=交配進行度: %s
3232
gtbm.bee.label.not_analyzed=§o§e解析済みの蜂を入れるとより詳しい情報が表示されます
3333
gtbm.bee.label.upgrade_note=§o§7アップグレードの変更は次のサイクルから適用されます
3434

35+
# Multifarm
36+
gtbm.farm.ceu=ゴムの木農園
37+
gtbm.farm.gtfo=果樹農園
38+
3539
# GUI
3640
gtbm.gui.auto_breeding.tooltip.enabled=自動交配: ON/nクイーン死亡後にプリンセスを自動的に入力スロットに戻します
3741
gtbm.gui.auto_breeding.tooltip.disabled=自動交配: OFF/nプリンセスはアウトプットに残ります

0 commit comments

Comments
 (0)