From a798e8aea2aca963d0e7bf289032cc765fbf58e3 Mon Sep 17 00:00:00 2001 From: CaitSith2 Date: Wed, 22 Jun 2022 04:49:31 -0700 Subject: [PATCH] Add a means to allow a client to opt into seeing ALL hints. --- CommonClient.py | 13 +++++++++++++ MultiServer.py | 12 ++++++++++++ 2 files changed, 25 insertions(+) diff --git a/CommonClient.py b/CommonClient.py index 17f013d6e0..f7d2491590 100644 --- a/CommonClient.py +++ b/CommonClient.py @@ -108,6 +108,10 @@ class ClientCommandProcessor(CommandProcessor): self.output("Unreadied.") asyncio.create_task(self.ctx.send_msgs([{"cmd": "StatusUpdate", "status": state}]), name="send StatusUpdate") + def _cmd_show_all_hints(self): + """Allows the player to see all hints, not just the ones that apply to them.""" + asyncio.create_task(self.ctx.update_show_all_hints("ShowAllHints" not in self.ctx.tags)) + def default(self, raw: str): raw = self.ctx.on_user_say(raw) if raw: @@ -391,6 +395,15 @@ class CommonContext: } }]) + async def update_show_all_hints(self, show_all_hints: bool): + old_tags = self.tags.copy() + if show_all_hints: + self.tags.add("ShowAllHints") + else: + self.tags -= {"ShowAllHints"} + if old_tags != self.tags and self.server and not self.server.socket.closed: + await self.send_msgs([{"cmd": "ConnectUpdate", "tags": self.tags}]) + async def update_death_link(self, death_link: bool): old_tags = self.tags.copy() if death_link: diff --git a/MultiServer.py b/MultiServer.py index 762fe8f4e3..58b2b60d21 100644 --- a/MultiServer.py +++ b/MultiServer.py @@ -79,6 +79,7 @@ class Client(Endpoint): self.tags = [] self.messageprocessor = client_message_processor(ctx, self) self.ctx = weakref.ref(ctx) + self.all_hints = [] @property def items_handling(self): @@ -559,12 +560,19 @@ def notify_hints(ctx: Context, team: int, hints: typing.List[NetUtils.Hint], onl if not hints: return concerns = collections.defaultdict(list) + all_hints = collections.defaultdict(list) for hint in sorted(hints, key=operator.attrgetter('found'), reverse=True): data = (hint, hint.as_network_message()) for player in ctx.slot_set(hint.receiving_player): concerns[player].append(data) if not hint.local and data not in concerns[hint.finding_player]: concerns[hint.finding_player].append(data) + for slot, clients in ctx.clients[team].items(): + if not clients or slot == hint.finding_player or slot in ctx.slot_set(hint.receiving_player) or \ + all(["ShowAllHints" not in client.tags for client in clients]): + continue + for client in [client for client in clients if "ShowAllHints" in client.tags]: + all_hints[client].append(data) # remember hints in all cases if not hint.found: # since hints are bidirectional, finding player and receiving player, @@ -584,6 +592,10 @@ def notify_hints(ctx: Context, team: int, hints: typing.List[NetUtils.Hint], onl for client in clients: asyncio.create_task(ctx.send_msgs(client, client_hints)) + for client, hint_data in all_hints.items(): + client_hints = [datum[1] for datum in sorted(hint_data)] + asyncio.create_task(ctx.send_msgs(client, client_hints)) + def update_aliases(ctx: Context, team: int): cmd = ctx.dumper([{"cmd": "RoomUpdate",