MultiServer: Fix LocationScouts with "only_new" broadcasting hints for found locations over and over (#4482)

* Hints PR number 42069

* Make it explicit

* clarify

* oops

* Port the change to CreateHints
This commit is contained in:
NewSoupVi
2025-07-26 19:30:38 +02:00
committed by GitHub
parent 46829487d6
commit 4e1eb78163
2 changed files with 8 additions and 6 deletions

View File

@@ -752,7 +752,7 @@ class Context:
return self.player_names[team, slot] return self.player_names[team, slot]
def notify_hints(self, team: int, hints: typing.List[Hint], only_new: bool = False, def notify_hints(self, team: int, hints: typing.List[Hint], only_new: bool = False,
recipients: typing.Sequence[int] = None): persist_even_if_found: bool = False, recipients: typing.Sequence[int] = None):
"""Send and remember hints.""" """Send and remember hints."""
if only_new: if only_new:
hints = [hint for hint in hints if hint not in self.hints[team, hint.finding_player]] hints = [hint for hint in hints if hint not in self.hints[team, hint.finding_player]]
@@ -767,8 +767,9 @@ class Context:
if not hint.local and data not in concerns[hint.finding_player]: if not hint.local and data not in concerns[hint.finding_player]:
concerns[hint.finding_player].append(data) concerns[hint.finding_player].append(data)
# only remember hints that were not already found at the time of creation # For !hint use cases, only hints that were not already found at the time of creation should be remembered
if not hint.found: # For LocationScouts use-cases, all hints should be remembered
if not hint.found or persist_even_if_found:
# since hints are bidirectional, finding player and receiving player, # since hints are bidirectional, finding player and receiving player,
# we can check once if hint already exists # we can check once if hint already exists
if hint not in self.hints[team, hint.finding_player]: if hint not in self.hints[team, hint.finding_player]:
@@ -1946,7 +1947,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict):
hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location, hints.extend(collect_hint_location_id(ctx, client.team, client.slot, location,
HintStatus.HINT_UNSPECIFIED)) HintStatus.HINT_UNSPECIFIED))
locs.append(NetworkItem(target_item, location, target_player, flags)) locs.append(NetworkItem(target_item, location, target_player, flags))
ctx.notify_hints(client.team, hints, only_new=create_as_hint == 2) ctx.notify_hints(client.team, hints, only_new=create_as_hint == 2, persist_even_if_found=True)
if locs and create_as_hint: if locs and create_as_hint:
ctx.save() ctx.save()
await ctx.send_msgs(client, [{'cmd': 'LocationInfo', 'locations': locs}]) await ctx.send_msgs(client, [{'cmd': 'LocationInfo', 'locations': locs}])
@@ -1990,7 +1991,7 @@ async def process_client_cmd(ctx: Context, client: Client, args: dict):
hints += collect_hint_location_id(ctx, client.team, location_player, location, status) hints += collect_hint_location_id(ctx, client.team, location_player, location, status)
# As of writing this code, only_new=True does not update status for existing hints # As of writing this code, only_new=True does not update status for existing hints
ctx.notify_hints(client.team, hints, only_new=True) ctx.notify_hints(client.team, hints, only_new=True, persist_even_if_found=True)
ctx.save() ctx.save()
elif cmd == 'UpdateHint': elif cmd == 'UpdateHint':

View File

@@ -340,7 +340,8 @@ Sent to the server to retrieve the items that are on a specified list of locatio
Fully remote clients without a patch file may use this to "place" items onto their in-game locations, most commonly to display their names or item classifications before/upon pickup. Fully remote clients without a patch file may use this to "place" items onto their in-game locations, most commonly to display their names or item classifications before/upon pickup.
LocationScouts can also be used to inform the server of locations the client has seen, but not checked. This creates a hint as if the player had run `!hint_location` on a location, but without deducting hint points. LocationScouts can also be used to inform the server of locations the client has seen, but not checked. This creates a hint as if the player had run `!hint_location` on a location, but without deducting hint points.
This is useful in cases where an item appears in the game world, such as 'ledge items' in _A Link to the Past_. To do this, set the `create_as_hint` parameter to a non-zero value. This is useful in cases where an item appears in the game world, such as 'ledge items' in _A Link to the Past_. To do this, set the `create_as_hint` parameter to a non-zero value.
Note that LocationScouts with a non-zero `create_as_hint` value will _always_ create a **persistent** hint (listed in the Hints tab of concerning players' TextClients), even if the location was already found. If this is not desired behavior, you need to prevent sending LocationScouts with `create_as_hint` for already found locations in your client-side code.
#### Arguments #### Arguments
| Name | Type | Notes | | Name | Type | Notes |