Skip to content

Commit 13bd157

Browse files
committed
Correct all BlockTools to use the Location's World
All tools would inadvertently use the player's World at some point, which is incorrect in the presense of some mods as seen in #2560 Fixes #2560
1 parent 4a1bf61 commit 13bd157

12 files changed

Lines changed: 54 additions & 21 deletions

File tree

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/AreaPickaxe.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,11 @@ public boolean canUse(Actor player) {
5454

5555
@Override
5656
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
57+
World world = BlockTool.requireWorld(player, clicked);
5758
int ox = clicked.getBlockX();
5859
int oy = clicked.getBlockY();
5960
int oz = clicked.getBlockZ();
60-
BlockType initialType = clicked.getExtent().getBlock(clicked.toVector().toBlockPoint()).getBlockType();
61+
BlockType initialType = world.getBlock(clicked.toVector().toBlockPoint()).getBlockType();
6162

6263
if (initialType.getMaterial().isAir()) {
6364
return false;
@@ -67,7 +68,7 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
6768
return false;
6869
}
6970

70-
try (EditSession editSession = session.createEditSession(player)) {
71+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
7172
editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop);
7273

7374
try {
@@ -81,8 +82,9 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
8182

8283
editSession.setBlock(pos, BlockTypes.AIR.getDefaultState());
8384

84-
((World) clicked.getExtent()).queueBlockBreakEffect(server, pos, initialType,
85-
clicked.toVector().toBlockPoint().distanceSq(pos));
85+
world.queueBlockBreakEffect(
86+
server, pos, initialType, clicked.toVector().toBlockPoint().distanceSq(pos)
87+
);
8688
}
8789
}
8890
}

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockDataCyler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public boolean canUse(Actor player) {
5757
private boolean handleCycle(LocalConfiguration config, Player player, LocalSession session,
5858
Location clicked, boolean forward) {
5959

60-
World world = (World) clicked.getExtent();
60+
World world = BlockTool.requireWorld(player, clicked);
6161

6262
BlockVector3 blockPoint = clicked.toVector().toBlockPoint();
6363
BaseBlock block = world.getFullBlock(blockPoint);
@@ -87,7 +87,7 @@ private boolean handleCycle(LocalConfiguration config, Player player, LocalSessi
8787
Property<Object> objProp = (Property<Object>) currentProperty;
8888
BaseBlock newBlock = block.with(objProp, currentProperty.getValues().get(index));
8989

90-
try (EditSession editSession = session.createEditSession(player)) {
90+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
9191
editSession.disableBuffering();
9292

9393
try {

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockReplacer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public boolean canUse(Actor player) {
5656
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
5757
BlockBag bag = session.getBlockBag(player);
5858

59-
try (EditSession editSession = session.createEditSession(player)) {
59+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
6060
try {
6161
editSession.disableBuffering();
6262
BlockVector3 position = clicked.toVector().toBlockPoint();
@@ -77,7 +77,7 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
7777

7878
@Override
7979
public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
80-
BaseBlock targetBlock = player.getWorld().getFullBlock(clicked.toVector().toBlockPoint());
80+
BaseBlock targetBlock = clicked.getExtent().getFullBlock(clicked.toVector().toBlockPoint());
8181

8282
if (targetBlock != null) {
8383
pattern = targetBlock;

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/BlockTool.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
package com.sk89q.worldedit.command.tool;
2121

22+
import com.sk89q.worldedit.EditSession;
2223
import com.sk89q.worldedit.LocalConfiguration;
2324
import com.sk89q.worldedit.LocalSession;
2425
import com.sk89q.worldedit.entity.Player;
@@ -27,11 +28,41 @@
2728
import com.sk89q.worldedit.internal.util.NonAbstractForCompatibility;
2829
import com.sk89q.worldedit.util.Direction;
2930
import com.sk89q.worldedit.util.Location;
31+
import com.sk89q.worldedit.world.World;
3032

3133
import javax.annotation.Nullable;
3234

3335
public interface BlockTool extends Tool {
3436

37+
/**
38+
* Helper method to require the world that should be used for a tool action.
39+
*
40+
* @param clicked the location that was clicked
41+
* @return the world to use
42+
*/
43+
static World requireWorld(Location clicked) {
44+
if (!(clicked.getExtent() instanceof World world)) {
45+
throw new IllegalArgumentException("Location is not in a world: " + clicked);
46+
}
47+
return world;
48+
}
49+
50+
/**
51+
* Helper method to create an {@link EditSession} for a tool action.
52+
*
53+
* @param player the player
54+
* @param clicked the location that was clicked
55+
*/
56+
static EditSession createEditSession(Player player, LocalSession session, Location clicked) {
57+
World overrideToRestore = session.getWorldOverride();
58+
session.setWorldOverride(BlockTool.requireWorld(clicked));
59+
try {
60+
return session.createEditSession(player);
61+
} finally {
62+
session.setWorldOverride(overrideToRestore);
63+
}
64+
}
65+
3566
/**
3667
* Perform the primary action of this tool.
3768
*

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloatingTreeRemover.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,15 @@ public boolean actPrimary(Platform server, LocalConfiguration config,
7171
Player player, LocalSession session, Location clicked,
7272
@Nullable Direction face) {
7373

74-
final World world = (World) clicked.getExtent();
74+
final World world = BlockTool.requireWorld(player, clicked);
7575
final BlockState state = world.getBlock(clicked.toVector().toBlockPoint());
7676

7777
if (!isTreeBlock(state.getBlockType())) {
7878
player.printError(TranslatableComponent.of("worldedit.tool.deltree.not-tree"));
7979
return true;
8080
}
8181

82-
try (EditSession editSession = session.createEditSession(player)) {
82+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
8383
try {
8484
final Set<BlockVector3> blockSet = bfs(world, clicked.toVector().toBlockPoint());
8585
if (blockSet == null) {

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/FloodFillTool.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public boolean canUse(Actor player) {
5959

6060
@Override
6161
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
62-
World world = (World) clicked.getExtent();
62+
World world = BlockTool.requireWorld(player, clicked);
6363

6464
BlockVector3 origin = clicked.toVector().toBlockPoint();
6565
BlockType initialType = world.getBlock(origin).getBlockType();
@@ -72,7 +72,7 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
7272
return true;
7373
}
7474

75-
try (EditSession editSession = session.createEditSession(player)) {
75+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
7676
try {
7777
recurse(editSession, origin, origin, range, initialType, new HashSet<>());
7878
} catch (MaxChangedBlocksException e) {

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/QueryTool.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public boolean canUse(Actor player) {
5151
@Override
5252
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
5353

54-
World world = (World) clicked.getExtent();
54+
World world = BlockTool.requireWorld(player, clicked);
5555
BlockVector3 blockPoint = clicked.toVector().toBlockPoint();
5656
BaseBlock block = world.getFullBlock(blockPoint);
5757

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/RecursivePickaxe.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public boolean canUse(Actor player) {
5757

5858
@Override
5959
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
60-
World world = (World) clicked.getExtent();
60+
World world = BlockTool.requireWorld(player, clicked);
6161

6262
BlockVector3 origin = clicked.toVector().toBlockPoint();
6363
BlockType initialType = world.getBlock(origin).getBlockType();
@@ -70,7 +70,7 @@ public boolean actPrimary(Platform server, LocalConfiguration config, Player pla
7070
return false;
7171
}
7272

73-
try (EditSession editSession = session.createEditSession(player)) {
73+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
7474
editSession.getSurvivalExtent().setToolUse(config.superPickaxeManyDrop);
7575

7676
try {

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SelectionWand.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class SelectionWand implements DoubleActionBlockTool {
3636

3737
@Override
3838
public boolean actSecondary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
39-
RegionSelector selector = session.getRegionSelector(player.getWorld());
39+
RegionSelector selector = session.getRegionSelector(BlockTool.requireWorld(player, clicked));
4040
BlockVector3 blockPoint = clicked.toVector().toBlockPoint();
4141

4242
if (selector.selectPrimary(blockPoint, ActorSelectorLimits.forActor(player))) {
@@ -47,7 +47,7 @@ public boolean actSecondary(Platform server, LocalConfiguration config, Player p
4747

4848
@Override
4949
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
50-
RegionSelector selector = session.getRegionSelector(player.getWorld());
50+
RegionSelector selector = session.getRegionSelector(BlockTool.requireWorld(player, clicked));
5151
BlockVector3 blockPoint = clicked.toVector().toBlockPoint();
5252

5353
if (selector.selectSecondary(blockPoint, ActorSelectorLimits.forActor(player))) {

worldedit-core/src/main/java/com/sk89q/worldedit/command/tool/SinglePickaxe.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,14 @@ public boolean canUse(Actor player) {
4848

4949
@Override
5050
public boolean actPrimary(Platform server, LocalConfiguration config, Player player, LocalSession session, Location clicked, @Nullable Direction face) {
51-
World world = (World) clicked.getExtent();
51+
World world = BlockTool.requireWorld(player, clicked);
5252
BlockVector3 blockPoint = clicked.toVector().toBlockPoint();
5353
final BlockType blockType = world.getBlock(blockPoint).getBlockType();
5454
if (blockType == BlockTypes.BEDROCK && !player.canDestroyBedrock()) {
5555
return false;
5656
}
5757

58-
try (EditSession editSession = session.createEditSession(player)) {
58+
try (EditSession editSession = BlockTool.createEditSession(player, session, clicked)) {
5959
editSession.getSurvivalExtent().setToolUse(config.superPickaxeDrop);
6060
editSession.setBlock(blockPoint, BlockTypes.AIR.getDefaultState());
6161
} catch (MaxChangedBlocksException e) {

0 commit comments

Comments
 (0)