diff --git a/Changelog.txt b/Changelog.txt
index 51aff52e3..68e662288 100644
--- a/Changelog.txt
+++ b/Changelog.txt
@@ -1,3 +1,6 @@
+Version 2.1.191
+ Fixed a critical bug related to our BlockTracker
+ Some minor optimizations to our Block events
Version 2.1.190
Fixed a null error in BitSetChunkStore
Version 2.1.189
diff --git a/pom.xml b/pom.xml
index bb75b4ba3..31d49fbbc 100755
--- a/pom.xml
+++ b/pom.xml
@@ -2,7 +2,7 @@
4.0.0
com.gmail.nossr50.mcMMO
mcMMO
- 2.1.190
+ 2.1.191-SNAPSHOT
mcMMO
https://github.com/mcMMO-Dev/mcMMO
diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java
index 06c3a7c2e..658793842 100644
--- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java
+++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java
@@ -123,10 +123,14 @@ public class BlockListener implements Listener {
BlockFace direction = event.getDirection();
Block movedBlock;
+ WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
- for (Block b : event.getBlocks()) {
- movedBlock = b.getRelative(direction);
- mcMMO.getPlaceStore().setTrue(movedBlock);
+ for (Block block : event.getBlocks()) {
+ movedBlock = block.getRelative(direction);
+
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) {
+ mcMMO.getPlaceStore().setTrue(movedBlock);
+ }
}
}
@@ -151,19 +155,15 @@ public class BlockListener implements Listener {
WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
- World world = movedBlock.getWorld();
-
//Spigot makes bad things happen in its API
- if(event.getBlock().getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) {
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, movedBlock)) {
mcMMO.getPlaceStore().setTrue(movedBlock);
}
for (Block block : event.getBlocks()) {
- if(block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world) || block.getY() >= worldCompatibilityLayer.getMinWorldHeight(world)) {
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) {
mcMMO.getPlaceStore().setTrue(block.getRelative(direction));
}
-
- mcMMO.getPlaceStore().setTrue(movedBlock);
}
}
@@ -180,11 +180,16 @@ public class BlockListener implements Listener {
if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld()))
return;
+
BlockState blockState = event.getNewState();
- if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState))
- {
- mcMMO.getPlaceStore().setTrue(blockState.getBlock());
+ if(ExperienceConfig.getInstance().isSnowExploitPrevented() && BlockUtils.shouldBeWatched(blockState)) {
+ WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
+ Block block = blockState.getBlock();
+
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) {
+ mcMMO.getPlaceStore().setTrue(block);
+ }
}
}
@@ -195,23 +200,19 @@ public class BlockListener implements Listener {
public void onBlockFormEvent(BlockFormEvent event)
{
World world = event.getBlock().getWorld();
- /* WORLD BLACKLIST CHECK */ {
- if(WorldBlacklist.isWorldBlacklisted(world))
- return;
- }
- BlockState newState = event.getNewState();
+ /* WORLD BLACKLIST CHECK */
+ if(WorldBlacklist.isWorldBlacklisted(world))
+ return;
if(ExperienceConfig.getInstance().preventStoneLavaFarming()) {
+ BlockState newState = event.getNewState();
WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
- if(event.getBlock().getY() > worldCompatibilityLayer.getMaxWorldHeight(world) || event.getBlock().getY() < worldCompatibilityLayer.getMinWorldHeight(world)) {
- return;
- }
-
- if(newState.getType() != Material.OBSIDIAN
- && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) {
- mcMMO.getPlaceStore().setTrue(newState);
+ if(newState.getType() != Material.OBSIDIAN && ExperienceConfig.getInstance().doesBlockGiveSkillXP(PrimarySkillType.MINING, newState.getBlockData())) {
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, newState.getBlock())) {
+ mcMMO.getPlaceStore().setTrue(newState);
+ }
}
}
}
@@ -224,16 +225,23 @@ public class BlockListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onBlockPlace(BlockPlaceEvent event) {
BlockState blockState = event.getBlock().getState();
+ Block block = blockState.getBlock();
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
// if (!Tag.LOGS.isTagged(event.getBlockReplacedState().getType()) || !Tag.LOGS.isTagged(event.getBlockPlaced().getType()))
- mcMMO.getPlaceStore().setTrue(blockState);
/* WORLD BLACKLIST CHECK */
- if(WorldBlacklist.isWorldBlacklisted(event.getBlock().getWorld())) {
+ if(WorldBlacklist.isWorldBlacklisted(block.getWorld())) {
return;
}
+ WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
+
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) {
+ mcMMO.getPlaceStore().setTrue(blockState);
+ }
+
+
Player player = event.getPlayer();
if (!UserManager.hasPlayerDataKey(player)) {
@@ -260,18 +268,21 @@ public class BlockListener implements Listener {
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onBlockMultiPlace(BlockMultiPlaceEvent event) {
- for (BlockState replacedBlockState : event.getReplacedBlockStates())
- {
+ for (BlockState replacedBlockState : event.getReplacedBlockStates()) {
BlockState blockState = replacedBlockState.getBlock().getState();
+ Block block = blockState.getBlock();
+
+ WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
/* Check if the blocks placed should be monitored so they do not give out XP in the future */
- mcMMO.getPlaceStore().setTrue(blockState);
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) {
+ mcMMO.getPlaceStore().setTrue(blockState);
+ }
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
- public void onBlockGrow(BlockGrowEvent event)
- {
+ public void onBlockGrow(BlockGrowEvent event) {
Block block = event.getBlock();
World world = block.getWorld();
@@ -280,10 +291,11 @@ public class BlockListener implements Listener {
return;
// Minecraft is dumb, the events still throw when a plant "grows" higher than the max block height. Even though no new block is created
- if (block.getY() >= world.getMaxHeight())
- return;
+ WorldCompatibilityLayer worldCompatibilityLayer = mcMMO.getCompatibilityManager().getWorldCompatibilityLayer();
- mcMMO.getPlaceStore().setFalse(block);
+ if(BlockUtils.isWithinWorldBounds(worldCompatibilityLayer, block)) {
+ mcMMO.getPlaceStore().setFalse(block);
+ }
}
/**
diff --git a/src/main/java/com/gmail/nossr50/util/BlockUtils.java b/src/main/java/com/gmail/nossr50/util/BlockUtils.java
index e1944f738..b81a54631 100644
--- a/src/main/java/com/gmail/nossr50/util/BlockUtils.java
+++ b/src/main/java/com/gmail/nossr50/util/BlockUtils.java
@@ -7,14 +7,17 @@ import com.gmail.nossr50.datatypes.skills.SubSkillType;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.skills.repair.Repair;
import com.gmail.nossr50.skills.salvage.Salvage;
+import com.gmail.nossr50.util.compat.layers.world.WorldCompatibilityLayer;
import com.gmail.nossr50.util.random.RandomChanceSkill;
import com.gmail.nossr50.util.random.RandomChanceUtil;
import org.bukkit.Material;
+import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockState;
import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
+import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
@@ -285,4 +288,11 @@ public final class BlockUtils {
public static boolean isPartOfTree(Block rayCast) {
return hasWoodcuttingXP(rayCast.getState()) || isNonWoodPartOfTree(rayCast.getType());
}
+
+ public static boolean isWithinWorldBounds(@NotNull WorldCompatibilityLayer worldCompatibilityLayer, @NotNull Block block) {
+ World world = block.getWorld();
+
+ return block.getY() > worldCompatibilityLayer.getMinWorldHeight(world) || block.getY() < worldCompatibilityLayer.getMaxWorldHeight(world);
+ }
+
}