diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar index 842c7fe..9ea5b46 100644 Binary files a/TwosideKeeper.jar and b/TwosideKeeper.jar differ diff --git a/src/plugin.yml b/src/plugin.yml index 2cc1954..82c22c7 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TwosideKeeper main: sig.plugin.TwosideKeeper.TwosideKeeper -version: 3.8.3 +version: 3.8.3r1 commands: money: description: Tells the player the amount of money they are holding. diff --git a/src/sig/plugin/TwosideKeeper/EliteMonster.java b/src/sig/plugin/TwosideKeeper/EliteMonster.java index 856f490..a7297c3 100644 --- a/src/sig/plugin/TwosideKeeper/EliteMonster.java +++ b/src/sig/plugin/TwosideKeeper/EliteMonster.java @@ -42,7 +42,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Common.GenericFunctions; public class EliteMonster { static int REFRESH_BUFFS = 20*30; static int RESTORE_HEALTH = 20*10; - static float DEFAULT_MOVE_SPD = 0.4f; + static float DEFAULT_MOVE_SPD = 0.3f; static float FAST_MOVE_SPD = 0.65f; static long BURST_TIME = 20*3; static float BURST_LIMIT = 10f; @@ -51,6 +51,8 @@ public class EliteMonster { static int LEAP_COOLDOWN = 20*40; static int ENRAGE_COOLDOWN = 20*60; static int STORINGENERGY_COOLDOWN = 20*50; + static int WILLPOWER_COOLDOWN = 20*50; + static int IGNORE_TARGET_DURATION = 20*20; static int GLOW_TIME = 20*1; static int WAIT_TIME = 20*10; @@ -59,11 +61,13 @@ public class EliteMonster { long last_regen_time=0; long last_burstcheck_time=0; long last_applyglow_time=0; + long last_willpower_increase=0; double hp_before_burstcheck=0; double last_leap_time=0; double last_enrage_time=0; double last_storingenergy_time=0; double last_storingenergy_health=0; + double last_ignoretarget_time=0; double storingenergy_hit=0; boolean leaping=false; boolean chasing=false; @@ -73,6 +77,12 @@ public class EliteMonster { Location myspawn = null; HashMap storedblocks = new HashMap(); BossBar bar = null; + BossBar willpower_bar = null; + boolean first_willpower_notification=false; + int scroll=0; + int willpower=0; + String arrow = "->"; + Player my_only_target=null; List targetlist = new ArrayList(); List participantlist = new ArrayList(); @@ -84,18 +94,22 @@ public class EliteMonster { m.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(DEFAULT_MOVE_SPD); this.hp_before_burstcheck=m.getHealth(); this.myspawn=m.getLocation(); - bar = m.getServer().createBossBar(m.getCustomName(), BarColor.RED, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG); + bar = m.getServer().createBossBar(m.getCustomName(), BarColor.WHITE, BarStyle.SEGMENTED_6, BarFlag.CREATE_FOG); + willpower_bar = m.getServer().createBossBar("Willpower", BarColor.PINK, BarStyle.SOLID, BarFlag.CREATE_FOG); } public void runTick() { //This monster constantly gives itself its buffs as it may lose some (Debilitation mode). + increaseBarTextScroll(); dontDrown(); rebuff(); regenerateHealth(); moveFasterToTarget(); resetToSpawn(); createBossHealthbar(); + ignoreAllOtherTargets(); if (m.isValid() && targetlist.size()>0) { + adjustWillpower(); weakenTeam(); retargetInAir(); destroyLiquids(2); @@ -103,14 +117,146 @@ public class EliteMonster { } } - private void createBossHealthbar() { - bar.removeAll(); - for (int i=0;i monsterlist = GenericFunctions.getNearbyMobs(m.getLocation(), 10); + mobcount=monsterlist.size()-1; + TwosideKeeper.log("Detected mob count: "+mobcount, 5); + if (mobcount>0) { + willpower+=mobcount; + last_willpower_increase=TwosideKeeper.getServerTickTime(); + if (!first_willpower_notification) { + for (int i=0;i=100) { + for (int i=0;i95) { + + } + } else { + if (willpower>0) { + willpower--; + } + } + } + } + + private void createBossHealthbar() { + List currentplayers = bar.getPlayers(); + for (int i=0;iTwosideKeeper.getServerTickTime()) { + for (int i=0;i81) { while (myspawn.getBlock().getRelative(0, -1, 0).getType()==Material.AIR && myspawn.getY()>1) { @@ -124,7 +270,10 @@ public class EliteMonster { Bukkit.getServer().broadcastMessage(generateDPSReport()); aPlugin.API.discordSendRaw(m.getCustomName()+" Takedown Failed...\n\n"+ChatColor.YELLOW+"DPS Breakdown:"+"\n```\n"+generateDPSReport()+"\n```"); } + bar.setColor(BarColor.WHITE); + first_willpower_notification=false; dpslist.clear(); + willpower=0; } } @@ -159,7 +308,7 @@ public class EliteMonster { } private void retargetInAir() { - if (Math.random()<=0.04) { + if (Math.random()<=0.02) { Player p = ChooseRandomTarget(); //p.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION,20*5,-31)); p.addPotionEffect(new PotionEffect(PotionEffectType.JUMP,20*5,-1)); @@ -202,6 +351,7 @@ public class EliteMonster { private void regenerateHealth() { if (m.getHealth() nearbyplayers = GenericFunctions.getNearbyPlayers(target_leap_loc, radius); + for (int i=0;iLast hit on "+time+". Current time: "+TwosideKeeper.getServerTickTime(), 2); if (time+10 ents = l.getWorld().getNearbyEntities(l, range, range, range); + //We cleared the non-living entities, deal damage to the rest. + for (Entity e : ents) { + double dodgechance = 0.0; + if (e instanceof Monster) { + Monster m = (Monster)e; + if (enoughTicksHavePassed(m,(Player)damager)) { + if (isLineDrive) { + basedmg=TwosideKeeperAPI.getFinalDamage(basedmg, damager, m, false, "Line Drive"); + basedmg*=1.0d+(4*((NewCombat.getPercentHealthMissing(m))/100d)); + } + if (knockup) { + m.setVelocity(new Vector(0,knockupamt,0)); + } + TwosideKeeperAPI.DealDamageToEntity(basedmg, m, damager,"Line Drive"); + if (m.isDead() && isLineDrive) { + Player p = (Player)damager; + PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); + pd.last_strikerspell = pd.last_strikerspell-40; + aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), (int)(TwosideKeeper.LINEDRIVE_COOLDOWN-(TwosideKeeper.getServerTickTime()-pd.last_strikerspell))); + } + updateNoDamageTickMap(m,(Player)damager); + } + } + } + } + + public static List getNearbyMobs(Location l, int range) { + Collection ents = l.getWorld().getNearbyEntities(l, range, range, range); + List monsterlist = new ArrayList(); + for (Entity e : ents) { + if ((e instanceof Monster)) { + monsterlist.add((Monster)e); + } + } + return monsterlist; + } public static List getNearbyPlayers(Location l, int range) { List players = new ArrayList(); @@ -3571,6 +3632,14 @@ public class GenericFunctions { Location testloc = loc; if ((testloc.getBlock().getType()==Material.PORTAL || testloc.getBlock().getType()==Material.ENDER_PORTAL) || + (testloc.getBlock().getRelative(0, 0, 1).getType()==Material.PORTAL || + testloc.getBlock().getRelative(0, 0, 1).getType()==Material.ENDER_PORTAL) || + (testloc.getBlock().getRelative(0, 0, -1).getType()==Material.PORTAL || + testloc.getBlock().getRelative(0, 0, -1).getType()==Material.ENDER_PORTAL) || + (testloc.getBlock().getRelative(-1, 0, 0).getType()==Material.PORTAL || + testloc.getBlock().getRelative(-1, 0, 0).getType()==Material.ENDER_PORTAL) || + (testloc.getBlock().getRelative(1, 0, 0).getType()==Material.PORTAL || + testloc.getBlock().getRelative(1, 0, 0).getType()==Material.ENDER_PORTAL) || testloc.getBlock().getRelative(0, 1, 0).getType()!=Material.AIR) { do { testloc = testloc.add(2-Math.random()*4,2-Math.random()*4,2-Math.random()*4); diff --git a/src/sig/plugin/TwosideKeeper/Logging/DamageLogger.java b/src/sig/plugin/TwosideKeeper/Logging/DamageLogger.java index 66f0f4c..9932eb7 100644 --- a/src/sig/plugin/TwosideKeeper/Logging/DamageLogger.java +++ b/src/sig/plugin/TwosideKeeper/Logging/DamageLogger.java @@ -58,6 +58,7 @@ public class DamageLogger { public void addEventToLogger(String name, double val) { if (val!=0.0) { + TwosideKeeper.log("Add "+name+" w/value "+val, 2); if (breakdownlist.containsKey(name)) { //Add to the already existing value. double dmg = breakdownlist.get(name); diff --git a/src/sig/plugin/TwosideKeeper/MonsterController.java b/src/sig/plugin/TwosideKeeper/MonsterController.java index b709e8e..36c3457 100644 --- a/src/sig/plugin/TwosideKeeper/MonsterController.java +++ b/src/sig/plugin/TwosideKeeper/MonsterController.java @@ -900,7 +900,7 @@ public class MonsterController { } public static boolean isChargeZombie(Monster m) { - if (m.getType()==EntityType.ZOMBIE && + if ((m.getType()==EntityType.ZOMBIE || m.getType()==EntityType.PIG_ZOMBIE) && MonsterController.getMonsterDifficulty((Monster)m)==MonsterDifficulty.HELLFIRE && !TwosideKeeper.chargezombies.contains((Monster)m)) { return true; diff --git a/src/sig/plugin/TwosideKeeper/NewCombat.java b/src/sig/plugin/TwosideKeeper/NewCombat.java index 155951c..760c2b9 100644 --- a/src/sig/plugin/TwosideKeeper/NewCombat.java +++ b/src/sig/plugin/TwosideKeeper/NewCombat.java @@ -66,7 +66,7 @@ public class NewCombat { } public static double applyDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike) { - return applyDamage(basedmg, target,damager,false,"Attack Base Damage"); + return applyDamage(basedmg, target,damager,false,""); } public static double applyDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) { @@ -107,7 +107,7 @@ public class NewCombat { } public static double calculatePlayerDamage(double basedmg,LivingEntity target, Entity damager, boolean isCriticalStrike) { - return calculatePlayerDamage(basedmg,target,damager,isCriticalStrike,"Attack Base Damage"); + return calculatePlayerDamage(basedmg,target,damager,isCriticalStrike,""); } public static double calculatePlayerDamage(double basedmg,LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) { @@ -177,7 +177,7 @@ public class NewCombat { } static double calculateTotalDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike) { - return calculateTotalDamage(basedmg,target,damager,isCriticalStrike,"Attack Base Damage"); + return calculateTotalDamage(basedmg,target,damager,isCriticalStrike,""); } static double calculateTotalDamage(double basedmg, LivingEntity target, Entity damager, boolean isCriticalStrike, String reason) { @@ -536,7 +536,7 @@ public class NewCombat { } public static double CalculateWeaponDamage(Entity damager, LivingEntity target,boolean useBow) { - return CalculateWeaponDamage(0,damager,target,useBow,"Attack Base Damage"); + return CalculateWeaponDamage(0,damager,target,useBow,""); } public static double CalculateWeaponDamage(double basedmg, Entity damager, LivingEntity target) { @@ -544,7 +544,7 @@ public class NewCombat { } public static double CalculateWeaponDamage(double basedmg, Entity damager, LivingEntity target, boolean useBow) { - return CalculateWeaponDamage(basedmg, damager,target,false,"Attack Base Damage"); + return CalculateWeaponDamage(basedmg, damager,target,false,""); } public static double CalculateWeaponDamage(double suppliedDmg, Entity damager, LivingEntity target, boolean useBow, String reason) { @@ -562,15 +562,23 @@ public class NewCombat { if (suppliedDmg!=0) { basedmg += suppliedDmg; - addToPlayerLogger(ent,reason,basedmg); + //addToPlayerLogger(ent,reason,suppliedDmg); } else { if (GenericFunctions.isArtifactEquip(weapon)) { double dmg = getBaseArtifactDamageByType(weapon); - addToPlayerLogger(ent,"Weapon Base Damage",dmg); + if (reason.length()>0) { + addToPlayerLogger(ent,reason,dmg); + } else { + addToPlayerLogger(ent,"Weapon Base Damage",dmg); + } basedmg += dmg; } else { double dmg = getBaseDamageByType(weapon); - addToPlayerLogger(ent,"Weapon Base Damage",dmg); + if (reason.length()>0) { + addToPlayerLogger(ent,reason,dmg); + } else { + addToPlayerLogger(ent,"Weapon Base Damage",dmg); + } basedmg += dmg; } } @@ -779,7 +787,7 @@ public class NewCombat { case STONE_SWORD:{ return 4.0; } - case GOLD_SWORD:{ + case GOLD_SWORD:{ return 10.0; } case IRON_SWORD:{ @@ -912,7 +920,7 @@ public class NewCombat { static double getPercentHealthRemaining(LivingEntity target) { return ((target.getHealth()/target.getMaxHealth())*100); } - static double getPercentHealthMissing(LivingEntity target) { + public static double getPercentHealthMissing(LivingEntity target) { return 100-getPercentHealthRemaining(target); } @@ -1015,18 +1023,22 @@ public class NewCombat { static double calculatePotionEffectMultiplier(LivingEntity damager) { double mult = 1.0; - double mult1 = 1.0+(GenericFunctions.getPotionEffectLevel(PotionEffectType.INCREASE_DAMAGE, damager)+1)*0.1; - addMultiplierToPlayerLogger(damager,"STRENGTH Mult",mult1); - mult *= mult1; - - int weaknesslv = Math.abs(GenericFunctions.getPotionEffectLevel(PotionEffectType.WEAKNESS, damager))+1; - if (weaknesslv<=10) { - mult1 = 1.0-(weaknesslv*0.1); - addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",mult1); - mult *= 1.0-(weaknesslv*0.1); - } else { - addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",0.0); - mult = 0.0; + if (damager.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) { + double mult1 = 1.0+(GenericFunctions.getPotionEffectLevel(PotionEffectType.INCREASE_DAMAGE, damager)+1)*0.1; + addMultiplierToPlayerLogger(damager,"STRENGTH Mult",mult1); + mult *= mult1; + } + + if (damager.hasPotionEffect(PotionEffectType.INCREASE_DAMAGE)) { + int weaknesslv = Math.abs(GenericFunctions.getPotionEffectLevel(PotionEffectType.WEAKNESS, damager))+1; + if (weaknesslv<=10) { + double mult1 = 1.0-(weaknesslv*0.1); + addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",-mult1); + mult *= 1.0-(weaknesslv*0.1); + } else { + addMultiplierToPlayerLogger(damager,ChatColor.RED+"WEAKNESS Mult",0.0); + mult = 0.0; + } } return mult; } @@ -1661,7 +1673,7 @@ public class NewCombat { for (int i=0;i monsters = GenericFunctions.getNearbyMobs(newpos, 2); + for (int i=0;i=0) { - NewCombat.setupTrueDamage(ev); //Apply this as true damage. - ev.setDamage(0); - //ev.setCancelled(true); + log("->Entity is of type "+ev.getEntity().getType()+", Damager is of type "+ev.getDamager().getType(),5); if (ev.getEntity() instanceof LivingEntity) { - ((LivingEntity)ev.getEntity()).setLastDamage(0); - ((LivingEntity)ev.getEntity()).setNoDamageTicks(0); - ((LivingEntity)ev.getEntity()).setMaximumNoDamageTicks(0); - final double oldhp=((LivingEntity)ev.getEntity()).getHealth(); - - if (ev.getEntity() instanceof Player) { - if (!GenericFunctions.AttemptRevive((Player)ev.getEntity(), dmg)) { - if (dmg < 1) { - ev.setDamage(DamageModifier.BASE,dmg); - ev.setDamage(dmg); - } else { - ev.setDamage(DamageModifier.BASE,1d); - ev.setDamage(1d); - ((Player)ev.getEntity()).setHealth(Math.max(((Player)ev.getEntity()).getHealth() - (dmg - 1d), 0.5)); - } - } else { + NewCombat.setupTrueDamage(ev); //Apply this as true damage. + ev.setDamage(0); + log("Entity is of type "+ev.getEntity().getType()+", Damager is of type "+ev.getDamager().getType(),5); + //ev.setCancelled(true); + if (ev.getEntity() instanceof LivingEntity) { + ((LivingEntity)ev.getEntity()).setLastDamage(0); + ((LivingEntity)ev.getEntity()).setNoDamageTicks(0); + ((LivingEntity)ev.getEntity()).setMaximumNoDamageTicks(0); + final double oldhp=((LivingEntity)ev.getEntity()).getHealth(); + + if (ev.getEntity() instanceof Player) { + if (!GenericFunctions.AttemptRevive((Player)ev.getEntity(), dmg)) { + if (dmg < 1) { + ev.setDamage(DamageModifier.BASE,dmg); + ev.setDamage(dmg); + } else { + ev.setDamage(DamageModifier.BASE,1d); + ev.setDamage(1d); + ((Player)ev.getEntity()).setHealth(Math.max(((Player)ev.getEntity()).getHealth() - (dmg - 1d), 0.5)); + } + } else { + ev.setCancelled(true); + } + dmg = NewCombat.calculateDefenderAbsorbtion(((LivingEntity)ev.getEntity()), dmg); + } + if (NewCombat.getDamagerEntity(ev.getDamager()) instanceof Monster && + ev.getEntity() instanceof LivingEntity) { + for (int i=0;i"+((LivingEntity)ev.getEntity()).getHealth()+" HP",3); - } - }},1); - if (ev.getDamager() instanceof Player) { - Player p = (Player)ev.getDamager(); - if (GenericFunctions.isEquip(p.getEquipment().getItemInMainHand())) { - aPlugin.API.damageItem(p, p.getEquipment().getItemInMainHand(), 1); + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + public void run() { + if (oldhp != ((LivingEntity)ev.getEntity()).getHealth()) { + log(ChatColor.BLUE+" "+oldhp+"->"+((LivingEntity)ev.getEntity()).getHealth()+" HP",3); + } + }},1); + if (ev.getDamager() instanceof Player) { + Player p = (Player)ev.getDamager(); + if (GenericFunctions.isEquip(p.getEquipment().getItemInMainHand())) { + aPlugin.API.damageItem(p, p.getEquipment().getItemInMainHand(), 1); + } + GenericFunctions.knockOffGreed(p); } - GenericFunctions.knockOffGreed(p); - } - //aPlugin.API.showDamage((LivingEntity)ev.getEntity(), (int)(dmg/10)); + //aPlugin.API.showDamage((LivingEntity)ev.getEntity(), (int)(dmg/10)); + } } } //Negative damage doesn't make sense. We'd apply it normally. } @@ -4897,7 +4915,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { GenericFunctions.DealDamageToMob(reduceddmg, affected.get(i), Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]), Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]).getEquipment().getItemInMainHand()); } else if (ev.getEntity().getCustomName().contains("LD ")) { - Player p = Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]); + /*Player p = Bukkit.getPlayer(ev.getEntity().getCustomName().split(" ")[2]); //LEGACY LINE DRIVE CODE. double dmgdealt=Double.parseDouble(ev.getEntity().getCustomName().split(" ")[1]); dmgdealt*=1.0d+(4*((NewCombat.getPercentHealthMissing((Monster)affected.get(i)))/100d)); log("Dealing "+dmgdealt+" damage. Player is "+p.getName(),5); @@ -4910,7 +4928,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); pd.last_strikerspell = pd.last_strikerspell-40; aPlugin.API.sendCooldownPacket(p, p.getEquipment().getItemInMainHand(), (int)(LINEDRIVE_COOLDOWN-(TwosideKeeper.getServerTickTime()-pd.last_strikerspell))); - } + }*/ } else { affected.remove(i); i--; @@ -5361,6 +5379,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.getProjectile().getType()==EntityType.TIPPED_ARROW)) { //Now we know this is a player who shot a regular old arrow. final Player p = (Player)ev.getEntity(); + ev.getProjectile().setCustomName("HIT"); //We need to give one back to them. if (ev.getProjectile().getType()==EntityType.ARROW) { //This was an arrow quiver. We need to verify that, check the player's inventory for one. diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java b/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java index c3ad7c9..e182449 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeperAPI.java @@ -195,6 +195,14 @@ public final class TwosideKeeperAPI { public static double getFinalDamage(double dmg, Entity damager, LivingEntity target, boolean isCriticalStrike, String reason) { return NewCombat.applyDamage(dmg, target, damager, isCriticalStrike, reason); } + /** + * Makes the target vulnerable to the damager again by removing their last hit time. + * @param damager The damager that will have their no damage tick flag removed. + * @param target The target that will be vulnerable to the damager again. + */ + public static void removeNoDamageTick(LivingEntity damager, LivingEntity target) { + GenericFunctions.removeNoDamageTick(target, damager); + } //Message COMMANDS. public static void playMessageNotification(Player sender) {