1 /*
2 Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU Lesser General Public License for more details.
14 
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 */
19 
20 #pragma once
21 
22 #include "irrlichttypes.h"
23 #include "irr_v2d.h"
24 #include "mapblock.h"
25 #include <ostream>
26 #include <map>
27 #include <vector>
28 
29 class Map;
30 class IGameDef;
31 
32 /*
33 	This is an Y-wise stack of MapBlocks.
34 */
35 
36 #define MAPSECTOR_SERVER 0
37 #define MAPSECTOR_CLIENT 1
38 
39 class MapSector
40 {
41 public:
42 
43 	MapSector(Map *parent, v2s16 pos, IGameDef *gamedef);
44 	virtual ~MapSector();
45 
46 	void deleteBlocks();
47 
getPos()48 	v2s16 getPos()
49 	{
50 		return m_pos;
51 	}
52 
53 	MapBlock * getBlockNoCreateNoEx(s16 y);
54 	MapBlock * createBlankBlockNoInsert(s16 y);
55 	MapBlock * createBlankBlock(s16 y);
56 
57 	void insertBlock(MapBlock *block);
58 
59 	void deleteBlock(MapBlock *block);
60 
61 	void getBlocks(MapBlockVect &dest);
62 
empty()63 	bool empty() const { return m_blocks.empty(); }
64 
size()65 	int size() const { return m_blocks.size(); }
66 protected:
67 
68 	// The pile of MapBlocks
69 	std::unordered_map<s16, MapBlock*> m_blocks;
70 
71 	Map *m_parent;
72 	// Position on parent (in MapBlock widths)
73 	v2s16 m_pos;
74 
75 	IGameDef *m_gamedef;
76 
77 	// Last-used block is cached here for quicker access.
78 	// Be sure to set this to nullptr when the cached block is deleted
79 	MapBlock *m_block_cache = nullptr;
80 	s16 m_block_cache_y;
81 
82 	/*
83 		Private methods
84 	*/
85 	MapBlock *getBlockBuffered(s16 y);
86 
87 };
88