Repository navigation
ScriptDev 1.1.0 - #265
ScriptDev 1.1.0#265
Conversation
viktor-ferenczi
left a comment
There was a problem hiding this comment.
Scope: version bump review of hub head 3b434595a01b23e3c7d7bfc106bbde7ed25675c0, Plugins/ScriptDev.xml, target viktor-ferenczi/se-script-dev, direct diff bf56ad22fbd49eac1964d71f97a50cdc4a380873..2dce778445b6ff44223bf194154c31dea40e2918.
No agent-detected blockers. The one note below is non-blocking.
Manifest
- Only
Tooltip,DescriptionandCommitchange.Id,SourceDirectories(Shared,ClientPlugin), noNuGetReferences, no assets, no dependencies. - The manifest has no
<RepoId>. Pulsar falls back toId(GitHubPlugin.RepoId => _repoId ?? Id), soviktor-ferenczi/se-script-devis the source repo, as before. python3 test.py Pluginsat the hub head:All files validated. Thexml-checkCI job passes too.- The repo's backup
ScriptDev.xmlat the pin matches the hub manifest except for<Commit>.
Repository and pin provenance
- Public, MIT, default branch
main.mainis at the pin (compare:identical), so there's no drift. The repo has no tags. - Range: 7 commits, 28 paths, +1748/−995. 11 of those paths are in the compiled
Shared+ClientPlugindirs (+1071/−979). The rest is dev tooling and docs outsideSourceDirectories:setup.py,clean.sh, deploy.batfiles,.run,AGENTS.md, the Dedicated/Torch projects andDirectory.Build.props/Version.Build.props.
Security
The compiled changes are four new files plus a restyle of two shared helpers:
LocalItem.cslists folders underMyBlueprintUtils.SCRIPT_FOLDER_LOCALandMyFileSystem.ModsPathand reads file timestamps. It writes nothing.Publisher.cscalls only vanilla publicMyWorkshopAPIs:FilterWorkshopIds,PublishIngameScriptAsync/PublishModAsync,GenerateModInfoandReportPublish. Uploads start only after the user picks an item and confirms the vanilla tag screen. The only file the plugin causes to be written is the vanillamodinfo.sbmi, written byGenerateModInfoin the published folder, the same as the vanilla publish flows.PublishDialog.csgets item details throughMyWorkshop.GetItemsAsyncand marshals the result to the game thread withMySandboxGame.Static.Invoke. "Open in Workshop" usesMyGuiSandbox.OpenUrlWithFallback(workshopItem.GetItemUrl()).- Not found in the compiled diff: process execution, own networking, reflection on external input, dynamic code or encoded payloads.
RecordCodeinTranspilerHelperswrites.ilfiles only under#if DEBUGand has no callers.VerifyCodeHashand[EnsureCode]aren't used by this plugin. Hashing.Hash(string)replacesstring.GetHashCode()with FNV-1a, so string operands hash the same way across runs on .NET Core. No[EnsureCode]hashes in this plugin depend on it.- Project references:
packages.configand the0Harmonyreference go away in favor ofPackageReference Lib.Harmony 2.3.3, which Pulsar supplies anyway. TheKrafs.PublicizerandPublicizeitems are inside XML comments, so they aren't active. Every API the new code uses is public in the game. No committed binaries or native files are in the range.
Vanilla behavior checked (decompiled SE 1.210.014)
MyWorkshop.PublishItemBlockingreplacestitleandvisibilitywith the existing item's values when the item already exists. So the dialog's tooltip "Updates keep the visibility the item has on the Workshop" matches the game. Vanilla calls always passMyPublishedFileVisibility.Public, so the visibility selector only matters for new items.GetWorkshopIdFromMod(path)reads the samemodinfo.sbmias vanillaGetWorkshopIdFromLocalScript. The owner check mirrorsMyGuiScreenMods.OnPublishModQuestionAnswer. Passing""as the script description is harmless becauseMySteamWorkshopItemPublishersends the description only when it's non-blank.
Compatibility
MainMenuPatch postfixes MyGuiScreenMainMenu.CreateMainMenu and CreateInGameMenu (out Vector2 lastButtonPosition taken as ref). It shifts the buttons above the last one up and puts Publish one slot above the last. Pulsar's Patch_CreateMainMenu/Patch_CreateInGameMenu (Legacy, category Late) move the last button down and put Plugins in its place. I traced both postfix orders and each gives … Publish, Plugins, Exit without overlap. The only other hub plugin patching CreateMainMenu is LinuxCompat, and its postfix only changes the exit button text. No multiplayer authority surface: the feature uploads the user's own local content through vanilla Workshop calls.
From-source build
dotnet build ClientPlugin/ClientPlugin.csproj -c Release on Linux, .NET 10 SDK, net10.0, game DLLs from the local Steam install: 0 warnings, 0 errors. This is an MSBuild build, not the Pulsar Roslyn path. It compiles the same ClientPlugin + Shared sources, and the C# 14 features in them match Pulsar's LanguageVersion.CSharp14. I didn't run a load test.
Non-blocking notes
- Note:
LocalItem.GetLastChangeenumerates every file under every local script and mod folder on the UI thread each time the dialog opens or Refresh is clicked. With large mod folders this could cause a visible hitch, and the dialog is also reachable from the in-game menu. An exception from an unreadable subfolder (UnauthorizedAccessException, a broken link) would also escape the button handler. This only runs when the user acts, so it isn't a blocker. If it becomes a problem, catching per item, or computing the timestamps off-thread and filling the table afterwards, would cover both.
ScriptDev 1.1.0, pinned to viktor-ferenczi/se-script-dev@daf5e5c, the head of viktor-ferenczi/se-script-dev#8, which keeps the vanilla menu layout and puts the Publish button next to Load Game. #8 isn't merged yet, so re-pin to its merge commit once it is. Features from #5 and #6 (already merged).
Tested on Linux (Pulsar Interim, .NET 10) with Steam: two private test items created and republished through the dialog. The .NET Framework 4.8 build compiles (Linux; the plugin source at 2dce778 is identical to the tested 06087a0), but Pulsar Legacy on Windows isn't tested yet.