diff --git a/.project b/.project index fa4bf2d..7eeece6 100644 --- a/.project +++ b/.project @@ -24,11 +24,4 @@ org.eclipse.jdt.core.javanature - - - jgrapht - 2 - C:/Applications/Eclipse.app/Contents/MacOS/D::/Data/jgrapht-1.0.1/jgrapht-1.0.1/source/jgrapht-core/src/main/java - - diff --git a/TwosideKeeper.jar b/TwosideKeeper.jar index e8e8010..11eb983 100644 Binary files a/TwosideKeeper.jar and b/TwosideKeeper.jar differ diff --git a/src/plugin.yml b/src/plugin.yml index e96135b..05a074d 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -1,6 +1,6 @@ name: TwosideKeeper main: sig.plugin.TwosideKeeper.TwosideKeeper -version: 3.12.1b +version: 3.12.1b1 loadbefore: [aPlugin] commands: money: diff --git a/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java b/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java index 53dcb64..09f3ed3 100644 --- a/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java +++ b/src/sig/plugin/TwosideKeeper/ActionBarBuffUpdater.java @@ -88,6 +88,16 @@ public class ActionBarBuffUpdater{ if (pd.vendetta_amt>0 && effectString.length()==0) { } + if (pd.lastusedRejuvenation+GenericFunctions.GetModifiedCooldown(TwosideKeeper.REJUVENATION_COOLDOWN, (Player)p)>TwosideKeeper.getServerTickTime()) { + effectString.append(ChatColor.GREEN); + effectString.append(ChatColor.BOLD); + effectString.append(ChatColor.UNDERLINE); + effectString.append("Rejuvenation"); + int timeRemaining = (int)((pd.lastusedRejuvenation+GenericFunctions.GetModifiedCooldown(TwosideKeeper.REJUVENATION_COOLDOWN, (Player)p))-TwosideKeeper.getServerTickTime()); + effectString.append(ConvertBuffTimeToIcon(timeRemaining)); + effectString.append(ChatColor.RESET); + effectString.append(" "); + } } HashMap buffMap = Buff.getBuffData(p); for (String s : buffMap.keySet()) { diff --git a/src/sig/plugin/TwosideKeeper/ChallengeReward.java b/src/sig/plugin/TwosideKeeper/ChallengeReward.java index 52268df..c069a07 100644 --- a/src/sig/plugin/TwosideKeeper/ChallengeReward.java +++ b/src/sig/plugin/TwosideKeeper/ChallengeReward.java @@ -132,28 +132,25 @@ public class ChallengeReward { switch (rank) { case 1:{ return new ItemStack[]{ - Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,5), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_ESSENCE,8), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_CORE,4), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_BASE,2), + Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,2), + Artifact.createArtifactItem(ArtifactItem.ARTIFACT_ESSENCE,2), + Artifact.createArtifactItem(ArtifactItem.ARTIFACT_CORE,1), }; } case 2:{ return new ItemStack[]{ - Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,3), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_ESSENCE,4), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_CORE,2), - Artifact.createArtifactItem(ArtifactItem.ARTIFACT_BASE,1), + Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,1), + Artifact.createArtifactItem(ArtifactItem.ARTIFACT_ESSENCE,1), }; } case 3:{ return new ItemStack[]{ - Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,3), + Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,1), }; } case 438190894:{ return new ItemStack[]{ - Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,5), + Artifact.createArtifactItem(ArtifactItem.MYSTERIOUS_ESSENCE,2), }; } default:{ diff --git a/src/sig/plugin/TwosideKeeper/CustomDamage.java b/src/sig/plugin/TwosideKeeper/CustomDamage.java index 0ae4a8b..c079ed8 100644 --- a/src/sig/plugin/TwosideKeeper/CustomDamage.java +++ b/src/sig/plugin/TwosideKeeper/CustomDamage.java @@ -168,7 +168,9 @@ public class CustomDamage { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); pd.lasthitproperties=NONE; } + //TwosideKeeper.log(GenericFunctions.getDisplayName(target)+" has been hit for "+damage+" damage.", 0); if (!InvulnerableCheck(damager,damage,target,weapon,reason,flags)) { + //TwosideKeeper.log("Passed Invulnerable check.", 0); double dmg = 0.0; if (isFlagSet(flags,TRUEDMG)) { //TwosideKeeper.log("Reason: "+reason, 0); @@ -182,8 +184,6 @@ public class CustomDamage { } else { dmg = CalculateDamage(damage, damager, target, weapon, reason, flags); } - dmg += CalculateBonusTrueDamage(damager, target, dmg); - dmg += CalculatePVPDamageReduction(damager,target,dmg); if (damager!=null) { TwosideKeeper.logHealth(target,target.getHealth(),dmg,damager); } @@ -194,6 +194,7 @@ public class CustomDamage { setupDamagePropertiesForPlayer(damager,((reason!=null && reason.equalsIgnoreCase("thorns"))?IS_THORNS:0)); if (!ev.isCancelled()) { + dmg = ev.getDamage(); //TwosideKeeper.log("Inside of here.", 0); LivingEntity shooter = getDamagerEntity(damager); if (shooter instanceof Player && target instanceof Player) { @@ -213,6 +214,22 @@ public class CustomDamage { } } + private static double CalculateWellTimedBlockDamage(double damage, LivingEntity target) { + //TwosideKeeper.log("In here. Damage: "+damage+" Target: "+GenericFunctions.getDisplayName(target), 0); + if (target instanceof Player && PlayerMode.isDefender((Player)target)) { + PlayerStructure pd = PlayerStructure.GetPlayerStructure((Player)target); + //TwosideKeeper.log("Time is "+TwosideKeeper.getServerTickTime()+". Last block was at "+pd.lastblock, 0); + if (pd.lastblock+5>TwosideKeeper.getServerTickTime()) { + /*TwosideKeeper.log("This is a well timed block! Halve the damage.", 0); + TwosideKeeper.log("Old damage: "+damage,0); + TwosideKeeper.log("New damage: "+(damage/2),0);*/ + pd.lastblock=0; //Reset so they can perform another block. + return damage/2; + } + } + return damage; + } + private static double CalculatePVPDamageReduction(Entity damager, LivingEntity target, double dmg) { double dmgIncrease=0; LivingEntity shooter = getDamagerEntity(damager); @@ -392,6 +409,9 @@ public class CustomDamage { setupDamagePropertiesForPlayer(damager,((crit)?IS_CRIT:0)|((headshot)?IS_HEADSHOT:0)|((preemptive)?IS_PREEMPTIVE:0),true); dmg = hardCapDamage(dmg+armorpendmg,target,reason); + dmg += CalculateBonusTrueDamage(damager, target, dmg); + dmg += CalculatePVPDamageReduction(damager,target,dmg); + dmg = CalculateWellTimedBlockDamage(dmg,target); return dmg; } @@ -772,7 +792,7 @@ public class CustomDamage { restoreHealthToPartyMembersWithProtectorSet(p); applySustenanceSetonHitEffects(p); reduceStrengthAmountForStealthSet(p); - handleBlockStacks(p); + damage = handleBlockStacks(p,damage); if (!isFlagSet(flags,NOAOE)) { if (damage0) { - pd.blockStacks--; - GenericFunctions.sendActionBarMessage(p, "", true); - pd.customtitle.updateSideTitleStats(p); - } } } return damage; @@ -2055,7 +2077,7 @@ public class CustomDamage { }*/ } - static void setAggroGlowTickTime(Monster m, int duration) { + public static void setAggroGlowTickTime(Monster m, int duration) { //m.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING,duration,0,true,true),true); GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.GLOWING, duration, 0, m); } @@ -2071,7 +2093,7 @@ public class CustomDamage { } } - static void provokeMonster(LivingEntity m, Player p, ItemStack weapon) { + public static void provokeMonster(LivingEntity m, Player p, ItemStack weapon) { if (!m.hasPotionEffect(PotionEffectType.GLOWING)) { setMonsterTarget(m,p); } @@ -2519,14 +2541,14 @@ public class CustomDamage { private static void refundRejuvenationCooldown(Player p) { PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); - pd.last_rejuvenate-=40; - int remainingtime = GenericFunctions.GetRemainingCooldownTime(p, pd.last_rejuvenate, TwosideKeeper.REJUVENATE_COOLDOWN); + pd.last_mobcontrol-=40; + int remainingtime = GenericFunctions.GetRemainingCooldownTime(p, pd.last_mobcontrol, TwosideKeeper.MOBCONTROL_COOLDOWN); if (remainingtime>0) { aPluginAPIWrapper.sendCooldownPacket(p, Material.SHIELD, remainingtime); } } - private static double GetAttackRate(Entity damager) { + public static double GetAttackRate(Entity damager) { double attackrate = 0.0; if (damager instanceof Player) { Player p = (Player)damager; @@ -2638,6 +2660,11 @@ public class CustomDamage { if (PlayerMode.getPlayerMode(p)==PlayerMode.DEFENDER) { GenericFunctions.HealEntity(p, p.getMaxHealth()*0.05); } + if (pd.blockStacks>0) { + pd.blockStacks--; + GenericFunctions.sendActionBarMessage(p, "", true); + pd.customtitle.updateSideTitleStats(p); + } return true; } return false; @@ -2745,7 +2772,8 @@ public class CustomDamage { } if ((pd.fulldodge || pd.slayermegahit || - Buff.hasBuff(p, "BEASTWITHIN")) && !PVP.isPvPing(p)) { + Buff.hasBuff(p, "BEASTWITHIN") || + (PlayerMode.getPlayerMode(p)==PlayerMode.DEFENDER && DefenderStance.getDefenderStance(p)==DefenderStance.TANK && pd.blockStacks>0)) && !PVP.isPvPing(p)) { dodgechance = 1.0; } @@ -2779,6 +2807,7 @@ public class CustomDamage { double artifactmult = 0; double dodgechancemult = 0; double defenderstancemult = 0; + double defendersetmult = 0; if (getDamagerEntity(damager) instanceof Player) { Player p = (Player)getDamagerEntity(damager); @@ -2797,6 +2826,10 @@ public class CustomDamage { defenderstancemult = 0.5; } } + if (ItemSet.hasFullSet(p, ItemSet.SONGSTEEL)) { + int tier = ItemSet.getHighestTierInSet(p, ItemSet.SONGSTEEL); + defendersetmult = (0.1*tier)+0.2; + } } if (target instanceof LivingEntity) { @@ -3047,6 +3080,7 @@ public class CustomDamage { *(1d-artifactmult) *(1d-dodgechancemult) *(1d-defenderstancemult) + *(1d-defendersetmult) *setbonus *((target instanceof Player && ((Player)target).isBlocking())?(PlayerMode.isDefender((Player)target))?0.30:0.50:1) *((target instanceof Player)?((PlayerMode.isDefender((Player)target))?(target.getEquipment().getItemInOffHand()!=null && target.getEquipment().getItemInOffHand().getType()==Material.SHIELD)?0.8:0.9:(target.getEquipment().getItemInOffHand()!=null && target.getEquipment().getItemInOffHand().getType()==Material.SHIELD)?0.95:1):1); diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java index 73711fc..50c61e3 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Common/GenericFunctions.java @@ -105,6 +105,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Utils.BlockUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.DebugUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.ItemCubeUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.ItemUtils; +import sig.plugin.TwosideKeeper.HelperStructures.Utils.MovementUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.SoundUtils; import sig.plugin.TwosideKeeper.HelperStructures.Utils.TextUtils; @@ -3203,14 +3204,44 @@ public class GenericFunctions { CustomDamage.addIframe(ticks, p); } - public static void PerformRejuvenate(Player player) { + public static void PerformMobControl(Player player) { PlayerStructure pd = (PlayerStructure)TwosideKeeper.playerdata.get(player.getUniqueId()); - if (pd.last_rejuvenate+GetModifiedCooldown(TwosideKeeper.REJUVENATE_COOLDOWN,player)<=TwosideKeeper.getServerTickTime()) { - SoundUtils.playGlobalSound(player.getLocation(), Sound.ENTITY_ZOMBIE_VILLAGER_CURE, 1.0f, 1.0f); - addIFrame(player,40); - //GenericFunctions.logAndApplyPotionEffectToEntity(PotionEffectType.REGENERATION,200,9,player,true); - aPluginAPIWrapper.sendCooldownPacket(player, player.getEquipment().getItemInMainHand(), GetModifiedCooldown(TwosideKeeper.REJUVENATE_COOLDOWN,player)); + boolean hasFullSet = ItemSet.hasFullSet(player, ItemSet.DAWNTRACKER); + List le = GenericFunctions.getNearbyMobs(player.getLocation(), 16); + for (LivingEntity ent : le) { + boolean allowed=true; + if (ent instanceof Player && PVP.isFriendly(player, (Player)ent)) { + allowed=false; + } + if (allowed) { + /*if (ent instanceof LivingEntity) { + GenericFunctions.addStackingPotionEffect(ent, PotionEffectType.WEAKNESS, 20*15, 5, 2); + }*/ + if (ent instanceof Monster) { + CustomDamage.provokeMonster((Monster)ent, player, player.getEquipment().getItemInMainHand()); + CustomDamage.setAggroGlowTickTime((Monster)ent, 20*15); + } + } } + LivingEntity target = aPlugin.API.rayTraceTargetEntity(player, 32); + if (target!=null) { + Vector pullVelocity = MovementUtils.getVelocityTowardsLocation(target.getLocation(), player.getLocation(), Math.min(player.getLocation().distance(target.getLocation()),4)); + if (pullVelocity.getY()>0) { + pullVelocity.setY(Math.min(pullVelocity.getY(), 1)); + } else { + pullVelocity.setY(Math.max(pullVelocity.getY(), -1)); + } + target.setVelocity(pullVelocity); + LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(target); + les.increaseAggro(player, 1000); + } + TwosideKeeper.aggroMonsters(player,pd,(500+((hasFullSet)?(ItemSet.getHighestTierInSet(player, ItemSet.DAWNTRACKER)*1000):0)*pd.blockStacks),16); + pd.last_mobcontrol = TwosideKeeper.getServerTickTime()-(pd.blockStacks*20); + TwosideKeeper.log("Time is "+TwosideKeeper.getServerTickTime()+". Mob control is now "+pd.last_mobcontrol, 0); + pd.blockStacks=0; + GenericFunctions.sendActionBarMessage(player, "", true); + pd.customtitle.updateSideTitleStats(player); + aPluginAPIWrapper.sendCooldownPacket(player, player.getEquipment().getItemInMainHand(), GetModifiedCooldown((int)(TwosideKeeper.MOBCONTROL_COOLDOWN-(TwosideKeeper.getServerTickTime()-pd.last_mobcontrol)),player)); } public static boolean isArmoredMob(LivingEntity m) { diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java index f4494ac..92af07a 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/ItemSet.java @@ -26,7 +26,7 @@ import sig.plugin.TwosideKeeper.HelperStructures.Utils.TextUtils; public enum ItemSet { PANROS(1,1, 6,4, 10,10, 20,10, 1,6,10,20), - SONGSTEEL(50,50, 6,2, 8,8, 20,10, 4, 6, 8, 20), + SONGSTEEL(50,50, 10,5, 8,8, 30,10, 4, 6, 8, 20), DAWNTRACKER(2,2, 20,10, 10,5, 10,5, 2, 20, 10, 10), LORASYS(2,2, 0,0, 0,0, 0,0, 2, 0, 0, 0), JAMDAK(3,3, 5,1, 10,1, 10,2, 3, 5, 10, 10), //Graceful Dodge is in ticks. @@ -51,8 +51,8 @@ public enum ItemSet { LUCI(2,2, 4,4, 1,0, 1,0, 2, 4, 1, 1), SHARD(2,1, 10,10, 20,20, 10,10, 2, 10, 20, 10), TOXIN(2,2, 20,5, 10,3, 10,3, 2, 20, 10, 10), - PROTECTOR(5,2, 10,5, 10,10, 1,1, 5, 10, 10, 1), - SUSTENANCE(8,4, 2,2, 1,1, 10,10, 8, 2, 1, 10), + PROTECTOR(5,2, 20,5, 10,10, 1,1, 5, 10, 10, 1), + SUSTENANCE(8,4, 6,4, 1,1, 10,10, 8, 2, 1, 10), LEGION(3,1, 12,12, 1,1, 1,1, 3, 12, 1, 1), PRIDE(10,10, 2,1, 2,2, 1,1, 10, 2, 2, 1), ASSASSIN(5,5, 0,0, 0,0, 0,0, 5, 0, 0, 0), @@ -611,12 +611,10 @@ public enum ItemSet { lore.add(ChatColor.GRAY+" time in another direction."); }break; case SONGSTEEL:{ - lore.add(ChatColor.WHITE+"Successful blocks reduce the cooldown of "); - lore.add(ABILITY_LABEL+"Rejuvenation"+ABILITY_LABEL_END+" by 2 seconds."); lore.add(ChatColor.WHITE+""+ChatColor.ITALIC+""); lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); lore.add(ChatColor.DARK_AQUA+" 2 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 2, p)+" Max Health"); - lore.add(ChatColor.DARK_AQUA+" 3 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 3, p)+" Absorption Health (30 seconds)"); + lore.add(ChatColor.DARK_AQUA+" 3 - "+ABILITY_LABEL+" Rejuvenation removes all Debuffs"+ABILITY_LABEL_END); lore.add(ChatColor.DARK_AQUA+" 4 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 4, p)+"% Damage Reduction"); lore.add(ChatColor.DARK_AQUA+" 5 - "+ABILITY_LABEL+" Vendetta"+ABILITY_LABEL_END); lore.add(ChatColor.GRAY+" Blocking stores 40% of mitigation damage."); @@ -625,6 +623,8 @@ public enum ItemSet { lore.add(ChatColor.GRAY+" all of your stored mitigation damage."); lore.add(ChatColor.GRAY+" Vendetta stacks wear off after 10 seconds."); lore.add(ChatColor.GRAY+" Can be refreshed by basic attacking monsters."); + lore.add(ChatColor.WHITE+" +"+((10*tier)+20)+"% Damage Reduction"); + lore.add(ChatColor.WHITE+" +"+((tier*20)+30)+" Health"); }break; case DAWNTRACKER:{ lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); @@ -979,14 +979,14 @@ public enum ItemSet { lore.add(ChatColor.DARK_AQUA+" 4 - "+ABILITY_LABEL+" Reinforce"+ABILITY_LABEL_END+" - Each hit taken restores"); lore.add(" "+ChatColor.WHITE+" "+ItemSet.GetBaseAmount(set, tier, 4, p)+" Health to other party members."); lore.add(ChatColor.DARK_AQUA+" 5 - "+ABILITY_LABEL+" Unstoppable Team"+ABILITY_LABEL_END); - lore.add(ChatColor.GRAY+" Press the swap item key to channel for 3 seconds,"); - lore.add(ChatColor.GRAY+" creating a "+(tier*20)+" Health shield for 30"); - lore.add(ChatColor.GRAY+" seconds on all party members."); + lore.add(ChatColor.GRAY+" Press the swap item key while Rejuvenation is on cooldown"); + lore.add(ChatColor.GRAY+" to channel for 3 seconds, creating a "+(tier*20)+" Health"); + lore.add(ChatColor.GRAY+" shield for 30 seconds on all party members."); lore.add(ChatColor.GRAY+" "); lore.add(ChatColor.GRAY+" (150 second cooldown)"); lore.add(ChatColor.GRAY+" "); - lore.add(ChatColor.WHITE+" +50% Armor Penetration"); - lore.add(ChatColor.WHITE+" +20 Damage"); + lore.add(ChatColor.WHITE+" +"+(tier*10)+"% Party Damage Reduction"); + lore.add(ChatColor.WHITE+" +"+(tier*5)+" Party Health"); break; case SHARD: lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); @@ -1038,10 +1038,13 @@ public enum ItemSet { lore.add(ChatColor.DARK_AQUA+" 4 - "+ChatColor.WHITE+" +"+ItemSet.GetBaseAmount(set, tier, 4, p)+"% Healing per Regeneration tick"); lore.add(ChatColor.DARK_AQUA+" 5 - "+ABILITY_LABEL+" Share the Life"+ABILITY_LABEL_END); lore.add(ChatColor.GRAY+" Increases the Regeneration Pool for other party"); - lore.add(ChatColor.GRAY+" members by "+(tier)+" whenever you get hit."); + lore.add(ChatColor.GRAY+" members by "+(tier)+" whenever you get hit. When"); + lore.add(ChatColor.GRAY+" party members are below half health, they will slowly"); + lore.add(ChatColor.GRAY+" steal health from you as long as your Health is above"); + lore.add(ChatColor.GRAY+" 50%."); lore.add(ChatColor.GRAY+" "); - lore.add(ChatColor.WHITE+" +50% Armor Penetration"); - lore.add(ChatColor.WHITE+" +20 Damage"); + lore.add(ChatColor.WHITE+" +"+(tier*25)+"% Lifesteal"); + lore.add(ChatColor.WHITE+" +"+(tier*25)+" Health"); break; case TOXIN: lore.add(ChatColor.GOLD+""+ChatColor.ITALIC+"Set Bonus:"); diff --git a/src/sig/plugin/TwosideKeeper/HelperStructures/Utils/MovementUtils.java b/src/sig/plugin/TwosideKeeper/HelperStructures/Utils/MovementUtils.java index 9915f4b..1ba769f 100644 --- a/src/sig/plugin/TwosideKeeper/HelperStructures/Utils/MovementUtils.java +++ b/src/sig/plugin/TwosideKeeper/HelperStructures/Utils/MovementUtils.java @@ -5,7 +5,7 @@ import org.bukkit.block.BlockFace; import org.bukkit.util.Vector; public class MovementUtils { - public static Vector moveTowardsLocation(Location currloc, Location targetloc, double spd) { + public static Vector getVelocityTowardsLocation(Location currloc, Location targetloc, double spd) { /*double deltax = currloc.getX()-targetloc.getX(); double deltay = currloc.getY()-targetloc.getY(); double deltaz = currloc.getZ()-targetloc.getZ(); diff --git a/src/sig/plugin/TwosideKeeper/Monster/HellfireGhast.java b/src/sig/plugin/TwosideKeeper/Monster/HellfireGhast.java index 3d0cd72..ceb31c9 100644 --- a/src/sig/plugin/TwosideKeeper/Monster/HellfireGhast.java +++ b/src/sig/plugin/TwosideKeeper/Monster/HellfireGhast.java @@ -51,11 +51,11 @@ public class HellfireGhast extends CustomMonster{ //Begin charging towards player. m.setAI(false); if (target!=null && target.isValid() && !target.isDead() && target.getWorld().equals(m.getWorld())) { - m.setVelocity(MovementUtils.moveTowardsLocation(m.getLocation(), target.getLocation(), 2)); + m.setVelocity(MovementUtils.getVelocityTowardsLocation(m.getLocation(), target.getLocation(), 2)); } else { target = FindClosestNearbyTarget(); if (target!=null) { - m.setVelocity(MovementUtils.moveTowardsLocation(m.getLocation(), target.getLocation(), 2)); + m.setVelocity(MovementUtils.getVelocityTowardsLocation(m.getLocation(), target.getLocation(), 2)); } } if (m.getLocation().distanceSquared(target.getLocation())<49) { diff --git a/src/sig/plugin/TwosideKeeper/PlayerStructure.java b/src/sig/plugin/TwosideKeeper/PlayerStructure.java index 1dcc336..dc36c0c 100644 --- a/src/sig/plugin/TwosideKeeper/PlayerStructure.java +++ b/src/sig/plugin/TwosideKeeper/PlayerStructure.java @@ -91,7 +91,7 @@ public class PlayerStructure { public boolean fulldodge=false; public long last_arrowbarrage=TwosideKeeper.getServerTickTime(); public long last_laugh_time=TwosideKeeper.getServerTickTime(); - public long last_rejuvenate=TwosideKeeper.getServerTickTime(); + public long last_mobcontrol=TwosideKeeper.getServerTickTime(); public DamageLogger damagedata; public boolean damagelogging=false; public boolean hasDied=false; @@ -254,6 +254,7 @@ public class PlayerStructure { public long lastInfectionTick=0; public long lastCrippleTick=0; public long lastBurnTick=0; + public long lastusedRejuvenation=0; public float MoveSpeedMultBeforeCripple=1f; public Channel currentChannel=null; public long lastFailedCastTime=0; @@ -341,13 +342,14 @@ public class PlayerStructure { this.isViewingInventory=false; this.destroyedminecart=false; this.last_laugh_time=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; - this.last_rejuvenate=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; + this.last_mobcontrol=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastassassinatetime=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastlifesavertime=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastusedwindslash=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.icewandused=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastusedbeastwithin=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.lastusedunstoppableteam=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; + this.lastusedRejuvenation=(TwosideKeeper.getServerType()==ServerType.MAIN)?TwosideKeeper.getServerTickTime():0; this.damagedata = new DamageLogger(p); this.damagelogging=false; this.isPlayingSpleef=false; @@ -423,7 +425,7 @@ public class PlayerStructure { applyCooldownToAllTypes(p,"HOE",GenericFunctions.GetRemainingCooldownTime(p, pd.last_deathmark, TwosideKeeper.DEATHMARK_COOLDOWN)); applyCooldownToAllTypes(p,"SPADE",GenericFunctions.GetRemainingCooldownTime(p, pd.lastusedearthwave, TwosideKeeper.EARTHWAVE_COOLDOWN)); applyCooldownToAllTypes(p,"SWORD",GenericFunctions.GetRemainingCooldownTime(p, pd.last_strikerspell, TwosideKeeper.LINEDRIVE_COOLDOWN)); - aPluginAPIWrapper.sendCooldownPacket(p, Material.SHIELD, GenericFunctions.GetRemainingCooldownTime(p, pd.last_rejuvenate, TwosideKeeper.REJUVENATE_COOLDOWN)); + aPluginAPIWrapper.sendCooldownPacket(p, Material.SHIELD, GenericFunctions.GetRemainingCooldownTime(p, pd.last_mobcontrol, TwosideKeeper.MOBCONTROL_COOLDOWN)); aPluginAPIWrapper.sendCooldownPacket(p, Material.SKULL_ITEM, GenericFunctions.GetRemainingCooldownTime(p, pd.lastlifesavertime, TwosideKeeper.LIFESAVER_COOLDOWN)); aPluginAPIWrapper.sendCooldownPacket(p, Material.CHORUS_FLOWER, GenericFunctions.GetRemainingCooldownTime(p, pd.lastlifesavertime, TwosideKeeper.LIFESAVER_COOLDOWN)); aPluginAPIWrapper.sendCooldownPacket(p, Material.WATCH, GenericFunctions.GetRemainingCooldownTime(p, pd.icewandused, TwosideKeeper.ICEWAND_COOLDOWN)); @@ -509,7 +511,7 @@ public class PlayerStructure { workable.set("COOLDOWN_usedearthwave", lastusedearthwave); workable.set("COOLDOWN_arrowbarrage", last_arrowbarrage); workable.set("COOLDOWN_laughtime", last_laugh_time); - workable.set("COOLDOWN_rejuvenate", last_rejuvenate); + workable.set("COOLDOWN_rejuvenate", last_mobcontrol); workable.set("COOLDOWN_swordhit", last_swordhit); workable.set("COOLDOWN_strikerspell", last_strikerspell); workable.set("COOLDOWN_absorptionhealthgiven", lastabsorptionhealthgiven); @@ -621,7 +623,7 @@ public class PlayerStructure { workable.addDefault("COOLDOWN_usedearthwave", lastusedearthwave); workable.addDefault("COOLDOWN_arrowbarrage", last_arrowbarrage); workable.addDefault("COOLDOWN_laughtime", last_laugh_time); - workable.addDefault("COOLDOWN_rejuvenate", last_rejuvenate); + workable.addDefault("COOLDOWN_rejuvenate", last_mobcontrol); workable.addDefault("COOLDOWN_swordhit", last_swordhit); workable.addDefault("COOLDOWN_strikerspell", last_strikerspell); workable.addDefault("COOLDOWN_absorptionhealthgiven", lastabsorptionhealthgiven); @@ -695,7 +697,7 @@ public class PlayerStructure { this.lastusedearthwave = workable.getLong("COOLDOWN_usedearthwave"); this.last_arrowbarrage = workable.getLong("COOLDOWN_arrowbarrage"); this.last_laugh_time = workable.getLong("COOLDOWN_laughtime"); - this.last_rejuvenate = workable.getLong("COOLDOWN_rejuvenate"); + this.last_mobcontrol = workable.getLong("COOLDOWN_rejuvenate"); this.last_swordhit = workable.getLong("COOLDOWN_swordhit"); this.last_strikerspell = workable.getLong("COOLDOWN_strikerspell"); this.lastabsorptionhealthgiven = workable.getLong("COOLDOWN_absorptionhealthgiven"); diff --git a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java index 60228b3..52e81aa 100644 --- a/src/sig/plugin/TwosideKeeper/TwosideKeeper.java +++ b/src/sig/plugin/TwosideKeeper/TwosideKeeper.java @@ -308,6 +308,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public final static int CUSTOM_DAMAGE_IDENTIFIER = 500000; + public final static int DAMAGE_QUEUE_MAX_BUFFER = 4; //How many damage events to handle at once. + public final static int ITEM_QUEUE_MAX_BUFFER = 2; //How many item events to handle at once. + public static long SERVERTICK=0; //This is the SERVER's TOTAL TICKS when first loaded. public static long STARTTIME=0; public static long LASTSERVERCHECK=0; @@ -355,6 +358,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public static List lavaplume_list = new ArrayList(); public static long LAST_SPECIAL_SPAWN = 0; public static long LAST_WEEKLY_RESET = 0; + public static List recentnumbers = new ArrayList(); public static CustomItem HUNTERS_COMPASS; public static CustomItem UPGRADE_SHARD; @@ -482,7 +486,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public static final int EARTHWAVE_COOLDOWN=100; public static final int ERUPTION_COOLDOWN=100; public static final int LINEDRIVE_COOLDOWN=240; - public static final int REJUVENATE_COOLDOWN=6000; + public static final int MOBCONTROL_COOLDOWN=200; public static final int ASSASSINATE_COOLDOWN=200; public static final int LIFESAVER_COOLDOWN=6000; public static final int ARROWBARRAGE_COOLDOWN=2400; @@ -492,6 +496,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { public static final int WINDSLASH_COOLDOWN = 100; public static final int BEASTWITHIN_COOLDOWN = 2400; public static final int UNSTOPPABLETEAM_COOLDOWN = 3000; + public static final int REJUVENATION_COOLDOWN = 600; public static final int BUFFER_LIMIT_STRUCTURE_HANDLING = 50; //Number of milliseconds Structure handling is allowed to run max. public static final int BUFFER_LIMIT_HEARTBEAT = 50; //Number of milliseconds Heartbeat is allowed to run max. @@ -824,10 +829,10 @@ public class TwosideKeeper extends JavaPlugin implements Listener { runServerHeartbeat.runVacuumCubeSuckup(p,itemsIgnored); TwosideKeeper.HeartbeatLogger.AddEntry("Player Cycle Handling->Vacuum Cube Handling", (int)(System.nanoTime()-time1));time1=System.nanoTime(); - if (PlayerStructure.GetPlayerStructure(p).last_rejuvenate+200>TwosideKeeper.getServerTickTime()) { + /*if (PlayerStructure.GetPlayerStructure(p).last_mobcontrol+200>TwosideKeeper.getServerTickTime()) { GenericFunctions.HealEntity(p, 5); TwosideKeeper.HeartbeatLogger.AddEntry("Player Cycle Handling->Rejuvenate Handling", (int)(System.nanoTime()-time1));time1=System.nanoTime(); - } + }*/ /*if (p.getVehicle() instanceof EnderDragon) { EnderDragon ed = (EnderDragon)p.getVehicle(); ed.setVelocity(p.getLocation().getDirection().multiply(2.0f)); @@ -1353,7 +1358,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { getServer().getScheduler().runTaskLaterAsynchronously(this, new DiscordStatusUpdater(), 300l); - getServer().getScheduler().scheduleSyncRepeatingTask(this, new ReapplyAbsorptionHeartsFromSet(),0l,600l); + //getServer().getScheduler().scheduleSyncRepeatingTask(this, new ReapplyAbsorptionHeartsFromSet(),0l,600l); //getServer().getScheduler().scheduleSyncRepeatingTask(this, new SendMiningFatigueToAllNearbyElderGuardians(),0l,600l); //This is the constant timing method. @@ -1396,6 +1401,15 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } },"daily"); + aPlugin.API.addCommand(args->{ + int attempts=1000; + int selectednumb = (int)(Math.random()*101); + while (attempts>0 && recentnumbers.contains(selectednumb)) { + selectednumb = (int)(Math.random()*101); + attempts--; + } + recentnumbers.add(selectednumb); + },"roll"); }, 90); } @@ -4402,6 +4416,9 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } if (PlayerMode.getPlayerMode(p)==PlayerMode.DEFENDER) { pd.blocking=true; + if (pd.lastblock+20<=TwosideKeeper.getServerTickTime()) { + pd.lastblock=TwosideKeeper.getServerTickTime(); + } } } @@ -4478,34 +4495,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (ev.getAction() == Action.LEFT_CLICK_AIR || ev.getAction() == Action.LEFT_CLICK_BLOCK) { //PlayerStructure pd = PlayerStructure.GetPlayerStructure(p); - if (pd.lastShieldCharge+(20*1)<=TwosideKeeper.getServerTickTime()) { - if (PlayerMode.getPlayerMode(p) == PlayerMode.DEFENDER && - DefenderStance.getDefenderStance(p)==DefenderStance.CHARGE) { - SoundUtils.playGlobalSound(p.getLocation(), Sound.BLOCK_GLASS_PLACE, 1f, 1.25f); - p.setVelocity(p.getLocation().getDirection().multiply(2)); - pd.lastShieldCharge = TwosideKeeper.getServerTickTime(); - Vector dir = p.getLocation().getDirection(); - for (int i=0;i<10;i++) { - Vector newdir = dir.clone(); - newdir.multiply(i); - Location checkpos = p.getLocation().add(newdir); - /*double dmg = CustomDamage.CalculateDamage(0,p,); - CustomDamage.ApplyDamage(, damager, target, weapon, reason, flags)*/ - //GenericFunctions.DealBlitzenLightningStrikeToNearbyMobs(l, basedmg, range, damager, flags); - Block bb = checkpos.getBlock().getRelative(0, -1, 0); - if (bb!=null && bb.getType()!=Material.AIR) { - GenericFunctions.DealDamageToNearbyMobs(checkpos, 0, 1, true, 2, p, p.getEquipment().getItemInMainHand(), false, "Shield Charge"); - } - } - List ents = GenericFunctions.getNearbyMobs(p.getLocation(), 16); - for (LivingEntity ent : ents) { - if (!(ent instanceof Player)) { - LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(ent); - les.increaseAggro(p, 50); - } - } - } - } + PerformShieldCharge(p, pd); } if (!Christmas.RunPlayerInteractEvent(ev)) {return;} @@ -4811,9 +4801,12 @@ public class TwosideKeeper extends JavaPlugin implements Listener { //See if this player is blocking. If so, give them absorption. //Player p = ev.getPlayer(); }*/ - if ((ev.getAction()==Action.RIGHT_CLICK_AIR || + if (PlayerMode.isDefender(ev.getPlayer()) && (ev.getAction()==Action.RIGHT_CLICK_AIR || ev.getAction()==Action.RIGHT_CLICK_BLOCK) && (ev.getClickedBlock()==null || !BlockUtils.isInteractable(ev.getClickedBlock()))) { pd.blocking=true; + if (pd.lastblock+20<=TwosideKeeper.getServerTickTime()) { + pd.lastblock=TwosideKeeper.getServerTickTime(); + } } //Check if we're allowed to open a shop chest. @@ -5493,28 +5486,57 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } } - private void aggroMonsters(final Player p, PlayerStructure pd, int tauntAmt, int range) { - if (PlayerMode.isDefender(p)) { - List entities = p.getNearbyEntities(range, range, range); - for (int i=0;i=getServerTickTime()) { - Monster m = (Monster)(entities.get(i)); - m.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING,100,5,true,true,Color.NAVY)); - m.setTarget(p); - LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(m); - //les.increaseAggro(p, 1000); - les.increaseAggroWhileMultiplyingAllOthers(p, tauntAmt, 0.5); - les.lastHit = TwosideKeeper.getServerTickTime(); + public static void PerformShieldCharge(final Player p, PlayerStructure pd) { + if (pd.lastShieldCharge+(20*1)<=TwosideKeeper.getServerTickTime()) { + if (PlayerMode.getPlayerMode(p) == PlayerMode.DEFENDER && + DefenderStance.getDefenderStance(p)==DefenderStance.CHARGE) { + SoundUtils.playGlobalSound(p.getLocation(), Sound.BLOCK_GLASS_PLACE, 1f, 1.25f); + p.setVelocity(p.getLocation().getDirection().multiply(2)); + pd.lastShieldCharge = TwosideKeeper.getServerTickTime(); + Vector dir = p.getLocation().getDirection(); + for (int i=0;i<10;i++) { + Vector newdir = dir.clone(); + newdir.multiply(i); + Location checkpos = p.getLocation().add(newdir); + /*double dmg = CustomDamage.CalculateDamage(0,p,); + CustomDamage.ApplyDamage(, damager, target, weapon, reason, flags)*/ + //GenericFunctions.DealBlitzenLightningStrikeToNearbyMobs(l, basedmg, range, damager, flags); + Block bb = checkpos.getBlock().getRelative(0, -1, 0); + if (bb!=null && bb.getType()!=Material.AIR) { + GenericFunctions.DealDamageToNearbyMobs(checkpos, 0, 1, true, 2, p, p.getEquipment().getItemInMainHand(), false, "Shield Charge"); + } + } + List ents = GenericFunctions.getNearbyMobs(p.getLocation(), 16); + for (LivingEntity ent : ents) { + if (!(ent instanceof Player)) { + LivingEntityStructure les = LivingEntityStructure.GetLivingEntityStructure(ent); + les.increaseAggro(p, 50); } } } } + } + public static void aggroMonsters(final Player p, PlayerStructure pd, int tauntAmt, int range) { + if (PlayerMode.isDefender(p)) { + List entities = p.getNearbyEntities(range, range, range); + for (int i=0;iTwosideKeeper.getServerTickTime()) { + if (PlayerUtils.cooldownAvailable(pd.lastusedunstoppableteam, UNSTOPPABLETEAM_COOLDOWN, p)) { + Channel.createNewChannel(p, "Unstoppable Team", 60); + pd.lastusedunstoppableteam=TwosideKeeper.getServerTickTime(); + UpdateUnstoppableTeamBuff(p, pd); + sendSuccessfulCastMessage(p); + } else { + sendNotReadyCastMessage(p,ChatColor.GOLD+"Unstoppable Team"); + UpdateUnstoppableTeamBuff(p, pd); + } + ev.setCancelled(true); + return; } else { - sendNotReadyCastMessage(p,ChatColor.GOLD+"Unstoppable Team"); - UpdateUnstoppableTeamBuff(p, pd); + if (pd.blockStacks>=10 && pd.lastusedRejuvenation+GenericFunctions.GetModifiedCooldown(TwosideKeeper.REJUVENATION_COOLDOWN, (Player)p)<=TwosideKeeper.getServerTickTime()) { + //SoundUtils.playGlobalSound(p.getLocation(), Sound.BLOCK_NOTE_HARP, 1.0f, 2.0f); + float[] vals = new float[]{2f,2.245f,2.378f,2.828f}; + for (int i=0;i<3;i++) { + final float newval = vals[i]; + Bukkit.getScheduler().runTaskLater(this, ()->{ + SoundUtils.playGlobalSound(p.getLocation(), Sound.BLOCK_NOTE_HARP, 1.0f, newval); + }, i*3); + } + pd.lastusedRejuvenation=TwosideKeeper.getServerTickTime(); + sendSuccessfulCastMessage(p); + } else { + sendNotReadyCastMessage(p,ChatColor.GREEN+"Rejuvenation"); + } + ev.setCancelled(true); + return; } - ev.setCancelled(true); - return; } } public static void sendNotReadyCastMessage(Player p, String string) { @@ -6385,23 +6425,22 @@ public class TwosideKeeper extends JavaPlugin implements Listener { return; } - /*if (ev.getItemDrop().getItemStack().getType()==Material.SHIELD && !GenericFunctions.isViewingInventory(ev.getPlayer())) { + if (ev.getItemDrop().getItemStack().getType()==Material.SHIELD && !GenericFunctions.isViewingInventory(ev.getPlayer())) { ev.setCancelled(true); if (ev.getPlayer().getEquipment().getItemInMainHand()==null || ev.getPlayer().getEquipment().getItemInMainHand().getType()==Material.AIR) { ev.getPlayer().getEquipment().setItemInMainHand(ev.getItemDrop().getItemStack()); PlayerStructure pd = PlayerStructure.GetPlayerStructure(ev.getPlayer()); - if (pd.last_rejuvenate+GenericFunctions.GetModifiedCooldown(TwosideKeeper.REJUVENATE_COOLDOWN,ev.getPlayer())<=TwosideKeeper.getServerTickTime() && PlayerMode.isDefender(ev.getPlayer())) { - GenericFunctions.PerformRejuvenate(ev.getPlayer()); - pd.last_rejuvenate = TwosideKeeper.getServerTickTime(); - aPlugin.API.damageItem(ev.getPlayer(), ev.getItemDrop().getItemStack(), 400); + if (pd.last_mobcontrol+GenericFunctions.GetModifiedCooldown(TwosideKeeper.MOBCONTROL_COOLDOWN,ev.getPlayer())<=TwosideKeeper.getServerTickTime() && PlayerMode.isDefender(ev.getPlayer())) { + GenericFunctions.PerformMobControl(ev.getPlayer()); + //pd.last_mobcontrol = TwosideKeeper.getServerTickTime(); sendSuccessfulCastMessage(ev.getPlayer()); } else { - sendNotReadyCastMessage(ev.getPlayer(),ChatColor.GREEN+"Rejuvenation"); + sendNotReadyCastMessage(ev.getPlayer(),ChatColor.GREEN+"Mob Control"); } ev.getPlayer().getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); } return; - }*/ + } if (ev.getItemDrop().getItemStack().getType().name().contains("_AXE") && !GenericFunctions.isViewingInventory(ev.getPlayer())) { ev.setCancelled(true); @@ -7929,6 +7968,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.setCancelled(true); return; } else { + dmgdealt = event.getDamage(); if (!(ev.getEntity() instanceof Player && PlayerMode.getPlayerMode((Player)(ev.getEntity()))==PlayerMode.SLAYER)) { if (dmgdealt < 1) { ev.setDamage(DamageModifier.BASE,dmgdealt); @@ -8145,6 +8185,7 @@ public class TwosideKeeper extends JavaPlugin implements Listener { ev.setCancelled(true); return; } else { + dmgdealt = ev.getDamage(); if (!(ev.getEntity() instanceof Player && PlayerMode.getPlayerMode((Player)(ev.getEntity()))==PlayerMode.SLAYER)) { if (dmgdealt < 1) { ev.setDamage(DamageModifier.BASE,dmgdealt); @@ -11909,6 +11950,11 @@ public class TwosideKeeper extends JavaPlugin implements Listener { } } }*/ + + if (ItemSet.hasFullSet(p, ItemSet.SONGSTEEL)) { + bonushp+=(ItemSet.getHighestTierInSet(p, ItemSet.SONGSTEEL)*20)+30; + } + bonushp+=ItemSet.TotalBaseAmountBasedOnSetBonusCount(p, ItemSet.ALIKAHN, 2, 2)+ItemSet.TotalBaseAmountBasedOnSetBonusCount(p, ItemSet.ALIKAHN, 3, 3); TwosideKeeper.HeartbeatLogger.AddEntry("----====]> Alikahn HP Calculation", (int)(System.nanoTime()-time));time = System.nanoTime(); bonushp+=ItemSet.TotalBaseAmountBasedOnSetBonusCount(p, ItemSet.COMET, 2, 2); @@ -12309,6 +12355,8 @@ public class TwosideKeeper extends JavaPlugin implements Listener { if (all || dmgpoolred>0) {receiver.sendMessage(ChatColor.GRAY+""+ChatColor.ITALIC+"Damage Pool Reduction: "+ChatColor.RESET+""+ChatColor.YELLOW+""+df.format(dmgpoolred*100d)+"%");} double cooldownreduction = CustomDamage.calculateCooldownReduction(p); if (all || cooldownreduction>0) {receiver.sendMessage(ChatColor.GRAY+""+ChatColor.ITALIC+"Cooldown Reduction: "+ChatColor.RESET+""+ChatColor.DARK_AQUA+df.format(cooldownreduction*100)+"%");} + double attackspd = 1+CustomDamage.GetAttackRate(p); + if (all || attackspd>0) {receiver.sendMessage(ChatColor.GRAY+""+ChatColor.ITALIC+"Attack Speed: "+ChatColor.RESET+""+ChatColor.DARK_AQUA+df.format(attackspd*100)+"%");} TextComponent f = new TextComponent(ChatColor.GRAY+""+ChatColor.ITALIC+"Current Mode: "); f.addExtra(GenericFunctions.PlayerModeName(p)); if (receiver instanceof Player) { diff --git a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java index 9921bd6..9ad5ead 100644 --- a/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java +++ b/src/sig/plugin/TwosideKeeper/runServerHeartbeat.java @@ -159,6 +159,7 @@ final public class runServerHeartbeat implements Runnable { //MOTD: "Thanks for playing on Sig's Minecraft!\n*bCheck out http://z-gamers.net/mc for update info!\n*aReport any bugs you find at http://zgamers.domain.com/mc/" ServerHeartbeat.getMOTD(); ServerHeartbeat.getServer().broadcastMessage(ChatColor.translateAlternateColorCodes('*', TwosideKeeper.MOTD)); + TwosideKeeper.recentnumbers.clear(); TwosideKeeper.habitat_data.increaseHabitationLevels(); TwosideKeeper.habitat_data.startinglocs.clear(); for (int i=0;iTwosideKeeper.getServerTickTime()) { + //Regenerate health. + GenericFunctions.HealEntity(p, p.getMaxHealth()*0.05); + } + } + private void increaseAggroTowardsTarget(Player p) { if (PlayerMode.getPlayerMode(p)==PlayerMode.DEFENDER) { if (DefenderStance.getDefenderStance(p)==DefenderStance.BLOCK) { @@ -971,6 +981,11 @@ final public class runServerHeartbeat implements Runnable { spdmult += ItemSet.GetTotalBaseAmount(p, ItemSet.DASHER)/100d; } spdmult += ItemSet.GetTotalBaseAmount(p, ItemSet.STEALTH)/100d; + if (PlayerMode.getPlayerMode(p)==PlayerMode.DEFENDER && + p.getEquipment().getItemInOffHand()!=null && + p.getEquipment().getItemInOffHand().getType()==Material.SHIELD) { + spdmult -= 0.5; + } aPlugin.API.setPlayerSpeedMultiplier(p, (float)(1.0f+spdmult)); }