Skip to content

Commit 3e3e639

Browse files
update Compatibility.java
remove unneeded function add function to import old marker format
1 parent 7c1d824 commit 3e3e639

File tree

2 files changed

+96
-32
lines changed

2 files changed

+96
-32
lines changed

src/main/java/dev/nincodedo/bluemapbanners/BlueMapBanners.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.slf4j.Logger;
4141
import org.slf4j.LoggerFactory;
4242

43-
import java.io.File;
4443
import java.net.URI;
4544
import java.net.URISyntaxException;
4645
import java.util.NoSuchElementException;
@@ -63,14 +62,9 @@ public class BlueMapBanners implements ModInitializer {
6362
Timer daemonTimer;
6463

6564
@Override
66-
@SuppressWarnings("ResultOfMethodCallIgnored")
6765
public void onInitialize() {
6866
LOGGER.info("Loading BlueMap Banners v{}", VERSION);
6967

70-
String mapsConfigFolder = FabricLoader.getInstance().getConfigDir().resolve("bluemap-banners/maps").toString();
71-
new File(mapsConfigFolder).mkdirs();
72-
73-
Compatibility.init(mapsConfigFolder);
7468
markerManager = new MarkerManager();
7569
bannerMapIcons = new MapIcons();
7670
configManager = new ConfigManager();
@@ -84,6 +78,7 @@ public void onInitialize() {
8478
BlueMapAPI.onEnable(blueMapAPI -> {
8579
LOGGER.info("Integrating BlueMap Banners into BlueMap");
8680
markerManager.loadMarkerSets();
81+
Compatibility.init(server);
8782
bannerMapIcons.loadMapIcons(blueMapAPI);
8883
});
8984
});
Lines changed: 95 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,121 @@
11
package dev.nincodedo.bluemapbanners.util;
22

3-
import com.google.gson.Gson;
4-
import com.google.gson.GsonBuilder;
3+
import com.google.gson.JsonElement;
54
import com.google.gson.JsonObject;
65
import com.google.gson.JsonParser;
6+
import com.mojang.authlib.GameProfile;
7+
import dev.nincodedo.bluemapbanners.BlueMapBanners;
8+
import dev.nincodedo.bluemapbanners.manager.MarkerManager;
9+
import net.fabricmc.loader.api.FabricLoader;
10+
import net.minecraft.core.BlockPos;
11+
import net.minecraft.resources.ResourceKey;
12+
import net.minecraft.server.MinecraftServer;
13+
import net.minecraft.server.level.ServerLevel;
14+
import net.minecraft.world.entity.player.Player;
15+
import net.minecraft.world.level.GameType;
16+
import net.minecraft.world.level.Level;
17+
import net.minecraft.world.level.block.entity.BannerBlockEntity;
18+
import net.minecraft.world.level.block.state.BlockState;
19+
import net.minecraft.world.level.chunk.ChunkAccess;
20+
import org.jspecify.annotations.Nullable;
721

822
import java.io.IOException;
923
import java.io.Reader;
10-
import java.io.Writer;
1124
import java.nio.file.*;
25+
import java.util.Arrays;
26+
import java.util.Map;
27+
import java.util.UUID;
1228
import java.util.stream.Stream;
29+
import java.util.stream.StreamSupport;
1330

1431
public class Compatibility {
1532

33+
private static final UUID DEFAULT_PLAYER_UUID = UUID.fromString("e195d3d7-e6dc-456e-8393-e2f90816a1af");
34+
1635
/**
1736
* Apply compatibility fixes for old versions of BlueMap Banners
1837
*/
19-
public static void init(String mapsConfigFolder) {
20-
applyMarkerListRename(mapsConfigFolder);
38+
public static void init(MinecraftServer server) {
39+
importOldMarkers(server);
2140
}
2241

2342
/**
24-
* Rename marker list from "bluemap-banners" to "BlueMap Banners"
43+
* Import old format marker data from config folder maps/* into the new storage format.
44+
* After importing a file, it is moved to maps-imported/*.
2545
*/
26-
public static void applyMarkerListRename(String mapsConfigFolder) {
27-
if (mapsConfigFolder == null || mapsConfigFolder.isBlank()) return;
46+
public static void importOldMarkers(MinecraftServer server) {
47+
MarkerManager markerManager = MarkerManager.getInstance();
48+
String mapsConfigFolder = FabricLoader.getInstance().getConfigDir().resolve("bluemap-banners/maps").toString();
49+
50+
if (mapsConfigFolder.isBlank()) return;
2851

2952
Path folder = Paths.get(mapsConfigFolder);
3053
if (!Files.isDirectory(folder)) return;
3154

32-
try (Stream<Path> files = Files.walk(folder)) {
55+
Path importedFolder = folder.resolveSibling("maps-imported");
56+
try {
57+
Files.createDirectories(importedFolder);
58+
} catch (IOException e) {
59+
BlueMapBanners.LOGGER.error("Failed to create maps-imported directory: {}", e.getMessage());
60+
return;
61+
}
62+
63+
try (Stream<Path> files = Files.list(folder)) {
3364
files.filter(Files::isRegularFile)
34-
.forEach(path -> {
35-
try {
36-
Gson gson = new GsonBuilder().setPrettyPrinting().create();
37-
try (Reader reader = Files.newBufferedReader(path)) {
38-
JsonObject root = JsonParser.parseReader(reader).getAsJsonObject();
39-
40-
if ("bluemap-banners".equals(root.get("label").getAsString())) {
41-
root.addProperty("label", "BlueMap Banners");
42-
43-
try (Writer writer = Files.newBufferedWriter(path)) {
44-
gson.toJson(root, writer);
45-
}
46-
}
47-
}
48-
} catch (IOException ignored) {}
49-
});
50-
} catch (IOException ignored) {}
65+
.filter(path -> path.toString().endsWith(".json"))
66+
.forEach(path -> {
67+
String worldId = path.getFileName().toString().replace(".json", "").replace("world_", "");
68+
try (Reader reader = Files.newBufferedReader(path)) {
69+
JsonObject root = JsonParser.parseReader(reader).getAsJsonObject();
70+
if (root.has("markers")) {
71+
JsonObject markers = root.getAsJsonObject("markers");
72+
for (Map.Entry<String, JsonElement> entry : markers.entrySet()) {
73+
Integer[] position = Arrays.stream(entry.getKey().split(", ")).map(Integer::valueOf).toArray(Integer[]::new);
74+
75+
ResourceKey<Level> resourceKey = null;
76+
switch (worldId) {
77+
case "world" -> resourceKey = Level.OVERWORLD;
78+
case "the_nether" -> resourceKey = Level.NETHER;
79+
case "the_end" -> resourceKey = Level.END;
80+
}
81+
82+
if (resourceKey != null) {
83+
ResourceKey<Level> finalResourceKey = resourceKey;
84+
ServerLevel serverLevel = StreamSupport.stream(server.getAllLevels().spliterator(), false).filter(level -> level.dimension() == finalResourceKey).findFirst().orElse(null);
85+
86+
BlockPos blockPos = new BlockPos(position[0], position[1], position[2]);
87+
88+
assert serverLevel != null;
89+
BlockState blockState = serverLevel.getBlockState(blockPos);
90+
91+
ChunkAccess chunk = serverLevel.getChunk(position[0] >> 4, position[2] >> 4);
92+
93+
BannerBlockEntity bannerBlockEntity = (BannerBlockEntity) chunk.getBlockEntity(blockPos);
94+
95+
if (bannerBlockEntity != null) {
96+
GameProfile gameProfile = new GameProfile(DEFAULT_PLAYER_UUID, "It's MuffinTime.");
97+
98+
Player player = new Player(serverLevel, gameProfile) {
99+
@Override
100+
public @Nullable GameType gameMode() {
101+
return null;
102+
}
103+
};
104+
105+
markerManager.addMarker(blockState, bannerBlockEntity, player);
106+
}
107+
}
108+
}
109+
}
110+
// Move file to imported folder
111+
Files.move(path, importedFolder.resolve(path.getFileName()), StandardCopyOption.REPLACE_EXISTING);
112+
BlueMapBanners.LOGGER.info("Imported and moved old marker file format: {}", path.getFileName());
113+
} catch (IOException e) {
114+
BlueMapBanners.LOGGER.error("Failed to import old marker file {} format: {}", path, e.getMessage());
115+
}
116+
});
117+
} catch (IOException e) {
118+
BlueMapBanners.LOGGER.error("Failed to list maps directory: {}", e.getMessage());
119+
}
51120
}
52121
}

0 commit comments

Comments
 (0)