diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 5dcef330a..30aa87f37 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -878,6 +878,12 @@ void cEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) m_InvulnerableTicks--; } + if ((GetPosY() < 0) && (!IsPlayer())) + { + Destroy(); + return; + } + if (m_AttachedTo != nullptr) { SetPosition(m_AttachedTo->GetPosition()); diff --git a/src/Entities/Pickup.cpp b/src/Entities/Pickup.cpp index bdb9128dc..69bb981e6 100644 --- a/src/Entities/Pickup.cpp +++ b/src/Entities/Pickup.cpp @@ -182,12 +182,6 @@ void cPickup::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) Destroy(true); return; } - - if (GetPosY() < VOID_BOUNDARY) // Out of this world and no more visible! - { - Destroy(true); - return; - } } diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp index a4cb9e63f..3b0fdd36c 100644 --- a/src/Mobs/Monster.cpp +++ b/src/Mobs/Monster.cpp @@ -667,10 +667,14 @@ void cMonster::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) NIBBLETYPE BlockMeta; int RelX = static_cast(Destination.x) - Chunk->GetPosX() * cChunkDef::Width; int RelZ = static_cast(Destination.z) - Chunk->GetPosZ() * cChunkDef::Width; - Chunk->GetBlockTypeMeta(RelX, static_cast(Destination.y) - 1, RelZ, BlockType, BlockMeta); - if (BlockType != E_BLOCK_STATIONARY_WATER) // Idle mobs shouldn't enter water on purpose + int YBelowUs = static_cast(Destination.y) - 1; + if (YBelowUs >= 0) { - MoveToPosition(Destination); + Chunk->GetBlockTypeMeta(RelX, YBelowUs, RelZ, BlockType, BlockMeta); + if (BlockType != E_BLOCK_STATIONARY_WATER) // Idle mobs shouldn't enter water on purpose + { + MoveToPosition(Destination); + } } } } diff --git a/src/Mobs/PathFinder.cpp b/src/Mobs/PathFinder.cpp index 4b6e70bbd..93664b596 100644 --- a/src/Mobs/PathFinder.cpp +++ b/src/Mobs/PathFinder.cpp @@ -196,7 +196,13 @@ bool cPathFinder::EnsureProperPoint(Vector3d & a_Vector, cChunk & a_Chunk) // If destination in the air, first try to go 1 block north, or east, or west. // This fixes the player leaning issue. // If that failed, we instead go down to the lowest air block. - Chunk->GetBlockTypeMeta(RelX, FloorC(a_Vector.y) - 1, RelZ, BlockType, BlockMeta); + int YBelowUs = FloorC(a_Vector.y) - 1; + if (YBelowUs < 0) + { + return false; + + } + Chunk->GetBlockTypeMeta(RelX, YBelowUs, RelZ, BlockType, BlockMeta); if (!(IsWaterOrSolid(BlockType))) { bool InTheAir = true; @@ -216,7 +222,7 @@ bool cPathFinder::EnsureProperPoint(Vector3d & a_Vector, cChunk & a_Chunk) } RelX = FloorC(a_Vector.x+x) - Chunk->GetPosX() * cChunkDef::Width; RelZ = FloorC(a_Vector.z+z) - Chunk->GetPosZ() * cChunkDef::Width; - Chunk->GetBlockTypeMeta(RelX, FloorC(a_Vector.y) - 1, RelZ, BlockType, BlockMeta); + Chunk->GetBlockTypeMeta(RelX, YBelowUs, RelZ, BlockType, BlockMeta); if (IsWaterOrSolid((BlockType))) { a_Vector.x += x;