diff --git a/Changelog.md b/Changelog.md index 439ba32..721c0c5 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,3 +1,7 @@ +Flan 1.7.8 +================ +- Add dynmap support for claims + Flan 1.7.7 ================ - Prevent moss/grassblock/nylium bonemealing if too close to a claim without permission diff --git a/common/build.gradle b/common/build.gradle index 592e0ca..7a44951 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -6,12 +6,21 @@ configurations { shadowCommon // Don't use shadow from the shadow plugin because we don't want IDEA to index this. } +repositories { + maven { + name = "CurseMaven" + url "https://www.cursemaven.com" + } +} + dependencies { // We depend on fabric loader here to use the fabric @Environment annotations and get the mixin dependencies // Do NOT use other classes from fabric loader modImplementation "net.fabricmc:fabric-loader:${rootProject.loader_version}" implementation group: 'org.yaml', name: 'snakeyaml', version: '1.25' shadowCommon group: 'org.yaml', name: 'snakeyaml', version: '1.25' + + modImplementation dynmap_fabric } architectury { diff --git a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java index d72a9ff..4549b76 100644 --- a/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java +++ b/common/src/main/java/io/github/flemmli97/flan/claim/Claim.java @@ -14,6 +14,7 @@ import io.github.flemmli97.flan.config.Config; import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.platform.ClaimPermissionCheck; import io.github.flemmli97.flan.platform.CrossPlatformStuff; +import io.github.flemmli97.flan.platform.integration.dynmap.DynmapCalls; import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.ChatFormatting; @@ -164,6 +165,7 @@ public class Claim implements IPermissionContainer { public void setClaimName(String name) { this.claimName = name; this.setDirty(true); + DynmapCalls.changeClaimName(this); } public UUID getOwner() { diff --git a/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java b/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java index a02f129..b7ca756 100644 --- a/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java +++ b/common/src/main/java/io/github/flemmli97/flan/claim/ClaimStorage.java @@ -14,6 +14,7 @@ import io.github.flemmli97.flan.api.data.IPlayerData; import io.github.flemmli97.flan.api.permission.ClaimPermission; import io.github.flemmli97.flan.api.permission.PermissionRegistry; import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.platform.integration.dynmap.DynmapCalls; import io.github.flemmli97.flan.platform.integration.permissions.PermissionNodeHandler; import io.github.flemmli97.flan.player.EnumDisplayType; import io.github.flemmli97.flan.player.EnumEditMode; @@ -154,6 +155,7 @@ public class ClaimStorage implements IPermissionStorage { claim.remove(); claim.getOwnerPlayer().ifPresent(o -> PlayerClaimData.get(o).updateScoreboard()); } + DynmapCalls.removeMarker(claim); return this.claimUUIDMap.remove(claim.getClaimID()) != null; } @@ -275,6 +277,7 @@ public class ClaimStorage implements IPermissionStorage { old.add(claim); return old; }); + DynmapCalls.addClaimMarker(claim); } public boolean transferOwner(Claim claim, ServerPlayer player, UUID newOwner) { @@ -292,6 +295,7 @@ public class ClaimStorage implements IPermissionStorage { return old; }); this.dirty.add(claim.getOwner()); + DynmapCalls.changeClaimOwner(claim); return true; } diff --git a/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapCalls.java b/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapCalls.java new file mode 100644 index 0000000..6a8bc6e --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapCalls.java @@ -0,0 +1,28 @@ +package io.github.flemmli97.flan.platform.integration.dynmap; + +import io.github.flemmli97.flan.claim.Claim; + +public class DynmapCalls { + + public static boolean dynmapLoaded; + + public static void addClaimMarker(Claim claim) { + if (dynmapLoaded) + DynmapIntegration.addClaimMarker(claim); + } + + public static void removeMarker(Claim claim) { + if (dynmapLoaded) + DynmapIntegration.removeMarker(claim); + } + + public static void changeClaimName(Claim claim) { + if (dynmapLoaded) + DynmapIntegration.changeClaimName(claim); + } + + public static void changeClaimOwner(Claim claim) { + if (dynmapLoaded) + DynmapIntegration.changeClaimOwner(claim); + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapIntegration.java b/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapIntegration.java new file mode 100644 index 0000000..5b0365c --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/platform/integration/dynmap/DynmapIntegration.java @@ -0,0 +1,93 @@ +package io.github.flemmli97.flan.platform.integration.dynmap; + +import com.mojang.authlib.GameProfile; +import io.github.flemmli97.flan.claim.Claim; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; +import org.dynmap.DynmapCommonAPI; +import org.dynmap.DynmapCommonAPIListener; +import org.dynmap.markers.AreaMarker; +import org.dynmap.markers.MarkerAPI; +import org.dynmap.markers.MarkerSet; + +import java.util.Optional; + +public class DynmapIntegration { + + private static MarkerSet markerSet; + private static final String markerID = "flan.claims", markerLabel = "Claims"; + + public static void reg() { + DynmapCommonAPIListener.register(new DynmapCommonAPIListener() { + @Override + public void apiEnabled(DynmapCommonAPI dynmapCommonAPI) { + MarkerAPI markerAPI = dynmapCommonAPI.getMarkerAPI(); + markerSet = markerAPI.createMarkerSet(markerID, markerLabel, dynmapCommonAPI.getMarkerAPI().getMarkerIcons(), false); + DynmapCalls.dynmapLoaded = true; + } + }); + } + + static void addClaimMarker(Claim claim) { + if (markerSet == null) + return; + int[] dim = claim.getDimensions(); + AreaMarker marker = markerSet.createAreaMarker(claim.getClaimID().toString(), claimLabel(claim), true, getWorldName(claim.getWorld()), new double[]{dim[0], dim[1]}, new double[]{dim[2], dim[3]}, false); + marker.setLineStyle(3, 0.8, lineColor(claim.isAdminClaim())); + marker.setFillStyle(0.2, fillColor(claim.isAdminClaim())); + } + + static void removeMarker(Claim claim) { + if (markerSet == null) + return; + AreaMarker marker = markerSet.findAreaMarker(claim.getClaimID().toString()); + if (marker != null) + marker.deleteMarker(); + } + + static void changeClaimName(Claim claim) { + if (markerSet == null) + return; + markerSet.findAreaMarker(claim.getClaimID().toString()) + .setLabel(claimLabel(claim)); + } + + static void changeClaimOwner(Claim claim) { + if (markerSet == null) + return; + if (claim.getClaimName() == null || claim.getClaimName().isEmpty()) + markerSet.findAreaMarker(claim.getClaimID().toString()) + .setLabel(claimLabel(claim)); + } + + private static String getWorldName(Level level) { + ResourceKey key = level.dimension(); + if (key == Level.OVERWORLD) { + return level.getServer().getWorldData().getLevelName(); + } else if (key == Level.END) { + return "DIM1"; + } else if (key == Level.NETHER) { + return "DIM-1"; + } + return key.location().getNamespace() + "_" + key.location().getPath(); + } + + private static int lineColor(boolean admin) { + return admin ? 0xb50909 : 0xffa200; + } + + private static int fillColor(boolean admin) { + return admin ? 0xff0000 : 0xe0e01d; + } + + private static String claimLabel(Claim claim) { + String name = claim.getClaimName(); + if (name == null || name.isEmpty()) { + if (claim.isAdminClaim()) + return "Admin Claim"; + Optional prof = claim.getWorld().getServer().getProfileCache().get(claim.getOwner()); + return prof.map(GameProfile::getName).orElse("UNKOWN") + "'s Claim"; + } + return name; + } +} \ No newline at end of file diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/FlanFabric.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/FlanFabric.java index 1b27c59..0dc31bb 100644 --- a/fabric/src/main/java/io/github/flemmli97/flan/fabric/FlanFabric.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/FlanFabric.java @@ -9,6 +9,7 @@ import io.github.flemmli97.flan.event.ItemInteractEvents; import io.github.flemmli97.flan.event.PlayerEvents; import io.github.flemmli97.flan.event.WorldEvents; import io.github.flemmli97.flan.fabric.platform.integration.playerability.PlayerAbilityEvents; +import io.github.flemmli97.flan.platform.integration.dynmap.DynmapIntegration; import io.github.flemmli97.flan.player.PlayerDataHandler; import io.github.flemmli97.flan.scoreboard.ClaimCriterias; import net.fabricmc.api.ModInitializer; @@ -60,6 +61,8 @@ public class FlanFabric implements ModInitializer { Flan.octoEconomy = FabricLoader.getInstance().isModLoaded("octo-economy-api"); if (Flan.playerAbilityLib) PlayerAbilityEvents.register(); + if (FabricLoader.getInstance().isModLoaded("dynmap")) + DynmapIntegration.reg(); ClaimCriterias.init(); } diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java b/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java index 5cfa55c..a7e6f82 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/FlanForge.java @@ -6,6 +6,7 @@ import io.github.flemmli97.flan.forge.forgeevent.EntityInteractEventsForge; import io.github.flemmli97.flan.forge.forgeevent.ItemInteractEventsForge; import io.github.flemmli97.flan.forge.forgeevent.ServerEvents; import io.github.flemmli97.flan.forge.forgeevent.WorldEventsForge; +import io.github.flemmli97.flan.platform.integration.dynmap.DynmapIntegration; import io.github.flemmli97.flan.scoreboard.ClaimCriterias; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.eventbus.api.EventPriority; @@ -50,6 +51,9 @@ public class FlanForge { forge.addListener(ServerEvents::disconnect); forge.addListener(ServerEvents::serverTick); + if (ModList.get().isLoaded("dynmap")) + DynmapIntegration.reg(); + ClaimCriterias.init(); } } diff --git a/gradle.properties b/gradle.properties index 951d9a5..d36243a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ forge_version=1.18.2-40.0.3 loader_version=0.13.2 # Mod Properties -mod_version=1.7.7 +mod_version=1.7.8 maven_group=io.github.flemmli97 archives_base_name=flan @@ -24,6 +24,7 @@ fabric_permissions_api=0.1-SNAPSHOT player_ability_lib=1.2.2 ftb_ranks=1801.1.6-build.20 dicemcmm=curse.maven:dicemcmoney-406972:3548047 +dynmap_fabric=curse.maven:dynmap-59433:3724084 # Curse properties curse_versions=1.18.2, Java 17