From 03dfd443803593d05d7cc10ec9f7b47e63ddd5fa Mon Sep 17 00:00:00 2001 From: Flemmli97 Date: Wed, 9 Jun 2021 12:49:19 +0200 Subject: [PATCH] lock death items --- .../flemmli97/flan/commands/CommandClaim.java | 9 ++++++++ .../github/flemmli97/flan/config/Config.java | 7 ++++++ .../flemmli97/flan/config/LangConfig.java | 3 +++ .../flan/event/EntityInteractEvents.java | 22 +++++++++++++++---- .../flemmli97/flan/mixin/ItemEntityMixin.java | 11 ++++++++++ .../flemmli97/flan/mixin/PlayerMixin.java | 3 +-- .../flemmli97/flan/player/IOwnedItem.java | 2 ++ .../flan/player/PlayerClaimData.java | 18 +++++++++++---- 8 files changed, 65 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java b/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java index bda000c..62fbbf1 100644 --- a/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java +++ b/src/main/java/io/github/flemmli97/flan/commands/CommandClaim.java @@ -55,6 +55,7 @@ public class CommandClaim { .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("unlockDrops").executes(CommandClaim::unlockDrops)) .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))) @@ -203,6 +204,14 @@ public class CommandClaim { return 0; } + private static int unlockDrops(CommandContext context) throws CommandSyntaxException { + ServerPlayerEntity player = context.getSource().getPlayer(); + PlayerClaimData data = PlayerClaimData.get(player); + data.unlockDeathItems(); + context.getSource().sendFeedback(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDrops, ConfigHandler.config.dropTicks), Formatting.GOLD), false); + return Command.SINGLE_SUCCESS; + } + private static int openPersonalGroups(CommandContext context) throws CommandSyntaxException { ServerPlayerEntity player = context.getSource().getPlayer(); PersonalGroupScreenHandler.openGroupMenu(player); diff --git a/src/main/java/io/github/flemmli97/flan/config/Config.java b/src/main/java/io/github/flemmli97/flan/config/Config.java index 8b222c4..b0e194d 100644 --- a/src/main/java/io/github/flemmli97/flan/config/Config.java +++ b/src/main/java/io/github/flemmli97/flan/config/Config.java @@ -48,6 +48,9 @@ public class Config { public int sellPrice = -1; public int buyPrice = -1; + public boolean lockDrops = true; + public int dropTicks = 2400; + public boolean log; public Map> defaultGroups = createHashMap(map -> { @@ -150,6 +153,8 @@ public class Config { this.permissionLevel = ConfigHandler.fromJson(obj, "permissionLevel", this.permissionLevel); this.sellPrice = ConfigHandler.fromJson(obj, "sellPrice", this.sellPrice); this.buyPrice = ConfigHandler.fromJson(obj, "buyPrice", this.buyPrice); + this.lockDrops = ConfigHandler.fromJson(obj, "lockDrops", this.lockDrops); + this.dropTicks = ConfigHandler.fromJson(obj, "dropTicks", this.dropTicks); } catch (IOException e) { e.printStackTrace(); } @@ -194,6 +199,8 @@ public class Config { obj.addProperty("enableLogs", this.log); obj.addProperty("sellPrice", this.sellPrice); obj.addProperty("buyPrice", this.buyPrice); + obj.addProperty("lockDrops", this.lockDrops); + obj.addProperty("dropTicks", this.dropTicks); try { FileWriter writer = new FileWriter(this.config); ConfigHandler.GSON.toJson(obj, writer); diff --git a/src/main/java/io/github/flemmli97/flan/config/LangConfig.java b/src/main/java/io/github/flemmli97/flan/config/LangConfig.java index cf45274..4cbb05f 100644 --- a/src/main/java/io/github/flemmli97/flan/config/LangConfig.java +++ b/src/main/java/io/github/flemmli97/flan/config/LangConfig.java @@ -120,6 +120,9 @@ public class LangConfig { public String trappedFail = "Rescue not necessary or already rescuing"; public String trappedMove = "You moved. Aborting rescue"; + public String unlockDropsCmd = "Your deathitems are protected. Use %s to unlock them for other players"; + public String unlockDrops = "Your deathitems are now unlocked for %s ticks"; + 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/io/github/flemmli97/flan/event/EntityInteractEvents.java b/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java index 2e52f0e..97d5cee 100644 --- a/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java +++ b/src/main/java/io/github/flemmli97/flan/event/EntityInteractEvents.java @@ -6,8 +6,10 @@ import io.github.flemmli97.flan.claim.Claim; import io.github.flemmli97.flan.claim.ClaimStorage; import io.github.flemmli97.flan.claim.IPermissionContainer; import io.github.flemmli97.flan.claim.ObjectToPermissionMap; +import io.github.flemmli97.flan.config.ConfigHandler; import io.github.flemmli97.flan.mixin.IPersistentProjectileVars; import io.github.flemmli97.flan.player.IOwnedItem; +import io.github.flemmli97.flan.player.PlayerClaimData; import io.github.flemmli97.flan.player.TeleportUtils; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import net.minecraft.block.BlockState; @@ -211,14 +213,22 @@ public class EntityInteractEvents { public static boolean canCollideWith(PlayerEntity player, Entity entity) { if (player instanceof ServerPlayerEntity) { + ServerPlayerEntity sPlayer = (ServerPlayerEntity) player; if (entity instanceof ItemEntity) { - if (player.getUuid().equals(((IOwnedItem) entity).getPlayerOrigin())) + IOwnedItem ownedItem = (IOwnedItem) entity; + if (ownedItem.getDeathPlayer() != null && ConfigHandler.config.lockDrops) { + ServerPlayerEntity other = sPlayer.getServer().getPlayerManager().getPlayer(ownedItem.getDeathPlayer()); + if (other == null) + return false; + return PlayerClaimData.get(other).deathItemsUnlocked(); + } + if (sPlayer.getUuid().equals(ownedItem.getPlayerOrigin())) return true; - ClaimStorage storage = ClaimStorage.get((ServerWorld) player.world); - BlockPos pos = player.getBlockPos(); + ClaimStorage storage = ClaimStorage.get(sPlayer.getServerWorld()); + BlockPos pos = sPlayer.getBlockPos(); IPermissionContainer claim = storage.getForPermissionCheck(pos); if (claim != null) - return claim.canInteract((ServerPlayerEntity) player, PermissionRegistry.PICKUP, pos, false); + return claim.canInteract(sPlayer, PermissionRegistry.PICKUP, pos, false); } } return true; @@ -284,6 +294,10 @@ public class EntityInteractEvents { return true; } + public static void updateDroppedItem(PlayerEntity player, ItemEntity entity) { + ((IOwnedItem) entity).setOriginPlayer((player)); + } + public static void updateClaim(ServerPlayerEntity player, Claim currentClaim, Consumer cons) { Vec3d pos = player.getPos(); BlockPos rounded = TeleportUtils.roundedBlockPos(pos.add(0, player.getEyeHeight(player.getPose()), 0)); diff --git a/src/main/java/io/github/flemmli97/flan/mixin/ItemEntityMixin.java b/src/main/java/io/github/flemmli97/flan/mixin/ItemEntityMixin.java index a21d1cf..f23b3ab 100644 --- a/src/main/java/io/github/flemmli97/flan/mixin/ItemEntityMixin.java +++ b/src/main/java/io/github/flemmli97/flan/mixin/ItemEntityMixin.java @@ -17,6 +17,8 @@ public class ItemEntityMixin implements IOwnedItem { @Unique private UUID playerOrigin; + @Unique + private UUID deathPlayerOrigin; @Inject(method = "readCustomDataFromTag", at = @At("RETURN")) private void readData(CompoundTag tag, CallbackInfo info) { @@ -30,10 +32,19 @@ public class ItemEntityMixin implements IOwnedItem { tag.putUuid("Flan:PlayerOrigin", this.playerOrigin); } + @Override public void setOriginPlayer(PlayerEntity player) { this.playerOrigin = player.getUuid(); + if (player.isDead()) + this.deathPlayerOrigin = this.playerOrigin; } + @Override + public UUID getDeathPlayer() { + return this.deathPlayerOrigin; + } + + @Override public UUID getPlayerOrigin() { return this.playerOrigin; } diff --git a/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java b/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java index 5fda1aa..0718151 100644 --- a/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java +++ b/src/main/java/io/github/flemmli97/flan/mixin/PlayerMixin.java @@ -1,7 +1,6 @@ package io.github.flemmli97.flan.mixin; import io.github.flemmli97.flan.event.EntityInteractEvents; -import io.github.flemmli97.flan.player.IOwnedItem; import net.minecraft.entity.Entity; import net.minecraft.entity.ItemEntity; import net.minecraft.entity.player.PlayerEntity; @@ -26,7 +25,7 @@ public abstract class PlayerMixin { @ModifyVariable(method = "dropItem(Lnet/minecraft/item/ItemStack;ZZ)Lnet/minecraft/entity/ItemEntity;", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/ItemEntity;setPickupDelay(I)V")) private ItemEntity ownerDrop(ItemEntity entity) { - ((IOwnedItem) entity).setOriginPlayer(((PlayerEntity) (Object) this)); + EntityInteractEvents.updateDroppedItem((PlayerEntity) (Object) this, entity); return entity; } diff --git a/src/main/java/io/github/flemmli97/flan/player/IOwnedItem.java b/src/main/java/io/github/flemmli97/flan/player/IOwnedItem.java index fcbacf6..06d7893 100644 --- a/src/main/java/io/github/flemmli97/flan/player/IOwnedItem.java +++ b/src/main/java/io/github/flemmli97/flan/player/IOwnedItem.java @@ -8,6 +8,8 @@ public interface IOwnedItem { void setOriginPlayer(PlayerEntity player); + UUID getDeathPlayer(); + UUID getPlayerOrigin(); } diff --git a/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java b/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java index 45376f0..2fd2241 100644 --- a/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java +++ b/src/main/java/io/github/flemmli97/flan/player/PlayerClaimData.java @@ -11,7 +11,6 @@ import io.github.flemmli97.flan.claim.ParticleIndicators; import io.github.flemmli97.flan.claim.PermHelper; import io.github.flemmli97.flan.config.ConfigHandler; import net.minecraft.block.BlockState; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.packet.s2c.play.ParticleS2CPacket; import net.minecraft.server.MinecraftServer; import net.minecraft.server.command.ServerCommandSource; @@ -38,7 +37,7 @@ public class PlayerClaimData { private int claimBlocks, additionalClaimBlocks, confirmTick, actionCooldown; - private int lastBlockTick, trappedTick = -1; + private int lastBlockTick, trappedTick = -1, deathPickupTick; private Vec3d trappedPos; private EnumEditMode mode = EnumEditMode.DEFAULT; private Claim editingClaim; @@ -62,7 +61,7 @@ public class PlayerClaimData { this.claimBlocks = ConfigHandler.config.startingBlocks; } - public static PlayerClaimData get(PlayerEntity player) { + public static PlayerClaimData get(ServerPlayerEntity player) { return ((IPlayerClaimImpl) player).get(); } @@ -261,11 +260,22 @@ public class PlayerClaimData { this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.trappedMove), Formatting.RED), false); } } + this.deathPickupTick--; + } + + public void unlockDeathItems() { + this.deathPickupTick = 1200; + } + + public boolean deathItemsUnlocked() { + return this.deathPickupTick > 0; } public void clone(PlayerClaimData data) { this.claimBlocks = data.claimBlocks; this.additionalClaimBlocks = data.additionalClaimBlocks; + if (ConfigHandler.config.lockDrops) + this.player.sendMessage(PermHelper.simpleColoredText(String.format(ConfigHandler.lang.unlockDropsCmd, "/flan unlockDrops"), Formatting.GOLD), false); } public void save(MinecraftServer server) { @@ -380,7 +390,7 @@ public class PlayerClaimData { } else { BufferedReader reader = new BufferedReader(new FileReader(f)); - PlayerEntity player = server.getPlayerManager().getPlayer(UUID.fromString(f.getName())); + ServerPlayerEntity player = server.getPlayerManager().getPlayer(UUID.fromString(f.getName())); if (player != null) { PlayerClaimData data = PlayerClaimData.get(player); reader.readLine();