Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
### Java template
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# 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*
replay_pid*

### Example user template template
### Example user template

# IntelliJ project files
.idea
*.iml
out
gen
31 changes: 27 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,33 +1,48 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jetbrains.kotlin.gradle.dsl.JvmTarget.JVM_21

plugins {
`java-library`
id("com.github.johnrengelman.shadow") version "8.0.0"
id("xyz.jpenilla.run-paper") version "2.0.1"
id("idea")
kotlin("jvm")
}


group = "dev.kugge"
version = "0.0.1"
version = "0.0.3"

java {
toolchain.languageVersion.set(JavaLanguageVersion.of(17))
toolchain.languageVersion.set(JavaLanguageVersion.of(21))
}

repositories {
mavenLocal()
mavenCentral()
maven("https://repo.bluecolored.de/releases")
maven("https://jitpack.io")
maven("https://oss.sonatype.org/content/groups/public/")
maven("https://papermc.io/repo/repository/maven-public/")
}

dependencies {
compileOnly("dev.folia:folia-api:1.19.4-R0.1-SNAPSHOT")
compileOnly("com.github.BlueMap-Minecraft:BlueMapAPI:v2.4.0")
compileOnly ("de.bluecolored.bluemap:BlueMapAPI:2.7.2")
implementation("net.pwall.mustache:kotlin-mustache:0.12")
implementation(kotlin("stdlib"))
testImplementation(platform("org.junit:junit-bom:5.11.1"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
testImplementation("org.mockito:mockito-core:3.+")
testImplementation("net.kyori:adventure-api:4.13.0")
testImplementation("dev.folia:folia-api:1.19.4-R0.1-SNAPSHOT")
testImplementation ("de.bluecolored.bluemap:BlueMapAPI:2.7.2")
}

tasks.compileJava {
options.encoding = Charsets.UTF_8.name()
options.release.set(17)
options.release.set(21)
}

tasks.processResources {
Expand All @@ -36,6 +51,7 @@ tasks.processResources {

tasks.shadowJar {
archiveFileName.set("SignMarkers-${project.version}.jar")
mergeServiceFiles()
}

tasks.jar {
Expand All @@ -45,3 +61,10 @@ tasks.jar {
tasks.assemble {
dependsOn(tasks.shadowJar)
}

tasks.test {
useJUnitPlatform()
testLogging {
events("passed", "skipped", "failed")
}
}
8 changes: 6 additions & 2 deletions settings.gradle
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
rootProject.name = 'BlueMapSignMarkers'

pluginManagement {
plugins {
id 'org.jetbrains.kotlin.jvm' version '2.0.20'
}
}
rootProject.name = 'BlueMapSignMarkers'
74 changes: 62 additions & 12 deletions src/main/java/dev/kugge/signmarkers/SignMarkers.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
import de.bluecolored.bluemap.api.BlueMapMap;
import de.bluecolored.bluemap.api.gson.MarkerGson;
import de.bluecolored.bluemap.api.markers.MarkerSet;
import dev.kugge.signmarkers.watcher.SignDestroyWatcher;
import dev.kugge.signmarkers.watcher.SignWatcher;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.plugin.java.JavaPlugin;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
Expand All @@ -32,16 +32,66 @@ public void onEnable() {
loadWorldMarkerSet(world);
registerWorld(world);
}
BlueMapAPI.onEnable(api -> webRoot = api.getWebApp().getWebRoot());
BlueMapAPI.onEnable(api -> {
// This is a path object
webRoot = api.getWebApp().getWebRoot();
// Add images in resources to webRoot/assets/

// Target directory for assets
Path assetsDir = webRoot.resolve("assets/SignMarkers");

// Ensure the assets directory exists
try {
if (!Files.exists(assetsDir)) {
Files.createDirectories(assetsDir);
}
} catch (IOException e) {
e.printStackTrace();
return;
}

// Add images from resources to the assets directory
try {
copyResourceToAssets("house.svg", assetsDir);
copyResourceToAssets("monster.svg", assetsDir);
copyResourceToAssets("farm.svg", assetsDir);
// Add more images as necessary
} catch (IOException e) {
e.printStackTrace();
}
});
Bukkit.getPluginManager().registerEvents(new SignWatcher(), this);
Bukkit.getPluginManager().registerEvents(new SignDestroyWatcher(), this);
}

@Override
public void onDisable() {
for (World world : Bukkit.getWorlds()) saveWorldMarkerSet(world);
}

/**
* Copies a resource image to the webRoot/assets/ directory.
*
* @param resourceName The name of the resource file (e.g., "image1.png").
* @param targetDir The directory to copy the image to.
* @throws IOException If something goes wrong during file operations.
*/
private void copyResourceToAssets(String resourceName, Path targetDir) throws IOException {
// Get the resource as an input stream
InputStream resourceStream = getClass().getResourceAsStream("/" + resourceName);

if (resourceStream == null) {
throw new IOException("Resource not found: " + resourceName);
}

// Create the target file in the assets directory
Path targetFile = targetDir.resolve(resourceName);
if (!Files.exists(targetFile)) {
// Copy the resource to the target directory
Files.copy(resourceStream, targetFile);
}
resourceStream.close();
}

private void createFiles() {
for (World world : Bukkit.getWorlds()) {
String name = "marker-set-" + world.getName() + ".json";
Expand Down Expand Up @@ -80,15 +130,15 @@ private void loadWorldMarkerSet(World world) {

private void registerWorld(World world) {
BlueMapAPI.onEnable(api ->
api.getWorld(world).ifPresent(blueWorld -> {
for (BlueMapMap map : blueWorld.getMaps()) {
String label = "sign-markers-" + world.getName();
MarkerSet set = markerSet.get(world);
if (set == null) set = MarkerSet.builder().label(label).build();
map.getMarkerSets().put(label, set);
markerSet.put(world, set);
}
})
api.getWorld(world).ifPresent(blueWorld -> {
for (BlueMapMap map : blueWorld.getMaps()) {
String label = "sign-markers-" + world.getName();
MarkerSet set = markerSet.get(world);
if (set == null) set = MarkerSet.builder().label(label).build();
map.getMarkerSets().put(label, set);
markerSet.put(world, set);
}
})
);
}
}
8 changes: 8 additions & 0 deletions src/main/java/dev/kugge/signmarkers/models/Tag.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package dev.kugge.signmarkers.models


class Tag(val name: String, val value: String?) {
fun contains(str: String): Boolean {
return name.contains(str);
}
}
15 changes: 15 additions & 0 deletions src/main/java/dev/kugge/signmarkers/models/TagList.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.kugge.signmarkers.models

class TagList : ArrayList<Tag>() {
fun contains(name: String): Boolean {
return this.any { it.name == name }
}

fun findByName(name: String): Tag? {
return this.find { it.name == name }
}

operator fun get(name: String): Tag? {
return findByName(name)
}
}
7 changes: 7 additions & 0 deletions src/main/java/dev/kugge/signmarkers/util/AvailableTags.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.kugge.signmarkers.util

enum class AvailableTags(val value: String) {
POI("poi"),
ICON("icon"),
TEXT("text")
}
44 changes: 44 additions & 0 deletions src/main/java/dev/kugge/signmarkers/util/MarkerFactory.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package dev.kugge.signmarkers.util

import com.flowpowered.math.vector.Vector2i
import com.flowpowered.math.vector.Vector3d
import de.bluecolored.bluemap.api.markers.HtmlMarker
import de.bluecolored.bluemap.api.markers.Marker
import de.bluecolored.bluemap.api.markers.POIMarker
import dev.kugge.signmarkers.models.TagList
import net.pwall.mustache.Template

class MarkerFactory {
fun build(tags: TagList, text: String, coords: Vector3d): Marker? {
if (tags.contains(AvailableTags.POI.value)) {
var icon = "assets/poi.svg";
var iconSize = Vector2i(25.0, 45.0);

if (tags.contains(AvailableTags.ICON.value)) {
val tag = tags.get(AvailableTags.ICON.value);
println(tag)
if (tag != null) {
println(tag.value)
if (tag.value != null) {
icon = "assets/SignMarkers/${tag.value}.svg"
}
}
}

return POIMarker(text, coords, icon, iconSize)
}

if (tags.contains(AvailableTags.TEXT.value)) {
val inputStream = this.javaClass.classLoader.getResourceAsStream("views/header.html") ?: return null

val htmlTemplate = Template.parse(
inputStream
);
data class Text(val text: String);
val htmlText = htmlTemplate.processToString(Text(text))
return HtmlMarker(text, coords, htmlText)
}

return null
}
}
26 changes: 26 additions & 0 deletions src/main/java/dev/kugge/signmarkers/util/MarkerManager.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package dev.kugge.signmarkers.util

import com.flowpowered.math.vector.Vector3d
import de.bluecolored.bluemap.api.markers.Marker
import dev.kugge.signmarkers.SignMarkers
import org.bukkit.block.Block

class MarkerManager (var block: Block) {
val pos = Vector3d(block.x.toDouble(), block.y.toDouble(), block.z.toDouble())
val id = "marker-" + pos.x + "-" + pos.y + "-" + pos.z

fun addMarker(marker: Marker){
val id = "marker-" + pos.x + "-" + pos.y + "-" + pos.z
SignMarkers.markerSet[block.world]!!.put(id, marker)
}

fun deleteMarker(){
// delete old marker
val markerSet = SignMarkers.markerSet[block.world] ?: return

val marker = markerSet[id]
if (marker != null) {
markerSet.remove(id)
}
}
}
23 changes: 23 additions & 0 deletions src/main/java/dev/kugge/signmarkers/util/TagFactory.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package dev.kugge.signmarkers.util

import dev.kugge.signmarkers.models.Tag
import dev.kugge.signmarkers.models.TagList

class TagFactory {
var tagRegex = Regex("\\[(\\w+)(?:=(.*?))?]")

fun parseTags(text: String): TagList {
val tags = TagList()
tagRegex.findAll(text).forEach { match ->
println(match.value);
val name = match.groupValues[1]
val value = match.groupValues.getOrNull(2)
tags.add(Tag(name, value))
}
return tags;
}

fun stripTags(text: String): String {
return text.replace(tagRegex, "")
}
}

This file was deleted.

Loading