Repository navigation
Windows x64 build of REDbridge 0.12.0. It is framework dependent, so it needs the .NET 10 runtime (winget install Microsoft.DotNet.Runtime.10).
Unzip it anywhere and point REDcode (redcode.bridgePath) or EDGEdeck (edgedeck.bridgePath) at REDbridge.exe, or let REDcode's Install REDbridge or EDGEdeck's Get REDbridge fetch it.
New
-
sector.findandsector.nodes(issue #11, #11), for EDGEbuilder's world map, sector view and in-game inspector.sector.find({ box?, kinds?, levels? })lists the streaming sectors of Night City's two streaming blocks, the base game's and Phantom Liberty's (26,347 in game 2.5): each with its path, kind (exterior,interior,quest,navigation,alwaysLoaded), grid and level from names likeexterior_-12_-7_0_1, streaming box, the block that lists it, the archive it is in and its number of variants. Optionally only those whose box meetsbox, of the given kinds and levels. The list is read once per bridge, in about 2.5 s, and kept: later calls take milliseconds.sector.nodes(path, { kinds?, bounds?, archive?, root? })lists one sector's placed things, one item per node-data entry: the node's class, its reference path when known, its global node id, the resource it shows (mesh, entity template, decal material, effect, ...) and appearance, the world transform, its streaming ranges, and for instanced meshes one world placement per copy. Game 2.5's cooked nodes hold several meshes each; every item names its own. Withbounds: trueevery mesh item has a world box (each mesh read once per bridge); instanced meshes always have the one the sector keeps.archiveandrootread a mod's sector, as formesh.info.
{ "method": "sector.find", "params": { "box": { "min": [-1700, 1200, 0], "max": [-1650, 1250, 50] }, "kinds": ["exterior"] } } { "method": "sector.nodes", "params": { "path": "base\\worlds\\03_night_city\\_compiled\\default\\exterior_-25_18_0_0.streamingsector", "bounds": true } }Phantom Liberty's sectors have their own paths (
...\default\ep1\...), so none replaces a base sector of the same path in 2.5 (replacesis false for all). Mod sectors are read bysector.nodesonly;sector.findlists the game's. -
mesh.info,mesh.infoManyandsector.buildread mods (issue #12, #12), for EDGEbuilder's Browse of mod assets. Two optional parameters name where to look before the game's archives:archive, a mod's.archiveanywhere on disk, androot, a folder of loose files laid out as in an archive, such as a REDcode project'ssource\archive. The answer is the same as for a game file, and an entity's parts are looked up the same way, so a part may be in the mod or in the game.{ "method": "mesh.infoMany", "params": { "paths": ["edgefab\\chair\\chair.mesh"], "archive": "E:\\...\\archive\\pc\\mod\\edgefab_chair.archive" } } { "method": "mesh.infoMany", "params": { "paths": ["edgefab\\chair\\chair.mesh"], "root": "E:\\...\\MyMod\\source\\archive" } }The archive is opened for the call and closed after it, so REDcode or WolvenKit can pack the mod again in between; reading a mod archive's index takes a few milliseconds.
-
A solid mesh in
sector.build(issue #15, #15), for EDGEbuilder's Solid switch."solid": trueon a scene's mesh writes a kinematicworldInstancedDestructibleMeshNodein place ofworldMeshNode: it stops V, bullets, melee and cars, stays put, looks the same and takes an appearance. EDGEbuilder's bake probe proved this node in game 2.5, andsector.buildwrites the same bytes. Withoutsolid, a bake stays as it was. A mesh with no collision data still bakes, with a warning that names it, since it shows but is not solid;solidon an entity or a light is a warning too, and they bake as usual.{ "id": "crate", "kind": "mesh", "resource": "base\\...\\cargo_crate_a.mesh", "solid": true, "transform": { } } -
mesh.infoandmesh.infoManysayhasCollision(issue #15): true when a mesh hasmeshMeshParamPhysics, so an editor can say before a bake which objects cannot be solid. An entity's is null. -
An entity's part that could not be read now says why, in the part's new
errorfield, and has no bounds.
Changed
-
sector.buildtakes a resource that is not in the game's archives when the scene gives the object'sbounds: a warning names the resource, so an editor can say which mods the bake needs. Without bounds, or withoutarchiveorrootthat has it, it is still refused, and the message says what to give. -
sector.buildwrites the.xlin ArchiveXL'sstreaming: blocks:form (issue #13, #13), the form EDGEbuilder's bake probe loaded in game 2.5 with ArchiveXL 1.28.6, instead of a resource patch of the world'sall.streamingblock:streaming: blocks: - edgebuilder\<name>\<name>.streamingblock
-
The file is now
<name>.archive.xl, so it sits beside<name>.archivewhen the project is packed under that mod name. A<name>.xlwritten by an earliersector.buildis removed, with a warning, so the block is not added twice; one that REDbridge did not write is left alone.
Fixed
cr2w.searchfinds a material's values (REDcode issue #20, Edgemodders/REDcode#20): a search formlsetup, a setup's file name orMultilayerSetupnow finds them in a mesh'slocalMaterialBuffer.materials.<n>.values, where it found nothing before. A hit's preview isMultilayerSetup: <path>.mesh.itemsfinds outfit sets, glasses, helmets, masks and more (REDcode issue #17, Edgemodders/REDcode#17): 23 of the 229 appearance files it reads were skipped, because some of their looks have no component list at all. Among them both outfit sets (outfit\set_01.app, base game and Phantom Liberty), every pair of glasses, several helmets and masks, food, drinks and two cyberware. The cop jacket's mesh now givesItems.Cop_01_Set_Jacketin its two looks, where it gave nothing.cr2w.searchpreviews end with the file name: a long preview is cut in the middle, not at the end, and a reference shows its path alone, without its type and hash.
Built with WolvenKit 10.0.0-beta.1 from its NuGet packages. WolvenKit's source is https://github.com/WolvenKit/WolvenKit/tree/10.0.0-beta.1 (GPL-3.0), and the bridge's source is this repository.