aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/FleeSunGoal.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Minecraft.World/FleeSunGoal.cpp')
-rw-r--r--Minecraft.World/FleeSunGoal.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/Minecraft.World/FleeSunGoal.cpp b/Minecraft.World/FleeSunGoal.cpp
new file mode 100644
index 00000000..a9799038
--- /dev/null
+++ b/Minecraft.World/FleeSunGoal.cpp
@@ -0,0 +1,52 @@
+#include "stdafx.h"
+#include "net.minecraft.world.entity.ai.control.h"
+#include "net.minecraft.world.entity.ai.navigation.h"
+#include "net.minecraft.world.entity.h"
+#include "net.minecraft.world.level.h"
+#include "net.minecraft.world.phys.h"
+#include "FleeSunGoal.h"
+
+FleeSunGoal::FleeSunGoal(PathfinderMob *mob, float speed)
+{
+ this->mob = mob;
+ this->speed = speed;
+ this->level = mob->level;
+ setRequiredControlFlags(Control::MoveControlFlag);
+}
+
+bool FleeSunGoal::canUse()
+{
+ if (!level->isDay()) return false;
+ if (!mob->isOnFire()) return false;
+ if (!level->canSeeSky(Mth::floor(mob->x), (int) mob->bb->y0, Mth::floor(mob->z))) return false;
+
+ Vec3 *pos = getHidePos();
+ if (pos == NULL) return false;
+ wantedX = pos->x;
+ wantedY = pos->y;
+ wantedZ = pos->z;
+ return true;
+}
+
+bool FleeSunGoal::canContinueToUse()
+{
+ return !mob->getNavigation()->isDone();
+}
+
+void FleeSunGoal::start()
+{
+ mob->getNavigation()->moveTo(wantedX, wantedY, wantedZ, speed);
+}
+
+Vec3 *FleeSunGoal::getHidePos()
+{
+ Random *random = mob->getRandom();
+ for (int i = 0; i < 10; i++)
+ {
+ int xt = Mth::floor(mob->x + random->nextInt(20) - 10);
+ int yt = Mth::floor(mob->bb->y0 + random->nextInt(6) - 3);
+ int zt = Mth::floor(mob->z + random->nextInt(20) - 10);
+ if (!level->canSeeSky(xt, yt, zt) && mob->getWalkTargetValue(xt, yt, zt) < 0) return Vec3::newTemp(xt, yt, zt);
+ }
+ return NULL;
+} \ No newline at end of file