Update for 1.5.10 release.

* Fix ClaimBlockTask prematurely exiting if a player had max claim blocks.
* Fix TaxApplyTask not pulling funds from claim bank first.
* Fix ClaimContextCalculator overwriting option claim contexts.
* Fix player option commands running during a command causing a loop.
* Fix player-command-enter running command from subclaim.
* Fix player-command-exit running command to subclaim.
* Fix player contexts not being added in all cases where a player is involved.
* Fix flag definitions not accepting any context.
* Fix elytra enter-claim bypass.
* Add 'claim-create-radius-limit' to global config.
* Add Simplified Chinese language support (zh_CN).
* Add enter-claim flag permission check on player login.
* Add enter/exit-claim support for player respawns. If denied, GD will respawn player back in source claim in a safe location.
* Add TE NBT id support for mods such as gregtech.
* (Hybrid) Fix mohist EntityType mod registration.
* (Hybrid/Sponge) Add TE NBT id support for mods such as gregtech. See new setting 'tile-id-nbt-map' under mod category in global.conf
* (Sponge) Add 'interact-item-force-list' to global config. Used to force interact-item flag checks when a player left/right-clicks with an item in hand.
* (Sponge) Add check to prevent re-registration of worlds.
* (Sponge) Add workaround during collisions when user is wrapped in ProjectileSource.
* (Sponge) Add EntityThrowable support for getEntityOwner.
* (Sponge) Add method to get internal DamageSource type name.
* (Sponge) Fix NPE when cancelling claim with '/claimrent cancel'
* (Sponge) Fix wrong block being checked during bucket interactions such as lava and water.
* (Sponge) Fix block-pre not handing certain mod permission checks such as AE2 cables.
* (Sponge) Fix 'block-id-convert-list' feature not using correct id during player interactions.
* (Sponge) Fix item-pickup flag not checking trust.
This commit is contained in:
bloodshot 2021-02-05 18:06:14 -05:00
parent ad31466bb1
commit e281231d87
64 changed files with 1065 additions and 800 deletions

View File

@ -104,6 +104,7 @@ sourceSets {
dependencies {
compileOnly(project(path: ":GriefDefenderAPI"))
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
compile project (':common')
compileOnly "com.griefdefender:adapter:$adapterVersion"
compileOnly "com.griefdefender:reflect-helper:1.0"
@ -118,9 +119,9 @@ dependencies {
compileOnly "net.ess3:EssentialsX:2.17.1"
compileOnly "net.milkbowl.vault:VaultAPI:1.7"
compileOnly "us.dynmap:dynmap-api:3.0-SNAPSHOT"
compileOnly "com.github.lucko:luckperms:master-SNAPSHOT"
compileOnly "com.github.slimefun:slimefun4:master-SNAPSHOT"
compileOnly "com.github.thebusybiscuit:cs-corelib:master-SNAPSHOT"
compileOnly "com.github.lucko:luckperms:v5.2"
//compileOnly "com.github.slimefun:slimefun4:master-SNAPSHOT"
//compileOnly "com.github.thebusybiscuit:cs-corelib:master-SNAPSHOT"
// Libs
compileOnly "aopalliance:aopalliance:1.0"
compileOnly "co.aikar:acf-core:0.5.0-SNAPSHOT"
@ -145,10 +146,10 @@ dependencies {
compileOnly "org.jetbrains:annotations:17.0.0"
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72"
compileOnly "org.ow2.asm:asm-debug-all:5.2"
compileOnly "org.spongepowered:configurate-core:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-gson:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-hocon:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-yaml:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-core:3.7.2"
compileOnly "org.spongepowered:configurate-gson:3.7.2"
compileOnly "org.spongepowered:configurate-hocon:3.7.2"
compileOnly "org.spongepowered:configurate-yaml:3.7.2"
compileOnly "net.kyori:event-api:3.0.0"
compileOnly "net.kyori:event-method:3.0.0"
compileOnly "net.kyori:event-method-asm:3.0.0"

View File

@ -114,6 +114,7 @@ public class GDPlayerData implements PlayerData {
public boolean townChat = false;
public boolean lockPlayerDeathDrops = false;
public boolean trappedRequest = false;
public boolean runningPlayerCommands = false;
public List<Component> chatLines = new ArrayList<>();
public Instant recordChatTimestamp;
public Instant commandInputTimestamp;

View File

@ -278,7 +278,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
boolean isAdmin = false;
final Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData();
final boolean isTaxEnabled = GriefDefenderPlugin.getActiveConfig(player.getWorld()).getConfig().economy.taxSystem;
final boolean isTaxEnabled = GriefDefenderPlugin.getGlobalConfig().getConfig().economy.taxSystem;
if (player.hasPermission(GDPermissions.DELETE_CLAIM_ADMIN)) {
isAdmin = true;
}
@ -385,7 +385,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
overrideContexts.add(claim.getOverrideClaimContext());
Map<String, OptionData> filteredContextMap = new HashMap<>();
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getTransientOptions(GriefDefenderPlugin.GD_OPTION_HOLDER).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getTransientOptions(GriefDefenderPlugin.GD_OPTION_HOLDER).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(claim.getDefaultTypeContext()) || (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT)))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
@ -422,7 +422,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
}
}
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
@ -431,11 +431,11 @@ public abstract class ClaimOptionBase extends BaseCommand {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
}
if (displayType != MenuType.DEFAULT) {
if (claim.isTown() || isAdmin) {
//if (claim.isTown() || isAdmin) {
if (contextSet.contains(claim.getContext())) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue());
}
}
//}
if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue());
}
@ -453,7 +453,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
Collections.reverse(inheritParents);
for (Claim current : inheritParents) {
GDClaim currentClaim = (GDClaim) current;
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(currentClaim.getContext())) {
inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue()));
@ -519,10 +519,10 @@ public abstract class ClaimOptionBase extends BaseCommand {
paginationList.sendTo(player, activePage);
}
private void addFilteredContexts(GDPermissionUser src, Map<String, OptionData> filteredContextMap, Set<Context> contexts, MenuType type, Map<String, String> permissions) {
private void addFilteredContexts(GDPermissionUser src, Map<String, OptionData> filteredContextMap, Set<Context> contexts, MenuType type, Map<String, List<String>> permissions) {
final Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData();
for (Map.Entry<String, String> permissionEntry : permissions.entrySet()) {
for (Map.Entry<String, List<String>> permissionEntry : permissions.entrySet()) {
final Option option = OptionRegistryModule.getInstance().getById(permissionEntry.getKey()).orElse(null);
if (option == null) {
continue;
@ -545,10 +545,21 @@ public abstract class ClaimOptionBase extends BaseCommand {
}
}
final OptionData optionData = filteredContextMap.get(permissionEntry.getKey());
String optionValue = permissionEntry.getValue().get(0);
if (option.multiValued()) {
optionValue = "";
for (String entry : permissionEntry.getValue()) {
if (optionValue.isEmpty()) {
optionValue += entry;
} else {
optionValue = optionValue + "\\|" + entry;
}
}
}
if (optionData != null) {
optionData.addContexts(option, permissionEntry.getValue(), type, contexts);
optionData.addContexts(option, optionValue, type, contexts);
} else {
filteredContextMap.put(permissionEntry.getKey(), new OptionData(option, permissionEntry.getValue(), type, contexts));
filteredContextMap.put(permissionEntry.getKey(), new OptionData(option, optionValue, type, contexts));
}
}
}

View File

@ -89,6 +89,13 @@ public class CommandClaimCreate extends BaseCommand {
return;
}
final int radiusLimit = GriefDefenderPlugin.getGlobalConfig().getConfig().claim.claimCreateRadiusLimit;
if (radius > radiusLimit) {
GriefDefenderPlugin.sendMessage(player, GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CREATE_FAILED_RESULT,
ImmutableMap.of("reason", "Radius exceeds limit of " + radiusLimit + ".")));
return;
}
final Vector3i lesserBoundary = new Vector3i(
location.getBlockX() - radius,
minClaimLevel,

View File

@ -46,6 +46,7 @@ import com.griefdefender.claim.GDClaim;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.economy.GDPaymentTransaction;
import com.griefdefender.permission.GDPermissions;
import com.griefdefender.task.TaxApplyTask;
import com.griefdefender.util.EconomyUtil;
import java.time.Instant;
@ -104,6 +105,10 @@ public class CommandClaimTax extends BaseCommand {
message = MessageCache.getInstance().TAX_NO_BALANCE;
}
GriefDefenderPlugin.sendMessage(player, message);
} else if (command.equalsIgnoreCase("force")) {
if (playerData.ignoreClaims || player.hasPermission(GDPermissions.COMMAND_CLAIM_TAX_FORCE)) {
TaxApplyTask.handleClaimTax(claim, playerData, claim.isInTown());
}
} else if (command.equalsIgnoreCase("pay")) {
final double taxBalance = claim.getEconomyData().getTaxBalance();
if (taxBalance <= 0 || amount <= 0) {

View File

@ -45,14 +45,12 @@ 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 com.griefdefender.util.PlayerUtil;
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")
@ -108,34 +106,7 @@ public class CommandTrapped extends BaseCommand {
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;
}
playerData.teleportLocation = PlayerUtil.getInstance().getSafeClaimLocation(claim);
int teleportDelay = 0;
if (GDOptions.PLAYER_TELEPORT_DELAY) {
teleportDelay = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PLAYER_TELEPORT_DELAY, claim);

View File

@ -50,6 +50,8 @@ public class ClaimCategory extends ConfigCategory {
+ "\nNote: If in economy-mode, use setting 'use-claim-block-task' under economy category."
+ "\nNote: To configure amount accrued, see 'blocks-accrued-per-hour' option at https://github.com/bloodmc/GriefDefender/wiki/Options-(Meta)#global-options")
public boolean claimBlockTask = true;
@Setting(value = "claim-create-radius-limit", comment = "The radius limit for the /claimcreate command. (Default: 256)")
public int claimCreateRadiusLimit = 256;
@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.")

View File

@ -55,8 +55,12 @@ public class ModCategory {
@Setting(value = "block-id-convert-list", comment = "Used to override generic block id's to their actual id during TE and item usage if available. Add the target block id to list if you want to force a conversion when detected."
+ "\nNote: This is useful for mods such as IC2 which uses the generic id 'ic2:te' for its multi-block.")
public List<String> blockIdConvertList = new ArrayList<>();
@Setting(value = "tile-id-nbt-map", comment = "Used to override generic tileentity id's to their actual id during TE usage. Add the target TE id as key and NBT key where ID is stored as value."
+ "\nNote: This is useful for mods such as Gregtech which uses the generic id 'gregtech:machine' for its TE and NBT key 'MetaId' to store the actual ID.")
public Map<String, String> tileIdNbtMap = new HashMap<>();
public ModCategory() {
this.blockIdConvertList.add("gregtech:machine");
this.blockIdConvertList.add("ic2:te");
this.fakePlayerIdentifiers.add("41C82C87-7AfB-4024-BA57-13D2C99CAE77"); // Forge FakePlayer
this.fakePlayerIdentifiers.add("BFC3377F-C3C9-3382-9DA6-79B50A9AFE57"); // OpenMods
@ -67,6 +71,7 @@ public class ModCategory {
this.modIdMap.put("net.minecraftforge.*", "forge");
this.modIdMap.put("openblocks.*", "openblocks");
this.modIdMap.put("openmods.*", "openmods");
this.tileIdNbtMap.put("gregtech:machine", "MetaId");
}
public boolean isFakePlayer(Player player) {
@ -98,4 +103,8 @@ public class ModCategory {
}
return null;
}
public String getNbtKey(String tileId) {
return this.tileIdNbtMap.get(tileId);
}
}

View File

@ -86,8 +86,8 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
Set<Context> flagContexts = new HashSet<>();
for (String part : parts) {
String[] split = part.split("=");
String key = split[0];
String value = split[1];
String key = split[0].toLowerCase();
String value = split[1].toLowerCase();
// Handle linked Flag
if (key.equalsIgnoreCase("flag")) {
final String flagName = value;
@ -108,11 +108,6 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
}
flagContexts.add(new Context(key, value));
break;
case "used_item":
case "item_name":
case ContextKeys.STATE:
flagContexts.add(new Context(key, value));
break;
case "server":
case "world":
case ContextKeys.CLAIM_DEFAULT:
@ -120,7 +115,8 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
// gd_claim contexts should always be set at the definition level
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.\nContext '" + key + "' can only be used for the definition.");
default:
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.");
flagContexts.add(new Context(key, value));
break;
}
}
}

View File

@ -41,6 +41,7 @@ import org.bukkit.entity.Player;
import org.bukkit.entity.Vehicle;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import com.flowpowered.math.vector.Vector3i;
@ -68,6 +69,7 @@ import com.griefdefender.command.CommandHelper;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.event.GDBorderClaimEvent;
import com.griefdefender.internal.registry.ItemTypeRegistryModule;
import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.internal.util.VecHelper;
import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser;
@ -109,11 +111,12 @@ 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)) {
return true;
}
final Player player = targetEntity instanceof Player ? (Player) targetEntity : null;
final GDPermissionUser user = player != null ? PermissionHolderCache.getInstance().getOrCreateUser(player) : null;
if (user != null) {
if (user.getOnlinePlayer() == null) {
// Most likely NPC, ignore
@ -188,6 +191,10 @@ public class CommonEntityEventHandler {
if (player != null && cancelMessage != null) {
TextAdapter.sendComponent(player, cancelMessage);
}
if (event instanceof PlayerRespawnEvent) {
((PlayerRespawnEvent) event).setRespawnLocation(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim));
}
GDTimings.ENTITY_MOVE_EVENT.stopTiming();
return false;
} else {
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
@ -232,15 +239,21 @@ public class CommonEntityEventHandler {
} else {
playerData.inTown = false;
}
if (player != null) {
if (player != null && user.getOnlinePlayer() != null) {
this.checkPlayerFlight(user, fromClaim, toClaim);
this.checkPlayerFlySpeed(user, fromClaim, toClaim);
this.checkPlayerGameMode(user, fromClaim, toClaim);
this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false);
this.runPlayerCommands(toClaim, user, true);
// Exit command - Don't run if to claim is child of from claim
if (!toClaim.isParent(fromClaim)) {
this.runPlayerCommands(fromClaim, user, false);
}
// Enter command - Don't run if to claim is parent of from claim
if (!fromClaim.isParent(toClaim)) {
this.runPlayerCommands(toClaim, user, true);
}
}
}
@ -291,6 +304,9 @@ public class CommonEntityEventHandler {
if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (event instanceof PlayerRespawnEvent) {
((PlayerRespawnEvent) event).setRespawnLocation(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim));
}
GDTimings.ENTITY_MOVE_EVENT.stopTiming();
return false;
}
@ -340,15 +356,21 @@ public class CommonEntityEventHandler {
playerData.inTown = false;
}
if (player != null) {
if (player != null && user.getOnlinePlayer() != null) {
this.checkPlayerFlight(user, fromClaim, toClaim);
this.checkPlayerFlySpeed(user, fromClaim, toClaim);
this.checkPlayerGameMode(user, fromClaim, toClaim);
this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false);
this.runPlayerCommands(toClaim, user, true);
// Exit command - Don't run if to claim is child of from claim
if (!toClaim.isParent(fromClaim)) {
this.runPlayerCommands(fromClaim, user, false);
}
// Enter command - Don't run if to claim is parent of from claim
if (!fromClaim.isParent(toClaim)) {
this.runPlayerCommands(toClaim, user, true);
}
}
}
}
@ -371,7 +393,11 @@ public class CommonEntityEventHandler {
if (!GDOptions.PLAYER_COMMAND_ENTER && !GDOptions.PLAYER_COMMAND_EXIT) {
return;
}
if (user.getInternalPlayerData().runningPlayerCommands) {
return;
}
user.getInternalPlayerData().runningPlayerCommands = true;
List<String> rawCommandList = new ArrayList<>();
Set<Context> contexts = new HashSet<>();
if (player.getUniqueId().equals(claim.getOwnerUniqueId())) {
@ -404,6 +430,7 @@ public class CommonEntityEventHandler {
if (rawCommandList != null) {
runCommand(claim, player, rawCommandList, false);
}
user.getInternalPlayerData().runningPlayerCommands = false;
}
private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) {
@ -418,6 +445,10 @@ public class CommonEntityEventHandler {
String args = command.replace(baseCommand + " ", "");
baseCommand = baseCommand.replace("\\", "").replace("/", "");
args = args.replace("%player%", player.getName());
// Handle WorldEdit commands
if (command.startsWith("//") && !baseCommand.startsWith("/")) {
baseCommand = "/" + baseCommand;
}
if (runAsConsole) {
CommandHelper.executeCommand(Bukkit.getConsoleSender(), baseCommand, args);
} else {
@ -504,7 +535,7 @@ public class CommonEntityEventHandler {
return;
}
final Player player = user.getOnlinePlayer();
if (player == null || !player.isInvulnerable()) {
if (player == null || !NMSUtil.getInstance().isInvulnerable(player)) {
// Most likely Citizens NPC
return;
}

View File

@ -217,6 +217,9 @@ public class PlayerEventHandler implements Listener {
if (claim.isInTown()) {
playerData.inTown = true;
}
if (GDFlags.ENTER_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, player.getLocation(), claim, Flags.ENTER_CLAIM, player, player, player, true) == Tristate.FALSE) {
player.teleport(PlayerUtil.getInstance().getSafeClaimLocation(claim));
}
GDTimings.PLAYER_JOIN_EVENT.stopTiming();
}
@ -258,6 +261,14 @@ public class PlayerEventHandler implements Listener {
final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
playerData.lastPvpTimestamp = null;
if (playerData.ignoreClaims || player.hasPermission(GDPermissions.COMMAND_DELETE_ADMIN_CLAIMS)) {
return;
}
final Location sourceLocation = player.getLocation();
final Location destination = event.getRespawnLocation();
// Handle BorderClaimEvent
CommonEntityEventHandler.getInstance().onEntityMove(event, sourceLocation, destination, player);
}
@EventHandler(priority = EventPriority.LOWEST)

View File

@ -206,10 +206,18 @@ public class GDPermissionManager implements PermissionManager {
if (source instanceof Player && flag != Flags.COLLIDE_BLOCK && flag != Flags.COLLIDE_ENTITY) {
this.addPlayerContexts((Player) source, contexts, flag);
}
if (!(source instanceof Player) && target instanceof Player && user != null && user.getOnlinePlayer() != null && !user.getUniqueId().equals(((Player) target).getUniqueId())) {
// add source player context
// this allows users to block all pvp actions when direct source isn't a player
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer())));
if (!(source instanceof Player) && user != null && user.getOnlinePlayer() != null) {
boolean addPlayerContext = false;
if (!(target instanceof Player)) {
addPlayerContext = true;
} else if (!user.getUniqueId().equals(((Player) target).getUniqueId())) {
addPlayerContext = true;
}
if (addPlayerContext) {
// add source player context
// this allows users to block all pvp actions when direct source isn't a player
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer())));
}
}
if (source instanceof Block && event instanceof EntityChangeBlockEvent && flag == Flags.BLOCK_MODIFY) {
final EntityChangeBlockEvent entityChangeBlockEvent = (EntityChangeBlockEvent) event;
@ -727,7 +735,7 @@ public class GDPermissionManager implements PermissionManager {
}
String id = BlockTypeRegistryModule.getInstance().getNMSKey(block);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(block);
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(block.getLocation());
if (tileType != null) {
id = tileType.getId();
}
@ -752,7 +760,7 @@ public class GDPermissionManager implements PermissionManager {
}
String id = BlockTypeRegistryModule.getInstance().getNMSKey(blockstate);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(block);
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(block.getLocation());
if (tileType != null) {
id = tileType.getId();
}
@ -851,9 +859,15 @@ public class GDPermissionManager implements PermissionManager {
String id = ItemTypeRegistryModule.getInstance().getNMSKey(itemstack);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final String itemName = NMSUtil.getInstance().getItemName(itemstack);
final String itemName = NMSUtil.getInstance().getItemName(itemstack, id);
if (itemName != null) {
id = itemName;
if (!itemName.contains(":")) {
final int index = id.indexOf(":");
final String modId = id.substring(0, index);
id = modId + ":" + itemName;
} else {
id = itemName;
}
}
}
if (this.isObjectIdBanned(claim, id, BanType.ITEM)) {

View File

@ -160,6 +160,7 @@ public class GDPermissions {
public static final String COMMAND_CLAIM_PERMISSION_PLAYER = "griefdefender.admin.claim.command.permission-player";
public static final String COMMAND_CLAIM_RESERVE = "griefdefender.admin.claim.command.reserve-name";
public static final String COMMAND_CLAIM_SCHEMATIC = "griefdefender.admin.claim.command.schematic";
public static final String COMMAND_CLAIM_TAX_FORCE = "griefdefender.admin.claim.command.claim.tax.force";
public static final String COMMAND_IGNORE_CLAIMS = "griefdefender.admin.claim.command.ignore.base";
public static final String COMMAND_DELETE_CLAIM_BASE = "griefdefender.admin.claim.command.delete.base";
public static final String COMMAND_DELETE_CLAIMS = "griefdefender.admin.claim.command.delete-claims";

View File

@ -387,8 +387,8 @@ public class LuckPermsProvider implements PermissionProvider {
}
}
}
Map<Set<Context>, Map<String, String>> optionMap = this.getPermanentOptions(holder);
for (Entry<Set<Context>, Map<String, String>> mapEntry : optionMap.entrySet()) {
Map<Set<Context>, Map<String, List<String>>> optionMap = this.getPermanentOptions(holder);
for (Entry<Set<Context>, Map<String, List<String>>> mapEntry : optionMap.entrySet()) {
for (Context context : mapEntry.getKey()) {
if (context.getKey().equalsIgnoreCase("gd_claim") && context.getValue().equalsIgnoreCase(claimUniqueId.toString())) {
this.clearPermissions(holder, mapEntry.getKey());
@ -440,7 +440,7 @@ public class LuckPermsProvider implements PermissionProvider {
return cachedData.getPermissionMap();
}
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
ImmutableContextSet set = this.getLPContexts(contexts).immutableCopy();
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
@ -450,9 +450,9 @@ public class LuckPermsProvider implements PermissionProvider {
final QueryOptions query = QueryOptions.builder(QueryMode.CONTEXTUAL).option(DataQueryOrderFunction.KEY, DEFAULT_DATA_QUERY_ORDER).context(set).build();
CachedMetaData cachedData = permissionHolder.getCachedData().getMetaData(query);
// TODO
Map<String, String> metaMap = new HashMap<>();
Map<String, List<String>> metaMap = new HashMap<>();
for (Map.Entry<String, List<String>> mapEntry : cachedData.getMeta().entrySet()) {
metaMap.put(mapEntry.getKey(), mapEntry.getValue().get(0));
metaMap.put(mapEntry.getKey(), mapEntry.getValue());
}
return metaMap;
}
@ -543,14 +543,14 @@ public class LuckPermsProvider implements PermissionProvider {
return transientPermissionMap;
}
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.data().toCollection();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<Set<Context>, Map<String, List<String>>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, List<String>>>(CONTEXT_COMPARATOR);
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
@ -558,26 +558,35 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts());
Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
Map<String, List<String>> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) {
metaEntry = new HashMap<>();
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
final List<String> values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
permanentPermissionMap.put(contexts, metaEntry);
} else {
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
List<String> values = metaEntry.get(metaNode.getMetaKey());
if (values == null) {
values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
} else {
values.add(metaNode.getMetaValue());
}
}
}
return permanentPermissionMap;
}
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.transientData().toCollection();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<Set<Context>, Map<String, List<String>>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, List<String>>>(CONTEXT_COMPARATOR);
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
@ -585,64 +594,27 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts());
Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
Map<String, List<String>> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) {
metaEntry = new HashMap<>();
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
final List<String> values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
permanentPermissionMap.put(contexts, metaEntry);
} else {
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
List<String> values = metaEntry.get(metaNode.getMetaKey());
if (values == null) {
values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
} else {
values.add(metaNode.getMetaValue());
}
}
}
return permanentPermissionMap;
}
public Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.data().toCollection();
final Map<String, String> options = new HashMap<>();
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
}
final MetaNode metaNode = (MetaNode) node;
if (contexts == null) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
} else if (getGPContexts(node.getContexts()).containsAll(contexts)) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
}
}
return options;
}
public Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.transientData().toCollection();
final Map<String, String> options = new HashMap<>();
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
}
final MetaNode metaNode = (MetaNode) node;
if (contexts == null) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
} else if (getGPContexts(node.getContexts()).containsAll(contexts)) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
}
}
return options;
}
public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {

View File

@ -138,21 +138,24 @@ public interface PermissionProvider {
* Clears all permissions that contain {@link Context}
* from passed holder.
*
* @param claim The claim
* @param holder The holder
* @param context The context
*/
void clearPermissions(GDPermissionHolder holder, Context context);
/**
* Clears all permissions that contain {@link Context}'s
* from passed player.
* from passed holder.
*
* @param claim The claim
* @param holder The holder
* @param contexts The contexts
*/
void clearPermissions(GDPermissionHolder holder, Set<Context> contexts);
/**
* Checks if holder has permission.
*
* @param holder The holder
* @param permission The permission
* @return whether the holder has permission
*/
@ -174,7 +177,7 @@ public interface PermissionProvider {
* @param contexts The contexts required
* @return An immutable map of cached options or empty if none.
*/
Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts);
Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts);
/**
* Gets all persisted permissions.
@ -205,7 +208,7 @@ public interface PermissionProvider {
* @param holder The holder
* @return An immutable map of persisted options or empty if none.
*/
Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder);
Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder);
/**
* Gets all transient options with associated contexts of holder.
@ -213,23 +216,7 @@ public interface PermissionProvider {
* @param holder The holder
* @return An immutable map of transient options or empty if none.
*/
Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder);
/**
* Gets all persisted options and associated values of holder.
*
* @param holder The holder
* @return An immutable map of persisted options or empty if none.
*/
Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts);
/**
* Gets all transient options and associated values of holder.
*
* @param holder The holder
* @return An immutable map of transient options or empty if none.
*/
Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts);
Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder);
/**
* Gets all persisted permissions, including inherited nodes, with associated contexts of holder.

View File

@ -346,8 +346,9 @@ public class PermissionsExProvider implements PermissionProvider {
}
@Override
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
return holderToPEXSubject(holder).getOptions(contextsGDToPEX(contexts));
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
//return holderToPEXSubject(holder).getOptions(contextsGDToPEX(contexts));
return new HashMap<>();
}
@Override
@ -367,23 +368,15 @@ public class PermissionsExProvider implements PermissionProvider {
}
@Override
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) {
return tKeys(holderToPEXSubject(holder).data().get().getAllOptions());
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
//return tKeys(holderToPEXSubject(holder).data().get().getAllOptions());
return new HashMap<>();
}
@Override
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) {
return tKeys(holderToPEXSubject(holder).transientData().get().getAllOptions());
}
@Override
public Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts) {
return holderToPEXSubject(holder).data().get().getOptions(contextsGDToPEX(contexts));
}
@Override
public Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts) {
return holderToPEXSubject(holder).transientData().get().getOptions(contextsGDToPEX(contexts));
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
//return tKeys(holderToPEXSubject(holder).transientData().get().getAllOptions());
return new HashMap<>();
}
@Override

View File

@ -431,8 +431,8 @@ public abstract class BaseStorage {
}
private void setDefaultOptions(Set<Context> contexts, Map<String, String> defaultOptions) {
final Map<Set<Context>, Map<String, String>> permanentOptions = PermissionUtil.getInstance().getPermanentOptions(GriefDefenderPlugin.DEFAULT_HOLDER);
final Map<String, String> options = permanentOptions.get(contexts);
final Map<Set<Context>, Map<String, List<String>>> permanentOptions = PermissionUtil.getInstance().getPermanentOptions(GriefDefenderPlugin.DEFAULT_HOLDER);
final Map<String, List<String>> options = permanentOptions.get(contexts);
GriefDefenderPlugin.getInstance().executor.execute(() -> {
for (Map.Entry<String, String> optionEntry : defaultOptions.entrySet()) {
final Option option = OptionRegistryModule.getInstance().getById(optionEntry.getKey()).orElse(null);
@ -446,7 +446,7 @@ public abstract class BaseStorage {
// Transient options are checked first so we must ignore setting if a persisted option exists
boolean foundPersisted = false;
if (options != null) {
for (Entry<String, String> mapEntry : options.entrySet()) {
for (Entry<String, List<String>> mapEntry : options.entrySet()) {
if (mapEntry.getKey().equalsIgnoreCase(option.getPermission())) {
foundPersisted = true;
break;

View File

@ -109,6 +109,10 @@ public class FileStorage extends BaseStorage {
}
public void registerWorld(World world) {
if (this.claimWorldManagers.get(world.getUID()) != null) {
return;
}
Environment dimType = world.getEnvironment();
final String worldName = world.getName().toLowerCase();
final String dimName = dimType.name().toLowerCase();

View File

@ -79,7 +79,7 @@ public class ClaimBlockTask extends BukkitRunnable {
if ((currentTotal + accruedBlocks) > playerData.getMaxAccruedClaimBlocks()) {
playerData.setAccruedClaimBlocks(playerData.getMaxAccruedClaimBlocks());
playerData.lastAfkCheckLocation = player.getLocation();
return;
continue;
}
playerData.setAccruedClaimBlocks(playerData.getAccruedClaimBlocks() + accruedBlocks);

View File

@ -36,9 +36,7 @@ import com.griefdefender.api.permission.option.Options;
import com.griefdefender.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager;
import com.griefdefender.configuration.GriefDefenderConfig;
import com.griefdefender.economy.GDPaymentTransaction;
import com.griefdefender.event.GDCauseStackManager;
import com.griefdefender.event.GDTaxClaimEvent;
import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser;
@ -61,10 +59,10 @@ import java.util.UUID;
public class TaxApplyTask extends BukkitRunnable {
Economy economy;
private static Economy economy;
public TaxApplyTask() {
this.economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
int taxHour = GriefDefenderPlugin.getGlobalConfig().getConfig().economy.taxApplyHour;
long delay = TaskUtil.computeDelay(taxHour, 0, 0);
this.runTaskTimer(GDBootstrap.getInstance(), delay, 1728000L);
@ -73,8 +71,8 @@ public class TaxApplyTask extends BukkitRunnable {
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public void run() {
if (this.economy == null) {
this.economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
if (economy == null) {
economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
}
for (World world : Bukkit.getWorlds()) {
if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUID())) {
@ -123,7 +121,7 @@ public class TaxApplyTask extends BukkitRunnable {
}
}
private void handleClaimTax(GDClaim claim, GDPlayerData playerData, boolean inTown) {
public static void handleClaimTax(GDClaim claim, GDPlayerData playerData, boolean inTown) {
final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(playerData.getUniqueId());
final OfflinePlayer player = user.getOfflinePlayer();
double taxRate = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Double.class), user, Options.TAX_RATE, claim);
@ -136,7 +134,7 @@ public class TaxApplyTask extends BukkitRunnable {
final double taxBalance = claim.getEconomyData().getTaxBalance();
taxRate = event.getTaxRate();
taxOwed = taxBalance + (claim.getClaimBlocks() * taxRate);
final EconomyResponse response = EconomyUtil.getInstance().withdrawFunds(player, taxOwed);
final EconomyResponse response = EconomyUtil.getInstance().withdrawTax(claim, player, taxOwed);
if (!response.transactionSuccess()) {
final Instant localNow = Instant.now();
Instant taxPastDueDate = claim.getEconomyData().getTaxPastDueDate();
@ -170,7 +168,7 @@ public class TaxApplyTask extends BukkitRunnable {
.getEconomyData()
.addPaymentTransaction(new GDPaymentTransaction(TransactionType.TAX, TransactionResultType.SUCCESS, Instant.now(), taxOwed));
if (town.getEconomyAccountId().isPresent()) {
this.economy.bankDeposit(town.getEconomyAccountId().get().toString(), taxOwed);
economy.bankDeposit(town.getEconomyAccountId().get().toString(), taxOwed);
}
}
claim.getData().save();

View File

@ -104,6 +104,31 @@ public class EconomyUtil {
instance = new EconomyUtil();
}
public EconomyResponse withdrawTax(GDClaim claim, OfflinePlayer player, double taxOwed) {
if (GriefDefenderPlugin.getGlobalConfig().getConfig().economy.bankSystem) {
final EconomyResponse balanceResponse = this.vaultProvider.getApi().bankBalance(claim.getUniqueId().toString());
if (balanceResponse.transactionSuccess() && balanceResponse.balance > 0) {
EconomyResponse withdrawResponse = null;
if (taxOwed == balanceResponse.balance || balanceResponse.balance > taxOwed) {
withdrawResponse = this.vaultProvider.getApi().bankWithdraw(claim.getUniqueId().toString(), taxOwed);
if (withdrawResponse.transactionSuccess()) {
claim.getData().getEconomyData().addPaymentTransaction(
new GDPaymentTransaction(TransactionType.BANK_WITHDRAW, TransactionResultType.SUCCESS, player.getUniqueId(), Instant.now(), taxOwed));
return withdrawResponse;
}
} else {
withdrawResponse = this.vaultProvider.getApi().bankWithdraw(claim.getUniqueId().toString(), balanceResponse.balance);
if (withdrawResponse.transactionSuccess()) {
taxOwed -= balanceResponse.balance;
claim.getData().getEconomyData().addPaymentTransaction(
new GDPaymentTransaction(TransactionType.BANK_WITHDRAW, TransactionResultType.SUCCESS, player.getUniqueId(), Instant.now(), balanceResponse.balance));
}
}
}
}
return this.withdrawFunds(player, taxOwed);
}
public EconomyResponse withdrawFunds(OfflinePlayer player, double funds) {
final Double balance = this.vaultProvider.getApi().getBalance(player);
if (funds < 0) {

View File

@ -98,7 +98,7 @@ public class PermissionUtil {
}
public void addActiveContexts(Set<Context> contexts, GDPermissionHolder permissionHolder, GDPlayerData playerData, Claim claim) {
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, null, null);
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, playerData, claim);
}
public boolean containsDefaultContext(Set<Context> contexts) {
@ -145,7 +145,7 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getPermissions(holder, contexts);
}
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getOptions(holder, contexts);
}
@ -161,22 +161,14 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getTransientPermissions(holder);
}
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getPermanentOptions(holder);
}
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getTransientOptions(holder);
}
public Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getPermanentOptions(holder, contexts);
}
public Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getTransientOptions(holder, contexts);
}
public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getAllPermissions(holder);
}

View File

@ -75,6 +75,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import org.checkerframework.checker.nullness.qual.Nullable;
@ -373,4 +374,34 @@ public class PlayerUtil {
return claim;
}
public Location getSafeClaimLocation(GDClaim claim) {
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) {
return safeLocation;
}
// If no safe location was found, fall back to corner
return claimCorner;
}
}

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.12.2",
"sha1": "a2dc91c2f88c19743fd0ae0a56fd5a66807be23b",
"path": "com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20210101.002548-59.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20210101.002548-59.jar"
"sha1": "9350289c71b1bf1e285dc15a3b4f2009023db3ae",
"path": "com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20210111.053602-65.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20210111.053602-65.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -42,21 +42,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -146,32 +146,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.13.2",
"sha1": "909b2226df074a8a557eff3807527704dfcc7c1a",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20210101.002246-57.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20210101.002246-57.jar"
"sha1": "854b3e6b5d94b5d4b9f0392858123041c860f836",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20210111.053702-60.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20210111.053702-60.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.2",
"sha1": "d23791e720f7f225c469d10cbde04ea972f8f725",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20210101.004044-57.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20210101.004044-57.jar"
"sha1": "6f638a64099128bae726b0a644f49338399bd958",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20210111.053844-59.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20210111.053844-59.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.3",
"sha1": "b583a2b1478f6cceddd73f7537c567dddef88269",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20210101.001718-59.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20210101.001718-59.jar"
"sha1": "1bf95706a45fce471714ef8733816f648243837f",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20210111.054136-60.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20210111.054136-60.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.4",
"sha1": "f198c2d3284df26b37f8bebde06c52c25adc497f",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20210101.001540-57.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20210101.001540-57.jar"
"sha1": "1744b2962c74912b6c0745d75550ca374a2c0d81",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20210111.054342-58.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20210111.054342-58.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.15.2",
"sha1": "4130d6349f5d666bca4bb7663debb3ee0facbfaa",
"path": "com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20210101.001123-40.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20210101.001123-40.jar"
"sha1": "77a4e2d849d26c2b4c888f35f5b2b9d1de17b1ec",
"path": "com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20210111.054736-41.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20210111.054736-41.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.15",
"sha1": "278cacea6b2e11f208085e95bc3e5cae23cb47e6",
"path": "com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20210101.001354-40.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20210101.001354-40.jar"
"sha1": "b35127c49c436ad710313369bc35c91977b647a4",
"path": "com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20210111.054552-41.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20210111.054552-41.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.16.1",
"sha1": "35ca9f23b6258d4d519657c38a33861734312cba",
"path": "com/griefdefender/adapter/1.16.1-SNAPSHOT/adapter-1.16.1-20210101.000900-21.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.1-SNAPSHOT/adapter-1.16.1-20210101.000900-21.jar"
"sha1": "3d638213ae52c0a55749d8e0764afab33e53e8f4",
"path": "com/griefdefender/adapter/1.16.1-SNAPSHOT/adapter-1.16.1-20210111.055030-22.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.1-SNAPSHOT/adapter-1.16.1-20210111.055030-22.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.16.2",
"sha1": "2120729220d0a9d834398759a8bd5b85aaae0908",
"path": "com/griefdefender/adapter/1.16.2-SNAPSHOT/adapter-1.16.2-20210101.000516-14.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.2-SNAPSHOT/adapter-1.16.2-20210101.000516-14.jar"
"sha1": "9c7386be3b14d87500375005b68d4a7c1d947afb",
"path": "com/griefdefender/adapter/1.16.2-SNAPSHOT/adapter-1.16.2-20210111.055250-15.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.2-SNAPSHOT/adapter-1.16.2-20210111.055250-15.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.16.4",
"sha1": "839c9998f0baf77155a7adf3a693117649253b8d",
"path": "com/griefdefender/adapter/1.16.4-SNAPSHOT/adapter-1.16.4-20210101.000151-15.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.4-SNAPSHOT/adapter-1.16.4-20210101.000151-15.jar"
"sha1": "0b477824841be8d813b591b9ab46cb40f78ce4db",
"path": "com/griefdefender/adapter/1.16.4-SNAPSHOT/adapter-1.16.4-20210111.055442-16.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.16.4-SNAPSHOT/adapter-1.16.4-20210111.055442-16.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -152,32 +152,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.8.8",
"sha1": "f26ea115bb8b504e4ec448a16008f1ec46d0f1d3",
"path": "com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20210101.002757-57.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20210101.002757-57.jar"
"sha1": "027d23621f322901c6a2e0ed9876f5e03f22505f",
"path": "com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20210111.053523-62.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20210111.053523-62.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -42,21 +42,21 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar"
"sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20200925.132015-173.jar"
},
{
"name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar"
"sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20200925.132021-168.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -146,32 +146,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",

View File

@ -3,5 +3,6 @@ main: com.griefdefender.GDBootstrap
softdepend: [dynmap, PlaceholderAPI, WorldEdit, WorldGuard, Vault]
depend: [LuckPerms]
load: STARTUP
version: '1.5.9'
loadafter: [EliteEnchantments]
version: '1.5.10'
api-version: 1.13

View File

@ -72,11 +72,11 @@ GriefDefender {
trapped="Teleportuje w bezpieczne miejsce w przypadku utknięcia."
trust-access="Pozwala graczowi na interakcje z działką poza schowkami i ekwipunkiem."
trust-container="Pozwala graczowi na interakcje z działką, w tym ze schowkami i ekwipunkiem."
trust-group="Zezwala grupie na dostęp do działki.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Pojemnik): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-group-all="Zezwala grupie na dostęp do WSZYSTKICH działek.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Pojemnik): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-group="Zezwala grupie na dostęp do działki.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Magazynier): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-group-all="Zezwala grupie na dostęp do WSZYSTKICH działek.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Magazynier): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-list="Zarządzanie zaufanymi osobami dla działki, na której stoisz."
trust-player="Zezwala graczowi na dostęp do działki.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Pojemnik): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-player-all="Zezwala graczowi na dostęp do WSZYSTKICH działek.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Pojemnik): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-player="Zezwala graczowi na dostęp do działki.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Magazynier): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
trust-player-all="Zezwala graczowi na dostęp do WSZYSTKICH działek.\nAccessor (Gość): Interakcje z blokami bez dostępu do pojemników.\nContainer (Magazynier): Dodatkowy dostęp do skrzyń i innych pojemników.\nBuilder (Budowniczy): Możliwość stawiania i niszczenia bloków.\nManager (Manager): Dodatkowa możliwość zmiany ustawień działki."
untrust-group="Usuwa grupę z listy dostępu do działki."
untrust-group-all="Usuwa grupę z list dostępu do wszystkich działek."
untrust-player="Usuwa gracza z listy dostępu do działki."
@ -515,7 +515,7 @@ GriefDefender {
flag-ui-override-no-permission="Ta flaga została nadpisana przez administratora i &n&cNIE MOŻE&f być zmieniona."
flag-ui-override-permission="&fFlaga &r{flag}&f jest obecnie &cnadpisana&f przez administratora.\nKliknij aby usunąć."
flag-ui-return-flags="Powrót do flag"
label-accessors=Goście
label-accessors=Gość
label-all=Wszystko
label-area=Obszar
label-available=Dostępne
@ -527,7 +527,7 @@ GriefDefender {
label-children=dziedziczące
label-claim=Działka
label-confirm=Potwierdź
label-containers=Pojemniki
label-containers=Magazynier
label-context=Kontekst
label-created=Stworzone
label-day=Dzień
@ -804,7 +804,7 @@ GriefDefender {
title-builder=BUDOWNICZY
title-buy=KUP
title-claim=DZIAŁKA
title-container=POJEMNIK
title-container=MAGAZYNIER
title-default=DOMYŚLNE
title-group=GROUP
title-inherit=DZIEDZICZENIE
@ -828,7 +828,7 @@ GriefDefender {
trust-click-show-list="Kliknij aby wyświetlić zaufanych graczy i grupy."
trust-grant="&6{target} &aotrzymuje permisję {type}&a na obecnej działce."
trust-individual-all-claims="&6{player}&a ma teraz pełny dostęp do wszystkich Twoich działek. Aby wycofać te permisje na WSZYSTKICH działkach, użyj komendy &f/untrustall&a."
trust-invalid="&cNiewłaściwy typ 'trust'.\nDostępne typy to : accessor (Gość), builder (Budowniczy), container (Pojemnik), and manager (Manager)."
trust-invalid="&cNiewłaściwy typ 'trust'.\nDostępne typy to : accessor (Gość), builder (Budowniczy), container (Magazynier), oraz manager (Manager)."
trust-list-header="Sprecyzowane permisje są tu:"
trust-no-claims="&cNie masz działek, żeby nadać permisje."
trust-plugin-cancel="&cNie można nadać praw {target}&c. Plugin odmówił."

View File

@ -854,4 +854,4 @@ GriefDefender {
untrust-self="&c您不能移除自己的信任权限。"
visual-update-in-progress="&a更新领地选区可视化效果。还需等待 &6{count}&a 个方块的效果渲染。请稍作等待。"
}
}
}

View File

@ -2,14 +2,14 @@
name=GriefDefender
group=com.griefdefender
url=https://github.com/bloodmc/GriefDefender
version=1.5.9
version=1.5.10
apiVersion=1.0.0-20201225.034857-27
# Bukkit
adapterVersion=1.16.4-20210101.000151-15
adapterVersion=1.16.4-20210111.055442-16
spigotVersion=1.16.4-R0.1-SNAPSHOT
# Sponge
adapterSpongeVersion=1.12.2-20210101.010513-16
commonVersion=1.12.2-7.1.7-SNAPSHOT
adapterSpongeVersion=1.12.2-20210115.020835-20
commonVersion=1.12.2-7.3.0
minecraftVersion=1.12.2
mcpMappings=snapshot_20180808

View File

@ -115,11 +115,12 @@ sourceSets {
dependencies {
compileOnly(project(path: ":GriefDefenderAPI"))
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
compile project (':common')
compileOnly "com.griefdefender:adapter-sponge:$adapterSpongeVersion"
compileOnly "com.griefdefender:reflect-helper:1.0"
// Sponge
apiCompile "org.spongepowered:spongeapi:$apiVersion"
//apiCompile "org.spongepowered:spongeapi:$apiVersion"
compileOnly ("org.spongepowered:spongecommon:$commonVersion:dev") {
exclude module: 'testplugins'
@ -128,10 +129,10 @@ dependencies {
compileOnly ("io.github.nucleuspowered:nucleus-api:1.14.1-S7.1"){
exclude module: 'spongeapi'
}
compile "com.github.rojo8399:PlaceholderAPI:4.5.1"
compile "com.github.bloodmc:mcclans-api:develop-SNAPSHOT"
//compile "com.github.randombyte-developer:PlaceholderAPI:4.5.1"
//compile "com.github.bloodmc:mcclans-api:develop-SNAPSHOT"
compileOnly "com.sk89q.worldedit:worldedit-core:6.1.4-SNAPSHOT"
compileOnly "com.github.lucko:luckperms:master-SNAPSHOT"
compileOnly "com.github.lucko:luckperms:v5.2"
compileOnly "us.dynmap:dynmap-api:3.0-SNAPSHOT"
// required for bootstrap
@ -156,10 +157,10 @@ dependencies {
compileOnly "org.jetbrains:annotations:17.0.0"
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72"
compileOnly "org.ow2.asm:asm-debug-all:5.2"
compileOnly "org.spongepowered:configurate-core:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-gson:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-hocon:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-yaml:3.7-SNAPSHOT"
compileOnly "org.spongepowered:configurate-core:3.7.2"
compileOnly "org.spongepowered:configurate-gson:3.7.2"
compileOnly "org.spongepowered:configurate-hocon:3.7.2"
compileOnly "org.spongepowered:configurate-yaml:3.7.2"
compileOnly "net.kyori:event-api:3.0.0"
compileOnly "net.kyori:event-method:3.0.0"
compileOnly "net.kyori:event-method-asm:3.0.0"

View File

@ -116,6 +116,7 @@ public class GDPlayerData implements PlayerData {
public boolean townChat = false;
public boolean lockPlayerDeathDrops = false;
public boolean trappedRequest = false;
public boolean runningPlayerCommands = false;
public List<Component> chatLines = new ArrayList<>();
public Instant recordChatTimestamp;
public Instant commandInputTimestamp;

View File

@ -384,7 +384,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
overrideContexts.add(claim.getOverrideClaimContext());
Map<String, OptionData> filteredContextMap = new HashMap<>();
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getTransientOptions(GriefDefenderPlugin.GD_OPTION_HOLDER).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getTransientOptions(GriefDefenderPlugin.GD_OPTION_HOLDER).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(claim.getDefaultTypeContext()) || (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT)))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
@ -421,7 +421,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
}
}
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
@ -430,11 +430,11 @@ public abstract class ClaimOptionBase extends BaseCommand {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
}
if (displayType != MenuType.DEFAULT) {
if (claim.isTown() || isAdmin) {
//if (claim.isTown() || isAdmin) {
if (contextSet.contains(claim.getContext())) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue());
}
}
//}
if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue());
}
@ -452,7 +452,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
Collections.reverse(inheritParents);
for (Claim current : inheritParents) {
GDClaim currentClaim = (GDClaim) current;
for (Map.Entry<Set<Context>, Map<String, String>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
for (Map.Entry<Set<Context>, Map<String, List<String>>> mapEntry : PermissionUtil.getInstance().getPermanentOptions(this.subject).entrySet()) {
final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(currentClaim.getContext())) {
inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue()));
@ -518,10 +518,10 @@ public abstract class ClaimOptionBase extends BaseCommand {
paginationList.sendTo(player, activePage);
}
private void addFilteredContexts(GDPermissionUser src, Map<String, OptionData> filteredContextMap, Set<Context> contexts, MenuType type, Map<String, String> permissions) {
private void addFilteredContexts(GDPermissionUser src, Map<String, OptionData> filteredContextMap, Set<Context> contexts, MenuType type, Map<String, List<String>> permissions) {
final Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData();
for (Map.Entry<String, String> permissionEntry : permissions.entrySet()) {
for (Map.Entry<String, List<String>> permissionEntry : permissions.entrySet()) {
final Option option = OptionRegistryModule.getInstance().getById(permissionEntry.getKey()).orElse(null);
if (option == null) {
continue;
@ -544,10 +544,21 @@ public abstract class ClaimOptionBase extends BaseCommand {
}
}
final OptionData optionData = filteredContextMap.get(permissionEntry.getKey());
String optionValue = permissionEntry.getValue().get(0);
if (option.multiValued()) {
optionValue = "";
for (String entry : permissionEntry.getValue()) {
if (optionValue.isEmpty()) {
optionValue += entry;
} else {
optionValue = optionValue + "\\|" + entry;
}
}
}
if (optionData != null) {
optionData.addContexts(option, permissionEntry.getValue(), type, contexts);
optionData.addContexts(option, optionValue, type, contexts);
} else {
filteredContextMap.put(permissionEntry.getKey(), new OptionData(option, permissionEntry.getValue(), type, contexts));
filteredContextMap.put(permissionEntry.getKey(), new OptionData(option, optionValue, type, contexts));
}
}
}

View File

@ -88,6 +88,13 @@ public class CommandClaimCreate extends BaseCommand {
return;
}
final int radiusLimit = GriefDefenderPlugin.getGlobalConfig().getConfig().claim.claimCreateRadiusLimit;
if (radius > radiusLimit) {
GriefDefenderPlugin.sendMessage(player, GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CREATE_FAILED_RESULT,
ImmutableMap.of("reason", "Radius exceeds limit of " + radiusLimit + ".")));
return;
}
final Vector3i lesserBoundary = new Vector3i(
location.getBlockX() - radius,
minClaimLevel,

View File

@ -33,6 +33,8 @@ import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Optional;
import co.aikar.commands.annotation.Subcommand;
import co.aikar.commands.annotation.Syntax;
import com.flowpowered.math.vector.Vector3i;
import com.google.common.collect.ImmutableMap;
import com.griefdefender.GDPlayerData;
import com.griefdefender.GriefDefenderPlugin;
@ -45,6 +47,7 @@ import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.internal.pagination.PaginationList;
import com.griefdefender.internal.util.VecHelper;
import com.griefdefender.permission.GDPermissionUser;
import com.griefdefender.permission.GDPermissions;
import com.griefdefender.text.action.GDCallbackHolder;
@ -61,6 +64,8 @@ import net.kyori.text.event.HoverEvent;
import net.kyori.text.format.TextColor;
import net.kyori.text.format.TextDecoration;
import net.kyori.text.serializer.plain.PlainComponentSerializer;
import org.spongepowered.api.block.tileentity.Sign;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.economy.account.Account;
@ -127,8 +132,13 @@ public class CommandClaimRent extends BaseCommand {
}
return;
}
EconomyUtil.getInstance().rentCancelConfirmation(player, claim, null);
Sign sign = null;
final Vector3i signPos = claim.getEconomyData().getRentSignPosition();
if (signPos != null) {
sign = SignUtil.getSign(VecHelper.toLocation(player.getWorld(), signPos));
}
EconomyUtil.getInstance().rentCancelConfirmation(player, claim, sign);
return;
} else if (subCommand.equalsIgnoreCase("clearbalance")) {
if (args.length != 2) {

View File

@ -45,18 +45,15 @@ 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.PlayerUtil;
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.ThreadLocalRandom;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.entity.living.player.gamemode.GameModes;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
@CommandAlias("%griefdefender")
@CommandPermission(GDPermissions.COMMAND_TRAPPED)
@ -111,34 +108,7 @@ public class CommandTrapped extends BaseCommand {
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<World> 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<World> safeLocation = Sponge.getTeleportHelper().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;
}
playerData.teleportLocation = PlayerUtil.getInstance().getSafeClaimLocation(claim);
int teleportDelay = 0;
if (GDOptions.PLAYER_TELEPORT_DELAY) {
teleportDelay = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PLAYER_TELEPORT_DELAY, claim);

View File

@ -50,6 +50,8 @@ public class ClaimCategory extends ConfigCategory {
+ "\nNote: If in economy-mode, use setting 'use-claim-block-task' under economy category."
+ "\nNote: To configure amount accrued, see 'blocks-accrued-per-hour' option at https://github.com/bloodmc/GriefDefender/wiki/Options-(Meta)#global-options")
public boolean claimBlockTask = true;
@Setting(value = "claim-create-radius-limit", comment = "The radius limit for the /claimcreate command. (Default: 256)")
public int claimCreateRadiusLimit = 256;
@Setting(value = "worldedit-schematics", comment = "Whether to use WorldEdit for schematics. Default: false"
+ "\nNote: If you were using schematics in older GD/GP versions and want old schematics to work then you should keep this setting disabled.")
public boolean useWorldEditSchematics = false;

View File

@ -25,7 +25,11 @@
package com.griefdefender.configuration.category;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.io.FilenameUtils;
import ninja.leaping.configurate.objectmapping.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable;
@ -36,9 +40,22 @@ public class ModCategory {
@Setting(value = "block-id-convert-list", comment = "Used to override generic block id's to their actual id during TE and item usage if available. Add the target block id to list if you want to force a conversion when detected."
+ "\nNote: This is useful for mods such as IC2 which uses the generic id 'ic2:te' for its multi-block.")
public List<String> blockIdConvertList = new ArrayList<>();
@Setting(value = "tile-id-nbt-map", comment = "Used to override generic tileentity id's to their actual id during TE usage. Add the target TE id as key and NBT key where ID is stored as value."
+ "\nNote: This is useful for mods such as Gregtech which uses the generic id 'gregtech:machine' for its TE and NBT key 'MetaId' to store the actual ID.")
public Map<String, String> tileIdNbtMap = new HashMap<>();
@Setting(value = "item-interact-force-list", comment = "Used to force interact-item flag checks when a player left/right-clicks with an item in hand."
+ "\nBy default, GD will only check interact-item flags when the item is used."
+ "\nTo force an item, add the item 'modid:name' to list."
+ "\nNote: Names support wildcards '?' and '*' by using Apache's wildcard matcher."
+ "\nThe wildcard '?' represents a single character."
+ "\nThe wildcard '*' represents zero or more characters."
+ "\nFor more information on usage, see https://commons.apache.org/proper/commons-io/javadocs/api-2.5/org/apache/commons/io/FilenameUtils.html#wildcardMatch(java.lang.String,%20java.lang.String)")
public List<String> itemInteractForceList = new ArrayList<>();
public ModCategory() {
this.blockIdConvertList.add("gregtech:machine");
this.blockIdConvertList.add("ic2:te");
this.tileIdNbtMap.put("gregtech:machine", "MetaId");
}
public boolean convertBlockId(String id) {
@ -47,4 +64,17 @@ public class ModCategory {
}
return false;
}
public String getNbtKey(String tileId) {
return this.tileIdNbtMap.get(tileId);
}
public boolean forceItemInteract(String id) {
for (String str : this.itemInteractForceList) {
if (FilenameUtils.wildcardMatch(id, str)) {
return true;
}
}
return false;
}
}

View File

@ -86,8 +86,8 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
Set<Context> flagContexts = new HashSet<>();
for (String part : parts) {
String[] split = part.split("=");
String key = split[0];
String value = split[1];
String key = split[0].toLowerCase();
String value = split[1].toLowerCase();
// Handle linked Flag
if (key.equalsIgnoreCase("flag")) {
final String flagName = value;
@ -108,11 +108,6 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
}
flagContexts.add(new Context(key, value));
break;
case "used_item":
case "item_name":
case ContextKeys.STATE:
flagContexts.add(new Context(key, value));
break;
case "server":
case "world":
case ContextKeys.CLAIM_DEFAULT:
@ -120,7 +115,8 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
// gd_claim contexts should always be set at the definition level
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.\nContext '" + key + "' can only be used for the definition.");
default:
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.");
flagContexts.add(new Context(key, value));
break;
}
}
}

View File

@ -217,12 +217,6 @@ public class BlockEventHandler {
return;
}
if (source instanceof Player && !hasFakePlayer && tileEntity == null) {
// handle in normal events
GDTimings.BLOCK_PRE_EVENT.stopTimingIfSync();
return;
}
if (sourceLocation != null) {
GDPlayerData playerData = null;
if (user != null) {
@ -790,29 +784,6 @@ public class BlockEventHandler {
return;
}
// handle ice form/melt
if (event.getTransactions().size() == 1) {
final BlockSnapshot sourceBlock = event.getTransactions().get(0).getOriginal();
final BlockSnapshot targetBlock = event.getTransactions().get(0).getFinal();
if (NMSUtil.getInstance().isBlockWater(sourceBlock.getState().getType()) && NMSUtil.getInstance().isBlockIce(targetBlock.getState().getType())) {
final Location<World> loc = targetBlock.getLocation().get();
final GDClaim claim = this.dataStore.getClaimAt(loc);
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, loc, claim, Flags.BLOCK_MODIFY, sourceBlock, targetBlock, (Player) null, true);
if (result == Tristate.FALSE) {
event.setCancelled(true);
}
return;
} else if (NMSUtil.getInstance().isBlockIce(sourceBlock.getState().getType()) && NMSUtil.getInstance().isBlockWater(targetBlock.getState().getType())) {
final Location<World> loc = targetBlock.getLocation().get();
final GDClaim claim = this.dataStore.getClaimAt(loc);
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, loc, claim, Flags.BLOCK_MODIFY, sourceBlock, targetBlock, (Player) null, true);
if (result == Tristate.FALSE) {
event.setCancelled(true);
}
return;
}
}
ItemStackSnapshot itemSnapshot = event.getContext().get(EventContextKeys.USED_ITEM).orElse(null);
if (itemSnapshot != null) {
if (itemSnapshot.getType().equals(ItemTypes.BUCKET)) {
@ -824,6 +795,29 @@ public class BlockEventHandler {
GDClaim sourceClaim = null;
LocatableBlock locatable = null;
final User user = CauseContextHelper.getEventUser(event);
// handle ice form/melt
if (!(event.getCause().root() instanceof Entity) && event.getTransactions().size() == 1) {
final BlockSnapshot sourceBlock = event.getTransactions().get(0).getOriginal();
final BlockSnapshot targetBlock = event.getTransactions().get(0).getFinal();
if (NMSUtil.getInstance().isBlockWater(sourceBlock.getState().getType()) && NMSUtil.getInstance().isBlockIce(targetBlock.getState().getType())) {
final Location<World> loc = targetBlock.getLocation().get();
final GDClaim claim = this.dataStore.getClaimAt(loc);
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, loc, claim, Flags.BLOCK_MODIFY, sourceBlock, targetBlock, user, true);
if (result == Tristate.FALSE) {
event.setCancelled(true);
}
return;
} else if (NMSUtil.getInstance().isBlockIce(sourceBlock.getState().getType()) && NMSUtil.getInstance().isBlockWater(targetBlock.getState().getType())) {
final Location<World> loc = targetBlock.getLocation().get();
final GDClaim claim = this.dataStore.getClaimAt(loc);
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, loc, claim, Flags.BLOCK_MODIFY, sourceBlock, targetBlock, user, true);
if (result == Tristate.FALSE) {
event.setCancelled(true);
}
return;
}
}
if (source instanceof LocatableBlock) {
locatable = (LocatableBlock) source;
if (user != null && user instanceof Player) {

View File

@ -35,11 +35,15 @@ import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.Item;
import org.spongepowered.api.entity.Transform;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.entity.living.player.gamemode.GameModes;
import org.spongepowered.api.entity.projectile.Projectile;
import org.spongepowered.api.event.Cancellable;
import org.spongepowered.api.event.Event;
import org.spongepowered.api.event.entity.MoveEntityEvent;
import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent;
import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.text.Text;
import org.spongepowered.api.world.Location;
@ -103,11 +107,15 @@ public class CommonEntityEventHandler {
this.storage = GriefDefenderPlugin.getInstance().dataStore;
}
public boolean onEntityMove(MoveEntityEvent event, Location<World> fromLocation, Location<World> toLocation, Entity targetEntity){
public boolean onEntityMove(Event event, Location<World> fromLocation, Location<World> toLocation, Entity targetEntity){
if (targetEntity instanceof Item || targetEntity instanceof Projectile) {
return true;
}
if ((!GDFlags.ENTER_CLAIM && !GDFlags.EXIT_CLAIM) || fromLocation.getBlockPosition().equals(toLocation.getBlockPosition())) {
return true;
}
Player player = null;
GDPermissionUser user = null;
boolean onMount = false;
@ -127,9 +135,6 @@ public class CommonEntityEventHandler {
}
}
}
if ((!GDFlags.ENTER_CLAIM && !GDFlags.EXIT_CLAIM) || fromLocation.getBlockPosition().equals(toLocation.getBlockPosition())) {
return true;
}
if (user != null) {
if (user.getInternalPlayerData().trappedRequest) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_CANCEL_MOVE);
@ -137,6 +142,11 @@ public class CommonEntityEventHandler {
user.getInternalPlayerData().teleportDelay = 0;
}
}
if (player != null && user != null) {
if (event instanceof MoveEntityEvent.Teleport && user.getInternalPlayerData().runningPlayerCommands) {
return true;
}
}
World world = targetEntity.getWorld();
if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUniqueId())) {
@ -168,27 +178,32 @@ public class CommonEntityEventHandler {
// enter
if (GDFlags.ENTER_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, toLocation, toClaim, Flags.ENTER_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) {
gpEvent.cancelled(true);
if (event != null) {
event.setCancelled(true);
if (event != null && event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
}
// exit
if (GDFlags.EXIT_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, fromLocation, fromClaim, Flags.EXIT_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) {
gpEvent.cancelled(true);
if (event != null) {
event.setCancelled(true);
if (event != null && event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
}
GriefDefender.getEventManager().post(gpEvent);
if (gpEvent.cancelled()) {
if (event != null) {
event.setCancelled(true);
if (event != null && event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove();
}
if (event instanceof RespawnPlayerEvent) {
// Respawn player in safe location in source claim
((RespawnPlayerEvent) event).setToTransform(new Transform<World>(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim)));
}
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
}
}
@ -237,10 +252,11 @@ public class CommonEntityEventHandler {
GDBorderClaimEvent gpEvent = new GDBorderClaimEvent(targetEntity, fromClaim, toClaim);
if (user != null && toClaim.isUserTrusted(user, TrustTypes.ACCESSOR)) {
final GDPlayerData playerData = user.getInternalPlayerData();
GriefDefender.getEventManager().post(gpEvent);
if (gpEvent.cancelled()) {
event.setCancelled(true);
if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove();
}
@ -248,6 +264,11 @@ public class CommonEntityEventHandler {
if (player != null && cancelMessage != null) {
TextAdapter.sendComponent(player, cancelMessage);
}
if (event instanceof RespawnPlayerEvent) {
// Respawn player in safe location in source claim
((RespawnPlayerEvent) event).setToTransform(new Transform<World>(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim)));
}
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
} else {
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
@ -294,8 +315,14 @@ public class CommonEntityEventHandler {
this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false);
this.runPlayerCommands(toClaim, user, true);
// Exit command - Don't run if to claim is child of from claim
if (!toClaim.isParent(fromClaim)) {
this.runPlayerCommands(fromClaim, user, false);
}
// Enter command - Don't run if to claim is parent of from claim
if (!fromClaim.isParent(toClaim)) {
this.runPlayerCommands(toClaim, user, true);
}
}
}
@ -335,10 +362,16 @@ public class CommonEntityEventHandler {
TextAdapter.sendComponent(player, cancelMessage);
}
event.setCancelled(true);
if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove();
}
if (event instanceof RespawnPlayerEvent) {
// Respawn player in safe location in source claim
((RespawnPlayerEvent) event).setToTransform(new Transform<World>(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim)));
}
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
}
@ -346,20 +379,22 @@ public class CommonEntityEventHandler {
if (player != null) {
if (GDFlags.ENTITY_RIDING && onMount) {
if (GDPermissionManager.getInstance().getFinalPermission(event, targetEntity.getLocation(), toClaim, Flags.ENTITY_RIDING, player, targetEntity, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
event.setCancelled(true);
Location<World> safeLocation = Sponge.getGame().getTeleportHelper()
.getSafeLocation(fromLocation, 80, 0)
.orElseGet(() -> Sponge.getGame().getTeleportHelper()
.getSafeLocation(fromLocation, 80, 6)
.orElse(world.getSpawnLocation())
);
targetEntity.getBaseVehicle().clearPassengers();
player.setTransform(player.getTransform().setLocation(safeLocation));
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
Location<World> safeLocation = Sponge.getGame().getTeleportHelper()
.getSafeLocation(fromLocation, 80, 0)
.orElseGet(() -> Sponge.getGame().getTeleportHelper()
.getSafeLocation(fromLocation, 80, 6)
.orElse(world.getSpawnLocation())
);
targetEntity.getBaseVehicle().clearPassengers();
player.setTransform(player.getTransform().setLocation(safeLocation));
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
}
}
}
final GDPlayerData playerData = user.getInternalPlayerData();
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
Component welcomeMessage = gpEvent.getEnterMessage().orElse(null);
if (welcomeMessage != null && !welcomeMessage.equals(TextComponent.empty()) && !fromClaim.isParent(toClaim)) {
@ -404,8 +439,14 @@ public class CommonEntityEventHandler {
this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false);
this.runPlayerCommands(toClaim, user, true);
// Exit command - Don't run if to claim is child of from claim
if (!toClaim.isParent(fromClaim)) {
this.runPlayerCommands(fromClaim, user, false);
}
// Enter command - Don't run if to claim is parent of from claim
if (!fromClaim.isParent(toClaim)) {
this.runPlayerCommands(toClaim, user, true);
}
}
}
}
@ -428,7 +469,11 @@ public class CommonEntityEventHandler {
if (!GDOptions.PLAYER_COMMAND_ENTER && !GDOptions.PLAYER_COMMAND_EXIT) {
return;
}
if (user.getInternalPlayerData().runningPlayerCommands) {
return;
}
user.getInternalPlayerData().runningPlayerCommands = true;
List<String> rawCommandList = new ArrayList<>();
Set<Context> contexts = new HashSet<>();
if (player.getUniqueId().equals(claim.getOwnerUniqueId())) {
@ -461,6 +506,7 @@ public class CommonEntityEventHandler {
if (rawCommandList != null) {
runCommand(claim, player, rawCommandList, false);
}
user.getInternalPlayerData().runningPlayerCommands = false;
}
private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) {
@ -475,6 +521,10 @@ public class CommonEntityEventHandler {
String args = command.replace(baseCommand + " ", "");
baseCommand = baseCommand.replace("\\", "").replace("/", "");
args = args.replace("%player%", player.getName());
// Handle WorldEdit commands
if (command.startsWith("//") && !baseCommand.startsWith("/")) {
baseCommand = "/" + baseCommand;
}
if (runAsConsole) {
CommandHelper.executeCommand(Sponge.getServer().getConsole(), baseCommand, args);
} else {

View File

@ -392,6 +392,17 @@ public class EntityEventHandler {
}
}
if (user == null) {
final UUID uuid = NMSUtil.getInstance().getEntityOwnerUUID(entity);
if (uuid != null) {
final GDPermissionUser gdUser = PermissionHolderCache.getInstance().getOrCreateUser(uuid);
if (GDPermissionManager.getInstance().getFinalPermission(event, entity.getLocation(), targetClaim, flag, actualSource, entity, gdUser, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
return false;
}
return true;
}
}
if (GDPermissionManager.getInstance().getFinalPermission(event, entity.getLocation(), targetClaim, flag, actualSource, entity, user, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
return false;
}

View File

@ -58,6 +58,8 @@ import com.griefdefender.event.GDCauseStackManager;
import com.griefdefender.internal.provider.GDWorldEditProvider;
import com.griefdefender.internal.registry.BlockTypeRegistryModule;
import com.griefdefender.internal.registry.GDBlockType;
import com.griefdefender.internal.registry.GDTileType;
import com.griefdefender.internal.registry.TileEntityTypeRegistryModule;
import com.griefdefender.internal.util.BlockUtil;
import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.internal.visual.GDClaimVisual;
@ -81,12 +83,14 @@ import net.kyori.text.event.HoverEvent;
import net.kyori.text.serializer.gson.GsonComponentSerializer;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.block.BlockSnapshot;
import org.spongepowered.api.block.BlockState;
import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.block.tileentity.Sign;
import org.spongepowered.api.block.tileentity.TileEntity;
import org.spongepowered.api.command.CommandMapping;
import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.data.property.block.MatterProperty;
import org.spongepowered.api.data.type.HandType;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.Entity;
@ -135,8 +139,6 @@ import org.spongepowered.api.text.channel.MutableMessageChannel;
import org.spongepowered.api.text.channel.type.FixedMessageChannel;
import org.spongepowered.api.text.format.TextColors;
import org.spongepowered.api.text.serializer.TextSerializers;
import org.spongepowered.api.util.blockray.BlockRay;
import org.spongepowered.api.util.blockray.BlockRayHit;
import org.spongepowered.api.world.Chunk;
import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World;
@ -481,6 +483,9 @@ public class PlayerEventHandler {
if (claim.isInTown()) {
playerData.inTown = true;
}
if (GDFlags.ENTER_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, player.getLocation(), claim, Flags.ENTER_CLAIM, player, player, player, true) == Tristate.FALSE) {
player.setLocation(PlayerUtil.getInstance().getSafeClaimLocation(claim));
}
GDTimings.PLAYER_JOIN_EVENT.stopTimingIfSync();
}
@ -573,6 +578,14 @@ public class PlayerEventHandler {
final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(event.getTargetEntity().getWorld(), event.getTargetEntity().getUniqueId());
playerData.lastPvpTimestamp = null;
if (playerData.ignoreClaims || event.getTargetEntity().hasPermission(GDPermissions.COMMAND_DELETE_ADMIN_CLAIMS)) {
return;
}
final Location<World> sourceLocation = event.getFromTransform().getLocation();
final Location<World> destination = event.getToTransform().getLocation();
// Handle BorderClaimEvent
CommonEntityEventHandler.getInstance().onEntityMove(event, sourceLocation, destination, event.getTargetEntity());
}
@Listener(order = Order.FIRST, beforeModifications = true)
@ -910,7 +923,7 @@ public class PlayerEventHandler {
GDPlayerData playerData = this.dataStore.getOrCreatePlayerData(world, player.getUniqueId());
Location<World> location = player.getLocation();
GDClaim claim = this.dataStore.getClaimAtPlayer(playerData, location);
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, Flags.ITEM_PICKUP, player, event.getTargetEntity(), player, true) == Tristate.FALSE) {
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, Flags.ITEM_PICKUP, player, event.getTargetEntity(), player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
event.setCancelled(true);
}
@ -1032,7 +1045,7 @@ public class PlayerEventHandler {
final HandType handType = event.getHandType();
final ItemStack itemInHand = player.getItemInHand(handType).orElse(ItemStack.empty());
if (handleItemInteract(event, player, player.getWorld(), itemInHand).isCancelled()) {
if (PlayerUtil.getInstance().forceItemInteract(itemInHand.getType(), player) && handleItemInteract(event, player, player.getWorld(), itemInHand).isCancelled()) {
event.setCancelled(true);
return;
}
@ -1126,7 +1139,7 @@ public class PlayerEventHandler {
final HandType handType = event.getHandType();
final ItemStack itemInHand = player.getItemInHand(handType).orElse(ItemStack.empty());
if (handleItemInteract(event, player, player.getWorld(), itemInHand).isCancelled()) {
if (PlayerUtil.getInstance().forceItemInteract(itemInHand.getType(), player) && handleItemInteract(event, player, player.getWorld(), itemInHand).isCancelled()) {
event.setCancelled(true);
return;
}
@ -1246,11 +1259,10 @@ public class PlayerEventHandler {
final BlockSnapshot blockSnapshot = context.get(EventContextKeys.BLOCK_HIT).orElse(BlockSnapshot.NONE);
final Vector3d interactPoint = event.getInteractionPoint().orElse(null);
final Entity entity = context.get(EventContextKeys.ENTITY_HIT).orElse(null);
final Location<World> location = entity != null ? entity.getLocation()
Location<World> location = entity != null ? entity.getLocation()
: blockSnapshot != BlockSnapshot.NONE ? blockSnapshot.getLocation().get()
: interactPoint != null ? new Location<World>(world, interactPoint)
: player.getLocation();
final GDClaim claim = this.dataStore.getClaimAt(location);
: null;
final Flag flag = primaryEvent ? Flags.INTERACT_ITEM_PRIMARY : Flags.INTERACT_ITEM_SECONDARY;
@ -1267,6 +1279,23 @@ public class PlayerEventHandler {
return event;
}
final boolean isItemBucket = !itemInHand.isEmpty() && itemInHand.getType().equals(ItemTypes.BUCKET);
BlockState blockHit = blockSnapshot != BlockSnapshot.NONE ? blockSnapshot.getState() : null;
if (location == null) {
if (isItemBucket) {
final int distance = NMSUtil.getInstance().getPlayerBlockReachDistance(player);
location = BlockUtil.getInstance().getTargetBlock(player, playerData, distance, true).orElse(null);
if (location != null) {
blockHit = location.getBlock();
} else {
location = player.getLocation();
}
} else {
location = player.getLocation();
}
}
final GDClaim claim = this.dataStore.getClaimAt(location);
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, flag, player, itemInHand, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM,
ImmutableMap.of(
@ -1282,12 +1311,19 @@ public class PlayerEventHandler {
return event;
}
if (blockSnapshot != null && blockSnapshot.getState().getType() != BlockTypes.AIR) {
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, flag, itemInHand, blockSnapshot, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
if (blockHit != null && blockHit.getType() != BlockTypes.AIR) {
TrustType trustType = TrustTypes.ACCESSOR;
if (isItemBucket) {
final MatterProperty matterProperty = blockHit.getProperty(MatterProperty.class).orElse(null);
if (matterProperty != null && matterProperty.getValue() == MatterProperty.Matter.LIQUID) {
trustType = TrustTypes.BUILDER;
}
}
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, flag, itemInHand, blockHit, player, trustType, true) == Tristate.FALSE) {
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of(
"item", itemInHand.getType().getId(),
"block", blockSnapshot.getState().getType().getId()));
"block", blockHit.getType().getId()));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
if (event instanceof InteractBlockEvent.Secondary) {
((InteractBlockEvent.Secondary) event).setUseItemResult(SpongeUtil.getSpongeTristate(Tristate.FALSE));
@ -1298,11 +1334,11 @@ public class PlayerEventHandler {
return event;
}
if (!itemInHand.isEmpty() && itemInHand.getType().equals(ItemTypes.BUCKET)) {
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim,Flags.INTERACT_BLOCK_SECONDARY, itemInHand, blockSnapshot, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim,Flags.INTERACT_BLOCK_SECONDARY, itemInHand, blockHit, player, trustType, true) == Tristate.FALSE) {
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of(
"item", itemInHand.getType().getId(),
"block", blockSnapshot.getState().getType().getId()));
"block", blockHit.getType().getId()));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
event.setCancelled(true);
lastInteractItemCancelled = true;
@ -2036,16 +2072,30 @@ public class PlayerEventHandler {
if (playerData != null && claim.getData() != null && claim.getData().isExpired() /*&& GriefDefenderPlugin.getActiveConfig(player.getWorld().getProperties()).getConfig().claim.bankTaxSystem*/) {
playerData.sendTaxExpireMessage(player, claim);
} else if (playerItem == null || playerItem == ItemTypes.NONE || playerItem.isEmpty()) {
String blockId = blockSnapshot.getState().getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(blockId)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(blockSnapshot.getLocation().orElse(null));
if (tileType != null) {
blockId = tileType.getId();
}
}
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_BLOCK,
ImmutableMap.of(
"player", claim.getOwnerName(),
"block", blockSnapshot.getState().getType().getId()));
"block", blockId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
} else {
String blockId = blockSnapshot.getState().getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(blockId)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(blockSnapshot.getLocation().orElse(null));
if (tileType != null) {
blockId = tileType.getId();
}
}
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of(
"item", playerItem.getType().getId(),
"block", blockSnapshot.getState().getType().getId()));
"block", blockId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
}
if (handType == HandTypes.MAIN_HAND) {

View File

@ -100,6 +100,7 @@ import org.spongepowered.api.event.Event;
import org.spongepowered.api.event.block.NotifyNeighborBlockEvent;
import org.spongepowered.api.event.cause.EventContextKey;
import org.spongepowered.api.event.cause.EventContextKeys;
import org.spongepowered.api.event.cause.entity.damage.DamageTypes;
import org.spongepowered.api.event.cause.entity.damage.source.DamageSource;
import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource;
import org.spongepowered.api.item.ItemType;
@ -265,10 +266,18 @@ public class GDPermissionManager implements PermissionManager {
if (source instanceof Player && !isFakePlayer && flag != Flags.COLLIDE_BLOCK && flag != Flags.COLLIDE_ENTITY) {
this.addPlayerContexts((Player) source, contexts);
}
if (!(source instanceof Player) && target instanceof Player && user != null && user.getOnlinePlayer() != null && !user.getUniqueId().equals(((Player) target).getUniqueId())) {
// add source player context
// this allows users to block all pvp actions when direct source isn't a player
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer())));
if (!(source instanceof Player) && user != null && user.getOnlinePlayer() != null) {
boolean addPlayerContext = false;
if (!(target instanceof Player)) {
addPlayerContext = true;
} else if (!user.getUniqueId().equals(((Player) target).getUniqueId())) {
addPlayerContext = true;
}
if (addPlayerContext) {
// add source player context
// this allows users to block all pvp actions when direct source isn't a player
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer())));
}
}
final Set<Context> sourceContexts = this.getPermissionContexts((GDClaim) claim, source, true);
@ -709,7 +718,17 @@ public class GDPermissionManager implements PermissionManager {
if (obj != null) {
if (obj instanceof Item) {
final String id = ((Item) obj).getItemType().getId();
final Item item = ((Item) obj);
String id = item.getItemType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final int index = id.indexOf(":");
final String modId = id.substring(0, index);
id = modId + ":" + NMSUtil.getInstance().getItemName(item);
}
final String itemMeta = NMSUtil.getInstance().getItemStackMeta((Item) obj);
if (itemMeta != null) {
contexts.add(new Context("meta", itemMeta));
}
return populateEventSourceTargetContext(contexts, id, isSource);
} else if (obj instanceof Entity) {
final Entity targetEntity = (Entity) obj;
@ -751,29 +770,34 @@ public class GDPermissionManager implements PermissionManager {
} else if (obj instanceof BlockSnapshot) {
final BlockSnapshot blockSnapshot = (BlockSnapshot) obj;
final BlockState blockstate = blockSnapshot.getState();
final Location<World> location = blockSnapshot.getLocation().orElse(null);
String id = blockstate.getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(blockSnapshot);
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(location);
if (tileType != null) {
id = tileType.getId();
if (this.isObjectIdBanned(claim, id, BanType.BLOCK)) {
return null;
}
return this.populateEventSourceTargetContext(contexts, id, isSource);
}
}
return this.getPermissionContexts(claim, blockstate, isSource);
} else if (obj instanceof BlockState) {
final BlockState blockstate = (BlockState) obj;
if (this.isObjectIdBanned(claim, blockstate.getType().getId(), BanType.BLOCK)) {
return null;
}
final String id = blockstate.getType().getId();
this.addBlockContexts(contexts, blockstate.getType(), isSource);
this.addBlockPropertyContexts(contexts, blockstate);
if (this.isObjectIdBanned(claim, id, BanType.BLOCK)) {
return null;
}
this.addBlockContexts(contexts, blockstate.getType(), isSource);
this.addBlockPropertyContexts(contexts, blockstate);
return populateEventSourceTargetContext(contexts, id, isSource);
} else if (obj instanceof BlockState) {
final BlockState blockstate = (BlockState) obj;
String id = blockstate.getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(this.eventLocation);
if (tileType != null) {
id = tileType.getId();
}
}
if (this.isObjectIdBanned(claim, id, BanType.BLOCK)) {
return null;
}
this.addBlockContexts(contexts, blockstate.getType(), isSource);
this.addBlockPropertyContexts(contexts, blockstate);
return populateEventSourceTargetContext(contexts, id, isSource);
} else if (obj instanceof LocatableBlock) {
final LocatableBlock locatableBlock = (LocatableBlock) obj;
@ -850,7 +874,9 @@ public class GDPermissionManager implements PermissionManager {
String id = itemstack.getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
id = NMSUtil.getInstance().getItemName(itemstack);
final int index = id.indexOf(":");
final String modId = id.substring(0, index);
id = modId + ":" + NMSUtil.getInstance().getItemName(itemstack);
}
if (this.isObjectIdBanned(claim, id, BanType.ITEM)) {
return null;
@ -900,6 +926,9 @@ public class GDPermissionManager implements PermissionManager {
} else if (obj instanceof DamageSource) {
final DamageSource damageSource = (DamageSource) obj;
String id = damageSource.getType().getId();
if (damageSource.getType() == DamageTypes.CUSTOM) {
id = NMSUtil.getInstance().getDamageSourceId(damageSource);
}
if (!id.contains(":")) {
id = "minecraft:" + id;
}

View File

@ -387,8 +387,8 @@ public class LuckPermsProvider implements PermissionProvider {
}
}
}
Map<Set<Context>, Map<String, String>> optionMap = this.getPermanentOptions(holder);
for (Entry<Set<Context>, Map<String, String>> mapEntry : optionMap.entrySet()) {
Map<Set<Context>, Map<String, List<String>>> optionMap = this.getPermanentOptions(holder);
for (Entry<Set<Context>, Map<String, List<String>>> mapEntry : optionMap.entrySet()) {
for (Context context : mapEntry.getKey()) {
if (context.getKey().equalsIgnoreCase("gd_claim") && context.getValue().equalsIgnoreCase(claimUniqueId.toString())) {
this.clearPermissions(holder, mapEntry.getKey());
@ -435,7 +435,7 @@ public class LuckPermsProvider implements PermissionProvider {
return cachedData.getPermissionMap();
}
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
ImmutableContextSet set = this.getLPContexts(contexts).immutableCopy();
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
@ -445,9 +445,9 @@ public class LuckPermsProvider implements PermissionProvider {
final QueryOptions query = QueryOptions.builder(QueryMode.CONTEXTUAL).option(DataQueryOrderFunction.KEY, DEFAULT_DATA_QUERY_ORDER).context(set).build();
CachedMetaData cachedData = permissionHolder.getCachedData().getMetaData(query);
// TODO
Map<String, String> metaMap = new HashMap<>();
Map<String, List<String>> metaMap = new HashMap<>();
for (Map.Entry<String, List<String>> mapEntry : cachedData.getMeta().entrySet()) {
metaMap.put(mapEntry.getKey(), mapEntry.getValue().get(0));
metaMap.put(mapEntry.getKey(), mapEntry.getValue());
}
return metaMap;
}
@ -538,14 +538,14 @@ public class LuckPermsProvider implements PermissionProvider {
return transientPermissionMap;
}
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.data().toCollection();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<Set<Context>, Map<String, List<String>>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, List<String>>>(CONTEXT_COMPARATOR);
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
@ -553,26 +553,35 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts());
Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
Map<String, List<String>> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) {
metaEntry = new HashMap<>();
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
final List<String> values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
permanentPermissionMap.put(contexts, metaEntry);
} else {
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
List<String> values = metaEntry.get(metaNode.getMetaKey());
if (values == null) {
values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
} else {
values.add(metaNode.getMetaValue());
}
}
}
return permanentPermissionMap;
}
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.transientData().toCollection();
Map<Set<Context>, Map<String, String>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, String>>(CONTEXT_COMPARATOR);
Map<Set<Context>, Map<String, List<String>>> permanentPermissionMap = new TreeMap<Set<Context>, Map<String, List<String>>>(CONTEXT_COMPARATOR);
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
@ -580,64 +589,27 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts());
Map<String, String> metaEntry = permanentPermissionMap.get(contexts);
Map<String, List<String>> metaEntry = permanentPermissionMap.get(contexts);
if (metaEntry == null) {
metaEntry = new HashMap<>();
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
final List<String> values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
permanentPermissionMap.put(contexts, metaEntry);
} else {
metaEntry.put(metaNode.getMetaKey(), metaNode.getMetaValue());
List<String> values = metaEntry.get(metaNode.getMetaKey());
if (values == null) {
values = new ArrayList<>();
values.add(metaNode.getMetaValue());
metaEntry.put(metaNode.getMetaKey(), values);
} else {
values.add(metaNode.getMetaValue());
}
}
}
return permanentPermissionMap;
}
public Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.data().toCollection();
final Map<String, String> options = new HashMap<>();
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
}
final MetaNode metaNode = (MetaNode) node;
if (contexts == null) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
} else if (getGPContexts(node.getContexts()).containsAll(contexts)) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
}
}
return options;
}
public Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {
return new HashMap<>();
}
final Collection<Node> nodes = permissionHolder.transientData().toCollection();
final Map<String, String> options = new HashMap<>();
for (Node node : nodes) {
if (node.getType() != NodeType.META) {
continue;
}
final MetaNode metaNode = (MetaNode) node;
if (contexts == null) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
} else if (getGPContexts(node.getContexts()).containsAll(contexts)) {
options.put(metaNode.getMetaKey(), metaNode.getMetaValue());
}
}
return options;
}
public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) {

View File

@ -174,7 +174,7 @@ public interface PermissionProvider {
* @param contexts The contexts required
* @return An immutable map of cached options or empty if none.
*/
Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts);
Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts);
/**
* Gets all persisted permissions.
@ -205,7 +205,7 @@ public interface PermissionProvider {
* @param holder The holder
* @return An immutable map of persisted options or empty if none.
*/
Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder);
Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder);
/**
* Gets all transient options with associated contexts of holder.
@ -213,23 +213,7 @@ public interface PermissionProvider {
* @param holder The holder
* @return An immutable map of transient options or empty if none.
*/
Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder);
/**
* Gets all persisted options and associated values of holder.
*
* @param holder The holder
* @return An immutable map of persisted options or empty if none.
*/
Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts);
/**
* Gets all transient options and associated values of holder.
*
* @param holder The holder
* @return An immutable map of transient options or empty if none.
*/
Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts);
Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder);
/**
* Gets all persisted permissions, including inherited nodes, with associated contexts of holder.

View File

@ -433,8 +433,8 @@ public abstract class BaseStorage {
}
private void setDefaultOptions(Set<Context> contexts, Map<String, String> defaultOptions) {
final Map<Set<Context>, Map<String, String>> permanentOptions = PermissionUtil.getInstance().getPermanentOptions(GriefDefenderPlugin.DEFAULT_HOLDER);
final Map<String, String> options = permanentOptions.get(contexts);
final Map<Set<Context>, Map<String, List<String>>> permanentOptions = PermissionUtil.getInstance().getPermanentOptions(GriefDefenderPlugin.DEFAULT_HOLDER);
final Map<String, List<String>> options = permanentOptions.get(contexts);
GriefDefenderPlugin.getInstance().executor.execute(() -> {
for (Map.Entry<String, String> optionEntry : defaultOptions.entrySet()) {
final Option option = OptionRegistryModule.getInstance().getById(optionEntry.getKey()).orElse(null);
@ -448,7 +448,7 @@ public abstract class BaseStorage {
// Transient options are checked first so we must ignore setting if a persisted option exists
boolean foundPersisted = false;
if (options != null) {
for (Entry<String, String> mapEntry : options.entrySet()) {
for (Entry<String, List<String>> mapEntry : options.entrySet()) {
if (mapEntry.getKey().equalsIgnoreCase(option.getPermission())) {
foundPersisted = true;
break;

View File

@ -119,6 +119,10 @@ public class FileStorage extends BaseStorage {
}
public void registerWorld(World world) {
if (this.claimWorldManagers.get(world.getUniqueId()) != null) {
return;
}
final UUID worldUniqueId = world.getUniqueId();
DimensionType dimType = world.getProperties().getDimensionType();
String[] parts = dimType.getId().split(":");

View File

@ -66,7 +66,7 @@ public class ClaimBlockTask implements Runnable {
if (GriefDefenderPlugin.getInstance().isEconomyModeEnabled()) {
final Account playerAccount = GriefDefenderPlugin.getInstance().economyService.get().getOrCreateAccount(player.getUniqueId()).orElse(null);
if (playerAccount == null) {
return;
continue;
}
final Currency defaultCurrency = GriefDefenderPlugin.getInstance().economyService.get().getDefaultCurrency();
@ -76,7 +76,7 @@ public class ClaimBlockTask implements Runnable {
if ((currentTotal + accruedBlocks) > playerData.getMaxAccruedClaimBlocks()) {
playerData.setAccruedClaimBlocks(playerData.getMaxAccruedClaimBlocks());
playerData.lastAfkCheckLocation = player.getLocation();
return;
continue;
}
playerData.setAccruedClaimBlocks(playerData.getAccruedClaimBlocks() + accruedBlocks);

View File

@ -105,9 +105,11 @@ public class RentApplyTask implements Runnable {
}
final Set<Claim> children = claim.getChildren(true);
for (Claim child : children) {
for (UUID uuid : child.getEconomyData().getRenters()) {
final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(uuid);
handleClaimRent((GDClaim) child, user);
if (child.getEconomyData().isRented()) {
for (UUID uuid : child.getEconomyData().getRenters()) {
final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(uuid);
handleClaimRent((GDClaim) child, user);
}
}
}
}

View File

@ -126,7 +126,7 @@ public class TaxApplyTask implements Runnable {
final double taxBalance = claim.getEconomyData().getTaxBalance();
taxRate = event.getTaxRate();
taxOwed = taxBalance + (claim.getClaimBlocks() * taxRate);
final TransactionResult result = EconomyUtil.withdrawFunds(user.getUniqueId(), taxOwed);
final TransactionResult result = EconomyUtil.getInstance().withdrawTax(claim, user.getUniqueId(), taxOwed);
if (result.getResult() != ResultType.SUCCESS) {
final Instant localNow = Instant.now();
Instant taxPastDueDate = claim.getEconomyData().getTaxPastDueDate();

View File

@ -43,6 +43,7 @@ import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.living.Living;
import org.spongepowered.api.entity.living.player.User;
import org.spongepowered.api.entity.projectile.source.ProjectileSource;
import org.spongepowered.api.event.Event;
import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext;
@ -75,8 +76,15 @@ public class CauseContextHelper {
if (cause != null) {
user = cause.first(User.class).orElse(null);
if (user == null) {
// check for FakePlayer in context
user = cause.getContext().get(EventContextKeys.FAKE_PLAYER).orElse(null);
// check projectile source
final ProjectileSource projectileSource = cause.getContext().get(EventContextKeys.PROJECTILE_SOURCE).orElse(null);
if (projectileSource != null && projectileSource instanceof User) {
user = (User) projectileSource;
}
if (user == null) {
// check for FakePlayer in context
user = cause.getContext().get(EventContextKeys.FAKE_PLAYER).orElse(null);
}
}
if (user != null && user instanceof Entity && NMSUtil.getInstance().isFakePlayer((Entity) user)) {
fakePlayer = user;

View File

@ -71,6 +71,7 @@ import org.spongepowered.api.entity.Item;
import org.spongepowered.api.entity.living.monster.Monster;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.economy.Currency;
import org.spongepowered.api.service.economy.EconomyService;
import org.spongepowered.api.service.economy.account.Account;
import org.spongepowered.api.service.economy.transaction.ResultType;
import org.spongepowered.api.service.economy.transaction.TransactionResult;
@ -92,6 +93,7 @@ import java.util.function.Consumer;
public class EconomyUtil {
private final EconomyService economyService = GriefDefenderPlugin.getInstance().economyService.orElse(null);
private static EconomyUtil instance;
public static EconomyUtil getInstance() {
@ -102,6 +104,35 @@ public class EconomyUtil {
instance = new EconomyUtil();
}
public TransactionResult withdrawTax(GDClaim claim, UUID playerUniqueId, double taxOwed) {
if (GriefDefenderPlugin.getGlobalConfig().getConfig().economy.bankSystem) {
final Account bankAccount = this.economyService.getOrCreateAccount(claim.getUniqueId().toString()).orElse(null);
if (bankAccount != null) {
final Currency defaultCurrency = GriefDefenderPlugin.getInstance().economyService.get().getDefaultCurrency();
final double bankBalance = bankAccount.getBalance(defaultCurrency).doubleValue();
if (bankBalance > 0) {
TransactionResult withdrawResponse = null;
if (taxOwed == bankBalance || bankBalance > taxOwed) {
withdrawResponse = bankAccount.withdraw(defaultCurrency, BigDecimal.valueOf(taxOwed), Sponge.getCauseStackManager().getCurrentCause());
if (withdrawResponse.getResult() == ResultType.SUCCESS) {
claim.getData().getEconomyData().addPaymentTransaction(
new GDPaymentTransaction(TransactionType.BANK_WITHDRAW, TransactionResultType.SUCCESS, playerUniqueId, Instant.now(), taxOwed));
return withdrawResponse;
}
} else {
withdrawResponse = bankAccount.withdraw(defaultCurrency, BigDecimal.valueOf(bankBalance), Sponge.getCauseStackManager().getCurrentCause());
if (withdrawResponse.getResult() == ResultType.SUCCESS) {
taxOwed -= bankBalance;
claim.getData().getEconomyData().addPaymentTransaction(
new GDPaymentTransaction(TransactionType.BANK_WITHDRAW, TransactionResultType.SUCCESS, playerUniqueId, Instant.now(), bankBalance));
}
}
}
}
}
return withdrawFunds(playerUniqueId, taxOwed);
}
public void economyCreateClaimConfirmation(Player player, GDPlayerData playerData, int height, Vector3i point1, Vector3i point2, ClaimType claimType, boolean cuboid, Claim parent) {
GDClaim claim = new GDClaim(player.getWorld(), point1, point2, claimType, player.getUniqueId(), cuboid);
claim.parent = (GDClaim) parent;

View File

@ -96,7 +96,7 @@ public class PermissionUtil {
}
public void addActiveContexts(Set<Context> contexts, GDPermissionHolder permissionHolder, GDPlayerData playerData, Claim claim) {
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, null, null);
PERMISSION_PROVIDER.addActiveContexts(contexts, permissionHolder, playerData, claim);
}
public boolean containsDefaultContext(Set<Context> contexts) {
@ -139,7 +139,7 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getPermissions(holder, contexts);
}
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getOptions(holder, contexts);
}
@ -155,22 +155,14 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getTransientPermissions(holder);
}
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getPermanentOptions(holder);
}
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) {
public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getTransientOptions(holder);
}
public Map<String, String> getPermanentOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getPermanentOptions(holder, contexts);
}
public Map<String, String> getTransientOptions(GDPermissionHolder holder, Set<Context> contexts) {
return PERMISSION_PROVIDER.getTransientOptions(holder, contexts);
}
public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getAllPermissions(holder);
}

View File

@ -41,7 +41,6 @@ import com.griefdefender.api.permission.option.type.WeatherType;
import com.griefdefender.api.permission.option.type.WeatherTypes;
import com.griefdefender.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.internal.util.BlockUtil;
import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.permission.GDPermissionUser;
import net.kyori.text.Component;
@ -69,6 +68,7 @@ import org.spongepowered.api.world.World;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import javax.annotation.Nullable;
@ -326,4 +326,51 @@ public class PlayerUtil {
return claim;
}
public Location<World> getSafeClaimLocation(GDClaim claim) {
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<World> 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<World> safeLocation = Sponge.getTeleportHelper().getSafeLocation(claimCorner, 64, 16, 2).orElse(null);
if (safeLocation != null) {
return safeLocation;
}
// If no safe location was found, fall back to corner
return claimCorner;
}
public boolean forceItemInteract(ItemType itemType, Player player) {
final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
if (playerData.claimMode) {
return true;
}
if (!playerData.claimTool) {
return GriefDefenderPlugin.getGlobalConfig().getConfig().mod.forceItemInteract(itemType.getId());
}
if (GriefDefenderPlugin.getInstance().modificationTool != null && itemType.getId().equals(GriefDefenderPlugin.getInstance().modificationTool)) {
return true;
}
if (GriefDefenderPlugin.getInstance().investigationTool != null && itemType.getId().equals(GriefDefenderPlugin.getInstance().investigationTool)) {
return true;
}
return GriefDefenderPlugin.getGlobalConfig().getConfig().mod.forceItemInteract(itemType.getId());
}
}

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter-sponge:1.12.2",
"sha1": "beb43662d4d04825a35dcdf21eb16b18424e93d6",
"path": "com/griefdefender/adapter-sponge/1.12.2-SNAPSHOT/adapter-sponge-1.12.2-20210101.010513-16.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter-sponge/1.12.2-SNAPSHOT/adapter-sponge-1.12.2-20210101.010513-16.jar"
"sha1": "da88e2f8cbe0535f01753087464dd3b7918048a4",
"path": "com/griefdefender/adapter-sponge/1.12.2-SNAPSHOT/adapter-sponge-1.12.2-20210115.020835-20.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter-sponge/1.12.2-SNAPSHOT/adapter-sponge-1.12.2-20210115.020835-20.jar"
},
{
"name": "com.griefdefender:api:1.0.0",
@ -41,15 +41,15 @@
},
{
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "72aff420c92e4cb381ba8bccceb0b37cba7a9496",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190722.233344-152.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190722.233344-152.jar"
"sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20200925.132010-170.jar"
},
{
"name": "co.aikar:acf-sponge:0.5.0-SNAPSHOT",
"sha1": "c73413c215cfad8f0c2306ed156df74ebdf18d47",
"path": "co/aikar/acf-sponge/0.5.0-SNAPSHOT/acf-sponge-0.5.0-20190722.233405-145.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-sponge/0.5.0-SNAPSHOT/acf-sponge-0.5.0-20190722.233405-145.jar"
"sha1": "8fde3bc49f21414ca81070271e43c5e9a04c3e08",
"path": "co/aikar/acf-sponge/0.5.0-SNAPSHOT/acf-sponge-0.5.0-20200925.132017-161.jar",
"url": "https://repo.glaremasters.me/repository/public/co/aikar/acf-sponge/0.5.0-SNAPSHOT/acf-sponge-0.5.0-20200925.132017-161.jar"
},
{
"name": "co.aikar:locales:1.0-SNAPSHOT",
@ -137,32 +137,32 @@
"url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.9/commons-lang3-3.9.jar"
},
{
"name": "org.spongepowered:configurate-core:3.7-SNAPSHOT",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar",
"name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-gson:3.7-SNAPSHOT",
"sha1": "265a94f16583621f497eeecc356f35f983484dde",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar",
"name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-hocon:3.7-SNAPSHOT",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar",
"name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar"
},
{
"name": "org.spongepowered:configurate-yaml:3.7-SNAPSHOT",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar",
"name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate",
"url": "https://repo.spongepowered.org/maven/org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar"
"url": "https://repo1.maven.org/maven2/org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar"
},
{
"name": "com.typesafe:config:1.3.1",