44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
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
|