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);
}
}
|