diff options
Diffstat (limited to 'Minecraft.World/FleeSunGoal.cpp')
| -rw-r--r-- | Minecraft.World/FleeSunGoal.cpp | 52 |
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 |
