4jcraft/Minecraft.World/AI/Goals/LookAtPlayerGoal.cpp
2026-03-21 15:10:07 -05:00

65 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() != NULL) {
lookAt = mob->getTarget();
}
if (lookAtType == typeid(Player)) {
lookAt =
mob->level->getNearestPlayer(mob->shared_from_this(), lookDistance);
} else {
lookAt = std::weak_ptr<Entity>(mob->level->getClosestEntityOfClass(
lookAtType, mob->bb->grow(lookDistance, 3, lookDistance),
mob->shared_from_this()));
}
return lookAt.lock() != NULL;
}
bool LookAtPlayerGoal::canContinueToUse() {
if (lookAt.lock() == NULL || !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;
}