1
0
mirror of https://github.com/mcMMO-Dev/mcMMO.git synced 2026-02-18 09:43:00 +01:00

Compare commits

..

3 Commits

Author SHA1 Message Date
riking
ffd11f6e0e Use PlayerLoginEvent instead to alleviate ban concerns
Research indicates that there is still enough time from login to join for this to be a good idea.
2013-07-03 22:16:32 -07:00
riking
f1f9ffc10b Prefetch profile information from the database.
Note that this implementation may open us to a denial-of-service attack by a banned user - AsyncPlayerPreLoginEvent is called before the ban lists are checked.

Look into the consequences of recieving an InterruptedException in the middle of loadPlayerProfile on the integrity of the database. If possible, we would prefer to interrupt the profile fetching task when the player stops logging in, to mitigate any possible denial-of-service attacks.
2013-07-03 21:52:19 -07:00
riking
8fe18be79b Move that PlayerProfile up another level! 2013-07-03 21:12:23 -07:00
17 changed files with 112 additions and 566 deletions

View File

@@ -1,146 +0,0 @@
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));
}
}
}

View File

@@ -180,38 +180,6 @@ 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); }

View File

@@ -29,7 +29,6 @@ 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;
@@ -90,10 +89,14 @@ public class McMMOPlayer {
private boolean isUsingUnarmed;
public McMMOPlayer(Player player) {
this(player, mcMMO.getDatabaseManager().loadPlayerProfile(player.getName(), true));
}
public McMMOPlayer(Player player, PlayerProfile profile) {
String playerName = player.getName();
this.player = player;
profile = mcMMO.getDatabaseManager().loadPlayerProfile(playerName, true);
this.profile = profile;
party = PartyManager.getPlayerParty(playerName);
/*
@@ -150,10 +153,6 @@ 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);
}

View File

@@ -17,7 +17,6 @@ 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;
@@ -41,8 +40,7 @@ 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),
RANCHING(RanchingManager.class, Color.ORANGE);
WOODCUTTING(WoodcuttingManager.class, Color.OLIVE, AbilityType.TREE_FELLER, ToolType.AXE);
private Class<? extends SkillManager> managerClass;
private Color runescapeColor;
@@ -136,7 +134,6 @@ public enum SkillType {
public boolean isChildSkill() {
switch (this) {
case SMELTING:
case RANCHING:
return true;
default:

View File

@@ -44,8 +44,6 @@ 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;
@@ -357,20 +355,13 @@ 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) || Misc.isNPCEntity(player)) {
if (Misc.isNPCEntity(entity)) {
return;
}
BleedTimerTask.remove(entity);
Archery.arrowRetrievalCheck(entity);
if (Permissions.carnivoresDiet(player)) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
RanchingManager ranchingManager = mcMMOPlayer.getRanchingManager();
ranchingManager.handleArtisanButcher(entity);
}
}
/**
@@ -519,22 +510,6 @@ 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;
}

View File

@@ -5,9 +5,7 @@ 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;
@@ -17,19 +15,18 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
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.PlayerLoginEvent;
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;
@@ -48,8 +45,6 @@ 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;
@@ -271,6 +266,24 @@ public class PlayerListener implements Listener {
BleedTimerTask.bleedOut(player); // Bleed it out
}
/**
* Start user data prefetch.
*/
@EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true)
public void onLoginStart(PlayerLoginEvent event) {
UserManager.prefetchUserData(event.getPlayer().getName());
}
/**
* Cancel user data prefetch if a plugin kicks them.
*/
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = false)
public void onLoginComplete(PlayerLoginEvent event) {
if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) {
UserManager.discardPrefetch(event.getPlayer().getName());
}
}
/**
* Monitor PlayerJoin events.
*
@@ -526,68 +539,6 @@ 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.
*

View File

@@ -92,7 +92,6 @@ 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;

View File

@@ -0,0 +1,19 @@
package com.gmail.nossr50.runnables.player;
import java.util.concurrent.Callable;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
public class PlayerProfileLoader implements Callable<PlayerProfile> {
private final String playerName;
public PlayerProfileLoader(String player) {
this.playerName = player;
}
@Override
public PlayerProfile call() {
return mcMMO.getDatabaseManager().loadPlayerProfile(playerName, true);
}
}

View File

@@ -1,60 +0,0 @@
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;
}

View File

@@ -1,126 +0,0 @@
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;
}
}

View File

@@ -166,13 +166,6 @@ 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"); }

View File

@@ -40,7 +40,6 @@ 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;
@@ -103,10 +102,6 @@ public final class CommandRegistrationManager {
command.setExecutor(new MiningCommand());
break;
case RANCHING:
command.setExecutor(new RanchingCommand());
break;
case REPAIR:
command.setExecutor(new RepairCommand());
break;

View File

@@ -1,22 +1,55 @@
package com.gmail.nossr50.util.player;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import com.gmail.nossr50.mcMMO;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.runnables.player.PlayerProfileLoader;
public final class UserManager {
private final static Map<String, McMMOPlayer> players = new HashMap<String, McMMOPlayer>();
private final static Map<String, McMMOPlayer> players = new HashMap<String, McMMOPlayer>();
private final static Map<String, Future<PlayerProfile>> loadTasks = new HashMap<String, Future<PlayerProfile>>();
private final static ExecutorService loadExecutor = Executors.newCachedThreadPool();
private UserManager() {};
/**
* Add a new user.
* Asynchronously pre-fetch information about the player. This is intended
* to expedite the PlayerJoinEvent.
*
* @param playerName The player name
*/
public static void prefetchUserData(String playerName) {
loadTasks.put(playerName, loadExecutor.submit(new PlayerProfileLoader(playerName)));
}
/**
* Discard the information from the prefetch - for example, due to the
* user being banned.
*
* @param playerName The player name
*/
public static void discardPrefetch(String playerName) {
Future<PlayerProfile> oldTask = loadTasks.remove(playerName);
if (oldTask != null) {
oldTask.cancel(false);
}
}
/**
* Add a new user. If the prefetched player information is available, it
* will be used.
*
* @param player The player to create a user record for
* @return the player's {@link McMMOPlayer} object
@@ -29,7 +62,22 @@ public final class UserManager {
mcMMOPlayer.setPlayer(player); // The player object is different on each reconnection and must be updated
}
else {
Future<PlayerProfile> task = loadTasks.remove(playerName);
if (task != null && !task.isCancelled()) {
try {
mcMMOPlayer = new McMMOPlayer(player, task.get());
// TODO copy any additional post-processing here
players.put(playerName, mcMMOPlayer);
return mcMMOPlayer;
}
catch (ExecutionException e) {
}
catch (InterruptedException e) {
}
}
// Did not return - load on main thread
mcMMOPlayer = new McMMOPlayer(player);
// (start post-processing that must be copied above)
players.put(playerName, mcMMOPlayer);
}
@@ -43,12 +91,14 @@ public final class UserManager {
*/
public static void remove(String playerName) {
players.remove(playerName);
discardPrefetch(playerName);
}
/**
* Clear all users.
*/
public static void clearAll() {
discardAllPrefetch();
players.clear();
}
@@ -56,11 +106,23 @@ public final class UserManager {
* Save all users.
*/
public static void saveAll() {
discardAllPrefetch();
for (McMMOPlayer mcMMOPlayer : players.values()) {
mcMMOPlayer.getProfile().save();
}
}
/**
* Discard / cancel all data prefetching.
*/
public static void discardAllPrefetch() {
Iterator<Future<PlayerProfile>> taskIter = loadTasks.values().iterator();
while (taskIter.hasNext()) {
taskIter.next().cancel(false);
taskIter.remove();
}
}
public static Map<String, McMMOPlayer> getPlayers() {
return players;
}

View File

@@ -244,7 +244,6 @@ 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);
}

View File

@@ -8,7 +8,4 @@
#####
Smelting:
- Mining
- Repair
Ranching:
- Herbalism
- Taming
- Repair

View File

@@ -628,7 +628,6 @@ 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...
@@ -738,29 +737,6 @@ 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

View File

@@ -86,8 +86,6 @@ 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:
@@ -149,7 +147,6 @@ 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
@@ -421,30 +418,7 @@ permissions:
mcmmo.ability.mining.doubledrops:
description: Allows double drop chance when mining
mcmmo.ability.mining.superbreaker:
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
description: Allows access to the Super Breaker ability
mcmmo.ability.repair.*:
default: false
description: Allows access to all Repair abilities
@@ -713,7 +687,6 @@ 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
@@ -896,7 +869,6 @@ 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
@@ -917,8 +889,6 @@ 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:
@@ -1047,8 +1017,6 @@ 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.*:
@@ -1068,7 +1036,6 @@ 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
@@ -1107,7 +1074,6 @@ 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
@@ -1130,8 +1096,6 @@ 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:
@@ -1144,8 +1108,6 @@ 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:
@@ -1201,7 +1163,6 @@ 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
@@ -1222,8 +1183,6 @@ 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:
@@ -1371,7 +1330,6 @@ 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
@@ -1399,9 +1357,6 @@ 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.
@@ -1470,7 +1425,6 @@ 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
@@ -1519,12 +1473,6 @@ 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: