#making-mods-general
1 messages · Page 305 of 1
Oh, that one might be unavoidable! Can you show your csproj? Mine is very similar/probably the same bug internally, but...
If I need, for example:
<ItemGroup>
<SMAPIDependency Include="spacechase0.SpaceCore" Version="1.10" Reference="true" />
<SMAPIDependency Include="spacechase0.GenericModConfigMenu" Version="1.9" Required="false" />
</ItemGroup>
I get this.
Thank you Rider, very cool
Yes omg mine is also in an item group
They do need to be in an item group, but that should be fine...
But I wonder if it being in an item group is part of the bug
not that I can do anything about it but i wonder
<ItemGroup Condition="'$(Configuration)' == 'Debug' ">
<ContentPacks Include="test-pack/TilePropertyMod" Version="$(Version)" />
</ItemGroup>
Lemme just... change it to [CP] to see if it does the same thing. It shouldn't, but...
I removed the item group from my .csproj and the visual bug went away
Aha, found the problem!
<ItemGroup Condition="'$(Configuration)' == 'Debug' ">
<ContentPacks Include="test-pack/TilePropertyMod" Version="$(Version)" />
</ItemGroup>
That = fine.
<ItemGroup Condition="'$(Configuration)' == 'Debug' ">
<ContentPacks Include="test-pack" Version="$(Version)" />
</ItemGroup>
That = not fine.
So if you move that pack one folder deeper, it seems like the dumb visual bug will... go away?
That's so odd
But yeah, anything that has an Include="/blah/here" is interpreted as Rider as "THIS IS A FOLDER TO SHOW IN THE PROJECT ALWAYS AT ALL TIMES.
Both exist. The first one that fires is the one that fires
Hi all, sorry if this has been asked, but I didn't see an answer in any of the pinned posts in this channel.
Is there a baby/beginner mod tutorial anywhere that folks suggest for people who want to get into stardew modding?
!startmodding
!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.
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.
Haha thanks both 💜
Does anyone know how to code an if that checks if food is a drink? I know there's bool IsDrink field, but I don't know how to access it for a check
What's the context
Have this mess currently, i need an if to check if player consumed food is a drink somehow, instead of janky using context tags
internal static void UpdateFoodConsumption(SObject foodObject)
{
if (foodObject.HasContextTag("drink_item") || foodObject.HasContextTag("coffee_item") || foodObject.HasContextTag("alcohol_item"))
{
ApplyDrinkFull(foodObject);
return;
}
ApplyFoodFull(foodObject);
}
I was surprised object categories and context tags dont have a universal thing for a drink, now idk how to do it
Ah u just need to do GetData to obtain the ObjectData then
The IsDrink field is on there
Game1.objectData.TryGetValue(base.ItemId, out var data)
Thank you that's really helpful
Eventho idk how to do what i want with it im really bad at this 😭
at least i have a lead now how to access the data
You can tell us about the goal if u want
This is almost certainly a silly question. But does stuff break if you have multiple buildings upgrade from the same "base" building.
Had a whole idea for "profession" themed big shed alternatives that enhance certain machines inside them somehow.
But that hinges on not totally breaking the building upgrade system by having a brewery building and creamery upgrading from the basic shed.
Nah u fine
Building upgrades are well formed on their own and can branch like that if u want
Okay. That's good to know. I've had a few ideas lately that rely on it, that I've not started over lack of assets and that potential problem of it just not working
the only "issue" is that players can't really downgrade a building if they change their mind
but well
idon't think this should prevent modders making cool stuff
I am using unlockable bundles anyone have expertise in this subject matter?
oh actually it's trigger actions I need help with...```json
{
"Action": "EditData",
"When": {
"HasMod": "DLX.Bundles"
},
"Target": "Data/TriggerActions",
"Entries": {
"{{ModId}}_greenRainTriggerRepeat":
{
"Id": "{{ModId}}_greenRainTriggerRepeat",
"Trigger": "LocationChanged",
"Condition": "PLAYER_HAS_SEEN_EVENT Current orb_hint_mossy, PLAYER_HAS_RUN_TRIGGER_ACTION Current {{ModId}}_greenRainTrigger, PLAYER_STAT CurrentPlayer weedsEliminated 10",
"Actions": [
"UB_PlaceBundle Cape.SecretOrb.Repeat",
"MarkActionApplied Current {{ModId}}_greenRainTriggerRepeat false"
]
}
}
}``` is my condition correct?
So u see I have
if ( ) {ApplyDrinkFull(foodObject); return;}
ApplyFoodFull(foodObject);
ApplyDrinkFull applies a status effect quenched, ApplyFoodFull applies a status effect full
so i just need that if ( ) to return true if Object is a drink and false if its not
In this case this whole idea was inspired by the custom bakery building for wildflour's atelier.
But also figured it'd just make sense to generalize and work in interaction with stuff like cornucopia's artisan machines, and hell letting alchemistry machines get bonuses in the brewery seems reasonable.
Keg spam in the overworld my beloathed.
i would check that you do have a orb_hint_mossy event (rather than a modid_orb_hint_mossy)
otherwise it sounds ok at first glance
ok i was confused if it was possible to list multiple game state queries in the condition field there are no examples in the wiki page/
you are doing that
multiple queries separated by commas
they'll be AND (only true if all are true)
there are examples in several places
hmm i feel like when i put LocationChanged as the trigger it doesn't work
however, in the wiki, you find things only when you know they exist
I have to save a day then it works
trigger action don't care about CP update rate
they care about trigger
ah yes sorry i misread
hmm
if (Game1.objectData.TryGetValue(base.ItemId, out var data) && data.IsDrink){ }
i haven't used the location changed trigger, so i can't tell which restrictions it may have
possibly one of your condition wasn't true before sleeping, but now is
Oh my god it works, thank you, you're my saviour
when referencing players I need to follow the wiki here```json
Target player
Some conditions have a <player> argument. This can be one of...
Any - At least one player must match the condition, regardless of whether they're online.
All - Every player must match the condition, regardless of whether they're online.
Current - The local player.
Host - The main player.
is a the Player_Stat weedsEliminated condition of 2000 too much to unlock a green rain summon?
you should first check that the stat is used in the first place
(on mobile so can't, but lots of stats are actually unused)
also just noticed the typo in your original post, should be Current not CurrentPlayer
try fixing that, and if it still doesn't work check that it's actually incremented with the getstat console command
How do I resolve Possible dereference of null without doing this:
public override void Entry(IModHelper helper)
{
...
helper.Events.Display.MenuChanged += MenuChanged;
...
}
private void MenuChanged(object o, MenuChangedEventArgs? args)
{
if (args is not null)
{
if (args.NewMenu is not null)
{
}
if (args.OldMenu is not null)
{
}
}
}
I know there's got a be a better way but MS's docs aren't necessarily helping.
I don't think OldMenu and NewMenu could be null? But I'm guessing the editor isn't aware of that?
you can do null forgiving args?.whatever
args shouldn't be nullable, but the sender object can be
i'm not sure i've ever used the sender
Ahh, okay, that makes sense
Also, if you actually did have to do something like this, early returns read nicer (to me)
if (args is null) return;
...
That way you don't have to keep indenting to match for a bunch of conditions
(SMAPI explicitly passes in null for the sender in MenuChanged, for what it's worth. I think it does for all of them.)
// raise event
foreach (ManagedEventHandler<TEventArgs> handler in this.GetHandlers())
{
Context.HeuristicModsRunningCode.Push(handler.SourceMod);
try
{
handler.Handler(null, args);
}
(SMAPI has code docs you can inherit on your event handlers, which provide more info.)
/// <inheritdoc cref="IGameLoopEvents.UpdateTicked"/>
private void OnUpdateTicked(object? sender, EventArgs e)
(I also forgot about those docs!
)
You mean there isn't a pufferchick diligently delivering my events?
They help. They're there to handle the popping: Context.HeuristicModsRunningCode.TryPop(out _).
Because they're spiky.
They can be. The possible scenarios are:
scenario | old menu | new menu
----------- | -------- | --------
open menu | null | non-null
close menu | non-null | null
switch menu | non-null | non-null
Just make it so you get warnings on undocumented functions
Then you allllways know
Also your repo has 1k unresolved
Hi, what size should a machine sprite be?
always 16x32
they are Big Craftables
(there are frameworks that allow for bigger machines, but basics first)
Ok Thanks
Hi there! As someone who's got minimal modmaking experience, I was wondering where the best place to start would be for making a personal set of custom Community Center bundles. I know there's a few mods to change CC bundles, but I'd like to be able to tailor them to my own mod list. Is this a feasible project for a beginner? Are there any mod dependencies I would need? Or am I biting off way more than I can chew?
I've edited some jsons for personal use, so I'm somewhat familiar with the structure of a Content Patcher mod, but I don't have enough experience to know what's doable and what isn't. Any advice would be greatly appreciated.
With cc bundles you need to be somewhat careful, as they are only properly loaded on save creation and then stored in the save file, so editing them mid-save causes BadThings™️
you can do it with just CP. Bundle data can be a challenge to write correctly, and changing it midsave or writing it wrong can brick a save
I wouldn't say it's "easy" but I think you can do it if you try
Okay, that's good to know. So I should avoid editing bundles mid-playthrough. I'm glad to hear I can accomplish it with just CP, hopefully I can learn the proper structure, maybe I'll be able to reference other bundle-editing mods to help get it right. Thank you for the responses!
I have a question about event creation:
I have an event where i want to fade to black, move some npc's around and then fade back into view. My current code looks like this:
/globalFade 0.02/viewport -1000 -1000 [STUFF] /viewport 38 5 /globalFadeToClear
But when coming out of the fade, it flashes one full frame of the new scene, back to black, then fades in. How can I get a more seamless fade-in?
Try putting the viewport 38 5 command after the globalFadeToClear one.
Hello, is there a way to add conversation topics without hard coding? I havent been able to find a way to add new triggers/cannot figure it out
Conversation topics and triggers are different things. You can add new conversation topics via dialogue, event commands, and trigger actions. You need C# to add new triggers.
dang okay thank u!
(though you can go pretty far with just the vanilla triggers)
(Button's BETAS mod also adds a bunch)
Ive tried that, then the fade doesnt happen (it fades to clear on the black viewport, and then switches viewports)
(what triggers do you want?)
im trying to add a conversation topic for before my new npc comes to town
what would trigger this would be after donating 3 items to the museum
That's the order in which mine goes and it works as intended. Oh, it's because you don't have the [continue] argument set to true. Change your globalFadeToClear to this: globalFadeToClear 0.007 true and try it again.
that's totally possible with day started + MUSEUM_DONATIONS condition
unless you have a niche case where you need a trigger to happen nao!!! day started/ending + condition should suit most of your usecases
Hi there! I'm brand new to coding and have zero clue what I'm doing. I'm trying to recolor the blue chickens and the babies using the "Alternative Textures" mod and Content Patcher, but Content Patcher can't read my content.json file and I don't know what I'm doing wrong. Here is the SMAPI log link if that helps: https://smapi.io/log/067da5b847a748109087cf54c9217df9
Log Info: SMAPI 4.2.1 with SDV 1.6.15 build 24356 on Microsoft Windows 10 Home, with 13 C# mods and 5 content packs.
Suggested fixes: One or more mods are out of date, consider updating them
There's also LocationChanged for the trigger, plus BETAS adds a ton of new triggers. And spacecore has a time trigger.
Is there an example i can look at in the unpacked
i mean there probably is where do i find them
Data/TriggerActions.json
For trigger actions? Data/TriggerActions
tyy
!json post your json file
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.
Your content.json is formatted incorrectly. If you share it the way Selph asked we can point out where and how.
Please use the website like the instructions say :)
Thanks! That fixed it
I'm planning to making a three goth triplets sisters custom npc and I'm struggling to find a name because their current names could be belong to preexisting custom npc
missing comma at the end of line 7 and 25
The FromFile fields are all wrong, too. I also don't think there's an Update field in CP?
Is this a mishmash of CP and AT? Or something from AI?
ah yeah I wasn't paying attention to the syntax
AT and CP use different formats entirely
you don't use content.json when you're making an AT pack
You can't make a mod that's a CP mod and an AT mod.
(Oh I was wrong about Update though. I thought it was UpdateRate but it's just Update. However, there's no OnPurchase update rate.
My first attempt on making mod would be a custom npc because I like creating characters
Also If there's two custom npc with the same name would the game capable on specifying which one (like if they're making help wanted request)
from a technical perspective, if you give your NPC an internal name like {{ModId}}_CoolGuy you wouldn't have to worry about another mod that also names their NPC CoolGuy
from a personal perspective... idk do what you want haha
Just use the names you want to use rather than worrying about whether they belong to another NPC. Like Selph said, you give your NPC a unique internal name anyway so they don't clash in game.
when i do this, i usually use viewport 38 5 true to do the fade in, and don't use globalFadeToClear at all
The Update field would be for stuff like 'OnLocationChanged' and 'OnTimeChanged' (and 'OnDayStart)
CP used to have FromFile but its long deprecated and format 2.6.0 wouldn't be able to use it (and was never an array)
also editing an image on purchase doesn't make sense
There was once a spreadsheet wrt to npc names
Btw their names are Lily, Maria, and Alice. I thought that was a cute name for goth triplets
My personal opinion is that tbh is fine to have npcs share names
idk what any of this means - i've tried using the help pages from both to build it but idk what terms to use or how this works
And also the whole thing with compat is a little overblown as long as you stick to good practices
I highly, highly recommend adding the ModId to your internal NPC name; someone recently released a Zayne NPC, and their mod doesn't load with Ridgeside Village because they both use just Zayne for their NPCs named Zayne
Players can indeed choose between two mods and tbh installing every npc mod under the sun would be a lot
What's the true? Unfreeze?
You need to make either a CP mod or an AT mod. CP fields do not work in AT mods and vice versa. Since you want to make an AT mod, just use documentation from AT, nothing from CP.
but yeah I'd add my own two cents as well, and say that you should name your NPCs however you want 
i thought it was "fade in" but i don't really know tbh (insert gripe about forced true/false and not letting us use words to indicate meaning /lh)
i tried to do that but the examples that AT provided showed no content.json files, so i moved mine away to see if it worked and content patcher wouldn't load it bc there wasn't a content.json file
That's because, as mentioned above, AT does not use content.json files. That's a CP thing.
!ArgUtility.TryGetOptionalBool(args, (action == "clamp") ? 3 : 2, out shouldFade, out error2, defaultValue: false, "shouldFade")
I recommend that you download an existing AT mod which retextures chickens and copy what it's doing.
also at risk of confusing you further I should point out you don't need AT to add animal skins, you can use CP skins and the AT tool will work with those as well
I wonder why the wiki refers to an unfreeze argument. And also that Atra says that its purpose is to make the camera follow the player.
(Yes Atra I am throwing you under the bus :P)
but what if I do want every npc mod under the sun (that doesn't rely on manual filesystem changes coughPortraiturecough)
someone should install every NPC mod and take note of incompat issues like duplicate internal names or overlapping festival positions /lh
Initial viewport function?
players can choose between two mods, but i'd rather reserve that for things that are fundamentally incompatible (editing the same resource in contradictory ways) and not incompatible for arcane reasons (two people chose the same name for their OCs)
Oh there is unfreeze too. I have no idea how to read this to be able to tell what order these arguments should go in.
Nooooo 😭 whyyy
the viewport command is pretty fucky /lh
somethingsomething "But mods already expect our npc name to be not namespaced so it would be a compatibility issue if we changed it"
Think of peaches the cat
This means sheku has to maintain my mods now
I’m lucky it was a bus, then?
Well I know five different Ben's so
You're permanently off the hook until you get tenure
the beauty of only having one NPC with not so many downloads when 1.6 came out is i was free to move to the new convention and discard the old ways with basically zero collateral damage
Hrmph
I know at least four 🤔
There is likely overlap
Baldur's Village used to have that issue as well, they didn't use ModIds and while most of their NPC names dodged incompat issues due to being wacko DnD fantasy names, one unfortunately didn't (Aurelia)
Surely not
they seem to have fixed it though
I'm very serious
Life goes on despite academia!
are you sure about that
Elizabeth are you trying to talk Atra into making you maintain their mods xD
the viewport command in 1.6.15 appears to have at least 5 main permutations of how its arguments work
viewport move <int directionX> <int directionY> <int duration>
viewport <string NPCTarget> clamp [bool shouldFade] ['unfreeze']
viewport <string NPCTarget> [bool shouldFade] ['unfreeze'] (This permutation looks like it has a bug, as shouldFade and option both read index 2)
viewport <int positionX> <int positionY> clamp [bool shouldFade] ['unfreeze']
viewport <int positionX> <int positionY> [bool shouldFade] ['unfreeze']
oh, i didn't know about the NPC ones. cool, even more cursed than i remember
NPCTarget can also be player
what happens if I add an NPC with the id player
position = ((!(NPCTarget == "player")) ? @event.getActorByName(NPCTarget).TilePoint : Game1.MasterPlayer.TilePoint);
alas, poor player
at a glance this is missing the optional actor safeguards that many other commands gained in 1.6
Thank you for this. I've managed to do okay interpreting many of the commands to update the wiki for them but viewport is definitely challenging for my current level of C# knowledge.
what's the best way of adding new furniture to the game?
this also exists
Do you need a framework or can it just be done with an edit?
edit
Just CP
Awesome,thanks!
Ah option is only used in one way, and it is unfreeze
You can use Furniture Framework if you want ~fancy~ furniture.
I feel like you wouldn't want the camera to follow an optional actor anyways
viewport doesn't follow just sets the initial position, so having a fallback if kents not in the game yet would make some sense
clamp looks like keeping the camera inbounds of the map size
also hardcoded behavior for a specific event just for the icing on top
if (@event.id == "2146991")
{
Point grandpaShrinePosition = Game1.getFarm().GetGrandpaShrinePosition();
targetTileX = grandpaShrinePosition.X;
targetTileY = grandpaShrinePosition.Y;
}
that's it I'm, making a new viewport command that works off map properties
I wish it was like TAS where it just has all the arguments in one long line (I pretend the end arguments of TAS don't exist for this complaint) instead of it being contextual
(tbf last time I tried parsing it i clocked out too so you're not alone)
hi Button. You do it
im still on vacation
tbh it shouldn't be 3 commands in a trenchcoat
(I just got home....)
I'm soooo tired
I still have to do laundry
god help me
someone yell at to get up off the floor and hang up the wet clothing
(event timecube is expected to have some viewport commands, if i ever release it)
I love you ichor
The ones with the different first argument are easy enough to split on the wiki, I guess, but the ones with the same first argument but then different later arguments are 
I'm at least glad I'm reading the pathos 1.6 variant with ArgUtility and not whatever hell the 1.5 one would be in the giant ternary/ifchain
for this I'm making the inputs to the next function I write a BitArray
you set specific bits for specific functions
bit flags are great
GO! Begone! Laundry!
the third bit blows everything up btw
Bitwise flag enums are the best I love them
ahhhahaha you think I have enums
I have laundry to do too. Atra, join me in leaving for laundry land.
Past atra: "oh, I'll get home super late, let me use the timer function on the washer so I'll be efficient."
Current atra: melted goop on the floor
tbh its mostly well behaved
the only main index difference is int positionX int positionY vs string NPCTarget but in code positionX positionY is just point position (that would take up 2 indexes)
and then the clamp option in the middle offsetting everything after it
this is why Event Data Model™️ should happen, so event arguments aren't just a string[] and have keyed arguments instead
It's not so much about how it behaves as how to clearly explain it on the wiki that I am thinking of
(My washing machine is on now, I did actually leave for laundry!)
[
{
"Command": "Viewport",
"Type": "move",
"Direction": "10, 10",
"Duration": "1337"
},
{
"Command": "Viewport",
"NPCTarget": "Abigail",
"Action": "clamp",
"ShouldFade": true,
"Option": "unfreeze"
},
{
"Command": "Viewport",
"NPCTarget": "Abigail",
"ShouldFade": true,
"Option": "unfreeze"
},
{
"Command": "Viewport",
"NPCTarget": "Abigail",
},
{
"Command": "Viewport",
"Position": "10, 10",
"Action": "clamp",
"ShouldFade": true,
"Option": "unfreeze"
},
{
"Command": "Viewport",
"Position": "10, 10"
}
]
So is it a list of dictionaries?
i was thinking about Event Data Model and while i would probably like having it, i pufferfear at what the vanilla XML would look like
https://smapi.io/log/fbe33ee33da84d509bb5b0c9214cbd62
https://smapi.io/json/content-patcher/7179d07d20c046aba9b4107d4a135269
okay, i've decided to only try and emulate a CP chicken reskin, but now it's showing me these errors in the log. i'm trying to get multiple textures to be randomized when you purchase the blue chickens
Log Info: SMAPI 4.2.1 with SDV 1.6.15 build 24356 on Microsoft Windows 10 Home, with 12 C# mods and 5 content packs.
Suggested fixes: One or more mods are out of date, consider updating them
(For what it's worth, this is the new event argument spec for the viewport command in 1.6.16.)
[EventArguments(
"'move' -int -int int", // viewport move <x> <y> <duration>
"word bool? 'unfreeze'?", // viewport <actor> [shouldFade] [unfreeze]
"word 'clamp' bool? 'unfreeze'?", // viewport <actor> "clamp" [shouldFade] [unfreeze]
"-int -int bool? 'unfreeze'?", // viewport <x> <y> [shouldFade] [unfreeze]
"-int -int 'clamp' bool? 'unfreeze'?" // viewport <x> <y> "clamp" [shouldFade] [unfreeze]
)]
even just splitting the big string of event data into individual strings would surely get us a million <SeparatedEventCommand></SeparatedEventCommand>, the kind of nonsense that XML is famous for
is the index issue on !ArgUtility.TryGetOptional(args, (action == "clamp") ? 4 : 2, fixed to be 3 instead of 2?
Shhh don’t let Atra know
Was that reported? I can fix it now though.
probably not, only found it due to trying to figure out what valid permutations are allowed in 1.6.15
considering how I don't know if anyone knew the actor targetting existed, they wouldn't find that clamp is mandatory for it to not cause issues (if you also wanted one of the optional args)
that's still 100% wrong
Your FromFile format is still wrong, there's still no OnPurchase Update field value, and you're targeting an AT pack. I'm afraid none of this is correct for how a CP skin works. I recommend finding a mod that does what you want and make just one change to it - using your own texture. Only once that is working should you then try for having different skins.
(if you were using AI for it, pls dont)
i'm not, i'm just stupid and have no idea what i'm doing. i literally only picked this up 2 days ago
idk wat any of this means, i just want my funky chickens lmao
Then please listen to our repeated advice that you find another mod and copy that instead of doing your own thing.
Hey
okay i get why you're saying i'm still using AT, i posted the wrong link. sorry https://smapi.io/json/content-patcher/9725b7591cd24301b99cc9ad311f0b3f
this is what i just tried to do copying a cp reskin mod
As mentioned already, that is not how FromFile works. You cannot format your FromFile field that way. https://github.com/Pathoschild/StardewMods/blob/develop/ContentPatcher/docs/author-guide/action-editimage.md Have a look at the example on this page to see how your FromFile field should look.
I thought you were off doing laundry!
It's a start, but when I said copy I meant copy and past the entire thing exactly and then change nothing but the path in the FromFile to match your own one file (you can only specify one file in FromFile without tokens and you should get just one thing working in game before you try to explore anything like tokens, imo).
It's donnneeeeeer
I'm now doing thr dishes
okay see, i didn't know that i can only do one FromFile path. when i say i know nothing, i mean literally nothing. no basics, no bare minimums. i'm just trying to do what y'all say but i'm perpetually confused about everything from terms to limitations
y'all are wizards lol
I understand you saying that. Many of the people who ask for help in here are the same way. However, I have said about four times now that you can't format your FromFile that way and if you didn't know what I meant by that it was incumbent on you to ask, please. It gets frustrating to have to give the same advice repeatedly.
I want you to be able to have your random blue chickens. It's great to be able to have an idea and see it in game.
i'm sorry. i don't really know what to ask tbh, but i'll try
Basically if anyone giving you advice says something and you don't know what it means and/or what to do because of it, ask for clarification ^_^
ok!
OK HOLY SHIT IT WORKS WITH THE ONE TEXTURE!!!
now how do i get it to randomize them all? what are tokens and what do they do??
https://smapi.io/json/content-patcher/d94b35b56fe945b18216447be2d75092
thank y'all too omfg. ik i probably sound like a moron lmao
so you can make it so that Animals/Blue Chicken is randomized from one of multiple images. however the problem with that approach is that every of your blue chickens will switch over to that texture.
if you want your blue chickens to choose from one of multiple textures, you would need to
- load multiple PNGs, each to their own
Target - edit the blue chicken in
Data/FarmAnimalsto add a skin for each of your loadedTargets. this is somewhat more advanced
Look at https://stardewvalleywiki.com/Modding:Animal_data, the skin section specifically. once you know what kind of edits you want, check out https://github.com/Pathoschild/StardewMods/blob/stable/ContentPatcher/docs/author-guide/action-editdata.md#target-fields to see how to do targeted edits to Data/FarmAnimals
oh, and unpack the game to see what Data/FarmAnimals look like if you haven't already
!unpack
Follow this guide to unpack the game's content files in order to see and explore how the game data is structured.
It's helpful when making your own mods, or just to learn about how the game works!
i did do that!! and i think what i'm thinking of is the "alternate purchase type" and maybe the "egg hatch id". i use a mod so the blue chickens produce blue eggs
I wouldn't recommend alternate purchase types since you'd be adding a new chicken type entirely, and have to duplicate all the fields (including produce)
instead, add new Skins to the Blue Chicken
ok yeah! i'd want them randomized on purchase so you don't know what color you're getting until you go see them in the coop, like a surprise
Look in Data/Buildings to see examples from vanilla. It shows how to format it.
there are no examples of Skins usage in vanilla, but I recommend looking at this mod on how to use the skin system: https://www.nexusmods.com/stardewvalley/mods/20043
where can i see that? is it from github? i dont any links regarding that
!unpack Have you not unpacked your game files? It's much easier to make mods when you can see the game's content.
Follow this guide to unpack the game's content files in order to see and explore how the game data is structured.
It's helpful when making your own mods, or just to learn about how the game works!
i have, but i dont know where to look
It's exactly where I said. Data folder, Buildings file.
Ok so I have a map patch that applies when I've completed a bundle (UB) and I logged onto a save where said patch WAS applied but now it isn't and i had to do the bundle again. I'm trying to replicate it on another save to find out the problem but it won't happen again. Has anyone else had this issue?
finishing up my green rain summon bundle
one mossy seed is probably too little for the unlock..
green little junimo
Wait. I've replicated the error. I did debug nd in another location and the map unpatched itself but no bundle is present
but still my green rain summon logic doesn't trigger every time and sometime's only regular rain appears.. what could be wrong with my C# code...
Anyone here have experience with Unlockable Bundles?
I’m overriding the standard summer-only green rain behavior so that it can be triggered in other seasons via the summon.
Yes I am experienced using UB
Do you know what my problem might be? My map patch for completing a bundle is undoing when i sleep somewhere
I have, it was applied
And i used debug nd in another location and pre patch appeared
"When":{
"DLX.Bundles/Purchased":"MyModName.Prerequisite" //(!)
},
add the bundle name
then do ```json
"Update": "OnLocationChange", //or OnDayStart
also where is the map patch?
is this in town by any chance?
And this is all in Bundles.json? My map patch is in the folder with all my custom maps
Nope, it's a custom location
well I usually just use the ShopEvent
patch summary "<content pack ID>" and check on the status of the map patch
Using the ShopEvent field, you can create an event, and within the event script, the custom command UB_ApplyPatch allows you to apply the EditMap patch
It says replaced asset
But it's showing up as the pre bundle completion area
log?
I'd rather not as I'm making an expansion and my current log has a lot of spoilers for it haha
It's just strange to me as the patch was applied and now it's undone, but with no bundle to click on
I would just make sure a flag is being set or a dynamic token and then use that as the main condition for the map patch.
then set a priority level for the patch
perhaps the query is unnecessary?
https://smapi.io/log/bc9a2a48feb54d1b9b5f998b6e76f06f
https://smapi.io/json/content-patcher/180dc09a15c9476eaeb8c32950179273
ok!! i've nabbed their code and modified it to what i think should be happening, but copied the format near exact i think, yet it's giving me another error
Log Info: SMAPI 4.2.1 with SDV 1.6.15 build 24356 on Microsoft Windows 10 Home, with 12 C# mods and 5 content packs.
Suggested fixes: One or more mods are out of date, consider updating them
you're missing the closing ] between the last two }
every opening brackets must have a matching closing bracket
if you're not already, I also recommend using a text editor with JSON error highlighting built in
oh whoops, can't believe i missed that
does notepad++ do that? that's what i'm using rn
I'm not sure, sorry (I don't use it)😅 but maybe searching around can yield something
It does!
alr well tysm for holding my hand as you walked me through that!!! i'm sorry if i ever came across as abrasive or ungrateful, i was just super frustrated earlier to the point of tears lmao. brand new respect for software coders bc holy shit this is difficult
where can i see that??
https://smapi.io/json/content-patcher/184d351a1b43483b895fe281cac40b9f
im having an error
You're missing the closing square bracket for your changes field.
ok another question: when smapi says "line 115, position 7", what does "position" mean? is that the number of the character that's causing the error or something else?
I ended up figuring out the problem. I was using CJB to change seasons for another reason and forgot to change the year, meaning it wasn’t more than 1 day since bundle completion lol
Yes, but the error is often on the line above it, especially if it's a bracket or comma being the issue.
https://smapi.io/json/content-patcher/0d9dec0ec1f64a739f336e1fc4c67d9f
ok then i'm not sure why it's saying that, since position 7 is the "i" in "FromFile" and the ending "t" in "Target" above it
It's because your Target line (the one above it) is broken. After PinkBaby you've got , Mods, instead of a ",.
oh whoops, ig i didn't completely clean that up. ty!!
OH MY GODS IT WORKS!!!!!! thank you all so much for your help!!!!!! <3333
is there a way to make modded npcs use their sleep sprites when they go to bed in the farmhouse?
I could be doing something wrong I guess but his sleep sprite works normally in his regular bed
and all spouse schedules are supposed to end with "bed" so i cant use the "sleep" option
is this normal??
Have you defined npc_sleep in the animation description?
!log
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.
hyper cropped screenshots obfuscate what the true problem is, but is there a Content Patcher load for Maps/LowerGarage?
AFAIK bed automatically tries to use the NPCName_sleep animationDescription entry for the given NPC, as well as applying the inability to talk to them while they are sleeping.
I was told it was supposed to just be 'sleep' but i do have this...
ohhh
huh
why was I told just to use sleep then
weird
I will fix this later then :) thank you
i have 2 tmx files, LowerGarage and UpperGarage, but only the UpperGarage is working
the mod works fine but it's showing this
What does your Data/Locations entry for LowerGarage look like?
wait im gonna send the whole json
Ah, that looks like the texture for the building isn't loaded and referenced correctly.
Anything that references a Texture or MapPath in the code needs to be loaded with an Action:Load to a Target (which is then used for the Texture or MapPath) so the game thinks its in the game files rather than just in your mod folder.
Your MapPath for both your location patches are incorrect. They should be "MapPath": "Maps/{{ModId}}_UpperGarage", not "MapPath": "assets/maps/{{ModId}}_UpperGarage" (same for LowerGarage).
gotcha thank youuu
Is this the intended target for the lower garage? Maps/{{ModId}}_\t
Figured I would ask because that doesn't look quite right
Your texture for your garage is also wrong - it needs to be Buildings/{{ModId}}_Garage, plus you're still not using {{ModId}} everywhere that you need to be. Your IndoorMap field is wrong too, it's pointing to Garage but it needs to be {{ModId}}_UpperGarage/{{ModId}}_LowerGarage depending on which one you want the indoor map to be.
And like Lily said, your target for the lower garage is wrong. You had it correct earlier.
nope, i accidentally deleted it
this the video if i can send it
it keeps returning me to the title screen
the stradewvalley.shed thing is fix now
Your TMX is missing the Buildings layer
!log also please use this to pull the full error log instead of using screenshots, it makes things easier to investigate
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.
thank you
Does anyone know of a way to intercept base game specific HUDMessage and edit it?
it depends on which one tbh. Do you have a specific one in mind?
if (Game1.objectData.TryGetValue(o.ItemId, out var data) && data.IsDrink)
{
if (this.IsLocalPlayer && this.hasBuff("7") && !overrideFullness)
{
Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\StringsFromCSFiles:Game1.cs.2898")));
return;
}
this.drinkAnimationEvent.Fire(o.getOne() as Object);
}
else if (o.Edibility != -300)
{
if (this.hasBuff("6") && !overrideFullness)
{
Game1.addHUDMessage(new HUDMessage(Game1.content.LoadString("Strings\\StringsFromCSFiles:Game1.cs.2899")));
return;
}
this.eatAnimationEvent.Fire(o.getOne() as Object);
}
This is in Farmer.cs
I want to change addHUDMessage to be showGlobalMessage instead
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
Would it cause error if you set an custom npcs birthday at festival days
Why would you want that? Genuine question
it works, might abandon the idea of getting to the upper floor by the ladder
Idk just asking
Putting aside potential errors, I don't see why you'd want to do it. If it's a festival like Night Market then go for it ig but a regular festival? I just can't envision it working
Hello.. i want to ask about how would the portrait switching using the speak command works?
I don't think there'd be errors, you'd just make it difficult to give the NPC a birthday present.
Do you mean how to use different portraits in dialogue? https://stardewvalleywiki.com/Modding:Dialogue#Portrait_commands
👆 You also use portrait commands to switch portrait when they're talking in events.
thank you! 
I actually managed to do it without Harmony, kinda. Achieving the same effect, from my testing this seems to work, but now i'm worried it's performance strain on the game since it runs that thing 60 times a second (am i understanding this right?), I wonder if there's better event to put this kind of thing on that would have good timing
as someone who has put draw stuff on the updateticked event before, I don’t think this should be too intensive but I can say you definitely can have some performance impact so it isn’t ideal either. Honestly though if you figured this out you can 100% figure out harmony
this is my first time modding stardew and first time programming in c# and first time using visual studio i dunno
😭
dw, most mod authors were in exactly the same position when starting
I definitely was
I wonder if there’s a performance impact to putting that RemoveHUDMessage function nested inside the UpdateHudMessage method or if the compiler optimises that away 
I assume the latter but still interesting
Is there a way to test the performance impact?
it would be negligible either way so probably not
ig you could make a method with a thousand nested functions in it, bind it to updateticked and see if it lags lmao
Is this where I can ask about making a mod and finding out how hard making said mod would be? I haven't been in this server long
yup. What are you trying to make?
So I have SVE and Sunberry village and that gave me access to plots of land im able to have animals on. In the menu like where you go to check to see if you've petted them or not I would like to somehow create a little Divider
for example
Name of farm:
Animal 1
Animal 2
etc.
Grampleton fields:
Animal 1
Animal 2
etc
Sunberry village farm:
Animal 1
Animal 2
etc
Smart
I have alot of animals and sometimes it gets a little frustrating for me when I have like a cow on MY farm that I thought I petted but I didn't bc in the menu its kinda scrambled and it just has All my animals without any distinction on which animals I have where
Do you have any C# knowledge? That'll be a C# thing.
I thought the animal menu in 1.6 already showed if you petted animals or not (but I haven’t played 1.6 much so I could be wrong haha)
Sighs in sadness No 
It does, you are misreading :P He wants a way to split the animals up depending on which farm they are on so they aren't one long list in the menu.
^^
Well, you can always learn!
I'm learning C# via Stardew modmaking
(In large part due to iro's patience in teaching me concepts
)
ah, I see
it sounds interesting!
oo
I plan to learn in the future but there are alot of irl things that need to be taken care of atm
I would say that this is probably fine, but there is obvious duplicate work
And it's pretty spammy on the garbage collector
It's not something a player would notice but it's another part of the death of a thousand cuts modded game performance tends to have
Oh wait, hud message to global message (I thought it was refreshing a hud message) sorry
i'm opening tiled for the first time to try making a farm map and i'm not sure where to start! i've made a copy of the unpacked farm.tmx and ive got it open in the editor but i'm not sure how to. do anything else >m<
a farm map is a more difficult thing to tackle for a first tiled project. it requires special loading circumstances too. you may want to start with something more simple like a room?
yeah thats a good start
you'll want to take note of what is put on each layer- back is the floor, building is objects with collision, front you can walk through but will render in front of you if you're behind it, and always front will always render in front of all tiles and sprites
gotcha!
adding tilesheets can be tricky but if you're just using town interior to start you likely wont need to yet, though if you do try it and run into trouble feel free to ask
thank you very much for your help! i'll let you know how it goes
we're going to ignore the fact it took me 3 business days to figure out how to open the tileset pane . 
the buildings layer of the base farmhouse looks so odd O.o
Hi ! I've just entered the discord server ! I wanted to know if someone could help me with modding a new datable npc in the game ! I already looked in the stardew wiki but I don't understand where should I actually start ? Like for example they say you have to write the name of the character, the gender and age... OK but WHERE ? I don't understand a lot of things actually I'm all new to modding and I've never coded before so yeah...
!npc
Keep in mind that making NPCs is a complex process that requires learning many different aspects of Stardew modding.
Here are a few links that can help get you started on all that you need to know:
-
Tiakall has a great tutorial on making a custom NPC for 1.6.
-
NPCs no longer use dispositions, check the wiki page for the new NPC data.
-
Aviroen has put together a template that will allow you to easily create a romanceable NPC.
-
Feel free to jump into the https://discord.com/channels/137344473976799233/1277457201077813280 thread for more interactive feedback and help!
-
Fireredlily has a WIP NPC Builder Please do report any errors you get with it into the NPC thread!
you would want to make a content patcher mod to edit those data
!startmodding check out the guide to content patcher in general in conjunction to the resources above
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.
(you dont need to touch C# unless you have some very specialized needs)
yeah I downoalded the content patcher on nexus, I will see the guide you just sent me thx !
The current state of the mod I'm currently working on, the main issue right now is the the warp from the lower door to the upper door doesn't when it is setup properly, it also does not say that it can not load it when in fact with debug the location can load. If someone has any idea on what could be wrong please tell me, taking a break for now
(C#, transpilers) looking for some help with CodeMatcher and its Repeat method.
i have a simple codematcher transpiler that looks like this:
MethodInfo getplayer = (reflection...)
MethodInfo countcall = (reflection...)
CodeMatcher cm = new(instructions);
cm.MatchStartForward(
new CodeMatch(OpCodes.Call, getplayer),
new CodeMatch(OpCodes.Ldfld),
new CodeMatch(OpCodes.Callvirt))
.RemoveInstructions(3)
.InsertAndAdvance(new CodeInstruction(OpCodes.Call, countcall));
return cm.InstructionEnumeration();```
which works fine (the reflection boilerplate i have cut out is working correctly).
i'm trying to use Repeat, since there's a second match and i also want to replace that one. when i change it to say:
CodeMatcher cm = new(instructions);
cm.MatchStartForward(
new CodeMatch(OpCodes.Call, getplayer),
new CodeMatch(OpCodes.Ldfld),
new CodeMatch(OpCodes.Callvirt))
.Repeat(matchAction: m => {
m.RemoveInstructions(3);
m.InsertAndAdvance(new CodeInstruction(OpCodes.Call, countcall));
});
return cm.InstructionEnumeration();```
... it compiles, but crashes like so when applying the patch:
```System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> ArgumentException: Bad label content in ILGenerator.
at System.Reflection.Emit.ILGenerator.GetLabelPos(Label lbl)
at System.Reflection.Emit.ILGenerator.BakeByteArray()
at System.Reflection.Emit.DynamicResolver..ctor(DynamicILGenerator ilGenerator)
at System.Reflection.Emit.DynamicILGenerator.GetCallableMethod(RuntimeModule module, DynamicMethod dm)
at System.Reflection.Emit.DynamicMethod.GetMethodDescriptor()
--- End of inner exception stack trace ---```
what have i overlooked?
that's intended, or at least the game doesn't handle what you want yet
warping outside of a building interior will always deposit you next to the warp
if you wanna change that that's C#
oh yeah, re: second floor in an instanced building interior, that's also not supported
the second floor has to be on the same map
thanks for that, I thought I'm missing something lol
My guess is one of more of those has a label that a jump is pointing to, and when you remove it the jump is dangling.
a now-missing label is also what i was going to suggest looking for
ah, that would make sense. thanks!
i thought maybe i had missed some necessary bit of boilerplate
Try adding an empty CodeMatch in your MatchStartForward
That'll set the cursor after your code edits
That's something that helped me with a weird Repeat situation before
the cursor is already moved forward by InsertAndAdvance
I know, but that's what I had to do
otherwise itd just be a potential infinite loop, not to do with labels
which is a different issue and one hes already accounted for with InsertAndAdvance
the code theyre adding doesnt add the same calls hes matching on anyway
My original code already had InsertAndAdvance
I know what you're saying is correct, what I'm saying is that adding it still helped
Like, you're right, but in this case it didn't matter
okay, anybody have the CodeMatcher incantation handy to move the labels from the cursor instruction to the new one i'll be putting in? 😅
This is what I would suggest trying:
CodeMatcher cm = new(instructions);
cm.MatchStartForward(
new CodeMatch(OpCodes.Call, getplayer),
new CodeMatch(OpCodes.Ldfld),
new CodeMatch(OpCodes.Callvirt),
new CodeMatch())
.Repeat(matchAction: m => {
m.RemoveInstructions(3);
m.InsertAndAdvance(new CodeInstruction(OpCodes.Call, countcall));
});
return cm.InstructionEnumeration();
Labels()/ForEach/CreateLabel?
Worst case, it doesn't work and you're back where you started. Best case it fixes the issue.
(i found the label i missed and deleted by mistake. it's almost certainly that)
but adding a random "match on anything" codematch is not going to fix a label error
i think there is an extension method for grabbing the labels and moving them though?
on CodeInstruction. dont quote me on that
There's a function with an out label
CodeInstruction.MoveLabelsTo()
or alternatively CodeInstruction.MoveLabelsFrom
or alternatively alternatively CodeInstruction.ExtractLabels if you wanted them on their own first
alt alt alt CodeMatcher.Labels
ive had weird issues trying to work with the labels directly before for reasons i cant remember so i just try to avoid working with them directly as much as possible personally
i'm going with MoveLabelsFrom for now. i broke it but it's progress. thanks!
I never figured out how to move labels so i been doing it like, overwrite the original instruction, insert the original instruction later
my repeat incantation looks like this now:
.Repeat(matchAction: m => {
CodeInstruction c = new(OpCodes.Call, countcall);
c.MoveLabelsFrom(m.Instruction);
m.RemoveInstructions(3);
m.InsertAndAdvance(c);```
i'm sort of cheating because i know it's the first instruction that has the label, but also sort of not cheating because this match is one line of C# so where else would the label be
(the repeat also looked like that when "i broke it", but i reloaded everything and it's working, so: shrugemoji good job everyone)
also i am on Team CodeMatcher now. it's much nicer than doing all the stuff manually.
if i ever need to rewrite my existing transpilers i'll convert them over
codematcher my beloved
CodeMatcher my behated
(Of course an atra prefers their own ilhelper but I can't use it anymore unless i revive atracore which isn't happening
Hi, could you help guide me? I've already designed the machine, but I need to know if this is the correct information for adding new machines. Also, would you recommend looking at a mod that integrates machines, like the Cornucopia or Wildflour Artisan Goods mods? I think those mods use special frameworks for certain functions, right? I'd also like to make the machine compatible with Automate.
yea that page is correct. you can also reference vanilla machines via unpacking
for automate compat, you don't need to do anything
you only have to worry about that if you're making entirely custom behaviors in C#
Anyone remember the console command to reload a mod? I forgor
patch reload YourModId
thank you
not the 16x16 thing?
!reload
- Content Patcher pack: enter
patch reload <your_mod_id>in the SMAPI console window. This will reload and reapply all your patches (but won't recalculate theConfigSchemaorDynamicTokensections if you use them). - Translation files: enter
reload_i18nin the SMAPI console window. If it's for a Content Patcher pack, also runpatch reloadafterwards. - C#: see the Visual Studio hot reload or Rider hot reload feature.
!json
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.
pixels, yes
I understand. I've edited machine functions like the keg and the dehydrator, so basically it's about editing those codes with the values I need for my machine, right? What I don’t know is what PFM and EMC are for, or if I should use them. I also saw that Wildflour uses Cauldron, but I don't really understand why.
PFM: pre 1.6 framework for machines, not needed anymore but still works
EMC: post 1.6 framework for extra features
Cauldron: a config mod for wildflour and hime's mods, you probably don't want that
you probably don't want that
unless you're by any chance wildflour or hime, of course
I think cauldron does have some frameworky bits but it's not all that documented
Haha no, but I want to make some things from their mods compatible, if they give me permission.
What does EMC allow you to do? Or where can I find a link that explains how it works?
Thanks
Usually stuff like extra fuels and outputs
I recommend not worrying about this and getting a vanilla machine setup first
Then you can look at EMC features and see if you need anything
so I tried to create some custom boots via content patcher and have them provide extra defense when worn in a certain location... however it seems to only apply when I spawn the boots while in that location, instead of wear them at that location. Is there a way to do what I want to do or am I out of luck?
Yes, what I want to do is input one material and get another, but if you input that material plus a fruit or other herbs, you get a flavored product. I'm not sure if that can be done without using a framework.
Yes, what I want to do is input one material and get another, but if you input that material plus a fruit or other herbs, you get a flavored product. I'm not sure if that can be done without using a framework.
You're out of luck
Maybe spacecore equipment actually
Not sure
(That's actually a case I have in atracore equips but I killed that lol)
Could I do it via a ring instead of boots since those are in data/objects?
Nope
OK thanks
You can do that in vanilla as long as you make new machine
I thought something special was required.
Custom flavored items ✅
Have a machine consume one kind of fuel ✅
Have different recipes on the same machine consume different fuel ❌ need EMC
To do modded flavored items you need to use PreserveId
🤔
okay, interesting. apparently cellars are created when a save is loaded, even if they don't have a corresponding cabin yet. they're not assigned, though, until a farmhand actually joins. after a cabin is built but before it gets taken, it actually has no cellar because it has no owner
Wow that is interesting
After over two years, I made my original meme into reality
And another one I've been working on
(And yes, it does work 😄 )
Hi so I'm creating a New NPC but I miss a point while looking the guides available on stardew modding wiki and the stardew vaalley wiki : I'm making my "content.json" file and I'm trying to do the "disposition" part. They say I should add this code Inbetween my [brackets] : // NPC Disposition - updated for 1.6
{
"LogName": "Jorts and Jean exist!",
"Action": "Include",
"FromFile": "assets/data/dispos.json"
},
so I guess I should write this code into the content.json file
but then
they say : Now we're going to create a new file that matches the FromFile name. I'm going to use Wren as an example here
with the code where you have to write the Display Name, Gender, Birthday.....
what I don't understand is where should I write this ? Is it still a .json file ? Why is it indicated FromFile : assets/data/dispos.json ? I don't understand because I thought that the dispos.json had to include the scheduling part
anyway I'm stuck I don't understand a thing about this part
and when I download a NCP from nexus as an exemple I don't see a file where there is everything about the gender, birthday and all
please I'm so lost it's my first time codding 
it's ok! you learn stuff and npc CAN be overwhelming at first
have you unpacked vanilla files?
!unpack
Follow this guide to unpack the game's content files in order to see and explore how the game data is structured.
It's helpful when making your own mods, or just to learn about how the game works!
you see what the FromFile says in the example, right? the last part is what you name your file(or the other way around, doesnt matter as long as it matches)
Technically speaking you can write everything in your content json. it will jsut be hell to find stuff in the long run if its a lot.
people therefore tend to make jsons to have more overview and sort different parts. for smapi to register those files you need to include them with that code above tho
when you use an npc from someone else as an example the way things are done can vary as its really personal taste on how to sort things and stuff
no I haven't, I didn't know I need to do that 
you dont need to but its always better to be able to see how vanilla did it
it's ok 🙂 it is very useful because you'll see how the vanilla files are done.
NOTE : the format is slightly different than CP (basically CP needs some extra context) but not too much
and it'll help figuring out structure of the data
okk so If I'm understanding right I can create any amount of .json files if I want to sort things by category like for exemple lets say a schedule.json file and write in the content.json to basically refer to the schedule in the schedule.json file
So after thinking about and researching this some more it looks like I should be able to at least run a trigger action string to apply or remove a buff based on my location and whether I have the boots in inventory, probably... maybe... does PLAYER_HAS_ITEM include equipped items?
oh yeah i mean just look at my own includes lmao, go wild
You're also welcome to reference and/or borrow code from Jorts and Jean (just change the content
)
You can also look at Wren but uh I don't really recommend her for a first timer because she's got a lot going on in her tokens
haha yes I was looking for Jorts and Jean while trying to code my NPC
also @next quarry you're hotmodding! 
Any ideas why my patch isn't applying on the days it should be? { "Action": "EditMap", "Target": "Maps/8BitAlien.Lilybrook_Park", "FromFile": "assets/Maps/ParkMTF.tmx", "PatchMode": "Replace", "When": { "DayOfWeek": "Monday, Tuesday, Friday" }, "FromArea": { "X": 0, "Y": 0, "Width": 114, "Height": 106 }, "ToArea": { "X": 113, "Y": 105, "Width": 114, "Height": 106 } },
It needs to be the whole map btw
so, first a tip to make it easier to find in patch summaries: Add a "LogName" that describes what your patch does,
Then, run patch summary asset Maps/8BitAlien.Lilybrook_Park in the SMAPI console to check if your patch condition is showing as met.
Will do that now, thanks!
Ok, it's saying it's applied. Why aren't my changes showing up then lol
are there any other changes being applied to the same map?
I have a separate EditMap action for the same map but no other patches
If for some reason this patch is happening too early, then the other EditMap action might be overriding it
you can add "Priority": "Late" to the patch you want to load last and see if that helps.
Sadly that didn’t work:(
people who know performance stuff: is it better to Editmap an entire large map or just load a fresh one? I seem to recall EditMap being expensive?
EditMap is expensive but largely invisible if you don't do time changed
is there anything in your error log?
No errors at all, just zero changes
and many times you can't really avoid editmap for compat reasons
If it needs to be the whole map, then you probably don't need FromArea or ToArea? It makes me wonder if maybe your patch is applying but it's applying beyond your map area.
Yeah, it looked like your ToArea was placing your patch outside the boundaries of the original map. 😛
FromArea and ToArea are more commonly used when you have a TMX that's a single section of your map and is smaller than the map you are patching it on to
So you can have a TMX that's just a single building, for instance, and use ToArea to position it on your bigger map
Hi (again haha) So I looked the Shiko NPC mod's files as an exemple to code my own and I don't understand why there's the target : "Target": "Data/NPCDispositions" but there's no "Data" file and no "NPCDispositions" files ???? is it normal ?
because its an old mod
Data/NPCDispositions doesnt exist in 1.6 and was replaced with Data/Characters
i would recommend looking at a newer NPC as example or using the NPC guide in the npc command
!npc
Keep in mind that making NPCs is a complex process that requires learning many different aspects of Stardew modding.
Here are a few links that can help get you started on all that you need to know:
-
Tiakall has a great tutorial on making a custom NPC for 1.6.
-
NPCs no longer use dispositions, check the wiki page for the new NPC data.
-
Aviroen has put together a template that will allow you to easily create a romanceable NPC.
-
Feel free to jump into the https://discord.com/channels/137344473976799233/1277457201077813280 thread for more interactive feedback and help!
-
Fireredlily has a WIP NPC Builder Please do report any errors you get with it into the NPC thread!
okk but what does it change ? do I need to create Data/Character files in my mod's folder in order to Target this location ?
I saw the stardew modding wiki but still struggle to understand where you're supposed to place the Data/Character
Follow this guide to unpack the game's content files in order to see and explore how the game data is structured.
It's helpful when making your own mods, or just to learn about how the game works!
Use that to unpack the game files and take a look at the vanilla Data/Characters.json.
I also looked at the vanilla files but still struggle to understand 😦
Maybe look at some 1.6 npc instead
Well, with the combination of the vanilla files and the wiki [[Modding:NPC_data]] page, you should be able to figure out what you're looking at
Brand new NPCs just need their own entry added to that same JSON, which you can do with an EditData patch in Content Patcher, with Data/Characters as the target.
When I search for "Data/Characters.json" in the vanila files I don't find anything :/
i found it thanks !
tia said you can look at jean and jorts earlier, why is do i see the mention of shiko suddenly O:
Seems like a lot of people try to update Shiko themselves for personal use, it's not the first time someone's come in trying to build based off Shiko.
Despite Shiko being way out of date and thus, a bad example
I have to directly add my new NPC in the character.json file of the game or I have to create a new character file ? I know it takes time for me to understand haha thank you so much for your responses
Have you read the documentation on content patcher?
you make a json like the include example you mentioned earlier and in there you put your own filled out version for your npc
chu, theyre also looking at tias tutorial btw
If you are using Content Patcher to create your own NPC mod (called a content pack), then Content Patcher actions virtually load your changes entries in the base game files in a non-destructive way at game load.
idk how to describe things well especially not as good as tia already does in that tut xD
So, your files are in your mods folder, and the actions tell Content Patcher where to add it in the base game file structure.
I downloaded Content patcher but I don't understand yet how I can use it lol Do I have to open the game while the Content patcher file is in the mood folder of the game ? I guess I will start looking at the documentation as you said, I don't know why I didn't do that earlier hahaha
Yes. Content Patcher is technically a mod and needs to be in the mods folder.
have you installed and used mods before? you test mods the same way
yeah but I thougt it was different with the Content Patcher
I'm looking through the patcher documentation it's already more clear for me lol
I was initially only looking at the Making a Custom NPC Tutorial on the modders wiki page without looking in details other ressources...
Yeah, a lot of NPC making requires prior knowledge of how content patcher works
Is there a way to grab a custom player_stat value and put it in a content patcher token?
yes but need mod (EMP should have it)
also consider setting a mail flag based on player_stat and use that instead
depends on what you want out of this basically, if all u need is stat > a number i vote for mailflag
OK, thank you. Actually now that I think about it I can get around the requirement.
what I want to do is... there is an item, and when I enter a certain location, the item is consumed. You then gain a buff based on the number of times you've ever consumed that item
I was hoping to do it with one trigger action or so but I think I can just create a group of them
yea so u either need the actual count to use with query
or u do a bunch of trigger actions and "upgrade" the buff every X number of times u ate the thing
"Id": "{{ModId}}_Triggers_AddGhostwoodPendantBuff",
"Trigger": "LocationChanged",
"Condition": "PLAYER_STAT current {{ModId}}_GhostwoodPendantsConsumed 1 1, LOCATION_HAS_CUSTOM_FIELD here {{ModId}}_isghostwood",
"Actions": [
"AddBuff {{ModId}}_GhostwoodPendantBuff1",
],
"MarkActionApplied":false,
},```
if there's a better way let me know but i don't mind creating a few of these. It's a difficult item to make so I don't anticipate having to make the ceiling very high
If PLAYER_STAT current {{ModId}}_GhostwoodPendantsConsumed 1 1, LOCATION_HAS_CUSTOM_FIELD here {{ModId}}_isghostwood ## AddBuff {{ModId}}_GhostwoodPendantBuff1
this does mean u parse all the GSQ every time tho
if u did it in multiple trigger actions u can use SkipPermanentlyCondition 
and its not that hard to do cus local tokens
do I need to acknowledge : Json Assets, Custom NPC Exports, Custom NPC Fixes and Schedule Editor in order to start modding my own NPC ? Or can I start for now with only Content Patcher ?
just CP
okk thx !!
JA is dead. And I don't think you really need the others anymore either?
What is Schedule Editor anyways
custom npc fixes was questionable if it was needed even in 1.5.6, and I also don't recognise Custom NPC Exports
I think they meant Exclusions
if it was exclusions, then cp can pretty much do all of it now
Is there an easy way to determine if a given texture is "fresh" or not? ie. detect if it's been invalidated without using the asset events
textures never get invalidated
the 'replacement' load will copy its contents into the old texture2d reference
Aaaah interesting
(This is new to 1.6)
So the answer is "no, but I don't need to anyways"
It's to simplify asset propagation
was it?
Yeah it makes a lot of things less complicated
Although it's kinda weird tbh because have fun if some asshole disposes a texture
Yup! Early 1.6 (originally written by podunk even)
So then what happens if you use InvalidateAsset on a texture? Does it immediately reload it?
yes
in a temporary content manager with cache disabled
You load up a fresh new texture through the asset pathway....which gets it's contents copied to the one in the localized content cache
Hmmmm good to keep in mind for optimization
the corner case for it, is localization and if the image no longer exists in the asset pipeline
Well I asked because usually invalidating an asset does not necessarily mean it is immediately reloaded
It does mean that there is no point tracking asset invalidation for textures
anything that is a Texture2D will get propagated and a load attempted on it
which is different from regular propagation where only vanilla stuff got propagated into a reload
Yeah
The other thing is that you basically cannot unload a texture from memory anymore
what is the problem you want to solve
Once it's there it is stuck
I ran into this when I was looking for the memory leak tbh
I have a custom object type and I want to cache textures on it (because duh) and I wanted to avoid event listeners for gc reasons
Yeah that was going to be my approach, but it seems I don't need it!
hmm yeah you can get ghost assets in the pipeline now if the new world didn't want to load it, the old version will just live there
This is now completely useless and don't do this
https://github.com/Pathoschild/SMAPI/blob/develop/src/SMAPI/Metadata/CoreAssetPropagator.cs#L186 I'd kinda like an actual cache bust in this case
Yeah I figured refactoring to add one level of indirection is a problem
It's hard because nothing can update the reference
I think if I was writing de novo I would have preferred the wrapper
Yeah
I actually wrote a wrapper thing like that for a non-mod project to reduce dictionary lookups
there's probably smarter ways within monogame to do it, but that requires actually learning xna
I doubt it tbh
I mean you don't have to use the pipeline
Indirection us just one extra pointer
You could theoretically just make your own custom asset system that bypasses it entirely
How much could one pointer cost anyways, ten dollars
loading from mod content still doesn't cache* so you would still need to do the asset reference swapping yourself
Hi esca! Long time no see
just to confirm, yeah, I think the only technically-not-vanilla features are "preventing island visits with When instead of a GSQ" and "prevent being greeted" (not greeting)
hi atra
been around but barely ever talking
How intriguing! Does NPC have a name? That way, when you release it, I’ll know it’s yours!
it is kinda cute how many mods still refer to it as a disposition
Anyways, esca, working on anything interesting?
right now somebody sent a russian i18n for Destroyable Bushes, so that 
other than that I've been on hiatus for ~a while~, but I still mean to add basic FTM trigger stuff eventually
similar but I keep telling myself to exercise instead of that part
also tempted to add a GSQ tile property for whether people can cut a bush down, now that I'm staring at code again
probably a bit pointless, though
(And yes that's not a typo there are two workouts per day. One js strength, the other cardio)
(more appropriate for FTM, but then I'd be adding a bunch of patches)
What is blank.json used for?
edits only happen if a load happens, and CP loads don't get to use the rich language of tokens
What are the use cases for this? Wondering if I will need to use it
want to have your events for a custom location be in editdata, but no one else has done a load on Data/Events/{{ModId}}_MyAwesomeLocation, you do a load on Data/Events/{{ModId}}_MyAwesomeLocation with an empty object so the editdata can insert events
By noone else, do you mean another modder or another NPC in my mod?
no one else being no other mods (or vanilla)
Ah ok, do you think I will be ok with not loading a blank json?
your npc's aren't sentient and aren't controlling loads in the asset pipeline
If you have an EditData targeting an asset like Data/Events/{{ModId}}_MyAwesomeLocation but don't have a Load for the same asset, your EditData wont happen
Ahh ok gotcha - thanks for the help 
If you plan to use i18n you will need to use a blank json for your dialogue too so CP can convert the i18n tokens to actual text.
Ohhh, thank you for telling me this. I am using i18n
Glad I mentioned it lol. Yeah anything where your data is going to contain a token of any kind (including i18n) needs to be done through an EditData patch so CP can convert the token. In cases like dialogue or schedule or an event in your custom location where the asset is specific to your character/mod and doesn't exist until you make it (as opposed to something like Data/Characters that already exists in vanilla and you just add your bit into it) you have to make sure there's an asset to edit and that's where the blank load comes in.
Then I am definitely having a blank json then haha. Thank you for the detailed explanation!
I do want to add a LoadData action which is EditData but runs on a load instead and would remove blank.json.
but iirc last time it was brought up, it felt like it would add more complexity than it would be solving
delocalized events are just vanilla using the tokenized text
which was already doable in 1.6 anyway iirc, but mods already ignore tokenized text where possible in favor of smapi's i18n
now will vanilla get a data model for furniture
only time mods go near tokenized text is when values being baked into the save are present
I wish letters can use tokenizable strings 
I ran into a few use cases where tokenizable strings don't work when I was testing out using localized strings for NPC names (in the case of renames of vanilla NPCs). D:
this was my old list, though I think its out of date partially
ObjectContextTags I think died and got moved into Objects, but the rest I think are still correct
ironically enough this list didn't have events in it, was only worrying about top level data assets
Tbh events...
The long standing issue was that translators would fuck up events
And softlock the game
I definitely recall finding a case of that in German
a localized asset would fuck up events being a list or slash delimitted regardless
I also did a silly and tried to put a localized text string into Strings, which... doesn't work for what should probably be obvious reasons.
Tried to edit dialogue in Strings/1_6_Strings to use localized text from Strings/NPCNames, it did nothing. Presumably because they're both in Strings, based on what I was told at the time. LOL
I personally want achievements and SecretNotes done purely so everything is either slash seperated or a model
those alternate character seperated assets are annoying
I'm just happy we can (AFAIK) put parts of events on new lines now to make them easier to read.
only if you are okay with any json spec compliant editor yelling at you
It's gonna yell at me for comments anyway, let it yell
furniture would be pretty fantastic, there's so many hardcoded rules and behaviours for each type that could be ironed out and made explicit
it'd be great to have rotations changed into something more generic
past me's tier list back in 2023
- Item type definitions (Boots/Hats/Furniture)
- Monsters
- Recipes (CookingRecipes/CraftingRecipes)
- Fish/AquariumFish
- Bundles
- Achievements/SecretNotes (requires id conversion for full impact)
- Quests
- NPCGiftTastes
- animationDescriptions
- HairData (requires id conversion for full impact)
- ChairTiles/PaintData/ObjectContextTags (better to just be on Data/Objects)
bundles...
a central Data/Schedules, thats keyed on npc and is a ordered list of data models with priority and GSQ conditions that control, that then has its tickertape of rules
I know HairData using strings instead of integers for keys got added onto the suggestions list.
I asked Pathos to add it to the wishlist a while back and he said yes, LOL.
the archived 1.6 modding alpha trello has a bunch of nice stuff in it that we didn't get to
Poor pathos
He gives an inch, modders ask for a mile
I always imagine him going "what now?"
Insert "is it in scope" meme
You can put every command of an event on a new line. However, your text editor should not be yelling at you for comments. Switching your file association to jsonc or JSON5 gets rid of that.
I do agree that if vanilla is going to have it, there needs to be a case that vanilla uses it
but the window of stuff that can still satisfy that requirements huge
There's a few not used by vanilla features i think
(Up to him. These days I try to avoid being annoying)
Honestly, I feel like strings for keys is a need as far as modding support, but not necessarily for vanilla.
Because we can work around it, it's just a "how big of a number can I do before I overlap someone else"
vanilla still semi uses that.
stuff that would be out of scope would be new buff types to change stats that no vanilla item has
and 1.6 content update did make use of the string id's
MossSoup my beloved
deduplicating _newDayAfterFade, the save creation and save load process would be a royal pain in the ass, but once its done it would be amazing
What's the problem with new day after fade?
there are a lot of quirks with logic that runs on night vs what happens on save load
pretty much the code that runs when you sleep overnight and wake up, is completely different from the logic for loading the save (and to a lesser extent creating the save)
it's why using CP When edits to change island schedules doesn't work right without Exclusions, you get different token states & update timing based on load-vs-sleep 
shipping bin is before save
Some night logic is fine and belongs there, but there's logic that runs after the save, but before waking up
a vanilla example is that iirc you cant load a save into a wedding
iirc 1.6 partially fixes that by detecting this and postponing the wedding
Hey that happened to me yesterday
So, im running into a weird problem of a modded item's ID/fieldname for Content Patcher purposes to not match what the console refers to it as when spawning it in.
the mod doesn't use content patcher despite adding an item, all im trying to do is assign the "Fine Grapes" added by Forage Fantasy the "grape_item" context tag (private thing not intending to share.). but logs keep saying its not a valid target despite using the name as the console referred it to. i don't know a whole lot about the C# side of modding or what that looks like. just curious if anybody might have any idea whats going on. the secrets of the DLL are closed to me.
confirm that you got the item name right with patch export Data/Objects
All objects have an id
I'm aware of that much it's just weird it's not matching
You can turn on datamining fields with lookup anything to see it
Patch export also good as selph mentioned
oh that's, actually really smart. Since it was lookup anything that I confirmed the tag was missing and the dev manually readded the grape to rasin dehydrator recipe
Another thing is that the data may not be edited in all the time
Though usually it's content patcher that can lead to this behavior due to how tokens work
honestly i only jumped to asking here because i can't just look in the guts of what theyve done to see why im wrong
thats not the same thing at all. also i wasn't aware of patch export before this conversation
The mod is also open source
{ForageFantasy.Manifest?.UniqueID}.FineGrape
Grape Logic
interesting.
{
"LogName":"Forage Fantasy fine grapes given grape context tag",
"Action":"EditData",
"Target":"Data/Objects",
"TargetField":[
"Goldenrevolver.ForageFantasy.FineGrape",
"ContextTags"
],
"Entries":{
"GrapeItem":"grape_item",
}
}
because this is the patch as i have it. which matches the result of adding the manifests unique id + "FineGrape"
Hm did u need like grape_item: grape_item here
i have no idea
Hey again! I have a question about map design. If I am making paths on large field with few obstructions, is worth making a pretty winding path when my npc's own pathfinding will likely not use it as intended?
Because I'm not making paths that are the most straightforward way to reach a destination, even if they look like they could make sense and feel natural.
I fear that my npc completely ignoring them will be annoying and possibly defeat their theoretical purpose. What do you all think? Is there a prefered method or solution to this?
that would technically work, but if it already had grape_item it would have it twice, and if it had GrapeItem it would get replaced with grape_item
if you just want to ensure grape_item is in there (once), then the key and value should match
fair enough.
Can't apply data patch "Vegas' Item Compatibility Patch > Item Compatibility Patch #10 > Data/WildfloursAtelierGoods.json > Forage Fantasy fine grapes given grape context tag" to Data/Objects: the field 'Goldenrevolver.ForageFantasy.FineGrape' doesn't match an existing target
not that were getting that far. ive just stuffed my stuff into something i already had and attached Forage Fantasy as a mod in its manifest. eventually need to move it to small separate content pack for simplicity.
without substantial engineering or weird micro scheduling, you can't really control how NPCs pathfind, so if it's important to you that they walk on paths, you could take the "pave the cow paths" approach
To be fair that's how paths work irl anyways
otherwise i'd say just do what looks nice
(and don't make your map difficult for the player to navigate, if possible)
Might need to use a late priority
A desire path, also known as desire line in transportation planning and many other names, is an unplanned small trail formed by erosion caused by human or animal traffic. The path usually represents the shortest or the most easily navigated route between an origin and destination, and the width and severity of its surface erosion are often indic...
Pave the cow paths?
same as the thing sinz said. put the paths where the NPCs walk
Ah, ok
that being said, it would be interesting to have a mod that tried to more heavily influence the micropathfinding algorithm
there is some preference in there for certain tile types, but its fairly weak
can u just give them really detailed schedules
Mhm. Another thought.
We'll try that since it's clearly not existing at the time of the patch is at least my understanding of the log in smapi
That would result in weird pauses though
ok i was gonna say i thought i remembered there being weights but too small to have an effect
Sure
oh yeah ForageFantasy is doing Late priority, so you need to also do late(er) priority to be after it
oh good catch
"Priority": "Late + 1" should get you what you need, and if you have the mod as a (optional) dependency, then just Late will do it
It would be fun if npc scheduling was more dynamic 
actually I think this is a CP bug
the assistance is much appreciated even if im sure this is a fairly basic issue that really didn't need it.
oh?
CP's exposed priority system only works within other cp edits, ContentPatcher itself will always do the edit at Default priority
... whar
Huh
https://github.com/Pathoschild/StardewMods/blob/develop/ContentPatcher/Framework/PatchManager.cs#L531 (and a few lines above, CP can only do exclusive loads, can't optionally fallback load what a smapi mod does)
??? CP's patch priority doesn't work? is this recent?
when 99% of asset edits are within content patcher it works fine
oh huh
...that explains the fish pond building edit issue
its the few mods total that do asset editing that also play with priority which will cause issues
ohhhh, it doesn't work alongside SMAPI edit priorities? that makes more sense
still bad, but makes more sense
truely cursed
So what I'm getting at is CP edits always fire entirely before smapi edits? Or something
At least on the case of if the smapi edit sets a later priority
all CP edits run at the "default" priority.
smapi early edits will run before, smapi late will run after
cp sorts edits and then gives them to smapi as Default
other smapi mods can give Early or Late or Default (+whatever offset)
I see.

this code should be breaking the patch groups out further to also group by priority and letting smapi run them in order
i hate knowing this
cp can (and needs to) still do the internal sort within the same priority to let the existing status quo of ordered patches and dependency tree etc work
The number of niche bugs I keep running into would be funny if it wasn't frustrating
PR's welcome to ContentPatcher 😛
I guess we're adding this to the to-do list.
I still need to get around to finishing my asset pipeline diagram to include invalidation+propagation and how it relates to content patcher
do u think there was purpose
it sure looks like it was intentional
tbh I knew about this behaviour earlier and was confused, but never got around to addressing it.
well its your job now we believe in you
this code predates CP 2.0 exposing the priority system
Old legacy code nobody bothered to go back and fix
issue I was referring to - Aquaponics' edits have Late priority, so it always runs after the CP patch here
I can make it run earlier, but that would break fish pondering compat. I guess we can wait for that CP fix nudge wink
i can bonk fish pondering to Default tbh 
I enjoy how everyone is sitting in a circle trying to argue someone else into making a PR
atra don't act like you're above the fray 
the second one specifically for size w/ fish pondering
I could fix it, but the bug doesn't bother me enough and isn't performance related 😛
It's my modus operandi
I'm retired, remember
hell, maybe i'll do the PR. this bug is showstopper-level from my perspective
Yesss 
good idea, how did I not think of that /srs
But more seriously I just got home so
I need to wash the chlorine out of my hair
but yeah the fix can be quite simple, within SortAndGroupEditPatches, its already ordered by priority, just need to breakout into more groups when priority changes, and in the linked code earlier use the first patch in the groups priority instead of default
gang how bad would it be if, instead of actual custom asset, i make people encode TV bounds as a context tag
I think, in think I don't wanna dive into content patcher PRs tonight. I'll just live with the fact that if I want to grow grapes for Wildflour's Atelier purposes I have to use Cornucopias White Grapes.
What if they forget the context tag?
then its not a custom tv
even if the PR was made tonight, it likely wont ship to users until later in the month
This is also true
Pathos does his mod updates in waves so he can do his day job and vanilla work
(i'm too slow to do it tonight, so if anyone is fast feel free to cut me off)
any reason why a context tag and not just CustomFields?
Reasonable enough.
Honestly I'm just generally upset at the issue.
But not enough to do it myself.
hey scarecrow size is a context tag, there's precedence
its furniture do they have those
does furniture have context tags?
Surely _24_64 is more readable
its negative 64
I just feel like x here is a bit weird
Since it’s a letter
Not the most rational feeling
But it's the classical multiplication letter
yea
Yes but I don’t like that either
It’s properly its own character
i dont want to use _ cus that isnt the only instance of it
^calcifer_tv_(-?\d+)×(-?\d+)$
X has tweedly bits in some fonts that don’t belong in multiplication
⋆
make anyone writing the context tag need to copy paste the esoteric unicode character
^calcifer_tv_(-?\d+)♤(-?\d+)$
It would make me feel better if it was _24x_-64y tbh
^calcifer_tv_x(-?\d+)y(-?\d+)$
Then at least the x is labeling an x axis
Don't forget scale which is a float
Feel free to ignore all of this, this is largely me being pedantic about multiplication signs 😛
this should be a dot product right



