From 6d3774f24eb1988964ad35a76a48963ce1ee37f0 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sat, 18 Nov 2023 14:20:45 +0100 Subject: [PATCH 01/20] Set fallback void color to black, pause high fps redraws if nothing changes to save GPU usage --- BlueMapCommon/webapp/src/js/MapViewer.js | 9 +++++++-- BlueMapCommon/webapp/src/js/map/Map.js | 2 +- BlueMapCommon/webapp/src/js/map/TileManager.js | 7 ++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/BlueMapCommon/webapp/src/js/MapViewer.js b/BlueMapCommon/webapp/src/js/MapViewer.js index a917637c..9e789b1d 100644 --- a/BlueMapCommon/webapp/src/js/MapViewer.js +++ b/BlueMapCommon/webapp/src/js/MapViewer.js @@ -113,6 +113,9 @@ export class MapViewer { this.markers = new MarkerSet("bm-root"); this.lastFrame = 0; + this.lastRedrawChange = 0; + events.addEventListener("bluemapCameraMoved", () => this.lastRedrawChange = Date.now()) + events.addEventListener("bluemapTileLoaded", () => this.lastRedrawChange = Date.now()) // initialize this.initializeRootElement(); @@ -272,7 +275,6 @@ export class MapViewer { // calculate delta time if (this.lastFrame <= 0) this.lastFrame = now; let delta = now - this.lastFrame; - this.lastFrame = now; // update stats this.stats.begin(); @@ -283,7 +285,10 @@ export class MapViewer { } // render - this.render(delta); + if (delta >= 1000 || Date.now() - this.lastRedrawChange < 1000) { + this.lastFrame = now; + this.render(delta); + } // update stats this.stats.update(); diff --git a/BlueMapCommon/webapp/src/js/map/Map.js b/BlueMapCommon/webapp/src/js/map/Map.js index 98e11af3..af459981 100644 --- a/BlueMapCommon/webapp/src/js/map/Map.js +++ b/BlueMapCommon/webapp/src/js/map/Map.js @@ -63,7 +63,7 @@ export class Map { name: id, startPos: {x: 0, z: 0}, skyColor: new Color(), - voidColor: new Color(), + voidColor: new Color(0, 0, 0), ambientLight: 0, hires: { tileSize: {x: 32, z: 32}, diff --git a/BlueMapCommon/webapp/src/js/map/TileManager.js b/BlueMapCommon/webapp/src/js/map/TileManager.js index a52c55e9..feee3ae4 100644 --- a/BlueMapCommon/webapp/src/js/map/TileManager.js +++ b/BlueMapCommon/webapp/src/js/map/TileManager.js @@ -24,7 +24,7 @@ */ import { Vector2, Scene, Group } from 'three'; import { Tile } from './Tile.js'; -import {alert, hashTile} from '../util/Utils.js'; +import {alert, dispatchEvent, hashTile} from '../util/Utils.js'; import {TileMap} from "./TileMap"; export class TileManager { @@ -194,6 +194,11 @@ export class TileManager { this.tiles.set(tileHash, tile); tile.load(this.tileLoader) .then(() => { + dispatchEvent(this.events, "bluemapTileLoaded", { + tileManager: this, + tile: tile + }); + if (this.loadTimeout) clearTimeout(this.loadTimeout); this.loadTimeout = setTimeout(this.loadCloseTiles, 0); }) From c7af5e9639e0c7e946e166f10af80fd2119ec53a Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sat, 18 Nov 2023 14:45:06 +0100 Subject: [PATCH 02/20] Fix url angle in free-flight not applying correctly. Fixes: #485 --- BlueMapCommon/webapp/src/js/BlueMapApp.js | 12 +++++++----- BlueMapCommon/webapp/src/js/util/Utils.js | 6 +++++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/BlueMapCommon/webapp/src/js/BlueMapApp.js b/BlueMapCommon/webapp/src/js/BlueMapApp.js index 7c557320..18896468 100644 --- a/BlueMapCommon/webapp/src/js/BlueMapApp.js +++ b/BlueMapCommon/webapp/src/js/BlueMapApp.js @@ -708,6 +708,12 @@ export class BlueMapApp { } } + switch (values[9]) { + case "flat" : this.setFlatView(0); break; + case "free" : this.setFreeFlight(0, controls.position.y); break; + default : this.setPerspectiveView(0); break; + } + controls.position.x = parseFloat(values[1]); controls.position.y = parseFloat(values[2]); controls.position.z = parseFloat(values[3]); @@ -717,11 +723,7 @@ export class BlueMapApp { controls.tilt = parseFloat(values[7]); controls.ortho = parseFloat(values[8]); - switch (values[9]) { - case "flat" : this.setFlatView(0); break; - case "free" : this.setFreeFlight(0, controls.position.y); break; - default : this.setPerspectiveView(0); break; - } + this.updatePageAddress(); return true; } diff --git a/BlueMapCommon/webapp/src/js/util/Utils.js b/BlueMapCommon/webapp/src/js/util/Utils.js index cdb0497e..b588c0c7 100644 --- a/BlueMapCommon/webapp/src/js/util/Utils.js +++ b/BlueMapCommon/webapp/src/js/util/Utils.js @@ -204,7 +204,11 @@ export const animate = function (animationFrame, durationMs = 1000, postAnimatio } }; - window.requestAnimationFrame(time => animation.frame(time)); + if (durationMs !== 0) { + window.requestAnimationFrame(time => animation.frame(time)); + } else { + animation.frame(0); + } return animation; } From 28c916603097987559a007f328228d84bb6eb1e9 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sat, 18 Nov 2023 16:26:56 +0100 Subject: [PATCH 03/20] Define a safe collation for mysql tables. Fixes: #488 --- .../bluemap/core/storage/sql/dialect/MySQLDialect.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java index 7f5297a3..eada61b3 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java @@ -165,7 +165,7 @@ public String initializeStorageMeta() { "`key` varchar(255) NOT NULL, " + "`value` varchar(255) DEFAULT NULL, " + "PRIMARY KEY (`key`)" + - ")"; + ") COLLATE 'utf8mb4_bin'"; } @Override @@ -190,7 +190,7 @@ public String initializeMap() { "`map_id` VARCHAR(255) NOT NULL," + "PRIMARY KEY (`id`)," + "UNIQUE INDEX `map_id` (`map_id`)" + - ");"; + ") COLLATE 'utf8mb4_bin';"; } @Override @@ -201,7 +201,7 @@ public String initializeMapTileCompression() { "`compression` VARCHAR(255) NOT NULL," + "PRIMARY KEY (`id`)," + "UNIQUE INDEX `compression` (`compression`)" + - ");"; + ") COLLATE 'utf8mb4_bin';"; } @Override @@ -213,7 +213,7 @@ public String initializeMapMeta() { "`value` LONGBLOB NOT NULL," + "PRIMARY KEY (`map`, `key`)," + "CONSTRAINT `fk_bluemap_map_meta_map` FOREIGN KEY (`map`) REFERENCES `bluemap_map` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT" + - ")"; + ") COLLATE 'utf8mb4_bin'"; } @Override @@ -230,7 +230,7 @@ public String initializeMapTile() { "PRIMARY KEY (`map`, `lod`, `x`, `z`)," + "CONSTRAINT `fk_bluemap_map_tile_map` FOREIGN KEY (`map`) REFERENCES `bluemap_map` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT," + "CONSTRAINT `fk_bluemap_map_tile_compression` FOREIGN KEY (`compression`) REFERENCES `bluemap_map_tile_compression` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT" + - ");"; + ") COLLATE 'utf8mb4_bin';"; } @Override From 5f0942a8ae7185299a6a65f04cd675f7375da6c9 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sat, 18 Nov 2023 16:32:05 +0100 Subject: [PATCH 04/20] Fix error when purging a map but the directory is already deleted. Fixes: #490 --- .../de/bluecolored/bluemap/core/storage/file/FileStorage.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java index 74c0244f..2f5f9296 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java @@ -191,6 +191,8 @@ public void deleteMeta(String mapId, String name) throws IOException { @Override public void purgeMap(String mapId, Function onProgress) throws IOException { final Path directory = getFilePath(mapId); + if (!Files.exists(directory)) return; + final int subFilesCount; final LinkedList subFiles; From 77c1e420097c8c4b86a93d2498efdfca71294fce Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 11:22:43 +0100 Subject: [PATCH 05/20] Change default nether and end configs to have a better void color --- .../de/bluecolored/bluemap/common/config/BlueMapConfigs.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigs.java b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigs.java index 481841d8..88951fd1 100644 --- a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigs.java +++ b/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigs.java @@ -377,7 +377,7 @@ private ConfigTemplate createNetherMapTemplate(String name, Path worldFolder, in .setVariable("sorting", "" + (100 + index)) .setVariable("world", formatPath(worldFolder)) .setVariable("sky-color", "#290000") - .setVariable("void-color", "#000000") + .setVariable("void-color", "#150000") .setVariable("ambient-light", "0.6") .setVariable("world-sky-light", "0") .setVariable("remove-caves-below-y", "-10000") @@ -391,7 +391,7 @@ private ConfigTemplate createEndMapTemplate(String name, Path worldFolder, int i .setVariable("sorting", "" + (200 + index)) .setVariable("world", formatPath(worldFolder)) .setVariable("sky-color", "#080010") - .setVariable("void-color", "#000000") + .setVariable("void-color", "#080010") .setVariable("ambient-light", "0.6") .setVariable("world-sky-light", "0") .setVariable("remove-caves-below-y", "-10000") From 73103eda3b77240ba7eaa90ee3b2436a15b7bdcb Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 13:42:56 +0100 Subject: [PATCH 06/20] Improve redraw-trigger on settings-changes --- .../src/components/ControlBar/DayNightSwitch.vue | 1 + .../webapp/src/components/Menu/SettingsMenu.vue | 6 +++--- BlueMapCommon/webapp/src/js/MapViewer.js | 13 +++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue b/BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue index 246b1d6d..dcc7378c 100644 --- a/BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue +++ b/BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue @@ -43,6 +43,7 @@ export default { animation = animate(t => { let u = EasingFunctions.easeOutQuad(t); this.mapViewer.uniforms.sunlightStrength.value = startValue * (1-u) + targetValue * u; + this.$bluemap.mapViewer.redraw(); }, 300); } } diff --git a/BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue b/BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue index 702714ac..155f2e61 100644 --- a/BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue +++ b/BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue @@ -8,15 +8,15 @@ {{$t('lighting.sunlight')}} + @update="mapViewer.uniforms.sunlightStrength.value = $event; $bluemap.mapViewer.redraw()">{{$t('lighting.sunlight')}} {{$t('lighting.ambientLight')}} + @update="mapViewer.uniforms.ambientLight.value = $event; $bluemap.mapViewer.redraw()">{{$t('lighting.ambientLight')}} {{stage.name}} diff --git a/BlueMapCommon/webapp/src/js/MapViewer.js b/BlueMapCommon/webapp/src/js/MapViewer.js index 9e789b1d..2fc80713 100644 --- a/BlueMapCommon/webapp/src/js/MapViewer.js +++ b/BlueMapCommon/webapp/src/js/MapViewer.js @@ -114,8 +114,8 @@ export class MapViewer { this.lastFrame = 0; this.lastRedrawChange = 0; - events.addEventListener("bluemapCameraMoved", () => this.lastRedrawChange = Date.now()) - events.addEventListener("bluemapTileLoaded", () => this.lastRedrawChange = Date.now()) + events.addEventListener("bluemapCameraMoved", this.redraw) + events.addEventListener("bluemapTileLoaded", this.redraw) // initialize this.initializeRootElement(); @@ -163,6 +163,8 @@ export class MapViewer { this.camera.aspect = this.rootElement.clientWidth / this.rootElement.clientHeight; this.camera.updateProjectionMatrix(); + + this.redraw(); }; /** @@ -264,6 +266,13 @@ export class MapViewer { } } + /** + * Call to wake up the render-loop and render on high-fps for a while + */ + redraw = () => { + this.lastRedrawChange = Date.now(); + } + /** * @private * The render-loop to update and possibly render a new frame. From deafe50305db28f73b20a048a3b1b793c37cfe65 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 16:00:46 +0100 Subject: [PATCH 07/20] Add releasenotes to publications --- .gitignore | 2 ++ implementations/fabric-1.15.2/build.gradle.kts | 8 ++++++-- implementations/fabric-1.16.2/build.gradle.kts | 8 ++++++-- implementations/fabric-1.17/build.gradle.kts | 8 ++++++-- implementations/fabric-1.18/build.gradle.kts | 8 ++++++-- implementations/fabric-1.19.4/build.gradle.kts | 8 ++++++-- implementations/fabric-1.20/build.gradle.kts | 8 ++++++-- implementations/forge-1.17.1/build.gradle | 8 ++++++-- implementations/forge-1.18.1/build.gradle | 8 ++++++-- implementations/forge-1.19.4/build.gradle | 8 ++++++-- implementations/forge-1.20/build.gradle | 8 ++++++-- implementations/paper/build.gradle.kts | 8 ++++++-- implementations/spigot/build.gradle.kts | 4 +++- implementations/sponge/build.gradle.kts | 9 +++++++-- 14 files changed, 78 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index ef45fb00..2fb7f3a9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,8 @@ node_modules/ *.launch +release.md + # exclude generated resource BlueMapCommon/src/main/resources/de/bluecolored/bluemap/webapp.zip BlueMapCore/src/main/resources/de/bluecolored/bluemap/*/resourceExtensions.zip diff --git a/implementations/fabric-1.15.2/build.gradle.kts b/implementations/fabric-1.15.2/build.gradle.kts index 2fae9d55..9a35f582 100644 --- a/implementations/fabric-1.15.2/build.gradle.kts +++ b/implementations/fabric-1.15.2/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.15.2") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/fabric-1.16.2/build.gradle.kts b/implementations/fabric-1.16.2/build.gradle.kts index 422b268f..285285be 100644 --- a/implementations/fabric-1.16.2/build.gradle.kts +++ b/implementations/fabric-1.16.2/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.16.2", "1.16.3", "1.16.4", "1.16.5") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/fabric-1.17/build.gradle.kts b/implementations/fabric-1.17/build.gradle.kts index a5e82d60..371bb1c0 100644 --- a/implementations/fabric-1.17/build.gradle.kts +++ b/implementations/fabric-1.17/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.17", "1.17.1") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/fabric-1.18/build.gradle.kts b/implementations/fabric-1.18/build.gradle.kts index cb76570c..426da887 100644 --- a/implementations/fabric-1.18/build.gradle.kts +++ b/implementations/fabric-1.18/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.18", "1.18.1", "1.18.2") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/fabric-1.19.4/build.gradle.kts b/implementations/fabric-1.19.4/build.gradle.kts index 57b95805..1666893e 100644 --- a/implementations/fabric-1.19.4/build.gradle.kts +++ b/implementations/fabric-1.19.4/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.19.4") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/fabric-1.20/build.gradle.kts b/implementations/fabric-1.20/build.gradle.kts index cb0a61d1..a9b51f4e 100644 --- a/implementations/fabric-1.20/build.gradle.kts +++ b/implementations/fabric-1.20/build.gradle.kts @@ -140,7 +140,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) gameVersions.addAll("1.20", "1.20.1", "1.20.2") dependencies { @@ -153,7 +155,9 @@ curseforge { project(closureOf { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .readText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion("Fabric") diff --git a/implementations/forge-1.17.1/build.gradle b/implementations/forge-1.17.1/build.gradle index a4a475c3..54bf3601 100644 --- a/implementations/forge-1.17.1/build.gradle +++ b/implementations/forge-1.17.1/build.gradle @@ -177,7 +177,9 @@ modrinth { token = System.getenv("MODRINTH_TOKEN") projectId = "swbUV1cr" versionNumber = "${project.version}-${project.name}" - changelog = "Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) uploadFile = shadowJar gameVersions = ["1.17.1"] } @@ -187,7 +189,9 @@ curseforge { project { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion "Forge" diff --git a/implementations/forge-1.18.1/build.gradle b/implementations/forge-1.18.1/build.gradle index 2ee04248..87b81d59 100644 --- a/implementations/forge-1.18.1/build.gradle +++ b/implementations/forge-1.18.1/build.gradle @@ -173,7 +173,9 @@ modrinth { token = System.getenv("MODRINTH_TOKEN") projectId = "swbUV1cr" versionNumber = "${project.version}-${project.name}" - changelog = "Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) uploadFile = shadowJar gameVersions = ["1.18.1", "1.18.2"] } @@ -183,7 +185,9 @@ curseforge { project { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion "Forge" diff --git a/implementations/forge-1.19.4/build.gradle b/implementations/forge-1.19.4/build.gradle index fc82230f..ed899792 100644 --- a/implementations/forge-1.19.4/build.gradle +++ b/implementations/forge-1.19.4/build.gradle @@ -173,7 +173,9 @@ modrinth { token = System.getenv("MODRINTH_TOKEN") projectId = "swbUV1cr" versionNumber = "${project.version}-${project.name}" - changelog = "Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) uploadFile = shadowJar gameVersions = ["1.19.4"] } @@ -183,7 +185,9 @@ curseforge { project { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion "Forge" diff --git a/implementations/forge-1.20/build.gradle b/implementations/forge-1.20/build.gradle index 21467801..6996a187 100644 --- a/implementations/forge-1.20/build.gradle +++ b/implementations/forge-1.20/build.gradle @@ -173,7 +173,9 @@ modrinth { token = System.getenv("MODRINTH_TOKEN") projectId = "swbUV1cr" versionNumber = "${project.version}-${project.name}" - changelog = "Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) uploadFile = shadowJar gameVersions = ["1.20", "1.20.1", "1.20.2"] } @@ -183,7 +185,9 @@ curseforge { project { id = "406463" changelogType = "markdown" - changelog = "**Releasenotes and Changelog:**\n\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) releaseType = "release" addGameVersion "Forge" diff --git a/implementations/paper/build.gradle.kts b/implementations/paper/build.gradle.kts index 885e01c7..a83871dd 100644 --- a/implementations/paper/build.gradle.kts +++ b/implementations/paper/build.gradle.kts @@ -119,7 +119,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog: \nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("shadowJar")) loaders.addAll("paper","purpur","folia") gameVersions.addAll( @@ -132,7 +134,9 @@ hangarPublish { version.set(project.version as String) id.set("BlueMap") channel.set("Release") - changelog.set("Releasenotes and Changelog: \nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) apiKey.set(System.getenv("HANGAR_TOKEN")) diff --git a/implementations/spigot/build.gradle.kts b/implementations/spigot/build.gradle.kts index dac6aab9..7759a804 100644 --- a/implementations/spigot/build.gradle.kts +++ b/implementations/spigot/build.gradle.kts @@ -121,7 +121,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog: \nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("shadowJar")) loaders.addAll("spigot", "paper", "purpur") gameVersions.addAll( diff --git a/implementations/sponge/build.gradle.kts b/implementations/sponge/build.gradle.kts index b07b115a..ea738262 100644 --- a/implementations/sponge/build.gradle.kts +++ b/implementations/sponge/build.gradle.kts @@ -135,7 +135,9 @@ modrinth { token.set(System.getenv("MODRINTH_TOKEN")) projectId.set("swbUV1cr") versionNumber.set("${project.version}-${project.name}") - changelog.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + changelog.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("shadowJar")) loaders.addAll("sponge") gameVersions.addAll("1.16.5") @@ -150,7 +152,10 @@ oreDeployment { apiKey(System.getenv("ORE_TOKEN")) defaultPublication { projectId.set("BlueMap") - versionBody.set("Releasenotes and Changelog:\nhttps://github.com/BlueMap-Minecraft/BlueMap/releases/tag/v${project.version}") + createForumPost.set(true) + versionBody.set(file("../../release.md") + .readText() + .replace("{version}", project.version.toString())) publishArtifacts.setFrom(tasks.findByName("shadowJar")) } } From 6f015da070b46190e892ef64df7ba0a1a814ff9a Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 16:13:35 +0100 Subject: [PATCH 08/20] Fix project-building from scratch --- settings.gradle.kts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index 8ab49cd5..c2ee8d8f 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,10 @@ rootProject.name = "BlueMap" +// setup workspace +val releaseNotesFile = file("release.md") +if (!releaseNotesFile.exists()) releaseNotesFile.createNewFile(); + +// implementations includeBuild("implementations/cli") includeBuild("implementations/fabric-1.15.2") From 20d32cb9c944ca1a081754ee0610504c5b66acf8 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 17:15:08 +0100 Subject: [PATCH 09/20] Hide map-menu button if there is only one map, hide marker menu button if there are no markers --- .../src/components/ControlBar/ControlBar.vue | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue b/BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue index c1fda508..9170862a 100644 --- a/BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue +++ b/BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue @@ -2,13 +2,13 @@
- - 0) return true; + for (let set of markerSet.markerSets) { + if (set.id !== "bm-players" && set.id !== "bm-popup-set") { + if (this.hasMarkers(set)) return true; + } + } + return false; } } } From 5b932029947b7028b7645859372a5e44e23e0898 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 19 Nov 2023 18:18:49 +0100 Subject: [PATCH 10/20] Fix project-id for sponge publication --- implementations/sponge/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implementations/sponge/build.gradle.kts b/implementations/sponge/build.gradle.kts index ea738262..f14d326e 100644 --- a/implementations/sponge/build.gradle.kts +++ b/implementations/sponge/build.gradle.kts @@ -151,7 +151,7 @@ tasks.register("publish") { oreDeployment { apiKey(System.getenv("ORE_TOKEN")) defaultPublication { - projectId.set("BlueMap") + projectId.set("bluemap") createForumPost.set(true) versionBody.set(file("../../release.md") .readText() From 0bad1b6b2a528fb6fea3eb389ff4132e5c2a5521 Mon Sep 17 00:00:00 2001 From: Albus Rex <69213368+AlbusRex@users.noreply.github.com> Date: Mon, 20 Nov 2023 12:40:47 +0100 Subject: [PATCH 11/20] PDO php script implementation (#486) * pdo connector implementation * renamed php script * made mysql default * made errors generic * Some small changes to make it work with mysql * Better newlines --------- Co-authored-by: AlbusRex Co-authored-by: Lukas Rieger (Blue) --- .../webapp/public/{mysql.php => sql.php} | 119 ++++++++++-------- 1 file changed, 68 insertions(+), 51 deletions(-) rename BlueMapCommon/webapp/public/{mysql.php => sql.php} (56%) diff --git a/BlueMapCommon/webapp/public/mysql.php b/BlueMapCommon/webapp/public/sql.php similarity index 56% rename from BlueMapCommon/webapp/public/mysql.php rename to BlueMapCommon/webapp/public/sql.php index d3a44869..ccb9ee4d 100644 --- a/BlueMapCommon/webapp/public/mysql.php +++ b/BlueMapCommon/webapp/public/sql.php @@ -2,6 +2,7 @@ // !!! SET YOUR SQL-CONNECTION SETTINGS HERE: !!! +$driver = 'mysql'; // 'mysql' (MySQL) or 'pgsql' (PostgreSQL) $hostname = '127.0.0.1'; $port = 3306; $username = 'root'; @@ -85,6 +86,14 @@ function getMimeType($path) { return $mimeDefault; } +function send($data) { + if (is_resource($data)) { + fpassthru($data); + } else { + echo $data; + } +} + // determine relative request-path $root = dirname($_SERVER['PHP_SELF']); if ($root === "/" || $root === "\\") $root = ""; @@ -111,9 +120,12 @@ if (startsWith($path, "/maps/")) { $mapId = $pathParts[0]; $mapPath = explode("?", $pathParts[1], 2)[0]; - // get sql-connection - $sql = new mysqli($hostname, $username, $password, $database, $port); - if ($sql->errno) error(500, "Failed to connect to Database!"); + // Initialize PDO + try { + $sql = new PDO("$driver:host=$hostname;dbname=$database", $username, $password); + $sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + } catch (PDOException $e ) { error(500, "Failed to connect to database"); } + // provide map-tiles if (startsWith($mapPath, "tiles/")) { @@ -126,67 +138,72 @@ if (startsWith($path, "/maps/")) { $compression = $lod === 0 ? $hiresCompression : "none"; // query for tile - $statement = $sql->prepare(" - SELECT t.`data` - FROM `bluemap_map_tile` t - INNER JOIN `bluemap_map` m - ON t.`map` = m.`id` - INNER JOIN `bluemap_map_tile_compression` c - ON t.`compression` = c.`id` - WHERE m.`map_id` = ? - AND t.`lod` = ? - AND t.`x` = ? - AND t.`z` = ? - AND c.`compression` = ? - "); - $statement->bind_param("siiis", $mapId, $lod, $tileX, $tileZ, $compression); - $statement->execute(); - if ($statement->errno) error(500, "Database query failed!"); + try { + $statement = $sql->prepare(" + SELECT t.data + FROM bluemap_map_tile t + INNER JOIN bluemap_map m + ON t.map = m.id + INNER JOIN bluemap_map_tile_compression c + ON t.compression = c.id + WHERE m.map_id = :map_id + AND t.lod = :lod + AND t.x = :x + AND t.z = :z + AND c.compression = :compression + "); + $statement->bindParam( ':map_id', $mapId, PDO::PARAM_STR ); + $statement->bindParam( ':lod', $lod, PDO::PARAM_INT ); + $statement->bindParam( ':x', $tileX, PDO::PARAM_INT ); + $statement->bindParam( ':z', $tileZ, PDO::PARAM_INT ); + $statement->bindParam( ':compression', $compression, PDO::PARAM_STR); + $statement->setFetchMode(PDO::FETCH_ASSOC); + $statement->execute(); - // return result - $result = $statement->get_result(); - if ($result && $line = $result->fetch_assoc()) { - if ($compression !== "none") - header("Content-Encoding: $compression"); - - if ($lod === 0) { - header("Content-Type: application/json"); - } else { - header("Content-Type: image/png"); + // return result + if ($line = $statement->fetch()) { + if ($compression !== "none") + header("Content-Encoding: $compression"); + if ($lod === 0) { + header("Content-Type: application/json"); + } else { + header("Content-Type: image/png"); + } + send($line["data"]); + exit; } - echo $line["data"]; - exit; - } + } catch (PDOException $e) { error(500, "Failed to fetch data"); } // empty json response if nothing found header("Content-Type: application/json"); echo "{}"; exit; - } // provide meta-files - $statement = $sql->prepare(" - SELECT t.`value` - FROM `bluemap_map_meta` t - INNER JOIN `bluemap_map` m - ON t.`map` = m.`id` - WHERE m.`map_id` = ? - AND t.`key` = ? - "); - $statement->bind_param("ss", $mapId, $mapPath); - $statement->execute(); - if ($statement->errno) error(500, "Database query failed!"); + try { + $statement = $sql->prepare(" + SELECT t.value + FROM bluemap_map_meta t + INNER JOIN bluemap_map m + ON t.map = m.id + WHERE m.map_id = :map_id + AND t.key = :map_path + "); + $statement->bindParam( ':map_id', $mapId, PDO::PARAM_STR ); + $statement->bindParam( ':map_path', $mapPath, PDO::PARAM_STR ); + $statement->setFetchMode(PDO::FETCH_ASSOC); + $statement->execute(); - $result = $statement->get_result(); - if ($result && $line = $result->fetch_assoc()) { - header("Content-Type: ".getMimeType($mapPath)); - echo $line["value"]; - exit; - } + if ($line = $statement->fetch()) { + header("Content-Type: ".getMimeType($mapPath)); + send($line["value"]); + exit; + } + } catch (PDOException $e) { error(500, "Failed to fetch data"); } } // no match => 404 -error(404); +error(404); \ No newline at end of file From 5866cb576661c9fd35b91f69727a9d8c6088765b Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Tue, 21 Nov 2023 16:15:54 +0100 Subject: [PATCH 12/20] Add basic support for the resource-changes of the 1.20.3 snapshots --- .../bluemap/core/map/TextureGallery.java | 9 ++- .../resourcepack/texture/Texture.java | 33 +--------- .../bluemap/core/util/BufferedImageUtil.java | 63 +++++++++++++++++++ .../mc1_18/assets/minecraft/blockColors.json | 1 + .../assets/minecraft/blockProperties.json | 1 + 5 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java index f1e4426e..d879a8d2 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java @@ -30,10 +30,12 @@ import de.bluecolored.bluemap.core.resources.adapter.ResourcesGson; import de.bluecolored.bluemap.core.resources.resourcepack.ResourcePack; import de.bluecolored.bluemap.core.resources.resourcepack.texture.Texture; +import de.bluecolored.bluemap.core.util.Key; import org.jetbrains.annotations.Nullable; import java.io.*; import java.util.Arrays; +import java.util.Comparator; import java.util.HashMap; import java.util.Map; @@ -66,7 +68,10 @@ public synchronized int put(ResourcePath textureResourcePath) { } public synchronized void put(ResourcePack resourcePack) { - resourcePack.getTextures().keySet().forEach(this::put); + resourcePack.getTextures().keySet() + .stream() + .sorted(Comparator.comparing(Key::getFormatted)) + .forEach(this::put); } public void writeTexturesFile(ResourcePack resourcePack, OutputStream out) throws IOException { @@ -98,7 +103,7 @@ public static TextureGallery readTexturesFile(InputStream in) throws IOException for (int ordinal = 0; ordinal < textures.length; ordinal++) { Texture texture = textures[ordinal]; if (texture != null) { - gallery.ordinalMap.put(textures[ordinal].getResourcePath(), ordinal); + gallery.ordinalMap.put(texture.getResourcePath(), ordinal); } } } catch (JsonIOException ex) { diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/texture/Texture.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/texture/Texture.java index 5061ff05..6acb696f 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/texture/Texture.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/resourcepack/texture/Texture.java @@ -26,6 +26,7 @@ import de.bluecolored.bluemap.api.debug.DebugDump; import de.bluecolored.bluemap.core.resources.ResourcePath; +import de.bluecolored.bluemap.core.util.BufferedImageUtil; import de.bluecolored.bluemap.core.util.math.Color; import javax.imageio.ImageIO; @@ -112,7 +113,7 @@ public static Texture from(ResourcePath resourcePath, BufferedImage ima boolean halfTransparent = checkHalfTransparent(image); //calculate color - Color color = calculateColor(image); + Color color = BufferedImageUtil.averageColor(image); //write to Base64 ByteArrayOutputStream os = new ByteArrayOutputStream(); @@ -136,36 +137,6 @@ private static boolean checkHalfTransparent(BufferedImage image){ return false; } - private static Color calculateColor(BufferedImage image){ - float alpha = 0f, red = 0f, green = 0f, blue = 0f; - int count = 0; - - for (int x = 0; x < image.getWidth(); x++){ - for (int y = 0; y < image.getHeight(); y++){ - int pixel = image.getRGB(x, y); - float pixelAlpha = ((pixel >> 24) & 0xff) / 255f; - float pixelRed = ((pixel >> 16) & 0xff) / 255f; - float pixelGreen = ((pixel >> 8) & 0xff) / 255f; - float pixelBlue = (pixel & 0xff) / 255f; - - count++; - alpha += pixelAlpha; - red += pixelRed * pixelAlpha; - green += pixelGreen * pixelAlpha; - blue += pixelBlue * pixelAlpha; - } - } - - if (count == 0 || alpha == 0) return new Color(); - - red /= alpha; - green /= alpha; - blue /= alpha; - alpha /= count; - - return new Color().set(red, green, blue, alpha, false); - } - public static Texture missing(ResourcePath resourcePath) { return new Texture(resourcePath); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java new file mode 100644 index 00000000..bdfb8ea6 --- /dev/null +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java @@ -0,0 +1,63 @@ +package de.bluecolored.bluemap.core.util; + +import de.bluecolored.bluemap.core.util.math.Color; +import org.jetbrains.annotations.Nullable; + +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; + +public class BufferedImageUtil { + + public static Color averageColor(BufferedImage image) { + Color average = new Color(); + Color color = new Color(); + float[] buffer = null; + int count = 0; + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + buffer = readPixel(image, x, y, color, buffer); + + count++; + average.add(color.premultiplied()); + } + } + average.div(count); + return average; + } + + public static Color readPixel(BufferedImage image, int x, int y, @Nullable Color target) { + readPixel(image, x, y, target, null); + return target; + } + + private static float[] readPixel(BufferedImage image, int x, int y, @Nullable Color target, float @Nullable [] buffer) { + if (target == null) target = new Color(); + + // workaround for java bug: 5051418 + if (image.getType() == BufferedImage.TYPE_BYTE_GRAY) { + buffer = readPixelDirect(image, x, y, target, buffer); + } else { + readPixelDefault(image, x, y, target); + } + + return buffer; + } + + private static void readPixelDefault(BufferedImage image, int x, int y, Color target) { + target.set(image.getRGB(x, y), image.getColorModel().isAlphaPremultiplied()); + } + + private static float[] readPixelDirect(RenderedImage image, int x, int y, Color target, float @Nullable [] buffer) { + buffer = image.getData().getPixel(x, y, buffer); + + float a = buffer.length >= 4 ? buffer[3] / 255f : 1f; + float r = buffer[0] / 255f; + float g = buffer.length >= 3 ? buffer[1] / 255f : r; + float b = buffer.length >= 3 ? buffer[2] / 255f : r; + + target.set(r, g, b, a, image.getColorModel().isAlphaPremultiplied()); + + return buffer; + } + +} diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockColors.json b/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockColors.json index e4a8a397..f948d075 100644 --- a/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockColors.json +++ b/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockColors.json @@ -7,6 +7,7 @@ "minecraft:lava_cauldron": "#ffffff", "minecraft:grass_block": "@grass", "minecraft:grass": "@grass", + "minecraft:short_grass": "@grass", "minecraft:tall_grass": "@grass", "minecraft:fern": "@grass", "minecraft:large_fern": "@grass", diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockProperties.json b/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockProperties.json index d319683a..1062822c 100644 --- a/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockProperties.json +++ b/BlueMapCore/src/main/resourceExtensions/mc1_18/assets/minecraft/blockProperties.json @@ -6,6 +6,7 @@ "minecraft:bubble_column": { "alwaysWaterlogged": true }, "minecraft:grass": { "randomOffset": true }, + "minecraft:short_grass": { "randomOffset": true }, "minecraft:tall_grass": { "randomOffset": true }, "minecraft:fern": { "randomOffset": true }, "minecraft:dandelion": { "randomOffset": true }, From 3f82a821a206345481607be643885a748a3e80aa Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Thu, 23 Nov 2023 21:58:59 +0100 Subject: [PATCH 13/20] Fix keysize issue once more --- .../bluemap/core/storage/sql/dialect/MySQLDialect.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java index eada61b3..f5823610 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/dialect/MySQLDialect.java @@ -162,7 +162,7 @@ public String selectMapIds() { @Language("MySQL") public String initializeStorageMeta() { return "CREATE TABLE IF NOT EXISTS `bluemap_storage_meta` (" + - "`key` varchar(255) NOT NULL, " + + "`key` varchar(190) NOT NULL, " + "`value` varchar(255) DEFAULT NULL, " + "PRIMARY KEY (`key`)" + ") COLLATE 'utf8mb4_bin'"; @@ -187,7 +187,7 @@ public String insertStorageMeta() { public String initializeMap() { return "CREATE TABLE `bluemap_map` (" + "`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT," + - "`map_id` VARCHAR(255) NOT NULL," + + "`map_id` VARCHAR(190) NOT NULL," + "PRIMARY KEY (`id`)," + "UNIQUE INDEX `map_id` (`map_id`)" + ") COLLATE 'utf8mb4_bin';"; @@ -198,7 +198,7 @@ public String initializeMap() { public String initializeMapTileCompression() { return "CREATE TABLE `bluemap_map_tile_compression` (" + "`id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT," + - "`compression` VARCHAR(255) NOT NULL," + + "`compression` VARCHAR(190) NOT NULL," + "PRIMARY KEY (`id`)," + "UNIQUE INDEX `compression` (`compression`)" + ") COLLATE 'utf8mb4_bin';"; @@ -209,7 +209,7 @@ public String initializeMapTileCompression() { public String initializeMapMeta() { return "CREATE TABLE `bluemap_map_meta` (" + "`map` SMALLINT UNSIGNED NOT NULL," + - "`key` varchar(255) NOT NULL," + + "`key` varchar(190) NOT NULL," + "`value` LONGBLOB NOT NULL," + "PRIMARY KEY (`map`, `key`)," + "CONSTRAINT `fk_bluemap_map_meta_map` FOREIGN KEY (`map`) REFERENCES `bluemap_map` (`id`) ON UPDATE RESTRICT ON DELETE RESTRICT" + From c7f340dec314d252468b135c9a17d5a743aa905f Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Wed, 6 Dec 2023 17:19:18 +0100 Subject: [PATCH 14/20] Add neoforge implementation --- build.gradle.kts | 3 + implementations/neoforge-1.20.2/build.gradle | 169 +++++++++++ .../neoforge-1.20.2/gradle.properties | 16 ++ .../neoforge-1.20.2/settings.gradle | 15 + .../bluemap/forge/ForgeCommandSource.java | 79 ++++++ .../bluemap/forge/ForgeEventForwarder.java | 66 +++++ .../bluecolored/bluemap/forge/ForgeMod.java | 268 ++++++++++++++++++ .../bluemap/forge/ForgePlayer.java | 172 +++++++++++ .../bluecolored/bluemap/forge/ForgeWorld.java | 100 +++++++ .../bluemap/forge/Log4jLogger.java | 68 +++++ .../src/main/resources/META-INF/mods.toml | 22 ++ .../src/main/resources/pack.mcmeta | 8 + settings.gradle.kts | 2 + 13 files changed, 988 insertions(+) create mode 100644 implementations/neoforge-1.20.2/build.gradle create mode 100644 implementations/neoforge-1.20.2/gradle.properties create mode 100644 implementations/neoforge-1.20.2/settings.gradle create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java create mode 100644 implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java create mode 100644 implementations/neoforge-1.20.2/src/main/resources/META-INF/mods.toml create mode 100644 implementations/neoforge-1.20.2/src/main/resources/pack.mcmeta diff --git a/build.gradle.kts b/build.gradle.kts index 8fbb0998..d47a75a4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,6 +1,9 @@ tasks.register("clean") { gradle.includedBuilds.forEach { + // workaround for https://github.com/neoforged/NeoGradle/issues/18 + if (it.name == "neoforge-1.20.2") return@forEach + dependsOn(it.task(":clean")) } diff --git a/implementations/neoforge-1.20.2/build.gradle b/implementations/neoforge-1.20.2/build.gradle new file mode 100644 index 00000000..02d8fe5f --- /dev/null +++ b/implementations/neoforge-1.20.2/build.gradle @@ -0,0 +1,169 @@ +plugins { + id "java" + id "java-library" + id "net.neoforged.gradle.userdev" version '7.0.57' + id "com.diffplug.spotless" version "6.1.2" + id "com.github.node-gradle.node" version "3.0.1" + id "com.modrinth.minotaur" version "2.+" + id "com.matthewprenger.cursegradle" version "1.4.0" + id "com.github.johnrengelman.shadow" version "7.1.2" +} + +group = "de.bluecolored.bluemap.forge" +version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore + +repositories { + mavenLocal() + mavenCentral() + maven { + setUrl("https://libraries.minecraft.net") + } + maven { + setUrl("https://jitpack.io") + } +} + +base { + archivesName = "bluemap" +} + +java.toolchain.languageVersion = JavaLanguageVersion.of(17) +sourceSets.main.resources { srcDir 'src/generated/resources' } + +configurations { + implementation.extendsFrom(shadowInclude) +} + +dependencies { + implementation "net.neoforged:neoforge:20.2.86" + + shadowInclude ("de.bluecolored.bluemap.common:BlueMapCommon") { + //exclude dependencies provided by forge + exclude (group: "com.google.guava", module: "guava") + exclude (group: "com.google.code.gson", module: "gson") + exclude (group: "org.apache.commons", module: "commons-lang3") + exclude (group: "commons-io", module: "commons-io") + exclude (group: "com.mojang", module: "brigadier") + } + + testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") + testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") +} + +tasks.withType(ProcessResources).configureEach { + var replaceProperties = [ + minecraft_version: minecraft_version, + minecraft_version_range: minecraft_version_range, + neo_version: neo_version, + neo_version_range: neo_version_range, + loader_version_range: loader_version_range, + mod_id: mod_id, + mod_name: mod_name, + mod_license: mod_license, + mod_version: version, + mod_description: mod_description, + pack_format_number: pack_format_number, + ] + inputs.properties replaceProperties + + filesMatching(['META-INF/mods.toml', 'pack.mcmeta']) { + expand replaceProperties + [project: project] + } +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' // Use the UTF-8 charset for Java compilation +} + +tasks.withType(AbstractArchiveTask).configureEach { + setReproducibleFileOrder(true) + setPreserveFileTimestamps(false) +} + +spotless { + java { + target ("src/*/java/**/*.java") + + licenseHeaderFile("../../HEADER") + indentWithSpaces() + trimTrailingWhitespace() + } +} + +test { + useJUnitPlatform() +} + +shadowJar { + destinationDirectory.set(file("../../build/release")) + archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") + + configurations = [project.configurations.shadowInclude] + + //relocate ("com.flowpowered.math", "de.bluecolored.shadow.flowpowered.math") //DON"T relocate this, because the API depends on it + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("net.querz.nbt", "de.bluecolored.shadow.querz.nbt") + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.benmanes.caffeine") + relocate ("org.aopalliance", "de.bluecolored.shadow.aopalliance") + relocate ("javax.inject", "de.bluecolored.shadow.javax.inject") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("org.codehaus", "de.bluecolored.shadow.codehaus") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + relocate ("io.airlift", "de.bluecolored.shadow.airlift") + + relocate ("com.google.errorprone", "de.bluecolored.shadow.google.errorprone") + relocate ("com.google.inject", "de.bluecolored.shadow.google.inject") + + relocate ("org.apache.commons.dbcp2", "de.bluecolored.shadow.apache.commons.dbcp2") + relocate ("org.apache.commons.logging", "de.bluecolored.shadow.apache.commons.logging") + relocate ("org.apache.commons.pool2", "de.bluecolored.shadow.apache.commons.pool2") +} + +task release { + dependsOn(shadowJar) +} + +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "swbUV1cr" + versionNumber = "${project.version}-${project.name}" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) + uploadFile = shadowJar + loaders = ["neoforge"] + gameVersions = ["1.20.2", "1.20.3"] +} + +curseforge { + apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" + project { + id = "406463" + changelogType = "markdown" + changelog = file("../../release.md") + .getText() + .replace("{version}", project.version.toString()) + releaseType = "release" + + addGameVersion "NeoForge" + + addGameVersion "Java 18" + addGameVersion "Java 17" + + addGameVersion "1.20.2" + addGameVersion "1.20.3" + + mainArtifact shadowJar + } + options { + javaVersionAutoDetect = false + javaIntegration = false + forgeGradleIntegration = false + } +} + +task publish { + dependsOn(tasks.findByName("modrinth")) + dependsOn(tasks.findByName("curseforge")) +} diff --git a/implementations/neoforge-1.20.2/gradle.properties b/implementations/neoforge-1.20.2/gradle.properties new file mode 100644 index 00000000..cfb744f0 --- /dev/null +++ b/implementations/neoforge-1.20.2/gradle.properties @@ -0,0 +1,16 @@ +org.gradle.daemon=false +org.gradle.debug=false + +minecraft_version=1.20.2 +minecraft_version_range=[1.20.2,1.21) +neo_version=20.2.86 +neo_version_range=[20.2,) +loader_version_range=[1,) +mapping_channel=official +mapping_version=1.20.2 + +mod_id=bluemap +mod_name=BlueMap +mod_description=A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) +mod_license=MIT +pack_format_number=18 diff --git a/implementations/neoforge-1.20.2/settings.gradle b/implementations/neoforge-1.20.2/settings.gradle new file mode 100644 index 00000000..948bd4cc --- /dev/null +++ b/implementations/neoforge-1.20.2/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + mavenLocal() + gradlePluginPortal() + maven { url = 'https://maven.neoforged.net/releases' } + } +} + +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.5.0' +} + +rootProject.name = "neoforge-1.20.2" + +includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java new file mode 100644 index 00000000..4a8f9233 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java @@ -0,0 +1,79 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import com.flowpowered.math.vector.Vector3d; +import de.bluecolored.bluemap.common.plugin.Plugin; +import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.CommandSource; +import de.bluecolored.bluemap.core.world.World; +import net.minecraft.commands.CommandSourceStack; +import net.minecraft.network.chat.Component; + +import java.io.IOException; +import java.util.Optional; + +public class ForgeCommandSource implements CommandSource { + + private final ForgeMod mod; + private final Plugin plugin; + private final CommandSourceStack delegate; + + public ForgeCommandSource(ForgeMod mod, Plugin plugin, CommandSourceStack delegate) { + this.mod = mod; + this.plugin = plugin; + this.delegate = delegate; + } + + @Override + public void sendMessage(Text text) { + var component = Component.Serializer.fromJsonLenient(text.toJSONString()); + if (component != null) + delegate.sendSuccess(() -> component, false); + } + + @Override + public boolean hasPermission(String permission) { + return delegate.hasPermission(1); + } + + @Override + public Optional getPosition() { + var pos = delegate.getPosition(); + return Optional.of(new Vector3d(pos.x, pos.y, pos.z)); + } + + @Override + public Optional getWorld() { + try { + var serverWorld = mod.getWorld(delegate.getLevel()); + String worldId = plugin.getBlueMap().getWorldId(serverWorld.getSaveFolder()); + return Optional.ofNullable(plugin.getWorlds().get(worldId)); + } catch (IOException ignore) {} + + return Optional.empty(); + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java new file mode 100644 index 00000000..7bcef018 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java @@ -0,0 +1,66 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.UUID; + +public class ForgeEventForwarder { + + private final Collection eventListeners; + + public ForgeEventForwarder() { + this.eventListeners = new ArrayList<>(1); + + NeoForge.EVENT_BUS.register(this); + } + + public synchronized void addEventListener(ServerEventListener listener) { + this.eventListeners.add(listener); + } + + public synchronized void removeAllListeners() { + this.eventListeners.clear(); + } + + @SubscribeEvent + public synchronized void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent evt) { + UUID uuid = evt.getEntity().getUUID(); + for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); + } + + @SubscribeEvent + public synchronized void onPlayerLeave(PlayerEvent.PlayerLoggedOutEvent evt) { + UUID uuid = evt.getEntity().getUUID(); + for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java new file mode 100644 index 00000000..917e4348 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java @@ -0,0 +1,268 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.LoadingCache; +import de.bluecolored.bluemap.common.plugin.Plugin; +import de.bluecolored.bluemap.common.plugin.commands.Commands; +import de.bluecolored.bluemap.common.serverinterface.Player; +import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; +import de.bluecolored.bluemap.common.serverinterface.ServerInterface; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import de.bluecolored.bluemap.core.BlueMap; +import de.bluecolored.bluemap.core.MinecraftVersion; +import de.bluecolored.bluemap.core.logger.Logger; +import net.minecraft.SharedConstants; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.IExtensionPoint; +import net.neoforged.fml.ModLoadingContext; +import net.neoforged.fml.common.Mod; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.RegisterCommandsEvent; +import net.neoforged.neoforge.event.TickEvent; +import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.server.ServerStartedEvent; +import net.neoforged.neoforge.event.server.ServerStartingEvent; +import net.neoforged.neoforge.event.server.ServerStoppingEvent; +import net.neoforged.neoforge.network.NetworkConstants; +import org.apache.logging.log4j.LogManager; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Mod(Plugin.PLUGIN_ID) +public class ForgeMod implements ServerInterface { + + private final Plugin pluginInstance; + private MinecraftServer serverInstance = null; + + private final ForgeEventForwarder eventForwarder; + private final LoadingCache worlds; + + private int playerUpdateIndex = 0; + private final Map onlinePlayerMap; + private final List onlinePlayerList; + + public ForgeMod() { + Logger.global.clear(); + Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME))); + + this.onlinePlayerMap = new ConcurrentHashMap<>(); + this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>()); + + this.pluginInstance = new Plugin("neoforge-1.20.2", this); + + this.eventForwarder = new ForgeEventForwarder(); + this.worlds = Caffeine.newBuilder() + .executor(BlueMap.THREAD_POOL) + .weakKeys() + .maximumSize(1000) + .build(ForgeWorld::new); + + NeoForge.EVENT_BUS.register(this); + + //Make sure the mod being absent on the other network side does not cause the client to display the server as incompatible + ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (a, b) -> true)); + } + + @SubscribeEvent + public void onServerStarting(ServerStartingEvent event) { + this.serverInstance = event.getServer(); + } + + @SubscribeEvent + public void onRegisterCommands(RegisterCommandsEvent event) { + //register commands + new Commands<>(pluginInstance, event.getDispatcher(), forgeSource -> + new ForgeCommandSource(this, pluginInstance, forgeSource) + ); + } + + @SubscribeEvent + public void onServerStarted(ServerStartedEvent event) { + //save worlds to generate level.dat files + serverInstance.saveAllChunks(false, true, true); + + new Thread(() -> { + Logger.global.logInfo("Loading..."); + + try { + pluginInstance.load(); + if (pluginInstance.isLoaded()) Logger.global.logInfo("Loaded!"); + } catch (IOException e) { + Logger.global.logError("Failed to load bluemap!", e); + pluginInstance.unload(); + } + }, "BlueMap-Plugin-Loading").start(); + } + + @SubscribeEvent + public void onServerStopping(ServerStoppingEvent event) { + pluginInstance.unload(); + Logger.global.logInfo("BlueMap unloaded!"); + } + + @SubscribeEvent + public void onTick(TickEvent.ServerTickEvent evt) { + updateSomePlayers(); + } + + @Override + public MinecraftVersion getMinecraftVersion() { + try { + return MinecraftVersion.of(SharedConstants.getCurrentVersion().getId()); + } catch (IllegalArgumentException ex) { + return MinecraftVersion.LATEST_SUPPORTED; + } + } + + @Override + public void registerListener(ServerEventListener listener) { + eventForwarder.addEventListener(listener); + } + + @Override + public void unregisterAllListeners() { + eventForwarder.removeAllListeners(); + } + + @Override + public Collection getLoadedWorlds() { + Collection loadedWorlds = new ArrayList<>(3); + for (ServerLevel serverWorld : serverInstance.getAllLevels()) { + loadedWorlds.add(worlds.get(serverWorld)); + } + return loadedWorlds; + } + + @SuppressWarnings("unchecked") + @Override + public Optional getWorld(Object world) { + if (world instanceof Path) + return getWorld((Path) world); + + if (world instanceof String) { + ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); + if (resourceLocation != null) world = serverInstance.getLevel(ResourceKey.create(Registries.DIMENSION, resourceLocation)); + } + + if (world instanceof ResourceKey) { + try { + world = serverInstance.getLevel((ResourceKey) world); + } catch (ClassCastException ignored) {} + } + + if (world instanceof ServerLevel) + return Optional.of(getWorld((ServerLevel) world)); + + return Optional.empty(); + } + + public ServerWorld getWorld(ServerLevel world) { + return worlds.get(world); + } + + @Override + public Path getConfigFolder() { + return Path.of("config", "bluemap"); + } + + @Override + public Optional getModsFolder() { + return Optional.of(Path.of("mods")); + } + + @SubscribeEvent + public void onPlayerJoin(PlayerEvent.PlayerLoggedInEvent evt) { + var playerInstance = evt.getEntity(); + if (!(playerInstance instanceof ServerPlayer)) return; + + ForgePlayer player = new ForgePlayer(playerInstance.getUUID(), this); + onlinePlayerMap.put(player.getUuid(), player); + onlinePlayerList.add(player); + } + + @SubscribeEvent + public void onPlayerLeave(PlayerEvent.PlayerLoggedOutEvent evt) { + var player = evt.getEntity(); + if (!(player instanceof ServerPlayer)) return; + + UUID playerUUID = player.getUUID(); + onlinePlayerMap.remove(playerUUID); + synchronized (onlinePlayerList) { + onlinePlayerList.removeIf(p -> p.getUuid().equals(playerUUID)); + } + } + + public MinecraftServer getServer() { + return this.serverInstance; + } + + public Plugin getPlugin() { + return this.pluginInstance; + } + + @Override + public Collection getOnlinePlayers() { + return onlinePlayerMap.values(); + } + + @Override + public Optional getPlayer(UUID uuid) { + return Optional.ofNullable(onlinePlayerMap.get(uuid)); + } + + /** + * Only update some of the online players each tick to minimize performance impact on the server-thread. + * Only call this method on the server-thread. + */ + private void updateSomePlayers() { + int onlinePlayerCount = onlinePlayerList.size(); + if (onlinePlayerCount == 0) return; + + int playersToBeUpdated = onlinePlayerCount / 20; //with 20 tps, each player is updated once a second + if (playersToBeUpdated == 0) playersToBeUpdated = 1; + + for (int i = 0; i < playersToBeUpdated; i++) { + playerUpdateIndex++; + if (playerUpdateIndex >= 20 && playerUpdateIndex >= onlinePlayerCount) playerUpdateIndex = 0; + + if (playerUpdateIndex < onlinePlayerCount) { + onlinePlayerList.get(playerUpdateIndex).update(); + } + } + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java new file mode 100644 index 00000000..45bb8cf9 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java @@ -0,0 +1,172 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import com.flowpowered.math.vector.Vector3d; +import de.bluecolored.bluemap.common.plugin.text.Text; +import de.bluecolored.bluemap.common.serverinterface.Gamemode; +import de.bluecolored.bluemap.common.serverinterface.Player; +import net.minecraft.core.BlockPos; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +import net.minecraft.world.level.GameType; +import net.minecraft.world.level.LightLayer; +import net.minecraft.world.phys.Vec3; + +import java.io.IOException; +import java.util.EnumMap; +import java.util.Map; +import java.util.UUID; + +public class ForgePlayer implements Player { + + private static final Map GAMEMODE_MAP = new EnumMap<>(GameType.class); + static { + GAMEMODE_MAP.put(GameType.ADVENTURE, Gamemode.ADVENTURE); + GAMEMODE_MAP.put(GameType.SURVIVAL, Gamemode.SURVIVAL); + GAMEMODE_MAP.put(GameType.CREATIVE, Gamemode.CREATIVE); + GAMEMODE_MAP.put(GameType.SPECTATOR, Gamemode.SPECTATOR); + } + + private final UUID uuid; + private Text name; + private String world; + private Vector3d position; + private Vector3d rotation; + private int skyLight; + private int blockLight; + private boolean online; + private boolean sneaking; + private boolean invisible; + private Gamemode gamemode; + + private final ForgeMod mod; + + public ForgePlayer(UUID playerUuid, ForgeMod mod) { + this.uuid = playerUuid; + this.mod = mod; + + update(); + } + + @Override + public UUID getUuid() { + return this.uuid; + } + + @Override + public Text getName() { + return this.name; + } + + @Override + public String getWorld() { + return this.world; + } + + @Override + public Vector3d getPosition() { + return this.position; + } + + @Override + public Vector3d getRotation() { + return rotation; + } + + @Override + public int getSkyLight() { + return skyLight; + } + + @Override + public int getBlockLight() { + return blockLight; + } + + @Override + public boolean isOnline() { + return this.online; + } + + @Override + public boolean isSneaking() { + return this.sneaking; + } + + @Override + public boolean isInvisible() { + return this.invisible; + } + + @Override + public Gamemode getGamemode() { + return this.gamemode; + } + + /** + * Only call on server thread! + */ + public void update() { + MinecraftServer server = mod.getServer(); + if (server == null) { + this.online = false; + return; + } + + ServerPlayer player = server.getPlayerList().getPlayer(uuid); + if (player == null) { + this.online = false; + return; + } + + this.gamemode = GAMEMODE_MAP.getOrDefault(player.gameMode.getGameModeForPlayer(), Gamemode.SURVIVAL); + if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; + + MobEffectInstance invis = player.getEffect(MobEffects.INVISIBILITY); + this.invisible = invis != null && invis.getDuration() > 0; + + this.name = Text.of(player.getName().getString()); + this.online = true; + + Vec3 pos = player.getPosition(1f); + this.position = new Vector3d(pos.x(), pos.y(), pos.z()); + this.rotation = new Vector3d(player.getXRot(), player.getYHeadRot(), 0); + this.sneaking = player.isCrouching(); + + this.skyLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); + this.blockLight = player.level().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); + + try { + var world = mod.getWorld(player.level()).orElse(null); + this.world = world != null ? mod.getPlugin().getBlueMap().getWorldId(world.getSaveFolder()) : "unknown"; + } catch (IOException | NullPointerException e) { // NullPointerException -> the plugin isn't fully loaded + this.world = "unknown"; + } + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java new file mode 100644 index 00000000..ce92b260 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java @@ -0,0 +1,100 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import de.bluecolored.bluemap.common.serverinterface.Dimension; +import de.bluecolored.bluemap.common.serverinterface.ServerWorld; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.dimension.DimensionType; +import net.minecraft.world.level.storage.LevelResource; + +import java.io.IOException; +import java.lang.ref.WeakReference; +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.CompletionException; +import java.util.concurrent.ExecutionException; + +public class ForgeWorld implements ServerWorld { + + private final WeakReference delegate; + private final Path saveFolder; + + public ForgeWorld(ServerLevel delegate) { + this.delegate = new WeakReference<>(delegate); + + MinecraftServer server = delegate.getServer(); + Path worldFolder = delegate.getServer().getServerDirectory().toPath().resolve(server.getWorldPath(LevelResource.ROOT)); + this.saveFolder = DimensionType.getStorageFolder(delegate.dimension(), worldFolder) + .toAbsolutePath().normalize(); + } + + @Override + public Dimension getDimension() { + ServerLevel world = delegate.get(); + if (world != null) { + if (world.dimension().equals(Level.NETHER)) return Dimension.NETHER; + if (world.dimension().equals(Level.END)) return Dimension.END; + if (world.dimension().equals(Level.OVERWORLD)) return Dimension.OVERWORLD; + } + + return ServerWorld.super.getDimension(); + } + + @Override + public boolean persistWorldChanges() throws IOException { + ServerLevel world = delegate.get(); + if (world == null) return false; + + var taskResult = CompletableFuture.supplyAsync(() -> { + try { + world.save(null, true, false); + return true; + } catch (Exception e) { + throw new CompletionException(e); + } + }, world.getServer()); + + try { + return taskResult.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IOException(e); + } catch (ExecutionException e) { + Throwable t = e.getCause(); + if (t instanceof IOException) throw (IOException) t; + if (t instanceof IllegalArgumentException) throw (IllegalArgumentException) t; + throw new IOException(t); + } + } + + @Override + public Path getSaveFolder() { + return this.saveFolder; + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java new file mode 100644 index 00000000..740b75b2 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java @@ -0,0 +1,68 @@ +/* + * This file is part of BlueMap, licensed under the MIT License (MIT). + * + * Copyright (c) Blue (Lukas Rieger) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package de.bluecolored.bluemap.forge; + +import de.bluecolored.bluemap.core.logger.AbstractLogger; +import org.apache.logging.log4j.Logger; + +public class Log4jLogger extends AbstractLogger { + + private final Logger out; + + public Log4jLogger(Logger out) { + this.out = out; + } + + @Override + public void logError(String message, Throwable throwable) { + out.error(message, throwable); + } + + @Override + public void logWarning(String message) { + out.warn(message); + } + + @Override + public void logInfo(String message) { + out.info(message); + } + + @Override + public void logDebug(String message) { + if (out.isDebugEnabled()) out.debug(message); + } + + @Override + public void noFloodDebug(String message) { + if (out.isDebugEnabled()) super.noFloodDebug(message); + } + + @Override + public void noFloodDebug(String key, String message) { + if (out.isDebugEnabled()) super.noFloodDebug(key, message); + } + +} diff --git a/implementations/neoforge-1.20.2/src/main/resources/META-INF/mods.toml b/implementations/neoforge-1.20.2/src/main/resources/META-INF/mods.toml new file mode 100644 index 00000000..1d6a5d73 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/resources/META-INF/mods.toml @@ -0,0 +1,22 @@ +modLoader="javafml" +loaderVersion="${loader_version_range}" +license="${mod_license}" + +[[mods]] +modId="${mod_id}" +version="${mod_version}" +displayName="${mod_name}" +description='''${mod_description}''' + +[[dependencies.${mod_id}]] #optional + modId="neoforge" + mandatory=true + versionRange="${neo_version_range}" + ordering="NONE" + side="BOTH" +[[dependencies.${mod_id}]] + modId="minecraft" + mandatory=true + versionRange="${minecraft_version_range}" + ordering="NONE" + side="BOTH" diff --git a/implementations/neoforge-1.20.2/src/main/resources/pack.mcmeta b/implementations/neoforge-1.20.2/src/main/resources/pack.mcmeta new file mode 100644 index 00000000..59c52402 --- /dev/null +++ b/implementations/neoforge-1.20.2/src/main/resources/pack.mcmeta @@ -0,0 +1,8 @@ +{ + "pack": { + "description": { + "text": "${mod_id} resources" + }, + "pack_format": ${pack_format_number} + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index c2ee8d8f..2596e967 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -19,6 +19,8 @@ includeBuild("implementations/forge-1.18.1") includeBuild("implementations/forge-1.19.4") includeBuild("implementations/forge-1.20") +includeBuild("implementations/neoforge-1.20.2") + includeBuild("implementations/spigot") includeBuild("implementations/paper") From 6307fb1e6b701c7cd5326765407f8a496ca0ca95 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Wed, 6 Dec 2023 17:25:30 +0100 Subject: [PATCH 15/20] Add 1.20.3 resources --- .../java/de/bluecolored/bluemap/core/MinecraftVersion.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java index a99e5946..6761403b 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java @@ -38,7 +38,7 @@ public class MinecraftVersion implements Comparable { private static final Pattern VERSION_REGEX = Pattern.compile("(?\\d+)\\.(?\\d+)(?:\\.(?\\d+))?(?:-(?:pre|rc)\\d+)?"); - public static final MinecraftVersion LATEST_SUPPORTED = new MinecraftVersion(1, 20, 2); + public static final MinecraftVersion LATEST_SUPPORTED = new MinecraftVersion(1, 20, 3); public static final MinecraftVersion EARLIEST_SUPPORTED = new MinecraftVersion(1, 13); private final int major, minor, patch; @@ -152,7 +152,8 @@ public enum MinecraftResource { MC_1_18 (new MinecraftVersion(1, 18), "mc1_18", "https://piston-data.mojang.com/v1/objects/020aa79e63a7aab5d6f30e5ec7a6c08baee6b64c/client.jar"), MC_1_19 (new MinecraftVersion(1, 19), "mc1_18", "https://piston-data.mojang.com/v1/objects/a45634ab061beb8c878ccbe4a59c3315f9c0266f/client.jar"), MC_1_19_4 (new MinecraftVersion(1, 19, 4), "mc1_18", "https://piston-data.mojang.com/v1/objects/958928a560c9167687bea0cefeb7375da1e552a8/client.jar"), - MC_1_20 (new MinecraftVersion(1, 20), "mc1_18", "https://piston-data.mojang.com/v1/objects/e575a48efda46cf88111ba05b624ef90c520eef1/client.jar"); + MC_1_20 (new MinecraftVersion(1, 20), "mc1_18", "https://piston-data.mojang.com/v1/objects/e575a48efda46cf88111ba05b624ef90c520eef1/client.jar"), + MC_1_20_3 (new MinecraftVersion(1, 20, 3), "mc1_18", "https://piston-data.mojang.com/v1/objects/b178a327a96f2cf1c9f98a45e5588d654a3e4369/client.jar"); private final MinecraftVersion version; private final String resourcePrefix; From 78904b405143a8b6851d73bc6577d9f37b97c4ab Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Wed, 6 Dec 2023 19:24:07 +0100 Subject: [PATCH 16/20] Add resource-patch to make 1.20.3 resources more backwardscompatible with 1.20.2 --- BlueMapCore/build.gradle.kts | 2 +- .../bluemap/core/MinecraftVersion.java | 2 +- .../assets/bluemap/blockstates/missing.json | 5 + .../assets/bluemap/models/block/missing.json | 6 + .../assets/bluemap/textures/block/missing.png | Bin 0 -> 2826 bytes .../mc1_20_3/assets/minecraft/biomes.json | 324 ++++++++++++++++++ .../assets/minecraft/blockColors.json | 20 ++ .../assets/minecraft/blockProperties.json | 55 +++ .../minecraft/blockstates/acacia_sign.json | 20 ++ .../blockstates/acacia_wall_sign.json | 8 + .../minecraft/blockstates/birch_sign.json | 20 ++ .../blockstates/birch_wall_sign.json | 8 + .../minecraft/blockstates/black_bed.json | 12 + .../minecraft/blockstates/blue_bed.json | 12 + .../minecraft/blockstates/brown_bed.json | 12 + .../minecraft/blockstates/bubble_column.json | 5 + .../assets/minecraft/blockstates/chest.json | 16 + .../minecraft/blockstates/crimson_sign.json | 20 ++ .../blockstates/crimson_wall_sign.json | 8 + .../minecraft/blockstates/cyan_bed.json | 12 + .../minecraft/blockstates/dark_oak_sign.json | 20 ++ .../blockstates/dark_oak_wall_sign.json | 8 + .../minecraft/blockstates/ender_chest.json | 8 + .../assets/minecraft/blockstates/grass.json | 7 + .../minecraft/blockstates/gray_bed.json | 12 + .../minecraft/blockstates/green_bed.json | 12 + .../minecraft/blockstates/jungle_sign.json | 20 ++ .../blockstates/jungle_wall_sign.json | 8 + .../assets/minecraft/blockstates/lava.json | 5 + .../minecraft/blockstates/light_blue_bed.json | 12 + .../minecraft/blockstates/light_gray_bed.json | 12 + .../minecraft/blockstates/lime_bed.json | 12 + .../minecraft/blockstates/magenta_bed.json | 12 + .../minecraft/blockstates/mangrove_sign.json | 20 ++ .../blockstates/mangrove_wall_sign.json | 8 + .../minecraft/blockstates/oak_sign.json | 20 ++ .../minecraft/blockstates/oak_wall_sign.json | 8 + .../minecraft/blockstates/orange_bed.json | 12 + .../minecraft/blockstates/pink_bed.json | 12 + .../minecraft/blockstates/purple_bed.json | 12 + .../assets/minecraft/blockstates/red_bed.json | 12 + .../minecraft/blockstates/spruce_sign.json | 20 ++ .../blockstates/spruce_wall_sign.json | 8 + .../minecraft/blockstates/trapped_chest.json | 16 + .../minecraft/blockstates/warped_sign.json | 20 ++ .../blockstates/warped_wall_sign.json | 8 + .../assets/minecraft/blockstates/water.json | 5 + .../minecraft/blockstates/white_bed.json | 12 + .../minecraft/blockstates/yellow_bed.json | 12 + .../minecraft/models/block/bed/bed_foot.json | 39 +++ .../minecraft/models/block/bed/bed_head.json | 39 +++ .../models/block/bed/black_foot.json | 6 + .../models/block/bed/black_head.json | 6 + .../minecraft/models/block/bed/blue_foot.json | 6 + .../minecraft/models/block/bed/blue_head.json | 6 + .../models/block/bed/brown_foot.json | 6 + .../models/block/bed/brown_head.json | 6 + .../minecraft/models/block/bed/cyan_foot.json | 6 + .../minecraft/models/block/bed/cyan_head.json | 6 + .../minecraft/models/block/bed/gray_foot.json | 6 + .../minecraft/models/block/bed/gray_head.json | 6 + .../models/block/bed/green_foot.json | 6 + .../models/block/bed/green_head.json | 6 + .../models/block/bed/light_blue_foot.json | 6 + .../models/block/bed/light_blue_head.json | 6 + .../models/block/bed/light_gray_foot.json | 6 + .../models/block/bed/light_gray_head.json | 6 + .../minecraft/models/block/bed/lime_foot.json | 6 + .../minecraft/models/block/bed/lime_head.json | 6 + .../models/block/bed/magenta_foot.json | 6 + .../models/block/bed/magenta_head.json | 6 + .../models/block/bed/orange_foot.json | 6 + .../models/block/bed/orange_head.json | 6 + .../minecraft/models/block/bed/pink_foot.json | 6 + .../minecraft/models/block/bed/pink_head.json | 6 + .../models/block/bed/purple_foot.json | 6 + .../models/block/bed/purple_head.json | 6 + .../minecraft/models/block/bed/red_foot.json | 6 + .../minecraft/models/block/bed/red_head.json | 6 + .../models/block/bed/white_foot.json | 6 + .../models/block/bed/white_head.json | 6 + .../models/block/bed/yellow_foot.json | 6 + .../models/block/bed/yellow_head.json | 6 + .../minecraft/models/block/bubble_column.json | 2 + .../minecraft/models/block/chest/chest.json | 39 +++ .../models/block/chest/chest_double_left.json | 37 ++ .../block/chest/chest_double_right.json | 36 ++ .../minecraft/models/block/chest/ender.json | 6 + .../minecraft/models/block/chest/normal.json | 6 + .../block/chest/normal_double_left.json | 6 + .../block/chest/normal_double_right.json | 6 + .../minecraft/models/block/chest/trapped.json | 6 + .../block/chest/trapped_double_left.json | 6 + .../block/chest/trapped_double_right.json | 6 + .../assets/minecraft/models/block/lava.json | 8 + .../minecraft/models/block/sign/acacia.json | 6 + .../minecraft/models/block/sign/birch.json | 6 + .../minecraft/models/block/sign/crimson.json | 6 + .../minecraft/models/block/sign/dark_oak.json | 6 + .../minecraft/models/block/sign/jungle.json | 6 + .../minecraft/models/block/sign/mangrove.json | 6 + .../minecraft/models/block/sign/oak.json | 6 + .../minecraft/models/block/sign/sign.json | 28 ++ .../minecraft/models/block/sign/spruce.json | 6 + .../models/block/sign/wall_acacia.json | 6 + .../models/block/sign/wall_birch.json | 6 + .../models/block/sign/wall_crimson.json | 6 + .../models/block/sign/wall_dark_oak.json | 6 + .../models/block/sign/wall_jungle.json | 6 + .../models/block/sign/wall_mangrove.json | 6 + .../minecraft/models/block/sign/wall_oak.json | 6 + .../models/block/sign/wall_sign.json | 16 + .../models/block/sign/wall_spruce.json | 6 + .../models/block/sign/wall_warped.json | 6 + .../minecraft/models/block/sign/warped.json | 6 + .../assets/minecraft/models/block/water.json | 8 + 116 files changed, 1512 insertions(+), 2 deletions(-) create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/blockstates/missing.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/models/block/missing.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/textures/block/missing.png create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/biomes.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockColors.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockProperties.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/acacia_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/acacia_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/birch_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/birch_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/black_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/blue_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/brown_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/bubble_column.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/chest.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/crimson_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/crimson_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/cyan_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/dark_oak_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/dark_oak_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/ender_chest.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/gray_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/green_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/jungle_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/jungle_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/lava.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/light_blue_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/light_gray_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/lime_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/magenta_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/mangrove_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/mangrove_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/oak_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/oak_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/orange_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/pink_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/purple_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/red_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/spruce_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/spruce_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/trapped_chest.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/warped_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/warped_wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/water.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/white_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/yellow_bed.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/bed_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/bed_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/black_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/black_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/blue_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/blue_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/brown_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/brown_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/cyan_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/cyan_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/gray_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/gray_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/green_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/green_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/light_blue_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/light_blue_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/light_gray_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/light_gray_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/lime_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/lime_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/magenta_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/magenta_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/orange_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/orange_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/pink_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/pink_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/purple_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/purple_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/red_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/red_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/white_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/white_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/yellow_foot.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bed/yellow_head.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/bubble_column.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/chest.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/chest_double_left.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/chest_double_right.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/ender.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/normal.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/normal_double_left.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/normal_double_right.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/trapped.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/trapped_double_left.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/chest/trapped_double_right.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/lava.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/acacia.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/birch.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/crimson.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/dark_oak.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/jungle.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/mangrove.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/oak.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/spruce.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_acacia.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_birch.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_crimson.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_dark_oak.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_jungle.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_mangrove.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_oak.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_sign.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_spruce.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/wall_warped.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/sign/warped.json create mode 100644 BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/models/block/water.json diff --git a/BlueMapCore/build.gradle.kts b/BlueMapCore/build.gradle.kts index 7f1a16d2..6cea1c48 100644 --- a/BlueMapCore/build.gradle.kts +++ b/BlueMapCore/build.gradle.kts @@ -113,7 +113,7 @@ tasks.processResources { //resource Extensions val resourceIds: Array = arrayOf( - "1_13", "1_15", "1_16", "1_18" + "1_13", "1_15", "1_16", "1_18", "1_20_3" ) tasks.register("zipResourceExtensions") { diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java index 6761403b..876a2cab 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/MinecraftVersion.java @@ -153,7 +153,7 @@ public enum MinecraftResource { MC_1_19 (new MinecraftVersion(1, 19), "mc1_18", "https://piston-data.mojang.com/v1/objects/a45634ab061beb8c878ccbe4a59c3315f9c0266f/client.jar"), MC_1_19_4 (new MinecraftVersion(1, 19, 4), "mc1_18", "https://piston-data.mojang.com/v1/objects/958928a560c9167687bea0cefeb7375da1e552a8/client.jar"), MC_1_20 (new MinecraftVersion(1, 20), "mc1_18", "https://piston-data.mojang.com/v1/objects/e575a48efda46cf88111ba05b624ef90c520eef1/client.jar"), - MC_1_20_3 (new MinecraftVersion(1, 20, 3), "mc1_18", "https://piston-data.mojang.com/v1/objects/b178a327a96f2cf1c9f98a45e5588d654a3e4369/client.jar"); + MC_1_20_3 (new MinecraftVersion(1, 20, 3), "mc1_20_3", "https://piston-data.mojang.com/v1/objects/b178a327a96f2cf1c9f98a45e5588d654a3e4369/client.jar"); private final MinecraftVersion version; private final String resourcePrefix; diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/blockstates/missing.json b/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/blockstates/missing.json new file mode 100644 index 00000000..d917d257 --- /dev/null +++ b/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/blockstates/missing.json @@ -0,0 +1,5 @@ +{ + "variants": { + "": { "model": "bluemap:block/missing" } + } +} \ No newline at end of file diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/models/block/missing.json b/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/models/block/missing.json new file mode 100644 index 00000000..5995c0c0 --- /dev/null +++ b/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/models/block/missing.json @@ -0,0 +1,6 @@ +{ + "parent": "block/cube_all", + "textures": { + "all": "bluemap:block/missing" + } +} \ No newline at end of file diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/textures/block/missing.png b/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/bluemap/textures/block/missing.png new file mode 100644 index 0000000000000000000000000000000000000000..bbfd3944cfa4f8ecf201c7fb575dab9b75b9b23c GIT binary patch literal 2826 zcmV+l3-$DgP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000rNklW(DG!Tb}0RR91 c0RR6305SRo8w1WgjsO4v07*qoM6N<$f Date: Wed, 6 Dec 2023 19:57:41 +0100 Subject: [PATCH 17/20] Declare 1.20.3 support in publication where applicable --- implementations/fabric-1.20/build.gradle.kts | 3 ++- implementations/paper/build.gradle.kts | 2 +- implementations/spigot/build.gradle.kts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/implementations/fabric-1.20/build.gradle.kts b/implementations/fabric-1.20/build.gradle.kts index a9b51f4e..5e0cfdea 100644 --- a/implementations/fabric-1.20/build.gradle.kts +++ b/implementations/fabric-1.20/build.gradle.kts @@ -144,7 +144,7 @@ modrinth { .readText() .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) - gameVersions.addAll("1.20", "1.20.1", "1.20.2") + gameVersions.addAll("1.20", "1.20.1", "1.20.2", "1.20.3") dependencies { required.project("P7dR8mSH") // Fabric API } @@ -168,6 +168,7 @@ curseforge { addGameVersion("1.20") addGameVersion("1.20.1") addGameVersion("1.20.2") + addGameVersion("1.20.3") mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { relations(closureOf { diff --git a/implementations/paper/build.gradle.kts b/implementations/paper/build.gradle.kts index a83871dd..044288ba 100644 --- a/implementations/paper/build.gradle.kts +++ b/implementations/paper/build.gradle.kts @@ -145,7 +145,7 @@ hangarPublish { register(io.papermc.hangarpublishplugin.model.Platforms.PAPER) { jar.set(tasks.shadowJar.flatMap { it.archiveFile }) platformVersions.set(listOf( - "1.20.1", "1.20.2" + "1.20.1", "1.20.2", "1.20.3" )) } } diff --git a/implementations/spigot/build.gradle.kts b/implementations/spigot/build.gradle.kts index 7759a804..481de101 100644 --- a/implementations/spigot/build.gradle.kts +++ b/implementations/spigot/build.gradle.kts @@ -134,7 +134,7 @@ modrinth { "1.17", "1.17.1", "1.18", "1.18.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", - "1.20", "1.20.1", "1.20.2" + "1.20", "1.20.1", "1.20.2", "1.20.3" ) } From 72b71a91e8102f7d7fd2f612455108f3e33b7de0 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Wed, 6 Dec 2023 20:35:45 +0100 Subject: [PATCH 18/20] Add missing version on paper modrinth publish --- implementations/paper/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/implementations/paper/build.gradle.kts b/implementations/paper/build.gradle.kts index 044288ba..9606baa3 100644 --- a/implementations/paper/build.gradle.kts +++ b/implementations/paper/build.gradle.kts @@ -125,7 +125,7 @@ modrinth { uploadFile.set(tasks.findByName("shadowJar")) loaders.addAll("paper","purpur","folia") gameVersions.addAll( - "1.20.1", "1.20.2" + "1.20.1", "1.20.2", "1.20.3" ) } From ef728dee06c97e19f9f22ef7fdcc9be5df0b8ba8 Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Sun, 10 Dec 2023 13:17:15 +0100 Subject: [PATCH 19/20] Declare 1.20.4 support where applicable --- implementations/fabric-1.20/build.gradle.kts | 3 ++- implementations/forge-1.20/build.gradle | 4 +++- implementations/neoforge-1.20.2/build.gradle | 3 ++- implementations/paper/build.gradle.kts | 4 ++-- implementations/spigot/build.gradle.kts | 2 +- 5 files changed, 10 insertions(+), 6 deletions(-) diff --git a/implementations/fabric-1.20/build.gradle.kts b/implementations/fabric-1.20/build.gradle.kts index 5e0cfdea..7eecf917 100644 --- a/implementations/fabric-1.20/build.gradle.kts +++ b/implementations/fabric-1.20/build.gradle.kts @@ -144,7 +144,7 @@ modrinth { .readText() .replace("{version}", project.version.toString())) uploadFile.set(tasks.findByName("remappedShadowJar")) - gameVersions.addAll("1.20", "1.20.1", "1.20.2", "1.20.3") + gameVersions.addAll("1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4") dependencies { required.project("P7dR8mSH") // Fabric API } @@ -169,6 +169,7 @@ curseforge { addGameVersion("1.20.1") addGameVersion("1.20.2") addGameVersion("1.20.3") + addGameVersion("1.20.4") mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { relations(closureOf { diff --git a/implementations/forge-1.20/build.gradle b/implementations/forge-1.20/build.gradle index 6996a187..02ba68f4 100644 --- a/implementations/forge-1.20/build.gradle +++ b/implementations/forge-1.20/build.gradle @@ -177,7 +177,7 @@ modrinth { .getText() .replace("{version}", project.version.toString()) uploadFile = shadowJar - gameVersions = ["1.20", "1.20.1", "1.20.2"] + gameVersions = ["1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4"] } curseforge { @@ -198,6 +198,8 @@ curseforge { addGameVersion "1.20" addGameVersion "1.20.1" addGameVersion "1.20.2" + addGameVersion "1.20.3" + addGameVersion "1.20.4" mainArtifact shadowJar } diff --git a/implementations/neoforge-1.20.2/build.gradle b/implementations/neoforge-1.20.2/build.gradle index 02d8fe5f..56c4a38a 100644 --- a/implementations/neoforge-1.20.2/build.gradle +++ b/implementations/neoforge-1.20.2/build.gradle @@ -133,7 +133,7 @@ modrinth { .replace("{version}", project.version.toString()) uploadFile = shadowJar loaders = ["neoforge"] - gameVersions = ["1.20.2", "1.20.3"] + gameVersions = ["1.20.2", "1.20.3", "1.20.4"] } curseforge { @@ -153,6 +153,7 @@ curseforge { addGameVersion "1.20.2" addGameVersion "1.20.3" + addGameVersion "1.20.4" mainArtifact shadowJar } diff --git a/implementations/paper/build.gradle.kts b/implementations/paper/build.gradle.kts index 9606baa3..eeaac699 100644 --- a/implementations/paper/build.gradle.kts +++ b/implementations/paper/build.gradle.kts @@ -125,7 +125,7 @@ modrinth { uploadFile.set(tasks.findByName("shadowJar")) loaders.addAll("paper","purpur","folia") gameVersions.addAll( - "1.20.1", "1.20.2", "1.20.3" + "1.20.1", "1.20.2", "1.20.3", "1.20.4" ) } @@ -145,7 +145,7 @@ hangarPublish { register(io.papermc.hangarpublishplugin.model.Platforms.PAPER) { jar.set(tasks.shadowJar.flatMap { it.archiveFile }) platformVersions.set(listOf( - "1.20.1", "1.20.2", "1.20.3" + "1.20.1", "1.20.2", "1.20.3", "1.20.4" )) } } diff --git a/implementations/spigot/build.gradle.kts b/implementations/spigot/build.gradle.kts index 481de101..ea850049 100644 --- a/implementations/spigot/build.gradle.kts +++ b/implementations/spigot/build.gradle.kts @@ -134,7 +134,7 @@ modrinth { "1.17", "1.17.1", "1.18", "1.18.1", "1.18.2", "1.19", "1.19.1", "1.19.2", "1.19.3", "1.19.4", - "1.20", "1.20.1", "1.20.2", "1.20.3" + "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4" ) } From a0b47f1bd5ed2f3750a5a0a1bcf270c46db275cf Mon Sep 17 00:00:00 2001 From: "Lukas Rieger (Blue)" Date: Mon, 11 Dec 2023 12:35:12 +0100 Subject: [PATCH 20/20] Fix texture-gallery not preserving textures that are missing after a resource(pack) change --- .../bluecolored/bluemap/core/map/BmMap.java | 2 +- .../bluemap/core/map/TextureGallery.java | 63 +++++++++++++------ 2 files changed, 46 insertions(+), 19 deletions(-) diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java index 2ef3a923..47e00b14 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java @@ -181,7 +181,7 @@ private TextureGallery loadTextureGallery() throws IOException { private void saveTextureGallery() { try (OutputStream out = storage.writeMeta(id, META_FILE_TEXTURES)) { - this.textureGallery.writeTexturesFile(this.resourcePack, out); + this.textureGallery.writeTexturesFile(out); } catch (IOException ex) { Logger.global.logError("Failed to save textures for map '" + getId() + "'!", ex); } diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java index d879a8d2..5ee4a6b0 100644 --- a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java +++ b/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java @@ -42,49 +42,53 @@ @DebugDump public class TextureGallery { - private final Map, Integer> ordinalMap; + private final Map, TextureMapping> textureMappings; private int nextId; public TextureGallery() { - this.ordinalMap = new HashMap<>(); + this.textureMappings = new HashMap<>(); this.nextId = 0; } public void clear() { - this.ordinalMap.clear(); + this.textureMappings.clear(); this.nextId = 0; } public int get(@Nullable ResourcePath textureResourcePath) { if (textureResourcePath == null) textureResourcePath = ResourcePack.MISSING_TEXTURE; - Integer ordinal = ordinalMap.get(textureResourcePath); - return ordinal != null ? ordinal : 0; + TextureMapping mapping = textureMappings.get(textureResourcePath); + return mapping != null ? mapping.getId() : 0; } - public synchronized int put(ResourcePath textureResourcePath) { - Integer ordinal = ordinalMap.putIfAbsent(textureResourcePath, nextId); - if (ordinal == null) return nextId++; - return ordinal; + public synchronized void put(ResourcePath textureResourcePath) { + textureMappings.compute(textureResourcePath, (r, mapping) -> { + if (mapping == null) + return new TextureMapping(nextId++, textureResourcePath.getResource()); + + Texture texture = textureResourcePath.getResource(); + if (texture != null) mapping.setTexture(texture); + return mapping; + }); } public synchronized void put(ResourcePack resourcePack) { + this.put(ResourcePack.MISSING_TEXTURE); // put this first resourcePack.getTextures().keySet() .stream() .sorted(Comparator.comparing(Key::getFormatted)) .forEach(this::put); } - public void writeTexturesFile(ResourcePack resourcePack, OutputStream out) throws IOException { + public void writeTexturesFile(OutputStream out) throws IOException { Texture[] textures = new Texture[nextId]; Arrays.fill(textures, Texture.MISSING); - ordinalMap.forEach((textureResourcePath, ordinal) -> { - Texture texture = textureResourcePath.getResource(resourcePack::getTexture); - if (texture != null) textures[ordinal] = texture; - - // make sure the resource-path doesn't get lost - if (textures[ordinal].getResourcePath().equals(ResourcePack.MISSING_TEXTURE)) - textures[ordinal] = Texture.missing(textureResourcePath); + this.textureMappings.forEach((textureResourcePath, mapping) -> { + int ordinal = mapping.getId(); + Texture texture = mapping.getTexture(); + if (texture == null) texture = Texture.missing(textureResourcePath); + textures[ordinal] = texture; }); try (Writer writer = new OutputStreamWriter(out)) { @@ -103,7 +107,7 @@ public static TextureGallery readTexturesFile(InputStream in) throws IOException for (int ordinal = 0; ordinal < textures.length; ordinal++) { Texture texture = textures[ordinal]; if (texture != null) { - gallery.ordinalMap.put(texture.getResourcePath(), ordinal); + gallery.textureMappings.put(texture.getResourcePath(), new TextureMapping(ordinal, texture)); } } } catch (JsonIOException ex) { @@ -112,4 +116,27 @@ public static TextureGallery readTexturesFile(InputStream in) throws IOException return gallery; } + static class TextureMapping { + private final int id; + private @Nullable Texture texture; + + public TextureMapping(int id, @Nullable Texture texture) { + this.id = id; + this.texture = texture; + } + + public int getId() { + return id; + } + + public @Nullable Texture getTexture() { + return texture; + } + + public void setTexture(@Nullable Texture texture) { + this.texture = texture; + } + + } + }