From e04370955e3d1aed0affe58e2429392a39be532f Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Tue, 8 Jun 2021 22:33:40 +0200 Subject: [PATCH] add trapped command --- Changelog.txt | 10 +++ .../flemmli97/flan/commands/CommandClaim.java | 13 ++++ .../com/flemmli97/flan/config/LangConfig.java | 4 ++ .../flan/event/EntityInteractEvents.java | 63 ++--------------- .../com/flemmli97/flan/event/WorldEvents.java | 1 - .../permissionapi/CommandPermission.java | 1 + .../flan/player/PlayerClaimData.java | 27 +++++++- .../flemmli97/flan/player/TeleportUtils.java | 68 +++++++++++++++++++ 8 files changed, 126 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/flemmli97/flan/player/TeleportUtils.java diff --git a/Changelog.txt b/Changelog.txt index 20471ff..5bee40f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,13 @@ +Flan 1.4.0 +====================== +- Add FLIGHT permission. Prevents non creative flight in claims +- Add CANSTAY permission. Makes players unable to enter your claim +- Remove the mobspawn config. +- Add support for wildcard worlds in globalDefaultPerms. Use "*" instead of + MOBSPAWN added to globalDefaultPerms with value false + FLIGHT added to globalDefaultPerms with value true +- Add /flan trapped command. Using it teleports you out of a claim you don't own after 5 seconds + Flan 1.3.3 ====================== - Some blocks permission changed from PROJECTILES to OPENCONTAINER on direct interaction diff --git a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java index d6cfc6b..4798ea4 100644 --- a/src/main/java/com/flemmli97/flan/commands/CommandClaim.java +++ b/src/main/java/com/flemmli97/flan/commands/CommandClaim.java @@ -54,6 +54,7 @@ public class CommandClaim { .then(CommandManager.literal("reload").requires(src -> CommandPermission.perm(src, CommandPermission.cmdReload, true)).executes(CommandClaim::reloadConfig)) .then(CommandManager.literal("addClaim").requires(src -> CommandPermission.perm(src, CommandPermission.claimCreate)).then(CommandManager.argument("from", BlockPosArgumentType.blockPos()).then(CommandManager.argument("to", BlockPosArgumentType.blockPos()).executes(CommandClaim::addClaim)))) .then(CommandManager.literal("menu").requires(src -> CommandPermission.perm(src, CommandPermission.cmdMenu)).executes(CommandClaim::openMenu)) + .then(CommandManager.literal("trapped").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTrapped)).executes(CommandClaim::trapped)) .then(CommandManager.literal("personalGroups").requires(src -> CommandPermission.perm(src, CommandPermission.cmdPGroup)).executes(CommandClaim::openPersonalGroups)) .then(CommandManager.literal("claimInfo").requires(src -> CommandPermission.perm(src, CommandPermission.cmdInfo)).executes(CommandClaim::claimInfo)) .then(CommandManager.literal("transferClaim").requires(src -> CommandPermission.perm(src, CommandPermission.cmdTransfer)).then(CommandManager.argument("player", GameProfileArgumentType.gameProfile()).executes(CommandClaim::transferClaim))) @@ -190,6 +191,18 @@ public class CommandClaim { return Command.SINGLE_SUCCESS; } + private static int trapped(CommandContext context) throws CommandSyntaxException { + ServerPlayerEntity player = context.getSource().getPlayer(); + PlayerClaimData data = PlayerClaimData.get(player); + if (data.setTrappedRescue()) { + context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.trappedRescue, Formatting.GOLD), false); + return Command.SINGLE_SUCCESS; + } else { + context.getSource().sendFeedback(PermHelper.simpleColoredText(ConfigHandler.lang.trappedFail, Formatting.RED), false); + } + return 0; + } + private static int openPersonalGroups(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); PersonalGroupScreenHandler.openGroupMenu(player); diff --git a/src/main/java/com/flemmli97/flan/config/LangConfig.java b/src/main/java/com/flemmli97/flan/config/LangConfig.java index a55f134..2820e2b 100644 --- a/src/main/java/com/flemmli97/flan/config/LangConfig.java +++ b/src/main/java/com/flemmli97/flan/config/LangConfig.java @@ -116,6 +116,10 @@ public class LangConfig { public String buySuccess = "Bought %1$s claimblocks for %2$s"; public String gunpowderMissing = "Missing gunpowder currency mod"; + public String trappedRescue = "Rescuing. Don't move for 5 seconds"; + public String trappedFail = "Rescue not necessary or already rescuing"; + public String trappedMove = "You moved. Aborting rescue"; + public LangConfig(MinecraftServer server) { File configDir = FabricLoader.getInstance().getConfigDir().resolve("flan").toFile(); //server.getSavePath(WorldSavePath.ROOT).resolve("config/claimConfigs").toFile(); diff --git a/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java b/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java index 343b538..7e31fa6 100644 --- a/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java +++ b/src/main/java/com/flemmli97/flan/event/EntityInteractEvents.java @@ -8,6 +8,7 @@ import com.flemmli97.flan.claim.IPermissionContainer; import com.flemmli97.flan.claim.ObjectToPermissionMap; import com.flemmli97.flan.mixin.IPersistentProjectileVars; import com.flemmli97.flan.player.IOwnedItem; +import com.flemmli97.flan.player.TeleportUtils; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.block.BlockState; import net.minecraft.entity.Entity; @@ -39,13 +40,11 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.sound.SoundEvents; import net.minecraft.util.ActionResult; import net.minecraft.util.Hand; -import net.minecraft.util.Pair; import net.minecraft.util.collection.DefaultedList; 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.Direction; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.world.World; @@ -287,7 +286,7 @@ public class EntityInteractEvents { public static void updateClaim(ServerPlayerEntity player, Claim currentClaim, Consumer cons) { Vec3d pos = player.getPos(); - BlockPos rounded = roundedBlockPos(pos.add(0, player.getEyeHeight(player.getPose()), 0)); + BlockPos rounded = TeleportUtils.roundedBlockPos(pos.add(0, player.getEyeHeight(player.getPose()), 0)); ClaimStorage storage = ClaimStorage.get(player.getServerWorld()); if (currentClaim != null) { if (!currentClaim.insideClaim(rounded)) { @@ -296,10 +295,10 @@ public class EntityInteractEvents { if (!player.isSpectator()) { BlockPos.Mutable bPos = rounded.mutableCopy(); if (!currentClaim.canInteract(player, PermissionRegistry.CANSTAY, bPos, true)) { - Vec3d tp = getTeleportPos(player, pos, storage, currentClaim.getDimensions(), bPos); + Vec3d tp = TeleportUtils.getTeleportPos(player, pos, storage, currentClaim.getDimensions(), bPos, (claim, nPos) -> claim.canInteract(player, PermissionRegistry.CANSTAY, nPos, false)); player.teleport(tp.getX(), tp.getY(), tp.getZ()); } - if (player.abilities.flying && !currentClaim.canInteract(player, PermissionRegistry.FLIGHT, rounded, true)) { + if (player.abilities.flying && !player.isCreative() && !currentClaim.canInteract(player, PermissionRegistry.FLIGHT, rounded, true)) { player.abilities.flying = false; player.networkHandler.sendPacket(new PlayerAbilitiesS2CPacket(player.abilities)); } @@ -310,58 +309,4 @@ public class EntityInteractEvents { cons.accept(claim); } } - - private static BlockPos roundedBlockPos(Vec3d pos) { - return new BlockPos(Math.round(pos.getX()), MathHelper.floor(pos.getY()), Math.round(pos.getZ())); - } - - private static Vec3d getTeleportPos(ServerPlayerEntity player, Vec3d playerPos, ClaimStorage storage, int[] dim, BlockPos.Mutable bPos) { - Pair pos = nearestOutside(dim, playerPos); - bPos.set(pos.getRight().getX(), pos.getRight().getY(), pos.getRight().getZ()); - Claim claim = storage.getClaimAt(bPos); - if (claim == null || claim.canInteract(player, PermissionRegistry.CANSTAY, bPos, false)) - return pos.getRight(); - int[] newDim = claim.getDimensions(); - switch (pos.getLeft()) { - case NORTH: - dim[2] = newDim[2]; - break; - case SOUTH: - dim[3] = newDim[3]; - break; - case EAST: - dim[1] = newDim[1]; - break; - default: - dim[0] = newDim[0]; - break; - } - return getTeleportPos(player, playerPos, storage, dim, bPos); - } - - - private static Pair nearestOutside(int[] dim, Vec3d from) { - double northDist = Math.abs(from.getZ() - dim[2]); - double southDist = Math.abs(dim[3] - from.getZ()); - double westDist = Math.abs(from.getX() - dim[0]); - double eastDist = Math.abs(dim[1] - from.getX()); - if (northDist > southDist) { - if (eastDist > westDist) { - if (southDist > westDist) - return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); - return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); - } - if (southDist > eastDist) - return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); - return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); - } - if (eastDist > westDist) { - if (northDist > westDist) - return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); - return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); - } - if (northDist > eastDist) - return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); - return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); - } } diff --git a/src/main/java/com/flemmli97/flan/event/WorldEvents.java b/src/main/java/com/flemmli97/flan/event/WorldEvents.java index c89e164..5950dc4 100644 --- a/src/main/java/com/flemmli97/flan/event/WorldEvents.java +++ b/src/main/java/com/flemmli97/flan/event/WorldEvents.java @@ -3,7 +3,6 @@ package com.flemmli97.flan.event; import com.flemmli97.flan.api.PermissionRegistry; import com.flemmli97.flan.claim.ClaimStorage; import com.flemmli97.flan.claim.IPermissionContainer; -import com.flemmli97.flan.config.ConfigHandler; import net.minecraft.block.BlockState; import net.minecraft.entity.SpawnGroup; import net.minecraft.entity.mob.MobEntity; diff --git a/src/main/java/com/flemmli97/flan/integration/permissionapi/CommandPermission.java b/src/main/java/com/flemmli97/flan/integration/permissionapi/CommandPermission.java index aa4f8a1..9e32759 100644 --- a/src/main/java/com/flemmli97/flan/integration/permissionapi/CommandPermission.java +++ b/src/main/java/com/flemmli97/flan/integration/permissionapi/CommandPermission.java @@ -14,6 +14,7 @@ public class CommandPermission { public static final String claimCreate = "flan.claim.create"; public static final String cmdMenu = "flan.command.menu"; + public static final String cmdTrapped = "flan.command.trapped"; public static final String cmdPGroup = "flan.command.personal"; public static final String cmdInfo = "flan.command.info"; public static final String cmdTransfer = "flan.command.transfer"; diff --git a/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java b/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java index 907890e..7c3eece 100644 --- a/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java +++ b/src/main/java/com/flemmli97/flan/player/PlayerClaimData.java @@ -20,6 +20,7 @@ import net.minecraft.server.world.ServerWorld; import net.minecraft.util.Formatting; import net.minecraft.util.WorldSavePath; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Vec3d; import java.io.BufferedReader; import java.io.File; @@ -37,7 +38,8 @@ public class PlayerClaimData { private int claimBlocks, additionalClaimBlocks, confirmTick, actionCooldown; - private int lastBlockTick; + private int lastBlockTick, trappedTick = -1; + private Vec3d trappedPos; private EnumEditMode mode = EnumEditMode.DEFAULT; private Claim editingClaim; private ClaimDisplay displayEditing; @@ -201,6 +203,16 @@ public class PlayerClaimData { return true; } + public boolean setTrappedRescue() { + Claim claim = ((IPlayerClaimImpl) this.player).getCurrentClaim(); + if (this.trappedTick < 0 && claim != null && !this.player.getUuid().equals(claim.getOwner())) { + this.trappedTick = 101; + this.trappedPos = this.player.getPos(); + return true; + } + return false; + } + public void tick() { boolean tool = this.player.getMainHandStack().getItem() == ConfigHandler.config.claimingItem || this.player.getOffHandStack().getItem() == ConfigHandler.config.claimingItem; @@ -237,6 +249,19 @@ public class PlayerClaimData { this.getClaimBlocks(), this.getAdditionalClaims(), this.usedClaimBlocks()), Formatting.GOLD), false); } this.actionCooldown--; + if (--this.trappedTick >= 0) { + if (this.trappedTick == 0) { + Vec3d tp = TeleportUtils.getTeleportPos(this.player, this.player.getPos(), ClaimStorage.get(this.player.getServerWorld()), + ((IPlayerClaimImpl) this.player).getCurrentClaim().getDimensions(), + TeleportUtils.roundedBlockPos(this.player.getPos()).mutableCopy(), (claim, nPos) -> false); + this.player.teleport(tp.getX(), tp.getY(), tp.getZ()); + } + if (this.player.getPos().squaredDistanceTo(this.trappedPos) > 0.15) { + this.trappedTick = -1; + this.trappedPos = null; + this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.trappedMove), Formatting.RED), false); + } + } } public void clone(PlayerClaimData data) { diff --git a/src/main/java/com/flemmli97/flan/player/TeleportUtils.java b/src/main/java/com/flemmli97/flan/player/TeleportUtils.java new file mode 100644 index 0000000..8b5ff21 --- /dev/null +++ b/src/main/java/com/flemmli97/flan/player/TeleportUtils.java @@ -0,0 +1,68 @@ +package com.flemmli97.flan.player; + +import com.flemmli97.flan.claim.Claim; +import com.flemmli97.flan.claim.ClaimStorage; +import net.minecraft.server.network.ServerPlayerEntity; +import net.minecraft.util.Pair; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; +import net.minecraft.util.math.Vec3d; + +import java.util.function.BiFunction; + +public class TeleportUtils { + + public static BlockPos roundedBlockPos(Vec3d pos) { + return new BlockPos(Math.round(pos.getX()), MathHelper.floor(pos.getY()), Math.round(pos.getZ())); + } + + public static Vec3d getTeleportPos(ServerPlayerEntity player, Vec3d playerPos, ClaimStorage storage, int[] dim, BlockPos.Mutable bPos, BiFunction check) { + Pair pos = nearestOutside(dim, playerPos); + bPos.set(pos.getRight().getX(), pos.getRight().getY(), pos.getRight().getZ()); + Claim claim = storage.getClaimAt(bPos); + if (claim == null || check.apply(claim, bPos)) + return pos.getRight(); + int[] newDim = claim.getDimensions(); + switch (pos.getLeft()) { + case NORTH: + dim[2] = newDim[2]; + break; + case SOUTH: + dim[3] = newDim[3]; + break; + case EAST: + dim[1] = newDim[1]; + break; + default: + dim[0] = newDim[0]; + break; + } + return getTeleportPos(player, playerPos, storage, dim, bPos, check); + } + + private static Pair nearestOutside(int[] dim, Vec3d from) { + double northDist = Math.abs(from.getZ() - dim[2]); + double southDist = Math.abs(dim[3] - from.getZ()); + double westDist = Math.abs(from.getX() - dim[0]); + double eastDist = Math.abs(dim[1] - from.getX()); + if (northDist > southDist) { + if (eastDist > westDist) { + if (southDist > westDist) + return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); + return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); + } + if (southDist > eastDist) + return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); + return new Pair<>(Direction.SOUTH, new Vec3d(from.getX(), from.getY(), dim[3] + 1.5)); + } + if (eastDist > westDist) { + if (northDist > westDist) + return new Pair<>(Direction.WEST, new Vec3d(dim[0] - 1.5, from.getY(), from.getZ())); + return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); + } + if (northDist > eastDist) + return new Pair<>(Direction.EAST, new Vec3d(dim[1] + 1.5, from.getY(), from.getZ())); + return new Pair<>(Direction.NORTH, new Vec3d(from.getX(), from.getY(), dim[2] - 1.5)); + } +}