aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.World
diff options
context:
space:
mode:
authorModMaker101 <119018978+ModMaker101@users.noreply.github.com>2026-03-05 17:07:47 -0500
committerGitHub <noreply@github.com>2026-03-05 16:07:47 -0600
commiteed770b121aa4ce38f002db042d0137c24c6d344 (patch)
tree5c6886f7ec65a7828bc6e34a469514e418bcf78b /Minecraft.World
parenta0b2fe885d35bf653203fb02a8fc347de092bfc7 (diff)
Fixed boats falling and a TP glitch #266 (#615)
Diffstat (limited to 'Minecraft.World')
-rw-r--r--Minecraft.World/Boat.cpp17
-rw-r--r--Minecraft.World/LivingEntity.cpp76
2 files changed, 48 insertions, 45 deletions
diff --git a/Minecraft.World/Boat.cpp b/Minecraft.World/Boat.cpp
index e39bd7f3..1811c209 100644
--- a/Minecraft.World/Boat.cpp
+++ b/Minecraft.World/Boat.cpp
@@ -87,7 +87,7 @@ Boat::Boat(Level *level, double x, double y, double z) : Entity( level )
double Boat::getRideHeight()
{
- return bbHeight * 0.0f - 0.3f;
+ return heightOffset;
}
bool Boat::hurt(DamageSource *source, float hurtDamage)
@@ -283,11 +283,11 @@ void Boat::tick()
// 4J Stu - Fix for #9579 - GAMEPLAY: Boats with a player in them slowly sink under the water over time, and with no player in them they float into the sky.
// Just make the boats bob up and down rather than any other client-side movement when not receiving packets from server
- if (waterPercentage < 1)
- {
- double bob = waterPercentage * 2 - 1;
- yd += 0.04f * bob;
- }
+ if (waterPercentage > 0)
+ {
+ double bob = waterPercentage * 2 - 1;
+ yd += 0.04f * bob;
+ }
else
{
if (yd < 0) yd /= 2;
@@ -307,15 +307,14 @@ void Boat::tick()
return;
}
- if (waterPercentage < 1)
+ if (waterPercentage > 0)
{
double bob = waterPercentage * 2 - 1;
yd += 0.04f * bob;
}
else
{
- if (yd < 0) yd /= 2;
- yd += 0.007f;
+ yd = 0;
}
diff --git a/Minecraft.World/LivingEntity.cpp b/Minecraft.World/LivingEntity.cpp
index ef5658c3..ce702676 100644
--- a/Minecraft.World/LivingEntity.cpp
+++ b/Minecraft.World/LivingEntity.cpp
@@ -1305,42 +1305,46 @@ void LivingEntity::teleportTo(double x, double y, double z)
void LivingEntity::findStandUpPosition(shared_ptr<Entity> vehicle)
{
- AABB *boundingBox;
- double fallbackX = vehicle->x;
- double fallbackY = vehicle->bb->y0 + vehicle->bbHeight;
- double fallbackZ = vehicle->z;
-
- for (double xDiff = -1.5; xDiff < 2; xDiff += 1.5)
- {
- for (double zDiff = -1.5; zDiff < 2; zDiff += 1.5)
- {
- if (xDiff == 0 && zDiff == 0)
- {
- continue;
- }
-
- int xToInt = (int) (x + xDiff);
- int zToInt = (int) (z + zDiff);
- boundingBox = bb->cloneMove(xDiff, 1, zDiff);
-
- if (level->getTileCubes(boundingBox, true)->empty())
- {
- if (level->isTopSolidBlocking(xToInt, (int) y, zToInt))
- {
- teleportTo(x + xDiff, y + 1, z + zDiff);
- return;
- }
- else if (level->isTopSolidBlocking(xToInt, (int) y - 1, zToInt) || level->getMaterial(xToInt, (int) y - 1, zToInt) == Material::water)
- {
- fallbackX = x + xDiff;
- fallbackY = y + 1;
- fallbackZ = z + zDiff;
- }
- }
- }
- }
-
- teleportTo(fallbackX, fallbackY, fallbackZ);
+ const double vehicleX = vehicle->x;
+ const double vehicleY = vehicle->bb->y0 + vehicle->bbHeight;
+ const double vehicleZ = vehicle->z;
+ double fallbackX = vehicleX;
+ double fallbackY = vehicleY;
+ double fallbackZ = vehicleZ;
+ const double searchY = vehicleY;
+
+ for (double xDiff = -1.5; xDiff < 2; xDiff += 1.5)
+ {
+ for (double zDiff = -1.5; zDiff < 2; zDiff += 1.5)
+ {
+ if (xDiff == 0 && zDiff == 0)
+ {
+ continue;
+ }
+
+ const int xToInt = static_cast<int>(vehicleX + xDiff);
+ const int zToInt = static_cast<int>(vehicleZ + zDiff);
+ AABB *boundingBox = bb->cloneMove(vehicleX + xDiff - x, searchY + 1 - y, vehicleZ + zDiff - z);
+
+ if (level->getTileCubes(boundingBox, true)->empty())
+ {
+ if (level->isTopSolidBlocking(xToInt, static_cast<int>(searchY), zToInt))
+ {
+ teleportTo(vehicleX + xDiff, searchY + 1, vehicleZ + zDiff);
+ return;
+ }
+ if (level->isTopSolidBlocking(xToInt, static_cast<int>(searchY) - 1, zToInt) ||
+ level->getMaterial(xToInt, static_cast<int>(searchY) - 1, zToInt) == Material::water)
+ {
+ fallbackX = vehicleX + xDiff;
+ fallbackY = searchY + 1;
+ fallbackZ = vehicleZ + zDiff;
+ }
+ }
+ }
+ }
+
+ teleportTo(fallbackX, fallbackY, fallbackZ);
}
bool LivingEntity::shouldShowName()