First round of fixes for 1.2.3 release.

* Fix funds not being returned after claim create failure in economy
mode.
* Fix '/gd option claim' command with global options such as
'economy-block-cost'.
* Fix schematics not loading on startup.
* Fix claim cleanup task.
* Remove item frame defaults.
* Add '/claimcreate <radius> [type]' command. Used to create a claim
around player.
* Add new direction parameter 'all' for commands '/claimexpand' and
'/claimcontract'.
* Add confirmation to '/cfr' command.

Fixes #59
Fixes #63
Fixes #64
Fixes #65
Fixes #66
This commit is contained in:
bloodshot 2019-10-30 10:37:44 -04:00
parent 7d6654aa39
commit 90eed11bea
22 changed files with 316 additions and 103 deletions

View File

@ -144,7 +144,7 @@ public class GDPlayerData implements PlayerData {
public boolean dataInitialized = false;
public boolean showVisualFillers = true;
public boolean restoreAbandonClaim = false;
public boolean useRestoreSchematic = false;
private boolean checkedDimensionHeight = false;
public GDPlayerData(UUID worldUniqueId, UUID playerUniqueId, PlayerStorageData playerStorage, GriefDefenderConfig<?> activeConfig, Set<Claim> claims) {

View File

@ -89,6 +89,7 @@ import com.griefdefender.command.CommandClaimBuy;
import com.griefdefender.command.CommandClaimBuyBlocks;
import com.griefdefender.command.CommandClaimClear;
import com.griefdefender.command.CommandClaimContract;
import com.griefdefender.command.CommandClaimCreate;
import com.griefdefender.command.CommandClaimCuboid;
import com.griefdefender.command.CommandClaimDelete;
import com.griefdefender.command.CommandClaimDeleteAll;
@ -573,6 +574,7 @@ public class GriefDefenderPlugin {
manager.registerCommand(new CommandClaimBuyBlocks());
manager.registerCommand(new CommandClaimClear());
manager.registerCommand(new CommandClaimContract());
manager.registerCommand(new CommandClaimCreate());
manager.registerCommand(new CommandClaimCuboid());
manager.registerCommand(new CommandClaimDelete());
manager.registerCommand(new CommandClaimDeleteAll());
@ -723,6 +725,7 @@ public class GriefDefenderPlugin {
tabList.add("west");
tabList.add("up");
tabList.add("down");
tabList.add("all");
return ImmutableList.copyOf(tabList);
});
manager.getCommandCompletions().registerCompletion("gdclaimtypes", c -> {

View File

@ -238,6 +238,7 @@ public class MessageCache {
public Component FLAG_DESCRIPTION_PROJECTILE_IMPACT_BLOCK;
public Component FLAG_DESCRIPTION_PROJECTILE_IMPACT_ENTITY;
public Component FLAG_RESET_SUCCESS;
public Component FLAG_RESET_WARNING;
public Component FLAG_UI_CLICK_ALLOW;
public Component FLAG_UI_CLICK_DENY;
public Component FLAG_UI_CLICK_REMOVE;
@ -595,6 +596,7 @@ public class MessageCache {
FLAG_DESCRIPTION_PROJECTILE_IMPACT_BLOCK = MessageStorage.MESSAGE_DATA.getMessage("flag-description-projectile-impact-block");
FLAG_DESCRIPTION_PROJECTILE_IMPACT_ENTITY = MessageStorage.MESSAGE_DATA.getMessage("flag-description-projectile-impact-entity");
FLAG_RESET_SUCCESS = MessageStorage.MESSAGE_DATA.getMessage("flag-reset-success");
FLAG_RESET_WARNING = MessageStorage.MESSAGE_DATA.getMessage("flag-reset-warning");
FLAG_UI_CLICK_ALLOW = MessageStorage.MESSAGE_DATA.getMessage("flag-ui-click-allow");
FLAG_UI_CLICK_DENY = MessageStorage.MESSAGE_DATA.getMessage("flag-ui-click-deny");
FLAG_UI_CLICK_REMOVE = MessageStorage.MESSAGE_DATA.getMessage("flag-ui-click-remove");

View File

@ -2827,6 +2827,7 @@ public class GDClaim implements Claim {
if (!result.successful()) {
return result;
}
requiredFunds = claimCost * claim.getOwnerEconomyBlockCost();
} else {
final int remainingClaimBlocks = playerData.getRemainingClaimBlocks() - claimCost;
if (remainingClaimBlocks < 0) {

View File

@ -200,10 +200,12 @@ public abstract class ClaimOptionBase extends BaseCommand {
break;
}
}
if (contextSet.isEmpty()) {
type = MenuType.CLAIM;
if (!option.isGlobal()) {
contextSet.add(claim.getContext());
if (contextSet.isEmpty() ) {
type = MenuType.CLAIM;
}
}
contextSet.add(claim.getContext());
GDCauseStackManager.getInstance().pushCause(player);
PermissionUtil.getInstance().setOptionValue(this.subject, option.getPermission(), value, contextSet);
TextAdapter.sendComponent(player, MessageStorage.MESSAGE_DATA.getMessage(MessageStorage.OPTION_SET_TARGET,

View File

@ -166,9 +166,9 @@ public class CommandClaimAbandon extends BaseCommand {
}
GDClaimManager claimManager = GriefDefenderPlugin.getInstance().dataStore.getClaimWorldManager(player.getWorld().getUID());
playerData.restoreAbandonClaim = event.isRestoring();
playerData.useRestoreSchematic = event.isRestoring();
final ClaimResult claimResult = claimManager.deleteClaimInternal(claim, abandonTopClaim);
playerData.restoreAbandonClaim = false;
playerData.useRestoreSchematic = false;
if (!claimResult.successful()) {
TextAdapter.sendComponent(player, event.getMessage().orElse(GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.ABANDON_FAILED,
ImmutableMap.of("result", claimResult.getMessage().orElse(TextComponent.of(claimResult.getResultType().toString()))))));

View File

@ -148,9 +148,9 @@ public class CommandClaimAbandonAll extends BaseCommand {
}
}
playerData.restoreAbandonClaim = event.isRestoring();
playerData.useRestoreSchematic = event.isRestoring();
GriefDefenderPlugin.getInstance().dataStore.abandonClaimsForPlayer(user, allowedClaims);
playerData.restoreAbandonClaim = false;
playerData.useRestoreSchematic = false;
if (GriefDefenderPlugin.getInstance().isEconomyModeEnabled()) {
final Economy economy = GriefDefenderPlugin.getInstance().getVaultProvider().getApi();

View File

@ -84,33 +84,43 @@ public class CommandClaimContract extends BaseCommand {
return;
}
final BlockFace face = direction == null ? PlayerUtil.getInstance().getBlockFace(player) : PlayerUtil.getInstance().getBlockFace(direction);
if (face == null || amount <= 0) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if ((face == BlockFace.UP || face == BlockFace.DOWN) && !claim.cuboid) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
final Vector3i lesser = claim.lesserBoundaryCorner;
final Vector3i greater = claim.greaterBoundaryCorner;
Vector3i point1 = null;
Vector3i point2 = null;
if (face == BlockFace.EAST) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX() - amount, greater.getY(), greater.getZ());
} else if (face == BlockFace.WEST) {
point1 = new Vector3i(lesser.getX() + amount, lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.NORTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ() + amount);
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.SOUTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ() - amount);
if (direction == null || !direction.equalsIgnoreCase("all")) {
final BlockFace face = direction == null ? PlayerUtil.getInstance().getBlockFace(player) : PlayerUtil.getInstance().getBlockFace(direction);
if (face == null || amount <= 0) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if ((face == BlockFace.UP || face == BlockFace.DOWN) && !claim.cuboid) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if (face == BlockFace.EAST) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX() - amount, greater.getY(), greater.getZ());
} else if (face == BlockFace.WEST) {
point1 = new Vector3i(lesser.getX() + amount, lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.NORTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ() + amount);
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.SOUTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ() - amount);
}
} else {
point1 = new Vector3i(
lesser.getX() + amount,
lesser.getY(),
lesser.getZ() + amount);
point2 = new Vector3i(
greater.getX() - amount,
greater.getY(),
greater.getZ() - amount);
}
final ClaimResult result = claim.resize(point1, point2);

View File

@ -0,0 +1,147 @@
/*
* This file is part of GriefDefender, licensed under the MIT License (MIT).
*
* Copyright (c) bloodmc
* Copyright (c) contributors
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.griefdefender.command;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.flowpowered.math.vector.Vector3i;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.griefdefender.GDPlayerData;
import com.griefdefender.GriefDefenderPlugin;
import com.griefdefender.api.GriefDefender;
import com.griefdefender.api.claim.Claim;
import com.griefdefender.api.claim.ClaimResult;
import com.griefdefender.api.claim.ClaimResultType;
import com.griefdefender.api.claim.ClaimType;
import com.griefdefender.api.claim.ClaimTypes;
import com.griefdefender.api.permission.option.Options;
import com.griefdefender.api.permission.option.type.CreateModeTypes;
import com.griefdefender.cache.MessageCache;
import com.griefdefender.cache.PermissionHolderCache;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.internal.visual.ClaimVisual;
import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser;
import com.griefdefender.permission.GDPermissions;
import com.griefdefender.registry.ClaimTypeRegistryModule;
import com.griefdefender.util.EconomyUtil;
import com.griefdefender.util.PlayerUtil;
import co.aikar.commands.BaseCommand;
import co.aikar.commands.annotation.CommandAlias;
import co.aikar.commands.annotation.CommandCompletion;
import co.aikar.commands.annotation.CommandPermission;
import co.aikar.commands.annotation.Description;
import co.aikar.commands.annotation.Optional;
import co.aikar.commands.annotation.Subcommand;
import co.aikar.commands.annotation.Syntax;
import net.kyori.text.Component;
@CommandAlias("%griefdefender")
@CommandPermission(GDPermissions.CLAIM_CREATE)
public class CommandClaimCreate extends BaseCommand {
@CommandCompletion("@gddummy @gdclaimtypes @gddummy")
@CommandAlias("claimcreate")
@Description("Creates a claim around the player.")
@Syntax("<radius> [type] [player]")
@Subcommand("claim create")
public void execute(Player player, int radius, @Optional String type) {
final Location location = player.getLocation();
final World world = location.getWorld();
final int minClaimLevel = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.MIN_LEVEL);
final int maxClaimLevel = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Integer.class), player, Options.MAX_LEVEL);
if (location.getBlockY() < minClaimLevel || location.getBlockY() > maxClaimLevel) {
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CLAIM_CHEST_OUTSIDE_LEVEL,
ImmutableMap.of(
"min-level", minClaimLevel,
"max-level", maxClaimLevel));
GriefDefenderPlugin.sendMessage(player, message);
return;
}
final Vector3i lesserBoundary = new Vector3i(
location.getBlockX() - radius,
minClaimLevel,
location.getBlockZ() - radius);
final Vector3i greaterBoundary = new Vector3i(
location.getBlockX() + radius,
maxClaimLevel,
location.getBlockZ() + radius);
final GDPermissionUser user = PermissionHolderCache.getInstance().getOrCreateUser(player);
final GDPlayerData playerData = user.getInternalPlayerData();
final ClaimType claimType = ClaimTypeRegistryModule.getInstance().getById(type).orElse(ClaimTypes.BASIC);
final boolean cuboid = playerData.getClaimCreateMode() == CreateModeTypes.VOLUME;
if ((claimType == ClaimTypes.BASIC || claimType == ClaimTypes.TOWN) && GriefDefenderPlugin.getGlobalConfig().getConfig().economy.economyMode) {
EconomyUtil.getInstance().economyCreateClaimConfirmation(player, playerData, location.getBlockY(), lesserBoundary, greaterBoundary, claimType,
cuboid, playerData.claimSubdividing);
return;
}
final ClaimResult result = GriefDefender.getRegistry().createBuilder(Claim.Builder.class)
.bounds(lesserBoundary, greaterBoundary)
.cuboid(cuboid)
.owner(user.getUniqueId())
.type(claimType)
.world(world.getUID())
.build();
GDClaim gdClaim = (GDClaim) result.getClaim().orElse(null);
if (!result.successful()) {
if (result.getResultType() == ClaimResultType.OVERLAPPING_CLAIM) {
GDClaim overlapClaim = (GDClaim) result.getClaim().get();
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().CREATE_OVERLAP_SHORT);
Set<Claim> claims = new HashSet<>();
claims.add(overlapClaim);
CommandHelper.showOverlapClaims(player, claims, location.getBlockY());
} else if (result.getResultType() == ClaimResultType.CLAIM_EVENT_CANCELLED) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().CREATE_CANCEL);
} else {
GriefDefenderPlugin.sendMessage(player, GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CREATE_FAILED_RESULT,
ImmutableMap.of("reason", result.getResultType())));
}
return;
} else {
playerData.lastShovelLocation = null;
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CREATE_SUCCESS,
ImmutableMap.of(
"type", gdClaim.getFriendlyNameType(true)));
GriefDefenderPlugin.sendMessage(player, message);
if (GriefDefenderPlugin.getInstance().getWorldEditProvider() != null) {
GriefDefenderPlugin.getInstance().getWorldEditProvider().stopVisualDrag(player);
GriefDefenderPlugin.getInstance().getWorldEditProvider().visualizeClaim(gdClaim, player, playerData, false);
}
gdClaim.getVisualizer().createClaimBlockVisuals(location.getBlockY(), player.getLocation(), playerData);
gdClaim.getVisualizer().apply(player, false);
}
}
}

View File

@ -84,33 +84,43 @@ public class CommandClaimExpand extends BaseCommand {
return;
}
final BlockFace face = direction == null ? PlayerUtil.getInstance().getBlockFace(player) : PlayerUtil.getInstance().getBlockFace(direction);
if (face == null || amount <= 0) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if ((face == BlockFace.UP || face == BlockFace.DOWN) && !claim.cuboid) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
final Vector3i lesser = claim.lesserBoundaryCorner;
final Vector3i greater = claim.greaterBoundaryCorner;
Vector3i point1 = null;
Vector3i point2 = null;
if (face == BlockFace.EAST) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX() + amount, greater.getY(), greater.getZ());
} else if (face == BlockFace.WEST) {
point1 = new Vector3i(lesser.getX() - amount, lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.NORTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ() - amount);
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.SOUTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ() + amount);
if (direction == null || !direction.equalsIgnoreCase("all")) {
final BlockFace face = direction == null ? PlayerUtil.getInstance().getBlockFace(player) : PlayerUtil.getInstance().getBlockFace(direction);
if (face == null || amount <= 0) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if ((face == BlockFace.UP || face == BlockFace.DOWN) && !claim.cuboid) {
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().COMMAND_INVALID);
return;
}
if (face == BlockFace.EAST) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX() + amount, greater.getY(), greater.getZ());
} else if (face == BlockFace.WEST) {
point1 = new Vector3i(lesser.getX() - amount, lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.NORTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ() - amount);
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ());
} else if (face == BlockFace.SOUTH) {
point1 = new Vector3i(lesser.getX(), lesser.getY(), lesser.getZ());
point2 = new Vector3i(greater.getX(), greater.getY(), greater.getZ() + amount);
}
} else {
point1 = new Vector3i(
lesser.getX() - amount,
lesser.getY(),
lesser.getZ() - amount);
point2 = new Vector3i(
greater.getX() + amount,
greater.getY(),
greater.getZ() + amount);
}
final ClaimResult result = claim.resize(point1, point2);

View File

@ -32,16 +32,24 @@ import co.aikar.commands.annotation.Subcommand;
import com.google.common.collect.ImmutableMap;
import com.griefdefender.GDPlayerData;
import com.griefdefender.GriefDefenderPlugin;
import com.griefdefender.api.permission.Context;
import com.griefdefender.api.claim.Claim;
import com.griefdefender.cache.MessageCache;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.permission.GDPermissions;
import com.griefdefender.text.action.GDCallbackHolder;
import com.griefdefender.util.PermissionUtil;
import net.kyori.text.Component;
import net.kyori.text.TextComponent;
import net.kyori.text.adapter.bukkit.TextAdapter;
import net.kyori.text.event.ClickEvent;
import net.kyori.text.event.HoverEvent;
import net.kyori.text.format.TextColor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.function.Consumer;
@CommandAlias("%griefdefender")
@CommandPermission(GDPermissions.COMMAND_FLAGS_RESET)
@ -71,8 +79,23 @@ public class CommandClaimFlagReset extends BaseCommand {
return;
}
// Remove persisted data
PermissionUtil.getInstance().clearPermissions((GDClaim) claim);
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().FLAG_RESET_SUCCESS);
final Component confirmationText = TextComponent.builder()
.append(MessageCache.getInstance().FLAG_RESET_WARNING)
.append(TextComponent.builder()
.append("\n[")
.append("Confirm", TextColor.GREEN)
.append("]\n")
.clickEvent(ClickEvent.runCommand(GDCallbackHolder.getInstance().createCallbackRunCommand(createConfirmationConsumer(player, claim))))
.hoverEvent(HoverEvent.showText(MessageCache.getInstance().UI_CLICK_CONFIRM)).build())
.build();
TextAdapter.sendComponent(player, confirmationText);
}
private static Consumer<CommandSender> createConfirmationConsumer(Player player, Claim claim) {
return confirm -> {
// Remove persisted data
PermissionUtil.getInstance().clearPermissions((GDClaim) claim);
GriefDefenderPlugin.sendMessage(player, MessageCache.getInstance().FLAG_RESET_SUCCESS);
};
}
}

View File

@ -109,6 +109,7 @@ public class MessageStorage {
public static final String CLAIM_BELOW_LEVEL = "claim-below-level";
public static final String CLAIM_CHEST_OUTSIDE_LEVEL = "claim-chest-outside-level";
public static final String CLAIM_CONTEXT_NOT_FOUND = "claim-context-not-found";
public static final String CLAIM_EXPIRED_INACTIVITY = "claim-expired-inactivity";
public static final String CLAIM_FAREWELL = "claim-farewell";
public static final String CLAIM_FAREWELL_INVALID = "claim-farewell-invalid";
public static final String CLAIM_GREETING = "claim-greeting";

View File

@ -380,7 +380,6 @@ public abstract class BaseStorage {
}
private void setDefaultFlags(Set<Context> contexts, Map<String, Boolean> defaultFlags) {
final boolean defaultWildernessValue = contexts.contains(ClaimContexts.WILDERNESS_DEFAULT_CONTEXT);
GriefDefenderPlugin.getInstance().executor.execute(() -> {
for (Map.Entry<String, Boolean> mapEntry : defaultFlags.entrySet()) {
final Flag flag = FlagRegistryModule.getInstance().getById(mapEntry.getKey()).orElse(null);
@ -393,16 +392,6 @@ public abstract class BaseStorage {
contexts.add(FlagContexts.TARGET_TYPE_MONSTER);
PermissionUtil.getInstance().setTransientPermission(GriefDefenderPlugin.DEFAULT_HOLDER, GDPermissions.FLAG_BASE + "." + mapEntry.getKey(), true, contexts);
contexts.remove(FlagContexts.TARGET_TYPE_MONSTER);
// deny item frame damage by default
contexts.add(FlagContexts.TARGET_ITEM_FRAME);
PermissionUtil.getInstance().setTransientPermission(GriefDefenderPlugin.DEFAULT_HOLDER, GDPermissions.FLAG_BASE + "." + mapEntry.getKey(), defaultWildernessValue, contexts);
contexts.remove(FlagContexts.TARGET_ITEM_FRAME);
}
if (flag == Flags.INTERACT_ENTITY_SECONDARY) {
// deny item frame rotation by default
contexts.add(FlagContexts.TARGET_ITEM_FRAME);
PermissionUtil.getInstance().setTransientPermission(GriefDefenderPlugin.DEFAULT_HOLDER, GDPermissions.FLAG_BASE + "." + mapEntry.getKey(), defaultWildernessValue, contexts);
contexts.remove(FlagContexts.TARGET_ITEM_FRAME);
}
}
PermissionUtil.getInstance().refreshCachedData(GriefDefenderPlugin.DEFAULT_HOLDER);

View File

@ -240,6 +240,12 @@ public class FileStorage extends BaseStorage {
if (claimWorldManager.getWildernessClaim() == null) {
claimWorldManager.createWildernessClaim(world);
}
// Load schematics
if (GriefDefenderPlugin.getInstance().getWorldEditProvider() != null) {
GriefDefenderPlugin.getInstance().getLogger().info("Loading schematics for world " + world.getName() + "...");
GriefDefenderPlugin.getInstance().getWorldEditProvider().loadSchematics(world);
}
} catch (Exception e) {
e.printStackTrace();
}
@ -458,7 +464,7 @@ public class FileStorage extends BaseStorage {
if (GriefDefenderPlugin.getInstance().getWorldEditProvider() != null) {
final Path schematicPath = GriefDefenderPlugin.getInstance().getWorldEditProvider().getSchematicWorldMap().get(claim.getWorldUniqueId());
if (schematicPath != null && Files.exists(schematicPath.resolve(claim.getUniqueId().toString()))) {
if (ownerData != null && ownerData.restoreAbandonClaim) {
if (ownerData != null && ownerData.useRestoreSchematic) {
final ConfigBase activeConfig = GriefDefenderPlugin.getActiveConfig(claim.getWorldUniqueId()).getConfig();
if (GriefDefenderPlugin.getInstance().getWorldEditProvider() != null && activeConfig.claim.claimAutoSchematicRestore) {
final ClaimSchematic schematic = claim.getSchematics().get("__restore__");

View File

@ -24,19 +24,24 @@
*/
package com.griefdefender.task;
import com.google.common.collect.ImmutableMap;
import com.google.common.reflect.TypeToken;
import com.griefdefender.GDBootstrap;
import com.griefdefender.GDPlayerData;
import com.griefdefender.GriefDefenderPlugin;
import com.griefdefender.api.claim.Claim;
import com.griefdefender.api.claim.ClaimSchematic;
import com.griefdefender.api.permission.option.Options;
import com.griefdefender.claim.GDClaim;
import com.griefdefender.claim.GDClaimManager;
import com.griefdefender.configuration.GriefDefenderConfig;
import com.griefdefender.configuration.MessageStorage;
import com.griefdefender.internal.util.BlockUtil;
import com.griefdefender.permission.GDPermissionManager;
import com.griefdefender.permission.GDPermissionUser;
import com.griefdefender.util.PermissionUtil;
import net.kyori.text.Component;
import net.kyori.text.serializer.plain.PlainComponentSerializer;
import org.bukkit.Bukkit;
import org.bukkit.World;
@ -63,6 +68,8 @@ public class ClaimCleanupTask extends BukkitRunnable {
continue;
}
final GriefDefenderConfig<?> activeConfig = GriefDefenderPlugin.getActiveConfig(world);
final boolean schematicRestore = activeConfig.getConfig().claim.claimAutoSchematicRestore;
Iterator<Claim> iterator = new HashSet<>(claimList).iterator();
while (iterator.hasNext()) {
GDClaim claim = (GDClaim) iterator.next();
@ -75,7 +82,6 @@ public class ClaimCleanupTask extends BukkitRunnable {
continue;
}
GriefDefenderConfig<?> activeConfig = GriefDefenderPlugin.getActiveConfig(world);
int areaOfDefaultClaim = 0;
if (activeConfig.getConfig().claim.autoChestClaimBlockRadius >= 0) {
areaOfDefaultClaim = (int) Math.pow(activeConfig.getConfig().claim.autoChestClaimBlockRadius * 2 + 1, 2);
@ -88,15 +94,21 @@ public class ClaimCleanupTask extends BukkitRunnable {
if (claim.getArea() <= areaOfDefaultClaim && claimExpirationChest > 0) {
if (claimLastActive.plus(Duration.ofDays(claimExpirationChest))
.isBefore(Instant.now())) {
playerData.useRestoreSchematic = schematicRestore;
claimManager.deleteClaim(claim);
if (activeConfig.getConfig().claim.claimAutoNatureRestore) {
playerData.useRestoreSchematic = false;
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CLAIM_EXPIRED_INACTIVITY,
ImmutableMap.of(
"player", subject.getFriendlyName(),
"uuid", claim.getUniqueId().toString()));
GriefDefenderPlugin.getInstance().getLogger().info(PlainComponentSerializer.INSTANCE.serialize(message));
if (!schematicRestore && activeConfig.getConfig().claim.claimAutoNatureRestore) {
BlockUtil.getInstance().restoreClaim(claim);
}
GriefDefenderPlugin.getInstance().getLogger().info(" " + claim.getOwnerName() + "'s new player claim " + "'" + claim.getUniqueId() + "' expired.");
// remove all context permissions
PermissionUtil.getInstance().clearPermissions(claim);
}
return;
}
if (!claim.isBasicClaim()) {
@ -124,18 +136,19 @@ public class ClaimCleanupTask extends BukkitRunnable {
}
}
final ClaimSchematic schematic = claim.getSchematics().get("__restore__");
playerData.useRestoreSchematic = schematicRestore;
claimManager.deleteClaim(claim);
GriefDefenderPlugin.getInstance().getLogger().info("Removed " + claim.getOwnerName() + "'s unused claim @ "
+ claim.getLesserBoundaryCorner());
if (activeConfig.getConfig().claim.claimAutoNatureRestore) {
playerData.useRestoreSchematic = false;
final Component message = GriefDefenderPlugin.getInstance().messageData.getMessage(MessageStorage.CLAIM_EXPIRED_INACTIVITY,
ImmutableMap.of(
"player", subject.getFriendlyName(),
"uuid", claim.getUniqueId().toString()));
GriefDefenderPlugin.getInstance().getLogger().info(PlainComponentSerializer.INSTANCE.serialize(message));
if (!schematicRestore && activeConfig.getConfig().claim.claimAutoNatureRestore) {
BlockUtil.getInstance().restoreClaim(claim);
} else if (activeConfig.getConfig().claim.claimAutoSchematicRestore) {
if (schematic != null) {
schematic.apply();
}
}
// remove all context permissions
PermissionUtil.getInstance().clearPermissions(claim);
}
}
}

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.13.2",
"sha1": "d39aacdde1b7c0017e69b033f572f735bcc721cb",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20191007.192614-19.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20191007.192614-19.jar"
"sha1": "e29bb897bb2e65650019ba1d457bd2d57253e4ac",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20191030.135953-20.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20191030.135953-20.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.2",
"sha1": "c1e110c74824f314c46b31de7cc0817f223b3322",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20191007.192516-19.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20191007.192516-19.jar"
"sha1": "a1d0d15ed46106f71f0a87e3033bf4e27d2115bd",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20191030.135904-20.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20191030.135904-20.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.3",
"sha1": "6827e0ded527dfe912f9949e29fa28c09a302c0a",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20191007.192429-20.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20191007.192429-20.jar"
"sha1": "5861e4469cdfdc25a4c424727d71d15186b92441",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20191030.135827-21.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20191030.135827-21.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.4",
"sha1": "e2ca45c14cc84384cdd465105e629f97c38bfb3a",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20191007.192349-18.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20191007.192349-18.jar"
"sha1": "0e014588faa41ae12d5feb77b47b607578c73ed7",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20191030.135735-19.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20191030.135735-19.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -91,6 +91,7 @@ GriefDefender {
claim-children-warning="&6This claim includes child claims. If you're sure you want to delete it, use &f/deleteclaim&6 again."
claim-context-not-found="&cContext &f{context}&c was not found."
claim-disabled-world="&cClaims are disabled in this world."
claim-expired-inactivity="&6{player}'s &cclaim with id &f{uuid}&c has expired and has been removed due to inactivity."
claim-farewell="&aSet claim farewell to {farewell}&a."
claim-farewell-clear="&aThe claim farewell message has been cleared."
claim-farewell-invalid="&cClaim flag &f{flag}&c is invalid."
@ -363,6 +364,7 @@ GriefDefender {
flag-overridden="&cFailed to set claim flag. The flag &f{flag}&c has been overridden by an admin."
flag-override-not-supported="&cClaim type {type}&c does not support flag overrides."
flag-reset-success="&aClaim flags reset to defaults successfully."
flag-reset-warning="&6Are you sure you want to reset this claim's flag data back to default?"
flag-set-permission-target="&aSet {type}&a permission &b{permission}&a to {value}&a with contexts &7{contexts}&a on &6{target}&a."
flag-ui-click-allow="Click here to allow this flag."
flag-ui-click-deny="Click here to deny this flag."

View File

@ -90,6 +90,7 @@ GriefDefender {
claim-children-warning="&6Cette protection contient des protections enfants. Si tu es sûr de vouloir la supprimer, utilises &f/deleteclaim&6 à nouveau."
claim-context-not-found="&cContexte &f{context}&c non trouvé."
claim-disabled-world="&cLes protections sont désactivées dans ce monde."
claim-expired-inactivity="&cLa protection du joueur &6{player} avec l'id &f{uuid}&c a expiré et a été supprimé pour cause d'inactivité."
claim-farewell="&aDéfini le message de sortie à {farewell}&a."
claim-farewell-clear="&aLe message de sortie a été supprimé."
claim-farewell-invalid="&cLe flag de protection &f{flag}&c n'est pas valide."
@ -157,7 +158,7 @@ GriefDefender {
command-claimban-success-block="&cBANNISSEMENT&a du bloc avec l'id {id}&a avec succès."
command-claimban-success-entity="&cBANNISSEMENT&a de l'entité avec l'id {id}&a avec succès."
command-claimban-success-item="&cBANNISSEMENT&a de l'objet avec l'id {id}&a avec succès."
command-claimbuy-title="&bProtection à vendre"
command-claimbuy-title="&bProtection à vendre"
command-claimclear-killed="&cTué &6{amount}&a entités de type {type}&f."
command-claimclear-no-entities="&cImpossible de localiser une entité de type {type}&c."
command-claimclear-uuid-deny="&cSeulement les admins peuvent nettoyer les protections par UUID."
@ -247,7 +248,7 @@ GriefDefender {
economy-mode-block-sale-confirmation="&aDépôt de &6{deposit}&a sur votre compte. Votre solde total est de &6{balance}&a. Tu as maintenant suffisamment de fonds pour protéger jusqu'à &6{amount}&a blocs supplémentaires."
economy-mode-resize-success-2d="&aProtection redimensionnée. Ton nouveau solde est de &6{balance}&a. Tu as maintenant suffisamment de fonds pour protéger jusqu'à &6{block-amount} &ablocs supplémentaires."
economy-mode-resize-success-3d="&aProtection redimensionnée. Ton nouveau solde est de &6{balance}&a. Tu as maintenant suffisamment de fonds pour protéger jusqu'à &6{chunk-amount} &achunks supplémentaires. &f({block-amount})"
economy-not-enough-funds="&cTu n'as pas suffisamment de fond pour acheter cette zone. Ton solde actuel est '&a{balance}&c' mais tu as besoin de '&a{amount}&c' pour valider l'achat."
economy-not-enough-funds="&cTu n'as pas suffisamment de fond pour acheter cette zone. Ton solde actuel est '&a{balance}&c' mais tu as besoin de '&a{amount}&c' pour valider l'achat."
economy-not-installed="&cPlug-in d'économie non installé !"
economy-player-not-found="&cPas de compte d'économie trouvé pour le joueur &6{player}&c."
economy-remaining-funds="&aTu as &6{amount}&a disponible pour protéger du terrain."
@ -356,6 +357,7 @@ GriefDefender {
flag-overridden="&cÉchec de la définition du flag de protection. Le flag &f{flag}&c a été outrepassé par un admin."
flag-override-not-supported="&cLe type de protection {type}&c ne supporte pas les flags outrepassés."
flag-reset-success="&aFlags remit par défaut dans la protection avec succès."
flag-reset-warning="&6Es-tu sûr de vouloir remettre par défaut les paramètres de la protection ?"
flag-set-permission-target="&aDéfinis {type}&a permission &b{permission}&a avec contexte &7{contexts}&a à {value}&a sur &6{target}&a."
flag-ui-click-allow="Clique ici pour autoriser ce flag."
flag-ui-click-deny="Clique ici pour interdire ce flag."
@ -564,7 +566,7 @@ GriefDefender {
result-type-requires-owner="&cImpossible de convertir la protection {type} en {target_type}. Le propriétaire est requis."
schematic-abandon-all-restore-warning="&6Es-tu sûr de vouloir &nabandonner&6 &cTOUTES&6 tes protections ? &cL'ENSEMBLE DES DONNÉES SERA PERDUES&f !&6 Tes protections seront restorées à leur état d'origine lors de la confirmation."
schematic-abandon-restore-warning="&6Es-tu sûr de vouloir &nabandonner&6 cette protection ? &cL'ENSEMBLE DES DONNÉES SERA PERDUES&f !&6 Cette protection sera restorée à son état d'origine lors de la confirmation."
schematic-create="&aCréation d'un sauvegarde du patron..."
schematic-create="&aCréation d'un sauvegarde du patron..."
schematic-create-complete="&asauvegarde du patron complète."
schematic-create-fail="&cLe patron n'a pas pu être créé."
schematic-deleted="&aLe patron {name} a été supprimé."
@ -580,7 +582,7 @@ GriefDefender {
tax-claim-paid-partial="&aLa dette de taxe de '&6{amount}&a' a été partiellement payée. Pour lever la mise en demeure de la protection, le reste de la taxe due de '&6{balance}&a' doit être payé."
tax-info="&aTon prélèvement de taxe d'un montant de &6{amount}&a va être prélevé depuis ton compte le &b{date}&a."
tax-past-due="&cTu as actuellement un défaut de paiement passé de taxe de &a{balance}&c qui nécessite d'être payé pour le &b{date}&c. L'échec de paiement de cette taxe entrainera la perte de la propriété."
teleport-combat-cancel=&cTéléportation annulée ! Tu ne peut pas te téléporter en combat. Trouve un endroit sécurisé et réessaye."
teleport-combat-cancel="&cTéléportation annulée ! Tu ne peut pas te téléporter en combat. Trouve un endroit sécurisé et réessaye."
teleport-delay-notice="&aTu seras téléporté dans {delay} secondes. Clique sur annuler pour arrêter."
teleport-no-safe-location="&cPas de zone sécurisée trouvé dans la protection pour téléporter !\n&aClique confirm pour téléporter malgré tout ou &autilise la commande '&f/claiminfo&a' pour définir une un point d'apparition sécurisé à la place."
title-accessor=ACCÉDANT

View File

@ -90,6 +90,7 @@ GriefDefender {
claim-children-warning="&6У данного региона есть суб-регионы. Если вы уверены, что хотите удалить его, используйте &f/deleteclaim&6 ещё раз."
claim-context-not-found="&cКонтекст &f{context}&c не найден."
claim-disabled-world="&cВ этом мире нельзя создать регион."
claim-expired-inactivity="&cРегион игрока &6{player} с id &f{uuid}&c был удалён ввиду отсутствия активности."
claim-farewell="&aСообщение при выходе из региона установлено: &f{farewell}&a."
claim-farewell-clear="&aСообщение при выходе из региона удалено."
claim-farewell-invalid="&cФлаг региона &f{flag}&c не существует."
@ -360,6 +361,7 @@ GriefDefender {
flag-overridden="&cНе удалось установить &f{flag}&c - он переопределён администратором."
flag-override-not-supported="&cРегион вида &f{type}&c не поддерживает переопределение флагов."
flag-reset-success="&aФлаги региона успешно откачены на стандартные значения."
flag-reset-warning="&6Вы уверены, что хотите откатить флаги этого региона на стандартные значения?"
flag-set-permission-target="&aРазрешение &b{permission}&a вида &f{type}&a с контекстами &7{contexts}&a установлено в значение &6{value}&a для &6{target}&a."
flag-ui-click-allow="Нажмите здесь, чтобы разрешить этот флаг."
flag-ui-click-deny="Нажмите здесь, чтобы запретить этот флаг."