Pull chunk data files over from Elektordi/pyCraft
https://github.com/Elektordi/pyCraft
This commit is contained in:
2
custom/managers/__init__.py
Normal file
2
custom/managers/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .data import DataManager
|
||||
from .chunks import ChunksManager
|
97
custom/managers/chunks.py
Normal file
97
custom/managers/chunks.py
Normal file
@@ -0,0 +1,97 @@
|
||||
from math import floor
|
||||
|
||||
from ..networking.packets.clientbound.play import block_change_packet, chunk_data
|
||||
|
||||
class ChunksManager:
|
||||
|
||||
def __init__(self, data_manager):
|
||||
self.data = data_manager
|
||||
self.chunks = {}
|
||||
self.biomes = {}
|
||||
|
||||
def handle_block(self, block_packet):
|
||||
self.set_block_at(block_packet.location.x, block_packet.location.y, block_packet.location.z, block_packet.block_state_id)
|
||||
#self.print_chunk(self.get_chunk(floor(block_packet.location.x/16), floor(block_packet.location.y/16), floor(block_packet.location.z/16)), block_packet.location.y%16)
|
||||
#print('Block %s at %s'%(blocks_states[block_packet.block_state_id], block_packet.location))
|
||||
|
||||
def handle_multiblock(self, multiblock_packet):
|
||||
for b in multiblock_packet.records:
|
||||
self.handle_block(b)
|
||||
|
||||
def handle_chunk(self, chunk_packet):
|
||||
for i in chunk_packet.chunks:
|
||||
self.chunks[(chunk_packet.x, i, chunk_packet.z)] = chunk_packet.chunks[i]
|
||||
self.biomes[(chunk_packet.x, None, chunk_packet.z)] = chunk_packet.biomes # FIXME
|
||||
|
||||
def register(self, connection):
|
||||
connection.register_packet_listener(self.handle_block, block_change_packet.BlockChangePacket)
|
||||
connection.register_packet_listener(self.handle_multiblock, block_change_packet.MultiBlockChangePacket)
|
||||
connection.register_packet_listener(self.handle_chunk, chunk_data.ChunkDataPacket)
|
||||
|
||||
def get_chunk(self, x, y, z):
|
||||
index = (x, y, z)
|
||||
if not index in self.chunks:
|
||||
raise ChunkNotLoadedException(index)
|
||||
return self.chunks[index]
|
||||
|
||||
def get_loaded_area(self, ignore_empty=False):
|
||||
first = next(iter(self.chunks.keys()))
|
||||
x0 = x1 = first[0]
|
||||
y0 = y1 = first[1]
|
||||
z0 = z1 = first[2]
|
||||
for k in self.chunks.keys():
|
||||
if ignore_empty and self.chunks[k].empty:
|
||||
continue
|
||||
x0 = min(x0, k[0])
|
||||
x1 = max(x1, k[0])
|
||||
y0 = min(y0, k[1])
|
||||
y1 = max(y1, k[1])
|
||||
z0 = min(z0, k[2])
|
||||
z1 = max(z1, k[2])
|
||||
return ((x0,y0,z0),(x1,y1,z1))
|
||||
|
||||
def get_block_at(self, x, y, z):
|
||||
c = self.get_chunk(floor(x/16), floor(y/16), floor(z/16))
|
||||
return c.get_block_at(x%16, y%16, z%16)
|
||||
|
||||
def set_block_at(self, x, y, z, block):
|
||||
c = self.get_chunk(floor(x/16), floor(y/16), floor(z/16))
|
||||
c.set_block_at(x%16, y%16, z%16, block)
|
||||
|
||||
def print_chunk(self, chunk, y_slice):
|
||||
print("This is chunk %d %d %d at slice %d:"%(chunk.x, chunk.y, chunk.z, y_slice))
|
||||
print("+%s+"%("-"*16))
|
||||
for z in range(16):
|
||||
missing = []
|
||||
print("|", end="")
|
||||
for x in range(16):
|
||||
sid = chunk.get_block_at(x, y_slice, z)
|
||||
bloc = self.data.blocks_states[sid]
|
||||
if bloc == "minecraft:air" or bloc == "minecraft:cave_air":
|
||||
c = " "
|
||||
elif bloc == "minecraft:grass_block" or bloc == "minecraft:dirt":
|
||||
c = "-"
|
||||
elif bloc == "minecraft:water":
|
||||
c = "~"
|
||||
elif bloc == "minecraft:lava":
|
||||
c = "!"
|
||||
elif bloc == "minecraft:bedrock":
|
||||
c = "_"
|
||||
elif bloc == "minecraft:stone":
|
||||
c = "X"
|
||||
else:
|
||||
missing.append(bloc)
|
||||
c = "?"
|
||||
|
||||
print(c, end="")
|
||||
print("| %s"%(",".join(missing)))
|
||||
print("+%s+"%("-"*16))
|
||||
if chunk.entities:
|
||||
print("Entities in slice: %s"%(", ".join([x['id'].decode() for x in chunk.entities])))
|
||||
|
||||
|
||||
class ChunkNotLoadedException(Exception):
|
||||
def __str__(self):
|
||||
pos = self.args[0]
|
||||
return "Chunk at %d %d %d not loaded (yet?)"%(pos[0], pos[1], pos[2])
|
||||
|
32
custom/managers/data.py
Normal file
32
custom/managers/data.py
Normal file
@@ -0,0 +1,32 @@
|
||||
import os
|
||||
import json
|
||||
|
||||
class DataManager:
|
||||
|
||||
def __init__(self, directory):
|
||||
self.blocks = {}
|
||||
self.blocks_states = {}
|
||||
self.blocks_properties = {}
|
||||
self.registries = {}
|
||||
self.biomes = {}
|
||||
self.entity_type = {}
|
||||
|
||||
if not os.path.isdir(directory):
|
||||
raise FileNotFoundError("%s is not a valid directory")
|
||||
|
||||
if not os.path.isfile("%s/registries.json"%(directory)):
|
||||
raise FileNotFoundError("%s is not a valid minecraft data directory")
|
||||
|
||||
with open("%s/blocks.json"%(directory)) as f:
|
||||
blocks = json.loads(f.read())
|
||||
for x in blocks:
|
||||
for s in blocks[x]['states']:
|
||||
self.blocks_states[s['id']] = x
|
||||
self.blocks_properties[s['id']] = s.get('properties', {})
|
||||
|
||||
with open("%s/registries.json"%(directory)) as f:
|
||||
registries = json.loads(f.read())
|
||||
#for x in registries["minecraft:biome"]["entries"]:
|
||||
# self.biomes[registries["minecraft:biome"]["entries"][x]["protocol_id"]] = x
|
||||
for x in registries["minecraft:entity_type"]["entries"]:
|
||||
self.entity_type[registries["minecraft:entity_type"]["entries"][x]["protocol_id"]] = x
|
Reference in New Issue
Block a user