From d0f069bc36cd84b937b2257aa41c78325dfedc3b Mon Sep 17 00:00:00 2001 From: yourfriendoss Date: Fri, 3 Oct 2025 19:14:01 +0300 Subject: [PATCH] first commit --- .gitignore | 118 ++++++++ LICENSE | 21 ++ README.md | 7 + build.gradle | 116 +++++++ gradle.properties | 16 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 62076 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 245 +++++++++++++++ gradlew.bat | 92 ++++++ settings.gradle | 9 + .../ChunkPosDirection.java | 58 ++++ .../OpacBluemapConfig.java | 70 +++++ .../OpacBluemapIntegration.java | 284 ++++++++++++++++++ .../opacbluemapintegration/ShapeHolder.java | 131 ++++++++ .../assets/opac-bluemap-integration/icon.png | Bin 0 -> 32699 bytes src/main/resources/fabric.mod.json | 31 ++ .../opac-bluemap-integration.mixins.json | 13 + 17 files changed, 1217 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 build.gradle create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle create mode 100644 src/main/java/io/github/gaming32/opacbluemapintegration/ChunkPosDirection.java create mode 100644 src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapConfig.java create mode 100644 src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapIntegration.java create mode 100644 src/main/java/io/github/gaming32/opacbluemapintegration/ShapeHolder.java create mode 100644 src/main/resources/assets/opac-bluemap-integration/icon.png create mode 100644 src/main/resources/fabric.mod.json create mode 100644 src/main/resources/opac-bluemap-integration.mixins.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3c37caf --- /dev/null +++ b/.gitignore @@ -0,0 +1,118 @@ +# User-specific stuff +.idea/ + +*.iml +*.ipr +*.iws + +# IntelliJ +out/ +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* + +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +.gradle +build/ + +# Ignore Gradle GUI config +gradle-app.setting + +# Cache of project +.gradletasknamecache + +**/build/ + +# Common working directory +run/ + +# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) +!gradle-wrapper.jar diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a0e67c5 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2023 + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..bf2ef6a --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# OPaC BlueMap + +This mod will show land claims from the [Open Parties and Claims](https://modrinth.com/mod/open-parties-and-claims) mod in the maps from the [BlueMap](https://modrinth.com/mod/bluemap) mod. This has currently only been tested on 1.19.2, but may work on newer versions. + +## Usage + +Simply install both the Open Parties and Claims mod as well as the BlueMap mod (and this mod), and you should be all set! diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..f218163 --- /dev/null +++ b/build.gradle @@ -0,0 +1,116 @@ +plugins { + id 'fabric-loom' version '1.11-SNAPSHOT' + id 'io.github.juuxel.loom-quiltflower' version '1.8.0' + id 'maven-publish' +} + +version = project.mod_version +group = project.maven_group + +repositories { + maven { + name = "ParchmentMC" + url = "https://maven.parchmentmc.org" + } + + maven { + name = "Fuzs Mod Resources" + url = "https://raw.githubusercontent.com/Fuzss/modresources/main/maven/" + } + + maven { url = "https://maven.quiltmc.org/repository/release" } + + exclusiveContent { + forRepository { + maven { + name = "Modrinth" + url = "https://api.modrinth.com/maven" + } + } + filter { + includeGroup "maven.modrinth" + } + } + + maven { url = "https://jitpack.io" } +} + +dependencies { + // To change the versions see the gradle.properties file + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings(loom.layered { + officialMojangMappings() + parchment("org.parchmentmc.data:parchment-1.21.8:2025.09.14@zip") + }) + modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" + + modImplementation("maven.modrinth:open-parties-and-claims:fabric-1.21.1-0.25.5") + modRuntimeOnly("fuzs.forgeconfigapiport:forgeconfigapiport-fabric:5.0.6") { + exclude(group: "net.fabricmc") + exclude(group: "net.fabricmc.fabric-api") + } + + implementation("com.github.BlueMap-Minecraft:BlueMapAPI:2.7.0") + modRuntimeOnly("maven.modrinth:bluemap:3.13-fabric-1.19") + + include(implementation("org.quiltmc.qup:json:0.2.0")) +} + +processResources { + inputs.property "version", project.version + filteringCharset "UTF-8" + + filesMatching("fabric.mod.json") { + expand "version": project.version + } +} + +def targetJavaVersion = 21 +tasks.withType(JavaCompile).configureEach { + // ensure that the encoding is set to UTF-8, no matter what the system default is + // this fixes some edge cases with special characters not displaying correctly + // see http://yodaconditions.net/blog/fix-for-java-file-encoding-problems-with-gradle.html + // If Javadoc is generated, this must be specified in that task too. + it.options.encoding = "UTF-8" + if (targetJavaVersion >= 10 || JavaVersion.current().isJava10Compatible()) { + it.options.release = targetJavaVersion + } +} + +java { + def javaVersion = JavaVersion.toVersion(targetJavaVersion) + if (JavaVersion.current() < javaVersion) { + toolchain.languageVersion = JavaLanguageVersion.of(targetJavaVersion) + } + archivesBaseName = project.archives_base_name + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + withSourcesJar() +} + +jar { + from("LICENSE") { + rename { "${it}_${project.archivesBaseName}"} + } +} + +// configure the maven publication +publishing { + publications { + mavenJava(MavenPublication) { + from components.java + } + } + + // See https://docs.gradle.org/current/userguide/publishing_maven.html for information on how to set up publishing. + repositories { + // Add repositories to publish to here. + // Notice: This block does NOT have the same function as the block in the top level. + // The repositories here will be used for publishing your artifact, not for + // retrieving dependencies. + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..e50b4c4 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,16 @@ +# Done to increase the memory available to gradle. +org.gradle.jvmargs=-Xmx1G + +# Fabric Properties + # check these on https://modmuss50.me/fabric.html + minecraft_version=1.21.8 + loader_version=0.17.2 + +# Mod Properties + mod_version = 1.1.0 + maven_group = io.github.gaming32 + archives_base_name = opac-bluemap-integration + +# Dependencies + # check this on https://modmuss50.me/fabric.html + fabric_version=0.133.4+1.21.8 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..c1962a79e29d3e0ab67b14947c167a862655af9b GIT binary patch literal 62076 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..3c44eb1 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..aeb74cb --- /dev/null +++ b/gradlew @@ -0,0 +1,245 @@ +#!/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/HEAD/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 + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +# 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*) + # 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 +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 + + +# 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 +# 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 \ + "$@" + +# 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. +# +# 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/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..93e3f59 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@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=. +@rem This is normally unused +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% equ 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% equ 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% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..f91a4fe --- /dev/null +++ b/settings.gradle @@ -0,0 +1,9 @@ +pluginManagement { + repositories { + maven { + name = 'Fabric' + url = 'https://maven.fabricmc.net/' + } + gradlePluginPortal() + } +} diff --git a/src/main/java/io/github/gaming32/opacbluemapintegration/ChunkPosDirection.java b/src/main/java/io/github/gaming32/opacbluemapintegration/ChunkPosDirection.java new file mode 100644 index 0000000..5c07290 --- /dev/null +++ b/src/main/java/io/github/gaming32/opacbluemapintegration/ChunkPosDirection.java @@ -0,0 +1,58 @@ +package io.github.gaming32.opacbluemapintegration; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.ChunkPos; + +public enum ChunkPosDirection { + LEFT(-1, 0), + FORWARD(0, 1), + RIGHT(1, 0), + BACKWARD(0, -1); + + public final int x, z; + public final ChunkPos value; + + ChunkPosDirection(int x, int z) { + this.x = x; + this.z = z; + this.value = new ChunkPos(x, z); + } + + public ChunkPosDirection getLeft() { + return rotate(-1); + } + + public ChunkPosDirection getRight() { + return rotate(1); + } + + public ChunkPosDirection getOpposite() { + return rotate(2); + } + + public ChunkPosDirection rotate(int clockwiseDistance) { + return values()[(ordinal() + clockwiseDistance) & 3]; + } + + public ChunkPos add(ChunkPos pos) { + return new ChunkPos(pos.x + x, pos.z + z); + } + + public int getEdge(ChunkPos pos) { + return switch (this) { + case LEFT -> pos.getMinBlockX(); + case FORWARD -> pos.getMaxBlockZ() + 1; + case RIGHT -> pos.getMaxBlockX() + 1; + case BACKWARD -> pos.getMinBlockZ(); + }; + } + + public static BlockPos getCorner(ChunkPos pos, ChunkPosDirection a, ChunkPosDirection b) { + if (a == b || a.getOpposite() == b) { + throw new IllegalArgumentException("Corner can't be accessed with opposite directions"); + } + return a.x != 0 + ? new BlockPos(a.getEdge(pos), 0, b.getEdge(pos)) + : new BlockPos(b.getEdge(pos), 0, a.getEdge(pos)); + } +} diff --git a/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapConfig.java b/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapConfig.java new file mode 100644 index 0000000..7ba4102 --- /dev/null +++ b/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapConfig.java @@ -0,0 +1,70 @@ +package io.github.gaming32.opacbluemapintegration; + +import org.quiltmc.qup.json.JsonReader; +import org.quiltmc.qup.json.JsonWriter; + +import java.io.IOException; + +public class OpacBluemapConfig { + private int updateInterval = 12000; // Every 10 minutes + private float markerMinY = 75f; + private float markerMaxY = 75f; + private boolean depthTest = false; + + public void read(JsonReader reader) throws IOException { + reader.beginObject(); + while (reader.hasNext()) { + final String key; + switch (key = reader.nextName()) { + case "updateInterval" -> updateInterval = reader.nextInt(); + case "markerMinY" -> markerMinY = reader.nextNumber().floatValue(); + case "markerMaxY" -> markerMaxY = reader.nextNumber().floatValue(); + case "depthTest" -> depthTest = reader.nextBoolean(); + default -> { + OpacBluemapIntegration.LOGGER.warn("Unknown OPaC BlueMap config key {}. Skipping.", key); + reader.skipValue(); + } + } + } + reader.endObject(); + } + + public void write(JsonWriter writer) throws IOException { + writer.beginObject(); + + writer.comment("How often, in ticks, the markers should be refreshed. Set to 0 to disable automatic refreshing."); + writer.comment("Default is 10 minutes (12000 ticks)."); + writer.name("updateInterval").value(updateInterval); + + writer.comment("The min and max Y for the markers. If these are the same, the marker will be drawn as a flat plane."); + writer.comment("Default is 75 to 75."); + writer.name("markerMinY").value(markerMinY); + writer.name("markerMaxY").value(markerMaxY); + + writer.comment("If set to false, the markers won't be covered up by objects in front of it."); + writer.comment("Default is false."); + writer.name("depthTest").value(depthTest); + + writer.endObject(); + } + + public int getUpdateInterval() { + return updateInterval; + } + + public void setUpdateInterval(int updateInterval) { + this.updateInterval = updateInterval; + } + + public float getMarkerMinY() { + return markerMinY; + } + + public float getMarkerMaxY() { + return markerMaxY; + } + + public boolean isDepthTest() { + return depthTest; + } +} diff --git a/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapIntegration.java b/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapIntegration.java new file mode 100644 index 0000000..40ce4c6 --- /dev/null +++ b/src/main/java/io/github/gaming32/opacbluemapintegration/OpacBluemapIntegration.java @@ -0,0 +1,284 @@ +package io.github.gaming32.opacbluemapintegration; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.arguments.IntegerArgumentType; +import com.mojang.logging.LogUtils; +import de.bluecolored.bluemap.api.BlueMapAPI; +import de.bluecolored.bluemap.api.BlueMapWorld; +import de.bluecolored.bluemap.api.markers.ExtrudeMarker; +import de.bluecolored.bluemap.api.markers.Marker; +import de.bluecolored.bluemap.api.markers.MarkerSet; +import de.bluecolored.bluemap.api.markers.ShapeMarker; +import de.bluecolored.bluemap.api.math.Color; +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.loader.api.FabricLoader; +import net.minecraft.ChatFormatting; +import net.minecraft.commands.arguments.TimeArgument; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mth; +import net.minecraft.world.level.ChunkPos; +import org.apache.commons.lang3.StringUtils; +import org.quiltmc.qup.json.JsonReader; +import org.quiltmc.qup.json.JsonWriter; +import org.slf4j.Logger; +import xaero.pac.common.claims.player.api.IPlayerClaimPosListAPI; +import xaero.pac.common.server.api.OpenPACServerAPI; + +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; + +import static net.minecraft.commands.Commands.argument; +import static net.minecraft.commands.Commands.literal; + +public class OpacBluemapIntegration implements ModInitializer { + public static final Logger LOGGER = LogUtils.getLogger(); + + private static final String MARKER_SET_KEY = "opac-bluemap-integration"; + private static final Path CONFIG_FILE = FabricLoader.getInstance().getConfigDir().resolve("opac-bluemap.json5"); + + public static final OpacBluemapConfig CONFIG = new OpacBluemapConfig(); + + private static MinecraftServer minecraftServer; + + private static int updateIn; + + @Override + public void onInitialize() { + loadConfig(); + BlueMapAPI.onEnable(OpacBluemapIntegration::updateClaims); + ServerLifecycleEvents.SERVER_STARTING.register(server -> minecraftServer = server); + ServerLifecycleEvents.SERVER_STOPPED.register(server -> minecraftServer = null); + CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> { + dispatcher.register(literal("opac-bluemap") + .requires(s -> s.hasPermission(2)) + .then(literal("refresh-now") + .requires(s -> BlueMapAPI.getInstance().isPresent()) + .executes(ctx -> { + final BlueMapAPI api = BlueMapAPI.getInstance().orElse(null); + if (api == null) { + ctx.getSource().sendFailure(Component.literal("BlueMap not loaded").withStyle(ChatFormatting.RED)); + return 0; + } + updateClaims(api); + ctx.getSource().sendSuccess( + () -> Component.literal("BlueMap OPaC claims refreshed").withStyle(ChatFormatting.GREEN), + true + ); + return Command.SINGLE_SUCCESS; + }) + ) + .then(literal("refresh-in") + .executes(ctx -> { + ctx.getSource().sendSuccess( + () -> Component.literal("OPaC BlueMap will refresh in ").append( + Component.literal((updateIn / 20) + "s").withStyle(ChatFormatting.GREEN) + ), + true + ); + return Command.SINGLE_SUCCESS; + }) + .then(argument("time", TimeArgument.time()) + .executes(ctx -> { + updateIn = IntegerArgumentType.getInteger(ctx, "time"); + ctx.getSource().sendSuccess( + () -> Component.literal("OPaC BlueMap will refresh in ").append( + Component.literal((updateIn / 20) + "s").withStyle(ChatFormatting.GREEN) + ), + true + ); + return Command.SINGLE_SUCCESS; + }) + ) + ) + .then(literal("refresh-every") + .executes(ctx -> { + ctx.getSource().sendSuccess( + () -> Component.literal("OPaC BlueMap auto refreshes every ").append( + Component.literal((CONFIG.getUpdateInterval() / 20) + "s").withStyle(ChatFormatting.GREEN) + ), + true + ); + return Command.SINGLE_SUCCESS; + }) + .then(argument("interval", TimeArgument.time()) + .executes(ctx -> { + final int interval = IntegerArgumentType.getInteger(ctx, "interval"); + CONFIG.setUpdateInterval(interval); + if (interval < updateIn) { + updateIn = interval; + } + saveConfig(); + ctx.getSource().sendSuccess( + () -> Component.literal("OPaC BlueMap will auto refresh every ").append( + Component.literal((interval / 20) + "s").withStyle(ChatFormatting.GREEN) + ), + true + ); + return Command.SINGLE_SUCCESS; + }) + ) + ) + .then(literal("reload") + .executes(ctx -> { + loadConfig(); + if (CONFIG.getUpdateInterval() < updateIn) { + updateIn = CONFIG.getUpdateInterval(); + } + ctx.getSource().sendSuccess( + () -> Component.literal("Reloaded OPaC BlueMap config").withStyle(ChatFormatting.GREEN), + true + ); + return Command.SINGLE_SUCCESS; + }) + ) + ); + }); + ServerTickEvents.END_SERVER_TICK.register(server -> { + if (updateIn <= 0) return; + if (--updateIn <= 0) { + BlueMapAPI.getInstance().ifPresent(OpacBluemapIntegration::updateClaims); + } + }); + } + + public static void loadConfig() { + try (JsonReader reader = JsonReader.json5(CONFIG_FILE)) { + CONFIG.read(reader); + } catch (Exception e) { + LOGGER.warn("Failed to read {}.", CONFIG_FILE, e); + } + saveConfig(); + } + + public static void saveConfig() { + try (JsonWriter writer = JsonWriter.json5(CONFIG_FILE)) { + CONFIG.write(writer); + } catch (Exception e) { + LOGGER.error("Failed to write {}.", CONFIG_FILE, e); + } + LOGGER.info("Saved OPaC BlueMap config"); + } + + public static void updateClaims(BlueMapAPI blueMap) { + if (minecraftServer == null) { + LOGGER.warn("updateClaims called with minecraftServer == null!"); + return; + } + LOGGER.info("Refreshing OPaC BlueMap markers"); + OpenPACServerAPI.get(minecraftServer) + .getServerClaimsManager() + .getPlayerInfoStream() + .forEach(playerClaimInfo -> { + String name = playerClaimInfo.getClaimsName(); + final String idName; + if (StringUtils.isBlank(name)) { + idName = name = playerClaimInfo.getPlayerUsername(); + if (name.length() > 2 && name.charAt(0) == '"' && name.charAt(name.length() - 1) == '"') { + name = name.substring(1, name.length() - 1) + " claim"; + } else { + name += "'s claim"; + } + } else { + idName = name; + } + final String displayName = name; + playerClaimInfo.getStream().forEach(entry -> { + final BlueMapWorld world = blueMap.getWorld(ResourceKey.create(Registries.DIMENSION, entry.getKey())).orElse(null); + if (world == null) return; + final List shapes = createShapes( + entry.getValue() + .getStream() + .flatMap(IPlayerClaimPosListAPI::getStream) + .collect(Collectors.toSet()) + ); + world.getMaps().forEach(map -> { + final Map markers = map + .getMarkerSets() + .computeIfAbsent(MARKER_SET_KEY, k -> + MarkerSet.builder() + .toggleable(true) + .label("Open Parties and Claims") + .build() + ) + .getMarkers(); + final float minY = CONFIG.getMarkerMinY(); + final float maxY = CONFIG.getMarkerMaxY(); + //noinspection SuspiciousNameCombination + final boolean flatPlane = Mth.equal(minY, maxY); + markers.keySet().removeIf(k -> k.startsWith(idName + "---")); + for (int i = 0; i < shapes.size(); i++) { + final ShapeHolder shape = shapes.get(i); + markers.put(idName + "---" + i, + // Yes these builders are the same. No they don't share a superclass (except for label). + flatPlane + ? ShapeMarker.builder() + .label(displayName) + .fillColor(new Color(playerClaimInfo.getClaimsColor(), 150)) + .lineColor(new Color(playerClaimInfo.getClaimsColor(), 255)) + .shape(shape.baseShape(), minY) + .holes(shape.holes()) + .depthTestEnabled(CONFIG.isDepthTest()) + .build() + : ExtrudeMarker.builder() + .label(displayName) + .fillColor(new Color(playerClaimInfo.getClaimsColor(), 150)) + .lineColor(new Color(playerClaimInfo.getClaimsColor(), 255)) + .shape(shape.baseShape(), minY, maxY) + .holes(shape.holes()) + .depthTestEnabled(CONFIG.isDepthTest()) + .build() + ); + } + }); + }); + }); + LOGGER.info("Refreshed OPaC BlueMap markers"); + updateIn = CONFIG.getUpdateInterval(); + } + + public static List createShapes(Set chunks) { + return createChunkGroups(chunks) + .stream() + .map(ShapeHolder::create) + .toList(); + } + + public static List> createChunkGroups(Set chunks) { + final List> result = new ArrayList<>(); + final Set visited = new HashSet<>(); + for (final ChunkPos chunk : chunks) { + if (visited.contains(chunk)) continue; + final Set neighbors = findNeighbors(chunk, chunks); + result.add(neighbors); + visited.addAll(neighbors); + } + return result; + } + + public static Set findNeighbors(ChunkPos chunk, Set chunks) { + if (!chunks.contains(chunk)) { + throw new IllegalArgumentException("chunks must contain chunk to find neighbors!"); + } + final Set visited = new HashSet<>(); + final Queue toVisit = new ArrayDeque<>(); + visited.add(chunk); + toVisit.add(chunk); + while (!toVisit.isEmpty()) { + final ChunkPos visiting = toVisit.remove(); + for (final ChunkPosDirection dir : ChunkPosDirection.values()) { + final ChunkPos offsetPos = dir.add(visiting); + if (!chunks.contains(offsetPos) || !visited.add(offsetPos)) continue; + toVisit.add(offsetPos); + } + } + return visited; + } +} diff --git a/src/main/java/io/github/gaming32/opacbluemapintegration/ShapeHolder.java b/src/main/java/io/github/gaming32/opacbluemapintegration/ShapeHolder.java new file mode 100644 index 0000000..045a6c7 --- /dev/null +++ b/src/main/java/io/github/gaming32/opacbluemapintegration/ShapeHolder.java @@ -0,0 +1,131 @@ +package io.github.gaming32.opacbluemapintegration; + +import com.flowpowered.math.vector.Vector2d; +import de.bluecolored.bluemap.api.math.Shape; +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.ChunkPos; + +import java.util.*; +import java.util.stream.Collectors; + +public record ShapeHolder(Shape baseShape, Shape... holes) { + public static ShapeHolder create(Set chunks) { + return new ShapeHolder( + createBaseShape(chunks), + OpacBluemapIntegration.createChunkGroups(cutoutChunks(chunks)) + .stream() + .map(ShapeHolder::createBaseShape) + .toArray(Shape[]::new) + ); + } + + private static Shape createBaseShape(Set chunks) { + ChunkPos firstChunk = getBound(chunks, Math::min); + while (!chunks.contains(firstChunk)) { + // Step right until we hit a real chunk + firstChunk = ChunkPosDirection.RIGHT.add(firstChunk); + } + final List points = new ArrayList<>(); + points.add(new Vector2d(firstChunk.getMinBlockX(), firstChunk.getMinBlockZ())); + + ChunkPos current = firstChunk; + ChunkPosDirection direction = ChunkPosDirection.RIGHT; + do { + points.add(vector(ChunkPosDirection.getCorner(current, direction, direction.getRight()))); + final ChunkPos next = direction.add(current); + if (chunks.contains(next)) { + final ChunkPos right = direction.getRight().add(next); + if (chunks.contains(right)) { + current = right; + direction = direction.getRight(); + } else { + current = next; + } + } else { + direction = direction.getLeft(); + } + } while (!current.equals(firstChunk) || direction != ChunkPosDirection.RIGHT); + + return new Shape(simplifyPoints(points)); + } + + private static Set cutoutChunks(Set chunks) { + final ChunkPos minChunk = getBound(chunks, Math::min); + final ChunkPos maxChunk = getBound(chunks, Math::max); + + final Queue toVisit = new ArrayDeque<>(); + for (int x = minChunk.x; x <= maxChunk.x; x++) { + for (int z = minChunk.z; z <= maxChunk.z; z++) { + if (x > minChunk.x && x < maxChunk.x && z > minChunk.z && z < maxChunk.z) continue; + final ChunkPos chunk = new ChunkPos(x, z); + if (chunks.contains(chunk)) continue; + toVisit.add(chunk); + } + } + + final Set outsideChunks = new HashSet<>(toVisit); + while (!toVisit.isEmpty()) { + final ChunkPos chunk = toVisit.remove(); + for (final ChunkPosDirection dir : ChunkPosDirection.values()) { + final ChunkPos offsetPos = dir.add(chunk); + if ( + offsetPos.x < minChunk.x || offsetPos.x > maxChunk.x || + offsetPos.z < minChunk.z || offsetPos.z > maxChunk.z || + chunks.contains(offsetPos) || !outsideChunks.add(offsetPos) + ) continue; + toVisit.add(offsetPos); + } + } + + return ChunkPos.rangeClosed(minChunk, maxChunk) + .filter(c -> !chunks.contains(c) && !outsideChunks.contains(c)) + .collect(Collectors.toSet()); + } + + private static Vector2d vector(BlockPos pos) { + return new Vector2d(pos.getX(), pos.getZ()); + } + + private static List simplifyPoints(List points) { + if (points.size() < 4) { + return points; + } + + final List result = new ArrayList<>(); + result.add(points.get(0)); + + for (int i = 1; i < points.size() - 1; i++) { + final Vector2d last = points.get(i - 1); + final Vector2d point = points.get(i); + final Vector2d next = points.get(i + 1); + if (!point.sub(last).normalize().equals(next.sub(point).normalize())) { + result.add(point); + } + } + + final Vector2d lastPoint = points.get(points.size() - 1); + if (!lastPoint.equals(points.get(0))) { + result.add(lastPoint); + } + + return result; + } + + private static ChunkPos getBound(Iterable chunks, IntSelector selector) { + final Iterator iterator = chunks.iterator(); + final ChunkPos first = iterator.next(); + int x = first.x; + int z = first.z; + while (iterator.hasNext()) { + final ChunkPos pos = iterator.next(); + x = selector.select(x, pos.x); + z = selector.select(z, pos.z); + } + return new ChunkPos(x, z); + } + + @FunctionalInterface + private interface IntSelector { + int select(int a, int b); + } +} diff --git a/src/main/resources/assets/opac-bluemap-integration/icon.png b/src/main/resources/assets/opac-bluemap-integration/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc960c4963c43e8ae329f5efd94e6a223c5bb5c GIT binary patch literal 32699 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.14.0", + "fabric": "*", + "minecraft": ">=1.19.2", + "bluemap": ">=3.13", + "openpartiesandclaims": ">=0.17.6" + } +} diff --git a/src/main/resources/opac-bluemap-integration.mixins.json b/src/main/resources/opac-bluemap-integration.mixins.json new file mode 100644 index 0000000..e48bc22 --- /dev/null +++ b/src/main/resources/opac-bluemap-integration.mixins.json @@ -0,0 +1,13 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "io.github.gaming32.opacbluemapintegration.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + ], + "client": [ + ], + "injectors": { + "defaultRequire": 1 + } +}