From 1ee82df723c811ea950c91c8779cc9a429ea688f Mon Sep 17 00:00:00 2001 From: TfT_02 Date: Sat, 18 May 2013 23:13:42 +0200 Subject: [PATCH] Add a new child skill: Ranching --- .../commands/skills/RanchingCommand.java | 146 ++++++++++++++++++ .../gmail/nossr50/config/AdvancedConfig.java | 32 ++++ .../nossr50/datatypes/player/McMMOPlayer.java | 5 + .../nossr50/datatypes/skills/SkillType.java | 5 +- .../nossr50/listeners/EntityListener.java | 27 +++- .../nossr50/listeners/PlayerListener.java | 69 +++++++++ src/main/java/com/gmail/nossr50/mcMMO.java | 1 + .../nossr50/skills/ranching/Ranching.java | 60 +++++++ .../skills/ranching/RanchingManager.java | 126 +++++++++++++++ .../com/gmail/nossr50/util/Permissions.java | 7 + .../commands/CommandRegistrationManager.java | 5 + .../gmail/nossr50/util/skills/SkillUtils.java | 1 + src/main/resources/child.yml | 5 +- .../resources/locale/locale_en_US.properties | 24 +++ src/main/resources/plugin.yml | 54 ++++++- 15 files changed, 563 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gmail/nossr50/commands/skills/RanchingCommand.java create mode 100644 src/main/java/com/gmail/nossr50/skills/ranching/Ranching.java create mode 100644 src/main/java/com/gmail/nossr50/skills/ranching/RanchingManager.java diff --git a/src/main/java/com/gmail/nossr50/commands/skills/RanchingCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/RanchingCommand.java new file mode 100644 index 000000000..b999ef27f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/commands/skills/RanchingCommand.java @@ -0,0 +1,146 @@ +package com.gmail.nossr50.commands.skills; + +import com.gmail.nossr50.datatypes.skills.SkillType; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.skills.ranching.Ranching; +import com.gmail.nossr50.util.Permissions; + +public class RanchingCommand extends SkillCommand { + private String multipleBirthChance; + private String multipleBirthChanceLucky; + private int masterHerderTime; + private String shearsMasteryChance; + private String shearsMasteryChanceLucky; + private String artisanButcherChance; + private String artisanButcherChanceLucky; + private int carnivoresDietRank; + + private boolean canMultipleBirth; + private boolean canMasterHerder; + private boolean canShearsMastery; + private boolean canArtisanButcher; + private boolean canCarnivoresDiet; + + public RanchingCommand() { + super(SkillType.RANCHING); + } + + @Override + protected void dataCalculations() { + // MULTIPLE BIRTH + if (canMultipleBirth) { + String[] multipleBirthStrings = calculateAbilityDisplayValues(Ranching.multipleBirthIncreaseLevel, Ranching.multipleBirthMaxChance); + multipleBirthChance = multipleBirthStrings[0]; + multipleBirthChanceLucky = multipleBirthStrings[1]; + } + + // MASTER HERDER + if (canMasterHerder) { + int masterHerderTime = (int) (300 - (skillValue / Ranching.masterHerderIncreaseLevel) * 10); + + if (masterHerderTime < Ranching.masterHerderMinimumSeconds) { + masterHerderTime = Ranching.masterHerderMinimumSeconds; + } + } + + // SHEARS MASTERY + if (canShearsMastery) { + String[] shearsMasteryStrings = calculateAbilityDisplayValues(Ranching.shearsMasteryMaxLevel, Ranching.shearsMasteryMaxChance); + shearsMasteryChance = shearsMasteryStrings[0]; + shearsMasteryChanceLucky = shearsMasteryStrings[1]; + } + + // ARTISAN BUTCHER + if (canArtisanButcher) { + String[] artisanButcherStrings = calculateAbilityDisplayValues(Ranching.artisanButcherMaxLevel, Ranching.artisanButcherMaxChance); + artisanButcherChance = artisanButcherStrings[0]; + artisanButcherChanceLucky = artisanButcherStrings[1]; + } + + // CARNIVORES DIET + if (canCarnivoresDiet) { + carnivoresDietRank = calculateRank(Ranching.carnivoresDietMaxLevel, Ranching.carnivoresDietRankLevel1); + } + } + + @Override + protected void permissionsCheck() { + canMultipleBirth = Permissions.multipleBirth(player); + canMasterHerder = Permissions.masterHerder(player); + canShearsMastery = Permissions.shearsMastery(player); + canArtisanButcher = Permissions.artisanButcher(player); + canCarnivoresDiet = Permissions.carnivoresDiet(player); + } + + @Override + protected boolean effectsHeaderPermissions() { + return canMultipleBirth || canMasterHerder || canShearsMastery || canArtisanButcher || canCarnivoresDiet; + } + + @Override + protected void effectsDisplay() { + luckyEffectsDisplay(); + + if (canMultipleBirth) { + player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Ranching.Effect.0"), LocaleLoader.getString("Ranching.Effect.1"))); + } + + if (canMasterHerder) { + player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Ranching.Effect.2"), LocaleLoader.getString("Ranching.Effect.3"))); + } + + if (canShearsMastery) { + player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Ranching.Effect.4"), LocaleLoader.getString("Ranching.Effect.5"))); + } + + if (canArtisanButcher) { + player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Ranching.Effect.6"), LocaleLoader.getString("Ranching.Effect.7"))); + } + + if (canCarnivoresDiet) { + player.sendMessage(LocaleLoader.getString("Effects.Template", LocaleLoader.getString("Ranching.Effect.8"), LocaleLoader.getString("Ranching.Effect.9"))); + } + } + + @Override + protected boolean statsHeaderPermissions() { + return canMultipleBirth || canMasterHerder || canShearsMastery || canArtisanButcher || canCarnivoresDiet; + } + + @Override + protected void statsDisplay() { + if (canMultipleBirth) { + int unlockLevel = Ranching.multipleBirthIncreaseLevel; + + if (skillValue < unlockLevel) { + player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Ranching.Ability.Locked.0", unlockLevel))); + } + else { + player.sendMessage(LocaleLoader.getString("Ranching.Ability.MultipleBirth", multipleBirthChance) + (isLucky ? LocaleLoader.getString("Perks.lucky.bonus", multipleBirthChanceLucky) : "")); + } + } + + if (canMasterHerder) { + int unlockLevel = Ranching.masterHerderIncreaseLevel; + + if (skillValue < unlockLevel) { + player.sendMessage(LocaleLoader.getString("Ability.Generic.Template.Lock", LocaleLoader.getString("Ranching.Ability.Locked.1", unlockLevel))); + } + else { + player.sendMessage(LocaleLoader.getString("Ranching.Ability.MasterHerder", masterHerderTime)); + } + } + + if (canShearsMastery) { + player.sendMessage(LocaleLoader.getString("Ranching.Ability.ShearsMastery", shearsMasteryChance) + (isLucky ? LocaleLoader.getString("Perks.lucky.bonus", shearsMasteryChanceLucky) : "")); + } + + if (canArtisanButcher) { + player.sendMessage(LocaleLoader.getString("Ranching.Ability.ArtisanButcher", artisanButcherChance) + (isLucky ? LocaleLoader.getString("Perks.lucky.bonus", artisanButcherChanceLucky) : "")); + } + + if (canCarnivoresDiet) { + player.sendMessage(LocaleLoader.getString("Ranching.Ability.CarnivoresDiet", carnivoresDietRank)); + } + } +} diff --git a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java index 6fcce8c8f..c4ad2906f 100644 --- a/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java +++ b/src/main/java/com/gmail/nossr50/config/AdvancedConfig.java @@ -180,6 +180,38 @@ public class AdvancedConfig extends AutoUpdateConfigLoader { public double getBlastRadiusModifierRank7() { return config.getDouble("Skills.Mining.BlastRadiusModifier_Rank7", 4.0); } public double getBlastRadiusModifierRank8() { return config.getDouble("Skills.Mining.BlastRadiusModifier_Rank8", 4.0); } + /* RANCHING */ + public int getMultipleBirthIncreasekLevel() { return config.getInt("Skills.Ranching.MultipleBirth_IncreaseLevel", 50); } + public int getMultipleBirthMaxChance() { return config.getInt("Skills.Ranching.MultipleBirth_ChanceMax", 30); } + public int getMultipleBirthLitterModifier() { return config.getInt("Skills.Ranching.MultipleBirth_LitterModifier", 30); } + + public int getMasterHerderIncreaseLevel() { return config.getInt("Skills.Ranching.MultipleBirth_IncreaseLevel", 50); } + public int getMasterHerderMaxLevel() { return config.getInt("Skills.Ranching.MultipleBirth_MaxBonusLevel", 500); } + public int getMasterHerderMinimumSeconds() { return config.getInt("Skills.Ranching.MultipleBirth_MinimumSeconds", 120); } + + public int getShearsMasteryMaxLevel() { return config.getInt("Skills.Ranching.ShearsMastery_MaxBonusLevel", 500); } + public int getShearsMasteryMaxChance() { return config.getInt("Skills.Ranching.ShearsMastery_ChanceMax", 20); } + public int getShearsMasteryMaxBonus() { return config.getInt("Skills.Ranching.ShearsMastery_MaxBonus", 3); } + + public int getArtisanButcherMaxLevel() { return config.getInt("Skills.Ranching.ArtisanButcher_MaxBonusLevel", 500); } + public int getArtisanButcherMaxChance() { return config.getInt("Skills.Ranching.ArtisanButcher_ChanceMax", 20); } + public int getArtisanButcherMaxBonus() { return config.getInt("Skills.Ranching.ArtisanButcher_MaxBonus", 3); } + + public int getCarnivoresDietRankChange() { return config.getInt("Skills.Ranching.Carnivores_Diet_RankChange", 200); } + + public int getRanchingVanillaXPBoostRank1Level() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank1Level", 100); } + public int getRanchingVanillaXPBoostRank2Level() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank2Level", 300); } + public int getRanchingVanillaXPBoostRank3Level() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank3Level", 500); } + public int getRanchingVanillaXPBoostRank4Level() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank4Level", 700); } + public int getRanchingVanillaXPBoostRank5Level() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank5Level", 900); } + public int getRanchingVanillaXPBoostRank1Multiplier() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank1Multiplier", 2); } + public int getRanchingVanillaXPBoostRank2Multiplier() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank2Multiplier", 3); } + public int getRanchingVanillaXPBoostRank3Multiplier() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank3Multiplier", 4); } + public int getRanchingVanillaXPBoostRank4Multiplier() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank4Multiplier", 5); } + public int getRanchingVanillaXPBoostRank5Multiplier() { return config.getInt("Skills.Ranching.VanillaXPBoost_Rank5Multiplier", 6); } + + + /* REPAIR */ public double getRepairMasteryMaxBonus() { return config.getDouble("Skills.Repair.RepairMastery_MaxBonusPercentage", 200.0D); } public int getRepairMasteryMaxLevel() { return config.getInt("Skills.Repair.RepairMastery_MaxBonusLevel", 1000); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java index d3b5b9920..864344f0d 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java +++ b/src/main/java/com/gmail/nossr50/datatypes/player/McMMOPlayer.java @@ -29,6 +29,7 @@ import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager; import com.gmail.nossr50.skills.mining.MiningManager; +import com.gmail.nossr50.skills.ranching.RanchingManager; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.smelting.SmeltingManager; @@ -149,6 +150,10 @@ public class McMMOPlayer { return (MiningManager) skillManagers.get(SkillType.MINING); } + public RanchingManager getRanchingManager() { + return (RanchingManager) skillManagers.get(SkillType.RANCHING); + } + public RepairManager getRepairManager() { return (RepairManager) skillManagers.get(SkillType.REPAIR); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java b/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java index 3b3a64615..0bcaeef44 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java +++ b/src/main/java/com/gmail/nossr50/datatypes/skills/SkillType.java @@ -17,6 +17,7 @@ import com.gmail.nossr50.skills.excavation.ExcavationManager; import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager; import com.gmail.nossr50.skills.mining.MiningManager; +import com.gmail.nossr50.skills.ranching.RanchingManager; import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.smelting.SmeltingManager; import com.gmail.nossr50.skills.swords.SwordsManager; @@ -40,7 +41,8 @@ public enum SkillType { SWORDS(SwordsManager.class, Color.fromRGB(178, 34, 34), AbilityType.SERRATED_STRIKES, ToolType.SWORD), TAMING(TamingManager.class, Color.PURPLE), UNARMED(UnarmedManager.class, Color.BLACK, AbilityType.BERSERK, ToolType.FISTS), - WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, AbilityType.TREE_FELLER, ToolType.AXE); + WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, AbilityType.TREE_FELLER, ToolType.AXE), + RANCHING(RanchingManager.class, Color.ORANGE); private Class managerClass; private Color runescapeColor; @@ -134,6 +136,7 @@ public enum SkillType { public boolean isChildSkill() { switch (this) { case SMELTING: + case RANCHING: return true; default: diff --git a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java index 73790d148..236e3efc6 100644 --- a/src/main/java/com/gmail/nossr50/listeners/EntityListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/EntityListener.java @@ -44,6 +44,8 @@ import com.gmail.nossr50.skills.archery.Archery; import com.gmail.nossr50.skills.fishing.Fishing; import com.gmail.nossr50.skills.herbalism.Herbalism; import com.gmail.nossr50.skills.mining.MiningManager; +import com.gmail.nossr50.skills.ranching.Ranching; +import com.gmail.nossr50.skills.ranching.RanchingManager; import com.gmail.nossr50.skills.taming.Taming; import com.gmail.nossr50.skills.taming.TamingManager; import com.gmail.nossr50.util.Misc; @@ -355,13 +357,20 @@ public class EntityListener implements Listener { @EventHandler(priority = EventPriority.MONITOR) public void onEntityDeath(EntityDeathEvent event) { LivingEntity entity = event.getEntity(); + Player player = event.getEntity().getKiller(); - if (Misc.isNPCEntity(entity)) { + if (Misc.isNPCEntity(entity) || Misc.isNPCEntity(player)) { return; } BleedTimerTask.remove(entity); Archery.arrowRetrievalCheck(entity); + + if (Permissions.carnivoresDiet(player)) { + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + RanchingManager ranchingManager = mcMMOPlayer.getRanchingManager(); + ranchingManager.handleArtisanButcher(entity); + } } /** @@ -510,6 +519,22 @@ public class EntityListener implements Listener { } return; + case COOKED_CHICKEN: /* RESTORES 3 HUNGER - RESTORES 5 1/2 HUNGER @ 1000 */ + case GRILLED_PORK: /* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @ 1000 */ + case COOKED_BEEF: /* RESTORES 4 HUNGER - RESTORES 6 1/2 HUNGER @ 1000 */ + if (Permissions.carnivoresDiet(player)) { + event.setFoodLevel(UserManager.getPlayer(player).getRanchingManager().handleCarnivoresDiet(Ranching.carnivoresDietRankLevel1, newFoodLevel)); + } + return; + + case RAW_CHICKEN: /* RESTORES 1 HUNGER - RESTORES 2 1/2 HUNGER @ 1000 */ + case PORK: /* RESTORES 2 1/2 HUNGER - RESTORES 4 HUNGER @ 1000 */ + case RAW_BEEF: /* RESTORES 2 1/2 HUNGER - RESTORES 4 HUNGER @ 1000 */ + if (Permissions.carnivoresDiet(player)) { + event.setFoodLevel(UserManager.getPlayer(player).getRanchingManager().handleCarnivoresDiet(Ranching.carnivoresDietRankLevel2, newFoodLevel)); + } + return; + default: return; } diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f3229fb0c..0dea5d057 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -5,7 +5,9 @@ import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.block.Block; import org.bukkit.block.BlockState; +import org.bukkit.entity.Ageable; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.entity.Fish; import org.bukkit.entity.Item; import org.bukkit.entity.LivingEntity; @@ -19,12 +21,15 @@ import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.event.player.PlayerShearEntityEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.chat.ChatManager; @@ -43,6 +48,8 @@ import com.gmail.nossr50.runnables.skills.BleedTimerTask; import com.gmail.nossr50.skills.fishing.FishingManager; import com.gmail.nossr50.skills.herbalism.HerbalismManager; import com.gmail.nossr50.skills.mining.MiningManager; +import com.gmail.nossr50.skills.ranching.Ranching; +import com.gmail.nossr50.skills.ranching.RanchingManager; import com.gmail.nossr50.skills.repair.Repair; import com.gmail.nossr50.skills.repair.RepairManager; import com.gmail.nossr50.skills.taming.TamingManager; @@ -519,6 +526,68 @@ public class PlayerListener implements Listener { } } + /** + * Monitor PlayerInteractEntityEvent events. + * + * @param event The event to watch + */ + @EventHandler(priority = EventPriority.MONITOR) + public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { + Player player = event.getPlayer(); + Entity entity = event.getRightClicked(); + + if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) { + return; + } + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + ItemStack inHand = player.getItemInHand(); + + /* RANCHING */ + if (entity instanceof Ageable) { + Ageable ageable = (Ageable) entity; + RanchingManager ranchingManager = mcMMOPlayer.getRanchingManager(); + + if (Permissions.skillEnabled(player, SkillType.RANCHING) && ageable.canBreed() && ranchingManager.isBreedFood(entity, inHand)) { + entity.setMetadata(mcMMO.animalBreedKey, new FixedMetadataValue(plugin, player.getName())); + } + } + } + + /** + * Monitor PlayerShearEntityEvent events. + * + * @param event The event to watch + */ + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerShearEntity(PlayerShearEntityEvent event) { + Player player = event.getPlayer(); + Entity entity = event.getEntity(); + + if (Misc.isNPCEntity(player) || player.getGameMode() == GameMode.CREATIVE) { + return; + } + + McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player); + + /* RANCHING */ + RanchingManager ranchingManager = mcMMOPlayer.getRanchingManager(); + + /* Shears Mastery */ + if (Permissions.shearsMastery(player)) { + if (entity.getType() == EntityType.SHEEP) { + ranchingManager.handleShearsMasterySheep(entity); + } + else if (entity.getType() == EntityType.MUSHROOM_COW) { + ranchingManager.handleShearsMasteryMooshroom(entity); + } + } + + if (Permissions.skillEnabled(player, SkillType.RANCHING)) { + ranchingManager.applyXpGain(Ranching.shearExperience); + } + } + /** * Monitor PlayerChat events. * diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index c197d1faa..183383e55 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -92,6 +92,7 @@ public class mcMMO extends JavaPlugin { public final static String infiniteArrowKey = "mcMMO: Infinite Arrow"; public final static String bowForceKey = "mcMMO: Bow Force"; public final static String arrowDistanceKey = "mcMMO: Arrow Distance"; + public final static String animalBreedKey = "mcMMO: Tracked Animal"; public static FixedMetadataValue metadataValue; diff --git a/src/main/java/com/gmail/nossr50/skills/ranching/Ranching.java b/src/main/java/com/gmail/nossr50/skills/ranching/Ranching.java new file mode 100644 index 000000000..8fa130370 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/ranching/Ranching.java @@ -0,0 +1,60 @@ +package com.gmail.nossr50.skills.ranching; + +import com.gmail.nossr50.config.AdvancedConfig; + +public class Ranching { + // The order of the values is extremely important, a few methods depend on it to work properly + protected enum Tier { + FIVE(5) { + @Override public int getLevel() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank5Level(); } + @Override public int getVanillaXPBoostModifier() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank5Multiplier(); }}, + FOUR(4) { + @Override public int getLevel() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank4Level(); } + @Override public int getVanillaXPBoostModifier() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank4Multiplier(); }}, + THREE(3) { + @Override public int getLevel() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank3Level(); } + @Override public int getVanillaXPBoostModifier() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank3Multiplier(); }}, + TWO(2) { + @Override public int getLevel() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank2Level(); } + @Override public int getVanillaXPBoostModifier() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank2Multiplier(); }}, + ONE(1) { + @Override public int getLevel() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank1Level(); } + @Override public int getVanillaXPBoostModifier() { return AdvancedConfig.getInstance().getRanchingVanillaXPBoostRank1Multiplier(); }}; + + int numerical; + + private Tier(int numerical) { + this.numerical = numerical; + } + + public int toNumerical() { + return numerical; + } + + abstract protected int getLevel(); + abstract protected int getVanillaXPBoostModifier(); + } + + public static int multipleBirthIncreaseLevel = AdvancedConfig.getInstance().getMultipleBirthIncreasekLevel(); + public static int multipleBirthMaxChance = AdvancedConfig.getInstance().getMultipleBirthMaxChance(); + public static int multipleBirthLitterModifier = AdvancedConfig.getInstance().getMultipleBirthLitterModifier(); + + public static int masterHerderIncreaseLevel = AdvancedConfig.getInstance().getMultipleBirthIncreasekLevel(); + public static int masterHerderMaxLevel = AdvancedConfig.getInstance().getMasterHerderMaxLevel(); + public static int masterHerderMinimumSeconds = AdvancedConfig.getInstance().getMasterHerderMinimumSeconds(); + + public static int shearsMasteryMaxLevel = AdvancedConfig.getInstance().getShearsMasteryMaxLevel(); + public static int shearsMasteryMaxChance = AdvancedConfig.getInstance().getShearsMasteryMaxChance(); + public static int shearsMasteryMaxBonus = AdvancedConfig.getInstance().getShearsMasteryMaxBonus(); + + public static int artisanButcherMaxLevel = AdvancedConfig.getInstance().getArtisanButcherMaxLevel(); + public static int artisanButcherMaxChance = AdvancedConfig.getInstance().getArtisanButcherMaxChance(); + public static int artisanButcherMaxBonus = AdvancedConfig.getInstance().getArtisanButcherMaxBonus(); + + public static int carnivoresDietRankLevel1 = AdvancedConfig.getInstance().getCarnivoresDietRankChange(); + public static int carnivoresDietRankLevel2 = carnivoresDietRankLevel1 * 2; + public static int carnivoresDietMaxLevel = carnivoresDietRankLevel1 * 5; + + public static float shearExperience = 10; + public static float breedExperience = 10; +} diff --git a/src/main/java/com/gmail/nossr50/skills/ranching/RanchingManager.java b/src/main/java/com/gmail/nossr50/skills/ranching/RanchingManager.java new file mode 100644 index 000000000..2fb0a115f --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/ranching/RanchingManager.java @@ -0,0 +1,126 @@ +package com.gmail.nossr50.skills.ranching; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Sheep; +import org.bukkit.inventory.ItemStack; +import org.bukkit.material.MaterialData; + +import com.gmail.nossr50.datatypes.player.McMMOPlayer; +import com.gmail.nossr50.datatypes.skills.SkillType; +import com.gmail.nossr50.skills.SkillManager; +import com.gmail.nossr50.skills.ranching.Ranching.Tier; +import com.gmail.nossr50.util.Misc; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.skills.SkillUtils; + +public class RanchingManager extends SkillManager { + public RanchingManager(McMMOPlayer mcMMOPlayer) { + super(mcMMOPlayer, SkillType.RANCHING); + } + + public boolean canUseMultipleBirth() { + return getSkillLevel() >= Ranching.multipleBirthIncreaseLevel && Permissions.multipleBirth(getPlayer()); + } + + public boolean canUseMasterHerder() { + return getSkillLevel() >= Ranching.masterHerderIncreaseLevel && Permissions.masterHerder(getPlayer()); + } + + + + public boolean canUseVanillaXpBoost() { + return getSkillLevel() >= Ranching.Tier.ONE.getLevel() && Permissions.vanillaXpBoost(getPlayer(), skill); + } + + /** + * Handle the Carnivore's Diet ability + * + * @param rankChange The # of levels to change rank for the food + * @param eventFoodLevel The initial change in hunger from the event + * @return the modified change in hunger for the event + */ + public int handleCarnivoresDiet(int rankChange, int eventFoodLevel) { + return SkillUtils.handleFoodSkills(getPlayer(), skill, eventFoodLevel, Ranching.carnivoresDietRankLevel1, Ranching.carnivoresDietMaxLevel, rankChange); + } + + public void handleShearsMasterySheep(Entity entity) { + if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Ranching.shearsMasteryMaxChance, Ranching.shearsMasteryMaxLevel)) { + Location location = entity.getLocation(); + Sheep sheep = (Sheep) entity; + MaterialData wool = new MaterialData(Material.WOOL, sheep.getColor().getDyeData()); + + Misc.randomDropItems(location, wool.toItemStack(), Ranching.shearsMasteryMaxBonus); + } + } + + public void handleShearsMasteryMooshroom(Entity entity) { + if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Ranching.shearsMasteryMaxChance, Ranching.shearsMasteryMaxLevel)) { + Location location = entity.getLocation(); + ItemStack itemStack = new ItemStack(Material.RED_MUSHROOM); + + Misc.randomDropItems(location, itemStack, Ranching.shearsMasteryMaxBonus); + } + } + + public void handleArtisanButcher(Entity entity) { + if (SkillUtils.activationSuccessful(getSkillLevel(), getActivationChance(), Ranching.artisanButcherMaxChance, Ranching.artisanButcherMaxLevel)) { + Material material = null; + + switch (entity.getType()) { + case CHICKEN: + material = Material.RAW_CHICKEN; + break; + case COW: + material = Material.RAW_BEEF; + break; + case PIG: + material = Material.PORK; + break; + default: + return; + } + + Misc.randomDropItems(entity.getLocation(), new ItemStack(material), Ranching.artisanButcherMaxBonus); + } + } + + /** + * Handle the vanilla XP boost for Ranching + * + * @param experience The amount of experience initially awarded by the event + * @return the modified event damage + */ + public int handleVanillaXpBoost(int experience) { + return experience * getVanillaXpMultiplier(); + } + + /** + * Gets the vanilla XP multiplier + * + * @return the vanilla XP multiplier + */ + private int getVanillaXpMultiplier() { + int skillLevel = getSkillLevel(); + + for (Tier tier : Tier.values()) { + if (skillLevel >= tier.getLevel()) { + return tier.getVanillaXPBoostModifier(); + } + } + + return 0; + } + + public void handleMasterHerder(Entity entity, ItemStack inHand) { + // TODO Auto-generated method stub + + } + + public boolean isBreedFood(Entity entity, ItemStack inHand) { + // TODO Auto-generated method stub + // Check if the entity and the item type match + return false; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index aad23d435..1d88b771c 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -166,6 +166,13 @@ public final class Permissions { public static boolean remoteDetonation(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.mining.blastmining.detonate"); } public static boolean superBreaker(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.mining.superbreaker"); } + /* RANCHING */ + public static boolean multipleBirth(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.ranching.multiplebirth"); } + public static boolean masterHerder(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.ranching.masterherder"); } + public static boolean shearsMastery(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.ranching.shearsmastery"); } + public static boolean artisanButcher(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.ranching.artisanbutcher"); } + public static boolean carnivoresDiet(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.ranching.carnivoresdiet"); } + /* REPAIR */ public static boolean arcaneForging(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.repair.arcaneforging"); } public static boolean repairMastery(Permissible permissible) { return permissible.hasPermission("mcmmo.ability.repair.repairmastery"); } diff --git a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java index 971fccbf3..00d1377f3 100644 --- a/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java +++ b/src/main/java/com/gmail/nossr50/util/commands/CommandRegistrationManager.java @@ -40,6 +40,7 @@ import com.gmail.nossr50.commands.skills.ExcavationCommand; import com.gmail.nossr50.commands.skills.FishingCommand; import com.gmail.nossr50.commands.skills.HerbalismCommand; import com.gmail.nossr50.commands.skills.MiningCommand; +import com.gmail.nossr50.commands.skills.RanchingCommand; import com.gmail.nossr50.commands.skills.RepairCommand; import com.gmail.nossr50.commands.skills.SmeltingCommand; import com.gmail.nossr50.commands.skills.SwordsCommand; @@ -102,6 +103,10 @@ public final class CommandRegistrationManager { command.setExecutor(new MiningCommand()); break; + case RANCHING: + command.setExecutor(new RanchingCommand()); + break; + case REPAIR: command.setExecutor(new RepairCommand()); break; diff --git a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java index 58785f35f..4350ec4ee 100644 --- a/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java +++ b/src/main/java/com/gmail/nossr50/util/skills/SkillUtils.java @@ -244,6 +244,7 @@ public class SkillUtils { public static boolean hasMiscSkills(Player player) { return Permissions.skillEnabled(player, SkillType.ACROBATICS) || Permissions.skillEnabled(player, SkillType.SMELTING) + || Permissions.skillEnabled(player, SkillType.RANCHING) || Permissions.skillEnabled(player, SkillType.REPAIR); } diff --git a/src/main/resources/child.yml b/src/main/resources/child.yml index da5380a9c..54a2dfb03 100644 --- a/src/main/resources/child.yml +++ b/src/main/resources/child.yml @@ -8,4 +8,7 @@ ##### Smelting: - Mining - - Repair \ No newline at end of file + - Repair +Ranching: + - Herbalism + - Taming \ No newline at end of file diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 67d7ff569..056b05e6d 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -628,6 +628,7 @@ Guides.Herbalism=[[DARK_AQUA]]About Herbalism:\n[[YELLOW]]Herbalism is about col Guides.Mining=[[DARK_AQUA]]About Mining:\n[[YELLOW]]Mining consists of mining stone and ores. It provides bonuses\n[[YELLOW]]to the amount of materials dropped while mining.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]To gain XP in this skill, you must mine with a pickaxe in hand.\n[[YELLOW]]Only certain blocks award XP.\n\n[[DARK_AQUA]]Compatible Materials:\n[[YELLOW]]Stone, Coal Ore, Iron Ore, Gold Ore, Diamond Ore, Redstone Ore,\n[[YELLOW]]Lapis Ore, Obsidian, Mossy Cobblestone, Ender Stone,\n[[YELLOW]]Glowstone, and Netherrack.\n\n[[DARK_AQUA]]How to use Super Breaker:\n[[YELLOW]]With a pickaxe in your hand, right click to ready your tool.\n[[YELLOW]]Once in this state, you have about 4 seconds to make contact\n[[YELLOW]]with Mining compatible materials, which will activate Super\n[[YELLOW]]Breaker.\n\n[[DARK_AQUA]]What is Super Breaker?\n[[YELLOW]]Super Breaker is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It triples your chance of extra items dropping and\n[[YELLOW]]enables instant break on Mining materials.\n\n[[DARK_AQUA]]How to use Blast Mining:\n[[YELLOW]]With a detonator in hand, which is a flint & steel by default,\n[[YELLOW]]crouch and right-click on TNT from a distance. This will cause the TNT\n[[YELLOW]]to instantly explode.\n\n[[DARK_AQUA]]How does Blast Mining work?\n[[YELLOW]]Blast Mining is an ability with a cooldown tied to the Mining\n[[YELLOW]]skill. It gives bonuses when mining with TNT and allows you\n[[YELLOW]]to remote detonate TNT. There are three parts to Blast Mining.\n[[YELLOW]]The first part is Bigger Bombs, which increases blast radius.\n[[YELLOW]]The second is Demolitions Expert, which decreases damage\n[[YELLOW]]from TNT explosions. The third part simply increases the\n[[YELLOW]]amount of ores dropped from TNT and decreases the\n[[YELLOW]]debris dropped. Guides.Page.Invalid=Not a valid page number! Guides.Page.OutOfRange=That page does not exist, there are only {0} total pages. +Guides.Ranching=Coming soon... Guides.Repair=[[DARK_AQUA]]About Repair:\n[[YELLOW]]Repair allows you to use an iron block to repair armor and\n[[YELLOW]]tools, or a gold block to salvage armor and tools.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]Repair tools or armor using the mcMMO Anvil. This is an\n[[YELLOW]]iron block by default and should not be confused with\n[[YELLOW]]the Vanilla Minecraft Anvil.\n[[DARK_AQUA]]How can I use Repair?\n[[YELLOW]]Place down a mcMMO Anvil and right-click to repair the item \n[[YELLOW]]you're currently holding. This consumes 1 item on every use.\n\n[[DARK_AQUA]]How does Repair Mastery work?\n[[YELLOW]]Repair Mastery increases the repair amount. The extra amount\n[[YELLOW]]repaired is influenced by your Repair skill level.\n\n[[DARK_AQUA]]How does Super Repair work?\n[[YELLOW]]Super Repair is a passive ability. When repairing an item,\n[[YELLOW]]it grants players a chance to repair an item with\n[[YELLOW]]double effectiveness.\n\n\n\n\n[[DARK_AQUA]]How does Arcane Forging work?\n[[YELLOW]]This passive ability allows you to repair items with a certain\n[[YELLOW]]chance of maintaining its enchantments. The enchants may be\n[[YELLOW]]kept at their existing levels, downgraded to a lower level,\n[[YELLOW]]or lost entirely.\n\n\n\n[[DARK_AQUA]]How does Salvage work?\n[[YELLOW]]Place down a mcMMO Salvage Anvil and right-click to salvage\n[[YELLOW]]the item you're currently holding.\n[[YELLOW]]This will break the item apart en give back the used ingots.\n[[YELLOW]]Note: You can only salvage fully repaired tools or armor. Guides.Swords=[[DARK_AQUA]]About Swords:\n[[YELLOW]]This skill awards combat bonuses to anyone fighting with a\n[[YELLOW]]sword.\n\n[[DARK_AQUA]]XP GAIN:\n[[YELLOW]]XP is gained based on the amount of damage dealt to mobs or \n[[YELLOW]]other players when wielding a sword.\n\n[[DARK_AQUA]]How does Serrated Strikes work?\n[[YELLOW]]Serrated Strikes is an active ability, you can activate it by\n[[YELLOW]]right-clicking with a sword. This ability allows you to deal \n[[YELLOW]]an AoE (Area of Effect) hit. This AoE will do a bonus 25%\n[[YELLOW]]damage and will inflict a bleed effect that lasts for 5 ticks.\n\n\n\n[[DARK_AQUA]]How does Counter Attack work?\n[[YELLOW]]Counter Attack is a passive ability. When taking hits from mobs,\n[[YELLOW]]you will have a chance to reflect 50% of the damage that was \n[[YELLOW]]taken.\n\n\n\n\n[[DARK_AQUA]]How does Bleed work?\n[[YELLOW]]Bleed causes enemies to take damage every two seconds. The \n[[YELLOW]]target will bleed until the effect wears off, or death, \n[[YELLOW]]whichever comes first.\n[[YELLOW]]The duration of the bleed is increased by your sword skill. Guides.Smelting=Coming soon... @@ -737,6 +738,29 @@ Smelting.FluxMining.Success=[[GREEN]]That ore smelted itself! Smelting.Listener=Smelting: Smelting.SkillName=SMELTING +#RANCHING +Ranching.Ability.MultipleBirth=[[RED]]Multiple Birth Chance: [[YELLOW]]{0} +Ranching.Ability.MasterHerder=[[RED]]Decreased Cooldown: [[YELLOW]]{0} +Ranching.Ability.ShearsMastery=[[RED]]Shear Mastery Chance: [[YELLOW]]{0} +Ranching.Ability.ArtisanButcher=[[RED]]Artisan Butcher Chance: [[YELLOW]]{0} +Ranching.Ability.CarnivoresDiet=[[RED]]Carnivores Diet: [[YELLOW]]Rank {0} +Ranching.Ability.Locked.0=LOCKED UNTIL {0}+ SKILL (MULTIPLE BIRTH) +Ranching.Ability.Locked.1=LOCKED UNTIL {0}+ SKILL (MASTER HERDER) +Ranching.Effect.0=Multiple Birth +Ranching.Effect.1=Chance for animals to have twins +Ranching.Effect.2=Master Herder +Ranching.Effect.3=Decrease the cooldown between breeds +Ranching.Effect.4=Vanilla XP Boost +Ranching.Effect.5=Increase vanilla XP gained while breeding +Ranching.Effect.6=Shears Mastery +Ranching.Effect.7=Gives a chance to gain more wool +Ranching.Effect.8=Artisan Butcher +Ranching.Effect.9=Gives a chance to loot more meat +Ranching.Effect.10=Carnivores Diet +Ranching.Effect.11=Improves hunger restored from meat +Ranching.Listener=Ranching: +Ranching.SkillName=RANCHING + #COMMAND DESCRIPTIONS Commands.Description.addlevels=Add mcMMO levels to a user Commands.Description.adminchat=Toggle mcMMO admin chat on/off or send admin chat messages diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 210eeae8a..5259a4dab 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -86,6 +86,8 @@ commands: description: Detailed mcMMO skill info acrobatics: description: Detailed mcMMO skill info + ranching: + description: Detailed mcMMO skill info repair: description: Detailed mcMMO skill info fishing: @@ -147,6 +149,7 @@ permissions: mcmmo.ability.fishing.all: true mcmmo.ability.herbalism.all: true mcmmo.ability.mining.all: true + mcmmo.ability.ranching.all: true mcmmo.ability.repair.all: true mcmmo.ability.smelting.all: true mcmmo.ability.swords.all: true @@ -418,7 +421,30 @@ permissions: mcmmo.ability.mining.doubledrops: description: Allows double drop chance when mining mcmmo.ability.mining.superbreaker: - description: Allows access to the Super Breaker ability + description: Allows access to the Super Breaker ability + mcmmo.ability.ranching.*: + default: false + description: Allows access to all Ranching abilities + children: + mcmmo.ability.ranching.all: true + mcmmo.ability.ranching.all: + description: Allows access to all Ranching abilities + children: + mcmmo.ability.ranching.multiplebirth: true + mcmmo.ability.ranching.masterherder: true + mcmmo.ability.ranching.shearsmastery: true + mcmmo.ability.ranching.artisanbutcher: true + mcmmo.ability.ranching.carnivoresdiet: true + mcmmo.ability.ranching.multiplebirth: + description: Allows access to the Multiple Birth ability + mcmmo.ability.ranching.masterherder: + description: Allows access to the Master Herder ability + mcmmo.ability.ranching.shearsmastery: + description: Allows access to the Shears Mastery ability + mcmmo.ability.ranching.artisanbutcher: + description: Allows access to the Artisan Butcher ability + mcmmo.ability.ranching.carnivoresdiet: + description: Allows access to the Carnivores Diet ability mcmmo.ability.repair.*: default: false description: Allows access to all Repair abilities @@ -687,6 +713,7 @@ permissions: mcmmo.commands.mobhealth: true mcmmo.commands.party.all: true mcmmo.commands.ptp.all: true + mcmmo.commands.ranching: true mcmmo.commands.repair: true mcmmo.commands.smelting: true mcmmo.commands.swords: true @@ -869,6 +896,7 @@ permissions: mcmmo.commands.mctop.fishing: true mcmmo.commands.mctop.herbalism: true mcmmo.commands.mctop.mining: true + mcmmo.commands.mctop.ranching: true mcmmo.commands.mctop.repair: true mcmmo.commands.mctop.smelting: true mcmmo.commands.mctop.swords: true @@ -889,6 +917,8 @@ permissions: description: Allows access to the mctop command for fishing mcmmo.commands.mctop.herbalism: description: Allows access to the mctop command for herbalism + mcmmo.commands.mctop.ranching: + description: Allows access to the mctop command for ranching mcmmo.commands.mctop.mining: description: Allows access to the mctop command for mining mcmmo.commands.mctop.repair: @@ -1017,6 +1047,8 @@ permissions: mcmmo.commands.ptp.world.all: true mcmmo.commands.ptp.world.all: description: Implies access to all mcmmo.commands.ptp.world permissions + mcmmo.commands.ranching: + description: Allows access to the ranching command mcmmo.commands.repair: description: Allows access to the repair command mcmmo.commands.skillreset.*: @@ -1036,6 +1068,7 @@ permissions: mcmmo.commands.skillreset.herbalism: true mcmmo.commands.skillreset.mining: true mcmmo.commands.skillreset.others.all: true + mcmmo.commands.skillreset.ranching: true mcmmo.commands.skillreset.repair: true mcmmo.commands.skillreset.smelting: true mcmmo.commands.skillreset.swords: true @@ -1074,6 +1107,7 @@ permissions: mcmmo.commands.skillreset.others.fishing: true mcmmo.commands.skillreset.others.herbalism: true mcmmo.commands.skillreset.others.mining: true + mcmmo.commands.skillreset.others.ranching: true mcmmo.commands.skillreset.others.repair: true mcmmo.commands.skillreset.others.smelting: true mcmmo.commands.skillreset.others.swords: true @@ -1096,6 +1130,8 @@ permissions: description: Allows access to the skillreset command for herbalism for other players mcmmo.commands.skillreset.others.mining: description: Allows access to the skillreset command for mining for other players + mcmmo.commands.skillreset.others.ranching: + description: Allows access to the skillreset command for ranching for other players mcmmo.commands.skillreset.others.repair: description: Allows access to the skillreset command for repair for other players mcmmo.commands.skillreset.others.smelting: @@ -1108,6 +1144,8 @@ permissions: description: Allows access to the skillreset command for unarmed for other players mcmmo.commands.skillreset.others.woodcutting: description: Allows access to the skillreset command for woodcutting for other players + mcmmo.commands.skillreset.ranching: + description: Allows access to the skillreset command for ranching mcmmo.commands.skillreset.repair: description: Allows access to the skillreset command for repair mcmmo.commands.skillreset.smelting: @@ -1163,6 +1201,7 @@ permissions: mcmmo.commands.xplock.fishing: true mcmmo.commands.xplock.herbalism: true mcmmo.commands.xplock.mining: true + mcmmo.commands.xplock.ranching: true mcmmo.commands.xplock.repair: true mcmmo.commands.xplock.smelting: true mcmmo.commands.xplock.swords: true @@ -1183,6 +1222,8 @@ permissions: description: Allows access to the xplock command for fishing mcmmo.commands.xplock.herbalism: description: Allows access to the xplock command for herbalism + mcmmo.commands.xplock.ranching: + description: Allows access to the xplock command for ranching mcmmo.commands.xplock.mining: description: Allows access to the xplock command for mining mcmmo.commands.xplock.repair: @@ -1330,6 +1371,7 @@ permissions: mcmmo.perks.lucky.fishing: true mcmmo.perks.lucky.herbalism: true mcmmo.perks.lucky.mining: true + mcmmo.perks.lucky.ranching: true mcmmo.perks.lucky.repair: true mcmmo.perks.lucky.smelting: true mcmmo.perks.lucky.swords: true @@ -1357,6 +1399,9 @@ permissions: mcmmo.perks.lucky.mining: default: false description: Gives Mining abilities & skills a 33.3% better chance to activate. + mcmmo.perks.lucky.ranching: + default: false + description: Gives Ranching abilities & skills a 33.3% better chance to activate. mcmmo.perks.lucky.repair: default: false description: Gives Repair abilities & skills a 33.3% better chance to activate. @@ -1425,6 +1470,7 @@ permissions: mcmmo.skills.fishing: true mcmmo.skills.herbalism: true mcmmo.skills.mining: true + mcmmo.skills.ranching: true mcmmo.skills.repair: true mcmmo.skills.swords: true mcmmo.skills.smelting: true @@ -1473,6 +1519,12 @@ permissions: mcmmo.ability.mining.all: true mcmmo.commands.mining: true mcmmo.commands.xplock.mining: true + mcmmo.skills.ranching: + description: Allows access to the Ranching skill + children: + mcmmo.ability.ranching.all: true + mcmmo.commands.ranching: true + mcmmo.commands.xplock.ranching: true mcmmo.skills.repair: description: Allows access to the Repair skill children: