diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/MakeLoveGoal.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/MakeLoveGoal.cpp')
| -rw-r--r-- | Minecraft.World/MakeLoveGoal.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/Minecraft.World/MakeLoveGoal.cpp b/Minecraft.World/MakeLoveGoal.cpp new file mode 100644 index 00000000..89f09f1d --- /dev/null +++ b/Minecraft.World/MakeLoveGoal.cpp @@ -0,0 +1,103 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.village.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.phys.h" +#include "MakeLoveGoal.h" + +MakeLoveGoal::MakeLoveGoal(Villager *villager) +{ + village = weak_ptr<Village>(); + partner = weak_ptr<Villager>(); + loveMakingTime = 0; + + this->villager = villager; + level = villager->level; + setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); +} + +bool MakeLoveGoal::canUse() +{ + + if (villager->getAge() != 0) return false; + if (villager->getRandom()->nextInt(500) != 0) return false; + + village = level->villages->getClosestVillage(Mth::floor(villager->x), Mth::floor(villager->y), Mth::floor(villager->z), 0); + if (village.lock() == NULL) return false; + if (!villageNeedsMoreVillagers()) return false; + + shared_ptr<Entity> mate = level->getClosestEntityOfClass(typeid(Villager), villager->bb->grow(8, 3, 8), villager->shared_from_this()); + if (mate == NULL) return false; + + partner = weak_ptr<Villager>(dynamic_pointer_cast<Villager>(mate)); + if (partner.lock()->getAge() != 0) return false; + + return true; +} + +void MakeLoveGoal::start() +{ + loveMakingTime = 300; + villager->setInLove(true); +} + +void MakeLoveGoal::stop() +{ + village = weak_ptr<Village>(); + partner = weak_ptr<Villager>(); + villager->setInLove(false); +} + +bool MakeLoveGoal::canContinueToUse() +{ + return partner.lock() != NULL && loveMakingTime >= 0 && villageNeedsMoreVillagers() && villager->getAge() == 0; +} + +void MakeLoveGoal::tick() +{ + --loveMakingTime; + villager->getLookControl()->setLookAt(partner.lock(), 10, 30); + + if (villager->distanceToSqr(partner.lock()) > 1.5 * 1.5) + { + villager->getNavigation()->moveTo(partner.lock(), 0.25f); + } + else + { + if (loveMakingTime == 0 && partner.lock()->isInLove()) breed(); + } + + if (villager->getRandom()->nextInt(35) == 0) level->broadcastEntityEvent(villager->shared_from_this(), EntityEvent::LOVE_HEARTS); +} + +bool MakeLoveGoal::villageNeedsMoreVillagers() +{ + shared_ptr<Village> _village = village.lock(); + if( _village == NULL ) return false; + + int idealSize = (int) ((float) _village->getDoorCount() * 0.35); + // System.out.println("idealSize: " + idealSize + " pop: " + + // village.getPopulationSize()); + return _village->getPopulationSize() < idealSize; +} + +void MakeLoveGoal::breed() +{ + // 4J Stu - This sets a timer that stops these villagers from trying to breed again + // We should do this even if breeding fails due to vilalger count to stop them continually trying to breed + partner.lock()->setAge(5 * 60 * 20); + villager->setAge(5 * 60 * 20); + // 4J - added limit to number of animals that can be bred + if(level->canCreateMore( eTYPE_VILLAGER, Level::eSpawnType_Breed) ) + { + shared_ptr<Villager> child = shared_ptr<Villager>( new Villager(level) ); + child->setAge(-20 * 60 * 20); + child->setProfession(villager->getRandom()->nextInt(Villager::PROFESSION_MAX)); + child->moveTo(villager->x, villager->y, villager->z, 0, 0); + level->addEntity(child); + level->broadcastEntityEvent(child, EntityEvent::LOVE_HEARTS); + } +} |
