From fdab079aeda3b2bd974f8985ae13a388083f0811 Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Tue, 1 Sep 2020 22:59:12 +0200 Subject: [PATCH] add fire spread protection and changed some permission to always be global --- .../java/com/flemmli97/flan/claim/Claim.java | 2 +- .../flemmli97/flan/claim/ClaimStorage.java | 21 ++++++++-- .../flemmli97/flan/claim/EnumPermission.java | 19 +++++++-- .../flemmli97/flan/commands/CommandClaim.java | 4 +- .../com/flemmli97/flan/event/WorldEvents.java | 7 ++++ .../flan/gui/PermissionScreenHandler.java | 11 ++++- .../flemmli97/flan/mixin/FireBlockMixin.java | 42 +++++++++++++++++++ src/main/resources/flan.mixins.json | 3 +- 8 files changed, 97 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/flemmli97/flan/mixin/FireBlockMixin.java diff --git a/src/main/java/com/flemmli97/flan/claim/Claim.java b/src/main/java/com/flemmli97/flan/claim/Claim.java index 61ab324..57605a8 100644 --- a/src/main/java/com/flemmli97/flan/claim/Claim.java +++ b/src/main/java/com/flemmli97/flan/claim/Claim.java @@ -160,7 +160,7 @@ public class Claim { } public boolean canInteract(ServerPlayerEntity player, EnumPermission perm, BlockPos pos, boolean message) { - if (perm == EnumPermission.EXPLOSIONS || perm == EnumPermission.WITHER) { + if (perm.isAlwaysGlobalPerm()) { for (Claim claim : this.subClaims) { if (claim.insideClaim(pos)) { return claim.canInteract(player, perm, pos, message); diff --git a/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java b/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java index c91d968..cf54d48 100644 --- a/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java +++ b/src/main/java/com/flemmli97/flan/claim/ClaimStorage.java @@ -30,6 +30,7 @@ import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Collection; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -260,11 +261,27 @@ public class ClaimStorage { Map> subClaimMap = Maps.newHashMap(); Map intFileMap = Maps.newHashMap(); + EnumSet managers = EnumSet.complementOf(EnumSet.of(EnumPermission.EDITCLAIM)); + EnumSet builders = EnumSet.complementOf(EnumSet.of(EnumPermission.EDITPERMS, EnumPermission.EDITCLAIM)); + EnumSet containers = EnumSet.complementOf(EnumSet.of(EnumPermission.EDITPERMS, EnumPermission.EDITCLAIM, + EnumPermission.BREAK, EnumPermission.PLACE, EnumPermission.NOTEBLOCK, EnumPermission.REDSTONE, EnumPermission.JUKEBOX, + EnumPermission.ITEMFRAMEROTATE, EnumPermission.LECTERNTAKE, EnumPermission.ENDCRYSTALPLACE, EnumPermission.PROJECTILES, + EnumPermission.TRAMPLE, EnumPermission.RAID, EnumPermission.BUCKET, EnumPermission.ARMORSTAND, EnumPermission.BREAKNONLIVING)); + EnumSet accessors = EnumSet.complementOf(EnumSet.of(EnumPermission.EDITPERMS, EnumPermission.EDITCLAIM, + EnumPermission.BREAK, EnumPermission.PLACE, EnumPermission.OPENCONTAINER, EnumPermission.ANVIL, EnumPermission.BEACON, + EnumPermission.NOTEBLOCK, EnumPermission.REDSTONE, EnumPermission.JUKEBOX, EnumPermission.ITEMFRAMEROTATE, + EnumPermission.LECTERNTAKE, EnumPermission.ENDCRYSTALPLACE, EnumPermission.PROJECTILES, EnumPermission.TRAMPLE, EnumPermission.RAID, + EnumPermission.BUCKET, EnumPermission.ANIMALINTERACT, EnumPermission.HURTANIMAL, EnumPermission.TRADING, EnumPermission.ARMORSTAND, + EnumPermission.BREAKNONLIVING)); + System.out.println(managers); + System.out.println(builders); + System.out.println(containers); + System.out.println(accessors); + try { //Get all parent claims Set failedClaimsFile = Sets.newHashSet(); for (File f : griefPrevention.listFiles()) { - System.out.println("f " + f.getName()); if (f.getName().endsWith(".yml")) { FileReader reader = new FileReader(f); Map values = yml.load(reader); @@ -278,8 +295,6 @@ public class ClaimStorage { } } } - System.out.println(subClaimMap); - System.out.println(intFileMap); //Map child to parent claims for (File f : griefPrevention.listFiles()) { if (f.getName().endsWith(".yml")) { diff --git a/src/main/java/com/flemmli97/flan/claim/EnumPermission.java b/src/main/java/com/flemmli97/flan/claim/EnumPermission.java index 73a03c8..36a5ccf 100644 --- a/src/main/java/com/flemmli97/flan/claim/EnumPermission.java +++ b/src/main/java/com/flemmli97/flan/claim/EnumPermission.java @@ -6,6 +6,8 @@ import net.minecraft.item.ItemStack; import net.minecraft.item.Items; import net.minecraft.village.raid.Raid; +import java.util.EnumSet; + public enum EnumPermission { EDITCLAIM(ConfigHandler.config.claimingItem), @@ -38,16 +40,19 @@ public enum EnumPermission { ENDERPEARL(Items.ENDER_PEARL), ANIMALINTERACT(Items.CHICKEN_SPAWN_EGG), HURTANIMAL(Items.BEEF), - HURTPLAYER(Items.DIAMOND_SWORD), XP(Items.EXPERIENCE_BOTTLE), TRADING(Items.EMERALD), + ARMORSTAND(Items.ARMOR_STAND), + BREAKNONLIVING(Items.COMMAND_BLOCK_MINECART), + HURTPLAYER(Items.DIAMOND_SWORD), EXPLOSIONS(Items.TNT), WITHER(Items.WITHER_SKELETON_SKULL), - ARMORSTAND(Items.ARMOR_STAND), - BREAKNONLIVING(Items.COMMAND_BLOCK_MINECART); + FIRESPREAD(Items.BLAZE_POWDER); private final Item item; + private static final EnumSet alwaysGlobal = EnumSet.of(HURTPLAYER, EXPLOSIONS, WITHER, FIRESPREAD); + EnumPermission(Item item) { this.item = item; } @@ -57,4 +62,12 @@ public enum EnumPermission { return Raid.getOminousBanner(); return new ItemStack(this.item); } + + public boolean isAlwaysGlobalPerm(){ + return alwaysGlobal.contains(this); + } + + public static int alwaysGlobalLength(){ + return alwaysGlobal.size(); + } } diff --git a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java index 066a951..2f4fa48 100644 --- a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java +++ b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java @@ -86,9 +86,9 @@ public class CommandClaim { ))); } - private static LiteralArgumentBuilder addToMainCommand(LiteralArgumentBuilder main, ArgumentBuilder... other) { + private static > T addToMainCommand(T main, ArgumentBuilder... other) { if (other != null) - for (ArgumentBuilder o : other) + for (ArgumentBuilder o : other) main.then(o); return main; } diff --git a/src/main/java/com/flemmli97/flan/event/WorldEvents.java b/src/main/java/com/flemmli97/flan/event/WorldEvents.java index 8e52cc5..81cabbf 100644 --- a/src/main/java/com/flemmli97/flan/event/WorldEvents.java +++ b/src/main/java/com/flemmli97/flan/event/WorldEvents.java @@ -68,4 +68,11 @@ public class WorldEvents { return false; return true; } + + public static boolean canFireSpread(ServerWorld world, BlockPos pos){ + Claim claim = ClaimStorage.get(world).getClaimAt(pos); + if(claim!=null && !claim.canInteract(null, EnumPermission.FIRESPREAD, pos)) + return false; + return true; + } } diff --git a/src/main/java/com/flemmli97/flan/gui/PermissionScreenHandler.java b/src/main/java/com/flemmli97/flan/gui/PermissionScreenHandler.java index d45fe0a..120e67a 100644 --- a/src/main/java/com/flemmli97/flan/gui/PermissionScreenHandler.java +++ b/src/main/java/com/flemmli97/flan/gui/PermissionScreenHandler.java @@ -82,7 +82,10 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler { else { int row = i / 9 - 1; int id = (i % 9) + row * 7 - 1 + page * 28; - if (id < EnumPermission.values().length) + int length = EnumPermission.values().length; + if(group!=null) + length-=EnumPermission.alwaysGlobalLength(); + if (id < length) inv.setStack(i, ServerScreenHelper.fromPermission((Claim) additionalData[0], EnumPermission.values()[id], additionalData[1] == null ? null : additionalData[1].toString())); } } @@ -113,8 +116,12 @@ public class PermissionScreenHandler extends ServerOnlyScreenHandler { else { int row = i / 9 - 1; int id = (i % 9) + row * 7 - 1 + this.page * 28; - if (id < EnumPermission.values().length) + int length = EnumPermission.values().length; + if(group!=null) + length-=EnumPermission.alwaysGlobalLength(); + if (id < length) { this.slots.get(i).setStack(ServerScreenHelper.fromPermission(this.claim, EnumPermission.values()[id], this.group)); + } else this.slots.get(i).setStack(ItemStack.EMPTY); } diff --git a/src/main/java/com/flemmli97/flan/mixin/FireBlockMixin.java b/src/main/java/com/flemmli97/flan/mixin/FireBlockMixin.java new file mode 100644 index 0000000..f0601c9 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/FireBlockMixin.java @@ -0,0 +1,42 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.WorldEvents; +import net.minecraft.block.BlockState; +import net.minecraft.block.FireBlock; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldView; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.Random; + +@Mixin(FireBlock.class) +public abstract class FireBlockMixin { + + @Inject(method = "scheduledTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;getGameRules()Lnet/minecraft/world/GameRules;"), cancellable = true) + public void tick(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo info) { + if (!WorldEvents.canFireSpread(world, pos)) { + info.cancel(); + } + } + + @Inject(method = "getBurnChance(Lnet/minecraft/world/WorldView;Lnet/minecraft/util/math/BlockPos;)I", at = @At(value = "HEAD"), cancellable = true) + public void burn(WorldView worldView, BlockPos pos, CallbackInfoReturnable info){ + if(worldView instanceof ServerWorld && !WorldEvents.canFireSpread((ServerWorld) worldView, pos)){ + info.setReturnValue(0); + info.cancel(); + } + } + + @Inject(method = "trySpreadingFire", at = @At(value = "HEAD"), cancellable = true) + public void spread(World world, BlockPos pos, int spreadFactor, Random rand, int currentAge, CallbackInfo info){ + if(!world.isClient && !WorldEvents.canFireSpread((ServerWorld) world, pos)){ + info.cancel(); + } + } +} diff --git a/src/main/resources/flan.mixins.json b/src/main/resources/flan.mixins.json index 518ea42..f116d81 100644 --- a/src/main/resources/flan.mixins.json +++ b/src/main/resources/flan.mixins.json @@ -20,7 +20,8 @@ "ILecternBlockValues", "FluidMixin", "PistonMixin", - "RaidManagerMixin" + "RaidManagerMixin", + "FireBlockMixin" ], "server": [ ],