#runescape #osrs #huffman-coding #filesystem #rs3

rs-cache

RuneScape缓存的高层、只读虚拟文件API

36个版本

0.8.6 2023年7月11日
0.8.5 2022年11月7日
0.8.4 2022年6月12日
0.8.2 2022年2月5日
0.1.1 2020年2月28日

22游戏 中排名

Download history 13/week @ 2024-03-12 1/week @ 2024-03-26 9/week @ 2024-04-02

每月下载量:98

MIT 许可证

120KB
2.5K SLoC

rs-cache

Build API Crate dependency status OSRS Version RS3 Version

RuneScape缓存的高层、只读虚拟文件API。

这个包为Oldschool RuneScape和RuneScape 3缓存文件系统提供了高性能的数据读取。它可以读取同步客户端缓存与服务器所需的数据。还有一些加载器可以访问缓存中的定义,如物品或NPC。

对于读取密集型的工作负载,可以使用写入器来防止持续分配缓冲区。默认情况下,每次读取都会分配一个具有正确容量的写入器。

RuneScape的聊天系统使用Huffman编码压缩消息;这个库包含一个用于解压缩这些消息的Huffman实现。

当RuneScape客户端发送游戏数据包时,ID会被编码,可以使用IsaacRand实现进行解码。这些ID由客户端以可预测的随机顺序编码,如果服务器有自己的IsaacRand并具有相同的编码/解码密钥,则可以反转这些ID。这些密钥在客户端登录时发送,是用户特定的。只有当数据包是游戏数据包时,才会发送编码后的数据包ID。

请注意,这个包仍在发展中;OSRS和RS3尚未完全支持/实现,可能包含错误或缺少核心功能。如果您需要功能或发现错误,请考虑提交问题

有用链接
        版本
        文档
        示例

安全性

为了以高性能的方式读取字节,缓存使用了memmap2。这可能是不安全的,因为它在底层文件随后被修改时可能导致未定义行为,无论是在进程内还是在进程外。在这里使用Mmap是安全的,因为RuneScape缓存是一个只读的二进制文件系统。即使在File被丢弃之后,映射仍然有效,它与创建它的File完全独立。因此,不安全的使用不会被传递出去。当Cache被丢弃时,内存将会随后取消映射。

特性

缓存协议默认为OSRS。要使用RS3协议,可以启用rs3功能标志。许多类型继承了serdeSerializeDeserialize功能。可以使用serde功能标志来启用(反)序列化任何兼容类型。

快速入门

对于仅在这个线程中保持本地的实例,可以简单地使用

use rscache::Cache;

let cache = Cache::new("./data/osrs_cache").unwrap();

let index_id = 2; // Config index.
let archive_id = 10; // Archive containing item definitions.

let buffer = cache.read(index_id, archive_id).unwrap();

如果您想跨多个线程共享实例,可以通过将其包装在一个Arc中来实现

use rscache::Cache;
use std::sync::Arc;

let cache = Arc::new(Cache::new("./data/osrs_cache").unwrap());

let c = Arc::clone(&cache);
std::thread::spawn(move || {
    c.read(0, 10).unwrap();
});

std::thread::spawn(move || {
    cache.read(0, 10).unwrap();
});

建议的用法是使用once_cell进行包装,这是从任何地方和任何时候访问缓存数据的最容易的方式。无需ArcMutex,因为Cache始终是Send & Sync

use rscache::Cache;
use once_cell::sync::Lazy;

static CACHE: Lazy<Cache> = Lazy::new(|| {
    Cache::new("./data/osrs_cache").unwrap()
});

std::thread::spawn(move || {
    CACHE.read(0, 10).unwrap();
});

std::thread::spawn(move || {
    CACHE.read(0, 10).unwrap();
});

集成测试正在Oldschool RuneScape版本180上运行,您可以在任何时间运行,因为缓存已包含在./data/osrs_cache目录中。RS3集成测试正在版本904上运行。RS3缓存太大,无法包含在GitHub上。

此crate被标记为实验性。一旦我需要在自己的项目中实现这些功能,我将实现额外的功能。如果您需要特定的功能,请提出问题

用法

将其添加到您的Cargo.toml

[dependencies]
rs-cache = "0.8.6"

示例可以在examples目录中找到,其中包含两种更新协议。

致谢

以下资源帮助开发了此crate
        OpenRS
        RuneLite
        OSRS Cache Parsing Blog
        RSMod
        Librsfs
        OSRSBox
        Jagex-Store-5
        Matrix 876

许可证

rs-cache 在MIT许可证条款下分发。

有关详细信息,请参阅 LICENSE

依赖项

~2.7-4MB
~73K SLoC