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 { dependencies {
compileOnly(project(path: ":GriefDefenderAPI")) compileOnly(project(path: ":GriefDefenderAPI"))
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
compile project (':common') compile project (':common')
compileOnly "com.griefdefender:adapter:$adapterVersion" compileOnly "com.griefdefender:adapter:$adapterVersion"
compileOnly "com.griefdefender:reflect-helper:1.0" compileOnly "com.griefdefender:reflect-helper:1.0"
@ -118,9 +119,9 @@ dependencies {
compileOnly "net.ess3:EssentialsX:2.17.1" compileOnly "net.ess3:EssentialsX:2.17.1"
compileOnly "net.milkbowl.vault:VaultAPI:1.7" compileOnly "net.milkbowl.vault:VaultAPI:1.7"
compileOnly "us.dynmap:dynmap-api:3.0-SNAPSHOT" compileOnly "us.dynmap:dynmap-api:3.0-SNAPSHOT"
compileOnly "com.github.lucko:luckperms:master-SNAPSHOT" compileOnly "com.github.lucko:luckperms:v5.2"
compileOnly "com.github.slimefun:slimefun4:master-SNAPSHOT" //compileOnly "com.github.slimefun:slimefun4:master-SNAPSHOT"
compileOnly "com.github.thebusybiscuit:cs-corelib:master-SNAPSHOT" //compileOnly "com.github.thebusybiscuit:cs-corelib:master-SNAPSHOT"
// Libs // Libs
compileOnly "aopalliance:aopalliance:1.0" compileOnly "aopalliance:aopalliance:1.0"
compileOnly "co.aikar:acf-core:0.5.0-SNAPSHOT" compileOnly "co.aikar:acf-core:0.5.0-SNAPSHOT"
@ -145,10 +146,10 @@ dependencies {
compileOnly "org.jetbrains:annotations:17.0.0" compileOnly "org.jetbrains:annotations:17.0.0"
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72" compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72"
compileOnly "org.ow2.asm:asm-debug-all:5.2" compileOnly "org.ow2.asm:asm-debug-all:5.2"
compileOnly "org.spongepowered:configurate-core:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-core:3.7.2"
compileOnly "org.spongepowered:configurate-gson:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-gson:3.7.2"
compileOnly "org.spongepowered:configurate-hocon:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-hocon:3.7.2"
compileOnly "org.spongepowered:configurate-yaml:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-yaml:3.7.2"
compileOnly "net.kyori:event-api:3.0.0" compileOnly "net.kyori:event-api:3.0.0"
compileOnly "net.kyori:event-method:3.0.0" compileOnly "net.kyori:event-method:3.0.0"
compileOnly "net.kyori:event-method-asm: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 townChat = false;
public boolean lockPlayerDeathDrops = false; public boolean lockPlayerDeathDrops = false;
public boolean trappedRequest = false; public boolean trappedRequest = false;
public boolean runningPlayerCommands = false;
public List<Component> chatLines = new ArrayList<>(); public List<Component> chatLines = new ArrayList<>();
public Instant recordChatTimestamp; public Instant recordChatTimestamp;
public Instant commandInputTimestamp; public Instant commandInputTimestamp;

View File

@ -278,7 +278,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
boolean isAdmin = false; boolean isAdmin = false;
final Player player = src.getOnlinePlayer(); final Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData(); 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)) { if (player.hasPermission(GDPermissions.DELETE_CLAIM_ADMIN)) {
isAdmin = true; isAdmin = true;
} }
@ -385,7 +385,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
overrideContexts.add(claim.getOverrideClaimContext()); overrideContexts.add(claim.getOverrideClaimContext());
Map<String, OptionData> filteredContextMap = new HashMap<>(); 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(); 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)))) { 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()); 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(); final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) { if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue()); 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()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
} }
if (displayType != MenuType.DEFAULT) { if (displayType != MenuType.DEFAULT) {
if (claim.isTown() || isAdmin) { //if (claim.isTown() || isAdmin) {
if (contextSet.contains(claim.getContext())) { if (contextSet.contains(claim.getContext())) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue());
} }
} //}
if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) { if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue());
} }
@ -453,7 +453,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
Collections.reverse(inheritParents); Collections.reverse(inheritParents);
for (Claim current : inheritParents) { for (Claim current : inheritParents) {
GDClaim currentClaim = (GDClaim) current; 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(); final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(currentClaim.getContext())) { if (contextSet.contains(currentClaim.getContext())) {
inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue())); inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue()));
@ -519,10 +519,10 @@ public abstract class ClaimOptionBase extends BaseCommand {
paginationList.sendTo(player, activePage); 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 Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData(); 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); final Option option = OptionRegistryModule.getInstance().getById(permissionEntry.getKey()).orElse(null);
if (option == null) { if (option == null) {
continue; continue;
@ -545,10 +545,21 @@ public abstract class ClaimOptionBase extends BaseCommand {
} }
} }
final OptionData optionData = filteredContextMap.get(permissionEntry.getKey()); 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) { if (optionData != null) {
optionData.addContexts(option, permissionEntry.getValue(), type, contexts); optionData.addContexts(option, optionValue, type, contexts);
} else { } 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; 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( final Vector3i lesserBoundary = new Vector3i(
location.getBlockX() - radius, location.getBlockX() - radius,
minClaimLevel, minClaimLevel,

View File

@ -46,6 +46,7 @@ import com.griefdefender.claim.GDClaim;
import com.griefdefender.configuration.MessageStorage; import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.economy.GDPaymentTransaction; import com.griefdefender.economy.GDPaymentTransaction;
import com.griefdefender.permission.GDPermissions; import com.griefdefender.permission.GDPermissions;
import com.griefdefender.task.TaxApplyTask;
import com.griefdefender.util.EconomyUtil; import com.griefdefender.util.EconomyUtil;
import java.time.Instant; import java.time.Instant;
@ -104,6 +105,10 @@ public class CommandClaimTax extends BaseCommand {
message = MessageCache.getInstance().TAX_NO_BALANCE; message = MessageCache.getInstance().TAX_NO_BALANCE;
} }
GriefDefenderPlugin.sendMessage(player, message); 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")) { } else if (command.equalsIgnoreCase("pay")) {
final double taxBalance = claim.getEconomyData().getTaxBalance(); final double taxBalance = claim.getEconomyData().getTaxBalance();
if (taxBalance <= 0 || amount <= 0) { 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.GDPermissionManager;
import com.griefdefender.permission.GDPermissions; import com.griefdefender.permission.GDPermissions;
import com.griefdefender.permission.option.GDOptions; import com.griefdefender.permission.option.GDOptions;
import com.griefdefender.util.SafeTeleportHelper; import com.griefdefender.util.PlayerUtil;
import java.time.Duration; import java.time.Duration;
import java.time.Instant; import java.time.Instant;
import java.util.concurrent.ThreadLocalRandom;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@CommandAlias("%griefdefender") @CommandAlias("%griefdefender")
@ -108,34 +106,7 @@ public class CommandTrapped extends BaseCommand {
return; return;
} }
final int minClaimLevel = claim.getOwnerMinClaimLevel(); playerData.teleportLocation = PlayerUtil.getInstance().getSafeClaimLocation(claim);
double claimY = claim.getOwnerPlayerData() == null ? 65.0D : (minClaimLevel > 65.0D ? minClaimLevel : 65);
if (claim.isCuboid()) {
claimY = claim.lesserBoundaryCorner.getY();
}
final int random = ThreadLocalRandom.current().nextInt(2, 20 + 1);
final int randomCorner = ThreadLocalRandom.current().nextInt(1, 4 + 1);
Location claimCorner = null;
switch (randomCorner) {
case 1: // SW
claimCorner = new Location(claim.getWorld(), claim.lesserBoundaryCorner.getX() - random, claimY, claim.greaterBoundaryCorner.getZ() + random);
case 2: // NW
claimCorner = new Location(claim.getWorld(), claim.lesserBoundaryCorner.getX() - random, claimY, claim.lesserBoundaryCorner.getZ() - random);
case 3: // SE
claimCorner = new Location(claim.getWorld(), claim.greaterBoundaryCorner.getX() + random, claimY, claim.greaterBoundaryCorner.getZ() + random);
case 4: // NE
claimCorner = new Location(claim.getWorld(), claim.greaterBoundaryCorner.getX() + random, claimY, claim.lesserBoundaryCorner.getZ() - random);
}
final Location safeLocation = SafeTeleportHelper.getInstance().getSafeLocation(claimCorner, 64, 16, 2).orElse(null);
if (safeLocation != null) {
playerData.teleportLocation = safeLocation;
} else {
// If no safe location was found, fall back to corner
playerData.teleportLocation = claimCorner;
}
int teleportDelay = 0; int teleportDelay = 0;
if (GDOptions.PLAYER_TELEPORT_DELAY) { if (GDOptions.PLAYER_TELEPORT_DELAY) {
teleportDelay = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.PLAYER_TELEPORT_DELAY, claim); 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: 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") + "\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; 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.") @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; 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.") @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." @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.") + "\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<>(); 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() { public ModCategory() {
this.blockIdConvertList.add("gregtech:machine");
this.blockIdConvertList.add("ic2:te"); this.blockIdConvertList.add("ic2:te");
this.fakePlayerIdentifiers.add("41C82C87-7AfB-4024-BA57-13D2C99CAE77"); // Forge FakePlayer this.fakePlayerIdentifiers.add("41C82C87-7AfB-4024-BA57-13D2C99CAE77"); // Forge FakePlayer
this.fakePlayerIdentifiers.add("BFC3377F-C3C9-3382-9DA6-79B50A9AFE57"); // OpenMods 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("net.minecraftforge.*", "forge");
this.modIdMap.put("openblocks.*", "openblocks"); this.modIdMap.put("openblocks.*", "openblocks");
this.modIdMap.put("openmods.*", "openmods"); this.modIdMap.put("openmods.*", "openmods");
this.tileIdNbtMap.put("gregtech:machine", "MetaId");
} }
public boolean isFakePlayer(Player player) { public boolean isFakePlayer(Player player) {
@ -98,4 +103,8 @@ public class ModCategory {
} }
return null; 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<>(); Set<Context> flagContexts = new HashSet<>();
for (String part : parts) { for (String part : parts) {
String[] split = part.split("="); String[] split = part.split("=");
String key = split[0]; String key = split[0].toLowerCase();
String value = split[1]; String value = split[1].toLowerCase();
// Handle linked Flag // Handle linked Flag
if (key.equalsIgnoreCase("flag")) { if (key.equalsIgnoreCase("flag")) {
final String flagName = value; final String flagName = value;
@ -108,11 +108,6 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
} }
flagContexts.add(new Context(key, value)); flagContexts.add(new Context(key, value));
break; break;
case "used_item":
case "item_name":
case ContextKeys.STATE:
flagContexts.add(new Context(key, value));
break;
case "server": case "server":
case "world": case "world":
case ContextKeys.CLAIM_DEFAULT: 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 // 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."); throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.\nContext '" + key + "' can only be used for the definition.");
default: 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.entity.Vehicle;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import com.flowpowered.math.vector.Vector3i; import com.flowpowered.math.vector.Vector3i;
@ -68,6 +69,7 @@ import com.griefdefender.command.CommandHelper;
import com.griefdefender.configuration.MessageStorage; import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.event.GDBorderClaimEvent; import com.griefdefender.event.GDBorderClaimEvent;
import com.griefdefender.internal.registry.ItemTypeRegistryModule; import com.griefdefender.internal.registry.ItemTypeRegistryModule;
import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.internal.util.VecHelper; import com.griefdefender.internal.util.VecHelper;
import com.griefdefender.permission.GDPermissionManager; import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.GDPermissionUser;
@ -109,11 +111,12 @@ public class CommonEntityEventHandler {
final Vector3i fromPos = VecHelper.toVector3i(fromLocation); final Vector3i fromPos = VecHelper.toVector3i(fromLocation);
final Vector3i toPos = VecHelper.toVector3i(toLocation); final Vector3i toPos = VecHelper.toVector3i(toLocation);
final Player player = targetEntity instanceof Player ? (Player) targetEntity : null;
final GDPermissionUser user = player != null ? PermissionHolderCache.getInstance().getOrCreateUser(player) : null;
if (fromPos.equals(toPos)) { if (fromPos.equals(toPos)) {
return true; 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 != null) {
if (user.getOnlinePlayer() == null) { if (user.getOnlinePlayer() == null) {
// Most likely NPC, ignore // Most likely NPC, ignore
@ -188,6 +191,10 @@ public class CommonEntityEventHandler {
if (player != null && cancelMessage != null) { if (player != null && cancelMessage != null) {
TextAdapter.sendComponent(player, cancelMessage); TextAdapter.sendComponent(player, cancelMessage);
} }
if (event instanceof PlayerRespawnEvent) {
((PlayerRespawnEvent) event).setRespawnLocation(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim));
}
GDTimings.ENTITY_MOVE_EVENT.stopTiming();
return false; return false;
} else { } else {
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix; final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
@ -232,15 +239,21 @@ public class CommonEntityEventHandler {
} else { } else {
playerData.inTown = false; playerData.inTown = false;
} }
if (player != null) { if (player != null && user.getOnlinePlayer() != null) {
this.checkPlayerFlight(user, fromClaim, toClaim); this.checkPlayerFlight(user, fromClaim, toClaim);
this.checkPlayerFlySpeed(user, fromClaim, toClaim); this.checkPlayerFlySpeed(user, fromClaim, toClaim);
this.checkPlayerGameMode(user, fromClaim, toClaim); this.checkPlayerGameMode(user, fromClaim, toClaim);
this.checkPlayerGodMode(user, fromClaim, toClaim); this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim); this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false); this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false); // Exit command - Don't run if to claim is child of from claim
this.runPlayerCommands(toClaim, user, true); 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) { if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true); ((Cancellable) event).setCancelled(true);
} }
if (event instanceof PlayerRespawnEvent) {
((PlayerRespawnEvent) event).setRespawnLocation(PlayerUtil.getInstance().getSafeClaimLocation(fromClaim));
}
GDTimings.ENTITY_MOVE_EVENT.stopTiming(); GDTimings.ENTITY_MOVE_EVENT.stopTiming();
return false; return false;
} }
@ -340,15 +356,21 @@ public class CommonEntityEventHandler {
playerData.inTown = false; playerData.inTown = false;
} }
if (player != null) { if (player != null && user.getOnlinePlayer() != null) {
this.checkPlayerFlight(user, fromClaim, toClaim); this.checkPlayerFlight(user, fromClaim, toClaim);
this.checkPlayerFlySpeed(user, fromClaim, toClaim); this.checkPlayerFlySpeed(user, fromClaim, toClaim);
this.checkPlayerGameMode(user, fromClaim, toClaim); this.checkPlayerGameMode(user, fromClaim, toClaim);
this.checkPlayerGodMode(user, fromClaim, toClaim); this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim); this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false); this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false); // Exit command - Don't run if to claim is child of from claim
this.runPlayerCommands(toClaim, user, true); 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) { if (!GDOptions.PLAYER_COMMAND_ENTER && !GDOptions.PLAYER_COMMAND_EXIT) {
return; return;
} }
if (user.getInternalPlayerData().runningPlayerCommands) {
return;
}
user.getInternalPlayerData().runningPlayerCommands = true;
List<String> rawCommandList = new ArrayList<>(); List<String> rawCommandList = new ArrayList<>();
Set<Context> contexts = new HashSet<>(); Set<Context> contexts = new HashSet<>();
if (player.getUniqueId().equals(claim.getOwnerUniqueId())) { if (player.getUniqueId().equals(claim.getOwnerUniqueId())) {
@ -404,6 +430,7 @@ public class CommonEntityEventHandler {
if (rawCommandList != null) { if (rawCommandList != null) {
runCommand(claim, player, rawCommandList, false); runCommand(claim, player, rawCommandList, false);
} }
user.getInternalPlayerData().runningPlayerCommands = false;
} }
private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) { private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) {
@ -418,6 +445,10 @@ public class CommonEntityEventHandler {
String args = command.replace(baseCommand + " ", ""); String args = command.replace(baseCommand + " ", "");
baseCommand = baseCommand.replace("\\", "").replace("/", ""); baseCommand = baseCommand.replace("\\", "").replace("/", "");
args = args.replace("%player%", player.getName()); args = args.replace("%player%", player.getName());
// Handle WorldEdit commands
if (command.startsWith("//") && !baseCommand.startsWith("/")) {
baseCommand = "/" + baseCommand;
}
if (runAsConsole) { if (runAsConsole) {
CommandHelper.executeCommand(Bukkit.getConsoleSender(), baseCommand, args); CommandHelper.executeCommand(Bukkit.getConsoleSender(), baseCommand, args);
} else { } else {
@ -504,7 +535,7 @@ public class CommonEntityEventHandler {
return; return;
} }
final Player player = user.getOnlinePlayer(); final Player player = user.getOnlinePlayer();
if (player == null || !player.isInvulnerable()) { if (player == null || !NMSUtil.getInstance().isInvulnerable(player)) {
// Most likely Citizens NPC // Most likely Citizens NPC
return; return;
} }

View File

@ -217,6 +217,9 @@ public class PlayerEventHandler implements Listener {
if (claim.isInTown()) { if (claim.isInTown()) {
playerData.inTown = true; 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(); 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()); final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
playerData.lastPvpTimestamp = null; 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) @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) { if (source instanceof Player && flag != Flags.COLLIDE_BLOCK && flag != Flags.COLLIDE_ENTITY) {
this.addPlayerContexts((Player) source, contexts, flag); this.addPlayerContexts((Player) source, contexts, flag);
} }
if (!(source instanceof Player) && target instanceof Player && user != null && user.getOnlinePlayer() != null && !user.getUniqueId().equals(((Player) target).getUniqueId())) { if (!(source instanceof Player) && user != null && user.getOnlinePlayer() != null) {
// add source player context boolean addPlayerContext = false;
// this allows users to block all pvp actions when direct source isn't a player if (!(target instanceof Player)) {
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer()))); 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) { if (source instanceof Block && event instanceof EntityChangeBlockEvent && flag == Flags.BLOCK_MODIFY) {
final EntityChangeBlockEvent entityChangeBlockEvent = (EntityChangeBlockEvent) event; final EntityChangeBlockEvent entityChangeBlockEvent = (EntityChangeBlockEvent) event;
@ -727,7 +735,7 @@ public class GDPermissionManager implements PermissionManager {
} }
String id = BlockTypeRegistryModule.getInstance().getNMSKey(block); String id = BlockTypeRegistryModule.getInstance().getNMSKey(block);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) { 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) { if (tileType != null) {
id = tileType.getId(); id = tileType.getId();
} }
@ -752,7 +760,7 @@ public class GDPermissionManager implements PermissionManager {
} }
String id = BlockTypeRegistryModule.getInstance().getNMSKey(blockstate); String id = BlockTypeRegistryModule.getInstance().getNMSKey(blockstate);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) { 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) { if (tileType != null) {
id = tileType.getId(); id = tileType.getId();
} }
@ -851,9 +859,15 @@ public class GDPermissionManager implements PermissionManager {
String id = ItemTypeRegistryModule.getInstance().getNMSKey(itemstack); String id = ItemTypeRegistryModule.getInstance().getNMSKey(itemstack);
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) { 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) { 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)) { 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_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_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_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_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_CLAIM_BASE = "griefdefender.admin.claim.command.delete.base";
public static final String COMMAND_DELETE_CLAIMS = "griefdefender.admin.claim.command.delete-claims"; 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); Map<Set<Context>, Map<String, List<String>>> optionMap = this.getPermanentOptions(holder);
for (Entry<Set<Context>, Map<String, String>> mapEntry : optionMap.entrySet()) { for (Entry<Set<Context>, Map<String, List<String>>> mapEntry : optionMap.entrySet()) {
for (Context context : mapEntry.getKey()) { for (Context context : mapEntry.getKey()) {
if (context.getKey().equalsIgnoreCase("gd_claim") && context.getValue().equalsIgnoreCase(claimUniqueId.toString())) { if (context.getKey().equalsIgnoreCase("gd_claim") && context.getValue().equalsIgnoreCase(claimUniqueId.toString())) {
this.clearPermissions(holder, mapEntry.getKey()); this.clearPermissions(holder, mapEntry.getKey());
@ -440,7 +440,7 @@ public class LuckPermsProvider implements PermissionProvider {
return cachedData.getPermissionMap(); 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(); ImmutableContextSet set = this.getLPContexts(contexts).immutableCopy();
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder); final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) { 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(); final QueryOptions query = QueryOptions.builder(QueryMode.CONTEXTUAL).option(DataQueryOrderFunction.KEY, DEFAULT_DATA_QUERY_ORDER).context(set).build();
CachedMetaData cachedData = permissionHolder.getCachedData().getMetaData(query); CachedMetaData cachedData = permissionHolder.getCachedData().getMetaData(query);
// TODO // TODO
Map<String, String> metaMap = new HashMap<>(); Map<String, List<String>> metaMap = new HashMap<>();
for (Map.Entry<String, List<String>> mapEntry : cachedData.getMeta().entrySet()) { 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; return metaMap;
} }
@ -543,14 +543,14 @@ public class LuckPermsProvider implements PermissionProvider {
return transientPermissionMap; 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); final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) { if (permissionHolder == null) {
return new HashMap<>(); return new HashMap<>();
} }
final Collection<Node> nodes = permissionHolder.data().toCollection(); 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) { for (Node node : nodes) {
if (node.getType() != NodeType.META) { if (node.getType() != NodeType.META) {
continue; continue;
@ -558,26 +558,35 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node; final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts()); 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) { if (metaEntry == null) {
metaEntry = new HashMap<>(); 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); permanentPermissionMap.put(contexts, metaEntry);
} else { } 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; 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); final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) { if (permissionHolder == null) {
return new HashMap<>(); return new HashMap<>();
} }
final Collection<Node> nodes = permissionHolder.transientData().toCollection(); 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) { for (Node node : nodes) {
if (node.getType() != NodeType.META) { if (node.getType() != NodeType.META) {
continue; continue;
@ -585,64 +594,27 @@ public class LuckPermsProvider implements PermissionProvider {
final MetaNode metaNode = (MetaNode) node; final MetaNode metaNode = (MetaNode) node;
final Set<Context> contexts = getGPContexts(node.getContexts()); 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) { if (metaEntry == null) {
metaEntry = new HashMap<>(); 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); permanentPermissionMap.put(contexts, metaEntry);
} else { } 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; 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) { public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder); final PermissionHolder permissionHolder = this.getLuckPermsHolder(holder);
if (permissionHolder == null) { if (permissionHolder == null) {

View File

@ -138,21 +138,24 @@ public interface PermissionProvider {
* Clears all permissions that contain {@link Context} * Clears all permissions that contain {@link Context}
* from passed holder. * from passed holder.
* *
* @param claim The claim * @param holder The holder
* @param context The context
*/ */
void clearPermissions(GDPermissionHolder holder, Context context); void clearPermissions(GDPermissionHolder holder, Context context);
/** /**
* Clears all permissions that contain {@link Context}'s * 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); void clearPermissions(GDPermissionHolder holder, Set<Context> contexts);
/** /**
* Checks if holder has permission. * Checks if holder has permission.
* *
* @param holder The holder
* @param permission The permission * @param permission The permission
* @return whether the holder has permission * @return whether the holder has permission
*/ */
@ -174,7 +177,7 @@ public interface PermissionProvider {
* @param contexts The contexts required * @param contexts The contexts required
* @return An immutable map of cached options or empty if none. * @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. * Gets all persisted permissions.
@ -205,7 +208,7 @@ public interface PermissionProvider {
* @param holder The holder * @param holder The holder
* @return An immutable map of persisted options or empty if none. * @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. * Gets all transient options with associated contexts of holder.
@ -213,23 +216,7 @@ public interface PermissionProvider {
* @param holder The holder * @param holder The holder
* @return An immutable map of transient options or empty if none. * @return An immutable map of transient options or empty if none.
*/ */
Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder); Map<Set<Context>, Map<String, List<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);
/** /**
* Gets all persisted permissions, including inherited nodes, with associated contexts of 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 @Override
public Map<String, String> getOptions(GDPermissionHolder holder, Set<Context> contexts) { public Map<String, List<String>> getOptions(GDPermissionHolder holder, Set<Context> contexts) {
return holderToPEXSubject(holder).getOptions(contextsGDToPEX(contexts)); //return holderToPEXSubject(holder).getOptions(contextsGDToPEX(contexts));
return new HashMap<>();
} }
@Override @Override
@ -367,23 +368,15 @@ public class PermissionsExProvider implements PermissionProvider {
} }
@Override @Override
public Map<Set<Context>, Map<String, String>> getPermanentOptions(GDPermissionHolder holder) { public Map<Set<Context>, Map<String, List<String>>> getPermanentOptions(GDPermissionHolder holder) {
return tKeys(holderToPEXSubject(holder).data().get().getAllOptions()); //return tKeys(holderToPEXSubject(holder).data().get().getAllOptions());
return new HashMap<>();
} }
@Override @Override
public Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder) { public Map<Set<Context>, Map<String, List<String>>> getTransientOptions(GDPermissionHolder holder) {
return tKeys(holderToPEXSubject(holder).transientData().get().getAllOptions()); //return tKeys(holderToPEXSubject(holder).transientData().get().getAllOptions());
} return new HashMap<>();
@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));
} }
@Override @Override

View File

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

View File

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

View File

@ -79,7 +79,7 @@ public class ClaimBlockTask extends BukkitRunnable {
if ((currentTotal + accruedBlocks) > playerData.getMaxAccruedClaimBlocks()) { if ((currentTotal + accruedBlocks) > playerData.getMaxAccruedClaimBlocks()) {
playerData.setAccruedClaimBlocks(playerData.getMaxAccruedClaimBlocks()); playerData.setAccruedClaimBlocks(playerData.getMaxAccruedClaimBlocks());
playerData.lastAfkCheckLocation = player.getLocation(); playerData.lastAfkCheckLocation = player.getLocation();
return; continue;
} }
playerData.setAccruedClaimBlocks(playerData.getAccruedClaimBlocks() + accruedBlocks); 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.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim; import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager; import com.griefdefender.claim.GDClaimManager;
import com.griefdefender.configuration.GriefDefenderConfig;
import com.griefdefender.economy.GDPaymentTransaction; import com.griefdefender.economy.GDPaymentTransaction;
import com.griefdefender.event.GDCauseStackManager;
import com.griefdefender.event.GDTaxClaimEvent; import com.griefdefender.event.GDTaxClaimEvent;
import com.griefdefender.permission.GDPermissionManager; import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.GDPermissionUser;
@ -61,10 +59,10 @@ import java.util.UUID;
public class TaxApplyTask extends BukkitRunnable { public class TaxApplyTask extends BukkitRunnable {
Economy economy; private static Economy economy;
public TaxApplyTask() { public TaxApplyTask() {
this.economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi(); economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
int taxHour = GriefDefenderPlugin.getGlobalConfig().getConfig().economy.taxApplyHour; int taxHour = GriefDefenderPlugin.getGlobalConfig().getConfig().economy.taxApplyHour;
long delay = TaskUtil.computeDelay(taxHour, 0, 0); long delay = TaskUtil.computeDelay(taxHour, 0, 0);
this.runTaskTimer(GDBootstrap.getInstance(), delay, 1728000L); this.runTaskTimer(GDBootstrap.getInstance(), delay, 1728000L);
@ -73,8 +71,8 @@ public class TaxApplyTask extends BukkitRunnable {
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
@Override @Override
public void run() { public void run() {
if (this.economy == null) { if (economy == null) {
this.economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi(); economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();
} }
for (World world : Bukkit.getWorlds()) { for (World world : Bukkit.getWorlds()) {
if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUID())) { 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 GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(playerData.getUniqueId());
final OfflinePlayer player = user.getOfflinePlayer(); final OfflinePlayer player = user.getOfflinePlayer();
double taxRate = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Double.class), user, Options.TAX_RATE, claim); 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(); final double taxBalance = claim.getEconomyData().getTaxBalance();
taxRate = event.getTaxRate(); taxRate = event.getTaxRate();
taxOwed = taxBalance + (claim.getClaimBlocks() * taxRate); 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()) { if (!response.transactionSuccess()) {
final Instant localNow = Instant.now(); final Instant localNow = Instant.now();
Instant taxPastDueDate = claim.getEconomyData().getTaxPastDueDate(); Instant taxPastDueDate = claim.getEconomyData().getTaxPastDueDate();
@ -170,7 +168,7 @@ public class TaxApplyTask extends BukkitRunnable {
.getEconomyData() .getEconomyData()
.addPaymentTransaction(new GDPaymentTransaction(TransactionType.TAX, TransactionResultType.SUCCESS, Instant.now(), taxOwed)); .addPaymentTransaction(new GDPaymentTransaction(TransactionType.TAX, TransactionResultType.SUCCESS, Instant.now(), taxOwed));
if (town.getEconomyAccountId().isPresent()) { if (town.getEconomyAccountId().isPresent()) {
this.economy.bankDeposit(town.getEconomyAccountId().get().toString(), taxOwed); economy.bankDeposit(town.getEconomyAccountId().get().toString(), taxOwed);
} }
} }
claim.getData().save(); claim.getData().save();

View File

@ -104,6 +104,31 @@ public class EconomyUtil {
instance = new 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) { public EconomyResponse withdrawFunds(OfflinePlayer player, double funds) {
final Double balance = this.vaultProvider.getApi().getBalance(player); final Double balance = this.vaultProvider.getApi().getBalance(player);
if (funds < 0) { if (funds < 0) {

View File

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

View File

@ -75,6 +75,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
@ -373,4 +374,34 @@ public class PlayerUtil {
return claim; 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": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.12.2", "name": "com.griefdefender:adapter:1.12.2",
"sha1": "a2dc91c2f88c19743fd0ae0a56fd5a66807be23b", "sha1": "9350289c71b1bf1e285dc15a3b4f2009023db3ae",
"path": "com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20210101.002548-59.jar", "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-20210101.002548-59.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", "name": "com.griefdefender:api:1.0.0",
@ -42,21 +42,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.13.2", "name": "com.griefdefender:adapter:1.13.2",
"sha1": "909b2226df074a8a557eff3807527704dfcc7c1a", "sha1": "854b3e6b5d94b5d4b9f0392858123041c860f836",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20210101.002246-57.jar", "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-20210101.002246-57.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.14.2", "name": "com.griefdefender:adapter:1.14.2",
"sha1": "d23791e720f7f225c469d10cbde04ea972f8f725", "sha1": "6f638a64099128bae726b0a644f49338399bd958",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20210101.004044-57.jar", "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-20210101.004044-57.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.14.3", "name": "com.griefdefender:adapter:1.14.3",
"sha1": "b583a2b1478f6cceddd73f7537c567dddef88269", "sha1": "1bf95706a45fce471714ef8733816f648243837f",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20210101.001718-59.jar", "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-20210101.001718-59.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.14.4", "name": "com.griefdefender:adapter:1.14.4",
"sha1": "f198c2d3284df26b37f8bebde06c52c25adc497f", "sha1": "1744b2962c74912b6c0745d75550ca374a2c0d81",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20210101.001540-57.jar", "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-20210101.001540-57.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.15.2", "name": "com.griefdefender:adapter:1.15.2",
"sha1": "4130d6349f5d666bca4bb7663debb3ee0facbfaa", "sha1": "77a4e2d849d26c2b4c888f35f5b2b9d1de17b1ec",
"path": "com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20210101.001123-40.jar", "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-20210101.001123-40.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.15", "name": "com.griefdefender:adapter:1.15",
"sha1": "278cacea6b2e11f208085e95bc3e5cae23cb47e6", "sha1": "b35127c49c436ad710313369bc35c91977b647a4",
"path": "com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20210101.001354-40.jar", "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-20210101.001354-40.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.16.1", "name": "com.griefdefender:adapter:1.16.1",
"sha1": "35ca9f23b6258d4d519657c38a33861734312cba", "sha1": "3d638213ae52c0a55749d8e0764afab33e53e8f4",
"path": "com/griefdefender/adapter/1.16.1-SNAPSHOT/adapter-1.16.1-20210101.000900-21.jar", "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-20210101.000900-21.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.16.2", "name": "com.griefdefender:adapter:1.16.2",
"sha1": "2120729220d0a9d834398759a8bd5b85aaae0908", "sha1": "9c7386be3b14d87500375005b68d4a7c1d947afb",
"path": "com/griefdefender/adapter/1.16.2-SNAPSHOT/adapter-1.16.2-20210101.000516-14.jar", "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-20210101.000516-14.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.16.4", "name": "com.griefdefender:adapter:1.16.4",
"sha1": "839c9998f0baf77155a7adf3a693117649253b8d", "sha1": "0b477824841be8d813b591b9ab46cb40f78ce4db",
"path": "com/griefdefender/adapter/1.16.4-SNAPSHOT/adapter-1.16.4-20210101.000151-15.jar", "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-20210101.000151-15.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", "name": "com.griefdefender:api:1.0.0",
@ -48,21 +48,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

@ -3,9 +3,9 @@
"libraries": [ "libraries": [
{ {
"name": "com.griefdefender:adapter:1.8.8", "name": "com.griefdefender:adapter:1.8.8",
"sha1": "f26ea115bb8b504e4ec448a16008f1ec46d0f1d3", "sha1": "027d23621f322901c6a2e0ed9876f5e03f22505f",
"path": "com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20210101.002757-57.jar", "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-20210101.002757-57.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", "name": "com.griefdefender:api:1.0.0",
@ -42,21 +42,21 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "d640d058f08da1be6b4483ac7a665d0b4bb22044", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190617.211117-148.jar", "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-20190617.211117-148.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", "name": "co.aikar:acf-bukkit:0.5.0-SNAPSHOT",
"sha1": "0af5d53de31ebf4e19100cc0654b88cc9c9c07fb", "sha1": "c6af96c6bddccfcbb9f71a54c21499d21c0b0c95",
"path": "co/aikar/acf-bukkit/0.5.0-SNAPSHOT/acf-bukkit-0.5.0-20190607.112608-152.jar", "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-20190607.112608-152.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", "name": "co.aikar:acf-paper:0.5.0-SNAPSHOT",
"sha1": "5df2f2f0c7190f4b867af20ff57f9fde012a4e2c", "sha1": "f9ceedfcec233886f7d658adfa0a0c708825aa60",
"path": "co/aikar/acf-paper/0.5.0-SNAPSHOT/acf-paper-0.5.0-20190607.112622-147.jar", "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-20190607.112622-147.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",

View File

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

View File

@ -72,11 +72,11 @@ GriefDefender {
trapped="Teleportuje w bezpieczne miejsce w przypadku utknięcia." trapped="Teleportuje w bezpieczne miejsce w przypadku utknięcia."
trust-access="Pozwala graczowi na interakcje z działką poza schowkami i ekwipunkiem." 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-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="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 (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 (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-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="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 (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 (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="Usuwa grupę z listy dostępu do działki."
untrust-group-all="Usuwa grupę z list dostępu do wszystkich działek." untrust-group-all="Usuwa grupę z list dostępu do wszystkich działek."
untrust-player="Usuwa gracza z listy dostępu do działki." 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-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-override-permission="&fFlaga &r{flag}&f jest obecnie &cnadpisana&f przez administratora.\nKliknij aby usunąć."
flag-ui-return-flags="Powrót do flag" flag-ui-return-flags="Powrót do flag"
label-accessors=Goście label-accessors=Gość
label-all=Wszystko label-all=Wszystko
label-area=Obszar label-area=Obszar
label-available=Dostępne label-available=Dostępne
@ -527,7 +527,7 @@ GriefDefender {
label-children=dziedziczące label-children=dziedziczące
label-claim=Działka label-claim=Działka
label-confirm=Potwierdź label-confirm=Potwierdź
label-containers=Pojemniki label-containers=Magazynier
label-context=Kontekst label-context=Kontekst
label-created=Stworzone label-created=Stworzone
label-day=Dzień label-day=Dzień
@ -804,7 +804,7 @@ GriefDefender {
title-builder=BUDOWNICZY title-builder=BUDOWNICZY
title-buy=KUP title-buy=KUP
title-claim=DZIAŁKA title-claim=DZIAŁKA
title-container=POJEMNIK title-container=MAGAZYNIER
title-default=DOMYŚLNE title-default=DOMYŚLNE
title-group=GROUP title-group=GROUP
title-inherit=DZIEDZICZENIE title-inherit=DZIEDZICZENIE
@ -828,7 +828,7 @@ GriefDefender {
trust-click-show-list="Kliknij aby wyświetlić zaufanych graczy i grupy." 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-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-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-list-header="Sprecyzowane permisje są tu:"
trust-no-claims="&cNie masz działek, żeby nadać permisje." trust-no-claims="&cNie masz działek, żeby nadać permisje."
trust-plugin-cancel="&cNie można nadać praw {target}&c. Plugin odmówił." trust-plugin-cancel="&cNie można nadać praw {target}&c. Plugin odmówił."

View File

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

View File

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

View File

@ -115,11 +115,12 @@ sourceSets {
dependencies { dependencies {
compileOnly(project(path: ":GriefDefenderAPI")) compileOnly(project(path: ":GriefDefenderAPI"))
compileOnly fileTree(dir: 'libs', include: ['*.jar'])
compile project (':common') compile project (':common')
compileOnly "com.griefdefender:adapter-sponge:$adapterSpongeVersion" compileOnly "com.griefdefender:adapter-sponge:$adapterSpongeVersion"
compileOnly "com.griefdefender:reflect-helper:1.0" compileOnly "com.griefdefender:reflect-helper:1.0"
// Sponge // Sponge
apiCompile "org.spongepowered:spongeapi:$apiVersion" //apiCompile "org.spongepowered:spongeapi:$apiVersion"
compileOnly ("org.spongepowered:spongecommon:$commonVersion:dev") { compileOnly ("org.spongepowered:spongecommon:$commonVersion:dev") {
exclude module: 'testplugins' exclude module: 'testplugins'
@ -128,10 +129,10 @@ dependencies {
compileOnly ("io.github.nucleuspowered:nucleus-api:1.14.1-S7.1"){ compileOnly ("io.github.nucleuspowered:nucleus-api:1.14.1-S7.1"){
exclude module: 'spongeapi' exclude module: 'spongeapi'
} }
compile "com.github.rojo8399:PlaceholderAPI:4.5.1" //compile "com.github.randombyte-developer:PlaceholderAPI:4.5.1"
compile "com.github.bloodmc:mcclans-api:develop-SNAPSHOT" //compile "com.github.bloodmc:mcclans-api:develop-SNAPSHOT"
compileOnly "com.sk89q.worldedit:worldedit-core:6.1.4-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" compileOnly "us.dynmap:dynmap-api:3.0-SNAPSHOT"
// required for bootstrap // required for bootstrap
@ -156,10 +157,10 @@ dependencies {
compileOnly "org.jetbrains:annotations:17.0.0" compileOnly "org.jetbrains:annotations:17.0.0"
compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72" compileOnly "org.jetbrains.kotlin:kotlin-stdlib:1.3.72"
compileOnly "org.ow2.asm:asm-debug-all:5.2" compileOnly "org.ow2.asm:asm-debug-all:5.2"
compileOnly "org.spongepowered:configurate-core:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-core:3.7.2"
compileOnly "org.spongepowered:configurate-gson:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-gson:3.7.2"
compileOnly "org.spongepowered:configurate-hocon:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-hocon:3.7.2"
compileOnly "org.spongepowered:configurate-yaml:3.7-SNAPSHOT" compileOnly "org.spongepowered:configurate-yaml:3.7.2"
compileOnly "net.kyori:event-api:3.0.0" compileOnly "net.kyori:event-api:3.0.0"
compileOnly "net.kyori:event-method:3.0.0" compileOnly "net.kyori:event-method:3.0.0"
compileOnly "net.kyori:event-method-asm: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 townChat = false;
public boolean lockPlayerDeathDrops = false; public boolean lockPlayerDeathDrops = false;
public boolean trappedRequest = false; public boolean trappedRequest = false;
public boolean runningPlayerCommands = false;
public List<Component> chatLines = new ArrayList<>(); public List<Component> chatLines = new ArrayList<>();
public Instant recordChatTimestamp; public Instant recordChatTimestamp;
public Instant commandInputTimestamp; public Instant commandInputTimestamp;

View File

@ -384,7 +384,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
overrideContexts.add(claim.getOverrideClaimContext()); overrideContexts.add(claim.getOverrideClaimContext());
Map<String, OptionData> filteredContextMap = new HashMap<>(); 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(); 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)))) { 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()); 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(); final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) { if (contextSet.contains(ClaimContexts.GLOBAL_DEFAULT_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_DEFAULT_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue()); 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()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.DEFAULT, mapEntry.getValue());
} }
if (displayType != MenuType.DEFAULT) { if (displayType != MenuType.DEFAULT) {
if (claim.isTown() || isAdmin) { //if (claim.isTown() || isAdmin) {
if (contextSet.contains(claim.getContext())) { if (contextSet.contains(claim.getContext())) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.CLAIM, mapEntry.getValue());
} }
} //}
if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) { if (contextSet.contains(ClaimContexts.GLOBAL_OVERRIDE_CONTEXT) || (!claim.isWilderness() && contextSet.contains(ClaimContexts.USER_OVERRIDE_CONTEXT))) {
this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue()); this.addFilteredContexts(src, filteredContextMap, contextSet, MenuType.OVERRIDE, mapEntry.getValue());
} }
@ -452,7 +452,7 @@ public abstract class ClaimOptionBase extends BaseCommand {
Collections.reverse(inheritParents); Collections.reverse(inheritParents);
for (Claim current : inheritParents) { for (Claim current : inheritParents) {
GDClaim currentClaim = (GDClaim) current; 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(); final Set<Context> contextSet = mapEntry.getKey();
if (contextSet.contains(currentClaim.getContext())) { if (contextSet.contains(currentClaim.getContext())) {
inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue())); inheritPermissionMap.put(mapEntry.getKey(), new ClaimClickData(currentClaim, mapEntry.getValue()));
@ -518,10 +518,10 @@ public abstract class ClaimOptionBase extends BaseCommand {
paginationList.sendTo(player, activePage); 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 Player player = src.getOnlinePlayer();
final GDPlayerData playerData = src.getInternalPlayerData(); 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); final Option option = OptionRegistryModule.getInstance().getById(permissionEntry.getKey()).orElse(null);
if (option == null) { if (option == null) {
continue; continue;
@ -544,10 +544,21 @@ public abstract class ClaimOptionBase extends BaseCommand {
} }
} }
final OptionData optionData = filteredContextMap.get(permissionEntry.getKey()); 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) { if (optionData != null) {
optionData.addContexts(option, permissionEntry.getValue(), type, contexts); optionData.addContexts(option, optionValue, type, contexts);
} else { } 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; 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( final Vector3i lesserBoundary = new Vector3i(
location.getBlockX() - radius, location.getBlockX() - radius,
minClaimLevel, minClaimLevel,

View File

@ -33,6 +33,8 @@ import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Optional; import co.aikar.commands.annotation.Optional;
import co.aikar.commands.annotation.Subcommand; import co.aikar.commands.annotation.Subcommand;
import co.aikar.commands.annotation.Syntax; import co.aikar.commands.annotation.Syntax;
import com.flowpowered.math.vector.Vector3i;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.griefdefender.GDPlayerData; import com.griefdefender.GDPlayerData;
import com.griefdefender.GriefDefenderPlugin; import com.griefdefender.GriefDefenderPlugin;
@ -45,6 +47,7 @@ import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager; import com.griefdefender.claim.GDClaimManager;
import com.griefdefender.configuration.MessageStorage; import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.internal.pagination.PaginationList; import com.griefdefender.internal.pagination.PaginationList;
import com.griefdefender.internal.util.VecHelper;
import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.GDPermissionUser;
import com.griefdefender.permission.GDPermissions; import com.griefdefender.permission.GDPermissions;
import com.griefdefender.text.action.GDCallbackHolder; 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.TextColor;
import net.kyori.text.format.TextDecoration; import net.kyori.text.format.TextDecoration;
import net.kyori.text.serializer.plain.PlainComponentSerializer; 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.entity.living.player.Player;
import org.spongepowered.api.service.economy.account.Account; import org.spongepowered.api.service.economy.account.Account;
@ -127,8 +132,13 @@ public class CommandClaimRent extends BaseCommand {
} }
return; 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; return;
} else if (subCommand.equalsIgnoreCase("clearbalance")) { } else if (subCommand.equalsIgnoreCase("clearbalance")) {
if (args.length != 2) { if (args.length != 2) {

View File

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

View File

@ -25,7 +25,11 @@
package com.griefdefender.configuration.category; package com.griefdefender.configuration.category;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; 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.Setting;
import ninja.leaping.configurate.objectmapping.serialize.ConfigSerializable; 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." @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.") + "\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<>(); 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() { public ModCategory() {
this.blockIdConvertList.add("gregtech:machine");
this.blockIdConvertList.add("ic2:te"); this.blockIdConvertList.add("ic2:te");
this.tileIdNbtMap.put("gregtech:machine", "MetaId");
} }
public boolean convertBlockId(String id) { public boolean convertBlockId(String id) {
@ -47,4 +64,17 @@ public class ModCategory {
} }
return false; 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<>(); Set<Context> flagContexts = new HashSet<>();
for (String part : parts) { for (String part : parts) {
String[] split = part.split("="); String[] split = part.split("=");
String key = split[0]; String key = split[0].toLowerCase();
String value = split[1]; String value = split[1].toLowerCase();
// Handle linked Flag // Handle linked Flag
if (key.equalsIgnoreCase("flag")) { if (key.equalsIgnoreCase("flag")) {
final String flagName = value; final String flagName = value;
@ -108,11 +108,6 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
} }
flagContexts.add(new Context(key, value)); flagContexts.add(new Context(key, value));
break; break;
case "used_item":
case "item_name":
case ContextKeys.STATE:
flagContexts.add(new Context(key, value));
break;
case "server": case "server":
case "world": case "world":
case ContextKeys.CLAIM_DEFAULT: 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 // 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."); throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.\nContext '" + key + "' can only be used for the definition.");
default: 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; return;
} }
if (source instanceof Player && !hasFakePlayer && tileEntity == null) {
// handle in normal events
GDTimings.BLOCK_PRE_EVENT.stopTimingIfSync();
return;
}
if (sourceLocation != null) { if (sourceLocation != null) {
GDPlayerData playerData = null; GDPlayerData playerData = null;
if (user != null) { if (user != null) {
@ -790,29 +784,6 @@ public class BlockEventHandler {
return; 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); ItemStackSnapshot itemSnapshot = event.getContext().get(EventContextKeys.USED_ITEM).orElse(null);
if (itemSnapshot != null) { if (itemSnapshot != null) {
if (itemSnapshot.getType().equals(ItemTypes.BUCKET)) { if (itemSnapshot.getType().equals(ItemTypes.BUCKET)) {
@ -824,6 +795,29 @@ public class BlockEventHandler {
GDClaim sourceClaim = null; GDClaim sourceClaim = null;
LocatableBlock locatable = null; LocatableBlock locatable = null;
final User user = CauseContextHelper.getEventUser(event); 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) { if (source instanceof LocatableBlock) {
locatable = (LocatableBlock) source; locatable = (LocatableBlock) source;
if (user != null && user instanceof Player) { 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.data.key.Keys;
import org.spongepowered.api.entity.Entity; import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.Item; 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.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameMode; import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.entity.living.player.gamemode.GameModes; import org.spongepowered.api.entity.living.player.gamemode.GameModes;
import org.spongepowered.api.entity.projectile.Projectile; 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.MoveEntityEvent;
import org.spongepowered.api.event.entity.living.humanoid.player.RespawnPlayerEvent;
import org.spongepowered.api.item.inventory.ItemStack; import org.spongepowered.api.item.inventory.ItemStack;
import org.spongepowered.api.text.Text; import org.spongepowered.api.text.Text;
import org.spongepowered.api.world.Location; import org.spongepowered.api.world.Location;
@ -103,11 +107,15 @@ public class CommonEntityEventHandler {
this.storage = GriefDefenderPlugin.getInstance().dataStore; 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) { if (targetEntity instanceof Item || targetEntity instanceof Projectile) {
return true; return true;
} }
if ((!GDFlags.ENTER_CLAIM && !GDFlags.EXIT_CLAIM) || fromLocation.getBlockPosition().equals(toLocation.getBlockPosition())) {
return true;
}
Player player = null; Player player = null;
GDPermissionUser user = null; GDPermissionUser user = null;
boolean onMount = false; 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 != null) {
if (user.getInternalPlayerData().trappedRequest) { if (user.getInternalPlayerData().trappedRequest) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_CANCEL_MOVE); GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_TRAPPED_CANCEL_MOVE);
@ -137,6 +142,11 @@ public class CommonEntityEventHandler {
user.getInternalPlayerData().teleportDelay = 0; user.getInternalPlayerData().teleportDelay = 0;
} }
} }
if (player != null && user != null) {
if (event instanceof MoveEntityEvent.Teleport && user.getInternalPlayerData().runningPlayerCommands) {
return true;
}
}
World world = targetEntity.getWorld(); World world = targetEntity.getWorld();
if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUniqueId())) { if (!GriefDefenderPlugin.getInstance().claimsEnabledForWorld(world.getUniqueId())) {
@ -168,27 +178,32 @@ public class CommonEntityEventHandler {
// enter // enter
if (GDFlags.ENTER_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, toLocation, toClaim, Flags.ENTER_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) { if (GDFlags.ENTER_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, toLocation, toClaim, Flags.ENTER_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) {
gpEvent.cancelled(true); gpEvent.cancelled(true);
if (event != null) { if (event != null && event instanceof Cancellable) {
event.setCancelled(true); ((Cancellable) event).setCancelled(true);
} }
} }
// exit // exit
if (GDFlags.EXIT_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, fromLocation, fromClaim, Flags.EXIT_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) { if (GDFlags.EXIT_CLAIM && GDPermissionManager.getInstance().getFinalPermission(event, fromLocation, fromClaim, Flags.EXIT_CLAIM, targetEntity, targetEntity, user) == Tristate.FALSE) {
gpEvent.cancelled(true); gpEvent.cancelled(true);
if (event != null) { if (event != null && event instanceof Cancellable) {
event.setCancelled(true); ((Cancellable) event).setCancelled(true);
} }
} }
GriefDefender.getEventManager().post(gpEvent); GriefDefender.getEventManager().post(gpEvent);
if (gpEvent.cancelled()) { if (gpEvent.cancelled()) {
if (event != null) { if (event != null && event instanceof Cancellable) {
event.setCancelled(true); ((Cancellable) event).setCancelled(true);
} }
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) { if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove(); 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; return false;
} }
} }
@ -237,10 +252,11 @@ public class CommonEntityEventHandler {
GDBorderClaimEvent gpEvent = new GDBorderClaimEvent(targetEntity, fromClaim, toClaim); GDBorderClaimEvent gpEvent = new GDBorderClaimEvent(targetEntity, fromClaim, toClaim);
if (user != null && toClaim.isUserTrusted(user, TrustTypes.ACCESSOR)) { if (user != null && toClaim.isUserTrusted(user, TrustTypes.ACCESSOR)) {
final GDPlayerData playerData = user.getInternalPlayerData();
GriefDefender.getEventManager().post(gpEvent); GriefDefender.getEventManager().post(gpEvent);
if (gpEvent.cancelled()) { if (gpEvent.cancelled()) {
event.setCancelled(true); if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) { if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove(); targetEntity.remove();
} }
@ -248,6 +264,11 @@ public class CommonEntityEventHandler {
if (player != null && cancelMessage != null) { if (player != null && cancelMessage != null) {
TextAdapter.sendComponent(player, cancelMessage); 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; return false;
} else { } else {
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix; final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
@ -294,8 +315,14 @@ public class CommonEntityEventHandler {
this.checkPlayerGodMode(user, fromClaim, toClaim); this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim); this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false); this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false); // Exit command - Don't run if to claim is child of from claim
this.runPlayerCommands(toClaim, user, true); 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); TextAdapter.sendComponent(player, cancelMessage);
} }
event.setCancelled(true); if (event instanceof Cancellable) {
((Cancellable) event).setCancelled(true);
}
if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) { if (!(targetEntity instanceof Player) && EntityUtils.getOwnerUniqueId(targetEntity) == null) {
targetEntity.remove(); 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(); GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false; return false;
} }
@ -346,20 +379,22 @@ public class CommonEntityEventHandler {
if (player != null) { if (player != null) {
if (GDFlags.ENTITY_RIDING && onMount) { if (GDFlags.ENTITY_RIDING && onMount) {
if (GDPermissionManager.getInstance().getFinalPermission(event, targetEntity.getLocation(), toClaim, Flags.ENTITY_RIDING, player, targetEntity, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) { if (GDPermissionManager.getInstance().getFinalPermission(event, targetEntity.getLocation(), toClaim, Flags.ENTITY_RIDING, player, targetEntity, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
event.setCancelled(true); if (event instanceof Cancellable) {
Location<World> safeLocation = Sponge.getGame().getTeleportHelper() ((Cancellable) event).setCancelled(true);
.getSafeLocation(fromLocation, 80, 0) Location<World> safeLocation = Sponge.getGame().getTeleportHelper()
.orElseGet(() -> Sponge.getGame().getTeleportHelper() .getSafeLocation(fromLocation, 80, 0)
.getSafeLocation(fromLocation, 80, 6) .orElseGet(() -> Sponge.getGame().getTeleportHelper()
.orElse(world.getSpawnLocation()) .getSafeLocation(fromLocation, 80, 6)
); .orElse(world.getSpawnLocation())
targetEntity.getBaseVehicle().clearPassengers(); );
player.setTransform(player.getTransform().setLocation(safeLocation)); targetEntity.getBaseVehicle().clearPassengers();
GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync(); player.setTransform(player.getTransform().setLocation(safeLocation));
return false; GDTimings.ENTITY_MOVE_EVENT.stopTimingIfSync();
return false;
}
} }
} }
final GDPlayerData playerData = user.getInternalPlayerData();
final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix; final boolean showGpPrefix = GriefDefenderPlugin.getGlobalConfig().getConfig().message.enterExitShowGdPrefix;
Component welcomeMessage = gpEvent.getEnterMessage().orElse(null); Component welcomeMessage = gpEvent.getEnterMessage().orElse(null);
if (welcomeMessage != null && !welcomeMessage.equals(TextComponent.empty()) && !fromClaim.isParent(toClaim)) { if (welcomeMessage != null && !welcomeMessage.equals(TextComponent.empty()) && !fromClaim.isParent(toClaim)) {
@ -404,8 +439,14 @@ public class CommonEntityEventHandler {
this.checkPlayerGodMode(user, fromClaim, toClaim); this.checkPlayerGodMode(user, fromClaim, toClaim);
this.checkPlayerWalkSpeed(user, fromClaim, toClaim); this.checkPlayerWalkSpeed(user, fromClaim, toClaim);
this.checkPlayerWeather(user, fromClaim, toClaim, false); this.checkPlayerWeather(user, fromClaim, toClaim, false);
this.runPlayerCommands(fromClaim, user, false); // Exit command - Don't run if to claim is child of from claim
this.runPlayerCommands(toClaim, user, true); 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) { if (!GDOptions.PLAYER_COMMAND_ENTER && !GDOptions.PLAYER_COMMAND_EXIT) {
return; return;
} }
if (user.getInternalPlayerData().runningPlayerCommands) {
return;
}
user.getInternalPlayerData().runningPlayerCommands = true;
List<String> rawCommandList = new ArrayList<>(); List<String> rawCommandList = new ArrayList<>();
Set<Context> contexts = new HashSet<>(); Set<Context> contexts = new HashSet<>();
if (player.getUniqueId().equals(claim.getOwnerUniqueId())) { if (player.getUniqueId().equals(claim.getOwnerUniqueId())) {
@ -461,6 +506,7 @@ public class CommonEntityEventHandler {
if (rawCommandList != null) { if (rawCommandList != null) {
runCommand(claim, player, rawCommandList, false); runCommand(claim, player, rawCommandList, false);
} }
user.getInternalPlayerData().runningPlayerCommands = false;
} }
private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) { private void runCommand(GDClaim claim, Player player, List<String> rawCommandList, boolean runAsConsole) {
@ -475,6 +521,10 @@ public class CommonEntityEventHandler {
String args = command.replace(baseCommand + " ", ""); String args = command.replace(baseCommand + " ", "");
baseCommand = baseCommand.replace("\\", "").replace("/", ""); baseCommand = baseCommand.replace("\\", "").replace("/", "");
args = args.replace("%player%", player.getName()); args = args.replace("%player%", player.getName());
// Handle WorldEdit commands
if (command.startsWith("//") && !baseCommand.startsWith("/")) {
baseCommand = "/" + baseCommand;
}
if (runAsConsole) { if (runAsConsole) {
CommandHelper.executeCommand(Sponge.getServer().getConsole(), baseCommand, args); CommandHelper.executeCommand(Sponge.getServer().getConsole(), baseCommand, args);
} else { } 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) { if (GDPermissionManager.getInstance().getFinalPermission(event, entity.getLocation(), targetClaim, flag, actualSource, entity, user, TrustTypes.ACCESSOR, true) == Tristate.FALSE) {
return false; return false;
} }

View File

@ -58,6 +58,8 @@ import com.griefdefender.event.GDCauseStackManager;
import com.griefdefender.internal.provider.GDWorldEditProvider; import com.griefdefender.internal.provider.GDWorldEditProvider;
import com.griefdefender.internal.registry.BlockTypeRegistryModule; import com.griefdefender.internal.registry.BlockTypeRegistryModule;
import com.griefdefender.internal.registry.GDBlockType; 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.BlockUtil;
import com.griefdefender.internal.util.NMSUtil; import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.internal.visual.GDClaimVisual; import com.griefdefender.internal.visual.GDClaimVisual;
@ -81,12 +83,14 @@ import net.kyori.text.event.HoverEvent;
import net.kyori.text.serializer.gson.GsonComponentSerializer; import net.kyori.text.serializer.gson.GsonComponentSerializer;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
import org.spongepowered.api.block.BlockSnapshot; import org.spongepowered.api.block.BlockSnapshot;
import org.spongepowered.api.block.BlockState;
import org.spongepowered.api.block.BlockTypes; import org.spongepowered.api.block.BlockTypes;
import org.spongepowered.api.block.tileentity.Sign; import org.spongepowered.api.block.tileentity.Sign;
import org.spongepowered.api.block.tileentity.TileEntity; import org.spongepowered.api.block.tileentity.TileEntity;
import org.spongepowered.api.command.CommandMapping; import org.spongepowered.api.command.CommandMapping;
import org.spongepowered.api.command.CommandSource; import org.spongepowered.api.command.CommandSource;
import org.spongepowered.api.data.key.Keys; 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.HandType;
import org.spongepowered.api.data.type.HandTypes; import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.Entity; 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.channel.type.FixedMessageChannel;
import org.spongepowered.api.text.format.TextColors; import org.spongepowered.api.text.format.TextColors;
import org.spongepowered.api.text.serializer.TextSerializers; 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.Chunk;
import org.spongepowered.api.world.Location; import org.spongepowered.api.world.Location;
import org.spongepowered.api.world.World; import org.spongepowered.api.world.World;
@ -481,6 +483,9 @@ public class PlayerEventHandler {
if (claim.isInTown()) { if (claim.isInTown()) {
playerData.inTown = true; 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(); 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()); final GDPlayerData playerData = GriefDefenderPlugin.getInstance().dataStore.getOrCreatePlayerData(event.getTargetEntity().getWorld(), event.getTargetEntity().getUniqueId());
playerData.lastPvpTimestamp = null; 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) @Listener(order = Order.FIRST, beforeModifications = true)
@ -910,7 +923,7 @@ public class PlayerEventHandler {
GDPlayerData playerData = this.dataStore.getOrCreatePlayerData(world, player.getUniqueId()); GDPlayerData playerData = this.dataStore.getOrCreatePlayerData(world, player.getUniqueId());
Location<World> location = player.getLocation(); Location<World> location = player.getLocation();
GDClaim claim = this.dataStore.getClaimAtPlayer(playerData, location); 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); event.setCancelled(true);
} }
@ -1032,7 +1045,7 @@ public class PlayerEventHandler {
final HandType handType = event.getHandType(); final HandType handType = event.getHandType();
final ItemStack itemInHand = player.getItemInHand(handType).orElse(ItemStack.empty()); 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); event.setCancelled(true);
return; return;
} }
@ -1126,7 +1139,7 @@ public class PlayerEventHandler {
final HandType handType = event.getHandType(); final HandType handType = event.getHandType();
final ItemStack itemInHand = player.getItemInHand(handType).orElse(ItemStack.empty()); 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); event.setCancelled(true);
return; return;
} }
@ -1246,11 +1259,10 @@ public class PlayerEventHandler {
final BlockSnapshot blockSnapshot = context.get(EventContextKeys.BLOCK_HIT).orElse(BlockSnapshot.NONE); final BlockSnapshot blockSnapshot = context.get(EventContextKeys.BLOCK_HIT).orElse(BlockSnapshot.NONE);
final Vector3d interactPoint = event.getInteractionPoint().orElse(null); final Vector3d interactPoint = event.getInteractionPoint().orElse(null);
final Entity entity = context.get(EventContextKeys.ENTITY_HIT).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() : blockSnapshot != BlockSnapshot.NONE ? blockSnapshot.getLocation().get()
: interactPoint != null ? new Location<World>(world, interactPoint) : interactPoint != null ? new Location<World>(world, interactPoint)
: player.getLocation(); : null;
final GDClaim claim = this.dataStore.getClaimAt(location);
final Flag flag = primaryEvent ? Flags.INTERACT_ITEM_PRIMARY : Flags.INTERACT_ITEM_SECONDARY; final Flag flag = primaryEvent ? Flags.INTERACT_ITEM_PRIMARY : Flags.INTERACT_ITEM_SECONDARY;
@ -1267,6 +1279,23 @@ public class PlayerEventHandler {
return event; 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) { 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, Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM,
ImmutableMap.of( ImmutableMap.of(
@ -1282,12 +1311,19 @@ public class PlayerEventHandler {
return event; return event;
} }
if (blockSnapshot != null && blockSnapshot.getState().getType() != BlockTypes.AIR) { if (blockHit != null && blockHit.getType() != BlockTypes.AIR) {
if (GDPermissionManager.getInstance().getFinalPermission(event, location, claim, flag, itemInHand, blockSnapshot, player, TrustTypes.ACCESSOR, true) == Tristate.FALSE) { 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, final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of( ImmutableMap.of(
"item", itemInHand.getType().getId(), "item", itemInHand.getType().getId(),
"block", blockSnapshot.getState().getType().getId())); "block", blockHit.getType().getId()));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message); GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
if (event instanceof InteractBlockEvent.Secondary) { if (event instanceof InteractBlockEvent.Secondary) {
((InteractBlockEvent.Secondary) event).setUseItemResult(SpongeUtil.getSpongeTristate(Tristate.FALSE)); ((InteractBlockEvent.Secondary) event).setUseItemResult(SpongeUtil.getSpongeTristate(Tristate.FALSE));
@ -1298,11 +1334,11 @@ public class PlayerEventHandler {
return event; return event;
} }
if (!itemInHand.isEmpty() && itemInHand.getType().equals(ItemTypes.BUCKET)) { 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, final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of( ImmutableMap.of(
"item", itemInHand.getType().getId(), "item", itemInHand.getType().getId(),
"block", blockSnapshot.getState().getType().getId())); "block", blockHit.getType().getId()));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message); GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
event.setCancelled(true); event.setCancelled(true);
lastInteractItemCancelled = 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*/) { if (playerData != null && claim.getData() != null && claim.getData().isExpired() /*&& GriefDefenderPlugin.getActiveConfig(player.getWorld().getProperties()).getConfig().claim.bankTaxSystem*/) {
playerData.sendTaxExpireMessage(player, claim); playerData.sendTaxExpireMessage(player, claim);
} else if (playerItem == null || playerItem == ItemTypes.NONE || playerItem.isEmpty()) { } 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, final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_BLOCK,
ImmutableMap.of( ImmutableMap.of(
"player", claim.getOwnerName(), "player", claim.getOwnerName(),
"block", blockSnapshot.getState().getType().getId())); "block", blockId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message); GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
} else { } 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, final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.PERMISSION_INTERACT_ITEM_BLOCK,
ImmutableMap.of( ImmutableMap.of(
"item", playerItem.getType().getId(), "item", playerItem.getType().getId(),
"block", blockSnapshot.getState().getType().getId())); "block", blockId));
GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message); GriefDefenderPlugin.sendClaimDenyMessage(claim, player, message);
} }
if (handType == HandTypes.MAIN_HAND) { 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.block.NotifyNeighborBlockEvent;
import org.spongepowered.api.event.cause.EventContextKey; import org.spongepowered.api.event.cause.EventContextKey;
import org.spongepowered.api.event.cause.EventContextKeys; 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.DamageSource;
import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource; import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource;
import org.spongepowered.api.item.ItemType; 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) { if (source instanceof Player && !isFakePlayer && flag != Flags.COLLIDE_BLOCK && flag != Flags.COLLIDE_ENTITY) {
this.addPlayerContexts((Player) source, contexts); this.addPlayerContexts((Player) source, contexts);
} }
if (!(source instanceof Player) && target instanceof Player && user != null && user.getOnlinePlayer() != null && !user.getUniqueId().equals(((Player) target).getUniqueId())) { if (!(source instanceof Player) && user != null && user.getOnlinePlayer() != null) {
// add source player context boolean addPlayerContext = false;
// this allows users to block all pvp actions when direct source isn't a player if (!(target instanceof Player)) {
contexts.add(new Context(ContextKeys.SOURCE, this.getPermissionIdentifier(user.getOnlinePlayer()))); 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); final Set<Context> sourceContexts = this.getPermissionContexts((GDClaim) claim, source, true);
@ -709,7 +718,17 @@ public class GDPermissionManager implements PermissionManager {
if (obj != null) { if (obj != null) {
if (obj instanceof Item) { 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); return populateEventSourceTargetContext(contexts, id, isSource);
} else if (obj instanceof Entity) { } else if (obj instanceof Entity) {
final Entity targetEntity = (Entity) obj; final Entity targetEntity = (Entity) obj;
@ -751,29 +770,34 @@ public class GDPermissionManager implements PermissionManager {
} else if (obj instanceof BlockSnapshot) { } else if (obj instanceof BlockSnapshot) {
final BlockSnapshot blockSnapshot = (BlockSnapshot) obj; final BlockSnapshot blockSnapshot = (BlockSnapshot) obj;
final BlockState blockstate = blockSnapshot.getState(); final BlockState blockstate = blockSnapshot.getState();
final Location<World> location = blockSnapshot.getLocation().orElse(null);
String id = blockstate.getType().getId(); String id = blockstate.getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) { if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) {
final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(blockSnapshot); final GDTileType tileType = TileEntityTypeRegistryModule.getInstance().getByBlock(location);
if (tileType != null) { if (tileType != null) {
id = tileType.getId(); 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)) { if (this.isObjectIdBanned(claim, id, BanType.BLOCK)) {
return null; 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); return populateEventSourceTargetContext(contexts, id, isSource);
} else if (obj instanceof LocatableBlock) { } else if (obj instanceof LocatableBlock) {
final LocatableBlock locatableBlock = (LocatableBlock) obj; final LocatableBlock locatableBlock = (LocatableBlock) obj;
@ -850,7 +874,9 @@ public class GDPermissionManager implements PermissionManager {
String id = itemstack.getType().getId(); String id = itemstack.getType().getId();
if (GriefDefenderPlugin.getGlobalConfig().getConfig().mod.convertBlockId(id)) { 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)) { if (this.isObjectIdBanned(claim, id, BanType.ITEM)) {
return null; return null;
@ -900,6 +926,9 @@ public class GDPermissionManager implements PermissionManager {
} else if (obj instanceof DamageSource) { } else if (obj instanceof DamageSource) {
final DamageSource damageSource = (DamageSource) obj; final DamageSource damageSource = (DamageSource) obj;
String id = damageSource.getType().getId(); String id = damageSource.getType().getId();
if (damageSource.getType() == DamageTypes.CUSTOM) {
id = NMSUtil.getInstance().getDamageSourceId(damageSource);
}
if (!id.contains(":")) { if (!id.contains(":")) {
id = "minecraft:" + id; id = "minecraft:" + id;
} }

View File

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

View File

@ -174,7 +174,7 @@ public interface PermissionProvider {
* @param contexts The contexts required * @param contexts The contexts required
* @return An immutable map of cached options or empty if none. * @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. * Gets all persisted permissions.
@ -205,7 +205,7 @@ public interface PermissionProvider {
* @param holder The holder * @param holder The holder
* @return An immutable map of persisted options or empty if none. * @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. * Gets all transient options with associated contexts of holder.
@ -213,23 +213,7 @@ public interface PermissionProvider {
* @param holder The holder * @param holder The holder
* @return An immutable map of transient options or empty if none. * @return An immutable map of transient options or empty if none.
*/ */
Map<Set<Context>, Map<String, String>> getTransientOptions(GDPermissionHolder holder); Map<Set<Context>, Map<String, List<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);
/** /**
* Gets all persisted permissions, including inherited nodes, with associated contexts of 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) { 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<Set<Context>, Map<String, List<String>>> permanentOptions = PermissionUtil.getInstance().getPermanentOptions(GriefDefenderPlugin.DEFAULT_HOLDER);
final Map<String, String> options = permanentOptions.get(contexts); final Map<String, List<String>> options = permanentOptions.get(contexts);
GriefDefenderPlugin.getInstance().executor.execute(() -> { GriefDefenderPlugin.getInstance().executor.execute(() -> {
for (Map.Entry<String, String> optionEntry : defaultOptions.entrySet()) { for (Map.Entry<String, String> optionEntry : defaultOptions.entrySet()) {
final Option option = OptionRegistryModule.getInstance().getById(optionEntry.getKey()).orElse(null); 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 // Transient options are checked first so we must ignore setting if a persisted option exists
boolean foundPersisted = false; boolean foundPersisted = false;
if (options != null) { if (options != null) {
for (Entry<String, String> mapEntry : options.entrySet()) { for (Entry<String, List<String>> mapEntry : options.entrySet()) {
if (mapEntry.getKey().equalsIgnoreCase(option.getPermission())) { if (mapEntry.getKey().equalsIgnoreCase(option.getPermission())) {
foundPersisted = true; foundPersisted = true;
break; break;

View File

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

View File

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

View File

@ -105,9 +105,11 @@ public class RentApplyTask implements Runnable {
} }
final Set<Claim> children = claim.getChildren(true); final Set<Claim> children = claim.getChildren(true);
for (Claim child : children) { for (Claim child : children) {
for (UUID uuid : child.getEconomyData().getRenters()) { if (child.getEconomyData().isRented()) {
final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(uuid); for (UUID uuid : child.getEconomyData().getRenters()) {
handleClaimRent((GDClaim) child, user); 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(); final double taxBalance = claim.getEconomyData().getTaxBalance();
taxRate = event.getTaxRate(); taxRate = event.getTaxRate();
taxOwed = taxBalance + (claim.getClaimBlocks() * taxRate); 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) { if (result.getResult() != ResultType.SUCCESS) {
final Instant localNow = Instant.now(); final Instant localNow = Instant.now();
Instant taxPastDueDate = claim.getEconomyData().getTaxPastDueDate(); 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.Entity;
import org.spongepowered.api.entity.living.Living; import org.spongepowered.api.entity.living.Living;
import org.spongepowered.api.entity.living.player.User; 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.Event;
import org.spongepowered.api.event.cause.Cause; import org.spongepowered.api.event.cause.Cause;
import org.spongepowered.api.event.cause.EventContext; import org.spongepowered.api.event.cause.EventContext;
@ -75,8 +76,15 @@ public class CauseContextHelper {
if (cause != null) { if (cause != null) {
user = cause.first(User.class).orElse(null); user = cause.first(User.class).orElse(null);
if (user == null) { if (user == null) {
// check for FakePlayer in context // check projectile source
user = cause.getContext().get(EventContextKeys.FAKE_PLAYER).orElse(null); 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)) { if (user != null && user instanceof Entity && NMSUtil.getInstance().isFakePlayer((Entity) user)) {
fakePlayer = 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.monster.Monster;
import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.service.economy.Currency; 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.account.Account;
import org.spongepowered.api.service.economy.transaction.ResultType; import org.spongepowered.api.service.economy.transaction.ResultType;
import org.spongepowered.api.service.economy.transaction.TransactionResult; import org.spongepowered.api.service.economy.transaction.TransactionResult;
@ -92,6 +93,7 @@ import java.util.function.Consumer;
public class EconomyUtil { public class EconomyUtil {
private final EconomyService economyService = GriefDefenderPlugin.getInstance().economyService.orElse(null);
private static EconomyUtil instance; private static EconomyUtil instance;
public static EconomyUtil getInstance() { public static EconomyUtil getInstance() {
@ -102,6 +104,35 @@ public class EconomyUtil {
instance = new 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) { 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); GDClaim claim = new GDClaim(player.getWorld(), point1, point2, claimType, player.getUniqueId(), cuboid);
claim.parent = (GDClaim) parent; 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) { 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) { public boolean containsDefaultContext(Set<Context> contexts) {
@ -139,7 +139,7 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getPermissions(holder, contexts); 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); return PERMISSION_PROVIDER.getOptions(holder, contexts);
} }
@ -155,22 +155,14 @@ public class PermissionUtil {
return PERMISSION_PROVIDER.getTransientPermissions(holder); 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); 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); 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) { public Map<Set<Context>, Map<String, Boolean>> getAllPermissions(GDPermissionHolder holder) {
return PERMISSION_PROVIDER.getAllPermissions(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.api.permission.option.type.WeatherTypes;
import com.griefdefender.cache.PermissionHolderCache; import com.griefdefender.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim; import com.griefdefender.claim.GDClaim;
import com.griefdefender.internal.util.BlockUtil;
import com.griefdefender.internal.util.NMSUtil; import com.griefdefender.internal.util.NMSUtil;
import com.griefdefender.permission.GDPermissionUser; import com.griefdefender.permission.GDPermissionUser;
import net.kyori.text.Component; import net.kyori.text.Component;
@ -69,6 +68,7 @@ import org.spongepowered.api.world.World;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -326,4 +326,51 @@ public class PlayerUtil {
return claim; 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": [ "libraries": [
{ {
"name": "com.griefdefender:adapter-sponge:1.12.2", "name": "com.griefdefender:adapter-sponge:1.12.2",
"sha1": "beb43662d4d04825a35dcdf21eb16b18424e93d6", "sha1": "da88e2f8cbe0535f01753087464dd3b7918048a4",
"path": "com/griefdefender/adapter-sponge/1.12.2-SNAPSHOT/adapter-sponge-1.12.2-20210101.010513-16.jar", "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-20210101.010513-16.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", "name": "com.griefdefender:api:1.0.0",
@ -41,15 +41,15 @@
}, },
{ {
"name": "co.aikar:acf-core:0.5.0-SNAPSHOT", "name": "co.aikar:acf-core:0.5.0-SNAPSHOT",
"sha1": "72aff420c92e4cb381ba8bccceb0b37cba7a9496", "sha1": "5f81a496db139cd72d00d31789b57b4788c505f8",
"path": "co/aikar/acf-core/0.5.0-SNAPSHOT/acf-core-0.5.0-20190722.233344-152.jar", "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-20190722.233344-152.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", "name": "co.aikar:acf-sponge:0.5.0-SNAPSHOT",
"sha1": "c73413c215cfad8f0c2306ed156df74ebdf18d47", "sha1": "8fde3bc49f21414ca81070271e43c5e9a04c3e08",
"path": "co/aikar/acf-sponge/0.5.0-SNAPSHOT/acf-sponge-0.5.0-20190722.233405-145.jar", "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-20190722.233405-145.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", "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" "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", "name": "org.spongepowered:configurate-core:3.7.2",
"sha1": "e596c439ac71fa2ea5c48f8ba97a7dc6f4c77b16", "sha1": "985223b13c7da64116a7e20203b2904023eeb1db",
"path": "org/spongepowered/configurate-core/3.7-SNAPSHOT/configurate-core-3.7-20190531.182437-11.jar", "path": "org/spongepowered/configurate-core/3.7.2/configurate-core-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-gson:3.7.2",
"sha1": "265a94f16583621f497eeecc356f35f983484dde", "sha1": "0431733e80d7dfc62b37962c2723bba5c996548f",
"path": "org/spongepowered/configurate-gson/3.7-SNAPSHOT/configurate-gson-3.7-20190531.182438-11.jar", "path": "org/spongepowered/configurate-gson/3.7.2/configurate-gson-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-hocon:3.7.2",
"sha1": "af48dcb9e7456f2f81a633f62ae5c55e5215c4af", "sha1": "a5e49f57ae8f5e61dbae48a158a28343e7d6f707",
"path": "org/spongepowered/configurate-hocon/3.7-SNAPSHOT/configurate-hocon-3.7-20190531.182439-11.jar", "path": "org/spongepowered/configurate-hocon/3.7.2/configurate-hocon-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "org.spongepowered:configurate-yaml:3.7.2",
"sha1": "c66110f5ae0098c450e048f78b322590d2e24d06", "sha1": "a0c3eec370aa9bdec3f450f842edcb03f6d42be2",
"path": "org/spongepowered/configurate-yaml/3.7-SNAPSHOT/configurate-yaml-3.7-20190531.182442-11.jar", "path": "org/spongepowered/configurate-yaml/3.7.2/configurate-yaml-3.7.2.jar",
"relocate": "ninja.leaping.configurate:configurate", "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", "name": "com.typesafe:config:1.3.1",