mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 04:01:32 -06:00
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:
@@ -752,7 +752,7 @@ class Context:
|
||||
return self.player_names[team, slot]
|
||||
|
||||
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."""
|
||||
if only_new:
|
||||
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]:
|
||||
concerns[hint.finding_player].append(data)
|
||||
|
||||
# only remember hints that were not already found at the time of creation
|
||||
if not hint.found:
|
||||
# For !hint use cases, only hints that were not already found at the time of creation should be remembered
|
||||
# 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,
|
||||
# we can check once if hint already exists
|
||||
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,
|
||||
HintStatus.HINT_UNSPECIFIED))
|
||||
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:
|
||||
ctx.save()
|
||||
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)
|
||||
|
||||
# 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()
|
||||
|
||||
elif cmd == 'UpdateHint':
|
||||
|
@@ -341,6 +341,7 @@ Fully remote clients without a patch file may use this to "place" items onto the
|
||||
|
||||
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.
|
||||
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
|
||||
| Name | Type | Notes |
|
||||
|
Reference in New Issue
Block a user