Added a permission node to set NBT data, allowing servers to disallow NBT interactions.

This commit is contained in:
Matthew Miller 2019-06-01 15:53:03 +10:00
parent 59447c6ee3
commit 38607f387a
2 changed files with 24 additions and 1 deletions

View File

@ -232,6 +232,9 @@ public class LocalSession {
newEditSession.enableStandardMode();
newEditSession.setReorderMode(reorderMode);
newEditSession.setFastMode(fastMode);
if (newEditSession.getSurvivalExtent() != null) {
newEditSession.getSurvivalExtent().setStripNbt(!player.hasPermission("worldedit.setnbt"));
}
editSession.undo(newEditSession);
}
return editSession;
@ -257,6 +260,9 @@ public class LocalSession {
newEditSession.enableStandardMode();
newEditSession.setReorderMode(reorderMode);
newEditSession.setFastMode(fastMode);
if (newEditSession.getSurvivalExtent() != null) {
newEditSession.getSurvivalExtent().setStripNbt(!player.hasPermission("worldedit.setnbt"));
}
editSession.redo(newEditSession);
}
++historyPointer;
@ -887,6 +893,9 @@ public class LocalSession {
editSession.setFastMode(fastMode);
editSession.setReorderMode(reorderMode);
editSession.setMask(mask);
if (editSession.getSurvivalExtent() != null) {
editSession.getSurvivalExtent().setStripNbt(!player.hasPermission("worldedit.setnbt"));
}
return editSession;
}

View File

@ -40,6 +40,7 @@ public class SurvivalModeExtent extends AbstractDelegateExtent {
private final World world;
private boolean toolUse = false;
private boolean stripNbt = false;
/**
* Create a new instance.
@ -78,13 +79,26 @@ public class SurvivalModeExtent extends AbstractDelegateExtent {
this.toolUse = toolUse;
}
public boolean hasStripNbt() {
return stripNbt;
}
public void setStripNbt(boolean stripNbt) {
this.stripNbt = stripNbt;
}
@Override
public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 location, B block) throws WorldEditException {
if (toolUse && block.getBlockType().getMaterial().isAir()) {
world.simulateBlockMine(location);
return true;
} else {
return super.setBlock(location, block);
// Can't be an inlined check due to inconsistent generic return type
if (stripNbt) {
return super.setBlock(location, block.toBaseBlock(null));
} else {
return super.setBlock(location, block);
}
}
}