add snowman + enderman grief permission closes #31

This commit is contained in:
Flemmli97 2021-05-12 19:58:24 +02:00
parent d75f788288
commit 763439d907
8 changed files with 113 additions and 2 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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<Boolean> info) {
if (!EntityInteractEvents.canEndermanInteract(this.enderman, pos)) {
info.setReturnValue(false);
info.cancel();
}
}
}

View File

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

View File

@ -23,7 +23,10 @@
"FireBlockMixin",
"SpawnHelperMixin",
"PlayerMixin",
"ItemEntityMixin"
"ItemEntityMixin",
"EndermanPickupMixin",
"EndermanPlaceMixin",
"SnowGolemMixin"
],
"server": [
],