SimcProfileParser 3.2.0
dotnet add package SimcProfileParser --version 3.2.0
NuGet\Install-Package SimcProfileParser -Version 3.2.0
<PackageReference Include="SimcProfileParser" Version="3.2.0" />
<PackageVersion Include="SimcProfileParser" Version="3.2.0" />
<PackageReference Include="SimcProfileParser" />
paket add SimcProfileParser --version 3.2.0
#r "nuget: SimcProfileParser, 3.2.0"
#:package SimcProfileParser@3.2.0
#addin nuget:?package=SimcProfileParser&version=3.2.0
#tool nuget:?package=SimcProfileParser&version=3.2.0
Simc Profile Parser
A library to parse items in the simc import format into functional objects.
PLEASE NOTE: This library is still a work in progress and is being created to support another project.
Please raise an issue if something isn't working as you would expect or throws a NotYetImplemented
exception and it may be prioritised.
Usage
Initialising
Instance Creation
A new instance can be manually created.
ISimcGenerationService sgs = new SimcGenerationService();
To provide logging to the new instance and its children, supply an ILoggerFactory:
ISimcGenerationService sgs = new SimcGenerationService(myLoggerFactory);
Using Dependency Injection
To implement this using Dependency Injection register it alongside your other services configuration
using the AddSimcProfileParser() extension method when configuring your DI services:
public void ConfigureServices(IServiceCollection services)
{
services.AddSimcProfileParser();
}
Then you request an instance of ISimcGenerationService through DI in your class constructors:
class MyClass
{
private readonly ISimcGenerationService _simcGenerationService;
public MyClass(ISimcGenerationService simcGenerationService)
{
_simcGenerationService = simcGenerationService;
}
}
Examples
Parsing profile files/strings
Generating a profile object from a simc import file named import.simc:
ISimcGenerationService sgs = new SimcGenerationService();
// Using async
var profile = await sgs.GenerateProfileAsync(File.ReadAllText("import.simc"));
// Output some details about the profile
Console.WriteLine($"Profile: {profile.ParsedProfile.Name} - Level {profile.ParsedProfile.Level}");
Console.WriteLine($"Items loaded: {profile.GeneratedItems.Count}");
Console.WriteLine($"Talents loaded: {profile.Talents.Count}");
var json = JsonSerializer.Serialize(profile, new JsonSerializerOptions() { WriteIndented = true });
await File.WriteAllTextAsync("profile.json", json);
You can also generate a profile object from individual lines of an import file:
ISimcGenerationService sgs = new SimcGenerationService();
var lines = new List<string>()
{
"level=90",
"main_hand=,id=237728,bonus_id=6652/10356/13446/1540/10255"
};
var profile = await sgs.GenerateProfileAsync(lines);
// Access parsed data
Console.WriteLine($"Profile object created for a level {profile.ParsedProfile.Level}");
// Access enriched items with full stats
var firstItem = profile.GeneratedItems.FirstOrDefault();
Console.WriteLine($"Wielding {firstItem.Name} with {firstItem.Mods.Count} stats");
var json = JsonSerializer.Serialize(profile, new JsonSerializerOptions() { WriteIndented = true });
await File.WriteAllTextAsync("profile.json", json);
Understanding Profile Output:
ParsedProfile- Raw parsed character data (name, class, spec, level, etc.)GeneratedItems- Fully enriched items with calculated stats, gems, sockets, and effectsTalents- Talent details including spell IDs, names, and ranks
Creating a single item
There are some basic options to manually create an item using ISimcGenerationService.GenerateItemAsync.
ISimcGenerationService sgs = new SimcGenerationService();
var itemOptions = new SimcItemOptions()
{
ItemId = 242392,
Quality = ItemQuality.ITEM_QUALITY_EPIC,
ItemLevel = 730
};
var item = await sgs.GenerateItemAsync(itemOptions);
Console.WriteLine($"Item: {item.Name} (iLevel {item.ItemLevel})");
Console.WriteLine($"Stats: {item.Mods.Count}, Sockets: {item.Sockets.Count}, Effects: {item.Effects.Count}");
var json = JsonSerializer.Serialize(item, new JsonSerializerOptions() { WriteIndented = true });
await File.WriteAllTextAsync("item.json", json);
Available item options:
public uint ItemId { get; set; } // Required: The game item ID
public int ItemLevel { get; set; } // Override item level (takes precedence over bonus IDs)
public IList<int> BonusIds { get; set; } // Bonus IDs that modify stats, sockets, or item level
public IList<int> GemIds { get; set; } // Gem item IDs to socket into the item
public IList<int> CraftedStatIds { get; set; } // Stat IDs for player-crafted items
public ItemQuality Quality { get; set; } // Override item quality
public int DropLevel { get; set; } // Character level when item dropped (affects scaling)
Item Generation Details:
- Bonus IDs: Modify items by adding stats, sockets, changing item level, or quality
- Gems: Add secondary stats when socketed into items with sockets
- Drop Level: Affects item level scaling for items with dynamic scaling curves
- Crafted Stats: Specify which secondary stats player-crafted gear should have
- Explicit ItemLevel: If set, overrides any item level modifications from bonus IDs
Creating a single spell
There are some basic options to manually create a spell using ISimcGenerationService.GenerateSpellAsync.
There are two types of spell scaling:
Item Scaling - For spells that scale with item level (trinkets, enchants, weapon procs):
ISimcGenerationService sgs = new SimcGenerationService();
var spellOptions = new SimcSpellOptions()
{
SpellId = 1238697,
ItemLevel = 730,
ItemQuality = ItemQuality.ITEM_QUALITY_EPIC,
ItemInventoryType = InventoryType.INVTYPE_TRINKET
};
var spell = await sgs.GenerateSpellAsync(spellOptions);
// Calculate scaled effect values
var effect = spell.Effects.FirstOrDefault();
var scaledValue = effect.BaseValue + (effect.Coefficient * effect.ScaleBudget);
Console.WriteLine($"Spell: {spell.Name}, Scaled Value: {scaledValue}");
var json = JsonSerializer.Serialize(spell, new JsonSerializerOptions() { WriteIndented = true });
await File.WriteAllTextAsync("spell.json", json);
Player Scaling - For spells that scale with player level (racials, class abilities):
ISimcGenerationService sgs = new SimcGenerationService();
var spellOptions = new SimcSpellOptions()
{
SpellId = 274740,
PlayerLevel = 90
};
var spell = await sgs.GenerateSpellAsync(spellOptions);
var json = JsonSerializer.Serialize(spell, new JsonSerializerOptions() { WriteIndented = true });
await File.WriteAllTextAsync("spell.json", json);
Each spell effect has a ScaleBudget property that should be multiplied with the effect's coefficient to get the final scaled value.
For simple cases, the BaseValue property contains the unscaled value.
Working with Talents
ISimcGenerationService sgs = new SimcGenerationService();
// Get all available talents for a class/spec
// Example: Holy Priest (classId: 5, specId: 257)
var talents = await sgs.GetAvailableTalentsAsync(classId: 5, specId: 257);
Console.WriteLine($"Found {talents.Count} talents for Holy Priest");
Configuration
Switching Game Data Versions
The library automatically downloads game data from SimulationCraft's GitHub repository. You can control which version of the data to use:
var service = new SimcGenerationService();
// Use PTR (Public Test Realm) data instead of live game data
service.UsePtrData = true;
// Switch between expansions
service.UseBranchName = "midnight"; // Midnight expansion (WoW 12.x) - default
// service.UseBranchName = "thewarwithin"; // The War Within (WoW 11.x)
// service.UseBranchName = "dragonflight"; // Dragonflight (WoW 10.x)
// Check which game version the data is from
var version = await service.GetGameDataVersionAsync();
Console.WriteLine($"Using game data from WoW version: {version}");
Note: Changing UsePtrData or UseBranchName will clear all cached data to prevent mixing incompatible game versions.
Data Caching
Game data files are automatically downloaded and cached in your system's temp directory for performance. The library handles:
- Automatic downloading when data is first needed
- ETag-based cache validation to check for updates
- Efficient memory caching of parsed data
Cache location: Path.GetTempPath() + "SimcProfileParserData"
Important Notes
Supported Game Data
- Item data: Base stats, sockets, item levels, bonus IDs, gems, enchants
- Spell data: Effects, scaling, cooldowns, durations, proc rates (RPPM)
- Talent data: Talent trees, spell IDs, ranks, requirements
- Scaling data: Combat rating multipliers, stamina multipliers, spell scaling by level
Limitations
- Some newer bonus ID types may not be fully implemented
- Complex talent prerequisites and choice nodes are not validated
- Covenant/Soulbind data is parsed but may not be enriched (legacy content)
Error Handling
The library throws exceptions for invalid inputs:
ArgumentNullException- When required parameters are null or emptyArgumentOutOfRangeException- When item/spell IDs are not found in the game dataNotImplementedException- When encountering unsupported game features
Always wrap API calls in try-catch blocks when dealing with user input.
Support
For bugs please search issues then create a new issue if needed.
For help using this library, please check the wiki or visit discord.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.2.0 | 151 | 10/25/2025 |
| 3.1.2 | 105 | 10/25/2025 |
| 3.1.1 | 109 | 10/25/2025 |
| 3.1.0 | 107 | 10/25/2025 |
| 3.0.0 | 137 | 10/11/2025 |
| 2.2.0 | 124 | 10/11/2025 |
| 2.1.1 | 196 | 4/4/2025 |
| 2.1.0 | 180 | 2/26/2025 |
| 2.0.4 | 182 | 2/12/2025 |
| 2.0.3 | 172 | 2/12/2025 |
| 2.0.2 | 183 | 2/12/2025 |
| 2.0.1 | 176 | 2/12/2025 |
| 2.0.0 | 180 | 2/12/2025 |
| 1.7.1 | 177 | 2/12/2025 |
| 1.7.0 | 170 | 1/24/2025 |
| 1.6.0 | 197 | 8/6/2024 |
| 1.5.0 | 220 | 9/22/2023 |
| 1.4.1 | 192 | 9/22/2023 |
| 1.3.1 | 442 | 1/4/2023 |
| 1.3.0 | 534 | 10/19/2022 |
| 1.2.0 | 797 | 9/17/2022 |
| 1.1.0 | 529 | 9/12/2022 |
| 1.0.0 | 549 | 9/7/2022 |
| 0.5.3.1 | 595 | 8/16/2022 |
| 0.5.3 | 534 | 8/16/2022 |
| 0.5.2 | 514 | 8/16/2022 |
| 0.5.1 | 503 | 8/19/2021 |
| 0.5.0 | 536 | 7/29/2021 |
| 0.4.0 | 792 | 12/6/2020 |
| 0.3.6 | 598 | 12/3/2020 |
| 0.3.5 | 568 | 11/16/2020 |
| 0.3.4 | 551 | 11/16/2020 |
| 0.3.3 | 580 | 11/13/2020 |
| 0.3.2 | 641 | 11/8/2020 |
| 0.3.1 | 593 | 11/5/2020 |
| 0.3.0 | 588 | 11/1/2020 |
| 0.2.2 | 734 | 10/28/2020 |
| 0.2.1 | 641 | 10/26/2020 |
| 0.2.0 | 645 | 10/26/2020 |
| 0.1.6 | 652 | 10/26/2020 |
| 0.1.5 | 626 | 10/18/2020 |
| 0.1.4 | 683 | 10/17/2020 |
| 0.1.3 | 623 | 10/17/2020 |
| 0.1.2 | 595 | 10/15/2020 |
| 0.1.1 | 584 | 10/15/2020 |
| 0.1.0 | 557 | 10/15/2020 |
| 0.0.6 | 698 | 10/11/2020 |
| 0.0.5 | 600 | 10/8/2020 |
| 0.0.4 | 601 | 10/7/2020 |
| 0.0.3 | 612 | 9/28/2020 |
| 0.0.2 | 644 | 9/26/2020 |
| 0.0.1 | 641 | 9/26/2020 |