From 5279609561880d5424b3a383bbd22740941a36d0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Apr 2026 08:00:41 +0000 Subject: [PATCH] Polish legacy Farmer validation logic Agent-Logs-Url: https://github.com/MCCTeam/Minecraft-Console-Client/sessions/395596c2-cc40-4295-8100-a8408243f45b Co-authored-by: milutinke <441903+milutinke@users.noreply.github.com> --- MinecraftClient/ChatBots/Farmer.cs | 35 +++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/MinecraftClient/ChatBots/Farmer.cs b/MinecraftClient/ChatBots/Farmer.cs index 8a21ae5c..5d50ac55 100644 --- a/MinecraftClient/ChatBots/Farmer.cs +++ b/MinecraftClient/ChatBots/Farmer.cs @@ -616,18 +616,18 @@ namespace MinecraftClient.ChatBots if (fullyGrown && material is Material.Melon or Material.Pumpkin) return true; - var isFullyGrown = IsCropFullyGrown(GetWorld().GetBlock(location), cropType); + var isFullyGrown = IsCropFullyGrown(GetWorld().GetBlock(location), cropType, location); return fullyGrown ? isFullyGrown : !isFullyGrown; }) .ToList(); } - private bool IsCropFullyGrown(Block block, CropType cropType) + private bool IsCropFullyGrown(Block block, CropType cropType, Location? location = null) { var protocolVersion = GetProtocolVersion(); if (protocolVersion < Protocol18Handler.MC_1_13_Version) - return IsLegacyCropFullyGrown(block, cropType); + return IsLegacyCropFullyGrown(block, cropType, location); switch (cropType) { @@ -784,21 +784,44 @@ namespace MinecraftClient.ChatBots return false; } - private static bool IsLegacyCropFullyGrown(Block block, CropType cropType) + private bool IsLegacyCropFullyGrown(Block block, CropType cropType, Location? location) { return cropType switch { CropType.Beetroot => block.BlockId == 207 && block.BlockMeta >= 3, CropType.Carrot => block.BlockId == 141 && block.BlockMeta >= 7, - CropType.Melon => block.BlockId == 105 && block.BlockMeta >= 7, + CropType.Melon => block.BlockId == 105 + && (block.BlockMeta >= 7 || HasAdjacentBlock(location, Material.Melon)), CropType.NetherWart => block.BlockId == 115 && block.BlockMeta >= 3, - CropType.Pumpkin => block.BlockId == 104 && block.BlockMeta >= 7, + CropType.Pumpkin => block.BlockId == 104 + && (block.BlockMeta >= 7 || HasAdjacentBlock(location, Material.Pumpkin)), CropType.Potato => block.BlockId == 142 && block.BlockMeta >= 7, CropType.Wheat => block.BlockId == 59 && block.BlockMeta >= 7, _ => false }; } + private bool HasAdjacentBlock(Location? location, Material material) + { + if (location is not Location stemLocation) + return false; + + var world = GetWorld(); + int x = (int)Math.Floor(stemLocation.X); + int y = (int)Math.Floor(stemLocation.Y); + int z = (int)Math.Floor(stemLocation.Z); + + Location[] adjacentLocations = + [ + new(x + 1, y, z), + new(x - 1, y, z), + new(x, y, z + 1), + new(x, y, z - 1) + ]; + + return adjacentLocations.Any(adjacentLocation => world.GetBlock(adjacentLocation).Type == material); + } + // Yoinked from ReinforceZwei's AutoTree and adapted to search the whole of inventory in additon to the hotbar private bool SwitchToItem(ItemType itemType) {