Broadcast teleport landing sound to nearby users

This commit is contained in:
Jage9
2026-02-24 20:55:02 -05:00
parent a1132ea22a
commit 297f1c0c1a
9 changed files with 72 additions and 1 deletions

View File

@@ -25,6 +25,10 @@ class UpdatePositionPacket(BasePacket):
y: int
class TeleportCompletePacket(BasePacket):
type: Literal["teleport_complete"]
class UpdateNicknamePacket(BasePacket):
type: Literal["update_nickname"]
nickname: str = Field(min_length=1, max_length=32)
@@ -91,6 +95,7 @@ class ItemUpdatePacket(BasePacket):
ClientPacket = (
SignalPacket
| UpdatePositionPacket
| TeleportCompletePacket
| UpdateNicknamePacket
| ChatMessagePacket
| PingPacket
@@ -135,6 +140,13 @@ class BroadcastPositionPacket(BasePacket):
y: int
class BroadcastTeleportCompletePacket(BasePacket):
type: Literal["teleport_complete"]
id: str
x: int
y: int
class BroadcastNicknamePacket(BasePacket):
type: Literal["update_nickname"]
id: str

View File

@@ -42,6 +42,7 @@ from .models import (
BroadcastChatMessagePacket,
BroadcastNicknamePacket,
BroadcastPositionPacket,
BroadcastTeleportCompletePacket,
ChatMessagePacket,
ClientPacket,
ForwardSignalPacket,
@@ -63,6 +64,7 @@ from .models import (
PingPacket,
PongPacket,
RemoteUser,
TeleportCompletePacket,
UpdateNicknamePacket,
UpdatePositionPacket,
UserLeftPacket,
@@ -879,6 +881,18 @@ class SignalingServer:
await self._broadcast_item(carried)
return
if isinstance(packet, TeleportCompletePacket):
await self._broadcast(
BroadcastTeleportCompletePacket(
type="teleport_complete",
id=client.id,
x=client.x,
y=client.y,
),
exclude=client.websocket,
)
return
if isinstance(packet, UpdateNicknamePacket):
requested_nickname = packet.nickname.strip()
if not requested_nickname:

View File

@@ -135,3 +135,27 @@ async def test_update_position_enforces_cumulative_budget_per_tick(monkeypatch:
assert client.x == 7
assert client.y == 5
assert len(broadcast_payloads) == 2
@pytest.mark.asyncio
async def test_teleport_complete_broadcasts_spatial_event(monkeypatch: pytest.MonkeyPatch) -> None:
server = SignalingServer("127.0.0.1", 8765, None, None, grid_size=41)
ws = _fake_ws()
client = ClientConnection(websocket=ws, id="u1", nickname="tester", x=12, y=13)
server.clients[ws] = client
broadcast_payloads: list[object] = []
async def fake_broadcast(packet: object, exclude: ServerConnection | None = None) -> None:
broadcast_payloads.append(packet)
monkeypatch.setattr(server, "_broadcast", fake_broadcast)
await server._handle_message(client, json.dumps({"type": "teleport_complete"}))
assert len(broadcast_payloads) == 1
packet = broadcast_payloads[0]
assert packet.type == "teleport_complete"
assert packet.id == "u1"
assert packet.x == 12
assert packet.y == 13