the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "net.minecraft.world.entity.ai.control.h"
3#include "net.minecraft.world.entity.ai.village.h"
4#include "net.minecraft.world.entity.ai.navigation.h"
5#include "net.minecraft.world.entity.npc.h"
6#include "net.minecraft.world.entity.h"
7#include "net.minecraft.world.level.h"
8#include "net.minecraft.world.phys.h"
9#include "MakeLoveGoal.h"
10
11MakeLoveGoal::MakeLoveGoal(Villager *villager)
12{
13 village = weak_ptr<Village>();
14 partner = weak_ptr<Villager>();
15 loveMakingTime = 0;
16
17 this->villager = villager;
18 level = villager->level;
19 setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag);
20}
21
22bool MakeLoveGoal::canUse()
23{
24
25 if (villager->getAge() != 0) return false;
26 if (villager->getRandom()->nextInt(500) != 0) return false;
27
28 village = level->villages->getClosestVillage(Mth::floor(villager->x), Mth::floor(villager->y), Mth::floor(villager->z), 0);
29 if (village.lock() == NULL) return false;
30 if (!villageNeedsMoreVillagers()) return false;
31
32 shared_ptr<Entity> mate = level->getClosestEntityOfClass(typeid(Villager), villager->bb->grow(8, 3, 8), villager->shared_from_this());
33 if (mate == NULL) return false;
34
35 partner = weak_ptr<Villager>(dynamic_pointer_cast<Villager>(mate));
36 if (partner.lock()->getAge() != 0) return false;
37
38 return true;
39}
40
41void MakeLoveGoal::start()
42{
43 loveMakingTime = 300;
44 villager->setInLove(true);
45}
46
47void MakeLoveGoal::stop()
48{
49 village = weak_ptr<Village>();
50 partner = weak_ptr<Villager>();
51 villager->setInLove(false);
52}
53
54bool MakeLoveGoal::canContinueToUse()
55{
56 return partner.lock() != NULL && loveMakingTime >= 0 && villageNeedsMoreVillagers() && villager->getAge() == 0;
57}
58
59void MakeLoveGoal::tick()
60{
61 --loveMakingTime;
62 villager->getLookControl()->setLookAt(partner.lock(), 10, 30);
63
64 if (villager->distanceToSqr(partner.lock()) > 1.5 * 1.5)
65 {
66 villager->getNavigation()->moveTo(partner.lock(), 0.25f);
67 }
68 else
69 {
70 if (loveMakingTime == 0 && partner.lock()->isInLove()) breed();
71 }
72
73 if (villager->getRandom()->nextInt(35) == 0) level->broadcastEntityEvent(villager->shared_from_this(), EntityEvent::LOVE_HEARTS);
74}
75
76bool MakeLoveGoal::villageNeedsMoreVillagers()
77{
78 shared_ptr<Village> _village = village.lock();
79 if( _village == NULL ) return false;
80
81 if (!_village->isBreedTimerOk())
82 {
83 return false;
84 }
85
86 int idealSize = (int) ((float) _village->getDoorCount() * 0.35);
87 // System.out.println("idealSize: " + idealSize + " pop: " +
88 // village.getPopulationSize());
89 return _village->getPopulationSize() < idealSize;
90}
91
92void MakeLoveGoal::breed()
93{
94 // 4J Stu - This sets a timer that stops these villagers from trying to breed again
95 // We should do this even if breeding fails due to vilalger count to stop them continually trying to breed
96 partner.lock()->setAge(5 * 60 * 20);
97 villager->setAge(5 * 60 * 20);
98 // 4J - added limit to number of animals that can be bred
99 if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Breed) )
100 {
101 shared_ptr<Villager> child = dynamic_pointer_cast<Villager>( villager->getBreedOffspring(partner.lock()) );
102 child->setAge(-20 * 60 * 20);
103 child->moveTo(villager->x, villager->y, villager->z, 0, 0);
104 level->addEntity(child);
105 level->broadcastEntityEvent(child, EntityEvent::LOVE_HEARTS);
106 }
107}