RuneHive-Tarnish
Neural OSRS Enhancement Framework
Loading...
Searching...
No Matches
ObjectDefinitionDecoder.java
1package com.osroyale.fs.cache.decoder;
2
3import com.osroyale.fs.cache.FileSystem;
4import com.osroyale.fs.cache.archive.Archive;
5import com.osroyale.fs.util.ByteBufferUtil;
6import com.osroyale.game.world.object.GameObjectDefinition;
7import org.apache.logging.log4j.LogManager;
8import org.apache.logging.log4j.Logger;
9
10import java.nio.ByteBuffer;
11
49
50* A class which parses object definitions.
51 *
52 * @author Ryley Kimmel <ryley.kimmel@live.com>
53 * @author Artem Batutin <artembatutin@gmail.com>
54 */
55public final class ObjectDefinitionDecoder implements Runnable {
56
58 private final static Logger LOGGER = LogManager.getLogger(ObjectDefinitionDecoder.class);
59
61 private final FileSystem fs;
62
69 this.fs = fs;
70 }
71
72 @Override
73 public void run() {
74 LOGGER.info("Loading object definitions.");
75 Archive archive = fs.getArchive(FileSystem.CONFIG_ARCHIVE);
76 ByteBuffer dat = archive.getData("loc.dat");
77 ByteBuffer idx = archive.getData("loc.idx");
78
79 int count = idx.getShort() & 0xFFFF;
80
82 throw new AssertionError("GameObjectDefinition size should be " + GameObjectDefinition.MAX_DEFINITIONS + ", not " + count);
83 }
84
85 int pos = 0;
86 int loaded = 0;
87 for (int index = 0; index < count; index++) {
88 dat.position(pos);
89 decode(index, dat);
90 pos += idx.getShort() & 0xFFFF;
91 loaded++;
92 }
93 LOGGER.info("Loaded " + loaded + " object definitions.");
94 }
95
103 private static void decode(int id, ByteBuffer buffer) {
104 String name = "null";
105 String desc = "null";
106 int width = 1;
107 int length = 1;
108 boolean solid = true;
109 boolean impenetrable = true;
110 boolean hasActions = false;
111 boolean interactive = false;
112 boolean wall = false;
113 boolean decoration = false;
114 boolean removeClipping = false;
115 boolean models = false;
116 boolean is10 = true;
117 int walkingFlag = 0;
118
119 int lastOpcode = -1;
120 while (true) {
121 int opcode = buffer.get() & 0xff;
122 if (opcode == 0) {
123 break;
124 }
125
126 if (opcode == 1) {
127 int len = buffer.get();
128 if (len > 0 && !models) {
129 for (int idx = 0; idx < len; idx++) {
130 buffer.position(buffer.position() + Short.BYTES);
131 if (buffer.get() != 10 && idx == 0) {
132 is10 = false;
133 }
134 }
135 } else {
136 buffer.position(buffer.position() + len * (Byte.BYTES + Short.BYTES));
137 }
138 } else if (opcode == 2) {
139 name = ByteBufferUtil.readStringCp1252NullTerminated(buffer);
140 } else if (opcode == 3) {
141
142 } else if (opcode == 5) {
143 int len = buffer.get();
144 if (len > 0) {
145 models = true;
146 buffer.position(buffer.position() + len * Short.BYTES);
147 }
148 } else if (opcode == 14) {
149 width = buffer.get();
150 } else if (opcode == 15) {
151 length = buffer.get();
152 } else if (opcode == 17) {
153 solid = false;
154 impenetrable = false;
155 } else if (opcode == 18) {
156 impenetrable = false;
157 } else if (opcode == 19) {
158 hasActions = (buffer.get() == 1);
159 } else if (opcode == 21) {
160
161 } else if (opcode == 22) {
162
163 } else if (opcode == 23) {
164
165 } else if (opcode == 24) {
166 buffer.getShort();
167 } else if (opcode == 27) {
168 // interact type = 1
169 } else if (opcode == 28) {
170 buffer.get();
171 } else if (opcode == 29) {
172 buffer.get();
173 } else if (opcode == 39) {
174 buffer.get();
175 } else if (opcode >= 30 && opcode < 35) {
176 ByteBufferUtil.readStringCp1252NullTerminated(buffer);
177 interactive = true;
178 } else if (opcode == 40) {
179 int len = buffer.get();
180 for (int i = 0; i < len; i++) {
181 buffer.getShort();
182 buffer.getShort();
183 }
184 } else if (opcode == 41) {
185 int len = buffer.get();
186 for (int i = 0; i < len; i++) {
187 buffer.getShort();
188 buffer.getShort();
189 }
190 } else if (opcode == 61) {
191 buffer.getShort();
192 } else if (opcode == 62) {
193 wall = true;
194 } else if (opcode == 64) {
195
196 } else if (opcode == 65) {
197 buffer.getShort();
198 } else if (opcode == 66) {
199 buffer.getShort();
200 } else if (opcode == 67) {
201 buffer.getShort();
202 } else if (opcode == 68) {
203 buffer.getShort();
204 } else if (opcode == 69) {
205 walkingFlag = buffer.get();
206 } else if (opcode == 70) {
207 buffer.getShort();
208 } else if (opcode == 71) {
209 buffer.getShort();
210 } else if (opcode == 72) {
211 buffer.getShort();
212 } else if (opcode == 73) {
213 decoration = true;
214 } else if (opcode == 74) {
215 removeClipping = true;
216 } else if (opcode == 75) {
217 buffer.get();
218 } else if (opcode == 77) {
219 buffer.getShort();
220 buffer.getShort();
221
222 int len = buffer.get() & 0xFF;
223 for (int i = 0; i <= len; ++i) {
224 buffer.getShort();
225 }
226 } else if (opcode == 78) {
227 buffer.getShort();
228 buffer.get();
229 } else if (opcode == 79) {
230 buffer.getShort();
231 buffer.getShort();
232 buffer.get();
233
234 int len = buffer.get() & 0xFF;
235 for (int i = 0; i < len; ++i) {
236 buffer.getShort();
237 }
238 } else if (opcode == 81) {
239 buffer.get();
240 } else if (opcode == 82) {
241 buffer.getShort();
242 } else if (opcode == 89) {
243
244 } else if (opcode == 92) {
245 buffer.getShort();
246 buffer.getShort();
247 buffer.getShort();
248
249 int len = buffer.get() & 0xFF;
250 for (int i = 0; i <= len; ++i) {
251 buffer.getShort();
252 }
253 } else if (opcode == 249) {
254 int len = buffer.get();
255 for (int i = 0; i < len; i++) {
256 boolean isString = buffer.get() == 1;
257 ByteBufferUtil.getMedium(buffer);
258 if (isString) {
259 ByteBufferUtil.readStringCp1252NullTerminated(buffer);
260 } else {
261 buffer.getInt();
262 }
263 }
264 } else {
265 throw new RuntimeException("unknown object opcode: " + opcode + ", last="+lastOpcode);
266 }
267 lastOpcode = opcode;
268 }
269
270 if (!name.equals("null")) {
271 hasActions = models && is10;
272 if (interactive) {
273 hasActions = true;
274 }
275 }
276
277 if (removeClipping) {
278 solid = false;
279 impenetrable = false;
280 }
281
282 int distance = 1;
283
284 switch(id) {
285 case 31561:
286 distance = 2;
287 break;
288 case 26254:
289 name = "Donator Box";
290 break;
291 }
292
293 GameObjectDefinition.addDefinition(new GameObjectDefinition(id, name, desc, width, length, distance, solid, impenetrable, hasActions, wall, decoration, walkingFlag));
294 }
295}
ByteBuffer getData(String name)
Definition Archive.java:147