61 lines
No EOL
1.9 KiB
Python
61 lines
No EOL
1.9 KiB
Python
from websockets.server import serve, ServerConnection
|
|
import asyncio
|
|
from config import BLOCK_TYPES, COLORS, SPAWN
|
|
from main import WORLD, getPlayer, getPlayers
|
|
from player import Player
|
|
import random
|
|
|
|
async def startServer(host, port):
|
|
async with serve(handler, host, port):
|
|
print(f"started server on {host}:{port}")
|
|
await asyncio.get_running_loop().create_future()
|
|
|
|
async def readPacket(websocket: ServerConnection) -> tuple[str, list[str]]:
|
|
data = await websocket.recv()
|
|
return data[0], data[1:].splitlines()
|
|
|
|
async def writePacket(websocket: ServerConnection, packet_id: str, packet_data: list[str]):
|
|
await websocket.send(packet_id + ("\n".join(packet_data)))
|
|
|
|
async def handler(websocket: ServerConnection):
|
|
packet_id, packet_data = await readPacket(websocket)
|
|
|
|
name = packet_data[0]
|
|
|
|
if packet_id != "J":
|
|
await writePacket(websocket, "K", ["join packet is invalid"])
|
|
return
|
|
if getPlayer(name) != None:
|
|
await writePacket(websocket, "K", ["this nickname is already in use"])
|
|
return
|
|
|
|
print(name, "joined to the server")
|
|
|
|
try:
|
|
player = Player(websocket)
|
|
|
|
await player.sendWorld([b.toStatement() for b in WORLD])
|
|
|
|
await player.sendBlockTypes(BLOCK_TYPES.keys())
|
|
await player.setColor(random.choice(COLORS))
|
|
await player.setPos(*SPAWN)
|
|
await player.setVel(0,0)
|
|
await player.setName(name)
|
|
await player.setWalkSpeed(0.5)
|
|
|
|
await player.sendToPlayers()
|
|
|
|
WORLD.append(player)
|
|
|
|
while True:
|
|
packet_id, packet_data = await readPacket(websocket)
|
|
player.onPacket(packet_id, packet_data)
|
|
except Exception as exc:
|
|
WORLD.remove(player)
|
|
|
|
for p in getPlayers():
|
|
await p.sendWorld([player.toStatement(False)])
|
|
|
|
await writePacket(websocket, "K", [str(exc)])
|
|
|
|
print(name, "left the server") |