From 3c8712d871fbd7f3bf936f4c3f9c8b7f5ec886fb Mon Sep 17 00:00:00 2001 From: Bond-009 Date: Fri, 25 Aug 2017 15:44:36 +0200 Subject: Gives all entities the default airlevel on creation (#3942) * Guardians don't take damage on land * Squids suffocate on land --- src/Entities/Entity.cpp | 4 ++-- src/Mobs/Guardian.cpp | 9 --------- src/Mobs/Squid.cpp | 34 ++++++++++++++++++++++++++++------ 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp index 4f35315f7..347c0ec91 100644 --- a/src/Entities/Entity.cpp +++ b/src/Entities/Entity.cpp @@ -56,8 +56,8 @@ cEntity::cEntity(eEntityType a_EntityType, double a_X, double a_Y, double a_Z, d m_TicksSinceLastVoidDamage(0), m_IsSwimming(false), m_IsSubmerged(false), - m_AirLevel(0), - m_AirTickTimer(0), + m_AirLevel(MAX_AIR_LEVEL), + m_AirTickTimer(DROWNING_TICKS), m_TicksAlive(0), m_IsTicking(false), m_ParentChunk(nullptr), diff --git a/src/Mobs/Guardian.cpp b/src/Mobs/Guardian.cpp index 3dbec9928..f36f98ea8 100644 --- a/src/Mobs/Guardian.cpp +++ b/src/Mobs/Guardian.cpp @@ -42,20 +42,11 @@ void cGuardian::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) // that is not where the entity currently resides (FS #411) Vector3d Pos = GetPosition(); - // TODO: Not a real behavior, but cool :D int RelY = FloorC(Pos.y); if ((RelY < 0) || (RelY >= cChunkDef::Height)) { return; } - int RelX = FloorC(Pos.x) - a_Chunk.GetPosX() * cChunkDef::Width; - int RelZ = FloorC(Pos.z) - a_Chunk.GetPosZ() * cChunkDef::Width; - BLOCKTYPE BlockType; - if (a_Chunk.UnboundedRelGetBlockType(RelX, RelY, RelZ, BlockType) && !IsBlockWater(BlockType) && !IsOnFire()) - { - // Burn for 10 ticks, then decide again - StartBurning(10); - } super::Tick(a_Dt, a_Chunk); } diff --git a/src/Mobs/Squid.cpp b/src/Mobs/Squid.cpp index 00cc07e14..8ae688a1b 100644 --- a/src/Mobs/Squid.cpp +++ b/src/Mobs/Squid.cpp @@ -46,13 +46,35 @@ void cSquid::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) { return; } - int RelX = FloorC(Pos.x) - a_Chunk.GetPosX() * cChunkDef::Width; - int RelZ = FloorC(Pos.z) - a_Chunk.GetPosZ() * cChunkDef::Width; - BLOCKTYPE BlockType; - if (a_Chunk.UnboundedRelGetBlockType(RelX, RelY, RelZ, BlockType) && !IsBlockWater(BlockType) && !IsOnFire()) + + if (!IsSubmerged()) + { + if (m_AirLevel <= 0) + { + // Runs the air tick timer to check whether the squid should be damaged + if (m_AirTickTimer <= 0) + { + // Damage squid + TakeDamage(dtSuffocating, nullptr, 1, 1, 0); + // Reset timer + m_AirTickTimer = DROWNING_TICKS; + } + else + { + m_AirTickTimer--; + } + } + else + { + // Reduce air supply + m_AirLevel--; + } + } + else { - // Burn for 10 ticks, then decide again - StartBurning(10); + // Set the air back to maximum + m_AirLevel = MAX_AIR_LEVEL; + m_AirTickTimer = DROWNING_TICKS; } super::Tick(a_Dt, a_Chunk); -- cgit v1.2.3