forked from github-mirror/CoreProtect
Fixed water incorrectly being logged in Nether (fixes #857)
This commit is contained in:
1 parent
971ff57496
commit
42a2965cd1
4 files changed
+47
-27
No files matched your search
@@ -9,8 +9,10 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.CreatureSpawner;
|
import org.bukkit.block.CreatureSpawner;
|
||||||
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.Bisected;
|
import org.bukkit.block.data.Bisected;
|
||||||
import org.bukkit.block.data.Bisected.Half;
|
import org.bukkit.block.data.Bisected.Half;
|
||||||
|
import org.bukkit.block.data.Waterlogged;
|
||||||
import org.bukkit.block.data.type.Bed;
|
import org.bukkit.block.data.type.Bed;
|
||||||
import org.bukkit.block.data.type.Bed.Part;
|
import org.bukkit.block.data.type.Bed.Part;
|
||||||
import org.bukkit.entity.EntityType;
|
import org.bukkit.entity.EntityType;
|
||||||
@@ -25,8 +27,10 @@ import net.coreprotect.consumer.process.Process;
|
|||||||
import net.coreprotect.listener.block.BlockUtil;
|
import net.coreprotect.listener.block.BlockUtil;
|
||||||
import net.coreprotect.model.BlockGroup;
|
import net.coreprotect.model.BlockGroup;
|
||||||
import net.coreprotect.thread.Scheduler;
|
import net.coreprotect.thread.Scheduler;
|
||||||
|
import net.coreprotect.thread.CacheHandler;
|
||||||
import net.coreprotect.utility.BlockUtils;
|
import net.coreprotect.utility.BlockUtils;
|
||||||
import net.coreprotect.utility.EntityUtils;
|
import net.coreprotect.utility.EntityUtils;
|
||||||
|
import net.coreprotect.utility.WorldUtils;
|
||||||
|
|
||||||
public class Queue {
|
public class Queue {
|
||||||
|
|
||||||
@@ -191,16 +195,50 @@ public class Queue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block, final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData, final String blockData, int ticks) {
|
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block, final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData, final String blockData, int ticks) {
|
||||||
|
queueBlockPlaceValidate(user, blockLocation, block, blockReplaced, forceT, forceD, forceData, blockData, ticks, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block, final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData, final String blockData, int ticks, boolean cacheLookup) {
|
||||||
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
|
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
|
||||||
try {
|
try {
|
||||||
Material blockType = block.getType();
|
Material blockType = block.getType();
|
||||||
if (blockType.equals(forceT)) {
|
BlockState replacedBlock = blockReplaced;
|
||||||
|
boolean placed = blockType.equals(forceT);
|
||||||
|
if (!placed && forceT == Material.WATER) {
|
||||||
|
BlockData currentBlockData = block.getBlockData();
|
||||||
|
if (currentBlockData instanceof Waterlogged) {
|
||||||
|
Waterlogged waterlogged = (Waterlogged) currentBlockData;
|
||||||
|
if (waterlogged.isWaterlogged()) {
|
||||||
|
boolean wasWaterlogged = false;
|
||||||
|
if (blockReplaced != null) {
|
||||||
|
BlockData replacedBlockData = blockReplaced.getBlockData();
|
||||||
|
if (replacedBlockData instanceof Waterlogged) {
|
||||||
|
wasWaterlogged = ((Waterlogged) replacedBlockData).isWaterlogged();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wasWaterlogged) {
|
||||||
|
placed = true;
|
||||||
|
replacedBlock = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (placed) {
|
||||||
BlockState blockStateLocation = blockLocation;
|
BlockState blockStateLocation = blockLocation;
|
||||||
if (Config.getConfig(blockLocation.getWorld()).BLOCK_MOVEMENT) {
|
if (blockType.equals(forceT) && Config.getConfig(blockLocation.getWorld()).BLOCK_MOVEMENT) {
|
||||||
blockStateLocation = BlockUtil.gravityScan(blockLocation.getLocation(), blockType, user).getState();
|
blockStateLocation = BlockUtil.gravityScan(blockLocation.getLocation(), blockType, user).getState();
|
||||||
}
|
}
|
||||||
|
|
||||||
queueBlockPlace(user, blockStateLocation, blockType, blockReplaced, forceT, forceD, forceData, blockData);
|
if (cacheLookup) {
|
||||||
|
Location cacheLocation = blockStateLocation.getLocation();
|
||||||
|
int worldId = WorldUtils.getWorldId(cacheLocation.getWorld().getName());
|
||||||
|
int unixTimestamp = (int) (System.currentTimeMillis() / 1000L);
|
||||||
|
CacheHandler.lookupCache.put(cacheLocation.getBlockX() + "." + cacheLocation.getBlockY() + "." + cacheLocation.getBlockZ() + "." + worldId, new Object[] { unixTimestamp, user, forceT });
|
||||||
|
}
|
||||||
|
|
||||||
|
queueBlockPlace(user, blockStateLocation, blockType, replacedBlock, forceT, forceD, forceData, blockData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception e) {
|
catch (Exception e) {
|
||||||
|
|||||||
@@ -300,6 +300,10 @@ public class RollbackBlockHandler extends Queue {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else if ((rowType == Material.WATER)) {
|
else if ((rowType == Material.WATER)) {
|
||||||
|
if (bukkitWorld.getEnvironment() == World.Environment.NETHER) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (pendingChangeData instanceof Waterlogged) {
|
if (pendingChangeData instanceof Waterlogged) {
|
||||||
Waterlogged waterlogged = (Waterlogged) pendingChangeData;
|
Waterlogged waterlogged = (Waterlogged) pendingChangeData;
|
||||||
waterlogged.setWaterlogged(true);
|
waterlogged.setWaterlogged(true);
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import org.bukkit.block.Block;
|
|||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.data.BlockData;
|
import org.bukkit.block.data.BlockData;
|
||||||
import org.bukkit.block.data.Lightable;
|
import org.bukkit.block.data.Lightable;
|
||||||
import org.bukkit.block.data.Waterlogged;
|
|
||||||
import org.bukkit.block.data.type.Dispenser;
|
import org.bukkit.block.data.type.Dispenser;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@@ -105,14 +104,8 @@ public final class BlockDispenseListener extends Queue implements Listener {
|
|||||||
}
|
}
|
||||||
else if (dispenseRelative) {
|
else if (dispenseRelative) {
|
||||||
BlockState blockState = newBlock.getState();
|
BlockState blockState = newBlock.getState();
|
||||||
if (type.equals(Material.WATER)) {
|
|
||||||
if (newBlockData instanceof Waterlogged) {
|
|
||||||
blockState = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!type.equals(Material.AIR)) {
|
if (!type.equals(Material.AIR)) {
|
||||||
queueBlockPlace(user, newBlock.getState(), newBlock.getType(), blockState, type, 1, 1, null);
|
queueBlockPlaceValidate(user, blockState, newBlock, blockState, type, 1, 1, null, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Queue.queueBlockBreak(user, newBlock.getState(), newBlock.getType(), newBlock.getBlockData().getAsString(), 0);
|
Queue.queueBlockBreak(user, newBlock.getState(), newBlock.getType(), newBlock.getBlockData().getAsString(), 0);
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockState;
|
import org.bukkit.block.BlockState;
|
||||||
import org.bukkit.block.data.BlockData;
|
|
||||||
import org.bukkit.block.data.Waterlogged;
|
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
@@ -13,8 +11,6 @@ import org.bukkit.event.Listener;
|
|||||||
import net.coreprotect.config.Config;
|
import net.coreprotect.config.Config;
|
||||||
import net.coreprotect.config.ConfigHandler;
|
import net.coreprotect.config.ConfigHandler;
|
||||||
import net.coreprotect.consumer.Queue;
|
import net.coreprotect.consumer.Queue;
|
||||||
import net.coreprotect.thread.CacheHandler;
|
|
||||||
import net.coreprotect.utility.WorldUtils;
|
|
||||||
|
|
||||||
public final class PlayerBucketEmptyListener extends Queue implements Listener {
|
public final class PlayerBucketEmptyListener extends Queue implements Listener {
|
||||||
|
|
||||||
@@ -33,24 +29,13 @@ public final class PlayerBucketEmptyListener extends Queue implements Listener {
|
|||||||
|
|
||||||
if (!event.isCancelled() && Config.getConfig(world).BUCKETS && inspect == 0) {
|
if (!event.isCancelled() && Config.getConfig(world).BUCKETS && inspect == 0) {
|
||||||
Block block = event.getBlock();
|
Block block = event.getBlock();
|
||||||
BlockData blockData = block.getBlockData();
|
|
||||||
Material type = Material.WATER;
|
Material type = Material.WATER;
|
||||||
if (event.getBucket().equals(Material.LAVA_BUCKET)) {
|
if (event.getBucket().equals(Material.LAVA_BUCKET)) {
|
||||||
type = Material.LAVA;
|
type = Material.LAVA;
|
||||||
}
|
}
|
||||||
|
|
||||||
BlockState blockState = block.getState();
|
BlockState blockState = block.getState();
|
||||||
int worldId = WorldUtils.getWorldId(block.getWorld().getName());
|
queueBlockPlaceValidate(player, blockState, block, blockState, type, 1, 1, null, 0, true);
|
||||||
int unixTimestamp = (int) (System.currentTimeMillis() / 1000L);
|
|
||||||
|
|
||||||
if (type.equals(Material.WATER)) {
|
|
||||||
if (blockData instanceof Waterlogged) {
|
|
||||||
blockState = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CacheHandler.lookupCache.put("" + block.getX() + "." + block.getY() + "." + block.getZ() + "." + worldId + "", new Object[] { unixTimestamp, player, type });
|
|
||||||
queueBlockPlace(player, block.getState(), block.getType(), blockState, type, 1, 1, null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user