add support for some claiming mods preventing claiming into other mods claims. closes #162
This commit is contained in:
parent
ec3898e9a1
commit
9e003fc523
@ -7,6 +7,10 @@ configurations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
maven {
|
||||||
|
name = "FTB"
|
||||||
|
url = "https://maven.saps.dev/minecraft"
|
||||||
|
}
|
||||||
maven {
|
maven {
|
||||||
name = "CurseMaven"
|
name = "CurseMaven"
|
||||||
url "https://www.cursemaven.com"
|
url "https://www.cursemaven.com"
|
||||||
@ -21,6 +25,8 @@ dependencies {
|
|||||||
shadowCommon group: 'org.yaml', name: 'snakeyaml', version: '1.25'
|
shadowCommon group: 'org.yaml', name: 'snakeyaml', version: '1.25'
|
||||||
|
|
||||||
modImplementation dynmap_fabric
|
modImplementation dynmap_fabric
|
||||||
|
|
||||||
|
modImplementation "dev.ftb.mods:ftb-chunks:${rootProject.ftb_chunks}"
|
||||||
}
|
}
|
||||||
|
|
||||||
architectury {
|
architectury {
|
||||||
|
@ -15,7 +15,7 @@ public class Flan {
|
|||||||
|
|
||||||
public static final Logger logger = LogManager.getLogger("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");
|
public static final DateTimeFormatter onlineTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ import io.github.flemmli97.flan.config.ConfigHandler;
|
|||||||
import io.github.flemmli97.flan.platform.ClaimPermissionCheck;
|
import io.github.flemmli97.flan.platform.ClaimPermissionCheck;
|
||||||
import io.github.flemmli97.flan.platform.CrossPlatformStuff;
|
import io.github.flemmli97.flan.platform.CrossPlatformStuff;
|
||||||
import io.github.flemmli97.flan.platform.integration.dynmap.DynmapCalls;
|
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.LogoutTracker;
|
||||||
import io.github.flemmli97.flan.player.PlayerClaimData;
|
import io.github.flemmli97.flan.player.PlayerClaimData;
|
||||||
import net.minecraft.ChatFormatting;
|
import net.minecraft.ChatFormatting;
|
||||||
@ -842,6 +843,10 @@ public class Claim implements IPermissionContainer {
|
|||||||
return component;
|
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 {
|
public enum InfoType {
|
||||||
ALL,
|
ALL,
|
||||||
SIMPLE,
|
SIMPLE,
|
||||||
|
@ -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.ClaimPermission;
|
||||||
import io.github.flemmli97.flan.api.permission.PermissionRegistry;
|
import io.github.flemmli97.flan.api.permission.PermissionRegistry;
|
||||||
import io.github.flemmli97.flan.config.ConfigHandler;
|
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.dynmap.DynmapCalls;
|
||||||
import io.github.flemmli97.flan.platform.integration.permissions.PermissionNodeHandler;
|
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.EnumDisplayType;
|
||||||
import io.github.flemmli97.flan.player.EnumEditMode;
|
import io.github.flemmli97.flan.player.EnumEditMode;
|
||||||
import io.github.flemmli97.flan.player.OfflinePlayerData;
|
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) {
|
public boolean createClaim(BlockPos pos1, BlockPos pos2, ServerPlayer player) {
|
||||||
Claim claim = new Claim(pos1.below(ConfigHandler.config.defaultClaimDepth), pos2.below(ConfigHandler.config.defaultClaimDepth), 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()) {
|
if (conflicts.isEmpty()) {
|
||||||
PlayerClaimData data = PlayerClaimData.get(player);
|
PlayerClaimData data = PlayerClaimData.get(player);
|
||||||
if (claim.getPlane() < ConfigHandler.config.minClaimsize) {
|
if (claim.getPlane() < ConfigHandler.config.minClaimsize) {
|
||||||
@ -116,8 +118,8 @@ public class ClaimStorage implements IPermissionStorage {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Set<Claim> conflicts(Claim claim, Claim except) {
|
private Set<DisplayBox> conflicts(Claim claim, Claim except) {
|
||||||
Set<Claim> conflicted = new HashSet<>();
|
Set<DisplayBox> conflicted = new HashSet<>();
|
||||||
int[] chunks = getChunkPos(claim);
|
int[] chunks = getChunkPos(claim);
|
||||||
for (int x = chunks[0]; x <= chunks[1]; x++)
|
for (int x = chunks[0]; x <= chunks[1]; x++)
|
||||||
for (int z = chunks[2]; z <= chunks[3]; z++) {
|
for (int z = chunks[2]; z <= chunks[3]; z++) {
|
||||||
@ -125,10 +127,12 @@ public class ClaimStorage implements IPermissionStorage {
|
|||||||
if (claims != null)
|
if (claims != null)
|
||||||
for (Claim other : claims) {
|
for (Claim other : claims) {
|
||||||
if (claim.intersects(other) && !other.equals(except)) {
|
if (claim.intersects(other) && !other.equals(except)) {
|
||||||
conflicted.add(other);
|
conflicted.add(other.display());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!claim.isAdminClaim())
|
||||||
|
OtherClaimingModCheck.INSTANCE.findConflicts(claim, conflicted);
|
||||||
return 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);
|
player.displayClientMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("minClaimSize"), ConfigHandler.config.minClaimsize), ChatFormatting.RED), false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Set<Claim> conflicts = this.conflicts(newClaim, claim);
|
Set<DisplayBox> conflicts = this.conflicts(newClaim, claim);
|
||||||
if (!conflicts.isEmpty()) {
|
if (!conflicts.isEmpty()) {
|
||||||
conflicts.forEach(conf -> PlayerClaimData.get(player).addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
|
conflicts.forEach(conf -> PlayerClaimData.get(player).addDisplayClaim(conf, EnumDisplayType.CONFLICT, player.blockPosition().getY()));
|
||||||
player.displayClientMessage(PermHelper.simpleColoredText(ConfigHandler.langManager.get("conflictOther"), ChatFormatting.RED), false);
|
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());
|
parentClaim.getB().addSubClaimGriefprevention(parseFromYaml(childF, yml, server, perms).getB());
|
||||||
}
|
}
|
||||||
ClaimStorage storage = ClaimStorage.get(parentClaim.getA());
|
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()) {
|
if (conflicts.isEmpty()) {
|
||||||
parentClaim.getB().setClaimID(storage.generateUUID());
|
parentClaim.getB().setClaimID(storage.generateUUID());
|
||||||
storage.addClaim(parentClaim.getB());
|
storage.addClaim(parentClaim.getB());
|
||||||
} else {
|
} else {
|
||||||
src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("readConflict"), parent.getName(), conflicts), ChatFormatting.DARK_RED), false);
|
src.sendSuccess(PermHelper.simpleColoredText(String.format(ConfigHandler.langManager.get("readConflict"), parent.getName(), conflicts), ChatFormatting.DARK_RED), false);
|
||||||
for (Claim claim : conflicts) {
|
for (DisplayBox claim : conflicts) {
|
||||||
int[] dim = claim.getDimensions();
|
DisplayBox.Box dim = claim.box();
|
||||||
MutableComponent text = PermHelper.simpleColoredText(String.format("@[x=%d;z=%d]", dim[0], dim[2]), ChatFormatting.RED);
|
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[0] + " ~ " + dim[2])).withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, Component.translatable("chat.coordinates.tooltip"))));
|
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);
|
src.sendSuccess(text, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,6 +100,10 @@ public class Config {
|
|||||||
public int configVersion = 4;
|
public int configVersion = 4;
|
||||||
public int preConfigVersion;
|
public int preConfigVersion;
|
||||||
|
|
||||||
|
public boolean ftbChunksCheck = true;
|
||||||
|
public boolean gomlReservedCheck = true;
|
||||||
|
public boolean mineColoniesCheck = true;
|
||||||
|
|
||||||
public Map<String, Map<ClaimPermission, Boolean>> defaultGroups = createHashMap(map -> {
|
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("Co-Owner", createLinkedHashMap(perms -> PermissionRegistry.getPerms().forEach(p -> perms.put(p, true))));
|
||||||
map.put("Visitor", createLinkedHashMap(perms -> {
|
map.put("Visitor", createLinkedHashMap(perms -> {
|
||||||
@ -171,6 +175,10 @@ public class Config {
|
|||||||
this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime);
|
this.claimDisplayTime = ConfigHandler.fromJson(obj, "claimDisplayTime", this.claimDisplayTime);
|
||||||
this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel);
|
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.buySellHandler.fromJson(ConfigHandler.fromJson(obj, "buySellHandler"));
|
||||||
this.maxBuyBlocks = ConfigHandler.fromJson(obj, "maxBuyBlocks", this.maxBuyBlocks);
|
this.maxBuyBlocks = ConfigHandler.fromJson(obj, "maxBuyBlocks", this.maxBuyBlocks);
|
||||||
|
|
||||||
@ -267,6 +275,10 @@ public class Config {
|
|||||||
obj.addProperty("claimDisplayTime", this.claimDisplayTime);
|
obj.addProperty("claimDisplayTime", this.claimDisplayTime);
|
||||||
obj.addProperty("permissionLevel", this.permissionLevel);
|
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.add("buySellHandler", this.buySellHandler.toJson());
|
||||||
obj.addProperty("maxBuyBlocks", this.maxBuyBlocks);
|
obj.addProperty("maxBuyBlocks", this.maxBuyBlocks);
|
||||||
|
|
||||||
|
@ -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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
@ -4,11 +4,13 @@ import io.github.flemmli97.flan.claim.Claim;
|
|||||||
import io.github.flemmli97.flan.claim.ParticleIndicators;
|
import io.github.flemmli97.flan.claim.ParticleIndicators;
|
||||||
import io.github.flemmli97.flan.config.ConfigHandler;
|
import io.github.flemmli97.flan.config.ConfigHandler;
|
||||||
import net.minecraft.core.BlockPos;
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.core.Direction;
|
||||||
import net.minecraft.core.SectionPos;
|
import net.minecraft.core.SectionPos;
|
||||||
import net.minecraft.core.particles.DustParticleOptions;
|
import net.minecraft.core.particles.DustParticleOptions;
|
||||||
import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket;
|
import net.minecraft.network.protocol.game.ClientboundLevelParticlesPacket;
|
||||||
import net.minecraft.server.level.ServerLevel;
|
import net.minecraft.server.level.ServerLevel;
|
||||||
import net.minecraft.server.level.ServerPlayer;
|
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.block.state.BlockState;
|
||||||
import net.minecraft.world.level.chunk.LevelChunk;
|
import net.minecraft.world.level.chunk.LevelChunk;
|
||||||
|
|
||||||
@ -21,22 +23,26 @@ public class ClaimDisplay {
|
|||||||
|
|
||||||
private int displayTime;
|
private int displayTime;
|
||||||
private final int height;
|
private final int height;
|
||||||
private final Claim toDisplay;
|
private final DisplayBox display;
|
||||||
public final EnumDisplayType type;
|
public final EnumDisplayType type;
|
||||||
private int[][] poss;
|
private int[][] corners;
|
||||||
|
|
||||||
private int[][] middlePoss;
|
private int[][] middlePoss;
|
||||||
|
|
||||||
private int[] prevDims;
|
private DisplayBox.Box prevDims;
|
||||||
|
|
||||||
private final DustParticleOptions corner, middle;
|
private final DustParticleOptions corner, middle;
|
||||||
|
|
||||||
public ClaimDisplay(Claim claim, EnumDisplayType type, int y) {
|
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.displayTime = ConfigHandler.config.claimDisplayTime;
|
||||||
this.prevDims = claim.getDimensions();
|
this.prevDims = display.box();
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.height = Math.max(1 + claim.getWorld().getMinBuildHeight(), y);
|
this.height = Math.max(1 + level.getMinBuildHeight(), y);
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SUB -> {
|
case SUB -> {
|
||||||
this.corner = ParticleIndicators.SUBCLAIMCORNER;
|
this.corner = ParticleIndicators.SUBCLAIMCORNER;
|
||||||
@ -59,18 +65,18 @@ public class ClaimDisplay {
|
|||||||
|
|
||||||
public boolean display(ServerPlayer player, boolean remove) {
|
public boolean display(ServerPlayer player, boolean remove) {
|
||||||
if (--this.displayTime % 2 == 0)
|
if (--this.displayTime % 2 == 0)
|
||||||
return this.toDisplay.isRemoved();
|
return this.display.isRemoved();
|
||||||
int[] dims = this.toDisplay.getDimensions();
|
DisplayBox.Box dims = this.display.box();
|
||||||
if (this.poss == null || this.changed(dims)) {
|
if (this.corners == null || this.changed(dims)) {
|
||||||
this.middlePoss = calculateDisplayPos(player.getLevel(), dims, this.height);
|
this.middlePoss = calculateDisplayPos(player.getLevel(), dims, this.height, this.display.excludedSides());
|
||||||
this.poss = new int[][]{
|
this.corners = new int[][]{
|
||||||
getPosFrom(player.getLevel(), dims[0], dims[2], this.height),
|
getPosFrom(player.getLevel(), dims.minX(), dims.minZ(), this.height),
|
||||||
getPosFrom(player.getLevel(), dims[1], dims[2], this.height),
|
getPosFrom(player.getLevel(), dims.maxX(), dims.minZ(), this.height),
|
||||||
getPosFrom(player.getLevel(), dims[0], dims[3], this.height),
|
getPosFrom(player.getLevel(), dims.minX(), dims.maxZ(), this.height),
|
||||||
getPosFrom(player.getLevel(), dims[1], dims[3], 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])
|
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[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));
|
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));
|
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;
|
this.prevDims = dims;
|
||||||
return this.toDisplay.isRemoved() || (remove && this.displayTime < 0);
|
return this.display.isRemoved() || (remove && this.displayTime < 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean changed(int[] dims) {
|
private boolean changed(DisplayBox.Box dims) {
|
||||||
for (int i = 0; i < dims.length; i++)
|
return !this.prevDims.equals(dims);
|
||||||
if (dims[i] != this.prevDims[i])
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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<>();
|
List<int[]> l = new ArrayList<>();
|
||||||
Set<Integer> xs = new HashSet<>();
|
Set<Integer> xs = new HashSet<>();
|
||||||
addEvenly(from[0], from[1], 10, xs);
|
addEvenly(from.minX(), from.maxX(), 10, xs);
|
||||||
xs.add(from[0] + 1);
|
xs.add(from.minX() + 1);
|
||||||
xs.add(from[1] - 1);
|
xs.add(from.maxX() - 1);
|
||||||
Set<Integer> zs = new HashSet<>();
|
Set<Integer> zs = new HashSet<>();
|
||||||
addEvenly(from[2], from[3], 10, zs);
|
addEvenly(from.minZ(), from.maxZ(), 10, zs);
|
||||||
zs.add(from[2] + 1);
|
zs.add(from.minZ() + 1);
|
||||||
zs.add(from[3] - 1);
|
zs.add(from.maxZ() - 1);
|
||||||
for (int x : xs) {
|
for (int x : xs) {
|
||||||
l.add(getPosFrom(world, x, from[2], height));
|
if (!exclude.contains(Direction.NORTH))
|
||||||
l.add(getPosFrom(world, x, from[3], height));
|
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) {
|
for (int z : zs) {
|
||||||
l.add(getPosFrom(world, from[0], z, height));
|
if (!exclude.contains(Direction.WEST))
|
||||||
l.add(getPosFrom(world, from[1], z, height));
|
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][]);
|
return l.toArray(new int[0][]);
|
||||||
@ -186,7 +192,7 @@ public class ClaimDisplay {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
return this.toDisplay.hashCode();
|
return this.display.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -194,7 +200,7 @@ public class ClaimDisplay {
|
|||||||
if (this == obj)
|
if (this == obj)
|
||||||
return true;
|
return true;
|
||||||
if (obj instanceof ClaimDisplay)
|
if (obj instanceof ClaimDisplay)
|
||||||
return this.toDisplay.equals(((ClaimDisplay) obj).toDisplay);
|
return this.display.equals(((ClaimDisplay) obj).display);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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() {
|
public EnumEditMode getEditMode() {
|
||||||
return this.mode;
|
return this.mode;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,12 @@ repositories {
|
|||||||
url "https://www.cursemaven.com"
|
url "https://www.cursemaven.com"
|
||||||
}
|
}
|
||||||
maven { url = "https://jitpack.io" }
|
maven { url = "https://jitpack.io" }
|
||||||
|
maven {
|
||||||
|
url = "https://maven.jamieswhiteshirt.com/libs-release/"
|
||||||
|
content {
|
||||||
|
includeGroup 'com.jamieswhiteshirt'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@ -59,19 +65,19 @@ dependencies {
|
|||||||
|
|
||||||
modImplementation "me.lucko:fabric-permissions-api:${rootProject.fabric_permissions_api}"
|
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
|
modImplementation octo_economy_api
|
||||||
//modRuntimeOnly eights_economy
|
|
||||||
modCompileOnly diamond_economy
|
modCompileOnly diamond_economy
|
||||||
|
|
||||||
//modImplementation "io.github.ladysnake:PlayerAbilityLib:${rootProject.player_ability_lib}"
|
|
||||||
modCompileOnly "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}"
|
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 {
|
processResources {
|
||||||
|
@ -63,6 +63,9 @@ public class FlanFabric implements ModInitializer {
|
|||||||
Flan.ftbRanks = FabricLoader.getInstance().isModLoaded("ftbranks");
|
Flan.ftbRanks = FabricLoader.getInstance().isModLoaded("ftbranks");
|
||||||
Flan.octoEconomy = FabricLoader.getInstance().isModLoaded("octo-economy-api");
|
Flan.octoEconomy = FabricLoader.getInstance().isModLoaded("octo-economy-api");
|
||||||
Flan.diamondCurrency = FabricLoader.getInstance().isModLoaded("diamondeconomy");
|
Flan.diamondCurrency = FabricLoader.getInstance().isModLoaded("diamondeconomy");
|
||||||
|
Flan.ftbChunks = FabricLoader.getInstance().isModLoaded("ftbchunks");
|
||||||
|
Flan.gomlServer = FabricLoader.getInstance().isModLoaded("goml");
|
||||||
|
|
||||||
if (Flan.playerAbilityLib)
|
if (Flan.playerAbilityLib)
|
||||||
PlayerAbilityEvents.register();
|
PlayerAbilityEvents.register();
|
||||||
if (FabricLoader.getInstance().isModLoaded("dynmap"))
|
if (FabricLoader.getInstance().isModLoaded("dynmap"))
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
@ -38,7 +38,6 @@ public class PermissionNodeHandlerImpl implements PermissionNodeHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) {
|
public boolean permBelowEqVal(ServerPlayer src, String perm, int val, int fallback) {
|
||||||
if (Flan.permissionAPI) {
|
if (Flan.permissionAPI) {
|
||||||
|
@ -31,6 +31,10 @@ repositories {
|
|||||||
name = "CurseMaven"
|
name = "CurseMaven"
|
||||||
url "https://www.cursemaven.com"
|
url "https://www.cursemaven.com"
|
||||||
}
|
}
|
||||||
|
maven {
|
||||||
|
name = "minecolonies"
|
||||||
|
url "https://ldtteam.jfrog.io/ldtteam/modding/"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
@ -41,6 +45,10 @@ dependencies {
|
|||||||
|
|
||||||
modCompileOnly "dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}"
|
modCompileOnly "dev.ftb.mods:ftb-ranks-forge:${ftb_ranks}"
|
||||||
modCompileOnly dicemcmm
|
modCompileOnly dicemcmm
|
||||||
|
|
||||||
|
modRuntimeOnly "dev.ftb.mods:ftb-chunks-forge:${rootProject.ftb_chunks}"
|
||||||
|
//CompileOnly cause dependencies
|
||||||
|
modCompileOnly "com.ldtteam:minecolonies:${rootProject.minecolonies}"
|
||||||
}
|
}
|
||||||
|
|
||||||
processResources {
|
processResources {
|
||||||
|
@ -25,6 +25,8 @@ public class FlanForge {
|
|||||||
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> "*", (s1, s2) -> true));
|
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> "*", (s1, s2) -> true));
|
||||||
Flan.ftbRanks = ModList.get().isLoaded("ftbranks");
|
Flan.ftbRanks = ModList.get().isLoaded("ftbranks");
|
||||||
Flan.diceMCMoneySign = ModList.get().isLoaded("dicemcmm");
|
Flan.diceMCMoneySign = ModList.get().isLoaded("dicemcmm");
|
||||||
|
Flan.ftbChunks = ModList.get().isLoaded("ftbchunks");
|
||||||
|
Flan.mineColonies = ModList.get().isLoaded("minecolonies");
|
||||||
|
|
||||||
IEventBus forge = MinecraftForge.EVENT_BUS;
|
IEventBus forge = MinecraftForge.EVENT_BUS;
|
||||||
forge.addListener(WorldEventsForge::modifyExplosion);
|
forge.addListener(WorldEventsForge::modifyExplosion);
|
||||||
|
@ -11,8 +11,8 @@ import net.minecraft.world.entity.EntityType;
|
|||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
import net.minecraft.world.level.block.Block;
|
import net.minecraft.world.level.block.Block;
|
||||||
import net.minecraft.world.level.block.entity.BlockEntity;
|
import net.minecraft.world.level.block.entity.BlockEntity;
|
||||||
|
import net.minecraftforge.common.capabilities.ForgeCapabilities;
|
||||||
import net.minecraftforge.fml.loading.FMLPaths;
|
import net.minecraftforge.fml.loading.FMLPaths;
|
||||||
import net.minecraftforge.items.CapabilityItemHandler;
|
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
import net.minecraftforge.registries.ForgeRegistries;
|
||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@ -46,7 +46,7 @@ public class CrossPlatformStuffImpl implements CrossPlatformStuff {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isInventoryTile(BlockEntity blockEntity) {
|
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
|
@Override
|
||||||
|
@ -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]);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user