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: