/// <summary>Day ends (before save). This event is triggered *before* OnSaveLoaded for a new game.</summary> public static void OnDayEnding() { bool isNewGame = Game1.Date.TotalDays == -1; if (isNewGame) { SaveGameHelper.LoadFromFileOrInitialize(); return; } // don't ever reset, just apply the gift taste if (ConfigHelper.Config.ResetEveryXDays == 0) { // apply gift taste changes at the end of day (and not immediately after gifting) // this way the social tab will show the reaction you actually got for that day SaveGameHelper.Apply(); return; } int nextDay = Game1.Date.TotalDays + 1; if (nextDay % ConfigHelper.Config.ResetEveryXDays == 0) { SaveGameHelper.ResetSaveState(); return; } SaveGameHelper.Apply(); }
/// <summary>Just before a game is being saved.</summary> public static void OnSaving() { if (!Context.IsMainPlayer) { return; } SaveGameHelper.WriteToFile(); }
/// <summary>Host notices a peer.</summary> /// <param name="e">Event data.</param> public static void OnPeerConnected(PeerConnectedEventArgs e) { if (!e.Peer.HasSmapi) { return; } ConfigHelper.SyncWithPeers(); SaveGameHelper.SyncWithPeers(); }
/// <summary>After save game got loaded (or new one is created).</summary> public static void OnSaveLoaded() { NpcHelper.StoreDefaultGiftTastes(); if (!Context.IsMainPlayer) { return; } SaveGameHelper.LoadFromFileOrInitialize(); SaveGameHelper.Apply(); }
/// <summary>Host notices a peer.</summary> /// <param name="e">Event data.</param> public static void OnModMessageReceived(ModMessageReceivedEventArgs e) { if (e.FromModID != MultiplayerHelper.ModId) { return; } Logger.Trace("Receiving message from peer. Type = " + e.Type); if (e.Type == ConfigHelper.Key) { // Use configuration of the host to prevent potential de-syncs ConfigHelper.Config = e.ReadAs <ModConfig>(); } else if (e.Type == SaveGameHelper.Key) { SaveGameHelper.SaveState = e.ReadAs <ModData>(); SaveGameHelper.Apply(); } }
private void OnItemRemoved(Item plainItem) { if (!this.isInDialog) { return; } if (!(plainItem is StardewValley.Object item)) { return; } if (!item.canBeGivenAsGift()) { return; // e.g. Tools or any placable object } IEnumerator <NPC> enumerator = Game1.player.currentLocation.characters.GetEnumerator(); while (enumerator.MoveNext()) { NPC npc = enumerator.Current; if (NpcHelper.AcceptsGifts(npc) && NpcHelper.HasJustReceivedGift(npc, item)) { Logger.Trace(npc.Name + " received gift #" + item.ParentSheetIndex + " (" + item.Name + ")"); SaveGameHelper.HandleReceivedGift(npc, item); return; } } foreach (ItemDeliveryQuest quest in QuestLogHelper.GetDailyItemDeliveryQuests()) { if (quest.deliveryItem.Value.ParentSheetIndex == item.ParentSheetIndex && quest.hasReward()) { Logger.Trace("Handed over quest item"); return; } } Logger.Trace("It appears a gift has been given to someone, but I can't determine to whom :("); Logger.Trace("Maybe it was a non-daily quest item? (" + item.Name + ")"); }
/// <summary>The mod entry point, called after the mod is first loaded.</summary> /// <param name="helper">Provides simplified APIs for writing mods.</param> public override void Entry(IModHelper helper) { Logger.Init(this.Monitor); MultiplayerHelper.Init(this.Helper.Multiplayer); SaveGameHelper.Init(this.Helper.Data); ConfigHelper.Init(this.Helper); SaveGameHelper.AddResetCommand(helper); helper.Events.Display.MenuChanged += (object sender, MenuChangedEventArgs e) => EventHandler.OnMenuChanged(ref this.isInDialog, e); helper.Events.Multiplayer.ModMessageReceived += (object sender, ModMessageReceivedEventArgs e) => EventHandler.OnModMessageReceived(e); helper.Events.Multiplayer.PeerConnected += (object sender, PeerConnectedEventArgs e) => EventHandler.OnPeerConnected(e); helper.Events.Player.InventoryChanged += (object sender, InventoryChangedEventArgs e) => EventHandler.OnInventoryChanged(this.OnItemRemoved, e); helper.Events.Player.Warped += (object sender, WarpedEventArgs e) => EventHandler.OnWarped(); helper.Events.GameLoop.DayEnding += (object sender, DayEndingEventArgs e) => EventHandler.OnDayEnding(); helper.Events.GameLoop.ReturnedToTitle += (object sender, ReturnedToTitleEventArgs e) => EventHandler.OnReturnedToTitle(); helper.Events.GameLoop.Saving += (object sender, SavingEventArgs e) => EventHandler.OnSaving(); helper.Events.GameLoop.SaveLoaded += (object sender, SaveLoadedEventArgs e) => EventHandler.OnSaveLoaded(); helper.Events.World.NpcListChanged += (object sender, NpcListChangedEventArgs e) => EventHandler.OnNpcListChanged(e); }
/// <summary>Quit game back to main menu screen.</summary> public static void OnReturnedToTitle() { SaveGameHelper.ResetSaveState(); ConfigHelper.RestoreLocalConfig(); }