/* ChunkClaim Plugin for Minecraft Bukkit Servers Copyright (C) 2012 Felix Schmidt This file is part of ChunkClaim. ChunkClaim is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. ChunkClaim is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with ChunkClaim. If not, see <http://www.gnu.org/licenses/>. */ package com.github.schmidtbochum.chunkclaim; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.java.JavaPlugin; public class ChunkClaim extends JavaPlugin { public static ChunkClaim plugin; public static final Logger logger = Logger.getLogger("Minecraft"); public DataStore dataStore; public List<String> config_worlds; public boolean config_protectContainers; public boolean config_protectSwitches; public boolean config_mobsForCredits; public int config_mobPrice; public float config_creditsPerHour; public float config_maxCredits; public float config_startCredits; public int config_minModBlocks; public float config_autoDeleteDays; public boolean config_nextToForce; private boolean config_regenerateChunk; public void onDisable() { Player[] players = this.getServer().getOnlinePlayers(); for (int i = 0; i < players.length; i++) { Player player = players[i]; String playerName = player.getName(); PlayerData playerData = this.dataStore.getPlayerData(playerName); this.dataStore.savePlayerData(playerName, playerData); } this.dataStore.close(); this.plugin = null; } public void onEnable() { plugin = this; // copy default config this.getConfig().options().copyDefaults(true); this.saveConfig(); this.config_worlds = this.getConfig().getStringList("worlds"); this.config_protectSwitches = this.getConfig().getBoolean("protectSwitches"); this.config_protectContainers = this.getConfig().getBoolean("protectContainers"); this.config_mobsForCredits = this.getConfig().getBoolean("mobsForCredits"); this.config_mobPrice = this.getConfig().getInt("mobPrice"); this.config_startCredits = (float) this.getConfig().getDouble("startCredits"); this.config_creditsPerHour = (float) this.getConfig().getDouble("creditsPerHour");; this.config_maxCredits = (float) this.getConfig().getDouble("maxCredits"); this.config_minModBlocks = this.getConfig().getInt("minModBlocks"); this.config_autoDeleteDays = (float) this.getConfig().getDouble("autoDeleteDays"); this.config_nextToForce = this.getConfig().getBoolean("nextToForce"); this.config_regenerateChunk = this.getConfig().getBoolean("regenerateChunk"); try { this.dataStore = new FlatFileDataStore(); } catch (Exception e) { addLogEntry("Unable to initialize the file system data store. Details:"); addLogEntry(e.getMessage()); } // register for events PluginManager pluginManager = this.getServer().getPluginManager(); // register block events BlockEventHandler blockEventHandler = new BlockEventHandler(dataStore); pluginManager.registerEvents(blockEventHandler, this); // register player events PlayerEventHandler playerEventHandler = new PlayerEventHandler( dataStore); pluginManager.registerEvents(playerEventHandler, this); // register entity events EntityEventHandler entityEventHandler = new EntityEventHandler( dataStore); pluginManager.registerEvents(entityEventHandler, this); // register world events WorldEventHandler worldEventHandler = new WorldEventHandler(dataStore); pluginManager.registerEvents(worldEventHandler, this); if (this.config_creditsPerHour > 0) { DeliverCreditsTask task = new DeliverCreditsTask(); this.getServer() .getScheduler() .scheduleSyncRepeatingTask(this, task, 20L * 60 * 60, 20L * 60 * 60); } // Example Claim (debugging) /* if (this.dataStore.chunks.size() == 0) { Chunk newChunk = new Chunk(0, 0, "Colony6", "Notch"); this.dataStore.addChunk(newChunk); } */ } // handles slash commands public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) { Player player = null; if (sender instanceof Player) { player = (Player) sender; } if (cmd.getName().equalsIgnoreCase("chunk") && player != null) { if(!ChunkClaim.plugin.config_worlds.contains(player.getWorld().getName())) return true; if (args.length == 0) { Chunk chunk = this.dataStore.getChunkAt(player.getLocation(), null); Location location = player.getLocation(); PlayerData playerData = this.dataStore.getPlayerData(player .getName()); if(player.hasPermission("chunkclaim.admin")) { String adminstring = "ID: " + location.getChunk().getX() + "|" + location.getChunk().getZ(); if (chunk != null) { adminstring += ", Permanent: " + (chunk.modifiedBlocks<0?"true":("false ("+ chunk.modifiedBlocks + ")")); long loginDays = ((new Date()).getTime()-this.dataStore.getPlayerData(chunk.ownerName).lastLogin.getTime())/(1000 * 60 * 60 * 24); adminstring += ", Last Login: " + loginDays +" days ago."; } sendMsg(player,adminstring); if(chunk != null && !chunk.ownerName.equals(player.getName())) { StringBuilder builders = new StringBuilder(); for (int i = 0; i < chunk.builderNames.size(); i++) { builders.append(chunk.builderNames.get(i)); if (i < chunk.builderNames.size() - 1) { builders.append(", "); } } Visualization visualization = Visualization.FromChunk( chunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); sendMsg(player,"Trusted Builders:"); sendMsg(player,builders.toString()); } } if (chunk == null) { sendMsg(player,"This chunk is public."); Visualization visualization = Visualization .FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); return true; } else if (chunk.ownerName.equals(player.getName())) { if (chunk.builderNames.size() > 0) { StringBuilder builders = new StringBuilder(); for (int i = 0; i < chunk.builderNames.size(); i++) { builders.append(chunk.builderNames.get(i)); if (i < chunk.builderNames.size() - 1) { builders.append(", "); } } Visualization visualization = Visualization.FromChunk( chunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); sendMsg(player,"You own this chunk. Trusted Builders:"); sendMsg(player,builders.toString()); } else { sendMsg(player,"You own this chunk. Use /chunk trust <player> to add other builders."); } Visualization visualization = Visualization.FromChunk( chunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); return true; } else { if (chunk.isTrusted(player.getName())) { sendMsg(player,chunk.ownerName + " owns this chunk. You have build rights!"); if (playerData.lastChunk != chunk) { playerData.lastChunk = chunk; Visualization visualization = Visualization .FromChunk(chunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); } } else { sendMsg(player,chunk.ownerName + " owns this chunk. You can't build here."); if (playerData.lastChunk != chunk) { playerData.lastChunk = chunk; Visualization visualization = Visualization .FromChunk(chunk, location.getBlockY(), VisualizationType.ErrorChunk, location); Visualization.Apply(player, visualization); } } return true; } } else if (args[0].equalsIgnoreCase("abandon")) { Chunk chunk = this.dataStore.getChunkAt(player.getLocation(), null); PlayerData playerData = this.dataStore.getPlayerData(player.getName()); Location location = player.getLocation(); if(args.length==2) { int radius; int abd = 0; try { radius = Integer.parseInt(args[1]); if(radius<0) { sendMsg(player,"Error: Negative Radius"); return true; } if(radius>10) { sendMsg(player,"Error: Max Radius is 10."); return true; } ArrayList<Chunk> chunksInRadius = this.getChunksInRadius(chunk, player.getName(),radius); for(int i=0; i<chunksInRadius.size();i++) { this.dataStore.deleteChunk(chunksInRadius.get(i)); playerData.credits++; abd++; } this.dataStore.savePlayerData(player.getName(), playerData); sendMsg(player,abd + " Chunks abandoned in radius "+radius+". Credits: " + playerData.getCredits()); return true; } catch(Exception e) { sendMsg(player,"Usage: /chunk abandon [radius]"); return true; } } else if(args.length==1) { if (chunk == null) { sendMsg(player,"This chunk is public."); Visualization visualization = Visualization.FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); } else if (chunk.ownerName.equals(player.getName())) { this.dataStore.deleteChunk(chunk); playerData.credits++; this.dataStore.savePlayerData(player.getName(), playerData); sendMsg(player,"Chunk abandoned. Credits: " + playerData.getCredits()); Visualization visualization = Visualization.FromChunk(chunk, location.getBlockY(),VisualizationType.Public, location); Visualization.Apply(player, visualization); return true; } else { if (playerData.lastChunk != chunk) { playerData.lastChunk = chunk; Visualization visualization = Visualization.FromChunk(chunk, location.getBlockY(),VisualizationType.ErrorChunk, location); Visualization.Apply(player, visualization); } sendMsg(player,"You don't own this chunk. Only " + chunk.ownerName + " or the staff can delete it."); return true; } } else { sendMsg(player,"Usage: /chunk abandon [radius]"); return true; } } else if (args[0].equalsIgnoreCase("credits")) { PlayerData playerData = this.dataStore.getPlayerData(player.getName()); sendMsg(player,"You have " + playerData.getCredits() + " credits."); return true; } else if (args[0].equalsIgnoreCase("trust")) { PlayerData playerData = this.dataStore.getPlayerData(player.getName()); if(args.length!=2) { sendMsg(player,"Usage: /chunk trust <player>"); return true; } OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } ArrayList<Chunk> chunksInRadius = this.dataStore.getAllChunksForPlayer(player.getName()); if(!playerData.builderNames.contains(tName)) { for(int i=0; i<chunksInRadius.size();i++) { if(!chunksInRadius.get(i).isTrusted(tName)) { chunksInRadius.get(i).builderNames.add(tName); dataStore.writeChunkToStorage(chunksInRadius.get(i)); } } playerData.builderNames.add(tName); this.dataStore.savePlayerData(player.getName(), playerData); } sendMsg(player,"Trusted " + tName+ " in all your chunks."); return true; /* Chunk chunk = this.dataStore.getChunkAt(player.getLocation(), null); PlayerData playerData = this.dataStore.getPlayerData(player.getName()); Location location = player.getLocation(); if(args.length==3) { int radius; int abd = 0; try { radius = Integer.parseInt(args[2]); sendMsg(player,"Radius: " + radius); OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } if(radius<0) { sendMsg(player,"Error: Negative Radius"); return true; } if(radius>10) { sendMsg(player,"Error: Max Radius is 10."); return true; } ArrayList<Chunk> chunksInRadius = this.getChunksInRadius(chunk, player.getName(),radius); for(int i=0; i<chunksInRadius.size();i++) { if(!chunksInRadius.get(i).isTrusted(tName)) { chunksInRadius.get(i).builderNames.add(tName); dataStore.writeChunkToStorage(chunksInRadius.get(i)); abd++; } } this.dataStore.savePlayerData(player.getName(), playerData); sendMsg(player,"Trusted " + tName+ " in " + abd + " Chunks."); return true; } catch(Exception e) { sendMsg(player,"Usage: /chunk trust <player> [radius]"); return true; } } else if(args.length==2) { if (chunk == null) { sendMsg(player,"This chunk is public. Claim this chunk by building something in it."); Visualization visualization = Visualization.FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); } else if (chunk.ownerName.equals(player.getName())) { OfflinePlayer tp = resolvePlayer(args[1]); if (tp != null) { String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } if(!chunk.isTrusted(tName)) { chunk.builderNames.add(tName); dataStore.writeChunkToStorage(chunk); sendMsg(player,"Trusted " + tName + " in this chunk."); } } else { sendMsg(player,"Player not found."); } return true; } else { if (playerData.lastChunk != chunk) { playerData.lastChunk = chunk; Visualization visualization = Visualization.FromChunk(chunk, location.getBlockY(),VisualizationType.ErrorChunk, location); Visualization.Apply(player, visualization); } sendMsg(player,"You don't own this chunk."); return true; } } else { sendMsg(player,"Usage: /chunk trust <player> [radius]"); return true; } */ } //UNTRUST else if (args[0].equalsIgnoreCase("untrust")) { PlayerData playerData = this.dataStore.getPlayerData(player.getName()); if(args.length!=2) { sendMsg(player,"Usage: /chunk untrust <player>"); return true; } OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } ArrayList<Chunk> chunksInRadius = this.dataStore.getAllChunksForPlayer(player.getName()); if(playerData.builderNames.contains(tName)) { for(int i=0; i<chunksInRadius.size();i++) { if(chunksInRadius.get(i).isTrusted(tName)) { chunksInRadius.get(i).builderNames.remove(tName); dataStore.writeChunkToStorage(chunksInRadius.get(i)); } } playerData.builderNames.remove(tName); this.dataStore.savePlayerData(player.getName(), playerData); } sendMsg(player,"Untrusted " + tName+ " in all your chunks."); return true; /* Chunk chunk = this.dataStore.getChunkAt(player.getLocation(), null); PlayerData playerData = this.dataStore.getPlayerData(player.getName()); Location location = player.getLocation(); if(args.length==3) { int radius; int abd = 0; try { radius = Integer.parseInt(args[2]); sendMsg(player,"Radius: " + radius); OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } if(radius<0) { sendMsg(player,"Error: Negative Radius"); return true; } if(radius>10) { sendMsg(player,"Error: Max Radius is 10."); return true; } ArrayList<Chunk> chunksInRadius = this.getChunksInRadius(chunk, player.getName(),radius); for(int i=0; i<chunksInRadius.size();i++) { if(chunksInRadius.get(i).isTrusted(tName)) { chunksInRadius.get(i).builderNames.remove(tName); dataStore.writeChunkToStorage(chunksInRadius.get(i)); abd++; } } this.dataStore.savePlayerData(player.getName(), playerData); sendMsg(player,"Untrusted " + tName+ " in " + abd + " Chunks."); return true; } catch(Exception e) { sendMsg(player,"Usage: /chunk untrust <player> [radius]"); return true; } } else if(args.length==2) { if (chunk == null) { sendMsg(player,"This chunk is public. Claim this chunk by building something in it."); Visualization visualization = Visualization.FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); } else if (chunk.ownerName.equals(player.getName())) { OfflinePlayer tp = resolvePlayer(args[1]); if (tp != null) { String tName = tp.getName(); if(tName.equals(player.getName())) { sendMsg(player,"You don't trust yourself?"); return true; } if(chunk.isTrusted(tName)) { chunk.builderNames.remove(tName); dataStore.writeChunkToStorage(chunk); sendMsg(player,"Untrusted " + tName + " in this chunk."); } } else { sendMsg(player,"Player not found."); } return true; } else { if (playerData.lastChunk != chunk) { playerData.lastChunk = chunk; Visualization visualization = Visualization.FromChunk(chunk, location.getBlockY(),VisualizationType.ErrorChunk, location); Visualization.Apply(player, visualization); } sendMsg(player,"You don't own this chunk."); return true; } } else { sendMsg(player,"Usage: /chunk untrust <player> [radius]"); return true; } */ } else if (args[0].equalsIgnoreCase("ignore")) { if(!player.hasPermission("chunkclaim.admin")) { sendMsg(player,"No permission."); return true; } PlayerData playerData = this.dataStore.getPlayerData(player.getName()); playerData.ignorechunks = !playerData.ignorechunks; if(playerData.ignorechunks) { sendMsg(player,"You now ignore chunks."); } else { sendMsg(player,"You now respect chunks."); } return true; } else if (args[0].equalsIgnoreCase("delete")) { if(!player.hasPermission("chunkclaim.admin")) { sendMsg(player,"No permission."); return true; } Location location = player.getLocation(); if(args.length==3) { int radius; int abd = 0; try { radius = Integer.parseInt(args[2]); if(radius<0) { sendMsg(player,"Error: Negative Radius"); return true; } if(radius>10) { sendMsg(player,"Error: Max Radius is 10."); return true; } OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); PlayerData playerData = this.dataStore.getPlayerData(tName); org.bukkit.Chunk bukkitChunk = location.getChunk(); Chunk chunk = new Chunk(bukkitChunk.getX(),bukkitChunk.getZ(),bukkitChunk.getWorld().getName()); ArrayList<Chunk> chunksInRadius = this.getChunksInRadius(chunk, tName,radius); for(int i=0; i<chunksInRadius.size();i++) { this.dataStore.deleteChunk(chunksInRadius.get(i)); playerData.credits++; abd++; } this.dataStore.savePlayerData(tName, playerData); sendMsg(player,abd + " Chunks deleted in radius "+radius+"."); return true; } catch(Exception e) { sendMsg(player,"Usage: /chunk delete [<player> <radius>]"); return true; } } else if(args.length==1) { Chunk chunk = this.dataStore.getChunkAt(player.getLocation(), null); if (chunk == null) { sendMsg(player,"This chunk is public."); Visualization visualization = Visualization.FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); } else { PlayerData playerData = this.dataStore.getPlayerData(chunk.ownerName); this.dataStore.deleteChunk(chunk); playerData.credits++; this.dataStore.savePlayerData(chunk.ownerName, playerData); sendMsg(player,"Chunk deleted."); Visualization visualization = Visualization.FromChunk(chunk, location.getBlockY(),VisualizationType.Public, location); Visualization.Apply(player, visualization); return true; } } else { sendMsg(player,"Usage: /chunk delete [<player> <radius>]"); return true; } } else if (args[0].equalsIgnoreCase("deleteall")) { if(!player.hasPermission("chunkclaim.admin")) { sendMsg(player,"No permission."); return true; } if(args.length==2) { OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); sendMsg(player,dataStore.deleteChunksForPlayer(tName) +" chunks deleted."); return true; } else { sendMsg(player,"Usage: /chunk deleteall <player>"); return true; } } else if (args[0].equalsIgnoreCase("bonus")) { if(!player.hasPermission("chunkclaim.admin")) { sendMsg(player,"No permission."); return true; } if(args.length==3) { try { int bonus = Integer.parseInt(args[2]); OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); PlayerData playerData = this.dataStore.getPlayerData(tName); playerData.credits+=bonus; playerData.bonus+=bonus; sendMsg(player,"Adjusted " + tName + "'s bonus by " + bonus + " credits. Total credits: " + playerData.getCredits()); this.dataStore.savePlayerData(player.getName(), playerData); return true; } catch(Exception e) { sendMsg(player,"Usage: /chunk bonus <player> <credits>"); return true; } } else { sendMsg(player,"Usage: /chunk bonus <player> <credits>"); return true; } } else if (args[0].equalsIgnoreCase("claim")) { if(args.length==1) { Location location = player.getLocation(); if(!ChunkClaim.plugin.config_worlds.contains(location.getWorld().getName())) return true; PlayerData playerData = dataStore.getPlayerData(player.getName()); Chunk chunk = dataStore.getChunkAt(location, playerData.lastChunk); String playerName = player.getName(); if(chunk == null) { if(!player.hasPermission("chunkclaim.claim")) { sendMsg(player,"You don't have permissions for claiming chunks."); return true; } if(playerData.getCredits() > 0) { if(config_nextToForce && !player.hasPermission("chunkclaim.admin")) { ArrayList<Chunk> playerChunks = dataStore.getAllChunksForPlayer(playerName); if(playerChunks.size()>0) { if(!dataStore.ownsNear(location, playerName)) { sendMsg(player,"You can only claim a new chunk next to your existing chunks."); return true; } } } Chunk newChunk = new Chunk(location,playerName,playerData.builderNames); this.dataStore.addChunk(newChunk); playerData.credits--; playerData.lastChunk=newChunk; //newChunk.modify(); this.dataStore.savePlayerData(playerName, playerData); sendMsg(player,"You claimed this chunk. Credits left: " + playerData.getCredits()); Visualization visualization = Visualization.FromChunk(newChunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); } else { sendMsg(player,"Not enough credits to claim this chunk."); if(playerData.lastChunk!=chunk) { playerData.lastChunk=chunk; Visualization visualization = Visualization.FromBukkitChunk(location.getChunk(), location.getBlockY(), VisualizationType.Public, location); Visualization.Apply(player, visualization); } } return true; } else { sendMsg(player,"This chunk is not public."); } } else { sendMsg(player,"Usage: /chunk claim"); return true; } } else if (args[0].equalsIgnoreCase("list")) { if(player.hasPermission("chunkclaim.admin")) { if(args.length==2) { OfflinePlayer tp = resolvePlayer(args[1]); if (tp == null) { sendMsg(player,"Player not found."); return true; } String tName = tp.getName(); ArrayList<Chunk> chunksInRadius = this.dataStore.getAllChunksForPlayer(tName); long loginDays = ((new Date()).getTime()-this.dataStore.getPlayerData(tp.getName()).lastLogin.getTime())/(1000 * 60 * 60 * 24); long joinDays = ((new Date()).getTime()-this.dataStore.getPlayerData(tp.getName()).firstJoin.getTime())/(1000 * 60 * 60 * 24); String adminstring = tp.getName() + " | Last Login: " + loginDays +" days ago. First Join: " + joinDays + " days ago."; sendMsg(player,adminstring); for(int i=0; i<chunksInRadius.size();i++) { Chunk chunk = chunksInRadius.get(i); adminstring = "ID: " + chunk.x + "|" + chunk.z + "("+(chunk.x*16) + "|" + (chunk.z*16)+")"; if (chunk != null) { adminstring += ", Permanent: " + (chunk.modifiedBlocks<0?"true":("false ("+ chunk.modifiedBlocks + ")")); } sendMsg(player,adminstring); } return true; } else { sendMsg(player,"Usage: /chunk list <player>"); return true; } } else { return false; } } else if (args[0].equalsIgnoreCase("mark")) { if(player.hasPermission("chunkclaim.admin")) { if(args.length==1) { Location location = player.getLocation(); if(!ChunkClaim.plugin.config_worlds.contains(location.getWorld().getName())) return true; PlayerData playerData = dataStore.getPlayerData(player.getName()); Chunk chunk = dataStore.getChunkAt(location, playerData.lastChunk); if(chunk != null) { String playerName = player.getName(); ChunkClaim.addLogEntry("Chunk at " + chunk.x + "|" + chunk.z + " has been marked for deletion by " + playerName); chunk.mark(); chunk.marked = true; sendMsg(player,"Marked chunk for deletion."); } else { sendMsg(player,"This chunk is public."); } return true; } else { sendMsg(player,"Usage: /chunk mark"); return true; } } else return false; } else if (args[0].equalsIgnoreCase("unmark")) { if(player.hasPermission("chunkclaim.admin")) { if(args.length==1) { Location location = player.getLocation(); if(!ChunkClaim.plugin.config_worlds.contains(location.getWorld().getName())) return true; PlayerData playerData = dataStore.getPlayerData(player.getName()); Chunk chunk = dataStore.getChunkAt(location, playerData.lastChunk); if(chunk != null) { String playerName = player.getName(); ChunkClaim.addLogEntry("Chunk at " + chunk.x + "|" + chunk.z + " has been unmarked by " + playerName); chunk.unmark(); sendMsg(player,"Unmarked chunk."); chunk.marked = false; } else { sendMsg(player,"This chunk is public."); } return true; } else { sendMsg(player,"Usage: /chunk unmark"); return true; } } else return false; } /* else if (args[0].equalsIgnoreCase("deletemarked")) { if(player.hasPermission("chunkclaim.admin")) { if(args.length==1) { sendMsg(player,"Deleting chunks..."); for(int i=0; i < markedChunks.size();i++) { Chunk chunk = markedChunks.get(i); PlayerData playerData = this.dataStore.getPlayerData(chunk.ownerName); this.dataStore.deleteChunk(chunk); playerData.credits++; this.dataStore.savePlayerData(chunk.ownerName, playerData); ChunkClaim.addLogEntry("Marked Chunk at " + chunk.x + "|" + chunk.z + " has been deleted."); } sendMsg(player, markedChunks.size() + " Chunks deleted."); markedChunks = new ArrayList<Chunk>(); return true; } else { sendMsg(player,"Usage: /chunk deletemarked"); return true; } } else return false; } */ else if (args[0].equalsIgnoreCase("next")) { if(player.hasPermission("chunkclaim.admin")) { if(args.length==1) { Location location = player.getLocation(); if(!ChunkClaim.plugin.config_worlds.contains(location.getWorld().getName())) return true; boolean reset = false; PlayerData playerData = this.dataStore.getPlayerData(player.getName()); Chunk chunk = null; String worldName = null; boolean inspected = true; boolean marked = true; boolean permanent = false; //int r = (int)(Math.random()*dataStore.chunks.size()); int r = this.dataStore.nextChunkId; for(int i = 0; i < dataStore.chunks.size(); i++) { int j = (r + i)%dataStore.chunks.size(); chunk = dataStore.chunks.get(j); worldName = chunk.worldName; inspected = chunk.inspected; marked = chunk.marked; permanent = chunk.modifiedBlocks == -1; if(worldName.equals(player.getWorld().getName()) && !inspected && !marked && permanent) { break; } } if(chunk==null || !(worldName.equals(player.getWorld().getName()) && !inspected && !marked && permanent)) { sendMsg(player,"No chunk found."); return true; } chunk.inspected = true; int x = chunk.x*16 +8; int z = chunk.z*16 +8; int y = player.getWorld().getHighestBlockYAt(new Location(player.getWorld(),x,0,z)) + 15; Location l = new Location(player.getWorld(),x,y,z,0,90); player.teleport(l); String adminstring = "ID: " + chunk.x + "|" + chunk.z; if (chunk != null) { adminstring += ", " + chunk.ownerName; long loginDays = ((new Date()).getTime()-this.dataStore.getPlayerData(chunk.ownerName).lastLogin.getTime())/(1000 * 60 * 60 * 24); adminstring += ", Last Login: " + loginDays +" days ago."; } sendMsg(player,adminstring); Visualization visualization = Visualization.FromChunk( chunk, location.getBlockY(), VisualizationType.Chunk, location); Visualization.Apply(player, visualization); return true; } else { sendMsg(player,"Usage: /chunk next"); return true; } } else return false; } else { return false; } } return false; } public ArrayList<Chunk> getChunksInRadius(Chunk chunk, String playerName, int radius) { ArrayList<Chunk> chunksInRadius = new ArrayList<Chunk>(); for(int x = chunk.x-radius; x <= chunk.x+radius; x++) { for(int z = chunk.z-radius; z <= chunk.z+radius; z++) { Chunk foundChunk = this.dataStore.getChunkAtPos(x,z,chunk.worldName); if(foundChunk!=null && foundChunk.ownerName.equals(playerName)) { chunksInRadius.add(foundChunk); } } } return chunksInRadius; } public void regenerateChunk(Chunk chunk) { if(config_regenerateChunk) { getServer().getWorld(chunk.worldName).regenerateChunk(chunk.x, chunk.z); getServer().getWorld(chunk.worldName).unloadChunkRequest(chunk.x, chunk.z); } } public OfflinePlayer resolvePlayer(String name) { Player player = this.getServer().getPlayer(name); if (player != null) return player; // then search offline players OfflinePlayer[] offlinePlayers = this.getServer().getOfflinePlayers(); for (int i = 0; i < offlinePlayers.length; i++) { if (offlinePlayers[i].getName().equalsIgnoreCase(name)) { return offlinePlayers[i]; } } // if none found, return null return null; } public static void addLogEntry(String entry) { logger.info("ChunkClaim: " + entry); } public void sendMsg(Player player, String message) { player.sendMessage(ChatColor.YELLOW + message); } public void broadcast(String message) { Player[] players = Bukkit.getServer().getOnlinePlayers(); for(int i = 0; i < players.length; i++) { Player player = players[i]; player.sendMessage(message); } } }