From 9e003fc5234c93329e1fb2f95dabc5f5484d8c6d Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Sat, 26 Nov 2022 20:33:32 +0100 Subject: [PATCH] add support for some claiming mods preventing claiming into other mods claims. closes #162 --- common/build.gradle | 6 ++ .../java/io/github/flemmli97/flan/Flan.java | 2 +- .../io/github/flemmli97/flan/claim/Claim.java | 5 ++ .../flemmli97/flan/claim/ClaimStorage.java | 24 +++--- .../github/flemmli97/flan/config/Config.java | 12 +++ .../integration/claiming/FTBChunks.java | 39 ++++++++++ .../claiming/OtherClaimingModCheck.java | 16 ++++ .../flemmli97/flan/player/ClaimDisplay.java | 78 ++++++++++--------- .../flemmli97/flan/player/DisplayBox.java | 63 +++++++++++++++ .../flan/player/PlayerClaimData.java | 5 ++ fabric/build.gradle | 18 +++-- .../flemmli97/flan/fabric/FlanFabric.java | 3 + .../claiming/OtherClaimingModCheckImpl.java | 32 ++++++++ .../PermissionNodeHandlerImpl.java | 1 - forge/build.gradle | 8 ++ .../flemmli97/flan/forge/FlanForge.java | 2 + .../platform/CrossPlatformStuffImpl.java | 4 +- .../claiming/OtherClaimingModCheckImpl.java | 61 +++++++++++++++ 18 files changed, 323 insertions(+), 56 deletions(-) create mode 100644 common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/FTBChunks.java create mode 100644 common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/OtherClaimingModCheck.java create mode 100644 common/src/main/java/io/github/flemmli97/flan/player/DisplayBox.java create mode 100644 fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/claiming/OtherClaimingModCheckImpl.java create mode 100644 forge/src/main/java/io/github/flemmli97/flan/forge/platform/integration/claiming/OtherClaimingModCheckImpl.java diff --git a/common/build.gradle b/common/build.gradle index 9ca4918..2848c4c 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -7,6 +7,10 @@ configurations { } repositories { + maven { + name = "FTB" + url = "https://maven.saps.dev/minecraft" + } maven { name = "CurseMaven" url "https://www.cursemaven.com" @@ -21,6 +25,8 @@ dependencies { shadowCommon group: 'org.yaml', name: 'snakeyaml', version: '1.25' modImplementation dynmap_fabric + + modImplementation "dev.ftb.mods:ftb-chunks:${rootProject.ftb_chunks}" } architectury { diff --git a/common/src/main/java/io/github/flemmli97/flan/Flan.java b/common/src/main/java/io/github/flemmli97/flan/Flan.java index 9d0a692..e6a2a5c 100644 --- a/common/src/main/java/io/github/flemmli97/flan/Flan.java +++ b/common/src/main/java/io/github/flemmli97/flan/Flan.java @@ -15,7 +15,7 @@ public class Flan { public static final Logger logger = LogManager.getLogger("flan"); - public static boolean permissionAPI, gunpowder, playerAbilityLib, ftbRanks, diceMCMoneySign, octoEconomy, diamondCurrency; + public static boolean permissionAPI, gunpowder, playerAbilityLib, ftbRanks, diceMCMoneySign, octoEconomy, diamondCurrency, ftbChunks, gomlServer, mineColonies; public static final DateTimeFormatter onlineTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 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 3fad601..9fbd77f 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 @@ -15,6 +15,7 @@ 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.DisplayBox; import io.github.flemmli97.flan.player.LogoutTracker; import io.github.flemmli97.flan.player.PlayerClaimData; import net.minecraft.ChatFormatting; @@ -842,6 +843,10 @@ public class Claim implements IPermissionContainer { return component; } + public DisplayBox display() { + return new DisplayBox(() -> new DisplayBox.Box(this.minX, this.minY, this.minZ, this.maxX, this.world.getMaxBuildHeight(), this.maxZ), this::isRemoved); + } + public enum InfoType { ALL, SIMPLE, 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 3975493..326118f 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,8 +14,10 @@ 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.claiming.OtherClaimingModCheck; import io.github.flemmli97.flan.platform.integration.dynmap.DynmapCalls; import io.github.flemmli97.flan.platform.integration.permissions.PermissionNodeHandler; +import io.github.flemmli97.flan.player.DisplayBox; import io.github.flemmli97.flan.player.EnumDisplayType; import io.github.flemmli97.flan.player.EnumEditMode; import io.github.flemmli97.flan.player.OfflinePlayerData; @@ -85,7 +87,7 @@ public class ClaimStorage implements IPermissionStorage { public boolean createClaim(BlockPos pos1, BlockPos pos2, ServerPlayer player) { Claim claim = new Claim(pos1.below(ConfigHandler.config.defaultClaimDepth), pos2.below(ConfigHandler.config.defaultClaimDepth), player); - Set conflicts = this.conflicts(claim, null); + Set conflicts = this.conflicts(claim, null); if (conflicts.isEmpty()) { PlayerClaimData data = PlayerClaimData.get(player); if (claim.getPlane() < ConfigHandler.config.minClaimsize) { @@ -116,8 +118,8 @@ public class ClaimStorage implements IPermissionStorage { return false; } - private Set conflicts(Claim claim, Claim except) { - Set conflicted = new HashSet<>(); + private Set conflicts(Claim claim, Claim except) { + Set conflicted = new HashSet<>(); int[] chunks = getChunkPos(claim); for (int x = chunks[0]; x <= chunks[1]; x++) for (int z = chunks[2]; z <= chunks[3]; z++) { @@ -125,10 +127,12 @@ public class ClaimStorage implements IPermissionStorage { if (claims != null) for (Claim other : claims) { if (claim.intersects(other) && !other.equals(except)) { - conflicted.add(other); + conflicted.add(other.display()); } } } + if (!claim.isAdminClaim()) + OtherClaimingModCheck.INSTANCE.findConflicts(claim, conflicted); return conflicted; } @@ -178,7 +182,7 @@ public class ClaimStorage implements IPermissionStorage { player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("minClaimSize"), ConfigHandler.config.minClaimsize), ChatFormatting.RED), false); return false; } - Set conflicts = this.conflicts(newClaim, claim); + Set conflicts = this.conflicts(newClaim, claim); if (!conflicts.isEmpty()) { conflicts.forEach(conf -> PlayerClaimData.get(player).addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.blockPosition().getY())); player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("conflictOther"), ChatFormatting.RED), false); @@ -456,16 +460,16 @@ public class ClaimStorage implements IPermissionStorage { parentClaim.getB().addSubClaimGriefprevention(parseFromYaml(childF, yml, server, perms).getB()); } ClaimStorage storage = ClaimStorage.get(parentClaim.getA()); - Set conflicts = storage.conflicts(parentClaim.getB(), null); + Set conflicts = storage.conflicts(parentClaim.getB(), null); if (conflicts.isEmpty()) { parentClaim.getB().setClaimID(storage.generateUUID()); storage.addClaim(parentClaim.getB()); } else { src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("readConflict"), parent.getName(), conflicts), ChatFormatting.DARK_RED), false); - for (Claim claim : conflicts) { - int[] dim = claim.getDimensions(); - MutableComponent text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim[0], dim[2]), ChatFormatting.RED); - text.setStyle(text.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tp @s " + dim[0] + " ~ " + dim[2])).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable("chat.coordinates.tooltip")))); + for (DisplayBox claim : conflicts) { + DisplayBox.Box dim = claim.box(); + MutableComponent text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim.minX(), dim.minZ()), ChatFormatting.RED); + text.setStyle(text.getStyle().withClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, "/tp @s " + dim.minX() + " ~ " + dim.minZ())).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable("chat.coordinates.tooltip")))); src.sendSuccess(text, false); } } diff --git a/common/src/main/java/io/github/flemmli97/flan/config/Config.java b/common/src/main/java/io/github/flemmli97/flan/config/Config.java index ee5216a..9de5b23 100644 --- a/common/src/main/java/io/github/flemmli97/flan/config/Config.java +++ b/common/src/main/java/io/github/flemmli97/flan/config/Config.java @@ -100,6 +100,10 @@ public class Config { public int configVersion = 4; public int preConfigVersion; + public boolean ftbChunksCheck = true; + public boolean gomlReservedCheck = true; + public boolean mineColoniesCheck = true; + public Map> defaultGroups = createHashMap(map -> { map.put("Co-Owner", createLinkedHashMap(perms -> PermissionRegistry.getPerms().forEach(p -> perms.put(p, true)))); map.put("Visitor", createLinkedHashMap(perms -> { @@ -171,6 +175,10 @@ public class Config { this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime); this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel); + this.ftbChunksCheck = ConfigHandler.fromJson(obj, "ftbChunksCheck", this.ftbChunksCheck); + this.gomlReservedCheck = ConfigHandler.fromJson(obj, "gomlReservedCheck", this.gomlReservedCheck); + this.mineColoniesCheck = ConfigHandler.fromJson(obj, "mineColoniesCheck", this.mineColoniesCheck); + this.buySellHandler.fromJson(ConfigHandler.fromJson(obj, "buySellHandler")); this.maxBuyBlocks = ConfigHandler.fromJson(obj, "maxBuyBlocks", this.maxBuyBlocks); @@ -267,6 +275,10 @@ public class Config { obj.addProperty("claimDisplayTime", this.claimDisplayTime); obj.addProperty("permissionLevel", this.permissionLevel); + obj.addProperty("ftbChunksCheck", this.ftbChunksCheck); + obj.addProperty("gomlReservedCheck", this.gomlReservedCheck); + obj.addProperty("mineColoniesCheck", this.mineColoniesCheck); + obj.add("buySellHandler", this.buySellHandler.toJson()); obj.addProperty("maxBuyBlocks", this.maxBuyBlocks); diff --git a/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/FTBChunks.java b/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/FTBChunks.java new file mode 100644 index 0000000..a7584c7 --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/FTBChunks.java @@ -0,0 +1,39 @@ +package io.github.flemmli97.flan.platform.integration.claiming; + +import dev.ftb.mods.ftbchunks.data.ClaimedChunk; +import dev.ftb.mods.ftbchunks.data.FTBChunksAPI; +import dev.ftb.mods.ftbchunks.data.FTBChunksTeamData; +import dev.ftb.mods.ftblibrary.math.ChunkDimPos; +import io.github.flemmli97.flan.Flan; +import io.github.flemmli97.flan.claim.Claim; +import io.github.flemmli97.flan.claim.ClaimStorage; +import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.player.DisplayBox; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class FTBChunks { + + public static void findConflicts(Claim claim, Set set) { + if (Flan.ftbChunks && ConfigHandler.config.ftbChunksCheck) { + ServerLevel level = claim.getWorld(); + int[] chunks = ClaimStorage.getChunkPos(claim); + Map> map = new HashMap<>(); + for (int x = chunks[0]; x <= chunks[1]; x++) + for (int z = chunks[2]; z <= chunks[3]; z++) { + ClaimedChunk chunk = FTBChunksAPI.getManager().getChunk(new ChunkDimPos(level.dimension(), x, z)); + if (chunk != null && !chunk.getTeamData().isTeamMember(claim.getOwner())) { + int blockX = x << 4; + int blockZ = z << 4; + //There is no reason to display it since ftb chunks has a map + set.add(new DisplayBox(blockX, level.getMinBuildHeight(), blockZ, blockX + 15, level.getMaxBuildHeight(), blockZ + 15, () -> true)); + } + } + } + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/OtherClaimingModCheck.java b/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/OtherClaimingModCheck.java new file mode 100644 index 0000000..6679eec --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/platform/integration/claiming/OtherClaimingModCheck.java @@ -0,0 +1,16 @@ +package io.github.flemmli97.flan.platform.integration.claiming; + +import io.github.flemmli97.flan.Flan; +import io.github.flemmli97.flan.claim.Claim; +import io.github.flemmli97.flan.player.DisplayBox; + +import java.util.Set; + +public interface OtherClaimingModCheck { + + OtherClaimingModCheck INSTANCE = Flan.getPlatformInstance(OtherClaimingModCheck.class, + "io.github.flemmli97.flan.fabric.platform.integration.claiming.OtherClaimingModCheckImpl", + "io.github.flemmli97.flan.forge.platform.integration.claiming.OtherClaimingModCheckImpl"); + + void findConflicts(Claim claim, Set set); +} diff --git a/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java b/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java index 21d9722..755fd54 100644 --- a/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java +++ b/common/src/main/java/io/github/flemmli97/flan/player/ClaimDisplay.java @@ -4,11 +4,13 @@ import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.ParticleIndicators; import io.github.flemmli97.flan.config.ConfigHandler; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.core.SectionPos; import net.minecraft.core.particles.DustParticleOptions; import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket; import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.LevelChunk; @@ -21,22 +23,26 @@ public class ClaimDisplay { private int displayTime; private final int height; - private final Claim toDisplay; + private final DisplayBox display; public final EnumDisplayType type; - private int[][] poss; + private int[][] corners; private int[][] middlePoss; - private int[] prevDims; + private DisplayBox.Box prevDims; private final DustParticleOptions corner, middle; public ClaimDisplay(Claim claim, EnumDisplayType type, int y) { - this.toDisplay = claim; + this(claim.display(), claim.getWorld(), type, y); + } + + public ClaimDisplay(DisplayBox display, Level level, EnumDisplayType type, int y) { + this.display = display; this.displayTime = ConfigHandler.config.claimDisplayTime; - this.prevDims = claim.getDimensions(); + this.prevDims = display.box(); this.type = type; - this.height = Math.max(1 + claim.getWorld().getMinBuildHeight(), y); + this.height = Math.max(1 + level.getMinBuildHeight(), y); switch (type) { case SUB -> { this.corner = ParticleIndicators.SUBCLAIMCORNER; @@ -59,18 +65,18 @@ public class ClaimDisplay { public boolean display(ServerPlayer player, boolean remove) { if (--this.displayTime % 2 == 0) - return this.toDisplay.isRemoved(); - int[] dims = this.toDisplay.getDimensions(); - if (this.poss == null || this.changed(dims)) { - this.middlePoss = calculateDisplayPos(player.getLevel(), dims, this.height); - this.poss = new int[][]{ - getPosFrom(player.getLevel(), dims[0], dims[2], this.height), - getPosFrom(player.getLevel(), dims[1], dims[2], this.height), - getPosFrom(player.getLevel(), dims[0], dims[3], this.height), - getPosFrom(player.getLevel(), dims[1], dims[3], this.height), + return this.display.isRemoved(); + DisplayBox.Box dims = this.display.box(); + if (this.corners == null || this.changed(dims)) { + this.middlePoss = calculateDisplayPos(player.getLevel(), dims, this.height, this.display.excludedSides()); + this.corners = new int[][]{ + getPosFrom(player.getLevel(), dims.minX(), dims.minZ(), this.height), + getPosFrom(player.getLevel(), dims.maxX(), dims.minZ(), this.height), + getPosFrom(player.getLevel(), dims.minX(), dims.maxZ(), this.height), + getPosFrom(player.getLevel(), dims.maxX(), dims.maxZ(), this.height), }; } - for (int[] pos : this.poss) { + for (int[] pos : this.corners) { if (pos[1] != pos[2]) player.connection.send(new ClientboundLevelParticlesPacket(this.corner, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); player.connection.send(new ClientboundLevelParticlesPacket(this.corner, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); @@ -82,34 +88,34 @@ public class ClaimDisplay { player.connection.send(new ClientboundLevelParticlesPacket(this.middle, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1)); } this.prevDims = dims; - return this.toDisplay.isRemoved() || (remove && this.displayTime < 0); + return this.display.isRemoved() || (remove && this.displayTime < 0); } - private boolean changed(int[] dims) { - for (int i = 0; i < dims.length; i++) - if (dims[i] != this.prevDims[i]) - return true; - return false; + private boolean changed(DisplayBox.Box dims) { + return !this.prevDims.equals(dims); } - public static int[][] calculateDisplayPos(ServerLevel world, int[] from, int height) { + public static int[][] calculateDisplayPos(ServerLevel world, DisplayBox.Box from, int height, Set exclude) { List l = new ArrayList<>(); Set xs = new HashSet<>(); - addEvenly(from[0], from[1], 10, xs); - xs.add(from[0] + 1); - xs.add(from[1] - 1); + addEvenly(from.minX(), from.maxX(), 10, xs); + xs.add(from.minX() + 1); + xs.add(from.maxX() - 1); Set zs = new HashSet<>(); - addEvenly(from[2], from[3], 10, zs); - zs.add(from[2] + 1); - zs.add(from[3] - 1); + addEvenly(from.minZ(), from.maxZ(), 10, zs); + zs.add(from.minZ() + 1); + zs.add(from.maxZ() - 1); for (int x : xs) { - l.add(getPosFrom(world, x, from[2], height)); - l.add(getPosFrom(world, x, from[3], height)); - + if (!exclude.contains(Direction.NORTH)) + l.add(getPosFrom(world, x, from.minZ(), height)); + if (!exclude.contains(Direction.SOUTH)) + l.add(getPosFrom(world, x, from.maxZ(), height)); } for (int z : zs) { - l.add(getPosFrom(world, from[0], z, height)); - l.add(getPosFrom(world, from[1], z, height)); + if (!exclude.contains(Direction.WEST)) + l.add(getPosFrom(world, from.minX(), z, height)); + if (!exclude.contains(Direction.EAST)) + l.add(getPosFrom(world, from.maxX(), z, height)); } return l.toArray(new int[0][]); @@ -186,7 +192,7 @@ public class ClaimDisplay { @Override public int hashCode() { - return this.toDisplay.hashCode(); + return this.display.hashCode(); } @Override @@ -194,7 +200,7 @@ public class ClaimDisplay { if (this == obj) return true; if (obj instanceof ClaimDisplay) - return this.toDisplay.equals(((ClaimDisplay) obj).toDisplay); + return this.display.equals(((ClaimDisplay) obj).display); return false; } } diff --git a/common/src/main/java/io/github/flemmli97/flan/player/DisplayBox.java b/common/src/main/java/io/github/flemmli97/flan/player/DisplayBox.java new file mode 100644 index 0000000..2282c0d --- /dev/null +++ b/common/src/main/java/io/github/flemmli97/flan/player/DisplayBox.java @@ -0,0 +1,63 @@ +package io.github.flemmli97.flan.player; + +import net.minecraft.core.Direction; + +import java.util.Arrays; +import java.util.EnumSet; +import java.util.Set; +import java.util.function.Supplier; + +public class DisplayBox { + + private final Box box; + private final Supplier boxSup; + private final Supplier removed; + + private final EnumSet excludedSides = EnumSet.noneOf(Direction.class); + + public DisplayBox(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Direction... exclude) { + this(minX, minY, minZ, maxX, maxY, maxZ, () -> false, exclude); + } + + public DisplayBox(int minX, int minY, int minZ, int maxX, int maxY, int maxZ, Supplier removed, Direction... exclude) { + this.box = new Box(minX, minY, minZ, Math.max(minX + 1, maxX), maxY, Math.max(minZ + 1, maxZ)); + this.boxSup = null; + this.removed = removed; + this.excludedSides.addAll(Arrays.asList(exclude)); + } + + /** + * For claims with dynamic size (atm only from this mod) + */ + public DisplayBox(Supplier sup, Supplier removed, Direction... exclude) { + this.box = sup.get(); + this.boxSup = sup; + this.removed = removed; + this.excludedSides.addAll(Arrays.asList(exclude)); + } + + public boolean isRemoved() { + return this.removed.get(); + } + + public Box box() { + if (this.boxSup != null) + return this.boxSup.get(); + return this.box; + } + + public Set excludedSides() { + return this.excludedSides; + } + + public record Box(int minX, int minY, int minZ, int maxX, int maxY, int maxZ) { + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Box otherBox)) + return false; + return this.minX == otherBox.minX && this.minY == otherBox.minY && this.minZ == otherBox.minZ + && this.maxX == otherBox.maxX && this.maxY == otherBox.maxY && this.maxZ == otherBox.maxZ; + } + } +} diff --git a/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java b/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java index 503e246..24b3a30 100644 --- a/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java +++ b/common/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java @@ -172,6 +172,11 @@ public class PlayerClaimData implements IPlayerData { } } + public void addDisplayClaim(DisplayBox display, EnumDisplayType type, int height) { + if (!display.isRemoved()) + this.displayToAdd.add(new ClaimDisplay(display, this.player.getLevel(), type, height)); + } + public EnumEditMode getEditMode() { return this.mode; } diff --git a/fabric/build.gradle b/fabric/build.gradle index 30c4d7c..b033192 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -46,6 +46,12 @@ repositories { url "https://www.cursemaven.com" } maven { url = "https://jitpack.io" } + maven { + url = "https://maven.jamieswhiteshirt.com/libs-release/" + content { + includeGroup 'com.jamieswhiteshirt' + } + } } dependencies { @@ -59,19 +65,19 @@ dependencies { modImplementation "me.lucko:fabric-permissions-api:${rootProject.fabric_permissions_api}" - // Rip currency on their maven and prob rip currency all together - /*modCompileOnly(gunpowder_currency) { - exclude group: "com.google.guava", module:"failureaccess" - }*/ modImplementation octo_economy_api - //modRuntimeOnly eights_economy modCompileOnly diamond_economy - //modImplementation "io.github.ladysnake:PlayerAbilityLib:${rootProject.player_ability_lib}" modCompileOnly "io.github.ladysnake:PlayerAbilityLib:${rootProject.player_ability_lib}" modCompileOnly "dev.ftb.mods:ftb-ranks-fabric:${rootProject.ftb_ranks}" + modRuntimeOnly "dev.ftb.mods:ftb-chunks-fabric:${rootProject.ftb_chunks}" + + modRuntimeOnly "dev.ftb.mods:ftb-chunks-fabric:${rootProject.ftb_chunks}" + //CompileOnly cause too many dependency + modCompileOnly goml_reserved + modCompileOnly include("com.jamieswhiteshirt:rtree-3i-lite-fabric:0.3.0") } processResources { 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 8306c9a..a824164 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 @@ -63,6 +63,9 @@ public class FlanFabric implements ModInitializer { Flan.ftbRanks = FabricLoader.getInstance().isModLoaded("ftbranks"); Flan.octoEconomy = FabricLoader.getInstance().isModLoaded("octo-economy-api"); Flan.diamondCurrency = FabricLoader.getInstance().isModLoaded("diamondeconomy"); + Flan.ftbChunks = FabricLoader.getInstance().isModLoaded("ftbchunks"); + Flan.gomlServer = FabricLoader.getInstance().isModLoaded("goml"); + if (Flan.playerAbilityLib) PlayerAbilityEvents.register(); if (FabricLoader.getInstance().isModLoaded("dynmap")) diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/claiming/OtherClaimingModCheckImpl.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/claiming/OtherClaimingModCheckImpl.java new file mode 100644 index 0000000..dd4f94e --- /dev/null +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/claiming/OtherClaimingModCheckImpl.java @@ -0,0 +1,32 @@ +package io.github.flemmli97.flan.fabric.platform.integration.claiming; + +import com.jamieswhiteshirt.rtree3i.Box; +import draylar.goml.api.ClaimUtils; +import io.github.flemmli97.flan.Flan; +import io.github.flemmli97.flan.claim.Claim; +import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.platform.integration.claiming.FTBChunks; +import io.github.flemmli97.flan.platform.integration.claiming.OtherClaimingModCheck; +import io.github.flemmli97.flan.player.DisplayBox; + +import java.util.Set; + +public class OtherClaimingModCheckImpl implements OtherClaimingModCheck { + + public void findConflicts(Claim claim, Set set) { + FTBChunks.findConflicts(claim, set); + if (Flan.gomlServer && ConfigHandler.config.gomlReservedCheck) { + int[] dim = claim.getDimensions(); + ClaimUtils.getClaimsInBox(claim.getWorld(), ClaimUtils.createBox(dim[0] - 1, dim[4], dim[2] - 1, dim[1] + 1, claim.getWorld().getMaxBuildHeight(), dim[3] + 1)) + .forEach(e -> { + if (!e.getValue().hasPermission(claim.getOwner())) + set.add(convertBox(e.getValue())); + }); + } + } + + private static DisplayBox convertBox(draylar.goml.api.Claim claim) { + Box box = claim.getClaimBox().toBox(); + return new DisplayBox(box.x1(), box.y1(), box.z1(), box.x2(), box.y2(), box.z2(), claim::isDestroyed); + } +} diff --git a/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/permissions/PermissionNodeHandlerImpl.java b/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/permissions/PermissionNodeHandlerImpl.java index 463c174..ce4df43 100644 --- a/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/permissions/PermissionNodeHandlerImpl.java +++ b/fabric/src/main/java/io/github/flemmli97/flan/fabric/platform/integration/permissions/PermissionNodeHandlerImpl.java @@ -38,7 +38,6 @@ public class PermissionNodeHandlerImpl implements PermissionNodeHandler { } - @Override public boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) { if (Flan.permissionAPI) { diff --git a/forge/build.gradle b/forge/build.gradle index e9f5724..b2a4778 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -31,6 +31,10 @@ repositories { name = "CurseMaven" url "https://www.cursemaven.com" } + maven { + name = "minecolonies" + url "https://ldtteam.jfrog.io/ldtteam/modding/" + } } dependencies { @@ -41,6 +45,10 @@ dependencies { modCompileOnly "dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}" modCompileOnly dicemcmm + + modRuntimeOnly "dev.ftb.mods:ftb-chunks-forge:${rootProject.ftb_chunks}" + //CompileOnly cause dependencies + modCompileOnly "com.ldtteam:minecolonies:${rootProject.minecolonies}" } processResources { 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 a7e6f82..01f221b 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 @@ -25,6 +25,8 @@ public class FlanForge { ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> "*", (s1, s2) -> true)); Flan.ftbRanks = ModList.get().isLoaded("ftbranks"); Flan.diceMCMoneySign = ModList.get().isLoaded("dicemcmm"); + Flan.ftbChunks = ModList.get().isLoaded("ftbchunks"); + Flan.mineColonies = ModList.get().isLoaded("minecolonies"); IEventBus forge = MinecraftForge.EVENT_BUS; forge.addListener(WorldEventsForge::modifyExplosion); diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/platform/CrossPlatformStuffImpl.java b/forge/src/main/java/io/github/flemmli97/flan/forge/platform/CrossPlatformStuffImpl.java index 278df6e..271c752 100644 --- a/forge/src/main/java/io/github/flemmli97/flan/forge/platform/CrossPlatformStuffImpl.java +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/platform/CrossPlatformStuffImpl.java @@ -11,8 +11,8 @@ import net.minecraft.world.entity.EntityType; import net.minecraft.world.item.Item; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraftforge.common.capabilities.ForgeCapabilities; import net.minecraftforge.fml.loading.FMLPaths; -import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.registries.ForgeRegistries; import java.nio.file.Path; @@ -46,7 +46,7 @@ public class CrossPlatformStuffImpl implements CrossPlatformStuff { @Override public boolean isInventoryTile(BlockEntity blockEntity) { - return blockEntity instanceof Container || blockEntity instanceof WorldlyContainerHolder || blockEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).isPresent(); + return blockEntity instanceof Container || blockEntity instanceof WorldlyContainerHolder || blockEntity.getCapability(ForgeCapabilities.ITEM_HANDLER).isPresent(); } @Override diff --git a/forge/src/main/java/io/github/flemmli97/flan/forge/platform/integration/claiming/OtherClaimingModCheckImpl.java b/forge/src/main/java/io/github/flemmli97/flan/forge/platform/integration/claiming/OtherClaimingModCheckImpl.java new file mode 100644 index 0000000..df36b9b --- /dev/null +++ b/forge/src/main/java/io/github/flemmli97/flan/forge/platform/integration/claiming/OtherClaimingModCheckImpl.java @@ -0,0 +1,61 @@ +package io.github.flemmli97.flan.forge.platform.integration.claiming; + +import com.minecolonies.api.colony.IColony; +import com.minecolonies.api.colony.IColonyManager; +import com.minecolonies.api.colony.permissions.Action; +import io.github.flemmli97.flan.Flan; +import io.github.flemmli97.flan.claim.Claim; +import io.github.flemmli97.flan.claim.ClaimStorage; +import io.github.flemmli97.flan.config.ConfigHandler; +import io.github.flemmli97.flan.platform.integration.claiming.FTBChunks; +import io.github.flemmli97.flan.platform.integration.claiming.OtherClaimingModCheck; +import io.github.flemmli97.flan.player.DisplayBox; +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.ChunkPos; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class OtherClaimingModCheckImpl implements OtherClaimingModCheck { + + public void findConflicts(Claim claim, Set set) { + FTBChunks.findConflicts(claim, set); + if (Flan.mineColonies && ConfigHandler.config.mineColoniesCheck) { + ServerLevel level = claim.getWorld(); + int[] chunks = ClaimStorage.getChunkPos(claim); + Map> map = new HashMap<>(); + for (int x = chunks[0]; x <= chunks[1]; x++) + for (int z = chunks[2]; z <= chunks[3]; z++) { + IColony colony = IColonyManager.getInstance().getColonyByPosFromWorld(level, new BlockPos(x << 4, 0, z << 4)); + if (colony == null) + continue; + if (!colony.getPermissions().hasPermission(colony.getPermissions().getRank(claim.getOwner()), Action.EDIT_PERMISSIONS)) { + map.computeIfAbsent(colony, c -> new ArrayList<>()).add(new ChunkPos(x, z)); + } + } + map.forEach((colony, poss) -> poss.forEach(pos -> { + int blockX = pos.x << 4; + int blockZ = pos.z << 4; + set.add(new DisplayBox(blockX, level.getMinBuildHeight(), blockZ, blockX + 15, level.getMaxBuildHeight(), blockZ + 15, () -> false, neighbors(pos, poss))); + })); + } + } + + private static Direction[] neighbors(ChunkPos pos, List others) { + List dirs = new ArrayList<>(); + if (others.contains(new ChunkPos(pos.x, pos.z - 1))) + dirs.add(Direction.NORTH); + if (others.contains(new ChunkPos(pos.x, pos.z + 1))) + dirs.add(Direction.SOUTH); + if (others.contains(new ChunkPos(pos.x + 1, pos.z))) + dirs.add(Direction.EAST); + if (others.contains(new ChunkPos(pos.x - 1, pos.z))) + dirs.add(Direction.WEST); + return dirs.toArray(new Direction[0]); + } +}