• Hallo Besucher!

    Du bist neu im Forum? Dann registriere dich hier, um Diskussionen beizutreten oder eigene Themen zu erstellen. Für die Registrierung ist es erforderlich, dass du einen Spielaccount bei Die Stämme hast.

    Andernfalls kannst du dich hier direkt einloggen.

    Falls du dein Passwort vergessen hast, kannst du hier ein neues Passwort anfordern.

Weltdaten und Interface

MKich

Team
Reaktionspunktzahl
81
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

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:
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 :)