* Fixed Farmer not playing well with non vanilla farmland.

* Added the ability to change the farmers work area with a compass.
* Code cleaning.
This commit is contained in:
Flanks255 2024-11-16 14:33:59 -06:00
parent 95977167e3
commit b66af8446c
18 changed files with 122 additions and 297 deletions

View file

@ -1,3 +1,7 @@
# 1.3.11+mc1.21.1
* Fixed Farmer not playing well with non vanilla farmland.
* Added the ability to change the farmers work area with a compass.
# 1.3.10+mc1.21.1 # 1.3.10+mc1.21.1
* Fixed Fluid placer not being harvestable. * Fixed Fluid placer not being harvestable.
* PR #1438, Added config to disable energy overlay. * PR #1438, Added config to disable energy overlay.

View file

@ -4,7 +4,7 @@ org.gradle.parallel=true
org.gradle.caching=true org.gradle.caching=true
org.gradle.configuration-cache=false org.gradle.configuration-cache=false
mod_version=1.3.10 mod_version=1.3.11
# Forge # Forge
game_version=1.21.1 game_version=1.21.1

View file

@ -40,7 +40,6 @@ import de.ellpeck.actuallyadditions.mod.util.ResourceReloader;
import de.ellpeck.actuallyadditions.mod.util.Util; import de.ellpeck.actuallyadditions.mod.util.Util;
import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.Dist;
import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.IEventBus;
@ -139,10 +138,12 @@ public class ActuallyAdditions {
private void onConfigReload(ModConfigEvent event) { private void onConfigReload(ModConfigEvent event) {
if (event.getConfig().getType() == ModConfig.Type.COMMON) { if (event.getConfig().getType() == ModConfig.Type.COMMON) {
Item item1 = BuiltInRegistries.ITEM.get(ResourceLocation.tryParse(CommonConfig.Other.REDSTONECONFIGURATOR.get())); CommonConfig.Other.redstoneConfigureItem =
Item item2 = BuiltInRegistries.ITEM.get(ResourceLocation.tryParse(CommonConfig.Other.RELAYCONFIGURATOR.get())); BuiltInRegistries.ITEM.getOptional(ResourceLocation.tryParse(CommonConfig.Other.REDSTONECONFIGURATOR.get())).orElse(Items.AIR);
CommonConfig.Other.redstoneConfigureItem = item1 != null ? item1 : Items.AIR; CommonConfig.Other.relayConfigureItem =
CommonConfig.Other.relayConfigureItem = item2 != null ? item2 : Items.AIR; BuiltInRegistries.ITEM.getOptional(ResourceLocation.tryParse(CommonConfig.Other.RELAYCONFIGURATOR.get())).orElse(Items.AIR);
CommonConfig.Other.farmerConfigureItem =
BuiltInRegistries.ITEM.getOptional(ResourceLocation.tryParse(CommonConfig.Other.FARMERCONFIG.get())).orElse(Items.AIR);
} }
} }

View file

@ -90,24 +90,6 @@ public class BlockAtomicReconstructor extends FullyDirectionalBlock.Container im
return ItemInteractionResult.CONSUME; return ItemInteractionResult.CONSUME;
} }
/* @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
switch (state.getValue(FACING)) {
case UP:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_U;
case DOWN:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_D;
case EAST:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_E;
case SOUTH:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_S;
case WEST:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_W;
default:
return VoxelShapes.AtomicReconstructorShapes.SHAPE_N;
}
}*/
@Nullable @Nullable
@Override @Override
public BlockEntity newBlockEntity(BlockPos pos, BlockState state) { public BlockEntity newBlockEntity(BlockPos pos, BlockState state) {
@ -139,7 +121,7 @@ public class BlockAtomicReconstructor extends FullyDirectionalBlock.Container im
@Override @Override
public void appendHoverText(@Nonnull ItemStack pStack, @Nullable TooltipContext context, @Nonnull List<Component> pTooltip, @Nonnull TooltipFlag pFlag) { public void appendHoverText(@Nonnull ItemStack pStack, @Nonnull TooltipContext context, @Nonnull List<Component> pTooltip, @Nonnull TooltipFlag pFlag) {
super.appendHoverText(pStack, context, pTooltip, pFlag); super.appendHoverText(pStack, context, pTooltip, pFlag);
long sysTime = System.currentTimeMillis(); long sysTime = System.currentTimeMillis();
@ -169,11 +151,7 @@ public class BlockAtomicReconstructor extends FullyDirectionalBlock.Container im
@Override @Override
protected boolean updateCustomBlockEntityTag(BlockPos pPos, Level pLevel, @Nullable Player pPlayer, ItemStack pStack, BlockState pState) { protected boolean updateCustomBlockEntityTag(BlockPos pPos, Level pLevel, @Nullable Player pPlayer, ItemStack pStack, BlockState pState) {
boolean ret = super.updateCustomBlockEntityTag(pPos, pLevel, pPlayer, pStack, pState); return super.updateCustomBlockEntityTag(pPos, pLevel, pPlayer, pStack, pState);
return ret;
} }
} }

View file

@ -100,18 +100,4 @@ public class BlockCrusher extends BlockContainerBase {
? 12 ? 12
: 0; : 0;
} }
/* @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
switch (state.getValue(HORIZONTAL_FACING)) {
case EAST:
return VoxelShapes.GrinderShapes.SHAPE_E;
case SOUTH:
return VoxelShapes.GrinderShapes.SHAPE_S;
case WEST:
return VoxelShapes.GrinderShapes.SHAPE_W;
default:
return VoxelShapes.GrinderShapes.SHAPE_N;
}
}*/
} }

View file

@ -50,22 +50,4 @@ public class BlockDropper extends FullyDirectionalBlock.Container {
return this.openGui(world, player, pos, TileEntityDropper.class); return this.openGui(world, player, pos, TileEntityDropper.class);
} }
/* @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
switch (state.getValue(FACING)) {
case UP:
return VoxelShapes.BlockBreakerShapes.SHAPE_U;
case DOWN:
return VoxelShapes.BlockBreakerShapes.SHAPE_D;
case EAST:
return VoxelShapes.BlockBreakerShapes.SHAPE_E;
case SOUTH:
return VoxelShapes.BlockBreakerShapes.SHAPE_S;
case WEST:
return VoxelShapes.BlockBreakerShapes.SHAPE_W;
default:
return VoxelShapes.BlockBreakerShapes.SHAPE_N;
}
}*/
} }

View file

@ -58,12 +58,4 @@ public class BlockEnergizer extends BlockContainerBase {
return this.openGui(world, player, pos, TileEntityEnervator.class); return this.openGui(world, player, pos, TileEntityEnervator.class);
} }
} }
/* @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
if (this.isEnergizer) {
return VoxelShapes.ENERGIZER_SHAPE;
}
return VoxelShapes.ENERVATOR_SHAPE;
}*/
} }

View file

@ -11,10 +11,16 @@
package de.ellpeck.actuallyadditions.mod.blocks; package de.ellpeck.actuallyadditions.mod.blocks;
import de.ellpeck.actuallyadditions.mod.blocks.base.DirectionalBlock; import de.ellpeck.actuallyadditions.mod.blocks.base.DirectionalBlock;
import de.ellpeck.actuallyadditions.mod.blocks.blockhuds.FarmerHud;
import de.ellpeck.actuallyadditions.mod.blocks.blockhuds.IBlockHud;
import de.ellpeck.actuallyadditions.mod.config.CommonConfig;
import de.ellpeck.actuallyadditions.mod.tile.TileEntityFarmer; import de.ellpeck.actuallyadditions.mod.tile.TileEntityFarmer;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.SoundType;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
@ -25,7 +31,8 @@ import net.minecraft.world.phys.BlockHitResult;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class BlockFarmer extends DirectionalBlock.Container { public class BlockFarmer extends DirectionalBlock.Container implements IHudDisplay {
private static final IBlockHud HUD = new FarmerHud();
public BlockFarmer() { public BlockFarmer() {
super(ActuallyBlocks.defaultPickProps().sound(SoundType.METAL)); super(ActuallyBlocks.defaultPickProps().sound(SoundType.METAL));
@ -48,17 +55,20 @@ public class BlockFarmer extends DirectionalBlock.Container {
return this.openGui(world, player, pos, TileEntityFarmer.class); return this.openGui(world, player, pos, TileEntityFarmer.class);
} }
/* @Override @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) { protected ItemInteractionResult useItemOn(ItemStack stack, BlockState state, Level level, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hitResult) {
switch (state.getValue(FACING)) { ItemStack heldItem = player.getItemInHand(hand);
case EAST: BlockEntity tile = level.getBlockEntity(pos);
return VoxelShapes.FarmerShapes.SHAPE_E; if (heldItem.getItem() == CommonConfig.Other.farmerConfigureItem && tile instanceof TileEntityFarmer farmer) {
case SOUTH: farmer.cycleArea();
return VoxelShapes.FarmerShapes.SHAPE_S; return ItemInteractionResult.SUCCESS;
case WEST: }
return VoxelShapes.FarmerShapes.SHAPE_W;
default: return super.useItemOn(stack, state, level, pos, player, hand, hitResult);
return VoxelShapes.FarmerShapes.SHAPE_N; }
@Override
public IBlockHud getHud() {
return HUD;
} }
}*/
} }

View file

@ -46,9 +46,4 @@ public class BlockFeeder extends BlockContainerBase {
protected InteractionResult useWithoutItem(BlockState pState, Level world, BlockPos pos, Player player, BlockHitResult pHitResult) { protected InteractionResult useWithoutItem(BlockState pState, Level world, BlockPos pos, Player player, BlockHitResult pHitResult) {
return this.openGui(world, player, pos, TileEntityFeeder.class); return this.openGui(world, player, pos, TileEntityFeeder.class);
} }
/* @Override
public VoxelShape getShape(BlockState state, BlockGetter worldIn, BlockPos pos, CollisionContext context) {
return VoxelShapes.FEEDER_SHAPE;
}*/
} }

View file

@ -69,23 +69,4 @@ public class BlockFluidCollector extends FullyDirectionalBlock.Container {
return this.openGui2(world, player, pos, TileEntityFluidCollector.class); return this.openGui2(world, player, pos, TileEntityFluidCollector.class);
} }
/* @Nonnull
@Override
public VoxelShape getShape(BlockState state, @Nonnull BlockGetter worldIn, @Nonnull BlockPos pos, @Nonnull CollisionContext context) {
switch (state.getValue(FACING)) {
case UP:
return VoxelShapes.FluidCollectorShapes.SHAPE_U;
case DOWN:
return VoxelShapes.FluidCollectorShapes.SHAPE_D;
case EAST:
return VoxelShapes.FluidCollectorShapes.SHAPE_E;
case SOUTH:
return VoxelShapes.FluidCollectorShapes.SHAPE_S;
case WEST:
return VoxelShapes.FluidCollectorShapes.SHAPE_W;
default:
return VoxelShapes.FluidCollectorShapes.SHAPE_N;
}
}*/
} }

View file

@ -1,108 +0,0 @@
///*
// * This file ("BlockMisc.java") is part of the Actually Additions mod for Minecraft.
// * It is created and owned by Ellpeck and distributed
// * under the Actually Additions License to be found at
// * http://ellpeck.de/actaddlicense
// * View the source code at https://github.com/Ellpeck/ActuallyAdditions
// *
// * © 2015-2017 Ellpeck
// */
//
//package de.ellpeck.actuallyadditions.mod.blocks;
//
//import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
//import de.ellpeck.actuallyadditions.mod.blocks.base.BlockBase;
//import de.ellpeck.actuallyadditions.mod.blocks.base.ItemBlockBase;
//import de.ellpeck.actuallyadditions.mod.blocks.metalists.TheMiscBlocks;
//import de.ellpeck.actuallyadditions.mod.util.StringUtil;
//import net.minecraft.block.Block;
//import net.minecraft.block.material.Material;
//import net.minecraft.block.properties.PropertyEnum;
//import net.minecraft.block.state.BlockStateContainer;
//import net.minecraft.creativetab.CreativeTabs;
//import net.minecraft.item.EnumRarity;
//import net.minecraft.item.ItemStack;
//import net.minecraft.util.NonNullList;
//
//public class BlockMisc extends BlockBase {
//
// public static final TheMiscBlocks[] ALL_MISC_BLOCKS = TheMiscBlocks.values();
// public static final PropertyEnum<TheMiscBlocks> TYPE = PropertyEnum.create("type", TheMiscBlocks.class);
//
// public BlockMisc() {
// super(Material.ROCK);
// this.setHardness(1.5F);
// this.setResistance(10.0F);
// this.setHarvestLevel("pickaxe", 1);
// }
//
// @Override
// public int damageDropped(BlockState state) {
// return this.getMetaFromState(state);
// }
//
// @Override
// public void getSubBlocks(CreativeTabs tab, NonNullList<ItemStack> list) {
// for (int j = 0; j < ALL_MISC_BLOCKS.length; j++) {
// list.add(new ItemStack(this, 1, j));
// }
// }
//
// @Override
// protected ItemBlockBase getItemBlock() {
// return new TheItemBlock(this);
// }
//
// @Override
// public void registerRendering() {
// for (int i = 0; i < ALL_MISC_BLOCKS.length; i++) {
// ActuallyAdditions.PROXY.addRenderRegister(new ItemStack(this, 1, i), this.getRegistryName(), TYPE.getName() + "=" + ALL_MISC_BLOCKS[i].name);
// }
// }
//
// @Override
// public EnumRarity getRarity(ItemStack stack) {
// return stack.getItemDamage() >= ALL_MISC_BLOCKS.length
// ? EnumRarity.COMMON
// : ALL_MISC_BLOCKS[stack.getItemDamage()].rarity;
// }
//
// @Override
// public BlockState getStateFromMeta(int meta) {
// return this.getDefaultState().withProperty(TYPE, TheMiscBlocks.values()[meta]);
// }
//
// @Override
// public int getMetaFromState(BlockState state) {
// return state.getValue(TYPE).ordinal();
// }
//
// @Override
// protected BlockStateContainer createBlockState() {
// return new BlockStateContainer(this, TYPE);
// }
//
// public static class TheItemBlock extends ItemBlockBase {
//
// public TheItemBlock(Block block) {
// super(block);
// this.setHasSubtypes(true);
// this.setMaxDamage(0);
// }
//
// @Override
// public String getTranslationKey(ItemStack stack) {
// return stack.getItemDamage() >= ALL_MISC_BLOCKS.length
// ? StringUtil.BUGGED_ITEM_NAME
// : this.getTranslationKey() + "_" + ALL_MISC_BLOCKS[stack.getItemDamage()].name;
// }
//
// @Override
// public int getItemBurnTime(ItemStack stack) {
// if (stack.getMetadata() == TheMiscBlocks.CHARCOAL_BLOCK.ordinal()) {
// return 16000;
// }
// return super.getItemBurnTime(stack);
// }
// }
//}

View file

@ -22,7 +22,6 @@ import net.minecraft.world.InteractionHand;
import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResult;
import net.minecraft.world.ItemInteractionResult; import net.minecraft.world.ItemInteractionResult;
import net.minecraft.world.MenuProvider; import net.minecraft.world.MenuProvider;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
@ -38,7 +37,6 @@ import net.neoforged.neoforge.fluids.FluidUtil;
import net.neoforged.neoforge.fluids.capability.templates.FluidTank; import net.neoforged.neoforge.fluids.capability.templates.FluidTank;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public abstract class BlockContainerBase extends Block implements EntityBlock { public abstract class BlockContainerBase extends Block implements EntityBlock {
public BlockContainerBase(Properties properties) { public BlockContainerBase(Properties properties) {
@ -142,7 +140,7 @@ public abstract class BlockContainerBase extends Block implements EntityBlock {
} }
@Override @Override
public void onNeighborChange(BlockState state, LevelReader world, BlockPos pos, BlockPos neighbor) { public void onNeighborChange(@Nonnull BlockState state, @Nonnull LevelReader world, @Nonnull BlockPos pos, @Nonnull BlockPos neighbor) {
super.onNeighborChange(state, world, pos, neighbor); super.onNeighborChange(state, world, pos, neighbor);
if (world instanceof Level) { //TODO what? if (world instanceof Level) { //TODO what?
this.neighborsChangedCustom((Level) world, pos); this.neighborsChangedCustom((Level) world, pos);
@ -181,19 +179,9 @@ public abstract class BlockContainerBase extends Block implements EntityBlock {
this.updateRedstoneState(worldIn, pos); this.updateRedstoneState(worldIn, pos);
} }
@Nonnull
@Override @Override
public void setPlacedBy(Level world, BlockPos pos, BlockState state, @Nullable LivingEntity placer, ItemStack stack) { public BlockState playerWillDestroy(@Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, @Nonnull Player player) {
// if (stack.hasTag()) {
// BlockEntity tile = world.getBlockEntity(pos);
// if (tile instanceof TileEntityBase base) {
// CompoundTag compound = stack.get(DataComponents.BLOCK_ENTITY_DATA).getCompound("Data");
// base.readSyncableNBT(compound, world.registryAccess(), TileEntityBase.NBTType.SAVE_BLOCK); TODO: Check if this is still required
// }
// }
}
@Override
public BlockState playerWillDestroy(@Nonnull Level world, @Nonnull BlockPos pos, @Nonnull BlockState state, Player player) {
BlockState theState = super.playerWillDestroy(world, pos, state, player); BlockState theState = super.playerWillDestroy(world, pos, state, player);
if (!player.isCreative() && world.getBlockEntity(pos) instanceof TileEntityBase tileBase && tileBase.stopFromDropping) { if (!player.isCreative() && world.getBlockEntity(pos) instanceof TileEntityBase tileBase && tileBase.stopFromDropping) {
if (!world.isClientSide) if (!world.isClientSide)
@ -204,12 +192,12 @@ public abstract class BlockContainerBase extends Block implements EntityBlock {
} }
@Override @Override
public boolean hasAnalogOutputSignal(BlockState state) { public boolean hasAnalogOutputSignal(@Nonnull BlockState state) {
return true; return true;
} }
@Override @Override
public int getAnalogOutputSignal(BlockState state, Level world, BlockPos pos) { public int getAnalogOutputSignal(@Nonnull BlockState state, Level world, @Nonnull BlockPos pos) {
BlockEntity tile = world.getBlockEntity(pos); BlockEntity tile = world.getBlockEntity(pos);
if (tile instanceof TileEntityBase) { if (tile instanceof TileEntityBase) {
return ((TileEntityBase) tile).getComparatorStrength(); return ((TileEntityBase) tile).getComparatorStrength();
@ -217,62 +205,14 @@ public abstract class BlockContainerBase extends Block implements EntityBlock {
return 0; return 0;
} }
// TODO: [port]: come back and fix this @Nonnull
// @Override
// public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, BlockState state, int fortune) {
// TileEntity tile = world.getTileEntity(pos);
// if (tile instanceof TileEntityBase) {
// TileEntityBase base = (TileEntityBase) tile;
// if (!base.stopFromDropping) {
// CompoundNBT data = new CompoundNBT();
// base.writeSyncableNBT(data, TileEntityBase.NBTType.SAVE_BLOCK);
//
// //Remove unnecessarily saved default values to avoid unstackability
// List<String> keysToRemove = new ArrayList<>();
// for (String key : data.getKeySet()) {
// NBTBase tag = data.getTag(key);
// //Remove only ints because they are the most common ones
// //Add else if below here to remove more types
// if (tag instanceof NBTTagInt) {
// if (((NBTTagInt) tag).getInt() == 0) {
// keysToRemove.add(key);
// }
// }
// }
// for (String key : keysToRemove) {
// data.removeTag(key);
// }
//
// ItemStack stack = new ItemStack(this.getItemDropped(state, tile.getWorld().rand, fortune), 1, this.damageDropped(state));
// if (!data.isEmpty()) {
// stack.setTagCompound(new CompoundNBT());
// stack.getTagCompound().setTag("Data", data);
// }
//
// drops.add(stack);
// }
// } else {
// super.getDrops(drops, world, pos, state, fortune);
// }
// }
// TODO: [port]: eval
// @Override
// public EnumBlockRenderType getRenderType(BlockState state) {
// return EnumBlockRenderType.MODEL;
// }
@Override @Override
public RenderShape getRenderShape(BlockState pState) { public RenderShape getRenderShape(@Nonnull BlockState pState) {
return RenderShape.MODEL; return RenderShape.MODEL;
} }
@Override @Override
public void onRemove(BlockState state, Level world, BlockPos pos, BlockState newState, boolean isMoving) { public void onRemove(BlockState state, @Nonnull Level world, @Nonnull BlockPos pos, BlockState newState, boolean isMoving) {
if (state.getBlock() != newState.getBlock()) { if (state.getBlock() != newState.getBlock()) {
if (this.shouldDropInventory(world, pos)) { if (this.shouldDropInventory(world, pos)) {
this.dropInventory(world, pos); this.dropInventory(world, pos);

View file

@ -0,0 +1,37 @@
package de.ellpeck.actuallyadditions.mod.blocks.blockhuds;
import com.mojang.blaze3d.platform.Window;
import de.ellpeck.actuallyadditions.mod.config.CommonConfig;
import de.ellpeck.actuallyadditions.mod.tile.TileEntityFarmer;
import net.minecraft.ChatFormatting;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.HitResult;
public class FarmerHud implements IBlockHud {
@Override
public void displayHud(GuiGraphics guiGraphics, Minecraft minecraft, Player player, ItemStack stack, HitResult rayCast, Window resolution) {
if (!(rayCast instanceof BlockHitResult) || minecraft.level == null) {
return;
}
BlockEntity tile = minecraft.level.getBlockEntity(((BlockHitResult) rayCast).getBlockPos());
if (tile instanceof TileEntityFarmer farmer) {
guiGraphics.drawString(minecraft.font, Component.translatable("info.actuallyadditions.farmer.area", farmer.getArea(), farmer.getArea()), (int) (resolution.getGuiScaledWidth() / 2.0f + 5), (int) (resolution.getGuiScaledHeight() / 2.0f - 0), 0xFFFFFF);
Component message;
if (!stack.isEmpty() && stack.getItem() == CommonConfig.Other.farmerConfigureItem) {
message = Component.translatable("info.actuallyadditions.farmer.validItem").withStyle(ChatFormatting.GREEN);
} else {
message = Component.translatable("info.actuallyadditions.farmer.invalidItem", Component.translatable(CommonConfig.Other.farmerConfigureItem.asItem().getDescriptionId()).getString()).withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC);
}
guiGraphics.drawString(minecraft.font, message, (int) (minecraft.getWindow().getGuiScaledWidth() / 2f + 5), (int) (minecraft.getWindow().getGuiScaledHeight() / 2f + 15), 0xFFFFFF);
}
}
}

View file

@ -24,8 +24,8 @@ public class ReconstructorHud implements IBlockHud {
} }
BlockEntity tile = minecraft.level.getBlockEntity(((BlockHitResult) rayCast).getBlockPos()); BlockEntity tile = minecraft.level.getBlockEntity(((BlockHitResult) rayCast).getBlockPos());
if (tile instanceof TileEntityAtomicReconstructor) { if (tile instanceof TileEntityAtomicReconstructor laser) {
ItemStack slot = ((TileEntityAtomicReconstructor) tile).inv.getStackInSlot(0); ItemStack slot = laser.inv.getStackInSlot(0);
Component lens_name; Component lens_name;
if (slot.isEmpty()) { if (slot.isEmpty()) {
lens_name = Component.translatable("info.actuallyadditions.nolens"); lens_name = Component.translatable("info.actuallyadditions.nolens");

View file

@ -107,8 +107,10 @@ public class CommonConfig {
public static ModConfigSpec.BooleanValue MOST_BLAND_PERSON_EVER; public static ModConfigSpec.BooleanValue MOST_BLAND_PERSON_EVER;
public static ModConfigSpec.ConfigValue<String> REDSTONECONFIGURATOR; public static ModConfigSpec.ConfigValue<String> REDSTONECONFIGURATOR;
public static ModConfigSpec.ConfigValue<String> RELAYCONFIGURATOR; public static ModConfigSpec.ConfigValue<String> RELAYCONFIGURATOR;
public static ModConfigSpec.ConfigValue<String> FARMERCONFIG;
public static Item redstoneConfigureItem = Items.AIR; public static Item redstoneConfigureItem = Items.AIR;
public static Item relayConfigureItem = Items.AIR; public static Item relayConfigureItem = Items.AIR;
public static Item farmerConfigureItem = Items.AIR;
public static void build() { public static void build() {
@ -164,6 +166,7 @@ public class CommonConfig {
REDSTONECONFIGURATOR = BUILDER.comment("define the item used to configure Redstone Mode").define("redstoneConfigurator", "minecraft:redstone_torch"); REDSTONECONFIGURATOR = BUILDER.comment("define the item used to configure Redstone Mode").define("redstoneConfigurator", "minecraft:redstone_torch");
RELAYCONFIGURATOR = BUILDER.comment("define the item used to configure Direction in laser relays").define("relayConfigurator", "minecraft:compass"); RELAYCONFIGURATOR = BUILDER.comment("define the item used to configure Direction in laser relays").define("relayConfigurator", "minecraft:compass");
FARMERCONFIG = BUILDER.comment("define the item used to configure the area in a farmer").define("farmerConfigurator", "minecraft:compass");
BUILDER.pop(); BUILDER.pop();
} }

View file

@ -26,10 +26,7 @@ import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.*;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.CropBlock;
import net.minecraft.world.level.block.StemBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootParams;
@ -47,8 +44,8 @@ public class DefaultFarmerBehavior implements IFarmerBehavior {
public static boolean defaultPlant(Level world, BlockPos pos, BlockState toPlant, IFarmer farmer, int use) { public static boolean defaultPlant(Level world, BlockPos pos, BlockState toPlant, IFarmer farmer, int use) {
if (toPlant != null) { if (toPlant != null) {
BlockPos farmland = pos.below(); BlockPos farmland = pos.below();
BlockState farmlandState = world.getBlockState(farmland); BlockState targetBlockstate = world.getBlockState(farmland);
if (farmlandState.is(BlockTags.DIRT) || farmlandState.is(Blocks.GRASS_BLOCK)) { if (!(targetBlockstate.getBlock() instanceof FarmBlock) && (targetBlockstate.is(BlockTags.DIRT) || targetBlockstate.is(Blocks.GRASS_BLOCK))) {
world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState()); world.setBlockAndUpdate(pos, Blocks.AIR.defaultBlockState());
useHoeAt(world, farmland); useHoeAt(world, farmland);
world.playSound(null, farmland, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F); world.playSound(null, farmland, SoundEvents.HOE_TILL, SoundSource.BLOCKS, 1.0F, 1.0F);
@ -183,7 +180,7 @@ public class DefaultFarmerBehavior implements IFarmerBehavior {
ItemStack itemstack = getHoeStack(); ItemStack itemstack = getHoeStack();
if (!player.mayUseItemAt(pos.relative(Direction.UP), Direction.UP, itemstack)) { if (!player.mayUseItemAt(pos.relative(Direction.UP), Direction.UP, itemstack)) { //TODO this does nothing. -Flanks
return InteractionResult.FAIL; return InteractionResult.FAIL;
} else { } else {
// UseOnContext dummyContext = new UseOnContext(world, player, InteractionHand.MAIN_HAND, itemstack, new BlockHitResult(new Vec3(0.5, 0.5, 0.5), Direction.UP, pos, false)); // UseOnContext dummyContext = new UseOnContext(world, player, InteractionHand.MAIN_HAND, itemstack, new BlockHitResult(new Vec3(0.5, 0.5, 0.5), Direction.UP, pos, false));

View file

@ -56,6 +56,8 @@ public class TileEntityFarmer extends TileEntityInventoryBase implements IFarmer
private int lastEnergy; private int lastEnergy;
private int area;
public TileEntityFarmer(BlockPos pos, BlockState state) { public TileEntityFarmer(BlockPos pos, BlockState state) {
super(ActuallyBlocks.FARMER.getTileEntityType(), pos, state, 12); super(ActuallyBlocks.FARMER.getTileEntityType(), pos, state, 12);
} }
@ -69,6 +71,7 @@ public class TileEntityFarmer extends TileEntityInventoryBase implements IFarmer
compound.putInt("CheckX", this.checkX); compound.putInt("CheckX", this.checkX);
compound.putInt("CheckY", this.checkY); compound.putInt("CheckY", this.checkY);
} }
compound.putInt("Area", this.area);
this.storage.writeToNBT(compound); this.storage.writeToNBT(compound);
super.writeSyncableNBT(compound, lookupProvider, type); super.writeSyncableNBT(compound, lookupProvider, type);
} }
@ -82,6 +85,7 @@ public class TileEntityFarmer extends TileEntityInventoryBase implements IFarmer
this.checkX = compound.getInt("CheckX"); this.checkX = compound.getInt("CheckX");
this.checkY = compound.getInt("CheckY"); this.checkY = compound.getInt("CheckY");
} }
this.area = compound.contains("Area") ?compound.getInt("Area"):CommonConfig.Machines.FARMER_AREA.get();
this.storage.readFromNBT(compound); this.storage.readFromNBT(compound);
super.readSyncableNBT(compound, lookupProvider, type); super.readSyncableNBT(compound, lookupProvider, type);
} }
@ -97,15 +101,15 @@ public class TileEntityFarmer extends TileEntityInventoryBase implements IFarmer
tile.serverTick(); tile.serverTick();
if (!tile.isRedstonePowered && tile.storage.getEnergyStored() > 0) { if (!tile.isRedstonePowered && tile.storage.getEnergyStored() > 0) {
int localArea = Math.min(tile.area, CommonConfig.Machines.FARMER_AREA.get());
if (tile.waitTime > 0) { if (tile.waitTime > 0) {
tile.waitTime--; tile.waitTime--;
if (tile.waitTime <= 0) { if (tile.waitTime <= 0) {
int area = CommonConfig.Machines.FARMER_AREA.get(); if (localArea % 2 == 0) {
if (area % 2 == 0) { localArea++;
area++;
} }
int radius = area / 2; int radius = localArea / 2;
BlockPos center = pos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING), radius + 1); BlockPos center = pos.relative(state.getValue(BlockStateProperties.HORIZONTAL_FACING), radius + 1);
@ -194,6 +198,26 @@ public class TileEntityFarmer extends TileEntityInventoryBase implements IFarmer
return this.worldPosition; return this.worldPosition;
} }
public int getArea() {
return this.area;
}
public void setArea(int area) {
this.area = Math.min(area, CommonConfig.Machines.FARMER_AREA.get());
}
public int cycleArea() {
if (this.area >= CommonConfig.Machines.FARMER_AREA.get())
this.area = 1;
else
this.area+= 2;
this.checkY = 0; // Reset the current position so we dont go off the rails and plant behind the machine when spamming area changes.
this.checkX = 0;
return this.area;
}
@Override @Override
public int getX() { public int getX() {
return this.worldPosition.getX(); return this.worldPosition.getX();

View file

@ -507,6 +507,9 @@
"info.actuallyadditions.redstoneMode.deactivation": "Deactivation", "info.actuallyadditions.redstoneMode.deactivation": "Deactivation",
"info.actuallyadditions.redstoneMode.invalidItem": "Hold a %s to toggle!", "info.actuallyadditions.redstoneMode.invalidItem": "Hold a %s to toggle!",
"info.actuallyadditions.redstoneMode.validItem": "Right-Click to toggle!", "info.actuallyadditions.redstoneMode.validItem": "Right-Click to toggle!",
"info.actuallyadditions.farmer.validItem": "Right-Click to change area!",
"info.actuallyadditions.farmer.invalidItem": "Hold a %s to modify farming area!",
"info.actuallyadditions.farmer.area": "Area: %dx%d",
"info.actuallyadditions.laserRelay.item.extra": "Priority", "info.actuallyadditions.laserRelay.item.extra": "Priority",
"info.actuallyadditions.laserRelay.item.display.1": "Right-Click to increase!", "info.actuallyadditions.laserRelay.item.display.1": "Right-Click to increase!",
"info.actuallyadditions.laserRelay.item.display.2": "Sneak-Right-Click to decrease!", "info.actuallyadditions.laserRelay.item.display.2": "Sneak-Right-Click to decrease!",