aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/RandomStrollGoal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/RandomStrollGoal.cpp')
-rw-r--r--Minecraft.World/RandomStrollGoal.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/Minecraft.World/RandomStrollGoal.cpp b/Minecraft.World/RandomStrollGoal.cpp
new file mode 100644
index 00000000..21f3adb1
--- /dev/null
+++ b/Minecraft.World/RandomStrollGoal.cpp
@@ -0,0 +1,60 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.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.phys.h"
+#include "SharedConstants.h"
+#include "RandomStrollGoal.h"
+
+RandomStrollGoal::RandomStrollGoal(PathfinderMob *mob, float speed)
+{
+ this->mob = mob;
+ this->speed = speed;
+ setRequiredControlFlags(Control::MoveControlFlag | Control::LookControlFlag);
+}
+
+bool RandomStrollGoal::canUse()
+{
+ // 4J - altered a little so we can do some more random strolling when appropriate, to try and move any animals that aren't confined to a fenced-off region far enough to determine we can despawn them
+ if (mob->getNoActionTime() < SharedConstants::TICKS_PER_SECOND * 5)
+ {
+ if (mob->getRandom()->nextInt(120) == 0)
+ {
+ Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast<PathfinderMob>(mob->shared_from_this()), 10, 7);
+ if (pos == NULL) return false;
+ wantedX = pos->x;
+ wantedY = pos->y;
+ wantedZ = pos->z;
+ return true;
+ }
+ }
+ else
+ {
+ // This entity wouldn't normally be randomly strolling. However, if our management system says that it should do, then do. Don't
+ // bother waiting for random conditions to be met before picking a direction though as the point here is to see if it is possible to
+ // stroll out of a given area and so waiting around is just wasting time
+
+ if( mob->isExtraWanderingEnabled() )
+ {
+ Vec3 *pos = RandomPos::getPos(dynamic_pointer_cast<PathfinderMob>(mob->shared_from_this()), 10, 7,mob->getWanderingQuadrant());
+ if (pos == NULL) return false;
+ wantedX = pos->x;
+ wantedY = pos->y;
+ wantedZ = pos->z;
+ return true;
+ }
+
+ }
+ return false;
+}
+
+bool RandomStrollGoal::canContinueToUse()
+{
+ return !mob->getNavigation()->isDone();
+}
+
+void RandomStrollGoal::start()
+{
+ mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed);
+} \ No newline at end of file