Added fail safes against bonus drop meta not being cleaned up

This commit is contained in:
nossr50
2023-05-29 14:34:47 -07:00
parent 44ab8d93ab
commit e9a020565f
6 changed files with 28 additions and 14 deletions

View File

@ -140,7 +140,7 @@ public class BlockListener implements Listener {
movedBlock = block.getRelative(direction);
if(BlockUtils.isWithinWorldBounds(movedBlock)) {
mcMMO.getPlaceStore().setTrue(movedBlock);
BlockUtils.setUnnaturalBlock(block);
}
}
}
@ -166,12 +166,13 @@ public class BlockListener implements Listener {
//Spigot makes bad things happen in its API
if(BlockUtils.isWithinWorldBounds(movedBlock)) {
mcMMO.getPlaceStore().setTrue(movedBlock);
BlockUtils.setUnnaturalBlock(movedBlock);
}
for (Block block : event.getBlocks()) {
if(BlockUtils.isWithinWorldBounds(block)) {
mcMMO.getPlaceStore().setTrue(block.getRelative(direction));
if(BlockUtils.isWithinWorldBounds(block) && BlockUtils.isWithinWorldBounds(block.getRelative(direction))) {
Block relativeBlock = block.getRelative(direction);
BlockUtils.setUnnaturalBlock(relativeBlock);
}
}
}
@ -189,14 +190,13 @@ public class BlockListener implements Listener {
if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
BlockState blockState = event.getNewState();
if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState)) {
Block block = blockState.getBlock();
if(BlockUtils.isWithinWorldBounds(block)) {
mcMMO.getPlaceStore().setTrue(block);
BlockUtils.setUnnaturalBlock(block);
}
}
}
@ -217,8 +217,9 @@ public class BlockListener implements Listener {
BlockState newState = event.getNewState();
if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) {
if(BlockUtils.isWithinWorldBounds(newState.getBlock())) {
mcMMO.getPlaceStore().setTrue(newState);
Block block = newState.getBlock();
if(BlockUtils.isWithinWorldBounds(block)) {
BlockUtils.setUnnaturalBlock(block);
}
}
}
@ -245,7 +246,7 @@ public class BlockListener implements Listener {
if(BlockUtils.isWithinWorldBounds(block)) {
//NOTE: BlockMultiPlace has its own logic so don't handle anything that would overlap
if (!(event instanceof BlockMultiPlaceEvent)) {
mcMMO.getPlaceStore().setTrue(blockState);
BlockUtils.setUnnaturalBlock(block);
}
}
@ -289,8 +290,8 @@ public class BlockListener implements Listener {
}
//Track unnatural blocks
for(BlockState replacedStates : event.getReplacedBlockStates()) {
mcMMO.getPlaceStore().setTrue(replacedStates);
for(BlockState replacedState : event.getReplacedBlockStates()) {
BlockUtils.setUnnaturalBlock(replacedState.getBlock());
}
}
}

View File

@ -245,7 +245,7 @@ public class EntityListener implements Listener {
metaCleanupTask.runTaskTimer(pluginRef, 20, 20*60); //6000 ticks is 5 minutes
}
else if (isTracked) {
mcMMO.getPlaceStore().setTrue(block);
BlockUtils.setUnnaturalBlock(block);
entity.removeMetadata(MetadataConstants.METADATA_KEY_TRAVELING_BLOCK, pluginRef);
}
} else if ((block.getType() == Material.REDSTONE_ORE || block.getType().getKey().getKey().equalsIgnoreCase("deepslate_redstone_ore"))) {

View File

@ -35,7 +35,7 @@ public class PistonTrackerTask extends BukkitRunnable {
Block nextBlock = b.getRelative(direction);
if (nextBlock.hasMetadata(MetadataConstants.METADATA_KEY_PISTON_TRACKING)) {
mcMMO.getPlaceStore().setTrue(nextBlock);
BlockUtils.setUnnaturalBlock(nextBlock);
nextBlock.removeMetadata(MetadataConstants.METADATA_KEY_PISTON_TRACKING, mcMMO.p);
}
else if (mcMMO.getPlaceStore().isTrue(nextBlock)) {

View File

@ -30,6 +30,6 @@ public class StickyPistonTrackerTask extends BukkitRunnable {
// The sticky piston actually pulled the block so move the PlaceStore data
mcMMO.getPlaceStore().setFalse(movedBlock.getRelative(direction));
mcMMO.getPlaceStore().setTrue(movedBlock);
BlockUtils.setUnnaturalBlock(movedBlock);
}
}

View File

@ -38,6 +38,18 @@ public final class BlockUtils {
blockState.setMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, new BonusDropMeta(1, mcMMO.p));
}
/**
* Set up the state for a block to be seen as unnatural and cleanup any unwanted metadata from the block
* @param block target block
*/
public static void setUnnaturalBlock(@NotNull Block block) {
mcMMO.getPlaceStore().setTrue(block);
// Failsafe against lingering metadata
if(block.hasMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS))
block.removeMetadata(MetadataConstants.METADATA_KEY_BONUS_DROPS, mcMMO.p);
}
/**
* Cleans up some block metadata when a block breaks and the metadata is no longer needed
* This also sets the blocks coords to false in our chunk store