#making-mods-general
1 messages · Page 314 of 1
ah, well then, thats a lot better
Haven't even downloaded CP yet
I know I should but idk I wanna see how far I go without it (without things getting messy)
I'm starting to getting used to c# so it's not a problem
for those examples you stated it should be easy enough as long as you decide how oftenyou want to check the quest progress
if you know precisely what quests you want you could harmony patch the relevant places to send the signal to your quests
What does that mean?
Sorry the ignorance ahahah
otherwise, Farmer.NotifyQuests() exists to perform a function for every active quest in the quest log, so you'd just do that periodically, check if the quest is one of yours and what the requirements are (you could fill out the Requirements section any way you want, perhaps thatll be useful) and whether or not its complete
!harmony is this the command?
Harmony is a framework for patching .NET code, allowing you to take any portion of the game's logic and insert or substitute your own. This gives you more flexibility and control than SMAPI helpers and events, at the cost of being typically more complex and difficult to use safely and correctly, and more likely to break with a future update of the game and/or SMAPI.
If you are trying to do something that isn't possible or practical with SMAPI alone, then Harmony is usually the solution.
For more information, refer to the following:
- Harmony Modder Guide - Intro, Use Cases, Initial Setup
- Tutorial: Harmony Patching - Types of patches and code examples
- Decompiling Stardew Valley - For finding methods to patch
yeah thats the command
Omg yes I was wondering if something like that existed
thats what you'd use when harmony patching too, its just that if you harmony patch, for example, the function that hoes a dirt tile to signal after it happens, you can update the quest immediately
instead of doing it on like daystart or something
Oh so you can track immediately the progress
That has to happen
Mh i wonder if it's still doable without the framework
Thanks for the help btw!
almost certainly not
unless you want to just do your checks every tick update
which i mean, doing it every second with the smapi events probably isnt the worst thing in the world, i spose
but it wont technically be "immediately"
(unless you're doing some wildly expensive checks)
it should also be said that Basic quests dont have any sort of tracking information
its just the description and hint
im semi surprised there isn't an event that just runs off stat deltas, the closest is the SlayMonster stuff but it just runs its own counter
though the overhead of propagating to quests on any stat change would be verbose due to moving itself being a stat
stepsTaken strikes again
i feel like stepsTaken is the main thorn in the side of a potential PlayerStat token too
CP tokens wont be afraid of stepsTaken as CP doesn't react to the game fast enough to care
i know that, but since it'll always be changed, it just feels annoying that itd lose any "didnt change? no update then" optimizations
just a thorn, not a major roadblocker or anything
what CP tokens hate is large collections where anything could have changed and has a cost in building the data structure
(cough Relationship cough)
so what you're saying is each Friendship object should also store the number of game ticks since the last time you spoke to them, updated every tick
stats already natively being Dict<string,int> or whatever means CP particularly if it has required input turned on can just mostly passthrough with a cache
its on my todo list to revisit how TokenManager does token updates, as its a static cost regardless of what patches need to actually need to be evaluated
It's mainly not a problem on my current save as I've been avoiding talking to people like the plague and so the relationship token doesn't need to do too much other than concat the list of villagers and set it to unmet
Though relationship isn't the only token I'm worried about, it's the worst performer in stock cp.
But mod provided tokens will be a more annoying as it'll need to be a game of whack a mole
ope
I was worried about the mail one
HasFlag
For being a contact of mail and world state flafs
And smth else forgor
I keep on trying ro remind mshwld to take hasflag out of my CP mods and replace with hasseenletter
Does anyone who makes npcs know why they would stand at the kitchen facing the left [as a spouse]
yeah HasFlag is an aggregation of a bunch of stuff
facing to the left.. unless it's raining? very weird
anything vaguely related to marriage duties and how they behave is a mess
Do they have a marriage schedule?
Indeed they do
I’m pretty sure it’s to do with that as they don’t follow the schedule when it’s raining. Try checking the schedule data and see if there’s anything wrong there
I was having similar issues the other day lol
Hm... all the schedules work as normal though? Like as far as i can tell he goes and does all of his things he just... likes... standing to the left
unless he stays in the house then he does not. in fact, stand to the left
Are his directions set correctly?
I wasn't aware the start of the schedule needed a facing direction 
since there's not really any pathing in the farmhouse (cursed reasons of course)
Can I see the schedule?
there's a few others with variations (if you choose a certain thing during his 13 heart event he starts going to the saloon and museum)
Hmm, I don’t see anything wrong with your schedule. What are the particular days that are the problem? I’m wondering if the 9am start for some are causing issues?
nope its every day other than the ones where he's:
- outside/patio/spouse room (obviously since he's somewhere else)
- or raining/home schedule where he doesn't go out
if it were just 9am or 1030 or the later starts i would expect it to happen with only those ones but it just happens with all of em
it's not a game breaking issue or anything it's just odd xD
It’s very odd, I wanna know what’s wrong lol. Sorry I can’t help, but let me know if you fix it c:
(I'd say because making them compatible with recolors and sve and sve + recolors, .. is a very unreasonable task for anything but a bigger expansion)
tried asking earlyer but it got burried instantly, why isnt this working, i cant unpack the xnb
the guide im using told me to use xnbcli but i just get an error message
you were answered earlier, use stardewxnbhack
ah your right
cause they didnt reply i figered that was part of the same conversation as thee nerd sniping XD

as the message says, put it in the SDV folder
as the picture says, it is
it's inside a folder, pull the executable outside
OH
thanks XD
because it uses smapi, should i disable the other map mods, or is it fine?
sorry I don't quite get your question. if you're asking if StardewXnbHack touches modded assets, then no
it will unpack all vanilla content
Out of curiosity, is your kissing sprite coded to face the left?
I am wondering if that might have anything at all to do with it
no his kissing sprite is to the right
and it wasnt doing this before I did something but i dont remember when the change was, i only noticed it more recently
whats the name of the area obove the farm, twards robins house
backwoods
The wiki (I think) shows a space in the name of this JSON key. Is that correct or is there supposed to be no spacing (or an underscore)?
no space or underscores
the wiki itself has no space, it's just weird spacing between the white area and the rest of the text
I would highly recommend looking at the unpacked content
(I would have said that earlier, but apparently it's not actually used in vanilla)
(even Krobus uses Krobus0 and Krobus1)
boom, path way lol
AI art/anything is not allowed in here :L
Hmmm I had a plan to replace the heart emote for a custom NPC roommate when on the farm, but I guess that would also change it for all the animals
and also this isn't the channel for that anyways
Looks good! Just FYI though in case you're planning to have NPCs walk there, the Backwoods doesn't allow NPC pathing.
NPCs cant emote I thought
the heart when kissing them is I think different from the emote
@primal rover Hi, we don't allow AI art in the server. Please read #bulletin-board message 
oh no, why??
pathfinding code reasons
to cause pain and suffering to mod authors /j
the tldr technical answer is that the pathfinding cant handle it
damb
from my quick testing they do a smiley on the first interaction, and do a heart on like every 4th subsequent interaction
~ 👻 ~
You can do some fancy warp stuff though and have them warp from the mountains to your location like how coal point farm ncps do
Oh I’m so sorry, for some reason I had taken this in the context of sdv content/code. My bad
what if you just set "ExcludeFromNpcPathfinding" to false? 😬
probably not happening until someone makes an RSV-tier expansion town in the backwoods for some reason
that doesn't fix the pathfinding not being able to deal with the two disjointed areas
You break a looooot of NPC schedules. It's banned for a reason.
got it,
Yeah I get why you say that. It was in this channel because I recently created a chicken SDV mod and spoke about it with people here. Not an excuse but an explanation
Ah not too fancy haha, first hand at creating mods. It’s colorful chickens 😂
:D no but thats lovely!
is it an AT pack? or a content patcher retexture?
or more chickens
It’s here
ooo if you made it into an AT mod I think i'd use it
I do love having fancy chickens
and animals
Very basic retexture 🫣. But I enjoy my colorful ombré chickens
I hate uploading a bug fix for my mod and then realizing less than an hour later that I have more bugs in the mod that need to be fixed...
You and me both Lily
You sound like a true dev 😉
its okay all of my 'custom monsters' are silly retextures
obligatory biased opinion: dont make it an AT pack and just use the skins feature
I really just put- 👀👀 ho ho ho?
i do like choosing though
or switching them if i want to
Can you choose the animal's skin with the CP skins feature?
when you buy them
yes, you can do both with vanilla skins using the AT tools
Because I give each of my animals a different skin
I was saying I just put sunglasses on all of the monsters and made them blue so
AT supports switching vanilla animals and building skins using its tool
question, do i have to make this 4 times (1 for each season?)
Nope
you wouldn't make an AT pack, but something that AT can recognize while fully using vanilla features
you can put "AT-compatible" on the mod page if you want
Game switches the tilesheets out automatically as long as they're prefixed with the season. Which if you're using the vanilla tilesheets, they already will be.
heck, or just lie and say it's AT even though it's CP
well this one is purple but you get what i mean ... sunglasses
I’m heavily biased to use the tool/ the first solution to my self inflicted problem ;).
Reading here I realize there are many ways and options, but those are not immediately obvious when you just start out with modding.
awsome (:
that's actually really cool i didnt know that
I love built in integration with cool features... so amazing
yeah not a lot of people know that, and I (and chu) made it a mission to spread that info
your mission is bringing great success
I learn every day.
I decompiled a bunch of dll’s but the amount of info and my brain trying to tie it all together into what is og and where the API’s kick in is pretty overwhelming still
A lot of C# mods are open source so you should be able to see their files without decompiling.
Also you can just look at the game decompile if you want to see what's vanilla.
so, i used the hack thing to unpack them, how do i repack it?
You don't
That's xnb modding and we discourage that. Make a CP mod.
!startmodding
Making mods can be broadly divided into two categories:
- Content packs are formatted text files, and don't need any programming knowledge. They can add/edit NPCs, maps, new items, shops, and more. To get started, see the list of framework mods, the wiki tutorial for Content Patcher, and there might be relevant guides on the tutorial wiki.
- C# mods use programming code to change fundamental game mechanics. See getting started with C# modding.
Usually it’s easier to start with making content packs, since you don't need to learn programming.
(Ignore the C# stuff, that's not relevant to you right now)
ah, figured it was, unpack, edit and repack kinda thing
Not since CP was born fortunately
so very fortunately
ah, thats why EVERY mod needs it XD
hey @lucid iron why it look like that
0 file...
(i was still able to download it anyways)
It's a VERY important mod really .. and it does a lot
Ok back to the garage mines
pfft. i read that as "garbage mines"
Let's all go to the garbage mines
do i need to specify the winter portraits/sprites for my mod?
Im the trash man... I go in.. I throw trash all over the ring
Then I start eatin garbage-
hey don't bring linus into this
(/ref)
oh gosh there's a mod idea
Yes you do
Linus is Danny DeVito 😭😭😭😭
was this not just always the case?
if this is your own NPC, then you don't have to
It's Pierre isn't it?
oh no i modified vanilla ones for pierre and caroline
Though his are already specified so unless you're changing it..
yeah
also don't forget their beach sprites
gotta show off pierre's muscles built from years of standing behind the counter for 12 hours at a time
i didn't mess with those since the stuff i changed is just for heart events
he used to be a boxer, maybe he's got a bit of muscle ok 😔
ah yes how could i forgor
i tried putting in the changes in the content.json like this but smapi rejected it
hmm if only pierre wasn't utterly destestable. i might care about this fact (boxer thing)
He's not the worst really
Like he's not great
But I'd rather talk to him than Demetrius or Lewis
It'd be edit image i believe
i like him about as much as clint which is to say id prefer not to acknowlege is presence and caroline deserves better.
Because they already have them
(you CAN Load over top of them but its not ideal for compat purposes, but also honestly not like, the worst)
oh okay, thank you!
feel free to play my mod when it comes out lmao
wild guess: if smapi rejected it chances are there's some other mod that's also Loading it, but with Exclusive for some reason
the "some reason" is probably the same reason that Load pictured is loading it exclusively, tbf
yeah i think that was it
hmm is exclusive the default
yes
i'll change what i already have and add the winter ones
Also if you're specifically aiming for winter portraits/sprites they would have _Winter at the end -
(also if Exclusive WASNT the default, one person Loading exclusively wouldnt make non-exclusives error anyway)
Yep but that doesn’t tell me the connection between all the moving parts and that’s why I mentioned “trying to wrap my brain around og game code vs API” and then other people’s utility mods likes CP.
I’m also not aware of all the mods that might do something similar as I have in mind to see which code or dependency mod they target. I’m a programmer who wants to try mods for this game I love, but I only had like 10 mods or so installed myself years back. Plus I only recently found the discord so learning so much new stuff (and people having 900+ mods installed 🫣)
I’ve checked a bunch of opensource mods and code. But it takes experience, tons of reading here and a lot of trial and error to find the limitations of what can and can’t be build as C# mod out of the box, and what needs a different mod, or if there’s even a mod out there.
Thankfully the community is filled with people that do have that experience so we can ask.
It’s a journey basically. And an overwhelming one tbh because I’m used to reading docs and figuring stuff out. I feel here I’m way more dependent on the very experienced who know what’s out there in other mods.
TLDR: it’s overwhelming to say the least
it did, but i deleted it when smapi said i did it wrong hahah
Can't reply much right now but have you been reading the wiki? There's not much on there about C# specifics compared to the data side but it does have an overview of the APIs that SMAPI provides etc. #making-mods-general message
now i'm glad i had to ask about it since i didn't think twice about using Load over EditImage
as mentioned Load isnt the worst; installing two different NPC retexture mods is a user problem anyway
though I guess your mod is only retexturing two
Yep I am jumping between the wiki and GH documentation. Also diving into the properties of the game code.
The documentation is overall good but obviously doesn’t cover every usecase.
For example I was playing around the other day with a mod that automatically switched tool. Only to find out that sword and scythe fall in the same category 😂. I’d have no clue where to find that in docs instead of the og code. And if I wanted to edit that if it even would be possible (besides creating conditionals, which I still need to look into the gamecode for for other exceptions)
and you presumably want it to work with other retextures
nvm me then
So weird design question, I'm currently drafting out designs for alternate upgrades for the shed with a gimmick of each one "boosting" in some way or another a specific subset of crafting machines, like the Creamery building boosting the cheese press and mayo machine, the smokehouse the fish smoker&charcoal kiln, and distillery for Keg, oil maker and Preserves jar.
Problem I'm having is twofold :
A: I firmly lack the mod assets chops to make a custom building sprite I don't hate but also I feel reusing the big shed is less than ideal.
B: it feels lame to just do a bunch of processing time buffs for everything but I'm at a loss for other ideas to both increase overall profits without also just making recipes produce more which doesn't also feel right.
Admittedly I also haven't read the extra machine config docs super close, but when the goal is to give a reason to not carpet the backwoods and quarry with crafting machines, without being boring in the process...
in my opinion a speed boost is totally fine ™️
if you want to go fancy then maybe extra byproduce?
re: assets, you can do like a sign draw layer
Fair enough. Speed solution is both simple and works.
Might do byproduce specifically for distillery since it's already the most straight forward and profitable set.
I'm not totally sure I follow.
Though that might just be tired brain not really parsing docs related to building draw code
if you look at my mod Chicken Feed, the poultry feed silo is just the vanilla silo but with a sign slapped on using the draw layer feature

quest get
make a mod to remove the family size cap
no time limit
no additional requirements
ping @spice anchor upon quest completion for a big Thank You
chu is working on something like that
do i need to copy the tile set, or what
yes. but only for map editing. they'll need removed again before packaging the mod.
ok, got it
On behalf of @tiny geyser also please make a mod that turns your children into Pokemon-like entities that you can arrange into teams and use to battle other toddlers
💸
even with both png and xnb version is still wack
youll have to re-load the tilesheets if you moved them
tilesets...? i keep forgetting the difference
you know what im referencing though
ty
I'm trying to add the textures from (AT) Bog's Witchy Sheds as AT for the giant sheds of Better Things.
I added a folder "Huge Sheds" in the Bog's Witchy Sheds textures folder of every season. Then I changed the texture.json into this:
{
"ItemName": "BetterThings_BigShed3",
"Type": "Building",
"Seasons": ["Spring"],
"TextureWidth": 112,
"TextureHeight": 128,
"Keywords": ["seasonal"],
"Variations": 4
}
It keeps saying that message. I tried adding Building_maat. to the ItemName but still won't work.
the tutorial im following says to change it to a csv for compatibility, do i just rename it or do i need a program
oh wait, the tile layer format
thats default 👍🏻
I was about to ask you what on earth you were talking about lol
you shouldn't have been using Vortex in the first place
it corrupting itself is a blessing in disguise /s
do i need to reset the sets to the packed xnb when im done, or is it ok?
cause if i delete the png when im done its just gonna x out again?
just move the pngs out of the folder while doing testing and put them back when you want to edit it
so even if i take the pngs away it wont screw it up
is there a way to make a shop much like the travelling merchant?
content patcher lets you have conditions, so i dont see why not
im confused,
X and Y is the tile location, then the width and height is the size of what ever your trying to inject in the map IIRC
what are some ways to keep a heart event visually interesting if it's two people talking? just, like, using emotes?
hoping that the writing and portraits will hold enough interest for the player?
how do i?
pretty envirnment and sound effects could help
oh sound effects, that's an idea
maybe add a bunch of stops, so you arnt reading a paragraph at a time
list.sort is unstable ru kidding me 😭
maybe c# does still kinda suck even without having to deal w unity
first i have to write my own floor division now i have to write my own sorting shit
i just wanna make a mod that works 😢
c# really needs a million ways to compare strings and zero ways to stably sort a list in-place
wdym by unstable
i have no errors, and nothing
stable sorting preserves the order of equal items, unstable sorting doesn't
sorting enumerators in c# is stable but for some reason all the in-place sorting of arrays/lists is unstable 😭
they're not equal if their order matters imo
what
could always sort against two fields instead of just 1
you misunderstand
im sorting with a custom comparison function that compares only one field
i need a stable sort to avoid re-implementing vanilla behavior
C# sort should be stable 🤔
OrderBy preserves the initial order
so you could do orderby field 1 then orderby field 2
sorting enumerators is, sorting arrays & lists in-place isn't
unfortunately i'm sorting several ranges of a list so using enumerators is going to be a huge pain in the ass
the performance would probably suck too
like im not just sorting the whole thing, im going over the list and picking out parts to sort with List.Sort(int, int, IComparer)
I wouldnt worry about performance that much in this case unless you're dealing with massive amounts of data or updating frequently
try it out
YES, altho the collision hasnt changed
yea but tbf it might be just as much work to use a whole load of enumerators as it would be to just implement an in-place sorting algorithm
since the ranges shit is gonna be annoyyyyyinggggg
i am so confused, no matter what i do, i can see it, but cant go past where the wall used to be
y it go to old file...
its ok i had to do 1.7.2 anyways, forgor nameoruniquename not null 
how do i lock the player out of a building when a cutscene's finished?
i don't want them going back in for the rest of the night after my heart event
it'd be enough if i could set the time for like 10pm or something so the building locks on its own
i'm not a map modder, but if you search for Passable here you might find the problem https://stardewvalleywiki.com/Modding:Maps (there are at least few possibilities)
both the new map and the old map both have collision
and if i enabled passable of the base map, youd have no collisions
it's a tile property, not a map property, so it only applies to the tile it's on
it was fantom walls
visually the where gone, but if i hovered of it it would give the the tiles id
and ereasing the nothing fixed it
its 3:53, im going to bed...
anyone know how I can remove the modded items from the community center bundles? I was playing through my save and only just now realized that SDVE adds its own stuff to the community center bundles, and I dont feel like restarting my playthrough, so I just wanna remove the modded stuff from the bundles
I think you just uncheck this thing in GMCM?
that only applies to a new save
doesnt work for a world in progress
my issue
oh you're right
well it's not exactly a removal but you can just spawn in the SVE items into the bundle
and call it a day I guess
For backwoods, farm (and cellar) it doesn't matter what its set to, its hardcoded to not pathfind before even checking data
i suppose i could.. im just autistic and wanted to do it all at once lol
You can't change bundles midsave, that's one of the only things that breaks saves. It might be possible to rescue a save corrupted by bundle removal if you're really good at saving editing, but I don't actually know.
fk me
Congrats, you discovered invisible tiles lol
If you're okay with it being all the time instead of just on that one day, you can use LockedDoorWarp with a close time of 2200. If you only want it on that day it's probably still possible with an EditMap CP patch that only applies the 2200 close time for that day; not sure what conditions you'd need though - maybe checking for the same ones as the event does and also not having seen the event so it applies the patch that morning and then unapplies it again the next morning after the event was seen?
damn, i was hoping there was just a way to advance time or something
thank you anyway!
Advance time to when?
Oh I misread and thought your building stayed open at all times and you wanted a way to lock it at 10pm
So everything I wrote was about that lol
Hmm I don't think there is a way to advance time in the event because of multiplayer.
If it's in the seed shop the player will end up there anyway unless you use warpOut
You can use end newDay but I will scowl at you forever if you do
(And I have no clue what that does with MP - probably just warps the current player to their bed and then they can just leave again maybe)
Well my patch idea would still work for that, just bring the door locking earlier
Although it will not affect players like me because I use a mod to unlock all doors anyway. Nor would it affect players who have the key to the town.
i guess at that point there's no stopping people. maybe i should give caroline dialogue that says "please leave" lmao
i think i saw how to do that
Yeah that's probably easier to do as well, depending on how specific your event preconditions are
they're very specific hahah
the event ends with caroline asking the player to leave so i was thinking she'd lock them out but maybe her just saying "get out" is enough
warpout and "LEAVE" if the player comes back in
Yeah if you use warpOut to make them actually leave, that leaves you space to use the LocationChanged update rate for the CP patch to change her dialogue
Not a problem ^_^
i was right btw it was easier
plus insertion sort is pretty good for small lists anyways so its prolly fine...
void SortStable<T, K>(IList<T> list, int start, int end, Func<T, K> key)
where K : IComparable<K>
{
for (int i = start + 1; i < end; i++)
{
var v = list[i];
var k = key(v);
int j;
for (j = i - 1; j >= start; j--)
{
if (k.CompareTo(key(list[j])) >= 0) break;
list[j + 1] = list[j];
}
list[j + 1] = v;
}
}
😁
much easier than messing around trying to get a bunch of enumerator nonsense to do what i want
(stable sorting is necessary here bc im doing this in a postfix patch that just reorders ranges of __result and i want to preserve the vanilla ordering for items with equal keys)
Can anyone point me to an example of making it possible for content loaded by one mod to be modified by another mod? I'm trying to follow the instructions in https://stardewvalleywiki.com/Modding:Modder_Guide/APIs/Content#Let_other_mods_edit_your_internal_assets , but I cannot make it work.
What I'm trying to do is have a core mod that defines a set of new assets (character biographies - in this case) and then one content pack that inserts all of the biographies for the core Stardew characters and another that inserts the biographies for the SVE characters while making updates to the original biographies where necessary (adding Sophia as a friend for Emily and Haley for example). Nothing I've tried seems to work to allow the SVE content pack to add items to the core game content pack.
I'm hoping there is a good example out there somewhere that I might be able to use for inspiration.
Hi ! so I'm making a NPC mod and I've made 12 portraits expression and I just saw that the game supports only 8 expressions... Is there a way to still be able to use more than 8 facial expressions for you're NPC portraits...?
I think you can just refer to the extra ones by number?
yeah
Default game Haley has 14 portraits for example
Yes I thought so to but if I understood correctly you need a mod for the game to be able to generate the extra expressions
You're making a mod.. so you already have that covered
You just need to call specific expression, like $14
Oh okk so everything will work fine if I juste call the expressions $Number even if it is above 8 ?
Yep
okk thanks !!!
Just note that the indexes start from 0, not 1
Oh and also I was wondering if I can add extra outfits too ? I made an outfit for every season but I would like to add a Night Time outfit and a Work outfit for my NPC (I will make him look like he works with Pierre haha)
Yeah, you can use appearances for that
okkk thanks !!! Do I have to do a separate portrait png file for the work and nightime portraits or do I have to put it in the same png file as the seasons ? I'm asking because I saw that Alex for example have his Gym outfit not separated from the sesonal outfits
I'd say it's best to have it in a separate sheet if it's part of shedule. Alex's gym outfit is just for the event iirc, so it's not used as much
ok ok I will do that, thank you !
For schedule animations, you'd keep them on the same spritesheet as your other outfits because you specify which frames are used for schedule animations. For outfit changes using the Appearance system, they need to be a separate spritesheet. I'm only mentioning schedule because Nomori brought it up, but a night time outfit would be Appearance rather than schedule anyway.
Ah, by schedule I meant: NPC goes to the location and changes his clothes there (work) 😅
I have no clue how to do that sort of thing but maybe looking at something like Spacecore might help? Spacecore has moddata that other mods can edit which then changes the game (like its WearableData stuff). Others mods do that too but I am drawing a blank right now on which ones have that.
Thanks. It may be that I'm trying to do something impossible / beyond what CP was designed to do - but I'm still crossing my fingers there is something sily I'm missing.
Well, once your C# mod has added the asset to the game data it should be accessible to any other mod just like other game data is. You just Target that asset with CP.
I (think, hope, beg the deities above and below and in between) that my mod is almost at a publishable state. I think I just need one more tiny event for the "choose your own adventure" structure, and some dialogue. I might let myself leave off the mawwaige, resort, festival dialogue and expanding my conversation topics for a later update which just leaves breakup/divorce lines, and green rain lines - and many many rounds of event testing
Yeah - that's what I hoped. But I'm really struggling to get it to work and I don't know how many of the steps outlined in the Wiki are actually necessary to register new data items in the content pipeline.
I'm hoping that Lixx's typing is about this because they'll know more than me lol
all you need to do to create an asset that other mods can edit is this:
Helper.Events.Content.AssetRequested += OnAssetRequested;
private static void OnAssetRequested(object sender, AssetRequestedEventArgs e)
{
if (e.NameWithoutLocale.IsEquivalentTo("MyMod/MyAsset")) {
//We need to provide an empty initial collection to which others can append their changes
e.LoadFrom(delegate () {
return new Dictionary<string, MyDataModel>();
}, AssetLoadPriority.Medium);
}
Other mods can edit your asset eg using CP:
{
"Format": "2.6.0",
"Changes": [
"Action": "EditData",
"Target": "MyMod/MyAsset",
"Entries": {
"DictionaryKeyOfNewData": {
"Name": "Peter"
}
}
]
{
It's quite simple, really.
All the other things you mentioned might not be though 😄
Thanks @spice inlet - now let me do a forensic comparison to work out where I mucked up.
Is your biography asset a Dictionary or a List
Dandm1, have you checked the edit order between your two packs
And also can we see the type
!log also
Important note: Your computer username may appear in the log. If your username is your full name, please be aware of this before uploading it.
Please share your SMAPI log file. To do so:
- Open this page: smapi.io/log.
- Follow the instructions at the top of the page to upload the log file. (Don't copy & paste from the console window!)
- After uploading, it will show a green box with a URL to share. Post that URL here.
Please do it even if you don't see any errors. This has useful info like what mods and versions you have, what the mods are doing, etc. If the issue didn’t occur in your last session, please load the game to the point where the issue occurs, then upload the log.
I'm trying to keep everything to Dictionaries - adding items to a list got a bit crazy.
Well either is fine
It's just content patcher limitation to want one of the two
Here's the example i always show ppl
It's using lazy loading which i personally prefer
For a while I kept getting errors that the items I was dealing with were objects (that may not have been the term) and couldn't have new entiries added.
Many thanks. Let me see if any of my mistakes jump out based on that.
Yeah so content patcher can only add more entries to Dictionary or List
Not other impl of IDictionary
Yeah. Off the back of that I concluded that it wasn't enough to use a CP "Action": "Load" to create the new data items - I needed to register the items in the C#.
Because I couldn't find any way to force loaded things to be a dictionary otherwise.
Ah that's another semi related CP quirk yes, although if you were doing Load on c# side with right type it should have been fine
In my example there's AssetRequested which create and handover a empty dict of right type
If your asset is just a dictionary string string thing though, you won't need any C#
Cus u can access the string with [LocalizedText yourassetname:key]
And this will have the game load it as dict string string
Right. Got three different types. One is a Dictionary<string,string> but the others have more structure than that and will need C# registration then.
Is the OnAssetInvalidation in your code requried - or just needed to keep the cache consistent if conditional inclusions may change over time?
Hey everyone!
you can nest pretty deeply
Heya!
Yeah i need it to keep the cache consistent
It nulls the cached copy of the asset so that the next time any code tries to access it i do a Load in the getter
This aint strictly necessary cus content load itself is going to give u a cached copy too, after the first load since invalidation
Thanks. It's possible I've got something that is caching too early - before the patches are loaded. I'll try refactoring for a lazy load and see if that makes a difference. Thanks all for your help.
Is it possible to use a JsonConverterAttribute like that https://www.newtonsoft.com/json/help/html/JsonConverterAttributeProperty.htm ?
I tried to do this, but I get an error along the lines of "Technical details: Error reading integer. Unexpected token: PropertyName. Path 'Collisions'." but the "Collisions" property doesn't have a JsonConverterAttribute before it and was parsing fine before I added one on another property
Probably should mention that Collisions is parsed as a JToken for now
The worst part of this error is that every file I try to parse on the same data model has a different error...
I guess it boils down to: why do I have an error at "Path 'Collisions'" when I added a JsonConverter to another field than Collisions.
My data Model starts like this:
public class FType
{
public int Priority = 1000;
public string DisplayName = "No Name";
public string? Description;
[JsonConverter(typeof(RotationConverter))]
public List<string> Rotations;
public JToken SourceImage;
public JToken Collisions;
...
}
and here is RotationConverter.ReadJson for reference:
public override List<string>? ReadJson(JsonReader reader, Type objectType, List<string>? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
List<string> result = new();
if (reader.TokenType == JsonToken.Integer)
{
int? rot_count = reader.ReadAsInt32();
switch (rot_count)
{
case 1:
result.Add("NoRot"); break;
case 2:
result.AddRange(new List<string>() {
"Horizontal", "Vertical"
}); break;
case 4:
result.AddRange(new List<string>() {
"Up", "Right", "Down", "Left"
}); break;
default:
throw new InvalidDataException($"Could not parse Rotations from {reader.Value} at {reader.Path}.");
}
}
else if (reader.TokenType == JsonToken.StartArray)
{
result = JArray.Load(reader).ToObject<List<string>>() ?? new() {"NoRot"};
}
return result;
}
I kinda already have a workaround by making a separate class for each field type I want to read, but it looks really stupid to have classes like:
[JsonConverter(typeof(RotationConverter))]
class Rotation : List<string> {}
I'm going crazy trying to figure out these JsonConverterAttribute on members, Imma play Minecraft.
felt
Yep, you can use [JsonConverter] attributes; SMAPI does it under the hood for its own types like Manifest. You definitely chose the hard path with such a complex and dynamic data model though.
Assuming your JSON is valid and it was parsing correctly before the new attribute, it sounds like the reader is getting into an incorrect state (e.g. it was read too far). The only significant difference I see between your code and SMAPI's is that SMAPI uses JToken.Load(reader).Value<T>() instead of reader.ReadAsT(), so it might possibly handle more edge cases like comments.
Hmmm, I see how reading too far would cause the errors I see, I'll try to make the change you're suggesting
Also, SMAPI puts its [JsonConverter] attributes on the model properties rather than the property's type; not sure if that matters here though.
using JToken.Load(reader).Value<T>() fixed it instantly! Thank you so much for that!
Can someone help me understand why I'm having trouble editing the Town Map? I haven't had any trouble editing maps thus far and I haven't seen an error like this before. I just made a post in the #1272025932932055121 I thought I'd just be able to make the quick little edits, toss it in a CP file like normal with the content and manifest and everything to load it properly, but alas I was wrong.
you can sorta
(you can/should repost your issue here as the tech support channel is for users having issues using mods, not making them)
hm another question about using [JsonConverter], can the converter know about a value at runtime?
any body knows where the fruits tile sheets are at?
(PseudoSquared's error log)
The "Invalid tile gid: 3071" error means the map is referencing a tile which doesn't exist on a tilesheet, usually because your map references a custom tilesheet which doesn't match the one that's loaded in-game.
i was trying to see if this is possible
public sealed class MyModel
{
public string RuntimeType = "ERROR";
[JsonConverter(MyModelConverter)]
public object? RuntimeTypeInstance = null; // somehow deserialize with a unique type dependent on the value of RuntimeType
}
heeey so random question: I'm working on this mod and trying to make a machine that is unlocked by default (ie: no purchasing the machine recipe from the shop and not obtained from leveling up skills). I can't for the life of me get it to show up on the crafting tab in the game though. Not getting errors from SMAPI and the JSON validator says its fine.
big craftable file: https://smapi.io/json/content-patcher/012cc3ffb0b6478aad43a5d9d8cd37cb
When I use the console commands to force add one of the objects to the game and then use look up anything on it the recipe shows up fine, it's just not unlocking for some reason...
if you mean apple orange apricot etc thats on Maps/springobjects
Well, I am editing the native Town map, so there shouldn't be any custom tilesheets or anything?
that's funny, I need a similar feature, what I'm doing right now is having a JsonConverter on RuntimeType that saves the parsed value into a static variable, then MyModelConverter read that static value. I'm not far enough to see if that works tho, I'm hoping that members are parsed in order.
When editing the town map I didn't get all the necessary tilesheets, for some reason I figured I didn't need to just making my quick edits. Could this be the reason. I'm saving the town map without having the tilesheets there for it?
Also, this was an obvious solution for me because my RuntimeType equivalent also need a JsonConverter anyway
invalid gid i find is actually caused most often by saving when there are errors present (like this case)
yea you do need all of them
Weird, not sure why saving with errors present would change the tile IDs.
if you save without the tilesheets actually present, Tiled will recalculate the IDs of all your tiles and fuck it up
bc some tilesheets now have 0 tiles
smth like that
i had a version of this where i just parsed when i actually needed the value, rather than at model deserialization time
that makes a lot of sense
its fine but u cant targetfield into it ofc
you'll have a Tile that expects tile 3,000 or whatever when you initially placed it but now there arent 3,000 tiles when Tiled thinks some sheets have 0
When making my custom farm maps and editing the greenhouse and all that I had all the tilesheets present
But my laziness caused this error :3
Honestly thought I'd just be able to bing bang boom make like one edit and send it off, didn't think I'd need all the assets
Silly me
your unlock condition needs to be "default" instead of "null" if you want it to show up at the start
Not that I know of. JSON is parsed in an incremental way, and Leroy's approach will fail if the JSON looks like this:
{
"RuntimeTypeInstance": ...,
"RuntimeType": "ERROR"
}
I guess you could document that the field order matters, but seems fragile.
the fact that its common enough for people to pick out the cause immediately just from "invalid tile gid" means you're in good company 
thank you!
yea i had a suspicion
teehee
no trees allowed in streaming 
for me its not so bad cus the thing i parse just becomes a field on a generictype that i wholely control
You can fix it just by putting all the tilesheets in the folder, opening the map again, making a change (necessary so the IDs are recalculated) and saving.
Yeah I know the fix is easy enough
Just had to get an xnb unpacker for the tilesheets
Luckily someone made a very convenient online one
should definitely be using StardewXnbhack to unpack your entire Content folder at once
i believe it handles some of the xnbs properly versus the other unpackers too? i dont quite remember
yeah it has support for the shaders better for one
Yes including unpacking maps into tmx instead of tbin
I had done that before, but with the 1.6 update I figured some things might have changed
so I haven't unpacked it again
xnb.js, as amazing as it is, shouldn't be used for game assets on pc
things changing is exactly why you should unpack it again
wait i didnt know it can do shaders
(It can't, it'll just leave those as .xnb files. Those need to be decompiled, not just unpacked.)
oh
hey? mind if i dm ya?? i need a bit of help with my content json! working on a standalone to recolor lumina's outdoor tilesheets to match starblue! i got permission from lumina and cherry already!
Hey there! I redesigned sam’s sprites character sheet and have no idea how to add it into the game, i was wondering if anyone might be willing to help me? its cool if not!
!startmodding
Making mods can be broadly divided into two categories:
- Content packs are formatted text files, and don't need any programming knowledge. They can add/edit NPCs, maps, new items, shops, and more. To get started, see the list of framework mods, the wiki tutorial for Content Patcher, and there might be relevant guides on the tutorial wiki.
- C# mods use programming code to change fundamental game mechanics. See getting started with C# modding.
Usually it’s easier to start with making content packs, since you don't need to learn programming.
Hm, for some reason the Town file can't seem to locate these 3 tilesheets for some reason while recognizing some others, even though they are in the same folder
please start from new copy
its much less painful than trying to fix whatever you have
youll want to look into making a Content Patcher mod, theres a link for that in the command pillow just used
I'm about to go to sleep so I can't help you tonight. I can look tomorrow, but is there a reason you want to DM instead of just using your thread?
well i tried to but no replies and plus you've been a major help to me
i can make another thread though
Oh no I mean we can do it in your thread. I'm happy for you to ping me in there.
cool cool!
There we go, it looks right
I loaded all the tilesheets and got the map to recognize it but there was some stuff wrong so I started fresh and now it looks right
But also I'm in your mod-help thread and you haven't posted in there since March?
sorry been busy for a while with a day program
i just posted in the mod help thread now
but if ya goin to sleep? take a nap! i pretty much am free today
so i got time
so coding went semi well yesterday, i think i have the base laid out but i am still trying to figure out the Getting Of The Values of stuff. i just wanted to update u since u encouraged me to go down this horrible journey 🤣🤣🤣
mostly unsure of how to grab blueprint ids to then grab the ingredients list, but Only The Wood And Stone, but i can compare it against the inventory since i figured that out 🫡
ah, that was what I was worried about... I think I can figure out a way to parse my directional fields before knowing the rotation names in my specific case.
well you already have an ingredient list, which is a bunch of Item of some stack number
but like. i need to only reference the specific items of wood and stone
i guess im wondering how i pull those and reference them
theres no GetIngredientsMatching type thing lol
iterate the list
and check for 
CarpenterMenu.DoesFarmerHaveEnoughResourcesToBuild is good example here
oh yeah i was referencing the hell out of that last night
i was like thank god this is what i need (but i dont understand how it Knows)
only diff is that u need to check if ingredient.QualifiedItemId equals "(O)390" stone or "(O)388" wood
how it Knows what?
how it knows whats what, i guess. idk. i may be thinking too metaphorically 💀 u answered my query with this
CarpenterMenu.DoesFarmerHaveEnoughResourcesToBuild is specifically using a different method to check
Game1.player.Items.ContainsId
uh huh
but u probably dont want to use that 
wat why not
since u actually need the count, consider Game1.player.Items.CountId
!decompile
If you want to make SMAPI mods with C#, one important resource is decompiling the game to read the game code. Here's how to do it: https://stardewvalleywiki.com/Modding:Modder_Guide/Get_Started#How_do_I_decompile_the_game_code.3F
and then ctrl+f
but like. is there an easy way that excludes poring through the Item.cs
kinda
to see what functions i can do with an item
you can right click and go to reference for most things
most ides have outlines for a open cs file too
if you have something of type Item, you reference it, then type a dot ., and your IDE will tell you everything you can do
!
mr shockah….
ye autocomplete stronk
Item myItem = SomethingYouGetAnItemFrom();
myItem.
my autocomplete keeps changing this. to some completely batshit function ive never used
how do i make it stop. lmao
what is it doing 
i type “this” to do like, this.Item or this.Blueprint and it just. substitutes a completely rogue function
but its fine i deal with it 😔
I love how you include video game character type reactions when you type
ive gotten so used to doing that i dont even realize i do it leroy HAHAHAHAHA
what IDE are you using?
um im assuming u mean like visual studio or something right heehee
leroy i decided not to do it but maybe u can try this
https://www.newtonsoft.com/json/help/html/DeserializeExtensionData.htm
i cant pretend im a c# expert, i used it for unity gamedev in college and understood close to zero of it the entire time
gamemaker i miss you
actually the goated way to code was gamemaker drag and drop no cap
public sealed class MyModel
{
public string RuntimeType = "ERROR";
internal ActualType RuntimeTypeInstanceReal;
[JsonExtensionData]
private Dictionary<string, JToken> _additionalData;
[OnDeserialized]
private void OnDeserialized(StreamingContext context)
{
// now u can do whatever deserialize here
ActualType RuntimeTypeInstanceReal = GetActualType(RuntimeType).YourDeserializeStuff(_additionalData["RuntimeTypeInstance"]);
}
}
i think it'd be like this?
with like, real methods yknow
do you know if properties set in the [OnDeserialized] part would be accessible to patch with CP? If so that would work.
I think I'll still try to avoid that by postponing rotation indexing to later in the setup process because I think I can do that in my case. It might be cleaner and I think it'll make it possible to leave some processing to when it's needed.
yup, the thing that gives you autocomplete. Maybe there are settings to change to make it better
no the whole point is to have cp patch RuntimeTypeInstance, which gets shoved into _additionalData per JsonExtensionData, and then you actually deserialize it to real runtime type which you hold in RuntimeTypeInstanceReal that cannot be patched by cp (its internal)
so the CP patch would have to target ["_additionalData" / "RuntimeTypeInstance"] in your case?
cp shouldnt know about _additionalData either
if im reading this correctly, any json field that lacks a model field gets put into this extra IDictionary
thats w hat smapi uses in the manifest right?
there are still limits ofc like RuntimeTypeInstance is an object so once again targetfields banned
(SMAPI uses Newtonsoft.Json, not System.Text.Json. Microsoft copied the equivalent feature though.)
(has anyone ever actually even used the ExtraFields for anything useful in a mod? im sure someone has, but i havent seen it, but i am curious)
Yeah, I don't fully understand how I would make what I want with this, I'll try my solution of removing the order dependency. I'll go to bed (in minecraft) now, I'm starting to get a headache.
Well button i can theoretically use it
i wanna know about practice not theory 
(You should really consider using a less dynamic data model though; otherwise you'll be getting headaches for many years to come, since you'll need to deal with quirks and edge cases and user support and mod author support even after you get the implementation working.)
You may recall the funny Args field in trinkettinker that gets round-triped through newtonsoft
To become the real args
you overestimate my memory
(im wording it like this out of faith in u)
(i will pretend like im not going to go look up the trinket tinker docs/source code rn)
Rn this roundtripping happens when I actually go initialize the Ability
If i do the json extension data thing i could do it when i read rhe data instead
oh do you mean just using this attribute
The reason why decided not to do it is entirely the cp targetfields problem
im sure theres plenty of mods that could benefit from the attribute
i wanted to know specifically if anyones ever used ExtraFields in manifest.json
i know stardrop has specific manifest attributes but idk if they use ExtraFields
Ah the manifest 
Yeah hm I can't think of any reason to off hand
i figured ExtraFields is there for Content Pack frameworks for some purpose
a purpose that is probably less useful nowadays
with the dominance of CP
you want to ask in #modded-stardew
Thank you 🙂 I’ll move that there
I think the problem is that any feature i can think of that prefers to have that data in manifest.json is like, something better done with first class support on SMAPI itself
At which point it cease to be ExtraArgs
Yeah
yeah thats the only one ive got
Or like alias unique ids
So that people can put their name into unique id of a mod they picked up
while still letting ppl know that hey this mod used to be this unique id
(i still would really like smth like TranslationFor supported by SMAPI itself but it seems less and less likely as time goes on bc it gets harder and harder to go up against the years of translations that dont use it that already exist
)
Well I don't think it'd conflict right
hello, I have an issue I'm facing.
I want to modify some events from other mod, but it seem that whatever I do I see no change when debuging
I want to modify an event in SVE using a custom mod so I won't always modify the SVE folder,
I already modified some events and it's working fine but a specific event just did read the changes, I wonder if I'm missing something
Any help would be appreciated
it wouldnt conflict no but itd affect adoption of it
that and the fact that it would be a bunch more work than a normal drag n drop translation
Like rn some ppl make portraits that are just replace original pngs (nyapu...)
not like, significant work, but still a barrier to entry when the usual way has worked fine for, what, 7 years?
But u can always make it not do that, and in exchange u get to put an update key
do you have a dependency on SVE in your manifest?
yes I do, I even added the condition for it in the "WHEN" entry
What is the When on the original event?
Need to make sure it's not behind say, a config token
anybody else noticed issues with fashion sense and swimming/swimsuits? either I'm not using the field properties correctly somehow, or it's getting ignored entirely
also any clue why converting my CP pants tilesheet to FS has weird offsets on some animation frames? I thought maybe it was similar to how hairstyles have hardcoded offsets, but I couldn't find any pants offsets in the code after a quick glance
"Spouse |contains=Wizard": false
I copied the event entirely, then changed the value of it to 'null',
then proceeded to recreate the same event with same entry and condition, but I saw no change, I even modified the event in the SVE folder and there was no change
I'm not sure if this is a bug or the like
JSON is a standard format for machine-readable text files that's used by Stardew Valley mods.
If you need help with a JSON file, you can upload it to smapi.io/json to see automatic validation and share the link here.
When making mods, it's recommended to edit your files in a text editor with JSON support, such as VS Code, Notepad++, or Sublime Text. These programs will check for syntax errors.
Also share ur edit vs the sve edit
How are mods like SVE able to make changes to the farm map in-game via config? like it updates in-game
yo? for anyone who uses starblue valley 1.6 unofficial and any mod that requires lumisteria's tilesheets-outdoor dm me! i need some test help and feedback to make sure it looks good visually! i.e. it won't look jarring compared to starblue valley's recolor
Thanks for pointing that out, I forgot about the patch summary, so I can look what's going on.
It's just that my file is quite big ( over 1000 lines) and I forgot that I copied the event from the SVE folder and pasted it in two different location and forgot, I deleted the duplicate and kept the modified version
everything works now
VS Code randomly decided to start auto indenting lines further down in my code when I pressed enter and it took me 15 minutes to track down that somehow my "format on type" setting for specifically C# had gotten changed or the C# formatting style itself changed in my settings... no idea how, but hopefully that doesn't happen again. Anyway, sharing this here in case anyone else crosses path with this irritation. (It might've been an extension but I don't exactly use a ton of those)
I noticed that some users using foreign languages will have a display name for the character in other characters. I have a dialogue asset with entries like "Anniversary_Lance", but I'm guessing that won't just work when I'm feeding in a name key like "肯尼斯". How do I match the translated name to the correct NPC? Is that npc.GetDialogueSheetName()?
tbf content patcher docs are hard for non english speakers so i get it
are you not using $"Anniversary_{NPC.Name}"
npc.getName() is what I'm using right now in the C#
switch over then
as confusing as it may be, NPC.Name is the real internal id and whats used as key to Data/Characters
if you look at NPC.getName() its backed by displayName
Alright, thank you!
for vanilla npcs in english these values happened to be the same
btw kantrip i was looking at Special Spouse Dialogue Framework
how do you feel abut supporting GSQs as a way to pick dialogue
sorry for asking this but where is the tilesheet of the travelling merchant?
cursors
thanks
!springobjects
Most vanilla object sprites are in the Maps/springobjects asset. See a table of springobject sprites by index.
Some newer object sprites are in TileSheets\Objects_2. You can check the entry in Data/Objects to see where its sprite is stored; SpriteIndex is the position, and Texture is the asset name (defaulting to Maps/springobjects).

its a lot less threatening when its teeny like that
hello @ivory plume me again with a question. I am loving the new local tokens functions in the latest cp version - is there any chance we would be able to target arrays in the future?
Right now I have some nice templates set up to generate crop, object, machine info, but ill have to edit fields like context tags, machine phases, crop phases etc separately since i cant use local tokens with the array fields. If its not doable that's reasonable! Just figured id ask if it was possible.
wait i thought u can let me try
Can you give an example of what you want to do? Local tokens should work exactly like any other token.
oh can i ?? i was troubleshooting with soph about how to handle it holdon ill grab an example
if you mean you want to set the value of a localtoken to an array itself, thats somethin you cant do bc it is ofc just an ordinary token
ok so if this is my template
"LogName":"Advanced {{ITEM_TYPE}} Objects",
"Action": "EditData",
"Target": "Data/Objects",
"Entries": {
"{{ModId}}_{{ITEM_FLAVOR}}_{{ITEM_TYPE}}": {
"Name": "{{ModId}}_{{ITEM_FLAVOR}}_{{ITEM_TYPE}}",
"DisplayName": "{{i18n:AtelierGoods_{{ITEM_FLAVOR}}_{{ITEM_TYPE}}.name}}",
"Description": "{{i18n:AtelierGoods_{{ITEM_FLAVOR}}_{{ITEM_TYPE}}.description}}",
"Type": "ArtisanGoods",
"Category": -26,
"ExcludeFromShippingCollection":"{{PerfectionToggle}}",
"Edibility": "{{EDIBILITY}}",
"IsDrink":"{{DRINKABILITY}}",
"Price": 100,
"ContextTags":[],
"Texture": "Mods/{{ModId}}/Objects",
"SpriteIndex": "{{ITEM_SPRITE}}"
}
}
},```
i wasnt sure if the [] should be inside my token or left in the template, and i was getting some errors in vsc trying to format it
So ContextTags for Example would be the one im questioning about
is this the freaking
you'd have to do "ContextTags": [ "{{TAG1}}", "{{TAG2}}" ]
(for example with 2 tags)
where TAG1 and TAG2 are localtokens ofc
ok that makes sense, but how about Frames for machines, cuz thats [1,2,3,4,5] for example ?
or crop phases is also a similar one
uhh that one i defer to Pathos bc of not remembering how LocalTokens work when a string should be turned into an int
HEY i still appreciate the context tag help! thats one less append i have to make
what if u give "1,2,3,4,5"
the thing is the localtoken will always be a string
might work?
i dont think putting one big string into an int array would work. ordinareily tokens that can be known to be ints only wouldbe auto converted into individual ints but localtokens can be anything
ok so in the localtokens itd be "PHASES":"1,2,3,4,5" and in the template it'd be [{{PHASES}}] ?
but tokens r sets on the inside 
In theory you can do the same thing and the strings will get converted into numbers:
"Frames": [ "{{Frame1}}", "{{Frame2}}", ... ]
(I don't recall off-hand how strict the type validation for local tokens is though, you'd need to try it.)
i thought i recalled issues with localtokens when used in places like "Price" fields bc of the auto conversion, but i couldnt recall if that was fixed (or if my memory made it up)
oh ok i can give this a try too then! between this and the example button made these could in theory solve the bits i thought i had to do separately from my template. ill give it a shot!
thank you everyone!
i might see if this works first though cuz chu if it does thatd be great ❤️
(I'd be surprised if that works.)
i would say it should definitely NOT work if it does lol
ah lol ok gotcha XD at any rate ive got somewhere to go with all of this now 
if i put "1,2,3,4,5" as a context tag i would expect CP to respect that thats what i want the tag to be, not an object with 5 different tags of 1, 2, 3, 4, and 5
[Content Patcher] Can't apply data patch "(CP) (O)390 and friends > Include o390.json > EditData Data/Objects > entry #1" to Data/Objects: failed converting entry to the expected type 'StardewValley.GameData.Objects.ObjectData': Error converting value "1, 2, 3, 4, 5" to type 'System.Collections.Generic.List`1[System.String]'. Path 'ContextTags'..
nop 
well, thank you for trying incredibly fast for me chu ❤️
wait chu what was your json there
the content modders yearn for the foreach
i was thinking since phases is written that way perhaps itd handle it differently then the tags
did you just do "ContextTags": "1,2,3,4,5" essentially
yea
well i admire your hopeful spirit at least
i thought you were going to try "ContextTags": [ "1,2,3,4,5" ] (which also shouldntr work)
yeah
thats the only way you'd be able to put smth like that in there with a localtoken
ok but then wouldnt phases read it correctly because it IS looking for something like that?
Note that Content Patcher will treat the comma as a value separator. So if you set the token value to 1,2,2,3, then the token will output 1, 2, 3 (unique values with spaces after the commas).
ah so itd be read differently than if the token was written as "1 2 3 4 5"
i see why the way you broke it up makes sense then
is this the case even if you wrap it in quotes first, so "1,2,3,4,5" vs 1,2,3,4,5 for the token value? does the |inputSeparator still work on LocalTokens to change that?
more or less expected alas
[Content Patcher] Can't apply data patch "(CP) (O)390 and friends > Include o390.json > EditData Data/Machines > entry #1" to Data/Machines: failed converting String value to the expected type 'System.Collections.Generic.List`1[[System.Int32, System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]': Error converting value "1, 2, 3, 4, 5" to type 'System.Collections.Generic.List`1[System.Int32]'. Path ''..
ah well thank you for testing! ❤️
Token values aren't quote-aware, and inputSeparator only affects the delimiter between input arguments.
on the flip side, u can do something like this as a include
{
"$schema": "https://smapi.io/schemas/content-patcher.json",
"Changes": [
{
"Action": "EditData",
"Target": "Data/Machines",
"TargetField": [
"{{L@MachineName}}",
"WorkingEffects"
],
"Entries": {
"FiveFrameWorkingEffect": {
"Id": "FiveFrameWorkingEffect",
"Interval": 100,
"Frames": [ 1, 2, 3, 4, 5 ]
}
}
}
]
}
then u just give L@MachineName to apply it onto w/e machine
whether this is worth it depends on how many machines have exactly 5 frames lol
Another option would be to set the array fields in a separate non-templated patch. For example:
{
"Action": "EditData",
"Target": "Data/Crops",
"Fields": {
"SomeCropId": {
"DaysInPhase": [ 1, 2, 2, 3 ]
},
"AnotherCropId": {
"DaysInPhase": [ 1, 3, 4, 4, 5 ]
}
}
}
-# ForeachFields when
(ForEachFields wouldn't help in this case, since you need an array of values for a single field.)
WorkingEffects is too deep to do Fields at top level tho 
Fields works with TargetField too.
yea but u wouldnt be able to apply to a bunch of machines
yeah this was my initial solution! and is perfectly servicable. i just have almost 1k items that need context tags so that one is a little weirder but certainly doable and not an issue! i just figured id ask if it was something that could be done
but i guess its ok if u dont care about just replacing all of WorkingFields?
Yeah, you'd need separate patches for deeply nested fields unfortunately.
chu ty for your example as well thats also great to have as a reference
the include version would append onto any existing WorkingFields that are not Id=FiveFrameWorkingEffect
so its good when u want to say, have a item be on sale across a bunch of stores
yeah the localtokens overall are a HUGE improvement for my pile of objects and machine rules etc so im super happy with them
a few separate patches is still a huge win hehe
and adding new items/categories will be a breeze once ive set the new code up
hm i always forget the Lost Books are like a library thing handled in LibraryMuseum.cs
is this an important feature to include for a custom museum framework do we think. any thoughts on this. or will people not really care about making custom lost books specific to their museum
Literature is good
So basically something like this: https://www.nexusmods.com/stardewvalley/mods/20301 But rather than randomly finding like the Lost Books, maybe they can be added through trigger action? A content ...
this issue has been assigned to spiderbuttons@
idk if it's your job really, it's quite simple to replicate it with conditional map patches
having a nice menu is the harder part but that is also decidedly not your job
thing is i dont think you even need a framework for doing that for the vanilla museum, im pretty sure it might already be possible with CP alone?
you can just keep giving the player lost books and itll increment the networldstate stat
and thats whats used as the iterator count in the for loop in the museum, which just adds lost books to all the lost book locations, which are just TileDatas
and the Note map action just reads from Strings\Note:<noteId>
it's quite simple to replicate it with conditional map patches
this is for lost books specifically though, this request seems to want like... BOOK books
they dont need to be conditional
they can just be
hell, they can technically be in a custom location too if you set the map type to LibraryMuseum (id not recommend it i think)
the vanilla museum doesnt conditionally patch the books, neither would you need to 
well button do u want to dehardcode the bit in LibraryMuseum then
my point was that its not actually hardcoded
as long as you want your new lost books to appear in the vanilla museum
but ur mod is about doing museum things not in the museum 
my "would people even want this from a museum framework" question is if ppl would be interested in things that are not lost books but their own totally seprate thing specific to their museum
like secret note framework custom notes but for museum books
that said i think u are like, fairly close to just making it work too
no i mean
atm when you inspect item you get something like a tileaction Message right
more or less
what you're describing is a seprate system where peopl would donate book items
as opposed to the lost book system of digging up artifacts and getting a Item Go Poof and then a TAS in the museum until you read it
(or however else the mod author would want to give their Item Go Poof)
@polar escarp Hi! Sorry for the ping, not sure what's the best way to contact you directly...
I'm working on converting a mod to use Fashion Sense and I noticed a few bugs and mistakes (e.g. incorrect animation conditions in the templates, dead links in the docs, etc) but most notably, I dug into the source code and found a fix for bodies rendering over water while swimming, just need to add these 3 lines from the vanilla draw call, but I'm just not sure if you've redefined Farmer.yOffset somewhere
// Swimming body render cutoff
if (!FarmerRenderer.isDrawingForUI && who.swimming.Value)
{
sourceRectangle.Height /= 2;
sourceRectangle.Height -= (int)who.yOffset / 4;
}
I can send a PR your way if you'd like. Not sure if you'd also like a PR for the doc fixes or to just DM you
i think the fact that someone did actually just make a book collecting mod in secret note framework means non zero demand but whether people wish to see their book in physical location is unclear
(the reason i care abt the specific lost book esque system is bc i have been trying to give these custom museums full feature parity with the vanilla museum so that a mod author can do everything they might wanna do that the normal museum can... and id just forgorten that lost books are technically a requirement for feature parity)
Can I replace the dialogue where the farmer's spouse/roommate says they got up early and fed the farm animals?
If you know the string for it yes
"NPC.cs.4470": Something about checking sprinkler systems? I don't recall what this one is I just know that's what I wrote for mine lmao.. maybe something about farm maintenance
"NPC.cs.4474": Farm animals
"NPC.cs.4481": repaired fences ```
its in StringsFromCSFiles
They aren't in- yeah
bc theyre generic
I suggest making sure that your patch has a condition for when it's done for the specific spouse - otherwise it will overwrite all of the dialogue... so if someone chooses to marry leah then leah will say those lines
thanks I found it, and yeah I will make it specific
I just learned that Harmony prefix patches which "have no side effects" (ie. no affecting the return value, or having ref input arguments) are not skipped when another prefix skips the original method, regardless or patch priority.
That certainly explains some things.
(I'm not modding right now, found out about this for other nefarious purposes, but thought I'd mention it because people might find it interesting/useful)
(in case the difference matters to someones patching: the prefix specifically has to return void, too, so it wont go to another skipping prefix either even if that second skipping prefix doesnt affect or skip ever)
https://github.com/Aurekata/connors-cool-haircuts
I'm trying to create a fashion sense mod (for hair), and I know the conditions/manifest are working since I get a working file (hair) from another mod to show up and be wearable in game, but my png file with the hair that I made won't show up in the mirror item, and there's no errors in SMAPI. Are there any tests I can run to troubleshoot/diagnose? I'm not sure if my dimensions in hair.json are bad or if the png won't load.
Stardew Valley haircut mod by Aurekata. Meant for Fashion Sense. Doesn't work and the current hair images 2&3 are dummies from "Harry's Short Haircut" mod ...
what does it say when you run fs_reload?
it gets mad without the pngs, how do i revert it to use the default tile sets?
i was told to set the scorce as the png, and the remove them from the folder when im done editing, but that breaks it
!tilesheetclimbing
When creating or editing maps in Tiled, one common error is tilesheet climbing, marked by red text containing "invalid tilesheet path '../../..'. This is caused by SMAPI not being able to find the tilesheets needed by the map file. To prevent this error, make sure that you have a copy of all necessary tilesheets in the folder containing your WIP tmx file. Copies of vanilla tilesheets can later be deleted, but must be present while working on your map.
If you get this error with a completed map, an easy way to fix it is to open your tmx file in VS Code or a similar text editor, find all of the places with <image source=, and remove the filepaths to so that only the tilesheet names remain. For example, if the code says <image source="Content (unpacked)/Maps/townInterior_2" width="512" height="64"/>, change it to just <image source="townInterior_2" width="512" height="64"/>.
you always need to have the tilesheets in the folder while editing, and then remove them when done with them, but if you go back to edit again then you'll need to have the tilesheets in the folder again
there's a tutorial with some suggestions for how to set up your map workspace, let me see if i can find it
https://stardewvalleywiki.com/Modding:Maps look at the sections "map edits" and "troubleshooting"
personally, i copied all the tilesheets and maps into a folder on my desktop, including my custom maps and tilesheets, and i make edits to files in that folder, and then when i'm done editing a map file i copy it to my mod folder. i never open maps from my mod folder.
i figured that out, i acidently modified the map in the ingame mod folder and not my working foler
but how do i fix this?
is your tilesheet prefixed with spring_?
yes
it looks like you are targeting the wrong sheet entirely
did you do a Load at any point 
what that
oh i think i know why, your sheets are relative to your map tmx but not directly next to em
the png have to be n the same folder as the map?
so the name is different than what game expects, perhaps a/subfolder/spring_outdoorsblahblah instead of spring_outdoorsblahblah
yes if you are using vanilla sheets
and also do not actually include the sheets in your mod folder
That error is an internal access key that points to a missing file
did you copy the vanilla tilesheets, or move them?
all you people are great 😁
(trees are wird cause i used a cheet to skip time)
Might be easily fixable with manual editing!
I would have a look if I wasn't on my phone, but someone might be able to if you uploaded the map?
i think...I got it to work again?
Sounds like a file lock?
idk what happened but all my tilesheets were gone from the map, y'know the one when you delete all sheets with the red botes...and when i tried readding them one didnt want to and gave me that error
yay its fixed
still no clue what exactly happened
Hi all! Can someone help me understand how to format the adding or removing of friendship when selecting specific answer dialogue in an event? This is what I currently have and it's not working. (The friendship amount is too much ik, it's just so I can test) quickQuestion #{{i18n:event-Alden8Hearts.07}}#{{i18n:event-Alden8Hearts.08}}(break)speak AldenLilybrook \"{{i18n:event-Alden8Hearts.09}}\"\\friendship AldenLilybrook 500\\(break)speak AldenLilybrook \"{{i18n:event-Alden8Hearts.10}}\"\\friendship AldenLilybrook -1000\\/pause 500/
(this isn't the whole event, just the relevant part lol)
how do you mean it isnt working? hearts not going up/down?
Yep, no difference in hearts
this probably isnt it but have you tried switching the order of the friendship command and the speak command? thats the only difference i see right now when compared to my own events
/quickQuestion {{i18n:{{ModId}}_8Heart.10}}(break)speak {{Honeyfuggle}} \"{{i18n:{{ModId}}_8Heart.11}}\"(break)speak {{Honeyfuggle}} \"{{i18n:{{ModId}}_8Heart.12}}\"(break)friendship {{Honeyfuggle}} -500\\speak {{Honeyfuggle}} \"{{i18n:{{ModId}}_8Heart.13}}\" for comparison
I shall try that now
Not sure off-hand if it matters, but there shouldn't be a \\ at the end of the inner script (before (break) or /); that'll be treated as an extra invalid event command.
(Also you don't need {{ModId}} in your i18n keys, since i18n is already scoped to your mod; keys like {{i18n: 8hearts.10}} are fine.)
Does this look okay? quickQuestion #{{i18n:event-Alden8Hearts.07}}#{{i18n:event-Alden8Hearts.08}}(break)friendship AldenLilybrook 500\\speak AldenLilybrook \"{{i18n:event-Alden8Hearts.09}}\"(break)friendship AldenLilybrook -1000\\speak AldenLilybrook \"{{i18n:event-Alden8Hearts.10}}\"/pause 500
I think that looks fine.
ok but i like having the mod id in the i18n 
Aba told me the same before and I was like "but...brain says....modid..."
Ok, so no errors now, but it's not changing the friendship
(It's more verbose, but I feel like the 1.6.16 way is easier to read and troubleshoot.)
choose "" "{{i18n:event-Alden8Hearts.07}}" answerA "{{i18n:event-Alden8Hearts.08}}" answerB/
label answerA/
friendship AldenLilybrook 500/
speak AldenLilybrook "{{i18n:event-Alden8Hearts.09}}"/
goto resume/
label answerB/
friendship AldenLilybrook -1000/
speak AldenLilybrook "{{i18n:event-Alden8Hearts.10}}"/
label resume/
pause 500/
grabby hands
If u like having ur mod id in the i18n
You can always just load ur i18n and use the translation key directly
I think it work in events?
why so many "
idk what that means 
I like the way this is set out. Do i need to rewrite my whole event in this way or just this friendship section?
i look forward to the well explained wiki pages later for that new stuff because brains nopeing out
This is a new syntax in the upcoming Stardew Valley 1.6.16, unfortunately you can't use it yet. But once 1.6.16 is released, technically you can mix and match the old and new style.
Ohh! I'm dumb haha. I look forward to the new style though! I'm confused as to what is wrong with my current script though 
if u do this
{
"Action": "Load",
"Target": "{{ModId}}/i18n",
"FromFile": "i18n/default.json"
},
{
// for translations
"Action": "Load",
"Target": "{{ModId}}/i18n",
"TargetLocale": "zh-CN",
"FromFile": "i18n/zh.json",
}
u can do speak actor {{ModId}}/i18n:yourDialogue
or use it like [LocalizedText {{ModId}}/i18n:yourDialogue] in other places 
It seems fine to me, and the friendship command should log an error if there's something wrong. Just to make sure, there's no errors/warnings in the SMAPI log when you run the event?
and its still valid i18n
(Central Station does something similar so the C# component can use translations from the content pack.)
Oh wow, wait til you hear this. I had enabled 'No friendship decay' within CJB omg
All working good noe c:
i also use that for a c# component to have access to the translations. I'd probably just use reflection now though out of laziness
I remember LoC having elaborate thing to load the translations from content pack into the C#'s translation helper
My phone has been in my pocket for the last five minutes. What the fuck did I do?
this jsut adds to the confusion i already had on how to add a ticket machine from central station to my map
why do you have that image saved lowkey LMAOOO
Twice as confusing, how do you do that?
Because that was not a picture in my phone
I only pulled my phone out of my pocket to ask my girlfriend if she wants snacks at Walmart what the fuck

it looks like u did a remix which u dont gotta save the image to do
Where is the actual image? What the fuck?😆😃😭
its in the pins of this channel!
wanted to see what was the api you accidentally posted
I’m getting out of this channel. I’m so sorry. Enjoy my mess of me keeping my phone in my pocket. good luck coding.
lmao
i like it when things work the first time around
just to check, heart events have no prerequisite where you have to view them in order, right?
like if someone hasn't seen the 5 heart event they can still see the 7 heart event?
not necessarily, but you can add a SawEvent precondition to the event if you want it to work like that
fo walling off out of bound areas, do i use a spacific tool, or just spam flower pots or smth on the building layer
it doesnt matter what the tile you use to block things off, just as long as its on the Buildings later
ok
no, there's a player having an issue where a heart event won't play lol
and unfortunately they're on android soooo
flower pots it is
do they have Event Limiter? that might be interfering
nope, just my mod
i just don't know how to troubleshoot because they can't do things like debug ebi
yeah if no other obvious problem comes up id chalk it up to that
https://smapi.io/log/e17a2bee7c904a99b557ed872314c82a?Sections=ContentPackList this is their log should anyone want to see it
Log Info: SMAPI v4.1.10.3 - 1735840167 with SDV 1.6.15 build 24354 on Android Unix 29.0.0.0, with 2 C# mods and 1 content packs.
luckily it doesn't do this anymore since i came up with another, far dumber solution
these are spawn points right?
Most of them are; see Maps#Paths layer on the wiki for more info on each one.
Does anyone mind showcasing my mod? https://www.nexusmods.com/stardewvalley/mods/34075
Adds conveyor belts for automation! The belts automatically "pull" and "push" items from machines and chests. The Factory Must Grow.
when do we get biters
hm what exactly happens if u need more than 4 inputs for whatever strange reason
(i shall not name the strange reason)
Then use a bigger machine?
(speaking of, is furniture machines supported, I know there's only like 2.5 mods that use it rn)
I didn't test with furniture machines but I think it would work fine, I'm assuming furniture machines' harmony patches make it work with automate? The push/pull logic I used isn't too dissimilar to automates
hmm actually idk how furniture works, its probably not in location.objects so maybe not
yeah furnitures are saved to GameLocation.furniture and not GameLocation.objects
i think the only jank is whether you are check for furniture by its entire bounding box
but yeah their logic is otherwise identical
just PlaceInMachine (or performObjectDropInAction) and grab the output
im glad we have the 3 automations for Junimos Neutral Joja
lol
btw cool mod! if I escape the cheeto curse and somehow play enough to start a new playthrough I'd switch off junimatic for this
these pots will all be visible is that the desire
i have the trees hidded
looks nice
(also I appreciate the EMC integration!
despite the utterly undocumented API)
(I browsed the source out of curiosity and my only take away is pathos pls Object.TakeMachineOutput for 1.7)
we now have 5 different codebases that (have to re)implement taking machine output and handling all the "on machine collected" updates (vanilla, automate, junimatic, dalionheart, and now stardio), it makes adding your own "output collected" handler very non-trivial
@ivory plume can you make Object.TakeMachineOutput please
Yeah I had to do EMC since this came from me working on a mini factory expansion that uses it haha
I'll get FM supported as well, since I think its neat
Will furnituremachines be unhappy if I pass null to IsFurnitureMachine
looks like it will, sorry
That isn't really trivial, since...
- there's so many ways that vanilla machines work even before you account for mods;
- the game needs to support cancelling taking output (e.g. if the player or chest doesn't have enough space in their inventory);
- sometimes it may need to support partial output;
- and the machine code is still all over the place (even after the 1.6 refactor which improved things significantly).
So it's definitely something we can discuss next time we have a mod author beta, but it's not a quick change I can just throw in without looking into it further.
yea for certain 
machine code is eeeevil omg
i have some bias towards having event hook so people dont have to harmony as much
but its not clear how you'd actually allow a mod to take away the output in this case
(The machine code was much worse before 1.6. Automate had to work by manually reimplementing the entire machine logic for every machine.)
if i use spring_day_ambiant, will it also change with the season like tiles do?
Any tilesheet that is prefixed with the season will be automatically switched to the appropriate season by the game.
so if im passing the Random token into my default json, do i need to include the arguments???? right now i have it set up like this...
in a seperate Animations.json file: "lift_weight": "{{i18n:animation.lift.weight |random={{Random}} }}"
in my default.json: "animation.lift.weight": "{{Random: 1876... 1877... 1878... 1879..., *grunts* Must get stronger...}}"
when i ran the game i got this error-- "System.InvalidOperationException: The 'Random' token requires input arguments." so.... i should list the arguments twice? both inside and outside of default?
So yes, but obviously make sure you have made summer, fall, and winter versions too.
@brittle pasture ezpz furniture machine supported (matching code block for pushing)
What are you trying to achieve with your random token? If you want to use it to specify different dialogue lines it needs to look something like the following:
dialogue.json (in my case)
"FlowerDance_Accept_Spouse": "{{i18n: Hiria.FlowerDanceSpouse.{{Random:1,2,3}}}}"
default.json
"hiria.FlowerDanceSpouse.1": "FlowerDanceSpouse.1 PLACEHOLDER",
"hiria.FlowerDanceSpouse.2": "FlowerDanceSpouse.2 PLACEHOLDER",
"hiria.FlowerDanceSpouse.3": "FlowerDanceSpouse.3 PLACEHOLDER",
SMAPI has its own much simpler token system, and your current code just passes the value returned by {{Random}} to SMAPI; so what you have now won't work. Instead I suggest having the randomization in your Content Patcher data (like Abagaianye's example).
ahhhh okay, i see. thank you both for the responses!
im trying to randomize dialogue, yeah. so your example was perfect :]
Looks interesting! Since I'm sure players will ask on the Automate page, I assume Stardio and Automate can be used together? For example, Automate can push output into a chest which Stardio then moves onto a connected conveyer?
nice! also TIL GetFurnitureAt exists
What happens if you gift an NPC with an item not specified in their gift tastes?
I think it should apply the universal taste
Oh that's good - I was concerned I needed to specify everything!
See how a gift taste is determined in Modding:Gift taste data; if all else fails, it defaults to neutral.
Yeah I don't see why not! I used the chest mutex to prevent belt/player collisions anyways so they should play nicely together
hm i got update ping even tho its got a -beta.0 key and is a pre-release
[SMAPI] TrinketTinker 1.6.0-beta.0: https://github.com/Mushymato/TrinketTinker/releases (you have 1.5.9-beta)
You have a pre-release version installed, so it'll show update alerts for newer pre-release versions.
oh thats good then ty
i kind of assumed it wouldnt check for greater actual version b4
(See beta versions and update check algorithm on the wiki if you're curious how it decides when to show an update alert.)
<glances in here, sees the word conveyor, actually looks at the message and linked mod>
I'VE BEEN SCOOPED
(pretending I was ever actually gonna get that mod done)
(also, really nice looking mod Jukthefoo!
)
!fourcakes
make that five, as i have made yet another one
!cakeshop
my sixth cake will be hiring joja workers
the ultimate conclusion to the joja route - become joja itself
i didnt add that squirell XD
Joja takeover! (but it's the farmer taking over joja and starting an empire)
Another opportunity to piss off Pierre, sign me up
solve this mod idea for n and n+1 cakes. (10 marks)
The squirrel is auditing your work :P
I have conclusively proven there is a hard limit for the maximum number of cakes (it's the highest supported number for nexus mod IDs)
(The soft limit is the highest supported number, minus other mods. To surpass the soft limit you have to steal old mod pages and retroactively turn them into cake)
nexumods string-ids fork
Considering mod IDs increase one by one sequentially, I'm doubtful it's a string
what if its a 16bit int, we're halfway done with all the stardew mods 
im psure skyrim is past that right
just parse the last character in the string as an int, increment, carry as necessary one char at a time, convert back to string
very standard practice /j
150376 skyrim special ed. mods
Skyrim's newest mod ID seems to be 150376, so I think we're safe to assume that's not the case
I realized that was a possibility, hence why I said "I'm doubtful" and not "it's impossible"
Interesting because nexus says it "only" has 110k https://www.nexusmods.com/games?sort=mods
Probably because of private mod pages
Whether reserved, or people making them private for various reasons (like when collections were added, or when they changed the DP distribution)
So a third of SDV mods is hidden? Interesting 
Ok everybody we only need 90k more released mods to beat skyrim so get cookin
Hmm I have 34 unreleased mods I could add...


