aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World/MoveControl.cpp
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 12:16:08 +0800
commitb691c43c44ff180d10e7d4a9afc83b98551ff586 (patch)
tree3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/MoveControl.cpp
parentdef8cb415354ac390b7e89052a50605285f1aca9 (diff)
Initial commit
Diffstat (limited to 'Minecraft.World/MoveControl.cpp')
-rw-r--r--Minecraft.World/MoveControl.cpp75
1 files changed, 75 insertions, 0 deletions
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