From 763439d907cea72a3b8b1ff6d355dc64388ec35a Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Wed, 12 May 2021 19:58:24 +0200 Subject: [PATCH] add snowman + enderman grief permission closes #31 --- Changelog.txt | 6 ++++ gradle.properties | 2 +- .../flan/api/PermissionRegistry.java | 3 ++ .../flan/event/EntityInteractEvents.java | 29 +++++++++++++++++++ .../flan/mixin/EndermanPickupMixin.java | 24 +++++++++++++++ .../flan/mixin/EndermanPlaceMixin.java | 27 +++++++++++++++++ .../flemmli97/flan/mixin/SnowGolemMixin.java | 19 ++++++++++++ src/main/resources/flan.mixins.json | 5 +++- 8 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/flemmli97/flan/mixin/EndermanPickupMixin.java create mode 100644 src/main/java/com/flemmli97/flan/mixin/EndermanPlaceMixin.java create mode 100644 src/main/java/com/flemmli97/flan/mixin/SnowGolemMixin.java diff --git a/Changelog.txt b/Changelog.txt index 190e4d7..c428c18 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,9 @@ +Flan 1.3.2 +====================== +- Change gui item text to non italic (there are some very picky people) +- Add enderman grief permission +- Add snowman snowlayers permission + Flan 1.3.1 ====================== - Fix the nullpointer when creating claims. derp diff --git a/gradle.properties b/gradle.properties index 998affd..5e095f8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx2G loader_version=0.9.1+build.205 # Mod Properties - mod_version = 1.3.1 + mod_version = 1.3.2 maven_group = com.flemmli97.flan archives_base_name = flan diff --git a/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java b/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java index 28ba88d..4a28888 100644 --- a/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java +++ b/src/main/java/com/flemmli97/flan/api/PermissionRegistry.java @@ -66,9 +66,12 @@ public class PermissionRegistry { public static ClaimPermission BREAKNONLIVING = register(new ClaimPermission("BREAKNONLIVING", () -> new ItemStack(Items.COMMAND_BLOCK_MINECART), "Permission to break things like minecarts or armor stands")); public static ClaimPermission DROP = register(new ClaimPermission("DROP", () -> new ItemStack(Items.BOWL), true, "Allow the drop of items")); public static ClaimPermission PICKUP = register(new ClaimPermission("PICKUP", () -> new ItemStack(Items.BRICK), true, "Allow the pickup of items")); + public static ClaimPermission HURTPLAYER = global(new ClaimPermission("HURTPLAYER", () -> new ItemStack(Items.DIAMOND_SWORD), "Permission to hurt other players")); public static ClaimPermission EXPLOSIONS = global(new ClaimPermission("EXPLOSIONS", () -> new ItemStack(Items.TNT), "Toggle explosions in claim")); public static ClaimPermission WITHER = global(new ClaimPermission("WITHER", () -> new ItemStack(Items.WITHER_SKELETON_SKULL), "Toggle wither breaking blocks in claim")); + public static ClaimPermission ENDERMAN = global(new ClaimPermission("ENDERMAN", () -> new ItemStack(Items.ENDER_EYE), true, "Allow enderman picking and placing blocks")); + public static ClaimPermission SNOWGOLEM = global(new ClaimPermission("SNOWGOLEM", () -> new ItemStack(Items.SNOW_BLOCK), true, "Allow snowgolems snowlayer")); public static ClaimPermission FIRESPREAD = global(new ClaimPermission("FIRESPREAD", () -> new ItemStack(Items.BLAZE_POWDER), "Toggle firespread in claim")); public static ClaimPermission WATERBORDER = global(new ClaimPermission("WATERBORDER", () -> new ItemStack(Items.WATER_BUCKET), "Toggle water crossing claim borders")); public static ClaimPermission PISTONBORDER = global(new ClaimPermission("PISTONBORDER", () -> new ItemStack(Items.PISTON), "Toggle piston pull/push across claim borders")); diff --git a/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java b/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java index a4b665c..bf1b8a5 100644 --- a/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java +++ b/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java @@ -16,7 +16,9 @@ import net.minecraft.entity.boss.WitherEntity; import net.minecraft.entity.damage.DamageSource; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.entity.decoration.ItemFrameEntity; +import net.minecraft.entity.mob.EndermanEntity; import net.minecraft.entity.mob.Monster; +import net.minecraft.entity.passive.SnowGolemEntity; import net.minecraft.entity.passive.TameableEntity; import net.minecraft.entity.passive.VillagerEntity; import net.minecraft.entity.player.PlayerEntity; @@ -41,6 +43,7 @@ import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.hit.EntityHitResult; import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -252,4 +255,30 @@ public class EntityInteractEvents { } return true; } + + public static boolean canEndermanInteract(EndermanEntity enderman, BlockPos pos) { + if (enderman.world.isClient) + return true; + ClaimStorage storage = ClaimStorage.get((ServerWorld) enderman.world); + IPermissionContainer claim = storage.getForPermissionCheck(pos); + if (!claim.canInteract(null, PermissionRegistry.ENDERMAN, pos, false)) + return false; + return true; + } + + public static boolean canSnowGolemInteract(SnowGolemEntity snowgolem) { + if (snowgolem.world.isClient) + return true; + int x, y, z; + for (int l = 0; l < 4; ++l) { + x = MathHelper.floor(snowgolem.getX() + (l % 2 * 2 - 1) * 0.25F); + y = MathHelper.floor(snowgolem.getY()); + z = MathHelper.floor(snowgolem.getZ() + (l / 2 % 2 * 2 - 1) * 0.25F); + BlockPos pos = new BlockPos(x, y, z); + IPermissionContainer claim = ClaimStorage.get((ServerWorld) snowgolem.world).getForPermissionCheck(pos); + if (!claim.canInteract(null, PermissionRegistry.SNOWGOLEM, pos, false)) + return false; + } + return true; + } } diff --git a/src/main/java/com/flemmli97/flan/mixin/EndermanPickupMixin.java b/src/main/java/com/flemmli97/flan/mixin/EndermanPickupMixin.java new file mode 100644 index 0000000..b8c93c4 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/EndermanPickupMixin.java @@ -0,0 +1,24 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.EntityInteractEvents; +import net.minecraft.entity.mob.EndermanEntity; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyVariable; + +@Mixin(targets = "net/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal") +public abstract class EndermanPickupMixin { + + @Shadow + private EndermanEntity enderman; + + @ModifyVariable(method = "Lnet/minecraft/entity/mob/EndermanEntity$PickUpBlockGoal;tick()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getBlockState(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/block/BlockState;"), ordinal = 0) + private BlockPos pickupCheck(BlockPos pos) { + if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) { + return BlockPos.ORIGIN; + } + return pos; + } +} diff --git a/src/main/java/com/flemmli97/flan/mixin/EndermanPlaceMixin.java b/src/main/java/com/flemmli97/flan/mixin/EndermanPlaceMixin.java new file mode 100644 index 0000000..1235ac8 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/EndermanPlaceMixin.java @@ -0,0 +1,27 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.EntityInteractEvents; +import net.minecraft.block.BlockState; +import net.minecraft.entity.mob.EndermanEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(targets = "net/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal") +public class EndermanPlaceMixin { + + @Shadow + private EndermanEntity enderman; + + @Inject(method = "Lnet/minecraft/entity/mob/EndermanEntity$PlaceBlockGoal;canPlaceOn(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;Lnet/minecraft/block/BlockState;Lnet/minecraft/util/math/BlockPos;)Z", at = @At(value = "HEAD"), cancellable = true) + private void placeCheck(World world, BlockPos posAbove, BlockState carriedState, BlockState stateAbove, BlockState state, BlockPos pos, CallbackInfoReturnable info) { + if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) { + info.setReturnValue(false); + info.cancel(); + } + } +} diff --git a/src/main/java/com/flemmli97/flan/mixin/SnowGolemMixin.java b/src/main/java/com/flemmli97/flan/mixin/SnowGolemMixin.java new file mode 100644 index 0000000..ede5d1e --- /dev/null +++ b/src/main/java/com/flemmli97/flan/mixin/SnowGolemMixin.java @@ -0,0 +1,19 @@ +package com.flemmli97.flan.mixin; + +import com.flemmli97.flan.event.EntityInteractEvents; +import net.minecraft.entity.passive.SnowGolemEntity; +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; + +@Mixin(SnowGolemEntity.class) +public abstract class SnowGolemMixin { + + @Inject(method = "tickMovement", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getGameRules()Lnet/minecraft/world/GameRules;"), cancellable = true) + private void checkSnow(CallbackInfo info) { + if (!EntityInteractEvents.canSnowGolemInteract((SnowGolemEntity) (Object) this)) { + info.cancel(); + } + } +} diff --git a/src/main/resources/flan.mixins.json b/src/main/resources/flan.mixins.json index 609b522..fa0086a 100644 --- a/src/main/resources/flan.mixins.json +++ b/src/main/resources/flan.mixins.json @@ -23,7 +23,10 @@ "FireBlockMixin", "SpawnHelperMixin", "PlayerMixin", - "ItemEntityMixin" + "ItemEntityMixin", + "EndermanPickupMixin", + "EndermanPlaceMixin", + "SnowGolemMixin" ], "server": [ ],