add support for some claiming mods preventing claiming into other mods claims. closes #162

This commit is contained in:
Flemmli97 2022-11-26 20:33:32 +01:00
parent ec3898e9a1
commit 9e003fc523
18 changed files with 323 additions and 56 deletions

View File

@ -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 {

View File

@ -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");

View File

@ -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,

View File

@ -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<Claim> conflicts = this.conflicts(claim, null);
Set<DisplayBox> 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<Claim> conflicts(Claim claim, Claim except) {
Set<Claim> conflicted = new HashSet<>();
private Set<DisplayBox> conflicts(Claim claim, Claim except) {
Set<DisplayBox> 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<Claim> conflicts = this.conflicts(newClaim, claim);
Set<DisplayBox> 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<Claim> conflicts = storage.conflicts(parentClaim.getB(), null);
Set<DisplayBox> 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);
}
}

View File

@ -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<String, Map<ClaimPermission, Boolean>> 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);

View File

@ -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<DisplayBox> set) {
if (Flan.ftbChunks && ConfigHandler.config.ftbChunksCheck) {
ServerLevel level = claim.getWorld();
int[] chunks = ClaimStorage.getChunkPos(claim);
Map<FTBChunksTeamData, List<ChunkPos>> 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));
}
}
}
}
}

View File

@ -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<DisplayBox> set);
}

View File

@ -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<Direction> exclude) {
List<int[]> l = new ArrayList<>();
Set<Integer> 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<Integer> 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;
}
}

View File

@ -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<Box> boxSup;
private final Supplier<Boolean> removed;
private final EnumSet<Direction> 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<Boolean> 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<Box> sup, Supplier<Boolean> 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<Direction> 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;
}
}
}

View File

@ -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;
}

View File

@ -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 {

View File

@ -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"))

View File

@ -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<DisplayBox> 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);
}
}

View File

@ -38,7 +38,6 @@ public class PermissionNodeHandlerImpl implements PermissionNodeHandler {
}
@Override
public boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) {
if (Flan.permissionAPI) {

View File

@ -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 {

View File

@ -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);

View File

@ -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

View File

@ -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<DisplayBox> set) {
FTBChunks.findConflicts(claim, set);
if (Flan.mineColonies && ConfigHandler.config.mineColoniesCheck) {
ServerLevel level = claim.getWorld();
int[] chunks = ClaimStorage.getChunkPos(claim);
Map<IColony, List<ChunkPos>> 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<ChunkPos> others) {
List<Direction> 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]);
}
}