mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2024-11-27 01:05:38 +00:00
Added /rollback undo
This commit is contained in:
parent
ee6b93e208
commit
0b146943ff
@ -1,5 +1,5 @@
|
|||||||
#Tue, 27 Aug 2013 12:35:14 +0200
|
#Tue, 27 Aug 2013 16:20:04 +0200
|
||||||
|
|
||||||
program.VERSION=3.1
|
program.VERSION=3.1
|
||||||
program.BUILDNUM=514
|
program.BUILDNUM=522
|
||||||
program.BUILDDATE=08/27/2013 12\:35 PM
|
program.BUILDDATE=08/27/2013 04\:20 PM
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
#Build Number for ANT. Do not edit!
|
#Build Number for ANT. Do not edit!
|
||||||
#Tue Aug 27 12:35:14 CEST 2013
|
#Tue Aug 27 16:20:04 CEST 2013
|
||||||
build.number=515
|
build.number=523
|
||||||
|
@ -8,7 +8,7 @@ import org.bukkit.command.CommandSender;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@CommandPermissions(level = AdminLevel.SUPER, source = SourceType.BOTH, block_host_console = true)
|
@CommandPermissions(level = AdminLevel.SUPER, source = SourceType.BOTH, block_host_console = true)
|
||||||
@CommandParameters(description = "Issues a rollback on a player", usage = "/<command> <[partialname] | purge [partialname] | purgeall>", aliases = "rb")
|
@CommandParameters(description = "Issues a rollback on a player", usage = "/<command> <[partialname] | undo [partialname] purge [partialname] | purgeall>", aliases = "rb")
|
||||||
public class Command_rollback extends TFM_Command
|
public class Command_rollback extends TFM_Command
|
||||||
{
|
{
|
||||||
@Override
|
@Override
|
||||||
@ -16,25 +16,58 @@ public class Command_rollback extends TFM_Command
|
|||||||
{
|
{
|
||||||
if (args.length == 1)
|
if (args.length == 1)
|
||||||
{
|
{
|
||||||
if (args[0].equalsIgnoreCase("purgeall"))
|
if ("purgeall".equalsIgnoreCase(args[0]))
|
||||||
{
|
{
|
||||||
TFM_Util.adminAction(sender.getName(), "Purging all rollback history.", false);
|
TFM_Util.adminAction(sender.getName(), "Purging all rollback history", false);
|
||||||
playerMsg("Purged all rollback history for " + TFM_RollbackManager.purgeEntries() + " players.");
|
playerMsg("Purged all rollback history for " + TFM_RollbackManager.purgeEntries() + " players.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
String playerName = getPlayerName(args[0]);
|
String playerName = getPlayerName(args[0]);
|
||||||
|
|
||||||
|
if (!TFM_RollbackManager.canRollback(playerName))
|
||||||
|
{
|
||||||
|
playerMsg("That player has no entries stored.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (TFM_RollbackManager.canUndoRollback(playerName))
|
||||||
|
{
|
||||||
|
playerMsg("That player has just been rolled back.");
|
||||||
|
}
|
||||||
|
|
||||||
TFM_Util.adminAction(sender.getName(), "Rolling back player: " + playerName, false);
|
TFM_Util.adminAction(sender.getName(), "Rolling back player: " + playerName, false);
|
||||||
playerMsg("Rolled back " + TFM_RollbackManager.rollback(playerName) + " edits for " + playerName + ".");
|
playerMsg("Rolled back " + TFM_RollbackManager.rollback(playerName) + " edits for " + playerName + ".");
|
||||||
|
playerMsg("If this rollback was a mistake, use /rollback undo " + playerName + " within 20 seconds to reverse the rollback.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (args.length == 2)
|
else if (args.length == 2)
|
||||||
{
|
{
|
||||||
if (args[0].equalsIgnoreCase("purge"))
|
if ("purge".equalsIgnoreCase(args[0]))
|
||||||
{
|
{
|
||||||
String playerName = getPlayerName(args[1]);
|
String playerName = getPlayerName(args[1]);
|
||||||
|
|
||||||
|
if (!TFM_RollbackManager.canRollback(playerName))
|
||||||
|
{
|
||||||
|
playerMsg("That player has no entries stored.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
playerMsg("Purged " + TFM_RollbackManager.purgeEntries(playerName) + " rollback history entries for " + playerName + ".");
|
playerMsg("Purged " + TFM_RollbackManager.purgeEntries(playerName) + " rollback history entries for " + playerName + ".");
|
||||||
}
|
}
|
||||||
|
else if ("undo".equalsIgnoreCase(args[0]))
|
||||||
|
{
|
||||||
|
String playerName = getPlayerName(args[1]);
|
||||||
|
|
||||||
|
if (!TFM_RollbackManager.canUndoRollback(playerName))
|
||||||
|
{
|
||||||
|
playerMsg("That player hasn't been rolled back recently.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
TFM_Util.adminAction(sender.getName(), "Reverting rollback for player: " + playerName, false);
|
||||||
|
playerMsg("Reverted " + TFM_RollbackManager.undoRollback(playerName) + " edits for " + playerName + ".");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
@ -115,7 +115,7 @@ public class TFM_PlayerListener implements Listener
|
|||||||
TFM_Util.playerMsg(player, "Block edits at (" + ChatColor.WHITE + "x" + location.getBlockX() + ", y" + location.getBlockY() + ", z" + location.getBlockZ() + ChatColor.BLUE + ")" + ChatColor.WHITE + ":", ChatColor.BLUE);
|
TFM_Util.playerMsg(player, "Block edits at (" + ChatColor.WHITE + "x" + location.getBlockX() + ", y" + location.getBlockY() + ", z" + location.getBlockZ() + ChatColor.BLUE + ")" + ChatColor.WHITE + ":", ChatColor.BLUE);
|
||||||
for (RollbackEntry entry : entries)
|
for (RollbackEntry entry : entries)
|
||||||
{
|
{
|
||||||
TFM_Util.playerMsg(player, " - " + ChatColor.BLUE + entry.getAuthor() + " " + entry.getType() + " " + StringUtils.capitalize(entry.getMaterial().toString().toLowerCase()) + (entry.getData() == 0 ? "" : ":" + entry.getData()));
|
TFM_Util.playerMsg(player, " - " + ChatColor.BLUE + entry.author + " " + entry.getType() + " " + StringUtils.capitalize(entry.getMaterial().toString().toLowerCase()) + (entry.data == 0 ? "" : ":" + entry.data));
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
package me.StevenLawson.TotalFreedomMod;
|
package me.StevenLawson.TotalFreedomMod;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -10,10 +11,12 @@ 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.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
|
|
||||||
public class TFM_RollbackManager
|
public class TFM_RollbackManager
|
||||||
{
|
{
|
||||||
private static final Map<String, List<RollbackEntry>> PLAYER_HISTORY_MAP = new HashMap<String, List<RollbackEntry>>();
|
private static final Map<String, List<RollbackEntry>> PLAYER_HISTORY = new HashMap<String, List<RollbackEntry>>();
|
||||||
|
private static final List<String> REMOVE_ROLLBACK_HISTORY = new ArrayList<String>();
|
||||||
|
|
||||||
private TFM_RollbackManager()
|
private TFM_RollbackManager()
|
||||||
{
|
{
|
||||||
@ -33,6 +36,7 @@ public class TFM_RollbackManager
|
|||||||
private static void storeEntry(Player player, RollbackEntry entry)
|
private static void storeEntry(Player player, RollbackEntry entry)
|
||||||
{
|
{
|
||||||
List<RollbackEntry> playerEntryList = getEntriesByPlayer(player.getName());
|
List<RollbackEntry> playerEntryList = getEntriesByPlayer(player.getName());
|
||||||
|
|
||||||
if (playerEntryList != null)
|
if (playerEntryList != null)
|
||||||
{
|
{
|
||||||
playerEntryList.add(0, entry);
|
playerEntryList.add(0, entry);
|
||||||
@ -41,7 +45,7 @@ public class TFM_RollbackManager
|
|||||||
|
|
||||||
public static int purgeEntries()
|
public static int purgeEntries()
|
||||||
{
|
{
|
||||||
Iterator<List<RollbackEntry>> it = PLAYER_HISTORY_MAP.values().iterator();
|
Iterator<List<RollbackEntry>> it = PLAYER_HISTORY.values().iterator();
|
||||||
while (it.hasNext())
|
while (it.hasNext())
|
||||||
{
|
{
|
||||||
List<RollbackEntry> playerEntryList = it.next();
|
List<RollbackEntry> playerEntryList = it.next();
|
||||||
@ -50,45 +54,97 @@ public class TFM_RollbackManager
|
|||||||
playerEntryList.clear();
|
playerEntryList.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return PLAYER_HISTORY_MAP.size();
|
return PLAYER_HISTORY.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int purgeEntries(String playerName)
|
public static int purgeEntries(String playerName)
|
||||||
{
|
{
|
||||||
List<RollbackEntry> playerEntryList = getEntriesByPlayer(playerName);
|
List<RollbackEntry> playerEntryList = getEntriesByPlayer(playerName);
|
||||||
if (playerEntryList != null)
|
|
||||||
|
if (playerEntryList == null)
|
||||||
{
|
{
|
||||||
int count = playerEntryList.size();
|
return 0;
|
||||||
playerEntryList.clear();
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
int count = playerEntryList.size();
|
||||||
|
playerEntryList.clear();
|
||||||
|
return count;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canRollback(String playerName)
|
public static boolean canRollback(String playerName)
|
||||||
{
|
{
|
||||||
return PLAYER_HISTORY_MAP.containsKey(playerName.toLowerCase());
|
return PLAYER_HISTORY.containsKey(playerName.toLowerCase()) && !PLAYER_HISTORY.get(playerName.toLowerCase()).isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean canUndoRollback(String playerName)
|
||||||
|
{
|
||||||
|
return REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int rollback(String playerName)
|
public static int rollback(final String playerName)
|
||||||
{
|
{
|
||||||
List<RollbackEntry> playerEntryList = getEntriesByPlayer(playerName);
|
final List<RollbackEntry> entries = getEntriesByPlayer(playerName);
|
||||||
if (playerEntryList != null)
|
if (entries == null)
|
||||||
{
|
{
|
||||||
int count = playerEntryList.size();
|
return 0;
|
||||||
Iterator<RollbackEntry> it = playerEntryList.iterator();
|
|
||||||
while (it.hasNext())
|
|
||||||
{
|
|
||||||
RollbackEntry entry = it.next();
|
|
||||||
if (entry != null)
|
|
||||||
{
|
|
||||||
entry.restore();
|
|
||||||
}
|
|
||||||
it.remove();
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
int count = entries.size();
|
||||||
|
for (RollbackEntry entry : entries)
|
||||||
|
{
|
||||||
|
if (entry != null)
|
||||||
|
{
|
||||||
|
entry.restore();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase()))
|
||||||
|
{
|
||||||
|
REMOVE_ROLLBACK_HISTORY.add(playerName.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
new BukkitRunnable()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
if (REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase()))
|
||||||
|
{
|
||||||
|
REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase());
|
||||||
|
purgeEntries(playerName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskLater(TotalFreedomMod.plugin, 20L * 20L);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int undoRollback(String playerName)
|
||||||
|
{
|
||||||
|
List<RollbackEntry> entries = getEntriesByPlayer(playerName);
|
||||||
|
|
||||||
|
if (entries == null)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
entries = Lists.reverse(entries);
|
||||||
|
|
||||||
|
int count = entries.size();
|
||||||
|
for (RollbackEntry entry : entries)
|
||||||
|
{
|
||||||
|
if (entry != null)
|
||||||
|
{
|
||||||
|
entry.redo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (REMOVE_ROLLBACK_HISTORY.contains(playerName.toLowerCase()))
|
||||||
|
{
|
||||||
|
REMOVE_ROLLBACK_HISTORY.remove(playerName.toLowerCase());
|
||||||
|
}
|
||||||
|
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<RollbackEntry> getEntriesAtLocation(final Location location)
|
public static List<RollbackEntry> getEntriesAtLocation(final Location location)
|
||||||
@ -99,11 +155,11 @@ public class TFM_RollbackManager
|
|||||||
final String testWorldName = location.getWorld().getName();
|
final String testWorldName = location.getWorld().getName();
|
||||||
|
|
||||||
List<RollbackEntry> entries = new ArrayList<RollbackEntry>();
|
List<RollbackEntry> entries = new ArrayList<RollbackEntry>();
|
||||||
for (String playername : PLAYER_HISTORY_MAP.keySet())
|
for (String playername : PLAYER_HISTORY.keySet())
|
||||||
{
|
{
|
||||||
for (RollbackEntry entry : PLAYER_HISTORY_MAP.get(playername))
|
for (RollbackEntry entry : PLAYER_HISTORY.get(playername.toLowerCase()))
|
||||||
{
|
{
|
||||||
if (testX == entry.x && testY == entry.y && testZ == entry.z && testWorldName.equals(entry.getWorldName()))
|
if (testX == entry.x && testY == entry.y && testZ == entry.z && testWorldName.equals(entry.worldName))
|
||||||
{
|
{
|
||||||
entries.add(0, entry);
|
entries.add(0, entry);
|
||||||
}
|
}
|
||||||
@ -116,11 +172,11 @@ public class TFM_RollbackManager
|
|||||||
private static List<RollbackEntry> getEntriesByPlayer(String playerName)
|
private static List<RollbackEntry> getEntriesByPlayer(String playerName)
|
||||||
{
|
{
|
||||||
playerName = playerName.toLowerCase();
|
playerName = playerName.toLowerCase();
|
||||||
List<RollbackEntry> playerEntryList = PLAYER_HISTORY_MAP.get(playerName);
|
List<RollbackEntry> playerEntryList = PLAYER_HISTORY.get(playerName.toLowerCase());
|
||||||
if (playerEntryList == null)
|
if (playerEntryList == null)
|
||||||
{
|
{
|
||||||
playerEntryList = new ArrayList<RollbackEntry>();
|
playerEntryList = new ArrayList<RollbackEntry>();
|
||||||
PLAYER_HISTORY_MAP.put(playerName, playerEntryList);
|
PLAYER_HISTORY.put(playerName.toLowerCase(), playerEntryList);
|
||||||
}
|
}
|
||||||
return playerEntryList;
|
return playerEntryList;
|
||||||
}
|
}
|
||||||
@ -146,13 +202,13 @@ public class TFM_RollbackManager
|
|||||||
public static class RollbackEntry
|
public static class RollbackEntry
|
||||||
{
|
{
|
||||||
// Use of primitives to decrease overhead
|
// Use of primitives to decrease overhead
|
||||||
private final String author;
|
public final String author;
|
||||||
private final String worldName;
|
public final String worldName;
|
||||||
public final int x;
|
public final int x;
|
||||||
public final short y;
|
public final short y;
|
||||||
public final int z;
|
public final int z;
|
||||||
private final short blockId;
|
public final byte data;
|
||||||
private final byte data;
|
public final short blockId;
|
||||||
private final boolean isBreak;
|
private final boolean isBreak;
|
||||||
|
|
||||||
private RollbackEntry(String author, Block block, EntryType entryType)
|
private RollbackEntry(String author, Block block, EntryType entryType)
|
||||||
@ -173,17 +229,12 @@ public class TFM_RollbackManager
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
blockId = (short) block.getTypeId();
|
this.blockId = (short) block.getTypeId();
|
||||||
data = 0;
|
this.data = block.getData();
|
||||||
this.isBreak = false;
|
this.isBreak = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getAuthor()
|
|
||||||
{
|
|
||||||
return author;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Location getLocation()
|
public Location getLocation()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -202,26 +253,6 @@ public class TFM_RollbackManager
|
|||||||
return Material.getMaterial(blockId);
|
return Material.getMaterial(blockId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getX()
|
|
||||||
{
|
|
||||||
return x;
|
|
||||||
}
|
|
||||||
|
|
||||||
public short getY()
|
|
||||||
{
|
|
||||||
return y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getZ()
|
|
||||||
{
|
|
||||||
return z;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte getData()
|
|
||||||
{
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
public EntryType getType()
|
public EntryType getType()
|
||||||
{
|
{
|
||||||
return (isBreak ? EntryType.BLOCK_BREAK : EntryType.BLOCK_PLACE);
|
return (isBreak ? EntryType.BLOCK_BREAK : EntryType.BLOCK_PLACE);
|
||||||
@ -229,7 +260,7 @@ public class TFM_RollbackManager
|
|||||||
|
|
||||||
public void restore()
|
public void restore()
|
||||||
{
|
{
|
||||||
Block block = Bukkit.getWorld(worldName).getBlockAt(x, y, z);
|
final Block block = Bukkit.getWorld(worldName).getBlockAt(x, y, z);
|
||||||
if (isBreak)
|
if (isBreak)
|
||||||
{
|
{
|
||||||
block.setType(getMaterial());
|
block.setType(getMaterial());
|
||||||
@ -241,9 +272,19 @@ public class TFM_RollbackManager
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getWorldName()
|
public void redo()
|
||||||
{
|
{
|
||||||
return worldName;
|
final Block block = Bukkit.getWorld(worldName).getBlockAt(x, y, z);
|
||||||
|
|
||||||
|
if (isBreak)
|
||||||
|
{
|
||||||
|
block.setType(Material.AIR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
block.setType(getMaterial());
|
||||||
|
block.setData(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user