Improved safety block handling during rollback teleports (#328)

This commit is contained in:
Intelli 2023-10-12 11:28:53 -06:00
parent 488392cdbc
commit 66b77ee75a
4 changed files with 41 additions and 4 deletions

View File

@ -1,9 +1,13 @@
package net.coreprotect; package net.coreprotect;
import java.io.File; import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import org.bstats.bukkit.MetricsLite; import org.bstats.bukkit.MetricsLite;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -24,6 +28,7 @@ import net.coreprotect.thread.NetworkHandler;
import net.coreprotect.thread.Scheduler; import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat; import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Color; import net.coreprotect.utility.Color;
import net.coreprotect.utility.Teleport;
import net.coreprotect.utility.Util; import net.coreprotect.utility.Util;
public final class CoreProtect extends JavaPlugin { public final class CoreProtect extends JavaPlugin {
@ -168,6 +173,15 @@ public final class CoreProtect extends JavaPlugin {
} }
} }
if (!ConfigHandler.isFolia) {
Iterator<Entry<Location, BlockData>> iterator = Teleport.revertBlocks.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Location, BlockData> entry = iterator.next();
entry.getKey().getBlock().setBlockData(entry.getValue());
iterator.remove();
}
}
ConfigHandler.serverRunning = false; ConfigHandler.serverRunning = false;
long shutdownTime = System.currentTimeMillis(); long shutdownTime = System.currentTimeMillis();
long alertTime = shutdownTime + (10 * 1000); long alertTime = shutdownTime + (10 * 1000);

View File

@ -52,7 +52,7 @@ public class Language {
phrases.put(Phrase.DATABASE_LOCKED_4, "Disabling database locking can result in data corruption."); phrases.put(Phrase.DATABASE_LOCKED_4, "Disabling database locking can result in data corruption.");
phrases.put(Phrase.DATABASE_UNREACHABLE, "Database is unreachable. Discarding data and shutting down."); phrases.put(Phrase.DATABASE_UNREACHABLE, "Database is unreachable. Discarding data and shutting down.");
phrases.put(Phrase.DEVELOPMENT_BRANCH, "Development branch detected, skipping patch scripts."); phrases.put(Phrase.DEVELOPMENT_BRANCH, "Development branch detected, skipping patch scripts.");
phrases.put(Phrase.DIRT_BLOCK, "Placed a dirt block under you."); phrases.put(Phrase.DIRT_BLOCK, "Placed a temporary safety block under you.");
phrases.put(Phrase.DISABLE_SUCCESS, "Success! Disabled {0}"); phrases.put(Phrase.DISABLE_SUCCESS, "Success! Disabled {0}");
phrases.put(Phrase.ENABLE_FAILED, "{0} was unable to start."); phrases.put(Phrase.ENABLE_FAILED, "{0} was unable to start.");
phrases.put(Phrase.ENABLE_SUCCESS, "{0} has been successfully enabled!"); phrases.put(Phrase.ENABLE_SUCCESS, "{0} has been successfully enabled!");

View File

@ -3,17 +3,21 @@ package net.coreprotect.utility;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import net.coreprotect.CoreProtect;
import net.coreprotect.config.ConfigHandler; import net.coreprotect.config.ConfigHandler;
import net.coreprotect.language.Phrase; import net.coreprotect.language.Phrase;
import net.coreprotect.model.BlockGroup; import net.coreprotect.model.BlockGroup;
import net.coreprotect.paper.PaperAdapter; import net.coreprotect.paper.PaperAdapter;
import net.coreprotect.thread.Scheduler;
public class Teleport { public class Teleport {
@ -21,6 +25,8 @@ public class Teleport {
throw new IllegalStateException("Utility class"); throw new IllegalStateException("Utility class");
} }
public static ConcurrentHashMap<Location, BlockData> revertBlocks = new ConcurrentHashMap<>();
public static void performSafeTeleport(Player player, Location location, boolean enforceTeleport) { public static void performSafeTeleport(Player player, Location location, boolean enforceTeleport) {
try { try {
Set<Material> unsafeBlocks = new HashSet<>(Arrays.asList(Material.LAVA)); Set<Material> unsafeBlocks = new HashSet<>(Arrays.asList(Material.LAVA));
@ -46,20 +52,33 @@ public class Teleport {
Material type1 = block1.getType(); Material type1 = block1.getType();
Material type2 = block2.getType(); Material type2 = block2.getType();
if (!Util.solidBlock(type1) && !Util.solidBlock(type2)) { if (Util.passableBlock(block1) && Util.passableBlock(block2)) {
if (unsafeBlocks.contains(type1)) { if (unsafeBlocks.contains(type1)) {
placeSafe = true; placeSafe = true;
} }
else { else {
safeBlock = true; safeBlock = true;
if (placeSafe) { if (placeSafe && player.getGameMode() == GameMode.SURVIVAL) {
int below = checkY - 1; int below = checkY - 1;
Block blockBelow = location.getWorld().getBlockAt(playerX, below, playerZ); Block blockBelow = location.getWorld().getBlockAt(playerX, below, playerZ);
if (checkY < worldHeight && unsafeBlocks.contains(blockBelow.getType())) { if (checkY < worldHeight && unsafeBlocks.contains(blockBelow.getType())) {
alert = true; alert = true;
block1.setType(Material.DIRT); Location revertLocation = block1.getLocation();
BlockData revertBlockData = block1.getBlockData();
revertBlocks.put(revertLocation, revertBlockData);
if (!ConfigHandler.isFolia) {
block1.setType(Material.BARRIER);
}
else {
block1.setType(Material.DIRT);
}
checkY++; checkY++;
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
block1.setBlockData(revertBlockData);
revertBlocks.remove(revertLocation);
}, revertLocation, 1200);
} }
} }
} }

View File

@ -993,6 +993,10 @@ public class Util extends Queue {
return type.isSolid(); return type.isSolid();
} }
public static boolean passableBlock(Block block) {
return block.isPassable();
}
public static Material getType(Block block) { public static Material getType(Block block) {
// Temp code // Temp code
return block.getType(); return block.getType();