Add command completions.

* Fix accessor trust not affecting block collisions.
* Fix tools in config not supporting mod ids.
* Fix lava placement bug.
* Fix flag default tab permission.

Fixes #3, Fixes #5, Fixes #7, Fixes #10
This commit is contained in:
bloodshot 2019-07-27 04:15:53 -04:00
parent ba39de90ab
commit 96c90fcd7b
29 changed files with 237 additions and 30 deletions

View File

@ -31,13 +31,16 @@ import co.aikar.commands.RootCommand;
import co.aikar.timings.lib.MCTiming;
import co.aikar.timings.lib.TimingManager;
import com.google.common.collect.ImmutableList;
import com.google.common.reflect.TypeToken;
import com.google.inject.Guice;
import com.google.inject.Stage;
import com.griefdefender.api.Tristate;
import com.griefdefender.api.claim.ClaimBlockSystem;
import com.griefdefender.api.claim.ClaimType;
import com.griefdefender.api.claim.TrustType;
import com.griefdefender.api.permission.flag.Flag;
import com.griefdefender.api.permission.option.Option;
import com.griefdefender.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager;
@ -109,11 +112,12 @@ import com.griefdefender.configuration.category.BlacklistCategory;
import com.griefdefender.configuration.type.ConfigBase;
import com.griefdefender.configuration.type.GlobalConfig;
import com.griefdefender.inject.GriefDefenderImplModule;
import com.griefdefender.internal.material.GDMaterials;
import com.griefdefender.internal.provider.WorldEditProvider;
import com.griefdefender.internal.provider.WorldGuardProvider;
import com.griefdefender.internal.registry.BlockTypeRegistryModule;
import com.griefdefender.internal.registry.EntityTypeRegistryModule;
import com.griefdefender.internal.registry.GDEntityType;
import com.griefdefender.internal.registry.GDItemType;
import com.griefdefender.internal.registry.ItemTypeRegistryModule;
import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.internal.util.VecHelper;
@ -142,6 +146,7 @@ import com.griefdefender.task.ClaimCleanupTask;
import com.griefdefender.text.ComponentConfigSerializer;
import com.griefdefender.text.TextTemplate;
import com.griefdefender.text.TextTemplateConfigSerializer;
import com.griefdefender.util.PermissionUtil;
import me.lucko.luckperms.api.LuckPermsApi;
import me.lucko.luckperms.api.User;
@ -159,7 +164,6 @@ import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.LocaleUtils;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
@ -174,6 +178,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -227,8 +232,8 @@ public class GriefDefenderPlugin {
private boolean isEconomyModeEnabled = false;
public Material modificationTool;
public Material investigationTool;
public GDItemType modificationTool;
public GDItemType investigationTool;
public int maxInspectionDistance = 100;
public static boolean debugLogging = false;
@ -630,7 +635,60 @@ public class GriefDefenderPlugin {
ID_MAP.add("griefdefender:claimflag");
ID_MAP.add("griefdefender:claimflaggroup");
ID_MAP.add("griefdefender:claimflagplayer");
//ID_MAP.add("unknown");
manager.getCommandCompletions().registerCompletion("gdplayers", c -> {
return ImmutableList.copyOf(PermissionUtil.getInstance().getAllLoadedPlayerNames());
});
manager.getCommandCompletions().registerCompletion("gdgroups", c -> {
return ImmutableList.copyOf(PermissionUtil.getInstance().getAllLoadedGroupNames());
});
manager.getCommandCompletions().registerCompletion("gdclaimtypes", c -> {
List<String> tabList = new ArrayList<>();
for (ClaimType type : ClaimTypeRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdtrusttypes", c -> {
List<String> tabList = new ArrayList<>();
for (TrustType type : TrustTypeRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdflags", c -> {
List<String> tabList = new ArrayList<>();
for (Flag type : FlagRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdoptions", c -> {
List<String> tabList = new ArrayList<>();
for (Option type : OptionRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdmcids", c -> {
List<String> tabList = new ArrayList<>();
for (GDItemType type : ItemTypeRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
for (GDEntityType type : EntityTypeRegistryModule.getInstance().getAll()) {
tabList.add(type.getName());
}
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdtristates", c -> {
return ImmutableList.of("true", "false", "undefined");
});
manager.getCommandCompletions().registerCompletion("gdcontexts", c -> {
return ImmutableList.of("context[<override|default|used_item|source|world|server|player|group>]");
});
manager.getCommandCompletions().registerCompletion("gddummy", c -> {
return ImmutableList.of();
});
}
public PaperCommandManager getCommandManager() {
@ -675,10 +733,8 @@ public class GriefDefenderPlugin {
GDFlags.populateFlagStatus();
PermissionHolderCache.getInstance().getOrCreatePermissionCache(GriefDefenderPlugin.DEFAULT_HOLDER).invalidateAll();
CLAIM_BLOCK_SYSTEM = BaseStorage.globalConfig.getConfig().playerdata.claimBlockSystem;
final Material modTool = Material.getMaterial(BaseStorage.globalConfig.getConfig().claim.modificationTool);
final Material invTool = Material.getMaterial(BaseStorage.globalConfig.getConfig().claim.investigationTool);
this.modificationTool = modTool == null ? GDMaterials.GOLDEN_SHOVEL : modTool;
this.investigationTool = invTool == null? Material.STICK : invTool;
this.modificationTool = ItemTypeRegistryModule.getInstance().getById(BaseStorage.globalConfig.getConfig().claim.modificationTool).orElse(ItemTypeRegistryModule.getInstance().getById("minecraft:golden_shovel").get());
this.investigationTool = ItemTypeRegistryModule.getInstance().getById(BaseStorage.globalConfig.getConfig().claim.investigationTool).orElse(ItemTypeRegistryModule.getInstance().getById("minecraft:stick").get());
this.maxInspectionDistance = BaseStorage.globalConfig.getConfig().general.maxClaimInspectionDistance;
if (this.dataStore != null) {
for (World world : Bukkit.getServer().getWorlds()) {

View File

@ -32,8 +32,8 @@ public class GDTrustType implements TrustType {
private final String name;
public GDTrustType(String id, String name) {
this.id = id;
this.name = name;
this.id = id.toLowerCase();
this.name = name.toLowerCase();
}
@Override
@ -48,6 +48,6 @@ public class GDTrustType implements TrustType {
@Override
public String toString() {
return this.id + ":" + this.name;
return this.id;
}
}

View File

@ -913,8 +913,7 @@ public abstract class ClaimFlagBase extends BaseCommand {
hoverEventText = TextComponent.of("You do not have permission to change flag defaults.").color(TextColor.RED);
hasPermission = false;
}
}
if (flagType == FlagType.OVERRIDE) {
} else if (flagType == FlagType.OVERRIDE) {
flagColor = TextColor.RED;
if (!src.hasPermission(GDPermissions.MANAGE_FLAG_OVERRIDES)) {
hoverEventText = TextComponent.of("This flag has been forced by an admin and cannot be changed.").color(TextColor.RED);

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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;
@ -51,6 +52,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_SET_ACCRUED_CLAIM_BLOCKS)
public class CommandAdjustBonusClaimBlocks extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("acb|adjustclaimblocks")
@Description("Updates a player's accrued claim block total")
@Syntax("<player> <amount>")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -49,6 +50,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_DELETE_CLAIMS)
public class CommandClaimDeleteAll extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("deleteall")
@Description("Delete all of another player's claims.")
@Subcommand("delete all")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -43,6 +44,7 @@ public class CommandClaimFlag extends ClaimFlagBase {
super(ClaimSubjectType.GLOBAL);
}
@CommandCompletion("@gdflags @gdmcids @gdtristates @gdcontexts @gddummy")
@CommandAlias("cf|claimflag")
@Description("Gets/Sets claim flags in the claim you are standing in.")
@Syntax("<flag> <target> <value> [context[key=value]]")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -48,6 +49,7 @@ public class CommandClaimFlagGroup extends ClaimFlagBase {
super(ClaimSubjectType.GROUP);
}
@CommandCompletion("@gdgroups @gdflags @gdmcids @gdtristates @gdcontexts @gddummy")
@CommandAlias("cfg")
@Description("Gets/Sets flag permission for a group in claim you are standing in.")
@Syntax("<group> <flag> <target> <value> [context[key=value]]")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -48,6 +49,7 @@ public class CommandClaimFlagPlayer extends ClaimFlagBase {
super(ClaimSubjectType.PLAYER);
}
@CommandCompletion("@gdplayers @gdflags @gdmcids @gdtristates @gdcontexts @gddummy")
@CommandAlias("cfp")
@Description("Gets/Sets flag permission for a player in claim you are standing in.")
@Syntax("<player> <flag> <target> <value> [context[key=value]]")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.CommandAlias;
import co.aikar.commands.annotation.CommandCompletion;
import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Subcommand;
import co.aikar.commands.annotation.Syntax;

View File

@ -27,6 +27,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -70,6 +71,7 @@ public class CommandClaimOption extends BaseCommand {
private ClaimSubjectType subjectType = ClaimSubjectType.GLOBAL;
private String friendlySubjectName;
@CommandCompletion("@gdoptions @gddummy")
@CommandAlias("cop|claimoption")
@Description("Gets/Sets claim options in the claim you are standing in.")
@Syntax("[<option> <value> [context[key=value]]")

View File

@ -27,6 +27,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -63,6 +64,7 @@ import java.util.Set;
@CommandPermission(GDPermissions.COMMAND_CLAIM_PERMISSION_GROUP)
public class CommandClaimPermissionGroup extends BaseCommand {
@CommandCompletion("@gdgroups @gddummy")
@CommandAlias("cpg")
@Description("Sets a permission on a group with a claim context.")
@Syntax("<group> [<permission> <value>]")

View File

@ -27,6 +27,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -63,6 +64,7 @@ import java.util.Set;
@CommandPermission(GDPermissions.COMMAND_CLAIM_PERMISSION_PLAYER)
public class CommandClaimPermissionPlayer extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("cpp")
@Description("Sets a permission on a player with a claim context.")
@Syntax("<player> [<permission> <value>]")

View File

@ -2,6 +2,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -26,6 +27,7 @@ import java.util.UUID;
@CommandPermission(GDPermissions.COMMAND_TRANSFER_CLAIM)
public class CommandClaimTransfer extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("claimtransfer|transferclaim")
@Description("Transfers a basic or admin claim to another player.")
@Subcommand("claim transfer")

View File

@ -27,6 +27,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.InvalidCommandArgument;
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;
@ -67,6 +68,7 @@ import java.util.List;
@CommandPermission(GDPermissions.COMMAND_PLAYER_INFO_BASE)
public class CommandPlayerInfo extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("playerinfo")
@Description("Gets information about a player.")
@Syntax("[<player>|<player> <world>]")

View File

@ -56,7 +56,7 @@ public class CommandRestoreNature extends BaseCommand {
if (!NMSUtil.getInstance().hasItemInOneHand(player, GriefDefenderPlugin.getInstance().modificationTool)) {
TextAdapter.sendComponent(player, TextComponent.builder("")
.append("You do not have ", TextColor.RED)
.append(GriefDefenderPlugin.getInstance().modificationTool.name().toLowerCase(), TextColor.GREEN)
.append(GriefDefenderPlugin.getInstance().modificationTool.getName().toLowerCase(), TextColor.GREEN)
.append(" equipped.", TextColor.RED).build());
return;
}

View File

@ -27,6 +27,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.InvalidCommandArgument;
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.Subcommand;
@ -49,6 +50,7 @@ import org.bukkit.command.CommandSender;
@CommandPermission(GDPermissions.COMMAND_SET_ACCRUED_CLAIM_BLOCKS)
public class CommandSetAccruedClaimBlocks extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("setaccruedblocks")
@Description("Updates a player's accrued claim block total.")
@Syntax("<amount>")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -64,6 +65,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_TRUST_GROUP)
public class CommandTrustGroup extends BaseCommand {
@CommandCompletion("@gdgroups @gdtrusttypes @gddummy")
@CommandAlias("trustgroup")
@Description("Grants a group access to your claim."
+ "\nAccessor: access to interact with all blocks except inventory."

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -59,6 +60,7 @@ import java.util.Set;
@CommandPermission(GDPermissions.COMMAND_TRUSTALL_GROUP)
public class CommandTrustGroupAll extends BaseCommand {
@CommandCompletion("@gdgroups @gdtrusttypes @gddummy")
@CommandAlias("trustallgroup")
@Description("Grants a group access to all your claims."
+ "\nAccessor: access to interact with all blocks except inventory."

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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;
@ -60,6 +61,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_TRUST_PLAYER)
public class CommandTrustPlayer extends BaseCommand {
@CommandCompletion("@gdplayers @gdtrusttypes @gddummy")
@CommandAlias("trust")
@Description("Grants a player access to your claim."
+ "\nAccessor: access to interact with all blocks except inventory."

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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;
@ -62,6 +63,7 @@ import java.util.UUID;
@CommandPermission(GDPermissions.COMMAND_TRUSTALL_PLAYER)
public class CommandTrustPlayerAll extends BaseCommand {
@CommandCompletion("@gdplayers @gdtrusttypes @gddummy")
@CommandAlias("trustall")
@Description("Grants a player access to all your claims."
+ "\nAccessor: access to interact with all blocks except inventory."

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -54,6 +55,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_UNTRUST_GROUP)
public class CommandUntrustGroup extends BaseCommand {
@CommandCompletion("@gdgroups @gddummy")
@CommandAlias("untrustgroup")
@Description("Revokes group access to your claim.")
@Subcommand("untrust group")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -58,6 +59,7 @@ import java.util.Set;
@CommandPermission(GDPermissions.COMMAND_UNTRUSTALL_GROUP)
public class CommandUntrustGroupAll extends BaseCommand {
@CommandCompletion("@gdgroups @gdtrusttypes @gddummy")
@CommandAlias("untrustallgroup")
@Description("Revokes group access to all your claims")
@Syntax("<group>")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -55,6 +56,7 @@ import org.bukkit.entity.Player;
@CommandPermission(GDPermissions.COMMAND_UNTRUST_PLAYER)
public class CommandUntrustPlayer extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("untrust")
@Description("Revokes player access to your claim.")
@Syntax("<player>")

View File

@ -26,6 +26,7 @@ package com.griefdefender.command;
import co.aikar.commands.BaseCommand;
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.Subcommand;
@ -58,6 +59,7 @@ import java.util.Set;
@CommandPermission(GDPermissions.COMMAND_UNTRUSTALL_PLAYER)
public class CommandUntrustPlayerAll extends BaseCommand {
@CommandCompletion("@gdplayers @gddummy")
@CommandAlias("untrustall")
@Description("Revokes player access to all your claims.")
@Syntax("<player>")

View File

@ -78,6 +78,8 @@ import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.HumanEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.Event.Result;
@ -87,10 +89,12 @@ import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerArmorStandManipulateEvent;
import org.bukkit.event.player.PlayerBucketEmptyEvent;
import org.bukkit.event.player.PlayerBucketEvent;
import org.bukkit.event.player.PlayerBucketFillEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
@ -206,7 +210,7 @@ public class PlayerEventHandler implements Listener {
int newSlot = event.getNewSlot();
ItemStack newItemStack = player.getInventory().getItem(newSlot);
if(newItemStack != null && newItemStack.getType().equals(GriefDefenderPlugin.getInstance().modificationTool)) {
if(newItemStack != null && NMSUtil.getInstance().itemsEqual(newItemStack, GriefDefenderPlugin.getInstance().modificationTool)) {
playerData.lastShovelLocation = null;
playerData.endShovelLocation = null;
playerData.claimResizing = null;
@ -398,8 +402,8 @@ public class PlayerEventHandler implements Listener {
return;
}
if (itemInHand.getType().equals(GriefDefenderPlugin.getInstance().modificationTool) ||
itemInHand.getType().equals(GriefDefenderPlugin.getInstance().investigationTool)) {
if (NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().modificationTool) ||
NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().investigationTool)) {
if (investigateClaim(event, player, clickedBlock, itemInHand)) {
return;
}
@ -420,6 +424,66 @@ public class PlayerEventHandler implements Listener {
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerArmorStandManipulateEvent(PlayerArmorStandManipulateEvent event) {
onPlayerInteractEntity(event);
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
final Player player = event.getPlayer();
final World world = player.getWorld();
if (!GDFlags.INTERACT_ENTITY_SECONDARY || !GriefDefenderPlugin.getInstance().claimsEnabledForWorld(player.getWorld().getUID())) {
return;
}
final Entity targetEntity = event.getRightClicked();
final Location location = targetEntity.getLocation();
final ItemStack activeItem = NMSUtil.getInstance().getActiveItem(player, event);
if (activeItem != null && activeItem.getType() != Material.AIR) {
// handle item usage
if (!GDFlags.INTERACT_ITEM_SECONDARY || !GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUID())) {
return;
}
if (GriefDefenderPlugin.isTargetIdBlacklisted(Flags.INTERACT_ITEM_SECONDARY.getName(), activeItem, world.getUID())) {
return;
}
final GDClaim claim = this.dataStore.getClaimAt(location);
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, GDPermissions.INTERACT_ITEM_SECONDARY, player, activeItem, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM,
ImmutableMap.of(
"player", claim.getOwnerName(),
"item", NMSUtil.getInstance().getMaterialKey(activeItem.getType())));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
Thread.dumpStack();
event.setCancelled(true);
lastInteractItemCancelled = true;
return;
}
}
// Item permission checks passed, check entity
final Object source = activeItem != null && activeItem.getType() != Material.AIR ? activeItem : player;
if (GriefDefenderPlugin.isTargetIdBlacklisted(Flags.INTERACT_ENTITY_SECONDARY.getName(), targetEntity, player.getWorld().getUID())) {
return;
}
GDTimings.PLAYER_INTERACT_ENTITY_SECONDARY_EVENT.startTiming();
final GDClaim claim = this.dataStore.getClaimAt(location);
Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, claim, GDPermissions.INTERACT_ENTITY_SECONDARY, source, targetEntity, player, TrustTypes.ACCESSOR, true);
if (result == Tristate.TRUE && targetEntity instanceof ArmorStand) {
result = GDPermissionManager.getInstance().getFinalPermission(event, location, claim, GDPermissions.INVENTORY_OPEN, source, targetEntity, player, TrustTypes.CONTAINER, false);
}
if (result == Tristate.FALSE) {
event.setCancelled(true);
this.sendInteractEntityDenyMessage(activeItem, targetEntity, claim, player);
}
GDTimings.PLAYER_INTERACT_ENTITY_SECONDARY_EVENT.stopTiming();
}
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerBucketEmptyEvent(PlayerBucketEmptyEvent event) {
onPlayerBucketEvent(event);
@ -507,7 +571,7 @@ public class PlayerEventHandler implements Listener {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerInteractBlockSecondary(PlayerInteractEvent event) {
final Player player = event.getPlayer();
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) {
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK && event.getAction() != Action.PHYSICAL) {
onPlayerInteractBlockPrimary(event, player);
return;
}
@ -532,7 +596,7 @@ public class PlayerEventHandler implements Listener {
return;
}
if (itemInHand != null && (itemInHand.getType().equals(GriefDefenderPlugin.getInstance().modificationTool))) {
if (itemInHand != null && NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().modificationTool)) {
onPlayerHandleShovelAction(event, clickedBlock, player, itemInHand, playerData);
// avoid changing blocks after using a shovel
event.setUseInteractedBlock(Result.DENY);
@ -546,7 +610,7 @@ public class PlayerEventHandler implements Listener {
}
final GDClaim claim = this.dataStore.getClaimAt(location);
//GriefDefender.getPermissionManager().getFinalPermission(claim, Flags.ENTITY_SPAWN, source, target, user)
final TrustType trustType = NMSUtil.getInstance().isBlockContainer(clickedBlock) ? TrustTypes.CONTAINER : TrustTypes.ACCESSOR;
final TrustType trustType = NMSUtil.getInstance().isBlockContainer(clickedBlock) ? TrustTypes.CONTAINER : event.hasBlock() ? TrustTypes.BUILDER : TrustTypes.ACCESSOR;
if (GDFlags.INTERACT_BLOCK_SECONDARY && playerData != null) {
String permission = GDPermissions.INTERACT_BLOCK_SECONDARY;
if (event.getAction() == Action.PHYSICAL) {
@ -573,13 +637,13 @@ public class PlayerEventHandler implements Listener {
}
}
event.setUseInteractedBlock(Result.DENY);
event.setCancelled(true);
GDTimings.PLAYER_INTERACT_BLOCK_SECONDARY_EVENT.stopTiming();
return;
}
}
if (itemInHand != null && (itemInHand.getType() == GriefDefenderPlugin.getInstance().modificationTool)) {
if (itemInHand != null && (NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().modificationTool))) {
onPlayerHandleShovelAction(event, clickedBlock, player, itemInHand, playerData);
// avoid changing blocks after using a shovel
event.setUseInteractedBlock(Result.DENY);
@ -893,7 +957,7 @@ public class PlayerEventHandler implements Listener {
}
private void onPlayerHandleShovelAction(PlayerInteractEvent event, Block clickedBlock, Player player, ItemStack itemInHand, GDPlayerData playerData) {
if (itemInHand == null || !itemInHand.getType().equals(GriefDefenderPlugin.getInstance().modificationTool)) {
if (itemInHand == null || !NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().modificationTool)) {
return;
}
@ -1389,7 +1453,7 @@ public class PlayerEventHandler implements Listener {
}
private boolean investigateClaim(PlayerInteractEvent event, Player player, Block clickedBlock, ItemStack itemInHand) {
if (itemInHand == null || itemInHand.getType() != GriefDefenderPlugin.getInstance().investigationTool) {
if (itemInHand == null || !NMSUtil.getInstance().itemsEqual(itemInHand, GriefDefenderPlugin.getInstance().investigationTool)){
return false;
}
@ -1508,6 +1572,25 @@ public class PlayerEventHandler implements Listener {
return claim;
}
private void sendInteractEntityDenyMessage(ItemStack playerItem, Entity entity, GDClaim claim, Player player) {
if (entity instanceof Player || (claim.getData() != null && !claim.getData().allowDenyMessages())) {
return;
}
final String entityId = entity.getType().getName() == null ? entity.getType().name().toLowerCase() : entity.getType().getName();
if (playerItem == null || playerItem.getType() == Material.AIR) {
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ENTITY, ImmutableMap.of(
"player", claim.getOwnerName(),
"entity", entityId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
} else {
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_ENTITY, ImmutableMap.of(
"item", NMSUtil.getInstance().getMaterialKey(playerItem.getType()),
"entity", entityId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
}
}
private void sendInteractBlockDenyMessage(ItemStack playerItem, Block block, GDClaim claim, Player player, GDPlayerData playerData) {
if (claim.getData() != null && !claim.getData().allowDenyMessages()) {
return;

View File

@ -146,7 +146,7 @@ public class GDPermissionManager implements PermissionManager {
final Set<Context> contexts = new HashSet<>();
if (permissionHolder instanceof GDPermissionUser) {
GDPermissionUser user = (GDPermissionUser) permissionHolder;
if (user.getOnlinePlayer() != null && NMSUtil.getInstance().getActiveItem(user.getOnlinePlayer()) != null) {
if (user.getOnlinePlayer() != null && NMSUtil.getInstance().getActiveItem(user.getOnlinePlayer(), event) != null) {
contexts.add(new Context("used_item", getPermissionIdentifier(NMSUtil.getInstance().getActiveItem(user.getOnlinePlayer()))));
}
}
@ -682,7 +682,7 @@ public class GDPermissionManager implements PermissionManager {
CompletableFuture<PermissionResult> result = new CompletableFuture<>();
if (flag != Flags.COMMAND_EXECUTE && flag != Flags.COMMAND_EXECUTE_PVP) {
String[] parts = target.split(":");
if (parts.length > 1) {
if (parts.length > 1 && parts[0].equalsIgnoreCase("minecraft")) {
target = parts[1];
}
if (target != null && !GriefDefenderPlugin.ID_MAP.contains(target)) {

View File

@ -51,8 +51,10 @@ import org.apache.commons.io.FilenameUtils;
import org.bukkit.Bukkit;
import org.bukkit.OfflinePlayer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@ -143,6 +145,34 @@ public class PermissionUtil {
}
}
public List<String> getAllLoadedPlayerNames() {
List<String> subjectList = new ArrayList<>();
for (User user : this.luckPermsApi.getUserManager().getLoadedUsers()) {
final String name = user.getName();
if (name != null) {
subjectList.add(name);
}
}
if (!subjectList.contains("public")) {
subjectList.add("public");
}
return subjectList;
}
public List<String> getAllLoadedGroupNames() {
List<String> subjectList = new ArrayList<>();
for (Group group : this.luckPermsApi.getGroupManager().getLoadedGroups()) {
final String name = group.getName();
if (name != null) {
subjectList.add(name);
}
}
if (!subjectList.contains("public")) {
subjectList.add("public");
}
return subjectList;
}
public MutableContextSet getActiveContexts(GDPermissionHolder permissionHolder) {
return getActiveContexts(permissionHolder, null, null);
}

View File

@ -250,7 +250,7 @@ GriefDefender {
town-tag-clear="&aThe town tag has been cleared."
town-tax-no-claims="&cYou must own property in this town in order to be taxed."
trust-already-has="&c{target} already has {type} permission."
trust-current-claim="&aGranted &b{target} &apermission to {type} in current claim."
trust-grant="&aGranted &b{target} &apermission to {type} in current claim."
trust-individual-all-claims="&aGranted &b{player}'s&a full trust to all your claims. To unset permissions for ALL your claims, use /untrustall."
trust-invalid="&cInvalid trust type entered.\nThe allowed types are : accessor, builder, container, and manager."
trust-list-header="Explicit permissions here:"
@ -263,4 +263,4 @@ GriefDefender {
untrust-owner="&c{owner} is owner of claim and cannot be untrusted."
untrust-self="&cYou cannot untrust yourself."
}
}
}

View File

@ -3,5 +3,5 @@ main: com.griefdefender.GDBootstrap
softdepend: [WorldEdit, WorldGuard, Vault]
depend: [LuckPerms]
load: STARTUP
version: '1.0.1'
version: '1.0.2'
api-version: 1.13