the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 107 lines 3.2 kB view raw
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}