summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Plamondon-Willard <github@jplamondonw.com>2017-01-18 22:14:50 -0500
committerJesse Plamondon-Willard <github@jplamondonw.com>2017-01-18 22:14:50 -0500
commit602227eae8da421db759e45595812d9978ca8238 (patch)
tree137c7671dbe4ae2fce3be636f7bc5848bc1f4547
parentb3ff0045722acec9b8c12f5f13dec4f21008d6b8 (diff)
downloadSMAPI-602227eae8da421db759e45595812d9978ca8238.tar.gz
SMAPI-602227eae8da421db759e45595812d9978ca8238.tar.bz2
SMAPI-602227eae8da421db759e45595812d9978ca8238.zip
fix some world events being fired during game startup (#217)
-rw-r--r--release-notes.md1
-rw-r--r--src/StardewModdingAPI/Inheritance/SGame.cs202
2 files changed, 106 insertions, 97 deletions
diff --git a/release-notes.md b/release-notes.md
index 4e91ee2e..c870bbb5 100644
--- a/release-notes.md
+++ b/release-notes.md
@@ -5,6 +5,7 @@ See [log](https://github.com/Pathoschild/SMAPI/compare/1.6...1.7).
For mod developers:
* Fixed `PlayerEvents.LoadedGame` and `SaveEvents.AfterLoad` being fired before the world finishes initialising.
+* Fixed some `LocationEvents`, `PlayerEvents`, and `TimeEvents` being fired during game startup.
## 1.6
See [log](https://github.com/Pathoschild/SMAPI/compare/1.5...1.6).
diff --git a/src/StardewModdingAPI/Inheritance/SGame.cs b/src/StardewModdingAPI/Inheritance/SGame.cs
index 28c2aa42..f23f3212 100644
--- a/src/StardewModdingAPI/Inheritance/SGame.cs
+++ b/src/StardewModdingAPI/Inheritance/SGame.cs
@@ -28,6 +28,9 @@ namespace StardewModdingAPI.Inheritance
/// <remarks>Skipping a few frames ensures the game finishes initialising the world before mods try to change it.</remarks>
private int AfterLoadTimer = 5;
+ /// <summary>Whether the player has loaded a save and the world has finished initialising.</summary>
+ private bool IsWorldReady => this.AfterLoadTimer < 0;
+
/// <summary>The debug messages to add to the next debug output.</summary>
internal static Queue<string> DebugMessageQueue { get; private set; }
@@ -861,57 +864,71 @@ namespace StardewModdingAPI.Inheritance
/// <summary>Detect changes since the last update ticket and trigger mod events.</summary>
private void UpdateEventCalls()
{
- // get latest state
- this.KStateNow = Keyboard.GetState();
- this.MStateNow = Mouse.GetState();
- this.MPositionNow = new Point(Game1.getMouseX(), Game1.getMouseY());
-
- // raise key pressed
- foreach (var key in this.FramePressedKeys)
- ControlEvents.InvokeKeyPressed(this.Monitor, key);
-
- // raise key released
- foreach (var key in this.FrameReleasedKeys)
- ControlEvents.InvokeKeyReleased(this.Monitor, key);
-
- // raise controller button pressed
- for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ // save loaded event
+ if (Game1.hasLoadedGame && this.AfterLoadTimer >= 0)
{
- var buttons = this.GetFramePressedButtons(i);
- foreach (var button in buttons)
+ if (this.AfterLoadTimer == 0)
{
- if (button == Buttons.LeftTrigger || button == Buttons.RightTrigger)
- ControlEvents.InvokeTriggerPressed(this.Monitor, i, button, button == Buttons.LeftTrigger ? GamePad.GetState(i).Triggers.Left : GamePad.GetState(i).Triggers.Right);
- else
- ControlEvents.InvokeButtonPressed(this.Monitor, i, button);
+ SaveEvents.InvokeAfterLoad(this.Monitor);
+ PlayerEvents.InvokeLoadedGame(this.Monitor, new EventArgsLoadedGameChanged(Game1.hasLoadedGame));
}
+ this.AfterLoadTimer--;
}
- // raise controller button released
- for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ // input events
{
- foreach (var button in this.GetFrameReleasedButtons(i))
+ // get latest state
+ this.KStateNow = Keyboard.GetState();
+ this.MStateNow = Mouse.GetState();
+ this.MPositionNow = new Point(Game1.getMouseX(), Game1.getMouseY());
+
+ // raise key pressed
+ foreach (var key in this.FramePressedKeys)
+ ControlEvents.InvokeKeyPressed(this.Monitor, key);
+
+ // raise key released
+ foreach (var key in this.FrameReleasedKeys)
+ ControlEvents.InvokeKeyReleased(this.Monitor, key);
+
+ // raise controller button pressed
+ for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
{
- if (button == Buttons.LeftTrigger || button == Buttons.RightTrigger)
- ControlEvents.InvokeTriggerReleased(this.Monitor, i, button, button == Buttons.LeftTrigger ? GamePad.GetState(i).Triggers.Left : GamePad.GetState(i).Triggers.Right);
- else
- ControlEvents.InvokeButtonReleased(this.Monitor, i, button);
+ var buttons = this.GetFramePressedButtons(i);
+ foreach (var button in buttons)
+ {
+ if (button == Buttons.LeftTrigger || button == Buttons.RightTrigger)
+ ControlEvents.InvokeTriggerPressed(this.Monitor, i, button, button == Buttons.LeftTrigger ? GamePad.GetState(i).Triggers.Left : GamePad.GetState(i).Triggers.Right);
+ else
+ ControlEvents.InvokeButtonPressed(this.Monitor, i, button);
+ }
}
- }
- // raise keyboard state changed
- if (this.KStateNow != this.KStatePrior)
- ControlEvents.InvokeKeyboardChanged(this.Monitor, this.KStatePrior, this.KStateNow);
+ // raise controller button released
+ for (var i = PlayerIndex.One; i <= PlayerIndex.Four; i++)
+ {
+ foreach (var button in this.GetFrameReleasedButtons(i))
+ {
+ if (button == Buttons.LeftTrigger || button == Buttons.RightTrigger)
+ ControlEvents.InvokeTriggerReleased(this.Monitor, i, button, button == Buttons.LeftTrigger ? GamePad.GetState(i).Triggers.Left : GamePad.GetState(i).Triggers.Right);
+ else
+ ControlEvents.InvokeButtonReleased(this.Monitor, i, button);
+ }
+ }
- // raise mouse state changed
- if (this.MStateNow != this.MStatePrior)
- {
- ControlEvents.InvokeMouseChanged(this.Monitor, this.MStatePrior, this.MStateNow, this.MPositionPrior, this.MPositionNow);
- this.MStatePrior = this.MStateNow;
- this.MPositionPrior = this.MPositionPrior;
+ // raise keyboard state changed
+ if (this.KStateNow != this.KStatePrior)
+ ControlEvents.InvokeKeyboardChanged(this.Monitor, this.KStatePrior, this.KStateNow);
+
+ // raise mouse state changed
+ if (this.MStateNow != this.MStatePrior)
+ {
+ ControlEvents.InvokeMouseChanged(this.Monitor, this.MStatePrior, this.MStateNow, this.MPositionPrior, this.MPositionNow);
+ this.MStatePrior = this.MStateNow;
+ this.MPositionPrior = this.MPositionPrior;
+ }
}
- // raise menu changed
+ // menu events
if (Game1.activeClickableMenu != this.PreviousActiveMenu)
{
IClickableMenu previousMenu = this.PreviousActiveMenu;
@@ -934,23 +951,23 @@ namespace StardewModdingAPI.Inheritance
this.PreviousActiveMenu = newMenu;
}
- // raise location list changed
- if (this.GetHash(Game1.locations) != this.PreviousGameLocations)
+ // world & player events
+ if (this.IsWorldReady)
{
- LocationEvents.InvokeLocationsChanged(this.Monitor, Game1.locations);
- this.PreviousGameLocations = this.GetHash(Game1.locations);
- }
+ // raise location list changed
+ if (this.GetHash(Game1.locations) != this.PreviousGameLocations)
+ {
+ LocationEvents.InvokeLocationsChanged(this.Monitor, Game1.locations);
+ this.PreviousGameLocations = this.GetHash(Game1.locations);
+ }
- // raise current location changed
- if (Game1.currentLocation != this.PreviousGameLocation)
- {
- LocationEvents.InvokeCurrentLocationChanged(this.Monitor, this.PreviousGameLocation, Game1.currentLocation);
- this.PreviousGameLocation = Game1.currentLocation;
- }
+ // raise current location changed
+ if (Game1.currentLocation != this.PreviousGameLocation)
+ {
+ LocationEvents.InvokeCurrentLocationChanged(this.Monitor, this.PreviousGameLocation, Game1.currentLocation);
+ this.PreviousGameLocation = Game1.currentLocation;
+ }
- // player events
- if (Game1.player != null)
- {
// raise player changed
if (Game1.player != this.PreviousFarmer)
{
@@ -997,57 +1014,48 @@ namespace StardewModdingAPI.Inheritance
PlayerEvents.InvokeInventoryChanged(this.Monitor, Game1.player.items, changedItems);
this.PreviousItems = Game1.player.items.Where(n => n != null).ToDictionary(n => n, n => n.Stack);
}
- }
-
- // raise current location's object list changed
- int? objectHash = Game1.currentLocation?.objects != null ? this.GetHash(Game1.currentLocation.objects) : (int?)null;
- if (objectHash != null && this.PreviousLocationObjects != objectHash)
- {
- LocationEvents.InvokeOnNewLocationObject(this.Monitor, Game1.currentLocation.objects);
- this.PreviousLocationObjects = objectHash.Value;
- }
- // raise time changed
- if (Game1.timeOfDay != this.PreviousTimeOfDay)
- {
- TimeEvents.InvokeTimeOfDayChanged(this.Monitor, this.PreviousTimeOfDay, Game1.timeOfDay);
- this.PreviousTimeOfDay = Game1.timeOfDay;
- }
- if (Game1.dayOfMonth != this.PreviousDayOfMonth)
- {
- TimeEvents.InvokeDayOfMonthChanged(this.Monitor, this.PreviousDayOfMonth, Game1.dayOfMonth);
- this.PreviousDayOfMonth = Game1.dayOfMonth;
- }
- if (Game1.currentSeason != this.PreviousSeasonOfYear)
- {
- TimeEvents.InvokeSeasonOfYearChanged(this.Monitor, this.PreviousSeasonOfYear, Game1.currentSeason);
- this.PreviousSeasonOfYear = Game1.currentSeason;
- }
- if (Game1.year != this.PreviousYearOfGame)
- {
- TimeEvents.InvokeYearOfGameChanged(this.Monitor, this.PreviousYearOfGame, Game1.year);
- this.PreviousYearOfGame = Game1.year;
- }
+ // raise current location's object list changed
+ {
+ int? objectHash = Game1.currentLocation?.objects != null ? this.GetHash(Game1.currentLocation.objects) : (int?)null;
+ if (objectHash != null && this.PreviousLocationObjects != objectHash)
+ {
+ LocationEvents.InvokeOnNewLocationObject(this.Monitor, Game1.currentLocation.objects);
+ this.PreviousLocationObjects = objectHash.Value;
+ }
+ }
- // raise save loaded
- if (Game1.hasLoadedGame && this.AfterLoadTimer >= 0)
- {
- if (this.AfterLoadTimer == 0)
+ // raise time changed
+ if (Game1.timeOfDay != this.PreviousTimeOfDay)
{
- SaveEvents.InvokeAfterLoad(this.Monitor);
- PlayerEvents.InvokeLoadedGame(this.Monitor, new EventArgsLoadedGameChanged(Game1.hasLoadedGame));
+ TimeEvents.InvokeTimeOfDayChanged(this.Monitor, this.PreviousTimeOfDay, Game1.timeOfDay);
+ this.PreviousTimeOfDay = Game1.timeOfDay;
+ }
+ if (Game1.dayOfMonth != this.PreviousDayOfMonth)
+ {
+ TimeEvents.InvokeDayOfMonthChanged(this.Monitor, this.PreviousDayOfMonth, Game1.dayOfMonth);
+ this.PreviousDayOfMonth = Game1.dayOfMonth;
+ }
+ if (Game1.currentSeason != this.PreviousSeasonOfYear)
+ {
+ TimeEvents.InvokeSeasonOfYearChanged(this.Monitor, this.PreviousSeasonOfYear, Game1.currentSeason);
+ this.PreviousSeasonOfYear = Game1.currentSeason;
+ }
+ if (Game1.year != this.PreviousYearOfGame)
+ {
+ TimeEvents.InvokeYearOfGameChanged(this.Monitor, this.PreviousYearOfGame, Game1.year);
+ this.PreviousYearOfGame = Game1.year;
}
- this.AfterLoadTimer--;
- }
- // raise mine level changed
- if (Game1.mine != null && Game1.mine.mineLevel != this.PreviousMineLevel)
- {
- MineEvents.InvokeMineLevelChanged(this.Monitor, this.PreviousMineLevel, Game1.mine.mineLevel);
- this.PreviousMineLevel = Game1.mine.mineLevel;
+ // raise mine level changed
+ if (Game1.mine != null && Game1.mine.mineLevel != this.PreviousMineLevel)
+ {
+ MineEvents.InvokeMineLevelChanged(this.Monitor, this.PreviousMineLevel, Game1.mine.mineLevel);
+ this.PreviousMineLevel = Game1.mine.mineLevel;
+ }
}
- // raise game transitioning to new day
+ // raise game day transition event (obsolete)
if (Game1.newDay != this.PreviousIsNewDay)
{
TimeEvents.InvokeOnNewDay(this.Monitor, this.PreviousDayOfMonth, Game1.dayOfMonth, Game1.newDay);