add a blacklist for blockentity and entity tags.

This commit is contained in:
Flemmli97 2021-06-10 19:09:59 +02:00
parent 964a87d98c
commit d8216079a3
6 changed files with 47 additions and 19 deletions

View File

@ -196,6 +196,7 @@ public class Claim implements IPermissionContainer {
return this.removed; return this.removed;
} }
@Override
public boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos, boolean message) { public boolean canInteract(ServerPlayerEntity player, ClaimPermission perm, BlockPos pos, boolean message) {
ActionResult res = ClaimPermissionEvent.CHECK.invoker().check(player, perm, pos); ActionResult res = ClaimPermissionEvent.CHECK.invoker().check(player, perm, pos);
if (res != ActionResult.PASS) if (res != ActionResult.PASS)

View File

@ -114,7 +114,7 @@ public class CommandClaim {
.suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGroupPerm)))))); .suggests((ctx, b) -> CommandSource.suggestMatching(new String[]{"default", "true", "false"}, b)).executes(CommandClaim::editGroupPerm))))));
builder.then(CommandManager.literal("help").executes(ctx -> CommandHelp.helpMessage(ctx, 0, builder.getArguments())) builder.then(CommandManager.literal("help").executes(ctx -> CommandHelp.helpMessage(ctx, 0, builder.getArguments()))
.then(CommandManager.argument("page", IntegerArgumentType.integer()).executes(ctx -> CommandHelp.helpMessage(ctx, builder.getArguments()))) .then(CommandManager.argument("page", IntegerArgumentType.integer()).executes(ctx -> CommandHelp.helpMessage(ctx, builder.getArguments())))
.then(CommandManager.literal("cmd").then(CommandManager.argument("command", StringArgumentType.word()).suggests((ctx, sb) -> CommandSource.suggestMatching(CommandHelp.registeredCommands(ctx, builder.getArguments()), sb)).executes(ctx -> CommandHelp.helpCmd(ctx))))); .then(CommandManager.literal("cmd").then(CommandManager.argument("command", StringArgumentType.word()).suggests((ctx, sb) -> CommandSource.suggestMatching(CommandHelp.registeredCommands(ctx, builder.getArguments()), sb)).executes(CommandHelp::helpCmd))));
dispatcher.register(builder); dispatcher.register(builder);
} }

View File

@ -1,5 +1,6 @@
package io.github.flemmli97.flan.config; package io.github.flemmli97.flan.config;
import com.google.common.collect.Lists;
import com.google.gson.JsonArray; import com.google.gson.JsonArray;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import io.github.flemmli97.flan.Flan; import io.github.flemmli97.flan.Flan;
@ -35,6 +36,12 @@ public class Config {
public int defaultClaimDepth = 10; public int defaultClaimDepth = 10;
public boolean lenientBlockEntityCheck; public boolean lenientBlockEntityCheck;
public List<String> ignoredBlocks = new ArrayList<>(); public List<String> ignoredBlocks = new ArrayList<>();
public List<String> blockEntityTagIgnore = Lists.newArrayList(
"IsDeathChest" //vanilla death chest
);
public List<String> entityTagIgnore = Lists.newArrayList(
"graves.marker" //vanilla tweaks
);
public String[] blacklistedWorlds = new String[0]; public String[] blacklistedWorlds = new String[0];
public boolean worldWhitelist; public boolean worldWhitelist;
@ -70,12 +77,10 @@ public class Config {
})); }));
}); });
private final Map<String, Map<ClaimPermission, GlobalType>> globalDefaultPerms = createHashMap(map -> { private final Map<String, Map<ClaimPermission, GlobalType>> globalDefaultPerms = createHashMap(map -> map.put("*", createHashMap(perms -> {
map.put("*", createHashMap(perms -> { perms.put(PermissionRegistry.FLIGHT, GlobalType.ALLTRUE);
perms.put(PermissionRegistry.FLIGHT, GlobalType.ALLTRUE); perms.put(PermissionRegistry.MOBSPAWN, GlobalType.ALLFALSE);
perms.put(PermissionRegistry.MOBSPAWN, GlobalType.ALLFALSE); })));
}));
});
public Config(MinecraftServer server) { public Config(MinecraftServer server) {
File configDir = FabricLoader.getInstance().getConfigDir().resolve("flan").toFile(); File configDir = FabricLoader.getInstance().getConfigDir().resolve("flan").toFile();
@ -104,8 +109,12 @@ public class Config {
this.defaultClaimDepth = ConfigHandler.fromJson(obj, "defaultClaimDepth", this.defaultClaimDepth); this.defaultClaimDepth = ConfigHandler.fromJson(obj, "defaultClaimDepth", this.defaultClaimDepth);
this.lenientBlockEntityCheck = ConfigHandler.fromJson(obj, "lenientBlockEntityCheck", this.lenientBlockEntityCheck); this.lenientBlockEntityCheck = ConfigHandler.fromJson(obj, "lenientBlockEntityCheck", this.lenientBlockEntityCheck);
this.ignoredBlocks.clear(); this.ignoredBlocks.clear();
JsonArray blockCheck = ConfigHandler.arryFromJson(obj, "ignoredBlocks"); ConfigHandler.arryFromJson(obj, "ignoredBlocks").forEach(e -> this.ignoredBlocks.add(e.getAsString()));
blockCheck.forEach(e -> this.ignoredBlocks.add(e.getAsString())); this.blockEntityTagIgnore.clear();
ConfigHandler.arryFromJson(obj, "blockEntityTagIgnore").forEach(e -> this.blockEntityTagIgnore.add(e.getAsString()));
this.entityTagIgnore.clear();
ConfigHandler.arryFromJson(obj, "entityTagIgnore").forEach(e -> this.entityTagIgnore.add(e.getAsString()));
JsonArray arr = ConfigHandler.arryFromJson(obj, "blacklistedWorlds"); JsonArray arr = ConfigHandler.arryFromJson(obj, "blacklistedWorlds");
this.blacklistedWorlds = new String[arr.size()]; this.blacklistedWorlds = new String[arr.size()];
for (int i = 0; i < arr.size(); i++) for (int i = 0; i < arr.size(); i++)
@ -173,6 +182,13 @@ public class Config {
this.ignoredBlocks.forEach(blocks::add); this.ignoredBlocks.forEach(blocks::add);
obj.add("ignoredBlocks", blocks); obj.add("ignoredBlocks", blocks);
obj.addProperty("lenientBlockEntityCheck", this.lenientBlockEntityCheck); obj.addProperty("lenientBlockEntityCheck", this.lenientBlockEntityCheck);
JsonArray blocksEntities = new JsonArray();
this.blockEntityTagIgnore.forEach(blocksEntities::add);
obj.add("blockEntityTagIgnore", blocksEntities);
JsonArray entities = new JsonArray();
this.entityTagIgnore.forEach(entities::add);
obj.add("entityTagIgnore", entities);
JsonArray arr = new JsonArray(); JsonArray arr = new JsonArray();
for (String blacklistedWorld : this.blacklistedWorlds) for (String blacklistedWorld : this.blacklistedWorlds)
arr.add(blacklistedWorld); arr.add(blacklistedWorld);
@ -220,9 +236,9 @@ public class Config {
if (allMap != null) { if (allMap != null) {
world.getServer().getWorlds().forEach(w -> { world.getServer().getWorlds().forEach(w -> {
Map<ClaimPermission, GlobalType> wMap = ConfigHandler.config.globalDefaultPerms.getOrDefault(w.getRegistryKey().getValue().toString(), new HashMap<>()); Map<ClaimPermission, GlobalType> wMap = ConfigHandler.config.globalDefaultPerms.getOrDefault(w.getRegistryKey().getValue().toString(), new HashMap<>());
allMap.entrySet().forEach(e -> { allMap.forEach((key, value) -> {
if (!wMap.containsKey(e.getKey())) if (!wMap.containsKey(key))
wMap.put(e.getKey(), e.getValue()); wMap.put(key, value);
}); });
ConfigHandler.config.globalDefaultPerms.put(w.getRegistryKey().getValue().toString(), wMap); ConfigHandler.config.globalDefaultPerms.put(w.getRegistryKey().getValue().toString(), wMap);
}); });

View File

@ -22,6 +22,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.projectile.ProjectileEntity; import net.minecraft.entity.projectile.ProjectileEntity;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket; import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
@ -43,7 +44,7 @@ public class BlockInteractEvents {
IPermissionContainer claim = storage.getForPermissionCheck(pos); IPermissionContainer claim = storage.getForPermissionCheck(pos);
if (claim != null) { if (claim != null) {
Identifier id = Registry.BLOCK.getId(state.getBlock()); Identifier id = Registry.BLOCK.getId(state.getBlock());
if (ConfigHandler.config.ignoredBlocks.contains(id.toString())) if (alwaysAllowBlock(id, world.getBlockEntity(pos)))
return true; return true;
if (!claim.canInteract(player, PermissionRegistry.BREAK, pos, true)) { if (!claim.canInteract(player, PermissionRegistry.BREAK, pos, true)) {
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY());
@ -75,7 +76,8 @@ public class BlockInteractEvents {
if (!cancelBlockInteract) { if (!cancelBlockInteract) {
BlockState state = world.getBlockState(hitResult.getBlockPos()); BlockState state = world.getBlockState(hitResult.getBlockPos());
Identifier id = Registry.BLOCK.getId(state.getBlock()); Identifier id = Registry.BLOCK.getId(state.getBlock());
if (ConfigHandler.config.ignoredBlocks.contains(id.toString())) BlockEntity blockEntity = world.getBlockEntity(hitResult.getBlockPos());
if (alwaysAllowBlock(id, blockEntity))
return ActionResult.PASS; return ActionResult.PASS;
ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock()); ClaimPermission perm = ObjectToPermissionMap.getFromBlock(state.getBlock());
if (perm == PermissionRegistry.PROJECTILES) if (perm == PermissionRegistry.PROJECTILES)
@ -97,7 +99,6 @@ public class BlockInteractEvents {
PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY()); PlayerClaimData.get(player).addDisplayClaim(claim, EnumDisplayType.MAIN, player.getBlockPos().getY());
return ActionResult.FAIL; return ActionResult.FAIL;
} }
BlockEntity blockEntity = world.getBlockEntity(hitResult.getBlockPos());
if (blockEntity != null) { if (blockEntity != null) {
if (blockEntity instanceof LecternBlockEntity) { if (blockEntity instanceof LecternBlockEntity) {
if (claim.canInteract(player, PermissionRegistry.LECTERNTAKE, hitResult.getBlockPos(), false)) if (claim.canInteract(player, PermissionRegistry.LECTERNTAKE, hitResult.getBlockPos(), false))
@ -118,6 +119,12 @@ public class BlockInteractEvents {
return ActionResult.PASS; return ActionResult.PASS;
} }
public static boolean alwaysAllowBlock(Identifier id, BlockEntity blockEntity) {
return ConfigHandler.config.ignoredBlocks.contains(id.toString())
|| (blockEntity != null
&& ConfigHandler.config.blockEntityTagIgnore.stream().anyMatch(blockEntity.toTag(new CompoundTag())::contains));
}
public static boolean cancelEntityBlockCollision(BlockState state, World world, BlockPos pos, Entity entity) { public static boolean cancelEntityBlockCollision(BlockState state, World world, BlockPos pos, Entity entity) {
if (world.isClient) if (world.isClient)
return false; return false;

View File

@ -60,7 +60,7 @@ public class EntityInteractEvents {
} }
public static ActionResult useAtEntity(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult) { public static ActionResult useAtEntity(PlayerEntity player, World world, Hand hand, Entity entity, /* Nullable */ EntityHitResult hitResult) {
if (player.world.isClient || player.isSpectator()) if (player.world.isClient || player.isSpectator() || canInteract(entity))
return ActionResult.PASS; return ActionResult.PASS;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
BlockPos pos = entity.getBlockPos(); BlockPos pos = entity.getBlockPos();
@ -75,7 +75,7 @@ public class EntityInteractEvents {
} }
public static ActionResult useEntity(PlayerEntity p, World world, Hand hand, Entity entity) { public static ActionResult useEntity(PlayerEntity p, World world, Hand hand, Entity entity) {
if (p.world.isClient || p.isSpectator()) if (p.world.isClient || p.isSpectator() || canInteract(entity))
return ActionResult.PASS; return ActionResult.PASS;
ServerPlayerEntity player = (ServerPlayerEntity) p; ServerPlayerEntity player = (ServerPlayerEntity) p;
ClaimStorage storage = ClaimStorage.get((ServerWorld) world); ClaimStorage storage = ClaimStorage.get((ServerWorld) world);
@ -103,6 +103,10 @@ public class EntityInteractEvents {
return ActionResult.PASS; return ActionResult.PASS;
} }
public static boolean canInteract(Entity entity) {
return entity.getScoreboardTags().stream().anyMatch(ConfigHandler.config.entityTagIgnore::contains);
}
public static boolean projectileHit(ProjectileEntity proj, HitResult res) { public static boolean projectileHit(ProjectileEntity proj, HitResult res) {
if (proj.world.isClient) if (proj.world.isClient)
return false; return false;
@ -182,7 +186,7 @@ public class EntityInteractEvents {
} }
public static ActionResult attackSimple(PlayerEntity p, Entity entity, boolean message) { public static ActionResult attackSimple(PlayerEntity p, Entity entity, boolean message) {
if (p.world.isClient || p.isSpectator()) if (p.world.isClient || p.isSpectator() || canInteract(entity))
return ActionResult.PASS; return ActionResult.PASS;
if (entity instanceof Monster) if (entity instanceof Monster)
return ActionResult.PASS; return ActionResult.PASS;

View File

@ -257,7 +257,7 @@ public class PlayerClaimData {
} else if (this.player.getPos().squaredDistanceTo(this.trappedPos) > 0.15) { } else if (this.player.getPos().squaredDistanceTo(this.trappedPos) > 0.15) {
this.trappedTick = -1; this.trappedTick = -1;
this.trappedPos = null; this.trappedPos = null;
this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.trappedMove), Formatting.RED), false); this.player.sendMessage(PermHelper.simpleColoredText(ConfigHandler.lang.trappedMove, Formatting.RED), false);
} }
} }
this.deathPickupTick--; this.deathPickupTick--;