summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Components/EnvironmentComponent.cpp
blob: b44542683cbffb894d29de28c8413fde0c0be935 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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);
	}
}