|
|
|
<!DOCTYPE html>
|
|
|
|
<html xmlns:th="http://www.thymeleaf.org" lang="en">
|
|
|
|
<head>
|
|
|
|
<title>OpenRS2 Archive</title>
|
|
|
|
<link rel="stylesheet" href="/webjars/bootstrap/css/bootstrap.min.css" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<nav class="navbar navbar-dark bg-dark mb-4">
|
|
|
|
<div class="container">
|
|
|
|
<a class="navbar-brand" href="/">OpenRS2 Archive</a>
|
|
|
|
<ul class="navbar-nav mr-auto">
|
|
|
|
<li class="nav-item active">
|
|
|
|
<a class="nav-link active" href="/caches">Caches</a>
|
|
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
<main class="container">
|
|
|
|
<div class="table-responsive">
|
|
|
|
<table class="table table-striped table-bordered table-hover">
|
|
|
|
<thead class="thead-dark">
|
|
|
|
<tr>
|
|
|
|
<th>Game</th>
|
|
|
|
<th>Build</th>
|
|
|
|
<th>Timestamp</th>
|
|
|
|
<th>Name</th>
|
|
|
|
<th>Indexes</th>
|
|
|
|
<th>Groups</th>
|
|
|
|
<th>Keys<sup><a href="#empty-locs">1</a></sup></th>
|
|
|
|
<th>Download</th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
<!--/*@thymesVar id="caches" type="java.util.List<org.openrs2.archive.cache.CacheExporter.Cache>"*/-->
|
|
|
|
<tr th:each="cache : ${caches}">
|
|
|
|
<td th:text="${cache.game}">runescape</td>
|
|
|
|
<td th:text="${cache.build}" class="text-right">550</td>
|
|
|
|
<td th:text="${#temporals.format(cache.timestamp, 'yyyy-MM-dd HH:mm:ss')}"></td>
|
|
|
|
<td th:text="${cache.name}"></td>
|
|
|
|
<td th:class="${cache.archiveStats}? (${cache.archiveStats.allIndexesValid}? 'table-success' : 'table-danger') + ' text-right'"
|
|
|
|
th:text="${cache.archiveStats}? ${cache.archiveStats.validIndexes} + ' / ' + ${cache.archiveStats.indexes} + ' (' + ${#numbers.formatPercent(cache.archiveStats.validIndexesFraction, 1, 2)} + ')' : 'Calculating...'">
|
|
|
|
Calculating...
|
|
|
|
</td>
|
|
|
|
<td th:class="${cache.groupStats}? (${cache.groupStats.allGroupsValid}? 'table-success' : 'table-warning') + ' text-right'"
|
|
|
|
th:text="${cache.groupStats}? ${#numbers.formatInteger(cache.groupStats.validGroups, 1, 'COMMA')} + ' / ' + ${#numbers.formatInteger(cache.groupStats.groups, 1, 'COMMA')} + ' (' + ${#numbers.formatPercent(cache.groupStats.validGroupsFraction, 1, 2)} + ')' : 'Calculating...'">
|
|
|
|
Calculating...
|
|
|
|
</td>
|
|
|
|
<td th:class="${cache.groupStats}? (${cache.groupStats.allKeysValid}? 'table-success' : 'table-warning') + ' text-right'"
|
|
|
|
th:text="${cache.groupStats}? ${#numbers.formatInteger(cache.groupStats.validKeys, 1, 'COMMA')} + ' / ' + ${#numbers.formatInteger(cache.groupStats.keys, 1, 'COMMA')} + ' (' + ${#numbers.formatPercent(cache.groupStats.validKeysFraction, 1, 2)} + ')' : 'Calculating...'">
|
|
|
|
Calculating...
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<div class="btn-group">
|
|
|
|
<a th:href="${'/caches/' + cache.id + '.zip'}"
|
|
|
|
class="btn btn-primary btn-sm">Cache</a>
|
|
|
|
<a th:href="${'/caches/' + cache.id + '.json'}"
|
|
|
|
class="btn btn-primary btn-sm">Keys</a>
|
|
|
|
</div>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
<p>
|
|
|
|
<sup id="empty-locs">1</sup> Map squares in the middle of the
|
|
|
|
sea are unreachable by normal players, making it impossible to
|
|
|
|
obtain the keys for their loc groups. However, the loc groups
|
|
|
|
for these map squares are empty. As XTEA does not hide the
|
|
|
|
length of the compressed data, this service infers which
|
|
|
|
encrypted loc groups are empty and includes them in the number
|
|
|
|
of valid keys, regardless of whether the key is known or not.
|
|
|
|
After downloading a cache from this service, a cache editor may
|
|
|
|
be used to replace the empty encrypted loc groups with
|
|
|
|
unencrypted replacements.
|
|
|
|
</p>
|
|
|
|
</main>
|
|
|
|
</body>
|
|
|
|
</html>
|