1 local Map = Dragonblocks.create_class()
4 local size_squared = math.pow(size, 2)
7 function Map.get_pos_hash(pos)
8 local x, y, z = pos.x, pos.y, pos.z
9 if x > 999 or y > 999 or z > 999 or x < -999 or y < -999 or z < -999 then return end
10 return x + size * y + size_squared * z
13 function Map.get_chunk_pos(pos)
14 return glm.vec3(math.floor(pos.x / 16), math.floor(pos.y / 16), math.floor(pos.z / 16))
17 function Map.get_block_pos(pos)
21 function Map.get_chunk_pos_and_block_pos(pos)
22 local chunk_pos = Map.get_chunk_pos(pos)
23 local block_pos = pos - Map.get_block_pos(chunk_pos)
24 return chunk_pos, block_pos
27 function Map:constructor()
31 function Map:get_block(pos)
32 local chunk, block_pos = self:get_chunk_and_block_pos(pos)
33 if chunk then return chunk:get_block(block_pos) end
36 function Map:add_block(pos, block)
37 local chunk, block_pos = self:get_chunk_and_block_pos(pos)
38 if chunk then return chunk:add_block(block_pos, block) end
41 function Map:remove_block(pos)
42 local chunk, block_pos = self:get_chunk_and_block_pos(pos)
43 if chunk then return chunk:remove_block(block_pos) end
46 function Map:create_chunk(pos, data)
47 local pos_hash = Map.get_pos_hash(pos)
48 if not pos_hash then return end
49 local minp = Map.get_block_pos(pos)
50 local maxp = minp + glm.vec3(16, 16, 16)
51 local data = data or MapGen.generate(minp, maxp)
52 local chunk = WorldSystem.Chunk(pos, data)
53 self.chunks[pos_hash] = chunk
54 Dragonblocks:add_task(function()
59 function Map:create_chunk_if_not_exists(pos, data)
60 if not self:get_chunk(pos) then self:create_chunk(pos, data) end
63 function Map:get_chunk(pos)
64 local pos_hash = Map.get_pos_hash(pos)
65 if pos_hash then return self.chunks[pos_hash] end
68 function Map:get_chunk_and_block_pos(pos)
69 local chunk_pos, block_pos = Map.get_chunk_pos_and_block_pos(pos)
70 local chunk = self:get_chunk(chunk_pos)
71 return chunk, block_pos