summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Villager.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Mobs/Villager.h61
1 files changed, 50 insertions, 11 deletions
diff --git a/src/Mobs/Villager.h b/src/Mobs/Villager.h
index 4ac06765c..ef1c9e70f 100644
--- a/src/Mobs/Villager.h
+++ b/src/Mobs/Villager.h
@@ -3,6 +3,7 @@
#include "PassiveMonster.h"
#include "../Blocks/ChunkInterface.h"
+#include "../Inventory.h"
@@ -38,30 +39,68 @@ public:
virtual void KilledBy (TakeDamageInfo & a_TDI) override;
// cVillager functions
- /** return true if the given blocktype are: crops, potatoes or carrots. */
- bool IsBlockFarmable(BLOCKTYPE a_BlockType);
+ /** Returns the villager hidden inventory (8 slots). */
+ cItemGrid & GetInventory(void) { return m_Inventory; }
+ const cItemGrid & GetInventory(void) const { return m_Inventory; }
+
+ /** Returns true if the given blocktype are: crops, potatoes or carrots and they have full grown up. */
+ bool IsBlockFarmable(BLOCKTYPE a_BlockType, NIBBLETYPE a_BlockMeta);
+
+ /** Returns true if the block at the given location is a fully grown up crop. */
+ bool IsHarvestable(Vector3i a_CropsPos);
+
+ /** Returns true if seeds can be planted at a given location. */
+ bool IsPlantable(Vector3i a_CropsPos);
// Farmer functions
- /** Searches in a 11x7x11 area for crops. If it found some it will navigate to them. */
- void HandleFarmerPrepareFarmCrops();
+ enum eFarmerAction
+ {
+ faIdling,
+ faPlanting,
+ faHarvesting,
+ } ;
+
+ static const int FARMER_RANDOM_TICK_SPEED = 5;
+ /** With 10% chance, it takes about 20 seconds to find a spot. */
+ static constexpr double FARMER_SPECIAL_ACTION_CHANCE = 0.1;
+ /** This distance from the Villager makes for a 31x3x31 area. */
+ static constexpr Vector3i FARMER_SCAN_CROPS_DIST {15, 1, 15};
- /** Looks if the farmer has reached it's destination, and if it's still crops and the destination is closer then 2 blocks it will harvest them. */
+ /** Tick function for farmers. */
+ void TickFarmer();
+
+ /** Searches in a 31x3x31 area to harvest crops or spaces to plant crops. If it found some it will navigate to them. */
+ void ScanAreaForWork();
+
+ /** Looks if the farmer has reached it's destination, and if it's still crops and the destination is closer then 1 block it will harvest them. */
void HandleFarmerTryHarvestCrops();
- /** Replaces the crops he harvested. */
- void HandleFarmerPlaceCrops();
+ /** Looks if the farmer has reached it's destination, and if it's still non obstructed farmland and the destination is closer then 1 block it will plant crops. */
+ void HandleFarmerTryPlaceCrops();
+
+ /** Checking for harvesting or planting nearby crops */
+ void CheckForNearbyCrops();
+
+ /** Returns whether the farmer has crops in his inventory to plant. */
+ bool CanPlantCrops();
+
+ /** Returns whether the farmer is not working. */
+ bool IsIdling()
+ {
+ return m_FarmerAction == faIdling;
+ }
// Get and set functions.
- int GetVilType(void) const { return m_Type; }
- Vector3i GetCropsPos(void) const { return m_CropsPos; }
- bool DoesHaveActionActivated(void) const { return m_VillagerAction; }
+ int GetVilType(void) const { return m_Type; }
+ eFarmerAction GetFarmerAction(void) const { return m_FarmerAction; }
private:
int m_ActionCountDown;
int m_Type;
- bool m_VillagerAction;
+ eFarmerAction m_FarmerAction;
Vector3i m_CropsPos;
+ cItemGrid m_Inventory;
} ;