diff --git a/src/main/java/com/gmail/nossr50/util/Hardcore.java b/src/main/java/com/gmail/nossr50/util/Hardcore.java index 908c0725d..b5d500d03 100644 --- a/src/main/java/com/gmail/nossr50/util/Hardcore.java +++ b/src/main/java/com/gmail/nossr50/util/Hardcore.java @@ -7,66 +7,77 @@ import com.gmail.nossr50.config.Config; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; -public class Hardcore { +public abstract class Hardcore { + public static void invokeStatPenalty(Player player) { - if(Config.getInstance().getHardcoreDeathStatPenaltyPercentage() <= 0) + double hardcorePenalty = Config.getInstance().getHardcoreDeathStatPenaltyPercentage(); + + if (hardcorePenalty <= 0 || hardcorePenalty > 100) { return; - - PlayerProfile PP = Users.getProfile(player); - - int totalCount = 0; - - for(SkillType st : SkillType.values()) { - - if(st.equals(SkillType.ALL)) - continue; - - int newValue = (int) (PP.getSkillLevel(st) - (PP.getSkillLevel(st) * (Config.getInstance().getHardcoreDeathStatPenaltyPercentage() * 0.01D))); - - if(newValue < 0) - newValue = 0; - - totalCount+=PP.getSkillLevel(st)-newValue; - - PP.modifySkill(st, newValue); } - player.sendMessage(ChatColor.GOLD+"[mcMMO] "+ChatColor.DARK_RED+"You've lost "+ChatColor.BLUE+totalCount+ChatColor.DARK_RED+" from death."); + PlayerProfile playerProfile = Users.getProfile(player); + int totalLost = 0; + + for (SkillType skillType : SkillType.values()) { + if (skillType.equals(SkillType.ALL)) { + continue; + } + + int playerSkillLevel = playerProfile.getSkillLevel(skillType); + + //Should we really care about negative skill levels? + if (playerSkillLevel <= 0) { + continue; + } + + int levelsLost = (int) (playerSkillLevel * (hardcorePenalty * 0.01D)); + totalLost += levelsLost; + + playerProfile.modifySkill(skillType, playerSkillLevel - levelsLost); + } + + player.sendMessage(ChatColor.GOLD + "[mcMMO] " + ChatColor.DARK_RED + "You've lost " + ChatColor.BLUE + totalLost + ChatColor.DARK_RED + " from death."); } - public static void invokeVampirism(Player killer, Player defender) { - if(Config.getInstance().getHardcoreVampirismStatLeechPercentage() <= 0) + public static void invokeVampirism(Player killer, Player victim) { + double vampirismLeech = Config.getInstance().getHardcoreVampirismStatLeechPercentage(); + + if (vampirismLeech <= 0 || vampirismLeech > 100) { return; - - PlayerProfile PPk = Users.getProfile(killer); - PlayerProfile PPd = Users.getProfile(defender); - - int totalCount = 0; - - for(SkillType st : SkillType.values()) { - if(st.equals(SkillType.ALL)) - continue; - - if(PPd.getSkillLevel(st) <= 0 || PPd.getSkillLevel(st) < (PPk.getSkillLevel(st)/2)) - continue; - - int newValue = (int) (PPd.getSkillLevel(st) * (Config.getInstance().getHardcoreVampirismStatLeechPercentage() * 0.01D)); - - if(newValue <= 0) - newValue = 1; - - totalCount += newValue; - - PPk.modifySkill(st, newValue+PPk.getSkillLevel(st)); - PPd.modifySkill(st, PPd.getSkillLevel(st)-newValue); } - if(totalCount >= 1) { - killer.sendMessage(ChatColor.GOLD+"[mcMMO] "+ChatColor.DARK_AQUA+"You've stolen "+ChatColor.BLUE+totalCount+ChatColor.DARK_AQUA+" levels from that player."); - defender.sendMessage(ChatColor.GOLD+"[mcMMO] "+ChatColor.YELLOW+killer.getName()+ChatColor.DARK_RED+" has stolen "+ChatColor.BLUE+totalCount+ChatColor.DARK_RED+" levels from you!"); - } else { - killer.sendMessage(ChatColor.GOLD+"[mcMMO] "+ChatColor.GRAY+"That player was too unskilled to grant you any knowledge."); - defender.sendMessage(ChatColor.GOLD+"[mcMMO] "+ChatColor.YELLOW+killer.getName()+ChatColor.GRAY+" was unable to steal knowledge from you!"); + PlayerProfile killerProfile = Users.getProfile(killer); + PlayerProfile victimProfile = Users.getProfile(victim); + int totalStolen = 0; + + for (SkillType skillType : SkillType.values()) { + if (skillType.equals(SkillType.ALL)) { + continue; + } + + int killerSkillLevel = killerProfile.getSkillLevel(skillType); + int victimSkillLevel = victimProfile.getSkillLevel(skillType); + + //Should we really care about negative skill levels? + if (victimSkillLevel <= 0 || victimSkillLevel < killerSkillLevel / 2) { + continue; + } + + int levelsStolen = (int) (victimSkillLevel * (vampirismLeech * 0.01D)); + totalStolen += levelsStolen; + + killerProfile.modifySkill(skillType, killerSkillLevel + levelsStolen); + victimProfile.modifySkill(skillType, victimSkillLevel - levelsStolen); + } + + if (totalStolen > 0) { + killer.sendMessage(ChatColor.GOLD + "[mcMMO] " + ChatColor.DARK_AQUA + "You've stolen " + ChatColor.BLUE + totalStolen + ChatColor.DARK_AQUA + " levels from that player."); + victim.sendMessage(ChatColor.GOLD + "[mcMMO] " + ChatColor.YELLOW + killer.getName() + ChatColor.DARK_RED + " has stolen " + ChatColor.BLUE + totalStolen + ChatColor.DARK_RED + " levels from you!"); + } + else { + killer.sendMessage(ChatColor.GOLD + "[mcMMO] " + ChatColor.GRAY + "That player was too unskilled to grant you any knowledge."); + victim.sendMessage(ChatColor.GOLD + "[mcMMO] " + ChatColor.YELLOW + killer.getName() + ChatColor.GRAY + " was unable to steal knowledge from you!"); } } } \ No newline at end of file