diff --git a/src/main/java/com/gmail/nossr50/Combat.java b/src/main/java/com/gmail/nossr50/Combat.java index 537517653..45ebeae81 100644 --- a/src/main/java/com/gmail/nossr50/Combat.java +++ b/src/main/java/com/gmail/nossr50/Combat.java @@ -1,425 +1,408 @@ -/* - 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 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 . -*/ -package com.gmail.nossr50; - -import org.bukkit.Bukkit; -import org.bukkit.entity.*; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDamageEvent.DamageCause; -import org.bukkit.inventory.ItemStack; - -import com.gmail.nossr50.config.LoadProperties; -import com.gmail.nossr50.datatypes.PlayerProfile; -import com.gmail.nossr50.datatypes.SkillType; -import com.gmail.nossr50.events.FakeEntityDamageByEntityEvent; -import com.gmail.nossr50.events.FakeEntityDamageEvent; -import com.gmail.nossr50.locale.mcLocale; -import com.gmail.nossr50.party.Party; -import com.gmail.nossr50.skills.Acrobatics; -import com.gmail.nossr50.skills.Archery; -import com.gmail.nossr50.skills.Axes; -import com.gmail.nossr50.skills.Skills; -import com.gmail.nossr50.skills.Swords; -import com.gmail.nossr50.skills.Taming; -import com.gmail.nossr50.skills.Unarmed; - -public class Combat -{ - public static void combatChecks(EntityDamageByEntityEvent event, mcMMO pluginx) - { - if(event.getDamage() == 0 || event.getEntity().isDead()) - return; - - //Declare Things - Entity damager = event.getDamager(); - LivingEntity target = (LivingEntity) event.getEntity(); - int damage = event.getDamage(); - - /* - * PLAYER VERSUS ENTITIES - */ - if(damager instanceof Player) - { - Player attacker = (Player) event.getDamager(); - 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(!pluginx.misc.bleedTracker.contains(target)) //Bleed - Swords.bleedCheck(attacker, target, pluginx); - - if (PPa.getSerratedStrikesMode()) - Swords.applySerratedStrikes(attacker, event, pluginx); - - if(target instanceof Player) - PvPExperienceGain(attacker, PPa, (Player) target, damage, SkillType.SWORDS); - else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) - PvEExperienceGain(attacker, PPa, target, damage, SkillType.SWORDS); - } - else if(m.isAxes(itemInHand) && mcPermissions.getInstance().axes(attacker)) - { - Axes.axesBonus(attacker, event); - - Axes.axeCriticalCheck(attacker, event, pluginx); //Critical hit - - //Impact - Axes.impact(attacker, target, event); - - if (PPa.getSkullSplitterMode()) - Axes.applyAoeDamage(attacker, event, pluginx); - - if(target instanceof Player) - PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.AXES); - else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) - PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.AXES); - } - else if(itemInHand.getTypeId() == 0 && mcPermissions.getInstance().unarmed(attacker)) //Unarmed - { - Unarmed.unarmedBonus(attacker, event); - if(PPa.getBerserkMode()) - event.setDamage(event.getDamage() + (event.getDamage() / 2)); - - if(target instanceof Player) - Unarmed.disarmProcCheck(attacker, (Player) target); //Disarm - - if(target instanceof Player) - PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.UNARMED); - else if(!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) - PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.UNARMED); - } - - //Player use bone on wolf. - else if(target instanceof Wolf) - { - Wolf wolf = (Wolf) target; - - 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)})+" "+ - mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {wolf.getHealth()})); - else - attacker.sendMessage(mcLocale.getString("Combat.BeastLore")+" "+ - mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {wolf.getHealth()})); - } - } - } - - /* - * TAMING (WOLVES VERSUS ENTITIES) - */ - else if(damager instanceof Wolf) - { - Wolf wolf = (Wolf) damager; - - if (wolf.isTamed() && (wolf.getOwner() instanceof Player)) - { - Player master = (Player) wolf.getOwner(); - PlayerProfile PPo = Users.getProfile(master); - if(mcPermissions.getInstance().taming(master)) - { - //Fast Food Service - Taming.fastFoodService(PPo, wolf, event); - - //Sharpened Claws - Taming.sharpenedClaws(PPo, event); - - //Gore - Taming.gore(PPo, event, master, pluginx); - - //Reward XP - Taming.rewardXp(event, pluginx, master); - } - } - } - - //Another offensive check for Archery - else if(damager instanceof Arrow) - archeryCheck((EntityDamageByEntityEvent)event, pluginx); - - /* - * DEFENSIVE CHECKS - */ - if(target instanceof Player) - { - Swords.counterAttackChecks(event); - Acrobatics.dodgeChecks(event); - } - } - - 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(); - Entity y = arrow.getShooter(); - Entity x = event.getEntity(); - if(x instanceof Player) - { - Player defender = (Player)x; - PlayerProfile PPd = Users.getProfile(defender); - if(PPd == null) - Users.addUser(defender); - if(mcPermissions.getInstance().unarmed(defender) && defender.getItemInHand().getTypeId() == 0) - { - if(defender != null && PPd.getSkillLevel(SkillType.UNARMED) >= 1000) - { - if(Math.random() * 1000 <= 500) - { - event.setCancelled(true); - defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect")); //$NON-NLS-1$ - return; - } - } else if(defender != null && Math.random() * 1000 <= (PPd.getSkillLevel(SkillType.UNARMED) / 2)) - { - event.setCancelled(true); - defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect")); //$NON-NLS-1$ - return; - } - } - } - /* - * If attacker is player - */ - if(y instanceof Player) - { - Player attacker = (Player)y; - PlayerProfile PPa = Users.getProfile(attacker); - int damage = event.getDamage(); - if(mcPermissions.getInstance().archery(attacker) && damage > 0) - { - Archery.trackArrows(pluginx, x, PPa); - - /* - * IGNITION - */ - Archery.ignitionCheck(x, attacker); - /* - * Defender is Monster - */ - if(!pluginx.misc.mobSpawnerList.contains(x.getEntityId())) - { - int xp = getXp(x, damage); - PPa.addXP(SkillType.ARCHERY, xp*10, attacker); - } - /* - * Attacker is Player - */ - if(x instanceof Player){ - Player defender = (Player)x; - PlayerProfile PPd = Users.getProfile(defender); - /* - * Stuff for the daze proc - */ - if(PPa.inParty() && PPd.inParty()) - { - if(Party.getInstance().inSameParty(defender, attacker)) - { - event.setCancelled(true); - return; - } - } - /* - * PVP XP - */ - if(LoadProperties.pvpxp && ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis() && !attacker.getName().equals(defender.getName())) - { - int xp = (int) ((damage * 2) * 10); - PPa.addXP(SkillType.ARCHERY, xp, attacker); - } - /* - * DAZE PROC - */ - Archery.dazeCheck(defender, attacker); - } - } - Skills.XpCheckSkill(SkillType.ARCHERY, attacker); - } - } - - /** - * Attempt to damage target for value dmg with reason CUSTOM - * - * @param target LivingEntity which to attempt to damage - * @param dmg Amount of damage to attempt to do - */ - public static void dealDamage(LivingEntity target, int dmg){ - dealDamage(target, dmg, EntityDamageEvent.DamageCause.CUSTOM); - } - - /** - * Attempt to damage target for value dmg with reason cause - * - * @param target LivingEntity which to attempt to damage - * @param dmg Amount of damage to attempt to do - * @param cause DamageCause to pass to damage event - */ - public static void dealDamage(LivingEntity target, int dmg, DamageCause cause) { - if(LoadProperties.eventCallback) { - EntityDamageEvent ede = (EntityDamageEvent) new FakeEntityDamageEvent(target, cause, dmg); - Bukkit.getPluginManager().callEvent(ede); - if(ede.isCancelled()) return; - - target.damage(ede.getDamage()); - } else { - target.damage(dmg); - } - } - - /** - * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker - * - * @param target LivingEntity which to attempt to damage - * @param dmg Amount of damage to attempt to do - * @param attacker Player to pass to event as damager - */ - public static void dealDamage(LivingEntity target, int dmg, Player attacker) { - if(LoadProperties.eventCallback) { - 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); - } - } - - private static void PvPExperienceGain(Player attacker, PlayerProfile PPa, Player defender, int damage, SkillType skillType) - { - if (!LoadProperties.pvpxp) - return; - - PlayerProfile PPd = Users.getProfile(defender); - - if(System.currentTimeMillis() >= (PPd.getRespawnATS()*1000) + 5000 - && ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis() - && defender.getHealth() >= 1) - { - //Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob - int hpLeft = defender.getHealth(), xpinc = 0; - - if(hpLeft < damage) - { - if(hpLeft > 0) - xpinc = hpLeft; - else - xpinc = 0; - } else - xpinc = damage; - - int xp = (int) (xpinc * 2 * LoadProperties.pvpxprewardmodifier); - PPa.addXP(skillType, xp*10, attacker); - Skills.XpCheckSkill(skillType, attacker); - } - } - - private static void PvEExperienceGain(Player attacker, PlayerProfile PPa, LivingEntity target, int damage, SkillType skillType) - { - int xp = getXp(target, damage); - PPa.addXP(skillType, xp*10, attacker); - Skills.XpCheckSkill(skillType, attacker); - } - - public static int getXp(Entity entity, int damage) - { - int xp = 0; - if(entity instanceof LivingEntity) - { - LivingEntity le = (LivingEntity) entity; - //Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the entity - int hpLeft = le.getHealth(); - int xpinc = 0; - - if(hpLeft < damage) - { - if(hpLeft > 0) - xpinc = hpLeft; - else - xpinc = 0; - } - else - xpinc = damage; - - if(entity instanceof Animals) - xp = (int) (xpinc * LoadProperties.animalXP); - else - { - EntityType type = entity.getType(); - switch(type){ - case BLAZE: - xp = (int) (xpinc * LoadProperties.blazeXP); - break; - case CAVE_SPIDER: - xp = (int) (xpinc * LoadProperties.cavespiderXP); - break; - case CREEPER: - xp = (int) (xpinc * LoadProperties.creeperXP); - break; - case ENDER_DRAGON: - xp = (int) (xpinc * LoadProperties.enderdragonXP); - break; - case ENDERMAN: - xp = (int) (xpinc * LoadProperties.endermanXP); - break; - case GHAST: - xp = (int) (xpinc * LoadProperties.ghastXP); - break; - case MAGMA_CUBE: - xp = (int) (xpinc * LoadProperties.magmacubeXP); - break; - case PIG_ZOMBIE: - xp = (int) (xpinc * LoadProperties.pigzombieXP); - break; - case SILVERFISH: - xp = (int) (xpinc * LoadProperties.silverfishXP); - break; - case SKELETON: - xp = (int) (xpinc * LoadProperties.skeletonXP); - break; - case SLIME: - xp = (int) (xpinc * LoadProperties.slimeXP); - break; - case SPIDER: - xp = (int) (xpinc * LoadProperties.spiderXP); - break; - case ZOMBIE: - xp = (int) (xpinc * LoadProperties.zombieXP); - break; - } - } - } - return xp; - } -} +/* + * Copyright (C) 2012 Matt 'The Yeti' Burnett & mcMMO Development + * Copyright (C) 2010-2011 'nossr50' + * + * This program 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. + * + * This program 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 this program. If not, see . +*/ + +package com.gmail.nossr50; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.*; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent.DamageCause; +import org.bukkit.inventory.ItemStack; + +import com.gmail.nossr50.config.LoadProperties; +import com.gmail.nossr50.datatypes.PlayerProfile; +import com.gmail.nossr50.datatypes.SkillType; +import com.gmail.nossr50.events.FakeEntityDamageByEntityEvent; +import com.gmail.nossr50.events.FakeEntityDamageEvent; +import com.gmail.nossr50.locale.mcLocale; +import com.gmail.nossr50.party.Party; +import com.gmail.nossr50.skills.Acrobatics; +import com.gmail.nossr50.skills.Archery; +import com.gmail.nossr50.skills.Axes; +import com.gmail.nossr50.skills.Skills; +import com.gmail.nossr50.skills.Swords; +import com.gmail.nossr50.skills.Taming; +import com.gmail.nossr50.skills.Unarmed; + +public class Combat +{ + public static void combatChecks(EntityDamageByEntityEvent event, mcMMO pluginx) + { + if (event.getDamage() == 0 || event.getEntity().isDead()) + return; + + Entity damager = event.getDamager(); + LivingEntity target = (LivingEntity) event.getEntity(); + int damage = event.getDamage(); + EntityType damagerType = damager.getType(); + EntityType targetType = target.getType(); + + switch (damagerType) + { + case PLAYER: + Player attacker = (Player) event.getDamager(); + ItemStack itemInHand = attacker.getItemInHand(); + PlayerProfile PPa = Users.getProfile(attacker); + + combatAbilityChecks(attacker, PPa); + + if (m.isSwords(itemInHand) && mcPermissions.getInstance().swords(attacker)) + { + if (!pluginx.misc.bleedTracker.contains(target)) + Swords.bleedCheck(attacker, target, pluginx); + + if (PPa.getSerratedStrikesMode()) + Swords.applySerratedStrikes(attacker, event, pluginx); + + if (targetType.equals(EntityType.PLAYER)) + PvPExperienceGain(attacker, PPa, (Player) target, damage, SkillType.SWORDS); + else if (!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) + PvEExperienceGain(attacker, PPa, target, damage, SkillType.SWORDS); + } + else if (m.isAxes(itemInHand) && mcPermissions.getInstance().axes(attacker)) + { + Axes.axesBonus(attacker, event); + Axes.axeCriticalCheck(attacker, event, pluginx); + Axes.impact(attacker, target, event); + + if (PPa.getSkullSplitterMode()) + Axes.applyAoeDamage(attacker, event, pluginx); + + if (targetType.equals(EntityType.PLAYER)) + PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.AXES); //use getDamage because damage is modified in earlier functions + else if (!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) + PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.AXES); //use getDamage because damage is modified in earlier functions + } + else if (itemInHand.getType().equals(Material.AIR) && mcPermissions.getInstance().unarmed(attacker)) + { + Unarmed.unarmedBonus(attacker, event); + + if (PPa.getBerserkMode()) + event.setDamage(damage + (damage / 2)); + + if (targetType.equals(EntityType.PLAYER)) + { + Unarmed.disarmProcCheck(attacker, (Player) target); + PvPExperienceGain(attacker, PPa, (Player) target, event.getDamage(), SkillType.UNARMED); //use getDamage because damage is modified in earlier functions + } + else if (!pluginx.misc.mobSpawnerList.contains(target.getEntityId())) + PvEExperienceGain(attacker, PPa, target, event.getDamage(), SkillType.UNARMED); //use getDamage because damage is modified in earlier functions + } + else if (itemInHand.getType().equals(Material.BONE) && mcPermissions.getInstance().taming(attacker) && targetType.equals(EntityType.WOLF)) + { + Wolf wolf = (Wolf) target; + String message = "Combat.BeastLore" + " "; + int health = wolf.getHealth(); + event.setCancelled(true); + + if (wolf.isTamed()) + { + message.concat(mcLocale.getString("Combat.BeastLoreOwner", new Object[] {Taming.getOwnerName(wolf)}) + " "); + message.concat(mcLocale.getString("Combat.BeastLoreHealthWolfTamed", new Object[] {health})); + } + else + message.concat(mcLocale.getString("Combat.BeastLoreHealthWolf", new Object[] {health})); + + attacker.sendMessage(message); + } + case WOLF: + { + Wolf wolf = (Wolf) damager; + + if (wolf.isTamed() && wolf.getOwner() instanceof Player) + { + Player master = (Player) wolf.getOwner(); + PlayerProfile PPo = Users.getProfile(master); + + if (mcPermissions.getInstance().taming(master)) + { + Taming.fastFoodService(PPo, wolf, event); + Taming.sharpenedClaws(PPo, event); + Taming.gore(PPo, event, master, pluginx); + Taming.rewardXp(event, pluginx, master); + } + } + } + + case ARROW: + archeryCheck((EntityDamageByEntityEvent)event, pluginx); + } + + if (targetType.equals(EntityType.PLAYER)) + { + Swords.counterAttackChecks(event); + Acrobatics.dodgeChecks(event); + } + } + + 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(); + Entity y = arrow.getShooter(); + Entity x = event.getEntity(); + if(x instanceof Player) + { + Player defender = (Player)x; + PlayerProfile PPd = Users.getProfile(defender); + if(PPd == null) + Users.addUser(defender); + if(mcPermissions.getInstance().unarmed(defender) && defender.getItemInHand().getTypeId() == 0) + { + if(defender != null && PPd.getSkillLevel(SkillType.UNARMED) >= 1000) + { + if(Math.random() * 1000 <= 500) + { + event.setCancelled(true); + defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect")); //$NON-NLS-1$ + return; + } + } else if(defender != null && Math.random() * 1000 <= (PPd.getSkillLevel(SkillType.UNARMED) / 2)) + { + event.setCancelled(true); + defender.sendMessage(mcLocale.getString("Combat.ArrowDeflect")); //$NON-NLS-1$ + return; + } + } + } + /* + * If attacker is player + */ + if(y instanceof Player) + { + Player attacker = (Player)y; + PlayerProfile PPa = Users.getProfile(attacker); + int damage = event.getDamage(); + if(mcPermissions.getInstance().archery(attacker) && damage > 0) + { + Archery.trackArrows(pluginx, x, PPa); + + /* + * IGNITION + */ + Archery.ignitionCheck(x, attacker); + /* + * Defender is Monster + */ + if(!pluginx.misc.mobSpawnerList.contains(x.getEntityId())) + { + int xp = getXp(x, damage); + PPa.addXP(SkillType.ARCHERY, xp*10, attacker); + } + /* + * Attacker is Player + */ + if(x instanceof Player){ + Player defender = (Player)x; + PlayerProfile PPd = Users.getProfile(defender); + /* + * Stuff for the daze proc + */ + if(PPa.inParty() && PPd.inParty()) + { + if(Party.getInstance().inSameParty(defender, attacker)) + { + event.setCancelled(true); + return; + } + } + /* + * PVP XP + */ + if(LoadProperties.pvpxp && ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis() && !attacker.getName().equals(defender.getName())) + { + int xp = (int) ((damage * 2) * 10); + PPa.addXP(SkillType.ARCHERY, xp, attacker); + } + /* + * DAZE PROC + */ + Archery.dazeCheck(defender, attacker); + } + } + Skills.XpCheckSkill(SkillType.ARCHERY, attacker); + } + } + + /** + * Attempt to damage target for value dmg with reason CUSTOM + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + */ + public static void dealDamage(LivingEntity target, int dmg){ + dealDamage(target, dmg, EntityDamageEvent.DamageCause.CUSTOM); + } + + /** + * Attempt to damage target for value dmg with reason cause + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + * @param cause DamageCause to pass to damage event + */ + public static void dealDamage(LivingEntity target, int dmg, DamageCause cause) { + if(LoadProperties.eventCallback) { + EntityDamageEvent ede = (EntityDamageEvent) new FakeEntityDamageEvent(target, cause, dmg); + Bukkit.getPluginManager().callEvent(ede); + if(ede.isCancelled()) return; + + target.damage(ede.getDamage()); + } else { + target.damage(dmg); + } + } + + /** + * Attempt to damage target for value dmg with reason ENTITY_ATTACK with damager attacker + * + * @param target LivingEntity which to attempt to damage + * @param dmg Amount of damage to attempt to do + * @param attacker Player to pass to event as damager + */ + public static void dealDamage(LivingEntity target, int dmg, Player attacker) { + if(LoadProperties.eventCallback) { + 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); + } + } + + private static void PvPExperienceGain(Player attacker, PlayerProfile PPa, Player defender, int damage, SkillType skillType) + { + if (!LoadProperties.pvpxp) + return; + + PlayerProfile PPd = Users.getProfile(defender); + + if(System.currentTimeMillis() >= (PPd.getRespawnATS()*1000) + 5000 + && ((PPd.getLastLogin()+5)*1000) < System.currentTimeMillis() + && defender.getHealth() >= 1) + { + //Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the mob + int hpLeft = defender.getHealth(), xpinc = 0; + + if(hpLeft < damage) + { + if(hpLeft > 0) + xpinc = hpLeft; + else + xpinc = 0; + } else + xpinc = damage; + + int xp = (int) (xpinc * 2 * LoadProperties.pvpxprewardmodifier); + PPa.addXP(skillType, xp*10, attacker); + Skills.XpCheckSkill(skillType, attacker); + } + } + + private static void PvEExperienceGain(Player attacker, PlayerProfile PPa, LivingEntity target, int damage, SkillType skillType) + { + int xp = getXp(target, damage); + PPa.addXP(skillType, xp*10, attacker); + Skills.XpCheckSkill(skillType, attacker); + } + + public static int getXp(Entity entity, int damage) + { + int xp = 0; + if(entity instanceof LivingEntity) + { + LivingEntity le = (LivingEntity) entity; + //Prevent a ridiculous amount of XP being granted by capping it at the remaining health of the entity + int hpLeft = le.getHealth(); + int xpinc = 0; + + if(hpLeft < damage) + { + if(hpLeft > 0) + xpinc = hpLeft; + else + xpinc = 0; + } + else + xpinc = damage; + + if(entity instanceof Animals) + xp = (int) (xpinc * LoadProperties.animalXP); + else + { + EntityType type = entity.getType(); + switch(type){ + case BLAZE: + xp = (int) (xpinc * LoadProperties.blazeXP); + break; + case CAVE_SPIDER: + xp = (int) (xpinc * LoadProperties.cavespiderXP); + break; + case CREEPER: + xp = (int) (xpinc * LoadProperties.creeperXP); + break; + case ENDER_DRAGON: + xp = (int) (xpinc * LoadProperties.enderdragonXP); + break; + case ENDERMAN: + xp = (int) (xpinc * LoadProperties.endermanXP); + break; + case GHAST: + xp = (int) (xpinc * LoadProperties.ghastXP); + break; + case MAGMA_CUBE: + xp = (int) (xpinc * LoadProperties.magmacubeXP); + break; + case PIG_ZOMBIE: + xp = (int) (xpinc * LoadProperties.pigzombieXP); + break; + case SILVERFISH: + xp = (int) (xpinc * LoadProperties.silverfishXP); + break; + case SKELETON: + xp = (int) (xpinc * LoadProperties.skeletonXP); + break; + case SLIME: + xp = (int) (xpinc * LoadProperties.slimeXP); + break; + case SPIDER: + xp = (int) (xpinc * LoadProperties.spiderXP); + break; + case ZOMBIE: + xp = (int) (xpinc * LoadProperties.zombieXP); + break; + } + } + } + return xp; + } +} diff --git a/src/main/java/com/gmail/nossr50/skills/Excavation.java b/src/main/java/com/gmail/nossr50/skills/Excavation.java index 63904deb1..11480b080 100644 --- a/src/main/java/com/gmail/nossr50/skills/Excavation.java +++ b/src/main/java/com/gmail/nossr50/skills/Excavation.java @@ -178,7 +178,7 @@ public class Excavation { PlayerAnimationEvent armswing = new PlayerAnimationEvent(player); Bukkit.getPluginManager().callEvent(armswing); - Excavation.excavationProcCheck(block, player); + Excavation.excavationProcCheck(block, player); Excavation.excavationProcCheck(block, player); Excavation.excavationProcCheck(block, player); } diff --git a/src/main/java/com/gmail/nossr50/skills/Mining.java b/src/main/java/com/gmail/nossr50/skills/Mining.java index 2598ff068..2d94235fd 100644 --- a/src/main/java/com/gmail/nossr50/skills/Mining.java +++ b/src/main/java/com/gmail/nossr50/skills/Mining.java @@ -36,7 +36,7 @@ import com.gmail.nossr50.datatypes.SkillType; public class Mining -{ +{ public static void miningDrops(Block block) { @@ -125,7 +125,7 @@ public class Mining case SANDSTONE: xp += LoadProperties.msandstone; break; - case STONE: + case STONE: xp += LoadProperties.mstone; break; } @@ -135,7 +135,7 @@ public class Mining } public static void blockProcSimulate(Block block, Player player) - { + { //Drop natural block with Silk Touch if(player.getItemInHand().containsEnchantment(Enchantment.SILK_TOUCH)) m.mcDropItem(block.getLocation(), new ItemStack(block.getType(), 1)); @@ -186,7 +186,7 @@ public class Mining } public static void SuperBreakerBlockCheck(Player player, Block block, mcMMO plugin) - { + { Material type = block.getType(); int tier = m.getTier(player); int durabilityLoss = LoadProperties.abilityDurabilityLoss;