
RedIMGRetriever
允许Redscript模组从网络获取图像,并通过热创建存档文件和热挂载的方式在ink中显示它们。ᕕ( ᐛ )ᕗ
查看大图- 简介 -
Cyberpunk 的 ink UI 只能绘制游戏档案中的纹理——这意味着模组 UI 从未能够显示来自互联网的图片。我的 Redscript Config Framework 在游戏内渲染整个 Nexus 模组页面作为文档,而那些页面充满了
[img]
原本会变成可怜的占位符芯片的标签。这让我比应有的更困扰,所以我深入研究了这个问题。
RedIMGRetriever 就是成果:一个 RED4ext 插件,可以下载图片(PNG、JPG、WebP、BMP 或 GIF,仅限 https),将其即时转换为游戏自身的纹理格式,包装在运行时档案中并挂载——之后任何 ink 控件都可以像游戏自带的图片一样绘制它。下载内容会缓存在磁盘上,因此每张图片只会获取一次。
自 0.3.0 版本起,它还可以读取游戏自身的截图文件夹(图片\赛博朋克 2077),并且动画 GIF 真正实现了动画效果——每一帧都被打包到精灵表中,并以正确的速度播放。
简而言之——游戏自己的 UI 可以绘制互联网的图片(以及你的截图)!(ノ◕ヮ◕)ノ
- 对于玩家 -
无需任何配置。将其安装在 [b]Redscript Config Framework 2.0.0+[/b] 旁边,游戏内的 WIKI 页面就会开始显示图片,尺寸正确,位置就在模组作者放置的地方。使用 RCF 2.1.5+,动画 GIF 可以播放,作者在 Nexus 页面上设置的尺寸会被尊重,并且所有内容都能渲染到真正的 4K 分辨率。损坏的链接和网络问题会优雅地降级回旧的占位符芯片。
使用 [b]RedWindows 1.2.0+[/b],你还可以在 Dock 上获得「照片」——一个用于查看你自己截图文件夹的查看器。你的截图永远不会离开你的机器;插件只会读取那一个文件夹。
下载内容缓存在
r6\storages\RedIMGRetriever
随时删除该文件夹以回收空间,它会按需重新填充。插件在其中构建的纹理每次启动时都会自动清理。
- 对于模组作者 -
该插件暴露了一个小型轮询驱动的原生 API——发起获取请求,轮询直到图像集路径到达,然后将其绑定到任何 inkImage:
import RedIMGRetriever.*
// 在 UI tick / 轮询中:
let atlas: String = RedIMG.PrepareDocImage(url);
if !Equals(atlas, "") {
img.SetAtlasResource(ResRef.FromString(atlas));
img.SetTexturePart(n"full");
// 根据图像的真实宽高比调整控件大小:
let w: Float = RedIMG.GetDocUvWidth(url); // 比例,较长边 = 1.0
let h: Float = RedIMG.GetDocUvHeight(url);
} else if RedIMG.IsDocFailed(url) {
// 链接错误或网络错误 - 停止轮询,显示你的占位符
}
三种源形式会进入同一个调用中,你传递给 PrepareDocImage 的任何字符串都可以在其他地方作为句柄使用:
"https://..." // 互联网
"shot://" + name // 游戏的截图文件夹
RedIMG.WithMax(source, 1920, 1080) // 以上两者之一,限制在 1080p
[b]GIF[/b] 以精灵表的形式提供:部分 [b]frame_000[/b] 到 [b]frame_127[/b] 位于 [b]full[/b] 旁边(full 兼作第 0 帧)。使用 SetTexturePart 按照作者设定的延迟切换这些帧,以 NowMs 作为时钟——UI tick 不是时钟:
let frames: Int32 = RedIMG.GetDocFrameCount(url); // 1 = 静态图片
let delay: Float = RedIMG.GetDocFrameDelay(url, i); // 秒,每帧
完整的接口:
RedIMG.PrepareDocImage(url) -> String // 挂载后的图像集存放路径,正在处理/失败时返回 ""
RedIMG.WithMax(url, w, h) -> String // 请求级分辨率上限;该规格可替换所有地方的 url
RedIMG.GetDocUvWidth(url) -> Float // 单帧宽高比,较长边 = 1.0
RedIMG.GetDocUvHeight(url) -> Float
RedIMG.GetDocPixelWidth(url) -> Int32 // 单帧的真实像素尺寸 - 以自然分辨率显示
RedIMG.GetDocPixelHeight(url) -> Int32
RedIMG.GetDocFrameCount(url) -> Int32 // 1 为静态,GIF 最多 128 帧
RedIMG.GetDocFrameDelay(url, i) -> Float // 秒
RedIMG.ListScreenshots() -> array<String> // 图片\赛博朋克 2077,最新的在前
RedIMG.NowMs() -> Float // 单调毫秒 - 动画时钟
RedIMG.IsDocFailed(url) -> Bool // 永久失败 - 停止轮询
RedIMG.IsAvailable() -> Bool // DLL 是否已加载
RedIMG.Log(message) // 写入 red4ext\logs\RedIMGRetriever-*.log 的一行
RedIMG.ClearCache() // 清空磁盘下载缓存
获取、解码和档案构建都在工作线程上运行;PrepareDocImage 永远不会阻塞游戏。纹理存储最高可达真正的 4K(长边 4096,短边 2160,感知方向——永不上采样),GIF 最多保留 128 帧(更长的 GIF 会均匀丢帧而不改变循环时长)。设计上仅支持 https;截图文件夹仅通过文件名读取。
- 更新 -
0.3.0 - 动画 GIF。拍照模式/截图图片支持。最大 4K 而非 2K。
0.2.2 - 地址哈希现在软失败。
0.2.1 - 为 Redscript Configuration Framework 的大 UI 选择器附带模组卡片。无功能变化。
0.2.0 - 初始公开版本。支持通过 https 的 PNG、JPG 和 WebP,磁盘缓存,运行时档案挂载,宽高比原生支持。动画 GIF 支持正在研究中。
- 需求 -
本模组需要您安装以下内容: RED4ext Redscript
可选(但它是存在的理由): Redscript Configuration Framework - v2.0.0+ RedWindows - v1.2.0+(Dock 上的「照片」截图查看器)
- 安装 -
- 安装所有依赖项。
- 将下载的文件解压到您的主游戏目录中。
- 卸载 -
删除目录 \Cyberpunk 2077\red4ext\plugins\RedIMGRetriever 删除目录 \Cyberpunk 2077\r6\scripts\RedIMGRetriever 删除目录 \Cyberpunk 2077\r6\storages\RedIMGRetriever(图片缓存)
存档中不会写入任何信息,因此随时可以安全移除。
- 鸣谢 -
基于 psiberx 的 RedLib 和 WopsS 的 RED4ext.SDK 构建,两者均为 MIT 许可。运行时档案挂载遵循 psiberx 在 ArchiveXL 中建立的机制。
感谢 RED4ext 和 redscript 社区提供的工具和文档,以及 WolvenKit 项目对游戏文件格式的映射。
DigitalVixen 模组套件的一部分。 您现在也可以在 Discord 上找到我:点击这里!
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。