From 5665d16b1c40d0aefd2e9de159b4103b041a046f Mon Sep 17 00:00:00 2001 From: Liyan Zhao Date: Wed, 10 Jul 2024 01:13:09 +0800 Subject: [PATCH] perf: chunk based enclosure lookup --- .../enclosure/mixin/MixinCampfireBlock.java | 26 ++++++------ .../mixin/MixinEnderDragonEntity.java | 15 +++---- .../enclosure/mixin/MixinExplosion.java | 16 ++++---- .../mixin/MixinFallingBlockEntity.java | 5 +-- .../enclosure/mixin/MixinFireBlock.java | 14 +++---- .../enclosure/mixin/MixinItemEntity.java | 4 +- .../enclosure/mixin/MixinItemFrameEntity.java | 2 +- .../mixin/MixinLeveledCauldronBlock.java | 8 ++-- .../enclosure/mixin/MixinParrotEntity.java | 41 ------------------- .../enclosure/mixin/MixinPotionEntity.java | 6 +-- .../enclosure/mixin/MixinPowderSnowBlock.java | 13 +++--- .../mixin/MixinSculkCatalystBlock.java | 6 +-- .../mixin/MixinSculkCatalystBlockEntity.java | 2 +- .../mixin/MixinSculkSpreadManagerCursor.java | 12 ++---- .../enclosure/mixin/MixinSculkVeinBlock.java | 6 +-- .../mixin/MixinStorageMinecartEntity.java | 5 +-- .../enclosure/mixin/MixinTurtleEggBlock.java | 4 +- .../mixin/MixinWitherSkullBlock.java | 13 +++--- .../github/zly2006/enclosure/utils/Utils.java | 39 ++++++++---------- .../github/zly2006/enclosure/ServerMain.kt | 9 ++-- .../enclosure/command/EnclosureCommand.kt | 9 ++-- .../zly2006/enclosure/utils/Permission.kt | 1 - src/main/resources/enclosure.mixins.json | 1 - 23 files changed, 89 insertions(+), 168 deletions(-) delete mode 100644 src/main/java/com/github/zly2006/enclosure/mixin/MixinParrotEntity.java diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinCampfireBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinCampfireBlock.java index 640d4d3..857d67b 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinCampfireBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinCampfireBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -27,16 +26,16 @@ @Mixin(CampfireBlock.class) public class MixinCampfireBlock { - - @Shadow @Final public static BooleanProperty LIT; + @Shadow + @Final + public static BooleanProperty LIT; @Inject(at = @At("HEAD"), method = "extinguish", cancellable = true) - private static void onExtinguish(Entity entity, WorldAccess world, BlockPos pos, BlockState state, CallbackInfo ci){ - if(world instanceof ServerWorld){ - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.USE_CAMPFIRE)) { - if(entity instanceof ServerPlayerEntity player){ + private static void onExtinguish(Entity entity, WorldAccess world, BlockPos pos, BlockState state, CallbackInfo ci) { + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area != null && !area.hasPubPerm(Permission.USE_CAMPFIRE)) { + if (entity instanceof ServerPlayerEntity player) { player.sendMessage(USE_CAMPFIRE.getNoPermissionMsg(player)); } @@ -49,11 +48,10 @@ private static void onExtinguish(Entity entity, WorldAccess world, BlockPos pos, } @Inject(at = @At("HEAD"), method = "tryFillWithFluid", cancellable = true) - private void onFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState, CallbackInfoReturnable cir){ - if(world instanceof ServerWorld){ - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.USE_CAMPFIRE)) { + private void onFillWithFluid(WorldAccess world, BlockPos pos, BlockState state, FluidState fluidState, CallbackInfoReturnable cir) { + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area != null && !area.hasPubPerm(Permission.USE_CAMPFIRE)) { cir.setReturnValue(false); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinEnderDragonEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinEnderDragonEntity.java index 960116c..3842128 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinEnderDragonEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinEnderDragonEntity.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.entity.EntityType; @@ -22,14 +21,12 @@ public MixinEnderDragonEntity(EntityType entityType @Redirect(method = "destroyBlocks", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;removeBlock(Lnet/minecraft/util/math/BlockPos;Z)Z")) private boolean dragonProtection(World instance, BlockPos pos, boolean move) { - if (instance.isClient) { - return false; + if (instance instanceof ServerWorld serverWorld) { + EnclosureArea a = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (a != null && !a.hasPubPerm(Permission.DRAGON_DESTROY)) { + return true; + } } - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) getWorld()); - EnclosureArea a = list.getArea(pos); - if (a != null && !a.areaOf(pos).hasPubPerm(Permission.DRAGON_DESTROY)) { - return true; - } - return this.getWorld().removeBlock(pos, false); + return this.getWorld().removeBlock(pos, move); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinExplosion.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinExplosion.java index 23efcfb..4610090 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinExplosion.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinExplosion.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import it.unimi.dsi.fastutil.objects.ObjectArrayList; @@ -31,16 +30,15 @@ public abstract class MixinExplosion { @ModifyVariable(at = @At(value = "INVOKE", target = "Lnet/minecraft/util/math/Vec3d;(DDD)V", ordinal = 1), method = "collectBlocksAndDamageEntities") private List protectEntities(List list) { if (!world.isClient) { - EnclosureList enclosureList = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - list.removeIf(e -> { - assert e != null; - BlockPos pos = e.getBlockPos(); - EnclosureArea a = enclosureList.getArea(pos); - return a != null && !a.areaOf(pos).hasPubPerm(Permission.EXPLOSION); + list.removeIf(entity -> { + assert entity != null; + BlockPos pos = entity.getBlockPos(); + EnclosureArea a = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) world, pos); + return a != null && !a.hasPubPerm(Permission.EXPLOSION); }); this.affectedBlocks.removeIf(pos -> { - EnclosureArea a = enclosureList.getArea(pos); - return a != null && !a.areaOf(pos).hasPubPerm(Permission.EXPLOSION); + EnclosureArea a = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) world, pos); + return a != null && !a.hasPubPerm(Permission.EXPLOSION); }); } return list; diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinFallingBlockEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinFallingBlockEntity.java index 13f9147..f5786b7 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinFallingBlockEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinFallingBlockEntity.java @@ -3,7 +3,6 @@ import com.github.zly2006.enclosure.EnclosureArea; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; -import net.fabricmc.api.Environment; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityType; import net.minecraft.entity.FallingBlockEntity; @@ -37,8 +36,8 @@ private void protectFallingBlocks(CallbackInfo ci) { if (getWorld().isClient) { return; } - EnclosureArea currentArea = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) getWorld()).getArea(getBlockPos()); - EnclosureArea sourceArea = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) getWorld()).getArea(getFallingBlockPos()); + EnclosureArea currentArea = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) getWorld(), getBlockPos()); + EnclosureArea sourceArea = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) getWorld(), getFallingBlockPos()); if (currentArea == null || sourceArea == currentArea) { return; } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinFireBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinFireBlock.java index 649ba43..9b8eb3c 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinFireBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinFireBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -21,19 +20,18 @@ public class MixinFireBlock { @Unique private void set(World instance, BlockPos pos, BlockState blockState, int i) { if (instance.isClient) return; - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) instance); - EnclosureArea area = list.getArea(pos); - if (area == null || area.areaOf(pos).hasPubPerm(Permission.FIRE_SPREADING)) { - instance.setBlockState(pos, blockState, i); + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) instance, pos); + if (area != null && !area.hasPubPerm(Permission.FIRE_SPREADING)) { + return; } + instance.setBlockState(pos, blockState, i); } @Unique private void remove(World instance, BlockPos pos, boolean move) { if (instance.isClient) return; - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) instance); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.FIRE_SPREADING)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) instance, pos); + if (area != null && !area.hasPubPerm(Permission.FIRE_SPREADING)) { if (instance.getBlockState(pos).isOf(Blocks.FIRE)) { // 但是允许火熄灭 instance.removeBlock(pos, move); diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemEntity.java index 2b6c907..9e47a1d 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemEntity.java @@ -25,8 +25,8 @@ public MixinItemEntity(EntityType type, World world) { @Inject(method = "onPlayerCollision", at = @At("HEAD"), cancellable = true) private void onPlayerCollision(PlayerEntity player, CallbackInfo ci) { if (getWorld() instanceof ServerWorld serverWorld) { - EnclosureArea area = ServerMain.INSTANCE.getAllEnclosures(serverWorld).getArea(getBlockPos()); - if (area != null && !area.areaOf(getBlockPos()).hasPerm((ServerPlayerEntity) player, Permission.PICKUP_ITEM)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, getBlockPos()); + if (area != null && !area.hasPerm((ServerPlayerEntity) player, Permission.PICKUP_ITEM)) { ((PlayerAccess) player).sendMessageWithCD(Permission.PICKUP_ITEM::getNoPermissionMsg); ci.cancel(); } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemFrameEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemFrameEntity.java index c548e42..68f6c44 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemFrameEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinItemFrameEntity.java @@ -29,7 +29,7 @@ protected MixinItemFrameEntity(EntityType en private void onUse(PlayerEntity player, Hand hand, CallbackInfoReturnable cir) { if (player instanceof ServerPlayerEntity serverPlayer) { EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) serverPlayer.getWorld(), getBlockPos()); - if (area != null && !area.areaOf(getBlockPos()).hasPerm(serverPlayer, Permission.ITEM_FRAME)) { + if (area != null && !area.hasPerm(serverPlayer, Permission.ITEM_FRAME)) { player.sendMessage(Permission.ITEM_FRAME.getNoPermissionMsg(serverPlayer)); cir.setReturnValue(ActionResult.FAIL); } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinLeveledCauldronBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinLeveledCauldronBlock.java index 10bb23e..d235861 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinLeveledCauldronBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinLeveledCauldronBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -18,10 +17,9 @@ public class MixinLeveledCauldronBlock { @Inject(method = "onFireCollision", at = @At("HEAD"), cancellable = true) private void onFireCollision(BlockState state, World world, BlockPos pos, CallbackInfo ci){ - if (!world.isClient) { - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.CONSUMPTIVELY_EXTINGUISH)) { + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area != null && !area.hasPubPerm(Permission.CONSUMPTIVELY_EXTINGUISH)) { ci.cancel(); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinParrotEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinParrotEntity.java deleted file mode 100644 index a10b228..0000000 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinParrotEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.github.zly2006.enclosure.mixin; - -import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.ServerMain; -import net.minecraft.entity.EntityType; -import net.minecraft.entity.passive.AnimalEntity; -import net.minecraft.entity.passive.ParrotEntity; -import net.minecraft.entity.player.PlayerEntity; -import net.minecraft.registry.tag.ItemTags; -import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.ActionResult; -import net.minecraft.util.Hand; -import net.minecraft.world.World; -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.CallbackInfoReturnable; - -import static com.github.zly2006.enclosure.utils.Permission.PARROT_COOKIE; - -@Mixin(ParrotEntity.class) -public abstract class MixinParrotEntity extends AnimalEntity { - protected MixinParrotEntity(EntityType entityType, World world) { - super(entityType, world); - } - - @Inject(at = @At("HEAD"), method = "interactMob", cancellable = true) - private void interactMob(PlayerEntity p, Hand hand, CallbackInfoReturnable cir) { - if (p instanceof ServerPlayerEntity player) { - if (player.getStackInHand(hand).isIn(ItemTags.PARROT_POISONOUS_FOOD)) { - EnclosureArea area = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) getWorld()).getArea(getBlockPos()); - - if (area != null && !area.areaOf(getBlockPos()).hasPerm(player, PARROT_COOKIE)) { - player.sendMessage(PARROT_COOKIE.getNoPermissionMsg(player)); - cir.setReturnValue(ActionResult.FAIL); - } - } - } - } -} diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinPotionEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinPotionEntity.java index f62c5a5..152edbf 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinPotionEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinPotionEntity.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.Block; @@ -35,9 +34,8 @@ private void onExtinguishFire(BlockPos pos, CallbackInfo ci) { } Block block = getWorld().getBlockState(pos).getBlock(); if (block instanceof CampfireBlock) { - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) getWorld()); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.USE_CAMPFIRE)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) getWorld(), pos); + if (area != null && !area.hasPubPerm(Permission.USE_CAMPFIRE)) { if (getOwner() instanceof ServerPlayerEntity player) { player.sendMessage(USE_CAMPFIRE.getNoPermissionMsg(player)); } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinPowderSnowBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinPowderSnowBlock.java index bca0c23..230c59f 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinPowderSnowBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinPowderSnowBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -19,13 +18,11 @@ public class MixinPowderSnowBlock { @Inject(method = "onEntityCollision", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;breakBlock(Lnet/minecraft/util/math/BlockPos;Z)Z"), cancellable = true) private void onEntityCollision(BlockState state, World world, BlockPos pos, Entity entity, CallbackInfo ci) { - if (world.isClient) { - return; - } - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.CONSUMPTIVELY_EXTINGUISH)) { - ci.cancel(); + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area != null && !area.hasPubPerm(Permission.CONSUMPTIVELY_EXTINGUISH)) { + ci.cancel(); + } } } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlock.java index f03949d..12fbd0b 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -18,9 +17,8 @@ public class MixinSculkCatalystBlock { @Inject(method = "scheduledTick", at = @At(value = "INVOKE", target = "Lnet/minecraft/server/world/ServerWorld;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z"), cancellable = true) private void setBlock(BlockState state, ServerWorld world, BlockPos pos, Random random, CallbackInfo ci) { - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures(world); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.SCULK_SPREAD)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(world, pos); + if (area != null && !area.hasPubPerm(Permission.SCULK_SPREAD)) { ci.cancel(); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlockEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlockEntity.java index 4ff6f4b..0ca8f33 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlockEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkCatalystBlockEntity.java @@ -26,7 +26,7 @@ private void spread(ServerWorld world, RegistryEntry event, GameEvent } BlockPos blockPos = BlockPos.ofFloored(emitterPos.offset(Direction.UP, 0.5)); EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) livingEntity.getWorld(), blockPos); - if (area != null && !area.areaOf(blockPos).hasPubPerm(Permission.SCULK_SPREAD)) { + if (area != null && !area.hasPubPerm(Permission.SCULK_SPREAD)) { cir.setReturnValue(false); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkSpreadManagerCursor.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkSpreadManagerCursor.java index 9c43365..66efdd1 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkSpreadManagerCursor.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkSpreadManagerCursor.java @@ -1,10 +1,8 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; -import net.fabricmc.api.Environment; import net.minecraft.block.BlockState; import net.minecraft.block.SculkSpreadable; import net.minecraft.block.entity.SculkSpreadManager; @@ -28,9 +26,8 @@ private static void getSpreadPos(WorldAccess world, BlockPos sourcePos, BlockPos if (targetPos == null) { return; } - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures(serverWorld); - EnclosureArea area = list.getArea(targetPos); - if (area != null && !area.areaOf(targetPos).hasPubPerm(Permission.SCULK_SPREAD)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, targetPos); + if (area != null && !area.hasPubPerm(Permission.SCULK_SPREAD)) { cir.setReturnValue(false); } } @@ -39,9 +36,8 @@ private static void getSpreadPos(WorldAccess world, BlockPos sourcePos, BlockPos @Redirect(method = "spread", at = @At(value = "INVOKE", target = "Lnet/minecraft/block/SculkSpreadable;spread(Lnet/minecraft/world/WorldAccess;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;Ljava/util/Collection;Z)Z")) private boolean spread(SculkSpreadable instance, WorldAccess world, BlockPos pos, BlockState state, Collection directions, boolean markForPostProcessing) { if (world instanceof ServerWorld serverWorld) { - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures(serverWorld); - EnclosureArea area = list.getArea(pos); - if (area != null && !area.areaOf(pos).hasPubPerm(Permission.SCULK_SPREAD)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area != null && !area.hasPubPerm(Permission.SCULK_SPREAD)) { return false; } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkVeinBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkVeinBlock.java index aa64b04..72e3daa 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkVeinBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinSculkVeinBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.BlockState; @@ -26,9 +25,8 @@ public class MixinSculkVeinBlock { @Unique private static boolean disallow(WorldAccess world, BlockPos pos) { if (world instanceof ServerWorld serverWorld) { - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures(serverWorld); - EnclosureArea area = list.getArea(pos); - return area != null && !area.areaOf(pos).hasPubPerm(Permission.SCULK_SPREAD); + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + return area != null && !area.hasPubPerm(Permission.SCULK_SPREAD); } return false; } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinStorageMinecartEntity.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinStorageMinecartEntity.java index f946c45..7245080 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinStorageMinecartEntity.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinStorageMinecartEntity.java @@ -8,7 +8,6 @@ import net.minecraft.entity.vehicle.AbstractMinecartEntity; import net.minecraft.entity.vehicle.StorageMinecartEntity; import net.minecraft.server.network.ServerPlayerEntity; -import net.minecraft.server.world.ServerWorld; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -26,8 +25,8 @@ protected MixinStorageMinecartEntity(EntityType entityType, World world) { @Inject(method = "canPlayerUse", at = @At("HEAD"), cancellable = true) private void canPlayerUse(PlayerEntity player, CallbackInfoReturnable cir) { if (player instanceof ServerPlayerEntity serverPlayer) { - EnclosureArea area = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) this.getWorld()).getArea(getBlockPos()); - if (area != null && !area.areaOf(getBlockPos()).hasPerm(serverPlayer, Permission.CONTAINER)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverPlayer.getServerWorld(), getBlockPos()); + if (area != null && !area.hasPerm(serverPlayer, Permission.CONTAINER)) { serverPlayer.sendMessage(CONTAINER.getNoPermissionMsg(serverPlayer)); cir.setReturnValue(false); } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinTurtleEggBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinTurtleEggBlock.java index f2c8d6d..3e7923d 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinTurtleEggBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinTurtleEggBlock.java @@ -20,8 +20,8 @@ public class MixinTurtleEggBlock { @Inject(method = "tryBreakEgg", at = @At("HEAD"), cancellable = true) private void onBreakEgg(World world, BlockState state, BlockPos pos, Entity entity, int inverseChance, CallbackInfo ci) { if (!world.isClient && entity instanceof ServerPlayerEntity player) { - EnclosureArea area = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world).getArea(pos); - if (area != null && !area.areaOf(pos).hasPerm(player, Permission.BREAK_TURTLE_EGG)) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) world, pos); + if (area != null && !area.hasPerm(player, Permission.BREAK_TURTLE_EGG)) { ci.cancel(); } } diff --git a/src/main/java/com/github/zly2006/enclosure/mixin/MixinWitherSkullBlock.java b/src/main/java/com/github/zly2006/enclosure/mixin/MixinWitherSkullBlock.java index 024f332..28abc34 100644 --- a/src/main/java/com/github/zly2006/enclosure/mixin/MixinWitherSkullBlock.java +++ b/src/main/java/com/github/zly2006/enclosure/mixin/MixinWitherSkullBlock.java @@ -1,7 +1,6 @@ package com.github.zly2006.enclosure.mixin; import com.github.zly2006.enclosure.EnclosureArea; -import com.github.zly2006.enclosure.EnclosureList; import com.github.zly2006.enclosure.ServerMain; import com.github.zly2006.enclosure.utils.Permission; import net.minecraft.block.WitherSkullBlock; @@ -18,13 +17,11 @@ public class MixinWitherSkullBlock { @Inject(at = @At("HEAD"), method = "onPlaced(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/entity/SkullBlockEntity;)V", cancellable = true) private static void onPlace(World world, BlockPos pos, SkullBlockEntity blockEntity, CallbackInfo ci) { - if (world.isClient) { - return; - } - EnclosureList list = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world); - EnclosureArea a = list.getArea(pos); - if (a != null && !a.areaOf(pos).hasPubPerm(Permission.WITHER_SPAWN)) { - ci.cancel(); + if (world instanceof ServerWorld serverWorld) { + EnclosureArea a = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (a != null && !a.hasPubPerm(Permission.WITHER_SPAWN)) { + ci.cancel(); + } } } } diff --git a/src/main/java/com/github/zly2006/enclosure/utils/Utils.java b/src/main/java/com/github/zly2006/enclosure/utils/Utils.java index 38a2ff3..8bc2fe4 100644 --- a/src/main/java/com/github/zly2006/enclosure/utils/Utils.java +++ b/src/main/java/com/github/zly2006/enclosure/utils/Utils.java @@ -122,35 +122,30 @@ public static String camelCaseToSnakeCase(String camelCase) { } public static boolean commonOnPlayerDamage(DamageSource source, BlockPos pos, World world, Permission permission) { - if (world.isClient) { - return true; - } - EnclosureArea area = ServerMain.INSTANCE.getAllEnclosures((ServerWorld) world).getArea(pos); - if (area != null) { - area = area.areaOf(pos); - } - if (source.getAttacker() instanceof ServerPlayerEntity attacker) { - if (area != null && !area.hasPerm(attacker, permission)) { - attacker.sendMessage(permission.getNoPermissionMsg(attacker)); - return false; + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (source.getAttacker() instanceof ServerPlayerEntity attacker) { + if (area != null && !area.hasPerm(attacker, permission)) { + attacker.sendMessage(permission.getNoPermissionMsg(attacker)); + return false; + } } } return true; } public static boolean commonOnDamage(DamageSource source, BlockPos pos, World world, Permission permission) { - if (world.isClient) { - return true; - } - EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure((ServerWorld) world, pos); - if (area == null) return true; - if (source.getAttacker() instanceof ServerPlayerEntity attacker) { - if (!area.hasPerm(attacker, permission)) { - attacker.sendMessage(permission.getNoPermissionMsg(attacker)); - return false; + if (world instanceof ServerWorld serverWorld) { + EnclosureArea area = ServerMain.INSTANCE.getSmallestEnclosure(serverWorld, pos); + if (area == null) return true; + if (source.getAttacker() instanceof ServerPlayerEntity attacker) { + if (!area.hasPerm(attacker, permission)) { + attacker.sendMessage(permission.getNoPermissionMsg(attacker)); + return false; + } + } else { + return area.hasPubPerm(permission); } - } else { - return area.hasPubPerm(permission); } return true; } diff --git a/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt b/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt index 61a1657..9fa216c 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/ServerMain.kt @@ -265,11 +265,10 @@ object ServerMain: ModInitializer { fun checkPermission(world: World, pos: BlockPos, player: PlayerEntity?, permission: Permission): Boolean { if (world !is ServerWorld) return true - val list = getAllEnclosures(world) - val area = list.getArea(pos) ?: return true + val area = getSmallestEnclosure(world, pos) ?: return true return if (player != null) { - area.areaOf(pos).hasPerm(player as ServerPlayerEntity, permission) - } else area.areaOf(pos).hasPubPerm(permission) + area.hasPerm(player as ServerPlayerEntity, permission) + } else area.hasPubPerm(permission) } fun getAllEnclosures(world: ServerWorld): EnclosureList { @@ -309,7 +308,7 @@ object ServerMain: ModInitializer { fun checkPermission(player: ServerPlayerEntity, permission: Permission, pos: BlockPos): Boolean { if (checkPermission(player, "enclosure.bypass") && permission.canBypass) return true val enclosure = getSmallestEnclosure(player.serverWorld, pos) - return enclosure?.areaOf(pos)?.hasPerm(player, permission) ?: true + return enclosure?.hasPerm(player, permission) ?: true } fun reloadLimits(): Map { diff --git a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt b/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt index a939348..6e206db 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/command/EnclosureCommand.kt @@ -154,9 +154,8 @@ class BuilderScope(var parent: T) { action(enclosure) } else { val blockPos = BlockPos.ofFloored(source.position) - ServerMain.getAllEnclosures(source.world).getArea( - blockPos - )?.areaOf(blockPos)?.let { action(it) } + ServerMain.getSmallestEnclosure(source.world, blockPos) + ?.let { action(it) } ?: error(TrT.of("enclosure.message.no_enclosure"), this) } } @@ -180,8 +179,8 @@ class BuilderScope(var parent: T) { BuilderScope(parent).apply { builder(t, Command { val blockPos = BlockPos.ofFloored(it.source.position) - ServerMain.getAllEnclosures(it.source.world).getArea(blockPos) - ?.areaOf(blockPos)?.let { area -> action(it, area, t) } + ServerMain.getSmallestEnclosure(it.source.world, blockPos) + ?.let { area -> action(it, area, t) } ?: error(TrT.of("enclosure.message.no_enclosure"), it) 1 }) diff --git a/src/main/kotlin/com/github/zly2006/enclosure/utils/Permission.kt b/src/main/kotlin/com/github/zly2006/enclosure/utils/Permission.kt index 6830923..ee96595 100644 --- a/src/main/kotlin/com/github/zly2006/enclosure/utils/Permission.kt +++ b/src/main/kotlin/com/github/zly2006/enclosure/utils/Permission.kt @@ -124,7 +124,6 @@ class Permission( @JvmField val LEASH = Permission("leash", icon = Items.LEAD).apply(::register) @JvmField val NAMETAG = Permission("nametag", icon = Items.NAME_TAG).apply(::register) @JvmField val NOTE = Permission("note", icon = Items.NOTE_BLOCK).apply(::register) - @JvmField val PARROT_COOKIE = Permission("parrot_cookie", icon = Items.COOKIE).apply(::register) @JvmField val PVP = Permission("pvp", Target.Enclosure, false, Items.DIAMOND_SWORD).apply(::register) @JvmField val PLACE_BLOCK = Permission("place_block", icon = Items.STONE).apply(::register) @JvmField val BREAK_BLOCK = Permission("break_block", icon = Items.DIAMOND_PICKAXE).apply(::register) diff --git a/src/main/resources/enclosure.mixins.json b/src/main/resources/enclosure.mixins.json index 27e51dd..6485408 100644 --- a/src/main/resources/enclosure.mixins.json +++ b/src/main/resources/enclosure.mixins.json @@ -46,7 +46,6 @@ "MixinLockableContainerBlockEntity", "MixinMinecartEntity", "MixinMobEntity", - "MixinParrotEntity", "MixinPistonBlock", "MixinPlayerEntity", "MixinPotionEntity",