diff --git a/.gitignore b/.gitignore index 9ceb119ca..3fa62546b 100644 --- a/.gitignore +++ b/.gitignore @@ -39,4 +39,7 @@ *.jar # Atlassian Stuff -/atlassian-ide-plugin.xml \ No newline at end of file +/atlassian-ide-plugin.xml +src/.DS_Store + +src/main/.DS_Store diff --git a/pom.xml b/pom.xml index 9bf4a8c55..e009a0400 100755 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 com.gmail.nossr50.mcMMO mcMMO - 1.3.11 + 1.3.12 mcMMO https://github.com/mcMMO-Dev/mcMMO diff --git a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java index 89aab4651..d4b17bad4 100644 --- a/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java +++ b/src/main/java/com/gmail/nossr50/commands/skills/RepairCommand.java @@ -16,6 +16,7 @@ public class RepairCommand extends SkillCommand { private boolean canSuperRepair; private boolean canMasterRepair; private boolean canArcaneForge; + private boolean canSalvage; private boolean canRepairStone; private boolean canRepairIron; private boolean canRepairGold; @@ -24,6 +25,7 @@ public class RepairCommand extends SkillCommand { private boolean canRepairLeather; private boolean canRepairWood; + private int salvageLevel; private int diamondLevel; private int goldLevel; private int ironLevel; @@ -45,6 +47,8 @@ public class RepairCommand extends SkillCommand { goldLevel = (goldRepairable == null) ? 0 : goldRepairable.getMinimumLevel(); ironLevel = (ironRepairable == null) ? 0 : ironRepairable.getMinimumLevel(); stoneLevel = (stoneRepairable == null) ? 0 : stoneRepairable.getMinimumLevel(); + + salvageLevel = Config.getInstance().getSalvageUnlockLevel(); repairMasteryBonus = percent.format(skillValue / 500); @@ -63,6 +67,7 @@ public class RepairCommand extends SkillCommand { canSuperRepair = permInstance.repairBonus(player); canMasterRepair = permInstance.repairMastery(player); canArcaneForge = permInstance.arcaneForging(player); + canSalvage = permInstance.salvage(player); canRepairDiamond = permInstance.diamondRepair(player); canRepairGold = permInstance.goldRepair(player); canRepairIron = permInstance.ironRepair(player); @@ -74,7 +79,7 @@ public class RepairCommand extends SkillCommand { @Override protected boolean effectsHeaderPermissions() { - return canArcaneForge || canRepairDiamond || canRepairGold || canRepairIron || canMasterRepair || canRepairStone || canSuperRepair || canRepairString || canRepairWood || canRepairLeather; + return canArcaneForge || canSalvage || canRepairDiamond || canRepairGold || canRepairIron || canMasterRepair || canRepairStone || canSuperRepair || canRepairString || canRepairWood || canRepairLeather; } @Override @@ -107,6 +112,10 @@ public class RepairCommand extends SkillCommand { player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Repair.Effect.6", new Object[] { diamondLevel }), LocaleLoader.getString("Repair.Effect.7") })); } + if (canSalvage && salvageLevel > 0) { + player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Repair.Effect.16", new Object[] { salvageLevel }), LocaleLoader.getString("Repair.Effect.17") })); + } + if (canArcaneForge) { player.sendMessage(LocaleLoader.getString("Effects.Template", new Object[] { LocaleLoader.getString("Repair.Effect.8"), LocaleLoader.getString("Repair.Effect.9") })); } diff --git a/src/main/java/com/gmail/nossr50/config/Config.java b/src/main/java/com/gmail/nossr50/config/Config.java index 06051229a..bc24028d0 100644 --- a/src/main/java/com/gmail/nossr50/config/Config.java +++ b/src/main/java/com/gmail/nossr50/config/Config.java @@ -270,6 +270,11 @@ public class Config extends ConfigLoader { /* Repair */ public boolean getRepairAnvilMessagesEnabled() { return config.getBoolean("Skills.Repair.Anvil_Messages", true); } public int getRepairAnvilId() { return config.getInt("Skills.Repair.Anvil_ID", 42); } + public boolean getSalvageEnabled() { return config.getBoolean("Skills.Repair.Salvage_enabled", true); } + public int getSalvageAnvilId() { return config.getInt("Skills.Repair.Salvage_Anvil_ID", 41); } + public int getSalvageUnlockLevel() { return config.getInt("Skills.Repair.Salvage_UnlockLevel", 600); } + public boolean getSalvageTools() { return config.getBoolean("Skills.Repair.Salvage_tools", true); } + public boolean getSalvageArmor() { return config.getBoolean("Skills.Repair.Salvage_armor", true); } /* Taming */ public int getTamingXPWolf() { return config.getInt("Experience.Taming.Animal_Taming.Wolf", 250); } diff --git a/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java b/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java index b0b0c4f50..4806fc2ec 100644 --- a/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java +++ b/src/main/java/com/gmail/nossr50/datatypes/PlayerProfile.java @@ -31,6 +31,7 @@ public class PlayerProfile { private boolean loaded; private boolean placedAnvil; + private boolean placedSalvageAnvil; private boolean partyChatMode, adminChatMode; private boolean godMode; private boolean greenTerraMode, treeFellerMode, superBreakerMode, gigaDrillBreakerMode, serratedStrikesMode, skullSplitterMode, berserkMode; @@ -491,7 +492,7 @@ public class PlayerProfile { } /* - * Anvil Placement + * Repair Anvil Placement */ public void togglePlacedAnvil() { @@ -501,6 +502,16 @@ public class PlayerProfile { public Boolean getPlacedAnvil() { return placedAnvil; } + /* + * Salvage Anvil Placement + */ + public void togglePlacedSalvageAnvil() { + placedSalvageAnvil = !placedSalvageAnvil; + } + + public Boolean getPlacedSalvageAnvil() { + return placedSalvageAnvil; + } /* * HUD Stuff diff --git a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java index e8039edc5..87c6cc80c 100644 --- a/src/main/java/com/gmail/nossr50/listeners/BlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/BlockListener.java @@ -34,6 +34,7 @@ import com.gmail.nossr50.skills.gathering.Herbalism; import com.gmail.nossr50.skills.gathering.Mining; import com.gmail.nossr50.skills.gathering.WoodCutting; import com.gmail.nossr50.skills.repair.Repair; +import com.gmail.nossr50.skills.repair.Salvage; import com.gmail.nossr50.spout.SpoutSounds; import com.gmail.nossr50.util.BlockChecks; import com.gmail.nossr50.util.ItemChecks; @@ -154,6 +155,9 @@ public class BlockListener implements Listener { if (id == configInstance.getRepairAnvilId() && configInstance.getRepairAnvilMessagesEnabled()) { Repair.placedAnvilCheck(player, id); } + if (id == configInstance.getSalvageAnvilId() && configInstance.getRepairAnvilMessagesEnabled()) { + Salvage.placedAnvilCheck(player, id); + } } /** diff --git a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java index f4322d84f..d79d95dca 100644 --- a/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/PlayerListener.java @@ -1,6 +1,7 @@ package com.gmail.nossr50.listeners; import org.bukkit.ChatColor; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.LivingEntity; @@ -36,6 +37,7 @@ import com.gmail.nossr50.runnables.BleedTimer; import com.gmail.nossr50.skills.gathering.BlastMining; import com.gmail.nossr50.skills.gathering.Fishing; import com.gmail.nossr50.skills.gathering.Herbalism; +import com.gmail.nossr50.skills.repair.Salvage; import com.gmail.nossr50.skills.taming.TamingManager; import com.gmail.nossr50.util.BlockChecks; import com.gmail.nossr50.util.Item; @@ -322,6 +324,15 @@ public class PlayerListener implements Listener { player.updateInventory(); } } + /* SALVAGE CHECKS */ + if (Permissions.getInstance().salvage(player) && block.getTypeId() == Config.getInstance().getSalvageAnvilId()) { + if (Salvage.isSalvageable(inHand)) { + final Location location = block.getLocation(); + Salvage.handleSalvage(player, location, inHand); + event.setCancelled(true); + player.updateInventory(); + } + } /* ACTIVATION CHECKS */ if (Config.getInstance().getAbilitiesEnabled() && BlockChecks.abilityBlockCheck(block)) { diff --git a/src/main/java/com/gmail/nossr50/mcMMO.java b/src/main/java/com/gmail/nossr50/mcMMO.java index 7286b9dd5..1fad77781 100644 --- a/src/main/java/com/gmail/nossr50/mcMMO.java +++ b/src/main/java/com/gmail/nossr50/mcMMO.java @@ -145,6 +145,11 @@ public class mcMMO extends JavaPlugin { repairables.addAll(rManager.getLoadedRepairables()); repairManager = RepairManagerFactory.getRepairManager(repairables.size()); repairManager.registerRepairables(repairables); + + //Check if Repair Anvil and Salvage Anvil have different itemID's + if (configInstance.getSalvageAnvilId() == configInstance.getRepairAnvilId()){ + System.out.println("[WARNING!] Can't use the same itemID for Repair/Salvage Anvils!" ); + } if (!configInstance.getUseMySQL()) { Users.loadUsers(); diff --git a/src/main/java/com/gmail/nossr50/skills/repair/Salvage.java b/src/main/java/com/gmail/nossr50/skills/repair/Salvage.java new file mode 100644 index 000000000..e67ae5ea7 --- /dev/null +++ b/src/main/java/com/gmail/nossr50/skills/repair/Salvage.java @@ -0,0 +1,115 @@ +package com.gmail.nossr50.skills.repair; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.getspout.spoutapi.SpoutManager; +import org.getspout.spoutapi.player.SpoutPlayer; + +import com.gmail.nossr50.mcMMO; +import com.gmail.nossr50.config.Config; +import com.gmail.nossr50.datatypes.PlayerProfile; +import com.gmail.nossr50.datatypes.SkillType; +import com.gmail.nossr50.locale.LocaleLoader; +import com.gmail.nossr50.util.ItemChecks; +import com.gmail.nossr50.util.Permissions; +import com.gmail.nossr50.util.Users; + +public class Salvage { + + private static Config configInstance = Config.getInstance(); + private static Permissions permInstance = Permissions.getInstance(); + + public static void handleSalvage(final Player player, final Location location, final ItemStack inHand) { + if (!permInstance.salvage(player) || !configInstance.getSalvageEnabled()) { + return; + } + + final PlayerProfile profile = Users.getProfile(player); + final int skillLevel = profile.getSkillLevel(SkillType.REPAIR); + final int unlockLevel = configInstance.getSalvageUnlockLevel(); + + if (skillLevel >= unlockLevel) { + final World world = player.getWorld(); + final float currentdura = inHand.getDurability(); + + if (currentdura == 0) { + final int salvagedAmount = getSalvagedAmount(inHand); + final int itemID = getSalvagedItemID(inHand); + + player.setItemInHand(new ItemStack(0)); + location.setY(location.getY() + 1); + world.dropItem(location, new ItemStack(itemID, salvagedAmount)); + player.sendMessage(LocaleLoader.getString("Repair.Skills.SalvageSuccess")); + } else { + player.sendMessage(LocaleLoader.getString("Repair.Skills.NotFullDurability")); + } + } else { + player.sendMessage(LocaleLoader.getString("Repair.Skills.AdeptSalvage")); + } + } + + /** + * Handles notifications for placing an anvil. + * + * @param player The player placing the anvil + * @param anvilID The item ID of the anvil block + */ + public static void placedAnvilCheck(final Player player, final int anvilID) { + final PlayerProfile profile = Users.getProfile(player); + + if (!profile.getPlacedSalvageAnvil()) { + if (mcMMO.spoutEnabled) { + final SpoutPlayer spoutPlayer = SpoutManager.getPlayer(player); + + if (spoutPlayer.isSpoutCraftEnabled()) { + spoutPlayer.sendNotification("[mcMMO] Anvil Placed", "Right click to salvage!", Material.getMaterial(anvilID)); + } + } else { + player.sendMessage(LocaleLoader.getString("Repair.Listener.Anvil2")); + } + + profile.togglePlacedSalvageAnvil(); + } + } + + public static int getSalvagedItemID(final ItemStack inHand) { + int salvagedItem = 0; + if (ItemChecks.isDiamondTool(inHand) || ItemChecks.isDiamondArmor(inHand)) { salvagedItem = 264; } + else if (ItemChecks.isGoldTool(inHand) || ItemChecks.isGoldArmor(inHand)) { salvagedItem = 266; } + else if (ItemChecks.isIronTool(inHand) || ItemChecks.isIronArmor(inHand)){ salvagedItem = 265; } + else if (ItemChecks.isStoneTool(inHand)){ salvagedItem = 4; } + else if (ItemChecks.isWoodTool(inHand)){ salvagedItem = 5; } + else if ( ItemChecks.isLeatherArmor(inHand)){ salvagedItem = 334; } + return salvagedItem; + } + + public static int getSalvagedAmount(final ItemStack inHand) { + int salvagedAmount = 0; + if (ItemChecks.isPickaxe(inHand) || ItemChecks.isAxe(inHand)) { salvagedAmount = 3; } + else if (ItemChecks.isShovel(inHand)) { salvagedAmount = 1; } + else if (ItemChecks.isSword(inHand) || ItemChecks.isHoe(inHand)) { salvagedAmount = 2; } + else if (ItemChecks.isHelmet(inHand)) { salvagedAmount = 5; } + else if (ItemChecks.isChestplate(inHand)) { salvagedAmount = 8; } + else if (ItemChecks.isPants(inHand)) { salvagedAmount = 7; } + else if (ItemChecks.isBoots(inHand)) { salvagedAmount = 4; } + return salvagedAmount; + } + /** + * Checks if the item is salvageable. + * + * @param is Item to check + * @return true if the item is salvageable, false otherwise + */ + public static boolean isSalvageable(final ItemStack is) { + if (configInstance.getSalvageTools() && ItemChecks.isTool(is)) { + return true; + } + if (configInstance.getSalvageArmor() && ItemChecks.isArmor(is)) { + return true; + } + return false; + } +} diff --git a/src/main/java/com/gmail/nossr50/util/BlockChecks.java b/src/main/java/com/gmail/nossr50/util/BlockChecks.java index 82b055eeb..f109378fa 100644 --- a/src/main/java/com/gmail/nossr50/util/BlockChecks.java +++ b/src/main/java/com/gmail/nossr50/util/BlockChecks.java @@ -105,7 +105,7 @@ public class BlockChecks { return false; default: - if (block.getTypeId() == Config.getInstance().getRepairAnvilId()) { + if (block.getTypeId() == Config.getInstance().getRepairAnvilId() || block.getTypeId() == Config.getInstance().getSalvageAnvilId()) { return false; } else { diff --git a/src/main/java/com/gmail/nossr50/util/Permissions.java b/src/main/java/com/gmail/nossr50/util/Permissions.java index daeb486c3..54106b641 100644 --- a/src/main/java/com/gmail/nossr50/util/Permissions.java +++ b/src/main/java/com/gmail/nossr50/util/Permissions.java @@ -212,6 +212,11 @@ public class Permissions { return player.hasPermission("mcmmo.ability.repair.stringrepair"); } + public boolean salvage(Player player) { + return player.hasPermission("mcmmo.ability.repair.salvage"); + } + + /* * MCMMO.ABILITY.UNARMED.* */ diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index f0d202226..0335674a6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -172,6 +172,11 @@ Skills: Level_Cap: 0 Anvil_Messages: true Anvil_ID: 42 + Salvage_enabled: true + Salvage_Anvil_ID: 41 + Salvage_UnlockLevel: 600 + Salvage_tools: true + Salvage_armor: true Swords: Enabled_For_PVP: true Enabled_For_PVE: true diff --git a/src/main/resources/locale/locale_en_US.properties b/src/main/resources/locale/locale_en_US.properties index 7b98654a6..c4af10f39 100644 --- a/src/main/resources/locale/locale_en_US.properties +++ b/src/main/resources/locale/locale_en_US.properties @@ -208,9 +208,13 @@ Repair.Effect.6=Diamond Repair ({0}+ SKILL) Repair.Effect.7=Repair Diamond Tools & Armor Repair.Effect.8=Arcane Forging Repair.Effect.9=Repair magic items +Repair.Effect.16=Salvage ({0}+ SKILL) +Repair.Effect.17=Salvage Tools & Armor Repair.Listener.Anvil=[[DARK_RED]]You have placed an anvil, anvils can repair tools and armor. +Repair.Listener.Anvil2=[[DARK_RED]]You have placed a Salvage anvil, use this to Salvage tools and armor. Repair.Listener=Repair: Repair.SkillName=REPAIR +Repair.Skills.AdeptSalvage=[[DARK_RED]]You're not skilled enough to Salvage items. Repair.Skills.AdeptDiamond=[[DARK_RED]]You're not skilled enough to repair Diamond. Repair.Skills.AdeptGold=[[DARK_RED]]You're not skilled enough to repair Gold. Repair.Skills.AdeptIron=[[DARK_RED]]You're not skilled enough to repair Iron. @@ -218,6 +222,8 @@ Repair.Skills.AdeptStone=[[DARK_RED]]You're not skilled enough to repair Stone. Repair.Skills.Adept=[[RED]]You must be level [[YELLOW]]{0}[[RED]] to repair [[YELLOW]]{1} Repair.Skills.FeltEasy=[[GRAY]]That felt easy. Repair.Skills.FullDurability=[[GRAY]]That is at full durability. +Repair.Skills.SalvageSuccess=[[GRAY]]Item salvaged! +Repair.Skills.NotFullDurability=[[DARK_RED]]You can't salvage damaged items. Repair.Skills.Mastery=[[RED]]Repair Mastery: [[YELLOW]]Extra {0} durability restored Repair.Skills.StackedItems=[[DARK_RED]]You can't repair stacked items. Repair.Skills.Super.Chance=[[RED]]Super Repair Chance: [[YELLOW]]{0} @@ -531,4 +537,4 @@ Perks.lucky.desc=Gives {0} skills and abilities a 33.3% better chance to activat Perks.cooldowns.name=Fast Recovery Perks.cooldowns.desc=Cuts cooldown duration by {0}. Perks.activationtime.name=Endurance -Perks.activationtime.desc=Increases ability activation time by {0} seconds. \ No newline at end of file +Perks.activationtime.desc=Increases ability activation time by {0} seconds. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 5fb56fcf1..a9727d817 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -369,6 +369,7 @@ permissions: mcmmo.ability.repair.repairbonus: true mcmmo.ability.repair.repairmastery: true mcmmo.ability.repair.arcaneforging: true + mcmmo.ability.repair.salvage: true mcmmo.ability.repair.woodrepair: true mcmmo.ability.repair.stonerepair: true mcmmo.ability.repair.leatherrepair: true @@ -386,6 +387,8 @@ permissions: description: Allows access to Repair Mastery mcmmo.ability.repair.arcaneforging: description: Allows access to the Arcane Forging ability + mcmmo.ability.repair.salvage: + description: Allows access to the Salvage ability mcmmo.ability.repair.woodrepair: description: Allows ability to repair Wood tools mcmmo.ability.repair.stonerepair: