1.3.3 Update

* Fix startup NPE with 1.8.8 and 1.12.2.
* Fix another bug related to ghost claims.
* Fix withers using owner for block break.
* Fix ice being ignored.
* Fix context exception when using wilderness in default/override flag
  definition.
* Add support for multiple default/override contexts in flag definitions.
* Move chat input handling to lowest event priority.
* (Sponge) Fix debug not turning off properly.
* (Sponge) Fix walk/fly speed checks by rounding result.
This commit is contained in:
bloodshot 2020-06-08 14:34:07 -04:00
parent fa2b986f26
commit cf2d6047cb
22 changed files with 95 additions and 72 deletions

View File

@ -384,10 +384,13 @@ public class GDClaimManager implements ClaimManager {
}
for (Long chunkHash : chunkHashes) {
Set<Claim> claimsInChunk = this.getInternalChunksToClaimsMap().get(chunkHash);
Set<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkHash);
if (claimsInChunk != null) {
claimsInChunk.remove(claim);
}
if (claimsInChunk.isEmpty()) {
this.chunksToClaimsMap.remove(chunkHash);
}
}
}

View File

@ -88,21 +88,20 @@ public class CustomFlagGroupDefinitionCategory extends ConfigCategory {
continue;
}
Set<Context> contexts = new HashSet<>(flagDefinition.getContexts());
boolean shouldApply = false;
boolean isOverride = false;
Set<Context> defaultContexts = new HashSet<>();
Set<Context> overrideContexts = new HashSet<>();
String groupStr = null;
final Iterator<Context> iterator = contexts.iterator();
while (iterator.hasNext()) {
final Context context = iterator.next();
if (context.getKey().equalsIgnoreCase("gd_claim_default")) {
shouldApply = true;
defaultContexts.add(context);
} else if (context.getKey().equalsIgnoreCase("gd_claim_override")) {
if (context.getValue().equalsIgnoreCase("claim")) {
iterator.remove();
continue;
}
shouldApply = true;
isOverride = true;
overrideContexts.add(context);
} else if (context.getKey().equalsIgnoreCase("group")) {
groupStr = context.getValue();
}
@ -117,14 +116,19 @@ public class CustomFlagGroupDefinitionCategory extends ConfigCategory {
}
}
for (FlagData flagData : flagDefinition.getFlagData()) {
Set<Context> permissionContexts = new HashSet<>(contexts);
Set<Context> permissionContexts = new HashSet<>();
permissionContexts.addAll(flagData.getContexts());
if (shouldApply) {
if (isOverride) {
PermissionUtil.getInstance().setPermissionValue(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
} else {
PermissionUtil.getInstance().setTransientPermission(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
}
// apply defaults
for (Context context : defaultContexts) {
permissionContexts.add(context);
PermissionUtil.getInstance().setTransientPermission(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
permissionContexts.remove(context);
}
// apply overrides
for (Context context : overrideContexts) {
permissionContexts.add(context);
PermissionUtil.getInstance().setPermissionValue(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
permissionContexts.remove(context);
}
}
}

View File

@ -144,13 +144,13 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
final String value = parts[1];
if (key.equalsIgnoreCase("default") || key.equalsIgnoreCase("gd_claim_default")) {
if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin")
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town")) {
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("wilderness")) {
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.");
}
contexts.add(new Context("gd_claim_default", value));
} else if (key.equalsIgnoreCase("override") || key.equalsIgnoreCase("gd_claim_override")) {
if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin")
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("claim")) {
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("claim") && !value.equalsIgnoreCase("wilderness")) {
// try UUID
if (value.length() == 36) {
try {

View File

@ -82,18 +82,22 @@ public class CommandEventHandler implements Listener {
// CauseTracker.getInstance().getCauseStack().add(event.getSender());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChatPost(AsyncPlayerChatEvent event) {
@EventHandler(priority = EventPriority.LOWEST)
public void onPlayerChatInput(AsyncPlayerChatEvent event) {
final Player player = event.getPlayer();
final GDPlayerData playerData = this.dataStore.getOrCreatePlayerData(player.getWorld(), player.getUniqueId());
final Iterator<Player> iterator = event.getRecipients().iterator();
// check for command input
if (playerData.isWaitingForInput()) {
playerData.commandInput = event.getMessage();
playerData.commandConsumer.accept(player);
event.setCancelled(true);
return;
}
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerChatPost(AsyncPlayerChatEvent event) {
final Player player = event.getPlayer();
final Iterator<Player> iterator = event.getRecipients().iterator();
while (iterator.hasNext()) {
final Player receiver = iterator.next();

View File

@ -142,9 +142,15 @@ public class CommonBlockEventHandler {
}
}
}
if (!(source instanceof Player) && user == null && !NMSUtil.getInstance().isBlockIce(newState.getType())) {
// always allow
return;
if (!(source instanceof Player) && user == null) {
if (source instanceof Block) {
if (!NMSUtil.getInstance().isBlockIce(((Block) source).getType())) {
return;
}
} else {
// always allow
return;
}
}
final Tristate result = GDPermissionManager.getInstance().getFinalPermission(event, location, targetClaim, Flags.BLOCK_MODIFY, source, newState, user, TrustTypes.BUILDER, true);

View File

@ -156,7 +156,7 @@ public class EntityEventHandler implements Listener {
user = PermissionHolderCache.getInstance().getOrCreateUser(uuid);
}
}
if (user == null) {
if (user == null && !NMSUtil.getInstance().isEntityMonster(event.getEntity())) {
final GDEntity gdEntity = EntityTracker.getCachedEntity(event.getEntity().getEntityId());
if (gdEntity != null) {
user = PermissionHolderCache.getInstance().getOrCreateUser(gdEntity.getOwnerUUID());

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.12.2",
"sha1": "73421d4599201a371858653a7d31c054eb972949",
"path": "com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20200607.224144-34.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20200607.224144-34.jar"
"sha1": "ac5ae7a5dab7bbf4efda26d66cb99a4cd1e91a23",
"path": "com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20200608.154737-35.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.12.2-SNAPSHOT/adapter-1.12.2-20200608.154737-35.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.13.2",
"sha1": "78e6b190a71d1213632ed0c9eacb0017836e9a45",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20200607.224012-33.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20200607.224012-33.jar"
"sha1": "a8b277590f2f2e4725c059f963109a232b5400e8",
"path": "com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20200608.154648-34.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.13.2-SNAPSHOT/adapter-1.13.2-20200608.154648-34.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.2",
"sha1": "49837d3d065b2e642d86a43d4106edf5e89c1f42",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20200607.223940-33.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20200607.223940-33.jar"
"sha1": "9b698ff86706e3e2378b01f500d48e7dde3753fb",
"path": "com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20200608.155146-34.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.2-SNAPSHOT/adapter-1.14.2-20200608.155146-34.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.3",
"sha1": "bc12031edab59cdb998248a9048f225ec5bfbf34",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20200607.223828-34.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20200607.223828-34.jar"
"sha1": "cd56f66cfb67cc151496a19a0788b4d868950d47",
"path": "com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20200608.154518-35.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.3-SNAPSHOT/adapter-1.14.3-20200608.154518-35.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.14.4",
"sha1": "fc030c3b3b95439abd341df479e297b183a2cf13",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20200607.223535-32.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20200607.223535-32.jar"
"sha1": "83d35e56feb96ab9f88378ab97945be15a04ed3d",
"path": "com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20200608.154430-33.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.14.4-SNAPSHOT/adapter-1.14.4-20200608.154430-33.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.15.2",
"sha1": "2d8a21c18abae4184fb6bc80cad4175fe8cbdda6",
"path": "com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20200607.223430-13.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20200607.223430-13.jar"
"sha1": "b9ba833d0305ea7e74074d664e1ecceee405aca8",
"path": "com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20200608.154231-14.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15.2-SNAPSHOT/adapter-1.15.2-20200608.154231-14.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.15",
"sha1": "a20a6b8aa707a1e13333078cf10c49b64732e334",
"path": "com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20200607.223501-14.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20200607.223501-14.jar"
"sha1": "b5f4c81abce44d0f12b488b1ff0dba4ec9ff81ba",
"path": "com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20200608.154335-15.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.15-SNAPSHOT/adapter-1.15-20200608.154335-15.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

@ -3,9 +3,9 @@
"libraries": [
{
"name": "com.griefdefender:adapter:1.8.8",
"sha1": "0694300ced47831481d1bd01f91bc2a6ad180305",
"path": "com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20200607.174827-33.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20200607.174827-33.jar"
"sha1": "9d183a6a2ec921d7907118e4e728c62554850c87",
"path": "com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20200608.154829-34.jar",
"url": "https://repo.glaremasters.me/repository/bloodshot/com/griefdefender/adapter/1.8.8-SNAPSHOT/adapter-1.8.8-20200608.154829-34.jar"
},
{
"name": "com.griefdefender:api:1.0.0",

View File

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

View File

@ -2,10 +2,10 @@
name=GriefDefender
group=com.griefdefender
url=https://github.com/bloodmc/GriefDefender
version=1.3.2
version=1.3.3
apiVersion=1.0.0-20200528.202302-24
# Bukkit
adapterVersion=1.15.2-20200607.223430-13
adapterVersion=1.15.2-20200608.154231-14
spigotVersion=1.15.2-R0.1-SNAPSHOT
# Sponge
adapterSpongeVersion=1.12.2-20200607.180353-5

View File

@ -380,9 +380,12 @@ public class GDClaimManager implements ClaimManager {
}
for (Long chunkHash : chunkHashes) {
Set<Claim> claimsInChunk = this.getInternalChunksToClaimsMap().get(chunkHash);
Set<Claim> claimsInChunk = this.chunksToClaimsMap.get(chunkHash);
if (claimsInChunk != null) {
claimsInChunk.remove(claim);
if (claimsInChunk.isEmpty()) {
this.chunksToClaimsMap.remove(chunkHash);
}
}
}
}

View File

@ -67,7 +67,7 @@ public class CommandDebug extends BaseCommand {
} else if (command.equalsIgnoreCase("paste")) {
paste = true;
} else if (command.equalsIgnoreCase("off")) {
GriefDefenderPlugin.getInstance().getDebugUserMap().remove(src.getIdentifier());
GriefDefenderPlugin.getInstance().getDebugUserMap().remove(src.getName());
if (GriefDefenderPlugin.getInstance().getDebugUserMap().isEmpty()) {
GriefDefenderPlugin.debugActive = false;
}
@ -75,7 +75,7 @@ public class CommandDebug extends BaseCommand {
if (debugData == null) {
if (paste) {
debugData = GriefDefenderPlugin.getInstance().getDebugUserMap().get(src.getIdentifier());
debugData = GriefDefenderPlugin.getInstance().getDebugUserMap().get(src.getName());
if (debugData == null) {
TextAdapter.sendComponent(src, TextComponent.of("Nothing to paste!", TextColor.RED));
} else {
@ -87,7 +87,7 @@ public class CommandDebug extends BaseCommand {
.append("Debug ", TextColor.GRAY)
.append("OFF", TextColor.RED)
.build());
GriefDefenderPlugin.getInstance().getDebugUserMap().remove(src.getIdentifier());
GriefDefenderPlugin.getInstance().getDebugUserMap().remove(src.getName());
if (GriefDefenderPlugin.getInstance().getDebugUserMap().isEmpty()) {
GriefDefenderPlugin.debugActive = false;
}
@ -126,7 +126,7 @@ public class CommandDebug extends BaseCommand {
}
debugData = new GDDebugData(src, filter, verbose);
GriefDefenderPlugin.getInstance().getDebugUserMap().put(src.getIdentifier(), debugData);
GriefDefenderPlugin.getInstance().getDebugUserMap().put(src.getName(), debugData);
GriefDefenderPlugin.debugActive = true;
return debugData;
}

View File

@ -46,7 +46,6 @@ public class ClaimCategory extends ConfigCategory {
+ "\nNote: To disable, set value to '0'.")
public int explosionCancelBlockLimit = 50;
@Setting(value = "worldedit-schematics", comment = "Whether to use WorldEdit for schematics. Default: false"
+ "\nNote: Sponge schematics do not support Entities. If you want entities, then you must set this to true to use WorldEdit instead."
+ "\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;
@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

@ -88,21 +88,20 @@ public class CustomFlagGroupDefinitionCategory extends ConfigCategory {
continue;
}
Set<Context> contexts = new HashSet<>(flagDefinition.getContexts());
boolean shouldApply = false;
boolean isOverride = false;
Set<Context> defaultContexts = new HashSet<>();
Set<Context> overrideContexts = new HashSet<>();
String groupStr = null;
final Iterator<Context> iterator = contexts.iterator();
while (iterator.hasNext()) {
final Context context = iterator.next();
if (context.getKey().equalsIgnoreCase("gd_claim_default")) {
shouldApply = true;
defaultContexts.add(context);
} else if (context.getKey().equalsIgnoreCase("gd_claim_override")) {
if (context.getValue().equalsIgnoreCase("claim")) {
iterator.remove();
continue;
}
shouldApply = true;
isOverride = true;
overrideContexts.add(context);
} else if (context.getKey().equalsIgnoreCase("group")) {
groupStr = context.getValue();
}
@ -117,14 +116,19 @@ public class CustomFlagGroupDefinitionCategory extends ConfigCategory {
}
}
for (FlagData flagData : flagDefinition.getFlagData()) {
Set<Context> permissionContexts = new HashSet<>(contexts);
Set<Context> permissionContexts = new HashSet<>();
permissionContexts.addAll(flagData.getContexts());
if (shouldApply) {
if (isOverride) {
PermissionUtil.getInstance().setPermissionValue(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
} else {
PermissionUtil.getInstance().setTransientPermission(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
}
// apply defaults
for (Context context : defaultContexts) {
permissionContexts.add(context);
PermissionUtil.getInstance().setTransientPermission(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
permissionContexts.remove(context);
}
// apply overrides
for (Context context : overrideContexts) {
permissionContexts.add(context);
PermissionUtil.getInstance().setPermissionValue(holder, flagData.getFlag().getPermission(), flagDefinition.getDefaultValue(), permissionContexts);
permissionContexts.remove(context);
}
}
}

View File

@ -144,13 +144,13 @@ public class FlagDefinitionSerializer implements TypeSerializer<FlagDefinition>
final String value = parts[1];
if (key.equalsIgnoreCase("default") || key.equalsIgnoreCase("gd_claim_default")) {
if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin")
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town")) {
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("wilderness")) {
throw new ObjectMappingException("Invalid context '" + key + "' with value '" + value + "'.");
}
contexts.add(new Context("gd_claim_default", value));
} else if (key.equalsIgnoreCase("override") || key.equalsIgnoreCase("gd_claim_override")) {
if (!value.equalsIgnoreCase("global") && !value.equalsIgnoreCase("basic") && !value.equalsIgnoreCase("admin")
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("claim")) {
&& !value.equalsIgnoreCase("subdivision") && !value.equalsIgnoreCase("town") && !value.equalsIgnoreCase("claim") && !value.equalsIgnoreCase("wilderness")) {
// try UUID
if (value.length() == 36) {
try {

View File

@ -631,7 +631,7 @@ public class CommonEntityEventHandler {
}
final GDPlayerData playerData = user.getInternalPlayerData();
final double currentFlySpeed = player.get(Keys.FLYING_SPEED).get();
final double currentFlySpeed = Math.round(player.get(Keys.FLYING_SPEED).get() * 100.0) / 100.0;
final double flySpeed = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Double.class), playerData.getSubject(), Options.PLAYER_FLY_SPEED, toClaim);
if (flySpeed <= 0) {
String configValue = GriefDefenderPlugin.getOptionConfig().getConfig().vanillaFallbackMap.get(Options.PLAYER_FLY_SPEED.getName().toLowerCase());
@ -679,7 +679,7 @@ public class CommonEntityEventHandler {
}
final GDPlayerData playerData = user.getInternalPlayerData();
final double currentWalkSpeed = player.get(Keys.WALKING_SPEED).get();
final double currentWalkSpeed = Math.round(player.get(Keys.WALKING_SPEED).get() * 100.0) / 100.0;
final double walkSpeed = GDPermissionManager.getInstance().getInternalOptionValue(TypeToken.of(Double.class), playerData.getSubject(), Options.PLAYER_WALK_SPEED, toClaim);
if (walkSpeed <= 0) {
String configValue = GriefDefenderPlugin.getOptionConfig().getConfig().vanillaFallbackMap.get(Options.PLAYER_WALK_SPEED.getName().toLowerCase());