diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f1be4d..94b681b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ +# v1.3.1 +- Fix Tree Farm logic [#15](https://github.com/GTModpackTeam/GTBeesMatrix/pull/15) + +* * * + # v1.3.0 - Multifarm Gregification [#12](https://github.com/GTModpackTeam/GTBeesMatrix/pull/12) - Add Industrial Apiary [#13](https://github.com/GTModpackTeam/GTBeesMatrix/pull/13) diff --git a/buildscript.properties b/buildscript.properties index 122c14c..cb05297 100644 --- a/buildscript.properties +++ b/buildscript.properties @@ -24,7 +24,6 @@ minecraftVersion = 1.12.2 debug_all = false debug_gendustry = false debug_binnies = false -debug_eio = false debug_gtfo = false # Select a username for testing your mod with breakpoints. You may leave this empty for a random username each time you diff --git a/dependencies.gradle b/dependencies.gradle index bc75905..f019c96 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -79,22 +79,6 @@ dependencies { runtimeOnly rfg.deobf("curse.maven:binnies-mods-patched-899182:7731146") // Binnie's Mods Patched 2.5.1.213 } - // Debug EnderIO - compileOnly "info.loenwind.autoconfig:AutoConfig:1.12.2-1.0.2" // AutoConfig 1.0.2 - compileOnly "info.loenwind.autosave:AutoSave:1.12.2-1.0.11" // AutoSave 1.0.11 - compileOnly rfg.deobf("curse.maven:endercore-231868:4671384") // EnderCore 0.5.78 - compileOnly rfg.deobf("curse.maven:ender-io-base-297193:4674231") // EIO 5.3.72 - compileOnly rfg.deobf("curse.maven:ender-io-endergy-304346:4674241") // EIOE 5.3.72 - compileOnly rfg.deobf("curse.maven:ender-io-machines-297196:4674232") // EIOM 5.3.72 - if (project.debug_all.toBoolean() || project.debug_eio.toBoolean()) { - runtimeOnly "info.loenwind.autoconfig:AutoConfig:1.12.2-1.0.2" // AutoConfig 1.0.2 - runtimeOnly "info.loenwind.autosave:AutoSave:1.12.2-1.0.11" // AutoSave 1.0.11 - runtimeOnly rfg.deobf("curse.maven:endercore-231868:4671384") // EnderCore 0.5.78 - runtimeOnly rfg.deobf("curse.maven:ender-io-base-297193:4674231") // EIO 5.3.72 - runtimeOnly rfg.deobf("curse.maven:ender-io-endergy-304346:4674241") // EIOE 5.3.72 - runtimeOnly rfg.deobf("curse.maven:ender-io-machines-297196:4674232") // EIOM 5.3.72 - } - // Debug GTFO: 1.12.5 compileOnly rfg.deobf("curse.maven:gregtech-food-option-477021:6472136") if (project.debug_all.toBoolean() || project.debug_gtfo.toBoolean()) { diff --git a/libs/EnderCore-1.12.2-0.5.78-core.jar b/libs/EnderCore-1.12.2-0.5.78-core.jar deleted file mode 100644 index 91a4bc2..0000000 Binary files a/libs/EnderCore-1.12.2-0.5.78-core.jar and /dev/null differ diff --git a/repositories.gradle b/repositories.gradle index 812d9ea..538b254 100644 --- a/repositories.gradle +++ b/repositories.gradle @@ -1,10 +1,6 @@ // Add any additional repositories for your dependencies here repositories { - maven { // Autoconfig and Autosave - name 'Mod Maven' - url 'https://modmaven.dev' - } maven { name 'GTCEu Maven' url 'https://maven.gtceu.com' diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmLogicCEu.java b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmLogicCEu.java new file mode 100644 index 0000000..2ef4216 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmLogicCEu.java @@ -0,0 +1,25 @@ +package com.github.gtexpert.gtbm.integration.forestry.farming; + +import net.minecraft.item.ItemStack; + +import gregtech.common.blocks.MetaBlocks; + +import forestry.api.farming.IFarmProperties; +import forestry.farming.logic.FarmLogicArboreal; + +public class FarmLogicCEu extends FarmLogicArboreal { + + public FarmLogicCEu(IFarmProperties properties, boolean isManual) { + super(properties, isManual); + } + + @Override + public String getUnlocalizedName() { + return "gtbm.farm.ceu"; + } + + @Override + public ItemStack getIconItemStack() { + return new ItemStack(MetaBlocks.RUBBER_SAPLING); + } +} diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmableGTCEuSapling.java b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmableGTCEuSapling.java new file mode 100644 index 0000000..f9fcd2a --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/farming/FarmableGTCEuSapling.java @@ -0,0 +1,93 @@ +package com.github.gtexpert.gtbm.integration.forestry.farming; + +import java.util.Collections; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import forestry.api.farming.ICrop; +import forestry.api.farming.IFarmable; +import forestry.api.farming.IFarmableInfo; +import forestry.core.network.packets.PacketFXSignal; +import forestry.core.utils.NetworkUtil; +import forestry.farming.logic.crops.CropDestroy; + +public class FarmableGTCEuSapling implements IFarmable { + + private final Block saplingBlock; + private final ItemStack germling; + private final ItemStack[] windfall; + + public FarmableGTCEuSapling(Block saplingBlock, ItemStack[] windfall) { + this.saplingBlock = saplingBlock; + this.germling = new ItemStack(saplingBlock); + this.windfall = windfall; + } + + @Override + public boolean isSaplingAt(World world, BlockPos pos, IBlockState blockState) { + return blockState.getBlock() == saplingBlock; + } + + @Nullable + @Override + public ICrop getCropAt(World world, BlockPos pos, IBlockState blockState) { + Block block = blockState.getBlock(); + if (!block.isWood(world, pos)) { + return null; + } + return new CropDestroy(world, blockState, pos); + } + + @Override + public boolean isGermling(ItemStack itemstack) { + return ItemStack.areItemsEqual(germling, itemstack); + } + + @Override + public void addInformation(IFarmableInfo info) { + info.addGermlings(Collections.singletonList(germling)); + info.addProducts(windfall); + } + + @Override + public boolean isWindfall(ItemStack itemstack) { + for (ItemStack drop : windfall) { + if (drop.isItemEqual(itemstack)) { + return true; + } + } + return false; + } + + @Override + public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) { + ItemStack originalHeldItem = player.getHeldItem(EnumHand.MAIN_HAND); + try { + ItemStack copy = germling.copy(); + player.setHeldItem(EnumHand.MAIN_HAND, copy); + EnumActionResult result = copy.onItemUse(player, world, pos.down(), + EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0); + if (result == EnumActionResult.SUCCESS) { + PacketFXSignal packet = new PacketFXSignal( + PacketFXSignal.SoundFXType.BLOCK_PLACE, pos, + Blocks.SAPLING.getDefaultState()); + NetworkUtil.sendNetworkPacket(packet, pos, world); + return true; + } + return false; + } finally { + player.setHeldItem(EnumHand.MAIN_HAND, originalHeldItem); + } + } +} diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/forestry/loaders/FFMFarmingLoader.java b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/loaders/FFMFarmingLoader.java index d4de857..6e17928 100644 --- a/src/main/java/com/github/gtexpert/gtbm/integration/forestry/loaders/FFMFarmingLoader.java +++ b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/loaders/FFMFarmingLoader.java @@ -5,18 +5,29 @@ import gregtech.common.blocks.MetaBlocks; import gregtech.common.items.MetaItems; +import com.github.gtexpert.gtbm.integration.forestry.farming.FarmLogicCEu; +import com.github.gtexpert.gtbm.integration.forestry.farming.FarmableGTCEuSapling; +import com.github.gtexpert.gtbm.integration.forestry.util.ForestryFarmHelper; + import forestry.api.core.ForestryAPI; +import forestry.api.farming.IFarmProperties; import forestry.api.farming.IFarmRegistry; -import forestry.farming.logic.farmables.FarmableSapling; +import forestry.core.items.EnumElectronTube; public class FFMFarmingLoader { public static void init() { IFarmRegistry farmRegistry = ForestryAPI.farmRegistry; - // GregTech Rubber Sapling - farmRegistry.registerFarmables("farmArboreal", - new FarmableSapling(new ItemStack(MetaBlocks.RUBBER_SAPLING), new ItemStack[0])); + // GregTech Rubber tree farm + IFarmProperties ceuFarm = ForestryFarmHelper.registerFarmType("farmCEu", FarmLogicCEu::new, + EnumElectronTube.TIN); + + String rubberId = "farmCEu.rubber"; + ceuFarm.registerFarmables(rubberId); + farmRegistry.registerFarmables(rubberId, + new FarmableGTCEuSapling(MetaBlocks.RUBBER_SAPLING, + new ItemStack[] { MetaItems.STICKY_RESIN.getStackForm() })); // GregTech Fertilizer farmRegistry.registerFertilizer(MetaItems.FERTILIZER.getStackForm(), 500); diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/forestry/util/ForestryFarmHelper.java b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/util/ForestryFarmHelper.java new file mode 100644 index 0000000..b343dc3 --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtbm/integration/forestry/util/ForestryFarmHelper.java @@ -0,0 +1,37 @@ +package com.github.gtexpert.gtbm.integration.forestry.util; + +import java.util.function.BiFunction; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; + +import forestry.api.circuits.ChipsetManager; +import forestry.api.circuits.ICircuitLayout; +import forestry.api.core.ForestryAPI; +import forestry.api.farming.IFarmLogic; +import forestry.api.farming.IFarmProperties; +import forestry.core.ModuleCore; +import forestry.core.items.EnumElectronTube; +import forestry.farming.circuits.CircuitFarmLogic; + +public class ForestryFarmHelper { + + public static IFarmProperties registerFarmType(String farmId, + BiFunction logicFactory, + EnumElectronTube tube) { + IFarmProperties farm = ForestryAPI.farmRegistry.registerLogic(farmId, logicFactory); + farm.registerSoil(new ItemStack(Blocks.DIRT), ModuleCore.getBlocks().humus.getDefaultState()); + + CircuitFarmLogic managed = new CircuitFarmLogic("managed." + farmId, farm, false); + CircuitFarmLogic manual = new CircuitFarmLogic("manual." + farmId, farm, true); + + ICircuitLayout layoutManaged = ChipsetManager.circuitRegistry.getLayout("forestry.farms.managed"); + ICircuitLayout layoutManual = ChipsetManager.circuitRegistry.getLayout("forestry.farms.manual"); + ItemStack tubeStack = ModuleCore.getItems().tubes.get(tube, 1); + + ChipsetManager.solderManager.addRecipe(layoutManaged, tubeStack, managed); + ChipsetManager.solderManager.addRecipe(layoutManual, tubeStack, manual); + + return farm; + } +} diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmLogicGTFO.java b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmLogicGTFO.java new file mode 100644 index 0000000..32dbb8a --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmLogicGTFO.java @@ -0,0 +1,24 @@ +package com.github.gtexpert.gtbm.integration.gtfo.farming; + +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; + +import forestry.api.farming.IFarmProperties; +import forestry.farming.logic.FarmLogicArboreal; + +public class FarmLogicGTFO extends FarmLogicArboreal { + + public FarmLogicGTFO(IFarmProperties properties, boolean isManual) { + super(properties, isManual); + } + + @Override + public String getUnlocalizedName() { + return "gtbm.farm.gtfo"; + } + + @Override + public ItemStack getIconItemStack() { + return new ItemStack(Blocks.SAPLING); + } +} diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmableGTFOSapling.java b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmableGTFOSapling.java new file mode 100644 index 0000000..cef06de --- /dev/null +++ b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/farming/FarmableGTFOSapling.java @@ -0,0 +1,93 @@ +package com.github.gtexpert.gtbm.integration.gtfo.farming; + +import java.util.Collections; + +import javax.annotation.Nullable; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.init.Blocks; +import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.EnumHand; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; + +import forestry.api.farming.ICrop; +import forestry.api.farming.IFarmable; +import forestry.api.farming.IFarmableInfo; +import forestry.core.network.packets.PacketFXSignal; +import forestry.core.utils.NetworkUtil; +import forestry.farming.logic.crops.CropDestroy; + +public class FarmableGTFOSapling implements IFarmable { + + private final Block saplingBlock; + private final ItemStack germling; + private final ItemStack[] windfall; + + public FarmableGTFOSapling(Block saplingBlock, int itemDamage, ItemStack[] windfall) { + this.saplingBlock = saplingBlock; + this.germling = new ItemStack(saplingBlock, 1, itemDamage); + this.windfall = windfall; + } + + @Override + public boolean isSaplingAt(World world, BlockPos pos, IBlockState blockState) { + return blockState.getBlock() == saplingBlock; + } + + @Nullable + @Override + public ICrop getCropAt(World world, BlockPos pos, IBlockState blockState) { + Block block = blockState.getBlock(); + if (!block.isWood(world, pos)) { + return null; + } + return new CropDestroy(world, blockState, pos); + } + + @Override + public boolean isGermling(ItemStack itemstack) { + return ItemStack.areItemsEqual(germling, itemstack); + } + + @Override + public void addInformation(IFarmableInfo info) { + info.addGermlings(Collections.singletonList(germling)); + info.addProducts(windfall); + } + + @Override + public boolean isWindfall(ItemStack itemstack) { + for (ItemStack drop : windfall) { + if (drop.isItemEqual(itemstack)) { + return true; + } + } + return false; + } + + @Override + public boolean plantSaplingAt(EntityPlayer player, ItemStack germling, World world, BlockPos pos) { + ItemStack originalHeldItem = player.getHeldItem(EnumHand.MAIN_HAND); + try { + ItemStack copy = germling.copy(); + player.setHeldItem(EnumHand.MAIN_HAND, copy); + EnumActionResult result = copy.onItemUse(player, world, pos.down(), + EnumHand.MAIN_HAND, EnumFacing.UP, 0, 0, 0); + if (result == EnumActionResult.SUCCESS) { + PacketFXSignal packet = new PacketFXSignal( + PacketFXSignal.SoundFXType.BLOCK_PLACE, pos, + Blocks.SAPLING.getDefaultState()); + NetworkUtil.sendNetworkPacket(packet, pos, world); + return true; + } + return false; + } finally { + player.setHeldItem(EnumHand.MAIN_HAND, originalHeldItem); + } + } +} diff --git a/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/loaders/GTFOFarmingLoader.java b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/loaders/GTFOFarmingLoader.java index d3f4bd2..b314b24 100644 --- a/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/loaders/GTFOFarmingLoader.java +++ b/src/main/java/com/github/gtexpert/gtbm/integration/gtfo/loaders/GTFOFarmingLoader.java @@ -1,31 +1,62 @@ package com.github.gtexpert.gtbm.integration.gtfo.loaders; import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.List; import net.minecraft.block.Block; import net.minecraft.item.ItemStack; +import com.github.gtexpert.gtbm.integration.forestry.util.ForestryFarmHelper; +import com.github.gtexpert.gtbm.integration.gtfo.farming.FarmLogicGTFO; +import com.github.gtexpert.gtbm.integration.gtfo.farming.FarmableGTFOSapling; + import forestry.api.core.ForestryAPI; +import forestry.api.farming.IFarmProperties; import forestry.api.farming.IFarmRegistry; -import forestry.farming.logic.farmables.FarmableSapling; +import forestry.core.items.EnumElectronTube; public class GTFOFarmingLoader { + public static final String FARM_ID = "farmGTFO"; + @SuppressWarnings("unchecked") public static void init() { - IFarmRegistry farmRegistry = ForestryAPI.farmRegistry; + IFarmRegistry registry = ForestryAPI.farmRegistry; + + // GTFO Fruit tree farm + IFarmProperties fruitFarm = ForestryFarmHelper.registerFarmType(FARM_ID, FarmLogicGTFO::new, + EnumElectronTube.COPPER); + + // Register each GTFO tree under its own identifier for separate JEI display try { Class metaBlocksClass = Class.forName("gregtechfoodoption.block.GTFOMetaBlocks"); Field saplingsField = metaBlocksClass.getField("GTFO_SAPLINGS"); List saplings = (List) saplingsField.get(null); - for (Block sapling : saplings) { - farmRegistry.registerFarmables("farmArboreal", - new FarmableSapling(new ItemStack(sapling), new ItemStack[0])); + + Class treeClass = Class.forName("gregtechfoodoption.worldgen.trees.GTFOTree"); + Field treesField = treeClass.getField("TREES"); + Field nameField = treeClass.getField("name"); + List trees = (List) treesField.get(null); + Method getAppleMethod = treeClass.getMethod("getApple"); + + for (int i = 0; i < trees.size(); i++) { + Block saplingBlock = saplings.get(i / 8); + int itemDamage = (i % 8) << 1; + + Object tree = trees.get(i); + String treeName = (String) nameField.get(tree); + ItemStack apple = (ItemStack) getAppleMethod.invoke(tree); + ItemStack[] windfall = apple.isEmpty() ? new ItemStack[0] : new ItemStack[] { apple }; + + String subId = FARM_ID + "." + treeName; + fruitFarm.registerFarmables(subId); + registry.registerFarmables(subId, + new FarmableGTFOSapling(saplingBlock, itemDamage, windfall)); } } catch (ReflectiveOperationException e) { - com.github.gtexpert.gtbm.api.util.ModLog.logger.error("Failed to register GTFO saplings with Forestry farm", - e); + com.github.gtexpert.gtbm.api.util.ModLog.logger.error( + "Failed to register GTFO saplings with Forestry farm", e); } } } diff --git a/src/main/resources/assets/gtbm/lang/en_us.lang b/src/main/resources/assets/gtbm/lang/en_us.lang index 6cb1e97..c5b1c3a 100644 --- a/src/main/resources/assets/gtbm/lang/en_us.lang +++ b/src/main/resources/assets/gtbm/lang/en_us.lang @@ -32,6 +32,10 @@ gtbm.bee.label.breeding=Breeding Progress: %s gtbm.bee.label.not_analyzed=§o§eInsert analyzed bee to see more info gtbm.bee.label.upgrade_note=§o§7Upgrade changes apply from next cycle +# Multifarm +gtbm.farm.ceu=Rubber Farm +gtbm.farm.gtfo=Fruit Farm + # GUI gtbm.gui.auto_breeding.tooltip.enabled=Auto-Breeding: ON/nAutomatically puts the princess back after queen death gtbm.gui.auto_breeding.tooltip.disabled=Auto-Breeding: OFF/nPrincess will remain in the output slot diff --git a/src/main/resources/assets/gtbm/lang/ja_jp.lang b/src/main/resources/assets/gtbm/lang/ja_jp.lang index e2307b4..587e97d 100644 --- a/src/main/resources/assets/gtbm/lang/ja_jp.lang +++ b/src/main/resources/assets/gtbm/lang/ja_jp.lang @@ -32,6 +32,10 @@ gtbm.bee.label.breeding=交配進行度: %s gtbm.bee.label.not_analyzed=§o§e解析済みの蜂を入れるとより詳しい情報が表示されます gtbm.bee.label.upgrade_note=§o§7アップグレードの変更は次のサイクルから適用されます +# Multifarm +gtbm.farm.ceu=ゴムの木農園 +gtbm.farm.gtfo=果樹農園 + # GUI gtbm.gui.auto_breeding.tooltip.enabled=自動交配: ON/nクイーン死亡後にプリンセスを自動的に入力スロットに戻します gtbm.gui.auto_breeding.tooltip.disabled=自動交配: OFF/nプリンセスはアウトプットに残ります