summaryrefslogtreecommitdiff
path: root/src/SMAPI/Framework
diff options
context:
space:
mode:
Diffstat (limited to 'src/SMAPI/Framework')
-rw-r--r--src/SMAPI/Framework/Events/EventManager.cs20
-rw-r--r--src/SMAPI/Framework/SGame.cs1
-rw-r--r--src/SMAPI/Framework/SMultiplayer.cs47
3 files changed, 68 insertions, 0 deletions
diff --git a/src/SMAPI/Framework/Events/EventManager.cs b/src/SMAPI/Framework/Events/EventManager.cs
index d7c89a76..87ff760f 100644
--- a/src/SMAPI/Framework/Events/EventManager.cs
+++ b/src/SMAPI/Framework/Events/EventManager.cs
@@ -126,6 +126,21 @@ namespace StardewModdingAPI.Framework.Events
public readonly ManagedEvent<EventArgsClickableMenuClosed> Menu_Closed;
/****
+ ** MultiplayerEvents
+ ****/
+ /// <summary>Raised before the game syncs changes from other players.</summary>
+ public readonly ManagedEvent Multiplayer_BeforeMainSync;
+
+ /// <summary>Raised after the game syncs changes from other players.</summary>
+ public readonly ManagedEvent Multiplayer_AfterMainSync;
+
+ /// <summary>Raised before the game broadcasts changes to other players.</summary>
+ public readonly ManagedEvent Multiplayer_BeforeMainBroadcast;
+
+ /// <summary>Raised after the game broadcasts changes to other players.</summary>
+ public readonly ManagedEvent Multiplayer_AfterMainBroadcast;
+
+ /****
** MineEvents
****/
/// <summary>Raised after the player warps to a new level of the mine.</summary>
@@ -228,6 +243,11 @@ namespace StardewModdingAPI.Framework.Events
this.Menu_Changed = ManageEventOf<EventArgsClickableMenuChanged>(nameof(MenuEvents), nameof(MenuEvents.MenuChanged));
this.Menu_Closed = ManageEventOf<EventArgsClickableMenuClosed>(nameof(MenuEvents), nameof(MenuEvents.MenuClosed));
+ this.Multiplayer_BeforeMainBroadcast = ManageEvent(nameof(MultiplayerEvents), nameof(MultiplayerEvents.BeforeMainBroadcast));
+ this.Multiplayer_AfterMainBroadcast = ManageEvent(nameof(MultiplayerEvents), nameof(MultiplayerEvents.AfterMainBroadcast));
+ this.Multiplayer_BeforeMainSync = ManageEvent(nameof(MultiplayerEvents), nameof(MultiplayerEvents.BeforeMainSync));
+ this.Multiplayer_AfterMainSync = ManageEvent(nameof(MultiplayerEvents), nameof(MultiplayerEvents.AfterMainSync));
+
this.Mine_LevelChanged = ManageEventOf<EventArgsMineLevelChanged>(nameof(MineEvents), nameof(MineEvents.MineLevelChanged));
this.Player_InventoryChanged = ManageEventOf<EventArgsInventoryChanged>(nameof(PlayerEvents), nameof(PlayerEvents.InventoryChanged));
diff --git a/src/SMAPI/Framework/SGame.cs b/src/SMAPI/Framework/SGame.cs
index 7ea83957..89bf18ef 100644
--- a/src/SMAPI/Framework/SGame.cs
+++ b/src/SMAPI/Framework/SGame.cs
@@ -155,6 +155,7 @@ namespace StardewModdingAPI.Framework
if (this.ContentCore == null) // shouldn't happen since CreateContentManager is called first, but let's init here just in case
this.ContentCore = new ContentCore(this.Content.ServiceProvider, this.Content.RootDirectory, Thread.CurrentThread.CurrentUICulture, this.Monitor, reflection);
Game1.input = new SInputState();
+ Game1.multiplayer = new SMultiplayer(monitor, eventManager);
// init watchers
Game1.locations = new ObservableCollection<GameLocation>();
diff --git a/src/SMAPI/Framework/SMultiplayer.cs b/src/SMAPI/Framework/SMultiplayer.cs
new file mode 100644
index 00000000..687b1922
--- /dev/null
+++ b/src/SMAPI/Framework/SMultiplayer.cs
@@ -0,0 +1,47 @@
+using StardewModdingAPI.Framework.Events;
+using StardewValley;
+
+namespace StardewModdingAPI.Framework
+{
+ /// <summary>SMAPI's implementation of the game's core multiplayer logic.</summary>
+ internal class SMultiplayer : Multiplayer
+ {
+ /*********
+ ** Properties
+ *********/
+ /// <summary>Encapsulates monitoring and logging.</summary>
+ private readonly IMonitor Monitor;
+
+ /// <summary>Manages SMAPI events.</summary>
+ private readonly EventManager EventManager;
+
+
+ /*********
+ ** Public methods
+ *********/
+ /// <summary>Construct an instance.</summary>
+ /// <param name="monitor">Encapsulates monitoring and logging.</param>
+ /// <param name="eventManager">Manages SMAPI events.</param>
+ public SMultiplayer(IMonitor monitor, EventManager eventManager)
+ {
+ this.Monitor = monitor;
+ this.EventManager = eventManager;
+ }
+
+ /// <summary>Handle sync messages from other players and perform other initial sync logic.</summary>
+ public override void UpdateEarly()
+ {
+ this.EventManager.Multiplayer_BeforeMainSync.Raise();
+ base.UpdateEarly();
+ this.EventManager.Multiplayer_AfterMainSync.Raise();
+ }
+
+ /// <summary>Broadcast sync messages to other players and perform other final sync logic.</summary>
+ public override void UpdateLate(bool forceSync = false)
+ {
+ this.EventManager.Multiplayer_BeforeMainBroadcast.Raise();
+ base.UpdateLate(forceSync);
+ this.EventManager.Multiplayer_AfterMainBroadcast.Raise();
+ }
+ }
+}