From 7a549ce211dd7a440fead859b1128e8c2d3a6c32 Mon Sep 17 00:00:00 2001 From: NuclearW Date: Thu, 8 Mar 2012 13:22:14 -0500 Subject: [PATCH 1/9] Return after we cancel an event For EntityDamageByEntity and EntityDamage --- .../com/gmail/nossr50/listeners/mcEntityListener.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/listeners/mcEntityListener.java b/src/main/java/com/gmail/nossr50/listeners/mcEntityListener.java index d753a6f16..55e1dc535 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcEntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcEntityListener.java @@ -60,8 +60,10 @@ public class mcEntityListener implements Listener { if(!defender.getWorld().getPVP()) return; - if(Party.getInstance().inSameParty((Player)defender, (Player)attacker)) + if(Party.getInstance().inSameParty((Player)defender, (Player)attacker)) { event.setCancelled(true); + return; + } } //Make sure defender is not invincible @@ -91,8 +93,10 @@ public class mcEntityListener implements Listener */ Player player = (Player) entity; PlayerProfile PP = Users.getProfile(player); - if(PP.getGodMode()) - event.setCancelled(true); + if(PP.getGodMode()) { + event.setCancelled(true); + return; + } if(!m.isInvincible(player, event)) { From 714f829f3edabd43ac5656c3ec15fcb0489fb3b6 Mon Sep 17 00:00:00 2001 From: TheYeti Date: Thu, 8 Mar 2012 11:33:27 -0800 Subject: [PATCH 2/9] Fix for CraftOfflinePlayer in Taming yet again --- Changelog.txt | 1 + src/main/java/com/gmail/nossr50/skills/Taming.java | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Changelog.txt b/Changelog.txt index 9aab4bd56..07bfcdf0f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -16,6 +16,7 @@ Version 2.0.00-dev = Fixed issue with Blast Mining not seeing TNT for detonation due to snow ! Changed Call of the Wild to activate on left-click rather than right-click ! Changed Blast Mining to track based on Entity ID vs. Location + = Fix Taming to hopefully properly handle offline players....again Version 1.3.02 + Added in game guides for Mining, Excavation, and Acrobatics. Simply type /skillname ? to access them diff --git a/src/main/java/com/gmail/nossr50/skills/Taming.java b/src/main/java/com/gmail/nossr50/skills/Taming.java index 9dabaf404..152091cdc 100644 --- a/src/main/java/com/gmail/nossr50/skills/Taming.java +++ b/src/main/java/com/gmail/nossr50/skills/Taming.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.skills; import org.bukkit.Material; +import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -103,7 +104,14 @@ public class Taming { DamageCause cause = event.getCause(); Wolf wolf = (Wolf) event.getEntity(); - Player master = (Player) wolf.getOwner(); + Player master; + if ( wolf.getOwner() instanceof Player ) { + master = (Player) wolf.getOwner(); + } + else { + OfflinePlayer oMaster = (OfflinePlayer) wolf.getOwner(); + master = (Player) oMaster.getPlayer(); + } int skillLevel = Users.getProfile(master).getSkillLevel(SkillType.TAMING); switch(cause) From 88ab232ccdd77574f78a8cd79fb7a00bd944337e Mon Sep 17 00:00:00 2001 From: TheYeti Date: Thu, 8 Mar 2012 12:11:09 -0800 Subject: [PATCH 3/9] Undo Taming fix, attempt fix of block interact NPE --- Changelog.txt | 2 +- .../com/gmail/nossr50/listeners/mcPlayerListener.java | 8 +++++++- src/main/java/com/gmail/nossr50/skills/Taming.java | 9 +-------- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 07bfcdf0f..3b4e5f3fe 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -16,7 +16,7 @@ Version 2.0.00-dev = Fixed issue with Blast Mining not seeing TNT for detonation due to snow ! Changed Call of the Wild to activate on left-click rather than right-click ! Changed Blast Mining to track based on Entity ID vs. Location - = Fix Taming to hopefully properly handle offline players....again + = Attempted fix of block interaction returning NPE's Version 1.3.02 + Added in game guides for Mining, Excavation, and Acrobatics. Simply type /skillname ? to access them diff --git a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java index d716aa965..c57bccad3 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java @@ -156,7 +156,13 @@ public class mcPlayerListener implements Listener Action action = event.getAction(); Block block = event.getClickedBlock(); ItemStack is = player.getItemInHand(); - Material mat = block.getType(); + Material mat; + if (block.equals(null)) { + mat = Material.AIR; + } + else { + mat = block.getType(); + } /* * Ability checks diff --git a/src/main/java/com/gmail/nossr50/skills/Taming.java b/src/main/java/com/gmail/nossr50/skills/Taming.java index 152091cdc..093c87286 100644 --- a/src/main/java/com/gmail/nossr50/skills/Taming.java +++ b/src/main/java/com/gmail/nossr50/skills/Taming.java @@ -104,14 +104,7 @@ public class Taming { DamageCause cause = event.getCause(); Wolf wolf = (Wolf) event.getEntity(); - Player master; - if ( wolf.getOwner() instanceof Player ) { - master = (Player) wolf.getOwner(); - } - else { - OfflinePlayer oMaster = (OfflinePlayer) wolf.getOwner(); - master = (Player) oMaster.getPlayer(); - } + Player master = (Player) wolf.getOwner(); int skillLevel = Users.getProfile(master).getSkillLevel(SkillType.TAMING); switch(cause) From e9e7d462f7234a517abb12455a5d6debd1cd1df6 Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 16:17:57 -0500 Subject: [PATCH 4/9] More generic cleanup. --- src/main/java/com/gmail/nossr50/Combat.java | 4 +- .../nossr50/listeners/mcBlockListener.java | 13 +- .../nossr50/listeners/mcPlayerListener.java | 7 +- src/main/java/com/gmail/nossr50/m.java | 409 +++++----- src/main/java/com/gmail/nossr50/mcMMO.java | 771 ++++++++++-------- .../com/gmail/nossr50/skills/BlastMining.java | 4 +- 6 files changed, 657 insertions(+), 551 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/Combat.java b/src/main/java/com/gmail/nossr50/Combat.java index 8ceee7735..45b0f08d2 100644 --- a/src/main/java/com/gmail/nossr50/Combat.java +++ b/src/main/java/com/gmail/nossr50/Combat.java @@ -84,7 +84,7 @@ public class Combat { } else if (itemInHand.getType().equals(Material.AIR) && mcPermissions.getInstance().unarmed(attacker)) { Unarmed.unarmedBonus(attacker, event); - + if (PPa.getBerserkMode()) { event.setDamage(damage + (damage / 2)); } @@ -187,7 +187,7 @@ public class Combat { else if (Math.random() * 1000 <= (PPd.getSkillLevel(SkillType.UNARMED) / 2)) { deflect = true; } - + if (deflect) { event.setCancelled(true); defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect")); diff --git a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java index 5023ae91c..5eb93c4a7 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java @@ -1,5 +1,6 @@ package com.gmail.nossr50.listeners; +import com.gmail.nossr50.BlockChecks; import com.gmail.nossr50.ItemChecks; import com.gmail.nossr50.Users; import com.gmail.nossr50.m; @@ -56,7 +57,7 @@ public class mcBlockListener implements Listener Material mat = block.getType(); //Check if the blocks placed should be monitored so they do not give out XP in the future - if(m.shouldBeWatched(mat)) + if(BlockChecks.shouldBeWatched(mat)) { //Only needed for blocks that use their block data (wood, pumpkins, etc.) boolean shouldBeChanged = true; @@ -171,7 +172,7 @@ public class mcBlockListener implements Listener } //Change the byte back when broken - if(block.getData() == 5 && m.shouldBeWatched(block.getType())) + if(block.getData() == 5 && BlockChecks.shouldBeWatched(block.getType())) { block.setData((byte) 0); if(plugin.misc.blockWatchList.contains(block)) @@ -192,7 +193,7 @@ public class mcBlockListener implements Listener /* * ABILITY PREPARATION CHECKS */ - if(m.abilityBlockCheck(mat)) + if(BlockChecks.abilityBlockCheck(mat)) { if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block)) Skills.abilityCheck(player, SkillType.HERBALISM); @@ -300,7 +301,7 @@ public class mcBlockListener implements Listener { Block blockFrom = event.getBlock(); Block blockTo = event.getToBlock(); - if(m.shouldBeWatched(blockFrom.getType()) && blockFrom.getData() == (byte)5) - blockTo.setData((byte)5); - } + if(BlockChecks.shouldBeWatched(blockFrom.getType()) && blockFrom.getData() == (byte)5) + blockTo.setData((byte)5); + } } diff --git a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java index c57bccad3..a913ed1bf 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java @@ -28,6 +28,7 @@ import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import com.gmail.nossr50.BlockChecks; import com.gmail.nossr50.Combat; import com.gmail.nossr50.Item; import com.gmail.nossr50.ItemChecks; @@ -177,7 +178,7 @@ public class mcPlayerListener implements Listener player.updateInventory(); } - if(LoadProperties.enableAbilities && m.abilityBlockCheck(mat)) + if(LoadProperties.enableAbilities && BlockChecks.abilityBlockCheck(mat)) { if(block != null && ItemChecks.isHoe(is) && !mat.equals(Material.DIRT) && !mat.equals(Material.GRASS) && !mat.equals(Material.SOIL)) Skills.activationCheck(player, SkillType.HERBALISM); @@ -247,7 +248,7 @@ public class mcPlayerListener implements Listener */ if(action == Action.RIGHT_CLICK_AIR) Item.itemchecks(player); - if(action == Action.RIGHT_CLICK_BLOCK && m.abilityBlockCheck(mat)) + if(action == Action.RIGHT_CLICK_BLOCK && BlockChecks.abilityBlockCheck(mat)) Item.itemchecks(player); if(player.isSneaking() && mcPermissions.getInstance().taming(player) && (action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK)) @@ -337,4 +338,4 @@ public class mcPlayerListener implements Listener event.getPlayer().chat(message.replaceFirst(command, plugin.aliasMap.get(command))); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/gmail/nossr50/m.java b/src/main/java/com/gmail/nossr50/m.java index 310954cca..7bd12b52a 100644 --- a/src/main/java/com/gmail/nossr50/m.java +++ b/src/main/java/com/gmail/nossr50/m.java @@ -7,7 +7,6 @@ import java.util.logging.Logger; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.*; import org.bukkit.event.entity.EntityDamageEvent; @@ -73,54 +72,6 @@ public class m { } } - /** - * Checks to see if a block type awards XP. - * - * @param material Block type to check - * @return true if the block type awards XP, false otherwise - */ - public static boolean shouldBeWatched(Material material) { - switch (material) { - case BROWN_MUSHROOM: - case CACTUS: - case CLAY: - case COAL_ORE: - case DIAMOND_ORE: - case DIRT: - case ENDER_STONE: - case GLOWING_REDSTONE_ORE: - case GLOWSTONE: - case GOLD_ORE: - case GRASS: - case GRAVEL: - case IRON_ORE: - case JACK_O_LANTERN: - case LAPIS_ORE: - case LOG: - case MELON_BLOCK: - case MOSSY_COBBLESTONE: - case MYCEL: - case NETHERRACK: - case OBSIDIAN: - case PUMPKIN: - case RED_MUSHROOM: - case RED_ROSE: - case REDSTONE_ORE: - case SAND: - case SANDSTONE: - case SOUL_SAND: - case STONE: - case SUGAR_CANE_BLOCK: - case VINE: - case WATER_LILY: - case YELLOW_FLOWER: - return true; - - default: - return false; - } - } - /** * Gets the power level of a player. * @@ -173,199 +124,282 @@ public class m { * @param inHand The item to check the tier of * @return the tier of the item */ - public static Integer getTier(ItemStack inHand) - { - if(Repair.isWoodTools(inHand)) - return 1; - if(Repair.isStoneTools(inHand)) - return 2; - if(Repair.isIronTools(inHand)) - return 3; - if(Repair.isGoldTools(inHand)) - return 1; - if(Repair.isDiamondTools(inHand)) - return 4; - - return 1; + public static Integer getTier(ItemStack inHand) { + int tier = 0; + + if (Repair.isWoodTools(inHand)) { + tier = 1; + } + else if (Repair.isStoneTools(inHand)) { + tier = 2; + } + else if (Repair.isIronTools(inHand)) { + tier = 3; + } + else if(Repair.isGoldTools(inHand)) { + tier = 1; + } + else if(Repair.isDiamondTools(inHand)) + tier = 4; + + return tier; } - + + /** + * Determine if two locations are near each other. + * + * @param first The first location + * @param second The second location + * @param maxDistance The max distance apart + * @return true if the distance between first and second is less than maxDistance, false otherwise + */ public static boolean isNear(Location first, Location second, int maxDistance) { double relX = first.getX() - second.getX(); double relY = first.getY() - second.getY(); double relZ = first.getZ() - second.getZ(); - double dist = relX * relX + relY * relY + relZ * relZ; - - if (dist < maxDistance * maxDistance) + double dist = (relX * relX) + (relY * relY) + (relZ * relZ); + + if (dist < maxDistance * maxDistance) { return true; - - return false; - } - - public static boolean abilityBlockCheck(Material material) - { - switch(material){ - case BED_BLOCK: - case BREWING_STAND: - case BOOKSHELF: - case BURNING_FURNACE: - case CAKE_BLOCK: - case CHEST: - case DISPENSER: - case ENCHANTMENT_TABLE: - case FENCE_GATE: - case FURNACE: - case IRON_DOOR_BLOCK: - case JUKEBOX: - case LEVER: - case NOTE_BLOCK: - case STONE_BUTTON: - case TRAP_DOOR: - case WALL_SIGN: - case WOODEN_DOOR: - case WORKBENCH: + } + else { return false; } - - if(Material.getMaterial(LoadProperties.anvilID).equals(material)) - return false; - - return true; } - - public static boolean isInt(String string) - { - try - { + + /** + * Determine if a string represents an Integer + * + * @param string String to check + * @return true if the string is an Integer, false otherwise + */ + public static boolean isInt(String string) { + try { Integer.parseInt(string); + return true; } - catch(NumberFormatException nFE) - { + catch (NumberFormatException nFE) { return false; } - return true; } - - public static void mcDropItems(Location location, ItemStack is, int quantity) - { - for(int i = 0; i < quantity; i++) + + /** + * Drop items at a given location. + * + * @param location The location to drop the items at + * @param is The items to drop + * @param quantity The amount of items to drop + */ + public static void mcDropItems(Location location, ItemStack is, int quantity) { + for (int i = 0; i < quantity; i++) { mcDropItem(location, is); + } } - - public static void mcRandomDropItem(Location location, ItemStack is, int chance) - { - if(Math.random() * 100 < chance) + + /** + * Randomly drop an item at a given location. + * + * @param location The location to drop the items at + * @param is The item to drop + * @param chance The percentage chance for the item to drop + */ + public static void mcRandomDropItem(Location location, ItemStack is, double chance) { + if (Math.random() * 100 < chance) { mcDropItem(location, is); + } } - - public static void mcRandomDropItems(Location location, ItemStack is, int chance, int quantity) - { - for(int i = 0; i < quantity; i++) + + /** + * Randomly drop items at a given location. + * + * @param location The location to drop the items at + * @param is The item to drop + * @param chance The percentage chance for the item to drop + * @param quantity The amount of items to drop + */ + public static void mcRandomDropItems(Location location, ItemStack is, int chance, int quantity) { + for(int i = 0; i < quantity; i++) { mcRandomDropItem(location, is, chance); + } } - + + /** + * Drop an item at a given location. + * + * @param location The location to drop the item at + * @param itemStack The item to drop + */ public static void mcDropItem(Location location, ItemStack itemStack) { + // We can't get the item until we spawn it and we want to make it cancellable, so we have a custom event. McMMOItemSpawnEvent event = new McMMOItemSpawnEvent(location, itemStack); Bukkit.getPluginManager().callEvent(event); - if(event.isCancelled()) return; - - location.getWorld().dropItemNaturally(location, itemStack); + + if (event.isCancelled()) { + return; + } + else { + location.getWorld().dropItemNaturally(location, itemStack); + } } - public static boolean isOre(Block block) - { - switch (block.getType()) { - case COAL_ORE: - case DIAMOND_ORE: - case GLOWING_REDSTONE_ORE: - case GOLD_ORE: - case IRON_ORE: - case LAPIS_ORE: - case REDSTONE_ORE: - return true; - } - return false; - } - - public static void convertToMySQL() - { - if(!LoadProperties.useMySQL) + /** + * Convert FlatFile data to MySQL data. + */ + public static void convertToMySQL() { + if (!LoadProperties.useMySQL) { return; - - Bukkit.getScheduler().scheduleAsyncDelayedTask(Bukkit.getServer().getPluginManager().getPlugin("mcMMO"), new Runnable(){ + } + + Bukkit.getScheduler().scheduleAsyncDelayedTask(Bukkit.getPluginManager().getPlugin("mcMMO"), new Runnable() { public void run() { String location = "plugins/mcMMO/FlatFileStuff/mcmmo.users"; + try { + //Open the user file FileReader file = new FileReader(location); BufferedReader in = new BufferedReader(file); String line = ""; - String playerName = null, mining = null, party = null, miningXP = null, woodcutting = null, woodCuttingXP = null, repair = null, unarmed = null, herbalism = null, excavation = null, archery = null, swords = null, axes = null, acrobatics = null, repairXP = null, unarmedXP = null, herbalismXP = null, excavationXP = null, archeryXP = null, swordsXP = null, axesXP = null, acrobaticsXP = null, taming = null, tamingXP = null, fishing = null, fishingXP = null; - int id = 0, theCount = 0; + String playerName = null; + String party = null; + String mining = null; + String woodcutting = null; + String repair = null; + String unarmed = null; + String herbalism = null; + String excavation = null; + String archery = null; + String swords = null; + String axes = null; + String acrobatics = null; + String taming = null; + String fishing = null; + String miningXP = null; + String woodCuttingXP = null; + String repairXP = null; + String unarmedXP = null; + String herbalismXP = null; + String excavationXP = null; + String archeryXP = null; + String swordsXP = null; + String axesXP = null; + String acrobaticsXP = null; + String tamingXP = null; + String fishingXP = null; + int id = 0; + int theCount = 0; + while ((line = in.readLine()) != null) { + //Find if the line contains the player we want. String[] character = line.split(":"); playerName = character[0]; - //Check for things we don't want put in the DB - if (playerName == null - || playerName.equals("null") - || playerName - .equals("#Storage place for user information")) - continue; - //Get Mining - if (character.length > 1) + //Check for things we don't want put in the DB + if (playerName == null || playerName.equals("null") || playerName.equals("#Storage place for user information")) { + continue; + } + + if (character.length > 1) { mining = character[1]; - //Party - if (character.length > 3) + } + + if (character.length > 3) { party = character[3]; - //Mining XP - if (character.length > 4) + } + + if (character.length > 4) { miningXP = character[4]; - if (character.length > 5) + } + + if (character.length > 5) { woodcutting = character[5]; - if (character.length > 6) + } + + if (character.length > 6) { woodCuttingXP = character[6]; - if (character.length > 7) + } + + if (character.length > 7) { repair = character[7]; - if (character.length > 8) + } + + if (character.length > 8) { unarmed = character[8]; - if (character.length > 9) + } + + if (character.length > 9) { herbalism = character[9]; - if (character.length > 10) + } + + if (character.length > 10) { excavation = character[10]; - if (character.length > 11) + } + + if (character.length > 11) { archery = character[11]; - if (character.length > 12) + } + + if (character.length > 12) { swords = character[12]; - if (character.length > 13) + } + + if (character.length > 13) { axes = character[13]; - if (character.length > 14) + } + + if (character.length > 14) { acrobatics = character[14]; - if (character.length > 15) + } + + if (character.length > 15) { repairXP = character[15]; - if (character.length > 16) + } + + if (character.length > 16) { unarmedXP = character[16]; - if (character.length > 17) + } + + if (character.length > 17) { herbalismXP = character[17]; - if (character.length > 18) + } + + if (character.length > 18) { excavationXP = character[18]; - if (character.length > 19) + } + + if (character.length > 19) { archeryXP = character[19]; - if (character.length > 20) + } + + if (character.length > 20) { swordsXP = character[20]; - if (character.length > 21) + } + + if (character.length > 21) { axesXP = character[21]; - if (character.length > 22) + } + + if (character.length > 22) { acrobaticsXP = character[22]; - if (character.length > 24) + } + + if (character.length > 24) { taming = character[24]; - if (character.length > 25) + } + + if (character.length > 25) { tamingXP = character[25]; - if (character.length > 34) + } + + if (character.length > 34) { fishing = character[34]; - if (character.length > 35) + } + + if (character.length > 35) { fishingXP = character[35]; + } //Check to see if the user is in the DB id = mcMMO.database.getInt("SELECT id FROM " @@ -374,6 +408,7 @@ public class m { if (id > 0) { theCount++; + //Update the skill values mcMMO.database.write("UPDATE " + LoadProperties.MySQLtablePrefix @@ -415,8 +450,10 @@ public class m { + getInt(acrobaticsXP) + ", fishing = " + getInt(fishingXP) + " WHERE user_id = " + id); - } else { + } + else { theCount++; + //Create the user in the DB mcMMO.database.write("INSERT INTO " + LoadProperties.MySQLtablePrefix @@ -478,16 +515,14 @@ public class m { + id); } } - System.out - .println("[mcMMO] MySQL Updated from users file, " - + theCount - + " items added/updated to MySQL DB"); + + System.out.println("[mcMMO] MySQL Updated from users file, " + theCount + " items added/updated to MySQL DB"); in.close(); - } catch (Exception e) { - log.log(Level.SEVERE, "Exception while reading " + location - + " (Are you sure you formatted it correctly?)", e); + } + catch (Exception e) { + log.log(Level.SEVERE, "Exception while reading " + location + " (Are you sure you formatted it correctly?)", e); } } }, 1); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 935204fcc..f99e09008 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -17,8 +17,6 @@ import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.party.Party; import com.gmail.nossr50.skills.*; -import org.bukkit.Bukkit; - import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; @@ -35,6 +33,7 @@ import java.util.HashMap; import java.util.logging.Level; import java.util.logging.Logger; +import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; import org.bukkit.plugin.java.JavaPlugin; @@ -46,367 +45,437 @@ import org.bukkit.entity.Player; import org.getspout.spoutapi.SpoutManager; import org.getspout.spoutapi.player.FileManager; +public class mcMMO extends JavaPlugin { -public class mcMMO extends JavaPlugin -{ - - public static String maindirectory = "plugins" + File.separator + "mcMMO"; - File file = new File(maindirectory + File.separator + "config.yml"); - static File versionFile = new File(maindirectory + File.separator + "VERSION"); - public static final Logger log = Logger.getLogger("Minecraft"); - - private final mcPlayerListener playerListener = new mcPlayerListener(this); - private final mcBlockListener blockListener = new mcBlockListener(this); - private final mcEntityListener entityListener = new mcEntityListener(this); - - //Queue for block data change for R2+ fix - public ArrayDeque changeQueue = new ArrayDeque(); - public ArrayDeque fastChangeQueue = new ArrayDeque(); + public static String maindirectory = "plugins" + File.separator + "mcMMO"; + public static File file = new File(maindirectory + File.separator + "config.yml"); + public static File versionFile = new File(maindirectory + File.separator + "VERSION"); + public static final Logger log = Logger.getLogger("Minecraft"); - private Runnable mcMMO_Timer = new mcTimer(this); //BLEED AND REGENERATION - private Runnable mcMMO_SaveTimer = new mcSaveTimer(this); //Periodic saving of Player Data - private Runnable ChangeDataValueTimer = new ChangeDataValueTimer(changeQueue); //R2 block place workaround - private Runnable FastChangeDataValueTimer = new ChangeDataValueTimer(fastChangeQueue); + private final mcPlayerListener playerListener = new mcPlayerListener(this); + private final mcBlockListener blockListener = new mcBlockListener(this); + private final mcEntityListener entityListener = new mcEntityListener(this); - //Alias - Command - public HashMap aliasMap = new HashMap(); - - public static Database database = null; - public Misc misc = new Misc(this); + //Queue for block data change for R2+ fix + public ArrayDeque changeQueue = new ArrayDeque(); + public ArrayDeque fastChangeQueue = new ArrayDeque(); - //Config file stuff - LoadProperties config; - LoadTreasures config2; - - //Jar stuff - public static File mcmmo; + private Runnable mcMMO_Timer = new mcTimer(this); //BLEED AND REGENERATION + private Runnable mcMMO_SaveTimer = new mcSaveTimer(this); //Periodic saving of Player Data + private Runnable ChangeDataValueTimer = new ChangeDataValueTimer(changeQueue); //R2 block place workaround + private Runnable FastChangeDataValueTimer = new ChangeDataValueTimer(fastChangeQueue); //R2 block place workaround for instant-break stuff - public void onEnable() - { - final Plugin thisPlugin = this; - mcmmo = this.getFile(); - new File(maindirectory).mkdir(); - - if(!versionFile.exists()) - { - updateVersion(); - } else - { - String vnum = readVersion(); - //This will be changed to whatever version preceded when we actually need updater code. - //Version 1.0.48 is the first to implement this, no checking before that version can be done. - if(vnum.equalsIgnoreCase("1.0.48")) { - updateFrom(1); - } - //Just add in more else if blocks for versions that need updater code. Increment the updateFrom age int as we do so. - //Catch all for versions not matching and no specific code being needed - else if(!vnum.equalsIgnoreCase(this.getDescription().getVersion())) updateFrom(-1); - } - - this.config = new LoadProperties(this); - this.config.load(); - - this.config2 = new LoadTreasures(this); - this.config2.load(); - - Party.getInstance().loadParties(); - new Party(this); - - if(!LoadProperties.useMySQL) - Users.getInstance().loadUsers(); //Load Users file - /* - * REGISTER EVENTS - */ + //Alias - Command + public HashMap aliasMap = new HashMap(); - PluginManager pm = getServer().getPluginManager(); + public static Database database = null; + public Misc misc = new Misc(this); - if(pm.getPlugin("Spout") != null) - LoadProperties.spoutEnabled = true; - else - LoadProperties.spoutEnabled = false; - - //Register events - pm.registerEvents(playerListener, this); - pm.registerEvents(blockListener, this); - pm.registerEvents(entityListener, this); + //Config file stuff + LoadProperties config; + LoadTreasures config2; - PluginDescriptionFile pdfFile = this.getDescription(); + //Jar stuff + public static File mcmmo; - if(LoadProperties.useMySQL) - { - database = new Database(this); - database.createStructure(); - } else - Leaderboard.makeLeaderboards(); //Make the leaderboards + /** + * Things to be run when the plugin is enabled. + */ + public void onEnable() { + final Plugin thisPlugin = this; + mcmmo = this.getFile(); + new File(maindirectory).mkdir(); - for(Player player : getServer().getOnlinePlayers()){Users.addUser(player);} //In case of reload add all users back into PlayerProfile - System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" ); - - //Periodic save timer (Saves every 10 minutes) - Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_SaveTimer, 0, LoadProperties.saveInterval * 1200); - - Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_Timer, 0, 20); - //R2+ block place fix - Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, ChangeDataValueTimer, 0, 10); - Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, FastChangeDataValueTimer, 0, 1); - - registerCommands(); - - //Spout Stuff - if(LoadProperties.spoutEnabled) - { - SpoutStuff.setupSpoutConfigs(); - SpoutStuff.registerCustomEvent(); - SpoutStuff.extractFiles(); //Extract source materials - - FileManager FM = SpoutManager.getFileManager(); - FM.addToPreLoginCache(this, SpoutStuff.getFiles()); - } - - if(LoadProperties.statsTracking) { - //Plugin Metrics running in a new thread - new Thread(new Runnable() { - public void run() { - try { - // create a new metrics object - Metrics metrics = new Metrics(); - - // 'this' in this context is the Plugin object - metrics.beginMeasuringPlugin(thisPlugin); - } catch (IOException e) { - // Failed to submit the stats :-( - } - } - }).start(); - } - } + if (!versionFile.exists()) { + updateVersion(); + } + else { + String vnum = readVersion(); - public PlayerProfile getPlayerProfile(Player player) - { - return Users.getProfile(player); - } - - public void checkXp(Player player, SkillType skillType) - { - if(skillType == SkillType.ALL) - Skills.XpCheckAll(player); - else - Skills.XpCheckSkill(skillType, player); - } - - public boolean inSameParty(Player playera, Player playerb) - { - if(Users.getProfile(playera).inParty() && Users.getProfile(playerb).inParty()){ - if(Users.getProfile(playera).getParty().equals(Users.getProfile(playerb).getParty())){ - return true; - } else { - return false; - } - } else { - return false; - } - } - public ArrayList getParties(){ - String location = "plugins/mcMMO/mcmmo.users"; - ArrayList parties = new ArrayList(); - try { - //Open the users file - FileReader file = new FileReader(location); - BufferedReader in = new BufferedReader(file); - String line = ""; - while((line = in.readLine()) != null) - { - String[] character = line.split(":"); - String theparty = null; - //Party - if(character.length > 3) - theparty = character[3]; - if(!parties.contains(theparty)) - parties.add(theparty); - } - in.close(); - } catch (Exception e) { - log.log(Level.SEVERE, "Exception while reading " - + location + " (Are you sure you formatted it correctly?)", e); - } - return parties; - } - public static String getPartyName(Player player){ - PlayerProfile PP = Users.getProfile(player); - return PP.getParty(); - } - public static boolean inParty(Player player){ - PlayerProfile PP = Users.getProfile(player); - return PP.inParty(); - } + //This will be changed to whatever version preceded when we actually need updater code. + //Version 1.0.48 is the first to implement this, no checking before that version can be done. + if (vnum.equalsIgnoreCase("1.0.48")) { + updateFrom(1); + } - public void onDisable() - { - //Make sure to save player information if the server shuts down - for(Player x : Bukkit.getServer().getOnlinePlayers()) - { - Users.getProfile(x).save(); - } - - Bukkit.getServer().getScheduler().cancelTasks(this); //This removes our tasks - - System.out.println("mcMMO was disabled."); //How informative! - } - - private void registerCommands() { - //Register aliases with the aliasmap (used in the playercommandpreprocessevent to ugly alias them to actual commands) - //Skills commands - aliasMap.put(mcLocale.getString("m.SkillAcrobatics").toLowerCase(), "acrobatics"); - aliasMap.put(mcLocale.getString("m.SkillArchery").toLowerCase(), "archery"); - aliasMap.put(mcLocale.getString("m.SkillAxes").toLowerCase(), "axes"); - aliasMap.put(mcLocale.getString("m.SkillExcavation").toLowerCase(), "excavation"); - aliasMap.put(mcLocale.getString("m.SkillFishing").toLowerCase(), "fishing"); - aliasMap.put(mcLocale.getString("m.SkillHerbalism").toLowerCase(), "herbalism"); - aliasMap.put(mcLocale.getString("m.SkillMining").toLowerCase(), "mining"); - aliasMap.put(mcLocale.getString("m.SkillRepair").toLowerCase(), "repair"); - aliasMap.put(mcLocale.getString("m.SkillSwords").toLowerCase(), "swords"); - aliasMap.put(mcLocale.getString("m.SkillTaming").toLowerCase(), "taming"); - aliasMap.put(mcLocale.getString("m.SkillUnarmed").toLowerCase(), "unarmed"); - aliasMap.put(mcLocale.getString("m.SkillWoodCutting").toLowerCase(), "woodcutting"); - - - //Register commands - //Skills commands - getCommand("acrobatics").setExecutor(new AcrobaticsCommand()); - getCommand("archery").setExecutor(new ArcheryCommand()); - getCommand("axes").setExecutor(new AxesCommand()); - getCommand("excavation").setExecutor(new ExcavationCommand()); - getCommand("fishing").setExecutor(new FishingCommand()); - getCommand("herbalism").setExecutor(new HerbalismCommand()); - getCommand("mining").setExecutor(new MiningCommand()); - getCommand("repair").setExecutor(new RepairCommand()); - getCommand("swords").setExecutor(new SwordsCommand()); - getCommand("taming").setExecutor(new TamingCommand()); - getCommand("unarmed").setExecutor(new UnarmedCommand()); - getCommand("woodcutting").setExecutor(new WoodcuttingCommand()); - - //Mc* commands - if(LoadProperties.mcremoveEnable) getCommand("mcremove").setExecutor(new McremoveCommand()); - if(LoadProperties.mcabilityEnable) getCommand("mcability").setExecutor(new McabilityCommand()); - if(LoadProperties.mccEnable) getCommand("mcc").setExecutor(new MccCommand()); - if(LoadProperties.mcgodEnable) getCommand("mcgod").setExecutor(new McgodCommand()); - if(LoadProperties.mcmmoEnable) getCommand("mcmmo").setExecutor(new McmmoCommand()); - if(LoadProperties.mcrefreshEnable) getCommand("mcrefresh").setExecutor(new McrefreshCommand(this)); - if(LoadProperties.mctopEnable) getCommand("mctop").setExecutor(new MctopCommand()); - - //Party commands - if(LoadProperties.acceptEnable) getCommand("accept").setExecutor(new AcceptCommand()); - if(LoadProperties.aEnable) getCommand("a").setExecutor(new ACommand()); - if(LoadProperties.inviteEnable) getCommand("invite").setExecutor(new InviteCommand(this)); - if(LoadProperties.partyEnable) getCommand("party").setExecutor(new PartyCommand()); - if(LoadProperties.pEnable) getCommand("p").setExecutor(new PCommand()); - if(LoadProperties.ptpEnable) getCommand("ptp").setExecutor(new PtpCommand(this)); - - //Other commands - if(LoadProperties.addxpEnable) getCommand("addxp").setExecutor(new AddxpCommand(this)); - if(LoadProperties.addlevelsEnable) getCommand("addlevels").setExecutor(new AddlevelsCommand(this)); - if(LoadProperties.mmoeditEnable) getCommand("mmoedit").setExecutor(new MmoeditCommand(this)); - getCommand("mmoupdate").setExecutor(new MmoupdateCommand()); - if(LoadProperties.mcstatsEnable) getCommand("mcstats").setExecutor(new McstatsCommand()); - if(LoadProperties.inspectEnable) getCommand("inspect").setExecutor(new InspectCommand(this)); - if(LoadProperties.xprateEnable) getCommand("xprate").setExecutor(new XprateCommand()); - - //Spout commands - getCommand("mchud").setExecutor(new MchudCommand()); - if(LoadProperties.xplockEnable) getCommand("xplock").setExecutor(new XplockCommand()); - - } + //Just add in more else if blocks for versions that need updater code. Increment the updateFrom age int as we do so. + //Catch all for versions not matching and no specific code being needed + else if (!vnum.equalsIgnoreCase(this.getDescription().getVersion())) { + updateFrom(-1); + } + } - /* - * It is important to always assume that you are updating from the lowest possible version. - * Thus, every block of updater code should be complete and self-contained; finishing all - * SQL transactions and closing all file handlers, such that the next block of updater code - * if called will handle updating as expected. - */ - public void updateFrom(int age) { - //No updater code needed, just update the version. - if(age == -1) { - updateVersion(); - return; - } - //Updater code from age 1 goes here - if(age <= 1) { - //Since age 1 is an example for now, we will just let it do nothing. - - } - //If we are updating from age 1 but we need more to reach age 2, this will run too. - if(age <= 2) { - - } - updateVersion(); - } - - public void updateVersion() { - try { - versionFile.createNewFile(); - BufferedWriter vout = new BufferedWriter(new FileWriter(versionFile)); - vout.write(this.getDescription().getVersion()); - vout.close(); - } catch (IOException ex) { - ex.printStackTrace(); - } catch (SecurityException ex) { - ex.printStackTrace(); - } - } + this.config = new LoadProperties(this); + this.config.load(); - public String readVersion() { - byte[] buffer = new byte[(int) versionFile.length()]; - BufferedInputStream f = null; - try { - f = new BufferedInputStream(new FileInputStream(versionFile)); - f.read(buffer); - } catch (FileNotFoundException ex) { - ex.printStackTrace(); - } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (f != null) try { f.close(); } catch (IOException ignored) { } - } - - return new String(buffer); - } - - /* - * Boilerplate Custom Config Stuff - */ - - private FileConfiguration treasuresConfig = null; - private File treasuresConfigFile = null; - - public void reloadTreasuresConfig() { - if (treasuresConfigFile == null) { - treasuresConfigFile = new File(getDataFolder(), "treasures.yml"); - } - treasuresConfig = YamlConfiguration.loadConfiguration(treasuresConfigFile); - - // Look for defaults in the jar - InputStream defConfigStream = getResource("treasures.yml"); - if (defConfigStream != null) { - YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); - treasuresConfig.setDefaults(defConfig); - } - } - - public FileConfiguration getTreasuresConfig() { - if (treasuresConfig == null) { - reloadTreasuresConfig(); - } - return treasuresConfig; - } - - public void saveTreasuresConfig() { - if (treasuresConfig == null || treasuresConfigFile == null) { - return; - } - try { - treasuresConfig.save(treasuresConfigFile); - } catch (IOException ex) { - Logger.getLogger(JavaPlugin.class.getName()).log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex); - } - } + this.config2 = new LoadTreasures(this); + this.config2.load(); + + Party.getInstance().loadParties(); + new Party(this); + + if (!LoadProperties.useMySQL) { + Users.getInstance().loadUsers(); + } + + PluginManager pm = getServer().getPluginManager(); + + if (pm.getPlugin("Spout") != null) { + LoadProperties.spoutEnabled = true; + } + else { + LoadProperties.spoutEnabled = false; + } + + //Register events + pm.registerEvents(playerListener, this); + pm.registerEvents(blockListener, this); + pm.registerEvents(entityListener, this); + + PluginDescriptionFile pdfFile = this.getDescription(); + + //Setup the leaderboards + if (LoadProperties.useMySQL) { + database = new Database(this); + database.createStructure(); + } + else { + Leaderboard.makeLeaderboards(); + } + + for (Player player : getServer().getOnlinePlayers()) { + Users.addUser(player); //In case of reload add all users back into PlayerProfile + } + + System.out.println(pdfFile.getName() + " version " + pdfFile.getVersion() + " is enabled!" ); + + //Periodic save timer (Saves every 10 minutes) + Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_SaveTimer, 0, LoadProperties.saveInterval * 1200); + + //Bleed & Regen timer (Runs every 20 seconds) + Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, mcMMO_Timer, 0, 20); + + //R2+ block place fix + Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, ChangeDataValueTimer, 0, 10); + Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(this, FastChangeDataValueTimer, 0, 1); + + registerCommands(); + + //Spout Stuff + if (LoadProperties.spoutEnabled) { + SpoutStuff.setupSpoutConfigs(); + SpoutStuff.registerCustomEvent(); + SpoutStuff.extractFiles(); //Extract source materials + + FileManager FM = SpoutManager.getFileManager(); + FM.addToPreLoginCache(this, SpoutStuff.getFiles()); + } + + if (LoadProperties.statsTracking) { + //Plugin Metrics running in a new thread + new Thread(new Runnable() { + public void run() { + try { + // create a new metrics object + Metrics metrics = new Metrics(); + + // 'this' in this context is the Plugin object + metrics.beginMeasuringPlugin(thisPlugin); + } + catch (IOException e) { + System.out.println("Failed to submit stats."); + } + } + }).start(); + } + } + + /** + * Get profile of the player. + *
+ * This function is designed for API usage. + * + * @param player Player whose profile to get + * @return the PlayerProfile object + */ + public PlayerProfile getPlayerProfile(Player player) { + return Users.getProfile(player); + } + + /** + * Check the XP of a player. + *
+ * This function is designed for API usage. + * + * @param player + * @param skillType + */ + public void checkXp(Player player, SkillType skillType) { + if (skillType == SkillType.ALL) { + Skills.XpCheckAll(player); + } + else { + Skills.XpCheckSkill(skillType, player); + } + } + + /** + * Check if two players are in the same party. + *
+ * This function is designed for API usage. + * + * @param playera The first player to check + * @param playerb The second player to check + * @return true if the two players are in the same party, false otherwise + */ + public boolean inSameParty(Player playera, Player playerb) { + if (Users.getProfile(playera).inParty() && Users.getProfile(playerb).inParty()) { + if (Users.getProfile(playera).getParty().equals(Users.getProfile(playerb).getParty())) { + return true; + } + else { + return false; + } + } + else { + return false; + } + } + + /** + * Get a list of all current party names. + *
+ * This function is designed for API usage. + * + * @return the list of parties. + */ + public ArrayList getParties() { + String location = "plugins/mcMMO/mcmmo.users"; + ArrayList parties = new ArrayList(); + + try { + + //Open the users file + FileReader file = new FileReader(location); + BufferedReader in = new BufferedReader(file); + String line = ""; + + while((line = in.readLine()) != null) { + String[] character = line.split(":"); + String theparty = null; + + //Party + if (character.length > 3) { + theparty = character[3]; + } + + if (!parties.contains(theparty)) { + parties.add(theparty); + } + } + in.close(); + } + catch (Exception e) { + log.log(Level.SEVERE, "Exception while reading " + location + " (Are you sure you formatted it correctly?)", e); + } + return parties; + } + + /** + * Get the name of the party a player is in. + *
+ * This function is designed for API usage. + * + * @param player The player to check the party name of + * @return the name of the player's party + */ + public static String getPartyName(Player player) { + PlayerProfile PP = Users.getProfile(player); + return PP.getParty(); + } + + /** + * Checks if a player is in a party. + *
+ * This function is designed for API usage. + * + * @param player The player to check + * @return true if the player is in a party, false otherwise + */ + public static boolean inParty(Player player) { + PlayerProfile PP = Users.getProfile(player); + return PP.inParty(); + } + + /** + * Things to be run when the plugin is disabled. + */ + public void onDisable() { + + //Make sure to save player information if the server shuts down + for(Player x : Bukkit.getOnlinePlayers()) { + Users.getProfile(x).save(); + } + + Bukkit.getServer().getScheduler().cancelTasks(this); //This removes our tasks + + System.out.println("mcMMO was disabled."); //How informative! + } + + private void registerCommands() { + //Register aliases with the aliasmap (used in the playercommandpreprocessevent to ugly alias them to actual commands) + //Skills commands + aliasMap.put(mcLocale.getString("m.SkillAcrobatics").toLowerCase(), "acrobatics"); + aliasMap.put(mcLocale.getString("m.SkillArchery").toLowerCase(), "archery"); + aliasMap.put(mcLocale.getString("m.SkillAxes").toLowerCase(), "axes"); + aliasMap.put(mcLocale.getString("m.SkillExcavation").toLowerCase(), "excavation"); + aliasMap.put(mcLocale.getString("m.SkillFishing").toLowerCase(), "fishing"); + aliasMap.put(mcLocale.getString("m.SkillHerbalism").toLowerCase(), "herbalism"); + aliasMap.put(mcLocale.getString("m.SkillMining").toLowerCase(), "mining"); + aliasMap.put(mcLocale.getString("m.SkillRepair").toLowerCase(), "repair"); + aliasMap.put(mcLocale.getString("m.SkillSwords").toLowerCase(), "swords"); + aliasMap.put(mcLocale.getString("m.SkillTaming").toLowerCase(), "taming"); + aliasMap.put(mcLocale.getString("m.SkillUnarmed").toLowerCase(), "unarmed"); + aliasMap.put(mcLocale.getString("m.SkillWoodCutting").toLowerCase(), "woodcutting"); + + + //Register commands + //Skills commands + getCommand("acrobatics").setExecutor(new AcrobaticsCommand()); + getCommand("archery").setExecutor(new ArcheryCommand()); + getCommand("axes").setExecutor(new AxesCommand()); + getCommand("excavation").setExecutor(new ExcavationCommand()); + getCommand("fishing").setExecutor(new FishingCommand()); + getCommand("herbalism").setExecutor(new HerbalismCommand()); + getCommand("mining").setExecutor(new MiningCommand()); + getCommand("repair").setExecutor(new RepairCommand()); + getCommand("swords").setExecutor(new SwordsCommand()); + getCommand("taming").setExecutor(new TamingCommand()); + getCommand("unarmed").setExecutor(new UnarmedCommand()); + getCommand("woodcutting").setExecutor(new WoodcuttingCommand()); + + //Mc* commands + if(LoadProperties.mcremoveEnable) getCommand("mcremove").setExecutor(new McremoveCommand()); + if(LoadProperties.mcabilityEnable) getCommand("mcability").setExecutor(new McabilityCommand()); + if(LoadProperties.mccEnable) getCommand("mcc").setExecutor(new MccCommand()); + if(LoadProperties.mcgodEnable) getCommand("mcgod").setExecutor(new McgodCommand()); + if(LoadProperties.mcmmoEnable) getCommand("mcmmo").setExecutor(new McmmoCommand()); + if(LoadProperties.mcrefreshEnable) getCommand("mcrefresh").setExecutor(new McrefreshCommand(this)); + if(LoadProperties.mctopEnable) getCommand("mctop").setExecutor(new MctopCommand()); + + //Party commands + if(LoadProperties.acceptEnable) getCommand("accept").setExecutor(new AcceptCommand()); + if(LoadProperties.aEnable) getCommand("a").setExecutor(new ACommand()); + if(LoadProperties.inviteEnable) getCommand("invite").setExecutor(new InviteCommand(this)); + if(LoadProperties.partyEnable) getCommand("party").setExecutor(new PartyCommand()); + if(LoadProperties.pEnable) getCommand("p").setExecutor(new PCommand()); + if(LoadProperties.ptpEnable) getCommand("ptp").setExecutor(new PtpCommand(this)); + + //Other commands + if(LoadProperties.addxpEnable) getCommand("addxp").setExecutor(new AddxpCommand(this)); + if(LoadProperties.addlevelsEnable) getCommand("addlevels").setExecutor(new AddlevelsCommand(this)); + if(LoadProperties.mmoeditEnable) getCommand("mmoedit").setExecutor(new MmoeditCommand(this)); + getCommand("mmoupdate").setExecutor(new MmoupdateCommand()); + if(LoadProperties.mcstatsEnable) getCommand("mcstats").setExecutor(new McstatsCommand()); + if(LoadProperties.inspectEnable) getCommand("inspect").setExecutor(new InspectCommand(this)); + if(LoadProperties.xprateEnable) getCommand("xprate").setExecutor(new XprateCommand()); + + //Spout commands + getCommand("mchud").setExecutor(new MchudCommand()); + if(LoadProperties.xplockEnable) getCommand("xplock").setExecutor(new XplockCommand()); + + } + + /* + * It is important to always assume that you are updating from the lowest possible version. + * Thus, every block of updater code should be complete and self-contained; finishing all + * SQL transactions and closing all file handlers, such that the next block of updater code + * if called will handle updating as expected. + */ + public void updateFrom(int age) { + //No updater code needed, just update the version. + if(age == -1) { + updateVersion(); + return; + } + //Updater code from age 1 goes here + if(age <= 1) { + //Since age 1 is an example for now, we will just let it do nothing. + + } + //If we are updating from age 1 but we need more to reach age 2, this will run too. + if(age <= 2) { + + } + updateVersion(); + } + + public void updateVersion() { + try { + versionFile.createNewFile(); + BufferedWriter vout = new BufferedWriter(new FileWriter(versionFile)); + vout.write(this.getDescription().getVersion()); + vout.close(); + } catch (IOException ex) { + ex.printStackTrace(); + } catch (SecurityException ex) { + ex.printStackTrace(); + } + } + + public String readVersion() { + byte[] buffer = new byte[(int) versionFile.length()]; + BufferedInputStream f = null; + try { + f = new BufferedInputStream(new FileInputStream(versionFile)); + f.read(buffer); + } catch (FileNotFoundException ex) { + ex.printStackTrace(); + } catch (IOException ex) { + ex.printStackTrace(); + } finally { + if (f != null) try { f.close(); } catch (IOException ignored) { } + } + + return new String(buffer); + } + + /* + * Boilerplate Custom Config Stuff + */ + + private FileConfiguration treasuresConfig = null; + private File treasuresConfigFile = null; + + public void reloadTreasuresConfig() { + if (treasuresConfigFile == null) { + treasuresConfigFile = new File(getDataFolder(), "treasures.yml"); + } + treasuresConfig = YamlConfiguration.loadConfiguration(treasuresConfigFile); + + // Look for defaults in the jar + InputStream defConfigStream = getResource("treasures.yml"); + if (defConfigStream != null) { + YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); + treasuresConfig.setDefaults(defConfig); + } + } + + public FileConfiguration getTreasuresConfig() { + if (treasuresConfig == null) { + reloadTreasuresConfig(); + } + return treasuresConfig; + } + + public void saveTreasuresConfig() { + if (treasuresConfig == null || treasuresConfigFile == null) { + return; + } + try { + treasuresConfig.save(treasuresConfigFile); + } catch (IOException ex) { + Logger.getLogger(JavaPlugin.class.getName()).log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex); + } + } } \ No newline at end of file diff --git a/src/main/java/com/gmail/nossr50/skills/BlastMining.java b/src/main/java/com/gmail/nossr50/skills/BlastMining.java index 10eb09a6b..334b2a864 100644 --- a/src/main/java/com/gmail/nossr50/skills/BlastMining.java +++ b/src/main/java/com/gmail/nossr50/skills/BlastMining.java @@ -10,8 +10,8 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.event.entity.ExplosionPrimeEvent; +import com.gmail.nossr50.BlockChecks; import com.gmail.nossr50.Users; -import com.gmail.nossr50.m; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.SkillType; @@ -89,7 +89,7 @@ public class BlastMining{ while(iterator.hasNext()) { Block temp = iterator.next(); - if(m.isOre(temp)) + if(BlockChecks.isOre(temp.getType())) ores.add(temp); else debris.add(temp); From 9eb5535c75a1ee8dfcce9cb6f72b9642af094513 Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 16:30:50 -0500 Subject: [PATCH 5/9] Fixed the NPE PlayerInteractEvent. --- .../java/com/gmail/nossr50/BlockChecks.java | 120 ++++++++++++++++++ src/main/java/com/gmail/nossr50/Combat.java | 8 +- .../nossr50/listeners/mcPlayerListener.java | 2 +- 3 files changed, 125 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/BlockChecks.java diff --git a/src/main/java/com/gmail/nossr50/BlockChecks.java b/src/main/java/com/gmail/nossr50/BlockChecks.java new file mode 100644 index 000000000..022365eb1 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/BlockChecks.java @@ -0,0 +1,120 @@ +package com.gmail.nossr50; + +import org.bukkit.Material; +import org.bukkit.block.Block; + +import com.gmail.nossr50.config.LoadProperties; + +public class BlockChecks { + + /** + * Checks to see if a block type awards XP. + * + * @param material {@link Block} type to check + * @return true if the block type awards XP, false otherwise + */ + public static boolean shouldBeWatched(Material material) { + switch (material) { + case BROWN_MUSHROOM: + case CACTUS: + case CLAY: + case COAL_ORE: + case DIAMOND_ORE: + case DIRT: + case ENDER_STONE: + case GLOWING_REDSTONE_ORE: + case GLOWSTONE: + case GOLD_ORE: + case GRASS: + case GRAVEL: + case IRON_ORE: + case JACK_O_LANTERN: + case LAPIS_ORE: + case LOG: + case MELON_BLOCK: + case MOSSY_COBBLESTONE: + case MYCEL: + case NETHERRACK: + case OBSIDIAN: + case PUMPKIN: + case RED_MUSHROOM: + case RED_ROSE: + case REDSTONE_ORE: + case SAND: + case SANDSTONE: + case SOUL_SAND: + case STONE: + case SUGAR_CANE_BLOCK: + case VINE: + case WATER_LILY: + case YELLOW_FLOWER: + return true; + + default: + return false; + } + } + + /** + * Check if a block should allow for the activation of abilities. + * + * @param material Type of {@link Block} to check + * @return true if the block should allow ability activation, false otherwise + */ + public static boolean abilityBlockCheck(Material material) { + switch (material) { + case BED_BLOCK: + case BREWING_STAND: + case BOOKSHELF: + case BURNING_FURNACE: + case CAKE_BLOCK: + case CHEST: + case DISPENSER: + case ENCHANTMENT_TABLE: + case FENCE_GATE: + case FURNACE: + case IRON_DOOR_BLOCK: + case JUKEBOX: + case LEVER: + case NOTE_BLOCK: + case STONE_BUTTON: + case TRAP_DOOR: + case WALL_SIGN: + case WOODEN_DOOR: + case WORKBENCH: + return false; + + default: + break; + } + + if (Material.getMaterial(LoadProperties.anvilID).equals(material)) { + return false; + } + else { + return true; + } + } + + /** + * Check if a block type is an ore. + * + * @param material The type of {@link Block} to check + * @return true if the Block is an ore, false otherwise + */ + public static boolean isOre(Material material) { + switch (material) { + case COAL_ORE: + case DIAMOND_ORE: + case GLOWING_REDSTONE_ORE: + case GOLD_ORE: + case IRON_ORE: + case LAPIS_ORE: + case REDSTONE_ORE: + return true; + + default: + return false; + } + } +} diff --git a/src/main/java/com/gmail/nossr50/Combat.java b/src/main/java/com/gmail/nossr50/Combat.java index 45b0f08d2..daba5777b 100644 --- a/src/main/java/com/gmail/nossr50/Combat.java +++ b/src/main/java/com/gmail/nossr50/Combat.java @@ -99,16 +99,16 @@ public class Combat { } else if (itemInHand.getType().equals(Material.BONE) && mcPermissions.getInstance().taming(attacker) && targetType.equals(EntityType.WOLF)) { Wolf wolf = (Wolf) target; - String message = "Combat.BeastLore" + " "; + String message = mcLocale.getString("Combat.BeastLore") + " "; int health = wolf.getHealth(); event.setCancelled(true); if (wolf.isTamed()) { - message.concat(mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)}) + " "); - message.concat(mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {health})); + message = message.concat(mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)}) + " "); + message = message.concat(mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {health})); } else { - message.concat(mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {health})); + message = message.concat(mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {health})); } attacker.sendMessage(message); diff --git a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java index a913ed1bf..d3e5feeab 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcPlayerListener.java @@ -158,7 +158,7 @@ public class mcPlayerListener implements Listener Block block = event.getClickedBlock(); ItemStack is = player.getItemInHand(); Material mat; - if (block.equals(null)) { + if (block == null) { mat = Material.AIR; } else { From 052e3cd99769c601da17d1b34e413907898ce8fe Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 16:55:43 -0500 Subject: [PATCH 6/9] More cleanup. --- src/main/java/com/gmail/nossr50/mcMMO.java | 219 +++++++++++++----- .../java/com/gmail/nossr50/skills/Taming.java | 1 - 2 files changed, 158 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index f99e09008..e2cb223fe 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -313,16 +313,19 @@ public class mcMMO extends JavaPlugin { public void onDisable() { //Make sure to save player information if the server shuts down - for(Player x : Bukkit.getOnlinePlayers()) { + for (Player x : Bukkit.getOnlinePlayers()) { Users.getProfile(x).save(); } - + Bukkit.getServer().getScheduler().cancelTasks(this); //This removes our tasks - System.out.println("mcMMO was disabled."); //How informative! } - + + /** + * Register the commands. + */ private void registerCommands() { + //Register aliases with the aliasmap (used in the playercommandpreprocessevent to ugly alias them to actual commands) //Skills commands aliasMap.put(mcLocale.getString("m.SkillAcrobatics").toLowerCase(), "acrobatics"); @@ -337,8 +340,7 @@ public class mcMMO extends JavaPlugin { aliasMap.put(mcLocale.getString("m.SkillTaming").toLowerCase(), "taming"); aliasMap.put(mcLocale.getString("m.SkillUnarmed").toLowerCase(), "unarmed"); aliasMap.put(mcLocale.getString("m.SkillWoodCutting").toLowerCase(), "woodcutting"); - - + //Register commands //Skills commands getCommand("acrobatics").setExecutor(new AcrobaticsCommand()); @@ -353,129 +355,224 @@ public class mcMMO extends JavaPlugin { getCommand("taming").setExecutor(new TamingCommand()); getCommand("unarmed").setExecutor(new UnarmedCommand()); getCommand("woodcutting").setExecutor(new WoodcuttingCommand()); - - //Mc* commands - if(LoadProperties.mcremoveEnable) getCommand("mcremove").setExecutor(new McremoveCommand()); - if(LoadProperties.mcabilityEnable) getCommand("mcability").setExecutor(new McabilityCommand()); - if(LoadProperties.mccEnable) getCommand("mcc").setExecutor(new MccCommand()); - if(LoadProperties.mcgodEnable) getCommand("mcgod").setExecutor(new McgodCommand()); - if(LoadProperties.mcmmoEnable) getCommand("mcmmo").setExecutor(new McmmoCommand()); - if(LoadProperties.mcrefreshEnable) getCommand("mcrefresh").setExecutor(new McrefreshCommand(this)); - if(LoadProperties.mctopEnable) getCommand("mctop").setExecutor(new MctopCommand()); - + + //mc* commands + if (LoadProperties.mcremoveEnable) { + getCommand("mcremove").setExecutor(new McremoveCommand()); + } + + if (LoadProperties.mcabilityEnable) { + getCommand("mcability").setExecutor(new McabilityCommand()); + } + + if (LoadProperties.mccEnable) { + getCommand("mcc").setExecutor(new MccCommand()); + } + + if (LoadProperties.mcgodEnable) { + getCommand("mcgod").setExecutor(new McgodCommand()); + } + + if (LoadProperties.mcmmoEnable) { + getCommand("mcmmo").setExecutor(new McmmoCommand()); + } + + if (LoadProperties.mcrefreshEnable) { + getCommand("mcrefresh").setExecutor(new McrefreshCommand(this)); + } + + if (LoadProperties.mctopEnable) { + getCommand("mctop").setExecutor(new MctopCommand()); + } + + if (LoadProperties.mcstatsEnable) { + getCommand("mcstats").setExecutor(new McstatsCommand()); + } + //Party commands - if(LoadProperties.acceptEnable) getCommand("accept").setExecutor(new AcceptCommand()); - if(LoadProperties.aEnable) getCommand("a").setExecutor(new ACommand()); - if(LoadProperties.inviteEnable) getCommand("invite").setExecutor(new InviteCommand(this)); - if(LoadProperties.partyEnable) getCommand("party").setExecutor(new PartyCommand()); - if(LoadProperties.pEnable) getCommand("p").setExecutor(new PCommand()); - if(LoadProperties.ptpEnable) getCommand("ptp").setExecutor(new PtpCommand(this)); - + if (LoadProperties.acceptEnable) { + getCommand("accept").setExecutor(new AcceptCommand()); + } + + if (LoadProperties.aEnable) { + getCommand("a").setExecutor(new ACommand()); + } + + if (LoadProperties.inviteEnable) { + getCommand("invite").setExecutor(new InviteCommand(this)); + } + + if (LoadProperties.partyEnable) { + getCommand("party").setExecutor(new PartyCommand()); + } + + if (LoadProperties.pEnable) { + getCommand("p").setExecutor(new PCommand()); + } + + if (LoadProperties.ptpEnable) { + getCommand("ptp").setExecutor(new PtpCommand(this)); + } + //Other commands - if(LoadProperties.addxpEnable) getCommand("addxp").setExecutor(new AddxpCommand(this)); - if(LoadProperties.addlevelsEnable) getCommand("addlevels").setExecutor(new AddlevelsCommand(this)); - if(LoadProperties.mmoeditEnable) getCommand("mmoedit").setExecutor(new MmoeditCommand(this)); + if (LoadProperties.addxpEnable) { + getCommand("addxp").setExecutor(new AddxpCommand(this)); + } + + if (LoadProperties.addlevelsEnable) { + getCommand("addlevels").setExecutor(new AddlevelsCommand(this)); + } + + if (LoadProperties.mmoeditEnable) { + getCommand("mmoedit").setExecutor(new MmoeditCommand(this)); + } + + if (LoadProperties.inspectEnable) { + getCommand("inspect").setExecutor(new InspectCommand(this)); + } + + if (LoadProperties.xprateEnable) { + getCommand("xprate").setExecutor(new XprateCommand()); + } + getCommand("mmoupdate").setExecutor(new MmoupdateCommand()); - if(LoadProperties.mcstatsEnable) getCommand("mcstats").setExecutor(new McstatsCommand()); - if(LoadProperties.inspectEnable) getCommand("inspect").setExecutor(new InspectCommand(this)); - if(LoadProperties.xprateEnable) getCommand("xprate").setExecutor(new XprateCommand()); - + //Spout commands + if (LoadProperties.xplockEnable) { + getCommand("xplock").setExecutor(new XplockCommand()); + } + getCommand("mchud").setExecutor(new MchudCommand()); - if(LoadProperties.xplockEnable) getCommand("xplock").setExecutor(new XplockCommand()); - } - /* + /** + * Update mcMMO from a given version + *

* It is important to always assume that you are updating from the lowest possible version. * Thus, every block of updater code should be complete and self-contained; finishing all * SQL transactions and closing all file handlers, such that the next block of updater code * if called will handle updating as expected. + * + * @param age Specifies which updater code to run */ public void updateFrom(int age) { + //No updater code needed, just update the version. - if(age == -1) { + if (age == -1) { updateVersion(); return; } + //Updater code from age 1 goes here - if(age <= 1) { + if (age <= 1) { //Since age 1 is an example for now, we will just let it do nothing. - } + //If we are updating from age 1 but we need more to reach age 2, this will run too. - if(age <= 2) { - + if (age <= 2) { + } updateVersion(); } - + + /** + * Update the version file. + */ public void updateVersion() { try { versionFile.createNewFile(); BufferedWriter vout = new BufferedWriter(new FileWriter(versionFile)); vout.write(this.getDescription().getVersion()); vout.close(); - } catch (IOException ex) { + } + catch (IOException ex) { ex.printStackTrace(); - } catch (SecurityException ex) { + } + catch (SecurityException ex) { ex.printStackTrace(); } } + /** + * Get the current mcMMO version. + * + * @return a String representing the current mcMMO version + */ public String readVersion() { byte[] buffer = new byte[(int) versionFile.length()]; BufferedInputStream f = null; + try { f = new BufferedInputStream(new FileInputStream(versionFile)); f.read(buffer); - } catch (FileNotFoundException ex) { - ex.printStackTrace(); - } catch (IOException ex) { - ex.printStackTrace(); - } finally { - if (f != null) try { f.close(); } catch (IOException ignored) { } } - + catch (FileNotFoundException ex) { + ex.printStackTrace(); + } + catch (IOException ex) { + ex.printStackTrace(); + } + finally { + if (f != null) { + try { + f.close(); + } + catch (IOException ignored) {} + } + } return new String(buffer); } - + /* * Boilerplate Custom Config Stuff */ - + private FileConfiguration treasuresConfig = null; private File treasuresConfigFile = null; - + + /** + * Reload the Treasures.yml file. + */ public void reloadTreasuresConfig() { if (treasuresConfigFile == null) { - treasuresConfigFile = new File(getDataFolder(), "treasures.yml"); + treasuresConfigFile = new File(getDataFolder(), "treasures.yml"); } + treasuresConfig = YamlConfiguration.loadConfiguration(treasuresConfigFile); - - // Look for defaults in the jar - InputStream defConfigStream = getResource("treasures.yml"); + InputStream defConfigStream = getResource("treasures.yml"); // Look for defaults in the jar + if (defConfigStream != null) { YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(defConfigStream); treasuresConfig.setDefaults(defConfig); } } - + + /** + * Get the Treasures config information. + * + * @return the configuration object for treasures.yml + */ public FileConfiguration getTreasuresConfig() { if (treasuresConfig == null) { reloadTreasuresConfig(); } + return treasuresConfig; } - + + /** + * Save the Treasures config informtion. + */ public void saveTreasuresConfig() { if (treasuresConfig == null || treasuresConfigFile == null) { - return; + return; } + try { treasuresConfig.save(treasuresConfigFile); - } catch (IOException ex) { - Logger.getLogger(JavaPlugin.class.getName()).log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex); + } + catch (IOException ex) { + log.log(Level.SEVERE, "Could not save config to " + treasuresConfigFile, ex); } } -} \ No newline at end of file +} diff --git a/src/main/java/com/gmail/nossr50/skills/Taming.java b/src/main/java/com/gmail/nossr50/skills/Taming.java index 093c87286..5eb39a21b 100644 --- a/src/main/java/com/gmail/nossr50/skills/Taming.java +++ b/src/main/java/com/gmail/nossr50/skills/Taming.java @@ -1,7 +1,6 @@ package com.gmail.nossr50.skills; import org.bukkit.Material; -import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; From bce418bee89db1b2c65cbaf32164e0b133c42b16 Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 17:26:13 -0500 Subject: [PATCH 7/9] Cleanup. --- src/main/java/com/gmail/nossr50/Users.java | 182 ++++++++++-------- .../java/com/gmail/nossr50/mcPermissions.java | 79 +++++--- 2 files changed, 159 insertions(+), 102 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/Users.java b/src/main/java/com/gmail/nossr50/Users.java index 699a20e0b..6a586253a 100644 --- a/src/main/java/com/gmail/nossr50/Users.java +++ b/src/main/java/com/gmail/nossr50/Users.java @@ -1,114 +1,136 @@ package com.gmail.nossr50; import java.io.*; -import java.util.Properties; import java.util.logging.Logger; import java.util.HashMap; -import org.bukkit.entity.*; +import org.bukkit.entity.Player; import com.gmail.nossr50.datatypes.PlayerProfile; - public class Users { private static volatile Users instance; protected static final Logger log = Logger.getLogger("Minecraft"); + String location = "plugins/mcMMO/FlatFileStuff/mcmmo.users"; String directory = "plugins/mcMMO/FlatFileStuff/"; String directoryb = "plugins/mcMMO/FlatFileStuff/Leaderboards/"; - - //public static ArrayList players; + public static HashMap players = new HashMap(); - private Properties properties = new Properties(); - - //To load - public void load() throws IOException { - properties.load(new FileInputStream(location)); - } - //To save - public void save() - { - try - { - properties.store(new FileOutputStream(location), null); - }catch(IOException ex) { - } - } - - public void loadUsers() - { - new File(directory).mkdir(); - new File(directoryb).mkdir(); + + /** + * Load users. + */ + public void loadUsers() { + new File(directory).mkdir(); + new File(directoryb).mkdir(); File theDir = new File(location); - if(!theDir.exists()) - { - try { - FileWriter writer = new FileWriter(theDir); - writer.close(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } + + if (!theDir.exists()) { + try { + FileWriter writer = new FileWriter(theDir); + writer.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } } - - public static void addUser(Player player) - { - if(!players.containsKey(player)) - players.put(player, new PlayerProfile(player.getName())); + /** + * Add a new user. + * + * @param player The player to create a user record for + */ + public static void addUser(Player player) { + if (!players.containsKey(player)) { + players.put(player, new PlayerProfile(player.getName())); + } } - public static void clearUsers() - { - players.clear(); + + /** + * Clear all users. + */ + public static void clearUsers() { + players.clear(); } - public static HashMap getProfiles(){ - return players; + + /** + * Get all PlayerProfiles. + * + * @return a HashMap containing the PlayerProfile of everyone in the database + */ + public static HashMap getProfiles() { + return players; } - - public static void removeUser(Player player) - { - //Only remove PlayerProfile if user is offline and we have it in memory - if(!player.isOnline() && players.containsKey(player)) - { - players.get(player).save(); - players.remove(player); - } + + /** + * Remove a user from the database. + * + * @param player The player to remove + */ + public static void removeUser(Player player) { + + //Only remove PlayerProfile if user is offline and we have it in memory + if (!player.isOnline() && players.containsKey(player)) { + players.get(player).save(); + players.remove(player); + } } - - public static void removeUserByName(String playerName) - { + + /** + * Remove a user from the DB by name. + * + * @param playerName The name of the player to remove + */ + public static void removeUserByName(String playerName) { Player target = null; - for(Player player : players.keySet()) - { + + for (Player player : players.keySet()) { PlayerProfile PP = players.get(player); - if(PP.getPlayerName().equals(playerName)) - { + + if (PP.getPlayerName().equals(playerName)) { target = player; } } - + players.remove(target); } - public static PlayerProfile getProfile(Player player){ - if(players.get(player) != null) - return players.get(player); - else - { - players.put(player, new PlayerProfile(player.getName())); - return players.get(player); - } + /** + * Get the profile of an online player. + * + * @param player The player whose profile to retrieve + * @return the player's profile + */ + public static PlayerProfile getProfile(Player player) { + if(players.get(player) != null) { + return players.get(player); + } + else { + players.put(player, new PlayerProfile(player.getName())); + return players.get(player); + } } - - public static PlayerProfile getOfflineProfile(String playerName){ + + /** + * Get the profile of an offline player. + * + * @param playerName Name of the player whose profile to retrieve + * @return the player's profile + */ + public static PlayerProfile getOfflineProfile(String playerName) { return new PlayerProfile(playerName, false); } - - public static Users getInstance() { - if (instance == null) { - instance = new Users(); - } - return instance; - } -} \ No newline at end of file + /** + * Get an instance of this class. + * + * @return an instance of this class + */ + public static Users getInstance() { + if (instance == null) { + instance = new Users(); + } + return instance; + } +} diff --git a/src/main/java/com/gmail/nossr50/mcPermissions.java b/src/main/java/com/gmail/nossr50/mcPermissions.java index 56a8afb5c..e4357800c 100644 --- a/src/main/java/com/gmail/nossr50/mcPermissions.java +++ b/src/main/java/com/gmail/nossr50/mcPermissions.java @@ -2,118 +2,153 @@ package com.gmail.nossr50; import org.bukkit.entity.Player; -public class mcPermissions -{ +public class mcPermissions { private static volatile mcPermissions instance; - + public boolean permission(Player player, String perm) { return player.hasPermission(perm); } - public boolean admin(Player player){ + + public boolean admin(Player player) { return player.hasPermission("mcmmo.admin"); } + public boolean mcrefresh(Player player) { return player.hasPermission("mcmmo.tools.mcrefresh"); } + public boolean mcremove(Player player) { return player.hasPermission("mcmmo.tools.mcremove"); } + public boolean mmoedit(Player player) { return player.hasPermission("mcmmo.tools.mmoedit"); } - public boolean herbalismAbility(Player player){ + + public boolean herbalismAbility(Player player) { return player.hasPermission("mcmmo.ability.herbalism"); } - public boolean excavationAbility(Player player){ + + public boolean excavationAbility(Player player) { return player.hasPermission("mcmmo.ability.excavation"); } - public boolean unarmedAbility(Player player){ - return player.hasPermission("mcmmo.ability.unarmed"); + + public boolean unarmedAbility(Player player) { + return player.hasPermission("mcmmo.ability.unarmed"); } - public boolean chimaeraWing(Player player){ - return player.hasPermission("mcmmo.item.chimaerawing"); + + public boolean chimaeraWing(Player player) { + return player.hasPermission("mcmmo.item.chimaerawing"); } - public boolean miningAbility(Player player){ - return player.hasPermission("mcmmo.ability.mining"); + + public boolean miningAbility(Player player) { + return player.hasPermission("mcmmo.ability.mining"); } - public boolean axesAbility(Player player){ - return player.hasPermission("mcmmo.ability.axes"); + + public boolean axesAbility(Player player) { + return player.hasPermission("mcmmo.ability.axes"); } - public boolean swordsAbility(Player player){ - return player.hasPermission("mcmmo.ability.swords"); + + public boolean swordsAbility(Player player) { + return player.hasPermission("mcmmo.ability.swords"); } + public boolean woodCuttingAbility(Player player) { - return player.hasPermission("mcmmo.ability.woodcutting"); + return player.hasPermission("mcmmo.ability.woodcutting"); } + public boolean mcgod(Player player) { - return player.hasPermission("mcmmo.tools.mcgod"); + return player.hasPermission("mcmmo.tools.mcgod"); } + public boolean motd(Player player) { return player.hasPermission("mcmmo.motd"); } + public boolean mcAbility(Player player) { return player.hasPermission("mcmmo.commands.ability"); } + public boolean partyChat(Player player) { return player.hasPermission("mcmmo.chat.partychat"); } + public boolean partyLock(Player player) { return player.hasPermission("mcmmo.chat.partylock"); } + public boolean partyTeleport(Player player) { return player.hasPermission("mcmmo.commands.ptp"); } + public boolean inspect(Player player) { return player.hasPermission("mcmmo.commands.inspect"); } + public boolean party(Player player) { return player.hasPermission("mcmmo.commands.party"); } + public boolean adminChat(Player player) { return player.hasPermission("mcmmo.chat.adminchat"); } + public static mcPermissions getInstance() { - if (instance == null) { - instance = new mcPermissions(); - } - return instance; + if (instance == null) { + instance = new mcPermissions(); + } + + return instance; } + public boolean taming(Player player) { return player.hasPermission("mcmmo.skills.taming"); } + public boolean mining(Player player) { return player.hasPermission("mcmmo.skills.mining"); } + public boolean blastMining(Player player) { return player.hasPermission("mcmmo.skills.blastmining"); } + public boolean fishing(Player player) { return player.hasPermission("mcmmo.skills.fishing"); } + public boolean woodcutting(Player player) { return player.hasPermission("mcmmo.skills.woodcutting"); } + public boolean repair(Player player) { return player.hasPermission("mcmmo.skills.repair"); } + public boolean unarmed(Player player) { return player.hasPermission("mcmmo.skills.unarmed"); } + public boolean archery(Player player) { return player.hasPermission("mcmmo.skills.archery"); } + public boolean herbalism(Player player) { return player.hasPermission("mcmmo.skills.herbalism"); } + public boolean excavation(Player player) { return player.hasPermission("mcmmo.skills.excavation"); } + public boolean swords(Player player) { return player.hasPermission("mcmmo.skills.swords"); } + public boolean axes(Player player) { return player.hasPermission("mcmmo.skills.axes"); } + public boolean acrobatics(Player player) { return player.hasPermission("mcmmo.skills.acrobatics"); } From d393e4d124c928a403c882e92513de22a26d089c Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 18:09:31 -0500 Subject: [PATCH 8/9] Cleanup & a few memory leak fixes. --- Changelog.txt | 4 +- .../java/com/gmail/nossr50/BlockChecks.java | 47 +- .../nossr50/listeners/mcBlockListener.java | 490 +++++++++--------- 3 files changed, 288 insertions(+), 253 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3b4e5f3fe..3e394d301 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -14,9 +14,11 @@ Version 2.0.00-dev + Added bookshelves to list of blocks that don't trigger abilities. = Fixed ClassCastException from Taming preventDamage checks = Fixed issue with Blast Mining not seeing TNT for detonation due to snow + = Fixed issue with block interaction returning NPEs + = Fixed issue where every block broken had a mining check applied + = Fixed issue where blocks weren't being removed from the watchlist ! Changed Call of the Wild to activate on left-click rather than right-click ! Changed Blast Mining to track based on Entity ID vs. Location - = Attempted fix of block interaction returning NPE's Version 1.3.02 + Added in game guides for Mining, Excavation, and Acrobatics. Simply type /skillname ? to access them diff --git a/src/main/java/com/gmail/nossr50/BlockChecks.java b/src/main/java/com/gmail/nossr50/BlockChecks.java index 022365eb1..5b9c5d7cd 100644 --- a/src/main/java/com/gmail/nossr50/BlockChecks.java +++ b/src/main/java/com/gmail/nossr50/BlockChecks.java @@ -10,7 +10,7 @@ public class BlockChecks { /** * Checks to see if a block type awards XP. * - * @param material {@link Block} type to check + * @param material The type of Block to check * @return true if the block type awards XP, false otherwise */ public static boolean shouldBeWatched(Material material) { @@ -58,7 +58,7 @@ public class BlockChecks { /** * Check if a block should allow for the activation of abilities. * - * @param material Type of {@link Block} to check + * @param material The type of Block to check * @return true if the block should allow ability activation, false otherwise */ public static boolean abilityBlockCheck(Material material) { @@ -99,7 +99,7 @@ public class BlockChecks { /** * Check if a block type is an ore. * - * @param material The type of {@link Block} to check + * @param material The type of Block to check * @return true if the Block is an ore, false otherwise */ public static boolean isOre(Material material) { @@ -117,4 +117,45 @@ public class BlockChecks { return false; } } + + /** + * Adds the block the the appropriate watchlist. + * + * @param material the type of Block to watch + * @param block the Block to watch + * @param plugin mcMMO plugin instance + */ + public static void watchBlock(Material material, Block block, mcMMO plugin) { + + boolean addToChangeQueue = true; + + switch (material) { + case CACTUS: + case GLOWING_REDSTONE_ORE: + case JACK_O_LANTERN: + case LOG: + case PUMPKIN: + case REDSTONE_ORE: + case SUGAR_CANE_BLOCK: + case VINE: + addToChangeQueue = false; //We don't want these added to changeQueue - these use their data + plugin.misc.blockWatchList.add(block); + break; + + case BROWN_MUSHROOM: + case RED_MUSHROOM: + case RED_ROSE: + case YELLOW_FLOWER: + case WATER_LILY: + addToChangeQueue = false; //We don't want these added to chaneQueue - they're already being added to the fast queue + plugin.fastChangeQueue.push(block); + break; + + default: + break; + } + + if(addToChangeQueue) + plugin.changeQueue.push(block); + } } diff --git a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java index 5eb93c4a7..22ed17372 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java @@ -31,269 +31,261 @@ import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.skills.*; import com.gmail.nossr50.events.FakeBlockBreakEvent; -public class mcBlockListener implements Listener -{ +public class mcBlockListener implements Listener { private final mcMMO plugin; - public mcBlockListener(final mcMMO plugin) - { + public mcBlockListener(final mcMMO plugin) { this.plugin = plugin; } - + + /** + * Monitor BlockPlace events. + * + * @param event The event to monitor + */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockPlace(BlockPlaceEvent event) - { - //Setup some basic variables - Block block; - Player player = event.getPlayer(); - - //When blocks are placed on snow this event reports the wrong block. - if (event.getBlockReplacedState() != null && event.getBlockReplacedState().getType().equals(Material.SNOW)) - block = event.getBlockAgainst(); - else - block = event.getBlock(); - - int id = block.getTypeId(); - Material mat = block.getType(); - - //Check if the blocks placed should be monitored so they do not give out XP in the future - if(BlockChecks.shouldBeWatched(mat)) - { - //Only needed for blocks that use their block data (wood, pumpkins, etc.) - boolean shouldBeChanged = true; - - switch(mat) - { - case CACTUS: - case GLOWING_REDSTONE_ORE: - case JACK_O_LANTERN: - case LOG: - case PUMPKIN: - case REDSTONE_ORE: - case SUGAR_CANE_BLOCK: - case VINE: - shouldBeChanged = false; //We don't want these added to changeQueue - plugin.misc.blockWatchList.add(block); - break; - case BROWN_MUSHROOM: - case RED_MUSHROOM: - case RED_ROSE: - case YELLOW_FLOWER: - case WATER_LILY: - plugin.fastChangeQueue.push(block); - break; - } - - if(shouldBeChanged) - plugin.changeQueue.push(block); - } - - if(id == LoadProperties.anvilID && LoadProperties.anvilmessages) - { - PlayerProfile PP = Users.getProfile(player); - if(!PP.getPlacedAnvil()) - { - if(LoadProperties.spoutEnabled) - { - SpoutPlayer sPlayer = SpoutManager.getPlayer(player); - if(sPlayer.isSpoutCraftEnabled()) - sPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to repair!", Material.IRON_BLOCK); - } - else - event.getPlayer().sendMessage(mcLocale.getString("mcBlockListener.PlacedAnvil")); //$NON-NLS-1$ - - PP.togglePlacedAnvil(); - } - } + public void onBlockPlace(BlockPlaceEvent event) { + Block block; + Player player = event.getPlayer(); + + //When blocks are placed on snow this event reports the wrong block. + if (event.getBlockReplacedState() != null && event.getBlockReplacedState().getType().equals(Material.SNOW)) { + block = event.getBlockAgainst(); + } + else { + block = event.getBlock(); + } + + int id = block.getTypeId(); + Material mat = block.getType(); + + //Check if the blocks placed should be monitored so they do not give out XP in the future + if (BlockChecks.shouldBeWatched(mat)) { + BlockChecks.watchBlock(mat, block, plugin); + } + + if (id == LoadProperties.anvilID && LoadProperties.anvilmessages) { + PlayerProfile PP = Users.getProfile(player); + + if (!PP.getPlacedAnvil()) { + if (LoadProperties.spoutEnabled) { + SpoutPlayer sPlayer = SpoutManager.getPlayer(player); + + if (sPlayer.isSpoutCraftEnabled()) { + sPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to repair!", Material.getMaterial(id)); + } + } + else { + event.getPlayer().sendMessage(mcLocale.getString("mcBlockListener.PlacedAnvil")); + } + + PP.togglePlacedAnvil(); + } + } } + /** + * Monitor BlockBreak events. + * + * @param event The event to monitor + */ @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onBlockBreak(BlockBreakEvent event) - { - Player player = event.getPlayer(); - PlayerProfile PP = Users.getProfile(player); - Block block = event.getBlock(); - int id = block.getTypeId(); - ItemStack inhand = player.getItemInHand(); - - if(event instanceof FakeBlockBreakEvent) - return; - - /* - * HERBALISM - */ - - //Green Terra - if(PP.getHoePreparationMode() && mcPermissions.getInstance().herbalismAbility(player) && ((id == 59 && block.getData() == (byte) 0x07) || Herbalism.canBeGreenTerra(block))) - Skills.abilityCheck(player, SkillType.HERBALISM); - - //Wheat && Triple drops - if(PP.getGreenTerraMode() && Herbalism.canBeGreenTerra(block)) - Herbalism.herbalismProcCheck(block, player, event, plugin); - - if(mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 5) - Herbalism.herbalismProcCheck(block, player, event, plugin); - - /* - * MINING - */ - if(mcPermissions.getInstance().mining(player)) - { - if(LoadProperties.miningrequirespickaxe && ItemChecks.isMiningPick(inhand)) - Mining.miningBlockCheck(player, block, plugin); - else if(!LoadProperties.miningrequirespickaxe) - Mining.miningBlockCheck(player, block, plugin); - } - - /* - * WOOD CUTTING - */ - - if(mcPermissions.getInstance().woodcutting(player) && id == 17) - { - if(LoadProperties.woodcuttingrequiresaxe && ItemChecks.isAxe(inhand)) - WoodCutting.woodcuttingBlockCheck(player, block, plugin); - else if(!LoadProperties.woodcuttingrequiresaxe) - WoodCutting.woodcuttingBlockCheck(player, block, plugin); - - if(PP.getTreeFellerMode()) - WoodCutting.treeFeller(event, plugin); - } - - /* - * EXCAVATION - */ - if(Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 5) - { - if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) - Excavation.excavationProcCheck(block, player); - else if(!LoadProperties.excavationRequiresShovel) - Excavation.excavationProcCheck(block, player); - } - - //Change the byte back when broken - if(block.getData() == 5 && BlockChecks.shouldBeWatched(block.getType())) - { - block.setData((byte) 0); - if(plugin.misc.blockWatchList.contains(block)) - plugin.misc.blockWatchList.remove(block); - } + public void onBlockBreak(BlockBreakEvent event) { + Player player = event.getPlayer(); + PlayerProfile PP = Users.getProfile(player); + Block block = event.getBlock(); + Material mat = block.getType(); + ItemStack inhand = player.getItemInHand(); + + if(event instanceof FakeBlockBreakEvent) { + return; + } + + /* + * HERBALISM + */ + + //Green Terra + if (PP.getHoePreparationMode() && mcPermissions.getInstance().herbalismAbility(player) && ((mat.equals(Material.CROPS) && block.getData() == (byte) 0x7) || Herbalism.canBeGreenTerra(block))) { + Skills.abilityCheck(player, SkillType.HERBALISM); + } + + //Wheat && Triple drops + if (PP.getGreenTerraMode() && Herbalism.canBeGreenTerra(block)) { + Herbalism.herbalismProcCheck(block, player, event, plugin); + } + + if (mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 5) { + Herbalism.herbalismProcCheck(block, player, event, plugin); + } + + /* + * MINING + */ + + if (mcPermissions.getInstance().mining(player) && Mining.canBeSuperBroken(block)) { + if (LoadProperties.miningrequirespickaxe && ItemChecks.isMiningPick(inhand)) { + Mining.miningBlockCheck(player, block, plugin); + } + else if (!LoadProperties.miningrequirespickaxe) { + Mining.miningBlockCheck(player, block, plugin); + } + } + + /* + * WOOD CUTTING + */ + + if(mcPermissions.getInstance().woodcutting(player) && mat.equals(Material.LOG)) { + if (LoadProperties.woodcuttingrequiresaxe && ItemChecks.isAxe(inhand)) { + WoodCutting.woodcuttingBlockCheck(player, block, plugin); + } + else if (!LoadProperties.woodcuttingrequiresaxe) { + WoodCutting.woodcuttingBlockCheck(player, block, plugin); + } + + if (PP.getTreeFellerMode()) { + WoodCutting.treeFeller(event, plugin); + } + } + + /* + * EXCAVATION + */ + + if (Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 0x5) + { + if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) { + Excavation.excavationProcCheck(block, player); + } + else if(!LoadProperties.excavationRequiresShovel) { + Excavation.excavationProcCheck(block, player); + } + } + + //Change the byte back when broken + if (block.getData() == (byte) 0x5 && BlockChecks.shouldBeWatched(mat)) { + block.setData((byte) 0x0); + } + else if(plugin.misc.blockWatchList.contains(block)) { + plugin.misc.blockWatchList.remove(block); + } } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockDamage(BlockDamageEvent event) { - Player player = event.getPlayer(); - PlayerProfile PP = Users.getProfile(player); - ItemStack inhand = player.getItemInHand(); - Block block = event.getBlock(); - int id = block.getTypeId(); - Material mat = block.getType(); + Player player = event.getPlayer(); + PlayerProfile PP = Users.getProfile(player); + ItemStack inhand = player.getItemInHand(); + Block block = event.getBlock(); + int id = block.getTypeId(); + Material mat = block.getType(); - /* - * ABILITY PREPARATION CHECKS - */ - if(BlockChecks.abilityBlockCheck(mat)) - { - if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block)) - Skills.abilityCheck(player, SkillType.HERBALISM); - if(PP.getAxePreparationMode() && mat.equals(Material.LOG) && mcPermissions.getInstance().woodCuttingAbility(player)) - Skills.abilityCheck(player, SkillType.WOODCUTTING); - if(PP.getPickaxePreparationMode() && Mining.canBeSuperBroken(block)) - Skills.abilityCheck(player, SkillType.MINING); - if(PP.getShovelPreparationMode() && Excavation.canBeGigaDrillBroken(block)) - Skills.abilityCheck(player, SkillType.EXCAVATION); - } - - if(PP.getFistsPreparationMode() && (Excavation.canBeGigaDrillBroken(block) || mat.equals(Material.SNOW))) - Skills.abilityCheck(player, SkillType.UNARMED); - - /* - * TREE FELLER STUFF - */ - if(LoadProperties.spoutEnabled && mat.equals(Material.LOG) && PP.getTreeFellerMode()) - SpoutStuff.playSoundForPlayer(SoundEffect.FIZZ, player, block.getLocation()); - - /* - * GREEN TERRA STUFF - */ - if(PP.getGreenTerraMode() && mcPermissions.getInstance().herbalismAbility(player)) - Herbalism.greenTerra(player, block); - - /* - * GIGA DRILL BREAKER CHECKS - */ - if(PP.getGigaDrillBreakerMode() && Excavation.canBeGigaDrillBroken(block) && m.blockBreakSimulate(block, player, true) && mcPermissions.getInstance().excavationAbility(player)) - { - if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) - { - event.setInstaBreak(true); - Excavation.gigaDrillBreaker(player, block); - } - else if(!LoadProperties.excavationRequiresShovel) - { - event.setInstaBreak(true); - Excavation.gigaDrillBreaker(player, block); - } - } - /* - * BERSERK MODE CHECKS - */ - if(PP.getBerserkMode() - && m.blockBreakSimulate(block, player, true) - && player.getItemInHand().getTypeId() == 0 - && (Excavation.canBeGigaDrillBroken(block) || id == 78) - && mcPermissions.getInstance().unarmedAbility(player)) - { - event.setInstaBreak(true); - - if(LoadProperties.spoutEnabled) - SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation()); - } - - /* - * SUPER BREAKER CHECKS - */ - if(PP.getSuperBreakerMode() - && Mining.canBeSuperBroken(block) - && m.blockBreakSimulate(block, player, true) - && mcPermissions.getInstance().miningAbility(player)) - { - if(LoadProperties.miningrequirespickaxe) - { - if(ItemChecks.isMiningPick(inhand)){ - - event.setInstaBreak(true); - Mining.SuperBreakerBlockCheck(player, block, plugin); - } - } else { - event.setInstaBreak(true); - Mining.SuperBreakerBlockCheck(player, block, plugin); - } - } - - /* - * LEAF BLOWER CHECKS - */ - if(id == 18 - && mcPermissions.getInstance().woodCuttingAbility(player) - && PP.getSkillLevel(SkillType.WOODCUTTING) >= 100 - && m.blockBreakSimulate(block, player, true)) - { - if(LoadProperties.woodcuttingrequiresaxe) - { - if(ItemChecks.isAxe(inhand)){ - event.setInstaBreak(true); - WoodCutting.leafBlower(player, block); - } - } - else if(inhand.getTypeId() != 359) - { - event.setInstaBreak(true); - WoodCutting.leafBlower(player, block); - } - - } + /* + * ABILITY PREPARATION CHECKS + */ + if(BlockChecks.abilityBlockCheck(mat)) + { + if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block)) + Skills.abilityCheck(player, SkillType.HERBALISM); + if(PP.getAxePreparationMode() && mat.equals(Material.LOG) && mcPermissions.getInstance().woodCuttingAbility(player)) + Skills.abilityCheck(player, SkillType.WOODCUTTING); + if(PP.getPickaxePreparationMode() && Mining.canBeSuperBroken(block)) + Skills.abilityCheck(player, SkillType.MINING); + if(PP.getShovelPreparationMode() && Excavation.canBeGigaDrillBroken(block)) + Skills.abilityCheck(player, SkillType.EXCAVATION); + } + + if(PP.getFistsPreparationMode() && (Excavation.canBeGigaDrillBroken(block) || mat.equals(Material.SNOW))) + Skills.abilityCheck(player, SkillType.UNARMED); + + /* + * TREE FELLER STUFF + */ + if(LoadProperties.spoutEnabled && mat.equals(Material.LOG) && PP.getTreeFellerMode()) + SpoutStuff.playSoundForPlayer(SoundEffect.FIZZ, player, block.getLocation()); + + /* + * GREEN TERRA STUFF + */ + if(PP.getGreenTerraMode() && mcPermissions.getInstance().herbalismAbility(player)) + Herbalism.greenTerra(player, block); + + /* + * GIGA DRILL BREAKER CHECKS + */ + if(PP.getGigaDrillBreakerMode() && Excavation.canBeGigaDrillBroken(block) && m.blockBreakSimulate(block, player, true) && mcPermissions.getInstance().excavationAbility(player)) + { + if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) + { + event.setInstaBreak(true); + Excavation.gigaDrillBreaker(player, block); + } + else if(!LoadProperties.excavationRequiresShovel) + { + event.setInstaBreak(true); + Excavation.gigaDrillBreaker(player, block); + } + } + /* + * BERSERK MODE CHECKS + */ + if(PP.getBerserkMode() + && m.blockBreakSimulate(block, player, true) + && player.getItemInHand().getTypeId() == 0 + && (Excavation.canBeGigaDrillBroken(block) || id == 78) + && mcPermissions.getInstance().unarmedAbility(player)) + { + event.setInstaBreak(true); + + if(LoadProperties.spoutEnabled) + SpoutStuff.playSoundForPlayer(SoundEffect.POP, player, block.getLocation()); + } + + /* + * SUPER BREAKER CHECKS + */ + if(PP.getSuperBreakerMode() + && Mining.canBeSuperBroken(block) + && m.blockBreakSimulate(block, player, true) + && mcPermissions.getInstance().miningAbility(player)) + { + if(LoadProperties.miningrequirespickaxe) + { + if(ItemChecks.isMiningPick(inhand)){ + + event.setInstaBreak(true); + Mining.SuperBreakerBlockCheck(player, block, plugin); + } + } else { + event.setInstaBreak(true); + Mining.SuperBreakerBlockCheck(player, block, plugin); + } + } + + /* + * LEAF BLOWER CHECKS + */ + if(id == 18 + && mcPermissions.getInstance().woodCuttingAbility(player) + && PP.getSkillLevel(SkillType.WOODCUTTING) >= 100 + && m.blockBreakSimulate(block, player, true)) + { + if(LoadProperties.woodcuttingrequiresaxe) + { + if(ItemChecks.isAxe(inhand)){ + event.setInstaBreak(true); + WoodCutting.leafBlower(player, block); + } + } + else if(inhand.getTypeId() != 359) + { + event.setInstaBreak(true); + WoodCutting.leafBlower(player, block); + } + + } } @EventHandler From c3e1cf868192f4e34854de767eb63dbd0813764a Mon Sep 17 00:00:00 2001 From: GJ Date: Thu, 8 Mar 2012 18:15:14 -0500 Subject: [PATCH 9/9] Another leak... --- Changelog.txt | 1 + .../java/com/gmail/nossr50/listeners/mcBlockListener.java | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 3e394d301..c726c6a29 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -16,6 +16,7 @@ Version 2.0.00-dev = Fixed issue with Blast Mining not seeing TNT for detonation due to snow = Fixed issue with block interaction returning NPEs = Fixed issue where every block broken had a mining check applied + = Fixed issue where every block broken had a herbalism check applied = Fixed issue where blocks weren't being removed from the watchlist ! Changed Call of the Wild to activate on left-click rather than right-click ! Changed Blast Mining to track based on Entity ID vs. Location diff --git a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java index 22ed17372..0dccf4a7b 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java @@ -115,7 +115,7 @@ public class mcBlockListener implements Listener { Herbalism.herbalismProcCheck(block, player, event, plugin); } - if (mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 5) { + if (mcPermissions.getInstance().herbalism(player) && block.getData() != (byte) 0x5 && Herbalism.canBeGreenTerra(block)) { Herbalism.herbalismProcCheck(block, player, event, plugin); } @@ -153,8 +153,7 @@ public class mcBlockListener implements Listener { * EXCAVATION */ - if (Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 0x5) - { + if (Excavation.canBeGigaDrillBroken(block) && mcPermissions.getInstance().excavation(player) && block.getData() != (byte) 0x5) { if(LoadProperties.excavationRequiresShovel && ItemChecks.isShovel(inhand)) { Excavation.excavationProcCheck(block, player); }