summaryrefslogtreecommitdiffstats
path: root/source/cWorld.h
blob: 6e407f656e3316beee94566a7dd9b001e07a8cb5 (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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
#pragma once

#ifndef _WIN32
#include "BlockID.h"
#else
enum ENUM_ITEM_ID;
#endif

#include <list>
#include <vector>

class cPacket;
class cRedstone;
class cWaterSimulator;
class cLavaSimulator;
class cChunkMap;
class cItem;
class cCriticalSection;
class cPlayer;
class cClientHandle;
class cChunk;
class cEntity;
class cBlockEntity;
class cWorld													//tolua_export
{																//tolua_export
public:
	typedef std::list< cClientHandle* > ClientList;
	typedef std::list< cEntity* > EntityList;
	typedef std::list< cChunk* > ChunkList;
	typedef std::list< cPlayer* > PlayerList;
	std::vector<int> m_RSList;


	static cWorld* GetWorld();														//tolua_export

	// Return time in seconds
	inline static float GetTime()													//tolua_export
	{
		return m_Time;
	}
	long long GetWorldTime() { return m_WorldTime; }								//tolua_export

	int GetGameMode() { return m_GameMode; } //return gamemode for world

	void SetWorldTime(long long a_WorldTime) { m_WorldTime = a_WorldTime; }			//tolua_export

	cChunk* GetChunk( int a_X, int a_Y, int a_Z );
	cChunk* GetChunkUnreliable( int a_X, int a_Y, int a_Z );
	cChunk* GetChunkOfBlock( int a_X, int a_Y, int a_Z );
	char GetHeight( int a_X, int a_Z );												//tolua_export

	//void AddClient( cClientHandle* a_Client );
	//void RemoveClient( cClientHandle* a_Client );
	//ClientList & GetClients();

	void Broadcast( const cPacket & a_Packet, cClientHandle* a_Exclude = 0 );

	void AddPlayer( cPlayer* a_Player );
	void RemovePlayer( cPlayer* a_Player );
	PlayerList & GetAllPlayers();
	typedef struct lua_State lua_State;
	void GetAllPlayers( lua_State* L );												// >> EXPORTED IN MANUALBINDINGS <<
	unsigned int GetNumPlayers();													//tolua_export
	cPlayer* GetPlayer( const char* a_PlayerName );									//tolua_export

	void AddEntity( cEntity* a_Entity );
	bool RemoveEntityFromChunk( cEntity & a_Entity, cChunk* a_CalledFrom = 0 );
	EntityList & GetEntities();

	cEntity* GetEntity( int a_UniqueID );											//tolua_export

	void SetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta );	//tolua_export
	void FastSetBlock( int a_X, int a_Y, int a_Z, char a_BlockType, char a_BlockMeta );	//tolua_export
	char GetBlock( int a_X, int a_Y, int a_Z );										//tolua_export
	char GetBlockMeta( int a_X, int a_Y, int a_Z );									//tolua_export
	void SetBlockMeta( int a_X, int a_Y, int a_Z, char a_MetaData );				//tolua_export
	bool DigBlock( int a_X, int a_Y, int a_Z, cItem & a_PickupItem );				//tolua_export
	void SendBlockTo( int a_X, int a_Y, int a_Z, cPlayer* a_Player );				//tolua_export

	const double & GetSpawnX() { return m_SpawnX; }									//tolua_export
	const double & GetSpawnY();														//tolua_export
	const double & GetSpawnZ() { return m_SpawnZ; }									//tolua_export

	cWaterSimulator *GetWaterSimulator() { return m_WaterSimulator; }
	cLavaSimulator *GetLavaSimulator() { return m_LavaSimulator; }


	cBlockEntity* GetBlockEntity( int a_X, int a_Y, int a_Z );						//tolua_export

	void GrowTree( int a_X, int a_Y, int a_Z );										//tolua_export

	unsigned int GetWorldSeed() { return m_WorldSeed; }								//tolua_export
	const char* GetName();															//tolua_export

	inline static void AbsoluteToRelative( int & a_X, int & a_Y, int & a_Z, int & a_ChunkX, int & a_ChunkY, int & a_ChunkZ )
	{
		(void)a_Y; // not unused anymore
		a_ChunkX = a_X/16;
		if(a_X < 0 && a_X % 16 != 0) a_ChunkX--;
		a_ChunkY = 0;
		a_ChunkZ = a_Z/16;
		if(a_Z < 0 && a_Z % 16 != 0) a_ChunkZ--;

		a_X = a_X - a_ChunkX*16;
		//a_Y = a_Y - a_ChunkY*16;
		a_Z = a_Z - a_ChunkZ*16;
	}
	inline static void BlockToChunk( int a_X, int a_Y, int a_Z, int & a_ChunkX, int & a_ChunkY, int & a_ChunkZ )
	{
		(void)a_Y; // not unused anymore
		a_ChunkX = a_X/16;
		if(a_X < 0 && a_X % 16 != 0) a_ChunkX--;
		a_ChunkY = 0;
		a_ChunkZ = a_Z/16;
		if(a_Z < 0 && a_Z % 16 != 0) a_ChunkZ--;
	}

	void SaveAllChunks();

	void Tick(float a_Dt);

	void LockClientHandle();
	void UnlockClientHandle();

	void LockEntities();
	void UnlockEntities();

	void LockChunks();
	void UnlockChunks();

	void ReSpreadLighting( cChunk* a_Chunk );
	void RemoveSpread( cChunk* a_Chunk );

	void InitializeSpawn();

	void CastThunderbolt ( int, int, int );												//tolua_export
	void SetWeather ( int );												//tolua_export
	int GetWeather() { return m_Weather; };												//tolua_export


private:
	friend class cRoot;
	cWorld( const char* a_WorldName );
	~cWorld();

	struct sWorldState;
	sWorldState* m_pState;

	void AddToRemoveEntityQueue( cEntity & a_Entity );
	void RemoveEntity( cEntity* a_Entity );
	void UnloadUnusedChunks();

	double m_SpawnX;
	double m_SpawnY;
	double m_SpawnZ;

	float m_LastUnload;
	float m_LastSave;
	static float m_Time;	// Time in seconds
	long long m_WorldTime; // Time in seconds*20, this is sent to clients (is wrapped)
	unsigned long long CurrentTick;
	int m_GameMode;
	float m_WorldTimeFraction; // When this > 1.f m_WorldTime is incremented by 20

	cWaterSimulator* m_WaterSimulator;
	cLavaSimulator* m_LavaSimulator;

	cCriticalSection* m_ClientHandleCriticalSection;
	cCriticalSection* m_EntitiesCriticalSection;
	cCriticalSection* m_ChunksCriticalSection;



	cChunkMap* m_ChunkMap;

	

	bool m_bAnimals;
	float m_SpawnMonsterTime;
	float m_SpawnMonsterRate;

	unsigned int m_WorldSeed;
	int	m_Weather;
}; //tolua_export