4jcraft/Minecraft.World/AI/Goals/LookAtPlayerGoal.cpp
MatthewBeshay dfb0e3b03e refactor: replace NULL with nullptr across C++ codebase
Excludes vendored C libs (zlib, Miles, DirectXMath, boost, Iggy).
2026-03-30 16:25:52 +11:00

66 lines
2.1 KiB
C++

#include "../../Platform/stdafx.h"
#include "../../Headers/net.minecraft.world.entity.h"
#include "../../Headers/net.minecraft.world.entity.ai.control.h"
#include "../../Headers/net.minecraft.world.level.h"
#include "../../Headers/net.minecraft.world.phys.h"
#include "LookAtPlayerGoal.h"
LookAtPlayerGoal::LookAtPlayerGoal(Mob* mob, const std::type_info& lookAtType,
float lookDistance)
: lookAtType(lookAtType) {
this->mob = mob;
this->lookDistance = lookDistance;
probability = 0.02f;
setRequiredControlFlags(Control::LookControlFlag);
lookTime = 0;
}
LookAtPlayerGoal::LookAtPlayerGoal(Mob* mob, const std::type_info& lookAtType,
float lookDistance, float probability)
: lookAtType(lookAtType) {
this->mob = mob;
this->lookDistance = lookDistance;
this->probability = probability;
setRequiredControlFlags(Control::LookControlFlag);
lookTime = 0;
}
bool LookAtPlayerGoal::canUse() {
if (mob->getRandom()->nextFloat() >= probability) return false;
if (mob->getTarget() != nullptr) {
lookAt = mob->getTarget();
}
if (lookAtType == typeid(Player)) {
lookAt =
mob->level->getNearestPlayer(mob->shared_from_this(), lookDistance);
} else {
AABB mob_bb = mob->bb.grow(lookDistance, 3, lookDistance);
lookAt = std::weak_ptr<Entity>(mob->level->getClosestEntityOfClass(
lookAtType, &mob_bb, mob->shared_from_this()));
}
return lookAt.lock() != nullptr;
}
bool LookAtPlayerGoal::canContinueToUse() {
if (lookAt.lock() == nullptr || !lookAt.lock()->isAlive()) return false;
if (mob->distanceToSqr(lookAt.lock()) > lookDistance * lookDistance)
return false;
return lookTime > 0;
}
void LookAtPlayerGoal::start() {
lookTime = 40 + mob->getRandom()->nextInt(40);
}
void LookAtPlayerGoal::stop() { lookAt = std::weak_ptr<Entity>(); }
void LookAtPlayerGoal::tick() {
mob->getLookControl()->setLookAt(
lookAt.lock()->x, lookAt.lock()->y + lookAt.lock()->getHeadHeight(),
lookAt.lock()->z, 10, mob->getMaxHeadXRot());
--lookTime;
}