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 在 游戏 中排名
每月下载量:98
120KB
2.5K SLoC
rs-cache
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
功能标志。许多类型继承了serde
的Serialize
和Deserialize
功能。可以使用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
进行包装,这是从任何地方和任何时候访问缓存数据的最容易的方式。无需Arc
或Mutex
,因为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