Releases: Pixnop/Manifold
Release list
v0.4.2
What's Changed
- chore: clear SonarCloud maintainability smells in the library by @Pixnop in #50
- chore(chart): clear safe SonarCloud smells (BlurTool, DimensionTracker, palette) by @Pixnop in #51
- refactor(chart): extract ProcessChunk pipeline into named helpers by @Pixnop in #53
- docs: document 0.4.0 features in README and docfx articles by @Pixnop in #52
- docs(readme): link Chart to its Mod DB page by @Pixnop in #54
- feat(server): destroy ephemeral dimensions on server shutdown by @Pixnop in #56
- fix(chart): ephemeral-dim cache cleanup + dirty-queue perf fix by @Pixnop in #57
- Release Manifold 0.4.1 + Chart 0.2.0 by @Pixnop in #58
- fix(worldgen): dim-aware relight + RelightRegion API + /manifold relight by @Pixnop in #60
- fix(relight): send runtime relights to clients (relight command + RelightRegion) by @Pixnop in #63
- feat(worldgen): WithDarkSky - opaque ceiling cap for dark custom dimensions by @Pixnop in #64
- fix: dimension lifecycle hardening (rescue/occupancy/ForceRemove) + remove auto-relight + audit fixes by @Pixnop in #66
- refactor: audit-backlog cleanup (immutable metadata, dead-API removal, hardening) by @Pixnop in #67
- chore: extract Chart to its own repository by @Pixnop in #68
- Atlas integration scenarios for Manifold by @Pixnop in #70
- Tier 0 correctness fixes for 0.4.2 by @Pixnop in #71
- Release Manifold 0.4.2 by @Pixnop in #72
Full Changelog: v0.4.0...v0.4.2
v0.4.1
What's Changed
- chore: clear SonarCloud maintainability smells in the library by @Pixnop in #50
- chore(chart): clear safe SonarCloud smells (BlurTool, DimensionTracker, palette) by @Pixnop in #51
- refactor(chart): extract ProcessChunk pipeline into named helpers by @Pixnop in #53
- docs: document 0.4.0 features in README and docfx articles by @Pixnop in #52
- docs(readme): link Chart to its Mod DB page by @Pixnop in #54
- feat(server): destroy ephemeral dimensions on server shutdown by @Pixnop in #56
- fix(chart): ephemeral-dim cache cleanup + dirty-queue perf fix by @Pixnop in #57
- Release Manifold 0.4.1 + Chart 0.2.0 by @Pixnop in #58
Full Changelog: v0.4.0...v0.4.1
chart-v0.2.0
What's Changed
- chore: clear SonarCloud maintainability smells in the library by @Pixnop in #50
- chore(chart): clear safe SonarCloud smells (BlurTool, DimensionTracker, palette) by @Pixnop in #51
- refactor(chart): extract ProcessChunk pipeline into named helpers by @Pixnop in #53
- docs: document 0.4.0 features in README and docfx articles by @Pixnop in #52
- docs(readme): link Chart to its Mod DB page by @Pixnop in #54
- feat(server): destroy ephemeral dimensions on server shutdown by @Pixnop in #56
- fix(chart): ephemeral-dim cache cleanup + dirty-queue perf fix by @Pixnop in #57
- Release Manifold 0.4.1 + Chart 0.2.0 by @Pixnop in #58
Full Changelog: v0.4.0...chart-v0.2.0
v0.4.0
What's Changed
- feat: Chart companion mod (dimension-aware world map) - 0.1.0 by @Pixnop in #32
- Release: Chart companion 0.1.0 + Manifold 0.3.1 carry-over by @Pixnop in #33
- fix(ci): release prerelease guard handles chart-v* tags by @Pixnop in #34
- docs: mention Chart 0.1.0 companion in README and CHANGELOG by @Pixnop in #35
- feat(transit): add EntityChangedDimension event for non-player entity transit by @Pixnop in #42
- feat(transit): add PlayerArriving cancellable post-generation hook by @Pixnop in #43
- feat(registry): per-dimension metadata API by @Pixnop in #44
- feat(streaming): per-dimension column budget by @Pixnop in #45
- feat(transit): TeleportBlock cross-dimension block primitive by @Pixnop in #46
- fix(transit): correct BlockEntity position on TeleportBlock + sample test harness by @Pixnop in #47
- chore(editorconfig): constants use PascalCase regardless of accessibility by @Pixnop in #48
- Release Manifold 0.4.0 by @Pixnop in #49
Full Changelog: v0.3.1...v0.4.0
chart-v0.1.0
First release of Chart, the dimension-aware world map companion for Manifold custom dimensions. Alpha visual quality.
What it is
Chart is a client-side companion mod that gives Manifold custom dimensions a proper world map. Each dimension you visit keeps its own tile cache on disk; entering a dimension swaps the rendered map to that dimension's tiles, leaving restores the previous one.
How it works
- Subclasses
RGBMapLayerand registers withWorldMapManagerso it slots into the vanilla map dialog (G). - Deactivates and removes the vanilla
ChunkMapLayeratLevelFinalizeso Chart is the sole terrain renderer. - Ports the vanilla
ChunkMapLayerrendering pipeline (13-colour material palette, snow / water-edge handling, 3-neighbour hillshade, box-blurred shadow map). - Adds Manifold dim-awareness everywhere the vanilla code assumed dim 0: per-pixel
BlockPos.dimensionwrites, dim-encoded chunk slice lookups (cy + dim * 1024), and a bounded fallback height scan whenIMapChunk.RainHeightMapis unpopulated in custom dims. - Tile data persists at
<gamedir>/ModData/Chart/<savegame>/<dim>.bin(deflate-compressed).
Install
- Players: drop
Chart-0.1.0.zipinto yourModsfolder. Requires Manifold 0.3.1 or later, and the bundledsurvivalmod (which ships with the game). - Client-side only. Servers do not need Chart.
Known alpha-stage limitations
- Chunk-edge seams. Our tiles are 32x32 each; vanilla uses 3x3 grouped 96x96 tiles, so the blur stays inside one big tile there. Until Chart migrates to the same grouping, expect mild visible seams at chunk boundaries.
- Softened hillshade. The slope factor cap is reduced from vanilla's 0.5 to 0.3 to mitigate cross-chunk discrepancies (which would otherwise show as noise). Relief is therefore less pronounced than vanilla.
- Waypoint cross-dim leakage. Vanilla
WaypointMapLayerstill renders all pins regardless of dimension. Tracked in https://github.com/Pixnop/Manifold/issues/30. - No automatic cleanup of ephemeral dim caches. Manifold's ephemeral dimensions leave their tile files on disk until manually deleted. Tracked in #31.
For Vintage Story 1.21+. MIT licensed. Tracking issue: #7
v0.3.1
Bug fix release. Fixes a MissingFieldException at world generation for any player on Vintage Story 1.22.x.
Why
VS 1.22 refactored Entity.Pos from a public field into a public property. 0.3.0 was built against the 1.21 API (where Pos is a field) and emits ldfld Entity::Pos, which throws at runtime on 1.22 builds and breaks world generation. 1.21.x players are unaffected.
Fixed
MissingFieldException: Vintagestory.API.Common.Entities.Entity.Posat world generation on VS 1.22.x. Manifold now resolvesEntity.Posthrough a small reflection-cached helper, so the same binary runs on every 1.21.x and 1.22.x build.
Changed
- CI / NuGet / release / docs / package workflows now build against VS 1.22.2 (latest stable). Same binary still runs on 1.21.x.
ManifoldSampledeclaresmanifold >= 0.3.0in its modinfo (was 0.2.0), since it uses 0.3.0 APIs.
Install
- Players / servers: drop
Manifold-0.3.1.zipinto your Mods folder. - Mod developers:
dotnet add package Pixnop.Manifold(compile-time API; still declaremanifoldas a runtime dependency).
For Vintage Story 1.21+. Full changelog: v0.3.0...v0.3.1
v0.3.0
Manifold 0.3.0 adds two opt-in features for dimension mods, plus one breaking change to the position resolver.
Added
Per-dimension player inventory. Give a dimension its own player inventory with WithSeparateInventory(ManifoldInventory.Hotbar | Backpack | Character). Entering swaps the chosen categories to that dimension's set (empty on the first visit); leaving restores the previous one. Profiles are stored in player moddata, saved together with the physical inventory, so they survive logout and server restarts with no item loss (the snapshot is always taken before any slot is cleared).
Non-player entity transit. ITransitionService.TeleportEntity(entity, targetDim, options) moves items and other non-player entities between dimensions. The destination region is generated on demand, then the entity is re-homed into it. Use TeleportPlayer for players.
Changed (breaking)
ITargetPositionResolver.Resolve now takes the source Entity instead of IServerPlayer, so one resolver serves both player and entity transit. If you have a custom resolver, change its parameter from IServerPlayer player to Entity entity and read the source X/Z from entity.Pos. The built-in resolvers and TeleportPlayer are unaffected.
Install
- Players / servers: download
Manifold-0.3.0.zipbelow (or from the Mod DB) and drop it in your Mods folder. - Mod developers:
dotnet add package Pixnop.Manifold(compile-time API; still declaremanifoldas a runtime dependency).
Built for Vintage Story 1.21+. Full changelog: v0.2.0...v0.3.0
v0.2.0
Manifold 0.2.0 adds streaming worldgen.
Highlights
- Streaming worldgen - opt-in per dimension via
Streaming(loadRadius). Chunks are generated on demand as players move (no fixed region edge, no invisible walls), spread across server ticks so there is no hitch. Bounded generation (WithGenerationRadius) remains the default; the two modes coexist. - Covers the view - the streaming radius extends to the player's view distance, so generated terrain always reaches as far as they can see.
WithRelightHeight(maxY)- set the lit band height per dimension for taller worlds.- Per-column relight - keeps generation cheap and overload-free even while moving at full speed.
Downloads
Manifold-0.2.0.zip- the library (install this; other mods depend on it).ManifoldSample-0.2.0.zip- optional demo mod, now with a/streamdimstreaming dimension.
Compatibility
Vintage Story 1.21+ (built against 1.21.0, validated in-game on 1.22.2). .NET 10. MIT licensed.
NuGet: Pixnop.Manifold 0.2.0. Docs: https://pixnop.github.io/Manifold/
v0.1.0
Manifold is a library mod for Vintage Story 1.21+ that exposes a public API for other mods to declare and manage custom dimensions — lifecycle, player transit, per-dimension worldgen, travel policy, and persistence. It adds no in-game content itself (pure dependency).
Features
- Custom dimensions — declare persistent or ephemeral dimensions from any mod; boot-time (
RegisterStatic) or runtime (Create), identified byAssetLocationcodes. - Active worldgen —
IWorldgenStrategy(OnInitialize+GenerateColumn); Manifold pre-generates a bounded chunk region around the transit target before the player arrives, so they never land in void. Configurable radius viaWithGenerationRadius. - Player transit —
ITransitionService.TeleportPlayerwith cancellablePlayerEntering+PlayerLeft/PlayerEnteredevents, plus opt-in helpers (PortalBlockBase,DimensionCommandBuilder). - Travel policy per dimension — spawn behavior (
SameCoordinates/DimensionSpawn/LastVisited, with persisted per-player position memory) and forced game mode (Preserve/Force). - Persistence — dimension manifest, generated-column set, and per-player positions survive restarts. Dimensions from uninstalled mods are quarantined (chunks kept, transit refused).
- Client mirror — the dimension list is replicated to clients via
IManifoldClient. - Zero Harmony patches — built entirely on the public
VintagestoryAPI.
Downloads
Manifold-0.1.0.zip— the library (install this; other mods depend on it).ManifoldSample-0.1.0.zip— optional demo mod showing void + flat dimensions and/voiddim,/flatdim,/overworlddimcommands.
Compatibility
Vintage Story 1.21+ · .NET 10 · no Harmony required.
Documentation
https://pixnop.github.io/Manifold/
Known limitations (v1 roadmap)
Worldgen is a bounded region around the transit point — walking past it hits unloaded chunks. Infinite streaming, async generation, and per-dimension inventory are planned for v1 (see issues). The minimap stays on the overworld tiles (closed-source engine limitation).