aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/MoveTowardsTargetGoal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/MoveTowardsTargetGoal.cpp')
-rw-r--r--Minecraft.World/MoveTowardsTargetGoal.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/Minecraft.World/MoveTowardsTargetGoal.cpp b/Minecraft.World/MoveTowardsTargetGoal.cpp
new file mode 100644
index 00000000..6d9810b5
--- /dev/null
+++ b/Minecraft.World/MoveTowardsTargetGoal.cpp
@@ -0,0 +1,43 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.ai.control.h"
+#include "net.minecraft.world.entity.ai.navigation.h"
+#include "net.minecraft.world.entity.ai.util.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.phys.h"
+#include "MoveTowardsTargetGoal.h"
+
+MoveTowardsTargetGoal::MoveTowardsTargetGoal(PathfinderMob *mob, float speed, float within)
+{
+ this->mob = mob;
+ this->speed = speed;
+ this->within = within;
+ setRequiredControlFlags(Control::MoveControlFlag);
+}
+
+bool MoveTowardsTargetGoal::canUse()
+{
+ target = weak_ptr<Mob>(mob->getTarget());
+ if (target.lock() == NULL) return false;
+ if (target.lock()->distanceToSqr(mob->shared_from_this()) > within * within) return false;
+ Vec3 *pos = RandomPos::getPosTowards(dynamic_pointer_cast<PathfinderMob>(mob->shared_from_this()), 16, 7, Vec3::newTemp(target.lock()->x, target.lock()->y, target.lock()->z));
+ if (pos == NULL) return false;
+ wantedX = pos->x;
+ wantedY = pos->y;
+ wantedZ = pos->z;
+ return true;
+}
+
+bool MoveTowardsTargetGoal::canContinueToUse()
+{
+ return target.lock() != NULL && !mob->getNavigation()->isDone() && target.lock()->isAlive() && target.lock()->distanceToSqr(mob->shared_from_this()) < within * within;
+}
+
+void MoveTowardsTargetGoal::stop()
+{
+ target = weak_ptr<Mob>();
+}
+
+void MoveTowardsTargetGoal::start()
+{
+ mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed);
+} \ No newline at end of file