MKich
Team
- Reaktionspunktzahl
- 137
Ich habe mir jetzt mal die mühe gemacht das world.dat.gz file upzudaten
man kann es auf Github runter laden: https://github.com/extremeCrazyCode...71f1e93199b2787e761b27/resources/world.dat.gz
Viel Spaß an alle Skripter mit der neuen Version
man kann es auf Github runter laden: https://github.com/extremeCrazyCode...71f1e93199b2787e761b27/resources/world.dat.gz
DS selber hat ja die neuen Daten daher war der Plan sie über diese schnittstelle zu holen
Wenn man bisschen mit dem Gastzugang auf der Map rumfährt sieht man sofort diese URL:
https://*****.die-staemme.de/map.php?***_***=1
Diese API gibt die Daten für einen 20x20 Bereich zurück was aber nicht gerade effizient ist, weil man damit ca 2,5k Requests machen muss...
Im Quellcode (map.js) ist zu finden, dass man mehrere Bereiche gleichzeitig laden kann, weil es aber ein Limit gibt wie lang eine URL sein kann musste ich dennoch die komplette Karte auf 4 Teile aufteilen (aber besser als auf 2,5k)
ergibt etwa 8,5MB json Rohdaten
in jedem block gibt es ein 2-Dimensionales Array welches die daten für die world.dat enthält
Die Orientierung der Daten raus zu finden war dann Try and error
Was dabei dann aber gleich auffällt ist, dass die Bereiche geändert wurden. Die muss man also re-mappen....
Neue Indizes:
Alte IDs:
Damit ergibt sich folgendes mapping:
Die Daten dann binary exportieren zeile für Zeile und gzip komprimieren und die neue world.dat.gz ist fertig
Hier noch das skript das ich benutzt habe:
Wenn man bisschen mit dem Gastzugang auf der Map rumfährt sieht man sofort diese URL:
https://*****.die-staemme.de/map.php?***_***=1
Diese API gibt die Daten für einen 20x20 Bereich zurück was aber nicht gerade effizient ist, weil man damit ca 2,5k Requests machen muss...
Im Quellcode (map.js) ist zu finden, dass man mehrere Bereiche gleichzeitig laden kann, weil es aber ein Limit gibt wie lang eine URL sein kann musste ich dennoch die komplette Karte auf 4 Teile aufteilen (aber besser als auf 2,5k)
ergibt etwa 8,5MB json Rohdaten
in jedem block gibt es ein 2-Dimensionales Array welches die daten für die world.dat enthält
Die Orientierung der Daten raus zu finden war dann Try and error
Was dabei dann aber gleich auffällt ist, dass die Bereiche geändert wurden. Die muss man also re-mappen....
Neue Indizes:
0 ... 3 => gras1 ... gras4
4 ... 15 => [vX_left, vX] mit X = 1 ... 6
16 ... 27 => [bX_left, bX] mit X = 1 ... 6
28 ... 31 => berg1 ... berg4
32 ... 47 => forest000 ... forest1111
48 => see
49 => event_xmas
50 => event_easter
51 => ghost
52 => event_merchant
53 => event_wizard
54 => event_easter2014
55 => event_fall2014
56 => rune_village
56 => citynw
57 => cityne
58 => citysw
59 => cityse
60 ... 61 => cityn1 ... cityn2
62 ... 63 => citye1 ... citye2
64 ... 65 => citys1 ... citys2
66 ... 67 => cityw1 ... cityw2
68 ... 71 => citym1 ... citym4
72 ... 73 => citye3 ... citye4
74 ... 75 => cityw3 ... cityw4
76 ... 81 => citym5 ... citym10
82 ... 86 => stronghold0 ... stronghold4
87 => university
Alte IDs:
0-3 Gras
8-11 Berg
12 See
16-31 Wald
Damit ergibt sich folgendes mapping:
0-3 -> gleich lassen
28-31 -> val-20
48 -> 12
32-47 -> val-16
sonst -> error
Die Daten dann binary exportieren zeile für Zeile und gzip komprimieren und die neue world.dat.gz ist fertig
Hier noch das skript das ich benutzt habe:
Code:
import json
adr = 'https://****.die-staemme.de/map.php?'
def generateRequestURL():
global adr
url = adr
for i in range(0, 999, 20):
for j in range(0, 299, 20):
url = url + "&" + str(i) + "_" + str(j) + "=1"
print('use this', url)
url = adr
for i in range(0, 999, 20):
for j in range(300, 599, 20):
url = url + "&" + str(i) + "_" + str(j) + "=1"
print('use this', url)
url = adr
for i in range(0, 999, 20):
for j in range(600, 899, 20):
url = url + "&" + str(i) + "_" + str(j) + "=1"
print('use this', url)
url = adr
for i in range(0, 999, 20):
for j in range(900, 999, 20):
url = url + "&" + str(i) + "_" + str(j) + "=1"
print('use this', url)
def mergeData(*files):
#innen = nach unten pos
#außen = nach rechts pos
merged = {}
for f in files:
with open(f, 'r') as file:
data = file.read()
for tile in json.loads(data):
x_base = tile["x"]
y_base = tile["y"]
for i in range(20):
if not x_base + i in merged:
merged[x_base + i] = {}
for j in range(20):
merged[x_base + i][y_base + j] = tile["tiles"][i][j]
heat_map = {}
with open("out.csv", 'w') as file:
for i in range(1000):
for j in range(1000):
if j > 0:
file.write(";")
file.write(str(merged[i][j]))
if merged[i][j] not in heat_map:
heat_map[merged[i][j]] = 0
heat_map[merged[i][j]] += 1
file.write("\n")
print(heat_map)
with open("world.dat", 'w') as file:
for j in range(1000):
for i in range(1000):
old_val = merged[i][j]
if 0 <= old_val and old_val <= 3:
new_val = old_val
elif 28 <= old_val and old_val <= 31:
new_val = old_val - 20
elif 48 == old_val:
new_val = 12
elif 32 <= old_val and old_val <= 47:
new_val = old_val - 16
else:
print("unknown val", old_val)
exit()
file.write(chr(new_val))
mergeData("tiles_0.json", "tiles_1.json", "tiles_2.json", "tiles_3.json")
Viel Spaß an alle Skripter mit der neuen Version