from __future__ import annotations import asyncio import json from engine.network.protocol import DEFAULT_PORT, encode_message class GameClient: """Minimal TCP client for GameServer: sends hello/move, receives broadcasts from other players.""" def __init__(self, entity_id: str, name: str, host: str = "127.0.0.1", port: int = DEFAULT_PORT): self.entity_id = entity_id self.name = name self.host = host self.port = port self._reader: asyncio.StreamReader | None = None self._writer: asyncio.StreamWriter | None = None async def connect(self) -> None: self._reader, self._writer = await asyncio.open_connection(self.host, self.port) await self.send({"type": "hello", "entity_id": self.entity_id, "name": self.name}) async def send(self, message: dict) -> None: assert self._writer is not None self._writer.write(encode_message(message)) await self._writer.drain() async def send_move(self, map_id: str, x: int, y: int, z: int) -> None: await self.send({"type": "move", "entity_id": self.entity_id, "map_id": map_id, "x": x, "y": y, "z": z}) async def receive(self) -> dict | None: assert self._reader is not None line = await self._reader.readline() if not line: return None return json.loads(line) async def close(self) -> None: if self._writer is not None: self._writer.close() await self._writer.wait_closed() self._writer = None