diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.World/MoveControl.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.World/MoveControl.cpp')
| -rw-r--r-- | Minecraft.World/MoveControl.cpp | 75 |
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 |
