/src/main/java/net/peoplero/arg/RegionHandler.java

https://github.com/IBCodin/AutoRegionGuard · Java · 404 lines · 346 code · 44 blank · 14 comment · 97 complexity · a61a2ea607b4b7485a58fb7ab22b52dd MD5 · raw file

  1. package net.peoplero.arg;
  2. import java.util.Date;
  3. import java.util.HashMap;
  4. import java.util.HashSet;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.logging.Logger;
  8. import org.bukkit.ChatColor;
  9. import org.bukkit.Chunk;
  10. import org.bukkit.entity.Player;
  11. public class RegionHandler {
  12. public static Logger log = Logger.getLogger("Minecraft");
  13. ARG plugin;
  14. //Create hashmap for players with autoclaim enabled
  15. public static Set<String> AutoClaimers = new HashSet<String>();
  16. //Create hashmap for players' current chunk
  17. private final static Map<String, Chunk> ExistingChunk = new HashMap<String, Chunk>();
  18. //Create hashmap for owned regions
  19. private static Map<String, Set<String>> OwnedRegions = new HashMap<String, Set<String>>();
  20. //Create hashmap for tracking the last time a player was online
  21. private static Map<String, Date> LastOnline = new HashMap<String, Date>();
  22. //Create hashmap for counting changes in players' current chunk
  23. private final static Map<String, Integer> CurrentChunkc = new HashMap<String, Integer>();
  24. public static boolean autoclaimdefault;
  25. public static int maxchunks;
  26. public static int timetoexpire;
  27. public static int claimthreshold;
  28. RegionHandler(ARG plugin) {
  29. this.plugin = plugin;
  30. }
  31. public void BlockCounter(Player player, Chunk newchunk){
  32. String playername = player.getName().toLowerCase();
  33. if (AutoClaimers.contains(playername)){
  34. //determine chunk block was placed in
  35. if (ExistingChunk.get(playername) == null) ExistingChunk.put(playername, null);
  36. if (CurrentChunkc.get(playername) == null) CurrentChunkc.put(playername, 0);
  37. if (newchunk == ExistingChunk.get(playername)){
  38. CurrentChunkc.put(playername, CurrentChunkc.get(playername)+1);
  39. if (CurrentChunkc.get(playername) >= claimthreshold){
  40. claimChunk(player, newchunk);
  41. CurrentChunkc.put(playername, 0);
  42. }
  43. }else{
  44. CurrentChunkc.put(playername, 1);
  45. }
  46. ExistingChunk.put(playername, newchunk);
  47. //player.sendMessage("Chunk Count at " + CurrentChunkc.get(playername) + " for chunk: " + ExistingChunk.get(playername));
  48. }
  49. }
  50. public void toggleAutoClaim(Player player){
  51. String playername = player.getName().toLowerCase();
  52. if (AutoClaimers.contains(playername)){
  53. AutoClaimers.remove(playername);
  54. player.sendMessage(ChatColor.YELLOW + "AutoClaim is now off.");
  55. }else{
  56. AutoClaimers.add(playername);
  57. player.sendMessage(ChatColor.YELLOW + "AutoClaim is now on.");
  58. }
  59. }
  60. void claimChunk(Player player, Chunk targetchunk) {
  61. if (plugin.pt.canuser(player)){
  62. if (ClaimCheck(targetchunk) != "") {
  63. player.sendMessage(ChatColor.RED + "Chunk is already claimed!");
  64. return;
  65. }
  66. String strchunk = getstrchunk(targetchunk);
  67. String playername = player.getName().toLowerCase();
  68. if (OwnedRegions.containsKey(playername) == false){
  69. Set<String> list = new HashSet<String>();
  70. OwnedRegions.put(playername, list);
  71. }
  72. Set<String> list = OwnedRegions.get(playername);
  73. if (list.size() < maxchunks || plugin.pt.canbypass(player)){
  74. list.add(strchunk);
  75. OwnedRegions.put(playername, list);
  76. player.sendMessage(ChatColor.YELLOW + "You have claimed chunk " + strchunk);
  77. player.sendMessage(ChatColor.YELLOW + "You now own " + list.size() + " chunks.");
  78. }else{
  79. player.sendMessage(ChatColor.RED + "Cannot claim! Chunk Cap of " + maxchunks + " reached!");
  80. }
  81. }
  82. }
  83. public void giveChunk(Player player, String receiver, String world, String chunkx, String chunkz) {
  84. String strchunk = world + " " + chunkx + " " + chunkz;
  85. String playername = player.getName().toLowerCase();
  86. String claimcheck = ClaimCheck(strchunk);
  87. if (claimcheck.compareToIgnoreCase(playername) != 0 && plugin.pt.canbypass(player) == false){
  88. player.sendMessage(ChatColor.RED + "You don't own chunk " + strchunk);
  89. return;
  90. }
  91. if (OwnedRegions.containsKey(receiver) == false){
  92. Set<String> list = new HashSet<String>();
  93. OwnedRegions.put(receiver, list);
  94. }
  95. Set<String> list = OwnedRegions.get(receiver);
  96. if (list.size() < maxchunks || plugin.pt.canbypass(player)){
  97. if (claimcheck != ""){
  98. unClaimChunk(player, world, chunkx, chunkz);
  99. }
  100. list.add(strchunk);
  101. OwnedRegions.put(receiver, list);
  102. player.sendMessage(ChatColor.YELLOW + "You have given '" + strchunk + "' to " + receiver);
  103. Player owner = ARG.Server.getPlayer(receiver);
  104. if (owner != null){
  105. owner.sendMessage(ChatColor.YELLOW + player.getName() + " has given you chunk: " + strchunk);
  106. }
  107. }else{
  108. player.sendMessage(ChatColor.RED + "Cannot give! Chunk Cap of " + maxchunks + " reached!");
  109. }
  110. }
  111. public void giveChunk(Player player, String receiver) {
  112. Chunk targetchunk = player.getLocation().getBlock().getChunk();
  113. String strchunk = getstrchunk(targetchunk);
  114. String playername = player.getName().toLowerCase();
  115. String claimcheck = ClaimCheck(strchunk);
  116. if (claimcheck.compareToIgnoreCase(playername) != 0 && plugin.pt.canbypass(player) == false){
  117. player.sendMessage(ChatColor.RED + "You don't own chunk " + strchunk);
  118. return;
  119. }
  120. if (OwnedRegions.containsKey(receiver) == false){
  121. Set<String> list = new HashSet<String>();
  122. OwnedRegions.put(receiver, list);
  123. }
  124. Set<String> list = OwnedRegions.get(receiver);
  125. if (list.size() < maxchunks || plugin.pt.canbypass(player)){
  126. if (claimcheck != ""){
  127. unClaimChunk(player, targetchunk);
  128. }
  129. list.add(strchunk);
  130. OwnedRegions.put(receiver, list);
  131. player.sendMessage(ChatColor.YELLOW + "You have given '" + strchunk + "' to " + receiver);
  132. Player owner = ARG.Server.getPlayer(receiver);
  133. if (owner != null){
  134. owner.sendMessage(ChatColor.YELLOW + player.getName() + " has given you chunk: " + strchunk);
  135. }
  136. }else{
  137. player.sendMessage(ChatColor.RED + "Cannot give! Chunk Cap of " + maxchunks + " reached!");
  138. }
  139. }
  140. public void unClaimChunk(Player player, Chunk targetchunk) {
  141. String strowner = ClaimCheck(targetchunk);
  142. String strplayer = player.getName().toLowerCase();
  143. String strchunk = getstrchunk(targetchunk);
  144. if (strowner == ""){
  145. player.sendMessage(ChatColor.RED + "Chunk is not claimed!");
  146. }else{
  147. if (plugin.pt.canbypass(player) || strowner.equalsIgnoreCase(strplayer)){
  148. if (OwnedRegions.get(strowner).remove(strchunk)) {
  149. player.sendMessage(ChatColor.YELLOW + strowner + " no longer owns " + strchunk + ".");
  150. if (strplayer.compareToIgnoreCase(strowner) != 0){
  151. Player owner = ARG.Server.getPlayer(strowner);
  152. if (owner != null){
  153. owner.sendMessage(ChatColor.YELLOW + player.getName() + " has unclaimed your chunk: " + strchunk);
  154. }
  155. }
  156. }else{
  157. player.sendMessage(ChatColor.RED + strowner + " doesn't own " + getstrchunk(targetchunk) + ".");
  158. }
  159. }else{
  160. player.sendMessage(ChatColor.RED + "You Can't do that!");
  161. }
  162. }
  163. }
  164. public void unClaimChunk(Player player, String world, String chunkx, String chunkz) {
  165. String strchunk = world+" "+chunkx+" "+chunkz;
  166. String strowner = ClaimCheck(strchunk);
  167. String strplayer = player.getName().toLowerCase();
  168. if (strowner == ""){
  169. player.sendMessage(ChatColor.RED + "Chunk is not claimed!");
  170. }else{
  171. if (plugin.pt.canbypass(player) || strowner.equalsIgnoreCase(strplayer)){
  172. if (OwnedRegions.get(strowner).remove(strchunk)) {
  173. player.sendMessage(ChatColor.YELLOW + strowner + " no longer owns " + strchunk + ".");
  174. if (strplayer.compareToIgnoreCase(strowner) != 0){
  175. Player owner = ARG.Server.getPlayer(strowner);
  176. if (owner != null){
  177. owner.sendMessage(ChatColor.YELLOW + player.getName() + " has unclaimed your chunk: " + strchunk);
  178. }
  179. }
  180. }else{
  181. player.sendMessage(ChatColor.RED + strowner + " doesn't own " + strchunk + ".");
  182. }
  183. }else{
  184. player.sendMessage(ChatColor.RED + "You Can't do that!");
  185. }
  186. }
  187. }
  188. public String ClaimCheck(String strchunk) {
  189. //System.out.println("starting claimcheck");
  190. for (String ownername : OwnedRegions.keySet()){
  191. for (String claimedchunk : OwnedRegions.get(ownername)){
  192. if (claimedchunk.equalsIgnoreCase(strchunk)) return ownername;
  193. }
  194. }
  195. return "";
  196. }
  197. public String ClaimCheck(Chunk targetchunk) {
  198. //System.out.println("starting claimcheck");
  199. String strchunk = getstrchunk(targetchunk);
  200. for (String ownername : OwnedRegions.keySet()){
  201. for (String claimedchunk : OwnedRegions.get(ownername)){
  202. if (claimedchunk.equalsIgnoreCase(strchunk)) return ownername;
  203. }
  204. }
  205. return "";
  206. }
  207. public String listclaims(Player player){
  208. String retval = "";
  209. String playername = player.getName().toLowerCase();
  210. if (OwnedRegions.containsKey(playername)){
  211. for (String chunk : OwnedRegions.get(playername)){
  212. retval = retval + " " + chunk;
  213. }
  214. retval = retval.trim().replace(" ", ", ");
  215. }
  216. return retval;
  217. }
  218. public String listclaims(String playername){
  219. String retval = "";
  220. if (OwnedRegions.containsKey(playername)){
  221. for (String chunk : OwnedRegions.get(playername)){
  222. retval = retval + " " + chunk;
  223. }
  224. retval = retval.trim().replace(" ", ", ");
  225. }
  226. return retval;
  227. }
  228. public int countclaims(String playername){
  229. int retval = 0;
  230. if (OwnedRegions.containsKey(playername)){
  231. retval = OwnedRegions.get(playername).size();
  232. }
  233. return retval;
  234. }
  235. public int countclaims(Player player){
  236. String playername = player.getName().toLowerCase();
  237. int retval = 0;
  238. if (OwnedRegions.containsKey(playername)){
  239. retval = OwnedRegions.get(playername).size();
  240. }
  241. return retval;
  242. }
  243. public boolean CanBuildHere(Player player, Chunk targetchunk) {
  244. if (plugin.pt.canbypass(player)) return true;
  245. String playername = player.getName().toLowerCase();
  246. if (OwnedRegions.containsKey(playername)){
  247. Set<String> list = OwnedRegions.get(playername);
  248. String strchunk = getstrchunk(targetchunk);
  249. for (String string : list){
  250. if (string.equalsIgnoreCase(strchunk)) return true;
  251. }
  252. }
  253. String owner = ClaimCheck(targetchunk);
  254. if (plugin.FriendHandler.isafriend(player, owner)) return true;
  255. return false;
  256. }
  257. public void saveRegions() {
  258. FileHandler.saveMultiMap(OwnedRegions, "Regions.txt");
  259. }
  260. public void loadRegions() {
  261. OwnedRegions = FileHandler.loadMultiMap("Regions.txt");
  262. }
  263. public String getstrchunk(Chunk targetchunk) {
  264. String strchunk = "";
  265. if (targetchunk != null){
  266. strchunk = targetchunk.getWorld().getName().toLowerCase() + " " + targetchunk.getX() + " " + targetchunk.getZ();
  267. }
  268. return strchunk;
  269. }
  270. public void sendchunkinfo(Player player, Chunk targetchunk) {
  271. String strclaimed = ClaimCheck(targetchunk);
  272. if (strclaimed == ""){
  273. player.sendMessage(ChatColor.YELLOW + "Chunk '" + getstrchunk(targetchunk) + "' is not claimed.");
  274. }else{
  275. player.sendMessage(ChatColor.YELLOW + "Chunk '" + getstrchunk(targetchunk) + "' is claimed by " + strclaimed + ".");
  276. }
  277. }
  278. public void sendchunkinfo(Player player, String world, String chunkx, String chunkz) {
  279. String strchunk = world + " " + chunkx + " " + chunkz;
  280. String strclaimed = ClaimCheck(strchunk);
  281. if (strclaimed == ""){
  282. player.sendMessage(ChatColor.YELLOW + "Chunk '" + strchunk + "' is not claimed.");
  283. }else{
  284. player.sendMessage(ChatColor.YELLOW + "Chunk '" + strchunk + "' is claimed by " + strclaimed + ".");
  285. }
  286. }
  287. public boolean removePlayer(String playername) {
  288. boolean retvalue = false;
  289. if (OwnedRegions.containsKey(playername)){
  290. OwnedRegions.remove(playername);
  291. retvalue = true;
  292. }
  293. if (LastOnline.containsKey(playername)){
  294. LastOnline.remove(playername);
  295. retvalue = true;
  296. }
  297. if (FriendHandler.FriendsList.containsKey(playername)){
  298. FriendHandler.FriendsList.remove(playername);
  299. retvalue = true;
  300. }
  301. return retvalue;
  302. }
  303. public void saveLastOnline() {
  304. FileHandler.saveHashMap(LastOnline, "LastOnline.txt");
  305. }
  306. public void loadLastOnline() {
  307. LastOnline = FileHandler.loadHashMap("LastOnline.txt");
  308. Date now = new Date();
  309. for (String playername : OwnedRegions.keySet()){
  310. if (LastOnline.containsKey(playername) == false){
  311. LastOnline.put(playername, now);
  312. }
  313. }
  314. for (String playername : FriendHandler.FriendsList.keySet()){
  315. if (LastOnline.containsKey(playername) == false){
  316. LastOnline.put(playername, now);
  317. }
  318. }
  319. }
  320. public void updateLastOnline(Player player) {
  321. Date now = new Date();
  322. String playername = player.getName().toLowerCase();
  323. LastOnline.put(playername, now);
  324. }
  325. public void checkLastOnline(){
  326. int counter = 0;
  327. long now = new Date().getTime();
  328. Set<String> list = new HashSet<String>();
  329. for (String playername : LastOnline.keySet()){
  330. long lo = LastOnline.get(playername).getTime();
  331. if (lo < now-timetoexpire*86400000L){
  332. //long temp = lo-now;
  333. //System.out.println(playername + " comparison: " + temp);
  334. //removePlayer(playername);
  335. list.add(playername);
  336. //counter = counter +1;
  337. //log.info("[ARG] "+playername+" has expired.");
  338. }
  339. }
  340. for (String playername : list){
  341. if (removePlayer(playername)){
  342. counter = counter + 1;
  343. log.info("[ARG] "+playername+" has expired.");
  344. }
  345. }
  346. log.info("[ARG] "+counter+" players expired.");
  347. }
  348. public void removeClaimer(Player player) {
  349. String playername = player.getName().toLowerCase();
  350. if (AutoClaimers.contains(playername)){
  351. AutoClaimers.remove(playername);
  352. }
  353. if (ExistingChunk.containsKey(playername)){
  354. ExistingChunk.remove(playername);
  355. }
  356. if (CurrentChunkc.containsKey(playername)){
  357. CurrentChunkc.remove(playername);
  358. }
  359. }
  360. }