aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/TakeFlowerGoal.cpp
blob: 48db34d389201a9d570b26cd720196d28790238d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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<VillagerGolem>();

	this->villager = villager;
	setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag);
}

bool TakeFlowerGoal::canUse()
{
	if (villager->getAge() >= 0) return false;
	if (!villager->level->isDay()) return false;

	vector<shared_ptr<Entity> > *golems = villager->level->getEntitiesOfClass(typeid(VillagerGolem), villager->bb->grow(6, 2, 6));
	if ( golems == nullptr )
		return false;

	if ( golems->size() == 0)
	{
		delete golems;
		return false;
	}

    for (auto entity : *golems )
    {
		if ( entity == nullptr )
			continue;

		// safe to call std::static_pointer_cast because of getEntitiesOfClass(typeid(VillagerGolem), ...) makes sure we do not have entities of any other type.
		auto vg = std::static_pointer_cast<VillagerGolem>(entity);
		if ( vg && vg->getOfferFlowerTick() > 0)
		{
			golem = vg;
			delete golems;
			return true;
		}
	}
	delete golems;
	return false;
}

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<VillagerGolem>();
	villager->getNavigation()->stop();
}

void TakeFlowerGoal::tick()
{
	villager->getLookControl()->setLookAt(golem.lock(), 30, 30);
	if (golem.lock()->getOfferFlowerTick() == pickupTick)
	{
		villager->getNavigation()->moveTo(golem.lock(), 0.5f);
		takeFlower = true;
	}

	if (takeFlower)
	{
		if (villager->distanceToSqr(golem.lock()) < 2 * 2)
		{
			golem.lock()->offerFlower(false);
			villager->getNavigation()->stop();
		}
	}
}