From 1454297bbd36b2de7aa8403d9bc0bd6d250e7d18 Mon Sep 17 00:00:00 2001 From: Lukas Rieger Date: Thu, 12 Sep 2024 17:45:21 +0200 Subject: [PATCH] Rework gradle-build system (#574) * Rework gradle-build setup * Fix versioning * Fix github build * Configure publishing * Push BlueMapAPI * Reorganize project naming * Update neoforge-gradle * Add gradle-stracktrace to github action * Remove clean gradle target to hopefully no longer upset neogradle for some reason * Update gradle and add stacktrace to github action again * Update neogradle * Switch to neoforges ModDevGradle --- .github/translation-checker/index.js | 2 +- .github/workflows/build.yml | 7 +- .github/workflows/publish.yml | 30 -- .gitignore | 5 +- .gitmodules | 2 +- BlueMapAPI | 1 - BlueMapCommon/build.gradle.kts | 148 ---------- BlueMapCommon/settings.gradle.kts | 4 - BlueMapCore/build.gradle.kts | 179 ------------ BlueMapCore/settings.gradle.kts | 1 - HEADER => LICENSE_HEADER | 0 api | 1 + build.gradle.kts | 57 ---- buildSrc/build.gradle.kts | 25 ++ buildSrc/settings.gradle.kts | 9 + buildSrc/src/main/kotlin/CopyFileTask.kt | 23 ++ .../src/main/kotlin/bluemap.base.gradle.kts | 78 ++++++ .../main/kotlin/bluemap.curseforge.gradle.kts | 20 ++ .../src/main/kotlin/bluemap.hangar.gradle.kts | 23 ++ .../kotlin/bluemap.implementation.gradle.kts | 23 ++ .../main/kotlin/bluemap.modrinth.gradle.kts | 17 ++ .../src/main/kotlin/bluemap.ore.gradle.kts | 18 ++ buildSrc/src/main/kotlin/curseforge.kt | 17 ++ buildSrc/src/main/kotlin/versioning.kt | 53 ++++ common/build.gradle.kts | 75 +++++ .../bluemap/common/BlueMapConfiguration.java | 0 .../bluemap/common/BlueMapService.java | 0 .../common/InterruptableReentrantLock.java | 0 .../common/MissingResourcesException.java | 0 .../bluemap/common/WebFilesManager.java | 0 .../bluemap/common/addons/AddonException.java | 0 .../bluemap/common/addons/AddonInfo.java | 0 .../bluemap/common/addons/Addons.java | 0 .../bluemap/common/addons/LoadedAddon.java | 0 .../bluemap/common/api/AssetStorageImpl.java | 0 .../bluemap/common/api/BlueMapAPIImpl.java | 0 .../bluemap/common/api/BlueMapMapImpl.java | 0 .../bluemap/common/api/BlueMapWorldImpl.java | 0 .../bluemap/common/api/PluginImpl.java | 0 .../bluemap/common/api/RenderManagerImpl.java | 0 .../bluemap/common/api/WebAppImpl.java | 0 .../common/config/BlueMapConfigManager.java | 0 .../bluemap/common/config/ConfigLoader.java | 0 .../bluemap/common/config/ConfigManager.java | 0 .../bluemap/common/config/ConfigTemplate.java | 0 .../common/config/ConfigurationException.java | 0 .../bluemap/common/config/CoreConfig.java | 0 .../bluemap/common/config/MapConfig.java | 0 .../bluemap/common/config/PluginConfig.java | 0 .../bluemap/common/config/WebappConfig.java | 0 .../common/config/WebserverConfig.java | 0 .../common/config/storage/Dialect.java | 0 .../common/config/storage/FileConfig.java | 0 .../common/config/storage/SQLConfig.java | 0 .../common/config/storage/StorageConfig.java | 0 .../common/config/storage/StorageType.java | 0 .../typeserializer/KeyTypeSerializer.java | 0 .../Vector2iTypeSerializer.java | 0 .../bluemap/common/debug/DebugDump.java | 0 .../bluemap/common/debug/StateDumper.java | 0 .../common/live/LiveMarkersDataSupplier.java | 0 .../common/live/LivePlayersDataSupplier.java | 0 .../bluemap/common/metrics/Metrics.java | 0 .../common/plugin/MapUpdateService.java | 0 .../bluemap/common/plugin/Plugin.java | 0 .../bluemap/common/plugin/PluginState.java | 0 .../commands/AbstractSuggestionProvider.java | 0 .../common/plugin/commands/CommandHelper.java | 0 .../common/plugin/commands/Commands.java | 0 .../commands/MapSuggestionProvider.java | 0 .../commands/StorageSuggestionProvider.java | 0 .../commands/TaskRefSuggestionProvider.java | 0 .../WorldOrMapSuggestionProvider.java | 0 .../commands/WorldSuggestionProvider.java | 0 .../skins/DefaultPlayerIconFactory.java | 0 .../plugin/skins/MojangSkinProvider.java | 0 .../plugin/skins/PlayerSkinUpdater.java | 0 .../bluemap/common/plugin/text/Text.java | 0 .../bluemap/common/plugin/text/TextColor.java | 0 .../common/plugin/text/TextFormat.java | 0 .../rendermanager/CombinedRenderTask.java | 0 .../common/rendermanager/MapPurgeTask.java | 0 .../common/rendermanager/MapSaveTask.java | 0 .../common/rendermanager/MapUpdateTask.java | 0 .../common/rendermanager/ProgressTracker.java | 0 .../common/rendermanager/RenderManager.java | 0 .../common/rendermanager/RenderTask.java | 0 .../rendermanager/StorageDeleteTask.java | 0 .../rendermanager/WorldRegionRenderTask.java | 0 .../common/serverinterface/CommandSource.java | 0 .../common/serverinterface/Gamemode.java | 0 .../common/serverinterface/Player.java | 0 .../common/serverinterface/Server.java | 0 .../serverinterface/ServerEventListener.java | 0 .../common/serverinterface/ServerWorld.java | 0 .../common/web/BlueMapResponseModifier.java | 0 .../web/CachedRateLimitDataSupplier.java | 0 .../common/web/FileRequestHandler.java | 0 .../common/web/JsonDataRequestHandler.java | 0 .../common/web/LoggingRequestHandler.java | 0 .../bluemap/common/web/MapRequestHandler.java | 0 .../common/web/MapStorageRequestHandler.java | 0 .../common/web/RoutingRequestHandler.java | 0 .../common/web/http/HttpConnection.java | 0 .../bluemap/common/web/http/HttpHeader.java | 0 .../bluemap/common/web/http/HttpRequest.java | 0 .../common/web/http/HttpRequestHandler.java | 0 .../bluemap/common/web/http/HttpResponse.java | 0 .../bluemap/common/web/http/HttpServer.java | 0 .../common/web/http/HttpStatusCode.java | 0 .../common/web/http/SelectionConsumer.java | 0 .../bluemap/common/web/http/Server.java | 0 .../de/bluecolored/bluemap/config/core.conf | 0 .../bluecolored/bluemap/config/maps/map.conf | 0 .../de/bluecolored/bluemap/config/plugin.conf | 0 .../bluemap/config/storages/file.conf | 0 .../bluemap/config/storages/sql.conf | 0 .../de/bluecolored/bluemap/config/webapp.conf | 0 .../bluecolored/bluemap/config/webserver.conf | 0 .../webapp/.eslintrc.cjs | 0 {BlueMapCommon => common}/webapp/.gitignore | 0 {BlueMapCommon => common}/webapp/README.md | 0 {BlueMapCommon => common}/webapp/index.html | 0 .../webapp/package-lock.json | 0 {BlueMapCommon => common}/webapp/package.json | 0 .../webapp/public/assets/logo.png | Bin .../webapp/public/assets/logoCircle512.png | Bin .../webapp/public/assets/logoCircle64.png | Bin .../webapp/public/assets/poi.svg | 0 .../webapp/public/assets/steve.png | Bin .../webapp/public/lang/cs.conf | 0 .../webapp/public/lang/de.conf | 0 .../webapp/public/lang/en.conf | 0 .../webapp/public/lang/es.conf | 0 .../webapp/public/lang/fi.conf | 0 .../webapp/public/lang/fr.conf | 0 .../webapp/public/lang/hi.conf | 0 .../webapp/public/lang/hu.conf | 0 .../webapp/public/lang/it.conf | 0 .../webapp/public/lang/ja.conf | 0 .../webapp/public/lang/ko.conf | 0 .../webapp/public/lang/lv.conf | 0 .../webapp/public/lang/nl.conf | 0 .../webapp/public/lang/no_nb.conf | 0 .../webapp/public/lang/pl.conf | 0 .../webapp/public/lang/pt_PT.conf | 0 .../webapp/public/lang/ru.conf | 0 .../webapp/public/lang/settings.conf | 0 .../webapp/public/lang/sr_cyrl.conf | 0 .../webapp/public/lang/sr_latn.conf | 0 .../webapp/public/lang/sv.conf | 0 .../webapp/public/lang/th.conf | 0 .../webapp/public/lang/tr.conf | 0 .../webapp/public/lang/ua.conf | 0 .../webapp/public/lang/vi.conf | 0 .../webapp/public/lang/zh_CN.conf | 0 .../webapp/public/lang/zh_HK.conf | 0 .../webapp/public/lang/zh_TW.conf | 0 .../webapp/public/sql.php | 0 {BlueMapCommon => common}/webapp/src/App.vue | 0 .../webapp/src/assets/favicon.png | Bin .../webapp/src/assets/manifest.webmanifest | 0 .../src/components/ControlBar/Compass.vue | 0 .../src/components/ControlBar/ControlBar.vue | 0 .../components/ControlBar/ControlsSwitch.vue | 0 .../components/ControlBar/DayNightSwitch.vue | 0 .../src/components/ControlBar/MenuButton.vue | 0 .../src/components/ControlBar/NumberInput.vue | 0 .../components/ControlBar/PositionInput.vue | 0 .../src/components/ControlBar/SvgButton.vue | 0 .../Controls/FreeFlightMobileControls.vue | 0 .../src/components/Controls/ZoomButtons.vue | 0 .../webapp/src/components/Menu/ChoiceBox.vue | 0 .../webapp/src/components/Menu/Group.vue | 0 .../webapp/src/components/Menu/MainMenu.vue | 0 .../webapp/src/components/Menu/MapButton.vue | 0 .../webapp/src/components/Menu/MarkerItem.vue | 0 .../webapp/src/components/Menu/MarkerSet.vue | 0 .../src/components/Menu/MarkerSetMenu.vue | 0 .../src/components/Menu/SettingsMenu.vue | 0 .../webapp/src/components/Menu/SideMenu.vue | 0 .../src/components/Menu/SimpleButton.vue | 0 .../webapp/src/components/Menu/Slider.vue | 0 .../src/components/Menu/SwitchButton.vue | 0 .../src/components/Menu/SwitchHandle.vue | 0 .../webapp/src/components/Menu/TextInput.vue | 0 .../webapp/src/fonts/OFL.txt | 0 .../webapp/src/fonts/Quicksand.ttf | Bin {BlueMapCommon => common}/webapp/src/i18n.js | 0 .../webapp/src/js/BlueMap.js | 0 .../webapp/src/js/BlueMapApp.js | 0 .../webapp/src/js/MainMenu.js | 0 .../webapp/src/js/MapViewer.js | 0 .../webapp/src/js/PopupMarker.js | 0 .../webapp/src/js/Utils.js | 0 .../webapp/src/js/controls/ControlsManager.js | 0 .../webapp/src/js/controls/KeyCombination.js | 0 .../controls/freeflight/FreeFlightControls.js | 0 .../freeflight/keyboard/KeyHeightControls.js | 0 .../freeflight/keyboard/KeyMoveControls.js | 0 .../freeflight/mouse/MouseAngleControls.js | 0 .../freeflight/mouse/MouseRotateControls.js | 0 .../freeflight/touch/TouchPanControls.js | 0 .../webapp/src/js/controls/map/MapControls.js | 0 .../src/js/controls/map/MapHeightControls.js | 0 .../controls/map/keyboard/KeyAngleControls.js | 0 .../controls/map/keyboard/KeyMoveControls.js | 0 .../map/keyboard/KeyRotateControls.js | 0 .../controls/map/keyboard/KeyZoomControls.js | 0 .../controls/map/mouse/MouseAngleControls.js | 0 .../controls/map/mouse/MouseMoveControls.js | 0 .../controls/map/mouse/MouseRotateControls.js | 0 .../controls/map/mouse/MouseZoomControls.js | 0 .../controls/map/touch/TouchAngleControls.js | 0 .../controls/map/touch/TouchMoveControls.js | 0 .../controls/map/touch/TouchRotateControls.js | 0 .../controls/map/touch/TouchZoomControls.js | 0 .../webapp/src/js/map/LowresTileLoader.js | 0 .../webapp/src/js/map/Map.js | 0 .../webapp/src/js/map/TextureAnimation.js | 0 .../webapp/src/js/map/Tile.js | 0 .../webapp/src/js/map/TileLoader.js | 0 .../webapp/src/js/map/TileManager.js | 0 .../webapp/src/js/map/TileMap.js | 0 .../src/js/map/hires/HiresFragmentShader.js | 0 .../src/js/map/hires/HiresVertexShader.js | 0 .../webapp/src/js/map/hires/PRBMLoader.js | 0 .../src/js/map/lowres/LowresFragmentShader.js | 0 .../src/js/map/lowres/LowresVertexShader.js | 0 .../webapp/src/js/markers/ExtrudeMarker.js | 0 .../webapp/src/js/markers/HtmlMarker.js | 0 .../webapp/src/js/markers/LineMarker.js | 0 .../webapp/src/js/markers/Marker.js | 0 .../js/markers/MarkerFillFragmentShader.js | 0 .../src/js/markers/MarkerFillVertexShader.js | 0 .../webapp/src/js/markers/MarkerManager.js | 0 .../webapp/src/js/markers/MarkerSet.js | 0 .../src/js/markers/NormalMarkerManager.js | 0 .../webapp/src/js/markers/ObjectMarker.js | 0 .../webapp/src/js/markers/PlayerMarker.js | 0 .../src/js/markers/PlayerMarkerManager.js | 0 .../webapp/src/js/markers/PlayerMarkerSet.js | 0 .../webapp/src/js/markers/PoiMarker.js | 0 .../webapp/src/js/markers/ShapeMarker.js | 0 .../webapp/src/js/skybox/SkyFragmentShader.js | 0 .../webapp/src/js/skybox/SkyVertexShader.js | 0 .../webapp/src/js/skybox/SkyboxScene.js | 0 .../webapp/src/js/util/CSS2DRenderer.js | 0 .../webapp/src/js/util/CombinedCamera.js | 0 .../webapp/src/js/util/LineShader.js | 0 .../webapp/src/js/util/Stats.js | 0 .../webapp/src/js/util/Utils.js | 0 {BlueMapCommon => common}/webapp/src/main.js | 0 .../webapp/src/scss/global.scss | 0 .../webapp/src/scss/markers.scss | 0 .../webapp/src/scss/variables.scss | 0 .../webapp/vite.config.js | 0 core/build.gradle.kts | 62 +++++ .../de/bluecolored/bluemap/core/BlueMap.java | 0 .../bluemap/core/logger/AbstractLogger.java | 0 .../bluemap/core/logger/JavaLogger.java | 0 .../bluemap/core/logger/LogFormatter.java | 0 .../bluemap/core/logger/Logger.java | 0 .../bluemap/core/logger/MultiLogger.java | 0 .../core/logger/PrintStreamLogger.java | 0 .../bluemap/core/logger/VoidLogger.java | 0 .../bluecolored/bluemap/core/map/BmMap.java | 0 .../bluemap/core/map/MapSettings.java | 0 .../core/map/MapSettingsSerializer.java | 0 .../bluemap/core/map/TextureGallery.java | 0 .../bluemap/core/map/TileMetaConsumer.java | 0 .../core/map/hires/BlockModelView.java | 0 .../core/map/hires/HiresModelManager.java | 0 .../core/map/hires/HiresModelRenderer.java | 0 .../bluemap/core/map/hires/PRBMWriter.java | 0 .../core/map/hires/RenderSettings.java | 0 .../bluemap/core/map/hires/TileModel.java | 0 .../blockmodel/BlockStateModelFactory.java | 0 .../hires/blockmodel/LiquidModelBuilder.java | 0 .../blockmodel/ResourceModelBuilder.java | 0 .../bluemap/core/map/lowres/LowresLayer.java | 0 .../bluemap/core/map/lowres/LowresTile.java | 0 .../core/map/lowres/LowresTileManager.java | 0 .../core/map/renderstate/CellStorage.java | 0 .../core/map/renderstate/ChunkInfoRegion.java | 0 .../core/map/renderstate/MapChunkState.java | 0 .../core/map/renderstate/MapTileState.java | 0 .../map/renderstate/TileActionResolver.java | 0 .../core/map/renderstate/TileInfoRegion.java | 0 .../core/map/renderstate/TileState.java | 0 .../resources/AbstractTypeAdapterFactory.java | 0 .../BlockColorCalculatorFactory.java | 0 .../core/resources/BlockPropertiesConfig.java | 0 .../core/resources/BlockStateMapping.java | 0 .../core/resources/MinecraftVersion.java | 0 .../bluemap/core/resources/ResourcePath.java | 0 .../core/resources/VersionManifest.java | 0 .../core/resources/adapter/AxisAdapter.java | 0 .../core/resources/adapter/ColorAdapter.java | 0 .../resources/adapter/DirectionAdapter.java | 0 .../adapter/EnumMapInstanceCreator.java | 0 .../adapter/LocalDateTimeAdapter.java | 0 .../resources/adapter/RegistryAdapter.java | 0 .../core/resources/adapter/ResourcesGson.java | 0 .../resources/adapter/Vector2iAdapter.java | 0 .../resources/adapter/Vector3dAdapter.java | 0 .../resources/adapter/Vector3fAdapter.java | 0 .../resources/adapter/Vector4dAdapter.java | 0 .../resources/adapter/Vector4fAdapter.java | 0 .../bluemap/core/resources/pack/Pack.java | 0 .../bluemap/core/resources/pack/PackMeta.java | 0 .../resources/pack/datapack/DataPack.java | 0 .../pack/datapack/biome/DatapackBiome.java | 0 .../datapack/dimension/DimensionTypeData.java | 0 .../pack/resourcepack/ResourcePack.java | 0 .../resourcepack/blockmodel/BlockModel.java | 0 .../pack/resourcepack/blockmodel/Element.java | 0 .../pack/resourcepack/blockmodel/Face.java | 0 .../resourcepack/blockmodel/Rotation.java | 0 .../blockmodel/TextureVariable.java | 0 .../resourcepack/blockstate/BlockState.java | 0 .../blockstate/BlockStateCondition.java | 0 .../resourcepack/blockstate/Multipart.java | 0 .../pack/resourcepack/blockstate/Variant.java | 0 .../resourcepack/blockstate/VariantSet.java | 0 .../resourcepack/blockstate/Variants.java | 0 .../resourcepack/texture/AnimationMeta.java | 0 .../pack/resourcepack/texture/Texture.java | 0 .../bluemap/core/storage/GridStorage.java | 0 .../bluemap/core/storage/ItemStorage.java | 0 .../bluemap/core/storage/KeyedMapStorage.java | 0 .../bluemap/core/storage/MapStorage.java | 0 .../bluemap/core/storage/Storage.java | 0 .../compression/BufferedCompression.java | 0 .../compression/CompressedInputStream.java | 0 .../core/storage/compression/Compression.java | 0 .../storage/compression/NoCompression.java | 0 .../core/storage/file/FileGridStorage.java | 0 .../core/storage/file/FileItemStorage.java | 0 .../core/storage/file/FileMapStorage.java | 0 .../core/storage/file/FileStorage.java | 0 .../bluemap/core/storage/sql/Database.java | 0 .../core/storage/sql/PageSpliterator.java | 0 .../core/storage/sql/SQLGridStorage.java | 0 .../core/storage/sql/SQLItemStorage.java | 0 .../core/storage/sql/SQLMapStorage.java | 0 .../bluemap/core/storage/sql/SQLStorage.java | 0 .../sql/commandset/AbstractCommandSet.java | 0 .../storage/sql/commandset/CommandSet.java | 0 .../sql/commandset/MySQLCommandSet.java | 0 .../sql/commandset/PostgreSQLCommandSet.java | 0 .../sql/commandset/SqliteCommandSet.java | 0 .../bluemap/core/util/BiIntConsumer.java | 0 .../bluemap/core/util/BufferedImageUtil.java | 0 .../bluemap/core/util/CopyingPathVisitor.java | 0 .../core/util/DeletingPathVisitor.java | 0 .../bluemap/core/util/Direction.java | 0 .../bluemap/core/util/FileHelper.java | 0 .../bluecolored/bluemap/core/util/Grid.java | 0 .../bluemap/core/util/InstancePool.java | 0 .../bluemap/core/util/IntComparator.java | 0 .../de/bluecolored/bluemap/core/util/Key.java | 0 .../bluecolored/bluemap/core/util/Keyed.java | 0 .../bluecolored/bluemap/core/util/Lazy.java | 0 .../bluemap/core/util/MergeSort.java | 0 .../core/util/PalettedArrayAdapter.java | 0 .../bluemap/core/util/Preconditions.java | 0 .../bluemap/core/util/Registry.java | 0 .../bluemap/core/util/RegistryAdapter.java | 0 .../core/util/SizeCollectingPathVisitor.java | 0 .../bluemap/core/util/Tristate.java | 0 .../bluemap/core/util/Vector2iCache.java | 0 .../bluemap/core/util/WatchService.java | 0 .../bluemap/core/util/math/Axis.java | 0 .../bluemap/core/util/math/Color.java | 0 .../bluemap/core/util/math/MatrixM3f.java | 0 .../bluemap/core/util/math/MatrixM4f.java | 0 .../bluemap/core/util/math/VectorM2f.java | 0 .../bluemap/core/util/math/VectorM2i.java | 0 .../bluemap/core/util/math/VectorM3f.java | 0 .../util/stream/CountingOutputStream.java | 0 .../core/util/stream/DelegateInputStream.java | 0 .../util/stream/DelegateOutputStream.java | 0 .../core/util/stream/OnCloseInputStream.java | 0 .../core/util/stream/OnCloseOutputStream.java | 0 .../bluemap/core/world/BlockProperties.java | 0 .../bluemap/core/world/BlockState.java | 0 .../bluecolored/bluemap/core/world/Chunk.java | 0 .../bluemap/core/world/ChunkConsumer.java | 0 .../bluemap/core/world/DimensionType.java | 0 .../bluemap/core/world/LightData.java | 0 .../bluemap/core/world/Region.java | 0 .../bluecolored/bluemap/core/world/World.java | 0 .../bluemap/core/world/biome/Biome.java | 0 .../core/world/biome/ColorModifier.java | 0 .../core/world/biome/GrassColorModifier.java | 0 .../bluemap/core/world/block/Block.java | 0 .../core/world/block/BlockNeighborhood.java | 0 .../core/world/block/ExtendedBlock.java | 0 .../world/block/entity/BannerBlockEntity.java | 0 .../core/world/block/entity/BlockEntity.java | 0 .../world/block/entity/BlockEntityLoader.java | 0 .../world/block/entity/BlockEntityType.java | 0 .../world/block/entity/SignBlockEntity.java | 0 .../world/block/entity/SkullBlockEntity.java | 0 .../bluemap/core/world/mca/MCAUtil.java | 0 .../bluemap/core/world/mca/MCAWorld.java | 0 .../world/mca/MCAWorldRegionWatchService.java | 0 .../core/world/mca/PackedIntArrayAccess.java | 0 .../core/world/mca/chunk/ChunkLoader.java | 0 .../core/world/mca/chunk/Chunk_1_13.java | 0 .../core/world/mca/chunk/Chunk_1_15.java | 0 .../core/world/mca/chunk/Chunk_1_16.java | 0 .../core/world/mca/chunk/Chunk_1_18.java | 0 .../core/world/mca/chunk/LegacyBiomes.java | 0 .../core/world/mca/chunk/MCAChunk.java | 0 .../mca/data/BlockStateDeserializer.java | 0 .../mca/data/DimensionTypeDeserializer.java | 0 .../core/world/mca/data/KeyDeserializer.java | 0 .../LenientBlockEntityArrayDeserializer.java | 0 .../core/world/mca/data/LevelData.java | 0 .../core/world/mca/region/LinearRegion.java | 0 .../core/world/mca/region/MCARegion.java | 0 .../core/world/mca/region/RegionType.java | 0 .../assets/bluemap/blockstates/missing.json | 0 .../assets/bluemap/models/block/missing.json | 0 .../assets/bluemap/textures/block/missing.png | Bin .../assets/minecraft/blockColors.json | 0 .../assets/minecraft/blockProperties.json | 0 .../blockstates/acacia_hanging_sign.json | 0 .../minecraft/blockstates/acacia_sign.json | 0 .../blockstates/acacia_wall_hanging_sign.json | 0 .../blockstates/acacia_wall_sign.json | 0 .../blockstates/bamboo_hanging_sign.json | 0 .../blockstates/bamboo_wall_hanging_sign.json | 0 .../blockstates/birch_hanging_sign.json | 0 .../minecraft/blockstates/birch_sign.json | 0 .../blockstates/birch_wall_hanging_sign.json | 0 .../blockstates/birch_wall_sign.json | 0 .../minecraft/blockstates/black_banner.json | 0 .../minecraft/blockstates/black_bed.json | 0 .../blockstates/black_shulker_box.json | 0 .../blockstates/black_wall_banner.json | 0 .../minecraft/blockstates/blue_banner.json | 0 .../minecraft/blockstates/blue_bed.json | 0 .../blockstates/blue_shulker_box.json | 0 .../blockstates/blue_wall_banner.json | 0 .../minecraft/blockstates/brown_banner.json | 0 .../minecraft/blockstates/brown_bed.json | 0 .../blockstates/brown_shulker_box.json | 0 .../blockstates/brown_wall_banner.json | 0 .../minecraft/blockstates/bubble_column.json | 0 .../blockstates/cherry_hanging_sign.json | 0 .../blockstates/cherry_wall_hanging_sign.json | 0 .../assets/minecraft/blockstates/chest.json | 0 .../minecraft/blockstates/creeper_head.json | 0 .../blockstates/creeper_wall_head.json | 0 .../blockstates/crimson_hanging_sign.json | 0 .../minecraft/blockstates/crimson_sign.json | 0 .../crimson_wall_hanging_sign.json | 0 .../blockstates/crimson_wall_sign.json | 0 .../minecraft/blockstates/cyan_banner.json | 0 .../minecraft/blockstates/cyan_bed.json | 0 .../blockstates/cyan_shulker_box.json | 0 .../blockstates/cyan_wall_banner.json | 0 .../blockstates/dark_oak_hanging_sign.json | 0 .../minecraft/blockstates/dark_oak_sign.json | 0 .../dark_oak_wall_hanging_sign.json | 0 .../blockstates/dark_oak_wall_sign.json | 0 .../minecraft/blockstates/decorated_pot.json | 0 .../minecraft/blockstates/dragon_head.json | 0 .../blockstates/dragon_wall_head.json | 0 .../minecraft/blockstates/ender_chest.json | 0 .../minecraft/blockstates/gray_banner.json | 0 .../minecraft/blockstates/gray_bed.json | 0 .../blockstates/gray_shulker_box.json | 0 .../blockstates/gray_wall_banner.json | 0 .../minecraft/blockstates/green_banner.json | 0 .../minecraft/blockstates/green_bed.json | 0 .../blockstates/green_shulker_box.json | 0 .../blockstates/green_wall_banner.json | 0 .../blockstates/jungle_hanging_sign.json | 0 .../minecraft/blockstates/jungle_sign.json | 0 .../blockstates/jungle_wall_hanging_sign.json | 0 .../blockstates/jungle_wall_sign.json | 0 .../assets/minecraft/blockstates/lava.json | 0 .../blockstates/light_blue_banner.json | 0 .../minecraft/blockstates/light_blue_bed.json | 0 .../blockstates/light_blue_shulker_box.json | 0 .../blockstates/light_blue_wall_banner.json | 0 .../blockstates/light_gray_banner.json | 0 .../minecraft/blockstates/light_gray_bed.json | 0 .../blockstates/light_gray_shulker_box.json | 0 .../blockstates/light_gray_wall_banner.json | 0 .../minecraft/blockstates/lime_banner.json | 0 .../minecraft/blockstates/lime_bed.json | 0 .../blockstates/lime_shulker_box.json | 0 .../blockstates/lime_wall_banner.json | 0 .../minecraft/blockstates/magenta_banner.json | 0 .../minecraft/blockstates/magenta_bed.json | 0 .../blockstates/magenta_shulker_box.json | 0 .../blockstates/magenta_wall_banner.json | 0 .../blockstates/mangrove_hanging_sign.json | 0 .../minecraft/blockstates/mangrove_sign.json | 0 .../mangrove_wall_hanging_sign.json | 0 .../blockstates/mangrove_wall_sign.json | 0 .../blockstates/oak_hanging_sign.json | 0 .../minecraft/blockstates/oak_sign.json | 0 .../blockstates/oak_wall_hanging_sign.json | 0 .../minecraft/blockstates/oak_wall_sign.json | 0 .../minecraft/blockstates/orange_banner.json | 0 .../minecraft/blockstates/orange_bed.json | 0 .../blockstates/orange_shulker_box.json | 0 .../blockstates/orange_wall_banner.json | 0 .../minecraft/blockstates/piglin_head.json | 0 .../blockstates/piglin_wall_head.json | 0 .../minecraft/blockstates/pink_banner.json | 0 .../minecraft/blockstates/pink_bed.json | 0 .../blockstates/pink_shulker_box.json | 0 .../blockstates/pink_wall_banner.json | 0 .../minecraft/blockstates/player_head.json | 0 .../blockstates/player_wall_head.json | 0 .../minecraft/blockstates/purple_banner.json | 0 .../minecraft/blockstates/purple_bed.json | 0 .../blockstates/purple_shulker_box.json | 0 .../blockstates/purple_wall_banner.json | 0 .../minecraft/blockstates/red_banner.json | 0 .../assets/minecraft/blockstates/red_bed.json | 0 .../blockstates/red_shulker_box.json | 0 .../blockstates/red_wall_banner.json | 0 .../minecraft/blockstates/shulker_box.json | 0 .../minecraft/blockstates/skeleton_skull.json | 0 .../blockstates/skeleton_wall_skull.json | 0 .../blockstates/spruce_hanging_sign.json | 0 .../minecraft/blockstates/spruce_sign.json | 0 .../blockstates/spruce_wall_hanging_sign.json | 0 .../blockstates/spruce_wall_sign.json | 0 .../minecraft/blockstates/trapped_chest.json | 0 .../blockstates/warped_hanging_sign.json | 0 .../minecraft/blockstates/warped_sign.json | 0 .../blockstates/warped_wall_hanging_sign.json | 0 .../blockstates/warped_wall_sign.json | 0 .../assets/minecraft/blockstates/water.json | 0 .../minecraft/blockstates/white_banner.json | 0 .../minecraft/blockstates/white_bed.json | 0 .../blockstates/white_shulker_box.json | 0 .../blockstates/white_wall_banner.json | 0 .../blockstates/wither_skeleton_skull.json | 0 .../wither_skeleton_wall_skull.json | 0 .../minecraft/blockstates/yellow_banner.json | 0 .../minecraft/blockstates/yellow_bed.json | 0 .../blockstates/yellow_shulker_box.json | 0 .../blockstates/yellow_wall_banner.json | 0 .../minecraft/blockstates/zombie_head.json | 0 .../blockstates/zombie_wall_head.json | 0 .../minecraft/models/block/bed/bed_foot.json | 0 .../minecraft/models/block/bed/bed_head.json | 0 .../models/block/bed/black_foot.json | 0 .../models/block/bed/black_head.json | 0 .../minecraft/models/block/bed/blue_foot.json | 0 .../minecraft/models/block/bed/blue_head.json | 0 .../models/block/bed/brown_foot.json | 0 .../models/block/bed/brown_head.json | 0 .../minecraft/models/block/bed/cyan_foot.json | 0 .../minecraft/models/block/bed/cyan_head.json | 0 .../minecraft/models/block/bed/gray_foot.json | 0 .../minecraft/models/block/bed/gray_head.json | 0 .../models/block/bed/green_foot.json | 0 .../models/block/bed/green_head.json | 0 .../models/block/bed/light_blue_foot.json | 0 .../models/block/bed/light_blue_head.json | 0 .../models/block/bed/light_gray_foot.json | 0 .../models/block/bed/light_gray_head.json | 0 .../minecraft/models/block/bed/lime_foot.json | 0 .../minecraft/models/block/bed/lime_head.json | 0 .../models/block/bed/magenta_foot.json | 0 .../models/block/bed/magenta_head.json | 0 .../models/block/bed/orange_foot.json | 0 .../models/block/bed/orange_head.json | 0 .../minecraft/models/block/bed/pink_foot.json | 0 .../minecraft/models/block/bed/pink_head.json | 0 .../models/block/bed/purple_foot.json | 0 .../models/block/bed/purple_head.json | 0 .../minecraft/models/block/bed/red_foot.json | 0 .../minecraft/models/block/bed/red_head.json | 0 .../models/block/bed/white_foot.json | 0 .../models/block/bed/white_head.json | 0 .../models/block/bed/yellow_foot.json | 0 .../models/block/bed/yellow_head.json | 0 .../models/block/bell_between_walls.json | 0 .../minecraft/models/block/bell_ceiling.json | 0 .../minecraft/models/block/bell_floor.json | 0 .../minecraft/models/block/bell_wall.json | 0 .../minecraft/models/block/bubble_column.json | 0 .../assets/minecraft/models/block/cake.json | 0 .../minecraft/models/block/cake_slice1.json | 0 .../minecraft/models/block/cake_slice2.json | 0 .../minecraft/models/block/cake_slice3.json | 0 .../minecraft/models/block/cake_slice4.json | 0 .../minecraft/models/block/cake_slice5.json | 0 .../minecraft/models/block/cake_slice6.json | 0 .../minecraft/models/block/chest/chest.json | 0 .../models/block/chest/chest_double.json | 0 .../minecraft/models/block/chest/ender.json | 0 .../minecraft/models/block/chest/left.json | 0 .../minecraft/models/block/chest/normal.json | 0 .../models/block/chest/normal_double.json | 0 .../minecraft/models/block/chest/trapped.json | 0 .../models/block/chest/trapped_double.json | 0 .../assets/minecraft/models/block/lava.json | 0 .../minecraft/models/block/sign/acacia.json | 0 .../minecraft/models/block/sign/bamboo.json | 0 .../minecraft/models/block/sign/birch.json | 0 .../minecraft/models/block/sign/cherry.json | 0 .../minecraft/models/block/sign/crimson.json | 0 .../minecraft/models/block/sign/dark_oak.json | 0 .../minecraft/models/block/sign/jungle.json | 0 .../minecraft/models/block/sign/mangrove.json | 0 .../minecraft/models/block/sign/oak.json | 0 .../minecraft/models/block/sign/sign.json | 0 .../minecraft/models/block/sign/spruce.json | 0 .../models/block/sign/wall_acacia.json | 0 .../models/block/sign/wall_bamboo.json | 0 .../models/block/sign/wall_birch.json | 0 .../models/block/sign/wall_cherry.json | 0 .../models/block/sign/wall_crimson.json | 0 .../models/block/sign/wall_dark_oak.json | 0 .../models/block/sign/wall_jungle.json | 0 .../models/block/sign/wall_mangrove.json | 0 .../minecraft/models/block/sign/wall_oak.json | 0 .../models/block/sign/wall_sign.json | 0 .../models/block/sign/wall_spruce.json | 0 .../models/block/sign/wall_warped.json | 0 .../minecraft/models/block/sign/warped.json | 0 .../assets/minecraft/models/block/water.json | 0 .../models/entity/acacia_hanging_sign.json | 0 .../entity/acacia_wall_hanging_sign.json | 0 .../models/entity/bamboo_hanging_sign.json | 0 .../entity/bamboo_wall_hanging_sign.json | 0 .../minecraft/models/entity/banner.json | 0 .../models/entity/birch_hanging_sign.json | 0 .../entity/birch_wall_hanging_sign.json | 0 .../models/entity/cherry_hanging_sign.json | 0 .../entity/cherry_wall_hanging_sign.json | 0 .../minecraft/models/entity/creeper_head.json | 0 .../models/entity/creeper_wall_head.json | 0 .../models/entity/crimson_hanging_sign.json | 0 .../entity/crimson_wall_hanging_sign.json | 0 .../models/entity/dark_oak_hanging_sign.json | 0 .../entity/dark_oak_wall_hanging_sign.json | 0 .../models/entity/decorated_pot.json | 0 .../minecraft/models/entity/dragon_head.json | 0 .../models/entity/dragon_wall_head.json | 0 .../models/entity/dyed_shulker_box.json | 0 .../minecraft/models/entity/hanging_sign.json | 0 .../models/entity/jungle_hanging_sign.json | 0 .../entity/jungle_wall_hanging_sign.json | 0 .../models/entity/mangrove_hanging_sign.json | 0 .../entity/mangrove_wall_hanging_sign.json | 0 .../models/entity/oak_hanging_sign.json | 0 .../models/entity/oak_wall_hanging_sign.json | 0 .../minecraft/models/entity/piglin_head.json | 0 .../models/entity/piglin_wall_head.json | 0 .../minecraft/models/entity/player_head.json | 0 .../models/entity/player_wall_head.json | 0 .../minecraft/models/entity/shulker_box.json | 0 .../models/entity/skeleton_skull.json | 0 .../models/entity/skeleton_wall_skull.json | 0 .../minecraft/models/entity/skull_32.json | 0 .../minecraft/models/entity/skull_64.json | 0 .../models/entity/spruce_hanging_sign.json | 0 .../entity/spruce_wall_hanging_sign.json | 0 .../minecraft/models/entity/wall_banner.json | 0 .../models/entity/wall_hanging_sign.json | 0 .../models/entity/wall_skull_32.json | 0 .../models/entity/wall_skull_64.json | 0 .../models/entity/warped_hanging_sign.json | 0 .../entity/warped_wall_hanging_sign.json | 0 .../models/entity/wither_skeleton_skull.json | 0 .../entity/wither_skeleton_wall_skull.json | 0 .../minecraft/models/entity/zombie_head.json | 0 .../models/entity/zombie_wall_head.json | 0 .../assets/minecraft/blockstates/chest.json | 0 .../minecraft/blockstates/ender_chest.json | 0 .../minecraft/blockstates/trapped_chest.json | 0 .../minecraft/models/block/chest/chest.json | 0 .../models/block/chest/chest_double_left.json | 0 .../block/chest/chest_double_right.json | 0 .../block/chest/normal_double_left.json | 0 .../block/chest/normal_double_right.json | 0 .../block/chest/trapped_double_left.json | 0 .../block/chest/trapped_double_right.json | 0 .../minecraft/blockstates/grass_path.json | 0 .../assets/minecraft/blockstates/grass.json | 0 .../src/main/resourceExtensions/pack.mcmeta | 0 .../de/bluecolored/bluemap/version.json | 0 .../bluemap/core/world/BlockStateTest.java | 0 .../bluemap/core/world/GridTest.java | 0 gradle.properties | 2 +- gradle/libs.versions.toml | 39 +++ gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 60756 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 31 +-- gradlew.bat | 15 +- implementations/cli/build.gradle.kts | 76 +---- implementations/cli/settings.gradle.kts | 3 - implementations/fabric-1.18/build.gradle.kts | 178 ------------ .../gradle/wrapper/gradle-wrapper.jar | Bin 59821 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 - implementations/fabric-1.18/gradlew | 234 ---------------- implementations/fabric-1.18/gradlew.bat | 89 ------ .../fabric-1.18/settings.gradle.kts | 13 - .../bluemap/fabric/FabricCommandSource.java | 82 ------ .../bluemap/fabric/FabricEventForwarder.java | 76 ----- .../bluecolored/bluemap/fabric/FabricMod.java | 241 ---------------- .../bluemap/fabric/FabricPlayer.java | 153 ---------- .../bluemap/fabric/FabricWorld.java | 110 -------- .../bluemap/fabric/Log4jLogger.java | 69 ----- .../main/resources/assets/bluemap/icon.png | Bin 10593 -> 0 bytes .../src/main/resources/fabric.mod.json | 33 --- .../fabric-1.19.4/build.gradle.kts | 176 ------------ .../fabric-1.19.4/settings.gradle.kts | 13 - .../bluemap/fabric/FabricCommandSource.java | 82 ------ .../bluemap/fabric/FabricEventForwarder.java | 76 ----- .../bluecolored/bluemap/fabric/FabricMod.java | 241 ---------------- .../bluemap/fabric/FabricPlayer.java | 153 ---------- .../bluemap/fabric/FabricWorld.java | 110 -------- .../bluemap/fabric/Log4jLogger.java | 69 ----- .../main/resources/assets/bluemap/icon.png | Bin 10593 -> 0 bytes .../src/main/resources/fabric.mod.json | 33 --- .../fabric-1.20.5/build.gradle.kts | 176 ------------ .../fabric-1.20.5/settings.gradle.kts | 13 - .../bluemap/fabric/FabricCommandSource.java | 86 ------ .../bluemap/fabric/FabricEventForwarder.java | 76 ----- .../bluecolored/bluemap/fabric/FabricMod.java | 241 ---------------- .../bluemap/fabric/FabricPlayer.java | 157 ----------- .../bluemap/fabric/FabricWorld.java | 110 -------- .../bluemap/fabric/Log4jLogger.java | 69 ----- .../main/resources/assets/bluemap/icon.png | Bin 10593 -> 0 bytes .../src/main/resources/fabric.mod.json | 33 --- implementations/fabric-1.20/build.gradle.kts | 180 ------------ .../fabric-1.20/settings.gradle.kts | 13 - .../bluemap/fabric/FabricCommandSource.java | 82 ------ .../bluemap/fabric/FabricEventForwarder.java | 76 ----- .../bluecolored/bluemap/fabric/FabricMod.java | 241 ---------------- .../bluemap/fabric/FabricPlayer.java | 157 ----------- .../bluemap/fabric/FabricWorld.java | 110 -------- .../bluemap/fabric/Log4jLogger.java | 69 ----- .../main/resources/assets/bluemap/icon.png | Bin 10593 -> 0 bytes .../src/main/resources/fabric.mod.json | 33 --- implementations/fabric/build.gradle.kts | 226 ++++++--------- implementations/fabric/settings.gradle.kts | 13 - .../fabric/src/main/resources/fabric.mod.json | 10 +- implementations/forge-1.18.1/build.gradle | 208 -------------- .../forge-1.18.1/settings.gradle.kts | 3 - .../bluemap/forge/ForgeCommandSource.java | 74 ----- .../bluemap/forge/ForgeEventForwarder.java | 67 ----- .../bluecolored/bluemap/forge/ForgeMod.java | 257 ----------------- .../bluemap/forge/ForgePlayer.java | 154 ---------- .../bluecolored/bluemap/forge/ForgeWorld.java | 111 -------- .../bluemap/forge/Log4jLogger.java | 69 ----- .../src/main/resources/META-INF/mods.toml | 26 -- .../src/main/resources/pack.mcmeta | 6 - implementations/forge-1.19.4/build.gradle | 207 -------------- .../forge-1.19.4/settings.gradle.kts | 4 - .../bluemap/forge/ForgeCommandSource.java | 74 ----- .../bluemap/forge/ForgeEventForwarder.java | 67 ----- .../bluecolored/bluemap/forge/ForgeMod.java | 257 ----------------- .../bluemap/forge/ForgePlayer.java | 154 ---------- .../bluecolored/bluemap/forge/ForgeWorld.java | 111 -------- .../bluemap/forge/Log4jLogger.java | 69 ----- .../src/main/resources/META-INF/mods.toml | 26 -- .../src/main/resources/pack.mcmeta | 6 - implementations/forge-1.20.6/build.gradle | 195 ------------- .../forge-1.20.6/settings.gradle.kts | 3 - .../bluemap/forge/ForgeCommandSource.java | 74 ----- .../bluemap/forge/ForgeEventForwarder.java | 67 ----- .../bluecolored/bluemap/forge/ForgeMod.java | 262 ------------------ .../bluemap/forge/ForgePlayer.java | 154 ---------- .../bluecolored/bluemap/forge/ForgeWorld.java | 111 -------- .../bluemap/forge/Log4jLogger.java | 69 ----- .../src/main/resources/META-INF/mods.toml | 26 -- .../src/main/resources/pack.mcmeta | 6 - implementations/forge-1.20/build.gradle | 211 -------------- .../forge-1.20/settings.gradle.kts | 4 - .../bluemap/forge/ForgeCommandSource.java | 74 ----- .../bluemap/forge/ForgeEventForwarder.java | 67 ----- .../bluecolored/bluemap/forge/ForgeMod.java | 257 ----------------- .../bluemap/forge/ForgePlayer.java | 154 ---------- .../bluecolored/bluemap/forge/ForgeWorld.java | 111 -------- .../bluemap/forge/Log4jLogger.java | 69 ----- .../src/main/resources/META-INF/mods.toml | 26 -- .../forge-1.20/src/main/resources/pack.mcmeta | 6 - implementations/forge/build.gradle | 195 ------------- implementations/forge/build.gradle.kts | 115 ++++++++ implementations/forge/settings.gradle.kts | 3 - .../src/main/resources/META-INF/mods.toml | 11 +- implementations/neoforge/build.gradle | 161 ----------- implementations/neoforge/build.gradle.kts | 106 +++++++ implementations/neoforge/gradle.properties | 17 -- implementations/neoforge/settings.gradle | 15 - .../resources/META-INF/neoforge.mods.toml | 20 +- .../neoforge/src/main/resources/pack.mcmeta | 4 +- implementations/paper/build.gradle.kts | 191 +++++-------- implementations/paper/settings.gradle.kts | 3 - .../paper/src/main/resources/plugin.yml | 42 +-- implementations/spigot/build.gradle.kts | 168 ++++------- implementations/spigot/settings.gradle.kts | 3 - .../spigot/src/main/resources/plugin.yml | 41 +-- implementations/sponge/build.gradle.kts | 187 ++++--------- implementations/sponge/settings.gradle.kts | 3 - jitpack.yml | 2 - settings.gradle.kts | 56 ++-- 813 files changed, 1045 insertions(+), 9651 deletions(-) delete mode 100644 .github/workflows/publish.yml delete mode 160000 BlueMapAPI delete mode 100644 BlueMapCommon/build.gradle.kts delete mode 100644 BlueMapCommon/settings.gradle.kts delete mode 100644 BlueMapCore/build.gradle.kts delete mode 100644 BlueMapCore/settings.gradle.kts rename HEADER => LICENSE_HEADER (100%) create mode 160000 api delete mode 100644 build.gradle.kts create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/settings.gradle.kts create mode 100644 buildSrc/src/main/kotlin/CopyFileTask.kt create mode 100644 buildSrc/src/main/kotlin/bluemap.base.gradle.kts create mode 100644 buildSrc/src/main/kotlin/bluemap.curseforge.gradle.kts create mode 100644 buildSrc/src/main/kotlin/bluemap.hangar.gradle.kts create mode 100644 buildSrc/src/main/kotlin/bluemap.implementation.gradle.kts create mode 100644 buildSrc/src/main/kotlin/bluemap.modrinth.gradle.kts create mode 100644 buildSrc/src/main/kotlin/bluemap.ore.gradle.kts create mode 100644 buildSrc/src/main/kotlin/curseforge.kt create mode 100644 buildSrc/src/main/kotlin/versioning.kt create mode 100644 common/build.gradle.kts rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/InterruptableReentrantLock.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/MissingResourcesException.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/WebFilesManager.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/addons/AddonException.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/addons/AddonInfo.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/addons/Addons.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/addons/LoadedAddon.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/AssetStorageImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/PluginImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/ConfigLoader.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/ConfigTemplate.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/ConfigurationException.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/CoreConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/MapConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/PluginConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/WebappConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/WebserverConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/storage/Dialect.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/storage/FileConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/storage/SQLConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageConfig.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageType.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/Vector2iTypeSerializer.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/debug/DebugDump.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/debug/StateDumper.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/live/LiveMarkersDataSupplier.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/live/LivePlayersDataSupplier.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/metrics/Metrics.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/MapUpdateService.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/PluginState.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/AbstractSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/StorageSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/TaskRefSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/skins/DefaultPlayerIconFactory.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/skins/MojangSkinProvider.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/text/Text.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextColor.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextFormat.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/CombinedRenderTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapSaveTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapUpdateTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/ProgressTracker.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderManager.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/StorageDeleteTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/rendermanager/WorldRegionRenderTask.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/CommandSource.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/Gamemode.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/Player.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerEventListener.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/CachedRateLimitDataSupplier.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequest.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequestHandler.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpResponse.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/HttpStatusCode.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/SelectionConsumer.java (100%) rename {BlueMapCommon => common}/src/main/java/de/bluecolored/bluemap/common/web/http/Server.java (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/core.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/plugin.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/storages/file.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/storages/sql.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/webapp.conf (100%) rename {BlueMapCommon => common}/src/main/resources/de/bluecolored/bluemap/config/webserver.conf (100%) rename {BlueMapCommon => common}/webapp/.eslintrc.cjs (100%) rename {BlueMapCommon => common}/webapp/.gitignore (100%) rename {BlueMapCommon => common}/webapp/README.md (100%) rename {BlueMapCommon => common}/webapp/index.html (100%) rename {BlueMapCommon => common}/webapp/package-lock.json (100%) rename {BlueMapCommon => common}/webapp/package.json (100%) rename {BlueMapCommon => common}/webapp/public/assets/logo.png (100%) rename {BlueMapCommon => common}/webapp/public/assets/logoCircle512.png (100%) rename {BlueMapCommon => common}/webapp/public/assets/logoCircle64.png (100%) rename {BlueMapCommon => common}/webapp/public/assets/poi.svg (100%) rename {BlueMapCommon => common}/webapp/public/assets/steve.png (100%) rename {BlueMapCommon => common}/webapp/public/lang/cs.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/de.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/en.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/es.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/fi.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/fr.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/hi.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/hu.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/it.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/ja.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/ko.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/lv.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/nl.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/no_nb.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/pl.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/pt_PT.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/ru.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/settings.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/sr_cyrl.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/sr_latn.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/sv.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/th.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/tr.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/ua.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/vi.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/zh_CN.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/zh_HK.conf (100%) rename {BlueMapCommon => common}/webapp/public/lang/zh_TW.conf (100%) rename {BlueMapCommon => common}/webapp/public/sql.php (100%) rename {BlueMapCommon => common}/webapp/src/App.vue (100%) rename {BlueMapCommon => common}/webapp/src/assets/favicon.png (100%) rename {BlueMapCommon => common}/webapp/src/assets/manifest.webmanifest (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/Compass.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/ControlBar.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/ControlsSwitch.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/DayNightSwitch.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/MenuButton.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/NumberInput.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/PositionInput.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/ControlBar/SvgButton.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Controls/FreeFlightMobileControls.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Controls/ZoomButtons.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/ChoiceBox.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/Group.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/MainMenu.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/MapButton.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/MarkerItem.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/MarkerSet.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/MarkerSetMenu.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/SettingsMenu.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/SideMenu.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/SimpleButton.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/Slider.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/SwitchButton.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/SwitchHandle.vue (100%) rename {BlueMapCommon => common}/webapp/src/components/Menu/TextInput.vue (100%) rename {BlueMapCommon => common}/webapp/src/fonts/OFL.txt (100%) rename {BlueMapCommon => common}/webapp/src/fonts/Quicksand.ttf (100%) rename {BlueMapCommon => common}/webapp/src/i18n.js (100%) rename {BlueMapCommon => common}/webapp/src/js/BlueMap.js (100%) rename {BlueMapCommon => common}/webapp/src/js/BlueMapApp.js (100%) rename {BlueMapCommon => common}/webapp/src/js/MainMenu.js (100%) rename {BlueMapCommon => common}/webapp/src/js/MapViewer.js (100%) rename {BlueMapCommon => common}/webapp/src/js/PopupMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/Utils.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/ControlsManager.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/KeyCombination.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/FreeFlightControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/keyboard/KeyHeightControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/keyboard/KeyMoveControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/mouse/MouseAngleControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/mouse/MouseRotateControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/freeflight/touch/TouchPanControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/MapControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/MapHeightControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/keyboard/KeyAngleControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/keyboard/KeyMoveControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/keyboard/KeyRotateControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/keyboard/KeyZoomControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/mouse/MouseAngleControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/mouse/MouseMoveControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/mouse/MouseRotateControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/mouse/MouseZoomControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/touch/TouchAngleControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/touch/TouchMoveControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/touch/TouchRotateControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/controls/map/touch/TouchZoomControls.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/LowresTileLoader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/Map.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/TextureAnimation.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/Tile.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/TileLoader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/TileManager.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/TileMap.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/hires/HiresFragmentShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/hires/HiresVertexShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/hires/PRBMLoader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/lowres/LowresFragmentShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/map/lowres/LowresVertexShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/ExtrudeMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/HtmlMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/LineMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/Marker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/MarkerFillFragmentShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/MarkerFillVertexShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/MarkerManager.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/MarkerSet.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/NormalMarkerManager.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/ObjectMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/PlayerMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/PlayerMarkerManager.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/PlayerMarkerSet.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/PoiMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/markers/ShapeMarker.js (100%) rename {BlueMapCommon => common}/webapp/src/js/skybox/SkyFragmentShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/skybox/SkyVertexShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/skybox/SkyboxScene.js (100%) rename {BlueMapCommon => common}/webapp/src/js/util/CSS2DRenderer.js (100%) rename {BlueMapCommon => common}/webapp/src/js/util/CombinedCamera.js (100%) rename {BlueMapCommon => common}/webapp/src/js/util/LineShader.js (100%) rename {BlueMapCommon => common}/webapp/src/js/util/Stats.js (100%) rename {BlueMapCommon => common}/webapp/src/js/util/Utils.js (100%) rename {BlueMapCommon => common}/webapp/src/main.js (100%) rename {BlueMapCommon => common}/webapp/src/scss/global.scss (100%) rename {BlueMapCommon => common}/webapp/src/scss/markers.scss (100%) rename {BlueMapCommon => common}/webapp/src/scss/variables.scss (100%) rename {BlueMapCommon => common}/webapp/vite.config.js (100%) create mode 100644 core/build.gradle.kts rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/BlueMap.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/JavaLogger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/LogFormatter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/Logger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/MultiLogger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/PrintStreamLogger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/logger/VoidLogger.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/MapSettings.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/MapSettingsSerializer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/TileMetaConsumer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/BlockModelView.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelManager.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/PRBMWriter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/RenderSettings.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/TileModel.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelBuilder.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresLayer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTile.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTileManager.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/CellStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/ChunkInfoRegion.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapChunkState.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapTileState.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileActionResolver.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileInfoRegion.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileState.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/AbstractTypeAdapterFactory.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/BlockColorCalculatorFactory.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/BlockPropertiesConfig.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/BlockStateMapping.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/ResourcePath.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/VersionManifest.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/AxisAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ColorAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/DirectionAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/EnumMapInstanceCreator.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/LocalDateTimeAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/RegistryAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ResourcesGson.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector2iAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3dAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3fAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4dAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4fAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/biome/DatapackBiome.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/dimension/DimensionTypeData.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/BlockModel.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Element.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Face.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Rotation.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/TextureVariable.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockState.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockStateCondition.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Multipart.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variant.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/VariantSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variants.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/AnimationMeta.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/Texture.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/GridStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/ItemStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/KeyedMapStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/MapStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/Storage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/compression/BufferedCompression.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/compression/CompressedInputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/compression/Compression.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/compression/NoCompression.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/file/FileGridStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/file/FileItemStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/file/FileMapStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/Database.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/PageSpliterator.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLGridStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLItemStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLMapStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLStorage.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/AbstractCommandSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/CommandSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/MySQLCommandSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/SqliteCommandSet.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/BiIntConsumer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/CopyingPathVisitor.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/DeletingPathVisitor.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Direction.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/FileHelper.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Grid.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/InstancePool.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/IntComparator.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Key.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Lazy.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/MergeSort.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/PalettedArrayAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Preconditions.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Registry.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/RegistryAdapter.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/SizeCollectingPathVisitor.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Tristate.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/Vector2iCache.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/WatchService.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/Axis.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/Color.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM3f.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM4f.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2f.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2i.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM3f.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/stream/CountingOutputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateInputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateOutputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseInputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseOutputStream.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/BlockProperties.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/BlockState.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/Chunk.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/ChunkConsumer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/DimensionType.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/LightData.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/Region.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/World.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/biome/Biome.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/biome/ColorModifier.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/biome/GrassColorModifier.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BannerBlockEntity.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntity.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityLoader.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityType.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SignBlockEntity.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SkullBlockEntity.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAUtil.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorldRegionWatchService.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/PackedIntArrayAccess.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/LegacyBiomes.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/data/BlockStateDeserializer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/data/DimensionTypeDeserializer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/data/KeyDeserializer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LenientBlockEntityArrayDeserializer.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/region/LinearRegion.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java (100%) rename {BlueMapCore => core}/src/main/java/de/bluecolored/bluemap/core/world/mca/region/RegionType.java (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/bluemap/blockstates/missing.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/bluemap/models/block/missing.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/bluemap/textures/block/missing.png (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockColors.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockProperties.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/birch_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/birch_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/black_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/black_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/black_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/black_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/blue_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/blue_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/blue_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/blue_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/brown_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/brown_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/brown_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/brown_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/bubble_column.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/decorated_pot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/ender_chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/gray_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/gray_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/gray_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/gray_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/green_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/green_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/green_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/green_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/lava.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/lime_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/lime_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/lime_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/lime_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/oak_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/oak_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/orange_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/orange_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/orange_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/orange_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/pink_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/pink_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/pink_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/pink_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/player_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/player_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/purple_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/purple_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/purple_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/purple_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/red_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/red_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/red_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/red_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_wall_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/trapped_chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/warped_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/warped_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/water.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/white_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/white_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/white_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/white_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_wall_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_bed.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_foot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bell_between_walls.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bell_ceiling.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bell_floor.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bell_wall.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/bubble_column.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice1.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice2.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice3.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice4.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice5.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice6.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest_double.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/ender.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/left.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal_double.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped_double.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/lava.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/acacia.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/bamboo.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/birch.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/cherry.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/crimson.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/dark_oak.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/jungle.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/mangrove.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/oak.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/spruce.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_acacia.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_bamboo.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_birch.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_cherry.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_crimson.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_dark_oak.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_jungle.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_mangrove.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_oak.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_spruce.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_warped.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/sign/warped.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/block/water.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/birch_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/birch_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/decorated_pot.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/dyed_shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/oak_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/oak_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/player_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/player_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/shulker_box.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_wall_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/skull_32.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/skull_64.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wall_banner.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_32.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_64.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/warped_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/warped_wall_hanging_sign.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_wall_skull.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_wall_head.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/ender_chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/trapped_chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_left.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_right.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_left.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_right.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_left.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_right.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_17/assets/minecraft/blockstates/grass_path.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json (100%) rename {BlueMapCore => core}/src/main/resourceExtensions/pack.mcmeta (100%) rename {BlueMapCore => core}/src/main/resources/de/bluecolored/bluemap/version.json (100%) rename {BlueMapCore => core}/src/test/java/de/bluecolored/bluemap/core/world/BlockStateTest.java (100%) rename {BlueMapCore => core}/src/test/java/de/bluecolored/bluemap/core/world/GridTest.java (100%) create mode 100644 gradle/libs.versions.toml delete mode 100644 implementations/cli/settings.gradle.kts delete mode 100644 implementations/fabric-1.18/build.gradle.kts delete mode 100644 implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.jar delete mode 100644 implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.properties delete mode 100644 implementations/fabric-1.18/gradlew delete mode 100644 implementations/fabric-1.18/gradlew.bat delete mode 100644 implementations/fabric-1.18/settings.gradle.kts delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java delete mode 100644 implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java delete mode 100644 implementations/fabric-1.18/src/main/resources/assets/bluemap/icon.png delete mode 100644 implementations/fabric-1.18/src/main/resources/fabric.mod.json delete mode 100644 implementations/fabric-1.19.4/build.gradle.kts delete mode 100644 implementations/fabric-1.19.4/settings.gradle.kts delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java delete mode 100644 implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java delete mode 100644 implementations/fabric-1.19.4/src/main/resources/assets/bluemap/icon.png delete mode 100644 implementations/fabric-1.19.4/src/main/resources/fabric.mod.json delete mode 100644 implementations/fabric-1.20.5/build.gradle.kts delete mode 100644 implementations/fabric-1.20.5/settings.gradle.kts delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java delete mode 100644 implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java delete mode 100644 implementations/fabric-1.20.5/src/main/resources/assets/bluemap/icon.png delete mode 100644 implementations/fabric-1.20.5/src/main/resources/fabric.mod.json delete mode 100644 implementations/fabric-1.20/build.gradle.kts delete mode 100644 implementations/fabric-1.20/settings.gradle.kts delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java delete mode 100644 implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java delete mode 100644 implementations/fabric-1.20/src/main/resources/assets/bluemap/icon.png delete mode 100644 implementations/fabric-1.20/src/main/resources/fabric.mod.json delete mode 100644 implementations/fabric/settings.gradle.kts delete mode 100644 implementations/forge-1.18.1/build.gradle delete mode 100644 implementations/forge-1.18.1/settings.gradle.kts delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java delete mode 100644 implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java delete mode 100644 implementations/forge-1.18.1/src/main/resources/META-INF/mods.toml delete mode 100644 implementations/forge-1.18.1/src/main/resources/pack.mcmeta delete mode 100644 implementations/forge-1.19.4/build.gradle delete mode 100644 implementations/forge-1.19.4/settings.gradle.kts delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java delete mode 100644 implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java delete mode 100644 implementations/forge-1.19.4/src/main/resources/META-INF/mods.toml delete mode 100644 implementations/forge-1.19.4/src/main/resources/pack.mcmeta delete mode 100644 implementations/forge-1.20.6/build.gradle delete mode 100644 implementations/forge-1.20.6/settings.gradle.kts delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java delete mode 100644 implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java delete mode 100644 implementations/forge-1.20.6/src/main/resources/META-INF/mods.toml delete mode 100644 implementations/forge-1.20.6/src/main/resources/pack.mcmeta delete mode 100644 implementations/forge-1.20/build.gradle delete mode 100644 implementations/forge-1.20/settings.gradle.kts delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java delete mode 100644 implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java delete mode 100644 implementations/forge-1.20/src/main/resources/META-INF/mods.toml delete mode 100644 implementations/forge-1.20/src/main/resources/pack.mcmeta delete mode 100644 implementations/forge/build.gradle create mode 100644 implementations/forge/build.gradle.kts delete mode 100644 implementations/forge/settings.gradle.kts delete mode 100644 implementations/neoforge/build.gradle create mode 100644 implementations/neoforge/build.gradle.kts delete mode 100644 implementations/neoforge/gradle.properties delete mode 100644 implementations/neoforge/settings.gradle delete mode 100644 implementations/paper/settings.gradle.kts delete mode 100644 implementations/spigot/settings.gradle.kts delete mode 100644 implementations/sponge/settings.gradle.kts delete mode 100644 jitpack.yml diff --git a/.github/translation-checker/index.js b/.github/translation-checker/index.js index aae8347c..e62f87d1 100644 --- a/.github/translation-checker/index.js +++ b/.github/translation-checker/index.js @@ -80,7 +80,7 @@ function parse(str) { return nodes; } -const langFolder = "../../BlueMapCommon/webapp/public/lang/"; +const langFolder = "../../common/webapp/public/lang/"; const languageFiles = readdirSync(langFolder).filter( (f) => f.endsWith(".conf") && f !== "settings.conf" ); diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d6c40571..c93a7cfd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,13 +23,10 @@ jobs: uses: actions/setup-java@v4 with: distribution: 'temurin' - java-version: | - 16 - 17 - 21 + java-version: 21 cache: 'gradle' - name: Build with Gradle - run: ./gradlew clean spotlessCheck test build + run: ./gradlew spotlessCheck test release --stacktrace - uses: actions/upload-artifact@v4 with: name: artifacts diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index ea1c492a..00000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: Publish - -on: - workflow_dispatch: - push: - tags: - - "**" - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - fetch-depth: 0 # needed for versioning - - name: Set up Java - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: | - 16 - 17 - 21 - cache: 'gradle' - - name: Build with Gradle - run: ./gradlew clean :BlueMapCore:publish :BlueMapCommon:publish - env: - BLUECOLORED_USERNAME: ${{ secrets.BLUECOLORED_USERNAME }} - BLUECOLORED_PASSWORD: ${{ secrets.BLUECOLORED_PASSWORD }} diff --git a/.gitignore b/.gitignore index a211e5a7..4d9a4f73 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ doc/ logs/ .run/ run/ +runs/ node_modules/ .classpath @@ -17,8 +18,8 @@ node_modules/ release.md # exclude generated resource -BlueMapCommon/src/main/resources/de/bluecolored/bluemap/webapp.zip -BlueMapCore/src/main/resources/de/bluecolored/bluemap/resourceExtensions.zip +common/src/main/resources/de/bluecolored/bluemap/webapp.zip +core/src/main/resources/de/bluecolored/bluemap/resourceExtensions.zip #exclude-test-data data/test-render diff --git a/.gitmodules b/.gitmodules index 206668b2..31a1d950 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "BlueMapAPI"] - path = BlueMapAPI + path = api url = https://github.com/BlueMap-Minecraft/BlueMapAPI diff --git a/BlueMapAPI b/BlueMapAPI deleted file mode 160000 index ec977113..00000000 --- a/BlueMapAPI +++ /dev/null @@ -1 +0,0 @@ -Subproject commit ec977113495dacd6f2e24239015f4b94b305fc52 diff --git a/BlueMapCommon/build.gradle.kts b/BlueMapCommon/build.gradle.kts deleted file mode 100644 index 24e448fc..00000000 --- a/BlueMapCommon/build.gradle.kts +++ /dev/null @@ -1,148 +0,0 @@ -import com.github.gradle.node.npm.task.NpmTask -import java.io.IOException - -plugins { - java - `java-library` - `maven-publish` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.5.0" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -val lastVersion = System.getProperty("bluemap.lastVersion") ?: "?" // set by BlueMapCore - -val javaTarget = 16 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - withSourcesJar() - withJavadocJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://repo.bluecolored.de/releases") -} - -dependencies { - api ("com.mojang:brigadier:1.0.17") - - api ("de.bluecolored.bluemap:BlueMapCore") - - compileOnly ("org.jetbrains:annotations:16.0.2") - compileOnly ("org.projectlombok:lombok:1.18.32") - - annotationProcessor ("org.projectlombok:lombok:1.18.32") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.javadoc { - options { - (this as? StandardJavadocDocletOptions)?.apply { - links( - "https://docs.oracle.com/en/java/javase/16/docs/api/", - "https://javadoc.io/doc/com.flowpowered/flow-math/1.0.3/", - "https://javadoc.io/doc/com.google.code.gson/gson/2.8.0/", - ) - addStringOption("Xdoclint:none", "-quiet") - addBooleanOption("html5", true) - } - } -} - -node { - version.set("20.14.0") - download.set(true) - nodeProjectDir.set(file("webapp/")) -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.clean { - doFirst { - if (!file("webapp/dist/").deleteRecursively()) - throw IOException("Failed to delete build directory!") - } -} - -tasks.register("buildWebapp", type = NpmTask::class) { - dependsOn ("npmInstall") - args.set(listOf("run", "build")) - - inputs.dir("webapp/") - outputs.dir("webapp/dist/") -} - -tasks.register("zipWebapp", type = Zip::class) { - dependsOn ("buildWebapp") - from (fileTree("webapp/dist/")) - archiveFileName.set("webapp.zip") - destinationDirectory.set(file("src/main/resources/de/bluecolored/bluemap/")) - - inputs.dir("webapp/dist/") - outputs.file("src/main/resources/de/bluecolored/bluemap/webapp.zip") -} - -//always update the zip before build -tasks.processResources { dependsOn("zipWebapp") } -tasks.getByName("sourcesJar") { dependsOn("zipWebapp") } - -publishing { - repositories { - maven { - name = "bluecolored" - - val releasesRepoUrl = "https://repo.bluecolored.de/releases" - val snapshotsRepoUrl = "https://repo.bluecolored.de/snapshots" - url = uri(if (version == lastVersion) releasesRepoUrl else snapshotsRepoUrl) - - credentials { - username = project.findProperty("bluecoloredUsername") as String? ?: System.getenv("BLUECOLORED_USERNAME") - password = project.findProperty("bluecoloredPassword") as String? ?: System.getenv("BLUECOLORED_PASSWORD") - } - } - } - publications { - create("maven") { - groupId = project.group.toString() - artifactId = project.name - version = project.version.toString() - - from(components["java"]) - - versionMapping { - usage("java-api") { - fromResolutionOf("runtimeClasspath") - } - } - } - } -} diff --git a/BlueMapCommon/settings.gradle.kts b/BlueMapCommon/settings.gradle.kts deleted file mode 100644 index a876bfa9..00000000 --- a/BlueMapCommon/settings.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -rootProject.name = "BlueMapCommon" - -includeBuild("../BlueMapAPI") -includeBuild("../BlueMapCore") \ No newline at end of file diff --git a/BlueMapCore/build.gradle.kts b/BlueMapCore/build.gradle.kts deleted file mode 100644 index b11881f6..00000000 --- a/BlueMapCore/build.gradle.kts +++ /dev/null @@ -1,179 +0,0 @@ -import java.io.IOException -import java.util.concurrent.TimeoutException - -plugins { - java - `java-library` - `maven-publish` - id("com.diffplug.spotless") version "6.1.2" -} - -fun String.runCommand(): String = ProcessBuilder(split("\\s(?=(?:[^'\"`]*(['\"`])[^'\"`]*\\1)*[^'\"`]*$)".toRegex())) - .directory(projectDir) - .redirectOutput(ProcessBuilder.Redirect.PIPE) - .redirectError(ProcessBuilder.Redirect.PIPE) - .start() - .apply { - if (!waitFor(10, TimeUnit.SECONDS)) { - throw TimeoutException("Failed to execute command: '" + this@runCommand + "'") - } - } - .run { - val error = errorStream.bufferedReader().readText().trim() - if (error.isNotEmpty()) { - throw IOException(error) - } - inputStream.bufferedReader().readText().trim() - } - -val gitHash = "git rev-parse --verify HEAD".runCommand() -var clean = false; -try { - clean = "git status --porcelain".runCommand().isEmpty(); -} catch (ex: TimeoutException) { - println("Failed to run 'git status --porcelain', assuming dirty version.") -} -val lastTag = if ("git tag".runCommand().isEmpty()) "" else "git describe --tags --abbrev=0".runCommand() -val lastVersion = if (lastTag.isEmpty()) "dev" else lastTag.substring(1) // remove the leading 'v' -val commits = "git rev-list --count $lastTag..HEAD".runCommand() -println("Git hash: $gitHash" + if (clean) "" else " (dirty)") - -group = "de.bluecolored.bluemap" -version = lastVersion + - (if (commits == "0") "" else "-$commits") + - (if (clean) "" else "-dirty") - -System.setProperty("bluemap.version", version.toString()) -System.setProperty("bluemap.lastVersion", lastVersion) -println("Version: $version") - -val javaTarget = 16 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - withSourcesJar() - withJavadocJar() -} - -repositories { - mavenCentral() - maven ("https://repo.bluecolored.de/releases") -} - -@Suppress("GradlePackageUpdate") -dependencies { - api ("com.github.ben-manes.caffeine:caffeine:3.1.8") - api ("org.spongepowered:configurate-hocon:4.1.2") - api ("org.spongepowered:configurate-gson:4.1.2") - api ("de.bluecolored.bluenbt:BlueNBT:2.3.0") - api ("org.apache.commons:commons-dbcp2:2.9.0") - api ("io.airlift:aircompressor:0.24") - api ("org.lz4:lz4-java:1.8.0") - - api ("de.bluecolored.bluemap:BlueMapAPI") - - compileOnly ("org.jetbrains:annotations:23.0.0") - compileOnly ("org.projectlombok:lombok:1.18.32") - - annotationProcessor ("org.projectlombok:lombok:1.18.32") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") - testCompileOnly ("org.projectlombok:lombok:1.18.32") - testAnnotationProcessor ("org.projectlombok:lombok:1.18.32") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.javadoc { - options { - (this as? StandardJavadocDocletOptions)?.apply { - links( - "https://docs.oracle.com/en/java/javase/16/docs/api/", - "https://javadoc.io/doc/com.flowpowered/flow-math/1.0.3/", - "https://javadoc.io/doc/com.google.code.gson/gson/2.8.0/", - ) - addStringOption("Xdoclint:none", "-quiet") - addBooleanOption("html5", true) - } - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - outputs.upToDateWhen { false } - from("src/main/resources") { - include("de/bluecolored/bluemap/version.json") - duplicatesStrategy = DuplicatesStrategy.INCLUDE - - expand ( - "version" to project.version, - "gitHash" to gitHash + if (clean) "" else " (dirty)", - ) - } -} - -tasks.register("zipResourceExtensions", type = Zip::class) { - from(fileTree("src/main/resourceExtensions")) - archiveFileName.set("resourceExtensions.zip") - destinationDirectory.set(file("src/main/resources/de/bluecolored/bluemap/")) - outputs.upToDateWhen{ false } -} - -//always update the zip before build -tasks.processResources { dependsOn("zipResourceExtensions") } -tasks.getByName("sourcesJar") { dependsOn("zipResourceExtensions") } - -publishing { - repositories { - maven { - name = "bluecolored" - - val releasesRepoUrl = "https://repo.bluecolored.de/releases" - val snapshotsRepoUrl = "https://repo.bluecolored.de/snapshots" - url = uri(if (version == lastVersion) releasesRepoUrl else snapshotsRepoUrl) - - credentials { - username = project.findProperty("bluecoloredUsername") as String? ?: System.getenv("BLUECOLORED_USERNAME") - password = project.findProperty("bluecoloredPassword") as String? ?: System.getenv("BLUECOLORED_PASSWORD") - } - } - } - publications { - create("maven") { - groupId = project.group.toString() - artifactId = project.name - version = project.version.toString() - - from(components["java"]) - - versionMapping { - usage("java-api") { - fromResolutionOf("runtimeClasspath") - } - } - } - } -} diff --git a/BlueMapCore/settings.gradle.kts b/BlueMapCore/settings.gradle.kts deleted file mode 100644 index 82c6709b..00000000 --- a/BlueMapCore/settings.gradle.kts +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = "BlueMapCore" \ No newline at end of file diff --git a/HEADER b/LICENSE_HEADER similarity index 100% rename from HEADER rename to LICENSE_HEADER diff --git a/api b/api new file mode 160000 index 00000000..8e14a344 --- /dev/null +++ b/api @@ -0,0 +1 @@ +Subproject commit 8e14a344e9385144698ee7f21a2ef668b26d5fe7 diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index ea5f6347..00000000 --- a/build.gradle.kts +++ /dev/null @@ -1,57 +0,0 @@ -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")) - } - - doFirst { - if (!file("build").deleteRecursively()) - throw java.io.IOException("Failed to delete build directory!") - } -} - -tasks.register("build") { - gradle.includedBuilds.forEach { - if (it.name == "BlueMapCore") return@forEach - if (it.name == "BlueMapCommon") return@forEach - - dependsOn(it.task(":release")) - } -} - -tasks.register("test") { - gradle.includedBuilds.forEach { - dependsOn(it.task(":test")) - } -} - -tasks.register("spotlessApply") { - gradle.includedBuilds.forEach { - dependsOn(it.task(":spotlessApply")) - } -} - -tasks.register("spotlessCheck") { - gradle.includedBuilds.forEach { - dependsOn(it.task(":spotlessCheck")) - } -} - -tasks.register("publish") { - gradle.includedBuilds.forEach { - if (it.name == "BlueMapCore") return@forEach - if (it.name == "BlueMapCommon") return@forEach - - dependsOn(it.task(":publish")) - } -} - -// adding repositories here so intellij can download source-files and javadocs -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://repo.papermc.io/repository/maven-public/") - maven ("https://repo.bluecolored.de/releases") -} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 00000000..3be30dcf --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + fun plugin(dependency: Provider) = dependency.map { + "${it.pluginId}:${it.pluginId}.gradle.plugin:${it.version}" + } + + implementation ( plugin( libs.plugins.spotless ) ) + implementation ( plugin( libs.plugins.shadow ) ) + implementation ( plugin( libs.plugins.minotaur ) ) + implementation ( plugin( libs.plugins.cursegradle ) ) + implementation ( plugin( libs.plugins.hangar ) ) + implementation ( plugin( libs.plugins.sponge.ore ) ) + + // explicitly set guava version to resolve a build-dependency issue + implementation( libs.guava ) + +} diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts new file mode 100644 index 00000000..a3d4cde4 --- /dev/null +++ b/buildSrc/settings.gradle.kts @@ -0,0 +1,9 @@ + +// use version-catalog from root project +dependencyResolutionManagement { + versionCatalogs { + register("libs") { + from(files("../gradle/libs.versions.toml")) + } + } +} diff --git a/buildSrc/src/main/kotlin/CopyFileTask.kt b/buildSrc/src/main/kotlin/CopyFileTask.kt new file mode 100644 index 00000000..ab5ace68 --- /dev/null +++ b/buildSrc/src/main/kotlin/CopyFileTask.kt @@ -0,0 +1,23 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.tasks.InputFile +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction + +abstract class CopyFileTask : DefaultTask() { + + @get:InputFile + abstract val inputFile: RegularFileProperty + + @get:OutputFile + abstract val outputFile: RegularFileProperty + + @TaskAction + fun action() { + inputFile.get().asFile.copyTo( + outputFile.get().asFile, + overwrite = true + ) + } + +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/bluemap.base.gradle.kts b/buildSrc/src/main/kotlin/bluemap.base.gradle.kts new file mode 100644 index 00000000..7d5c8717 --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.base.gradle.kts @@ -0,0 +1,78 @@ +plugins { + java + `java-library` + `maven-publish` + id ( "com.diffplug.spotless" ) +} + +group = "de.bluecolored" +version = gitVersion() + +repositories { + maven ("https://repo.bluecolored.de/releases") { + content { includeGroupByRegex ("de\\.bluecolored\\..*") } + } + maven ("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") { + content { includeGroup ("org.spigotmc") } + } + + mavenCentral() + maven ("https://libraries.minecraft.net") + maven ( "https://maven.minecraftforge.net" ) + maven ("https://repo.papermc.io/repository/maven-public/") +} + +tasks.withType(JavaCompile::class).configureEach { + options.encoding = "utf-8" +} + +tasks.withType(AbstractArchiveTask::class).configureEach { + isReproducibleFileOrder = true + isPreserveFileTimestamps = false +} + +java { + toolchain.languageVersion = JavaLanguageVersion.of(21) + withSourcesJar() + withJavadocJar() +} + +tasks.javadoc { + (options as StandardJavadocDocletOptions).apply { + links( + "https://docs.oracle.com/en/java/javase/16/docs/api/", + "https://javadoc.io/doc/com.flowpowered/flow-math/1.0.3/", + "https://javadoc.io/doc/com.google.code.gson/gson/2.8.9/", + ) + addStringOption("Xdoclint:none", "-quiet") + addBooleanOption("html5", true) + } +} + +tasks.test { + useJUnitPlatform() +} + +spotless { + java { + target ("src/*/java/**/*.java") + + licenseHeaderFile(rootProject.file("LICENSE_HEADER")) + indentWithSpaces() + trimTrailingWhitespace() + } +} + +publishing { + repositories { + maven { + name = "bluecolored" + url = uri( "https://repo.bluecolored.de/releases" ) + + credentials { + username = project.findProperty("bluecoloredUsername") as String? ?: System.getenv("BLUECOLORED_USERNAME") + password = project.findProperty("bluecoloredPassword") as String? ?: System.getenv("BLUECOLORED_PASSWORD") + } + } + } +} diff --git a/buildSrc/src/main/kotlin/bluemap.curseforge.gradle.kts b/buildSrc/src/main/kotlin/bluemap.curseforge.gradle.kts new file mode 100644 index 00000000..227122b7 --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.curseforge.gradle.kts @@ -0,0 +1,20 @@ +import com.matthewprenger.cursegradle.Options + +plugins { + id ( "bluemap.implementation" ) + id ( "com.matthewprenger.cursegradle" ) +} + +curseforge { + apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" + options(closureOf { + javaVersionAutoDetect = false + javaIntegration = false + forgeGradleIntegration = false + }) +} + +tasks.curseforge { + group = "publishing" + dependsOn(tasks.getByName("release")) +} diff --git a/buildSrc/src/main/kotlin/bluemap.hangar.gradle.kts b/buildSrc/src/main/kotlin/bluemap.hangar.gradle.kts new file mode 100644 index 00000000..ef3f15f7 --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.hangar.gradle.kts @@ -0,0 +1,23 @@ +plugins { + id ( "bluemap.implementation" ) + id ( "io.papermc.hangar-publish-plugin" ) +} + +hangarPublish { + publications.register("bluemap") { + apiKey = System.getenv("HANGAR_TOKEN") + + id = "BlueMap" + channel = "Release" + version = project.version as String + changelog = project.releaseNotes() + + platforms.paper { + jar = tasks.getByName("release").outputs.files.singleFile + } + } +} + +tasks.publishAllPublicationsToHangar { + dependsOn(tasks.getByName("release")) +} diff --git a/buildSrc/src/main/kotlin/bluemap.implementation.gradle.kts b/buildSrc/src/main/kotlin/bluemap.implementation.gradle.kts new file mode 100644 index 00000000..5994b076 --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.implementation.gradle.kts @@ -0,0 +1,23 @@ +plugins { + id ( "bluemap.base" ) + id ( "io.github.goooler.shadow" ) +} + +val Project.releaseDirectory: File + get() = rootProject.projectDir.resolve("build/release") + +tasks.shadowJar { + archiveFileName = "${project.name}-${project.version}-shadow.jar" +} + +tasks.register("release") { + group = "publishing" + dependsOn(tasks.shadowJar, tasks.spotlessCheck) + + inputFile = tasks.shadowJar.flatMap { it.archiveFile } + outputFile = releaseDirectory.resolve("bluemap-${project.version}-${project.name}.jar") +} + +tasks.getByName("clean") { + delete(releaseDirectory.listFiles()) +} diff --git a/buildSrc/src/main/kotlin/bluemap.modrinth.gradle.kts b/buildSrc/src/main/kotlin/bluemap.modrinth.gradle.kts new file mode 100644 index 00000000..b180493f --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.modrinth.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id ( "bluemap.implementation" ) + id ( "com.modrinth.minotaur" ) +} + +modrinth { + token = System.getenv("MODRINTH_TOKEN") + projectId = "swbUV1cr" + uploadFile = tasks.getByName("release").outputs.files.singleFile + versionNumber = "${project.version}-${project.name}" + changelog = project.releaseNotes() + debugMode = true +} + +tasks.modrinth { + dependsOn(tasks.getByName("release")) +} diff --git a/buildSrc/src/main/kotlin/bluemap.ore.gradle.kts b/buildSrc/src/main/kotlin/bluemap.ore.gradle.kts new file mode 100644 index 00000000..6c2b4766 --- /dev/null +++ b/buildSrc/src/main/kotlin/bluemap.ore.gradle.kts @@ -0,0 +1,18 @@ +plugins { + id ( "bluemap.implementation" ) + id ( "org.spongepowered.gradle.ore" ) +} + +oreDeployment { + apiKey(System.getenv("ORE_TOKEN")) + defaultPublication { + projectId = "bluemap" + createForumPost = true + versionBody = project.releaseNotes() + publishArtifacts.setFrom(tasks.getByName("release").outputs.files.singleFile) + } +} + +tasks.publishToOre { + dependsOn(tasks.getByName("release")) +} diff --git a/buildSrc/src/main/kotlin/curseforge.kt b/buildSrc/src/main/kotlin/curseforge.kt new file mode 100644 index 00000000..01f49aeb --- /dev/null +++ b/buildSrc/src/main/kotlin/curseforge.kt @@ -0,0 +1,17 @@ +import com.matthewprenger.cursegradle.CurseProject +import gradle.kotlin.dsl.accessors._0d85c8abe599c3884bce56e72c18751a.curseforge +import org.gradle.api.Action +import org.gradle.api.Project +import org.gradle.kotlin.dsl.closureOf + +fun Project.curseforgeBlueMap (configuration: Action) { + curseforge.project(closureOf { + id = "406463" + changelogType = "markdown" + changelog = project.releaseNotes() + releaseType = "release" + mainArtifact(tasks.getByName("release").outputs.files.singleFile) + + configuration.execute(this) + }) +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/versioning.kt b/buildSrc/src/main/kotlin/versioning.kt new file mode 100644 index 00000000..687b2c74 --- /dev/null +++ b/buildSrc/src/main/kotlin/versioning.kt @@ -0,0 +1,53 @@ +import org.gradle.api.Project +import java.io.IOException +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException + +fun Project.gitHash(): String { + return runCommand("git rev-parse --verify HEAD", "-") +} + +fun Project.gitClean(): Boolean { + return runCommand("git status --porcelain", "NOT_CLEAN").isEmpty() +} + +fun Project.gitVersion(): String { + val lastTag = if (runCommand("git tag", "").isEmpty()) "" else runCommand("git describe --tags --abbrev=0", "") + val lastVersion = if (lastTag.isEmpty()) "0.0" else lastTag.substring(1) // remove the leading 'v' + val commits = runCommand("git rev-list --count $lastTag..HEAD", "0") + val gitVersion = lastVersion + + (if (commits == "0") "" else "-$commits") + + (if (gitClean()) "" else "-dirty") + + logger.lifecycle("${project.name} version: $gitVersion") + + return gitVersion +} + +fun Project.releaseNotes(): String { + val file = rootProject.projectDir.resolve("release.md") + if (!file.exists()) return "" + + return file + .readText() + .replace("{version}", project.version.toString()) +} + +private fun Project.runCommand(cmd: String, fallback: String? = null): String { + ProcessBuilder(cmd.split("\\s(?=(?:[^'\"`]*(['\"`])[^'\"`]*\\1)*[^'\"`]*$)".toRegex())) + .directory(projectDir) + .redirectOutput(ProcessBuilder.Redirect.PIPE) + .redirectError(ProcessBuilder.Redirect.PIPE) + .start() + .apply { + if (!waitFor(10, TimeUnit.SECONDS)) + throw TimeoutException("Failed to execute command: '$cmd'") + } + .run { + val error = errorStream.bufferedReader().readText().trim() + if (error.isEmpty()) return inputStream.bufferedReader().readText().trim() + logger.warn("Failed to execute command '$cmd': $error") + if (fallback != null) return fallback + throw IOException(error) + } +} diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 00000000..187d6c18 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,75 @@ +import com.github.gradle.node.npm.task.NpmTask +import java.io.IOException + +plugins { + bluemap.base + alias ( libs.plugins.node.gradle ) +} + +dependencies { + api ( project( ":core" ) ) + + api ( libs.brigadier ) + + compileOnly ( libs.jetbrains.annotations ) + compileOnly ( libs.lombok ) + + annotationProcessor ( libs.lombok ) + + // tests + testImplementation ( libs.junit.core ) + testRuntimeOnly ( libs.junit.engine ) + testRuntimeOnly ( libs.lombok ) + testAnnotationProcessor ( libs.lombok ) +} + +node { + version = "20.14.0" + download = true + nodeProjectDir = file("webapp/") +} + +tasks.register("buildWebapp", type = NpmTask::class) { + dependsOn ("npmInstall") + args = listOf("run", "build") + + inputs.dir("webapp/") + outputs.dir("webapp/dist/") +} + +tasks.register("zipWebapp", type = Zip::class) { + dependsOn ("buildWebapp") + from (fileTree("webapp/dist/")) + archiveFileName = "webapp.zip" + destinationDirectory = file("src/main/resources/de/bluecolored/bluemap/") + + inputs.dir("webapp/dist/") + outputs.file("src/main/resources/de/bluecolored/bluemap/webapp.zip") +} + +tasks.processResources { + dependsOn("zipWebapp") +} + +tasks.getByName("sourcesJar") { + dependsOn("zipWebapp") +} + +tasks.clean { + doFirst { + if (!file("webapp/dist/").deleteRecursively()) + throw IOException("Failed to delete build directory!") + } +} + +publishing { + publications { + create("maven") { + groupId = project.group.toString() + artifactId = "bluemap-${project.name}" + version = project.version.toString() + + from(components["java"]) + } + } +} diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java b/common/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java rename to common/src/main/java/de/bluecolored/bluemap/common/BlueMapConfiguration.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java b/common/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java rename to common/src/main/java/de/bluecolored/bluemap/common/BlueMapService.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/InterruptableReentrantLock.java b/common/src/main/java/de/bluecolored/bluemap/common/InterruptableReentrantLock.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/InterruptableReentrantLock.java rename to common/src/main/java/de/bluecolored/bluemap/common/InterruptableReentrantLock.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/MissingResourcesException.java b/common/src/main/java/de/bluecolored/bluemap/common/MissingResourcesException.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/MissingResourcesException.java rename to common/src/main/java/de/bluecolored/bluemap/common/MissingResourcesException.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/WebFilesManager.java b/common/src/main/java/de/bluecolored/bluemap/common/WebFilesManager.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/WebFilesManager.java rename to common/src/main/java/de/bluecolored/bluemap/common/WebFilesManager.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/AddonException.java b/common/src/main/java/de/bluecolored/bluemap/common/addons/AddonException.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/AddonException.java rename to common/src/main/java/de/bluecolored/bluemap/common/addons/AddonException.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/AddonInfo.java b/common/src/main/java/de/bluecolored/bluemap/common/addons/AddonInfo.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/AddonInfo.java rename to common/src/main/java/de/bluecolored/bluemap/common/addons/AddonInfo.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/Addons.java b/common/src/main/java/de/bluecolored/bluemap/common/addons/Addons.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/Addons.java rename to common/src/main/java/de/bluecolored/bluemap/common/addons/Addons.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/LoadedAddon.java b/common/src/main/java/de/bluecolored/bluemap/common/addons/LoadedAddon.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/addons/LoadedAddon.java rename to common/src/main/java/de/bluecolored/bluemap/common/addons/LoadedAddon.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/AssetStorageImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/AssetStorageImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/AssetStorageImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/AssetStorageImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapAPIImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapMapImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/BlueMapWorldImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/PluginImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/PluginImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/PluginImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/PluginImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/RenderManagerImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java b/common/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java rename to common/src/main/java/de/bluecolored/bluemap/common/api/WebAppImpl.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java b/common/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/BlueMapConfigManager.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigLoader.java b/common/src/main/java/de/bluecolored/bluemap/common/config/ConfigLoader.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigLoader.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/ConfigLoader.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java b/common/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/ConfigManager.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigTemplate.java b/common/src/main/java/de/bluecolored/bluemap/common/config/ConfigTemplate.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigTemplate.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/ConfigTemplate.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigurationException.java b/common/src/main/java/de/bluecolored/bluemap/common/config/ConfigurationException.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/ConfigurationException.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/ConfigurationException.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/CoreConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/CoreConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/CoreConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/CoreConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/MapConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/MapConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/MapConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/MapConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/PluginConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/PluginConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/PluginConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/PluginConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/WebappConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/WebappConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/WebappConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/WebappConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/WebserverConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/WebserverConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/WebserverConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/WebserverConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/Dialect.java b/common/src/main/java/de/bluecolored/bluemap/common/config/storage/Dialect.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/Dialect.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/storage/Dialect.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/FileConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/storage/FileConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/FileConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/storage/FileConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/SQLConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/storage/SQLConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/SQLConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/storage/SQLConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageConfig.java b/common/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageConfig.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageConfig.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageConfig.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageType.java b/common/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageType.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageType.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/storage/StorageType.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java b/common/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/KeyTypeSerializer.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/Vector2iTypeSerializer.java b/common/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/Vector2iTypeSerializer.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/Vector2iTypeSerializer.java rename to common/src/main/java/de/bluecolored/bluemap/common/config/typeserializer/Vector2iTypeSerializer.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/debug/DebugDump.java b/common/src/main/java/de/bluecolored/bluemap/common/debug/DebugDump.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/debug/DebugDump.java rename to common/src/main/java/de/bluecolored/bluemap/common/debug/DebugDump.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/debug/StateDumper.java b/common/src/main/java/de/bluecolored/bluemap/common/debug/StateDumper.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/debug/StateDumper.java rename to common/src/main/java/de/bluecolored/bluemap/common/debug/StateDumper.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/live/LiveMarkersDataSupplier.java b/common/src/main/java/de/bluecolored/bluemap/common/live/LiveMarkersDataSupplier.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/live/LiveMarkersDataSupplier.java rename to common/src/main/java/de/bluecolored/bluemap/common/live/LiveMarkersDataSupplier.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/live/LivePlayersDataSupplier.java b/common/src/main/java/de/bluecolored/bluemap/common/live/LivePlayersDataSupplier.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/live/LivePlayersDataSupplier.java rename to common/src/main/java/de/bluecolored/bluemap/common/live/LivePlayersDataSupplier.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/metrics/Metrics.java b/common/src/main/java/de/bluecolored/bluemap/common/metrics/Metrics.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/metrics/Metrics.java rename to common/src/main/java/de/bluecolored/bluemap/common/metrics/Metrics.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/MapUpdateService.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/MapUpdateService.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/MapUpdateService.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/MapUpdateService.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/Plugin.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/PluginState.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/PluginState.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/PluginState.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/PluginState.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/AbstractSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/AbstractSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/AbstractSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/AbstractSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/CommandHelper.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/Commands.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/MapSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/StorageSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/StorageSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/StorageSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/StorageSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/TaskRefSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/TaskRefSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/TaskRefSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/TaskRefSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldOrMapSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/commands/WorldSuggestionProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/DefaultPlayerIconFactory.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/DefaultPlayerIconFactory.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/DefaultPlayerIconFactory.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/DefaultPlayerIconFactory.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/MojangSkinProvider.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/MojangSkinProvider.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/MojangSkinProvider.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/MojangSkinProvider.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/skins/PlayerSkinUpdater.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/Text.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/text/Text.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/Text.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/text/Text.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextColor.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextColor.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextColor.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextColor.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextFormat.java b/common/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextFormat.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextFormat.java rename to common/src/main/java/de/bluecolored/bluemap/common/plugin/text/TextFormat.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/CombinedRenderTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/CombinedRenderTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/CombinedRenderTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/CombinedRenderTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapPurgeTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapSaveTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapSaveTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapSaveTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapSaveTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapUpdateTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapUpdateTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapUpdateTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/MapUpdateTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/ProgressTracker.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/ProgressTracker.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/ProgressTracker.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/ProgressTracker.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderManager.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderManager.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderManager.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderManager.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/RenderTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/StorageDeleteTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/StorageDeleteTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/StorageDeleteTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/StorageDeleteTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/WorldRegionRenderTask.java b/common/src/main/java/de/bluecolored/bluemap/common/rendermanager/WorldRegionRenderTask.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/rendermanager/WorldRegionRenderTask.java rename to common/src/main/java/de/bluecolored/bluemap/common/rendermanager/WorldRegionRenderTask.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/CommandSource.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/CommandSource.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/CommandSource.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/CommandSource.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Gamemode.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Gamemode.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Gamemode.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Gamemode.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Player.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Player.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Player.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Player.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/Server.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerEventListener.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerEventListener.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerEventListener.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerEventListener.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java b/common/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java rename to common/src/main/java/de/bluecolored/bluemap/common/serverinterface/ServerWorld.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java b/common/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/BlueMapResponseModifier.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/CachedRateLimitDataSupplier.java b/common/src/main/java/de/bluecolored/bluemap/common/web/CachedRateLimitDataSupplier.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/CachedRateLimitDataSupplier.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/CachedRateLimitDataSupplier.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/FileRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/JsonDataRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/LoggingRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/MapRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/MapStorageRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/RoutingRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpConnection.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpHeader.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequest.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequest.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequest.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequest.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequestHandler.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequestHandler.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequestHandler.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpRequestHandler.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpResponse.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpResponse.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpResponse.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpResponse.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpServer.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpStatusCode.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpStatusCode.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/HttpStatusCode.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/HttpStatusCode.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/SelectionConsumer.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/SelectionConsumer.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/SelectionConsumer.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/SelectionConsumer.java diff --git a/BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/Server.java b/common/src/main/java/de/bluecolored/bluemap/common/web/http/Server.java similarity index 100% rename from BlueMapCommon/src/main/java/de/bluecolored/bluemap/common/web/http/Server.java rename to common/src/main/java/de/bluecolored/bluemap/common/web/http/Server.java diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/core.conf b/common/src/main/resources/de/bluecolored/bluemap/config/core.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/core.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/core.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf b/common/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/maps/map.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/plugin.conf b/common/src/main/resources/de/bluecolored/bluemap/config/plugin.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/plugin.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/plugin.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages/file.conf b/common/src/main/resources/de/bluecolored/bluemap/config/storages/file.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages/file.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/storages/file.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages/sql.conf b/common/src/main/resources/de/bluecolored/bluemap/config/storages/sql.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/storages/sql.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/storages/sql.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webapp.conf b/common/src/main/resources/de/bluecolored/bluemap/config/webapp.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webapp.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/webapp.conf diff --git a/BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webserver.conf b/common/src/main/resources/de/bluecolored/bluemap/config/webserver.conf similarity index 100% rename from BlueMapCommon/src/main/resources/de/bluecolored/bluemap/config/webserver.conf rename to common/src/main/resources/de/bluecolored/bluemap/config/webserver.conf diff --git a/BlueMapCommon/webapp/.eslintrc.cjs b/common/webapp/.eslintrc.cjs similarity index 100% rename from BlueMapCommon/webapp/.eslintrc.cjs rename to common/webapp/.eslintrc.cjs diff --git a/BlueMapCommon/webapp/.gitignore b/common/webapp/.gitignore similarity index 100% rename from BlueMapCommon/webapp/.gitignore rename to common/webapp/.gitignore diff --git a/BlueMapCommon/webapp/README.md b/common/webapp/README.md similarity index 100% rename from BlueMapCommon/webapp/README.md rename to common/webapp/README.md diff --git a/BlueMapCommon/webapp/index.html b/common/webapp/index.html similarity index 100% rename from BlueMapCommon/webapp/index.html rename to common/webapp/index.html diff --git a/BlueMapCommon/webapp/package-lock.json b/common/webapp/package-lock.json similarity index 100% rename from BlueMapCommon/webapp/package-lock.json rename to common/webapp/package-lock.json diff --git a/BlueMapCommon/webapp/package.json b/common/webapp/package.json similarity index 100% rename from BlueMapCommon/webapp/package.json rename to common/webapp/package.json diff --git a/BlueMapCommon/webapp/public/assets/logo.png b/common/webapp/public/assets/logo.png similarity index 100% rename from BlueMapCommon/webapp/public/assets/logo.png rename to common/webapp/public/assets/logo.png diff --git a/BlueMapCommon/webapp/public/assets/logoCircle512.png b/common/webapp/public/assets/logoCircle512.png similarity index 100% rename from BlueMapCommon/webapp/public/assets/logoCircle512.png rename to common/webapp/public/assets/logoCircle512.png diff --git a/BlueMapCommon/webapp/public/assets/logoCircle64.png b/common/webapp/public/assets/logoCircle64.png similarity index 100% rename from BlueMapCommon/webapp/public/assets/logoCircle64.png rename to common/webapp/public/assets/logoCircle64.png diff --git a/BlueMapCommon/webapp/public/assets/poi.svg b/common/webapp/public/assets/poi.svg similarity index 100% rename from BlueMapCommon/webapp/public/assets/poi.svg rename to common/webapp/public/assets/poi.svg diff --git a/BlueMapCommon/webapp/public/assets/steve.png b/common/webapp/public/assets/steve.png similarity index 100% rename from BlueMapCommon/webapp/public/assets/steve.png rename to common/webapp/public/assets/steve.png diff --git a/BlueMapCommon/webapp/public/lang/cs.conf b/common/webapp/public/lang/cs.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/cs.conf rename to common/webapp/public/lang/cs.conf diff --git a/BlueMapCommon/webapp/public/lang/de.conf b/common/webapp/public/lang/de.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/de.conf rename to common/webapp/public/lang/de.conf diff --git a/BlueMapCommon/webapp/public/lang/en.conf b/common/webapp/public/lang/en.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/en.conf rename to common/webapp/public/lang/en.conf diff --git a/BlueMapCommon/webapp/public/lang/es.conf b/common/webapp/public/lang/es.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/es.conf rename to common/webapp/public/lang/es.conf diff --git a/BlueMapCommon/webapp/public/lang/fi.conf b/common/webapp/public/lang/fi.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/fi.conf rename to common/webapp/public/lang/fi.conf diff --git a/BlueMapCommon/webapp/public/lang/fr.conf b/common/webapp/public/lang/fr.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/fr.conf rename to common/webapp/public/lang/fr.conf diff --git a/BlueMapCommon/webapp/public/lang/hi.conf b/common/webapp/public/lang/hi.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/hi.conf rename to common/webapp/public/lang/hi.conf diff --git a/BlueMapCommon/webapp/public/lang/hu.conf b/common/webapp/public/lang/hu.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/hu.conf rename to common/webapp/public/lang/hu.conf diff --git a/BlueMapCommon/webapp/public/lang/it.conf b/common/webapp/public/lang/it.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/it.conf rename to common/webapp/public/lang/it.conf diff --git a/BlueMapCommon/webapp/public/lang/ja.conf b/common/webapp/public/lang/ja.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/ja.conf rename to common/webapp/public/lang/ja.conf diff --git a/BlueMapCommon/webapp/public/lang/ko.conf b/common/webapp/public/lang/ko.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/ko.conf rename to common/webapp/public/lang/ko.conf diff --git a/BlueMapCommon/webapp/public/lang/lv.conf b/common/webapp/public/lang/lv.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/lv.conf rename to common/webapp/public/lang/lv.conf diff --git a/BlueMapCommon/webapp/public/lang/nl.conf b/common/webapp/public/lang/nl.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/nl.conf rename to common/webapp/public/lang/nl.conf diff --git a/BlueMapCommon/webapp/public/lang/no_nb.conf b/common/webapp/public/lang/no_nb.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/no_nb.conf rename to common/webapp/public/lang/no_nb.conf diff --git a/BlueMapCommon/webapp/public/lang/pl.conf b/common/webapp/public/lang/pl.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/pl.conf rename to common/webapp/public/lang/pl.conf diff --git a/BlueMapCommon/webapp/public/lang/pt_PT.conf b/common/webapp/public/lang/pt_PT.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/pt_PT.conf rename to common/webapp/public/lang/pt_PT.conf diff --git a/BlueMapCommon/webapp/public/lang/ru.conf b/common/webapp/public/lang/ru.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/ru.conf rename to common/webapp/public/lang/ru.conf diff --git a/BlueMapCommon/webapp/public/lang/settings.conf b/common/webapp/public/lang/settings.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/settings.conf rename to common/webapp/public/lang/settings.conf diff --git a/BlueMapCommon/webapp/public/lang/sr_cyrl.conf b/common/webapp/public/lang/sr_cyrl.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/sr_cyrl.conf rename to common/webapp/public/lang/sr_cyrl.conf diff --git a/BlueMapCommon/webapp/public/lang/sr_latn.conf b/common/webapp/public/lang/sr_latn.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/sr_latn.conf rename to common/webapp/public/lang/sr_latn.conf diff --git a/BlueMapCommon/webapp/public/lang/sv.conf b/common/webapp/public/lang/sv.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/sv.conf rename to common/webapp/public/lang/sv.conf diff --git a/BlueMapCommon/webapp/public/lang/th.conf b/common/webapp/public/lang/th.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/th.conf rename to common/webapp/public/lang/th.conf diff --git a/BlueMapCommon/webapp/public/lang/tr.conf b/common/webapp/public/lang/tr.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/tr.conf rename to common/webapp/public/lang/tr.conf diff --git a/BlueMapCommon/webapp/public/lang/ua.conf b/common/webapp/public/lang/ua.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/ua.conf rename to common/webapp/public/lang/ua.conf diff --git a/BlueMapCommon/webapp/public/lang/vi.conf b/common/webapp/public/lang/vi.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/vi.conf rename to common/webapp/public/lang/vi.conf diff --git a/BlueMapCommon/webapp/public/lang/zh_CN.conf b/common/webapp/public/lang/zh_CN.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/zh_CN.conf rename to common/webapp/public/lang/zh_CN.conf diff --git a/BlueMapCommon/webapp/public/lang/zh_HK.conf b/common/webapp/public/lang/zh_HK.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/zh_HK.conf rename to common/webapp/public/lang/zh_HK.conf diff --git a/BlueMapCommon/webapp/public/lang/zh_TW.conf b/common/webapp/public/lang/zh_TW.conf similarity index 100% rename from BlueMapCommon/webapp/public/lang/zh_TW.conf rename to common/webapp/public/lang/zh_TW.conf diff --git a/BlueMapCommon/webapp/public/sql.php b/common/webapp/public/sql.php similarity index 100% rename from BlueMapCommon/webapp/public/sql.php rename to common/webapp/public/sql.php diff --git a/BlueMapCommon/webapp/src/App.vue b/common/webapp/src/App.vue similarity index 100% rename from BlueMapCommon/webapp/src/App.vue rename to common/webapp/src/App.vue diff --git a/BlueMapCommon/webapp/src/assets/favicon.png b/common/webapp/src/assets/favicon.png similarity index 100% rename from BlueMapCommon/webapp/src/assets/favicon.png rename to common/webapp/src/assets/favicon.png diff --git a/BlueMapCommon/webapp/src/assets/manifest.webmanifest b/common/webapp/src/assets/manifest.webmanifest similarity index 100% rename from BlueMapCommon/webapp/src/assets/manifest.webmanifest rename to common/webapp/src/assets/manifest.webmanifest diff --git a/BlueMapCommon/webapp/src/components/ControlBar/Compass.vue b/common/webapp/src/components/ControlBar/Compass.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/Compass.vue rename to common/webapp/src/components/ControlBar/Compass.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue b/common/webapp/src/components/ControlBar/ControlBar.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/ControlBar.vue rename to common/webapp/src/components/ControlBar/ControlBar.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/ControlsSwitch.vue b/common/webapp/src/components/ControlBar/ControlsSwitch.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/ControlsSwitch.vue rename to common/webapp/src/components/ControlBar/ControlsSwitch.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue b/common/webapp/src/components/ControlBar/DayNightSwitch.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/DayNightSwitch.vue rename to common/webapp/src/components/ControlBar/DayNightSwitch.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/MenuButton.vue b/common/webapp/src/components/ControlBar/MenuButton.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/MenuButton.vue rename to common/webapp/src/components/ControlBar/MenuButton.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/NumberInput.vue b/common/webapp/src/components/ControlBar/NumberInput.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/NumberInput.vue rename to common/webapp/src/components/ControlBar/NumberInput.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/PositionInput.vue b/common/webapp/src/components/ControlBar/PositionInput.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/PositionInput.vue rename to common/webapp/src/components/ControlBar/PositionInput.vue diff --git a/BlueMapCommon/webapp/src/components/ControlBar/SvgButton.vue b/common/webapp/src/components/ControlBar/SvgButton.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/ControlBar/SvgButton.vue rename to common/webapp/src/components/ControlBar/SvgButton.vue diff --git a/BlueMapCommon/webapp/src/components/Controls/FreeFlightMobileControls.vue b/common/webapp/src/components/Controls/FreeFlightMobileControls.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Controls/FreeFlightMobileControls.vue rename to common/webapp/src/components/Controls/FreeFlightMobileControls.vue diff --git a/BlueMapCommon/webapp/src/components/Controls/ZoomButtons.vue b/common/webapp/src/components/Controls/ZoomButtons.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Controls/ZoomButtons.vue rename to common/webapp/src/components/Controls/ZoomButtons.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/ChoiceBox.vue b/common/webapp/src/components/Menu/ChoiceBox.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/ChoiceBox.vue rename to common/webapp/src/components/Menu/ChoiceBox.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/Group.vue b/common/webapp/src/components/Menu/Group.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/Group.vue rename to common/webapp/src/components/Menu/Group.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/MainMenu.vue b/common/webapp/src/components/Menu/MainMenu.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/MainMenu.vue rename to common/webapp/src/components/Menu/MainMenu.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/MapButton.vue b/common/webapp/src/components/Menu/MapButton.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/MapButton.vue rename to common/webapp/src/components/Menu/MapButton.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/MarkerItem.vue b/common/webapp/src/components/Menu/MarkerItem.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/MarkerItem.vue rename to common/webapp/src/components/Menu/MarkerItem.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/MarkerSet.vue b/common/webapp/src/components/Menu/MarkerSet.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/MarkerSet.vue rename to common/webapp/src/components/Menu/MarkerSet.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/MarkerSetMenu.vue b/common/webapp/src/components/Menu/MarkerSetMenu.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/MarkerSetMenu.vue rename to common/webapp/src/components/Menu/MarkerSetMenu.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue b/common/webapp/src/components/Menu/SettingsMenu.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/SettingsMenu.vue rename to common/webapp/src/components/Menu/SettingsMenu.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/SideMenu.vue b/common/webapp/src/components/Menu/SideMenu.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/SideMenu.vue rename to common/webapp/src/components/Menu/SideMenu.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/SimpleButton.vue b/common/webapp/src/components/Menu/SimpleButton.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/SimpleButton.vue rename to common/webapp/src/components/Menu/SimpleButton.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/Slider.vue b/common/webapp/src/components/Menu/Slider.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/Slider.vue rename to common/webapp/src/components/Menu/Slider.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/SwitchButton.vue b/common/webapp/src/components/Menu/SwitchButton.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/SwitchButton.vue rename to common/webapp/src/components/Menu/SwitchButton.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/SwitchHandle.vue b/common/webapp/src/components/Menu/SwitchHandle.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/SwitchHandle.vue rename to common/webapp/src/components/Menu/SwitchHandle.vue diff --git a/BlueMapCommon/webapp/src/components/Menu/TextInput.vue b/common/webapp/src/components/Menu/TextInput.vue similarity index 100% rename from BlueMapCommon/webapp/src/components/Menu/TextInput.vue rename to common/webapp/src/components/Menu/TextInput.vue diff --git a/BlueMapCommon/webapp/src/fonts/OFL.txt b/common/webapp/src/fonts/OFL.txt similarity index 100% rename from BlueMapCommon/webapp/src/fonts/OFL.txt rename to common/webapp/src/fonts/OFL.txt diff --git a/BlueMapCommon/webapp/src/fonts/Quicksand.ttf b/common/webapp/src/fonts/Quicksand.ttf similarity index 100% rename from BlueMapCommon/webapp/src/fonts/Quicksand.ttf rename to common/webapp/src/fonts/Quicksand.ttf diff --git a/BlueMapCommon/webapp/src/i18n.js b/common/webapp/src/i18n.js similarity index 100% rename from BlueMapCommon/webapp/src/i18n.js rename to common/webapp/src/i18n.js diff --git a/BlueMapCommon/webapp/src/js/BlueMap.js b/common/webapp/src/js/BlueMap.js similarity index 100% rename from BlueMapCommon/webapp/src/js/BlueMap.js rename to common/webapp/src/js/BlueMap.js diff --git a/BlueMapCommon/webapp/src/js/BlueMapApp.js b/common/webapp/src/js/BlueMapApp.js similarity index 100% rename from BlueMapCommon/webapp/src/js/BlueMapApp.js rename to common/webapp/src/js/BlueMapApp.js diff --git a/BlueMapCommon/webapp/src/js/MainMenu.js b/common/webapp/src/js/MainMenu.js similarity index 100% rename from BlueMapCommon/webapp/src/js/MainMenu.js rename to common/webapp/src/js/MainMenu.js diff --git a/BlueMapCommon/webapp/src/js/MapViewer.js b/common/webapp/src/js/MapViewer.js similarity index 100% rename from BlueMapCommon/webapp/src/js/MapViewer.js rename to common/webapp/src/js/MapViewer.js diff --git a/BlueMapCommon/webapp/src/js/PopupMarker.js b/common/webapp/src/js/PopupMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/PopupMarker.js rename to common/webapp/src/js/PopupMarker.js diff --git a/BlueMapCommon/webapp/src/js/Utils.js b/common/webapp/src/js/Utils.js similarity index 100% rename from BlueMapCommon/webapp/src/js/Utils.js rename to common/webapp/src/js/Utils.js diff --git a/BlueMapCommon/webapp/src/js/controls/ControlsManager.js b/common/webapp/src/js/controls/ControlsManager.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/ControlsManager.js rename to common/webapp/src/js/controls/ControlsManager.js diff --git a/BlueMapCommon/webapp/src/js/controls/KeyCombination.js b/common/webapp/src/js/controls/KeyCombination.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/KeyCombination.js rename to common/webapp/src/js/controls/KeyCombination.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/FreeFlightControls.js b/common/webapp/src/js/controls/freeflight/FreeFlightControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/FreeFlightControls.js rename to common/webapp/src/js/controls/freeflight/FreeFlightControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/keyboard/KeyHeightControls.js b/common/webapp/src/js/controls/freeflight/keyboard/KeyHeightControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/keyboard/KeyHeightControls.js rename to common/webapp/src/js/controls/freeflight/keyboard/KeyHeightControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/keyboard/KeyMoveControls.js b/common/webapp/src/js/controls/freeflight/keyboard/KeyMoveControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/keyboard/KeyMoveControls.js rename to common/webapp/src/js/controls/freeflight/keyboard/KeyMoveControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/mouse/MouseAngleControls.js b/common/webapp/src/js/controls/freeflight/mouse/MouseAngleControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/mouse/MouseAngleControls.js rename to common/webapp/src/js/controls/freeflight/mouse/MouseAngleControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/mouse/MouseRotateControls.js b/common/webapp/src/js/controls/freeflight/mouse/MouseRotateControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/mouse/MouseRotateControls.js rename to common/webapp/src/js/controls/freeflight/mouse/MouseRotateControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/freeflight/touch/TouchPanControls.js b/common/webapp/src/js/controls/freeflight/touch/TouchPanControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/freeflight/touch/TouchPanControls.js rename to common/webapp/src/js/controls/freeflight/touch/TouchPanControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/MapControls.js b/common/webapp/src/js/controls/map/MapControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/MapControls.js rename to common/webapp/src/js/controls/map/MapControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/MapHeightControls.js b/common/webapp/src/js/controls/map/MapHeightControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/MapHeightControls.js rename to common/webapp/src/js/controls/map/MapHeightControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyAngleControls.js b/common/webapp/src/js/controls/map/keyboard/KeyAngleControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyAngleControls.js rename to common/webapp/src/js/controls/map/keyboard/KeyAngleControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyMoveControls.js b/common/webapp/src/js/controls/map/keyboard/KeyMoveControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyMoveControls.js rename to common/webapp/src/js/controls/map/keyboard/KeyMoveControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyRotateControls.js b/common/webapp/src/js/controls/map/keyboard/KeyRotateControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyRotateControls.js rename to common/webapp/src/js/controls/map/keyboard/KeyRotateControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyZoomControls.js b/common/webapp/src/js/controls/map/keyboard/KeyZoomControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/keyboard/KeyZoomControls.js rename to common/webapp/src/js/controls/map/keyboard/KeyZoomControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/mouse/MouseAngleControls.js b/common/webapp/src/js/controls/map/mouse/MouseAngleControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/mouse/MouseAngleControls.js rename to common/webapp/src/js/controls/map/mouse/MouseAngleControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/mouse/MouseMoveControls.js b/common/webapp/src/js/controls/map/mouse/MouseMoveControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/mouse/MouseMoveControls.js rename to common/webapp/src/js/controls/map/mouse/MouseMoveControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/mouse/MouseRotateControls.js b/common/webapp/src/js/controls/map/mouse/MouseRotateControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/mouse/MouseRotateControls.js rename to common/webapp/src/js/controls/map/mouse/MouseRotateControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/mouse/MouseZoomControls.js b/common/webapp/src/js/controls/map/mouse/MouseZoomControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/mouse/MouseZoomControls.js rename to common/webapp/src/js/controls/map/mouse/MouseZoomControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/touch/TouchAngleControls.js b/common/webapp/src/js/controls/map/touch/TouchAngleControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/touch/TouchAngleControls.js rename to common/webapp/src/js/controls/map/touch/TouchAngleControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/touch/TouchMoveControls.js b/common/webapp/src/js/controls/map/touch/TouchMoveControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/touch/TouchMoveControls.js rename to common/webapp/src/js/controls/map/touch/TouchMoveControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/touch/TouchRotateControls.js b/common/webapp/src/js/controls/map/touch/TouchRotateControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/touch/TouchRotateControls.js rename to common/webapp/src/js/controls/map/touch/TouchRotateControls.js diff --git a/BlueMapCommon/webapp/src/js/controls/map/touch/TouchZoomControls.js b/common/webapp/src/js/controls/map/touch/TouchZoomControls.js similarity index 100% rename from BlueMapCommon/webapp/src/js/controls/map/touch/TouchZoomControls.js rename to common/webapp/src/js/controls/map/touch/TouchZoomControls.js diff --git a/BlueMapCommon/webapp/src/js/map/LowresTileLoader.js b/common/webapp/src/js/map/LowresTileLoader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/LowresTileLoader.js rename to common/webapp/src/js/map/LowresTileLoader.js diff --git a/BlueMapCommon/webapp/src/js/map/Map.js b/common/webapp/src/js/map/Map.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/Map.js rename to common/webapp/src/js/map/Map.js diff --git a/BlueMapCommon/webapp/src/js/map/TextureAnimation.js b/common/webapp/src/js/map/TextureAnimation.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/TextureAnimation.js rename to common/webapp/src/js/map/TextureAnimation.js diff --git a/BlueMapCommon/webapp/src/js/map/Tile.js b/common/webapp/src/js/map/Tile.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/Tile.js rename to common/webapp/src/js/map/Tile.js diff --git a/BlueMapCommon/webapp/src/js/map/TileLoader.js b/common/webapp/src/js/map/TileLoader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/TileLoader.js rename to common/webapp/src/js/map/TileLoader.js diff --git a/BlueMapCommon/webapp/src/js/map/TileManager.js b/common/webapp/src/js/map/TileManager.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/TileManager.js rename to common/webapp/src/js/map/TileManager.js diff --git a/BlueMapCommon/webapp/src/js/map/TileMap.js b/common/webapp/src/js/map/TileMap.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/TileMap.js rename to common/webapp/src/js/map/TileMap.js diff --git a/BlueMapCommon/webapp/src/js/map/hires/HiresFragmentShader.js b/common/webapp/src/js/map/hires/HiresFragmentShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/hires/HiresFragmentShader.js rename to common/webapp/src/js/map/hires/HiresFragmentShader.js diff --git a/BlueMapCommon/webapp/src/js/map/hires/HiresVertexShader.js b/common/webapp/src/js/map/hires/HiresVertexShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/hires/HiresVertexShader.js rename to common/webapp/src/js/map/hires/HiresVertexShader.js diff --git a/BlueMapCommon/webapp/src/js/map/hires/PRBMLoader.js b/common/webapp/src/js/map/hires/PRBMLoader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/hires/PRBMLoader.js rename to common/webapp/src/js/map/hires/PRBMLoader.js diff --git a/BlueMapCommon/webapp/src/js/map/lowres/LowresFragmentShader.js b/common/webapp/src/js/map/lowres/LowresFragmentShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/lowres/LowresFragmentShader.js rename to common/webapp/src/js/map/lowres/LowresFragmentShader.js diff --git a/BlueMapCommon/webapp/src/js/map/lowres/LowresVertexShader.js b/common/webapp/src/js/map/lowres/LowresVertexShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/map/lowres/LowresVertexShader.js rename to common/webapp/src/js/map/lowres/LowresVertexShader.js diff --git a/BlueMapCommon/webapp/src/js/markers/ExtrudeMarker.js b/common/webapp/src/js/markers/ExtrudeMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/ExtrudeMarker.js rename to common/webapp/src/js/markers/ExtrudeMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/HtmlMarker.js b/common/webapp/src/js/markers/HtmlMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/HtmlMarker.js rename to common/webapp/src/js/markers/HtmlMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/LineMarker.js b/common/webapp/src/js/markers/LineMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/LineMarker.js rename to common/webapp/src/js/markers/LineMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/Marker.js b/common/webapp/src/js/markers/Marker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/Marker.js rename to common/webapp/src/js/markers/Marker.js diff --git a/BlueMapCommon/webapp/src/js/markers/MarkerFillFragmentShader.js b/common/webapp/src/js/markers/MarkerFillFragmentShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/MarkerFillFragmentShader.js rename to common/webapp/src/js/markers/MarkerFillFragmentShader.js diff --git a/BlueMapCommon/webapp/src/js/markers/MarkerFillVertexShader.js b/common/webapp/src/js/markers/MarkerFillVertexShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/MarkerFillVertexShader.js rename to common/webapp/src/js/markers/MarkerFillVertexShader.js diff --git a/BlueMapCommon/webapp/src/js/markers/MarkerManager.js b/common/webapp/src/js/markers/MarkerManager.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/MarkerManager.js rename to common/webapp/src/js/markers/MarkerManager.js diff --git a/BlueMapCommon/webapp/src/js/markers/MarkerSet.js b/common/webapp/src/js/markers/MarkerSet.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/MarkerSet.js rename to common/webapp/src/js/markers/MarkerSet.js diff --git a/BlueMapCommon/webapp/src/js/markers/NormalMarkerManager.js b/common/webapp/src/js/markers/NormalMarkerManager.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/NormalMarkerManager.js rename to common/webapp/src/js/markers/NormalMarkerManager.js diff --git a/BlueMapCommon/webapp/src/js/markers/ObjectMarker.js b/common/webapp/src/js/markers/ObjectMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/ObjectMarker.js rename to common/webapp/src/js/markers/ObjectMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/PlayerMarker.js b/common/webapp/src/js/markers/PlayerMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/PlayerMarker.js rename to common/webapp/src/js/markers/PlayerMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/PlayerMarkerManager.js b/common/webapp/src/js/markers/PlayerMarkerManager.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/PlayerMarkerManager.js rename to common/webapp/src/js/markers/PlayerMarkerManager.js diff --git a/BlueMapCommon/webapp/src/js/markers/PlayerMarkerSet.js b/common/webapp/src/js/markers/PlayerMarkerSet.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/PlayerMarkerSet.js rename to common/webapp/src/js/markers/PlayerMarkerSet.js diff --git a/BlueMapCommon/webapp/src/js/markers/PoiMarker.js b/common/webapp/src/js/markers/PoiMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/PoiMarker.js rename to common/webapp/src/js/markers/PoiMarker.js diff --git a/BlueMapCommon/webapp/src/js/markers/ShapeMarker.js b/common/webapp/src/js/markers/ShapeMarker.js similarity index 100% rename from BlueMapCommon/webapp/src/js/markers/ShapeMarker.js rename to common/webapp/src/js/markers/ShapeMarker.js diff --git a/BlueMapCommon/webapp/src/js/skybox/SkyFragmentShader.js b/common/webapp/src/js/skybox/SkyFragmentShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/skybox/SkyFragmentShader.js rename to common/webapp/src/js/skybox/SkyFragmentShader.js diff --git a/BlueMapCommon/webapp/src/js/skybox/SkyVertexShader.js b/common/webapp/src/js/skybox/SkyVertexShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/skybox/SkyVertexShader.js rename to common/webapp/src/js/skybox/SkyVertexShader.js diff --git a/BlueMapCommon/webapp/src/js/skybox/SkyboxScene.js b/common/webapp/src/js/skybox/SkyboxScene.js similarity index 100% rename from BlueMapCommon/webapp/src/js/skybox/SkyboxScene.js rename to common/webapp/src/js/skybox/SkyboxScene.js diff --git a/BlueMapCommon/webapp/src/js/util/CSS2DRenderer.js b/common/webapp/src/js/util/CSS2DRenderer.js similarity index 100% rename from BlueMapCommon/webapp/src/js/util/CSS2DRenderer.js rename to common/webapp/src/js/util/CSS2DRenderer.js diff --git a/BlueMapCommon/webapp/src/js/util/CombinedCamera.js b/common/webapp/src/js/util/CombinedCamera.js similarity index 100% rename from BlueMapCommon/webapp/src/js/util/CombinedCamera.js rename to common/webapp/src/js/util/CombinedCamera.js diff --git a/BlueMapCommon/webapp/src/js/util/LineShader.js b/common/webapp/src/js/util/LineShader.js similarity index 100% rename from BlueMapCommon/webapp/src/js/util/LineShader.js rename to common/webapp/src/js/util/LineShader.js diff --git a/BlueMapCommon/webapp/src/js/util/Stats.js b/common/webapp/src/js/util/Stats.js similarity index 100% rename from BlueMapCommon/webapp/src/js/util/Stats.js rename to common/webapp/src/js/util/Stats.js diff --git a/BlueMapCommon/webapp/src/js/util/Utils.js b/common/webapp/src/js/util/Utils.js similarity index 100% rename from BlueMapCommon/webapp/src/js/util/Utils.js rename to common/webapp/src/js/util/Utils.js diff --git a/BlueMapCommon/webapp/src/main.js b/common/webapp/src/main.js similarity index 100% rename from BlueMapCommon/webapp/src/main.js rename to common/webapp/src/main.js diff --git a/BlueMapCommon/webapp/src/scss/global.scss b/common/webapp/src/scss/global.scss similarity index 100% rename from BlueMapCommon/webapp/src/scss/global.scss rename to common/webapp/src/scss/global.scss diff --git a/BlueMapCommon/webapp/src/scss/markers.scss b/common/webapp/src/scss/markers.scss similarity index 100% rename from BlueMapCommon/webapp/src/scss/markers.scss rename to common/webapp/src/scss/markers.scss diff --git a/BlueMapCommon/webapp/src/scss/variables.scss b/common/webapp/src/scss/variables.scss similarity index 100% rename from BlueMapCommon/webapp/src/scss/variables.scss rename to common/webapp/src/scss/variables.scss diff --git a/BlueMapCommon/webapp/vite.config.js b/common/webapp/vite.config.js similarity index 100% rename from BlueMapCommon/webapp/vite.config.js rename to common/webapp/vite.config.js diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 00000000..d525a446 --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,62 @@ +plugins { + bluemap.base +} + +dependencies { + api ( "de.bluecolored:api" ) + + api ( libs.aircompressor ) + api ( libs.bluenbt ) + api ( libs.caffeine ) + api ( libs.commons.dbcp2 ) + api ( libs.configurate.hocon ) + api ( libs.configurate.gson ) + api ( libs.lz4 ) + + compileOnly ( libs.jetbrains.annotations ) + compileOnly ( libs.lombok ) + + annotationProcessor ( libs.lombok ) + + // tests + testImplementation ( libs.junit.core ) + testRuntimeOnly ( libs.junit.engine ) + testRuntimeOnly ( libs.lombok ) + testAnnotationProcessor ( libs.lombok ) +} + +tasks.register("zipResourceExtensions", type = Zip::class) { + from(fileTree("src/main/resourceExtensions")) + archiveFileName = "resourceExtensions.zip" + destinationDirectory = file("src/main/resources/de/bluecolored/bluemap/") +} + +tasks.processResources { + dependsOn("zipResourceExtensions") + + from("src/main/resources") { + include("de/bluecolored/bluemap/version.json") + duplicatesStrategy = DuplicatesStrategy.INCLUDE + + expand ( + "version" to project.version, + "gitHash" to gitHash() + if (gitClean()) "" else " (dirty)", + ) + } +} + +tasks.getByName("sourcesJar") { + dependsOn("zipResourceExtensions") +} + +publishing { + publications { + create("maven") { + groupId = project.group.toString() + artifactId = "bluemap-${project.name}" + version = project.version.toString() + + from(components["java"]) + } + } +} diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/BlueMap.java b/core/src/main/java/de/bluecolored/bluemap/core/BlueMap.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/BlueMap.java rename to core/src/main/java/de/bluecolored/bluemap/core/BlueMap.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/AbstractLogger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/JavaLogger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/JavaLogger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/JavaLogger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/JavaLogger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/LogFormatter.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/LogFormatter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/LogFormatter.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/LogFormatter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/Logger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/Logger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/Logger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/Logger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/MultiLogger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/MultiLogger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/MultiLogger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/MultiLogger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/PrintStreamLogger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/PrintStreamLogger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/PrintStreamLogger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/PrintStreamLogger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/VoidLogger.java b/core/src/main/java/de/bluecolored/bluemap/core/logger/VoidLogger.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/logger/VoidLogger.java rename to core/src/main/java/de/bluecolored/bluemap/core/logger/VoidLogger.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java b/core/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/BmMap.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/MapSettings.java b/core/src/main/java/de/bluecolored/bluemap/core/map/MapSettings.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/MapSettings.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/MapSettings.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/MapSettingsSerializer.java b/core/src/main/java/de/bluecolored/bluemap/core/map/MapSettingsSerializer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/MapSettingsSerializer.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/MapSettingsSerializer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java b/core/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/TextureGallery.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TileMetaConsumer.java b/core/src/main/java/de/bluecolored/bluemap/core/map/TileMetaConsumer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/TileMetaConsumer.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/TileMetaConsumer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/BlockModelView.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/BlockModelView.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/BlockModelView.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/BlockModelView.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelManager.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelManager.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelManager.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelManager.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/HiresModelRenderer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/PRBMWriter.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/PRBMWriter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/PRBMWriter.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/PRBMWriter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/RenderSettings.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/RenderSettings.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/RenderSettings.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/RenderSettings.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/TileModel.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/TileModel.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/TileModel.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/TileModel.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/BlockStateModelFactory.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelBuilder.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelBuilder.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelBuilder.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/LiquidModelBuilder.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java b/core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/hires/blockmodel/ResourceModelBuilder.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresLayer.java b/core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresLayer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresLayer.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresLayer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTile.java b/core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTile.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTile.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTile.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTileManager.java b/core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTileManager.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTileManager.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/lowres/LowresTileManager.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/CellStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/CellStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/CellStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/CellStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/ChunkInfoRegion.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/ChunkInfoRegion.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/ChunkInfoRegion.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/ChunkInfoRegion.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapChunkState.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapChunkState.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapChunkState.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapChunkState.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapTileState.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapTileState.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapTileState.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/MapTileState.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileActionResolver.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileActionResolver.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileActionResolver.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileActionResolver.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileInfoRegion.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileInfoRegion.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileInfoRegion.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileInfoRegion.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileState.java b/core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileState.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileState.java rename to core/src/main/java/de/bluecolored/bluemap/core/map/renderstate/TileState.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/AbstractTypeAdapterFactory.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/AbstractTypeAdapterFactory.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/AbstractTypeAdapterFactory.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/AbstractTypeAdapterFactory.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockColorCalculatorFactory.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/BlockColorCalculatorFactory.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockColorCalculatorFactory.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/BlockColorCalculatorFactory.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockPropertiesConfig.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/BlockPropertiesConfig.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockPropertiesConfig.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/BlockPropertiesConfig.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockStateMapping.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/BlockStateMapping.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/BlockStateMapping.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/BlockStateMapping.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/MinecraftVersion.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/ResourcePath.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/ResourcePath.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/ResourcePath.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/ResourcePath.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/VersionManifest.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/VersionManifest.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/VersionManifest.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/VersionManifest.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/AxisAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/AxisAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/AxisAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/AxisAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ColorAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ColorAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ColorAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ColorAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/DirectionAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/DirectionAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/DirectionAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/DirectionAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/EnumMapInstanceCreator.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/EnumMapInstanceCreator.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/EnumMapInstanceCreator.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/EnumMapInstanceCreator.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/LocalDateTimeAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/LocalDateTimeAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/LocalDateTimeAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/LocalDateTimeAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/RegistryAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/RegistryAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/RegistryAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/RegistryAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ResourcesGson.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ResourcesGson.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ResourcesGson.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/ResourcesGson.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector2iAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector2iAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector2iAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector2iAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3dAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3dAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3dAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3dAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3fAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3fAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3fAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector3fAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4dAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4dAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4dAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4dAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4fAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4fAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4fAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/adapter/Vector4fAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/Pack.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/PackMeta.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/DataPack.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/biome/DatapackBiome.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/biome/DatapackBiome.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/biome/DatapackBiome.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/biome/DatapackBiome.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/dimension/DimensionTypeData.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/dimension/DimensionTypeData.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/dimension/DimensionTypeData.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/datapack/dimension/DimensionTypeData.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/ResourcePack.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/BlockModel.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/BlockModel.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/BlockModel.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/BlockModel.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Element.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Element.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Element.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Element.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Face.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Face.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Face.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Face.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Rotation.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Rotation.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Rotation.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/Rotation.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/TextureVariable.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/TextureVariable.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/TextureVariable.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockmodel/TextureVariable.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockState.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockState.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockState.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockState.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockStateCondition.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockStateCondition.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockStateCondition.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/BlockStateCondition.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Multipart.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Multipart.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Multipart.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Multipart.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variant.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variant.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variant.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variant.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/VariantSet.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/VariantSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/VariantSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/VariantSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variants.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variants.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variants.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/blockstate/Variants.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/AnimationMeta.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/AnimationMeta.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/AnimationMeta.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/AnimationMeta.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/Texture.java b/core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/Texture.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/Texture.java rename to core/src/main/java/de/bluecolored/bluemap/core/resources/pack/resourcepack/texture/Texture.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/GridStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/GridStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/GridStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/GridStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/ItemStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/ItemStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/ItemStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/ItemStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/KeyedMapStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/KeyedMapStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/KeyedMapStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/KeyedMapStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/MapStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/MapStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/MapStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/MapStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Storage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/Storage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/Storage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/Storage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/BufferedCompression.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/compression/BufferedCompression.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/BufferedCompression.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/compression/BufferedCompression.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/CompressedInputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/compression/CompressedInputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/CompressedInputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/compression/CompressedInputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/Compression.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/compression/Compression.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/Compression.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/compression/Compression.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/NoCompression.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/compression/NoCompression.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/compression/NoCompression.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/compression/NoCompression.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileGridStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileGridStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileGridStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileGridStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileItemStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileItemStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileItemStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileItemStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileMapStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileMapStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileMapStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileMapStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/file/FileStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/Database.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/Database.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/Database.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/Database.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/PageSpliterator.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/PageSpliterator.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/PageSpliterator.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/PageSpliterator.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLGridStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLGridStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLGridStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLGridStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLItemStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLItemStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLItemStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLItemStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLMapStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLMapStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLMapStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLMapStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLStorage.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLStorage.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLStorage.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/SQLStorage.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/AbstractCommandSet.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/AbstractCommandSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/AbstractCommandSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/AbstractCommandSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/CommandSet.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/CommandSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/CommandSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/CommandSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/MySQLCommandSet.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/MySQLCommandSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/MySQLCommandSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/MySQLCommandSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/PostgreSQLCommandSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/SqliteCommandSet.java b/core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/SqliteCommandSet.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/SqliteCommandSet.java rename to core/src/main/java/de/bluecolored/bluemap/core/storage/sql/commandset/SqliteCommandSet.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BiIntConsumer.java b/core/src/main/java/de/bluecolored/bluemap/core/util/BiIntConsumer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BiIntConsumer.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/BiIntConsumer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java b/core/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/BufferedImageUtil.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/CopyingPathVisitor.java b/core/src/main/java/de/bluecolored/bluemap/core/util/CopyingPathVisitor.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/CopyingPathVisitor.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/CopyingPathVisitor.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/DeletingPathVisitor.java b/core/src/main/java/de/bluecolored/bluemap/core/util/DeletingPathVisitor.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/DeletingPathVisitor.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/DeletingPathVisitor.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Direction.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Direction.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Direction.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Direction.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/FileHelper.java b/core/src/main/java/de/bluecolored/bluemap/core/util/FileHelper.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/FileHelper.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/FileHelper.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Grid.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Grid.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Grid.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Grid.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/InstancePool.java b/core/src/main/java/de/bluecolored/bluemap/core/util/InstancePool.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/InstancePool.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/InstancePool.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/IntComparator.java b/core/src/main/java/de/bluecolored/bluemap/core/util/IntComparator.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/IntComparator.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/IntComparator.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Key.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Key.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Key.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Keyed.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Lazy.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Lazy.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Lazy.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Lazy.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/MergeSort.java b/core/src/main/java/de/bluecolored/bluemap/core/util/MergeSort.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/MergeSort.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/MergeSort.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/PalettedArrayAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/util/PalettedArrayAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/PalettedArrayAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/PalettedArrayAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Preconditions.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Preconditions.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Preconditions.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Preconditions.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Registry.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Registry.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Registry.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Registry.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/RegistryAdapter.java b/core/src/main/java/de/bluecolored/bluemap/core/util/RegistryAdapter.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/RegistryAdapter.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/RegistryAdapter.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/SizeCollectingPathVisitor.java b/core/src/main/java/de/bluecolored/bluemap/core/util/SizeCollectingPathVisitor.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/SizeCollectingPathVisitor.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/SizeCollectingPathVisitor.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Tristate.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Tristate.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Tristate.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Tristate.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Vector2iCache.java b/core/src/main/java/de/bluecolored/bluemap/core/util/Vector2iCache.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/Vector2iCache.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/Vector2iCache.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/WatchService.java b/core/src/main/java/de/bluecolored/bluemap/core/util/WatchService.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/WatchService.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/WatchService.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/Axis.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/Axis.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/Axis.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/Axis.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/Color.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/Color.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/Color.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/Color.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM3f.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM3f.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM3f.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM3f.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM4f.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM4f.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM4f.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/MatrixM4f.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2f.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2f.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2f.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2f.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2i.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2i.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2i.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM2i.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM3f.java b/core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM3f.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM3f.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/math/VectorM3f.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/CountingOutputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/util/stream/CountingOutputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/CountingOutputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/stream/CountingOutputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateInputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateInputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateInputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateInputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateOutputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateOutputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateOutputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/stream/DelegateOutputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseInputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseInputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseInputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseInputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseOutputStream.java b/core/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseOutputStream.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseOutputStream.java rename to core/src/main/java/de/bluecolored/bluemap/core/util/stream/OnCloseOutputStream.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/BlockProperties.java b/core/src/main/java/de/bluecolored/bluemap/core/world/BlockProperties.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/BlockProperties.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/BlockProperties.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/BlockState.java b/core/src/main/java/de/bluecolored/bluemap/core/world/BlockState.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/BlockState.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/BlockState.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/Chunk.java b/core/src/main/java/de/bluecolored/bluemap/core/world/Chunk.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/Chunk.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/Chunk.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/ChunkConsumer.java b/core/src/main/java/de/bluecolored/bluemap/core/world/ChunkConsumer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/ChunkConsumer.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/ChunkConsumer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/DimensionType.java b/core/src/main/java/de/bluecolored/bluemap/core/world/DimensionType.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/DimensionType.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/DimensionType.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java b/core/src/main/java/de/bluecolored/bluemap/core/world/LightData.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/LightData.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/LightData.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/Region.java b/core/src/main/java/de/bluecolored/bluemap/core/world/Region.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/Region.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/Region.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java b/core/src/main/java/de/bluecolored/bluemap/core/world/World.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/World.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/World.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/Biome.java b/core/src/main/java/de/bluecolored/bluemap/core/world/biome/Biome.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/Biome.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/biome/Biome.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/ColorModifier.java b/core/src/main/java/de/bluecolored/bluemap/core/world/biome/ColorModifier.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/ColorModifier.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/biome/ColorModifier.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/GrassColorModifier.java b/core/src/main/java/de/bluecolored/bluemap/core/world/biome/GrassColorModifier.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/biome/GrassColorModifier.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/biome/GrassColorModifier.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/Block.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/BlockNeighborhood.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/ExtendedBlock.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BannerBlockEntity.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BannerBlockEntity.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BannerBlockEntity.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BannerBlockEntity.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntity.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntity.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntity.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntity.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityLoader.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityLoader.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityLoader.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityLoader.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityType.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityType.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityType.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/BlockEntityType.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SignBlockEntity.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SignBlockEntity.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SignBlockEntity.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SignBlockEntity.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SkullBlockEntity.java b/core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SkullBlockEntity.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SkullBlockEntity.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/block/entity/SkullBlockEntity.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAUtil.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAUtil.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAUtil.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAUtil.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorld.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorldRegionWatchService.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorldRegionWatchService.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorldRegionWatchService.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/MCAWorldRegionWatchService.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/PackedIntArrayAccess.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/PackedIntArrayAccess.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/PackedIntArrayAccess.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/PackedIntArrayAccess.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/ChunkLoader.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_13.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_15.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_16.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/Chunk_1_18.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/LegacyBiomes.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/LegacyBiomes.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/LegacyBiomes.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/LegacyBiomes.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/chunk/MCAChunk.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/BlockStateDeserializer.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/BlockStateDeserializer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/BlockStateDeserializer.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/BlockStateDeserializer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/DimensionTypeDeserializer.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/DimensionTypeDeserializer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/DimensionTypeDeserializer.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/DimensionTypeDeserializer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/KeyDeserializer.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/KeyDeserializer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/KeyDeserializer.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/KeyDeserializer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LenientBlockEntityArrayDeserializer.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LenientBlockEntityArrayDeserializer.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LenientBlockEntityArrayDeserializer.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LenientBlockEntityArrayDeserializer.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/data/LevelData.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/LinearRegion.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/LinearRegion.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/LinearRegion.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/LinearRegion.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/MCARegion.java diff --git a/BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/RegionType.java b/core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/RegionType.java similarity index 100% rename from BlueMapCore/src/main/java/de/bluecolored/bluemap/core/world/mca/region/RegionType.java rename to core/src/main/java/de/bluecolored/bluemap/core/world/mca/region/RegionType.java diff --git a/BlueMapCore/src/main/resourceExtensions/assets/bluemap/blockstates/missing.json b/core/src/main/resourceExtensions/assets/bluemap/blockstates/missing.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/bluemap/blockstates/missing.json rename to core/src/main/resourceExtensions/assets/bluemap/blockstates/missing.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/bluemap/models/block/missing.json b/core/src/main/resourceExtensions/assets/bluemap/models/block/missing.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/bluemap/models/block/missing.json rename to core/src/main/resourceExtensions/assets/bluemap/models/block/missing.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/bluemap/textures/block/missing.png b/core/src/main/resourceExtensions/assets/bluemap/textures/block/missing.png similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/bluemap/textures/block/missing.png rename to core/src/main/resourceExtensions/assets/bluemap/textures/block/missing.png diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockColors.json b/core/src/main/resourceExtensions/assets/minecraft/blockColors.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockColors.json rename to core/src/main/resourceExtensions/assets/minecraft/blockColors.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockProperties.json b/core/src/main/resourceExtensions/assets/minecraft/blockProperties.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockProperties.json rename to core/src/main/resourceExtensions/assets/minecraft/blockProperties.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/acacia_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/bamboo_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/birch_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/black_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/black_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/black_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/black_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/black_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/black_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/black_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/black_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/black_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/blue_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/blue_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/brown_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/brown_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bubble_column.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/bubble_column.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/bubble_column.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/bubble_column.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cherry_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/chest.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/chest.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/creeper_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/crimson_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/cyan_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dark_oak_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/decorated_pot.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/decorated_pot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/decorated_pot.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/decorated_pot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/dragon_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/ender_chest.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/ender_chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/ender_chest.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/ender_chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/gray_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/gray_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/green_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/green_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/green_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/green_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/green_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/green_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/green_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/green_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/green_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/jungle_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lava.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/lava.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lava.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/lava.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_blue_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/light_gray_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/lime_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/lime_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/magenta_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/mangrove_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/oak_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/orange_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/orange_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/piglin_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/pink_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/pink_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/player_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/player_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/player_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/player_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/player_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/player_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/player_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/player_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/purple_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/purple_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/red_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/red_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/red_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/red_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/red_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/red_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/red_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/red_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/red_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_skull.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_wall_skull.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_wall_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_wall_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/skeleton_wall_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/spruce_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/trapped_chest.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/trapped_chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/trapped_chest.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/trapped_chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/warped_wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/water.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/water.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/water.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/water.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/white_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/white_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/white_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/white_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/white_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/white_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/white_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/white_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/white_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_skull.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_wall_skull.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_wall_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_wall_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/wither_skeleton_wall_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_bed.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_bed.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_bed.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_bed.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/yellow_wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/blockstates/zombie_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/bed_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/black_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/blue_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/brown_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/cyan_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/gray_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/green_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_blue_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/light_gray_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/lime_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/magenta_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/orange_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/pink_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/purple_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/red_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/white_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_foot.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_foot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_foot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_foot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bed/yellow_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_between_walls.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bell_between_walls.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_between_walls.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bell_between_walls.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_ceiling.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bell_ceiling.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_ceiling.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bell_ceiling.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_floor.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bell_floor.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_floor.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bell_floor.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_wall.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bell_wall.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bell_wall.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bell_wall.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bubble_column.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/bubble_column.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/bubble_column.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/bubble_column.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice1.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice1.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice1.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice1.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice2.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice2.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice2.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice2.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice3.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice3.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice3.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice3.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice4.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice4.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice4.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice4.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice5.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice5.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice5.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice5.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice6.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice6.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice6.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/cake_slice6.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest_double.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest_double.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest_double.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/chest_double.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/ender.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/ender.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/ender.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/ender.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/left.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/left.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/left.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/left.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal_double.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal_double.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal_double.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/normal_double.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped_double.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped_double.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped_double.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/chest/trapped_double.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/lava.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/lava.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/lava.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/lava.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/acacia.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/acacia.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/acacia.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/acacia.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/bamboo.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/bamboo.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/bamboo.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/bamboo.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/birch.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/birch.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/birch.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/birch.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/cherry.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/cherry.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/cherry.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/cherry.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/crimson.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/crimson.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/crimson.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/crimson.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/dark_oak.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/dark_oak.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/dark_oak.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/dark_oak.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/jungle.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/jungle.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/jungle.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/jungle.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/mangrove.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/mangrove.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/mangrove.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/mangrove.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/oak.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/oak.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/oak.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/oak.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/spruce.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/spruce.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/spruce.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/spruce.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_acacia.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_acacia.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_acacia.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_acacia.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_bamboo.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_bamboo.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_bamboo.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_bamboo.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_birch.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_birch.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_birch.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_birch.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_cherry.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_cherry.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_cherry.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_cherry.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_crimson.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_crimson.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_crimson.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_crimson.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_dark_oak.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_dark_oak.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_dark_oak.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_dark_oak.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_jungle.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_jungle.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_jungle.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_jungle.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_mangrove.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_mangrove.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_mangrove.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_mangrove.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_oak.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_oak.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_oak.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_oak.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_spruce.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_spruce.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_spruce.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_spruce.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_warped.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_warped.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_warped.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/wall_warped.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/warped.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/sign/warped.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/sign/warped.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/sign/warped.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/water.json b/core/src/main/resourceExtensions/assets/minecraft/models/block/water.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/block/water.json rename to core/src/main/resourceExtensions/assets/minecraft/models/block/water.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/acacia_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/bamboo_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/banner.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/banner.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/birch_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/birch_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/birch_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/birch_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/birch_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/birch_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/birch_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/birch_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/cherry_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/creeper_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/crimson_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/dark_oak_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/decorated_pot.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/decorated_pot.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/decorated_pot.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/decorated_pot.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/dragon_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dyed_shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/dyed_shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/dyed_shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/dyed_shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/jungle_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/mangrove_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/oak_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/oak_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/oak_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/oak_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/oak_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/oak_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/oak_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/oak_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/piglin_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/player_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/player_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/player_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/player_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/player_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/player_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/player_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/player_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/shulker_box.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/shulker_box.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/shulker_box.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/shulker_box.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_skull.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_wall_skull.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_wall_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_wall_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/skeleton_wall_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skull_32.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/skull_32.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skull_32.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/skull_32.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skull_64.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/skull_64.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/skull_64.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/skull_64.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/spruce_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_banner.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_banner.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_banner.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_banner.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_32.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_32.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_32.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_32.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_64.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_64.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_64.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wall_skull_64.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/warped_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/warped_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/warped_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/warped_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/warped_wall_hanging_sign.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/warped_wall_hanging_sign.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/warped_wall_hanging_sign.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/warped_wall_hanging_sign.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_skull.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_wall_skull.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_wall_skull.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_wall_skull.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/wither_skeleton_wall_skull.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_wall_head.json b/core/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_wall_head.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_wall_head.json rename to core/src/main/resourceExtensions/assets/minecraft/models/entity/zombie_wall_head.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/chest.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/chest.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/ender_chest.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/ender_chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/ender_chest.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/ender_chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/trapped_chest.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/trapped_chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/trapped_chest.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/blockstates/trapped_chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_left.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_left.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_left.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_left.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_right.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_right.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_right.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/chest_double_right.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_left.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_left.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_left.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_left.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_right.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_right.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_right.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/normal_double_right.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_left.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_left.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_left.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_left.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_right.json b/core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_right.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_right.json rename to core/src/main/resourceExtensions/mc1_15/assets/minecraft/models/block/chest/trapped_double_right.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_17/assets/minecraft/blockstates/grass_path.json b/core/src/main/resourceExtensions/mc1_17/assets/minecraft/blockstates/grass_path.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_17/assets/minecraft/blockstates/grass_path.json rename to core/src/main/resourceExtensions/mc1_17/assets/minecraft/blockstates/grass_path.json diff --git a/BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json b/core/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json rename to core/src/main/resourceExtensions/mc1_20_3/assets/minecraft/blockstates/grass.json diff --git a/BlueMapCore/src/main/resourceExtensions/pack.mcmeta b/core/src/main/resourceExtensions/pack.mcmeta similarity index 100% rename from BlueMapCore/src/main/resourceExtensions/pack.mcmeta rename to core/src/main/resourceExtensions/pack.mcmeta diff --git a/BlueMapCore/src/main/resources/de/bluecolored/bluemap/version.json b/core/src/main/resources/de/bluecolored/bluemap/version.json similarity index 100% rename from BlueMapCore/src/main/resources/de/bluecolored/bluemap/version.json rename to core/src/main/resources/de/bluecolored/bluemap/version.json diff --git a/BlueMapCore/src/test/java/de/bluecolored/bluemap/core/world/BlockStateTest.java b/core/src/test/java/de/bluecolored/bluemap/core/world/BlockStateTest.java similarity index 100% rename from BlueMapCore/src/test/java/de/bluecolored/bluemap/core/world/BlockStateTest.java rename to core/src/test/java/de/bluecolored/bluemap/core/world/BlockStateTest.java diff --git a/BlueMapCore/src/test/java/de/bluecolored/bluemap/core/world/GridTest.java b/core/src/test/java/de/bluecolored/bluemap/core/world/GridTest.java similarity index 100% rename from BlueMapCore/src/test/java/de/bluecolored/bluemap/core/world/GridTest.java rename to core/src/test/java/de/bluecolored/bluemap/core/world/GridTest.java diff --git a/gradle.properties b/gradle.properties index abb0eb55..95b4763a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -org.gradle.jvmargs=-Xmx6G +org.gradle.jvmargs=-Xmx4G diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 00000000..aeedcea8 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,39 @@ +[versions] +bstats = "2.2.1" +configurate = "4.1.2" +junit = "5.8.2" +spongegradle = "2.2.0" + +[libraries] +aircompressor = { module = "io.airlift:aircompressor", version = "0.24" } +bluenbt = { module = "de.bluecolored.bluenbt:BlueNBT", version = "2.3.0" } +brigadier = { module = "com.mojang:brigadier", version = "1.0.17" } +bstats-bukkit = { module = "org.bstats:bstats-bukkit", version.ref = "bstats" } +bstats-sponge = { module = "org.bstats:bstats-sponge", version.ref = "bstats" } +caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version = "3.1.8" } +commons-cli = { module = "commons-cli:commons-cli", version = "1.5.0" } +commons-dbcp2 = { module = "org.apache.commons:commons-dbcp2", version = "2.9.0" } +configurate-hocon = { module = "org.spongepowered:configurate-hocon", version.ref = "configurate" } +configurate-gson = { module = "org.spongepowered:configurate-gson", version.ref = "configurate" } +fabric-permissions = { module = "me.lucko:fabric-permissions-api", version = "0.3.1" } +flow-math = { module = "com.flowpowered:flow-math", version = "1.0.3" } +gson = { module = "com.google.code.gson:gson", version = "2.8.9" } +guava = { module = "com.google.guava:guava", version = "33.3.0-jre" } +jetbrains-annotations = { module = "org.jetbrains:annotations", version = "23.0.0" } +junit-core = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junit" } +junit-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "junit" } +lombok = { module = "org.projectlombok:lombok", version = "1.18.32" } +lz4 = { module = "org.lz4:lz4-java", version = "1.8.0" } + +[plugins] +cursegradle = { id = "com.matthewprenger.cursegradle", version = "1.4.0" } +forgegradle = { id = "net.minecraftforge.gradle", version = "[6.0.24,6.2)" } +hangar = { id = "io.papermc.hangar-publish-plugin", version = "0.1.2" } +loom = { id = "fabric-loom", version = "1.7.2" } +minotaur = { id = "com.modrinth.minotaur", version = "2.8.7" } +node-gradle = { id = "com.github.node-gradle.node", version = "7.0.2" } +neoforge-gradle = { id = "net.neoforged.moddev", version = "2.0.28-beta" } +shadow = { id = "io.github.goooler.shadow", version = "8.1.8" } +sponge-plugin = { id = "org.spongepowered.gradle.plugin", version.ref = "spongegradle" } +sponge-ore = { id = "org.spongepowered.gradle.ore", version.ref = "spongegradle" } +spotless = { id = "com.diffplug.spotless", version = "6.25.0" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..249e5832f090a2944b7473328c07c9755baa3196 100644 GIT binary patch delta 41205 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 F{tsc4gtPzv diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index b82aa23a..d642e7f8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip -networkTimeout=10000 -validateDistributionUrl=true +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 0adc8e1a..1b6c7873 100755 --- a/gradlew +++ b/gradlew @@ -55,7 +55,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,11 +80,13 @@ do esac done -# This is normally unused -# shellcheck disable=SC2034 +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" APP_BASE_NAME=${0##*/} -# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -131,29 +133,22 @@ location of your Java installation." fi else JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." - fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -198,10 +193,6 @@ if "$cygwin" || "$msys" ; then done fi - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - # Collect all arguments for the java command; # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of # shell script including quotes and variable substitutions, so put them in @@ -214,12 +205,6 @@ set -- \ org.gradle.wrapper.GradleWrapperMain \ "$@" -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index 93e3f59f..107acd32 100755 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%"=="" @echo off +@if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,8 +25,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused +if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -41,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -76,15 +75,13 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd +if "%ERRORLEVEL%"=="0" goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 :mainEnd if "%OS%"=="Windows_NT" endlocal diff --git a/implementations/cli/build.gradle.kts b/implementations/cli/build.gradle.kts index 9be58278..fd8ba98d 100644 --- a/implementations/cli/build.gradle.kts +++ b/implementations/cli/build.gradle.kts @@ -1,78 +1,14 @@ plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -val javaTarget = 16 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://repo.bluecolored.de/releases") + bluemap.implementation } dependencies { - api ("de.bluecolored.bluemap:BlueMapCommon") - - implementation ("commons-cli:commons-cli:1.5.0") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") + api ( project( ":common" ) ) + api ( libs.commons.cli ) } -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - - tasks.jar { - manifest { - attributes ( - "Main-Class" to "de.bluecolored.bluemap.cli.BlueMapCLI" - ) - } -} - -tasks.shadowJar { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") -} - -tasks.register("release") { - dependsOn(tasks.shadowJar) -} - -tasks.register("publish") { - + manifest.attributes ( + "Main-Class" to "de.bluecolored.bluemap.cli.BlueMapCLI" + ) } diff --git a/implementations/cli/settings.gradle.kts b/implementations/cli/settings.gradle.kts deleted file mode 100644 index 2055ed8c..00000000 --- a/implementations/cli/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "cli" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/fabric-1.18/build.gradle.kts b/implementations/fabric-1.18/build.gradle.kts deleted file mode 100644 index 1824d640..00000000 --- a/implementations/fabric-1.18/build.gradle.kts +++ /dev/null @@ -1,178 +0,0 @@ -import com.matthewprenger.cursegradle.CurseArtifact -import com.matthewprenger.cursegradle.CurseProject -import com.matthewprenger.cursegradle.CurseRelation -import com.matthewprenger.cursegradle.Options -import net.fabricmc.loom.task.RemapJarTask - -plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("fabric-loom") version "1.6-SNAPSHOT" - id ("com.modrinth.minotaur") version "2.+" - id ("com.matthewprenger.cursegradle") version "1.4.0" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -val javaTarget = 17 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - - withSourcesJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://maven.fabricmc.net/") - maven ("https://repo.bluecolored.de/releases") -} - -val shadowInclude: Configuration by configurations.creating - -configurations { - implementation.get().extendsFrom(shadowInclude) -} - -dependencies { - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by fabric - exclude (group = "com.google.guava", module = "guava") - exclude (group = "com.google.code.gson", module = "gson") - exclude (group = "com.mojang", module = "brigadier") - } - - minecraft ("com.mojang:minecraft:1.18-pre5") - mappings ("net.fabricmc:yarn:1.18-pre5+build.4:v2") - modImplementation ("net.fabricmc:fabric-loader:0.11.3") - modImplementation ("net.fabricmc.fabric-api:fabric-api:0.42.2+1.18") - modImplementation("me.lucko:fabric-permissions-api:0.3.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - inputs.property ("version", project.version) - - filesMatching("fabric.mod.json") { - expand ("version" to project.version) - } -} - -tasks.shadowJar { - configurations = listOf(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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -tasks.register("remappedShadowJar", type = RemapJarTask::class) { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - dependsOn (tasks.shadowJar) - inputFile.set(tasks.shadowJar.get().archiveFile) - addNestedDependencies.set(true) -} - -tasks.register("release") { - dependsOn("remappedShadowJar") -} - -modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - 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 { - required.project("P7dR8mSH") // Fabric API - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project(closureOf { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .readText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion("Fabric") - - addGameVersion("Java 18") - addGameVersion("Java 17") - - addGameVersion("1.18") - addGameVersion("1.18.1") - addGameVersion("1.18.2") - - mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - }) - options(closureOf { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - }) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("curseforge") -} diff --git a/implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.jar b/implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 41d9927a4d4fb3f96a785543079b8df6723c946b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59821 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 diff --git a/implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.properties b/implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 48c0a02c..00000000 --- a/implementations/fabric-1.18/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/implementations/fabric-1.18/gradlew b/implementations/fabric-1.18/gradlew deleted file mode 100644 index 1b6c7873..00000000 --- a/implementations/fabric-1.18/gradlew +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/sh - -# -# Copyright © 2015-2021 the original authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" -APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/implementations/fabric-1.18/gradlew.bat b/implementations/fabric-1.18/gradlew.bat deleted file mode 100644 index 107acd32..00000000 --- a/implementations/fabric-1.18/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/implementations/fabric-1.18/settings.gradle.kts b/implementations/fabric-1.18/settings.gradle.kts deleted file mode 100644 index 5a2d6ee9..00000000 --- a/implementations/fabric-1.18/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") - } - gradlePluginPortal() - } -} - -rootProject.name = "fabric-1.18" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java deleted file mode 100644 index be2e1ae9..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.fabric; - -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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.math.Vec3d; - -import java.util.Optional; - -public class FabricCommandSource implements CommandSource { - - private final FabricMod mod; - private final Plugin plugin; - private final ServerCommandSource delegate; - - public FabricCommandSource(FabricMod mod, Plugin plugin, ServerCommandSource delegate) { - this.mod = mod; - this.plugin = plugin; - this.delegate = delegate; - } - - @Override - public void sendMessage(Text text) { - delegate.sendFeedback(net.minecraft.text.Text.Serializer.fromJson(text.toJSONString()), false); - } - - @Override - public boolean hasPermission(String permission) { - try { - Class.forName("me.lucko.fabric.api.permissions.v0.Permissions"); - return Permissions.check(delegate, permission, 1); - } catch (ClassNotFoundException ex) { - return delegate.hasPermissionLevel(1); - } - } - - @Override - public Optional getPosition() { - Vec3d pos = delegate.getPosition(); - if (pos != null) { - return Optional.of(new Vector3d(pos.x, pos.y, pos.z)); - } - - return Optional.empty(); - } - - @Override - public Optional getWorld() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java deleted file mode 100644 index 411e1c34..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.UUID; - -public class FabricEventForwarder { - - private final FabricMod mod; - private final Collection eventListeners; - - public FabricEventForwarder(FabricMod mod) { - this.mod = mod; - this.eventListeners = new ArrayList<>(1); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - } - - public synchronized void addEventListener(ServerEventListener listener) { - this.eventListeners.add(listener); - } - - public synchronized void removeAllListeners() { - this.eventListeners.clear(); - } - - public synchronized void onPlayerJoin(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - public synchronized void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java deleted file mode 100644 index 1213b877..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.fabric; - -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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.SharedConstants; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.util.registry.Registry; -import net.minecraft.util.registry.RegistryKey; -import net.minecraft.world.World; -import org.apache.logging.log4j.LogManager; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class FabricMod implements ModInitializer, Server { - - private final Plugin pluginInstance; - private MinecraftServer serverInstance = null; - - private final FabricEventForwarder eventForwarder; - - private final LoadingCache worlds; - - private int playerUpdateIndex = 0; - private final Map onlinePlayerMap; - private final List onlinePlayerList; - - public FabricMod() { - Logger.global.clear(); - Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME))); - - this.onlinePlayerMap = new ConcurrentHashMap<>(); - this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>()); - - pluginInstance = new Plugin("fabric-1.18", this); - - this.eventForwarder = new FabricEventForwarder(this); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(FabricWorld::new); - } - - @Override - public void onInitialize() { - - //register commands - CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> - new Commands<>(pluginInstance, dispatcher, fabricSource -> - new FabricCommandSource(this, pluginInstance, fabricSource) - ) - ); - - ServerLifecycleEvents.SERVER_STARTED.register((MinecraftServer server) -> { - this.serverInstance = server; - - new Thread(()->{ - Logger.global.logInfo("Loading BlueMap..."); - - try { - pluginInstance.load(); - if (pluginInstance.isLoaded()) Logger.global.logInfo("BlueMap loaded!"); - } catch (IOException e) { - Logger.global.logError("Failed to load bluemap!", e); - pluginInstance.unload(); - } - }, "BlueMap-Plugin-Loading").start(); - }); - - ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> { - pluginInstance.unload(); - Logger.global.logInfo("BlueMap unloaded!"); - }); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - - ServerTickEvents.END_SERVER_TICK.register((MinecraftServer server) -> { - if (server == this.serverInstance) this.updateSomePlayers(); - }); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getGameVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object world) { - - if (world instanceof String) { - Identifier identifier = Identifier.tryParse((String) world); - if (identifier != null) world = serverInstance.getWorld(RegistryKey.of(Registry.WORLD_KEY, identifier)); - } - - if (world instanceof RegistryKey) { - try { - world = serverInstance.getWorld((RegistryKey) world); - } catch (ClassCastException ignored) {} - } - - if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { - return worlds.get(serverWorld); - } - - @Override - public Path getConfigFolder() { - return Path.of("config", "bluemap"); - } - - @Override - public Optional getModsFolder() { - return Optional.of(Path.of("mods")); - } - - public void onPlayerJoin(MinecraftServer server, ServerPlayerEntity playerInstance) { - if (this.serverInstance != server) return; - - FabricPlayer player = new FabricPlayer(playerInstance.getUuid(), this); - onlinePlayerMap.put(player.getUuid(), player); - onlinePlayerList.add(player); - } - - public void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.serverInstance != server) 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 getPluginInstance() { - return pluginInstance; - } - - @Override - public Collection getOnlinePlayers() { - return onlinePlayerMap.values(); - } - - /** - * 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/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java deleted file mode 100644 index 5ddf3259..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.fabric; - -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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameMode; -import net.minecraft.world.LightType; - -import java.util.EnumMap; -import java.util.Map; -import java.util.UUID; - -public class FabricPlayer implements Player { - - private static final Map GAMEMODE_MAP = new EnumMap<>(GameMode.class); - static { - GAMEMODE_MAP.put(GameMode.ADVENTURE, Gamemode.ADVENTURE); - GAMEMODE_MAP.put(GameMode.SURVIVAL, Gamemode.SURVIVAL); - GAMEMODE_MAP.put(GameMode.CREATIVE, Gamemode.CREATIVE); - GAMEMODE_MAP.put(GameMode.SPECTATOR, Gamemode.SPECTATOR); - } - - private final UUID uuid; - private Text name; - private ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - private boolean sneaking; - private boolean invisible; - private Gamemode gamemode; - - private final FabricMod mod; - - public FabricPlayer(UUID playerUuid, FabricMod mod) { - this.uuid = playerUuid; - this.mod = mod; - - update(); - } - - @Override - public UUID getUuid() { - return this.uuid; - } - - @Override - public Text getName() { - return this.name; - } - - @Override - public ServerWorld getWorld() { - return this.world; - } - - @Override - public Vector3d getPosition() { - return this.position; - } - - @Override - public Vector3d getRotation() { - return this.rotation; - } - - @Override - public int getSkyLight() { - return skyLight; - } - - @Override - public int getBlockLight() { - return blockLight; - } - - @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) return; - - ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) return; - - this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); - if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; - - StatusEffectInstance invis = player.getStatusEffect(StatusEffects.INVISIBILITY); - this.invisible = invis != null && invis.getDuration() > 0; - - this.name = Text.of(player.getName().getString()); - - Vec3d pos = player.getPos(); - this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); - this.rotation = new Vector3d(player.getPitch(), player.getHeadYaw(), 0); - this.sneaking = player.isSneaking(); - - this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); - this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - - this.world = mod.getServerWorld(player.getWorld()); - } - -} diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java deleted file mode 100644 index ff4468d9..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.WorldSavePath; - -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 FabricWorld implements ServerWorld { - - private final WeakReference delegate; - private final Path worldFolder; - private final Key dimension; - - public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getRunDirectory().toPath() - .resolve(server.getSavePath(WorldSavePath.ROOT)); - - Identifier id = delegate.getRegistryKey().getValue(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @Override - public boolean persistWorldChanges() throws IOException { - net.minecraft.server.world.ServerWorld 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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FabricWorld that = (FabricWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java deleted file mode 100644 index 9e60f395..00000000 --- a/implementations/fabric-1.18/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.fabric; - -import org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/fabric-1.18/src/main/resources/assets/bluemap/icon.png b/implementations/fabric-1.18/src/main/resources/assets/bluemap/icon.png deleted file mode 100644 index 65d56d7a88fd8adb9003df6e0c10424b0ec8e375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10593 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 vi6!A+?}%zq>>?r?=0.11.3", - "fabric": "*", - "fabric-api-base": "*", - "minecraft": ">=1.18-alpha.21.37.a" - }, - "suggests": {} -} diff --git a/implementations/fabric-1.19.4/build.gradle.kts b/implementations/fabric-1.19.4/build.gradle.kts deleted file mode 100644 index d2e7df83..00000000 --- a/implementations/fabric-1.19.4/build.gradle.kts +++ /dev/null @@ -1,176 +0,0 @@ -import com.matthewprenger.cursegradle.CurseArtifact -import com.matthewprenger.cursegradle.CurseProject -import com.matthewprenger.cursegradle.CurseRelation -import com.matthewprenger.cursegradle.Options -import net.fabricmc.loom.task.RemapJarTask - -plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("fabric-loom") version "1.6-SNAPSHOT" - id ("com.modrinth.minotaur") version "2.+" - id ("com.matthewprenger.cursegradle") version "1.4.0" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -val javaTarget = 17 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - - withSourcesJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://maven.fabricmc.net/") - maven ("https://repo.bluecolored.de/releases") -} - -val shadowInclude: Configuration by configurations.creating - -configurations { - implementation.get().extendsFrom(shadowInclude) -} - -dependencies { - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by fabric - exclude (group = "com.google.guava", module = "guava") - exclude (group = "com.google.code.gson", module = "gson") - exclude (group = "com.mojang", module = "brigadier") - } - - minecraft ("com.mojang:minecraft:1.19.4") - mappings ("net.fabricmc:yarn:1.19.4+build.1") - modImplementation ("net.fabricmc:fabric-loader:0.14.17") - modImplementation ("net.fabricmc.fabric-api:fabric-api:0.75.3+1.19.4") - modImplementation("me.lucko:fabric-permissions-api:0.3.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.9.0") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.9.0") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - inputs.property ("version", project.version) - - filesMatching("fabric.mod.json") { - expand ("version" to project.version) - } -} - -tasks.shadowJar { - configurations = listOf(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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -tasks.register("remappedShadowJar", type = RemapJarTask::class) { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - dependsOn (tasks.shadowJar) - inputFile.set(tasks.shadowJar.get().archiveFile) - addNestedDependencies.set(true) -} - -tasks.register("release") { - dependsOn("remappedShadowJar") -} - -modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("remappedShadowJar")) - gameVersions.addAll("1.19.4") - dependencies { - required.project("P7dR8mSH") // Fabric API - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project(closureOf { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .readText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion("Fabric") - - addGameVersion("Java 18") - addGameVersion("Java 17") - - addGameVersion("1.19.4") - - mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - }) - options(closureOf { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - }) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("curseforge") -} diff --git a/implementations/fabric-1.19.4/settings.gradle.kts b/implementations/fabric-1.19.4/settings.gradle.kts deleted file mode 100644 index fbbfa474..00000000 --- a/implementations/fabric-1.19.4/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") - } - gradlePluginPortal() - } -} - -rootProject.name = "fabric-1.19.4" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java deleted file mode 100644 index be2e1ae9..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.fabric; - -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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.math.Vec3d; - -import java.util.Optional; - -public class FabricCommandSource implements CommandSource { - - private final FabricMod mod; - private final Plugin plugin; - private final ServerCommandSource delegate; - - public FabricCommandSource(FabricMod mod, Plugin plugin, ServerCommandSource delegate) { - this.mod = mod; - this.plugin = plugin; - this.delegate = delegate; - } - - @Override - public void sendMessage(Text text) { - delegate.sendFeedback(net.minecraft.text.Text.Serializer.fromJson(text.toJSONString()), false); - } - - @Override - public boolean hasPermission(String permission) { - try { - Class.forName("me.lucko.fabric.api.permissions.v0.Permissions"); - return Permissions.check(delegate, permission, 1); - } catch (ClassNotFoundException ex) { - return delegate.hasPermissionLevel(1); - } - } - - @Override - public Optional getPosition() { - Vec3d pos = delegate.getPosition(); - if (pos != null) { - return Optional.of(new Vector3d(pos.x, pos.y, pos.z)); - } - - return Optional.empty(); - } - - @Override - public Optional getWorld() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java deleted file mode 100644 index 411e1c34..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.UUID; - -public class FabricEventForwarder { - - private final FabricMod mod; - private final Collection eventListeners; - - public FabricEventForwarder(FabricMod mod) { - this.mod = mod; - this.eventListeners = new ArrayList<>(1); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - } - - public synchronized void addEventListener(ServerEventListener listener) { - this.eventListeners.add(listener); - } - - public synchronized void removeAllListeners() { - this.eventListeners.clear(); - } - - public synchronized void onPlayerJoin(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - public synchronized void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java deleted file mode 100644 index 7a4a8d92..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.fabric; - -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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.SharedConstants; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; -import org.apache.logging.log4j.LogManager; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class FabricMod implements ModInitializer, Server { - - private final Plugin pluginInstance; - private MinecraftServer serverInstance = null; - - private final FabricEventForwarder eventForwarder; - - private final LoadingCache worlds; - - private int playerUpdateIndex = 0; - private final Map onlinePlayerMap; - private final List onlinePlayerList; - - public FabricMod() { - Logger.global.clear(); - Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME))); - - this.onlinePlayerMap = new ConcurrentHashMap<>(); - this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>()); - - pluginInstance = new Plugin("fabric-1.19.4", this); - - this.eventForwarder = new FabricEventForwarder(this); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(FabricWorld::new); - } - - @Override - public void onInitialize() { - - //register commands - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - new Commands<>(pluginInstance, dispatcher, fabricSource -> - new FabricCommandSource(this, pluginInstance, fabricSource) - ) - ); - - ServerLifecycleEvents.SERVER_STARTED.register((MinecraftServer server) -> { - this.serverInstance = server; - - new Thread(()->{ - Logger.global.logInfo("Loading BlueMap..."); - - try { - pluginInstance.load(); - if (pluginInstance.isLoaded()) Logger.global.logInfo("BlueMap loaded!"); - } catch (IOException e) { - Logger.global.logError("Failed to load bluemap!", e); - pluginInstance.unload(); - } - }, "BlueMap-Plugin-Loading").start(); - }); - - ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> { - pluginInstance.unload(); - Logger.global.logInfo("BlueMap unloaded!"); - }); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - - ServerTickEvents.END_SERVER_TICK.register((MinecraftServer server) -> { - if (server == this.serverInstance) this.updateSomePlayers(); - }); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getGameVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object world) { - - if (world instanceof String) { - Identifier identifier = Identifier.tryParse((String) world); - if (identifier != null) world = serverInstance.getWorld(RegistryKey.of(RegistryKeys.WORLD, identifier)); - } - - if (world instanceof RegistryKey) { - try { - world = serverInstance.getWorld((RegistryKey) world); - } catch (ClassCastException ignored) {} - } - - if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { - return worlds.get(serverWorld); - } - - @Override - public Path getConfigFolder() { - return Path.of("config", "bluemap"); - } - - @Override - public Optional getModsFolder() { - return Optional.of(Path.of("mods")); - } - - public void onPlayerJoin(MinecraftServer server, ServerPlayerEntity playerInstance) { - if (this.serverInstance != server) return; - - FabricPlayer player = new FabricPlayer(playerInstance.getUuid(), this); - onlinePlayerMap.put(player.getUuid(), player); - onlinePlayerList.add(player); - } - - public void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.serverInstance != server) 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 getPluginInstance() { - return pluginInstance; - } - - @Override - public Collection getOnlinePlayers() { - return onlinePlayerMap.values(); - } - - /** - * 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/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java deleted file mode 100644 index 708a87fa..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * 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.fabric; - -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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameMode; -import net.minecraft.world.LightType; - -import java.util.EnumMap; -import java.util.Map; -import java.util.UUID; - -public class FabricPlayer implements Player { - - private static final Map GAMEMODE_MAP = new EnumMap<>(GameMode.class); - static { - GAMEMODE_MAP.put(GameMode.ADVENTURE, Gamemode.ADVENTURE); - GAMEMODE_MAP.put(GameMode.SURVIVAL, Gamemode.SURVIVAL); - GAMEMODE_MAP.put(GameMode.CREATIVE, Gamemode.CREATIVE); - GAMEMODE_MAP.put(GameMode.SPECTATOR, Gamemode.SPECTATOR); - } - - private final UUID uuid; - private Text name; - private ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - private boolean sneaking; - private boolean invisible; - private Gamemode gamemode; - - private final FabricMod mod; - - public FabricPlayer(UUID playerUuid, FabricMod mod) { - this.uuid = playerUuid; - this.mod = mod; - - update(); - } - - @Override - public UUID getUuid() { - return this.uuid; - } - - @Override - public Text getName() { - return this.name; - } - - @Override - public ServerWorld 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 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) return; - - ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) return; - - this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); - if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; - - StatusEffectInstance invis = player.getStatusEffect(StatusEffects.INVISIBILITY); - this.invisible = invis != null && invis.getDuration() > 0; - - this.name = Text.of(player.getName().getString()); - - Vec3d pos = player.getPos(); - this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); - this.rotation = new Vector3d(player.getPitch(), player.getHeadYaw(), 0); - this.sneaking = player.isSneaking(); - - this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); - this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - - this.world = mod.getServerWorld(player.getWorld()); - } - -} diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java deleted file mode 100644 index ff4468d9..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.WorldSavePath; - -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 FabricWorld implements ServerWorld { - - private final WeakReference delegate; - private final Path worldFolder; - private final Key dimension; - - public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getRunDirectory().toPath() - .resolve(server.getSavePath(WorldSavePath.ROOT)); - - Identifier id = delegate.getRegistryKey().getValue(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @Override - public boolean persistWorldChanges() throws IOException { - net.minecraft.server.world.ServerWorld 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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FabricWorld that = (FabricWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java deleted file mode 100644 index 9e60f395..00000000 --- a/implementations/fabric-1.19.4/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.fabric; - -import org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/fabric-1.19.4/src/main/resources/assets/bluemap/icon.png b/implementations/fabric-1.19.4/src/main/resources/assets/bluemap/icon.png deleted file mode 100644 index 65d56d7a88fd8adb9003df6e0c10424b0ec8e375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10593 zcmV-nDW2AeP)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} z00170Nklq)lc{C+xyglap;Dxc4)OhbRKXY3HE-6UF`=L-ijV59rR2r3)xx6Mzb<1(Vk4p-P3U5|Z6rjBi@ z!1c9z8#+lvC;DwBrUpvMCNTFLQvvl^CJi7RmghNRKy?h1^z^kZ1HfXBGX6|F8S%6S z=bp(iB4FK_9G?T;i*>KmlG`6L#>|(AmMY|Kh-K9cUO1NQggP!Gvg5MN4Le=!CS$hx zEc=<3WQaOxCX5GzHtKW1?+lv*)PijT88jy%PmB2Qp;sGhQYNC&aT#%8h}4b~4Nrx? zAO19$!1b6x>E)A424N!-S^kd8E&HIaAI1PdJiyD#-9bo*!WcKkZ83r4l51peEF4Rw z|8bJR3_2&m63zT4(Rr8Y zfA;j@UV^Q)^xZ))f=GzLQNBSs&+_uU=-_H2S^~uB`8c~navGJG)uuGam)C88q$gQN z{6mzBe={+(WSi5NV@$D9W6xEcpUex2B0lu8$=*fjd)4`Z5db75u*bY4AEwH)MB{t( z5H;w3aV%BrEJ(CbL~kNnU<3=Z8L*)c`Hm~c{B`uas{WTrA{{UbNUKSFqvKODvwEdQ zbn>7Y=eiy<_`=|3TNpza=CE*#s5;HO3Y>27`(O(MB@$3f05nPTe4Np0;`@Vn^JOFV z+_kd7s)Q4DwrnB&7{DLuv)w0Nh6~s>y3z!9#QAC*q~r|XxJ0vu)I0|v3MGAxfl+hq zMO%_F0wlxY3=iMRpj#XJ6z6e4tS7O9GC3x(6wyRGGPhNaCN2>(&{R~4=6LjXUQBz= z%O_uh-)3_Zb0cg6PO7RhsVW2`D5wP28h2Nx!#U3N7=y%dWUH>d_>n?}{_D=4rTc$t zDw*iam${y=Jj>PtX0RomRhUXeQm8Tk5tC$vvCwt6Rz;l3DOW_ObjLe>e%$9()d>(5?xEcgIbA;JAz!uW5{!N)hcVr7a(!lMCPnRxWIe?S!#7`+bW4s1YN zK&#F+QOA#u@)jb-t9BLXnwP{_?QsU4EH4s_dFmNvEb8iMU6G#D7>s-N;3(Sz*CSV& z1L(K85izopy#`0s^jNdnO~B=O{cxtnX{)bv&*$OWcGBpO7Y?+jVD@3(jYwvFRuB9# zInkz{(@_fprS)ha&?IqD;_sOpPuO%l?k+7=c-E^p>G`8P&VS~J-a=$3T$DHGce?(4 zemP5L{`6(!y#0VVg6Fpx^UD~~aoM_;D(tyK6VdLX82i_?O+<7urQvRTnX1U~+dR!_ zWGBxU&KA0J-BxNm(ZM8UkkA6(d%+<4#WYf<0syHPil%F@Z48DCugmhz7SyolU@W^h z*=_8!n`~pmv@hL_Sezj$?=arLr$4fX{%U`n-u~s&W=3sctS5&)l(=V(ua`zC zPJi0QpzwURN9-iwIxI9>V8knoF~c&GW0FHR+?z1mdD~URM4O`p13NBHaJ6-Eljb@^ zsTbEHYBvMXK+*b45~A(+eDlWlaND3&XI=tQ!lD)jT{}3M2$g%{UEArJPo1Q8z*bOV zz@Z6d@acq=&pyxQyJb83Jl1KNSPH3}M2aB0sa0p*%t}qj2(sn6L|L%#EV2cn^RHmG zL$;tV6(pnDSd0Ast9A^~oo^`jR|F%vdGa7r4}i%{B&>-y;JEy|R%%Q#%^qUOIL#{m zf5#<<-dpKJK1f##!>dqnwU8fh`Y@9UvbzC=v2ZDnFVplL7t)2J@tZpS!DBSHw5CtY z`J-mZFMhk*kc9_=6taO5lM=WSh|feBoKbs@_tcKFpRiqG7|x3o<+vECny8>cd~riu zk7(OozESf>yR&+N$s*W5O?2(_-BWb?SI*FV-_vC1E!&w`*BwEo5l`|;jlF8eyBPya zkt;H$7nvt$RJNN;%CzeIkcz}slr)|ap;YhEB}tgT=eF)%kZ#QJgjl%P35-rpnK%GD!bFkd+PTt=joZ4L zy^sSfoN=g` z$Sknl$&Tm*?U~Ji)=!jO<)o?WuE$(5@h)M<{L!aAHbw9K>O9^1-G%r!=gZ6(jq=B#|8*Gv>SgTW zUJ25y#_z3&FW@evB0bzlB&p-G4L^C1T?Lyz$`)9hX?h4UITkaK)ez8eKZ7@h6z1b~o$~rDBRH;Y2lYD?C@8HsjD2Zyu+czj!(x*&7^1 z0wweHG1;xVc_k0oVv!1Fi#U)h!BKfO*%fuk_`*%&l*>5r1deifRT!Y-vr|8IF-P~p z-WR+`Ysv(!7g~wUjU`qPfQaKv8rZw>+W|qN%5TfnqN=`6VoW9+u2jcu z-QDX)np&kgIrQ4I_lTMc)*tJ+4n2HJ#8op91Cik%2;ywr-CY?}mHE>Y|B(#fw;8Gz zcJfSu9Pk=+^6E_dY0Kj`FE7%qSB4mTz~E)pKMZB@dYR4ulGk?z==i+ci;QDe8|I0k zew(L=s|=k>rjC=^=6wFfaT*vL>W#aDz(Jr2suS+AX-WD%4qhv`Fcv*w)s(QP&#NrX zRyfttxaYdkdeF)1l>(xgL?&<&1I`Bcqs;&~`Kacd*2Dly#xauSUBY@ZU4!ZNSLJE$ zjuBqA7U5ShH!ojir#@*#k$zWACnA@&Y>&1&ZDzPY#6{^wO-a*U>!iL(TMI6^4)I_M zZcO8}BmY0?==13(BJyI9Ef{e&$KnjXZ7h=#=hy(0!Wy3#r&oVwk@o*zoy~ux#sIRR z2_AkG;~~h8z|Y_-O!|fWUs#5*_&ee^8n5_-kTBdo=~$j;nQMGKVD_?f@RU@Cdrpm#AjhYbS7346_PSj>HxhY`CJ7+H z7qI{3c^>jseOU#9($f85?x9#+%tno&l*eb^@e0Zh3@~(0BxX_r8Q>36?;CS{X`m7P z@k;Lx@D1r25$L0C&;;9miDv9{) zxY@olz`k9RMBhKv%K)YqHKLkDA=wj&u}QnNC^JA(;75hG z1AOr73vw6ElmS%t8WO=`8yzoHC)pPNVlI2>0*YUJDQ%y+2Ary0pmR!B%sJrX*=73bQzz*6KX9FP z@q@IAA_c~Y`DJ?S$>VhUgFhm_qsTzn0$uzw=g}i?nV?I~V|w@6m*nZCcOR$e`F1x^ zRZH%r1W%bG5edW1AR7el0|VUsjamB2 zp#?f{;Ati4;y6TC?Al5Xzw?!}bDN=yiBh|pWkg5>FVr9r8$FBehQ;CpHW=Wqf7qmt zzK)}EANhwFdgQ=adTutr%%uxLuXVlprQ`JGt6xOF_scKo-#Ypo`V}QYzPu5H^Q04Z zJzkq8X_u^&$8@zrkNv1h`K&{?fBC2Mzm*mF8*@co6M22S=F)BS>sP&q-tqbu+n*Su zKw8(nl8k0`LoIk41a3E3fFnroKBg#ZS495z&~*<`-(f(FB;BEAGb z`N=0PrK!=}<|DRP$0zM;Uvc{;Hl}iiBR=LDyhhe9VndyS z>CkX{{^&-*Nl%HO?IssnX-fo^8pD=r10)%)qp+UU22UWdkz;|AELLzuBTSUqU8?Xq zi$R1{_}$ZXN1D~msTPRn$0wHQ((?!V`kke`V(mZ>$|TQ1BsOdxbSr7hvFd4lySIIh z$Sk2YfXRfQf6;`=CVnqox{!^CwsL##JWQR>UcNbvR>TNoUCG6AJRt7EF-BZ?I-=(g ztlQKjlJt^NyhNwC-DC?x<3$@1A?g_l$rFzpI7`2A`N-yD00hZU#~*8HH@k_A(lD?c zKxAYgTh0&ktPl(mA*LWvA_hR|_?YqLzkHsq+Brl|eBk19>!m<4qK)1Q-{G0QA``tKC`-2Q6iVer1pQfDN zZc?BE1su~Ffbtc33-k{t7bQZRI2V0c@#>ht__@3Oo8I=&Pg1n*4H{7mPswWoi*9hz zy@nxL7-O$s8h+myKpbMDqd0@d7^3qw3MW7KREkodW5575TI=ZARM`Sk5uq7D=fW=z zyWjxaI_&fZgBs{UQk`a~7~CX5{Jrv~aeDlr50RI#%=4X2bn=Hx@1F|-)XSwIqLnI9wiula z?0Vs1U&i45V1|7895X<$vIP+%a>r*q3eajsRyr+s88c3IIxcnGES)~PNaG_Z-~;VO zw9AY85}P4@BDD4K`bu2%y*v9n??AHFQp369Yy}m=DU+j#YyW^chd!Uqsghj~MFqAb zJr$GE0BREbgF75%_N;zcP%op=6S{suYzIYmzRcfmD*jY2W4In2I6O_4@7ZC0!&mD> z1Lf|&!8h+0@x}5oxLUr}B3f&9gGB2;J>`c6!;z~ErkBx22qz$Tl2vq^<1+Cn20V~| zpu!M3w`8*gdijla(#_XhO<(xfZT1aYF`Ajl$*YU2>Szs7PHV08?rM#2G*I$4FZ3jf z5v#QpJIT!|(cE*~2ow9>+Av_Sd9YMbH%A2<*BoE`+7tE}K$HTGYesx=AH!10v2L91 zc0)au(8B;7pZD`yoQba3CCkOLZL#8e#asi3G8r?NfF|qBFJFG+owWZ8AEK;ho-tf5 z6?;>@S~a4r7xRD1B79-{Cf>~u51A;+Z4IwL9vysui*9tY$mICOiX#17TxJkEYl9KQ z|5MfdL8i^*=)mD=`osJFp8ojVHzb>5uEgP2T+yC+Dx_|okPjgHiQl1STXiDx6L$y= z+XshUc55ec<8eDElS_ojTW1OwlSwf3^#IQ7x9+8FV`Za9JbiSQ_Pybs5#G0d~=@97g;lbJBF9t`blc7uGyO_TJNcsM-u(USA5r z{fuP*Y+Bd}j?46gu0@L&vDU2(sSsxn`E4e-YR8!U60}dm(=SRp!NtArk;m!e8OvpI z$M+BoO~&I1I;tX*PquIM83_Z(#C}ri77;&Ocrayzu+tBwT$*J>kIFp^OVe(2-#OU+ z#=Ge5hrX?Fx;3Ogun%M0yj0Xht`z^dAfwc0m`d!C0IizZButDE5mzw1A1^bI9GA_z zQBk{j8zw;{ZtX`O_-5?mhKmE-EmlTqJ%j%`#E1nhzi4Q%mY3wAXyP;lqCuy&Q755e(ZWijZi{7bJczVHI$%Ah!$P zx;H9puSDCfbpVUaj*JuQQLh_e!Adzx(#n^uRwpss4PVutl|n z4@$C(C7>tB+)$Y-RldI>jPB*vV*yb{U(~Q&QXbi>Kpk;X)^Tg8AFnfV#b__4;}ezT z1*Dqa`#23`dq2BSZ&La7AJ&(cbIfE%I`I$hlm9pG&I=x_sNt zaf28ZL%)cUEzcz*zUw8*w|~!l|CEd%!MppzQ+6dOm~5cLh+W*yP{^rkh|a%)8KCG5 zDP(1NiTrgKE=id{Of130$83>TCdKnth5L6pmb1+D3){qIRhq)}=|`WSFMaC}o%xqL zyZOp>)SioYM7zlt5fN6e(7hfos+aHmiT#PnC1^K!I=v|NLuiydC(!lGs*8)4D3Q{Y z6WX+j6E9A(m)~XtTAW$Gj5*(Zs%)I5R-Ko^4UG9(gM7c!MfAv6Kom2yn_Tn{PjSMF zIRsIA7xwJMnQqCm+KB9E>d-~M+Oe`}L9hisv8Y^;>2l;3h=5X@1j!ayW^I`748sOl zO|2UD42XD=h7M|1kmL6m*QNI3_jFI=>i6j}KMo8ozOMV^G`xd(3BkU^s*E*%G{Rq< zvd93zfDle|w#YAMh^JV0F<~Hz?n#44Z_F{5Q8k3!@rg!uh0gg+zi=r%diO2r3?LF+ zHqTRsOI64Cf2OeIB?>}^)#E001A1{m8_7T4kzqknF;xK8vk%Yhr3;5sYVHZ`e% zW0F~mNTru&M$tgoN;l50{QHmTGmq_8dj|6Hb+8FAL$gZs)5nQk_&0W!0xe>KL#6Dj z)xk5G?6{gS7h&qktPcR5|nIL$-&~Z5kwo#d4oJN2%| z4&TsZcgdKzu~cEIAX^}Z_TJJ-M3j~gHJjMmJ6W+uLUD-PnOhgJw0M1Xz~T?%B34n$VC4 zrUSi-balV3!MQlY7<^<`dPJAad+u=j`z9~zE<^9Q3|bBg<%^e12FJQu)SF9yRxO;s zQ4le*abO|qN(GdvjoQQ{eGf4o+~sdKc^NpBdyh%gK(OUr*dYkE&>g#&=)@1gpS!U) z73LDJ|J~iNbafLv!cK9ss$K}nkyv!fz$I?rF8=aoA%ImUEiMbxy^+2C08v%>;M z9iOQM9gKvCyp6_CIwz+UVO%X9=M^ngCj-k~RU#}^cnew?1DX&WNTSHtDEQErW8a53 zMbPD2ZP=3zxKP@t$cZe=C%`C9#%DwY1#;IWm`DRDE?_8v0V2hXIB><}v@cb-OAApP z2OlFy1LwOXmF>9R1u2UWGBK$ZGzuS=-H zctFHf8{L?EP*(<9*)PxYaH{N?VbTFoP3I<+7~=>Ue{sx}D-xamN`@dR9H#KJaNH7> z>3@|4BsrmQAEP9KY$Kw+Q#|d>YWHbZfu2E39dHNnc`+EJDjkBhz|ds3iygOr5fQ*} z2@pJqgQI~mBN{}lK2J27pd{KxHc*H}z)6O!5hPB~FBU6~#HF5vbpS{AOO2@U%S7UOM*@ z;-F?5)<5hENC#OJPxNRuy@ZQAiWoJljspN%1=g>!5ew4{9=6#?LX-%|ei7>liWR#} ztnxTKeR)0_9yXB`-4So{7w}iZBY*RuLvfK-?&auu@|u##X=t zFmJ2QybUq*EQ)%(kbUHMy*7YhVWo|ZplQLuhoaK%L7u@M@aXp5mIG(xz9R zmw%avj|VGvV$_ap6m2#VkBHROXL{YXFat{T#YMw4tT98rtamX3u3cPALUo8`-oh%b vi6!A+?}%zq>>?r?=0.14.17", - "fabric": "*", - "fabric-api-base": "*", - "minecraft": "*" - }, - "suggests": {} -} diff --git a/implementations/fabric-1.20.5/build.gradle.kts b/implementations/fabric-1.20.5/build.gradle.kts deleted file mode 100644 index e67caf26..00000000 --- a/implementations/fabric-1.20.5/build.gradle.kts +++ /dev/null @@ -1,176 +0,0 @@ -import com.matthewprenger.cursegradle.CurseArtifact -import com.matthewprenger.cursegradle.CurseProject -import com.matthewprenger.cursegradle.CurseRelation -import com.matthewprenger.cursegradle.Options -import net.fabricmc.loom.task.RemapJarTask - -plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("fabric-loom") version "1.6-SNAPSHOT" - id ("com.modrinth.minotaur") version "2.+" - id ("com.matthewprenger.cursegradle") version "1.4.0" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -val javaTarget = 21 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - - withSourcesJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://maven.fabricmc.net/") - maven ("https://repo.bluecolored.de/releases") -} - -val shadowInclude: Configuration by configurations.creating - -configurations { - implementation.get().extendsFrom(shadowInclude) -} - -dependencies { - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by fabric - exclude (group = "com.google.guava", module = "guava") - exclude (group = "com.google.code.gson", module = "gson") - exclude (group = "com.mojang", module = "brigadier") - } - - minecraft ("com.mojang:minecraft:1.20.5") - mappings ("net.fabricmc:yarn:1.20.5+build.1") - modImplementation ("net.fabricmc:fabric-loader:0.15.10") - modImplementation ("net.fabricmc.fabric-api:fabric-api:0.97.8+1.20.5") - modImplementation("me.lucko:fabric-permissions-api:0.3.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.9.0") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.9.0") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - inputs.property ("version", project.version) - - filesMatching("fabric.mod.json") { - expand ("version" to project.version) - } -} - -tasks.shadowJar { - configurations = listOf(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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -tasks.register("remappedShadowJar", type = RemapJarTask::class) { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - dependsOn (tasks.shadowJar) - inputFile.set(tasks.shadowJar.get().archiveFile) - addNestedDependencies.set(true) -} - -tasks.register("release") { - dependsOn("remappedShadowJar") -} - -modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("remappedShadowJar")) - gameVersions.addAll("1.20.5", "1.20.6") - dependencies { - required.project("P7dR8mSH") // Fabric API - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project(closureOf { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .readText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion("Fabric") - - addGameVersion("Java 21") - - addGameVersion("1.20.5") - addGameVersion("1.20.6") - - mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - }) - options(closureOf { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - }) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("curseforge") -} diff --git a/implementations/fabric-1.20.5/settings.gradle.kts b/implementations/fabric-1.20.5/settings.gradle.kts deleted file mode 100644 index 99ed8cbd..00000000 --- a/implementations/fabric-1.20.5/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") - } - gradlePluginPortal() - } -} - -rootProject.name = "fabric-1.20.5" - -includeBuild("../../BlueMapCommon") diff --git a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java deleted file mode 100644 index 2636fe1b..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * 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.fabric; - -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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.math.Vec3d; - -import java.util.Optional; - -public class FabricCommandSource implements CommandSource { - - private final FabricMod mod; - private final Plugin plugin; - private final ServerCommandSource delegate; - - public FabricCommandSource(FabricMod mod, Plugin plugin, ServerCommandSource delegate) { - this.mod = mod; - this.plugin = plugin; - this.delegate = delegate; - } - - @Override - public void sendMessage(Text text) { - delegate.sendFeedback( - () -> net.minecraft.text.Text.Serialization - .fromJson(text.toJSONString(), delegate.getRegistryManager()), - false - ); - } - - @Override - public boolean hasPermission(String permission) { - try { - Class.forName("me.lucko.fabric.api.permissions.v0.Permissions"); - return Permissions.check(delegate, permission, 1); - } catch (ClassNotFoundException ex) { - return delegate.hasPermissionLevel(1); - } - } - - @Override - public Optional getPosition() { - Vec3d pos = delegate.getPosition(); - if (pos != null) { - return Optional.of(new Vector3d(pos.x, pos.y, pos.z)); - } - - return Optional.empty(); - } - - @Override - public Optional getWorld() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java deleted file mode 100644 index 411e1c34..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.UUID; - -public class FabricEventForwarder { - - private final FabricMod mod; - private final Collection eventListeners; - - public FabricEventForwarder(FabricMod mod) { - this.mod = mod; - this.eventListeners = new ArrayList<>(1); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - } - - public synchronized void addEventListener(ServerEventListener listener) { - this.eventListeners.add(listener); - } - - public synchronized void removeAllListeners() { - this.eventListeners.clear(); - } - - public synchronized void onPlayerJoin(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - public synchronized void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java deleted file mode 100644 index 2d2c3fa1..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.fabric; - -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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.SharedConstants; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; -import org.apache.logging.log4j.LogManager; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class FabricMod implements ModInitializer, Server { - - private final Plugin pluginInstance; - private MinecraftServer serverInstance = null; - - private final FabricEventForwarder eventForwarder; - - private final LoadingCache worlds; - - private int playerUpdateIndex = 0; - private final Map onlinePlayerMap; - private final List onlinePlayerList; - - public FabricMod() { - Logger.global.clear(); - Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME))); - - this.onlinePlayerMap = new ConcurrentHashMap<>(); - this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>()); - - pluginInstance = new Plugin("fabric", this); - - this.eventForwarder = new FabricEventForwarder(this); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(FabricWorld::new); - } - - @Override - public void onInitialize() { - - //register commands - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - new Commands<>(pluginInstance, dispatcher, fabricSource -> - new FabricCommandSource(this, pluginInstance, fabricSource) - ) - ); - - ServerLifecycleEvents.SERVER_STARTED.register((MinecraftServer server) -> { - this.serverInstance = server; - - new Thread(()->{ - Logger.global.logInfo("Loading BlueMap..."); - - try { - pluginInstance.load(); - if (pluginInstance.isLoaded()) Logger.global.logInfo("BlueMap loaded!"); - } catch (IOException e) { - Logger.global.logError("Failed to load bluemap!", e); - pluginInstance.unload(); - } - }, "BlueMap-Plugin-Loading").start(); - }); - - ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> { - pluginInstance.unload(); - Logger.global.logInfo("BlueMap unloaded!"); - }); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - - ServerTickEvents.END_SERVER_TICK.register((MinecraftServer server) -> { - if (server == this.serverInstance) this.updateSomePlayers(); - }); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getGameVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object world) { - - if (world instanceof String) { - Identifier identifier = Identifier.tryParse((String) world); - if (identifier != null) world = serverInstance.getWorld(RegistryKey.of(RegistryKeys.WORLD, identifier)); - } - - if (world instanceof RegistryKey) { - try { - world = serverInstance.getWorld((RegistryKey) world); - } catch (ClassCastException ignored) {} - } - - if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { - return worlds.get(serverWorld); - } - - @Override - public Path getConfigFolder() { - return Path.of("config", "bluemap"); - } - - @Override - public Optional getModsFolder() { - return Optional.of(Path.of("mods")); - } - - public void onPlayerJoin(MinecraftServer server, ServerPlayerEntity playerInstance) { - if (this.serverInstance != server) return; - - FabricPlayer player = new FabricPlayer(playerInstance, this); - onlinePlayerMap.put(player.getUuid(), player); - onlinePlayerList.add(player); - } - - public void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.serverInstance != server) 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 getPluginInstance() { - return pluginInstance; - } - - @Override - public Collection getOnlinePlayers() { - return onlinePlayerMap.values(); - } - - /** - * 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/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java deleted file mode 100644 index 692256dd..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.fabric; - -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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameMode; -import net.minecraft.world.LightType; - -import java.util.EnumMap; -import java.util.Map; -import java.util.UUID; - -public class FabricPlayer implements Player { - - private static final Map GAMEMODE_MAP = new EnumMap<>(GameMode.class); - static { - GAMEMODE_MAP.put(GameMode.ADVENTURE, Gamemode.ADVENTURE); - GAMEMODE_MAP.put(GameMode.SURVIVAL, Gamemode.SURVIVAL); - GAMEMODE_MAP.put(GameMode.CREATIVE, Gamemode.CREATIVE); - GAMEMODE_MAP.put(GameMode.SPECTATOR, Gamemode.SPECTATOR); - } - - private final UUID uuid; - private Text name; - private ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - private boolean sneaking; - private boolean invisible; - private Gamemode gamemode; - - private final FabricMod mod; - - public FabricPlayer(ServerPlayerEntity player, FabricMod mod) { - this.uuid = player.getUuid(); - this.mod = mod; - - update(player); - } - - @Override - public UUID getUuid() { - return this.uuid; - } - - @Override - public Text getName() { - return this.name; - } - - @Override - public ServerWorld 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 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) return; - - ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) return; - - update(player); - } - - public void update(ServerPlayerEntity player) { - this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); - if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; - - StatusEffectInstance invis = player.getStatusEffect(StatusEffects.INVISIBILITY); - this.invisible = invis != null && invis.getDuration() > 0; - - this.name = Text.of(player.getName().getString()); - - Vec3d pos = player.getPos(); - this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); - this.rotation = new Vector3d(player.getPitch(), player.getHeadYaw(), 0); - this.sneaking = player.isSneaking(); - - this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); - this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - - this.world = mod.getServerWorld(player.getServerWorld()); - } - -} diff --git a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java deleted file mode 100644 index ff4468d9..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.WorldSavePath; - -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 FabricWorld implements ServerWorld { - - private final WeakReference delegate; - private final Path worldFolder; - private final Key dimension; - - public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getRunDirectory().toPath() - .resolve(server.getSavePath(WorldSavePath.ROOT)); - - Identifier id = delegate.getRegistryKey().getValue(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @Override - public boolean persistWorldChanges() throws IOException { - net.minecraft.server.world.ServerWorld 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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FabricWorld that = (FabricWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java deleted file mode 100644 index 9e60f395..00000000 --- a/implementations/fabric-1.20.5/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.fabric; - -import org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/fabric-1.20.5/src/main/resources/assets/bluemap/icon.png b/implementations/fabric-1.20.5/src/main/resources/assets/bluemap/icon.png deleted file mode 100644 index 65d56d7a88fd8adb9003df6e0c10424b0ec8e375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10593 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 vi6!A+?}%zq>>?r?=0.15.10", - "fabric": "*", - "fabric-api-base": "*", - "minecraft": "*" - }, - "suggests": {} -} diff --git a/implementations/fabric-1.20/build.gradle.kts b/implementations/fabric-1.20/build.gradle.kts deleted file mode 100644 index 94ddf704..00000000 --- a/implementations/fabric-1.20/build.gradle.kts +++ /dev/null @@ -1,180 +0,0 @@ -import com.matthewprenger.cursegradle.CurseArtifact -import com.matthewprenger.cursegradle.CurseProject -import com.matthewprenger.cursegradle.CurseRelation -import com.matthewprenger.cursegradle.Options -import net.fabricmc.loom.task.RemapJarTask - -plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("fabric-loom") version "1.6-SNAPSHOT" - id ("com.modrinth.minotaur") version "2.+" - id ("com.matthewprenger.cursegradle") version "1.4.0" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -val javaTarget = 17 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - - withSourcesJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://maven.fabricmc.net/") - maven ("https://repo.bluecolored.de/releases") -} - -val shadowInclude: Configuration by configurations.creating - -configurations { - implementation.get().extendsFrom(shadowInclude) -} - -dependencies { - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by fabric - exclude (group = "com.google.guava", module = "guava") - exclude (group = "com.google.code.gson", module = "gson") - exclude (group = "com.mojang", module = "brigadier") - } - - minecraft ("com.mojang:minecraft:1.20") - mappings ("net.fabricmc:yarn:1.20+build.1") - modImplementation ("net.fabricmc:fabric-loader:0.14.21") - modImplementation ("net.fabricmc.fabric-api:fabric-api:0.83.0+1.20") - modImplementation("me.lucko:fabric-permissions-api:0.3.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.9.0") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.9.0") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - inputs.property ("version", project.version) - - filesMatching("fabric.mod.json") { - expand ("version" to project.version) - } -} - -tasks.shadowJar { - configurations = listOf(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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -tasks.register("remappedShadowJar", type = RemapJarTask::class) { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - dependsOn (tasks.shadowJar) - inputFile.set(tasks.shadowJar.get().archiveFile) - addNestedDependencies.set(true) -} - -tasks.register("release") { - dependsOn("remappedShadowJar") -} - -modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - 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", "1.20.3", "1.20.4") - dependencies { - required.project("P7dR8mSH") // Fabric API - } -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project(closureOf { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .readText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion("Fabric") - - addGameVersion("Java 18") - addGameVersion("Java 17") - - addGameVersion("1.20") - addGameVersion("1.20.1") - addGameVersion("1.20.2") - addGameVersion("1.20.3") - addGameVersion("1.20.4") - - mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - }) - options(closureOf { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - }) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("curseforge") -} diff --git a/implementations/fabric-1.20/settings.gradle.kts b/implementations/fabric-1.20/settings.gradle.kts deleted file mode 100644 index abec8204..00000000 --- a/implementations/fabric-1.20/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") - } - gradlePluginPortal() - } -} - -rootProject.name = "fabric-1.20" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java deleted file mode 100644 index 5c641c7c..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricCommandSource.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * 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.fabric; - -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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import me.lucko.fabric.api.permissions.v0.Permissions; -import net.minecraft.server.command.ServerCommandSource; -import net.minecraft.util.math.Vec3d; - -import java.util.Optional; - -public class FabricCommandSource implements CommandSource { - - private final FabricMod mod; - private final Plugin plugin; - private final ServerCommandSource delegate; - - public FabricCommandSource(FabricMod mod, Plugin plugin, ServerCommandSource delegate) { - this.mod = mod; - this.plugin = plugin; - this.delegate = delegate; - } - - @Override - public void sendMessage(Text text) { - delegate.sendFeedback(() -> net.minecraft.text.Text.Serializer.fromJson(text.toJSONString()), false); - } - - @Override - public boolean hasPermission(String permission) { - try { - Class.forName("me.lucko.fabric.api.permissions.v0.Permissions"); - return Permissions.check(delegate, permission, 1); - } catch (ClassNotFoundException ex) { - return delegate.hasPermissionLevel(1); - } - } - - @Override - public Optional getPosition() { - Vec3d pos = delegate.getPosition(); - if (pos != null) { - return Optional.of(new Vector3d(pos.x, pos.y, pos.z)); - } - - return Optional.empty(); - } - - @Override - public Optional getWorld() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getWorld()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java deleted file mode 100644 index 411e1c34..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricEventForwarder.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.UUID; - -public class FabricEventForwarder { - - private final FabricMod mod; - private final Collection eventListeners; - - public FabricEventForwarder(FabricMod mod) { - this.mod = mod; - this.eventListeners = new ArrayList<>(1); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - } - - public synchronized void addEventListener(ServerEventListener listener) { - this.eventListeners.add(listener); - } - - public synchronized void removeAllListeners() { - this.eventListeners.clear(); - } - - public synchronized void onPlayerJoin(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - public synchronized void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.mod.getServer() != server) return; - - UUID uuid = player.getUuid(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java deleted file mode 100644 index c4bc0ad8..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricMod.java +++ /dev/null @@ -1,241 +0,0 @@ -/* - * 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.fabric; - -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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -import de.bluecolored.bluemap.core.logger.Logger; -import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents; -import net.fabricmc.fabric.api.networking.v1.ServerPlayConnectionEvents; -import net.minecraft.SharedConstants; -import net.minecraft.registry.RegistryKey; -import net.minecraft.registry.RegistryKeys; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.Identifier; -import net.minecraft.world.World; -import org.apache.logging.log4j.LogManager; - -import java.io.IOException; -import java.nio.file.Path; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; - -public class FabricMod implements ModInitializer, Server { - - private final Plugin pluginInstance; - private MinecraftServer serverInstance = null; - - private final FabricEventForwarder eventForwarder; - - private final LoadingCache worlds; - - private int playerUpdateIndex = 0; - private final Map onlinePlayerMap; - private final List onlinePlayerList; - - public FabricMod() { - Logger.global.clear(); - Logger.global.put(new Log4jLogger(LogManager.getLogger(Plugin.PLUGIN_NAME))); - - this.onlinePlayerMap = new ConcurrentHashMap<>(); - this.onlinePlayerList = Collections.synchronizedList(new ArrayList<>()); - - pluginInstance = new Plugin("fabric-1.20", this); - - this.eventForwarder = new FabricEventForwarder(this); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(FabricWorld::new); - } - - @Override - public void onInitialize() { - - //register commands - CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> - new Commands<>(pluginInstance, dispatcher, fabricSource -> - new FabricCommandSource(this, pluginInstance, fabricSource) - ) - ); - - ServerLifecycleEvents.SERVER_STARTED.register((MinecraftServer server) -> { - this.serverInstance = server; - - new Thread(()->{ - Logger.global.logInfo("Loading BlueMap..."); - - try { - pluginInstance.load(); - if (pluginInstance.isLoaded()) Logger.global.logInfo("BlueMap loaded!"); - } catch (IOException e) { - Logger.global.logError("Failed to load bluemap!", e); - pluginInstance.unload(); - } - }, "BlueMap-Plugin-Loading").start(); - }); - - ServerLifecycleEvents.SERVER_STOPPING.register((MinecraftServer server) -> { - pluginInstance.unload(); - Logger.global.logInfo("BlueMap unloaded!"); - }); - - ServerPlayConnectionEvents.JOIN.register((handler, sender, server) -> { - this.onPlayerJoin(server, handler.getPlayer()); - }); - - ServerPlayConnectionEvents.DISCONNECT.register((handler, server) -> { - this.onPlayerLeave(server, handler.getPlayer()); - }); - - ServerTickEvents.END_SERVER_TICK.register((MinecraftServer server) -> { - if (server == this.serverInstance) this.updateSomePlayers(); - }); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getGameVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (net.minecraft.server.world.ServerWorld serverWorld : serverInstance.getWorlds()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object world) { - - if (world instanceof String) { - Identifier identifier = Identifier.tryParse((String) world); - if (identifier != null) world = serverInstance.getWorld(RegistryKey.of(RegistryKeys.WORLD, identifier)); - } - - if (world instanceof RegistryKey) { - try { - world = serverInstance.getWorld((RegistryKey) world); - } catch (ClassCastException ignored) {} - } - - if (world instanceof net.minecraft.server.world.ServerWorld) - return Optional.of(getServerWorld((net.minecraft.server.world.ServerWorld) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(net.minecraft.server.world.ServerWorld serverWorld) { - return worlds.get(serverWorld); - } - - @Override - public Path getConfigFolder() { - return Path.of("config", "bluemap"); - } - - @Override - public Optional getModsFolder() { - return Optional.of(Path.of("mods")); - } - - public void onPlayerJoin(MinecraftServer server, ServerPlayerEntity playerInstance) { - if (this.serverInstance != server) return; - - FabricPlayer player = new FabricPlayer(playerInstance, this); - onlinePlayerMap.put(player.getUuid(), player); - onlinePlayerList.add(player); - } - - public void onPlayerLeave(MinecraftServer server, ServerPlayerEntity player) { - if (this.serverInstance != server) 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 getPluginInstance() { - return pluginInstance; - } - - @Override - public Collection getOnlinePlayers() { - return onlinePlayerMap.values(); - } - - /** - * 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/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java deleted file mode 100644 index 692256dd..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricPlayer.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * 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.fabric; - -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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import net.minecraft.entity.effect.StatusEffectInstance; -import net.minecraft.entity.effect.StatusEffects; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.util.math.Vec3d; -import net.minecraft.world.GameMode; -import net.minecraft.world.LightType; - -import java.util.EnumMap; -import java.util.Map; -import java.util.UUID; - -public class FabricPlayer implements Player { - - private static final Map GAMEMODE_MAP = new EnumMap<>(GameMode.class); - static { - GAMEMODE_MAP.put(GameMode.ADVENTURE, Gamemode.ADVENTURE); - GAMEMODE_MAP.put(GameMode.SURVIVAL, Gamemode.SURVIVAL); - GAMEMODE_MAP.put(GameMode.CREATIVE, Gamemode.CREATIVE); - GAMEMODE_MAP.put(GameMode.SPECTATOR, Gamemode.SPECTATOR); - } - - private final UUID uuid; - private Text name; - private ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - private boolean sneaking; - private boolean invisible; - private Gamemode gamemode; - - private final FabricMod mod; - - public FabricPlayer(ServerPlayerEntity player, FabricMod mod) { - this.uuid = player.getUuid(); - this.mod = mod; - - update(player); - } - - @Override - public UUID getUuid() { - return this.uuid; - } - - @Override - public Text getName() { - return this.name; - } - - @Override - public ServerWorld 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 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) return; - - ServerPlayerEntity player = server.getPlayerManager().getPlayer(uuid); - if (player == null) return; - - update(player); - } - - public void update(ServerPlayerEntity player) { - this.gamemode = GAMEMODE_MAP.get(player.interactionManager.getGameMode()); - if (this.gamemode == null) this.gamemode = Gamemode.SURVIVAL; - - StatusEffectInstance invis = player.getStatusEffect(StatusEffects.INVISIBILITY); - this.invisible = invis != null && invis.getDuration() > 0; - - this.name = Text.of(player.getName().getString()); - - Vec3d pos = player.getPos(); - this.position = new Vector3d(pos.getX(), pos.getY(), pos.getZ()); - this.rotation = new Vector3d(player.getPitch(), player.getHeadYaw(), 0); - this.sneaking = player.isSneaking(); - - this.skyLight = player.getWorld().getLightingProvider().get(LightType.SKY).getLightLevel(player.getBlockPos()); - this.blockLight = player.getWorld().getLightingProvider().get(LightType.BLOCK).getLightLevel(player.getBlockPos()); - - this.world = mod.getServerWorld(player.getServerWorld()); - } - -} diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java deleted file mode 100644 index ff4468d9..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/FabricWorld.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.fabric; - -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Identifier; -import net.minecraft.util.WorldSavePath; - -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 FabricWorld implements ServerWorld { - - private final WeakReference delegate; - private final Path worldFolder; - private final Key dimension; - - public FabricWorld(net.minecraft.server.world.ServerWorld delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getRunDirectory().toPath() - .resolve(server.getSavePath(WorldSavePath.ROOT)); - - Identifier id = delegate.getRegistryKey().getValue(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @Override - public boolean persistWorldChanges() throws IOException { - net.minecraft.server.world.ServerWorld 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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - FabricWorld that = (FabricWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java b/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java deleted file mode 100644 index 9e60f395..00000000 --- a/implementations/fabric-1.20/src/main/java/de/bluecolored/bluemap/fabric/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.fabric; - -import org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/fabric-1.20/src/main/resources/assets/bluemap/icon.png b/implementations/fabric-1.20/src/main/resources/assets/bluemap/icon.png deleted file mode 100644 index 65d56d7a88fd8adb9003df6e0c10424b0ec8e375..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10593 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 vi6!A+?}%zq>>?r?=0.14.21", - "fabric": "*", - "fabric-api-base": "*", - "minecraft": "*" - }, - "suggests": {} -} diff --git a/implementations/fabric/build.gradle.kts b/implementations/fabric/build.gradle.kts index 7fe4dab3..9da56910 100644 --- a/implementations/fabric/build.gradle.kts +++ b/implementations/fabric/build.gradle.kts @@ -1,175 +1,111 @@ -import com.matthewprenger.cursegradle.CurseArtifact -import com.matthewprenger.cursegradle.CurseProject -import com.matthewprenger.cursegradle.CurseRelation -import com.matthewprenger.cursegradle.Options import net.fabricmc.loom.task.RemapJarTask plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("fabric-loom") version "1.6-SNAPSHOT" - id ("com.modrinth.minotaur") version "2.+" - id ("com.matthewprenger.cursegradle") version "1.4.0" + bluemap.implementation + bluemap.modrinth + bluemap.curseforge + alias ( libs.plugins.loom ) } -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore +val supportedMinecraftVersions = listOf( + "1.21" +) -val javaTarget = 21 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) - - withSourcesJar() -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://maven.fabricmc.net/") - maven ("https://repo.bluecolored.de/releases") -} +val minecraftVersion = supportedMinecraftVersions.first() +val yarnMappings = "${minecraftVersion}+build.1" +val fabricLoaderVersion = "0.15.11" +val fabricApiVersion = "0.100.1+${minecraftVersion}" val shadowInclude: Configuration by configurations.creating - -configurations { - implementation.get().extendsFrom(shadowInclude) -} +configurations.api.get().extendsFrom(shadowInclude) dependencies { - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by fabric - exclude (group = "com.google.guava", module = "guava") - exclude (group = "com.google.code.gson", module = "gson") - exclude (group = "com.mojang", module = "brigadier") - } - minecraft ("com.mojang:minecraft:1.21") - mappings ("net.fabricmc:yarn:1.21+build.1") - modImplementation ("net.fabricmc:fabric-loader:0.15.11") - modImplementation ("net.fabricmc.fabric-api:fabric-api:0.100.1+1.21") - modImplementation("me.lucko:fabric-permissions-api:0.3.1") + shadowInclude ( project( ":common" ) ) { + exclude ( group = "com.google.code.gson", module = "gson" ) + exclude ( group = "com.mojang", module = "brigadier" ) + } - testImplementation ("org.junit.jupiter:junit-jupiter:5.9.0") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.9.0") -} + minecraft ("com.mojang:minecraft:${minecraftVersion}") + mappings ("net.fabricmc:yarn:${yarnMappings}") + modImplementation ("net.fabricmc:fabric-loader:${fabricLoaderVersion}") + modImplementation ("net.fabricmc.fabric-api:fabric-api:${fabricApiVersion}") + modImplementation( libs.fabric.permissions ) -spotless { - java { - target ("src/*/java/**/*.java") + // jarInJar + include ( libs.flow.math ) - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - inputs.property ("version", project.version) - - filesMatching("fabric.mod.json") { - expand ("version" to project.version) - } } tasks.shadowJar { - configurations = listOf(shadowInclude) + configurations = listOf(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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") + // exclude jarInJar + dependencies { + exclude( dependency ( libs.flow.math.get() ) ) + } - relocate ("com.google.errorprone", "de.bluecolored.shadow.google.errorprone") - relocate ("com.google.inject", "de.bluecolored.shadow.google.inject") + // airlift + relocate ("io.airlift", "de.bluecolored.shadow.airlift") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") - 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") } -tasks.register("remappedShadowJar", type = RemapJarTask::class) { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - dependsOn (tasks.shadowJar) - inputFile.set(tasks.shadowJar.get().archiveFile) - addNestedDependencies.set(true) +tasks.withType(ProcessResources::class).configureEach { + val replacements = mapOf( + "version" to project.version, + "fabric_loader_version" to fabricLoaderVersion, + "minecraft_version" to minecraftVersion, + "java_version" to java.toolchain.languageVersion.get() + ) + inputs.properties(replacements) + filesMatching(listOf( + "fabric.mod.json", + )) { expand(replacements) } } -tasks.register("release") { - dependsOn("remappedShadowJar") +val remappedShadowJar = tasks.register("remappedShadowJar", type = RemapJarTask::class) { + dependsOn (tasks.shadowJar) + archiveFileName = "${project.name}-${project.version}-shadow-remapped.jar" + inputFile = tasks.shadowJar.flatMap { it.archiveFile } + addNestedDependencies = true +} + +tasks.getByName("release") { + dependsOn(remappedShadowJar) + inputFile = remappedShadowJar.flatMap { it.archiveFile } } modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("remappedShadowJar")) - gameVersions.addAll("1.21") - dependencies { - required.project("P7dR8mSH") // Fabric API - } + gameVersions.addAll(supportedMinecraftVersions) + dependencies { required.project("P7dR8mSH") } // Fabric API } -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project(closureOf { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .readText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion("Fabric") - - addGameVersion("Java 21") - - addGameVersion("1.21") - - mainArtifact(tasks.findByName("remappedShadowJar"), closureOf { - relations(closureOf { - requiredDependency("fabric-api") - }) - }) - }) - options(closureOf { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - }) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("curseforge") +curseforgeBlueMap { + addGameVersion("Fabric") + addGameVersion("Java ${java.toolchain.languageVersion.get()}") + supportedMinecraftVersions.forEach { + addGameVersion(it) + } } diff --git a/implementations/fabric/settings.gradle.kts b/implementations/fabric/settings.gradle.kts deleted file mode 100644 index 9eb20cab..00000000 --- a/implementations/fabric/settings.gradle.kts +++ /dev/null @@ -1,13 +0,0 @@ -pluginManagement { - repositories { - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") - } - gradlePluginPortal() - } -} - -rootProject.name = "fabric" - -includeBuild("../../BlueMapCommon") diff --git a/implementations/fabric/src/main/resources/fabric.mod.json b/implementations/fabric/src/main/resources/fabric.mod.json index 7a3c43c8..9e8f673f 100644 --- a/implementations/fabric/src/main/resources/fabric.mod.json +++ b/implementations/fabric/src/main/resources/fabric.mod.json @@ -12,7 +12,6 @@ "homepage": "https://github.com/BlueMap-Minecraft", "sources": "https://github.com/BlueMap-Minecraft/BlueMap" }, - "license": "MIT", "icon": "assets/bluemap/icon.png", @@ -24,10 +23,11 @@ }, "depends": { - "fabricloader": ">=0.15.10", - "fabric": "*", - "fabric-api-base": "*", - "minecraft": "*" + "java": ">=${java_version}", + "minecraft": ">=${minecraft_version}", + "fabricloader": ">=${fabric_loader_version}", + "fabric-api-base": "*" }, + "suggests": {} } diff --git a/implementations/forge-1.18.1/build.gradle b/implementations/forge-1.18.1/build.gradle deleted file mode 100644 index 02a5b7a5..00000000 --- a/implementations/forge-1.18.1/build.gradle +++ /dev/null @@ -1,208 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true - } -} - -plugins { - id "java" - id "java-library" - id "com.diffplug.spotless" version "6.1.2" - id "com.github.node-gradle.node" version "3.0.1" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -apply plugin: "net.minecraftforge.gradle" - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -archivesBaseName = 'bluemap' - -def javaTarget = 17 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) -} - -minecraft { - mappings channel: 'official', version: '1.18.1' - - runs { - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - bluemap { - source sourceSets.main - } - } - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.18.1-39.0.19' - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -jar { - manifest { - attributes([ - "Specification-Title" : "bluemap", - "Specification-Vendor" : "bluemap", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "bluemap", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -jar.finalizedBy('reobfJar') - -tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" -} - -tasks.withType(AbstractArchiveTask).configureEach { - setReproducibleFileOrder(true) - setPreserveFileTimestamps(false) -} - -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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info','META-INF/mods.toml' - duplicatesStrategy = DuplicatesStrategy.WARN - - expand ( - version: project.version - ) - } -} - -afterEvaluate { - reobf { - shadowJar { - mappings = createMcpToSrg.output - } - } -} - -task release { - dependsOn(build) -} - -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 - gameVersions = ["1.18.1", "1.18.2"] -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .getText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion "Forge" - - addGameVersion "Java 18" - addGameVersion "Java 17" - - addGameVersion "1.18.1" - addGameVersion "1.18.2" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/forge-1.18.1/settings.gradle.kts b/implementations/forge-1.18.1/settings.gradle.kts deleted file mode 100644 index 86394273..00000000 --- a/implementations/forge-1.18.1/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "forge-1.18.1" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java deleted file mode 100644 index b19ca3af..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.TextComponent; - -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 = TextComponent.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() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java deleted file mode 100644 index ff54d23a..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -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); - - MinecraftForge.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(PlayerLoggedInEvent evt) { - UUID uuid = evt.getPlayer().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - @SubscribeEvent - public synchronized void onPlayerLeave(PlayerLoggedOutEvent evt) { - UUID uuid = evt.getPlayer().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java deleted file mode 100644 index 41c0baf8..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * 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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -import de.bluecolored.bluemap.core.logger.Logger; -import net.minecraft.SharedConstants; -import net.minecraft.core.Registry; -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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.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 Server { - - 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("forge-1.18.1", this); - - this.eventForwarder = new ForgeEventForwarder(); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(ForgeWorld::new); - - MinecraftForge.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(ServerTickEvent evt) { - updateSomePlayers(); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getCurrentVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (ServerLevel serverWorld : serverInstance.getAllLevels()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object world) { - - if (world instanceof String) { - ResourceLocation resourceLocation = ResourceLocation.tryParse((String) world); - if (resourceLocation != null) world = serverInstance.getLevel(ResourceKey.create(Registry.DIMENSION_REGISTRY, resourceLocation)); - } - - if (world instanceof ResourceKey) { - try { - world = serverInstance.getLevel((ResourceKey) world); - } catch (ClassCastException ignored) {} - } - - if (world instanceof ServerLevel) - return Optional.of(getServerWorld((ServerLevel) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(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(PlayerLoggedInEvent evt) { - var playerInstance = evt.getPlayer(); - if (!(playerInstance instanceof ServerPlayer)) return; - - ForgePlayer player = new ForgePlayer(playerInstance.getUUID(), this); - onlinePlayerMap.put(player.getUuid(), player); - onlinePlayerList.add(player); - } - - @SubscribeEvent - public void onPlayerLeave(PlayerLoggedOutEvent evt) { - var player = evt.getPlayer(); - 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(); - } - - /** - * 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/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java deleted file mode 100644 index 07d9fdcd..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -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.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 ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - 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 ServerWorld 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 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) return; - - ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) 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()); - - 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.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); - this.blockLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getX(), player.getY(), player.getZ())); - - this.world = mod.getServerWorld(player.getLevel()); - } - -} diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java deleted file mode 100644 index dc2284be..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -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 worldFolder; - private final Key dimension; - - public ForgeWorld(ServerLevel delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getServerDirectory().toPath() - .resolve(server.getWorldPath(LevelResource.ROOT)); - - ResourceLocation id = delegate.dimension().location(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ForgeWorld that = (ForgeWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java deleted file mode 100644 index a77265e0..00000000 --- a/implementations/forge-1.18.1/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/forge-1.18.1/src/main/resources/META-INF/mods.toml b/implementations/forge-1.18.1/src/main/resources/META-INF/mods.toml deleted file mode 100644 index 2ddbaaf1..00000000 --- a/implementations/forge-1.18.1/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,26 +0,0 @@ -modLoader="javafml" -loaderVersion="[39,)" -license="MIT" -issueTrackerURL="https://github.com/BlueMap-Minecraft/BlueMap/issues" -[[mods]] -modId="bluemap" -version="${version}" -displayName="BlueMap" -displayURL="https://github.com/BlueMap-Minecraft/BlueMap" -authors="Blue (TBlueF, Lukas Rieger)" -description=''' -A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) -''' - -[[dependencies.bluemap]] - modId="forge" - mandatory=true - versionRange="[39,)" - ordering="NONE" - side="SERVER" -[[dependencies.bluemap]] - modId="minecraft" - mandatory=true - versionRange="[1.18.1,)" - ordering="NONE" - side="SERVER" diff --git a/implementations/forge-1.18.1/src/main/resources/pack.mcmeta b/implementations/forge-1.18.1/src/main/resources/pack.mcmeta deleted file mode 100644 index 0f95ce1c..00000000 --- a/implementations/forge-1.18.1/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "BlueMap - A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)", - "pack_format": 8 - } -} diff --git a/implementations/forge-1.19.4/build.gradle b/implementations/forge-1.19.4/build.gradle deleted file mode 100644 index 1b827838..00000000 --- a/implementations/forge-1.19.4/build.gradle +++ /dev/null @@ -1,207 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true - } -} - -plugins { - id "java" - id "java-library" - id "com.diffplug.spotless" version "6.1.2" - id "com.github.node-gradle.node" version "3.0.1" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -apply plugin: "net.minecraftforge.gradle" - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -archivesBaseName = 'bluemap' - -def javaTarget = 17 -java { - toolchain.languageVersion = JavaLanguageVersion.of(javaTarget) -} - -minecraft { - mappings channel: 'official', version: '1.19.4' - - runs { - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - bluemap { - source sourceSets.main - } - } - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.19.4-45.0.1' - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -jar { - manifest { - attributes([ - "Specification-Title" : "bluemap", - "Specification-Vendor" : "bluemap", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "bluemap", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -jar.finalizedBy('reobfJar') - -tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" -} - -tasks.withType(AbstractArchiveTask).configureEach { - setReproducibleFileOrder(true) - setPreserveFileTimestamps(false) -} - -test { - useJUnitPlatform() -} - -shadowJar { - def version = System.getProperty("bluemap.version") ?: "" // set by BlueMapCore - 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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info','META-INF/mods.toml' - duplicatesStrategy = DuplicatesStrategy.WARN - - expand ( - version: project.version - ) - } -} - -afterEvaluate { - reobf { - shadowJar { - mappings = createMcpToSrg.output - } - } -} - -task release { - dependsOn(build) -} - -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 - gameVersions = ["1.19.4"] -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .getText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion "Forge" - - addGameVersion "Java 18" - addGameVersion "Java 17" - - addGameVersion "1.19.4" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/forge-1.19.4/settings.gradle.kts b/implementations/forge-1.19.4/settings.gradle.kts deleted file mode 100644 index 6e12567e..00000000 --- a/implementations/forge-1.19.4/settings.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -rootProject.name = "forge-1.19.4" - -includeBuild("../../BlueMapCommon") - diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java deleted file mode 100644 index 9487201e..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; - -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() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java deleted file mode 100644 index f4311881..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -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); - - MinecraftForge.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(PlayerLoggedInEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - @SubscribeEvent - public synchronized void onPlayerLeave(PlayerLoggedOutEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java deleted file mode 100644 index c774f3db..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * 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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.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 Server { - - 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("forge-1.19.4", this); - - this.eventForwarder = new ForgeEventForwarder(); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(ForgeWorld::new); - - MinecraftForge.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(ServerTickEvent evt) { - updateSomePlayers(); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getCurrentVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (ServerLevel serverWorld : serverInstance.getAllLevels()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object 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(getServerWorld((ServerLevel) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(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(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(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(); - } - - /** - * 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/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java deleted file mode 100644 index 64853c62..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -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.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 ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - 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 ServerWorld 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 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) return; - - ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) 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()); - - 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.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.SKY).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); - this.blockLight = player.getLevel().getChunkSource().getLightEngine().getLayerListener(LightLayer.BLOCK).getLightValue(new BlockPos(player.getBlockX(), player.getBlockY(), player.getBlockZ())); - - this.world = mod.getServerWorld(player.getLevel()); - } - -} diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java deleted file mode 100644 index dc2284be..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -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 worldFolder; - private final Key dimension; - - public ForgeWorld(ServerLevel delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getServerDirectory().toPath() - .resolve(server.getWorldPath(LevelResource.ROOT)); - - ResourceLocation id = delegate.dimension().location(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ForgeWorld that = (ForgeWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java deleted file mode 100644 index a77265e0..00000000 --- a/implementations/forge-1.19.4/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/forge-1.19.4/src/main/resources/META-INF/mods.toml b/implementations/forge-1.19.4/src/main/resources/META-INF/mods.toml deleted file mode 100644 index cf227512..00000000 --- a/implementations/forge-1.19.4/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,26 +0,0 @@ -modLoader="javafml" -loaderVersion="[44,)" -license="MIT" -issueTrackerURL="https://github.com/BlueMap-Minecraft/BlueMap/issues" -[[mods]] -modId="bluemap" -version="${version}" -displayName="BlueMap" -displayURL="https://github.com/BlueMap-Minecraft/BlueMap" -authors="Blue (TBlueF, Lukas Rieger)" -description=''' -A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) -''' - -[[dependencies.bluemap]] - modId="forge" - mandatory=true - versionRange="[44,)" - ordering="NONE" - side="SERVER" -[[dependencies.bluemap]] - modId="minecraft" - mandatory=true - versionRange="[1.19.3,)" - ordering="NONE" - side="SERVER" diff --git a/implementations/forge-1.19.4/src/main/resources/pack.mcmeta b/implementations/forge-1.19.4/src/main/resources/pack.mcmeta deleted file mode 100644 index 0f95ce1c..00000000 --- a/implementations/forge-1.19.4/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "BlueMap - A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)", - "pack_format": 8 - } -} diff --git a/implementations/forge-1.20.6/build.gradle b/implementations/forge-1.20.6/build.gradle deleted file mode 100644 index bfb6604c..00000000 --- a/implementations/forge-1.20.6/build.gradle +++ /dev/null @@ -1,195 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '[6.0.24,6.2)', changing: true - } -} - -plugins { - id "java" - id "java-library" - id "com.diffplug.spotless" version "6.1.2" - id "com.github.node-gradle.node" version "3.0.1" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -apply plugin: "net.minecraftforge.gradle" - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -archivesBaseName = 'bluemap' - -java.toolchain.languageVersion = JavaLanguageVersion.of(21) - -minecraft { - mappings channel: 'official', version: '1.20.6' - - reobf = false - - runs { - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - bluemap { - source sourceSets.main - } - } - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.20.6-50.0.13' - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -jar { - manifest { - attributes([ - "Specification-Title" : "bluemap", - "Specification-Vendor" : "bluemap", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "bluemap", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" -} - -tasks.withType(AbstractArchiveTask).configureEach { - setReproducibleFileOrder(true) - setPreserveFileTimestamps(false) -} - -test { - useJUnitPlatform() -} - -shadowJar { - def version = System.getProperty("bluemap.version") ?: "" // set by BlueMapCore - 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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info','META-INF/mods.toml' - duplicatesStrategy = DuplicatesStrategy.WARN - - expand ( - version: project.version - ) - } -} - -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 - gameVersions = ["1.20.6"] -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .getText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion "Forge" - - addGameVersion "Java 21" - - addGameVersion "1.20.6" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/forge-1.20.6/settings.gradle.kts b/implementations/forge-1.20.6/settings.gradle.kts deleted file mode 100644 index 7425b900..00000000 --- a/implementations/forge-1.20.6/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "forge-1.20.6" - -includeBuild("../../BlueMapCommon") diff --git a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java deleted file mode 100644 index 6c4cce31..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; - -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(), delegate.registryAccess()); - 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() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java deleted file mode 100644 index f4311881..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -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); - - MinecraftForge.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(PlayerLoggedInEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - @SubscribeEvent - public synchronized void onPlayerLeave(PlayerLoggedOutEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java deleted file mode 100644 index 2a3277f1..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * 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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -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 Server { - - 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("forge", this); - - this.eventForwarder = new ForgeEventForwarder(); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(ForgeWorld::new); - - MinecraftForge.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( - () -> IExtensionPoint.DisplayTest.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(ServerTickEvent evt) { - updateSomePlayers(); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getCurrentVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (ServerLevel serverWorld : serverInstance.getAllLevels()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object 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(getServerWorld((ServerLevel) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(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(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(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(); - } - - /** - * 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/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java deleted file mode 100644 index e90501b3..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -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.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 ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - 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 ServerWorld 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 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) return; - - ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) 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()); - - 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())); - - this.world = mod.getServerWorld(player.serverLevel()); - } - -} diff --git a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java deleted file mode 100644 index dc2284be..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -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 worldFolder; - private final Key dimension; - - public ForgeWorld(ServerLevel delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getServerDirectory().toPath() - .resolve(server.getWorldPath(LevelResource.ROOT)); - - ResourceLocation id = delegate.dimension().location(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ForgeWorld that = (ForgeWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java deleted file mode 100644 index a77265e0..00000000 --- a/implementations/forge-1.20.6/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/forge-1.20.6/src/main/resources/META-INF/mods.toml b/implementations/forge-1.20.6/src/main/resources/META-INF/mods.toml deleted file mode 100644 index e5f5a4cb..00000000 --- a/implementations/forge-1.20.6/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,26 +0,0 @@ -modLoader="javafml" -loaderVersion="[44,)" -license="MIT" -issueTrackerURL="https://github.com/BlueMap-Minecraft/BlueMap/issues" -[[mods]] -modId="bluemap" -version="${version}" -displayName="BlueMap" -displayURL="https://github.com/BlueMap-Minecraft/BlueMap" -authors="Blue (TBlueF, Lukas Rieger)" -description=''' -A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) -''' - -[[dependencies.bluemap]] - modId="forge" - mandatory=true - versionRange="[50,)" - ordering="NONE" - side="SERVER" -[[dependencies.bluemap]] - modId="minecraft" - mandatory=true - versionRange="[1.20.6,)" - ordering="NONE" - side="SERVER" diff --git a/implementations/forge-1.20.6/src/main/resources/pack.mcmeta b/implementations/forge-1.20.6/src/main/resources/pack.mcmeta deleted file mode 100644 index 0f95ce1c..00000000 --- a/implementations/forge-1.20.6/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "BlueMap - A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)", - "pack_format": 8 - } -} diff --git a/implementations/forge-1.20/build.gradle b/implementations/forge-1.20/build.gradle deleted file mode 100644 index d538fcbd..00000000 --- a/implementations/forge-1.20/build.gradle +++ /dev/null @@ -1,211 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '6.0.+', changing: true - } -} - -plugins { - id "java" - id "java-library" - id "com.diffplug.spotless" version "6.1.2" - id "com.github.node-gradle.node" version "3.0.1" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -apply plugin: "net.minecraftforge.gradle" - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -archivesBaseName = 'bluemap' - -def javaTarget = 17 -java { - toolchain.languageVersion = JavaLanguageVersion.of(javaTarget) -} - -minecraft { - mappings channel: 'official', version: '1.20' - - runs { - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - bluemap { - source sourceSets.main - } - } - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.20-46.0.1' - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -jar { - manifest { - attributes([ - "Specification-Title" : "bluemap", - "Specification-Vendor" : "bluemap", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "bluemap", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -jar.finalizedBy('reobfJar') - -tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" -} - -tasks.withType(AbstractArchiveTask).configureEach { - setReproducibleFileOrder(true) - setPreserveFileTimestamps(false) -} - -test { - useJUnitPlatform() -} - -shadowJar { - def version = System.getProperty("bluemap.version") ?: "" // set by BlueMapCore - 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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info','META-INF/mods.toml' - duplicatesStrategy = DuplicatesStrategy.WARN - - expand ( - version: project.version - ) - } -} - -afterEvaluate { - reobf { - shadowJar { - mappings = createMcpToSrg.output - } - } -} - -task release { - dependsOn(build) -} - -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 - gameVersions = ["1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4"] -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .getText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion "Forge" - - addGameVersion "Java 18" - addGameVersion "Java 17" - - addGameVersion "1.20" - addGameVersion "1.20.1" - addGameVersion "1.20.2" - addGameVersion "1.20.3" - addGameVersion "1.20.4" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/forge-1.20/settings.gradle.kts b/implementations/forge-1.20/settings.gradle.kts deleted file mode 100644 index 117c36b5..00000000 --- a/implementations/forge-1.20/settings.gradle.kts +++ /dev/null @@ -1,4 +0,0 @@ -rootProject.name = "forge-1.20" - -includeBuild("../../BlueMapCommon") - diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java deleted file mode 100644 index 64428e6f..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeCommandSource.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.world.World; -import net.minecraft.commands.CommandSourceStack; -import net.minecraft.network.chat.Component; - -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() { - ServerWorld serverWorld = mod.getServerWorld(delegate.getLevel()); - return Optional.ofNullable(plugin.getWorld(serverWorld)); - } - -} diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java deleted file mode 100644 index f4311881..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeEventForwarder.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -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); - - MinecraftForge.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(PlayerLoggedInEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerJoin(uuid); - } - - @SubscribeEvent - public synchronized void onPlayerLeave(PlayerLoggedOutEvent evt) { - UUID uuid = evt.getEntity().getUUID(); - for (ServerEventListener listener : eventListeners) listener.onPlayerLeave(uuid); - } - -} diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java deleted file mode 100644 index 77ed826e..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeMod.java +++ /dev/null @@ -1,257 +0,0 @@ -/* - * 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.Server; -import de.bluecolored.bluemap.common.serverinterface.ServerEventListener; -import de.bluecolored.bluemap.common.serverinterface.ServerWorld; -import de.bluecolored.bluemap.core.BlueMap; -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.minecraftforge.common.MinecraftForge; -import net.minecraftforge.event.RegisterCommandsEvent; -import net.minecraftforge.event.TickEvent.ServerTickEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedInEvent; -import net.minecraftforge.event.entity.player.PlayerEvent.PlayerLoggedOutEvent; -import net.minecraftforge.event.server.ServerStartedEvent; -import net.minecraftforge.event.server.ServerStartingEvent; -import net.minecraftforge.event.server.ServerStoppingEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.IExtensionPoint; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.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 Server { - - 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("forge-1.20", this); - - this.eventForwarder = new ForgeEventForwarder(); - this.worlds = Caffeine.newBuilder() - .executor(BlueMap.THREAD_POOL) - .weakKeys() - .maximumSize(1000) - .build(ForgeWorld::new); - - MinecraftForge.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(ServerTickEvent evt) { - updateSomePlayers(); - } - - @Override - public String getMinecraftVersion() { - return SharedConstants.getCurrentVersion().getId(); - } - - @Override - public void registerListener(ServerEventListener listener) { - eventForwarder.addEventListener(listener); - } - - @Override - public void unregisterAllListeners() { - eventForwarder.removeAllListeners(); - } - - @Override - public Collection getLoadedServerWorlds() { - Collection loadedWorlds = new ArrayList<>(3); - for (ServerLevel serverWorld : serverInstance.getAllLevels()) { - loadedWorlds.add(worlds.get(serverWorld)); - } - return loadedWorlds; - } - - @SuppressWarnings("unchecked") - @Override - public Optional getServerWorld(Object 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(getServerWorld((ServerLevel) world)); - - return Optional.empty(); - } - - public ServerWorld getServerWorld(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(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(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(); - } - - /** - * 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/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java deleted file mode 100644 index e90501b3..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgePlayer.java +++ /dev/null @@ -1,154 +0,0 @@ -/* - * 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 de.bluecolored.bluemap.common.serverinterface.ServerWorld; -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.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 ServerWorld world; - private Vector3d position; - private Vector3d rotation; - private int skyLight; - private int blockLight; - 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 ServerWorld 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 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) return; - - ServerPlayer player = server.getPlayerList().getPlayer(uuid); - if (player == null) 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()); - - 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())); - - this.world = mod.getServerWorld(player.serverLevel()); - } - -} diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java deleted file mode 100644 index dc2284be..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/ForgeWorld.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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.ServerWorld; -import de.bluecolored.bluemap.core.util.Key; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -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 worldFolder; - private final Key dimension; - - public ForgeWorld(ServerLevel delegate) { - this.delegate = new WeakReference<>(delegate); - - MinecraftServer server = delegate.getServer(); - this.worldFolder = delegate.getServer().getServerDirectory().toPath() - .resolve(server.getWorldPath(LevelResource.ROOT)); - - ResourceLocation id = delegate.dimension().location(); - this.dimension = new Key(id.getNamespace(), id.getPath()); - } - - @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 getWorldFolder() { - return worldFolder; - } - - @Override - public Key getDimension() { - return dimension; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - ForgeWorld that = (ForgeWorld) o; - Object world = delegate.get(); - return world != null && world.equals(that.delegate.get()); - } - - @Override - public int hashCode() { - Object world = delegate.get(); - return world != null ? world.hashCode() : 0; - } - -} diff --git a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java b/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java deleted file mode 100644 index a77265e0..00000000 --- a/implementations/forge-1.20/src/main/java/de/bluecolored/bluemap/forge/Log4jLogger.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 org.apache.logging.log4j.Logger; - -import de.bluecolored.bluemap.core.logger.AbstractLogger; - -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/forge-1.20/src/main/resources/META-INF/mods.toml b/implementations/forge-1.20/src/main/resources/META-INF/mods.toml deleted file mode 100644 index cf227512..00000000 --- a/implementations/forge-1.20/src/main/resources/META-INF/mods.toml +++ /dev/null @@ -1,26 +0,0 @@ -modLoader="javafml" -loaderVersion="[44,)" -license="MIT" -issueTrackerURL="https://github.com/BlueMap-Minecraft/BlueMap/issues" -[[mods]] -modId="bluemap" -version="${version}" -displayName="BlueMap" -displayURL="https://github.com/BlueMap-Minecraft/BlueMap" -authors="Blue (TBlueF, Lukas Rieger)" -description=''' -A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) -''' - -[[dependencies.bluemap]] - modId="forge" - mandatory=true - versionRange="[44,)" - ordering="NONE" - side="SERVER" -[[dependencies.bluemap]] - modId="minecraft" - mandatory=true - versionRange="[1.19.3,)" - ordering="NONE" - side="SERVER" diff --git a/implementations/forge-1.20/src/main/resources/pack.mcmeta b/implementations/forge-1.20/src/main/resources/pack.mcmeta deleted file mode 100644 index 0f95ce1c..00000000 --- a/implementations/forge-1.20/src/main/resources/pack.mcmeta +++ /dev/null @@ -1,6 +0,0 @@ -{ - "pack": { - "description": "BlueMap - A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)", - "pack_format": 8 - } -} diff --git a/implementations/forge/build.gradle b/implementations/forge/build.gradle deleted file mode 100644 index 9b020e78..00000000 --- a/implementations/forge/build.gradle +++ /dev/null @@ -1,195 +0,0 @@ -buildscript { - repositories { - // These repositories are only for Gradle plugins, put any other repositories in the repository block further below - maven { url = 'https://maven.minecraftforge.net' } - mavenCentral() - } - dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '[6.0.24,6.2)', changing: true - } -} - -plugins { - id "java" - id "java-library" - id "com.diffplug.spotless" version "6.1.2" - id "com.github.node-gradle.node" version "3.0.1" - id "com.github.johnrengelman.shadow" version "8.1.1" - id "com.modrinth.minotaur" version "2.+" - id "com.matthewprenger.cursegradle" version "1.4.0" -} - -apply plugin: "net.minecraftforge.gradle" - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore -archivesBaseName = 'bluemap' - -java.toolchain.languageVersion = JavaLanguageVersion.of(21) - -minecraft { - mappings channel: 'official', version: '1.21' - - reobf = false - - runs { - server { - workingDirectory project.file('run') - property 'forge.logging.markers', 'REGISTRIES' - property 'forge.logging.console.level', 'debug' - - mods { - bluemap { - source sourceSets.main - } - } - } - } -} - -sourceSets.main.resources { srcDir 'src/generated/resources' } - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - minecraft 'net.minecraftforge:forge:1.21-51.0.1' - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -jar { - manifest { - attributes([ - "Specification-Title" : "bluemap", - "Specification-Vendor" : "bluemap", - "Specification-Version" : "1", // We are version 1 of ourselves - "Implementation-Title" : project.name, - "Implementation-Version" : project.jar.archiveVersion, - "Implementation-Vendor" : "bluemap", - "Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ") - ]) - } -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = "utf-8" -} - -tasks.withType(AbstractArchiveTask).configureEach { - setReproducibleFileOrder(true) - setPreserveFileTimestamps(false) -} - -test { - useJUnitPlatform() -} - -shadowJar { - def version = System.getProperty("bluemap.version") ?: "" // set by BlueMapCore - 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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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") -} - -processResources { - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info','META-INF/mods.toml' - duplicatesStrategy = DuplicatesStrategy.WARN - - expand ( - version: project.version - ) - } -} - -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 - gameVersions = ["1.21"] -} - -curseforge { - apiKey = System.getenv("CURSEFORGE_TOKEN") ?: "" - project { - id = "406463" - changelogType = "markdown" - changelog = file("../../release.md") - .getText() - .replace("{version}", project.version.toString()) - releaseType = "release" - - addGameVersion "Forge" - - addGameVersion "Java 21" - - addGameVersion "1.21" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/forge/build.gradle.kts b/implementations/forge/build.gradle.kts new file mode 100644 index 00000000..50d02a50 --- /dev/null +++ b/implementations/forge/build.gradle.kts @@ -0,0 +1,115 @@ +plugins { + bluemap.implementation + bluemap.modrinth + bluemap.curseforge + alias ( libs.plugins.forgegradle ) +} + +val supportedMinecraftVersions = listOf( + "1.21" +) + +val minecraftVersion = supportedMinecraftVersions.first() +val forgeVersion = "51.0.1" + +val shadowInclude: Configuration by configurations.creating +configurations.api.get().extendsFrom(shadowInclude) +jarJar.enable() + +dependencies { + + shadowInclude ( project( ":common" ) ) { + exclude ( group = "com.google.code.gson", module = "gson" ) + exclude ( group = "com.mojang", module = "brigadier" ) + } + + minecraft ( "net.minecraftforge", "forge", "$minecraftVersion-$forgeVersion" ) + + jarJar ( libs.flow.math.get().group, libs.flow.math.get().name , "[${libs.flow.math.get().version},)" ) + +} + +minecraft { + mappings( "official", minecraftVersion ) + reobf = false +} + +tasks.shadowJar { + configurations = listOf(shadowInclude) + + // exclude jarInJar + dependencies { + exclude( dependency ( libs.flow.math.get() ) ) + } + + // airlift + relocate ("io.airlift", "de.bluecolored.shadow.airlift") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") + +} + +tasks.jarJar.configure { + archiveFileName = "${project.name}-${project.version}-jarjar.jar" +} + +tasks.withType(ProcessResources::class).configureEach { + val replacements = mapOf( + "version" to project.version, + "minecraft_version" to minecraftVersion, + "forge_version" to forgeVersion, + ) + inputs.properties(replacements) + filesMatching(listOf( + "META-INF/mods.toml", + "pack.mcmeta" + )) { expand(replacements) } +} + +val mergeShadowAndJarJar = tasks.create("mergeShadowAndJarJar") { + dependsOn( tasks.shadowJar, tasks.jarJar ) + from ( + zipTree( tasks.shadowJar.map { it.outputs.files.singleFile } ), + zipTree( tasks.jarJar.map { it.outputs.files.singleFile } ).matching { + include("META-INF/jarjar/**") + } + ) + archiveFileName = "${project.name}-${project.version}-merged.jar" +} + +tasks.getByName("release") { + dependsOn( mergeShadowAndJarJar ) + inputFile = mergeShadowAndJarJar.outputs.files.singleFile +} + +modrinth { + gameVersions.addAll(supportedMinecraftVersions) +} + +curseforgeBlueMap { + addGameVersion("Forge") + addGameVersion("Java ${java.toolchain.languageVersion.get()}") + supportedMinecraftVersions.forEach { + addGameVersion(it) + } +} diff --git a/implementations/forge/settings.gradle.kts b/implementations/forge/settings.gradle.kts deleted file mode 100644 index 768bb058..00000000 --- a/implementations/forge/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "forge" - -includeBuild("../../BlueMapCommon") diff --git a/implementations/forge/src/main/resources/META-INF/mods.toml b/implementations/forge/src/main/resources/META-INF/mods.toml index e5f5a4cb..d511ce52 100644 --- a/implementations/forge/src/main/resources/META-INF/mods.toml +++ b/implementations/forge/src/main/resources/META-INF/mods.toml @@ -1,26 +1,25 @@ modLoader="javafml" -loaderVersion="[44,)" +loaderVersion="[0,)" license="MIT" issueTrackerURL="https://github.com/BlueMap-Minecraft/BlueMap/issues" + [[mods]] modId="bluemap" version="${version}" displayName="BlueMap" displayURL="https://github.com/BlueMap-Minecraft/BlueMap" authors="Blue (TBlueF, Lukas Rieger)" -description=''' -A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL) -''' +description="A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)" [[dependencies.bluemap]] modId="forge" mandatory=true - versionRange="[50,)" + versionRange="[${forge_version},)" ordering="NONE" side="SERVER" [[dependencies.bluemap]] modId="minecraft" mandatory=true - versionRange="[1.20.6,)" + versionRange="[${minecraft_version},)" ordering="NONE" side="SERVER" diff --git a/implementations/neoforge/build.gradle b/implementations/neoforge/build.gradle deleted file mode 100644 index e8fd2e96..00000000 --- a/implementations/neoforge/build.gradle +++ /dev/null @@ -1,161 +0,0 @@ -plugins { - id "java" - id "java-library" - id "net.neoforged.gradle.userdev" version '7.0.142' - 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 "8.1.1" -} - -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -repositories { - mavenCentral() - maven { url = "https://libraries.minecraft.net" } - maven { url = "https://repo.bluecolored.de/releases" } -} - -base { - archivesName = "bluemap" -} - -java.toolchain.languageVersion = JavaLanguageVersion.of(21) -sourceSets.main.resources { srcDir 'src/generated/resources' } - -configurations { - implementation.extendsFrom(shadowInclude) -} - -dependencies { - implementation "net.neoforged:neoforge:${neo_version}" - - shadowInclude ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by forge - exclude (group: "com.google.guava", module: "guava") - exclude (group: "com.google.code.gson", module: "gson") - 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/neoforge.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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") - - 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.21"] -} - -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 21" - - addGameVersion "1.21" - - mainArtifact shadowJar - } - options { - javaVersionAutoDetect = false - javaIntegration = false - forgeGradleIntegration = false - } -} - -task publish { - dependsOn(tasks.findByName("modrinth")) - dependsOn(tasks.findByName("curseforge")) -} diff --git a/implementations/neoforge/build.gradle.kts b/implementations/neoforge/build.gradle.kts new file mode 100644 index 00000000..bcfbcb02 --- /dev/null +++ b/implementations/neoforge/build.gradle.kts @@ -0,0 +1,106 @@ +plugins { + bluemap.implementation + bluemap.modrinth + bluemap.curseforge + alias ( libs.plugins.neoforge.gradle ) +} + +val supportedMinecraftVersions = listOf( + "1.21" +) + +val minecraftVersion = supportedMinecraftVersions.first() +val neoVersion = "21.0.0-beta" +val loaderVersion = "4" + +val shadowInclude: Configuration by configurations.creating +configurations.api.get().extendsFrom(shadowInclude) + +neoForge { + version = neoVersion +} + +dependencies { + shadowInclude ( project( ":common" ) ) { + exclude ( group = "com.google.code.gson", module = "gson" ) + exclude ( group = "com.mojang", module = "brigadier" ) + } + + jarJar ( libs.flow.math.get().group, libs.flow.math.get().name , "[${libs.flow.math.get().version},)" ) +} + +tasks.shadowJar { + configurations = listOf(shadowInclude) + + // exclude jarInJar + dependencies { + exclude( dependency ( libs.flow.math.get() ) ) + } + + // airlift + relocate ("io.airlift", "de.bluecolored.shadow.airlift") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") + +} + +tasks.withType(ProcessResources::class).configureEach { + val replacements = mapOf( + "version" to project.version, + "minecraft_version" to minecraftVersion, + "neo_version" to neoVersion, + "loader_version" to loaderVersion, + ) + inputs.properties(replacements) + filesMatching(listOf( + "META-INF/neoforge.mods.toml", + "pack.mcmeta" + )) { expand(replacements) } +} + +val mergeShadowAndJarJar = tasks.create("mergeShadowAndJarJar") { + dependsOn( tasks.shadowJar, tasks.jarJar ) + from ( + zipTree( tasks.shadowJar.map { it.outputs.files.singleFile } ), + tasks.jarJar.map { it.outputs.files } + ) + archiveFileName = "${project.name}-${project.version}-merged.jar" +} + +tasks.getByName("release") { + dependsOn( mergeShadowAndJarJar ) + inputFile = mergeShadowAndJarJar.outputs.files.singleFile +} + +modrinth { + loaders.addAll("neoforge") + gameVersions.addAll(supportedMinecraftVersions) +} + +curseforgeBlueMap { + addGameVersion("NeoForge") + addGameVersion("Java ${java.toolchain.languageVersion.get()}") + supportedMinecraftVersions.forEach { + addGameVersion(it) + } +} diff --git a/implementations/neoforge/gradle.properties b/implementations/neoforge/gradle.properties deleted file mode 100644 index 07c1fb5d..00000000 --- a/implementations/neoforge/gradle.properties +++ /dev/null @@ -1,17 +0,0 @@ -org.gradle.daemon=false -org.gradle.debug=false - -neogradle.subsystems.parchment.minecraftVersion=1.20.6 -neogradle.subsystems.parchment.mappingsVersion=2024.05.01 - -minecraft_version=1.21 -minecraft_version_range=[1.21,) -neo_version=21.0.0-beta -neo_version_range=[21.0.0-beta,) -loader_version_range=[4,) - -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/settings.gradle b/implementations/neoforge/settings.gradle deleted file mode 100644 index 8a668861..00000000 --- a/implementations/neoforge/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -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" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/neoforge/src/main/resources/META-INF/neoforge.mods.toml b/implementations/neoforge/src/main/resources/META-INF/neoforge.mods.toml index f8f61f84..019a2026 100644 --- a/implementations/neoforge/src/main/resources/META-INF/neoforge.mods.toml +++ b/implementations/neoforge/src/main/resources/META-INF/neoforge.mods.toml @@ -1,23 +1,23 @@ modLoader="javafml" -loaderVersion="${loader_version_range}" -license="${mod_license}" +loaderVersion="[${loader_version},)" +license="MIT" [[mods]] -modId="${mod_id}" -version="${mod_version}" -displayName="${mod_name}" -description='''${mod_description}''' +modId="bluemap" +version="${version}" +displayName="BlueMap" +description='''A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)''' displayTest="IGNORE_SERVER_VERSION" -[[dependencies.${mod_id}]] #optional +[[dependencies.bluemap]] modId="neoforge" mandatory=true - versionRange="${neo_version_range}" + versionRange="[${neo_version},)" ordering="NONE" side="BOTH" -[[dependencies.${mod_id}]] +[[dependencies.bluemap]] modId="minecraft" mandatory=true - versionRange="${minecraft_version_range}" + versionRange="[${minecraft_version},)" ordering="NONE" side="BOTH" diff --git a/implementations/neoforge/src/main/resources/pack.mcmeta b/implementations/neoforge/src/main/resources/pack.mcmeta index 59c52402..666ca24e 100644 --- a/implementations/neoforge/src/main/resources/pack.mcmeta +++ b/implementations/neoforge/src/main/resources/pack.mcmeta @@ -1,8 +1,8 @@ { "pack": { "description": { - "text": "${mod_id} resources" + "text": "bluemap resources" }, - "pack_format": ${pack_format_number} + "pack_format": 18 } } diff --git a/implementations/paper/build.gradle.kts b/implementations/paper/build.gradle.kts index 849c876c..0285a004 100644 --- a/implementations/paper/build.gradle.kts +++ b/implementations/paper/build.gradle.kts @@ -1,150 +1,85 @@ plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("com.modrinth.minotaur") version "2.+" - id ("io.papermc.hangar-publish-plugin") version "0.1.2" + bluemap.implementation + bluemap.modrinth + bluemap.hangar } -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore +val supportedMinecraftVersions = listOf( + "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6", + "1.21" +) -val javaTarget = 17 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://repo.papermc.io/repository/maven-public/") - maven ("https://repo.bluecolored.de/releases") -} +val minecraftVersion = supportedMinecraftVersions.first() +val paperVersion = "${minecraftVersion}-R0.1-SNAPSHOT" dependencies { - api ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by bukkit - exclude( group = "com.google.guava", module = "guava" ) - exclude( group = "com.google.code.gson", module = "gson" ) - } + api ( project( ":common" ) ) { + exclude( group = "com.google.code.gson", module = "gson" ) + } - shadow ("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT") - implementation ("org.bstats:bstats-bukkit:2.2.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - from("src/main/resources") { - include("plugin.yml") - duplicatesStrategy = DuplicatesStrategy.INCLUDE - - expand ( - "version" to project.version - ) - } + shadow ( "io.papermc.paper", "paper-api", paperVersion ) + api ( libs.bstats.bukkit ) } tasks.shadowJar { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - //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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") - relocate ("org.bstats", "de.bluecolored.shadow.bstats") - relocate ("com.mojang.brigadier", "de.bluecolored.shadow.mojang.brigadier") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") + // exclude libraries added via plugin.yml + dependencies { + exclude( dependency ( libs.flow.math.get() ) ) + } - relocate ("com.google.errorprone", "de.bluecolored.shadow.google.errorprone") - relocate ("com.google.inject", "de.bluecolored.shadow.google.inject") + // airlift + relocate ("io.airlift", "de.bluecolored.shadow.airlift") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // brigadier + relocate ("com.mojang.brigadier", "de.bluecolored.shadow.brigadier") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") - 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") } -tasks.register("release") { - dependsOn(tasks.shadowJar) +tasks.processResources { + from("src/main/resources") { + include("plugin.yml") + duplicatesStrategy = DuplicatesStrategy.INCLUDE + + expand ( + "version" to project.version, + "api_version" to minecraftVersion, + "flow_math_version" to libs.flow.math.get().version + ) + } } modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("shadowJar")) - loaders.addAll("paper","purpur","folia") - gameVersions.addAll( - "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6", - "1.21" - ) + loaders.addAll("paper", "purpur", "folia") + gameVersions.addAll(supportedMinecraftVersions) } hangarPublish { - publications.register("plugin") { - version.set(project.version as String) - id.set("BlueMap") - channel.set("Release") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - - apiKey.set(System.getenv("HANGAR_TOKEN")) - - // register platforms - platforms { - 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.4", "1.20.5", "1.20.6", - "1.21" - )) - } - } - } -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("publishPluginPublicationToHangar") + publications.named("bluemap") { + platforms.paper { + platformVersions = supportedMinecraftVersions + } + } } diff --git a/implementations/paper/settings.gradle.kts b/implementations/paper/settings.gradle.kts deleted file mode 100644 index 0f0bc513..00000000 --- a/implementations/paper/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "paper" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/paper/src/main/resources/plugin.yml b/implementations/paper/src/main/resources/plugin.yml index 1c060336..41a7a2fb 100644 --- a/implementations/paper/src/main/resources/plugin.yml +++ b/implementations/paper/src/main/resources/plugin.yml @@ -2,46 +2,10 @@ name: BlueMap description: "A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)" main: de.bluecolored.bluemap.bukkit.BukkitPlugin version: "${version}" -api-version: 1.19 +api-version: "${api_version}" folia-supported: true author: "Blue (TBlueF / Lukas Rieger)" website: "https://github.com/BlueMap-Minecraft" -commands: -permissions: - bluemap.*: - children: - bluemap.status: true - bluemap.version: true - bluemap.help: true - bluemap.reload: true - bluemap.stop: true - bluemap.start: true - bluemap.freeze: true - bluemap.purge: true - bluemap.marker: true - bluemap.update: true - bluemap.debug: true - default: op - bluemap.status: - default: op - bluemap.version: - default: op - bluemap.help: - default: op - bluemap.reload: - default: op - bluemap.stop: - default: op - bluemap.start: - default: op - bluemap.freeze: - default: op - bluemap.purge: - default: op - bluemap.marker: - default: op - bluemap.update: - default: op - bluemap.debug: - default: op \ No newline at end of file +libraries: + - "com.flowpowered:flow-math:${flow_math_version}" diff --git a/implementations/spigot/build.gradle.kts b/implementations/spigot/build.gradle.kts index f98b7123..89cf2f53 100644 --- a/implementations/spigot/build.gradle.kts +++ b/implementations/spigot/build.gradle.kts @@ -1,132 +1,74 @@ plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("com.modrinth.minotaur") version "2.+" + bluemap.implementation + bluemap.modrinth } -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore +val supportedMinecraftVersions = listOf( + "1.16.5", + "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.4", "1.20.5", "1.20.6", + "1.21" +) -val javaTarget = 16 -java { - sourceCompatibility = JavaVersion.toVersion(javaTarget) - targetCompatibility = JavaVersion.toVersion(javaTarget) -} - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") { - content { - includeGroup ("org.spigotmc") - } - } - maven ("https://repo.bluecolored.de/releases") -} +val apiVersion = "1.16" +val spigotVersion = "1.16.5-R0.1-SNAPSHOT" dependencies { - api ("de.bluecolored.bluemap:BlueMapCommon") { - //exclude dependencies provided by bukkit - exclude( group = "com.google.guava", module = "guava" ) - exclude( group = "com.google.code.gson", module = "gson" ) - } + api ( project( ":common" ) ) { + exclude( group = "com.google.code.gson", module = "gson" ) + } - shadow ("org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT") - implementation ("org.bstats:bstats-bukkit:2.2.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - from("src/main/resources") { - include("plugin.yml") - duplicatesStrategy = DuplicatesStrategy.INCLUDE - - expand ( - "version" to project.version - ) - } + shadow ( "org.spigotmc", "spigot-api", spigotVersion ) + api ( libs.bstats.bukkit ) } tasks.shadowJar { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - //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 ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") - relocate ("org.bstats", "de.bluecolored.shadow.bstats") - relocate ("com.mojang.brigadier", "de.bluecolored.shadow.mojang.brigadier") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") + // airlift + 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") + // brigadier + relocate ("com.mojang.brigadier", "de.bluecolored.shadow.brigadier") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") - 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") } -tasks.register("release") { - dependsOn(tasks.shadowJar) +tasks.processResources { + from("src/main/resources") { + include("plugin.yml") + duplicatesStrategy = DuplicatesStrategy.INCLUDE + + expand ( + "version" to project.version, + "api_version" to apiVersion, + ) + } } modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("shadowJar")) - loaders.addAll("spigot", "paper", "purpur") - gameVersions.addAll( - "1.16.5", - "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.4", "1.20.5", "1.20.6", - "1.21" - ) -} - -tasks.register("publish") { - dependsOn("modrinth") + loaders.addAll("spigot", "paper", "purpur") + gameVersions.addAll(supportedMinecraftVersions) } diff --git a/implementations/spigot/settings.gradle.kts b/implementations/spigot/settings.gradle.kts deleted file mode 100644 index 72805d80..00000000 --- a/implementations/spigot/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "spigot" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/implementations/spigot/src/main/resources/plugin.yml b/implementations/spigot/src/main/resources/plugin.yml index 0111dc31..35aeb026 100644 --- a/implementations/spigot/src/main/resources/plugin.yml +++ b/implementations/spigot/src/main/resources/plugin.yml @@ -2,45 +2,6 @@ name: BlueMap description: "A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)" main: de.bluecolored.bluemap.bukkit.BukkitPlugin version: "${version}" -api-version: 1.16 +api-version: "${api_version}" author: "Blue (TBlueF / Lukas Rieger)" website: "https://github.com/BlueMap-Minecraft" -commands: - -permissions: - bluemap.*: - children: - bluemap.status: true - bluemap.version: true - bluemap.help: true - bluemap.reload: true - bluemap.stop: true - bluemap.start: true - bluemap.freeze: true - bluemap.purge: true - bluemap.marker: true - bluemap.update: true - bluemap.debug: true - default: op - bluemap.status: - default: op - bluemap.version: - default: op - bluemap.help: - default: op - bluemap.reload: - default: op - bluemap.stop: - default: op - bluemap.start: - default: op - bluemap.freeze: - default: op - bluemap.purge: - default: op - bluemap.marker: - default: op - bluemap.update: - default: op - bluemap.debug: - default: op \ No newline at end of file diff --git a/implementations/sponge/build.gradle.kts b/implementations/sponge/build.gradle.kts index 38473a12..cd6d60f6 100644 --- a/implementations/sponge/build.gradle.kts +++ b/implementations/sponge/build.gradle.kts @@ -1,153 +1,76 @@ import org.spongepowered.gradle.plugin.config.PluginLoaders plugins { - java - `java-library` - id("com.diffplug.spotless") version "6.1.2" - id ("com.github.node-gradle.node") version "3.0.1" - id ("com.github.johnrengelman.shadow") version "8.1.1" - id ("org.spongepowered.gradle.plugin") version "2.2.0" - id ("com.modrinth.minotaur") version "2.+" - id("org.spongepowered.gradle.ore") version "2.2.0" + bluemap.implementation + bluemap.modrinth + bluemap.ore + id ( libs.plugins.sponge.plugin.get().pluginId ) } -group = "de.bluecolored.bluemap" -version = System.getProperty("bluemap.version") ?: "?" // set by BlueMapCore - -java.toolchain.languageVersion = JavaLanguageVersion.of(21) - -repositories { - mavenCentral() - maven ("https://libraries.minecraft.net") - maven ("https://repo.bluecolored.de/releases") -} +val supportedMinecraftVersions = listOf( + "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6" +) dependencies { - api ("de.bluecolored.bluemap:BlueMapCommon"){ - //exclude dependencies provided by sponge - exclude( group = "com.google.guava", module = "guava" ) - exclude( group = "com.google.code.gson", module = "gson" ) - exclude( group = "javax.inject" ) - exclude( group = "com.google.inject" ) - } + api ( project( ":common" ) ) { + exclude( group = "com.google.code.gson", module = "gson" ) + } - implementation ("org.bstats:bstats-sponge:2.2.1") - - testImplementation ("org.junit.jupiter:junit-jupiter:5.8.2") - testRuntimeOnly ("org.junit.jupiter:junit-jupiter-engine:5.8.2") + api ( libs.bstats.sponge ) } sponge { - apiVersion("11.0.0") - license("MIT") - loader { - name(PluginLoaders.JAVA_PLAIN) - version("1.0") - } - plugin("bluemap") { - displayName("bluemap") - entrypoint("de.bluecolored.bluemap.sponge.SpongePlugin") - description("A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)") - contributor("Blue (TBlueF, Lukas Rieger)") { - description("Lead Developer") - } - dependency("spongeapi") { - optional(false) - } - } -} - -spotless { - java { - target ("src/*/java/**/*.java") - - licenseHeaderFile("../../HEADER") - indentWithSpaces() - trimTrailingWhitespace() - } -} - -tasks.withType(JavaCompile::class).configureEach { - options.apply { - encoding = "utf-8" - } -} - -tasks.withType(AbstractArchiveTask::class).configureEach { - isReproducibleFileOrder = true - isPreserveFileTimestamps = false -} - -tasks.test { - useJUnitPlatform() -} - -tasks.processResources { - from("src/main/resources") { - include("META-INF/plugins.json") - duplicatesStrategy = DuplicatesStrategy.INCLUDE - - expand ( - "version" to project.version - ) - } + apiVersion("11.0.0") + license("MIT") + loader { + name(PluginLoaders.JAVA_PLAIN) + version("1.0") + } + plugin("bluemap") { + displayName("bluemap") + entrypoint("de.bluecolored.bluemap.sponge.SpongePlugin") + description("A 3d-map of your Minecraft worlds view-able in your browser using three.js (WebGL)") + contributor("Blue (TBlueF, Lukas Rieger)") { + description("Lead Developer") + } + dependency("spongeapi") { + optional(false) + } + } } tasks.shadowJar { - destinationDirectory.set(file("../../build/release")) - archiveFileName.set("BlueMap-${project.version}-${project.name}.jar") - //relocate ("com.flowpowered.math", "de.bluecolored.shadow.flowpowered.math") //DON"T relocate this, because the API depends on it - relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") - relocate ("com.mojang.brigadier", "de.bluecolored.shadow.mojang.brigadier") - relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.benmanes.caffeine") - relocate ("com.google.errorprone", "de.bluecolored.shadow.google.errorprone") - relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") - relocate ("org.aopalliance", "de.bluecolored.shadow.aopalliance") - relocate ("org.bstats", "de.bluecolored.shadow.bstats") - relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") - 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 ("net.jpountz", "de.bluecolored.shadow.jpountz") + // airlift + relocate ("io.airlift", "de.bluecolored.shadow.airlift") - 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") -} + // brigadier + relocate ("com.mojang.brigadier", "de.bluecolored.shadow.brigadier") + + // bluenbt + relocate ("de.bluecolored.bluenbt", "de.bluecolored.shadow.bluenbt") + + // caffeine + relocate ("com.github.benmanes.caffeine", "de.bluecolored.shadow.caffeine") + relocate ("org.checkerframework", "de.bluecolored.shadow.checkerframework") + relocate ("com.google.errorprone", "de.bluecolored.shadow.errorprone") + + // dbcp2 + relocate ("org.apache.commons", "de.bluecolored.shadow.apache.commons") + + // configurate + relocate ("org.spongepowered.configurate", "de.bluecolored.shadow.configurate") + relocate ("com.typesafe.config", "de.bluecolored.shadow.typesafe.config") + relocate ("io.leangen.geantyref", "de.bluecolored.shadow.geantyref") + + // lz4 + relocate ("net.jpountz", "de.bluecolored.shadow.jpountz") + + // bstats + relocate ("org.bstats", "de.bluecolored.shadow.bstats") -tasks.register("release") { - dependsOn(tasks.shadowJar) } modrinth { - token.set(System.getenv("MODRINTH_TOKEN")) - projectId.set("swbUV1cr") - versionNumber.set("${project.version}-${project.name}") - changelog.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - uploadFile.set(tasks.findByName("shadowJar")) - loaders.addAll("sponge") - gameVersions.addAll( - "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5", "1.20.6" - ) -} - -tasks.register("publish") { - dependsOn("modrinth") - dependsOn("publishToOre") -} - -oreDeployment { - apiKey(System.getenv("ORE_TOKEN")) - defaultPublication { - projectId.set("bluemap") - createForumPost.set(true) - versionBody.set(file("../../release.md") - .readText() - .replace("{version}", project.version.toString())) - publishArtifacts.setFrom(tasks.findByName("shadowJar")) - } + gameVersions.addAll(supportedMinecraftVersions) } diff --git a/implementations/sponge/settings.gradle.kts b/implementations/sponge/settings.gradle.kts deleted file mode 100644 index add6a72b..00000000 --- a/implementations/sponge/settings.gradle.kts +++ /dev/null @@ -1,3 +0,0 @@ -rootProject.name = "sponge" - -includeBuild("../../BlueMapCommon") \ No newline at end of file diff --git a/jitpack.yml b/jitpack.yml deleted file mode 100644 index 46c85291..00000000 --- a/jitpack.yml +++ /dev/null @@ -1,2 +0,0 @@ -jdk: - - openjdk11 \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 52e023eb..cd2481e7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,29 +1,37 @@ -rootProject.name = "BlueMap" +logger.lifecycle(""" +## Building BlueMap ... +Java: ${System.getProperty("java.version")} +JVM: ${System.getProperty("java.vm.version")} (${System.getProperty("java.vendor")}) +Arch: ${System.getProperty("os.arch")} +""") -// setup workspace -val releaseNotesFile = file("release.md") -if (!releaseNotesFile.exists()) releaseNotesFile.createNewFile(); +pluginManagement { + repositories { + gradlePluginPortal() + mavenCentral() + maven ("https://maven.minecraftforge.net" ) + maven ("https://maven.fabricmc.net/" ) + maven ("https://maven.neoforged.net/releases" ) + } +} -// bluemap -includeBuild("BlueMapCore") -includeBuild("BlueMapCommon") +rootProject.name = "bluemap" -// implementations -includeBuild("implementations/cli") -includeBuild("implementations/fabric") -includeBuild("implementations/forge") -includeBuild("implementations/neoforge") -includeBuild("implementations/spigot") -includeBuild("implementations/paper") -includeBuild("implementations/sponge") +includeBuild("api") -// legacy support -includeBuild("implementations/forge-1.18.1") -includeBuild("implementations/forge-1.19.4") -includeBuild("implementations/forge-1.20") -includeBuild("implementations/forge-1.20.6") +include(":core") +include(":common") -includeBuild("implementations/fabric-1.18") -includeBuild("implementations/fabric-1.19.4") -includeBuild("implementations/fabric-1.20") -includeBuild("implementations/fabric-1.20.5") +implementation("cli") +implementation("fabric") +implementation("forge") +implementation("neoforge") +implementation("paper") +implementation("spigot") +implementation("sponge") + +fun implementation(name: String) { + val project = ":$name" + include(project) + project(project).projectDir = file("implementations/$name") +}