summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-01-17 14:57:41 -0500
committerJesse Plamondon-Willard <Pathoschild@users.noreply.github.com>2021-01-17 14:57:41 -0500
commit516b2fc010ba9a794297ae74b4c5de321ffd0a70 (patch)
tree1fc708e36f7268407b8ced1e3ce8f58eb4fa3e33
parentb58d432a22bc39c3135779664293c7beff7b3bd4 (diff)
downloadSMAPI-516b2fc010ba9a794297ae74b4c5de321ffd0a70.tar.gz
SMAPI-516b2fc010ba9a794297ae74b4c5de321ffd0a70.tar.bz2
SMAPI-516b2fc010ba9a794297ae74b4c5de321ffd0a70.zip
don't send multiplayer broadcasts to players without SMAPI
-rw-r--r--docs/release-notes.md1
-rw-r--r--src/SMAPI/Framework/SMultiplayer.cs34
2 files changed, 13 insertions, 22 deletions
diff --git a/docs/release-notes.md b/docs/release-notes.md
index 8fa1c330..d448c726 100644
--- a/docs/release-notes.md
+++ b/docs/release-notes.md
@@ -13,6 +13,7 @@
* Expanded player info received from multiplayer API/events with new `IsSplitScreen` and `ScreenID` fields.
* Game errors shown in the chatbox are now logged.
* Added an option to disable rewriting mods for compatibility (thanks to Bpendragon!). This may prevent older mods from loading, but bypasses a Visual Studio crash when debugging.
+ * Network messages through the multiplayer API are no longer sent to players who don't have SMAPI installed. This reduces unneeded network traffic (since they can't read it anyway) and avoids an error in some cases.
* For the Error Handler mod:
* Added in SMAPI 3.9. This has vanilla error-handling that was previously added by SMAPI directly. That simplifies the core SMAPI logic, and lets players or modders disable it if needed.
diff --git a/src/SMAPI/Framework/SMultiplayer.cs b/src/SMAPI/Framework/SMultiplayer.cs
index b2257286..8e18cc09 100644
--- a/src/SMAPI/Framework/SMultiplayer.cs
+++ b/src/SMAPI/Framework/SMultiplayer.cs
@@ -392,34 +392,24 @@ namespace StardewModdingAPI.Framework
if (string.IsNullOrWhiteSpace(fromModID))
throw new ArgumentNullException(nameof(fromModID));
- // get target players
- long curPlayerId = Game1.player.UniqueMultiplayerID;
- bool sendToSelf = false;
- List<MultiplayerPeer> sendToPeers = new List<MultiplayerPeer>();
- if (toPlayerIDs == null)
- {
- sendToSelf = true;
- sendToPeers.AddRange(this.Peers.Values);
- }
- else
+ // get valid peers
+ var sendToPeers = this.Peers.Values.Where(p => p.HasSmapi).ToList();
+ bool sendToSelf = true;
+
+ // filter by player ID
+ if (toPlayerIDs != null)
{
- foreach (long id in toPlayerIDs.Distinct())
- {
- if (id == curPlayerId)
- sendToSelf = true;
- else if (this.Peers.TryGetValue(id, out MultiplayerPeer peer) && peer.HasSmapi)
- sendToPeers.Add(peer);
- }
+ var ids = new HashSet<long>(toPlayerIDs);
+ sendToPeers.RemoveAll(peer => !ids.Contains(peer.PlayerID));
+ sendToSelf = ids.Contains(Game1.player.UniqueMultiplayerID);
}
// filter by mod ID
if (toModIDs != null)
{
- HashSet<string> sendToMods = new HashSet<string>(toModIDs, StringComparer.OrdinalIgnoreCase);
- if (sendToSelf && toModIDs.All(id => this.ModRegistry.Get(id) == null))
- sendToSelf = false;
-
- sendToPeers.RemoveAll(peer => peer.Mods.All(mod => !sendToMods.Contains(mod.ID)));
+ var ids = new HashSet<string>(toModIDs, StringComparer.OrdinalIgnoreCase);
+ sendToPeers.RemoveAll(peer => peer.Mods.All(mod => !ids.Contains(mod.ID)));
+ sendToSelf = sendToSelf && toModIDs.Any(id => this.ModRegistry.Get(id) != null);
}
// validate recipients