From f22b683b2a3a32ccfb4f1528b671d17e76ff6b6f Mon Sep 17 00:00:00 2001 From: MistPhizzle Date: Thu, 26 Jun 2014 23:08:41 -0400 Subject: [PATCH] RevertChecker --- .../ProjectKorra/BendingManager.java | 13 ++ .../ProjectKorra/ConfigManager.java | 2 + .../projectkorra/ProjectKorra/Methods.java | 133 +++++++++++++ .../ProjectKorra/ProjectKorra.java | 1 + .../ProjectKorra/RevertChecker.java | 178 ++++++++++++++++++ src/config.yml | 2 + 6 files changed, 329 insertions(+) create mode 100644 src/com/projectkorra/ProjectKorra/RevertChecker.java diff --git a/src/com/projectkorra/ProjectKorra/BendingManager.java b/src/com/projectkorra/ProjectKorra/BendingManager.java index 3894ce7c..28643b5a 100644 --- a/src/com/projectkorra/ProjectKorra/BendingManager.java +++ b/src/com/projectkorra/ProjectKorra/BendingManager.java @@ -108,6 +108,19 @@ public class BendingManager implements Runnable { AirSuction.progressAll(); Fireball.progressAll(); HealingWaters.heal(Bukkit.getServer()); + + for (Block block : RevertChecker.revertQueue.keySet()) { + // Tools.removeEarthbendedBlockByIndex(block); + // if (Tools.revertBlock(block)) + Methods.revertBlock(block); + RevertChecker.revertQueue.remove(block); + } + + for (int i : RevertChecker.airRevertQueue.keySet()) { + Methods.revertAirBlock(i); + RevertChecker.airRevertQueue.remove(i); + } + for (Player player : EarthTunnel.instances.keySet()) { EarthTunnel.progress(player); } diff --git a/src/com/projectkorra/ProjectKorra/ConfigManager.java b/src/com/projectkorra/ProjectKorra/ConfigManager.java index cd1d6608..335dbbb8 100644 --- a/src/com/projectkorra/ProjectKorra/ConfigManager.java +++ b/src/com/projectkorra/ProjectKorra/ConfigManager.java @@ -42,6 +42,8 @@ public class ConfigManager { plugin.getConfig().addDefault("Properties.Water.NightFactor", 1.5); config.addDefault("Properties.Earth.RevertEarthbending", true); + config.addDefault("Properties.Earth.SafeRevert", true); + config.addDefault("Properties.Earth.RevertCheckTime", 300000); plugin.getConfig().addDefault("Properties.Earth.CanBendWithWeapons", true); plugin.getConfig().addDefault("Properties.Earth.EarthbendableBlocks", earthbendable); diff --git a/src/com/projectkorra/ProjectKorra/Methods.java b/src/com/projectkorra/ProjectKorra/Methods.java index 23408e7e..8832c63e 100644 --- a/src/com/projectkorra/ProjectKorra/Methods.java +++ b/src/com/projectkorra/ProjectKorra/Methods.java @@ -48,6 +48,8 @@ public class Methods { Methods.plugin = plugin; } + private static final ItemStack pickaxe = new ItemStack( + Material.DIAMOND_PICKAXE); public static ConcurrentHashMap movedearth = new ConcurrentHashMap(); public static ConcurrentHashMap tempair = new ConcurrentHashMap(); public static ArrayList tempnophysics = new ArrayList(); @@ -598,6 +600,137 @@ public class Methods { } } + public static void revertAirBlock(int i) { + revertAirBlock(i, false); + } + + public static void revertAirBlock(int i, boolean force) { + if (!tempair.containsKey(i)) + return; + Information info = tempair.get(i); + Block block = info.getState().getBlock(); + if (block.getType() != Material.AIR && !block.isLiquid()) { + if (force || !movedearth.containsKey(block)) { + dropItems( + block, + getDrops(block, info.getState().getType(), info + .getState().getRawData(), pickaxe)); + // ItemStack item = new ItemStack(info.getType()); + // item.setData(new MaterialData(info.getType(), + // info.getData())); + // block.getWorld().dropItem(block.getLocation(), item); + tempair.remove(i); + } else { + info.setTime(info.getTime() + 10000); + } + return; + } else { + // block.setType(info.getType()); + // block.setData(info.getData()); + info.getState().update(true); + tempair.remove(i); + } + } + + public static boolean revertBlock(Block block) { + byte full = 0x0; + if (movedearth.containsKey(block)) { + Information info = movedearth.get(block); + Block sourceblock = info.getState().getBlock(); + + if (info.getState().getType() == Material.AIR) { + movedearth.remove(block); + return true; + } + + if (block.equals(sourceblock)) { + // verbose("Equals!"); + // if (block.getType() == Material.SANDSTONE + // && info.getState().getType() == Material.SAND) + // block.setType(Material.SAND); + info.getState().update(true); + if (EarthColumn.blockInAllAffectedBlocks(sourceblock)) + EarthColumn.revertBlock(sourceblock); + if (EarthColumn.blockInAllAffectedBlocks(block)) + EarthColumn.revertBlock(block); + EarthColumn.resetBlock(sourceblock); + EarthColumn.resetBlock(block); + movedearth.remove(block); + return true; + } + + if (movedearth.containsKey(sourceblock)) { + addTempAirBlock(block); + movedearth.remove(block); + return true; + // verbose("Block: " + block); + // verbose("Sourceblock: " + sourceblock); + // verbose("StartBlock: " + startblock); + // if (startblock != null) { + // if (startblock.equals(sourceblock)) { + // sourceblock.setType(info.getType()); + // sourceblock.setData(info.getData()); + // if (adjacentToThreeOrMoreSources(block)) { + // block.setType(Material.WATER); + // block.setData(full); + // } else { + // block.setType(Material.AIR); + // } + // movedearth.get(startblock).setInteger(10); + // if (EarthColumn + // .blockInAllAffectedBlocks(sourceblock)) + // EarthColumn.revertBlock(sourceblock); + // if (EarthColumn.blockInAllAffectedBlocks(block)) + // EarthColumn.revertBlock(block); + // EarthColumn.resetBlock(sourceblock); + // EarthColumn.resetBlock(block); + // movedearth.remove(block); + // return true; + // } + // + // } else { + // startblock = block; + // } + // revertBlock(sourceblock, startblock, true); + } + + if (sourceblock.getType() == Material.AIR || sourceblock.isLiquid()) { + // sourceblock.setType(info.getType()); + // sourceblock.setData(info.getData()); + info.getState().update(true); + } else { + // if (info.getType() != Material.AIR) { + // ItemStack item = new ItemStack(info.getType()); + // item.setData(new MaterialData(info.getType(), info + // .getData())); + // block.getWorld().dropItem(block.getLocation(), item); + dropItems( + block, + getDrops(block, info.getState().getType(), info + .getState().getRawData(), pickaxe)); + // } + } + + // if (info.getInteger() != 10) { + if (isAdjacentToThreeOrMoreSources(block)) { + block.setType(Material.WATER); + block.setData(full); + } else { + block.setType(Material.AIR); + } + // } + + if (EarthColumn.blockInAllAffectedBlocks(sourceblock)) + EarthColumn.revertBlock(sourceblock); + if (EarthColumn.blockInAllAffectedBlocks(block)) + EarthColumn.revertBlock(block); + EarthColumn.resetBlock(sourceblock); + EarthColumn.resetBlock(block); + movedearth.remove(block); + } + return true; + } + public static void playFocusWaterEffect(Block block) { block.getWorld().playEffect(block.getLocation(), Effect.SMOKE, 4, 20); diff --git a/src/com/projectkorra/ProjectKorra/ProjectKorra.java b/src/com/projectkorra/ProjectKorra/ProjectKorra.java index 3aa07e15..01979166 100644 --- a/src/com/projectkorra/ProjectKorra/ProjectKorra.java +++ b/src/com/projectkorra/ProjectKorra/ProjectKorra.java @@ -38,6 +38,7 @@ public class ProjectKorra extends JavaPlugin { Methods.createBendingPlayer(player.getUniqueId(), player.getName()); } getServer().getPluginManager().registerEvents(new PKListener(this), this); + getServer().getScheduler().runTaskTimerAsynchronously(this, new RevertChecker(this), 0, 200); } @Override diff --git a/src/com/projectkorra/ProjectKorra/RevertChecker.java b/src/com/projectkorra/ProjectKorra/RevertChecker.java new file mode 100644 index 00000000..63691749 --- /dev/null +++ b/src/com/projectkorra/ProjectKorra/RevertChecker.java @@ -0,0 +1,178 @@ +package com.projectkorra.ProjectKorra; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Future; + +import org.apache.commons.lang.exception.ExceptionUtils; +import org.bukkit.Chunk; +import org.bukkit.Server; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +public class RevertChecker implements Runnable { + + static ConcurrentHashMap revertQueue = new ConcurrentHashMap(); + static ConcurrentHashMap airRevertQueue = new ConcurrentHashMap(); + private Future> returnFuture; + // static ConcurrentHashMap movedEarthQueue = new + // ConcurrentHashMap(); + + static ConcurrentHashMap chunks = new ConcurrentHashMap(); + + private ProjectKorra plugin; + + private static final boolean safeRevert = ProjectKorra.plugin.getConfig().getBoolean("Properties.Earth.SafeRevert"); + + private long time; + + public RevertChecker(ProjectKorra bending) { + plugin = bending; + } + + private class getOccupiedChunks implements Callable> { + + private Server server; + + public getOccupiedChunks(Server server) { + this.server = server; + } + + @Override + public ArrayList call() throws Exception { + ArrayList chunks = new ArrayList(); + Player[] players = server.getOnlinePlayers(); + + for (Player player : players) { + Chunk chunk = player.getLocation().getChunk(); + if (!chunks.contains(chunk)) + chunks.add(chunk); + } + + return chunks; + } + + } + + public void run() { + time = System.currentTimeMillis(); + + if (plugin.getConfig().getBoolean("Properties.Earth.RevertEarthbending")) { + + // ArrayList chunks = new ArrayList(); + // Player[] players = plugin.getServer().getOnlinePlayers(); + // + // for (Player player : players) { + // Chunk chunk = player.getLocation().getChunk(); + // if (!chunks.contains(chunk)) + // chunks.add(chunk); + // } + + try { + // Tools.verbose("Calling future at t=" + // + System.currentTimeMillis()); + returnFuture = plugin + .getServer() + .getScheduler() + .callSyncMethod(plugin, + new getOccupiedChunks(plugin.getServer())); + ArrayList chunks = returnFuture.get(); + // Tools.verbose("Future called, t=" + + // System.currentTimeMillis()); + + Map earth = new HashMap(); + earth.putAll(Methods.movedearth); + + for (Block block : earth.keySet()) { + if (revertQueue.containsKey(block)) + continue; + boolean remove = true; + Information info = earth.get(block); + if (time < info.getTime() + ProjectKorra.plugin.getConfig().getLong("Properties.Earth.RevertCheckTime") + || (chunks.contains(block.getChunk()) && safeRevert)) { + remove = false; + } + if (remove) { + addToRevertQueue(block); + } + } + + Map air = new HashMap(); + air.putAll(Methods.tempair); + + for (Integer i : air.keySet()) { + if (airRevertQueue.containsKey(i)) + continue; + boolean remove = true; + Information info = air.get(i); + Block block = info.getBlock(); + if (time < info.getTime() + ProjectKorra.plugin.getConfig().getLong("Properties.Earth.RevertCheckTime") + || (chunks.contains(block.getChunk()) && safeRevert)) { + remove = false; + } + if (remove) { + addToAirRevertQueue(i); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + + // for (Block block : Tools.tempearthblocks.keySet()) { + // if (revertQueue.containsKey(block)) + // continue; + // boolean remove = true; + // + // Block index = Tools.tempearthblocks.get(block); + // if (Tools.movedearth.containsKey(index)) { + // Information info = Tools.movedearth.get(index); + // if (time < info.getTime() + ConfigManager.revertchecktime + // || (chunks.contains(index.getChunk()) && safeRevert)) { + // remove = false; + // } + // } + // + // if (remove) + // addToRevertQueue(block); + // + // } + + // for (Block block : Tools.movedearth.keySet()) { + // if (movedEarthQueue.containsKey(block)) + // continue; + // Information info = Tools.movedearth.get(block); + // if (time >= info.getTime() + ConfigManager.revertchecktime) { + // // if (Tools.tempearthblocks.containsKey(info.getBlock())) + // // Tools.verbose("PROBLEM!"); + // // block.setType(info.getType()); + // // Tools.movedearth.remove(block); + // addToMovedEarthQueue(block, info.getType()); + // } + // } + + // Tools.writeToLog("Still " + Tools.tempearthblocks.size() + // + " remaining."); + } + } + + private void addToAirRevertQueue(int i) { + if (!airRevertQueue.containsKey(i)) + airRevertQueue.put(i, i); + + } + + // void addToMovedEarthQueue(Block block, Material type) { + // if (!movedEarthQueue.containsKey(block)) + // movedEarthQueue.put(block, type); + // + // } + + void addToRevertQueue(Block block) { + if (!revertQueue.containsKey(block)) + revertQueue.put(block, block); + } + +} \ No newline at end of file diff --git a/src/config.yml b/src/config.yml index cc37ddd6..30d196ad 100644 --- a/src/config.yml +++ b/src/config.yml @@ -16,6 +16,8 @@ Properties: NightFactor: 1.5 Earth: RevertEarthbending: true + SafeRevert: true + RevertCheckTime: 300000 CanBendWithWeapons: true EarthbendableBlocks: - STONE