fix(multiplayer): try to fix cannot spectate by changing state one by one
This commit is contained in:
@@ -660,10 +660,6 @@ class MultiplayerHub(Hub[MultiplayerClientState]):
|
||||
|
||||
if user.state == state:
|
||||
return
|
||||
logger.info(
|
||||
f"[MultiplayerHub] {user.user_id}'s state "
|
||||
f"changed from {user.state} to {state}"
|
||||
)
|
||||
match state:
|
||||
case MultiplayerUserState.IDLE:
|
||||
if user.state.is_playing:
|
||||
@@ -691,6 +687,10 @@ class MultiplayerHub(Hub[MultiplayerClientState]):
|
||||
user: MultiplayerRoomUser,
|
||||
state: MultiplayerUserState,
|
||||
):
|
||||
logger.info(
|
||||
f"[MultiplayerHub] {user.user_id}'s state "
|
||||
f"changed from {user.state} to {state}"
|
||||
)
|
||||
user.state = state
|
||||
await self.broadcast_group_call(
|
||||
self.group_id(room.room.room_id),
|
||||
@@ -796,7 +796,6 @@ class MultiplayerHub(Hub[MultiplayerClientState]):
|
||||
if all(u.state != MultiplayerUserState.READY for u in room.users):
|
||||
raise InvokeException("Can't start match when no users are ready.")
|
||||
|
||||
logger.info(f"[MultiplayerHub] Room {room.room_id} match started")
|
||||
await self.start_match(server_room)
|
||||
|
||||
async def start_match(self, room: ServerMultiplayerRoom):
|
||||
@@ -804,6 +803,12 @@ class MultiplayerHub(Hub[MultiplayerClientState]):
|
||||
raise InvokeException("Can't start match when already in a running state.")
|
||||
if room.queue.current_item.expired:
|
||||
raise InvokeException("Current playlist item is expired")
|
||||
|
||||
if all(u.state != MultiplayerUserState.READY for u in room.room.users):
|
||||
await room.queue.finish_current_item()
|
||||
|
||||
logger.info(f"[MultiplayerHub] Room {room.room.room_id} match started")
|
||||
|
||||
ready_users = [
|
||||
u
|
||||
for u in room.room.users
|
||||
@@ -813,12 +818,8 @@ class MultiplayerHub(Hub[MultiplayerClientState]):
|
||||
or u.state == MultiplayerUserState.IDLE
|
||||
)
|
||||
]
|
||||
await asyncio.gather(
|
||||
*[
|
||||
self.change_user_state(room, u, MultiplayerUserState.WAITING_FOR_LOAD)
|
||||
for u in ready_users
|
||||
]
|
||||
)
|
||||
for u in ready_users:
|
||||
await self.change_user_state(room, u, MultiplayerUserState.WAITING_FOR_LOAD)
|
||||
await self.change_room_state(
|
||||
room,
|
||||
MultiplayerRoomState.WAITING_FOR_LOAD,
|
||||
|
||||
@@ -6,7 +6,6 @@ import lzma
|
||||
import struct
|
||||
import time
|
||||
from typing import override
|
||||
from venv import logger
|
||||
|
||||
from app.calculator import clamp
|
||||
from app.config import settings
|
||||
@@ -19,6 +18,7 @@ from app.dependencies.database import engine, get_redis
|
||||
from app.dependencies.fetcher import get_fetcher
|
||||
from app.dependencies.storage import get_storage_service
|
||||
from app.exception import InvokeException
|
||||
from app.log import logger
|
||||
from app.models.mods import APIMod, mods_to_int
|
||||
from app.models.score import GameMode, LegacyReplaySoloScoreInfo, ScoreStatistics
|
||||
from app.models.spectator_hub import (
|
||||
|
||||
Reference in New Issue
Block a user