1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
use std::collections::{
hash_map::{self, Entry},
HashMap,
};
#[cfg(feature = "serde-derive")]
use serde::{Deserialize, Serialize};
use crate::{
codec,
definition::osrs::{
Definition, FetchDefinition, ItemDefinition, LocationDefinition, MapDefinition,
NpcDefinition, ObjectDefinition,
},
Cache,
};
#[derive(Clone, Eq, PartialEq, Debug, Default)]
#[cfg_attr(feature = "serde-derive", derive(Serialize, Deserialize))]
pub struct ItemLoader(HashMap<u16, ItemDefinition>);
impl_osrs_loader!(ItemLoader, ItemDefinition, index_id: 2, archive_id: 10);
#[derive(Clone, Eq, PartialEq, Debug, Default)]
#[cfg_attr(feature = "serde-derive", derive(Serialize, Deserialize))]
pub struct NpcLoader(HashMap<u16, NpcDefinition>);
impl_osrs_loader!(NpcLoader, NpcDefinition, index_id: 2, archive_id: 9);
#[derive(Clone, Eq, PartialEq, Debug, Default)]
#[cfg_attr(feature = "serde-derive", derive(Serialize, Deserialize))]
pub struct ObjectLoader(HashMap<u16, ObjectDefinition>);
impl_osrs_loader!(ObjectLoader, ObjectDefinition, index_id: 2, archive_id: 6);
#[derive(Debug)]
pub struct MapLoader<'cache> {
cache: &'cache Cache,
maps: HashMap<u16, MapDefinition>,
}
impl<'cache> MapLoader<'cache> {
#[inline]
pub fn new(cache: &'cache Cache) -> Self {
Self {
cache,
maps: HashMap::new(),
}
}
#[inline]
pub fn load(&mut self, id: u16) -> crate::Result<&MapDefinition> {
if let Entry::Vacant(entry) = self.maps.entry(id) {
let x = id >> 8;
let y = id & 0xFF;
let map_archive = self.cache.archive_by_name(5, format!("m{}_{}", x, y))?;
let buffer = self.cache.read_archive(map_archive)?;
let buffer = codec::decode(&buffer)?;
entry.insert(MapDefinition::new(id, &buffer)?);
}
Ok(&self.maps[&id])
}
}
#[derive(Debug)]
pub struct LocationLoader<'cache> {
cache: &'cache Cache,
locations: HashMap<u16, LocationDefinition>,
}
impl<'cache> LocationLoader<'cache> {
#[inline]
pub fn new(cache: &'cache Cache) -> Self {
Self {
cache,
locations: HashMap::new(),
}
}
#[inline]
pub fn load(&mut self, id: u16, keys: &[u32; 4]) -> crate::Result<&LocationDefinition> {
if let Entry::Vacant(entry) = self.locations.entry(id) {
let x = id >> 8;
let y = id & 0xFF;
let loc_archive = self.cache.archive_by_name(5, format!("l{}_{}", x, y))?;
let buffer = self.cache.read_archive(loc_archive)?;
let buffer = codec::decode_with_keys(&buffer, keys)?;
entry.insert(LocationDefinition::new(id, &buffer)?);
}
Ok(&self.locations[&id])
}
}