From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/TakeFlowerGoal.cpp | 82 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Minecraft.World/TakeFlowerGoal.cpp (limited to 'Minecraft.World/TakeFlowerGoal.cpp') diff --git a/Minecraft.World/TakeFlowerGoal.cpp b/Minecraft.World/TakeFlowerGoal.cpp new file mode 100644 index 00000000..34c584c6 --- /dev/null +++ b/Minecraft.World/TakeFlowerGoal.cpp @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.ai.goal.h" +#include "net.minecraft.world.entity.ai.navigation.h" +#include "net.minecraft.world.entity.npc.h" +#include "net.minecraft.world.entity.animal.h" +#include "net.minecraft.world.level.h" +#include "net.minecraft.world.phys.h" +#include "TakeFlowerGoal.h" + +TakeFlowerGoal::TakeFlowerGoal(Villager *villager) +{ + takeFlower = false; + pickupTick = 0; + golem = weak_ptr(); + + this->villager = villager; + setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag); +} + +bool TakeFlowerGoal::canUse() +{ + if (villager->getAge() >= 0) return false; + if (!villager->level->isDay()) return false; + + vector > *golems = villager->level->getEntitiesOfClass(typeid(VillagerGolem), villager->bb->grow(6, 2, 6)); + if (golems->size() == 0) + { + delete golems; + return false; + } + + //for (Entity e : golems) + for(AUTO_VAR(it,golems->begin()); it != golems->end(); ++it) + { + shared_ptr vg = dynamic_pointer_cast(*it); + if (vg->getOfferFlowerTick() > 0) + { + golem = weak_ptr(vg); + break; + } + } + delete golems; + return golem.lock() != NULL; +} + +bool TakeFlowerGoal::canContinueToUse() +{ + return golem.lock() != NULL && golem.lock()->getOfferFlowerTick() > 0; +} + +void TakeFlowerGoal::start() +{ + pickupTick = villager->getRandom()->nextInt((int) (OfferFlowerGoal::OFFER_TICKS * 0.8)); + takeFlower = false; + golem.lock()->getNavigation()->stop(); +} + +void TakeFlowerGoal::stop() +{ + golem = weak_ptr(); + villager->getNavigation()->stop(); +} + +void TakeFlowerGoal::tick() +{ + villager->getLookControl()->setLookAt(golem.lock(), 30, 30); + if (golem.lock()->getOfferFlowerTick() == pickupTick) + { + villager->getNavigation()->moveTo(golem.lock(), 0.15f); + takeFlower = true; + } + + if (takeFlower) + { + if (villager->distanceToSqr(golem.lock()) < 2 * 2) + { + golem.lock()->offerFlower(false); + villager->getNavigation()->stop(); + } + } +} \ No newline at end of file -- cgit v1.2.3