Skip to content

Commit 60797ee

Browse files
committed
feat: check if a block snapshot wasn't already stored before marking it for rollback
1 parent eec0b29 commit 60797ee

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed

api/src/main/java/org/screamingsandals/bedwars/api/Region.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.screamingsandals.bedwars.api;
2121

2222
import org.jetbrains.annotations.ApiStatus;
23+
import org.jetbrains.annotations.NotNull;
2324
import org.screamingsandals.lib.api.types.server.BlockHolder;
2425
import org.screamingsandals.lib.api.types.server.BlockPlacementHolder;
2526
import org.screamingsandals.lib.api.types.server.BlockSnapshotHolder;
@@ -42,6 +43,15 @@ public interface Region {
4243
*/
4344
boolean isLocationModifiedDuringGame(LocationHolder loc);
4445

46+
/**
47+
* <p>Determines if the supplied location has an original block stored for restoration after the BedWars game.</p>
48+
*
49+
* @param loc the location
50+
* @return is the block stored for rollback?
51+
* @since 0.3.0
52+
*/
53+
boolean isStoredForRollback(@NotNull LocationHolder loc);
54+
4555
/**
4656
* <p>Marks a location for rollback.</p>
4757
* <p>This should be used for restoring a broken block that was a part of the original world.</p>

plugin/common/src/main/java/org/screamingsandals/bedwars/game/GameImpl.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ public boolean blockPlace(BedWarsPlayer player, BlockPlacement block, BlockSnaps
301301
if (region.isLocationModifiedDuringGame(replaced.location())) {
302302
return true;
303303
} else if (BedWarsPlugin.isBreakableBlock(replaced.block()) || region.isLiquid(replaced.block())) {
304-
region.putOriginalBlock(block.location(), replaced);
304+
region.putOriginalBlockIfAbsent(block.location(), replaced);
305305
} else {
306306
return false;
307307
}
@@ -394,7 +394,7 @@ public boolean blockBreak(BedWarsPlayer player, BlockPlacement block, PlayerBloc
394394
}
395395
}
396396
if (BedWarsPlugin.isBreakableBlock(block.block())) {
397-
region.putOriginalBlock(block.location(), block.blockSnapshot());
397+
region.putOriginalBlockIfAbsent(block.location(), block.blockSnapshot());
398398
return true;
399399
}
400400
return false;
@@ -454,12 +454,12 @@ public boolean internalProcessInvalidation(@NotNull TeamImpl team, @NotNull Targ
454454
}
455455

456456
if (putOriginalBlocks) {
457-
region.putOriginalBlock(loc, block.blockSnapshot());
457+
region.putOriginalBlockIfAbsent(loc, block.blockSnapshot());
458458
if (block.location().equals(loc)) {
459459
var neighbor = region.getBedNeighbor(block);
460-
region.putOriginalBlock(neighbor.location(), neighbor.blockSnapshot());
460+
region.putOriginalBlockIfAbsent(neighbor.location(), neighbor.blockSnapshot());
461461
} else {
462-
region.putOriginalBlock(loc, region.getBedNeighbor(block).blockSnapshot());
462+
region.putOriginalBlockIfAbsent(block.location(), region.getBedNeighbor(block).blockSnapshot());
463463
}
464464
}
465465

@@ -470,17 +470,17 @@ public boolean internalProcessInvalidation(@NotNull TeamImpl team, @NotNull Targ
470470
var neighbourBlock = neighbour.getBlock();
471471
if (neighbourBlock.block().is("#doors", "#tall_flowers")) {
472472
if (putOriginalBlocks) {
473-
region.putOriginalBlock(neighbour, neighbourBlock.blockSnapshot());
473+
region.putOriginalBlockIfAbsent(neighbour, neighbourBlock.blockSnapshot());
474474
}
475475
neighbourBlock.alterBlockWithoutPhysics(Block.air());
476476
}
477477
if (putOriginalBlocks) {
478-
region.putOriginalBlock(loc, block.blockSnapshot());
478+
region.putOriginalBlockIfAbsent(loc, block.blockSnapshot());
479479
}
480480
loc.getBlock().block(Block.air());
481481
} else {
482482
if (putOriginalBlocks) {
483-
region.putOriginalBlock(loc, block.blockSnapshot());
483+
region.putOriginalBlockIfAbsent(loc, block.blockSnapshot());
484484
}
485485
loc.getBlock().block(Block.air());
486486
}

plugin/common/src/main/java/org/screamingsandals/bedwars/listener/PlayerListener.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1032,7 +1032,7 @@ public void onPlayerInteract(PlayerInteractEvent event) {
10321032
event.cancelled(true);
10331033
var cake = clickedBlock.block();
10341034
if ("0".equals(cake.get("bites"))) {
1035-
game.getRegion().putOriginalBlock(clickedBlock.location(), clickedBlock.blockSnapshot());
1035+
game.getRegion().putOriginalBlockIfAbsent(clickedBlock.location(), clickedBlock.blockSnapshot());
10361036
}
10371037
var bites = Objects.requireNonNullElse(cake.getInt("bites"), 0) + 1;
10381038
cake = cake.with("bites", String.valueOf(bites));
@@ -1432,7 +1432,7 @@ public void onPlaceLiquid(PlayerBucketEvent event) {
14321432
if (event.action() == PlayerBucketEvent.Action.EMPTY) {
14331433
if (Server.isVersion(1, 13) && event.bucket().is("minecraft:water_bucket") && event.blockClicked().block().getBoolean("waterlogged") != null) {
14341434
block = event.blockClicked();
1435-
game.getRegion().putOriginalBlock(block.location(), block.blockSnapshot());
1435+
game.getRegion().putOriginalBlockIfAbsent(block.location(), block.blockSnapshot());
14361436
game.getRegion().addBuiltDuringGame(block.location());
14371437
Debug.info(player.getName() + " placed liquid");
14381438
} else if (block.block().isAir()) {
@@ -1452,7 +1452,7 @@ public void onPlaceLiquid(PlayerBucketEvent event) {
14521452
&& BedWarsPlugin.isBreakableBlock(Block.of("minecraft:water")) // Require breakable water
14531453
)
14541454
) {
1455-
game.getRegion().putOriginalBlock(block.location(), block.blockSnapshot());
1455+
game.getRegion().putOriginalBlockIfAbsent(block.location(), block.blockSnapshot());
14561456
game.getRegion().addBuiltDuringGame(block.location());
14571457
Debug.info(player.getName() + " broken liquid");
14581458
} else {

plugin/common/src/main/java/org/screamingsandals/bedwars/listener/WorldListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ public void onExplode(Location location, Collection<BlockPlacement> blockList, o
166166
}
167167
}
168168
if (breakableExplosions && BedWarsPlugin.isBreakableBlock(block.block())) {
169-
game.getRegion().putOriginalBlock(block.location(), block.blockSnapshot());
169+
game.getRegion().putOriginalBlockIfAbsent(block.location(), block.blockSnapshot());
170170
return false;
171171
} else {
172172
return true;
@@ -281,7 +281,7 @@ public void onEntityChangeBlock(EntityChangeBlockEvent event) {
281281
if (!event.block().block().equals(event.to())) {
282282
if (!game.isBlockAddedDuringGame(event.block().location())) {
283283
if (!event.block().block().isAir()) {
284-
game.getRegion().putOriginalBlock(event.block().location(), Objects.requireNonNull(event.block().blockSnapshot()));
284+
game.getRegion().putOriginalBlockIfAbsent(event.block().location(), Objects.requireNonNull(event.block().blockSnapshot()));
285285
}
286286
game.getRegion().addBuiltDuringGame(event.block().location());
287287
}

plugin/common/src/main/java/org/screamingsandals/bedwars/region/RegionImpl.java

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919

2020
package org.screamingsandals.bedwars.region;
2121

22+
import org.jetbrains.annotations.ApiStatus;
23+
import org.jetbrains.annotations.NotNull;
2224
import org.screamingsandals.bedwars.api.Region;
2325
import org.screamingsandals.bedwars.utils.BedUtils;
2426
import org.screamingsandals.lib.api.types.server.BlockHolder;
@@ -45,10 +47,21 @@ public boolean isLocationModifiedDuringGame(Location loc) {
4547
return builtBlocks.contains(loc);
4648
}
4749

50+
public boolean isOriginalBlockStored(@NotNull Location loc) {
51+
return brokenOriginalBlocks.containsKey(loc);
52+
}
53+
4854
public void putOriginalBlock(Location loc, BlockSnapshot block) {
4955
brokenOriginalBlocks.put(loc, block);
5056
}
5157

58+
public void putOriginalBlockIfAbsent(@NotNull Location loc, @NotNull BlockSnapshot block) {
59+
if (brokenOriginalBlocks.containsKey(loc)) {
60+
return;
61+
}
62+
brokenOriginalBlocks.put(loc, block);
63+
}
64+
5265
public void addBuiltDuringGame(Location loc) {
5366
builtBlocks.add(loc);
5467
}
@@ -119,67 +132,73 @@ public boolean isChunkUsed(Chunk chunk) {
119132
}
120133

121134
@Override
122-
@Deprecated
135+
@ApiStatus.Obsolete
123136
public boolean isLocationModifiedDuringGame(LocationHolder loc) {
124137
return isLocationModifiedDuringGame(loc.as(Location.class));
125138
}
126139

127140
@Override
128-
@Deprecated
141+
@ApiStatus.Obsolete
142+
public boolean isStoredForRollback(@NotNull LocationHolder loc) {
143+
return isOriginalBlockStored(loc.as(Location.class));
144+
}
145+
146+
@Override
147+
@ApiStatus.Obsolete
129148
public void markForRollback(LocationHolder loc, BlockSnapshotHolder blockSnapshot) {
130149
putOriginalBlock(loc.as(Location.class), blockSnapshot.as(BlockSnapshot.class));
131150
}
132151

133152
@Override
134-
@Deprecated
153+
@ApiStatus.Obsolete
135154
public void addBuiltDuringGame(LocationHolder loc) {
136155
addBuiltDuringGame(loc.as(Location.class));
137156
}
138157

139158
@Override
140-
@Deprecated
159+
@ApiStatus.Obsolete
141160
public void removeBuiltDuringGame(LocationHolder loc) {
142161
removeBlockBuiltDuringGame(loc.as(Location.class));
143162
}
144163

145164
@Override
146-
@Deprecated
165+
@ApiStatus.Obsolete
147166
public boolean isLiquid(BlockHolder blockHolder) {
148167
return isLiquid(blockHolder.as(Block.class));
149168
}
150169

151170
@Override
152-
@Deprecated
171+
@ApiStatus.Obsolete
153172
public boolean isBedBlock(BlockSnapshotHolder blockSnapshot) {
154173
return isBedBlock(blockSnapshot.as(BlockSnapshot.class));
155174
}
156175

157176
@Override
158-
@Deprecated
177+
@ApiStatus.Obsolete
159178
public boolean isBedHead(BlockSnapshotHolder blockSnapshot) {
160179
return isBedHead(blockSnapshot.as(BlockSnapshot.class));
161180
}
162181

163182
@Override
164-
@Deprecated
183+
@ApiStatus.Obsolete
165184
public BlockPlacement getBedNeighbor(BlockPlacementHolder blockHead) {
166185
return getBedNeighbor(blockHead.as(BlockPlacement.class));
167186
}
168187

169188
@Override
170-
@Deprecated
189+
@ApiStatus.Obsolete
171190
public boolean isChunkUsed(ChunkHolder chunk) {
172191
return isChunkUsed(chunk.as(Chunk.class));
173192
}
174193

175194
@Override
176-
@Deprecated
195+
@ApiStatus.Obsolete
177196
public boolean isDoorBlock(BlockSnapshotHolder blockSnapshot) {
178197
return isDoorBlock(blockSnapshot.as(BlockSnapshot.class));
179198
}
180199

181200
@Override
182-
@Deprecated
201+
@ApiStatus.Obsolete
183202
public boolean isDoorBottomBlock(BlockSnapshotHolder blockSnapshot) {
184203
return isDoorBottomBlock(blockSnapshot.as(BlockSnapshot.class));
185204
}

0 commit comments

Comments
 (0)