Skip to content

REDbridge 0.12.0

Latest

Choose a tag to compare

@github-actions github-actions released this 05 Nov 20:25

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.find and sector.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 like exterior_-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 meets box, 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. With bounds: true every mesh item has a world box (each mesh read once per bridge); instanced meshes always have the one the sector keeps. archive and root read a mod's sector, as for mesh.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 (replaces is false for all). Mod sectors are read by sector.nodes only; sector.find lists the game's.

  • mesh.info, mesh.infoMany and sector.build read 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 .archive anywhere on disk, and root, a folder of loose files laid out as in an archive, such as a REDcode project's source\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": true on a scene's mesh writes a kinematic worldInstancedDestructibleMeshNode in place of worldMeshNode: 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, and sector.build writes the same bytes. Without solid, 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; solid on 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.info and mesh.infoMany say hasCollision (issue #15): true when a mesh has meshMeshParamPhysics, 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 error field, and has no bounds.

Changed

  • sector.build takes a resource that is not in the game's archives when the scene gives the object's bounds: a warning names the resource, so an editor can say which mods the bake needs. Without bounds, or without archive or root that has it, it is still refused, and the message says what to give.

  • sector.build writes the .xl in ArchiveXL's streaming: 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's all.streamingblock:

    streaming:
      blocks:
        - edgebuilder\<name>\<name>.streamingblock
  • The file is now <name>.archive.xl, so it sits beside <name>.archive when the project is packed under that mod name. A <name>.xl written by an earlier sector.build is removed, with a warning, so the block is not added twice; one that REDbridge did not write is left alone.

Fixed

  • cr2w.search finds a material's values (REDcode issue #20, Edgemodders/REDcode#20): a search for mlsetup, a setup's file name or MultilayerSetup now finds them in a mesh's localMaterialBuffer.materials.<n>.values, where it found nothing before. A hit's preview is MultilayerSetup: <path>.
  • mesh.items finds 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 gives Items.Cop_01_Set_Jacket in its two looks, where it gave nothing.
  • cr2w.search previews 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.