From dbede7f81afeeba16f949fade4cd1a0e98846beb Mon Sep 17 00:00:00 2001 From: GJ Date: Tue, 1 May 2012 01:14:32 -0400 Subject: [PATCH] Added config options for specific double drops. Implements MCCORE-226 --- Changelog.txt | 1 + .../java/com/gmail/nossr50/config/Config.java | 40 ++++- .../gmail/nossr50/datatypes/AbilityType.java | 32 ++-- .../nossr50/listeners/BlockListener.java | 22 +-- .../nossr50/listeners/PlayerListener.java | 2 +- .../com/gmail/nossr50/skills/Excavation.java | 22 --- .../com/gmail/nossr50/skills/Herbalism.java | 141 ++++++++++-------- .../java/com/gmail/nossr50/skills/Mining.java | 118 +++++++++------ .../com/gmail/nossr50/skills/WoodCutting.java | 101 +++++++++---- .../com/gmail/nossr50/util/BlockChecks.java | 115 +++++++++++++- src/main/resources/config.yml | 39 ++++- 11 files changed, 441 insertions(+), 192 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index 6947f1b8e..2ae68f519 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -13,6 +13,7 @@ Version 1.3.07 + Added a permission node for Archery bonus damage + Added a permission node for Greater Impact ability + Added permission nodes for Treasure & Magic Hunter for Fishing + + Added config options for enabling/disabling specific double drops = Fixed bug where the permission node for Impact didn't work = Fixed some bypass nodes defaulting true for Ops ! Changed Mining to ignore blocks when the pick is enchanted with Silk Touch diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 35a854e37..5ea657401 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -19,7 +19,6 @@ public class Config extends ConfigLoader { * GENERAL SETTINGS */ - /* General Settings */ public String getLocale() { return config.getString("General.Locale", "en_us"); } public boolean getMOTDEnabled() { return config.getBoolean("General.MOTD_Enabled", true); } @@ -43,7 +42,7 @@ public class Config extends ConfigLoader { return ""; } } - + /* Hardcore Mode */ public boolean getHardcoreEnabled() { return config.getBoolean("Hardcore.Enabled", false); } public double getHardcoreDeathStatPenaltyPercentage() { return config.getDouble("Hardcore.Death_Stat_Loss_Penalty_Percentage", 75); } @@ -137,12 +136,26 @@ public class Config extends ConfigLoader { public int getHerbalismXPNetherWart() { return config.getInt("Experience.Herbalism.Nether_Wart", 50); } public int getHerbalismXPLilyPads() { return config.getInt("Experience.Herbalism.Lily_Pads", 100); } public int getHerbalismXPVines() { return config.getInt("Experience.Herbalism.Vines", 10); } + public boolean getHerbalismHungerBonusEnabled() { return config.getBoolean("Skills.Herbalism.Hunger_Bonus", true); } public boolean getHerbalismWheatRegrowth() { return config.getBoolean("Skills.Herbalism.Instant_Wheat_Regrowth", true); } public boolean getHerbalismGreenThumbCobbleToMossy() { return config.getBoolean("Skills.Herbalism.Green_Thumb.Cobble_To_Mossy", true); } public boolean getHerbalismGreenThumbSmoothbrickToMossy() { return config.getBoolean("Skills.Herbalism.Green_Thumb.SmoothBrick_To_MossyBrick", true); } public boolean getHerbalismGreenThumbDirtToGrass() { return config.getBoolean("Skills.Herbalism.Green_Thumb.Dirt_To_Grass", true); } + public boolean getBrownMushroomsDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Brown_Mushrooms", true); } + public boolean getCactiDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Cacti", true); } + public boolean getWheatDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Wheat", true); } + public boolean getMelonsDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Melons", true); } + public boolean getNetherWartsDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Nether_Warts", true); } + public boolean getPumpkinsDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Pumpkins", true); } + public boolean getRedMushroomsDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Red_Mushrooms", true); } + public boolean getRedRosesDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Red_Roses", true); } + public boolean getSugarCaneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Sugar_Cane", true); } + public boolean getVinesDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Vines", true); } + public boolean getWaterLiliesDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Water_Lilies", true); } + public boolean getYellowFlowersDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Herbalism.Yellow_Flowers", true); } + /* Mining */ public int getMiningXPGoldOre() { return config.getInt("Experience.Mining.Gold", 250); } public int getMiningXPDiamondOre() { return config.getInt("Experience.Mining.Diamond", 750); } @@ -157,7 +170,21 @@ public class Config extends ConfigLoader { public int getMiningXPSandstone() { return config.getInt("Experience.Mining.Sandstone", 30); } public int getMiningXPEndStone() { return config.getInt("Experience.Mining.End_Stone", 150); } public int getMiningXPMossyStone() { return config.getInt("Experience.Mining.Moss_Stone", 30); } - + + public boolean getCoalDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Coal", true); } + public boolean getDiamondDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Diamond", true); } + public boolean getEndStoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.End_Stone", true); } + public boolean getGlowstoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Glowstone", true); } + public boolean getGoldDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Gold", true); } + public boolean getIronDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Iron", true); } + public boolean getLapisDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Lapis", true); } + public boolean getMossyCobblestoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Moss_Stone", true); } + public boolean getNetherrackDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Netherrack", true); } + public boolean getObsidianDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Obsidian", true); } + public boolean getRedstoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Redstone", true); } + public boolean getSandstoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Sandstone", true); } + public boolean getStoneDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Mining.Stone", true); } + public int getDetonatorItemID() { return config.getInt("Skills.Mining.Detonator_ID", 259); } /* Repair */ @@ -171,7 +198,7 @@ public class Config extends ConfigLoader { public int getRepairIronMaterial() { return config.getInt("Skills.Repair.Iron.ID", 265); } public int getRepairStringMaterial() { return config.getInt("Skills.Repair.String.ID", 287); } public int getRepairLeatherMaterial() { return config.getInt("Skills.Repair.Leather.ID", 334); } - + public boolean getRepairArmorAllowed() { return config.getBoolean("Skills.Repair.Can_Repair_Armor", true); } public boolean getRepairToolsAllowed() { return config.getBoolean("Skills.Repair.Can_Repair_Tools", true); } public int getRepairDiamondLevelRequirement() { return config.getInt("Skills.Repair.Diamond.Level_Required", 50); } @@ -192,6 +219,11 @@ public class Config extends ConfigLoader { public int getWoodcuttingXPSpruce() { return config.getInt("Experience.Woodcutting.Spruce", 80); } public int getWoodcuttingXPJungle() { return config.getInt("Experience.Woodcutting.Jungle", 100); } + public boolean getOakDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Oak", true); } + public boolean getBirchDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Birch", true); } + public boolean getSpruceDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Spruce", true); } + public boolean getJungleDoubleDropsEnabled() { return config.getBoolean("Double_Drops.Woodcutting.Jungle", true); } + /* Arcane Forging */ public boolean getArcaneForgingDowngradeEnabled() { return config.getBoolean("Arcane_Forging.Downgrades.Enabled", true); } public int getArcaneForgingDowngradeChanceRank1() { return config.getInt("Arcane_Forging.Downgrades.Chance.Rank_1", 75); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/AbilityType.java b/src/main/java/com/gmail/nossr50/datatypes/AbilityType.java index f46e2d4c4..4c7319436 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/AbilityType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/AbilityType.java @@ -5,9 +5,7 @@ import org.bukkit.entity.Player; import com.gmail.nossr50.config.Config; import com.gmail.nossr50.locale.LocaleLoader; -import com.gmail.nossr50.skills.Excavation; -import com.gmail.nossr50.skills.Herbalism; -import com.gmail.nossr50.skills.Mining; +import com.gmail.nossr50.util.BlockChecks; import com.gmail.nossr50.util.Permissions; public enum AbilityType { @@ -130,33 +128,35 @@ public enum AbilityType { * @return true if the player has permissions, false otherwise */ public boolean getPermissions(Player player) { + Permissions permInstance = Permissions.getInstance(); + switch (this) { case BERSERK: - return Permissions.getInstance().berserk(player); + return permInstance.berserk(player); case BLAST_MINING: - return Permissions.getInstance().blastMining(player); + return permInstance.blastMining(player); case GIGA_DRILL_BREAKER: - return Permissions.getInstance().gigaDrillBreaker(player); + return permInstance.gigaDrillBreaker(player); case GREEN_TERRA: - return Permissions.getInstance().greenTerra(player); + return permInstance.greenTerra(player); case LEAF_BLOWER: - return Permissions.getInstance().leafBlower(player); + return permInstance.leafBlower(player); case SERRATED_STRIKES: - return Permissions.getInstance().serratedStrikes(player); + return permInstance.serratedStrikes(player); case SKULL_SPLIITER: - return Permissions.getInstance().skullSplitter(player); + return permInstance.skullSplitter(player); case SUPER_BREAKER: - return Permissions.getInstance().superBreaker(player); + return permInstance.superBreaker(player); case TREE_FELLER: - return Permissions.getInstance().treeFeller(player); + return permInstance.treeFeller(player); default: return false; @@ -172,19 +172,19 @@ public enum AbilityType { public boolean blockCheck(Material material) { switch (this) { case BERSERK: - return (Excavation.canBeGigaDrillBroken(material) || material.equals(Material.SNOW)); + return (BlockChecks.canBeGigaDrillBroken(material) || material.equals(Material.SNOW)); case GIGA_DRILL_BREAKER: - return Excavation.canBeGigaDrillBroken(material); + return BlockChecks.canBeGigaDrillBroken(material); case GREEN_TERRA: - return Herbalism.makeMossy(material); + return BlockChecks.makeMossy(material); case LEAF_BLOWER: return material.equals(Material.LEAVES); case SUPER_BREAKER: - return Mining.canBeSuperBroken(material); + return BlockChecks.canBeSuperBroken(material); case TREE_FELLER: return material.equals(Material.LOG); diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index 259380989..936e3be32 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -146,16 +146,16 @@ public class BlockListener implements Listener { */ /* Green Terra */ - if (PP.getToolPreparationMode(ToolType.HOE) && Permissions.getInstance().greenTerra(player) && ((mat.equals(Material.CROPS) && block.getData() == CropState.RIPE.getData()) || Herbalism.canBeGreenTerra(mat))) { + if (PP.getToolPreparationMode(ToolType.HOE) && Permissions.getInstance().greenTerra(player) && ((mat.equals(Material.CROPS) && block.getData() == CropState.RIPE.getData()) || BlockChecks.canBeGreenTerra(mat))) { Skills.abilityCheck(player, SkillType.HERBALISM); } /* Triple drops */ - if (PP.getAbilityMode(AbilityType.GREEN_TERRA) && Herbalism.canBeGreenTerra(mat)) { + if (PP.getAbilityMode(AbilityType.GREEN_TERRA) && BlockChecks.canBeGreenTerra(mat)) { Herbalism.herbalismProcCheck(block, player, event, plugin); } - if (Permissions.getInstance().herbalism(player) && Herbalism.canBeGreenTerra(mat)) { + if (Permissions.getInstance().herbalism(player) && BlockChecks.canBeGreenTerra(mat)) { Herbalism.herbalismProcCheck(block, player, event, plugin); } @@ -163,7 +163,7 @@ public class BlockListener implements Listener { * MINING */ - if (Permissions.getInstance().mining(player) && Mining.canBeSuperBroken(mat)) { + if (Permissions.getInstance().mining(player) && BlockChecks.canBeSuperBroken(mat)) { if (Config.getInstance().getMiningRequiresTool() && ItemChecks.isMiningPick(inhand)) { Mining.miningBlockCheck(player, block); } @@ -193,7 +193,7 @@ public class BlockListener implements Listener { * EXCAVATION */ - if (Excavation.canBeGigaDrillBroken(mat) && Permissions.getInstance().excavation(player) && !block.hasMetadata("mcmmoPlacedBlock")) { + if (BlockChecks.canBeGigaDrillBroken(mat) && Permissions.getInstance().excavation(player) && !block.hasMetadata("mcmmoPlacedBlock")) { if (Config.getInstance().getExcavationRequiresTool() && ItemChecks.isShovel(inhand)) { Excavation.excavationProcCheck(block, player); } @@ -227,19 +227,19 @@ public class BlockListener implements Listener { * ABILITY PREPARATION CHECKS */ if (BlockChecks.abilityBlockCheck(mat)) { - if (PP.getToolPreparationMode(ToolType.HOE) && (Herbalism.canBeGreenTerra(mat) || Herbalism.makeMossy(mat))) { + if (PP.getToolPreparationMode(ToolType.HOE) && (BlockChecks.canBeGreenTerra(mat) || BlockChecks.makeMossy(mat))) { Skills.abilityCheck(player, SkillType.HERBALISM); } - else if (PP.getToolPreparationMode(ToolType.AXE) && mat.equals(Material.LOG) && Permissions.getInstance().treeFeller(player)) { //Why are we checking the permissions here? + else if (PP.getToolPreparationMode(ToolType.AXE) && mat.equals(Material.LOG) && Permissions.getInstance().treeFeller(player)) { //TODO: Why are we checking the permissions here? Skills.abilityCheck(player, SkillType.WOODCUTTING); } - else if (PP.getToolPreparationMode(ToolType.PICKAXE) && Mining.canBeSuperBroken(mat)) { + else if (PP.getToolPreparationMode(ToolType.PICKAXE) && BlockChecks.canBeSuperBroken(mat)) { Skills.abilityCheck(player, SkillType.MINING); } - else if (PP.getToolPreparationMode(ToolType.SHOVEL) && Excavation.canBeGigaDrillBroken(mat)) { + else if (PP.getToolPreparationMode(ToolType.SHOVEL) && BlockChecks.canBeGigaDrillBroken(mat)) { Skills.abilityCheck(player, SkillType.EXCAVATION); } - else if (PP.getToolPreparationMode(ToolType.FISTS) && (Excavation.canBeGigaDrillBroken(mat) || mat.equals(Material.SNOW))) { + else if (PP.getToolPreparationMode(ToolType.FISTS) && (BlockChecks.canBeGigaDrillBroken(mat) || mat.equals(Material.SNOW))) { Skills.abilityCheck(player, SkillType.UNARMED); } } @@ -252,7 +252,7 @@ public class BlockListener implements Listener { /* * ABILITY TRIGGER CHECKS */ - if (PP.getAbilityMode(AbilityType.GREEN_TERRA) && Permissions.getInstance().greenTerra(player) && Herbalism.makeMossy(mat)) { + if (PP.getAbilityMode(AbilityType.GREEN_TERRA) && Permissions.getInstance().greenTerra(player) && BlockChecks.makeMossy(mat)) { Herbalism.greenTerra(player, block); } else if (PP.getAbilityMode(AbilityType.GIGA_DRILL_BREAKER) && Skills.triggerCheck(player, block, AbilityType.GIGA_DRILL_BREAKER)) { diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index de7b42a40..0337f0f18 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -222,7 +222,7 @@ public class PlayerListener implements Listener { } /* GREEN THUMB CHECK */ - if (Permissions.getInstance().greenThumbBlocks(player) && Herbalism.makeMossy(mat) && is.getType().equals(Material.SEEDS)) { + if (Permissions.getInstance().greenThumbBlocks(player) && BlockChecks.makeMossy(mat) && is.getType().equals(Material.SEEDS)) { Herbalism.greenThumbBlocks(is, player, block); } diff --git a/src/main/java/com/gmail/nossr50/skills/Excavation.java b/src/main/java/com/gmail/nossr50/skills/Excavation.java index ce46ec3c8..05766662d 100644 --- a/src/main/java/com/gmail/nossr50/skills/Excavation.java +++ b/src/main/java/com/gmail/nossr50/skills/Excavation.java @@ -28,28 +28,6 @@ public class Excavation { private static Random random = new Random(); - /** - * Check to see if a block can be broken by Giga Drill Breaker. - * - * @param material The type of block to check - * @return - */ - public static boolean canBeGigaDrillBroken(Material type) { - switch (type) { - case CLAY: - case DIRT: - case GRASS: - case GRAVEL: - case MYCEL: - case SAND: - case SOUL_SAND: - return true; - - default: - return false; - } - } - /** * Check to see if treasures were found. * diff --git a/src/main/java/com/gmail/nossr50/skills/Herbalism.java b/src/main/java/com/gmail/nossr50/skills/Herbalism.java index 34d9d62b8..58ef6f98c 100644 --- a/src/main/java/com/gmail/nossr50/skills/Herbalism.java +++ b/src/main/java/com/gmail/nossr50/skills/Herbalism.java @@ -62,52 +62,6 @@ public class Herbalism { } } - /** - * Check if a block can be made mossy. - * - * @param material The type of Block to check - * @return true if the block can be made mossy, false otherwise - */ - public static Boolean makeMossy(Material type) { - switch (type) { - case COBBLESTONE: - case DIRT: - case SMOOTH_BRICK: - return true; - - default: - return false; - } - } - - /** - * Check if a block is affected by Herbalism abilities. - * - * @param type The type of Block to check - * @return true if the block is affected, false otherwise - */ - public static Boolean canBeGreenTerra(Material type){ - switch (type) { - case BROWN_MUSHROOM: - case CACTUS: - case CROPS: - case JACK_O_LANTERN: - case MELON_BLOCK: - case NETHER_WARTS: - case PUMPKIN: - case RED_MUSHROOM: - case RED_ROSE: - case SUGAR_CANE_BLOCK: - case VINE: - case WATER_LILY: - case YELLOW_FLOWER: - return true; - - default: - return false; - } - } - /** * Check for extra Herbalism drops. * @@ -231,30 +185,89 @@ public class Herbalism { if (mat == null) { return; - } else if (Permissions.getInstance().herbalismDoubleDrops(player)) { + } + + if (Permissions.getInstance().herbalismDoubleDrops(player)) { ItemStack is = new ItemStack(mat); if (herbLevel > MAX_BONUS_LEVEL || random.nextInt(1000) <= herbLevel) { - if (type.equals(Material.CACTUS)) { - Misc.mcDropItems(loc, is, catciDrops); - } - else if (type.equals(Material.MELON_BLOCK)) { - Misc.mcDropItems(loc, is, 3); - Misc.mcRandomDropItems(loc, is, 50, 4); - } - else if (type.equals(Material.NETHER_WARTS)) { - Misc.mcDropItems(loc, is, 2); - Misc.mcRandomDropItems(loc, is, 50, 3); - } - else if (type.equals(Material.SUGAR_CANE_BLOCK)) { - Misc.mcDropItems(loc, is, caneDrops); - } - else { - Misc.mcDropItem(loc, is); + Config configInstance = Config.getInstance(); + + switch (type) { + case BROWN_MUSHROOM: + if (configInstance.getBrownMushroomsDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case CACTUS: + if (configInstance.getCactiDoubleDropsEnabled()) { + Misc.mcDropItems(loc, is, catciDrops); + } + break; + + case CROPS: + if (configInstance.getWheatDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case MELON_BLOCK: + if (configInstance.getMelonsDoubleDropsEnabled()) { + Misc.mcDropItems(loc, is, 3); + Misc.mcRandomDropItems(loc, is, 50, 4); + } + break; + + case NETHER_WARTS: + if (configInstance.getNetherWartsDoubleDropsEnabled()) { + Misc.mcDropItems(loc, is, 2); + Misc.mcRandomDropItems(loc, is, 50, 3); + } + break; + + case PUMPKIN: + if (configInstance.getPumpkinsDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case RED_MUSHROOM: + if (configInstance.getRedMushroomsDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case SUGAR_CANE_BLOCK: + if (configInstance.getSugarCaneDoubleDropsEnabled()) { + Misc.mcDropItems(loc, is, caneDrops); + } + break; + + case VINE: + if (configInstance.getVinesDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case WATER_LILY: + if (configInstance.getWaterLiliesDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + case YELLOW_FLOWER: + if (configInstance.getYellowFlowersDoubleDropsEnabled()) { + Misc.mcDropItem(loc, is); + } + break; + + default: + break; } } } - + PP.addXP(SkillType.HERBALISM, xp); Skills.XpCheckSkill(SkillType.HERBALISM, player); } diff --git a/src/main/java/com/gmail/nossr50/skills/Mining.java b/src/main/java/com/gmail/nossr50/skills/Mining.java index 52c73a9ba..d4663d6a2 100644 --- a/src/main/java/com/gmail/nossr50/skills/Mining.java +++ b/src/main/java/com/gmail/nossr50/skills/Mining.java @@ -13,6 +13,7 @@ import org.bukkit.enchantments.Enchantment; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.spout.SpoutSounds; +import com.gmail.nossr50.util.BlockChecks; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; import com.gmail.nossr50.util.Users; @@ -34,44 +35,98 @@ public class Mining { Location loc = block.getLocation(); Material type = block.getType(); ItemStack item = new ItemStack(type); + Config configInstance = Config.getInstance(); switch (type) { case COAL_ORE: - item = new ItemStack(Material.COAL, 1, (short) 0, CoalType.COAL.getData()); - Misc.mcDropItem(loc, item); + if (configInstance.getCoalDoubleDropsEnabled()) { + item = new ItemStack(Material.COAL, 1, (short) 0, CoalType.COAL.getData()); + Misc.mcDropItem(loc, item); + } break; case DIAMOND_ORE: - item = new ItemStack(Material.DIAMOND); - Misc.mcDropItem(loc, item); + if (configInstance.getDiamondDoubleDropsEnabled()) { + item = new ItemStack(Material.DIAMOND); + Misc.mcDropItem(loc, item); + } + break; + + case ENDER_STONE: + if (configInstance.getEndStoneDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } break; case GLOWING_REDSTONE_ORE: case REDSTONE_ORE: - item = new ItemStack(Material.REDSTONE); - Misc.mcDropItems(loc, item, 4); - Misc.mcRandomDropItem(loc, item, 50); + if (configInstance.getRedstoneDoubleDropsEnabled()) { + item = new ItemStack(Material.REDSTONE); + Misc.mcDropItems(loc, item, 4); + Misc.mcRandomDropItem(loc, item, 50); + } break; case GLOWSTONE: - item = new ItemStack(Material.GLOWSTONE_DUST); - Misc.mcDropItems(loc, item, 2); - Misc.mcRandomDropItems(loc, item, 50, 2); + if (configInstance.getGlowstoneDoubleDropsEnabled()) { + item = new ItemStack(Material.GLOWSTONE_DUST); + Misc.mcDropItems(loc, item, 2); + Misc.mcRandomDropItems(loc, item, 50, 2); + } + break; + + case GOLD_ORE: + if (configInstance.getGoldDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } + break; + + case IRON_ORE: + if (configInstance.getIronDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } break; case LAPIS_ORE: - item = new ItemStack(Material.INK_SACK, 1, (short) 0, (byte) 0x4); - Misc.mcDropItems(loc, item, 4); - Misc.mcRandomDropItems(loc, item, 50, 4); + if (configInstance.getLapisDoubleDropsEnabled()) { + item = new ItemStack(Material.INK_SACK, 1, (short) 0, (byte) 0x4); + Misc.mcDropItems(loc, item, 4); + Misc.mcRandomDropItems(loc, item, 50, 4); + } + break; + + case MOSSY_COBBLESTONE: + if (configInstance.getMossyCobblestoneDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } + break; + + case NETHERRACK: + if (configInstance.getNetherrackDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } + break; + + case OBSIDIAN: + if (configInstance.getObsidianDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } + break; + + case SANDSTONE: + if (configInstance.getSandstoneDoubleDropsEnabled()) { + Misc.mcDropItem(loc, item); + } break; case STONE: - item = new ItemStack(Material.COBBLESTONE); - Misc.mcDropItem(loc, item); + if (configInstance.getStoneDoubleDropsEnabled()) { + item = new ItemStack(Material.COBBLESTONE); + Misc.mcDropItem(loc, item); + } break; default: - Misc.mcDropItem(loc, item); break; } } @@ -162,7 +217,7 @@ public class Mining { miningXP(player, block); - if (canBeSuperBroken(block.getType())) { + if (BlockChecks.canBeSuperBroken(block.getType())) { final int MAX_BONUS_LEVEL = 1000; int skillLevel = Users.getProfile(player).getSkillLevel(SkillType.MINING); @@ -173,35 +228,6 @@ public class Mining { } } - /** - * Check to see if a block is broken by Super Breaker. - * - * @param type The type of Block to check - * @return true if the block would be broken by Super Breaker, false otherwise - */ - public static Boolean canBeSuperBroken(Material type) { - switch (type) { - case COAL_ORE: - case DIAMOND_ORE: - case ENDER_STONE: - case GLOWING_REDSTONE_ORE: - case GLOWSTONE: - case GOLD_ORE: - case IRON_ORE: - case LAPIS_ORE: - case MOSSY_COBBLESTONE: - case NETHERRACK: - case OBSIDIAN: - case REDSTONE_ORE: - case SANDSTONE: - case STONE: - return true; - - default: - return false; - } - } - /** * Handle the Super Breaker ability. * diff --git a/src/main/java/com/gmail/nossr50/skills/WoodCutting.java b/src/main/java/com/gmail/nossr50/skills/WoodCutting.java index 207e2d18c..f02e3512c 100644 --- a/src/main/java/com/gmail/nossr50/skills/WoodCutting.java +++ b/src/main/java/com/gmail/nossr50/skills/WoodCutting.java @@ -3,6 +3,7 @@ package com.gmail.nossr50.skills; import java.util.ArrayList; import java.util.Random; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.TreeSpecies; import org.bukkit.block.Block; @@ -18,6 +19,7 @@ import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.events.fake.FakePlayerAnimationEvent; import com.gmail.nossr50.locale.LocaleLoader; import com.gmail.nossr50.spout.SpoutSounds; +import com.gmail.nossr50.util.BlockChecks; import com.gmail.nossr50.util.Combat; import com.gmail.nossr50.util.Misc; import com.gmail.nossr50.util.Permissions; @@ -140,8 +142,37 @@ public class WoodCutting { x.setData((byte) 0x0); x.setType(Material.AIR); + Config configInstance = Config.getInstance(); + /* Drop the block */ - Misc.mcDropItem(x.getLocation(), item); + switch (species) { + case GENERIC: + if (configInstance.getOakDoubleDropsEnabled()) { + Misc.mcDropItem(x.getLocation(), item); + } + break; + + case REDWOOD: + if (configInstance.getSpruceDoubleDropsEnabled()) { + Misc.mcDropItem(x.getLocation(), item); + } + break; + + case BIRCH: + if (configInstance.getBirchDoubleDropsEnabled()) { + Misc.mcDropItem(x.getLocation(), item); + } + break; + + case JUNGLE: + if (configInstance.getJungleDoubleDropsEnabled()) { + Misc.mcDropItem(x.getLocation(), item); + } + break; + + default: + break; + } } else if (x.getType() == Material.LEAVES) { final int SAPLING_DROP_CHANCE = 10; @@ -156,25 +187,9 @@ public class WoodCutting { } } - PP.addXP(SkillType.WOODCUTTING, xp); //Tree Feller gives nerf'd XP - Skills.XpCheckSkill(SkillType.WOODCUTTING, player); - } - - /** - * Checks if the block is affected by Tree Feller. - * - * @param block Block to check - * @return true if the block is affected by Tree Feller, false otherwise - */ - private static boolean treeFellerCompatible(Block block) { - switch (block.getType()) { - case LOG: - case LEAVES: - case AIR: - return true; - - default: - return false; + if (Permissions.getInstance().woodcutting(player)) { + PP.addXP(SkillType.WOODCUTTING, xp); //Tree Feller gives nerf'd XP + Skills.XpCheckSkill(SkillType.WOODCUTTING, player); } } @@ -202,24 +217,24 @@ public class WoodCutting { Block yPositive = currentBlock.getRelative(0, 1, 0); if (!currentBlock.hasMetadata("mcmmoPlacedBlock")) { - if (!isTooAggressive(currentBlock, xPositive) && treeFellerCompatible(xPositive) && !toBeFelled.contains(xPositive)) { + if (!isTooAggressive(currentBlock, xPositive) && BlockChecks.treeFellerCompatible(xPositive.getType()) && !toBeFelled.contains(xPositive)) { processTreeFelling(xPositive, toBeFelled); } - if (!isTooAggressive(currentBlock, xNegative) && treeFellerCompatible(xNegative) && !toBeFelled.contains(xNegative)) { + if (!isTooAggressive(currentBlock, xNegative) && BlockChecks.treeFellerCompatible(xNegative.getType()) && !toBeFelled.contains(xNegative)) { processTreeFelling(xNegative, toBeFelled); } - if (!isTooAggressive(currentBlock, zPositive) && treeFellerCompatible(zPositive) && !toBeFelled.contains(zPositive)) { + if (!isTooAggressive(currentBlock, zPositive) && BlockChecks.treeFellerCompatible(zPositive.getType()) && !toBeFelled.contains(zPositive)) { processTreeFelling(zPositive, toBeFelled); } - if (!isTooAggressive(currentBlock, zNegative) && treeFellerCompatible(zNegative) && !toBeFelled.contains(zNegative)) { + if (!isTooAggressive(currentBlock, zNegative) && BlockChecks.treeFellerCompatible(zNegative.getType()) && !toBeFelled.contains(zNegative)) { processTreeFelling(zNegative, toBeFelled); } } - if (treeFellerCompatible(yPositive)) { + if (BlockChecks.treeFellerCompatible(yPositive.getType())) { if(!currentBlock.hasMetadata("mcmmoPlacedBlock") && !toBeFelled.contains(yPositive)) { processTreeFelling(yPositive, toBeFelled); } @@ -258,9 +273,43 @@ public class WoodCutting { byte type = block.getData(); Material mat = Material.getMaterial(block.getTypeId()); + Tree tree = (Tree) block.getState().getData(); + TreeSpecies species = tree.getSpecies(); + if ((skillLevel > MAX_SKILL_LEVEL || random.nextInt(1000) <= skillLevel) && Permissions.getInstance().woodcuttingDoubleDrops(player)) { + Config configInstance = Config.getInstance(); ItemStack item = new ItemStack(mat, 1, (short) 0, type); - Misc.mcDropItem(block.getLocation(), item); + Location location = block.getLocation(); + + /* Drop the block */ + switch (species) { + case GENERIC: + if (configInstance.getOakDoubleDropsEnabled()) { + Misc.mcDropItem(location, item); + } + break; + + case REDWOOD: + if (configInstance.getSpruceDoubleDropsEnabled()) { + Misc.mcDropItem(location, item); + } + break; + + case BIRCH: + if (configInstance.getBirchDoubleDropsEnabled()) { + Misc.mcDropItem(location, item); + } + break; + + case JUNGLE: + if (configInstance.getJungleDoubleDropsEnabled()) { + Misc.mcDropItem(location, item); + } + break; + + default: + break; + } } } diff --git a/src/main/java/com/gmail/nossr50/util/BlockChecks.java b/src/main/java/com/gmail/nossr50/util/BlockChecks.java index 820538376..4133591f2 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockChecks.java +++ b/src/main/java/com/gmail/nossr50/util/BlockChecks.java @@ -27,7 +27,6 @@ public class BlockChecks { case GRASS: case GRAVEL: case IRON_ORE: - case JACK_O_LANTERN: case LAPIS_ORE: case LOG: case MELON_BLOCK: @@ -116,4 +115,118 @@ public class BlockChecks { return false; } } + + /** + * Check if a block can be made mossy. + * + * @param material The type of Block to check + * @return true if the block can be made mossy, false otherwise + */ + public static boolean makeMossy(Material type) { + switch (type) { + case COBBLESTONE: + case DIRT: + case SMOOTH_BRICK: + return true; + + default: + return false; + } + } + + /** + * Check if a block is affected by Herbalism abilities. + * + * @param type The type of Block to check + * @return true if the block is affected, false otherwise + */ + public static boolean canBeGreenTerra(Material type){ + switch (type) { + case BROWN_MUSHROOM: + case CACTUS: + case CROPS: + case MELON_BLOCK: + case NETHER_WARTS: + case PUMPKIN: + case RED_MUSHROOM: + case RED_ROSE: + case SUGAR_CANE_BLOCK: + case VINE: + case WATER_LILY: + case YELLOW_FLOWER: + return true; + + default: + return false; + } + } + + /** + * Check to see if a block is broken by Super Breaker. + * + * @param type The type of Block to check + * @return true if the block would be broken by Super Breaker, false otherwise + */ + public static Boolean canBeSuperBroken(Material type) { + switch (type) { + case COAL_ORE: + case DIAMOND_ORE: + case ENDER_STONE: + case GLOWING_REDSTONE_ORE: + case GLOWSTONE: + case GOLD_ORE: + case IRON_ORE: + case LAPIS_ORE: + case MOSSY_COBBLESTONE: + case NETHERRACK: + case OBSIDIAN: + case REDSTONE_ORE: + case SANDSTONE: + case STONE: + return true; + + default: + return false; + } + } + + /** + * Check to see if a block can be broken by Giga Drill Breaker. + * + * @param material The type of block to check + * @return + */ + public static boolean canBeGigaDrillBroken(Material type) { + switch (type) { + case CLAY: + case DIRT: + case GRASS: + case GRAVEL: + case MYCEL: + case SAND: + case SOUL_SAND: + return true; + + default: + return false; + } + } + + /** + * Checks if the block is affected by Tree Feller. + * + * @param block Block to check + * @return true if the block is affected by Tree Feller, false otherwise + */ + public static boolean treeFellerCompatible(Material type) { + switch (type) { + case LOG: + case LEAVES: + case AIR: + return true; + + default: + return false; + } + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ace831714..b6d9d36e6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,6 +1,6 @@ # # mcMMO configuration -# First generated on ${project.version}-b${BUILD_NUMBER} +# First generated on ${project.version}-b${BUILD_NUMBER} # ##### @@ -173,6 +173,43 @@ Skills: Level_Cap: 0 Requires_Axe: true +# +# Settings for Double Drops +### +Double_Drops: + Herbalism: + Brown_Mushrooms: true + Cacti: true + Melons: true + Nether_Warts: true + Pumpkins: true + Red_Mushrooms: true + Red_Roses: true + Sugar_Cane: true + Vines: true + Water_Lilies: true + Wheat: true + Yellow_Flowers: true + Mining: + Coal: true + Diamond: true + End_Stone: true + Glowstone: true + Gold: true + Iron: true + Lapis: true + Moss_Stone: true + Netherrack: true + Obsidian: true + Redstone: true + Sandstone: true + Stone: true + Woodcutting: + Oak: true + Birch: true + Spruce: true + Jungle: true + # # Settings for XP distribution ###