summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Components/EnvironmentComponent.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Components/EnvironmentComponent.cpp')
-rw-r--r--src/Mobs/Components/EnvironmentComponent.cpp58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/Mobs/Components/EnvironmentComponent.cpp b/src/Mobs/Components/EnvironmentComponent.cpp
new file mode 100644
index 000000000..b44542683
--- /dev/null
+++ b/src/Mobs/Components/EnvironmentComponent.cpp
@@ -0,0 +1,58 @@
+#include "Globals.h"
+#include "EnvironmentComponent.h"
+#include "../Monster.h"
+#include "../../World.h"
+#include "../../Chunk.h"
+
+cEnvironmentComponent::cEnvironmentComponent(cMonster * a_Entity, int a_SightDistance) : m_Self(a_Entity), m_SightDistance(a_SightDistance){}
+
+
+
+
+
+void cEnvironmentComponent::Tick(float a_Dt, cChunk & a_Chunk) {
+
+ // Burning in daylight
+ HandleDaylightBurning(a_Chunk);
+}
+
+
+
+
+
+void cEnvironmentComponent::HandleDaylightBurning(cChunk & a_Chunk)
+{
+ if (!m_BurnsInDaylight)
+ {
+ return;
+ }
+
+ int RelY = (int)floor(m_Self->GetPosY());
+ if ((RelY < 0) || (RelY >= cChunkDef::Height))
+ {
+ // Outside the world
+ return;
+ }
+ int PosX = (int)floor(m_Self->GetPosX());
+ int PosZ = (int)floor(m_Self->GetPosX());
+ int RelX = PosX - m_Self->GetChunkX() * cChunkDef::Width;
+ int RelZ = PosZ - m_Self->GetChunkZ() * cChunkDef::Width;
+
+ if (!a_Chunk.IsLightValid())
+ {
+ m_Self->GetWorld()->QueueLightChunk(m_Self->GetChunkX(), m_Self->GetChunkZ());
+ return;
+ }
+
+ if (
+ (a_Chunk.GetSkyLight(RelX, RelY, RelZ) == 15) && // In the daylight
+ (a_Chunk.GetBlock(RelX, RelY, RelZ) != E_BLOCK_SOULSAND) && // Not on soulsand
+ (m_Self->GetWorld()->GetTimeOfDay() < (12000 + 1000)) && // It is nighttime
+ !m_Self->IsOnFire() && // Not already burning
+ m_Self->GetWorld()->IsWeatherWetAt(PosX, PosZ) // Not raining
+ )
+ {
+ // Burn for 100 ticks, then decide again
+ m_Self->StartBurning(100);
+ }
+}