feat: process world (default off)
This commit is contained in:
parent
a563984e48
commit
48590d56bd
1 changed files with 30 additions and 6 deletions
|
@ -1,28 +1,28 @@
|
||||||
|
import asyncio
|
||||||
import uuid
|
import uuid
|
||||||
import datetime
|
import datetime
|
||||||
|
import asyncio
|
||||||
|
|
||||||
|
from time import time
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
|
|
||||||
from aiocraft.mc.definitions import BlockPos
|
from aiocraft.mc.definitions import BlockPos
|
||||||
from aiocraft.mc.proto.play.clientbound import PacketPosition
|
from aiocraft.mc.proto.play.clientbound import PacketPosition, PacketMapChunk, PacketBlockChange, PacketMultiBlockChange
|
||||||
from aiocraft.mc.proto.play.serverbound import PacketTeleportConfirm
|
from aiocraft.mc.proto.play.serverbound import PacketTeleportConfirm
|
||||||
|
from aiocraft import Chunk, World # TODO these imports will hopefully change!
|
||||||
|
|
||||||
from ..scaffold import Scaffold
|
from ..scaffold import Scaffold
|
||||||
from ..events import ConnectedEvent
|
from ..events import ConnectedEvent
|
||||||
|
|
||||||
class GameWorld(Scaffold):
|
class GameWorld(Scaffold):
|
||||||
position : BlockPos
|
position : BlockPos
|
||||||
# TODO world
|
world : World
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
self.position = BlockPos(0, 0, 0)
|
self.position = BlockPos(0, 0, 0)
|
||||||
|
|
||||||
@self.on(ConnectedEvent)
|
|
||||||
async def connected_cb(_):
|
|
||||||
self.tablist.clear()
|
|
||||||
|
|
||||||
@self.on_packet(PacketPosition)
|
@self.on_packet(PacketPosition)
|
||||||
async def player_rubberband_cb(packet:PacketPosition):
|
async def player_rubberband_cb(packet:PacketPosition):
|
||||||
self.position = BlockPos(packet.x, packet.y, packet.z)
|
self.position = BlockPos(packet.x, packet.y, packet.z)
|
||||||
|
@ -36,3 +36,27 @@ class GameWorld(Scaffold):
|
||||||
teleportId=packet.teleportId
|
teleportId=packet.teleportId
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if self.cfg.getboolean("process_world", fallback=False):
|
||||||
|
self.world = World()
|
||||||
|
|
||||||
|
@self.on_packet(PacketMapChunk)
|
||||||
|
async def map_chunk_cb(packet:PacketMapChunk):
|
||||||
|
assert isinstance(packet.bitMap, int)
|
||||||
|
packet.blockEntities
|
||||||
|
c = Chunk(packet.x, packet.z, packet.bitMap, packet.groundUp)
|
||||||
|
c.read(packet.chunkData)
|
||||||
|
self.world.put(c, packet.x, packet.z, not packet.groundUp)
|
||||||
|
|
||||||
|
@self.on_packet(PacketBlockChange)
|
||||||
|
async def block_change_cb(packet:PacketBlockChange):
|
||||||
|
self.world.put_block(packet.location[0], packet.location[1], packet.location[2], packet.id)
|
||||||
|
|
||||||
|
@self.on_packet(PacketMultiBlockChange)
|
||||||
|
async def multi_block_change_cb(packet:PacketMultiBlockChange):
|
||||||
|
chunk_x_off = packet.chunkX * 16
|
||||||
|
chunk_z_off = packet.chunkZ * 16
|
||||||
|
for entry in packet.records:
|
||||||
|
x_off = (entry['horizontalPos'] >> 4 ) & 15
|
||||||
|
z_off = entry['horizontalPos'] & 15
|
||||||
|
self.world.put_block(x_off + chunk_x_off, entry['y'], z_off + chunk_z_off, entry['blockId'])
|
||||||
|
|
Loading…
Reference in a new issue