internal static bool CanKissNpc(Farmer who, NPC npc) { NpcConfig npcConfig = DataLoader.ModConfig.NpcConfigs.Find(n => n.Name == npc.Name); return(npcConfig != null && (who.friendshipData[npc.Name].IsDating() || DataLoader.ModConfig.DisableDatingRequirement) && (npcConfig.RequiredEvent == null || who.eventsSeen.Contains(npcConfig.RequiredEvent.Value) || DataLoader.ModConfig.DisableEventRequirement)); }
public void LoadContentPacks() { foreach (IContentPack contentPack in Helper.ContentPacks.GetOwned()) { if (contentPack.HasFile(NpcJson)) { CustomKissingModEntry.ModMonitor.Log($"Reading content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}"); List <NpcConfig> npcs = contentPack.ReadJsonFile <List <NpcConfig> >(NpcJson); foreach (NpcConfig npc in npcs) { NpcConfig existingNpc = ModConfig.NpcConfigs.Find(n => n.Name == npc.Name); if (existingNpc != null) { if (ModConfig.EnableContentPacksOverrides) { CustomKissingModEntry.ModMonitor.Log($"Content pack '{contentPack.Manifest.Name}' is replacing the config for npc '{npc.Name}'", LogLevel.Info); ModConfig.NpcConfigs.Remove(existingNpc); ModConfig.NpcConfigs.Add(npc); } else { CustomKissingModEntry.ModMonitor.Log($"Content pack '{contentPack.Manifest.Name}' is trying to add a new config for npc '{npc.Name}'. You should enable content pack overrides or resolve the conflict.\nThe new config will be ignored.", LogLevel.Warn); } } else { CustomKissingModEntry.ModMonitor.Log($"Content pack '{contentPack.Manifest.Name}' is adding a config for npc '{npc.Name}'", LogLevel.Debug); ModConfig.NpcConfigs.Add(npc); } } } else { CustomKissingModEntry.ModMonitor.Log($"Ignoring content pack: {contentPack.Manifest.Name} {contentPack.Manifest.Version} from {contentPack.DirectoryPath}\nIt does not have an {NpcJson} file.", LogLevel.Warn); } } }
public static void checkAction(NPC __instance, ref Farmer who, ref bool __result, GameLocation l) { NpcConfig npcConfig = DataLoader.ModConfig.NpcConfigs.Find(n => n.Name == __instance.Name); if (npcConfig != null && __result != true && !__instance.isMarried() && CanKissNpc(who, __instance) && who.IsLocalPlayer) { int timeOfDay = Game1.timeOfDay; if (__instance.Sprite.CurrentAnimation == null && !__instance.hasTemporaryMessageAvailable() && (__instance.CurrentDialogue.Count == 0 && Game1.timeOfDay < 2200) && (!__instance.isMoving() && who.ActiveObject == null)) { __instance.faceDirection(-3); __instance.faceGeneralDirection(who.getStandingPosition(), 0, false); who.faceGeneralDirection(__instance.getStandingPosition(), 0, false); if (__instance.FacingDirection == 3 || __instance.FacingDirection == 1) { int frame = npcConfig.Frame; bool flag = npcConfig.FrameDirectionRight; bool flip = flag && __instance.FacingDirection == 3 || !flag && __instance.FacingDirection == 1; if (HasRequiredFriendshipToKiss(who, __instance)) { __instance.Sprite.setCurrentAnimation(new List <FarmerSprite.AnimationFrame>() { new FarmerSprite.AnimationFrame(frame, Game1.IsMultiplayer ? 1010 : 10, false, flip, new AnimatedSprite.endOfAnimationBehavior(__instance.haltMe), true) }); if (!__instance.hasBeenKissedToday.Value) { who.changeFriendship(DataLoader.ModConfig.KissingFriendshipPoints, __instance); DataLoader.Helper.Reflection.GetField <Multiplayer>(typeof(Game1), "multiplayer").GetValue().broadcastSprites(who.currentLocation, new TemporaryAnimatedSprite[1] { new TemporaryAnimatedSprite("LooseSprites\\Cursors", new Microsoft.Xna.Framework.Rectangle(211, 428, 7, 6), 2000f, 1, 0, new Vector2((float)__instance.getTileX(), (float)__instance.getTileY()) * 64f + new Vector2(16f, -64f), false, false, 1f, 0.0f, Color.White, 4f, 0.0f, 0.0f, 0.0f, false) { motion = new Vector2(0.0f, -0.5f), alphaFade = 0.01f } }); l.playSound("dwop"); if (!DataLoader.ModConfig.DisableExhaustionReset) { who.exhausted.Value = false; } if (!DataLoader.ModConfig.DisableJealousy) { if (who.spouse != null && !who.spouse.Contains(__instance.Name)) { NPC characterFromName = Game1.getCharacterFromName(who.spouse, false); if (l.characters.Contains(characterFromName) || !(Game1.random.NextDouble() >= 0.3 - (double)who.LuckLevel / 100.0 - who.DailyLuck)) { who.changeFriendship(DataLoader.ModConfig.JealousyFriendshipPoints, characterFromName); characterFromName.CurrentDialogue.Clear(); characterFromName.CurrentDialogue.Push(new StardewValley.Dialogue(DataLoader.Helper.Translation.Get("Jealousy.Dialog", new { npcName = (object)__instance.displayName }), characterFromName)); } } } } __instance.hasBeenKissedToday.Value = true; __instance.Sprite.UpdateSourceRect(); } else { __instance.faceDirection(Game1.random.NextDouble() < 0.5 ? 2 : 0); __instance.doEmote(12, true); } who.CanMove = false; who.FarmerSprite.PauseForSingleAnimation = false; if (flag && !flip || !flag & flip) { who.faceDirection(3); } else { who.faceDirection(1); } who.FarmerSprite.animateOnce(new List <FarmerSprite.AnimationFrame>() { new FarmerSprite.AnimationFrame(101, 1000, 0, false, who.FacingDirection == 3, (AnimatedSprite.endOfAnimationBehavior)null, false, 0), new FarmerSprite.AnimationFrame(6, 1, false, who.FacingDirection == 3, new AnimatedSprite.endOfAnimationBehavior(Farmer.completelyStopAnimating), false) }.ToArray()); __result = true; } } } else if (__instance.isMarried()) { NpcConfig defaultNpcConfig = DataLoader.DefaultConfig.NpcConfigs.Find(n => n.Name == __instance.Name); if (defaultNpcConfig != null && npcConfig != null && defaultNpcConfig.Frame != npcConfig.Frame) { if (__instance.Sprite.CurrentFrame == defaultNpcConfig.Frame) { int frame = npcConfig.Frame; bool flag = npcConfig.FrameDirectionRight; bool flip = flag && __instance.FacingDirection == 3 || !flag && __instance.FacingDirection == 1; __instance.Sprite.currentFrame = frame; var oldAnimationFrame = __instance.Sprite.CurrentAnimation[__instance.Sprite.currentAnimationIndex]; __instance.Sprite.CurrentAnimation[__instance.Sprite.currentAnimationIndex] = new FarmerSprite.AnimationFrame(frame, 0, oldAnimationFrame.milliseconds, oldAnimationFrame.secondaryArm, flip, oldAnimationFrame.frameStartBehavior, oldAnimationFrame.frameEndBehavior, 0); __instance.Sprite.UpdateSourceRect(); } } } }