diff --git a/src/main/java/com/gmail/nossr50/Combat.java b/src/main/java/com/gmail/nossr50/Combat.java index afc6d1540..369fdd443 100644 --- a/src/main/java/com/gmail/nossr50/Combat.java +++ b/src/main/java/com/gmail/nossr50/Combat.java @@ -1,18 +1,18 @@ /* This file is part of mcMMO. - mcMMO is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + mcMMO is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - mcMMO is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + mcMMO is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with mcMMO. If not, see . + You should have received a copy of the GNU General Public License + along with mcMMO. If not, see . */ package com.gmail.nossr50; @@ -48,7 +48,7 @@ public class Combat Entity damager = event.getDamager(); LivingEntity target = (LivingEntity) event.getEntity(); int damage = event.getDamage(); - + /* * PLAYER VERSUS ENTITIES */ @@ -58,18 +58,18 @@ public class Combat ItemStack itemInHand = attacker.getItemInHand(); PlayerProfile PPa = Users.getProfile(attacker); - //If there are any abilities to activate - combatAbilityChecks(attacker, PPa); - //Damage modifiers and proc checks if(m.isSwords(itemInHand) && mcPermissions.getInstance().swords(attacker)) { + if(PPa.getSwordsPreparationMode()) + Skills.abilityCheck(attacker, PPa, SkillType.SWORDS); + if(!pluginx.misc.bleedTracker.contains(target)) //Bleed - Swords.bleedCheck(attacker, target, pluginx); + Swords.bleedCheck(attacker, PPa.getSkillLevel(SkillType.SWORDS), target, pluginx); if (!(event instanceof FakeEntityDamageByEntityEvent) && PPa.getSerratedStrikesMode()) - Swords.applySerratedStrikes(attacker, event, pluginx); - + Swords.applySerratedStrikes(attacker, target, damage, pluginx); + if(target instanceof Player) PvPExperienceGain(attacker, PPa, (Player) target, damage, SkillType.SWORDS); else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) @@ -77,35 +77,41 @@ public class Combat } else if(m.isAxes(itemInHand) && mcPermissions.getInstance().axes(attacker)) { - Axes.axesBonus(attacker, event); + if(PPa.getAxePreparationMode()) + Skills.abilityCheck(attacker, PPa, SkillType.AXES); - Axes.axeCriticalCheck(attacker, event, pluginx); //Critical hit + damage += Axes.axesBonus(attacker, PPa); + + damage *= Axes.axeCriticalBonus(attacker, PPa.getSkillLevel(SkillType.AXES), target, pluginx); //Critical hit //Impact - if(event.getEntity() instanceof LivingEntity) - Axes.impact(attacker, (LivingEntity)event.getEntity()); + Axes.impact(attacker, target); if (!(event instanceof FakeEntityDamageByEntityEvent) && PPa.getSkullSplitterMode()) - Axes.applyAoeDamage(attacker, event, pluginx); + Axes.applyAoeDamage(attacker, target, damage, pluginx); if(target instanceof Player) - PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.AXES); + PvPExperienceGain(attacker, PPa, (Player) target, damage, SkillType.AXES); else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) - PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.AXES); + PvEExperienceGain(attacker, PPa, target, damage, SkillType.AXES); } else if(itemInHand.getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker)) //Unarmed { - Unarmed.unarmedBonus(attacker, event); + if(PPa.getFistsPreparationMode()) + Skills.abilityCheck(attacker, PPa, SkillType.UNARMED); + + damage += Unarmed.unarmedBonus(PPa.getSkillLevel(SkillType.UNARMED)); + if(PPa.getBerserkMode()) - event.setDamage(event.getDamage() + (event.getDamage() / 2)); + damage *= 1.5; if(target instanceof Player) - Unarmed.disarmProcCheck(attacker, (Player) target); //Disarm + Unarmed.disarmProcCheck(attacker, PPa.getSkillLevel(SkillType.UNARMED), (Player) target); //Disarm if(target instanceof Player) - PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.UNARMED); + PvPExperienceGain(attacker, PPa, (Player) target, damage, SkillType.UNARMED); else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) - PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.UNARMED); + PvEExperienceGain(attacker, PPa, target, damage, SkillType.UNARMED); } //Player use bone on wolf. @@ -116,6 +122,7 @@ public class Combat if(itemInHand.getTypeId() == 352 && mcPermissions.getInstance().taming(attacker)) { event.setCancelled(true); + if(wolf.isTamed()) attacker.sendMessage(mcLocale.getString("Combat.BeastLore")+" "+ mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)})+" "+ @@ -125,6 +132,8 @@ public class Combat mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {wolf.getHealth()})); } } + + event.setDamage(damage); } /* @@ -170,7 +179,7 @@ public class Combat Swords.counterAttackChecks(event); Acrobatics.dodgeChecks(event); } - + /* * DEFENSIVE CHECKS FOR WOLVES */ @@ -182,17 +191,6 @@ public class Combat } } - public static void combatAbilityChecks(Player attacker, PlayerProfile PPa) - { - //Check to see if any abilities need to be activated - if(PPa.getAxePreparationMode()) - Skills.abilityCheck(attacker, SkillType.AXES); - if(PPa.getSwordsPreparationMode()) - Skills.abilityCheck(attacker, SkillType.SWORDS); - if(PPa.getFistsPreparationMode()) - Skills.abilityCheck(attacker, SkillType.UNARMED); - } - public static void archeryCheck(EntityDamageByEntityEvent event, mcMMO pluginx) { Arrow arrow = (Arrow)event.getDamager(); @@ -322,7 +320,6 @@ public class Combat EntityDamageEvent ede = (EntityDamageByEntityEvent) new FakeEntityDamageByEntityEvent(attacker, target, EntityDamageEvent.DamageCause.ENTITY_ATTACK, dmg); Bukkit.getPluginManager().callEvent(ede); if(ede.isCancelled()) return; - target.damage(ede.getDamage()); } else { target.damage(dmg); diff --git a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java index da870510b..9e83de767 100644 --- a/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java +++ b/src/main/java/com/gmail/nossr50/listeners/mcBlockListener.java @@ -144,7 +144,7 @@ public class mcBlockListener implements Listener //Green Terra if(PP.getHoePreparationMode() && mcPermissions.getInstance().herbalismAbility(player) && ((id == 59 && block.getData() == (byte) 0x07) || Herbalism.canBeGreenTerra(block))) - Skills.abilityCheck(player, SkillType.HERBALISM); + Skills.abilityCheck(player, PP, SkillType.HERBALISM); //Wheat && Triple drops if(PP.getGreenTerraMode() && Herbalism.canBeGreenTerra(block)) @@ -220,17 +220,17 @@ public class mcBlockListener implements Listener if(m.abilityBlockCheck(block)) { if(PP.getHoePreparationMode() && Herbalism.canBeGreenTerra(block)) - Skills.abilityCheck(player, SkillType.HERBALISM); + Skills.abilityCheck(player, PP, SkillType.HERBALISM); if(PP.getAxePreparationMode() && id == 17 && mcPermissions.getInstance().woodCuttingAbility(player)) - Skills.abilityCheck(player, SkillType.WOODCUTTING); + Skills.abilityCheck(player, PP, SkillType.WOODCUTTING); if(PP.getPickaxePreparationMode() && Mining.canBeSuperBroken(block)) - Skills.abilityCheck(player, SkillType.MINING); + Skills.abilityCheck(player, PP, SkillType.MINING); if(PP.getShovelPreparationMode() && Excavation.canBeGigaDrillBroken(block)) - Skills.abilityCheck(player, SkillType.EXCAVATION); + Skills.abilityCheck(player, PP, SkillType.EXCAVATION); } if(PP.getFistsPreparationMode() && (Excavation.canBeGigaDrillBroken(block) || id == 78)) - Skills.abilityCheck(player, SkillType.UNARMED); + Skills.abilityCheck(player, PP, SkillType.UNARMED); /* * TREE FELLER STUFF diff --git a/src/main/java/com/gmail/nossr50/skills/Axes.java b/src/main/java/com/gmail/nossr50/skills/Axes.java index c06f3763d..ce8d2b2ab 100644 --- a/src/main/java/com/gmail/nossr50/skills/Axes.java +++ b/src/main/java/com/gmail/nossr50/skills/Axes.java @@ -22,76 +22,67 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.entity.Wolf; -import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.Plugin; import com.gmail.nossr50.Combat; import com.gmail.nossr50.Users; import com.gmail.nossr50.m; -import com.gmail.nossr50.mcPermissions; +import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; import com.gmail.nossr50.party.Party; -public class Axes { - public static void axesBonus(Player attacker, EntityDamageByEntityEvent event) - { - int bonus = 0; - - //Add 1 DMG for every 50 skill levels - bonus += Users.getProfile(attacker).getSkillLevel(SkillType.AXES)/50; - - if(bonus > 4) - bonus = 4; - - event.setDamage(event.getDamage() + bonus); - } - public static void axeCriticalCheck(Player attacker, EntityDamageByEntityEvent event, Plugin pluginx) +public class Axes +{ + public static int axesBonus(Player attacker, PlayerProfile PP) { - Entity x = event.getEntity(); - - if(x instanceof Wolf){ - Wolf wolf = (Wolf)x; - if(Taming.getOwner(wolf, pluginx) != null) - { - if(Taming.getOwner(wolf, pluginx) == attacker) - return; - if(Party.getInstance().inSameParty(attacker, Taming.getOwner(wolf, pluginx))) - return; - } - } - PlayerProfile PPa = Users.getProfile(attacker); - if(m.isAxes(attacker.getItemInHand()) && mcPermissions.getInstance().axes(attacker)){ - if(PPa.getSkillLevel(SkillType.AXES) >= 750){ - if(Math.random() * 1000 <= 750 && !x.isDead()){ - if(x instanceof Player){ - int damage = (event.getDamage() * 2) - (event.getDamage() / 2); - event.setDamage(damage); - Player player = (Player)x; - player.sendMessage(ChatColor.DARK_RED + "You were CRITICALLY hit!"); - } - else { - int damage = event.getDamage() * 2; - event.setDamage(damage); - } - attacker.sendMessage(ChatColor.RED+"CRITICAL HIT!"); - } - } else if(Math.random() * 1000 <= PPa.getSkillLevel(SkillType.AXES) && !x.isDead()){ - if(x instanceof Player){ - int damage = (event.getDamage() * 2) - (event.getDamage() / 2); - event.setDamage(damage); - Player player = (Player)x; - player.sendMessage(ChatColor.DARK_RED + "You were CRITICALLY hit!"); - } - else { - int damage = event.getDamage() * 2; - event.setDamage(damage); - } + //Add 1 DMG for every 50 skill levels + int bonus = PP.getSkillLevel(SkillType.AXES) / 50; + + if(bonus > 4) + bonus = 4; + + return bonus; + } + + public static double axeCriticalBonus(Player attacker, int skillLevel, LivingEntity target, mcMMO pluginx) + { + if(target instanceof Wolf) + { + if(Taming.isFriendlyWolf(attacker, (Wolf) target, pluginx)) + return 1.0; + } + + double criticalBonus = 0.0; + + if(skillLevel >= 750) + { + if(Math.random() * 1000 <= 750) + { + if(target instanceof Player) + { + criticalBonus = 1.5; + ((Player) target).sendMessage(ChatColor.DARK_RED + "You were CRITICALLY hit!"); + } + else + criticalBonus = 2.0; attacker.sendMessage(ChatColor.RED+"CRITICAL HIT!"); - } - } - } + } + } + else if(Math.random() * 1000 <= skillLevel) + { + if(target instanceof Player) + { + criticalBonus = 1.5; + ((Player) target).sendMessage(ChatColor.DARK_RED + "You were CRITICALLY hit!"); + } + else + criticalBonus = 2.0; + attacker.sendMessage(ChatColor.RED+"CRITICAL HIT!"); + } + + return criticalBonus; + } public static void impact(Player attacker, LivingEntity target) { @@ -146,68 +137,60 @@ public class Axes { return false; } - public static void applyAoeDamage(Player attacker, EntityDamageByEntityEvent event, Plugin pluginx) + public static void applyAoeDamage(Player attacker, LivingEntity target, int damage, mcMMO pluginx) { int targets = 0; - int dmgAmount = (event.getDamage()/2); - - //Setup minimum damage - if(dmgAmount < 1) - dmgAmount = 1; - - if(event.getEntity() instanceof LivingEntity) - { - LivingEntity x = (LivingEntity) event.getEntity(); - targets = m.getTier(attacker); - - for(Entity derp : x.getNearbyEntities(2.5, 2.5, 2.5)) - { - //Make sure the Wolf is not friendly - if(derp instanceof Wolf) - { - Wolf hurrDurr = (Wolf)derp; - if(Taming.getOwner(hurrDurr, pluginx) == attacker) + int dmgAmount = damage / 2; + + //Setup minimum damage + if(dmgAmount < 1) + dmgAmount = 1; + + targets = m.getTier(attacker); + + for(Entity derp : target.getNearbyEntities(2.5, 2.5, 2.5)) + { + //Make sure the Wolf is not friendly + if(derp instanceof Wolf) + { + if (Taming.isFriendlyWolf(attacker, (Wolf) derp, pluginx)) + continue; + } + + //Damage nearby LivingEntities + else if(derp instanceof LivingEntity && targets >= 1) + { + if(derp instanceof Player) + { + Player nearbyPlayer = (Player) derp; + + if(Users.getProfile(nearbyPlayer).getGodMode()) continue; - if(Party.getInstance().inSameParty(attacker, Taming.getOwner(hurrDurr, pluginx))) + + if(nearbyPlayer.getName().equals(attacker.getName())) continue; + + if(Party.getInstance().inSameParty(attacker, nearbyPlayer)) + continue; + + if(target.isDead()) + continue; + + if(targets >= 1 && nearbyPlayer.getWorld().getPVP()) + { + Combat.dealDamage(nearbyPlayer, dmgAmount, attacker); + nearbyPlayer.sendMessage(ChatColor.DARK_RED+"Struck by CLEAVE!"); + targets--; + } } - - //Damage nearby LivingEntities - if(derp instanceof LivingEntity && targets >= 1) - { - if(derp instanceof Player) - { - Player target = (Player)derp; - - if(Users.getProfile(target).getGodMode()) - continue; - - if(target.getName().equals(attacker.getName())) - continue; - - if(Party.getInstance().inSameParty(attacker, target)) - continue; - - if(target.isDead()) - continue; - - if(targets >= 1 && derp.getWorld().getPVP()) - { - Combat.dealDamage(target, dmgAmount, attacker); - target.sendMessage(ChatColor.DARK_RED+"Struck by CLEAVE!"); - targets--; - continue; - } - } - else - { - LivingEntity target = (LivingEntity)derp; - Combat.dealDamage(target, dmgAmount, attacker); - targets--; - } - } - } - } + else + { + LivingEntity nearbyLivingEntity = (LivingEntity) derp; + Combat.dealDamage(nearbyLivingEntity, dmgAmount, attacker); + targets--; + } + } + } } } diff --git a/src/main/java/com/gmail/nossr50/skills/Skills.java b/src/main/java/com/gmail/nossr50/skills/Skills.java index f9bdde49c..67e54ced4 100644 --- a/src/main/java/com/gmail/nossr50/skills/Skills.java +++ b/src/main/java/com/gmail/nossr50/skills/Skills.java @@ -275,15 +275,14 @@ public class Skills * @param player The player activating the ability * @param type The skill the ability is based on */ - public static void abilityCheck(Player player, SkillType type) - { - PlayerProfile PP = Users.getProfile(player); - AbilityType ability = type.getAbility(); - if(type.getTool().inHand(player.getItemInHand())) - { - if(type.getTool().getToolMode(PP)) - type.getTool().setToolMode(PP, false); - + public static void abilityCheck(Player player, PlayerProfile PP, SkillType type) + { + AbilityType ability = type.getAbility(); + if(type.getTool().inHand(player.getItemInHand())) + { + if(type.getTool().getToolMode(PP)) + type.getTool().setToolMode(PP, false); + //Axes and Woodcutting are odd because they share the same tool so we show them the too tired message when they take action if(type == SkillType.WOODCUTTING || type == SkillType.AXES) { @@ -293,19 +292,19 @@ public class Skills return; } } - - int ticks = 2 + (PP.getSkillLevel(type) / 50); - if(!ability.getMode(PP) && cooldownOver(player, PP.getSkillDATS(ability), ability.getCooldown())) - { - player.sendMessage(ability.getAbilityOn()); - for(Player y : player.getWorld().getPlayers()) - { - if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10)) - y.sendMessage(ability.getAbilityPlayer(player)); - } - PP.setSkillDATS(ability, System.currentTimeMillis()+(ticks*1000)); - ability.setMode(PP, true); - } - } - } + + int ticks = 2 + (PP.getSkillLevel(type) / 50); + if(!ability.getMode(PP) && cooldownOver(player, PP.getSkillDATS(ability), ability.getCooldown())) + { + player.sendMessage(ability.getAbilityOn()); + for(Player y : player.getWorld().getPlayers()) + { + if(y != player && m.isNear(player.getLocation(), y.getLocation(), 10)) + y.sendMessage(ability.getAbilityPlayer(player)); + } + PP.setSkillDATS(ability, System.currentTimeMillis()+(ticks*1000)); + ability.setMode(PP, true); + } + } + } } diff --git a/src/main/java/com/gmail/nossr50/skills/Swords.java b/src/main/java/com/gmail/nossr50/skills/Swords.java index 61bf1ca12..da7904ae6 100644 --- a/src/main/java/com/gmail/nossr50/skills/Swords.java +++ b/src/main/java/com/gmail/nossr50/skills/Swords.java @@ -33,186 +33,165 @@ import com.gmail.nossr50.party.Party; public class Swords { - public static void bleedCheck(Player attacker, LivingEntity x, mcMMO pluginx) + public static void bleedCheck(Player attacker, int skillLevel, LivingEntity target, mcMMO pluginx) { - PlayerProfile PPa = Users.getProfile(attacker); - - if(x instanceof Wolf) - { - Wolf wolf = (Wolf)x; - if(Taming.getOwner(wolf, pluginx) != null) - { - if(Taming.getOwner(wolf, pluginx) == attacker) - return; - if(Party.getInstance().inSameParty(attacker, Taming.getOwner(wolf, pluginx))) - return; - } - } - if(mcPermissions.getInstance().swords(attacker) && m.isSwords(attacker.getItemInHand())){ - if(PPa.getSkillLevel(SkillType.SWORDS) >= 750) + if(target instanceof Wolf) + { + if(Taming.isFriendlyWolf(attacker, (Wolf) target, pluginx)) + return; + } + + if(skillLevel >= 750) + { + if(Math.random() * 1000 <= 750) { - if(Math.random() * 1000 <= 750) - { - if(!(x instanceof Player)) - pluginx.misc.addToBleedQue(x); - if(x instanceof Player) - { - Player target = (Player)x; - Users.getProfile(target).addBleedTicks(3); - } - attacker.sendMessage(ChatColor.GREEN+"**ENEMY BLEEDING**"); - } - } - else if (Math.random() * 1000 <= PPa.getSkillLevel(SkillType.SWORDS)) - { - if(!(x instanceof Player)) - pluginx.misc.addToBleedQue(x); - if(x instanceof Player) - { - Player target = (Player)x; - Users.getProfile(target).addBleedTicks(2); - } + if(!(target instanceof Player)) + pluginx.misc.addToBleedQue(target); + else if(target instanceof Player) + Users.getProfile((Player) target).addBleedTicks(3); attacker.sendMessage(ChatColor.GREEN+"**ENEMY BLEEDING**"); } + } + else if(Math.random() * 1000 <= skillLevel) + { + if(!(target instanceof Player)) + pluginx.misc.addToBleedQue(target); + else if(target instanceof Player) + Users.getProfile((Player) target).addBleedTicks(2); + attacker.sendMessage(ChatColor.GREEN+"**ENEMY BLEEDING**"); } - } - public static void applySerratedStrikes(Player attacker, EntityDamageByEntityEvent event, mcMMO pluginx) - { - int targets = 0; - - int dmgAmount = (event.getDamage()/4); - - //Setup minimum damage - if(dmgAmount < 1) - dmgAmount = 1; - - if(event.getEntity() instanceof LivingEntity) - { - LivingEntity x = (LivingEntity) event.getEntity(); - targets = m.getTier(attacker); - - for(Entity derp : x.getNearbyEntities(2.5, 2.5, 2.5)) - { - //Make sure the Wolf is not friendly - if(derp instanceof Wolf) - { - Wolf hurrDurr = (Wolf)derp; - if(Taming.getOwner(hurrDurr, pluginx) == attacker) - continue; - if(Party.getInstance().inSameParty(attacker, Taming.getOwner(hurrDurr, pluginx))) - continue; - } - //Damage nearby LivingEntities - if(derp instanceof LivingEntity && targets >= 1) - { - if(derp instanceof Player) - { - Player target = (Player)derp; - - if(target.getName().equals(attacker.getName())) - continue; - - if(Users.getProfile(target).getGodMode()) - continue; - - if(Party.getInstance().inSameParty(attacker, target)) - continue; - if(targets >= 1 && derp.getWorld().getPVP()) - { - Combat.dealDamage(target, dmgAmount, attacker); - target.sendMessage(ChatColor.DARK_RED+"Struck by Serrated Strikes!"); - Users.getProfile(target).addBleedTicks(5); - targets--; - continue; - } - } - else - { - if(!pluginx.misc.bleedTracker.contains(derp)) - pluginx.misc.addToBleedQue((LivingEntity)derp); - - LivingEntity target = (LivingEntity)derp; - Combat.dealDamage(target, dmgAmount, attacker); - targets--; - } - } - } - } } - - public static void counterAttackChecks(EntityDamageByEntityEvent event) - { - //Don't want to counter attack stuff not alive - - if(!(event.getDamager() instanceof LivingEntity)) - return; - - if(event instanceof EntityDamageByEntityEvent) - { - Entity f = ((EntityDamageByEntityEvent) event).getDamager(); - if(event.getEntity() instanceof Player) - { - Player defender = (Player)event.getEntity(); - PlayerProfile PPd = Users.getProfile(defender); - if(m.isSwords(defender.getItemInHand()) && mcPermissions.getInstance().swords(defender)) - { - if(PPd.getSkillLevel(SkillType.SWORDS) >= 600) - { - if(Math.random() * 2000 <= 600) - { - Combat.dealDamage((LivingEntity) f, event.getDamage() / 2); - defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**"); - if(f instanceof Player) - ((Player) f).sendMessage(ChatColor.DARK_RED+"Hit with counterattack!"); - } - } - else if (Math.random() * 2000 <= PPd.getSkillLevel(SkillType.SWORDS)) - { - Combat.dealDamage((LivingEntity) f, event.getDamage() / 2); - defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**"); - if(f instanceof Player) - ((Player) f).sendMessage(ChatColor.DARK_RED+"Hit with counterattack!"); - } - } - } - } - } - - public static void bleedSimulate(mcMMO plugin) - { - //Add items from Que list to BleedTrack list - - for(LivingEntity x : plugin.misc.bleedQue) - { - plugin.misc.bleedTracker.add(x); - } - - //Clear list - plugin.misc.bleedQue = new LivingEntity[plugin.misc.bleedQue.length]; - plugin.misc.bleedQuePos = 0; - - //Cleanup any dead entities from the list - for(LivingEntity x : plugin.misc.bleedRemovalQue) - { - plugin.misc.bleedTracker.remove(x); - } - - //Clear bleed removal list - plugin.misc.bleedRemovalQue = new LivingEntity[plugin.misc.bleedRemovalQue.length]; - plugin.misc.bleedRemovalQuePos = 0; - - //Bleed monsters/animals - for(LivingEntity x : plugin.misc.bleedTracker) - { - if(x == null || x.isDead()) - { - plugin.misc.addToBleedRemovalQue(x); - continue; - } - else - { + + public static void applySerratedStrikes(Player attacker, LivingEntity target, int damage, mcMMO pluginx) + { + int targets = 0; + + int dmgAmount = damage / 4; + + //Setup minimum damage + if(dmgAmount < 1) + dmgAmount = 1; + + targets = m.getTier(attacker); + + for(Entity derp : target.getNearbyEntities(2.5, 2.5, 2.5)) + { + //Make sure the Wolf is not friendly + if(derp instanceof Wolf) + { + if (Taming.isFriendlyWolf(attacker, (Wolf) target, pluginx)) + continue; + } + + //Damage nearby LivingEntities + if(derp instanceof LivingEntity && targets >= 1) + { + if(derp instanceof Player) + { + Player nearbyPlayer = (Player) derp; + + if(nearbyPlayer.getName().equals(attacker.getName())) + continue; + + if(Users.getProfile(nearbyPlayer).getGodMode()) + continue; + + if(Party.getInstance().inSameParty(attacker, nearbyPlayer)) + continue; + + if(targets >= 1 && nearbyPlayer.getWorld().getPVP()) + { + Combat.dealDamage(nearbyPlayer, dmgAmount, attacker); + nearbyPlayer.sendMessage(ChatColor.DARK_RED+"Struck by Serrated Strikes!"); + Users.getProfile(nearbyPlayer).addBleedTicks(5); + targets--; + } + } + else + { + LivingEntity neabyLivingEntity = (LivingEntity) derp; + + if(!pluginx.misc.bleedTracker.contains(neabyLivingEntity)) + pluginx.misc.addToBleedQue(neabyLivingEntity); + + Combat.dealDamage(neabyLivingEntity, dmgAmount, attacker); + targets--; + } + } + } + } + + public static void counterAttackChecks(EntityDamageByEntityEvent event) + { + //Don't want to counter attack stuff not alive + + if(!(event.getDamager() instanceof LivingEntity)) + return; + + if(event instanceof EntityDamageByEntityEvent) + { + Entity f = ((EntityDamageByEntityEvent) event).getDamager(); + if(event.getEntity() instanceof Player) + { + Player defender = (Player)event.getEntity(); + PlayerProfile PPd = Users.getProfile(defender); + if(m.isSwords(defender.getItemInHand()) && mcPermissions.getInstance().swords(defender)) + { + if(PPd.getSkillLevel(SkillType.SWORDS) >= 600) + { + if(Math.random() * 2000 <= 600) + { + Combat.dealDamage((LivingEntity) f, event.getDamage() / 2); + defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**"); + if(f instanceof Player) + ((Player) f).sendMessage(ChatColor.DARK_RED+"Hit with counterattack!"); + } + } + else if (Math.random() * 2000 <= PPd.getSkillLevel(SkillType.SWORDS)) + { + Combat.dealDamage((LivingEntity) f, event.getDamage() / 2); + defender.sendMessage(ChatColor.GREEN+"**COUNTER-ATTACKED**"); + if(f instanceof Player) + ((Player) f).sendMessage(ChatColor.DARK_RED+"Hit with counterattack!"); + } + } + } + } + } + + public static void bleedSimulate(mcMMO plugin) + { + //Add items from Que list to BleedTrack list + + for(LivingEntity x : plugin.misc.bleedQue) + { + plugin.misc.bleedTracker.add(x); + } + + //Clear list + plugin.misc.bleedQue = new LivingEntity[plugin.misc.bleedQue.length]; + plugin.misc.bleedQuePos = 0; + + //Cleanup any dead entities from the list + for(LivingEntity x : plugin.misc.bleedRemovalQue) + { + plugin.misc.bleedTracker.remove(x); + } + + //Clear bleed removal list + plugin.misc.bleedRemovalQue = new LivingEntity[plugin.misc.bleedRemovalQue.length]; + plugin.misc.bleedRemovalQuePos = 0; + + //Bleed monsters/animals + for(LivingEntity x : plugin.misc.bleedTracker) + { + if(x == null || x.isDead()) + { + plugin.misc.addToBleedRemovalQue(x); + continue; + } + else Combat.dealDamage(x, 2); - } - } - } + } + } } diff --git a/src/main/java/com/gmail/nossr50/skills/Taming.java b/src/main/java/com/gmail/nossr50/skills/Taming.java index b7c7c6f4b..098ade452 100644 --- a/src/main/java/com/gmail/nossr50/skills/Taming.java +++ b/src/main/java/com/gmail/nossr50/skills/Taming.java @@ -1,18 +1,18 @@ /* This file is part of mcMMO. - mcMMO is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + mcMMO is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - mcMMO is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + mcMMO is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with mcMMO. If not, see . + You should have received a copy of the GNU General Public License + along with mcMMO. If not, see . */ package com.gmail.nossr50.skills; @@ -31,6 +31,7 @@ import com.gmail.nossr50.mcMMO; import com.gmail.nossr50.datatypes.PlayerProfile; import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; +import com.gmail.nossr50.party.Party; public class Taming { @@ -169,4 +170,11 @@ public class Taming if(cause == DamageCause.FIRE_TICK) event.getEntity().setFireTicks(0); } + + public static boolean isFriendlyWolf(Player player, Wolf wolf, mcMMO pluginx) + { + if(getOwner(wolf, pluginx) == player || Party.getInstance().inSameParty(player, getOwner(wolf, pluginx))) + return true; + return false; + } } diff --git a/src/main/java/com/gmail/nossr50/skills/Unarmed.java b/src/main/java/com/gmail/nossr50/skills/Unarmed.java index 9fccdccfe..632a3c2b5 100644 --- a/src/main/java/com/gmail/nossr50/skills/Unarmed.java +++ b/src/main/java/com/gmail/nossr50/skills/Unarmed.java @@ -18,53 +18,47 @@ package com.gmail.nossr50.skills; import org.bukkit.Material; import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.inventory.ItemStack; -import com.gmail.nossr50.Users; import com.gmail.nossr50.m; -import com.gmail.nossr50.datatypes.SkillType; import com.gmail.nossr50.locale.mcLocale; -public class Unarmed { - - public static void unarmedBonus(Player attacker, EntityDamageByEntityEvent event) +public class Unarmed +{ + public static int unarmedBonus(int skillLevel) { - int bonus = 3; - //Add 1 DMG for every 50 skill levels - bonus += Users.getProfile(attacker).getSkillLevel(SkillType.UNARMED)/50; + int bonus = skillLevel / 50; if(bonus > 8) - bonus = 8; - - event.setDamage(event.getDamage() + bonus); + bonus = 8; + + return bonus; } - public static void disarmProcCheck(Player attacker, Player defender) + public static void disarmProcCheck(Player attacker, int skillLevel, Player defender) { - int skillLevel = Users.getProfile(attacker).getSkillLevel(SkillType.UNARMED); if(defender.getItemInHand() != null && defender.getItemInHand().getType() != Material.AIR) { if(skillLevel >= 1000) { if(Math.random() * 3000 <= 1000) { - ItemStack item = defender.getItemInHand(); - defender.sendMessage(mcLocale.getString("Skills.Disarmed")); - m.mcDropItem(defender.getLocation(), item); - defender.setItemInHand(null); + ItemStack item = defender.getItemInHand(); + defender.sendMessage(mcLocale.getString("Skills.Disarmed")); + m.mcDropItem(defender.getLocation(), item); + defender.setItemInHand(null); } - } + } else - { + { if(Math.random() * 3000 <= skillLevel) { - ItemStack item = defender.getItemInHand(); - defender.sendMessage(mcLocale.getString("Skills.Disarmed")); - m.mcDropItem(defender.getLocation(), item); - defender.setItemInHand(null); + ItemStack item = defender.getItemInHand(); + defender.sendMessage(mcLocale.getString("Skills.Disarmed")); + m.mcDropItem(defender.getLocation(), item); + defender.setItemInHand(null); } - } + } } } -} \ No newline at end of file +}