support: vscode + VINTAGESTORY_DATA env + optional ConfigLib with warning #1

Merged
OrekiWoof merged 2 commits from vscode-support into main 2026-03-15 00:18:05 +01:00
5 changed files with 140 additions and 53 deletions
Showing only changes of commit 907a6cb84b - Show all commits

View File

@@ -1,5 +1,5 @@
{ {
"total": 51853, "total": 56092,
"sessions": [ "sessions": [
{ {
"begin": "2026-03-11T23:50:47+01:00", "begin": "2026-03-11T23:50:47+01:00",
@@ -10,6 +10,16 @@
"begin": "2026-03-12T17:18:14+01:00", "begin": "2026-03-12T17:18:14+01:00",
"end": "2026-03-12T22:08:00+01:00", "end": "2026-03-12T22:08:00+01:00",
"duration": 17386 "duration": 17386
},
{
"begin": "2026-03-14T13:19:51+01:00",
"end": "2026-03-14T13:47:21+01:00",
"duration": 1650
},
{
"begin": "2026-03-14T16:53:26+01:00",
"end": "2026-03-14T17:36:35+01:00",
"duration": 2589
} }
] ]
} }

24
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,24 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Vintage Story Client",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build mod",
"program": "${env:VINTAGE_STORY}/Vintagestory.dll",
"args": [
"--tracelog",
"--dataPath",
"${env:VINTAGE_STORY_DATA}",
"--addModPath",
"${workspaceFolder}/ChestPreview/ChestPreview/bin/Debug/Mods",
"--addOrigin",
"${workspaceFolder}/ChestPreview/ChestPreview/assets"
],
"cwd": "${env:VINTAGE_STORY}",
"console": "integratedTerminal",
"stopAtEntry": false
}
]
}

32
.vscode/tasks.json vendored Normal file
View File

@@ -0,0 +1,32 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "check env",
"type": "shell",
"command": "[ -n \"$VINTAGE_STORY\" ] || { echo 'ERROR: VINTAGE_STORY is not set'; exit 1; }; [ -n \"$VINTAGE_STORY_DATA\" ] || { echo 'ERROR: VINTAGE_STORY_DATA is not set'; exit 1; }",
"problemMatcher": []
},
{
"label": "build mod",
"command": "dotnet",
"type": "process",
"dependsOn": ["check env"],
"dependsOrder": "sequence",
"options": {
"env": {
"VINTAGE_STORY": "${env:VINTAGE_STORY}"
}
},
"args": [
"build",
"${workspaceFolder}/ChestPreview/ChestPreview/ChestPreview.csproj",
"-c",
"Debug",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@@ -7,6 +7,9 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<Configurations>Debug;Release;Version22</Configurations> <Configurations>Debug;Release;Version22</Configurations>
<VintageStoryDataPathArgs></VintageStoryDataPathArgs> <VintageStoryDataPathArgs></VintageStoryDataPathArgs>
<VS_CONFIGLIB Condition="'$(VS_CONFIGLIB)' == ''">$([System.Environment]::GetEnvironmentVariable('VS_CONFIGLIB'))</VS_CONFIGLIB>
<ConfigLibAvailable Condition="'$(VS_CONFIGLIB)' != '' and Exists('$(VS_CONFIGLIB)')">true</ConfigLibAvailable>
<DefineConstants Condition="'$(ConfigLibAvailable)' == 'true'">$(DefineConstants);CONFIGLIB</DefineConstants>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Version22'"> <PropertyGroup Condition="'$(Configuration)' == 'Version22'">
@@ -59,12 +62,16 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="configlib"> <Reference Include="configlib" Condition="'$(ConfigLibAvailable)' == 'true'">
<HintPath>E:\Code\VintageStory\configlib_1.10.14\configlib.dll</HintPath> <HintPath>$(VS_CONFIGLIB)</HintPath>
<Private>False</Private> <Private>False</Private>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<Target Name="WarnWithoutConfigLib" BeforeTargets="CoreCompile" Condition="'$(ConfigLibAvailable)' != 'true'">
<Warning Text="No VS_CONFIGLIB - will compile without supporting ConfigLib. Set VS_CONFIGLIB env var to a path that contains the configlib's dlls." />
</Target>
<ItemGroup> <ItemGroup>
<Content Include="modinfo.json"> <Content Include="modinfo.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

View File

@@ -1,50 +1,64 @@
using ChestPreview.Core; using System;
using ConfigLib; using Vintagestory.API.Client;
using System;
using Vintagestory.API.Client; #if CONFIGLIB
using ChestPreview.Core;
namespace ChestPreview.Configs; using ConfigLib;
#endif
internal class ConfigLibBridge(Config config) : IDisposable
{ namespace ChestPreview.Configs;
public const string CONFIGLIB_MODID = "configlib";
#if CONFIGLIB
private readonly Config config = config; internal class ConfigLibBridge(Config config) : IDisposable
{
private ConfigLibModSystem? configLibSystem; public const string CONFIGLIB_MODID = "configlib";
public static ConfigLibBridge? TryCreate(ICoreClientAPI api, Config config) private readonly Config config = config;
{
if (!api.ModLoader.IsModEnabled(CONFIGLIB_MODID)) private ConfigLibModSystem? configLibSystem;
return null;
public static ConfigLibBridge? TryCreate(ICoreClientAPI api, Config config)
ConfigLibModSystem? configLibSystem = api.ModLoader.GetModSystem<ConfigLibModSystem>(); {
if (configLibSystem == null) if (!api.ModLoader.IsModEnabled(CONFIGLIB_MODID))
return null; return null;
var bridge = new ConfigLibBridge(config) ConfigLibModSystem? configLibSystem = api.ModLoader.GetModSystem<ConfigLibModSystem>();
{ if (configLibSystem == null)
configLibSystem = configLibSystem return null;
};
var bridge = new ConfigLibBridge(config)
configLibSystem.SettingChanged += bridge.OnSettingChanged; {
return bridge; configLibSystem = configLibSystem
} };
public void Dispose() configLibSystem.SettingChanged += bridge.OnSettingChanged;
{ return bridge;
if (configLibSystem == null) }
return;
public void Dispose()
configLibSystem.SettingChanged -= OnSettingChanged; {
configLibSystem = null; if (configLibSystem == null)
} return;
private void OnSettingChanged(string domain, IConfig configObject, ISetting settingObject) configLibSystem.SettingChanged -= OnSettingChanged;
{ configLibSystem = null;
if (domain != ChestPreviewModSystem.CONFIGLIB_DOMAIN || settingObject == null) }
return;
private void OnSettingChanged(string domain, IConfig configObject, ISetting settingObject)
settingObject.AssignSettingValue(config); {
} if (domain != ChestPreviewModSystem.CONFIGLIB_DOMAIN || settingObject == null)
} return;
settingObject.AssignSettingValue(config);
}
}
#else
internal class ConfigLibBridge : IDisposable
{
public const string CONFIGLIB_MODID = "configlib";
public static ConfigLibBridge? TryCreate(ICoreClientAPI api, Config config) => null;
public void Dispose() { }
}
#endif