From b691c43c44ff180d10e7d4a9afc83b98551ff586 Mon Sep 17 00:00:00 2001 From: daoge_cmd <3523206925@qq.com> Date: Sun, 1 Mar 2026 12:16:08 +0800 Subject: Initial commit --- Minecraft.World/MoveControl.cpp | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Minecraft.World/MoveControl.cpp (limited to 'Minecraft.World/MoveControl.cpp') diff --git a/Minecraft.World/MoveControl.cpp b/Minecraft.World/MoveControl.cpp new file mode 100644 index 00000000..30e94e68 --- /dev/null +++ b/Minecraft.World/MoveControl.cpp @@ -0,0 +1,75 @@ +#include "stdafx.h" +#include "net.minecraft.world.entity.ai.control.h" +#include "net.minecraft.world.entity.h" +#include "net.minecraft.world.phys.h" +#include "MoveControl.h" + +const float MoveControl::MIN_SPEED = 0.0005f; +const float MoveControl::MIN_SPEED_SQR = MIN_SPEED * MIN_SPEED; + +MoveControl::MoveControl(Mob *mob) +{ + this->mob = mob; + wantedX = mob->x; + wantedY = mob->y; + wantedZ = mob->z; + + speed = 0.0f; + + _hasWanted = false; +} + +bool MoveControl::hasWanted() +{ + return _hasWanted; +} + +float MoveControl::getSpeed() +{ + return speed; +} + +void MoveControl::setWantedPosition(double x, double y, double z, float speed) +{ + wantedX = x; + wantedY = y; + wantedZ = z; + this->speed = speed; + _hasWanted = true; +} + +void MoveControl::tick() +{ + mob->setYya(0); + if (!_hasWanted) return; + _hasWanted = false; + + int yFloor = floor(mob->bb->y0 + .5f); + + double xd = wantedX - mob->x; + double zd = wantedZ - mob->z; + double yd = wantedY - yFloor; + double dd = xd * xd + yd * yd + zd * zd; + if (dd < MIN_SPEED_SQR) return; + + float yRotD = (float) (atan2(zd, xd) * 180 / PI) - 90; + + mob->yRot = rotlerp(mob->yRot, yRotD, MAX_TURN); + mob->setSpeed(speed * mob->getWalkingSpeedModifier()); + + if (yd > 0 && xd * xd + zd * zd < 1) mob->getJumpControl()->jump(); +} + +float MoveControl::rotlerp(float a, float b, float max) +{ + float diff = Mth::wrapDegrees(b - a); + if (diff > max) + { + diff = max; + } + if (diff < -max) + { + diff = -max; + } + return a + diff; +} \ No newline at end of file -- cgit v1.2.3