NPC Helper Documentation v1.0.1

Runtime custom NPC importer for Stardew Valley. Create fully-featured NPCs with TOML configuration.

SMAPI 4.0+ Stardew Valley 1.6+ Dynamic NPCs Asset Variants Localization Conditional Dialogue

Introduction

NPC Helper is a Stardew Valley mod that allows you to create custom NPCs using simple TOML configuration files. No C# coding required! The mod provides a complete system for NPC creation including:

TOML-Based Configuration

Define NPCs with simple, readable configuration files

Dynamic Dialogue

Conditional and randomized dialogue based on friendship, time, weather, and more

Advanced Schedules

Day/season/date-based routing with automatic pathfinding

Asset Variants

Location and season-specific sprites and portraits

Installation

Prerequisites

  • Stardew Valley 1.6 or higher
  • SMAPI 4.0 or higher

Installation Steps

  1. 1
    Install SMAPI

    Download and install SMAPI from smapi.io

  2. 2
    Download NPC Helper

    Download the latest version from NexusMods

  3. 3
    Extract to Mods Folder

    Extract the NPC Helper folder to Stardew Valley/Mods/

  4. 4
    Launch Game

    Start Stardew Valley through SMAPI and check the console for "[NpcHelper] Loaded"

Quick Start Guide

Before You Begin

This guide will walk you through creating your first custom NPC. Make sure NPC Helper is installed and working before proceeding.

1 Create Content Pack Structure

Create the following folder structure in your Mods directory:

Mods/
└── MyFirstNPC/              ← Your content pack folder
    ├── manifest.json        ← Required: Mod metadata
    ├── mod.toml            ← Required: NPC list
    └── NPCs/
        └── Alex/           ← Example NPC name
            ├── Alex.toml   ← NPC definition
            ├── sprite.png  ← Character sprite (16x32 per frame)
            └── portrait.png ← Portrait (64x64 per expression)

2 Create manifest.json

{
  "Name": "My First NPC",
  "Author": "YourName",
  "Version": "1.0.0",
  "Description": "Adds a custom NPC to Stardew Valley",
  "UniqueID": "YourName.MyFirstNPC",
  "ContentPackFor": {
    "UniqueID": "TamKungZ.NpcHelper"
  },
  "UpdateKeys": []
}

3 Create mod.toml

This file tells NPC Helper where to find your NPC definitions:

NPCs = ["NPCs/Alex/Alex.toml"]

4 Create NPC Definition

Create NPCs/Alex/Alex.toml with minimal configuration:

# Basic Identity
Name = "Alex"
DisplayName = "Alex the Adventurer"
Gender = "male"
Age = "adult"

# Birthday
BirthdaySeason = "spring"
BirthdayDay = 13

# Starting Location
DefaultMap = "Town"
DefaultX = 52
DefaultY = 87
DefaultFacing = 2

# Assets
CustomSpritePath = "sprite.png"
CustomPortraitPath = "portrait.png"

Test Your NPC

  1. Launch Stardew Valley with SMAPI
  2. Check the SMAPI console for "[NpcHelper] Registered NPC definition: Alex"
  3. Load or start a save game
  4. Look for your NPC at the Town coordinates (52, 87)
  5. Interact with them to verify they appear in-game

Configuration Files

manifest.json

Required

This file defines your content pack metadata. Must reference TamKungZ.NpcHelper as the content pack target.

{
  "Name": "My Custom NPC Pack",
  "Author": "YourName",
  "Version": "1.0.0",
  "UniqueID": "YourName.MyCustomNPCs",
  "Description": "Adds custom NPCs to Stardew Valley",
  "ContentPackFor": {
    "UniqueID": "TamKungZ.NpcHelper"
  },
  "UpdateKeys": []
}

mod.toml

Entry Point

Lists all NPC definition files relative to the content pack root.

# List all NPC definition files
NPCs = [
    "NPCs/Rei/Rei.toml",
    "NPCs/Alex/Alex.toml",
    "NPCs/Sophia/Sophia.toml"
]

NPC Definition (.toml)

Main Configuration

The main TOML file that defines an NPC's properties. Place this in your NPC's folder.

# ───── Basic Identity ─────
Name = "Rei"                    # Internal name (no spaces, unique)
DisplayName = "Rei"             # Name shown to players

# ───── Core Properties ─────
Gender = "female"               # "male" or "female"
Age = "adult"                   # "child", "teen", or "adult"
Manner = "polite"               # "polite", "rude", or "neutral"
SocialAnxiety = "neutral"       # "outgoing", "shy", or "neutral"
Optimism = "positive"           # "positive", "negative", or "neutral"

# ───── Birthday ─────
BirthdaySeason = "summer"       # "spring", "summer", "fall", or "winter"
BirthdayDay = 12                # 1-28

# ───── Spawn Location ─────
HomeRegion = "Town"             # Region for game logic
DefaultMap = "Hospital"         # Starting map
DefaultX = 9                    # X tile coordinate
DefaultY = 7                    # Y tile coordinate
DefaultFacing = 2               # 0=Up, 1=Right, 2=Down, 3=Left

# ───── Relationship Flags ─────
Datable = true                  # Can be dated
Marriageable = true             # Can be married

# ───── Asset Paths ─────
CustomSpritePath = "sprite.png"             # Default sprite
CustomPortraitPath = "portrait.png"         # Default portrait

# ───── External Files ─────
DialoguePath = "Dialogue.toml"              # Separate dialogue file
SchedulePath = "Schedule.toml"              # Separate schedule file

# ───── Sprite Variants ─────
[Sprites]
Hospital = "sprite_Hospital.png"           # When at Hospital
Beach = "sprite_Beach.png"                 # When at Beach
summer = "sprite_Summer.png"               # During summer
rainy = "sprite_Rainy.png"                 # When raining

# ───── Portrait Variants ─────
[Portraits]
Hospital = "portrait_Hospital.png"         # When at Hospital
summer = "portrait_Summer.png"             # During summer

# ───── Gift Tastes ─────
[GiftTastes]
# Item IDs or names (supports universal keys like "Universal_Love")
Love = ["Diamond", "Coffee", "Universal_Love"]
Like = ["Blueberry", "Universal_Like"]
Neutral = ["Universal_Neutral"]
Dislike = ["Universal_Dislike"]
Hate = ["Universal_Hate"]

Allowed Values Reference

Property Allowed Values Description
Gender "male", "female" Determines pronouns and base sound effects
Age "child", "teen", "adult" Affects walking speed, height, and events
Manner "neutral", "polite", "rude" Changes speech bubble shape and default reactions
SocialAnxiety "neutral", "outgoing", "shy" Affects idle animations and social behavior
Optimism "neutral", "positive", "negative" General personality bias
BirthdaySeason "spring", "summer", "fall", "winter" Season of NPC's birthday
DefaultFacing 0, 1, 2, 3 0: Up, 1: Right, 2: Down, 3: Left

Dialogue System

Follows Stardew Valley Standards

NPC Helper uses Stardew Valley's native dialogue system. All dialogue keys and formats must follow the official Stardew Valley format. View complete documentation on Stardew Valley Wiki ↗

Dialogue is defined in TOML files using Stardew Valley's standard key system. NPC Helper passes dialogue directly to the game engine, which handles all conditional logic and selection.

[Dialogue]
# Basic dialogue keys (following Stardew Valley format)
Introduction = "Hi, I'm Rei. Nice to meet you!"

# Day of week
Mon = "Mondays are tough, but we'll get through it."
Tue = "Tuesday already? Time flies."

# Heart levels (Stardew Valley uses numeric suffixes)
2 = "You're becoming a familiar face."
4 = "Good to see you again!"
6 = "I'm glad we're friends."

# Location-based (when NPC is at these locations)
Hospital = "I'm on duty today. Please don't distract me too much."
Town = "The town looks peaceful today."

# Seasonal dialogue
spring_1 = "Spring is finally here!"
winter_24 = "Happy Winter Star!"

# Time-based (using game's time format)
Town_2000 = "It's getting late. You should head home soon."

# Weekly rotation (Stardew Valley's || operator)
Greeting = "Hello! || Hi there! || Good to see you!"

# Festival dialogue (must match festival names)
EggFestival = "Egg hunting isn't really my thing."
FlowerDance = "The flowers are beautiful this year."

# Using Stardew Valley dialogue commands
Question = "$q 100/101 Do you like medicine?#$b#I'm just curious."
AnswerYes = "$r 100 10 Yes, I find it fascinating!"
AnswerNo = "$r 101 0 Not really, it's not for me."

# Special dialogue keys
breakUp = "This is for the best..."
divorced = "Please, just leave me alone."
AcceptGift_Loved = "This is wonderful! Thank you!"
AcceptGift_Liked = "Thanks, I appreciate it."

Dialogue Key Reference (Stardew Valley Format)

View Full Reference
Standard Dialogue Keys
  • Introduction - First meeting dialogue
  • Mon, Tue, etc. - Day of week
  • 2, 4, 6 - Heart levels
  • spring_1 - Seasonal (season_day)
  • Hospital, Town - Location-specific
  • Hospital_Tue - Location + day combination
  • Town_2000 - Location + time combination
  • EggFestival - Festival-specific
  • Default - Fallback dialogue
Key Priority Order

Stardew Valley checks keys in this order: Location-specific → Seasonal → Heart level → Day of week → Generic

Special Keys & Commands
  • breakUp - After breaking up
  • divorced - After divorce
  • AcceptGift_Loved - Gift reactions
  • AcceptGift_Liked - Gift reactions
  • RejectBouquet - Rejecting bouquet
  • DumpsterDiveComment - When player digs in trash
  • $h, $s, $u - Portrait emotes
  • $q - Question dialogue
  • $r - Response options
  • || - Weekly rotation separator
  • @ - Player name replacement
  • ${male^female} - Gender-specific text
Note on Conditions

[condition] syntax is NOT supported. Use Stardew Valley's built-in key system instead. Example: Instead of [friendship >= 4], use 4 or Mon4.

Example Conversion from Old to New Format
Old Format (Not Supported)
[friendship >= 6] Hello friend! || Hi there.
[time >= 1800] Good evening! || Hello.
[season = summer] It's hot today!
New Format (Stardew Valley)
6 = "Hello friend!"
Default = "Hi there."
Town_1800 = "Good evening!"
Town = "Hello."
summer = "It's hot today!"
Important Migration Notice

If you have existing NPCs using the old [condition] syntax, you must convert them to Stardew Valley format. Use the DialogueConverter tool or manually update your TOML files.

Schedule System

Day/Season Filtering

Define NPC movement patterns throughout the day. Schedules can be filtered by day, season, or specific dates.

# Separate Schedule.toml file structure

# ───── Weekday Schedule (Mon-Fri) ─────
[[Schedule]]
Time = 600              # 6:00 AM
Map = "Hospital"
X = 1
Y = 18
Facing = 2              # Facing down
Days = "Weekday"        # Monday through Friday

[[Schedule]]
Time = 1200             # 12:00 PM
Map = "Town"
X = 29
Y = 54
Facing = 2
Days = "Weekday"
Action = "Having lunch" # Optional description

[[Schedule]]
Time = 1800             # 6:00 PM
Map = "Hospital"
X = 13
Y = 5
Facing = 0              # Facing up
Days = "Weekday"

# ───── Weekend Schedule (Sat-Sun) ─────
[[Schedule]]
Time = 900              # 9:00 AM
Map = "Beach"
X = 20
Y = 20
Facing = 2
Days = "Weekend"        # Saturday and Sunday

[[Schedule]]
Time = 1700             # 5:00 PM
Map = "Saloon"
X = 21
Y = 17
Facing = 1
Days = "Weekend"

# ───── Specific Day Schedule ─────
[[Schedule]]
Time = 1000             # 10:00 AM
Map = "ArchaeologyHouse"
X = 15
Y = 8
Facing = 2
Season = "spring"
Day = 1                 # Only on Spring 1

# ───── Birthday Schedule ─────
[[Schedule]]
Time = 1400             # 2:00 PM
Map = "Saloon"
X = 21
Y = 17
Season = "summer"       # Rei's birthday is Summer 12
Day = 12

# ───── Specific Days of Week ─────
[[Schedule]]
Time = 800
Map = "Forest"
X = 45
Y = 32
Facing = 2
Days = "Mon,Wed,Fri"    # Only on Monday, Wednesday, Friday

Schedule Filter Options

Day Filters
  • Days = "Weekday" - Monday through Friday
  • Days = "Weekend" - Saturday and Sunday
  • Days = "Mon,Tue,Wed" - Specific days
  • Days = "Mon,Wed,Fri" - Multiple specific days
  • No Days filter = applies every day
Date Filters
  • Season = "spring" - Only in spring
  • Day = 12 - Only on day 12 of month
  • Season = "winter", Day = 24 - Only on Winter 24
  • No filters = applies every day of matching season

Gift Tastes System

Stardew Valley Gift System

⚠️ Breaking Change: The LoveMessage, LikeMessage etc. in [GiftTastes] are no longer supported. Gift response messages must now be defined in Dialogue.toml using AcceptGift_* keys following Stardew Valley's standard format.

Define what items your NPC loves, likes, is neutral about, dislikes, or hates using Stardew Valley's gift system. Gift response messages are defined separately in the dialogue file.

Main NPC TOML File

# In your main NPC TOML file (e.g., Rei.toml)

[GiftTastes]
# Use item names, qualified IDs, or universal categories
Love = [
    "Diamond",                  # Specific item name
    "(O)395",                   # Qualified item ID (Coffee)
    "Starfruit",                # Another specific item
    # "Universal_Love"          # Optional: Include universal loves
]

Like = [
    "Blueberry",
    "Coconut",
    "Salmon",
    "Cheese"
    # "Universal_Like"         # Optional: Include universal likes
]

Neutral = [
    "Stone",
    "Wood",
    "Wheat"
    # "Universal_Neutral"      # Optional: Include universal neutrals
]

Dislike = [
    "Clay",
    "Copper Ore",
    "Algae"
    # "Universal_Dislike"      # Optional: Include universal dislikes
]

Hate = [
    "Joja Cola",
    "Trash",
    "Broken Glasses"
    # "Universal_Hate"         # Optional: Include universal hates
]

# ⚠️ DEPRECATED - DO NOT USE:
# LoveMessage = "Old format - no longer works!"
# LikeMessage = "Use AcceptGift_* in Dialogue.toml instead"

Dialogue TOML File

# In Dialogue.toml - Gift response messages
# These keys must follow Stardew Valley's standard format

# Regular gift reactions
AcceptGift_Loved = "Oh wow! Is this for me? I love it! $h"
AcceptGift_Liked = "Thanks! This is nice. I appreciate it. $h"
AcceptGift_Neutral = "Thank you."
AcceptGift_Disliked = "Oh... um, thanks? $u"
AcceptGift_Hated = "Eww, why would you give me this? $a"

# Birthday gift reactions (override for birthday)
AcceptBirthdayGift_Loved = "You remembered my birthday! This is amazing! $h"
AcceptBirthdayGift = "A birthday gift? Thank you! $h"

# Optional: Specific item reactions
AcceptGift_(O)72 = "A diamond! How extravagant... $h"      # Diamond
AcceptGift_Coffee = "Coffee! Exactly what I needed. $h"     # Coffee
AcceptGift_(O)395 = "More coffee? You know me too well. $h" # Coffee by ID

# Optional: Context tag reactions
AcceptGift_category_gem = "A gemstone! Very thoughtful. $h"
AcceptGift_category_cooking = "Homemade food? You shouldn't have! $h"

Gift System Reference

Item Reference Formats
  • "Diamond" - Item name (works for most unique items)
  • "(O)72" - Qualified item ID (Object 72 = Diamond)
  • "(O)Starfruit" - Qualified ID with internal name
  • "(BC)17" - Building/other item types
  • "Universal_Love" - All universally loved items
  • "category_fruit" - All fruits (context tag)
  • "category_gem" - All gems (context tag)
Finding Item IDs

Use CJB Item Spawner mod or check the Stardew Valley Item IDs wiki for reference.

Response Message Keys
  • AcceptGift_Loved - Loved gifts (+80 friendship)
  • AcceptGift_Liked - Liked gifts (+45 friendship)
  • AcceptGift_Neutral - Neutral gifts (+20 friendship)
  • AcceptGift_Disliked - Disliked gifts (-20 friendship)
  • AcceptGift_Hated - Hated gifts (-40 friendship)
  • AcceptBirthdayGift_* - Birthday-specific responses
  • AcceptGift_(O)72 - Specific item responses
  • AcceptGift_category_gem - Category responses
Priority Order

Stardew Valley checks: Specific item → Context tag → Gift taste → Default

Migration Guide: Old → New Format
Old Format (Deprecated)
# In main NPC TOML:
[GiftTastes]
Love = ["Diamond", "Coffee"]
LoveMessage = "I love this! $h"
LikeMessage = "Thanks! $h"

# Dialogue.toml had regular dialogue only
New Format (Required)
# In main NPC TOML:
[GiftTastes]
Love = ["Diamond", "Coffee"]
Like = ["Blueberry", "Coconut"]
# NO Message keys here!

# In Dialogue.toml:
AcceptGift_Loved = "I love this! $h"
AcceptGift_Liked = "Thanks! $h"
AcceptBirthdayGift = "A birthday gift! $h"
How the System Works
  • GiftTastes in main TOML → Defines what items NPC likes/dislikes
  • AcceptGift_* in Dialogue.toml → Defines what NPC says when receiving gifts
  • • Stardew Valley engine → Handles friendship points, birthday bonuses, and response selection
  • • The two systems work together seamlessly when both are properly configured

Advanced Features

Asset Variants

Dynamic Sprites & Portraits

NPC Helper automatically switches sprites and portraits based on location, season, weather, or custom conditions. The system checks for variants in this priority order:

  1. NPC's current location (e.g., "Hospital", "Beach")
  2. Current season ("spring", "summer", "fall", "winter")
  3. Custom sprite/portrait path from TOML
  4. Default sprite.png/portrait.png in NPC folder
# In your main NPC TOML file

[Sprites]
# Location-based variants
Hospital = "sprite_Hospital.png"     # When NPC is at Hospital
Beach = "sprite_Beach.png"           # When at Beach
Saloon = "sprite_Saloon.png"         # When at Saloon

# Season-based variants
spring = "sprite_Spring.png"
summer = "sprite_Summer.png"
fall = "sprite_Fall.png"
winter = "sprite_Winter.png"

# Weather-based variants
rainy = "sprite_Rainy.png"
snow = "sprite_Snow.png"

# Special occasion variants
festival = "sprite_Festival.png"
birthday = "sprite_Birthday.png"

[Portraits]
# Same structure for portraits
Hospital = "portrait_Hospital.png"
summer = "portrait_Summer.png"
rainy = "portrait_Rainy.png"
festival = "portrait_Festival.png"

Asset Requirements

  • Sprites: 16x32 pixels per frame (standard Stardew NPC size)
  • Portraits: 64x64 pixels per expression
  • Format: PNG recommended (supports transparency)
  • Paths: Relative to the NPC's folder, or absolute paths
  • Naming: File names are case-sensitive on some systems

Localization

Multi-language Support

NPC Helper automatically loads localized versions of your TOML files based on the game's current language. Create a locale folder in your NPC's directory with language-specific TOML files.

NPCs/
└── Rei/
    ├── Rei.toml                    # Default (English) definition
    ├── sprite.png
    ├── portrait.png
    └── locale/                     # Localization folder
        ├── es-ES/                  # Spanish (Spain)
        │   └── Rei.toml            # Spanish translation
        ├── fr-FR/                  # French
        │   └── Rei.toml
        └── de/                     # German (generic)
            └── Rei.toml
# locale/es-ES/Rei.toml - Spanish translation
# Only include properties that need translation

DisplayName = "Rei"  # Spanish display name

[Dialogue]
Introduction = "Hola. Soy Rei, médico en prácticas en la clínica."
Mon = "Los lunes no me asustan. Solo necesitan el café adecuado."
Default = "Si me necesitas, estoy en la clínica."

# Gift messages can also be localized
LoveMessage = "¡Oh, vaya! ¿Esto es para mí? ¡Me encanta!"
LikeMessage = "¡Gracias! Esto está bien."
DislikeMessage = "Oh... um, ¿gracias?"

How Localization Works

  • Locale Detection: Uses helper.Translation.Locale (e.g., "es-ES", "fr-FR")
  • Fallback: If "es-ES" folder doesn't exist, tries "es" folder
  • Overlay System: Localized TOML merges with base definition
  • Automatic: No code needed - just create locale folders
  • Cache Invalidation: Assets automatically reload when language changes

API Reference

For Mod Developers

Other mods can programmatically register NPCs with NPC Helper using the provided API interface.

using StardewModdingAPI;
using NpcHelper;

public class MyMod : Mod
{
    public override void Entry(IModHelper helper)
    {
        // Get the NPC Helper API
        var npcHelper = helper.ModRegistry.GetApi("TamKungZ.NpcHelper");
        
        if (npcHelper != null)
        {
            // Create NPC definition programmatically
            var customNpc = new NpcDefinition
            {
                DisplayName = "Programmatic NPC",
                Gender = "female",
                Age = "adult",
                DefaultMap = "Town",
                DefaultX = 35,
                DefaultY = 42,
                DefaultFacing = 2,
                Datable = true,
                Marriageable = false
            };
            
            // Add dialogue
            customNpc.Dialogue["Introduction"] = "Hello from code!";
            customNpc.Dialogue["Mon"] = "Monday dialogue from API.";
            
            // Add gift tastes
            customNpc.GiftTastes["Love"] = new List { "Diamond", "Prismatic Shard" };
            customNpc.GiftTastes["Hate"] = new List { "Joja Cola" };
            
            // Register the NPC
            npcHelper.RegisterNpc("CustomNPC", customNpc);
        }
    }
}

API Interface

INpcHelperApi Interface
public interface INpcHelperApi
{
    /// 
    /// Register a new NPC programmatically
    /// 
    /// Unique NPC name (no spaces)
    /// NPC definition data
    void RegisterNpc(string name, NpcDefinition data);
}

// Implementation in ModEntry.cs
public class NpcHelperApi : INpcHelperApi
{
    private readonly NpcManager _manager;
    public NpcHelperApi(NpcManager manager) => _manager = manager;

    public void RegisterNpc(string name, NpcDefinition data)
    {
        data.Name = name;
        _manager.Register(data);
    }
}
Requirements
  • NPC Helper must be installed
  • Mod must reference NpcHelper namespace
  • MinimumApiVersion: "4.0.0"
  • UniqueID: "TamKungZ.NpcHelper"
Limitations
  • Assets must be loaded via SMAPI's content API
  • No direct access to NPC instances
  • Schedule execution handled by NPC Helper

Help & Support

Troubleshooting

NPC Not Appearing in Game

  • Check SMAPI Log: Look for "[NpcHelper]" messages. Missing logs mean the mod isn't loading.
  • Verify manifest.json: Ensure ContentPackFor.UniqueID is exactly "TamKungZ.NpcHelper"
  • Check mod.toml: Verify the path in NPCs = ["..."] is correct and file exists.
  • DefaultMap exists: Ensure the map name in DefaultMap exists in your game version.
  • NPC name conflict: Ensure NPC Name doesn't conflict with vanilla or other mod NPCs.

Dialogue Not Showing or Incorrect

  • Dialogue keys: Verify keys match Stardew's expected format (Mon, Tue, Introduction, etc.)
  • Condition syntax: Ensure conditions use correct syntax: [friendship >= 4] Text
  • TOML header: Dialogue in separate files needs [Dialogue] header
  • Cache issue: Try clearing SMAPI cache or restarting the game
  • Test without conditions: First test simple dialogue without conditions

Assets Not Loading (Red Question Mark)

  • File format: Ensure images are PNG format with transparency
  • Dimensions: Sprites: 16x32 per frame, Portraits: 64x64 per expression
  • File paths: Check TOML paths are correct relative to TOML file location
  • Case sensitivity: File names are case-sensitive on Linux/Mac
  • SMAPI cache: Clear SMAPI cache: Delete Mods/.cache folder

Common SMAPI Error Messages

Error Message
  • "Content file not found"
  • "Invalid TOML syntax"
  • "Duplicate NPC name"
  • "Missing dependency"
  • "Failed to load texture"
Solution
  • Check asset paths in TOML
  • Validate TOML with online validator
  • Change NPC name to be unique
  • Install NPC Helper mod
  • Verify image file exists and is PNG

Compatibility

Feature Stardew 1.5 Stardew 1.6 Notes
Basic NPC Creation Limited Full 1.6 has better character data support
Advanced Schedules Basic Full Day/Season filters optimized for 1.6
Asset Variants Yes Yes Location/season-based sprites work in both
Dynamic Dialogue Yes Yes Conditional and randomized dialogue
Multiplayer Support Limited Full Full sync in 1.6 multiplayer
Gift Tastes System Yes Yes Customizable gift preferences
Localization Yes Yes Automatic locale folder detection

Mod Compatibility

Content Patcher
Can coexist but may have asset conflicts
Json Assets
Compatible - can use custom items as gifts
Custom NPC Mods
May conflict if modifying same NPC data

Frequently Asked Questions

Q: Can I use NPC Helper with existing Content Patcher NPCs?

A: Yes, but they may conflict if modifying the same NPC data. NPC Helper creates new NPCs in the game's character data, while Content Patcher usually edits existing data. It's recommended to use one system or the other for a given NPC.

Q: How do I make my NPC appear in a specific location?

A: Use the DefaultMap, DefaultX, and DefaultY properties in your NPC TOML. The coordinates are tile coordinates (multiply by 64 for pixel coordinates). Use the Schedule.toml file to define daily movement patterns.

Q: Can NPCs have custom events or cutscenes?

A: NPC Helper focuses on runtime NPC creation and management. For complex events or cutscenes, you'll need to create them separately using SMAPI's event system or Content Patcher. The API allows other mods to interact with NPC Helper NPCs.

Q: How do I update an existing NPC without breaking saves?

A: NPC definitions are loaded at runtime each time the game starts. You can update TOML files, assets, or add new features, and they'll be applied when players reload their game. However, changing an NPC's Name property will create a new NPC and may break existing friendships.

Q: What's the performance impact of many NPCs?

A: NPC Helper is optimized for performance. Each NPC has minimal overhead when not on screen. The main impact comes from asset loading and schedule execution. For large numbers of NPCs (50+), consider spreading them across different content packs or using simplified schedules.