From 7859660ece8820b376532bb8d18b4ce27bfc5f30 Mon Sep 17 00:00:00 2001 From: Glitchfinder Date: Fri, 9 Nov 2012 16:37:12 -0800 Subject: [PATCH] Adding herbalism green thumb ability to carrots, potatoes, and netherwart. --- .../nossr50/runnables/GreenThumbTimer.java | 73 +++++++++++++++---- .../nossr50/skills/gathering/Herbalism.java | 73 +++++++++++++++++-- .../com/gmail/nossr50/util/Permissions.java | 16 ++++ 3 files changed, 140 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java b/src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java index 4debdaf5d..9181ee516 100644 --- a/src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java +++ b/src/main/java/com/gmail/nossr50/runnables/GreenThumbTimer.java @@ -11,33 +11,74 @@ import com.gmail.nossr50.datatypes.SkillType; public class GreenThumbTimer implements Runnable { private Block block; private PlayerProfile profile; + private Material type; - public GreenThumbTimer(Block block, PlayerProfile profile) { + public GreenThumbTimer(Block block, PlayerProfile profile, Material material) { this.block = block; this.profile = profile; + this.type = material; } @Override public void run() { - block.setType(Material.CROPS); + if(this.block.getType() != this.type) + this.block.setType(this.type); - //This replants the wheat at a certain stage in development based on Herbalism Skill - if (!profile.getAbilityMode(AbilityType.GREEN_TERRA)) { - if (profile.getSkillLevel(SkillType.HERBALISM) >= 600) { - block.setData(CropState.MEDIUM.getData()); - } - else if (profile.getSkillLevel(SkillType.HERBALISM) >= 400) { - block.setData(CropState.SMALL.getData()); - } - else if (profile.getSkillLevel(SkillType.HERBALISM) >= 200) { - block.setData(CropState.VERY_SMALL.getData()); + switch(this.type) { + case CROPS: + case CARROT: + case POTATO: + //This replants the wheat at a certain stage in development based on Herbalism Skill + if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) { + if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) { + this.block.setData(CropState.MEDIUM.getData()); + } + else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) { + this.block.setData(CropState.SMALL.getData()); + } + else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 200) { + this.block.setData(CropState.VERY_SMALL.getData()); + } + else { + this.block.setData(CropState.GERMINATED.getData()); + } } else { - block.setData(CropState.GERMINATED.getData()); + this.block.setData(CropState.MEDIUM.getData()); } - } - else { - block.setData(CropState.MEDIUM.getData()); + break; + case NETHER_WARTS: + if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) { + if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) { + this.block.setData((byte) 2); + } + else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) { + this.block.setData((byte) 1); + } + else { + this.block.setData((byte) 0); + } + } + else { + this.block.setData((byte) 2); + } + break; + case COCOA: + if (!this.profile.getAbilityMode(AbilityType.GREEN_TERRA)) { + if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 600) { + this.block.setData((byte) ((this.block.getData() ^ ((byte) 0xc)) | ((byte) 4))); + } + else if (this.profile.getSkillLevel(SkillType.HERBALISM) >= 400) { + this.block.setData((byte) ((this.block.getData() ^ ((byte) 0xc)) | ((byte) 4))); + } + else { + this.block.setData((byte) (this.block.getData() ^ ((byte) 0xc))); + } + } + else { + this.block.setData((byte) ((this.block.getData() ^ ((byte) 0xc)) | ((byte) 4))); + } + break; } } } diff --git a/src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java b/src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java index 956759a77..73a5f61c8 100644 --- a/src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java +++ b/src/main/java/com/gmail/nossr50/skills/gathering/Herbalism.java @@ -152,6 +152,10 @@ public class Herbalism { if (data == (byte) 0x3) { mat = Material.NETHER_STALK; xp = Config.getInstance().getHerbalismXPNetherWart(); + + if (Permissions.getInstance().greenThumbNetherwart(player)) { + greenThumbWheat(block, player, event, plugin); + } } break; @@ -204,6 +208,11 @@ public class Herbalism { if ((((byte) data) & 0x8) == 0x8) { mat = Material.COCOA; xp = Config.getInstance().getHerbalismXPCocoa(); + + + if (Permissions.getInstance().greenThumbCocoa(player)) { + greenThumbWheat(block, player, event, plugin); + } } break; @@ -211,6 +220,11 @@ public class Herbalism { if (data == CropState.RIPE.getData()) { mat = Material.CARROT; xp = Config.getInstance().getHerbalismXPCarrot(); + + + if (Permissions.getInstance().greenThumbCarrots(player)) { + greenThumbWheat(block, player, event, plugin); + } } break; @@ -218,6 +232,10 @@ public class Herbalism { if (data == CropState.RIPE.getData()) { mat = Material.POTATO; xp = Config.getInstance().getHerbalismXPPotato(); + + if (Permissions.getInstance().greenThumbPotatoes(player)) { + greenThumbWheat(block, player, event, plugin); + } } break; @@ -386,8 +404,28 @@ public class Herbalism { PlayerProfile profile = Users.getProfile(player); int herbLevel = profile.getSkillLevel(SkillType.HERBALISM); PlayerInventory inventory = player.getInventory(); - boolean hasSeeds = inventory.contains(Material.SEEDS); + boolean hasSeeds = false; Location location = block.getLocation(); + Material type = block.getType(); + + switch(type) { + case CROPS: + hasSeeds = inventory.contains(Material.SEEDS); + break; + case COCOA: + // Broken: Requires an update to bukkit to enable seaching for variable-sized ItemStacks. + hasSeeds = inventory.contains(new ItemStack(Material.INK_SACK, 1, (short) 3), 1); + break; + case CARROT: + hasSeeds = inventory.contains(Material.CARROT_ITEM); + break; + case POTATO: + hasSeeds = inventory.contains(Material.POTATO_ITEM); + break; + case NETHER_WARTS: + hasSeeds = inventory.contains(Material.NETHER_STALK); + break; + } int randomChance = 1500; @@ -398,12 +436,35 @@ public class Herbalism { if (hasSeeds && profile.getAbilityMode(AbilityType.GREEN_TERRA) || hasSeeds && (herbLevel > MAX_BONUS_LEVEL || random.nextInt(randomChance) <= herbLevel)) { event.setCancelled(true); - Misc.dropItem(location, new ItemStack(Material.WHEAT)); - Misc.randomDropItems(location, new ItemStack(Material.SEEDS), 50, 3); + switch(type) { + case CROPS: + Misc.dropItem(location, new ItemStack(Material.WHEAT)); + Misc.randomDropItems(location, new ItemStack(Material.SEEDS), 50, 3); + inventory.removeItem(new ItemStack(Material.SEEDS)); + break; + case COCOA: + Misc.dropItem(location, new ItemStack(Material.INK_SACK, 3, (short) 3)); + inventory.removeItem(new ItemStack(Material.INK_SACK, 1, (short) 3)); + break; + case CARROT: + Misc.dropItem(location, new ItemStack(Material.CARROT_ITEM)); + Misc.randomDropItems(location, new ItemStack(Material.CARROT_ITEM), 50, 3); + inventory.removeItem(new ItemStack(Material.POTATO_ITEM)); + break; + case POTATO: + Misc.dropItem(location, new ItemStack(Material.POTATO_ITEM)); + Misc.randomDropItems(location, new ItemStack(Material.POTATO_ITEM), 50, 3); + Misc.randomDropItem(location, new ItemStack(Material.POISONOUS_POTATO), 2); + inventory.removeItem(new ItemStack(Material.POTATO_ITEM)); + break; + case NETHER_WARTS: + Misc.dropItem(location, new ItemStack(Material.NETHER_STALK, 2)); + Misc.randomDropItems(location, new ItemStack(Material.NETHER_STALK), 50, 2); + inventory.removeItem(new ItemStack(Material.NETHER_STALK)); + break; + } - plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new GreenThumbTimer(block, profile), 1); - - inventory.removeItem(new ItemStack(Material.SEEDS)); + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new GreenThumbTimer(block, profile, type), 1); player.updateInventory(); // Needed until replacement available } } diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index 2d5f079bb..d72f4bbb8 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -264,6 +264,22 @@ public class Permissions { return player.hasPermission("mcmmo.ability.herbalism.greenthumbblocks"); } + public boolean greenThumbCarrots(Player player) { + return player.hasPermission("mcmmo.ability.herbalism.greenthumbcarrots"); + } + + public boolean greenThumbCocoa(Player player) { + return player.hasPermission("mcmmo.ability.herbalism.greenthumbcocoa"); + } + + public boolean greenThumbNetherwart(Player player) { + return player.hasPermission("mcmmo.ability.herbalism.greenthumbnetherwart"); + } + + public boolean greenThumbPotatoes(Player player) { + return player.hasPermission("mcmmo.ability.herbalism.greenthumbpotatoes"); + } + public boolean greenThumbWheat(Player player) { return player.hasPermission("mcmmo.ability.herbalism.greenthumbwheat"); }