diff --git a/GriefDefenderAPI b/GriefDefenderAPI index f1b2d4f..920a610 160000 --- a/GriefDefenderAPI +++ b/GriefDefenderAPI @@ -1 +1 @@ -Subproject commit f1b2d4fc1646f06f9ef9aa6f5a07f13abb7cf60b +Subproject commit 920a6101dc1a616c431321fffa31516b951b2fa8 diff --git a/bukkit/src/main/java/com/griefdefender/GDPlayerData.java b/bukkit/src/main/java/com/griefdefender/GDPlayerData.java index 89232d7..196ccfd 100644 --- a/bukkit/src/main/java/com/griefdefender/GDPlayerData.java +++ b/bukkit/src/main/java/com/griefdefender/GDPlayerData.java @@ -110,6 +110,8 @@ public class GDPlayerData implements PlayerData { public boolean debugClaimPermissions = false; public boolean inTown = false; public boolean townChat = false; + public boolean lockPlayerDeathDrops = false; + public boolean trappedRequest = false; public List chatLines = new ArrayList<>(); public Instant recordChatTimestamp; public Instant commandInputTimestamp; @@ -140,6 +142,7 @@ public class GDPlayerData implements PlayerData { public Location teleportLocation; public Instant lastPvpTimestamp; + public Instant lastTrappedTimestamp; // cached global option values public int minClaimLevel; @@ -170,7 +173,6 @@ public class GDPlayerData implements PlayerData { public boolean userOptionBypassPlayerGamemode = false; // option cache - public Boolean optionNoFly = null; public Boolean optionNoGodMode = null; public Double optionFlySpeed = null; public Double optionWalkSpeed = null; @@ -356,8 +358,8 @@ public class GDPlayerData implements PlayerData { for (int i = 0; i < visualTransactions.size(); i++) { BlockSnapshot snapshot = visualTransactions.get(i).getOriginal(); - // If original block does not exist, do not send to player - if (!snapshot.matchesWorldState()) { + // If original block does not exist or chunk is not loaded, do not send to player + if (!snapshot.matchesWorldState() || !snapshot.getLocation().getChunk().isLoaded()) { if (claim != null) { claim.markVisualDirty = true; } @@ -794,7 +796,7 @@ public class GDPlayerData implements PlayerData { final Instant now = Instant.now(); int combatTimeout = 0; - if (GDOptions.isOptionEnabled(Options.PVP_COMBAT_TIMEOUT)) { + if (GDOptions.PVP_COMBAT_TIMEOUT) { combatTimeout = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PVP_COMBAT_TIMEOUT, claim); } if (combatTimeout <= 0) { @@ -860,7 +862,6 @@ public class GDPlayerData implements PlayerData { } public void resetOptionCache() { - this.optionNoFly = null; this.optionNoGodMode = null; this.optionFlySpeed = null; this.optionWalkSpeed = null; diff --git a/bukkit/src/main/java/com/griefdefender/GriefDefenderPlugin.java b/bukkit/src/main/java/com/griefdefender/GriefDefenderPlugin.java index caf5700..cba42f8 100644 --- a/bukkit/src/main/java/com/griefdefender/GriefDefenderPlugin.java +++ b/bukkit/src/main/java/com/griefdefender/GriefDefenderPlugin.java @@ -161,6 +161,8 @@ import com.griefdefender.command.CommandUntrustPlayer; import com.griefdefender.command.CommandUntrustPlayerAll; import com.griefdefender.command.gphelper.CommandAccessTrust; import com.griefdefender.command.gphelper.CommandContainerTrust; +import com.griefdefender.command.gphelper.CommandTrapped; +import com.griefdefender.command.gphelper.CommandUnlockDrops; import com.griefdefender.configuration.FlagConfig; import com.griefdefender.configuration.GriefDefenderConfig; import com.griefdefender.configuration.MessageDataConfig; @@ -203,6 +205,7 @@ import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.flag.GDFlagData; import com.griefdefender.permission.flag.GDFlagDefinition; import com.griefdefender.permission.flag.GDFlags; +import com.griefdefender.permission.option.GDOptions; import com.griefdefender.provider.DynmapProvider; import com.griefdefender.provider.LuckPermsProvider; import com.griefdefender.provider.PermissionProvider; @@ -557,7 +560,6 @@ public class GriefDefenderPlugin { CreateModeTypeRegistryModule.getInstance().registerDefaults(); GameModeTypeRegistryModule.getInstance().registerDefaults(); WeatherTypeRegistryModule.getInstance().registerDefaults(); - OptionRegistryModule.getInstance().registerDefaults(); if (!reload) { GriefDefender.getRegistry().registerBuilderSupplier(PaymentTransaction.Builder.class, GDPaymentTransaction.PaymentTransactionBuilder::new); GriefDefender.getRegistry().registerBuilderSupplier(Claim.Builder.class, GDClaim.ClaimBuilder::new); @@ -815,10 +817,12 @@ public class GriefDefenderPlugin { manager.registerCommand(new CommandSetAccruedClaimBlocks()); manager.registerCommand(new CommandTownChat()); manager.registerCommand(new CommandTownTag()); + manager.registerCommand(new CommandTrapped()); manager.registerCommand(new CommandTrustGroup()); manager.registerCommand(new CommandTrustPlayer()); manager.registerCommand(new CommandTrustGroupAll()); manager.registerCommand(new CommandTrustPlayerAll()); + manager.registerCommand(new CommandUnlockDrops()); manager.registerCommand(new CommandUntrustGroup()); manager.registerCommand(new CommandUntrustPlayer()); manager.registerCommand(new CommandUntrustGroupAll()); @@ -1066,12 +1070,14 @@ public class GriefDefenderPlugin { flagConfig.save(); flagConfig.getConfig().defaultFlagCategory.refreshFlags(); flagConfig.save(); + OptionRegistryModule.getInstance().registerDefaults(); optionConfig = new OptionConfig(this.getConfigPath().resolve("options.conf")); optionConfig.getConfig().defaultOptionCategory.checkOptions(); optionConfig.save(); BaseStorage.globalConfig.save(); BaseStorage.USE_GLOBAL_PLAYER_STORAGE = !BaseStorage.globalConfig.getConfig().playerdata.useWorldPlayerData(); GDFlags.populateFlagStatus(); + GDOptions.populateOptionStatus(); CLAIM_BLOCK_SYSTEM = BaseStorage.globalConfig.getConfig().playerdata.claimBlockSystem; final GDBlockType defaultCreateVisualBlock = BlockTypeRegistryModule.getInstance().getById("minecraft:diamond_block").orElse(null); this.createVisualBlock = BlockTypeRegistryModule.getInstance().getById(BaseStorage.globalConfig.getConfig().visual.claimCreateStartBlock).orElse(defaultCreateVisualBlock); diff --git a/bukkit/src/main/java/com/griefdefender/cache/MessageCache.java b/bukkit/src/main/java/com/griefdefender/cache/MessageCache.java index ae4c93a..0d66363 100644 --- a/bukkit/src/main/java/com/griefdefender/cache/MessageCache.java +++ b/bukkit/src/main/java/com/griefdefender/cache/MessageCache.java @@ -134,6 +134,12 @@ public class MessageCache { public Component COMMAND_PET_CONFIRMATION; public Component COMMAND_PET_TRANSFER_READY; public Component COMMAND_PET_TRANSFER_CANCEL; + public Component COMMAND_TRAPPED_BUILD_ACCESS; + public Component COMMAND_TRAPPED_CANCEL_MOVE; + public Component COMMAND_TRAPPED_PVP_COMBAT; + public Component COMMAND_TRAPPED_SUCCESS; + public Component COMMAND_UNLOCK_DROPS; + public Component COMMAND_UNLOCK_DROPS_NONE; public Component COMMAND_WORLDEDIT_MISSING; public Component CONFIRM_NOT_FOUND; public Component CREATE_CANCEL; @@ -318,6 +324,7 @@ public class MessageCache { public Component LABEL_DEFAULT; public Component LABEL_DISPLAYING; public Component LABEL_EXPIRED; + public Component LABEL_FALSE; public Component LABEL_FAREWELL; public Component LABEL_FILTER; public Component LABEL_FLAG; @@ -353,11 +360,12 @@ public class MessageCache { public Component LABEL_SPAWN; public Component LABEL_STATUS; public Component LABEL_TARGET; + public Component LABEL_TRUE; public Component LABEL_TRUST; public Component LABEL_TYPE; - public Component LABEL_WORLD; public Component LABEL_UNKNOWN; public Component LABEL_USER; + public Component LABEL_WORLD; public Component LABEL_YES; public Component MODE_ADMIN; public Component MODE_BASIC; @@ -435,6 +443,7 @@ public class MessageCache { public Component PERMISSION_PLAYER_VIEW_OTHERS; public Component PERMISSION_TAX; public Component PERMISSION_VISUAL_CLAIMS_NEARBY; + public Component PLAYER_ITEM_DROPS_LOCK; public Component PLUGIN_EVENT_CANCEL; public Component PLUGIN_RELOAD; public Component PVP_CLAIM_NOT_ALLOWED; @@ -599,6 +608,12 @@ public class MessageCache { COMMAND_PET_CONFIRMATION = MessageStorage.MESSAGE_DATA.getMessage("command-pet-confirmation"); COMMAND_PET_TRANSFER_READY = MessageStorage.MESSAGE_DATA.getMessage("command-pet-transfer-ready"); COMMAND_PET_TRANSFER_CANCEL = MessageStorage.MESSAGE_DATA.getMessage("command-pet-transfer-cancel"); + COMMAND_TRAPPED_BUILD_ACCESS = MessageStorage.MESSAGE_DATA.getMessage("command-trapped-build-access"); + COMMAND_TRAPPED_CANCEL_MOVE = MessageStorage.MESSAGE_DATA.getMessage("command-trapped-cancel-move"); + COMMAND_TRAPPED_PVP_COMBAT = MessageStorage.MESSAGE_DATA.getMessage("command-trapped-pvp-combat"); + COMMAND_TRAPPED_SUCCESS = MessageStorage.MESSAGE_DATA.getMessage("command-trapped-success"); + COMMAND_UNLOCK_DROPS = MessageStorage.MESSAGE_DATA.getMessage("command-unlock-drops"); + COMMAND_UNLOCK_DROPS_NONE = MessageStorage.MESSAGE_DATA.getMessage("command-unlock-drops-none"); COMMAND_WORLDEDIT_MISSING = MessageStorage.MESSAGE_DATA.getMessage("command-worldedit-missing"); CONFIRM_NOT_FOUND = MessageStorage.MESSAGE_DATA.getMessage("confirm-not-found"); CREATE_CANCEL = MessageStorage.MESSAGE_DATA.getMessage("create-cancel"); @@ -781,6 +796,7 @@ public class MessageCache { LABEL_DEFAULT = MessageStorage.MESSAGE_DATA.getMessage("label-default"); LABEL_DISPLAYING = MessageStorage.MESSAGE_DATA.getMessage("label-displaying"); LABEL_EXPIRED = MessageStorage.MESSAGE_DATA.getMessage("label-expired"); + LABEL_FALSE = MessageStorage.MESSAGE_DATA.getMessage("label-false"); LABEL_FAREWELL = MessageStorage.MESSAGE_DATA.getMessage("label-farewell"); LABEL_FILTER = MessageStorage.MESSAGE_DATA.getMessage("label-filter"); LABEL_FLAG = MessageStorage.MESSAGE_DATA.getMessage("label-flag"); @@ -816,6 +832,7 @@ public class MessageCache { LABEL_SPAWN = MessageStorage.MESSAGE_DATA.getMessage("label-spawn"); LABEL_STATUS = MessageStorage.MESSAGE_DATA.getMessage("label-status"); LABEL_TARGET = MessageStorage.MESSAGE_DATA.getMessage("label-target"); + LABEL_TRUE = MessageStorage.MESSAGE_DATA.getMessage("label-true"); LABEL_TRUST = MessageStorage.MESSAGE_DATA.getMessage("label-trust"); LABEL_TYPE = MessageStorage.MESSAGE_DATA.getMessage("label-type"); LABEL_UNKNOWN = MessageStorage.MESSAGE_DATA.getMessage("label-unknown"); @@ -898,6 +915,7 @@ public class MessageCache { PERMISSION_PLAYER_VIEW_OTHERS = MessageStorage.MESSAGE_DATA.getMessage("permission-player-view-others"); PERMISSION_TAX = MessageStorage.MESSAGE_DATA.getMessage("permission-tax"); PERMISSION_VISUAL_CLAIMS_NEARBY = MessageStorage.MESSAGE_DATA.getMessage("permission-visual-claims-nearby"); + PLAYER_ITEM_DROPS_LOCK = MessageStorage.MESSAGE_DATA.getMessage("player-item-drops-lock"); PLUGIN_EVENT_CANCEL = MessageStorage.MESSAGE_DATA.getMessage("plugin-event-cancel"); PLUGIN_RELOAD = MessageStorage.MESSAGE_DATA.getMessage("plugin-reload"); PVP_CLAIM_NOT_ALLOWED = MessageStorage.MESSAGE_DATA.getMessage("pvp-claim-not-allowed"); diff --git a/bukkit/src/main/java/com/griefdefender/command/CommandClaimSpawn.java b/bukkit/src/main/java/com/griefdefender/command/CommandClaimSpawn.java index 2bafaf7..7d11316 100644 --- a/bukkit/src/main/java/com/griefdefender/command/CommandClaimSpawn.java +++ b/bukkit/src/main/java/com/griefdefender/command/CommandClaimSpawn.java @@ -107,7 +107,7 @@ public class CommandClaimSpawn extends BaseCommand { final Location spawnLocation = new Location(claim.getWorld(), spawnPos.getX(), spawnPos.getY(), spawnPos.getZ()); int teleportDelay = 0; - if (GDOptions.isOptionEnabled(Options.PLAYER_TELEPORT_DELAY)) { + if (GDOptions.PLAYER_TELEPORT_DELAY) { teleportDelay = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PLAYER_TELEPORT_DELAY, claim); } if (teleportDelay > 0) { diff --git a/bukkit/src/main/java/com/griefdefender/command/CommandTrustGroup.java b/bukkit/src/main/java/com/griefdefender/command/CommandTrustGroup.java index 201fc5e..d4e40fe 100644 --- a/bukkit/src/main/java/com/griefdefender/command/CommandTrustGroup.java +++ b/bukkit/src/main/java/com/griefdefender/command/CommandTrustGroup.java @@ -29,6 +29,7 @@ import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandCompletion; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Optional; import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Syntax; @@ -70,13 +71,18 @@ public class CommandTrustGroup extends BaseCommand { + "\nContainer: access to interact with all blocks including inventory." + "\nBuilder: access to everything above including ability to place and break blocks." + "\nManager: access to everything above including ability to manage claim settings.") - @Syntax(" ") + @Syntax(" []") @Subcommand("trust group") - public void execute(Player player, String groupName, String type) { - final TrustType trustType = CommandHelper.getTrustType(type); - if (trustType == null) { - GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().TRUST_INVALID); - return; + public void execute(Player player, String groupName, @Optional String type) { + TrustType trustType = null; + if (type == null) { + trustType = TrustTypes.BUILDER; + } else { + trustType = CommandHelper.getTrustType(type); + if (trustType == null) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().TRUST_INVALID); + return; + } } final GDPermissionGroup group = PermissionHolderCache.getInstance().getOrCreateGroup(groupName); diff --git a/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandTrapped.java b/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandTrapped.java new file mode 100644 index 0000000..46613bd --- /dev/null +++ b/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandTrapped.java @@ -0,0 +1,158 @@ +/* + * This file is part of GriefDefender, licensed under the MIT License (MIT). + * + * Copyright (c) bloodmc + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.griefdefender.command.gphelper; + +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import net.kyori.text.Component; + +import com.google.common.collect.ImmutableMap; +import com.google.common.reflect.TypeToken; +import com.griefdefender.GDPlayerData; +import com.griefdefender.GriefDefenderPlugin; +import com.griefdefender.api.Tristate; +import com.griefdefender.api.claim.TrustTypes; +import com.griefdefender.api.permission.flag.Flags; +import com.griefdefender.api.permission.option.Options; +import com.griefdefender.cache.MessageCache; +import com.griefdefender.claim.GDClaim; +import com.griefdefender.configuration.MessageStorage; +import com.griefdefender.permission.GDPermissionManager; +import com.griefdefender.permission.GDPermissions; +import com.griefdefender.permission.option.GDOptions; +import com.griefdefender.util.SafeTeleportHelper; + +import java.time.Duration; +import java.time.Instant; +import java.util.concurrent.ThreadLocalRandom; + +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +@CommandAlias("%griefdefender") +@CommandPermission(GDPermissions.COMMAND_TRAPPED) +public class CommandTrapped extends BaseCommand { + + @CommandAlias("trapped") + @Description("Teleports the player to a safe location if stuck and unable to build.") + @Subcommand("player trapped") + public void execute(Player player) { + final GameMode gameMode = player.getGameMode(); + if (gameMode == GameMode.SPECTATOR) { + return; + } + + final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId()); + final GDClaim claim = GriefDefenderPlugin.getInstance().dataStore.getClaimAtPlayer(playerData, player.getLocation()); + + if (playerData.inPvpCombat()) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_PVP_COMBAT); + return; + } + if (player.getUniqueId().equals(claim.getOwnerUniqueId()) || claim.isUserTrusted(player, TrustTypes.BUILDER)) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_BUILD_ACCESS); + return; + } + + final Instant now = Instant.now(); + final int cooldown = GriefDefenderPlugin.getActiveConfig(player.getWorld()).getConfig().claim.trappedCooldown; + if (playerData.lastTrappedTimestamp != null && !playerData.lastTrappedTimestamp.plusSeconds(cooldown).isBefore(now)) { + final int duration = (int) Duration.between(playerData.lastTrappedTimestamp, now).getSeconds(); + final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.COMMAND_TRAPPED_CANCEL_COOLDOWN, ImmutableMap.of( + "time-remaining", cooldown - duration)); + GriefDefenderPlugin.sendMessage(player, message); + return; + } + + playerData.lastTrappedTimestamp = null; + // check place + boolean canBuild = true; + final Tristate placeResult = GDPermissionManager.getInstance().getFinalPermission(null, player.getLocation(), claim, Flags.BLOCK_PLACE, player, player.getLocation(), player, TrustTypes.BUILDER, true); + if (placeResult == Tristate.FALSE) { + canBuild = false; + } else { + // check break + final Tristate breakResult = GDPermissionManager.getInstance().getFinalPermission(null, player.getLocation(), claim, Flags.BLOCK_BREAK, player, player.getLocation(), player, TrustTypes.BUILDER, true); + if (breakResult == Tristate.FALSE) { + canBuild = false; + } + } + if (canBuild) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_BUILD_ACCESS); + return; + } + + final int minClaimLevel = claim.getOwnerMinClaimLevel(); + double claimY = claim.getOwnerPlayerData() == null ? 65.0D : (minClaimLevel > 65.0D ? minClaimLevel : 65); + if (claim.isCuboid()) { + claimY = claim.lesserBoundaryCorner.getY(); + } + + final int random = ThreadLocalRandom.current().nextInt(2, 20 + 1); + final int randomCorner = ThreadLocalRandom.current().nextInt(1, 4 + 1); + Location claimCorner = null; + switch (randomCorner) { + case 1: // SW + claimCorner = new Location(claim.getWorld(), claim.lesserBoundaryCorner.getX() - random, claimY, claim.greaterBoundaryCorner.getZ() + random); + case 2: // NW + claimCorner = new Location(claim.getWorld(), claim.lesserBoundaryCorner.getX() - random, claimY, claim.lesserBoundaryCorner.getZ() - random); + case 3: // SE + claimCorner = new Location(claim.getWorld(), claim.greaterBoundaryCorner.getX() + random, claimY, claim.greaterBoundaryCorner.getZ() + random); + case 4: // NE + claimCorner = new Location(claim.getWorld(), claim.greaterBoundaryCorner.getX() + random, claimY, claim.lesserBoundaryCorner.getZ() - random); + } + + final Location safeLocation = SafeTeleportHelper.getInstance().getSafeLocation(claimCorner, 64, 16, 2).orElse(null); + if (safeLocation != null) { + playerData.teleportLocation = safeLocation; + } else { + // If no safe location was found, fall back to corner + playerData.teleportLocation = claimCorner; + } + + int teleportDelay = 0; + if (GDOptions.PLAYER_TELEPORT_DELAY) { + teleportDelay = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PLAYER_TELEPORT_DELAY, claim); + } + + if (teleportDelay > 0) { + playerData.trappedRequest = true; + playerData.teleportDelay = teleportDelay + 1; + final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.COMMAND_TRAPPED_REQUEST, ImmutableMap.of( + "time-remaining", teleportDelay)); + GriefDefenderPlugin.sendMessage(player, message); + return; + } + + playerData.lastTrappedTimestamp = now; + player.teleport(playerData.teleportLocation); + playerData.teleportLocation = null; + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_SUCCESS); + } +} diff --git a/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandUnlockDrops.java b/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandUnlockDrops.java new file mode 100644 index 0000000..921a7a4 --- /dev/null +++ b/bukkit/src/main/java/com/griefdefender/command/gphelper/CommandUnlockDrops.java @@ -0,0 +1,56 @@ +/* + * This file is part of GriefDefender, licensed under the MIT License (MIT). + * + * Copyright (c) bloodmc + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package com.griefdefender.command.gphelper; + +import co.aikar.commands.BaseCommand; +import co.aikar.commands.annotation.CommandAlias; +import co.aikar.commands.annotation.CommandPermission; +import co.aikar.commands.annotation.Description; +import co.aikar.commands.annotation.Subcommand; +import com.griefdefender.GDPlayerData; +import com.griefdefender.GriefDefenderPlugin; +import com.griefdefender.cache.MessageCache; +import com.griefdefender.permission.GDPermissions; +import org.bukkit.entity.Player; + +@CommandAlias("%griefdefender") +@CommandPermission(GDPermissions.COMMAND_UNLOCK_DROPS) +public class CommandUnlockDrops extends BaseCommand { + + @CommandAlias("unlockdrops") + @Description("Allows other players to pickup any items dropped from death.") + @Subcommand("player unlockdrops") + public void execute(Player player) { + final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId()); + if (!playerData.lockPlayerDeathDrops) { + //send not locked msg + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_UNLOCK_DROPS_NONE); + return; + } + + playerData.lockPlayerDeathDrops = false; + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_UNLOCK_DROPS); + } +} diff --git a/bukkit/src/main/java/com/griefdefender/configuration/MessageStorage.java b/bukkit/src/main/java/com/griefdefender/configuration/MessageStorage.java index 38f7050..6933e72 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/MessageStorage.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/MessageStorage.java @@ -163,6 +163,8 @@ public class MessageStorage { public static final String COMMAND_OPTION_EXCEEDS_ADMIN = "command-option-exceeds-admin"; public static final String COMMAND_PET_INVALID = "command-pet-invalid"; public static final String COMMAND_PLAYER_NOT_FOUND = "command-player-not-found"; + public static final String COMMAND_TRAPPED_CANCEL_COOLDOWN = "command-trapped-cancel-cooldown"; + public static final String COMMAND_TRAPPED_REQUEST = "command-trapped-request"; public static final String COMMAND_WORLD_NOT_FOUND = "command-world-not-found"; public static final String CREATE_FAILED_CLAIM_LIMIT = "create-failed-claim-limit"; public static final String CREATE_FAILED_RESULT = "create-failed-result"; diff --git a/bukkit/src/main/java/com/griefdefender/configuration/category/ClaimCategory.java b/bukkit/src/main/java/com/griefdefender/configuration/category/ClaimCategory.java index 4203c70..bbb9c4a 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/category/ClaimCategory.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/category/ClaimCategory.java @@ -41,6 +41,8 @@ public class ClaimCategory extends ConfigCategory { + "\nEx. If you add 'minecraft:creeper' to the list, creepers would not be able to hurt entities above sea level." + "\nNote: This will have higher priority than 'explosion-entity' flag.") public List explosionEntitySurfaceBlacklist = new ArrayList<>(); + @Setting(value = "explosion-surface-block-level", comment = "The 'Y' block level that is considered the surface for explosions. (Default: 63)") + public int explosionSurfaceBlockLevel = 63; @Setting(value = "piston-protection-in-claims", comment = "Whether piston protection should be enabled within claims. Note: This does not affect pistons crossing into another claim, that is always protected. This only determines whether or not GD should process pistons if it doesn't cross into another claim.") public boolean pistonProtectionInClaims = false; @Setting(value = "auto-chest-claim-block-radius", comment = "Radius used (in blocks) for auto-created claim when a chest is placed. Set to -1 to disable chest claim creation.") @@ -68,6 +70,8 @@ public class ClaimCategory extends ConfigCategory { @Setting(value = "claims-enabled", comment = "Whether claiming is enabled or not. (0 = Disabled, 1 = Enabled)") public int claimsEnabled = 1; + @Setting(value = "player-trapped-cooldown", comment = "The cooldown time, in seconds, when using the '/trapped' command. (Default: 300)") + public int trappedCooldown = 300; @Setting(value = "protect-tamed-entities", comment = "Whether tamed entities should be protected in claims. Default: true") public boolean protectTamedEntities = true; @Setting(value = "reserved-claim-names", comment = "A list of reserved claim names for use only by administrators." diff --git a/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultOptionCategory.java b/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultOptionCategory.java index 123e05b..468368b 100644 --- a/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultOptionCategory.java +++ b/bukkit/src/main/java/com/griefdefender/configuration/category/DefaultOptionCategory.java @@ -71,6 +71,7 @@ public class DefaultOptionCategory extends ConfigCategory { this.defaultUserOptions.put(Options.PLAYER_FLY_SPEED.getName(), "0"); this.defaultUserOptions.put(Options.PLAYER_GAMEMODE.getName(), "undefined"); this.defaultUserOptions.put(Options.PLAYER_HEALTH_REGEN.getName(), "0"); + this.defaultUserOptions.put(Options.PLAYER_ITEM_DROP_LOCK.getName(), "false"); this.defaultUserOptions.put(Options.PLAYER_KEEP_INVENTORY.getName(), "undefined"); this.defaultUserOptions.put(Options.PLAYER_KEEP_LEVEL.getName(), "undefined"); this.defaultUserOptions.put(Options.PLAYER_TELEPORT_DELAY.getName(), "0"); @@ -80,6 +81,7 @@ public class DefaultOptionCategory extends ConfigCategory { this.defaultUserOptions.put(Options.PVP_COMBAT_COMMAND.getName(), "false"); this.defaultUserOptions.put(Options.PVP_COMBAT_TELEPORT.getName(), "false"); this.defaultUserOptions.put(Options.PVP_COMBAT_TIMEOUT.getName(), "15"); + this.defaultUserOptions.put(Options.PVP_ITEM_DROP_LOCK.getName(), "false"); this.defaultUserOptions.put(Options.RAID.getName(), "true"); this.defaultUserOptions.put(Options.RADIUS_INSPECT.getName(), "100"); this.defaultUserOptions.put(Options.RENT_EXPIRATION.getName(), "7"); diff --git a/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java index 291f3ea..5980fd7 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/BlockEventHandler.java @@ -503,13 +503,14 @@ public class BlockEventHandler implements Listener { if (!denySurfaceExplosion) { denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionBlockSurfaceBlacklist.contains("any"); } + final int surfaceBlockLevel = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionSurfaceBlockLevel; for (Block block : event.blockList()) { final Location location = block.getLocation(); if (location.getBlock().isEmpty()) { continue; } targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location); - if (denySurfaceExplosion && block.getWorld().getEnvironment() != Environment.NETHER && location.getBlockY() >= location.getWorld().getSeaLevel()) { + if (denySurfaceExplosion && block.getWorld().getEnvironment() != Environment.NETHER && location.getBlockY() >= surfaceBlockLevel) { filteredLocations.add(block); GDPermissionManager.getInstance().processEventLog(event, location, targetClaim, Flags.EXPLOSION_BLOCK.getPermission(), source, block, user, "explosion-surface", Tristate.FALSE); continue; diff --git a/bukkit/src/main/java/com/griefdefender/listener/CommandEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/CommandEventHandler.java index c9eb81d..8337af0 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/CommandEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/CommandEventHandler.java @@ -179,7 +179,7 @@ public class CommandEventHandler implements Listener { final int combatTimeRemaining = playerData.getPvpCombatTimeRemaining(claim); final boolean inPvpCombat = combatTimeRemaining > 0; - if (GDOptions.isOptionEnabled(Options.PVP_COMBAT_COMMAND)) { + if (GDOptions.PVP_COMBAT_COMMAND) { final boolean pvpCombatCommand = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), player, Options.PVP_COMBAT_COMMAND, claim); if (!pvpCombatCommand && inPvpCombat) { final Component denyMessage = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PVP_IN_COMBAT_NOT_ALLOWED, diff --git a/bukkit/src/main/java/com/griefdefender/listener/CommonEntityEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/CommonEntityEventHandler.java index 419048d..9fe222a 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/CommonEntityEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/CommonEntityEventHandler.java @@ -109,16 +109,26 @@ public class CommonEntityEventHandler { final Vector3i fromPos = VecHelper.toVector3i(fromLocation); final Vector3i toPos = VecHelper.toVector3i(toLocation); + final Player player = targetEntity instanceof Player ? (Player) targetEntity : null; + final GDPermissionUser user = player != null ? PermissionHolderCache.getInstance().getOrCreateUser(player) : null; if (fromPos.equals(toPos)) { + if (user != null) { + user.getInternalPlayerData().lastAfkCheckLocation = toLocation; + } return true; } + if (user != null) { + user.getInternalPlayerData().lastAfkCheckLocation = null; + if (user.getInternalPlayerData().trappedRequest) { + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_CANCEL_MOVE); + user.getInternalPlayerData().trappedRequest = false; + user.getInternalPlayerData().teleportDelay = 0; + } + } if ((!GDFlags.ENTER_CLAIM && !GDFlags.EXIT_CLAIM)) { return true; } - final Player player = targetEntity instanceof Player ? (Player) targetEntity : null; - final GDPermissionUser user = player != null ? PermissionHolderCache.getInstance().getOrCreateUser(player) : null; - if (user != null && user.getOnlinePlayer() != null) { final boolean preInLiquid = user.getInternalPlayerData().inLiquid; final boolean inLiquid = user.getOnlinePlayer().getPlayer().getLocation().getBlock().isLiquid(); @@ -350,7 +360,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_COMMAND_ENTER) && !GDOptions.isOptionEnabled(Options.PLAYER_COMMAND_EXIT)) { + if (!GDOptions.PLAYER_COMMAND_ENTER && !GDOptions.PLAYER_COMMAND_EXIT) { return; } @@ -429,7 +439,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_DENY_FLIGHT)) { + if (!GDOptions.PLAYER_DENY_FLIGHT) { return; } @@ -472,12 +482,8 @@ public class CommonEntityEventHandler { return; } - Boolean noFly = playerData.optionNoFly; - if (noFly == null || fromClaim != toClaim) { - noFly = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), playerData.getSubject(), Options.PLAYER_DENY_FLIGHT, toClaim); - playerData.optionNoFly = noFly; - } - if (noFly) { + final Boolean noFly = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), playerData.getSubject(), Options.PLAYER_DENY_FLIGHT, toClaim); + if (noFly != null && noFly) { player.setAllowFlight(false); player.setFlying(false); playerData.ignoreFallDamage = true; @@ -494,7 +500,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_DENY_GODMODE)) { + if (!GDOptions.PLAYER_DENY_GODMODE) { return; } @@ -525,7 +531,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_GAMEMODE)) { + if (!GDOptions.PLAYER_GAMEMODE) { return; } @@ -564,7 +570,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_FLY_SPEED)) { + if (!GDOptions.PLAYER_FLY_SPEED) { return; } @@ -616,7 +622,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_WALK_SPEED)) { + if (!GDOptions.PLAYER_WALK_SPEED) { return; } @@ -668,7 +674,7 @@ public class CommonEntityEventHandler { // Most likely Citizens NPC return; } - if (!GDOptions.isOptionEnabled(Options.PLAYER_WEATHER)) { + if (!GDOptions.PLAYER_WEATHER) { return; } diff --git a/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java index e7fc966..5747ced 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/EntityEventHandler.java @@ -248,6 +248,7 @@ public class EntityEventHandler implements Listener { } final String sourceId = GDPermissionManager.getInstance().getPermissionIdentifier(source); + final int surfaceBlockLevel = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionSurfaceBlockLevel; boolean denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionBlockSurfaceBlacklist.contains(sourceId); if (!denySurfaceExplosion) { denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionBlockSurfaceBlacklist.contains("any"); @@ -259,7 +260,7 @@ public class EntityEventHandler implements Listener { for (Block block : event.blockList()) { final Location location = block.getLocation(); targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location); - if (denySurfaceExplosion && block.getWorld().getEnvironment() != Environment.NETHER && location.getBlockY() >= location.getWorld().getSeaLevel()) { + if (denySurfaceExplosion && block.getWorld().getEnvironment() != Environment.NETHER && location.getBlockY() >= surfaceBlockLevel) { filteredLocations.add(block); GDPermissionManager.getInstance().processEventLog(event, location, targetClaim, Flags.EXPLOSION_BLOCK.getPermission(), source, block, user, "explosion-surface", Tristate.FALSE); continue; @@ -435,6 +436,13 @@ public class EntityEventHandler implements Listener { } // Ignore entity items if (targetEntity instanceof Item) { + if (GDOptions.PLAYER_ITEM_DROP_LOCK || GDOptions.PVP_ITEM_DROP_LOCK) { + final Item item = (Item) targetEntity; + final String data = NMSUtil.getInstance().getItemPersistentData(item.getItemStack(), "owner"); + if (data != null) { + return true; + } + } return false; } @@ -493,11 +501,12 @@ public class EntityEventHandler implements Listener { if (source instanceof Creeper || source instanceof TNTPrimed || (damageCause != null && damageCause == DamageCause.ENTITY_EXPLOSION)) { final String sourceId = GDPermissionManager.getInstance().getPermissionIdentifier(source); + final int surfaceBlockLevel = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionSurfaceBlockLevel; boolean denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionEntitySurfaceBlacklist.contains(sourceId); if (!denySurfaceExplosion) { denySurfaceExplosion = GriefDefenderPlugin.getActiveConfig(world.getUID()).getConfig().claim.explosionEntitySurfaceBlacklist.contains("any"); } - if (denySurfaceExplosion && world.getEnvironment() != Environment.NETHER && location.getBlockY() >= location.getWorld().getSeaLevel()) { + if (denySurfaceExplosion && world.getEnvironment() != Environment.NETHER && location.getBlockY() >= surfaceBlockLevel) { GDPermissionManager.getInstance().processEventLog(event, location, claim, Flags.EXPLOSION_ENTITY.getPermission(), source, targetEntity, user, "explosion-surface", Tristate.FALSE); return true; } @@ -620,7 +629,7 @@ public class EntityEventHandler implements Listener { } // Check options - if (GDOptions.isOptionEnabled(Options.PVP)) { + if (GDOptions.PVP) { sourceResult = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Tristate.class), source, Options.PVP, sourceClaim); targetResult = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Tristate.class), target, Options.PVP, claim); } diff --git a/bukkit/src/main/java/com/griefdefender/listener/PlayerEventHandler.java b/bukkit/src/main/java/com/griefdefender/listener/PlayerEventHandler.java index 299855f..2d90ff1 100644 --- a/bukkit/src/main/java/com/griefdefender/listener/PlayerEventHandler.java +++ b/bukkit/src/main/java/com/griefdefender/listener/PlayerEventHandler.java @@ -267,11 +267,11 @@ public class PlayerEventHandler implements Listener { final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId()); final GDClaim claim = GriefDefenderPlugin.getInstance().dataStore.getClaimAtPlayer(playerData, player.getLocation()); Tristate keepInventory = Tristate.UNDEFINED; - if (GDOptions.isOptionEnabled(Options.PLAYER_KEEP_INVENTORY)) { + if (GDOptions.PLAYER_KEEP_INVENTORY) { keepInventory = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Tristate.class), playerData.getSubject(), Options.PLAYER_KEEP_INVENTORY, claim); } Tristate keepLevel = Tristate.UNDEFINED; - if (GDOptions.isOptionEnabled(Options.PLAYER_KEEP_LEVEL)) { + if (GDOptions.PLAYER_KEEP_LEVEL) { keepLevel = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Tristate.class), playerData.getSubject(), Options.PLAYER_KEEP_LEVEL, claim); } if (keepInventory != Tristate.UNDEFINED) { @@ -286,6 +286,25 @@ public class PlayerEventHandler implements Listener { event.setDroppedExp(0); } } + + if (GDOptions.PLAYER_ITEM_DROP_LOCK || GDOptions.PVP_ITEM_DROP_LOCK) { + boolean itemDropLock = false; + if (playerData.inPvpCombat() && GDOptions.PVP_ITEM_DROP_LOCK) { + itemDropLock = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), player, Options.PVP_ITEM_DROP_LOCK, claim); + } else if (GDOptions.PLAYER_ITEM_DROP_LOCK) { + itemDropLock = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), player, Options.PLAYER_ITEM_DROP_LOCK, claim); + } + + if (itemDropLock) { + for (ItemStack item : event.getDrops()) { + NMSUtil.getInstance().addItemPersistentData(item, "owner", player.getUniqueId().toString()); + } + if (event.getDrops().size() > 0) { + playerData.lockPlayerDeathDrops = true; + GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().PLAYER_ITEM_DROPS_LOCK); + } + } + } } @EventHandler(priority = EventPriority.LOWEST) @@ -415,6 +434,18 @@ public class PlayerEventHandler implements Listener { final GDClaim targetClaim = GriefDefenderPlugin.getInstance().dataStore.getClaimAt(location); if (GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, Flags.ITEM_PICKUP, player, event.getItem(), player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) { event.setCancelled(true); + return; + } + + if (GDOptions.PLAYER_ITEM_DROP_LOCK || GDOptions.PVP_ITEM_DROP_LOCK) { + final String data = NMSUtil.getInstance().getItemPersistentData(event.getItem().getItemStack(), "owner"); + if (data != null && !data.equalsIgnoreCase(player.getUniqueId().toString())) { + final UUID ownerUniqueId = UUID.fromString(data); + final GDPlayerData playerData = this.dataStore.getOrCreatePlayerData(location.getWorld(), ownerUniqueId); + if (playerData.lockPlayerDeathDrops) { + event.setCancelled(true); + } + } } } @@ -929,8 +960,6 @@ public class PlayerEventHandler implements Listener { return; } GDCauseStackManager.getInstance().pushCause(player); - final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId()); - playerData.optionNoFly = null; // Reset no fly option on teleports as from/to claim would be the same if (!GDFlags.ENTITY_TELEPORT_FROM && !GDFlags.ENTITY_TELEPORT_TO) { return; } @@ -953,8 +982,9 @@ public class PlayerEventHandler implements Listener { if (type == TeleportCause.UNKNOWN && !sourceLocation.getWorld().getUID().equals(destination.getWorld().getUID())) { source = destination.getWorld().getEnvironment().name().toLowerCase().replace("the_", "") + "_portal"; } + final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId()); final GDClaim sourceClaim = this.dataStore.getClaimAtPlayer(playerData, player.getLocation()); - if (playerData.inPvpCombat() && GDOptions.isOptionEnabled(Options.PVP_COMBAT_TELEPORT)) { + if (playerData.inPvpCombat() && GDOptions.PVP_COMBAT_TELEPORT) { // Cancel event if player is unable to teleport during PvP combat final boolean pvpCombatTeleport = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Boolean.class), player, Options.PVP_COMBAT_TELEPORT, sourceClaim); if (!pvpCombatTeleport) { diff --git a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java index f66100d..46937b3 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java +++ b/bukkit/src/main/java/com/griefdefender/permission/GDPermissionManager.java @@ -218,7 +218,7 @@ public class GDPermissionManager implements PermissionManager { this.eventPlayerData = playerData; final String targetPermission = flag.getPermission(); - if (flag == Flags.ENTITY_SPAWN && GDOptions.isOptionEnabled(Options.SPAWN_LIMIT) && target instanceof LivingEntity) { + if (flag == Flags.ENTITY_SPAWN && GDOptions.SPAWN_LIMIT && target instanceof LivingEntity) { // Check spawn limit final GDClaim gdClaim = (GDClaim) claim; final int spawnLimit = gdClaim.getSpawnLimit(contexts); diff --git a/bukkit/src/main/java/com/griefdefender/permission/GDPermissions.java b/bukkit/src/main/java/com/griefdefender/permission/GDPermissions.java index c6c9005..beda132 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/GDPermissions.java +++ b/bukkit/src/main/java/com/griefdefender/permission/GDPermissions.java @@ -78,6 +78,7 @@ public class GDPermissions { public static final String COMMAND_TOWN_TAX = "griefdefender.user.town.command.tax"; public static final String COMMAND_TOWN_MODE = "griefdefender.user.claim.command.town-mode"; public static final String COMMAND_TRANSFER_CLAIM = "griefdefender.user.claim.command.transfer"; + public static final String COMMAND_TRAPPED = "griefdefender.user.claim.command.trapped"; public static final String COMMAND_BUY_CLAIM_BLOCKS = "griefdefender.user.claim.command.buy-blocks"; public static final String COMMAND_SELL_CLAIM_BLOCKS = "griefdefender.user.claim.command.sell-blocks"; public static final String COMMAND_LIST_CLAIM_FLAGS = "griefdefender.user.claim.command.list-flags"; @@ -85,6 +86,7 @@ public class GDPermissions { public static final String COMMAND_BAN_ITEM = "griefdefender.user.claim.command.ban-item"; public static final String COMMAND_UNBAN_ITEM = "griefdefender.user.claim.command.unban-item"; public static final String COMMAND_CLAIM_INHERIT = "griefdefender.user.claim.command.inherit"; + public static final String COMMAND_UNLOCK_DROPS = "griefdefender.user.claim.command.unlock-drops"; public static final String CLAIM_CREATE = "griefdefender.user.claim.create.base"; public static final String CLAIM_CREATE_BASIC = "griefdefender.user.claim.create.basic"; public static final String CLAIM_CREATE_SUBDIVISION = "griefdefender.user.claim.create.subdivision"; diff --git a/bukkit/src/main/java/com/griefdefender/permission/option/GDOptions.java b/bukkit/src/main/java/com/griefdefender/permission/option/GDOptions.java index 45b6e31..fd496a0 100644 --- a/bukkit/src/main/java/com/griefdefender/permission/option/GDOptions.java +++ b/bukkit/src/main/java/com/griefdefender/permission/option/GDOptions.java @@ -38,6 +38,7 @@ public class GDOptions { public static boolean PLAYER_FLY_SPEED; public static boolean PLAYER_GAMEMODE; public static boolean PLAYER_HEALTH_REGEN; + public static boolean PLAYER_ITEM_DROP_LOCK; public static boolean PLAYER_KEEP_INVENTORY; public static boolean PLAYER_KEEP_LEVEL; public static boolean PLAYER_TELEPORT_DELAY; @@ -47,27 +48,30 @@ public class GDOptions { public static boolean PVP_COMBAT_COMMAND; public static boolean PVP_COMBAT_TELEPORT; public static boolean PVP_COMBAT_TIMEOUT; + public static boolean PVP_ITEM_DROP_LOCK; public static boolean SPAWN_LIMIT; public static void populateOptionStatus() { - PLAYER_COMMAND_ENTER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_COMMAND_ENTER.getName()); - PLAYER_COMMAND_EXIT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_COMMAND_EXIT.getName()); - PLAYER_DENY_FLIGHT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_FLIGHT.getName()); - PLAYER_DENY_GODMODE = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_GODMODE.getName()); - PLAYER_DENY_HUNGER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_HUNGER.getName()); - PLAYER_FLY_SPEED = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_FLY_SPEED.getName()); - PLAYER_GAMEMODE = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_GAMEMODE.getName()); - PLAYER_HEALTH_REGEN = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_HEALTH_REGEN.getName()); - PLAYER_KEEP_INVENTORY = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_KEEP_INVENTORY.getName()); - PLAYER_KEEP_LEVEL = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_KEEP_LEVEL.getName()); - PLAYER_TELEPORT_DELAY = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_TELEPORT_DELAY.getName()); - PLAYER_WALK_SPEED = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_WALK_SPEED.getName()); - PLAYER_WEATHER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_WEATHER.getName()); - PVP = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP.getName()); - PVP_COMBAT_COMMAND = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_COMMAND.getName()); - PVP_COMBAT_TELEPORT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_TELEPORT.getName()); - PVP_COMBAT_TIMEOUT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_TIMEOUT.getName()); - SPAWN_LIMIT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.SPAWN_LIMIT.getName()); + PLAYER_COMMAND_ENTER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_COMMAND_ENTER.getName().toLowerCase()); + PLAYER_COMMAND_EXIT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_COMMAND_EXIT.getName().toLowerCase()); + PLAYER_DENY_FLIGHT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_FLIGHT.getName().toLowerCase()); + PLAYER_DENY_GODMODE = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_GODMODE.getName().toLowerCase()); + PLAYER_DENY_HUNGER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_DENY_HUNGER.getName().toLowerCase()); + PLAYER_FLY_SPEED = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_FLY_SPEED.getName().toLowerCase()); + PLAYER_GAMEMODE = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_GAMEMODE.getName().toLowerCase()); + PLAYER_HEALTH_REGEN = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_HEALTH_REGEN.getName().toLowerCase()); + PLAYER_ITEM_DROP_LOCK = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_ITEM_DROP_LOCK.getName().toLowerCase()); + PLAYER_KEEP_INVENTORY = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_KEEP_INVENTORY.getName().toLowerCase()); + PLAYER_KEEP_LEVEL = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_KEEP_LEVEL.getName().toLowerCase()); + PLAYER_TELEPORT_DELAY = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_TELEPORT_DELAY.getName().toLowerCase()); + PLAYER_WALK_SPEED = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_WALK_SPEED.getName().toLowerCase()); + PLAYER_WEATHER = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PLAYER_WEATHER.getName().toLowerCase()); + PVP = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP.getName().toLowerCase()); + PVP_COMBAT_COMMAND = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_COMMAND.getName().toLowerCase()); + PVP_COMBAT_TELEPORT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_TELEPORT.getName().toLowerCase()); + PVP_COMBAT_TIMEOUT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_COMBAT_TIMEOUT.getName().toLowerCase()); + PVP_ITEM_DROP_LOCK = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.PVP_ITEM_DROP_LOCK.getName().toLowerCase()); + SPAWN_LIMIT = GriefDefenderPlugin.getOptionConfig().getConfig().isOptionEnabled(Options.SPAWN_LIMIT.getName().toLowerCase()); } public static boolean isOptionEnabled(Option option) { diff --git a/bukkit/src/main/java/com/griefdefender/registry/OptionRegistryModule.java b/bukkit/src/main/java/com/griefdefender/registry/OptionRegistryModule.java index 36ef60d..be1d6e8 100644 --- a/bukkit/src/main/java/com/griefdefender/registry/OptionRegistryModule.java +++ b/bukkit/src/main/java/com/griefdefender/registry/OptionRegistryModule.java @@ -117,6 +117,7 @@ public class OptionRegistryModule implements CatalogRegistryModule