mirror of
https://github.com/TotalFreedomMC/TF-ProjectKorra.git
synced 2025-02-14 04:47:51 +00:00
RevertChecker
This commit is contained in:
parent
5a9bde656d
commit
f22b683b2a
6 changed files with 329 additions and 0 deletions
|
@ -108,6 +108,19 @@ public class BendingManager implements Runnable {
|
||||||
AirSuction.progressAll();
|
AirSuction.progressAll();
|
||||||
Fireball.progressAll();
|
Fireball.progressAll();
|
||||||
HealingWaters.heal(Bukkit.getServer());
|
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()) {
|
for (Player player : EarthTunnel.instances.keySet()) {
|
||||||
EarthTunnel.progress(player);
|
EarthTunnel.progress(player);
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,8 @@ public class ConfigManager {
|
||||||
plugin.getConfig().addDefault("Properties.Water.NightFactor", 1.5);
|
plugin.getConfig().addDefault("Properties.Water.NightFactor", 1.5);
|
||||||
|
|
||||||
config.addDefault("Properties.Earth.RevertEarthbending", true);
|
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.CanBendWithWeapons", true);
|
||||||
plugin.getConfig().addDefault("Properties.Earth.EarthbendableBlocks", earthbendable);
|
plugin.getConfig().addDefault("Properties.Earth.EarthbendableBlocks", earthbendable);
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,8 @@ public class Methods {
|
||||||
Methods.plugin = plugin;
|
Methods.plugin = plugin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final ItemStack pickaxe = new ItemStack(
|
||||||
|
Material.DIAMOND_PICKAXE);
|
||||||
public static ConcurrentHashMap<Block, Information> movedearth = new ConcurrentHashMap<Block, Information>();
|
public static ConcurrentHashMap<Block, Information> movedearth = new ConcurrentHashMap<Block, Information>();
|
||||||
public static ConcurrentHashMap<Integer, Information> tempair = new ConcurrentHashMap<Integer, Information>();
|
public static ConcurrentHashMap<Integer, Information> tempair = new ConcurrentHashMap<Integer, Information>();
|
||||||
public static ArrayList<Block> tempnophysics = new ArrayList<Block>();
|
public static ArrayList<Block> tempnophysics = new ArrayList<Block>();
|
||||||
|
@ -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) {
|
public static void playFocusWaterEffect(Block block) {
|
||||||
block.getWorld().playEffect(block.getLocation(), Effect.SMOKE, 4, 20);
|
block.getWorld().playEffect(block.getLocation(), Effect.SMOKE, 4, 20);
|
||||||
|
|
|
@ -38,6 +38,7 @@ public class ProjectKorra extends JavaPlugin {
|
||||||
Methods.createBendingPlayer(player.getUniqueId(), player.getName());
|
Methods.createBendingPlayer(player.getUniqueId(), player.getName());
|
||||||
}
|
}
|
||||||
getServer().getPluginManager().registerEvents(new PKListener(this), this);
|
getServer().getPluginManager().registerEvents(new PKListener(this), this);
|
||||||
|
getServer().getScheduler().runTaskTimerAsynchronously(this, new RevertChecker(this), 0, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
178
src/com/projectkorra/ProjectKorra/RevertChecker.java
Normal file
178
src/com/projectkorra/ProjectKorra/RevertChecker.java
Normal file
|
@ -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<Block, Block> revertQueue = new ConcurrentHashMap<Block, Block>();
|
||||||
|
static ConcurrentHashMap<Integer, Integer> airRevertQueue = new ConcurrentHashMap<Integer, Integer>();
|
||||||
|
private Future<ArrayList<Chunk>> returnFuture;
|
||||||
|
// static ConcurrentHashMap<Block, Material> movedEarthQueue = new
|
||||||
|
// ConcurrentHashMap<Block, Material>();
|
||||||
|
|
||||||
|
static ConcurrentHashMap<Chunk, Chunk> chunks = new ConcurrentHashMap<Chunk, Chunk>();
|
||||||
|
|
||||||
|
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<ArrayList<Chunk>> {
|
||||||
|
|
||||||
|
private Server server;
|
||||||
|
|
||||||
|
public getOccupiedChunks(Server server) {
|
||||||
|
this.server = server;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ArrayList<Chunk> call() throws Exception {
|
||||||
|
ArrayList<Chunk> chunks = new ArrayList<Chunk>();
|
||||||
|
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<Chunk> chunks = new ArrayList<Chunk>();
|
||||||
|
// 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<Chunk> chunks = returnFuture.get();
|
||||||
|
// Tools.verbose("Future called, t=" +
|
||||||
|
// System.currentTimeMillis());
|
||||||
|
|
||||||
|
Map<Block, Information> earth = new HashMap<Block, Information>();
|
||||||
|
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<Integer, Information> air = new HashMap<Integer, Information>();
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -16,6 +16,8 @@ Properties:
|
||||||
NightFactor: 1.5
|
NightFactor: 1.5
|
||||||
Earth:
|
Earth:
|
||||||
RevertEarthbending: true
|
RevertEarthbending: true
|
||||||
|
SafeRevert: true
|
||||||
|
RevertCheckTime: 300000
|
||||||
CanBendWithWeapons: true
|
CanBendWithWeapons: true
|
||||||
EarthbendableBlocks:
|
EarthbendableBlocks:
|
||||||
- STONE
|
- STONE
|
||||||
|
|
Loading…
Reference in a new issue