public void attackPlayerDefender( RpgPlayer rpgDefender, RpgPlayer rpgAttacker, RpgMonster rpgMobAttacker, double damage, int damageType, String typeString) { EntityDamageByEntityEvent edbe; Player playerDefender = rpgDefender.getPlayer(); String guildName = ""; HealthConverter hc = null; boolean ignoreArmor = false; int guildMemberCount = 0; // Get party and member count. if (FC_Rpg.guildConfig.getGuildByMember(playerDefender.getName()) != null) { guildName = FC_Rpg.guildConfig.getGuildByMember(playerDefender.getName()); guildMemberCount = FC_Rpg.guildConfig.getOnlineGuildPlayerList(guildName).size(); } else guildMemberCount = 1; // Check to see if the player was recently attacked to make sure he isn't attacked too much. if (canAttack(rpgDefender.getLastDamagedLong(), guildMemberCount) == false) return; // Refresh player enchants. rpgDefender.refreshItemEnchants(); // Handle immortality effect first. if (rpgDefender.playerConfig.getStatusActiveRpgPlayer(SpellEffect.IMMORTAL.getID())) { rpgDefender.attemptDamageAvoidNotification(true); return; } // Check if the player has dodge status on them. if (rpgDefender.playerConfig.getStatusActiveRpgPlayer(SpellEffect.DODGE.getID())) { Random rand = new Random(); if (rand.nextInt(100) < rpgDefender.playerConfig.getStatusMagnitude(SpellEffect.DODGE.getID())) { rpgDefender.attemptDamageAvoidNotification(false); return; } } if (rpgDefender.playerConfig.getStatusActiveRpgPlayer(SpellEffect.HEAL_CHANCE.getID())) rpgDefender.healHealth( rpgDefender.playerConfig.maxHealth * rpgDefender.playerConfig.getStatusMagnitude(SpellEffect.HEAL_CHANCE.getID())); // Set the last damage cause for players. if (rpgAttacker != null) { // Refresh player enchants. rpgAttacker.refreshItemEnchants(); // Update durability of weapons. updateSwordDurabilities(rpgAttacker.getPlayer()); // Apply false EDBEE edbe = new EntityDamageByEntityEvent( rpgAttacker.getPlayer(), playerDefender, DamageCause.ENTITY_ATTACK, 0); playerDefender.setLastDamageCause(edbe); // Calculate potions. damage *= FC_Rpg.battleCalculations.getPotionOffenseBonus(playerDefender); // True gets returned, we ignore armor. ignoreArmor = rpgAttacker.playerConfig.getStatusActiveRpgPlayer(SpellEffect.IGNORE_ARMOR.getID()); } else if (rpgMobAttacker != null) { // Apply false EDBEE edbe = new EntityDamageByEntityEvent( rpgMobAttacker.getEntity(), rpgDefender.getPlayer(), DamageCause.ENTITY_ATTACK, 0); playerDefender.setLastDamageCause(edbe); // Handle enchantments for mobs. if (damageType == 0) damage *= FC_Rpg.battleCalculations.getEntityEnchantmentBonus( rpgMobAttacker.getEntity(), Enchantment.DAMAGE_ARTHROPODS); if (damageType == 1) damage *= FC_Rpg.battleCalculations.getEntityEnchantmentBonus( rpgMobAttacker.getEntity(), Enchantment.ARROW_DAMAGE); // Calculate potions. damage *= FC_Rpg.battleCalculations.getPotionOffenseBonus(rpgMobAttacker.getEntity()); } // Deal thorns damage before anything is calculated. if (rpgDefender.playerConfig.getStatusActiveRpgPlayer(SpellEffect.THORNS.getID())) { double thornsDamage = damage * rpgDefender.playerConfig.getStatusMagnitude(SpellEffect.THORNS.getID()); // Attempt a dodge notification rpgDefender.attemptThornsNotification(thornsDamage); if (rpgAttacker != null) rpgAttacker.dealDamage(thornsDamage); else if (rpgMobAttacker != null) rpgMobAttacker.dealDamage(thornsDamage); } // If the attacker doesn't have the ignore defense status, then... if (!ignoreArmor) { // Calculate damage based on players armor. damage *= FC_Rpg.battleCalculations.getArmorBonus(rpgDefender); // Add in enchantment bonuses. damage *= FC_Rpg.battleCalculations.getArmorEnchantmentBonus( playerDefender, Enchantment.PROTECTION_ENVIRONMENTAL); if (damageType == 1) damage *= FC_Rpg.battleCalculations.getArmorEnchantmentBonus( playerDefender, Enchantment.PROTECTION_PROJECTILE); } damage *= FC_Rpg.battleCalculations.getPotionDefenseBonus(playerDefender); // Handle block. if (playerDefender.isBlocking() == true) { // Variable Declaration. RpgClass rpgClass = rpgDefender.playerConfig.getRpgClass(); if (rpgClass != null) { if (rpgClass.getPassiveID() == BalanceConfig.passive_StrongerParry) damage *= FC_Rpg.balanceConfig .getPassivesStrongerParry(); // 25% damage reduction for blocking as defender. else damage *= .9; // 10% damage reduction for blocking. } else damage *= .9; // 10% damage reduction for blocking. } // If taunt status is active, then... if (rpgDefender.playerConfig.getStatusActiveRpgPlayer(SpellEffect.TAUNT.getID()) == true) { // Apply taunt damage reduction. damage *= rpgDefender.playerConfig.getStatusMagnitude(SpellEffect.TAUNT.getID()); } // Deal damage greater than 0. if (damage < 0.1) damage = 0.1; // Deal the damage to the player rpgDefender.dealDamage(damage); // Perform damage effect. playerDefender.playEffect(EntityEffect.HURT); if (rpgAttacker != null) { handle_Post_Offense_Buffs(rpgAttacker, playerDefender, damage); if (playerDefender != null) handle_Post_Offense_Buffs(rpgAttacker, playerDefender, damage); rpgAttacker.attemptAttackNotification( rpgDefender.getPlayer().getName(), rpgDefender.playerConfig.getClassLevel(), rpgDefender.playerConfig.curHealth, rpgDefender.playerConfig.maxHealth, damage); applyKnockback(rpgAttacker.getPlayer(), playerDefender, damageType); } // Set the players health based current health out of maximum health. hc = new HealthConverter(rpgDefender.playerConfig.maxHealth, rpgDefender.playerConfig.curHealth); playerDefender.setHealth(hc.getPlayerHearts()); // Check armor durabilities for the player defender. increaseArmorDurabilities(playerDefender); // If the players has 0 health, kill minecraft body and set to dead. if (rpgDefender.playerConfig.curHealth < 1) { // Damage the player defender. playerDefender.damage(10000); // Set the player to alive. rpgDefender.setIsAlive(false); } else { if (rpgAttacker != null) { rpgDefender.attemptDefenseNotification( damage, rpgAttacker.getPlayer().getName(), rpgAttacker.playerConfig.getClassLevel()); handle_Defense_Passives(damage, rpgDefender, rpgAttacker.getPlayer()); } else if (rpgMobAttacker != null) { rpgDefender.attemptDefenseNotification( damage, rpgMobAttacker.getEntity().getType().toString(), rpgMobAttacker.getLevel()); handle_Defense_Passives(damage, rpgDefender, rpgMobAttacker.getEntity()); } else { rpgDefender.attemptDefenseNotification(damage, typeString, -1); } } }
// Mob combat public void attackMobDefender( RpgMonster rpgMobDefender, RpgPlayer rpgAttacker, double damage, int damageType) { // Variable Declarations. Player playerAttacker = rpgAttacker.getPlayer(); LivingEntity entityDefender = rpgMobDefender.getEntity(); String guild = null; int partyMemberCount = 1; // Make sure that the mob wasn't attacked too recently. if (FC_Rpg.guildConfig.getGuildByMember(playerAttacker.getName()) != null) { guild = FC_Rpg.guildConfig.getGuildByMember(playerAttacker.getName()); partyMemberCount = FC_Rpg.guildConfig.getOnlineGuildPlayerList(guild).size(); if (canAttack(rpgMobDefender.getLastDamagedLong(), partyMemberCount) == false) return; } // Check to see if the player was recently attacked to make sure he isn't attacked too much. if (canAttack(rpgMobDefender.getLastDamagedLong(), partyMemberCount) == false) return; // Refresh player enchants. rpgAttacker.refreshItemEnchants(); // If the player has the fire arrow status, then... if (rpgAttacker.playerConfig.getStatusActiveRpgPlayer(SpellEffect.FIRE_STRIKE.getID())) { // If the mob is alive and not a boss. if (rpgMobDefender.getIsBoss() == false && rpgMobDefender.getIsAlive() == true) { // Put mob on fire ((LivingEntity) entityDefender).setFireTicks(20); // set the mob on fire! // Then return return; } } // Update sword durabilities. updateSwordDurabilities(playerAttacker); if (rpgAttacker.playerConfig.getStatusActiveRpgPlayer( SpellEffect.CRITICAL_DAMAGE_DOUBLE.getID())) { Random rand = new Random(); // Increase attack damage by its magnitude. if (rand.nextInt(100) > rpgAttacker.playerConfig.getStatusMagnitude(SpellEffect.CRITICAL_DAMAGE_DOUBLE.getID())) damage *= 2; } // Handle the passives for attacking players. damage = handle_Offense_Passives(damage, rpgAttacker, playerAttacker); // If the attacker doesn't have the ignore defense status, then... if (rpgAttacker.playerConfig.getStatusActiveRpgPlayer(SpellEffect.IGNORE_ARMOR.getID()) == false) { damage *= FC_Rpg.battleCalculations.getArmorBonus(rpgMobDefender); // Add in enchantment bonuses. damage *= FC_Rpg.battleCalculations.getArmorEnchantmentBonus( rpgMobDefender.getEntity(), Enchantment.PROTECTION_ENVIRONMENTAL); if (damageType == 1) damage *= FC_Rpg.battleCalculations.getArmorEnchantmentBonus( rpgMobDefender.getEntity(), Enchantment.PROTECTION_PROJECTILE); } // Account for potions. damage *= FC_Rpg.battleCalculations.getPotionOffenseBonus(playerAttacker); damage *= FC_Rpg.battleCalculations.getPotionDefenseBonus(rpgMobDefender.getEntity()); // Damage must always be 1 or 0. If it is negative it will heal the creature (not good). if (damage < 0.1) damage = 0.1; // Find the attacker and deal damage from the attacker to the defender. rpgMobDefender.dealDamage(damage); // Perform damage effect. entityDefender.playEffect(EntityEffect.HURT); // Update health for ender dragon and wither bosses. if (entityDefender.getType() == EntityType.ENDER_DRAGON) { HealthConverter hc = new HealthConverter(rpgMobDefender.getMaxHealth(), rpgMobDefender.getCurHealth()); entityDefender.setHealth(hc.getEnderDragonHearts()); } else if (entityDefender.getType() == EntityType.WITHER) { HealthConverter hc = new HealthConverter(rpgMobDefender.getMaxHealth(), rpgMobDefender.getCurHealth()); entityDefender.setHealth(hc.getWitherHearts()); } // Attempt to send an attack notification. rpgAttacker.attemptAttackNotification( rpgMobDefender.getEntity().getType().toString(), rpgMobDefender.getLevel(), rpgMobDefender.getCurHealth(), rpgMobDefender.getMaxHealth(), damage); // Handle berserker class spells handle_Post_Offense_Buffs(rpgAttacker, entityDefender, damage); if (playerAttacker != null) applyKnockback(playerAttacker, entityDefender, damageType); // Put entity damage by entity event on both attacker and defender. EntityDamageByEntityEvent edbe = new EntityDamageByEntityEvent(playerAttacker, entityDefender, DamageCause.ENTITY_ATTACK, 0); playerAttacker.setLastDamageCause(edbe); entityDefender.setLastDamageCause(edbe); // If the mob has 0 health handle it's death processes AND drop loot. if (rpgMobDefender.getCurHealth() <= 0) { if (rpgMobDefender.getIsAlive() == false) return; rpgMobDefender.setIsAlive(false); if (rpgMobDefender.getMobAggressionCheck()) { // Give the attacker a mob kill rpgAttacker.playerConfig.setLifetimeMobKills( rpgAttacker.playerConfig.getLifetimeMobKills() + 1); // If the player is in a party, then... if (guild != null) FC_Rpg.guildConfig.addMobKill(guild); // Add a mob kill for that party. // Give battle winnings attemptGiveBattleWinnings(guild, playerAttacker, rpgMobDefender); // Don't drop loot if the monster level is too high/low. if ((rpgMobDefender.getLevel() - rpgAttacker.playerConfig.getClassLevel()) > FC_Rpg.balanceConfig.getPowerLevelPrevention() * -1) rpgMobDefender.handleHostileMobDrops( entityDefender.getLocation()); // Drop rpg items for hostile mobs. } else { // Drop items for non-hostile mobs. if (FC_Rpg.balanceConfig.getDefaultItemDrops() == false) rpgMobDefender.handlePassiveMobDrops(entityDefender.getLocation()); } // Drop experience rpgMobDefender.dropExperience(); // Remove the mob removeMob(entityDefender); } }